diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java new file mode 100644 index 0000000..e9f04bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.app.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java new file mode 100644 index 0000000..e9f04bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.app.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java index 1fe427f..cbfaa4d 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java @@ -11,15 +11,17 @@ import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dto.SelectDTO; -import com.casic.missiles.modular.app.enums.DeviceBaseExportEnum; import com.casic.missiles.modular.app.model.AppDeviceAdd; import com.casic.missiles.modular.app.model.AppDeviceLog; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; import com.casic.missiles.modular.app.service.IAppDeviceLogService; import com.casic.missiles.modular.app.util.LonlatConver; import com.casic.missiles.modular.system.model.Dict; import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @@ -30,8 +32,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; import java.util.stream.Collectors; /** @@ -54,6 +55,9 @@ @Resource private ICommonPermissionService permissionService; + @Value("${casic.photoPath}") + private String photoPath; + /** * 获取施工添加设备列表 */ @@ -164,7 +168,6 @@ // @ResponseBody // public Object imageBase64Upload(@RequestBody(required =false) String fileBase64) throws IOException { // return ResponseData.success(commonFileService.saveFileBase64Image(fileBase64)); -// // } @RequestMapping({"/getWellTypeList"}) @@ -240,32 +243,49 @@ //照片一起导出 - @RequestMapping(value = "/listExp") - public void listExps(String devcode, String devtype, - String begTime, String endTime, - String project, String installPerson, - HttpServletResponse response) throws IOException { + @RequestMapping(value = "/image/listExp") + @ResponseBody + public Object listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson) { + List dictList = permissionService.findInDictByCode("sluicewellType"); - List list = appDeviceAddService.reportExport(devcode, devtype, - begTime, endTime, project, installPerson); + Map sluiceWellDictMap = dictList.stream() + .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); + Integer taskId = appDeviceAddService.getStartTask(); + if (null == taskId || taskId != 1) { + Long currentUserId = permissionService.getCurrLoginUser().getId(); + ExecutorService executor = Executors.newFixedThreadPool(1); + executor.execute(() -> appDeviceAddService.exportImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, currentUserId)); + return ResponseData.success("执行成功,请稍等..."); + } else { + return ResponseData.error("有任务正在执行,请稍等!"); + } + } + + + @RequestMapping(value = "/listExp") + @ResponseBody + public void listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { List dictList = permissionService.findInDictByCode("sluicewellType"); Map sluiceWellDictMap = dictList.stream() .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); - list.forEach(appDeviceAdd -> { - appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); - }); - ExecutorService cachedExecutorService = Executors.newCachedThreadPool(); - cachedExecutorService.execute(new Runnable() { - @Override - public void run() { - appDeviceAddService.exportUsersToExcel(list, response); - } - }); -// List res = new ArrayList<>(); -// res.addAll(list); -// //获取导出文件header -// super.exportExcel(DeviceBaseExportEnum.DeviceBase_EXPORT, res); + appDeviceAddService.exportNotImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, response); } + @RequestMapping(value = "/batch/logs") + @ResponseBody + public Object batchLogs(String begTime, String endTime) { + Page page = new PageFactory().defaultPage(); + return ResponseData.success(super.packForBT(appDeviceAddService.batchLogs(begTime, endTime, page))); + } + + @CrossOrigin + @RequestMapping(value = "/batchzip") + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + appDeviceAddService.batchDownloadFiles(recentDir, response); + } } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java new file mode 100644 index 0000000..e9f04bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.app.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java index 1fe427f..cbfaa4d 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java @@ -11,15 +11,17 @@ import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dto.SelectDTO; -import com.casic.missiles.modular.app.enums.DeviceBaseExportEnum; import com.casic.missiles.modular.app.model.AppDeviceAdd; import com.casic.missiles.modular.app.model.AppDeviceLog; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; import com.casic.missiles.modular.app.service.IAppDeviceLogService; import com.casic.missiles.modular.app.util.LonlatConver; import com.casic.missiles.modular.system.model.Dict; import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @@ -30,8 +32,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; import java.util.stream.Collectors; /** @@ -54,6 +55,9 @@ @Resource private ICommonPermissionService permissionService; + @Value("${casic.photoPath}") + private String photoPath; + /** * 获取施工添加设备列表 */ @@ -164,7 +168,6 @@ // @ResponseBody // public Object imageBase64Upload(@RequestBody(required =false) String fileBase64) throws IOException { // return ResponseData.success(commonFileService.saveFileBase64Image(fileBase64)); -// // } @RequestMapping({"/getWellTypeList"}) @@ -240,32 +243,49 @@ //照片一起导出 - @RequestMapping(value = "/listExp") - public void listExps(String devcode, String devtype, - String begTime, String endTime, - String project, String installPerson, - HttpServletResponse response) throws IOException { + @RequestMapping(value = "/image/listExp") + @ResponseBody + public Object listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson) { + List dictList = permissionService.findInDictByCode("sluicewellType"); - List list = appDeviceAddService.reportExport(devcode, devtype, - begTime, endTime, project, installPerson); + Map sluiceWellDictMap = dictList.stream() + .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); + Integer taskId = appDeviceAddService.getStartTask(); + if (null == taskId || taskId != 1) { + Long currentUserId = permissionService.getCurrLoginUser().getId(); + ExecutorService executor = Executors.newFixedThreadPool(1); + executor.execute(() -> appDeviceAddService.exportImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, currentUserId)); + return ResponseData.success("执行成功,请稍等..."); + } else { + return ResponseData.error("有任务正在执行,请稍等!"); + } + } + + + @RequestMapping(value = "/listExp") + @ResponseBody + public void listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { List dictList = permissionService.findInDictByCode("sluicewellType"); Map sluiceWellDictMap = dictList.stream() .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); - list.forEach(appDeviceAdd -> { - appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); - }); - ExecutorService cachedExecutorService = Executors.newCachedThreadPool(); - cachedExecutorService.execute(new Runnable() { - @Override - public void run() { - appDeviceAddService.exportUsersToExcel(list, response); - } - }); -// List res = new ArrayList<>(); -// res.addAll(list); -// //获取导出文件header -// super.exportExcel(DeviceBaseExportEnum.DeviceBase_EXPORT, res); + appDeviceAddService.exportNotImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, response); } + @RequestMapping(value = "/batch/logs") + @ResponseBody + public Object batchLogs(String begTime, String endTime) { + Page page = new PageFactory().defaultPage(); + return ResponseData.success(super.packForBT(appDeviceAddService.batchLogs(begTime, endTime, page))); + } + + @CrossOrigin + @RequestMapping(value = "/batchzip") + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + appDeviceAddService.batchDownloadFiles(recentDir, response); + } } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java new file mode 100644 index 0000000..b741f4e --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.modular.app.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.app.model.BatchExportLog; + +public interface BatchExportLogMapper extends BaseMapper { + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java new file mode 100644 index 0000000..e9f04bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.app.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java index 1fe427f..cbfaa4d 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java @@ -11,15 +11,17 @@ import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dto.SelectDTO; -import com.casic.missiles.modular.app.enums.DeviceBaseExportEnum; import com.casic.missiles.modular.app.model.AppDeviceAdd; import com.casic.missiles.modular.app.model.AppDeviceLog; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; import com.casic.missiles.modular.app.service.IAppDeviceLogService; import com.casic.missiles.modular.app.util.LonlatConver; import com.casic.missiles.modular.system.model.Dict; import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @@ -30,8 +32,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; import java.util.stream.Collectors; /** @@ -54,6 +55,9 @@ @Resource private ICommonPermissionService permissionService; + @Value("${casic.photoPath}") + private String photoPath; + /** * 获取施工添加设备列表 */ @@ -164,7 +168,6 @@ // @ResponseBody // public Object imageBase64Upload(@RequestBody(required =false) String fileBase64) throws IOException { // return ResponseData.success(commonFileService.saveFileBase64Image(fileBase64)); -// // } @RequestMapping({"/getWellTypeList"}) @@ -240,32 +243,49 @@ //照片一起导出 - @RequestMapping(value = "/listExp") - public void listExps(String devcode, String devtype, - String begTime, String endTime, - String project, String installPerson, - HttpServletResponse response) throws IOException { + @RequestMapping(value = "/image/listExp") + @ResponseBody + public Object listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson) { + List dictList = permissionService.findInDictByCode("sluicewellType"); - List list = appDeviceAddService.reportExport(devcode, devtype, - begTime, endTime, project, installPerson); + Map sluiceWellDictMap = dictList.stream() + .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); + Integer taskId = appDeviceAddService.getStartTask(); + if (null == taskId || taskId != 1) { + Long currentUserId = permissionService.getCurrLoginUser().getId(); + ExecutorService executor = Executors.newFixedThreadPool(1); + executor.execute(() -> appDeviceAddService.exportImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, currentUserId)); + return ResponseData.success("执行成功,请稍等..."); + } else { + return ResponseData.error("有任务正在执行,请稍等!"); + } + } + + + @RequestMapping(value = "/listExp") + @ResponseBody + public void listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { List dictList = permissionService.findInDictByCode("sluicewellType"); Map sluiceWellDictMap = dictList.stream() .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); - list.forEach(appDeviceAdd -> { - appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); - }); - ExecutorService cachedExecutorService = Executors.newCachedThreadPool(); - cachedExecutorService.execute(new Runnable() { - @Override - public void run() { - appDeviceAddService.exportUsersToExcel(list, response); - } - }); -// List res = new ArrayList<>(); -// res.addAll(list); -// //获取导出文件header -// super.exportExcel(DeviceBaseExportEnum.DeviceBase_EXPORT, res); + appDeviceAddService.exportNotImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, response); } + @RequestMapping(value = "/batch/logs") + @ResponseBody + public Object batchLogs(String begTime, String endTime) { + Page page = new PageFactory().defaultPage(); + return ResponseData.success(super.packForBT(appDeviceAddService.batchLogs(begTime, endTime, page))); + } + + @CrossOrigin + @RequestMapping(value = "/batchzip") + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + appDeviceAddService.batchDownloadFiles(recentDir, response); + } } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java new file mode 100644 index 0000000..b741f4e --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.modular.app.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.app.model.BatchExportLog; + +public interface BatchExportLogMapper extends BaseMapper { + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java index 6ed5d35..9acca94 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java @@ -1,11 +1,11 @@ package com.casic.missiles.modular.app.dto; import cn.afterturn.easypoi.excel.annotation.Excel; +import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.model.AppDeviceAdd; import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; +import org.apache.commons.lang3.StringUtils; import java.io.Serializable; import java.util.ArrayList; @@ -33,7 +33,7 @@ private String installheigt; @Excel(name = "负责人", width = 10.0) private String installperson; - @Excel(name = "安装时间", format = "yyyy-MM-dd",width = 10.0) + @Excel(name = "安装时间", format = "yyyy-MM-dd", width = 10.0) private Date installtime; @Excel(name = "照片1", type = 2, width = 20.0, height = 60.0, imageType = 1) private String photopath1; @@ -61,16 +61,16 @@ private String latitude84; - public static List convert (List appDeviceAdds,String photoPath) { + public static List convert(List appDeviceAdds, String photoPath) { List appDevicAddDTOS = new ArrayList<>(); appDeviceAdds.forEach(appDeviceAdd -> { - appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd,photoPath)); + appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd, photoPath)); }); return appDevicAddDTOS; } - public AppDevicAddDTO(AppDeviceAdd appDeviceAdd,String photoPath) { + public AppDevicAddDTO(AppDeviceAdd appDeviceAdd, String photoPath) { this.devcode = appDeviceAdd.getDevcode(); this.devicetype = appDeviceAdd.getDevicetype(); this.wellcode = appDeviceAdd.getWellcode(); @@ -80,9 +80,12 @@ this.installheigt = appDeviceAdd.getInstallheigt(); this.installperson = appDeviceAdd.getInstallperson(); this.installtime = appDeviceAdd.getInstalltime(); - this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1())?photoPath+appDeviceAdd.getPhotopath1():appDeviceAdd.getPhotopath1(); - this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2())?photoPath+appDeviceAdd.getPhotopath2():appDeviceAdd.getPhotopath2(); - this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3())?photoPath+appDeviceAdd.getPhotopath3():appDeviceAdd.getPhotopath3(); +// && this.installtime.getTime()>=DateUtil.parseDate("2023-04-01").getTime() + if (StringUtils.isNotEmpty(photoPath) ) { + this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1()) ? photoPath + appDeviceAdd.getPhotopath1() : appDeviceAdd.getPhotopath1(); + this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2()) ? photoPath + appDeviceAdd.getPhotopath2() : appDeviceAdd.getPhotopath2(); + this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3()) ? photoPath + appDeviceAdd.getPhotopath3() : appDeviceAdd.getPhotopath3(); + } this.project = appDeviceAdd.getProject(); this.position = appDeviceAdd.getPosition(); this.description = appDeviceAdd.getDescription(); diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java new file mode 100644 index 0000000..e9f04bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.app.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java index 1fe427f..cbfaa4d 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java @@ -11,15 +11,17 @@ import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dto.SelectDTO; -import com.casic.missiles.modular.app.enums.DeviceBaseExportEnum; import com.casic.missiles.modular.app.model.AppDeviceAdd; import com.casic.missiles.modular.app.model.AppDeviceLog; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; import com.casic.missiles.modular.app.service.IAppDeviceLogService; import com.casic.missiles.modular.app.util.LonlatConver; import com.casic.missiles.modular.system.model.Dict; import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @@ -30,8 +32,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; import java.util.stream.Collectors; /** @@ -54,6 +55,9 @@ @Resource private ICommonPermissionService permissionService; + @Value("${casic.photoPath}") + private String photoPath; + /** * 获取施工添加设备列表 */ @@ -164,7 +168,6 @@ // @ResponseBody // public Object imageBase64Upload(@RequestBody(required =false) String fileBase64) throws IOException { // return ResponseData.success(commonFileService.saveFileBase64Image(fileBase64)); -// // } @RequestMapping({"/getWellTypeList"}) @@ -240,32 +243,49 @@ //照片一起导出 - @RequestMapping(value = "/listExp") - public void listExps(String devcode, String devtype, - String begTime, String endTime, - String project, String installPerson, - HttpServletResponse response) throws IOException { + @RequestMapping(value = "/image/listExp") + @ResponseBody + public Object listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson) { + List dictList = permissionService.findInDictByCode("sluicewellType"); - List list = appDeviceAddService.reportExport(devcode, devtype, - begTime, endTime, project, installPerson); + Map sluiceWellDictMap = dictList.stream() + .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); + Integer taskId = appDeviceAddService.getStartTask(); + if (null == taskId || taskId != 1) { + Long currentUserId = permissionService.getCurrLoginUser().getId(); + ExecutorService executor = Executors.newFixedThreadPool(1); + executor.execute(() -> appDeviceAddService.exportImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, currentUserId)); + return ResponseData.success("执行成功,请稍等..."); + } else { + return ResponseData.error("有任务正在执行,请稍等!"); + } + } + + + @RequestMapping(value = "/listExp") + @ResponseBody + public void listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { List dictList = permissionService.findInDictByCode("sluicewellType"); Map sluiceWellDictMap = dictList.stream() .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); - list.forEach(appDeviceAdd -> { - appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); - }); - ExecutorService cachedExecutorService = Executors.newCachedThreadPool(); - cachedExecutorService.execute(new Runnable() { - @Override - public void run() { - appDeviceAddService.exportUsersToExcel(list, response); - } - }); -// List res = new ArrayList<>(); -// res.addAll(list); -// //获取导出文件header -// super.exportExcel(DeviceBaseExportEnum.DeviceBase_EXPORT, res); + appDeviceAddService.exportNotImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, response); } + @RequestMapping(value = "/batch/logs") + @ResponseBody + public Object batchLogs(String begTime, String endTime) { + Page page = new PageFactory().defaultPage(); + return ResponseData.success(super.packForBT(appDeviceAddService.batchLogs(begTime, endTime, page))); + } + + @CrossOrigin + @RequestMapping(value = "/batchzip") + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + appDeviceAddService.batchDownloadFiles(recentDir, response); + } } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java new file mode 100644 index 0000000..b741f4e --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.modular.app.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.app.model.BatchExportLog; + +public interface BatchExportLogMapper extends BaseMapper { + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java index 6ed5d35..9acca94 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java @@ -1,11 +1,11 @@ package com.casic.missiles.modular.app.dto; import cn.afterturn.easypoi.excel.annotation.Excel; +import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.model.AppDeviceAdd; import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; +import org.apache.commons.lang3.StringUtils; import java.io.Serializable; import java.util.ArrayList; @@ -33,7 +33,7 @@ private String installheigt; @Excel(name = "负责人", width = 10.0) private String installperson; - @Excel(name = "安装时间", format = "yyyy-MM-dd",width = 10.0) + @Excel(name = "安装时间", format = "yyyy-MM-dd", width = 10.0) private Date installtime; @Excel(name = "照片1", type = 2, width = 20.0, height = 60.0, imageType = 1) private String photopath1; @@ -61,16 +61,16 @@ private String latitude84; - public static List convert (List appDeviceAdds,String photoPath) { + public static List convert(List appDeviceAdds, String photoPath) { List appDevicAddDTOS = new ArrayList<>(); appDeviceAdds.forEach(appDeviceAdd -> { - appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd,photoPath)); + appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd, photoPath)); }); return appDevicAddDTOS; } - public AppDevicAddDTO(AppDeviceAdd appDeviceAdd,String photoPath) { + public AppDevicAddDTO(AppDeviceAdd appDeviceAdd, String photoPath) { this.devcode = appDeviceAdd.getDevcode(); this.devicetype = appDeviceAdd.getDevicetype(); this.wellcode = appDeviceAdd.getWellcode(); @@ -80,9 +80,12 @@ this.installheigt = appDeviceAdd.getInstallheigt(); this.installperson = appDeviceAdd.getInstallperson(); this.installtime = appDeviceAdd.getInstalltime(); - this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1())?photoPath+appDeviceAdd.getPhotopath1():appDeviceAdd.getPhotopath1(); - this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2())?photoPath+appDeviceAdd.getPhotopath2():appDeviceAdd.getPhotopath2(); - this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3())?photoPath+appDeviceAdd.getPhotopath3():appDeviceAdd.getPhotopath3(); +// && this.installtime.getTime()>=DateUtil.parseDate("2023-04-01").getTime() + if (StringUtils.isNotEmpty(photoPath) ) { + this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1()) ? photoPath + appDeviceAdd.getPhotopath1() : appDeviceAdd.getPhotopath1(); + this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2()) ? photoPath + appDeviceAdd.getPhotopath2() : appDeviceAdd.getPhotopath2(); + this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3()) ? photoPath + appDeviceAdd.getPhotopath3() : appDeviceAdd.getPhotopath3(); + } this.project = appDeviceAdd.getProject(); this.position = appDeviceAdd.getPosition(); this.description = appDeviceAdd.getDescription(); diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java new file mode 100644 index 0000000..a8701e5 --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.app.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cz + */ +@Data +@TableName("batch_export_log") +public class BatchExportLog extends Model { + + private static final long serialVersionUID = 1L; + + @TableId("id") + private Long id; + @TableField("file_name") + private String fileName; + @TableField("file_dir") + private String fileDir; + @TableField("partition_number") + private String partitionNumber; + @TableField("create_time") + private String createTime; + @TableField("create_user_id") + private Long createUserId; + @TableField("task_id") + private int taskId; + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java new file mode 100644 index 0000000..e9f04bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.app.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java index 1fe427f..cbfaa4d 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java @@ -11,15 +11,17 @@ import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dto.SelectDTO; -import com.casic.missiles.modular.app.enums.DeviceBaseExportEnum; import com.casic.missiles.modular.app.model.AppDeviceAdd; import com.casic.missiles.modular.app.model.AppDeviceLog; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; import com.casic.missiles.modular.app.service.IAppDeviceLogService; import com.casic.missiles.modular.app.util.LonlatConver; import com.casic.missiles.modular.system.model.Dict; import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @@ -30,8 +32,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; import java.util.stream.Collectors; /** @@ -54,6 +55,9 @@ @Resource private ICommonPermissionService permissionService; + @Value("${casic.photoPath}") + private String photoPath; + /** * 获取施工添加设备列表 */ @@ -164,7 +168,6 @@ // @ResponseBody // public Object imageBase64Upload(@RequestBody(required =false) String fileBase64) throws IOException { // return ResponseData.success(commonFileService.saveFileBase64Image(fileBase64)); -// // } @RequestMapping({"/getWellTypeList"}) @@ -240,32 +243,49 @@ //照片一起导出 - @RequestMapping(value = "/listExp") - public void listExps(String devcode, String devtype, - String begTime, String endTime, - String project, String installPerson, - HttpServletResponse response) throws IOException { + @RequestMapping(value = "/image/listExp") + @ResponseBody + public Object listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson) { + List dictList = permissionService.findInDictByCode("sluicewellType"); - List list = appDeviceAddService.reportExport(devcode, devtype, - begTime, endTime, project, installPerson); + Map sluiceWellDictMap = dictList.stream() + .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); + Integer taskId = appDeviceAddService.getStartTask(); + if (null == taskId || taskId != 1) { + Long currentUserId = permissionService.getCurrLoginUser().getId(); + ExecutorService executor = Executors.newFixedThreadPool(1); + executor.execute(() -> appDeviceAddService.exportImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, currentUserId)); + return ResponseData.success("执行成功,请稍等..."); + } else { + return ResponseData.error("有任务正在执行,请稍等!"); + } + } + + + @RequestMapping(value = "/listExp") + @ResponseBody + public void listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { List dictList = permissionService.findInDictByCode("sluicewellType"); Map sluiceWellDictMap = dictList.stream() .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); - list.forEach(appDeviceAdd -> { - appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); - }); - ExecutorService cachedExecutorService = Executors.newCachedThreadPool(); - cachedExecutorService.execute(new Runnable() { - @Override - public void run() { - appDeviceAddService.exportUsersToExcel(list, response); - } - }); -// List res = new ArrayList<>(); -// res.addAll(list); -// //获取导出文件header -// super.exportExcel(DeviceBaseExportEnum.DeviceBase_EXPORT, res); + appDeviceAddService.exportNotImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, response); } + @RequestMapping(value = "/batch/logs") + @ResponseBody + public Object batchLogs(String begTime, String endTime) { + Page page = new PageFactory().defaultPage(); + return ResponseData.success(super.packForBT(appDeviceAddService.batchLogs(begTime, endTime, page))); + } + + @CrossOrigin + @RequestMapping(value = "/batchzip") + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + appDeviceAddService.batchDownloadFiles(recentDir, response); + } } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java new file mode 100644 index 0000000..b741f4e --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.modular.app.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.app.model.BatchExportLog; + +public interface BatchExportLogMapper extends BaseMapper { + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java index 6ed5d35..9acca94 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java @@ -1,11 +1,11 @@ package com.casic.missiles.modular.app.dto; import cn.afterturn.easypoi.excel.annotation.Excel; +import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.model.AppDeviceAdd; import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; +import org.apache.commons.lang3.StringUtils; import java.io.Serializable; import java.util.ArrayList; @@ -33,7 +33,7 @@ private String installheigt; @Excel(name = "负责人", width = 10.0) private String installperson; - @Excel(name = "安装时间", format = "yyyy-MM-dd",width = 10.0) + @Excel(name = "安装时间", format = "yyyy-MM-dd", width = 10.0) private Date installtime; @Excel(name = "照片1", type = 2, width = 20.0, height = 60.0, imageType = 1) private String photopath1; @@ -61,16 +61,16 @@ private String latitude84; - public static List convert (List appDeviceAdds,String photoPath) { + public static List convert(List appDeviceAdds, String photoPath) { List appDevicAddDTOS = new ArrayList<>(); appDeviceAdds.forEach(appDeviceAdd -> { - appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd,photoPath)); + appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd, photoPath)); }); return appDevicAddDTOS; } - public AppDevicAddDTO(AppDeviceAdd appDeviceAdd,String photoPath) { + public AppDevicAddDTO(AppDeviceAdd appDeviceAdd, String photoPath) { this.devcode = appDeviceAdd.getDevcode(); this.devicetype = appDeviceAdd.getDevicetype(); this.wellcode = appDeviceAdd.getWellcode(); @@ -80,9 +80,12 @@ this.installheigt = appDeviceAdd.getInstallheigt(); this.installperson = appDeviceAdd.getInstallperson(); this.installtime = appDeviceAdd.getInstalltime(); - this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1())?photoPath+appDeviceAdd.getPhotopath1():appDeviceAdd.getPhotopath1(); - this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2())?photoPath+appDeviceAdd.getPhotopath2():appDeviceAdd.getPhotopath2(); - this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3())?photoPath+appDeviceAdd.getPhotopath3():appDeviceAdd.getPhotopath3(); +// && this.installtime.getTime()>=DateUtil.parseDate("2023-04-01").getTime() + if (StringUtils.isNotEmpty(photoPath) ) { + this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1()) ? photoPath + appDeviceAdd.getPhotopath1() : appDeviceAdd.getPhotopath1(); + this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2()) ? photoPath + appDeviceAdd.getPhotopath2() : appDeviceAdd.getPhotopath2(); + this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3()) ? photoPath + appDeviceAdd.getPhotopath3() : appDeviceAdd.getPhotopath3(); + } this.project = appDeviceAdd.getProject(); this.position = appDeviceAdd.getPosition(); this.description = appDeviceAdd.getDescription(); diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java new file mode 100644 index 0000000..a8701e5 --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.app.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cz + */ +@Data +@TableName("batch_export_log") +public class BatchExportLog extends Model { + + private static final long serialVersionUID = 1L; + + @TableId("id") + private Long id; + @TableField("file_name") + private String fileName; + @TableField("file_dir") + private String fileDir; + @TableField("partition_number") + private String partitionNumber; + @TableField("create_time") + private String createTime; + @TableField("create_user_id") + private Long createUserId; + @TableField("task_id") + private int taskId; + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java index 96bd6fb..a8921c5 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java @@ -1,16 +1,19 @@ package com.casic.missiles.modular.app.service; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; +import java.util.Map; /** *

- * 服务类 + * 服务类 *

* * @author stylefeng123 @@ -18,13 +21,33 @@ */ public interface IAppDeviceAddService extends IService { - List getAppDevice(String devcode); + List getAppDevice(String devcode); + String saveFile(MultipartFile var1) throws IOException; - String fileUploadMarker(MultipartFile var1,String text) throws IOException; + + String fileUploadMarker(MultipartFile var1, String text) throws IOException; + String findModeCodeByCode(String devcode); + List reportExport(String devcode, String devtype, String begTime, String endTime, String project, String installPerson); + void convert84(); - void exportUsersToExcel(List list, HttpServletResponse response); + + void exportImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId); + + void exportNotImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson,HttpServletResponse response); + + void batchDownloadFiles(String recentDir,HttpServletResponse response); + + Integer getStartTask(); + + Page batchLogs(String begTime, String endTime, Page page); } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java new file mode 100644 index 0000000..e9f04bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.app.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java index 1fe427f..cbfaa4d 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java @@ -11,15 +11,17 @@ import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dto.SelectDTO; -import com.casic.missiles.modular.app.enums.DeviceBaseExportEnum; import com.casic.missiles.modular.app.model.AppDeviceAdd; import com.casic.missiles.modular.app.model.AppDeviceLog; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; import com.casic.missiles.modular.app.service.IAppDeviceLogService; import com.casic.missiles.modular.app.util.LonlatConver; import com.casic.missiles.modular.system.model.Dict; import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @@ -30,8 +32,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; import java.util.stream.Collectors; /** @@ -54,6 +55,9 @@ @Resource private ICommonPermissionService permissionService; + @Value("${casic.photoPath}") + private String photoPath; + /** * 获取施工添加设备列表 */ @@ -164,7 +168,6 @@ // @ResponseBody // public Object imageBase64Upload(@RequestBody(required =false) String fileBase64) throws IOException { // return ResponseData.success(commonFileService.saveFileBase64Image(fileBase64)); -// // } @RequestMapping({"/getWellTypeList"}) @@ -240,32 +243,49 @@ //照片一起导出 - @RequestMapping(value = "/listExp") - public void listExps(String devcode, String devtype, - String begTime, String endTime, - String project, String installPerson, - HttpServletResponse response) throws IOException { + @RequestMapping(value = "/image/listExp") + @ResponseBody + public Object listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson) { + List dictList = permissionService.findInDictByCode("sluicewellType"); - List list = appDeviceAddService.reportExport(devcode, devtype, - begTime, endTime, project, installPerson); + Map sluiceWellDictMap = dictList.stream() + .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); + Integer taskId = appDeviceAddService.getStartTask(); + if (null == taskId || taskId != 1) { + Long currentUserId = permissionService.getCurrLoginUser().getId(); + ExecutorService executor = Executors.newFixedThreadPool(1); + executor.execute(() -> appDeviceAddService.exportImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, currentUserId)); + return ResponseData.success("执行成功,请稍等..."); + } else { + return ResponseData.error("有任务正在执行,请稍等!"); + } + } + + + @RequestMapping(value = "/listExp") + @ResponseBody + public void listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { List dictList = permissionService.findInDictByCode("sluicewellType"); Map sluiceWellDictMap = dictList.stream() .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); - list.forEach(appDeviceAdd -> { - appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); - }); - ExecutorService cachedExecutorService = Executors.newCachedThreadPool(); - cachedExecutorService.execute(new Runnable() { - @Override - public void run() { - appDeviceAddService.exportUsersToExcel(list, response); - } - }); -// List res = new ArrayList<>(); -// res.addAll(list); -// //获取导出文件header -// super.exportExcel(DeviceBaseExportEnum.DeviceBase_EXPORT, res); + appDeviceAddService.exportNotImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, response); } + @RequestMapping(value = "/batch/logs") + @ResponseBody + public Object batchLogs(String begTime, String endTime) { + Page page = new PageFactory().defaultPage(); + return ResponseData.success(super.packForBT(appDeviceAddService.batchLogs(begTime, endTime, page))); + } + + @CrossOrigin + @RequestMapping(value = "/batchzip") + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + appDeviceAddService.batchDownloadFiles(recentDir, response); + } } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java new file mode 100644 index 0000000..b741f4e --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.modular.app.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.app.model.BatchExportLog; + +public interface BatchExportLogMapper extends BaseMapper { + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java index 6ed5d35..9acca94 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java @@ -1,11 +1,11 @@ package com.casic.missiles.modular.app.dto; import cn.afterturn.easypoi.excel.annotation.Excel; +import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.model.AppDeviceAdd; import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; +import org.apache.commons.lang3.StringUtils; import java.io.Serializable; import java.util.ArrayList; @@ -33,7 +33,7 @@ private String installheigt; @Excel(name = "负责人", width = 10.0) private String installperson; - @Excel(name = "安装时间", format = "yyyy-MM-dd",width = 10.0) + @Excel(name = "安装时间", format = "yyyy-MM-dd", width = 10.0) private Date installtime; @Excel(name = "照片1", type = 2, width = 20.0, height = 60.0, imageType = 1) private String photopath1; @@ -61,16 +61,16 @@ private String latitude84; - public static List convert (List appDeviceAdds,String photoPath) { + public static List convert(List appDeviceAdds, String photoPath) { List appDevicAddDTOS = new ArrayList<>(); appDeviceAdds.forEach(appDeviceAdd -> { - appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd,photoPath)); + appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd, photoPath)); }); return appDevicAddDTOS; } - public AppDevicAddDTO(AppDeviceAdd appDeviceAdd,String photoPath) { + public AppDevicAddDTO(AppDeviceAdd appDeviceAdd, String photoPath) { this.devcode = appDeviceAdd.getDevcode(); this.devicetype = appDeviceAdd.getDevicetype(); this.wellcode = appDeviceAdd.getWellcode(); @@ -80,9 +80,12 @@ this.installheigt = appDeviceAdd.getInstallheigt(); this.installperson = appDeviceAdd.getInstallperson(); this.installtime = appDeviceAdd.getInstalltime(); - this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1())?photoPath+appDeviceAdd.getPhotopath1():appDeviceAdd.getPhotopath1(); - this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2())?photoPath+appDeviceAdd.getPhotopath2():appDeviceAdd.getPhotopath2(); - this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3())?photoPath+appDeviceAdd.getPhotopath3():appDeviceAdd.getPhotopath3(); +// && this.installtime.getTime()>=DateUtil.parseDate("2023-04-01").getTime() + if (StringUtils.isNotEmpty(photoPath) ) { + this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1()) ? photoPath + appDeviceAdd.getPhotopath1() : appDeviceAdd.getPhotopath1(); + this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2()) ? photoPath + appDeviceAdd.getPhotopath2() : appDeviceAdd.getPhotopath2(); + this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3()) ? photoPath + appDeviceAdd.getPhotopath3() : appDeviceAdd.getPhotopath3(); + } this.project = appDeviceAdd.getProject(); this.position = appDeviceAdd.getPosition(); this.description = appDeviceAdd.getDescription(); diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java new file mode 100644 index 0000000..a8701e5 --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.app.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cz + */ +@Data +@TableName("batch_export_log") +public class BatchExportLog extends Model { + + private static final long serialVersionUID = 1L; + + @TableId("id") + private Long id; + @TableField("file_name") + private String fileName; + @TableField("file_dir") + private String fileDir; + @TableField("partition_number") + private String partitionNumber; + @TableField("create_time") + private String createTime; + @TableField("create_user_id") + private Long createUserId; + @TableField("task_id") + private int taskId; + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java index 96bd6fb..a8921c5 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java @@ -1,16 +1,19 @@ package com.casic.missiles.modular.app.service; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; +import java.util.Map; /** *

- * 服务类 + * 服务类 *

* * @author stylefeng123 @@ -18,13 +21,33 @@ */ public interface IAppDeviceAddService extends IService { - List getAppDevice(String devcode); + List getAppDevice(String devcode); + String saveFile(MultipartFile var1) throws IOException; - String fileUploadMarker(MultipartFile var1,String text) throws IOException; + + String fileUploadMarker(MultipartFile var1, String text) throws IOException; + String findModeCodeByCode(String devcode); + List reportExport(String devcode, String devtype, String begTime, String endTime, String project, String installPerson); + void convert84(); - void exportUsersToExcel(List list, HttpServletResponse response); + + void exportImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId); + + void exportNotImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson,HttpServletResponse response); + + void batchDownloadFiles(String recentDir,HttpServletResponse response); + + Integer getStartTask(); + + Page batchLogs(String begTime, String endTime, Page page); } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java index 69f2254..7c2865f 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java @@ -2,32 +2,41 @@ import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dao.AppDeviceAddMapper; +import com.casic.missiles.modular.app.dao.BatchExportLogMapper; import com.casic.missiles.modular.app.dto.AppDevicAddDTO; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; -import com.casic.missiles.modular.app.util.LonlatConver; -import com.casic.missiles.modular.app.util.PhotoUtils; +import com.casic.missiles.modular.app.util.*; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.ListUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.management.Query; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.awt.*; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.*; import java.util.List; -import java.util.UUID; +import java.util.concurrent.*; /** *

@@ -38,12 +47,21 @@ * @since 2020-05-24 */ @Service +@Slf4j public class AppDeviceAddServiceImpl extends ServiceImpl implements IAppDeviceAddService { + @Value("${casic.file-upload-path}") private String filePath; @Value("${casic.photoPath}") private String photoPath; + @Value("${casic.batchNumber}") + private Integer batchNumber; + @Autowired + private BatchExportLogMapper batchExportLogMapper; + @Autowired + private WebSocket webSocket; + @Override public List getAppDevice(String devcode) { @@ -127,7 +145,6 @@ EntityWrapper query = new EntityWrapper<>(); query.le("id", 5241); List appDeviceAddList = selectList(query); - for (AppDeviceAdd appDeviceAdd : appDeviceAddList) { if (ToolUtil.isNotEmpty(appDeviceAdd.getLongitude()) && ToolUtil.isNotEmpty(appDeviceAdd.getLatitude())) { @@ -141,12 +158,115 @@ } + @Override + public void exportImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); + Long stampeDir = System.currentTimeMillis(); + //以当前时间戳为目录 + String currentStampDir = filePath + stampeDir + File.separator; + setLocalFileDir(currentStampDir); + List batchExportLogsList = new ArrayList<>(); + try { + setStartTask(); + ExecutorService executor = Executors.newFixedThreadPool(10); + for (int appDeviceAddsIndex = 0; appDeviceAddsIndex < appDeviceAdds.size(); appDeviceAddsIndex += batchNumber) { + int postIndex = getBatchNumberPostIndex(appDeviceAdds, appDeviceAddsIndex); + List appDeviceBatchList = appDeviceAdds.subList(appDeviceAddsIndex, postIndex); + String partitionNumber = appDeviceAddsIndex + "-" + postIndex; + String fileName = "设备安装基础信息表" + partitionNumber + ".xls"; + String currentFileName = currentStampDir + fileName; + Runnable task = new Runnable() { + @Override + public void run() { + ExportExcelUtil exportExcelUtil = new ExportExcelUtil(); + exportExcelUtil.fileExport(appDeviceBatchList, currentFileName, photoPath); + } + }; + executor.submit(task); + batchExportLogsList.add(createBatchFileLogs(currentUserId, partitionNumber, fileName, String.valueOf(stampeDir))); + } + while (true) { + Long activeCount = ((ThreadPoolExecutor) executor).getTaskCount() - ((ThreadPoolExecutor) executor).getCompletedTaskCount(); + if (activeCount == 0) { + //删除所有的文件日志 + this.batchExportLogMapper.delete(null); + //删除所有历史文件 + deleteFile(new File(filePath),String.valueOf(stampeDir)); + //批量导入日志 + batchExportLogsList.stream().forEach( + batchExportLog -> this.batchExportLogMapper.insert(batchExportLog) + ); + System.out.println("所有的子线程都结束了!"); + List userList = new ArrayList<>(); + userList.add(String.valueOf(currentUserId)); + Map map = new HashMap(); + map.put("message", "你在" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(stampeDir)) + "的文件导出已经生成了,请到导出列表页面查看"); + map.put("type", "alarm"); + for (int i = 0; i < 3; i++) { + webSocket.sendListMessage(userList, JSON.toJSONString(map)); + Thread.sleep(3000); + } + break; + } + Thread.sleep(5000); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + /** + * 对导出产生的日志、进行清除,还原空间 + */ + private void deleteFile(File invalidFile,String currentFileStr) { + //为当前文件目录删除 + if(invalidFile.getAbsoluteFile().getName().equals(currentFileStr)){ + return; + } + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + if (!invalidFile.getAbsolutePath().equals(filePath.substring(0,filePath.length()-1))) { + //删除子文件 + files[i].delete(); + } + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i],currentFileStr); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + if (!invalidFile.getAbsolutePath().equals(filePath)) { + //删除子目录 + if (invalidFile != null && invalidFile.isDirectory()) { + invalidFile.delete(); + } + } + } @Override - public void exportUsersToExcel(List list,HttpServletResponse response) { - + public void exportNotImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); try { - //设置信息头,告诉浏览器内容为excel类型 response.setHeader("content-Type", "application/vnd.ms-excel"); //设置下载名称 @@ -160,16 +280,137 @@ params.setSheetName("设备安装信息"); //设置标题 params.setTitle("设备安装信息"); - //转成对应的类型;要不然会报错,虽然也可以导出成功 - List AppDevicAddDTOs = AppDevicAddDTO.convert(list,photoPath); - + List AppDeviceAddDTOs = AppDevicAddDTO.convert(appDeviceAdds, null); //导入excel - Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDevicAddDTOs); + Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDeviceAddDTOs); //写入 workbook.write(out); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception ex) { + ex.printStackTrace(); } } + + + @Override + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + FileInputStream is = null; + BufferedOutputStream out = null; + String zipPath = ""; + try { + response.reset(); + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/zip;charset=utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("设备安装基础信息表.zip", StandardCharsets.UTF_8.name())); + response.setHeader("Access-Control-Allow-Origin", "*"); + System.out.println(response.getHeader("Content-Disposition")); + ZipUtils zipUtils = new ZipUtils(); + zipPath = zipUtils.zipFileCreator(filePath, recentDir); + //开始下载 + is = new FileInputStream(new File(zipPath)); + out = new BufferedOutputStream(response.getOutputStream()); + byte[] buff = new byte[1024]; + int len = 0; + while ((len = is.read(buff, 0, buff.length)) != -1) { + out.write(buff, 0, len); + } + out.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + try { + out.close(); + if (StringUtils.isNotEmpty(zipPath)) { + new ZipUtils().zipFileDeletor(zipPath); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + + @Override + public Page batchLogs(String begTime, String endTime, Page page) { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.le(StringUtils.isNotEmpty(begTime), "create_time", begTime) + .or().ge(StringUtils.isNotEmpty(endTime), "create_time", endTime); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")); + List batchExportLogs = this.batchExportLogMapper.selectPage(page, batchEntityWrapper); + page.setRecords(batchExportLogs); + return page; + } + + + private BatchExportLog createBatchFileLogs(Long currentUserId, String partitionNumber, String fileName, String fileDir) { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setPartitionNumber(partitionNumber); + batchExportLog.setCreateUserId(currentUserId); + batchExportLog.setFileDir(fileDir + File.separator); + batchExportLog.setTaskId(0); + batchExportLog.setFileName(fileName); + return batchExportLog; + } + + @Override + public Integer getStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.where("create_time>date_add(now(), interval -1 hour) "); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + return optionalBatchExportLog.isPresent() ? optionalBatchExportLog.get().getTaskId() : null; + } + + private void setStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + if (optionalBatchExportLog.isPresent()) { + optionalBatchExportLog.get().setTaskId(1); + this.batchExportLogMapper.updateById(optionalBatchExportLog.get()); + } else { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setTaskId(1); + this.batchExportLogMapper.insert(batchExportLog); + } + } + + /** + * 获取分批次要导出的目录列表 + * + * @return + */ + private int getBatchNumberPostIndex(List appDeviceAdds, int appDeviceAddsIndex) { + int postIndex = 0; + if (appDeviceAddsIndex + batchNumber > appDeviceAdds.size()) { + postIndex = appDeviceAdds.size(); + } else { + postIndex = appDeviceAddsIndex + batchNumber; + } + return postIndex; + } + + /** + * 创建文件目录 + */ + private void setLocalFileDir(String tempLocalFileDir) { + File file = new File(tempLocalFileDir); + if (!file.exists()) { + file.mkdirs(); + } + } + } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java new file mode 100644 index 0000000..e9f04bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.app.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java index 1fe427f..cbfaa4d 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java @@ -11,15 +11,17 @@ import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dto.SelectDTO; -import com.casic.missiles.modular.app.enums.DeviceBaseExportEnum; import com.casic.missiles.modular.app.model.AppDeviceAdd; import com.casic.missiles.modular.app.model.AppDeviceLog; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; import com.casic.missiles.modular.app.service.IAppDeviceLogService; import com.casic.missiles.modular.app.util.LonlatConver; import com.casic.missiles.modular.system.model.Dict; import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @@ -30,8 +32,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; import java.util.stream.Collectors; /** @@ -54,6 +55,9 @@ @Resource private ICommonPermissionService permissionService; + @Value("${casic.photoPath}") + private String photoPath; + /** * 获取施工添加设备列表 */ @@ -164,7 +168,6 @@ // @ResponseBody // public Object imageBase64Upload(@RequestBody(required =false) String fileBase64) throws IOException { // return ResponseData.success(commonFileService.saveFileBase64Image(fileBase64)); -// // } @RequestMapping({"/getWellTypeList"}) @@ -240,32 +243,49 @@ //照片一起导出 - @RequestMapping(value = "/listExp") - public void listExps(String devcode, String devtype, - String begTime, String endTime, - String project, String installPerson, - HttpServletResponse response) throws IOException { + @RequestMapping(value = "/image/listExp") + @ResponseBody + public Object listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson) { + List dictList = permissionService.findInDictByCode("sluicewellType"); - List list = appDeviceAddService.reportExport(devcode, devtype, - begTime, endTime, project, installPerson); + Map sluiceWellDictMap = dictList.stream() + .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); + Integer taskId = appDeviceAddService.getStartTask(); + if (null == taskId || taskId != 1) { + Long currentUserId = permissionService.getCurrLoginUser().getId(); + ExecutorService executor = Executors.newFixedThreadPool(1); + executor.execute(() -> appDeviceAddService.exportImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, currentUserId)); + return ResponseData.success("执行成功,请稍等..."); + } else { + return ResponseData.error("有任务正在执行,请稍等!"); + } + } + + + @RequestMapping(value = "/listExp") + @ResponseBody + public void listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { List dictList = permissionService.findInDictByCode("sluicewellType"); Map sluiceWellDictMap = dictList.stream() .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); - list.forEach(appDeviceAdd -> { - appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); - }); - ExecutorService cachedExecutorService = Executors.newCachedThreadPool(); - cachedExecutorService.execute(new Runnable() { - @Override - public void run() { - appDeviceAddService.exportUsersToExcel(list, response); - } - }); -// List res = new ArrayList<>(); -// res.addAll(list); -// //获取导出文件header -// super.exportExcel(DeviceBaseExportEnum.DeviceBase_EXPORT, res); + appDeviceAddService.exportNotImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, response); } + @RequestMapping(value = "/batch/logs") + @ResponseBody + public Object batchLogs(String begTime, String endTime) { + Page page = new PageFactory().defaultPage(); + return ResponseData.success(super.packForBT(appDeviceAddService.batchLogs(begTime, endTime, page))); + } + + @CrossOrigin + @RequestMapping(value = "/batchzip") + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + appDeviceAddService.batchDownloadFiles(recentDir, response); + } } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java new file mode 100644 index 0000000..b741f4e --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.modular.app.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.app.model.BatchExportLog; + +public interface BatchExportLogMapper extends BaseMapper { + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java index 6ed5d35..9acca94 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java @@ -1,11 +1,11 @@ package com.casic.missiles.modular.app.dto; import cn.afterturn.easypoi.excel.annotation.Excel; +import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.model.AppDeviceAdd; import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; +import org.apache.commons.lang3.StringUtils; import java.io.Serializable; import java.util.ArrayList; @@ -33,7 +33,7 @@ private String installheigt; @Excel(name = "负责人", width = 10.0) private String installperson; - @Excel(name = "安装时间", format = "yyyy-MM-dd",width = 10.0) + @Excel(name = "安装时间", format = "yyyy-MM-dd", width = 10.0) private Date installtime; @Excel(name = "照片1", type = 2, width = 20.0, height = 60.0, imageType = 1) private String photopath1; @@ -61,16 +61,16 @@ private String latitude84; - public static List convert (List appDeviceAdds,String photoPath) { + public static List convert(List appDeviceAdds, String photoPath) { List appDevicAddDTOS = new ArrayList<>(); appDeviceAdds.forEach(appDeviceAdd -> { - appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd,photoPath)); + appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd, photoPath)); }); return appDevicAddDTOS; } - public AppDevicAddDTO(AppDeviceAdd appDeviceAdd,String photoPath) { + public AppDevicAddDTO(AppDeviceAdd appDeviceAdd, String photoPath) { this.devcode = appDeviceAdd.getDevcode(); this.devicetype = appDeviceAdd.getDevicetype(); this.wellcode = appDeviceAdd.getWellcode(); @@ -80,9 +80,12 @@ this.installheigt = appDeviceAdd.getInstallheigt(); this.installperson = appDeviceAdd.getInstallperson(); this.installtime = appDeviceAdd.getInstalltime(); - this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1())?photoPath+appDeviceAdd.getPhotopath1():appDeviceAdd.getPhotopath1(); - this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2())?photoPath+appDeviceAdd.getPhotopath2():appDeviceAdd.getPhotopath2(); - this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3())?photoPath+appDeviceAdd.getPhotopath3():appDeviceAdd.getPhotopath3(); +// && this.installtime.getTime()>=DateUtil.parseDate("2023-04-01").getTime() + if (StringUtils.isNotEmpty(photoPath) ) { + this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1()) ? photoPath + appDeviceAdd.getPhotopath1() : appDeviceAdd.getPhotopath1(); + this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2()) ? photoPath + appDeviceAdd.getPhotopath2() : appDeviceAdd.getPhotopath2(); + this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3()) ? photoPath + appDeviceAdd.getPhotopath3() : appDeviceAdd.getPhotopath3(); + } this.project = appDeviceAdd.getProject(); this.position = appDeviceAdd.getPosition(); this.description = appDeviceAdd.getDescription(); diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java new file mode 100644 index 0000000..a8701e5 --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.app.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cz + */ +@Data +@TableName("batch_export_log") +public class BatchExportLog extends Model { + + private static final long serialVersionUID = 1L; + + @TableId("id") + private Long id; + @TableField("file_name") + private String fileName; + @TableField("file_dir") + private String fileDir; + @TableField("partition_number") + private String partitionNumber; + @TableField("create_time") + private String createTime; + @TableField("create_user_id") + private Long createUserId; + @TableField("task_id") + private int taskId; + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java index 96bd6fb..a8921c5 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java @@ -1,16 +1,19 @@ package com.casic.missiles.modular.app.service; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; +import java.util.Map; /** *

- * 服务类 + * 服务类 *

* * @author stylefeng123 @@ -18,13 +21,33 @@ */ public interface IAppDeviceAddService extends IService { - List getAppDevice(String devcode); + List getAppDevice(String devcode); + String saveFile(MultipartFile var1) throws IOException; - String fileUploadMarker(MultipartFile var1,String text) throws IOException; + + String fileUploadMarker(MultipartFile var1, String text) throws IOException; + String findModeCodeByCode(String devcode); + List reportExport(String devcode, String devtype, String begTime, String endTime, String project, String installPerson); + void convert84(); - void exportUsersToExcel(List list, HttpServletResponse response); + + void exportImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId); + + void exportNotImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson,HttpServletResponse response); + + void batchDownloadFiles(String recentDir,HttpServletResponse response); + + Integer getStartTask(); + + Page batchLogs(String begTime, String endTime, Page page); } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java index 69f2254..7c2865f 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java @@ -2,32 +2,41 @@ import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dao.AppDeviceAddMapper; +import com.casic.missiles.modular.app.dao.BatchExportLogMapper; import com.casic.missiles.modular.app.dto.AppDevicAddDTO; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; -import com.casic.missiles.modular.app.util.LonlatConver; -import com.casic.missiles.modular.app.util.PhotoUtils; +import com.casic.missiles.modular.app.util.*; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.ListUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.management.Query; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.awt.*; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.*; import java.util.List; -import java.util.UUID; +import java.util.concurrent.*; /** *

@@ -38,12 +47,21 @@ * @since 2020-05-24 */ @Service +@Slf4j public class AppDeviceAddServiceImpl extends ServiceImpl implements IAppDeviceAddService { + @Value("${casic.file-upload-path}") private String filePath; @Value("${casic.photoPath}") private String photoPath; + @Value("${casic.batchNumber}") + private Integer batchNumber; + @Autowired + private BatchExportLogMapper batchExportLogMapper; + @Autowired + private WebSocket webSocket; + @Override public List getAppDevice(String devcode) { @@ -127,7 +145,6 @@ EntityWrapper query = new EntityWrapper<>(); query.le("id", 5241); List appDeviceAddList = selectList(query); - for (AppDeviceAdd appDeviceAdd : appDeviceAddList) { if (ToolUtil.isNotEmpty(appDeviceAdd.getLongitude()) && ToolUtil.isNotEmpty(appDeviceAdd.getLatitude())) { @@ -141,12 +158,115 @@ } + @Override + public void exportImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); + Long stampeDir = System.currentTimeMillis(); + //以当前时间戳为目录 + String currentStampDir = filePath + stampeDir + File.separator; + setLocalFileDir(currentStampDir); + List batchExportLogsList = new ArrayList<>(); + try { + setStartTask(); + ExecutorService executor = Executors.newFixedThreadPool(10); + for (int appDeviceAddsIndex = 0; appDeviceAddsIndex < appDeviceAdds.size(); appDeviceAddsIndex += batchNumber) { + int postIndex = getBatchNumberPostIndex(appDeviceAdds, appDeviceAddsIndex); + List appDeviceBatchList = appDeviceAdds.subList(appDeviceAddsIndex, postIndex); + String partitionNumber = appDeviceAddsIndex + "-" + postIndex; + String fileName = "设备安装基础信息表" + partitionNumber + ".xls"; + String currentFileName = currentStampDir + fileName; + Runnable task = new Runnable() { + @Override + public void run() { + ExportExcelUtil exportExcelUtil = new ExportExcelUtil(); + exportExcelUtil.fileExport(appDeviceBatchList, currentFileName, photoPath); + } + }; + executor.submit(task); + batchExportLogsList.add(createBatchFileLogs(currentUserId, partitionNumber, fileName, String.valueOf(stampeDir))); + } + while (true) { + Long activeCount = ((ThreadPoolExecutor) executor).getTaskCount() - ((ThreadPoolExecutor) executor).getCompletedTaskCount(); + if (activeCount == 0) { + //删除所有的文件日志 + this.batchExportLogMapper.delete(null); + //删除所有历史文件 + deleteFile(new File(filePath),String.valueOf(stampeDir)); + //批量导入日志 + batchExportLogsList.stream().forEach( + batchExportLog -> this.batchExportLogMapper.insert(batchExportLog) + ); + System.out.println("所有的子线程都结束了!"); + List userList = new ArrayList<>(); + userList.add(String.valueOf(currentUserId)); + Map map = new HashMap(); + map.put("message", "你在" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(stampeDir)) + "的文件导出已经生成了,请到导出列表页面查看"); + map.put("type", "alarm"); + for (int i = 0; i < 3; i++) { + webSocket.sendListMessage(userList, JSON.toJSONString(map)); + Thread.sleep(3000); + } + break; + } + Thread.sleep(5000); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + /** + * 对导出产生的日志、进行清除,还原空间 + */ + private void deleteFile(File invalidFile,String currentFileStr) { + //为当前文件目录删除 + if(invalidFile.getAbsoluteFile().getName().equals(currentFileStr)){ + return; + } + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + if (!invalidFile.getAbsolutePath().equals(filePath.substring(0,filePath.length()-1))) { + //删除子文件 + files[i].delete(); + } + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i],currentFileStr); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + if (!invalidFile.getAbsolutePath().equals(filePath)) { + //删除子目录 + if (invalidFile != null && invalidFile.isDirectory()) { + invalidFile.delete(); + } + } + } @Override - public void exportUsersToExcel(List list,HttpServletResponse response) { - + public void exportNotImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); try { - //设置信息头,告诉浏览器内容为excel类型 response.setHeader("content-Type", "application/vnd.ms-excel"); //设置下载名称 @@ -160,16 +280,137 @@ params.setSheetName("设备安装信息"); //设置标题 params.setTitle("设备安装信息"); - //转成对应的类型;要不然会报错,虽然也可以导出成功 - List AppDevicAddDTOs = AppDevicAddDTO.convert(list,photoPath); - + List AppDeviceAddDTOs = AppDevicAddDTO.convert(appDeviceAdds, null); //导入excel - Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDevicAddDTOs); + Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDeviceAddDTOs); //写入 workbook.write(out); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception ex) { + ex.printStackTrace(); } } + + + @Override + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + FileInputStream is = null; + BufferedOutputStream out = null; + String zipPath = ""; + try { + response.reset(); + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/zip;charset=utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("设备安装基础信息表.zip", StandardCharsets.UTF_8.name())); + response.setHeader("Access-Control-Allow-Origin", "*"); + System.out.println(response.getHeader("Content-Disposition")); + ZipUtils zipUtils = new ZipUtils(); + zipPath = zipUtils.zipFileCreator(filePath, recentDir); + //开始下载 + is = new FileInputStream(new File(zipPath)); + out = new BufferedOutputStream(response.getOutputStream()); + byte[] buff = new byte[1024]; + int len = 0; + while ((len = is.read(buff, 0, buff.length)) != -1) { + out.write(buff, 0, len); + } + out.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + try { + out.close(); + if (StringUtils.isNotEmpty(zipPath)) { + new ZipUtils().zipFileDeletor(zipPath); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + + @Override + public Page batchLogs(String begTime, String endTime, Page page) { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.le(StringUtils.isNotEmpty(begTime), "create_time", begTime) + .or().ge(StringUtils.isNotEmpty(endTime), "create_time", endTime); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")); + List batchExportLogs = this.batchExportLogMapper.selectPage(page, batchEntityWrapper); + page.setRecords(batchExportLogs); + return page; + } + + + private BatchExportLog createBatchFileLogs(Long currentUserId, String partitionNumber, String fileName, String fileDir) { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setPartitionNumber(partitionNumber); + batchExportLog.setCreateUserId(currentUserId); + batchExportLog.setFileDir(fileDir + File.separator); + batchExportLog.setTaskId(0); + batchExportLog.setFileName(fileName); + return batchExportLog; + } + + @Override + public Integer getStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.where("create_time>date_add(now(), interval -1 hour) "); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + return optionalBatchExportLog.isPresent() ? optionalBatchExportLog.get().getTaskId() : null; + } + + private void setStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + if (optionalBatchExportLog.isPresent()) { + optionalBatchExportLog.get().setTaskId(1); + this.batchExportLogMapper.updateById(optionalBatchExportLog.get()); + } else { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setTaskId(1); + this.batchExportLogMapper.insert(batchExportLog); + } + } + + /** + * 获取分批次要导出的目录列表 + * + * @return + */ + private int getBatchNumberPostIndex(List appDeviceAdds, int appDeviceAddsIndex) { + int postIndex = 0; + if (appDeviceAddsIndex + batchNumber > appDeviceAdds.size()) { + postIndex = appDeviceAdds.size(); + } else { + postIndex = appDeviceAddsIndex + batchNumber; + } + return postIndex; + } + + /** + * 创建文件目录 + */ + private void setLocalFileDir(String tempLocalFileDir) { + File file = new File(tempLocalFileDir); + if (!file.exists()) { + file.mkdirs(); + } + } + } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java new file mode 100644 index 0000000..cf9307c --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java @@ -0,0 +1,47 @@ +package com.casic.missiles.modular.app.util; + +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.casic.missiles.modular.app.dto.AppDevicAddDTO; +import com.casic.missiles.modular.app.model.AppDeviceAdd; +import org.apache.poi.ss.usermodel.Workbook; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +public class ExportExcelUtil { + /** + * 导出文件主要内容 + */ + public void fileExport(List appDeviceBatchList, String currentFileName,String photoPath) { + FileOutputStream fileOutputStream = null; + try { + fileOutputStream = new FileOutputStream(currentFileName); + //设置excel参数 + ExportParams params = new ExportParams(); + //设置sheet名名称 + params.setSheetName("设备安装信息"); + //设置标题 + params.setTitle("设备安装信息"); + //转成对应的类型;要不然会报错,虽然也可以导出成功 + List AppDeviceAddDTOs = AppDevicAddDTO.convert(appDeviceBatchList, photoPath); + //导入excel + Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDeviceAddDTOs); + workbook.write(fileOutputStream); + fileOutputStream.flush(); + } catch (Exception e) { + + } finally { + if (fileOutputStream != null) { + try { + fileOutputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java new file mode 100644 index 0000000..e9f04bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.app.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java index 1fe427f..cbfaa4d 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java @@ -11,15 +11,17 @@ import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dto.SelectDTO; -import com.casic.missiles.modular.app.enums.DeviceBaseExportEnum; import com.casic.missiles.modular.app.model.AppDeviceAdd; import com.casic.missiles.modular.app.model.AppDeviceLog; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; import com.casic.missiles.modular.app.service.IAppDeviceLogService; import com.casic.missiles.modular.app.util.LonlatConver; import com.casic.missiles.modular.system.model.Dict; import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @@ -30,8 +32,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; import java.util.stream.Collectors; /** @@ -54,6 +55,9 @@ @Resource private ICommonPermissionService permissionService; + @Value("${casic.photoPath}") + private String photoPath; + /** * 获取施工添加设备列表 */ @@ -164,7 +168,6 @@ // @ResponseBody // public Object imageBase64Upload(@RequestBody(required =false) String fileBase64) throws IOException { // return ResponseData.success(commonFileService.saveFileBase64Image(fileBase64)); -// // } @RequestMapping({"/getWellTypeList"}) @@ -240,32 +243,49 @@ //照片一起导出 - @RequestMapping(value = "/listExp") - public void listExps(String devcode, String devtype, - String begTime, String endTime, - String project, String installPerson, - HttpServletResponse response) throws IOException { + @RequestMapping(value = "/image/listExp") + @ResponseBody + public Object listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson) { + List dictList = permissionService.findInDictByCode("sluicewellType"); - List list = appDeviceAddService.reportExport(devcode, devtype, - begTime, endTime, project, installPerson); + Map sluiceWellDictMap = dictList.stream() + .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); + Integer taskId = appDeviceAddService.getStartTask(); + if (null == taskId || taskId != 1) { + Long currentUserId = permissionService.getCurrLoginUser().getId(); + ExecutorService executor = Executors.newFixedThreadPool(1); + executor.execute(() -> appDeviceAddService.exportImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, currentUserId)); + return ResponseData.success("执行成功,请稍等..."); + } else { + return ResponseData.error("有任务正在执行,请稍等!"); + } + } + + + @RequestMapping(value = "/listExp") + @ResponseBody + public void listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { List dictList = permissionService.findInDictByCode("sluicewellType"); Map sluiceWellDictMap = dictList.stream() .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); - list.forEach(appDeviceAdd -> { - appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); - }); - ExecutorService cachedExecutorService = Executors.newCachedThreadPool(); - cachedExecutorService.execute(new Runnable() { - @Override - public void run() { - appDeviceAddService.exportUsersToExcel(list, response); - } - }); -// List res = new ArrayList<>(); -// res.addAll(list); -// //获取导出文件header -// super.exportExcel(DeviceBaseExportEnum.DeviceBase_EXPORT, res); + appDeviceAddService.exportNotImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, response); } + @RequestMapping(value = "/batch/logs") + @ResponseBody + public Object batchLogs(String begTime, String endTime) { + Page page = new PageFactory().defaultPage(); + return ResponseData.success(super.packForBT(appDeviceAddService.batchLogs(begTime, endTime, page))); + } + + @CrossOrigin + @RequestMapping(value = "/batchzip") + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + appDeviceAddService.batchDownloadFiles(recentDir, response); + } } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java new file mode 100644 index 0000000..b741f4e --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.modular.app.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.app.model.BatchExportLog; + +public interface BatchExportLogMapper extends BaseMapper { + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java index 6ed5d35..9acca94 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java @@ -1,11 +1,11 @@ package com.casic.missiles.modular.app.dto; import cn.afterturn.easypoi.excel.annotation.Excel; +import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.model.AppDeviceAdd; import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; +import org.apache.commons.lang3.StringUtils; import java.io.Serializable; import java.util.ArrayList; @@ -33,7 +33,7 @@ private String installheigt; @Excel(name = "负责人", width = 10.0) private String installperson; - @Excel(name = "安装时间", format = "yyyy-MM-dd",width = 10.0) + @Excel(name = "安装时间", format = "yyyy-MM-dd", width = 10.0) private Date installtime; @Excel(name = "照片1", type = 2, width = 20.0, height = 60.0, imageType = 1) private String photopath1; @@ -61,16 +61,16 @@ private String latitude84; - public static List convert (List appDeviceAdds,String photoPath) { + public static List convert(List appDeviceAdds, String photoPath) { List appDevicAddDTOS = new ArrayList<>(); appDeviceAdds.forEach(appDeviceAdd -> { - appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd,photoPath)); + appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd, photoPath)); }); return appDevicAddDTOS; } - public AppDevicAddDTO(AppDeviceAdd appDeviceAdd,String photoPath) { + public AppDevicAddDTO(AppDeviceAdd appDeviceAdd, String photoPath) { this.devcode = appDeviceAdd.getDevcode(); this.devicetype = appDeviceAdd.getDevicetype(); this.wellcode = appDeviceAdd.getWellcode(); @@ -80,9 +80,12 @@ this.installheigt = appDeviceAdd.getInstallheigt(); this.installperson = appDeviceAdd.getInstallperson(); this.installtime = appDeviceAdd.getInstalltime(); - this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1())?photoPath+appDeviceAdd.getPhotopath1():appDeviceAdd.getPhotopath1(); - this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2())?photoPath+appDeviceAdd.getPhotopath2():appDeviceAdd.getPhotopath2(); - this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3())?photoPath+appDeviceAdd.getPhotopath3():appDeviceAdd.getPhotopath3(); +// && this.installtime.getTime()>=DateUtil.parseDate("2023-04-01").getTime() + if (StringUtils.isNotEmpty(photoPath) ) { + this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1()) ? photoPath + appDeviceAdd.getPhotopath1() : appDeviceAdd.getPhotopath1(); + this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2()) ? photoPath + appDeviceAdd.getPhotopath2() : appDeviceAdd.getPhotopath2(); + this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3()) ? photoPath + appDeviceAdd.getPhotopath3() : appDeviceAdd.getPhotopath3(); + } this.project = appDeviceAdd.getProject(); this.position = appDeviceAdd.getPosition(); this.description = appDeviceAdd.getDescription(); diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java new file mode 100644 index 0000000..a8701e5 --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.app.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cz + */ +@Data +@TableName("batch_export_log") +public class BatchExportLog extends Model { + + private static final long serialVersionUID = 1L; + + @TableId("id") + private Long id; + @TableField("file_name") + private String fileName; + @TableField("file_dir") + private String fileDir; + @TableField("partition_number") + private String partitionNumber; + @TableField("create_time") + private String createTime; + @TableField("create_user_id") + private Long createUserId; + @TableField("task_id") + private int taskId; + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java index 96bd6fb..a8921c5 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java @@ -1,16 +1,19 @@ package com.casic.missiles.modular.app.service; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; +import java.util.Map; /** *

- * 服务类 + * 服务类 *

* * @author stylefeng123 @@ -18,13 +21,33 @@ */ public interface IAppDeviceAddService extends IService { - List getAppDevice(String devcode); + List getAppDevice(String devcode); + String saveFile(MultipartFile var1) throws IOException; - String fileUploadMarker(MultipartFile var1,String text) throws IOException; + + String fileUploadMarker(MultipartFile var1, String text) throws IOException; + String findModeCodeByCode(String devcode); + List reportExport(String devcode, String devtype, String begTime, String endTime, String project, String installPerson); + void convert84(); - void exportUsersToExcel(List list, HttpServletResponse response); + + void exportImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId); + + void exportNotImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson,HttpServletResponse response); + + void batchDownloadFiles(String recentDir,HttpServletResponse response); + + Integer getStartTask(); + + Page batchLogs(String begTime, String endTime, Page page); } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java index 69f2254..7c2865f 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java @@ -2,32 +2,41 @@ import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dao.AppDeviceAddMapper; +import com.casic.missiles.modular.app.dao.BatchExportLogMapper; import com.casic.missiles.modular.app.dto.AppDevicAddDTO; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; -import com.casic.missiles.modular.app.util.LonlatConver; -import com.casic.missiles.modular.app.util.PhotoUtils; +import com.casic.missiles.modular.app.util.*; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.ListUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.management.Query; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.awt.*; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.*; import java.util.List; -import java.util.UUID; +import java.util.concurrent.*; /** *

@@ -38,12 +47,21 @@ * @since 2020-05-24 */ @Service +@Slf4j public class AppDeviceAddServiceImpl extends ServiceImpl implements IAppDeviceAddService { + @Value("${casic.file-upload-path}") private String filePath; @Value("${casic.photoPath}") private String photoPath; + @Value("${casic.batchNumber}") + private Integer batchNumber; + @Autowired + private BatchExportLogMapper batchExportLogMapper; + @Autowired + private WebSocket webSocket; + @Override public List getAppDevice(String devcode) { @@ -127,7 +145,6 @@ EntityWrapper query = new EntityWrapper<>(); query.le("id", 5241); List appDeviceAddList = selectList(query); - for (AppDeviceAdd appDeviceAdd : appDeviceAddList) { if (ToolUtil.isNotEmpty(appDeviceAdd.getLongitude()) && ToolUtil.isNotEmpty(appDeviceAdd.getLatitude())) { @@ -141,12 +158,115 @@ } + @Override + public void exportImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); + Long stampeDir = System.currentTimeMillis(); + //以当前时间戳为目录 + String currentStampDir = filePath + stampeDir + File.separator; + setLocalFileDir(currentStampDir); + List batchExportLogsList = new ArrayList<>(); + try { + setStartTask(); + ExecutorService executor = Executors.newFixedThreadPool(10); + for (int appDeviceAddsIndex = 0; appDeviceAddsIndex < appDeviceAdds.size(); appDeviceAddsIndex += batchNumber) { + int postIndex = getBatchNumberPostIndex(appDeviceAdds, appDeviceAddsIndex); + List appDeviceBatchList = appDeviceAdds.subList(appDeviceAddsIndex, postIndex); + String partitionNumber = appDeviceAddsIndex + "-" + postIndex; + String fileName = "设备安装基础信息表" + partitionNumber + ".xls"; + String currentFileName = currentStampDir + fileName; + Runnable task = new Runnable() { + @Override + public void run() { + ExportExcelUtil exportExcelUtil = new ExportExcelUtil(); + exportExcelUtil.fileExport(appDeviceBatchList, currentFileName, photoPath); + } + }; + executor.submit(task); + batchExportLogsList.add(createBatchFileLogs(currentUserId, partitionNumber, fileName, String.valueOf(stampeDir))); + } + while (true) { + Long activeCount = ((ThreadPoolExecutor) executor).getTaskCount() - ((ThreadPoolExecutor) executor).getCompletedTaskCount(); + if (activeCount == 0) { + //删除所有的文件日志 + this.batchExportLogMapper.delete(null); + //删除所有历史文件 + deleteFile(new File(filePath),String.valueOf(stampeDir)); + //批量导入日志 + batchExportLogsList.stream().forEach( + batchExportLog -> this.batchExportLogMapper.insert(batchExportLog) + ); + System.out.println("所有的子线程都结束了!"); + List userList = new ArrayList<>(); + userList.add(String.valueOf(currentUserId)); + Map map = new HashMap(); + map.put("message", "你在" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(stampeDir)) + "的文件导出已经生成了,请到导出列表页面查看"); + map.put("type", "alarm"); + for (int i = 0; i < 3; i++) { + webSocket.sendListMessage(userList, JSON.toJSONString(map)); + Thread.sleep(3000); + } + break; + } + Thread.sleep(5000); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + /** + * 对导出产生的日志、进行清除,还原空间 + */ + private void deleteFile(File invalidFile,String currentFileStr) { + //为当前文件目录删除 + if(invalidFile.getAbsoluteFile().getName().equals(currentFileStr)){ + return; + } + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + if (!invalidFile.getAbsolutePath().equals(filePath.substring(0,filePath.length()-1))) { + //删除子文件 + files[i].delete(); + } + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i],currentFileStr); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + if (!invalidFile.getAbsolutePath().equals(filePath)) { + //删除子目录 + if (invalidFile != null && invalidFile.isDirectory()) { + invalidFile.delete(); + } + } + } @Override - public void exportUsersToExcel(List list,HttpServletResponse response) { - + public void exportNotImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); try { - //设置信息头,告诉浏览器内容为excel类型 response.setHeader("content-Type", "application/vnd.ms-excel"); //设置下载名称 @@ -160,16 +280,137 @@ params.setSheetName("设备安装信息"); //设置标题 params.setTitle("设备安装信息"); - //转成对应的类型;要不然会报错,虽然也可以导出成功 - List AppDevicAddDTOs = AppDevicAddDTO.convert(list,photoPath); - + List AppDeviceAddDTOs = AppDevicAddDTO.convert(appDeviceAdds, null); //导入excel - Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDevicAddDTOs); + Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDeviceAddDTOs); //写入 workbook.write(out); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception ex) { + ex.printStackTrace(); } } + + + @Override + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + FileInputStream is = null; + BufferedOutputStream out = null; + String zipPath = ""; + try { + response.reset(); + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/zip;charset=utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("设备安装基础信息表.zip", StandardCharsets.UTF_8.name())); + response.setHeader("Access-Control-Allow-Origin", "*"); + System.out.println(response.getHeader("Content-Disposition")); + ZipUtils zipUtils = new ZipUtils(); + zipPath = zipUtils.zipFileCreator(filePath, recentDir); + //开始下载 + is = new FileInputStream(new File(zipPath)); + out = new BufferedOutputStream(response.getOutputStream()); + byte[] buff = new byte[1024]; + int len = 0; + while ((len = is.read(buff, 0, buff.length)) != -1) { + out.write(buff, 0, len); + } + out.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + try { + out.close(); + if (StringUtils.isNotEmpty(zipPath)) { + new ZipUtils().zipFileDeletor(zipPath); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + + @Override + public Page batchLogs(String begTime, String endTime, Page page) { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.le(StringUtils.isNotEmpty(begTime), "create_time", begTime) + .or().ge(StringUtils.isNotEmpty(endTime), "create_time", endTime); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")); + List batchExportLogs = this.batchExportLogMapper.selectPage(page, batchEntityWrapper); + page.setRecords(batchExportLogs); + return page; + } + + + private BatchExportLog createBatchFileLogs(Long currentUserId, String partitionNumber, String fileName, String fileDir) { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setPartitionNumber(partitionNumber); + batchExportLog.setCreateUserId(currentUserId); + batchExportLog.setFileDir(fileDir + File.separator); + batchExportLog.setTaskId(0); + batchExportLog.setFileName(fileName); + return batchExportLog; + } + + @Override + public Integer getStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.where("create_time>date_add(now(), interval -1 hour) "); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + return optionalBatchExportLog.isPresent() ? optionalBatchExportLog.get().getTaskId() : null; + } + + private void setStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + if (optionalBatchExportLog.isPresent()) { + optionalBatchExportLog.get().setTaskId(1); + this.batchExportLogMapper.updateById(optionalBatchExportLog.get()); + } else { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setTaskId(1); + this.batchExportLogMapper.insert(batchExportLog); + } + } + + /** + * 获取分批次要导出的目录列表 + * + * @return + */ + private int getBatchNumberPostIndex(List appDeviceAdds, int appDeviceAddsIndex) { + int postIndex = 0; + if (appDeviceAddsIndex + batchNumber > appDeviceAdds.size()) { + postIndex = appDeviceAdds.size(); + } else { + postIndex = appDeviceAddsIndex + batchNumber; + } + return postIndex; + } + + /** + * 创建文件目录 + */ + private void setLocalFileDir(String tempLocalFileDir) { + File file = new File(tempLocalFileDir); + if (!file.exists()) { + file.mkdirs(); + } + } + } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java new file mode 100644 index 0000000..cf9307c --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java @@ -0,0 +1,47 @@ +package com.casic.missiles.modular.app.util; + +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.casic.missiles.modular.app.dto.AppDevicAddDTO; +import com.casic.missiles.modular.app.model.AppDeviceAdd; +import org.apache.poi.ss.usermodel.Workbook; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +public class ExportExcelUtil { + /** + * 导出文件主要内容 + */ + public void fileExport(List appDeviceBatchList, String currentFileName,String photoPath) { + FileOutputStream fileOutputStream = null; + try { + fileOutputStream = new FileOutputStream(currentFileName); + //设置excel参数 + ExportParams params = new ExportParams(); + //设置sheet名名称 + params.setSheetName("设备安装信息"); + //设置标题 + params.setTitle("设备安装信息"); + //转成对应的类型;要不然会报错,虽然也可以导出成功 + List AppDeviceAddDTOs = AppDevicAddDTO.convert(appDeviceBatchList, photoPath); + //导入excel + Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDeviceAddDTOs); + workbook.write(fileOutputStream); + fileOutputStream.flush(); + } catch (Exception e) { + + } finally { + if (fileOutputStream != null) { + try { + fileOutputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java new file mode 100644 index 0000000..50f24dc --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java @@ -0,0 +1,101 @@ +package com.casic.missiles.modular.app.util; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets =new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value="userId")String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId+"【websocket消息】有新的连接,总数为:"+webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:"+webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:"+message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for(WebSocket webSocket : webSockets) { + System.out.println("【websocket消息】广播消息:"+message); + try { + webSocket.session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + // 发送列表消息 + public void sendListMessage(List userIds, String message){ + System.out.println("【websocket消息】列表消息:"+message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 发送列表消息 + +// public void sendListMessage(List userIds, Object data){ +// System.out.println("【websocket消息】列表消息:"+data); +// for (String userId : userIds) { +// Session session = sessionPool.get(userId); +// if (session != null) { +// try { +//// session.getAsyncRemote().sendText(message); +// session.getAsyncRemote().sendObject(data); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:"+message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java new file mode 100644 index 0000000..e9f04bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.app.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java index 1fe427f..cbfaa4d 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java @@ -11,15 +11,17 @@ import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dto.SelectDTO; -import com.casic.missiles.modular.app.enums.DeviceBaseExportEnum; import com.casic.missiles.modular.app.model.AppDeviceAdd; import com.casic.missiles.modular.app.model.AppDeviceLog; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; import com.casic.missiles.modular.app.service.IAppDeviceLogService; import com.casic.missiles.modular.app.util.LonlatConver; import com.casic.missiles.modular.system.model.Dict; import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @@ -30,8 +32,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; import java.util.stream.Collectors; /** @@ -54,6 +55,9 @@ @Resource private ICommonPermissionService permissionService; + @Value("${casic.photoPath}") + private String photoPath; + /** * 获取施工添加设备列表 */ @@ -164,7 +168,6 @@ // @ResponseBody // public Object imageBase64Upload(@RequestBody(required =false) String fileBase64) throws IOException { // return ResponseData.success(commonFileService.saveFileBase64Image(fileBase64)); -// // } @RequestMapping({"/getWellTypeList"}) @@ -240,32 +243,49 @@ //照片一起导出 - @RequestMapping(value = "/listExp") - public void listExps(String devcode, String devtype, - String begTime, String endTime, - String project, String installPerson, - HttpServletResponse response) throws IOException { + @RequestMapping(value = "/image/listExp") + @ResponseBody + public Object listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson) { + List dictList = permissionService.findInDictByCode("sluicewellType"); - List list = appDeviceAddService.reportExport(devcode, devtype, - begTime, endTime, project, installPerson); + Map sluiceWellDictMap = dictList.stream() + .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); + Integer taskId = appDeviceAddService.getStartTask(); + if (null == taskId || taskId != 1) { + Long currentUserId = permissionService.getCurrLoginUser().getId(); + ExecutorService executor = Executors.newFixedThreadPool(1); + executor.execute(() -> appDeviceAddService.exportImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, currentUserId)); + return ResponseData.success("执行成功,请稍等..."); + } else { + return ResponseData.error("有任务正在执行,请稍等!"); + } + } + + + @RequestMapping(value = "/listExp") + @ResponseBody + public void listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { List dictList = permissionService.findInDictByCode("sluicewellType"); Map sluiceWellDictMap = dictList.stream() .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); - list.forEach(appDeviceAdd -> { - appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); - }); - ExecutorService cachedExecutorService = Executors.newCachedThreadPool(); - cachedExecutorService.execute(new Runnable() { - @Override - public void run() { - appDeviceAddService.exportUsersToExcel(list, response); - } - }); -// List res = new ArrayList<>(); -// res.addAll(list); -// //获取导出文件header -// super.exportExcel(DeviceBaseExportEnum.DeviceBase_EXPORT, res); + appDeviceAddService.exportNotImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, response); } + @RequestMapping(value = "/batch/logs") + @ResponseBody + public Object batchLogs(String begTime, String endTime) { + Page page = new PageFactory().defaultPage(); + return ResponseData.success(super.packForBT(appDeviceAddService.batchLogs(begTime, endTime, page))); + } + + @CrossOrigin + @RequestMapping(value = "/batchzip") + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + appDeviceAddService.batchDownloadFiles(recentDir, response); + } } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java new file mode 100644 index 0000000..b741f4e --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.modular.app.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.app.model.BatchExportLog; + +public interface BatchExportLogMapper extends BaseMapper { + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java index 6ed5d35..9acca94 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java @@ -1,11 +1,11 @@ package com.casic.missiles.modular.app.dto; import cn.afterturn.easypoi.excel.annotation.Excel; +import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.model.AppDeviceAdd; import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; +import org.apache.commons.lang3.StringUtils; import java.io.Serializable; import java.util.ArrayList; @@ -33,7 +33,7 @@ private String installheigt; @Excel(name = "负责人", width = 10.0) private String installperson; - @Excel(name = "安装时间", format = "yyyy-MM-dd",width = 10.0) + @Excel(name = "安装时间", format = "yyyy-MM-dd", width = 10.0) private Date installtime; @Excel(name = "照片1", type = 2, width = 20.0, height = 60.0, imageType = 1) private String photopath1; @@ -61,16 +61,16 @@ private String latitude84; - public static List convert (List appDeviceAdds,String photoPath) { + public static List convert(List appDeviceAdds, String photoPath) { List appDevicAddDTOS = new ArrayList<>(); appDeviceAdds.forEach(appDeviceAdd -> { - appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd,photoPath)); + appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd, photoPath)); }); return appDevicAddDTOS; } - public AppDevicAddDTO(AppDeviceAdd appDeviceAdd,String photoPath) { + public AppDevicAddDTO(AppDeviceAdd appDeviceAdd, String photoPath) { this.devcode = appDeviceAdd.getDevcode(); this.devicetype = appDeviceAdd.getDevicetype(); this.wellcode = appDeviceAdd.getWellcode(); @@ -80,9 +80,12 @@ this.installheigt = appDeviceAdd.getInstallheigt(); this.installperson = appDeviceAdd.getInstallperson(); this.installtime = appDeviceAdd.getInstalltime(); - this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1())?photoPath+appDeviceAdd.getPhotopath1():appDeviceAdd.getPhotopath1(); - this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2())?photoPath+appDeviceAdd.getPhotopath2():appDeviceAdd.getPhotopath2(); - this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3())?photoPath+appDeviceAdd.getPhotopath3():appDeviceAdd.getPhotopath3(); +// && this.installtime.getTime()>=DateUtil.parseDate("2023-04-01").getTime() + if (StringUtils.isNotEmpty(photoPath) ) { + this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1()) ? photoPath + appDeviceAdd.getPhotopath1() : appDeviceAdd.getPhotopath1(); + this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2()) ? photoPath + appDeviceAdd.getPhotopath2() : appDeviceAdd.getPhotopath2(); + this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3()) ? photoPath + appDeviceAdd.getPhotopath3() : appDeviceAdd.getPhotopath3(); + } this.project = appDeviceAdd.getProject(); this.position = appDeviceAdd.getPosition(); this.description = appDeviceAdd.getDescription(); diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java new file mode 100644 index 0000000..a8701e5 --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.app.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cz + */ +@Data +@TableName("batch_export_log") +public class BatchExportLog extends Model { + + private static final long serialVersionUID = 1L; + + @TableId("id") + private Long id; + @TableField("file_name") + private String fileName; + @TableField("file_dir") + private String fileDir; + @TableField("partition_number") + private String partitionNumber; + @TableField("create_time") + private String createTime; + @TableField("create_user_id") + private Long createUserId; + @TableField("task_id") + private int taskId; + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java index 96bd6fb..a8921c5 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java @@ -1,16 +1,19 @@ package com.casic.missiles.modular.app.service; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; +import java.util.Map; /** *

- * 服务类 + * 服务类 *

* * @author stylefeng123 @@ -18,13 +21,33 @@ */ public interface IAppDeviceAddService extends IService { - List getAppDevice(String devcode); + List getAppDevice(String devcode); + String saveFile(MultipartFile var1) throws IOException; - String fileUploadMarker(MultipartFile var1,String text) throws IOException; + + String fileUploadMarker(MultipartFile var1, String text) throws IOException; + String findModeCodeByCode(String devcode); + List reportExport(String devcode, String devtype, String begTime, String endTime, String project, String installPerson); + void convert84(); - void exportUsersToExcel(List list, HttpServletResponse response); + + void exportImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId); + + void exportNotImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson,HttpServletResponse response); + + void batchDownloadFiles(String recentDir,HttpServletResponse response); + + Integer getStartTask(); + + Page batchLogs(String begTime, String endTime, Page page); } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java index 69f2254..7c2865f 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java @@ -2,32 +2,41 @@ import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dao.AppDeviceAddMapper; +import com.casic.missiles.modular.app.dao.BatchExportLogMapper; import com.casic.missiles.modular.app.dto.AppDevicAddDTO; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; -import com.casic.missiles.modular.app.util.LonlatConver; -import com.casic.missiles.modular.app.util.PhotoUtils; +import com.casic.missiles.modular.app.util.*; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.ListUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.management.Query; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.awt.*; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.*; import java.util.List; -import java.util.UUID; +import java.util.concurrent.*; /** *

@@ -38,12 +47,21 @@ * @since 2020-05-24 */ @Service +@Slf4j public class AppDeviceAddServiceImpl extends ServiceImpl implements IAppDeviceAddService { + @Value("${casic.file-upload-path}") private String filePath; @Value("${casic.photoPath}") private String photoPath; + @Value("${casic.batchNumber}") + private Integer batchNumber; + @Autowired + private BatchExportLogMapper batchExportLogMapper; + @Autowired + private WebSocket webSocket; + @Override public List getAppDevice(String devcode) { @@ -127,7 +145,6 @@ EntityWrapper query = new EntityWrapper<>(); query.le("id", 5241); List appDeviceAddList = selectList(query); - for (AppDeviceAdd appDeviceAdd : appDeviceAddList) { if (ToolUtil.isNotEmpty(appDeviceAdd.getLongitude()) && ToolUtil.isNotEmpty(appDeviceAdd.getLatitude())) { @@ -141,12 +158,115 @@ } + @Override + public void exportImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); + Long stampeDir = System.currentTimeMillis(); + //以当前时间戳为目录 + String currentStampDir = filePath + stampeDir + File.separator; + setLocalFileDir(currentStampDir); + List batchExportLogsList = new ArrayList<>(); + try { + setStartTask(); + ExecutorService executor = Executors.newFixedThreadPool(10); + for (int appDeviceAddsIndex = 0; appDeviceAddsIndex < appDeviceAdds.size(); appDeviceAddsIndex += batchNumber) { + int postIndex = getBatchNumberPostIndex(appDeviceAdds, appDeviceAddsIndex); + List appDeviceBatchList = appDeviceAdds.subList(appDeviceAddsIndex, postIndex); + String partitionNumber = appDeviceAddsIndex + "-" + postIndex; + String fileName = "设备安装基础信息表" + partitionNumber + ".xls"; + String currentFileName = currentStampDir + fileName; + Runnable task = new Runnable() { + @Override + public void run() { + ExportExcelUtil exportExcelUtil = new ExportExcelUtil(); + exportExcelUtil.fileExport(appDeviceBatchList, currentFileName, photoPath); + } + }; + executor.submit(task); + batchExportLogsList.add(createBatchFileLogs(currentUserId, partitionNumber, fileName, String.valueOf(stampeDir))); + } + while (true) { + Long activeCount = ((ThreadPoolExecutor) executor).getTaskCount() - ((ThreadPoolExecutor) executor).getCompletedTaskCount(); + if (activeCount == 0) { + //删除所有的文件日志 + this.batchExportLogMapper.delete(null); + //删除所有历史文件 + deleteFile(new File(filePath),String.valueOf(stampeDir)); + //批量导入日志 + batchExportLogsList.stream().forEach( + batchExportLog -> this.batchExportLogMapper.insert(batchExportLog) + ); + System.out.println("所有的子线程都结束了!"); + List userList = new ArrayList<>(); + userList.add(String.valueOf(currentUserId)); + Map map = new HashMap(); + map.put("message", "你在" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(stampeDir)) + "的文件导出已经生成了,请到导出列表页面查看"); + map.put("type", "alarm"); + for (int i = 0; i < 3; i++) { + webSocket.sendListMessage(userList, JSON.toJSONString(map)); + Thread.sleep(3000); + } + break; + } + Thread.sleep(5000); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + /** + * 对导出产生的日志、进行清除,还原空间 + */ + private void deleteFile(File invalidFile,String currentFileStr) { + //为当前文件目录删除 + if(invalidFile.getAbsoluteFile().getName().equals(currentFileStr)){ + return; + } + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + if (!invalidFile.getAbsolutePath().equals(filePath.substring(0,filePath.length()-1))) { + //删除子文件 + files[i].delete(); + } + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i],currentFileStr); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + if (!invalidFile.getAbsolutePath().equals(filePath)) { + //删除子目录 + if (invalidFile != null && invalidFile.isDirectory()) { + invalidFile.delete(); + } + } + } @Override - public void exportUsersToExcel(List list,HttpServletResponse response) { - + public void exportNotImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); try { - //设置信息头,告诉浏览器内容为excel类型 response.setHeader("content-Type", "application/vnd.ms-excel"); //设置下载名称 @@ -160,16 +280,137 @@ params.setSheetName("设备安装信息"); //设置标题 params.setTitle("设备安装信息"); - //转成对应的类型;要不然会报错,虽然也可以导出成功 - List AppDevicAddDTOs = AppDevicAddDTO.convert(list,photoPath); - + List AppDeviceAddDTOs = AppDevicAddDTO.convert(appDeviceAdds, null); //导入excel - Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDevicAddDTOs); + Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDeviceAddDTOs); //写入 workbook.write(out); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception ex) { + ex.printStackTrace(); } } + + + @Override + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + FileInputStream is = null; + BufferedOutputStream out = null; + String zipPath = ""; + try { + response.reset(); + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/zip;charset=utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("设备安装基础信息表.zip", StandardCharsets.UTF_8.name())); + response.setHeader("Access-Control-Allow-Origin", "*"); + System.out.println(response.getHeader("Content-Disposition")); + ZipUtils zipUtils = new ZipUtils(); + zipPath = zipUtils.zipFileCreator(filePath, recentDir); + //开始下载 + is = new FileInputStream(new File(zipPath)); + out = new BufferedOutputStream(response.getOutputStream()); + byte[] buff = new byte[1024]; + int len = 0; + while ((len = is.read(buff, 0, buff.length)) != -1) { + out.write(buff, 0, len); + } + out.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + try { + out.close(); + if (StringUtils.isNotEmpty(zipPath)) { + new ZipUtils().zipFileDeletor(zipPath); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + + @Override + public Page batchLogs(String begTime, String endTime, Page page) { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.le(StringUtils.isNotEmpty(begTime), "create_time", begTime) + .or().ge(StringUtils.isNotEmpty(endTime), "create_time", endTime); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")); + List batchExportLogs = this.batchExportLogMapper.selectPage(page, batchEntityWrapper); + page.setRecords(batchExportLogs); + return page; + } + + + private BatchExportLog createBatchFileLogs(Long currentUserId, String partitionNumber, String fileName, String fileDir) { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setPartitionNumber(partitionNumber); + batchExportLog.setCreateUserId(currentUserId); + batchExportLog.setFileDir(fileDir + File.separator); + batchExportLog.setTaskId(0); + batchExportLog.setFileName(fileName); + return batchExportLog; + } + + @Override + public Integer getStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.where("create_time>date_add(now(), interval -1 hour) "); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + return optionalBatchExportLog.isPresent() ? optionalBatchExportLog.get().getTaskId() : null; + } + + private void setStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + if (optionalBatchExportLog.isPresent()) { + optionalBatchExportLog.get().setTaskId(1); + this.batchExportLogMapper.updateById(optionalBatchExportLog.get()); + } else { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setTaskId(1); + this.batchExportLogMapper.insert(batchExportLog); + } + } + + /** + * 获取分批次要导出的目录列表 + * + * @return + */ + private int getBatchNumberPostIndex(List appDeviceAdds, int appDeviceAddsIndex) { + int postIndex = 0; + if (appDeviceAddsIndex + batchNumber > appDeviceAdds.size()) { + postIndex = appDeviceAdds.size(); + } else { + postIndex = appDeviceAddsIndex + batchNumber; + } + return postIndex; + } + + /** + * 创建文件目录 + */ + private void setLocalFileDir(String tempLocalFileDir) { + File file = new File(tempLocalFileDir); + if (!file.exists()) { + file.mkdirs(); + } + } + } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java new file mode 100644 index 0000000..cf9307c --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java @@ -0,0 +1,47 @@ +package com.casic.missiles.modular.app.util; + +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.casic.missiles.modular.app.dto.AppDevicAddDTO; +import com.casic.missiles.modular.app.model.AppDeviceAdd; +import org.apache.poi.ss.usermodel.Workbook; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +public class ExportExcelUtil { + /** + * 导出文件主要内容 + */ + public void fileExport(List appDeviceBatchList, String currentFileName,String photoPath) { + FileOutputStream fileOutputStream = null; + try { + fileOutputStream = new FileOutputStream(currentFileName); + //设置excel参数 + ExportParams params = new ExportParams(); + //设置sheet名名称 + params.setSheetName("设备安装信息"); + //设置标题 + params.setTitle("设备安装信息"); + //转成对应的类型;要不然会报错,虽然也可以导出成功 + List AppDeviceAddDTOs = AppDevicAddDTO.convert(appDeviceBatchList, photoPath); + //导入excel + Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDeviceAddDTOs); + workbook.write(fileOutputStream); + fileOutputStream.flush(); + } catch (Exception e) { + + } finally { + if (fileOutputStream != null) { + try { + fileOutputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java new file mode 100644 index 0000000..50f24dc --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java @@ -0,0 +1,101 @@ +package com.casic.missiles.modular.app.util; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets =new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value="userId")String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId+"【websocket消息】有新的连接,总数为:"+webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:"+webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:"+message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for(WebSocket webSocket : webSockets) { + System.out.println("【websocket消息】广播消息:"+message); + try { + webSocket.session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + // 发送列表消息 + public void sendListMessage(List userIds, String message){ + System.out.println("【websocket消息】列表消息:"+message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 发送列表消息 + +// public void sendListMessage(List userIds, Object data){ +// System.out.println("【websocket消息】列表消息:"+data); +// for (String userId : userIds) { +// Session session = sessionPool.get(userId); +// if (session != null) { +// try { +//// session.getAsyncRemote().sendText(message); +// session.getAsyncRemote().sendObject(data); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:"+message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java new file mode 100644 index 0000000..ea267bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java @@ -0,0 +1,84 @@ +package com.casic.missiles.modular.app.util; + + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * @author zhouxuan + * @since 2019/4/19 + */ +public class ZipUtils { + + /** + * 批量打包 + * + * @param downloadPath 项目根目录 + * @return tempDir 文件保存绝对路径 + */ + public String zipFileCreator(String downloadPath,String tempDir) { + ZipOutputStream out = null; + try { + //生成打包下载后的zip文件:Papers.zip + String papersZipName = "设备安装基础信息表.zip"; + //zip文件保存路径 + String zipPath = downloadPath + papersZipName; + String fileSaveRootPath=downloadPath+File.separator+tempDir; + File file = new File(fileSaveRootPath); + File[] files = file.listFiles(); + out = new ZipOutputStream(new FileOutputStream(zipPath)); + //遍历jsonArray列表获取所有JSONObject对象 + for (int i = 0; i < files.length; i++) { + //以论文标题为每个文件命名 + FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); + out.putNextEntry(new ZipEntry(files[i].getName())); + //写入压缩包 + int len; + byte[] buffer = new byte[1024]; + while ((len = fis.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + out.closeEntry(); + fis.close(); + } + out.close(); + out.flush(); + return zipPath; + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + + /** + * 批量打包 + * + * @param zipPath zip路径 + * @return zip文件保存绝对路径 + */ + public void zipFileDeletor(String zipPath) { + try { + File zipFile=new File(zipPath); + zipFile.delete(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java new file mode 100644 index 0000000..e9f04bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.app.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java index 1fe427f..cbfaa4d 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java @@ -11,15 +11,17 @@ import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dto.SelectDTO; -import com.casic.missiles.modular.app.enums.DeviceBaseExportEnum; import com.casic.missiles.modular.app.model.AppDeviceAdd; import com.casic.missiles.modular.app.model.AppDeviceLog; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; import com.casic.missiles.modular.app.service.IAppDeviceLogService; import com.casic.missiles.modular.app.util.LonlatConver; import com.casic.missiles.modular.system.model.Dict; import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @@ -30,8 +32,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; import java.util.stream.Collectors; /** @@ -54,6 +55,9 @@ @Resource private ICommonPermissionService permissionService; + @Value("${casic.photoPath}") + private String photoPath; + /** * 获取施工添加设备列表 */ @@ -164,7 +168,6 @@ // @ResponseBody // public Object imageBase64Upload(@RequestBody(required =false) String fileBase64) throws IOException { // return ResponseData.success(commonFileService.saveFileBase64Image(fileBase64)); -// // } @RequestMapping({"/getWellTypeList"}) @@ -240,32 +243,49 @@ //照片一起导出 - @RequestMapping(value = "/listExp") - public void listExps(String devcode, String devtype, - String begTime, String endTime, - String project, String installPerson, - HttpServletResponse response) throws IOException { + @RequestMapping(value = "/image/listExp") + @ResponseBody + public Object listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson) { + List dictList = permissionService.findInDictByCode("sluicewellType"); - List list = appDeviceAddService.reportExport(devcode, devtype, - begTime, endTime, project, installPerson); + Map sluiceWellDictMap = dictList.stream() + .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); + Integer taskId = appDeviceAddService.getStartTask(); + if (null == taskId || taskId != 1) { + Long currentUserId = permissionService.getCurrLoginUser().getId(); + ExecutorService executor = Executors.newFixedThreadPool(1); + executor.execute(() -> appDeviceAddService.exportImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, currentUserId)); + return ResponseData.success("执行成功,请稍等..."); + } else { + return ResponseData.error("有任务正在执行,请稍等!"); + } + } + + + @RequestMapping(value = "/listExp") + @ResponseBody + public void listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { List dictList = permissionService.findInDictByCode("sluicewellType"); Map sluiceWellDictMap = dictList.stream() .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); - list.forEach(appDeviceAdd -> { - appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); - }); - ExecutorService cachedExecutorService = Executors.newCachedThreadPool(); - cachedExecutorService.execute(new Runnable() { - @Override - public void run() { - appDeviceAddService.exportUsersToExcel(list, response); - } - }); -// List res = new ArrayList<>(); -// res.addAll(list); -// //获取导出文件header -// super.exportExcel(DeviceBaseExportEnum.DeviceBase_EXPORT, res); + appDeviceAddService.exportNotImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, response); } + @RequestMapping(value = "/batch/logs") + @ResponseBody + public Object batchLogs(String begTime, String endTime) { + Page page = new PageFactory().defaultPage(); + return ResponseData.success(super.packForBT(appDeviceAddService.batchLogs(begTime, endTime, page))); + } + + @CrossOrigin + @RequestMapping(value = "/batchzip") + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + appDeviceAddService.batchDownloadFiles(recentDir, response); + } } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java new file mode 100644 index 0000000..b741f4e --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.modular.app.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.app.model.BatchExportLog; + +public interface BatchExportLogMapper extends BaseMapper { + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java index 6ed5d35..9acca94 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java @@ -1,11 +1,11 @@ package com.casic.missiles.modular.app.dto; import cn.afterturn.easypoi.excel.annotation.Excel; +import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.model.AppDeviceAdd; import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; +import org.apache.commons.lang3.StringUtils; import java.io.Serializable; import java.util.ArrayList; @@ -33,7 +33,7 @@ private String installheigt; @Excel(name = "负责人", width = 10.0) private String installperson; - @Excel(name = "安装时间", format = "yyyy-MM-dd",width = 10.0) + @Excel(name = "安装时间", format = "yyyy-MM-dd", width = 10.0) private Date installtime; @Excel(name = "照片1", type = 2, width = 20.0, height = 60.0, imageType = 1) private String photopath1; @@ -61,16 +61,16 @@ private String latitude84; - public static List convert (List appDeviceAdds,String photoPath) { + public static List convert(List appDeviceAdds, String photoPath) { List appDevicAddDTOS = new ArrayList<>(); appDeviceAdds.forEach(appDeviceAdd -> { - appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd,photoPath)); + appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd, photoPath)); }); return appDevicAddDTOS; } - public AppDevicAddDTO(AppDeviceAdd appDeviceAdd,String photoPath) { + public AppDevicAddDTO(AppDeviceAdd appDeviceAdd, String photoPath) { this.devcode = appDeviceAdd.getDevcode(); this.devicetype = appDeviceAdd.getDevicetype(); this.wellcode = appDeviceAdd.getWellcode(); @@ -80,9 +80,12 @@ this.installheigt = appDeviceAdd.getInstallheigt(); this.installperson = appDeviceAdd.getInstallperson(); this.installtime = appDeviceAdd.getInstalltime(); - this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1())?photoPath+appDeviceAdd.getPhotopath1():appDeviceAdd.getPhotopath1(); - this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2())?photoPath+appDeviceAdd.getPhotopath2():appDeviceAdd.getPhotopath2(); - this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3())?photoPath+appDeviceAdd.getPhotopath3():appDeviceAdd.getPhotopath3(); +// && this.installtime.getTime()>=DateUtil.parseDate("2023-04-01").getTime() + if (StringUtils.isNotEmpty(photoPath) ) { + this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1()) ? photoPath + appDeviceAdd.getPhotopath1() : appDeviceAdd.getPhotopath1(); + this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2()) ? photoPath + appDeviceAdd.getPhotopath2() : appDeviceAdd.getPhotopath2(); + this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3()) ? photoPath + appDeviceAdd.getPhotopath3() : appDeviceAdd.getPhotopath3(); + } this.project = appDeviceAdd.getProject(); this.position = appDeviceAdd.getPosition(); this.description = appDeviceAdd.getDescription(); diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java new file mode 100644 index 0000000..a8701e5 --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.app.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cz + */ +@Data +@TableName("batch_export_log") +public class BatchExportLog extends Model { + + private static final long serialVersionUID = 1L; + + @TableId("id") + private Long id; + @TableField("file_name") + private String fileName; + @TableField("file_dir") + private String fileDir; + @TableField("partition_number") + private String partitionNumber; + @TableField("create_time") + private String createTime; + @TableField("create_user_id") + private Long createUserId; + @TableField("task_id") + private int taskId; + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java index 96bd6fb..a8921c5 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java @@ -1,16 +1,19 @@ package com.casic.missiles.modular.app.service; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; +import java.util.Map; /** *

- * 服务类 + * 服务类 *

* * @author stylefeng123 @@ -18,13 +21,33 @@ */ public interface IAppDeviceAddService extends IService { - List getAppDevice(String devcode); + List getAppDevice(String devcode); + String saveFile(MultipartFile var1) throws IOException; - String fileUploadMarker(MultipartFile var1,String text) throws IOException; + + String fileUploadMarker(MultipartFile var1, String text) throws IOException; + String findModeCodeByCode(String devcode); + List reportExport(String devcode, String devtype, String begTime, String endTime, String project, String installPerson); + void convert84(); - void exportUsersToExcel(List list, HttpServletResponse response); + + void exportImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId); + + void exportNotImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson,HttpServletResponse response); + + void batchDownloadFiles(String recentDir,HttpServletResponse response); + + Integer getStartTask(); + + Page batchLogs(String begTime, String endTime, Page page); } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java index 69f2254..7c2865f 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java @@ -2,32 +2,41 @@ import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dao.AppDeviceAddMapper; +import com.casic.missiles.modular.app.dao.BatchExportLogMapper; import com.casic.missiles.modular.app.dto.AppDevicAddDTO; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; -import com.casic.missiles.modular.app.util.LonlatConver; -import com.casic.missiles.modular.app.util.PhotoUtils; +import com.casic.missiles.modular.app.util.*; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.ListUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.management.Query; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.awt.*; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.*; import java.util.List; -import java.util.UUID; +import java.util.concurrent.*; /** *

@@ -38,12 +47,21 @@ * @since 2020-05-24 */ @Service +@Slf4j public class AppDeviceAddServiceImpl extends ServiceImpl implements IAppDeviceAddService { + @Value("${casic.file-upload-path}") private String filePath; @Value("${casic.photoPath}") private String photoPath; + @Value("${casic.batchNumber}") + private Integer batchNumber; + @Autowired + private BatchExportLogMapper batchExportLogMapper; + @Autowired + private WebSocket webSocket; + @Override public List getAppDevice(String devcode) { @@ -127,7 +145,6 @@ EntityWrapper query = new EntityWrapper<>(); query.le("id", 5241); List appDeviceAddList = selectList(query); - for (AppDeviceAdd appDeviceAdd : appDeviceAddList) { if (ToolUtil.isNotEmpty(appDeviceAdd.getLongitude()) && ToolUtil.isNotEmpty(appDeviceAdd.getLatitude())) { @@ -141,12 +158,115 @@ } + @Override + public void exportImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); + Long stampeDir = System.currentTimeMillis(); + //以当前时间戳为目录 + String currentStampDir = filePath + stampeDir + File.separator; + setLocalFileDir(currentStampDir); + List batchExportLogsList = new ArrayList<>(); + try { + setStartTask(); + ExecutorService executor = Executors.newFixedThreadPool(10); + for (int appDeviceAddsIndex = 0; appDeviceAddsIndex < appDeviceAdds.size(); appDeviceAddsIndex += batchNumber) { + int postIndex = getBatchNumberPostIndex(appDeviceAdds, appDeviceAddsIndex); + List appDeviceBatchList = appDeviceAdds.subList(appDeviceAddsIndex, postIndex); + String partitionNumber = appDeviceAddsIndex + "-" + postIndex; + String fileName = "设备安装基础信息表" + partitionNumber + ".xls"; + String currentFileName = currentStampDir + fileName; + Runnable task = new Runnable() { + @Override + public void run() { + ExportExcelUtil exportExcelUtil = new ExportExcelUtil(); + exportExcelUtil.fileExport(appDeviceBatchList, currentFileName, photoPath); + } + }; + executor.submit(task); + batchExportLogsList.add(createBatchFileLogs(currentUserId, partitionNumber, fileName, String.valueOf(stampeDir))); + } + while (true) { + Long activeCount = ((ThreadPoolExecutor) executor).getTaskCount() - ((ThreadPoolExecutor) executor).getCompletedTaskCount(); + if (activeCount == 0) { + //删除所有的文件日志 + this.batchExportLogMapper.delete(null); + //删除所有历史文件 + deleteFile(new File(filePath),String.valueOf(stampeDir)); + //批量导入日志 + batchExportLogsList.stream().forEach( + batchExportLog -> this.batchExportLogMapper.insert(batchExportLog) + ); + System.out.println("所有的子线程都结束了!"); + List userList = new ArrayList<>(); + userList.add(String.valueOf(currentUserId)); + Map map = new HashMap(); + map.put("message", "你在" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(stampeDir)) + "的文件导出已经生成了,请到导出列表页面查看"); + map.put("type", "alarm"); + for (int i = 0; i < 3; i++) { + webSocket.sendListMessage(userList, JSON.toJSONString(map)); + Thread.sleep(3000); + } + break; + } + Thread.sleep(5000); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + /** + * 对导出产生的日志、进行清除,还原空间 + */ + private void deleteFile(File invalidFile,String currentFileStr) { + //为当前文件目录删除 + if(invalidFile.getAbsoluteFile().getName().equals(currentFileStr)){ + return; + } + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + if (!invalidFile.getAbsolutePath().equals(filePath.substring(0,filePath.length()-1))) { + //删除子文件 + files[i].delete(); + } + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i],currentFileStr); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + if (!invalidFile.getAbsolutePath().equals(filePath)) { + //删除子目录 + if (invalidFile != null && invalidFile.isDirectory()) { + invalidFile.delete(); + } + } + } @Override - public void exportUsersToExcel(List list,HttpServletResponse response) { - + public void exportNotImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); try { - //设置信息头,告诉浏览器内容为excel类型 response.setHeader("content-Type", "application/vnd.ms-excel"); //设置下载名称 @@ -160,16 +280,137 @@ params.setSheetName("设备安装信息"); //设置标题 params.setTitle("设备安装信息"); - //转成对应的类型;要不然会报错,虽然也可以导出成功 - List AppDevicAddDTOs = AppDevicAddDTO.convert(list,photoPath); - + List AppDeviceAddDTOs = AppDevicAddDTO.convert(appDeviceAdds, null); //导入excel - Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDevicAddDTOs); + Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDeviceAddDTOs); //写入 workbook.write(out); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception ex) { + ex.printStackTrace(); } } + + + @Override + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + FileInputStream is = null; + BufferedOutputStream out = null; + String zipPath = ""; + try { + response.reset(); + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/zip;charset=utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("设备安装基础信息表.zip", StandardCharsets.UTF_8.name())); + response.setHeader("Access-Control-Allow-Origin", "*"); + System.out.println(response.getHeader("Content-Disposition")); + ZipUtils zipUtils = new ZipUtils(); + zipPath = zipUtils.zipFileCreator(filePath, recentDir); + //开始下载 + is = new FileInputStream(new File(zipPath)); + out = new BufferedOutputStream(response.getOutputStream()); + byte[] buff = new byte[1024]; + int len = 0; + while ((len = is.read(buff, 0, buff.length)) != -1) { + out.write(buff, 0, len); + } + out.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + try { + out.close(); + if (StringUtils.isNotEmpty(zipPath)) { + new ZipUtils().zipFileDeletor(zipPath); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + + @Override + public Page batchLogs(String begTime, String endTime, Page page) { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.le(StringUtils.isNotEmpty(begTime), "create_time", begTime) + .or().ge(StringUtils.isNotEmpty(endTime), "create_time", endTime); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")); + List batchExportLogs = this.batchExportLogMapper.selectPage(page, batchEntityWrapper); + page.setRecords(batchExportLogs); + return page; + } + + + private BatchExportLog createBatchFileLogs(Long currentUserId, String partitionNumber, String fileName, String fileDir) { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setPartitionNumber(partitionNumber); + batchExportLog.setCreateUserId(currentUserId); + batchExportLog.setFileDir(fileDir + File.separator); + batchExportLog.setTaskId(0); + batchExportLog.setFileName(fileName); + return batchExportLog; + } + + @Override + public Integer getStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.where("create_time>date_add(now(), interval -1 hour) "); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + return optionalBatchExportLog.isPresent() ? optionalBatchExportLog.get().getTaskId() : null; + } + + private void setStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + if (optionalBatchExportLog.isPresent()) { + optionalBatchExportLog.get().setTaskId(1); + this.batchExportLogMapper.updateById(optionalBatchExportLog.get()); + } else { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setTaskId(1); + this.batchExportLogMapper.insert(batchExportLog); + } + } + + /** + * 获取分批次要导出的目录列表 + * + * @return + */ + private int getBatchNumberPostIndex(List appDeviceAdds, int appDeviceAddsIndex) { + int postIndex = 0; + if (appDeviceAddsIndex + batchNumber > appDeviceAdds.size()) { + postIndex = appDeviceAdds.size(); + } else { + postIndex = appDeviceAddsIndex + batchNumber; + } + return postIndex; + } + + /** + * 创建文件目录 + */ + private void setLocalFileDir(String tempLocalFileDir) { + File file = new File(tempLocalFileDir); + if (!file.exists()) { + file.mkdirs(); + } + } + } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java new file mode 100644 index 0000000..cf9307c --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java @@ -0,0 +1,47 @@ +package com.casic.missiles.modular.app.util; + +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.casic.missiles.modular.app.dto.AppDevicAddDTO; +import com.casic.missiles.modular.app.model.AppDeviceAdd; +import org.apache.poi.ss.usermodel.Workbook; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +public class ExportExcelUtil { + /** + * 导出文件主要内容 + */ + public void fileExport(List appDeviceBatchList, String currentFileName,String photoPath) { + FileOutputStream fileOutputStream = null; + try { + fileOutputStream = new FileOutputStream(currentFileName); + //设置excel参数 + ExportParams params = new ExportParams(); + //设置sheet名名称 + params.setSheetName("设备安装信息"); + //设置标题 + params.setTitle("设备安装信息"); + //转成对应的类型;要不然会报错,虽然也可以导出成功 + List AppDeviceAddDTOs = AppDevicAddDTO.convert(appDeviceBatchList, photoPath); + //导入excel + Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDeviceAddDTOs); + workbook.write(fileOutputStream); + fileOutputStream.flush(); + } catch (Exception e) { + + } finally { + if (fileOutputStream != null) { + try { + fileOutputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java new file mode 100644 index 0000000..50f24dc --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java @@ -0,0 +1,101 @@ +package com.casic.missiles.modular.app.util; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets =new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value="userId")String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId+"【websocket消息】有新的连接,总数为:"+webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:"+webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:"+message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for(WebSocket webSocket : webSockets) { + System.out.println("【websocket消息】广播消息:"+message); + try { + webSocket.session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + // 发送列表消息 + public void sendListMessage(List userIds, String message){ + System.out.println("【websocket消息】列表消息:"+message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 发送列表消息 + +// public void sendListMessage(List userIds, Object data){ +// System.out.println("【websocket消息】列表消息:"+data); +// for (String userId : userIds) { +// Session session = sessionPool.get(userId); +// if (session != null) { +// try { +//// session.getAsyncRemote().sendText(message); +// session.getAsyncRemote().sendObject(data); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:"+message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java new file mode 100644 index 0000000..ea267bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java @@ -0,0 +1,84 @@ +package com.casic.missiles.modular.app.util; + + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * @author zhouxuan + * @since 2019/4/19 + */ +public class ZipUtils { + + /** + * 批量打包 + * + * @param downloadPath 项目根目录 + * @return tempDir 文件保存绝对路径 + */ + public String zipFileCreator(String downloadPath,String tempDir) { + ZipOutputStream out = null; + try { + //生成打包下载后的zip文件:Papers.zip + String papersZipName = "设备安装基础信息表.zip"; + //zip文件保存路径 + String zipPath = downloadPath + papersZipName; + String fileSaveRootPath=downloadPath+File.separator+tempDir; + File file = new File(fileSaveRootPath); + File[] files = file.listFiles(); + out = new ZipOutputStream(new FileOutputStream(zipPath)); + //遍历jsonArray列表获取所有JSONObject对象 + for (int i = 0; i < files.length; i++) { + //以论文标题为每个文件命名 + FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); + out.putNextEntry(new ZipEntry(files[i].getName())); + //写入压缩包 + int len; + byte[] buffer = new byte[1024]; + while ((len = fis.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + out.closeEntry(); + fis.close(); + } + out.close(); + out.flush(); + return zipPath; + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + + /** + * 批量打包 + * + * @param zipPath zip路径 + * @return zip文件保存绝对路径 + */ + public void zipFileDeletor(String zipPath) { + try { + File zipFile=new File(zipPath); + zipFile.delete(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java index 59b2097..5ab81c7 100644 --- a/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java +++ b/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -10,9 +10,12 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletResponse; +import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; /** * 控制器 @@ -31,41 +34,56 @@ * 文件模板下载 */ @GetMapping("/template/download") - public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) - throws ServletException, IOException { + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) throws IOException { logger.info(downloadPath); - if (downloadPath.startsWith("/")) { - downloadPath = downloadPath.substring(1); + String tempDownloadPath=downloadPath; + if (tempDownloadPath.startsWith("/")) { + tempDownloadPath = tempDownloadPath.substring(1); } - File file = new File(downloadPath, filename); + + File file = new File(tempDownloadPath, filename); // 获取文件名 String fileName = null; - if (filename.contains("/")) { - fileName = filename.substring(filename.lastIndexOf("/") + 1); + if (filename.contains(File.separator)) { + fileName = filename.substring(filename.lastIndexOf(File.separator) + 1); } else { fileName = filename; } // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 response.setContentType("application/octet-stream"); - response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setCharacterEncoding("UTF-8"); + response.addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, StandardCharsets.UTF_8.name())); response.setContentLength((int) file.length()); - + BufferedOutputStream out = null; FileInputStream fis = null; try { + out = new BufferedOutputStream(response.getOutputStream()); fis = new FileInputStream(file); byte[] buffer = new byte[1024]; int readTmp = 0; while ((readTmp = fis.read(buffer)) != -1) { - response.getOutputStream().write(buffer, 0, readTmp); + out.write(buffer, 0, readTmp); } + out.flush(); } catch (Exception e) { logger.info(e.getMessage()); e.printStackTrace(); } finally { - response.getOutputStream().flush(); - response.getOutputStream().close(); - fis.close(); + if (out != null) { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } } } } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java new file mode 100644 index 0000000..e9f04bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.app.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java index 1fe427f..cbfaa4d 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java @@ -11,15 +11,17 @@ import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dto.SelectDTO; -import com.casic.missiles.modular.app.enums.DeviceBaseExportEnum; import com.casic.missiles.modular.app.model.AppDeviceAdd; import com.casic.missiles.modular.app.model.AppDeviceLog; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; import com.casic.missiles.modular.app.service.IAppDeviceLogService; import com.casic.missiles.modular.app.util.LonlatConver; import com.casic.missiles.modular.system.model.Dict; import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @@ -30,8 +32,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; import java.util.stream.Collectors; /** @@ -54,6 +55,9 @@ @Resource private ICommonPermissionService permissionService; + @Value("${casic.photoPath}") + private String photoPath; + /** * 获取施工添加设备列表 */ @@ -164,7 +168,6 @@ // @ResponseBody // public Object imageBase64Upload(@RequestBody(required =false) String fileBase64) throws IOException { // return ResponseData.success(commonFileService.saveFileBase64Image(fileBase64)); -// // } @RequestMapping({"/getWellTypeList"}) @@ -240,32 +243,49 @@ //照片一起导出 - @RequestMapping(value = "/listExp") - public void listExps(String devcode, String devtype, - String begTime, String endTime, - String project, String installPerson, - HttpServletResponse response) throws IOException { + @RequestMapping(value = "/image/listExp") + @ResponseBody + public Object listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson) { + List dictList = permissionService.findInDictByCode("sluicewellType"); - List list = appDeviceAddService.reportExport(devcode, devtype, - begTime, endTime, project, installPerson); + Map sluiceWellDictMap = dictList.stream() + .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); + Integer taskId = appDeviceAddService.getStartTask(); + if (null == taskId || taskId != 1) { + Long currentUserId = permissionService.getCurrLoginUser().getId(); + ExecutorService executor = Executors.newFixedThreadPool(1); + executor.execute(() -> appDeviceAddService.exportImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, currentUserId)); + return ResponseData.success("执行成功,请稍等..."); + } else { + return ResponseData.error("有任务正在执行,请稍等!"); + } + } + + + @RequestMapping(value = "/listExp") + @ResponseBody + public void listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { List dictList = permissionService.findInDictByCode("sluicewellType"); Map sluiceWellDictMap = dictList.stream() .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); - list.forEach(appDeviceAdd -> { - appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); - }); - ExecutorService cachedExecutorService = Executors.newCachedThreadPool(); - cachedExecutorService.execute(new Runnable() { - @Override - public void run() { - appDeviceAddService.exportUsersToExcel(list, response); - } - }); -// List res = new ArrayList<>(); -// res.addAll(list); -// //获取导出文件header -// super.exportExcel(DeviceBaseExportEnum.DeviceBase_EXPORT, res); + appDeviceAddService.exportNotImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, response); } + @RequestMapping(value = "/batch/logs") + @ResponseBody + public Object batchLogs(String begTime, String endTime) { + Page page = new PageFactory().defaultPage(); + return ResponseData.success(super.packForBT(appDeviceAddService.batchLogs(begTime, endTime, page))); + } + + @CrossOrigin + @RequestMapping(value = "/batchzip") + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + appDeviceAddService.batchDownloadFiles(recentDir, response); + } } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java new file mode 100644 index 0000000..b741f4e --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.modular.app.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.app.model.BatchExportLog; + +public interface BatchExportLogMapper extends BaseMapper { + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java index 6ed5d35..9acca94 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java @@ -1,11 +1,11 @@ package com.casic.missiles.modular.app.dto; import cn.afterturn.easypoi.excel.annotation.Excel; +import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.model.AppDeviceAdd; import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; +import org.apache.commons.lang3.StringUtils; import java.io.Serializable; import java.util.ArrayList; @@ -33,7 +33,7 @@ private String installheigt; @Excel(name = "负责人", width = 10.0) private String installperson; - @Excel(name = "安装时间", format = "yyyy-MM-dd",width = 10.0) + @Excel(name = "安装时间", format = "yyyy-MM-dd", width = 10.0) private Date installtime; @Excel(name = "照片1", type = 2, width = 20.0, height = 60.0, imageType = 1) private String photopath1; @@ -61,16 +61,16 @@ private String latitude84; - public static List convert (List appDeviceAdds,String photoPath) { + public static List convert(List appDeviceAdds, String photoPath) { List appDevicAddDTOS = new ArrayList<>(); appDeviceAdds.forEach(appDeviceAdd -> { - appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd,photoPath)); + appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd, photoPath)); }); return appDevicAddDTOS; } - public AppDevicAddDTO(AppDeviceAdd appDeviceAdd,String photoPath) { + public AppDevicAddDTO(AppDeviceAdd appDeviceAdd, String photoPath) { this.devcode = appDeviceAdd.getDevcode(); this.devicetype = appDeviceAdd.getDevicetype(); this.wellcode = appDeviceAdd.getWellcode(); @@ -80,9 +80,12 @@ this.installheigt = appDeviceAdd.getInstallheigt(); this.installperson = appDeviceAdd.getInstallperson(); this.installtime = appDeviceAdd.getInstalltime(); - this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1())?photoPath+appDeviceAdd.getPhotopath1():appDeviceAdd.getPhotopath1(); - this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2())?photoPath+appDeviceAdd.getPhotopath2():appDeviceAdd.getPhotopath2(); - this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3())?photoPath+appDeviceAdd.getPhotopath3():appDeviceAdd.getPhotopath3(); +// && this.installtime.getTime()>=DateUtil.parseDate("2023-04-01").getTime() + if (StringUtils.isNotEmpty(photoPath) ) { + this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1()) ? photoPath + appDeviceAdd.getPhotopath1() : appDeviceAdd.getPhotopath1(); + this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2()) ? photoPath + appDeviceAdd.getPhotopath2() : appDeviceAdd.getPhotopath2(); + this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3()) ? photoPath + appDeviceAdd.getPhotopath3() : appDeviceAdd.getPhotopath3(); + } this.project = appDeviceAdd.getProject(); this.position = appDeviceAdd.getPosition(); this.description = appDeviceAdd.getDescription(); diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java new file mode 100644 index 0000000..a8701e5 --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.app.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cz + */ +@Data +@TableName("batch_export_log") +public class BatchExportLog extends Model { + + private static final long serialVersionUID = 1L; + + @TableId("id") + private Long id; + @TableField("file_name") + private String fileName; + @TableField("file_dir") + private String fileDir; + @TableField("partition_number") + private String partitionNumber; + @TableField("create_time") + private String createTime; + @TableField("create_user_id") + private Long createUserId; + @TableField("task_id") + private int taskId; + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java index 96bd6fb..a8921c5 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java @@ -1,16 +1,19 @@ package com.casic.missiles.modular.app.service; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; +import java.util.Map; /** *

- * 服务类 + * 服务类 *

* * @author stylefeng123 @@ -18,13 +21,33 @@ */ public interface IAppDeviceAddService extends IService { - List getAppDevice(String devcode); + List getAppDevice(String devcode); + String saveFile(MultipartFile var1) throws IOException; - String fileUploadMarker(MultipartFile var1,String text) throws IOException; + + String fileUploadMarker(MultipartFile var1, String text) throws IOException; + String findModeCodeByCode(String devcode); + List reportExport(String devcode, String devtype, String begTime, String endTime, String project, String installPerson); + void convert84(); - void exportUsersToExcel(List list, HttpServletResponse response); + + void exportImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId); + + void exportNotImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson,HttpServletResponse response); + + void batchDownloadFiles(String recentDir,HttpServletResponse response); + + Integer getStartTask(); + + Page batchLogs(String begTime, String endTime, Page page); } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java index 69f2254..7c2865f 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java @@ -2,32 +2,41 @@ import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dao.AppDeviceAddMapper; +import com.casic.missiles.modular.app.dao.BatchExportLogMapper; import com.casic.missiles.modular.app.dto.AppDevicAddDTO; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; -import com.casic.missiles.modular.app.util.LonlatConver; -import com.casic.missiles.modular.app.util.PhotoUtils; +import com.casic.missiles.modular.app.util.*; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.ListUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.management.Query; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.awt.*; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.*; import java.util.List; -import java.util.UUID; +import java.util.concurrent.*; /** *

@@ -38,12 +47,21 @@ * @since 2020-05-24 */ @Service +@Slf4j public class AppDeviceAddServiceImpl extends ServiceImpl implements IAppDeviceAddService { + @Value("${casic.file-upload-path}") private String filePath; @Value("${casic.photoPath}") private String photoPath; + @Value("${casic.batchNumber}") + private Integer batchNumber; + @Autowired + private BatchExportLogMapper batchExportLogMapper; + @Autowired + private WebSocket webSocket; + @Override public List getAppDevice(String devcode) { @@ -127,7 +145,6 @@ EntityWrapper query = new EntityWrapper<>(); query.le("id", 5241); List appDeviceAddList = selectList(query); - for (AppDeviceAdd appDeviceAdd : appDeviceAddList) { if (ToolUtil.isNotEmpty(appDeviceAdd.getLongitude()) && ToolUtil.isNotEmpty(appDeviceAdd.getLatitude())) { @@ -141,12 +158,115 @@ } + @Override + public void exportImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); + Long stampeDir = System.currentTimeMillis(); + //以当前时间戳为目录 + String currentStampDir = filePath + stampeDir + File.separator; + setLocalFileDir(currentStampDir); + List batchExportLogsList = new ArrayList<>(); + try { + setStartTask(); + ExecutorService executor = Executors.newFixedThreadPool(10); + for (int appDeviceAddsIndex = 0; appDeviceAddsIndex < appDeviceAdds.size(); appDeviceAddsIndex += batchNumber) { + int postIndex = getBatchNumberPostIndex(appDeviceAdds, appDeviceAddsIndex); + List appDeviceBatchList = appDeviceAdds.subList(appDeviceAddsIndex, postIndex); + String partitionNumber = appDeviceAddsIndex + "-" + postIndex; + String fileName = "设备安装基础信息表" + partitionNumber + ".xls"; + String currentFileName = currentStampDir + fileName; + Runnable task = new Runnable() { + @Override + public void run() { + ExportExcelUtil exportExcelUtil = new ExportExcelUtil(); + exportExcelUtil.fileExport(appDeviceBatchList, currentFileName, photoPath); + } + }; + executor.submit(task); + batchExportLogsList.add(createBatchFileLogs(currentUserId, partitionNumber, fileName, String.valueOf(stampeDir))); + } + while (true) { + Long activeCount = ((ThreadPoolExecutor) executor).getTaskCount() - ((ThreadPoolExecutor) executor).getCompletedTaskCount(); + if (activeCount == 0) { + //删除所有的文件日志 + this.batchExportLogMapper.delete(null); + //删除所有历史文件 + deleteFile(new File(filePath),String.valueOf(stampeDir)); + //批量导入日志 + batchExportLogsList.stream().forEach( + batchExportLog -> this.batchExportLogMapper.insert(batchExportLog) + ); + System.out.println("所有的子线程都结束了!"); + List userList = new ArrayList<>(); + userList.add(String.valueOf(currentUserId)); + Map map = new HashMap(); + map.put("message", "你在" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(stampeDir)) + "的文件导出已经生成了,请到导出列表页面查看"); + map.put("type", "alarm"); + for (int i = 0; i < 3; i++) { + webSocket.sendListMessage(userList, JSON.toJSONString(map)); + Thread.sleep(3000); + } + break; + } + Thread.sleep(5000); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + /** + * 对导出产生的日志、进行清除,还原空间 + */ + private void deleteFile(File invalidFile,String currentFileStr) { + //为当前文件目录删除 + if(invalidFile.getAbsoluteFile().getName().equals(currentFileStr)){ + return; + } + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + if (!invalidFile.getAbsolutePath().equals(filePath.substring(0,filePath.length()-1))) { + //删除子文件 + files[i].delete(); + } + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i],currentFileStr); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + if (!invalidFile.getAbsolutePath().equals(filePath)) { + //删除子目录 + if (invalidFile != null && invalidFile.isDirectory()) { + invalidFile.delete(); + } + } + } @Override - public void exportUsersToExcel(List list,HttpServletResponse response) { - + public void exportNotImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); try { - //设置信息头,告诉浏览器内容为excel类型 response.setHeader("content-Type", "application/vnd.ms-excel"); //设置下载名称 @@ -160,16 +280,137 @@ params.setSheetName("设备安装信息"); //设置标题 params.setTitle("设备安装信息"); - //转成对应的类型;要不然会报错,虽然也可以导出成功 - List AppDevicAddDTOs = AppDevicAddDTO.convert(list,photoPath); - + List AppDeviceAddDTOs = AppDevicAddDTO.convert(appDeviceAdds, null); //导入excel - Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDevicAddDTOs); + Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDeviceAddDTOs); //写入 workbook.write(out); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception ex) { + ex.printStackTrace(); } } + + + @Override + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + FileInputStream is = null; + BufferedOutputStream out = null; + String zipPath = ""; + try { + response.reset(); + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/zip;charset=utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("设备安装基础信息表.zip", StandardCharsets.UTF_8.name())); + response.setHeader("Access-Control-Allow-Origin", "*"); + System.out.println(response.getHeader("Content-Disposition")); + ZipUtils zipUtils = new ZipUtils(); + zipPath = zipUtils.zipFileCreator(filePath, recentDir); + //开始下载 + is = new FileInputStream(new File(zipPath)); + out = new BufferedOutputStream(response.getOutputStream()); + byte[] buff = new byte[1024]; + int len = 0; + while ((len = is.read(buff, 0, buff.length)) != -1) { + out.write(buff, 0, len); + } + out.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + try { + out.close(); + if (StringUtils.isNotEmpty(zipPath)) { + new ZipUtils().zipFileDeletor(zipPath); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + + @Override + public Page batchLogs(String begTime, String endTime, Page page) { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.le(StringUtils.isNotEmpty(begTime), "create_time", begTime) + .or().ge(StringUtils.isNotEmpty(endTime), "create_time", endTime); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")); + List batchExportLogs = this.batchExportLogMapper.selectPage(page, batchEntityWrapper); + page.setRecords(batchExportLogs); + return page; + } + + + private BatchExportLog createBatchFileLogs(Long currentUserId, String partitionNumber, String fileName, String fileDir) { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setPartitionNumber(partitionNumber); + batchExportLog.setCreateUserId(currentUserId); + batchExportLog.setFileDir(fileDir + File.separator); + batchExportLog.setTaskId(0); + batchExportLog.setFileName(fileName); + return batchExportLog; + } + + @Override + public Integer getStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.where("create_time>date_add(now(), interval -1 hour) "); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + return optionalBatchExportLog.isPresent() ? optionalBatchExportLog.get().getTaskId() : null; + } + + private void setStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + if (optionalBatchExportLog.isPresent()) { + optionalBatchExportLog.get().setTaskId(1); + this.batchExportLogMapper.updateById(optionalBatchExportLog.get()); + } else { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setTaskId(1); + this.batchExportLogMapper.insert(batchExportLog); + } + } + + /** + * 获取分批次要导出的目录列表 + * + * @return + */ + private int getBatchNumberPostIndex(List appDeviceAdds, int appDeviceAddsIndex) { + int postIndex = 0; + if (appDeviceAddsIndex + batchNumber > appDeviceAdds.size()) { + postIndex = appDeviceAdds.size(); + } else { + postIndex = appDeviceAddsIndex + batchNumber; + } + return postIndex; + } + + /** + * 创建文件目录 + */ + private void setLocalFileDir(String tempLocalFileDir) { + File file = new File(tempLocalFileDir); + if (!file.exists()) { + file.mkdirs(); + } + } + } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java new file mode 100644 index 0000000..cf9307c --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java @@ -0,0 +1,47 @@ +package com.casic.missiles.modular.app.util; + +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.casic.missiles.modular.app.dto.AppDevicAddDTO; +import com.casic.missiles.modular.app.model.AppDeviceAdd; +import org.apache.poi.ss.usermodel.Workbook; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +public class ExportExcelUtil { + /** + * 导出文件主要内容 + */ + public void fileExport(List appDeviceBatchList, String currentFileName,String photoPath) { + FileOutputStream fileOutputStream = null; + try { + fileOutputStream = new FileOutputStream(currentFileName); + //设置excel参数 + ExportParams params = new ExportParams(); + //设置sheet名名称 + params.setSheetName("设备安装信息"); + //设置标题 + params.setTitle("设备安装信息"); + //转成对应的类型;要不然会报错,虽然也可以导出成功 + List AppDeviceAddDTOs = AppDevicAddDTO.convert(appDeviceBatchList, photoPath); + //导入excel + Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDeviceAddDTOs); + workbook.write(fileOutputStream); + fileOutputStream.flush(); + } catch (Exception e) { + + } finally { + if (fileOutputStream != null) { + try { + fileOutputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java new file mode 100644 index 0000000..50f24dc --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java @@ -0,0 +1,101 @@ +package com.casic.missiles.modular.app.util; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets =new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value="userId")String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId+"【websocket消息】有新的连接,总数为:"+webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:"+webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:"+message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for(WebSocket webSocket : webSockets) { + System.out.println("【websocket消息】广播消息:"+message); + try { + webSocket.session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + // 发送列表消息 + public void sendListMessage(List userIds, String message){ + System.out.println("【websocket消息】列表消息:"+message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 发送列表消息 + +// public void sendListMessage(List userIds, Object data){ +// System.out.println("【websocket消息】列表消息:"+data); +// for (String userId : userIds) { +// Session session = sessionPool.get(userId); +// if (session != null) { +// try { +//// session.getAsyncRemote().sendText(message); +// session.getAsyncRemote().sendObject(data); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:"+message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java new file mode 100644 index 0000000..ea267bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java @@ -0,0 +1,84 @@ +package com.casic.missiles.modular.app.util; + + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * @author zhouxuan + * @since 2019/4/19 + */ +public class ZipUtils { + + /** + * 批量打包 + * + * @param downloadPath 项目根目录 + * @return tempDir 文件保存绝对路径 + */ + public String zipFileCreator(String downloadPath,String tempDir) { + ZipOutputStream out = null; + try { + //生成打包下载后的zip文件:Papers.zip + String papersZipName = "设备安装基础信息表.zip"; + //zip文件保存路径 + String zipPath = downloadPath + papersZipName; + String fileSaveRootPath=downloadPath+File.separator+tempDir; + File file = new File(fileSaveRootPath); + File[] files = file.listFiles(); + out = new ZipOutputStream(new FileOutputStream(zipPath)); + //遍历jsonArray列表获取所有JSONObject对象 + for (int i = 0; i < files.length; i++) { + //以论文标题为每个文件命名 + FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); + out.putNextEntry(new ZipEntry(files[i].getName())); + //写入压缩包 + int len; + byte[] buffer = new byte[1024]; + while ((len = fis.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + out.closeEntry(); + fis.close(); + } + out.close(); + out.flush(); + return zipPath; + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + + /** + * 批量打包 + * + * @param zipPath zip路径 + * @return zip文件保存绝对路径 + */ + public void zipFileDeletor(String zipPath) { + try { + File zipFile=new File(zipPath); + zipFile.delete(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java index 59b2097..5ab81c7 100644 --- a/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java +++ b/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -10,9 +10,12 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletResponse; +import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; /** * 控制器 @@ -31,41 +34,56 @@ * 文件模板下载 */ @GetMapping("/template/download") - public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) - throws ServletException, IOException { + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) throws IOException { logger.info(downloadPath); - if (downloadPath.startsWith("/")) { - downloadPath = downloadPath.substring(1); + String tempDownloadPath=downloadPath; + if (tempDownloadPath.startsWith("/")) { + tempDownloadPath = tempDownloadPath.substring(1); } - File file = new File(downloadPath, filename); + + File file = new File(tempDownloadPath, filename); // 获取文件名 String fileName = null; - if (filename.contains("/")) { - fileName = filename.substring(filename.lastIndexOf("/") + 1); + if (filename.contains(File.separator)) { + fileName = filename.substring(filename.lastIndexOf(File.separator) + 1); } else { fileName = filename; } // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 response.setContentType("application/octet-stream"); - response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setCharacterEncoding("UTF-8"); + response.addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, StandardCharsets.UTF_8.name())); response.setContentLength((int) file.length()); - + BufferedOutputStream out = null; FileInputStream fis = null; try { + out = new BufferedOutputStream(response.getOutputStream()); fis = new FileInputStream(file); byte[] buffer = new byte[1024]; int readTmp = 0; while ((readTmp = fis.read(buffer)) != -1) { - response.getOutputStream().write(buffer, 0, readTmp); + out.write(buffer, 0, readTmp); } + out.flush(); } catch (Exception e) { logger.info(e.getMessage()); e.printStackTrace(); } finally { - response.getOutputStream().flush(); - response.getOutputStream().close(); - fis.close(); + if (out != null) { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } } } } diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 0faf332..9b9943a 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -288,10 +288,13 @@ - src/main/webapp - - src/main/resources + + + /config/*/* + /config/*-*.yml + + true src/main/java diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java new file mode 100644 index 0000000..e9f04bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.app.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java index 1fe427f..cbfaa4d 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java @@ -11,15 +11,17 @@ import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dto.SelectDTO; -import com.casic.missiles.modular.app.enums.DeviceBaseExportEnum; import com.casic.missiles.modular.app.model.AppDeviceAdd; import com.casic.missiles.modular.app.model.AppDeviceLog; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; import com.casic.missiles.modular.app.service.IAppDeviceLogService; import com.casic.missiles.modular.app.util.LonlatConver; import com.casic.missiles.modular.system.model.Dict; import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @@ -30,8 +32,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; import java.util.stream.Collectors; /** @@ -54,6 +55,9 @@ @Resource private ICommonPermissionService permissionService; + @Value("${casic.photoPath}") + private String photoPath; + /** * 获取施工添加设备列表 */ @@ -164,7 +168,6 @@ // @ResponseBody // public Object imageBase64Upload(@RequestBody(required =false) String fileBase64) throws IOException { // return ResponseData.success(commonFileService.saveFileBase64Image(fileBase64)); -// // } @RequestMapping({"/getWellTypeList"}) @@ -240,32 +243,49 @@ //照片一起导出 - @RequestMapping(value = "/listExp") - public void listExps(String devcode, String devtype, - String begTime, String endTime, - String project, String installPerson, - HttpServletResponse response) throws IOException { + @RequestMapping(value = "/image/listExp") + @ResponseBody + public Object listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson) { + List dictList = permissionService.findInDictByCode("sluicewellType"); - List list = appDeviceAddService.reportExport(devcode, devtype, - begTime, endTime, project, installPerson); + Map sluiceWellDictMap = dictList.stream() + .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); + Integer taskId = appDeviceAddService.getStartTask(); + if (null == taskId || taskId != 1) { + Long currentUserId = permissionService.getCurrLoginUser().getId(); + ExecutorService executor = Executors.newFixedThreadPool(1); + executor.execute(() -> appDeviceAddService.exportImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, currentUserId)); + return ResponseData.success("执行成功,请稍等..."); + } else { + return ResponseData.error("有任务正在执行,请稍等!"); + } + } + + + @RequestMapping(value = "/listExp") + @ResponseBody + public void listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { List dictList = permissionService.findInDictByCode("sluicewellType"); Map sluiceWellDictMap = dictList.stream() .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); - list.forEach(appDeviceAdd -> { - appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); - }); - ExecutorService cachedExecutorService = Executors.newCachedThreadPool(); - cachedExecutorService.execute(new Runnable() { - @Override - public void run() { - appDeviceAddService.exportUsersToExcel(list, response); - } - }); -// List res = new ArrayList<>(); -// res.addAll(list); -// //获取导出文件header -// super.exportExcel(DeviceBaseExportEnum.DeviceBase_EXPORT, res); + appDeviceAddService.exportNotImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, response); } + @RequestMapping(value = "/batch/logs") + @ResponseBody + public Object batchLogs(String begTime, String endTime) { + Page page = new PageFactory().defaultPage(); + return ResponseData.success(super.packForBT(appDeviceAddService.batchLogs(begTime, endTime, page))); + } + + @CrossOrigin + @RequestMapping(value = "/batchzip") + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + appDeviceAddService.batchDownloadFiles(recentDir, response); + } } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java new file mode 100644 index 0000000..b741f4e --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.modular.app.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.app.model.BatchExportLog; + +public interface BatchExportLogMapper extends BaseMapper { + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java index 6ed5d35..9acca94 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java @@ -1,11 +1,11 @@ package com.casic.missiles.modular.app.dto; import cn.afterturn.easypoi.excel.annotation.Excel; +import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.model.AppDeviceAdd; import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; +import org.apache.commons.lang3.StringUtils; import java.io.Serializable; import java.util.ArrayList; @@ -33,7 +33,7 @@ private String installheigt; @Excel(name = "负责人", width = 10.0) private String installperson; - @Excel(name = "安装时间", format = "yyyy-MM-dd",width = 10.0) + @Excel(name = "安装时间", format = "yyyy-MM-dd", width = 10.0) private Date installtime; @Excel(name = "照片1", type = 2, width = 20.0, height = 60.0, imageType = 1) private String photopath1; @@ -61,16 +61,16 @@ private String latitude84; - public static List convert (List appDeviceAdds,String photoPath) { + public static List convert(List appDeviceAdds, String photoPath) { List appDevicAddDTOS = new ArrayList<>(); appDeviceAdds.forEach(appDeviceAdd -> { - appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd,photoPath)); + appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd, photoPath)); }); return appDevicAddDTOS; } - public AppDevicAddDTO(AppDeviceAdd appDeviceAdd,String photoPath) { + public AppDevicAddDTO(AppDeviceAdd appDeviceAdd, String photoPath) { this.devcode = appDeviceAdd.getDevcode(); this.devicetype = appDeviceAdd.getDevicetype(); this.wellcode = appDeviceAdd.getWellcode(); @@ -80,9 +80,12 @@ this.installheigt = appDeviceAdd.getInstallheigt(); this.installperson = appDeviceAdd.getInstallperson(); this.installtime = appDeviceAdd.getInstalltime(); - this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1())?photoPath+appDeviceAdd.getPhotopath1():appDeviceAdd.getPhotopath1(); - this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2())?photoPath+appDeviceAdd.getPhotopath2():appDeviceAdd.getPhotopath2(); - this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3())?photoPath+appDeviceAdd.getPhotopath3():appDeviceAdd.getPhotopath3(); +// && this.installtime.getTime()>=DateUtil.parseDate("2023-04-01").getTime() + if (StringUtils.isNotEmpty(photoPath) ) { + this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1()) ? photoPath + appDeviceAdd.getPhotopath1() : appDeviceAdd.getPhotopath1(); + this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2()) ? photoPath + appDeviceAdd.getPhotopath2() : appDeviceAdd.getPhotopath2(); + this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3()) ? photoPath + appDeviceAdd.getPhotopath3() : appDeviceAdd.getPhotopath3(); + } this.project = appDeviceAdd.getProject(); this.position = appDeviceAdd.getPosition(); this.description = appDeviceAdd.getDescription(); diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java new file mode 100644 index 0000000..a8701e5 --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.app.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cz + */ +@Data +@TableName("batch_export_log") +public class BatchExportLog extends Model { + + private static final long serialVersionUID = 1L; + + @TableId("id") + private Long id; + @TableField("file_name") + private String fileName; + @TableField("file_dir") + private String fileDir; + @TableField("partition_number") + private String partitionNumber; + @TableField("create_time") + private String createTime; + @TableField("create_user_id") + private Long createUserId; + @TableField("task_id") + private int taskId; + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java index 96bd6fb..a8921c5 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java @@ -1,16 +1,19 @@ package com.casic.missiles.modular.app.service; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; +import java.util.Map; /** *

- * 服务类 + * 服务类 *

* * @author stylefeng123 @@ -18,13 +21,33 @@ */ public interface IAppDeviceAddService extends IService { - List getAppDevice(String devcode); + List getAppDevice(String devcode); + String saveFile(MultipartFile var1) throws IOException; - String fileUploadMarker(MultipartFile var1,String text) throws IOException; + + String fileUploadMarker(MultipartFile var1, String text) throws IOException; + String findModeCodeByCode(String devcode); + List reportExport(String devcode, String devtype, String begTime, String endTime, String project, String installPerson); + void convert84(); - void exportUsersToExcel(List list, HttpServletResponse response); + + void exportImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId); + + void exportNotImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson,HttpServletResponse response); + + void batchDownloadFiles(String recentDir,HttpServletResponse response); + + Integer getStartTask(); + + Page batchLogs(String begTime, String endTime, Page page); } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java index 69f2254..7c2865f 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java @@ -2,32 +2,41 @@ import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dao.AppDeviceAddMapper; +import com.casic.missiles.modular.app.dao.BatchExportLogMapper; import com.casic.missiles.modular.app.dto.AppDevicAddDTO; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; -import com.casic.missiles.modular.app.util.LonlatConver; -import com.casic.missiles.modular.app.util.PhotoUtils; +import com.casic.missiles.modular.app.util.*; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.ListUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.management.Query; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.awt.*; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.*; import java.util.List; -import java.util.UUID; +import java.util.concurrent.*; /** *

@@ -38,12 +47,21 @@ * @since 2020-05-24 */ @Service +@Slf4j public class AppDeviceAddServiceImpl extends ServiceImpl implements IAppDeviceAddService { + @Value("${casic.file-upload-path}") private String filePath; @Value("${casic.photoPath}") private String photoPath; + @Value("${casic.batchNumber}") + private Integer batchNumber; + @Autowired + private BatchExportLogMapper batchExportLogMapper; + @Autowired + private WebSocket webSocket; + @Override public List getAppDevice(String devcode) { @@ -127,7 +145,6 @@ EntityWrapper query = new EntityWrapper<>(); query.le("id", 5241); List appDeviceAddList = selectList(query); - for (AppDeviceAdd appDeviceAdd : appDeviceAddList) { if (ToolUtil.isNotEmpty(appDeviceAdd.getLongitude()) && ToolUtil.isNotEmpty(appDeviceAdd.getLatitude())) { @@ -141,12 +158,115 @@ } + @Override + public void exportImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); + Long stampeDir = System.currentTimeMillis(); + //以当前时间戳为目录 + String currentStampDir = filePath + stampeDir + File.separator; + setLocalFileDir(currentStampDir); + List batchExportLogsList = new ArrayList<>(); + try { + setStartTask(); + ExecutorService executor = Executors.newFixedThreadPool(10); + for (int appDeviceAddsIndex = 0; appDeviceAddsIndex < appDeviceAdds.size(); appDeviceAddsIndex += batchNumber) { + int postIndex = getBatchNumberPostIndex(appDeviceAdds, appDeviceAddsIndex); + List appDeviceBatchList = appDeviceAdds.subList(appDeviceAddsIndex, postIndex); + String partitionNumber = appDeviceAddsIndex + "-" + postIndex; + String fileName = "设备安装基础信息表" + partitionNumber + ".xls"; + String currentFileName = currentStampDir + fileName; + Runnable task = new Runnable() { + @Override + public void run() { + ExportExcelUtil exportExcelUtil = new ExportExcelUtil(); + exportExcelUtil.fileExport(appDeviceBatchList, currentFileName, photoPath); + } + }; + executor.submit(task); + batchExportLogsList.add(createBatchFileLogs(currentUserId, partitionNumber, fileName, String.valueOf(stampeDir))); + } + while (true) { + Long activeCount = ((ThreadPoolExecutor) executor).getTaskCount() - ((ThreadPoolExecutor) executor).getCompletedTaskCount(); + if (activeCount == 0) { + //删除所有的文件日志 + this.batchExportLogMapper.delete(null); + //删除所有历史文件 + deleteFile(new File(filePath),String.valueOf(stampeDir)); + //批量导入日志 + batchExportLogsList.stream().forEach( + batchExportLog -> this.batchExportLogMapper.insert(batchExportLog) + ); + System.out.println("所有的子线程都结束了!"); + List userList = new ArrayList<>(); + userList.add(String.valueOf(currentUserId)); + Map map = new HashMap(); + map.put("message", "你在" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(stampeDir)) + "的文件导出已经生成了,请到导出列表页面查看"); + map.put("type", "alarm"); + for (int i = 0; i < 3; i++) { + webSocket.sendListMessage(userList, JSON.toJSONString(map)); + Thread.sleep(3000); + } + break; + } + Thread.sleep(5000); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + /** + * 对导出产生的日志、进行清除,还原空间 + */ + private void deleteFile(File invalidFile,String currentFileStr) { + //为当前文件目录删除 + if(invalidFile.getAbsoluteFile().getName().equals(currentFileStr)){ + return; + } + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + if (!invalidFile.getAbsolutePath().equals(filePath.substring(0,filePath.length()-1))) { + //删除子文件 + files[i].delete(); + } + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i],currentFileStr); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + if (!invalidFile.getAbsolutePath().equals(filePath)) { + //删除子目录 + if (invalidFile != null && invalidFile.isDirectory()) { + invalidFile.delete(); + } + } + } @Override - public void exportUsersToExcel(List list,HttpServletResponse response) { - + public void exportNotImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); try { - //设置信息头,告诉浏览器内容为excel类型 response.setHeader("content-Type", "application/vnd.ms-excel"); //设置下载名称 @@ -160,16 +280,137 @@ params.setSheetName("设备安装信息"); //设置标题 params.setTitle("设备安装信息"); - //转成对应的类型;要不然会报错,虽然也可以导出成功 - List AppDevicAddDTOs = AppDevicAddDTO.convert(list,photoPath); - + List AppDeviceAddDTOs = AppDevicAddDTO.convert(appDeviceAdds, null); //导入excel - Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDevicAddDTOs); + Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDeviceAddDTOs); //写入 workbook.write(out); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception ex) { + ex.printStackTrace(); } } + + + @Override + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + FileInputStream is = null; + BufferedOutputStream out = null; + String zipPath = ""; + try { + response.reset(); + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/zip;charset=utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("设备安装基础信息表.zip", StandardCharsets.UTF_8.name())); + response.setHeader("Access-Control-Allow-Origin", "*"); + System.out.println(response.getHeader("Content-Disposition")); + ZipUtils zipUtils = new ZipUtils(); + zipPath = zipUtils.zipFileCreator(filePath, recentDir); + //开始下载 + is = new FileInputStream(new File(zipPath)); + out = new BufferedOutputStream(response.getOutputStream()); + byte[] buff = new byte[1024]; + int len = 0; + while ((len = is.read(buff, 0, buff.length)) != -1) { + out.write(buff, 0, len); + } + out.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + try { + out.close(); + if (StringUtils.isNotEmpty(zipPath)) { + new ZipUtils().zipFileDeletor(zipPath); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + + @Override + public Page batchLogs(String begTime, String endTime, Page page) { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.le(StringUtils.isNotEmpty(begTime), "create_time", begTime) + .or().ge(StringUtils.isNotEmpty(endTime), "create_time", endTime); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")); + List batchExportLogs = this.batchExportLogMapper.selectPage(page, batchEntityWrapper); + page.setRecords(batchExportLogs); + return page; + } + + + private BatchExportLog createBatchFileLogs(Long currentUserId, String partitionNumber, String fileName, String fileDir) { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setPartitionNumber(partitionNumber); + batchExportLog.setCreateUserId(currentUserId); + batchExportLog.setFileDir(fileDir + File.separator); + batchExportLog.setTaskId(0); + batchExportLog.setFileName(fileName); + return batchExportLog; + } + + @Override + public Integer getStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.where("create_time>date_add(now(), interval -1 hour) "); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + return optionalBatchExportLog.isPresent() ? optionalBatchExportLog.get().getTaskId() : null; + } + + private void setStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + if (optionalBatchExportLog.isPresent()) { + optionalBatchExportLog.get().setTaskId(1); + this.batchExportLogMapper.updateById(optionalBatchExportLog.get()); + } else { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setTaskId(1); + this.batchExportLogMapper.insert(batchExportLog); + } + } + + /** + * 获取分批次要导出的目录列表 + * + * @return + */ + private int getBatchNumberPostIndex(List appDeviceAdds, int appDeviceAddsIndex) { + int postIndex = 0; + if (appDeviceAddsIndex + batchNumber > appDeviceAdds.size()) { + postIndex = appDeviceAdds.size(); + } else { + postIndex = appDeviceAddsIndex + batchNumber; + } + return postIndex; + } + + /** + * 创建文件目录 + */ + private void setLocalFileDir(String tempLocalFileDir) { + File file = new File(tempLocalFileDir); + if (!file.exists()) { + file.mkdirs(); + } + } + } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java new file mode 100644 index 0000000..cf9307c --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java @@ -0,0 +1,47 @@ +package com.casic.missiles.modular.app.util; + +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.casic.missiles.modular.app.dto.AppDevicAddDTO; +import com.casic.missiles.modular.app.model.AppDeviceAdd; +import org.apache.poi.ss.usermodel.Workbook; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +public class ExportExcelUtil { + /** + * 导出文件主要内容 + */ + public void fileExport(List appDeviceBatchList, String currentFileName,String photoPath) { + FileOutputStream fileOutputStream = null; + try { + fileOutputStream = new FileOutputStream(currentFileName); + //设置excel参数 + ExportParams params = new ExportParams(); + //设置sheet名名称 + params.setSheetName("设备安装信息"); + //设置标题 + params.setTitle("设备安装信息"); + //转成对应的类型;要不然会报错,虽然也可以导出成功 + List AppDeviceAddDTOs = AppDevicAddDTO.convert(appDeviceBatchList, photoPath); + //导入excel + Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDeviceAddDTOs); + workbook.write(fileOutputStream); + fileOutputStream.flush(); + } catch (Exception e) { + + } finally { + if (fileOutputStream != null) { + try { + fileOutputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java new file mode 100644 index 0000000..50f24dc --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java @@ -0,0 +1,101 @@ +package com.casic.missiles.modular.app.util; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets =new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value="userId")String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId+"【websocket消息】有新的连接,总数为:"+webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:"+webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:"+message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for(WebSocket webSocket : webSockets) { + System.out.println("【websocket消息】广播消息:"+message); + try { + webSocket.session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + // 发送列表消息 + public void sendListMessage(List userIds, String message){ + System.out.println("【websocket消息】列表消息:"+message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 发送列表消息 + +// public void sendListMessage(List userIds, Object data){ +// System.out.println("【websocket消息】列表消息:"+data); +// for (String userId : userIds) { +// Session session = sessionPool.get(userId); +// if (session != null) { +// try { +//// session.getAsyncRemote().sendText(message); +// session.getAsyncRemote().sendObject(data); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:"+message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java new file mode 100644 index 0000000..ea267bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java @@ -0,0 +1,84 @@ +package com.casic.missiles.modular.app.util; + + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * @author zhouxuan + * @since 2019/4/19 + */ +public class ZipUtils { + + /** + * 批量打包 + * + * @param downloadPath 项目根目录 + * @return tempDir 文件保存绝对路径 + */ + public String zipFileCreator(String downloadPath,String tempDir) { + ZipOutputStream out = null; + try { + //生成打包下载后的zip文件:Papers.zip + String papersZipName = "设备安装基础信息表.zip"; + //zip文件保存路径 + String zipPath = downloadPath + papersZipName; + String fileSaveRootPath=downloadPath+File.separator+tempDir; + File file = new File(fileSaveRootPath); + File[] files = file.listFiles(); + out = new ZipOutputStream(new FileOutputStream(zipPath)); + //遍历jsonArray列表获取所有JSONObject对象 + for (int i = 0; i < files.length; i++) { + //以论文标题为每个文件命名 + FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); + out.putNextEntry(new ZipEntry(files[i].getName())); + //写入压缩包 + int len; + byte[] buffer = new byte[1024]; + while ((len = fis.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + out.closeEntry(); + fis.close(); + } + out.close(); + out.flush(); + return zipPath; + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + + /** + * 批量打包 + * + * @param zipPath zip路径 + * @return zip文件保存绝对路径 + */ + public void zipFileDeletor(String zipPath) { + try { + File zipFile=new File(zipPath); + zipFile.delete(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java index 59b2097..5ab81c7 100644 --- a/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java +++ b/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -10,9 +10,12 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletResponse; +import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; /** * 控制器 @@ -31,41 +34,56 @@ * 文件模板下载 */ @GetMapping("/template/download") - public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) - throws ServletException, IOException { + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) throws IOException { logger.info(downloadPath); - if (downloadPath.startsWith("/")) { - downloadPath = downloadPath.substring(1); + String tempDownloadPath=downloadPath; + if (tempDownloadPath.startsWith("/")) { + tempDownloadPath = tempDownloadPath.substring(1); } - File file = new File(downloadPath, filename); + + File file = new File(tempDownloadPath, filename); // 获取文件名 String fileName = null; - if (filename.contains("/")) { - fileName = filename.substring(filename.lastIndexOf("/") + 1); + if (filename.contains(File.separator)) { + fileName = filename.substring(filename.lastIndexOf(File.separator) + 1); } else { fileName = filename; } // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 response.setContentType("application/octet-stream"); - response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setCharacterEncoding("UTF-8"); + response.addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, StandardCharsets.UTF_8.name())); response.setContentLength((int) file.length()); - + BufferedOutputStream out = null; FileInputStream fis = null; try { + out = new BufferedOutputStream(response.getOutputStream()); fis = new FileInputStream(file); byte[] buffer = new byte[1024]; int readTmp = 0; while ((readTmp = fis.read(buffer)) != -1) { - response.getOutputStream().write(buffer, 0, readTmp); + out.write(buffer, 0, readTmp); } + out.flush(); } catch (Exception e) { logger.info(e.getMessage()); e.printStackTrace(); } finally { - response.getOutputStream().flush(); - response.getOutputStream().close(); - fis.close(); + if (out != null) { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } } } } diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 0faf332..9b9943a 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -288,10 +288,13 @@ - src/main/webapp - - src/main/resources + + + /config/*/* + /config/*-*.yml + + true src/main/java diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java index 0b0c3fb..47a8b06 100644 --- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -1,5 +1,7 @@ package com.casic.missiles; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; @@ -23,7 +25,6 @@ public static void main(String[] args){ SpringApplication.run(CasicApplication.class, args); logger.info("GunsApplication is success!"); - } } @@ -33,3 +34,4 @@ + diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java new file mode 100644 index 0000000..e9f04bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.app.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java index 1fe427f..cbfaa4d 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java @@ -11,15 +11,17 @@ import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dto.SelectDTO; -import com.casic.missiles.modular.app.enums.DeviceBaseExportEnum; import com.casic.missiles.modular.app.model.AppDeviceAdd; import com.casic.missiles.modular.app.model.AppDeviceLog; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; import com.casic.missiles.modular.app.service.IAppDeviceLogService; import com.casic.missiles.modular.app.util.LonlatConver; import com.casic.missiles.modular.system.model.Dict; import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @@ -30,8 +32,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; import java.util.stream.Collectors; /** @@ -54,6 +55,9 @@ @Resource private ICommonPermissionService permissionService; + @Value("${casic.photoPath}") + private String photoPath; + /** * 获取施工添加设备列表 */ @@ -164,7 +168,6 @@ // @ResponseBody // public Object imageBase64Upload(@RequestBody(required =false) String fileBase64) throws IOException { // return ResponseData.success(commonFileService.saveFileBase64Image(fileBase64)); -// // } @RequestMapping({"/getWellTypeList"}) @@ -240,32 +243,49 @@ //照片一起导出 - @RequestMapping(value = "/listExp") - public void listExps(String devcode, String devtype, - String begTime, String endTime, - String project, String installPerson, - HttpServletResponse response) throws IOException { + @RequestMapping(value = "/image/listExp") + @ResponseBody + public Object listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson) { + List dictList = permissionService.findInDictByCode("sluicewellType"); - List list = appDeviceAddService.reportExport(devcode, devtype, - begTime, endTime, project, installPerson); + Map sluiceWellDictMap = dictList.stream() + .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); + Integer taskId = appDeviceAddService.getStartTask(); + if (null == taskId || taskId != 1) { + Long currentUserId = permissionService.getCurrLoginUser().getId(); + ExecutorService executor = Executors.newFixedThreadPool(1); + executor.execute(() -> appDeviceAddService.exportImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, currentUserId)); + return ResponseData.success("执行成功,请稍等..."); + } else { + return ResponseData.error("有任务正在执行,请稍等!"); + } + } + + + @RequestMapping(value = "/listExp") + @ResponseBody + public void listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { List dictList = permissionService.findInDictByCode("sluicewellType"); Map sluiceWellDictMap = dictList.stream() .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); - list.forEach(appDeviceAdd -> { - appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); - }); - ExecutorService cachedExecutorService = Executors.newCachedThreadPool(); - cachedExecutorService.execute(new Runnable() { - @Override - public void run() { - appDeviceAddService.exportUsersToExcel(list, response); - } - }); -// List res = new ArrayList<>(); -// res.addAll(list); -// //获取导出文件header -// super.exportExcel(DeviceBaseExportEnum.DeviceBase_EXPORT, res); + appDeviceAddService.exportNotImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, response); } + @RequestMapping(value = "/batch/logs") + @ResponseBody + public Object batchLogs(String begTime, String endTime) { + Page page = new PageFactory().defaultPage(); + return ResponseData.success(super.packForBT(appDeviceAddService.batchLogs(begTime, endTime, page))); + } + + @CrossOrigin + @RequestMapping(value = "/batchzip") + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + appDeviceAddService.batchDownloadFiles(recentDir, response); + } } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java new file mode 100644 index 0000000..b741f4e --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.modular.app.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.app.model.BatchExportLog; + +public interface BatchExportLogMapper extends BaseMapper { + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java index 6ed5d35..9acca94 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java @@ -1,11 +1,11 @@ package com.casic.missiles.modular.app.dto; import cn.afterturn.easypoi.excel.annotation.Excel; +import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.model.AppDeviceAdd; import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; +import org.apache.commons.lang3.StringUtils; import java.io.Serializable; import java.util.ArrayList; @@ -33,7 +33,7 @@ private String installheigt; @Excel(name = "负责人", width = 10.0) private String installperson; - @Excel(name = "安装时间", format = "yyyy-MM-dd",width = 10.0) + @Excel(name = "安装时间", format = "yyyy-MM-dd", width = 10.0) private Date installtime; @Excel(name = "照片1", type = 2, width = 20.0, height = 60.0, imageType = 1) private String photopath1; @@ -61,16 +61,16 @@ private String latitude84; - public static List convert (List appDeviceAdds,String photoPath) { + public static List convert(List appDeviceAdds, String photoPath) { List appDevicAddDTOS = new ArrayList<>(); appDeviceAdds.forEach(appDeviceAdd -> { - appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd,photoPath)); + appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd, photoPath)); }); return appDevicAddDTOS; } - public AppDevicAddDTO(AppDeviceAdd appDeviceAdd,String photoPath) { + public AppDevicAddDTO(AppDeviceAdd appDeviceAdd, String photoPath) { this.devcode = appDeviceAdd.getDevcode(); this.devicetype = appDeviceAdd.getDevicetype(); this.wellcode = appDeviceAdd.getWellcode(); @@ -80,9 +80,12 @@ this.installheigt = appDeviceAdd.getInstallheigt(); this.installperson = appDeviceAdd.getInstallperson(); this.installtime = appDeviceAdd.getInstalltime(); - this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1())?photoPath+appDeviceAdd.getPhotopath1():appDeviceAdd.getPhotopath1(); - this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2())?photoPath+appDeviceAdd.getPhotopath2():appDeviceAdd.getPhotopath2(); - this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3())?photoPath+appDeviceAdd.getPhotopath3():appDeviceAdd.getPhotopath3(); +// && this.installtime.getTime()>=DateUtil.parseDate("2023-04-01").getTime() + if (StringUtils.isNotEmpty(photoPath) ) { + this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1()) ? photoPath + appDeviceAdd.getPhotopath1() : appDeviceAdd.getPhotopath1(); + this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2()) ? photoPath + appDeviceAdd.getPhotopath2() : appDeviceAdd.getPhotopath2(); + this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3()) ? photoPath + appDeviceAdd.getPhotopath3() : appDeviceAdd.getPhotopath3(); + } this.project = appDeviceAdd.getProject(); this.position = appDeviceAdd.getPosition(); this.description = appDeviceAdd.getDescription(); diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java new file mode 100644 index 0000000..a8701e5 --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.app.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cz + */ +@Data +@TableName("batch_export_log") +public class BatchExportLog extends Model { + + private static final long serialVersionUID = 1L; + + @TableId("id") + private Long id; + @TableField("file_name") + private String fileName; + @TableField("file_dir") + private String fileDir; + @TableField("partition_number") + private String partitionNumber; + @TableField("create_time") + private String createTime; + @TableField("create_user_id") + private Long createUserId; + @TableField("task_id") + private int taskId; + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java index 96bd6fb..a8921c5 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java @@ -1,16 +1,19 @@ package com.casic.missiles.modular.app.service; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; +import java.util.Map; /** *

- * 服务类 + * 服务类 *

* * @author stylefeng123 @@ -18,13 +21,33 @@ */ public interface IAppDeviceAddService extends IService { - List getAppDevice(String devcode); + List getAppDevice(String devcode); + String saveFile(MultipartFile var1) throws IOException; - String fileUploadMarker(MultipartFile var1,String text) throws IOException; + + String fileUploadMarker(MultipartFile var1, String text) throws IOException; + String findModeCodeByCode(String devcode); + List reportExport(String devcode, String devtype, String begTime, String endTime, String project, String installPerson); + void convert84(); - void exportUsersToExcel(List list, HttpServletResponse response); + + void exportImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId); + + void exportNotImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson,HttpServletResponse response); + + void batchDownloadFiles(String recentDir,HttpServletResponse response); + + Integer getStartTask(); + + Page batchLogs(String begTime, String endTime, Page page); } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java index 69f2254..7c2865f 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java @@ -2,32 +2,41 @@ import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dao.AppDeviceAddMapper; +import com.casic.missiles.modular.app.dao.BatchExportLogMapper; import com.casic.missiles.modular.app.dto.AppDevicAddDTO; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; -import com.casic.missiles.modular.app.util.LonlatConver; -import com.casic.missiles.modular.app.util.PhotoUtils; +import com.casic.missiles.modular.app.util.*; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.ListUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.management.Query; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.awt.*; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.*; import java.util.List; -import java.util.UUID; +import java.util.concurrent.*; /** *

@@ -38,12 +47,21 @@ * @since 2020-05-24 */ @Service +@Slf4j public class AppDeviceAddServiceImpl extends ServiceImpl implements IAppDeviceAddService { + @Value("${casic.file-upload-path}") private String filePath; @Value("${casic.photoPath}") private String photoPath; + @Value("${casic.batchNumber}") + private Integer batchNumber; + @Autowired + private BatchExportLogMapper batchExportLogMapper; + @Autowired + private WebSocket webSocket; + @Override public List getAppDevice(String devcode) { @@ -127,7 +145,6 @@ EntityWrapper query = new EntityWrapper<>(); query.le("id", 5241); List appDeviceAddList = selectList(query); - for (AppDeviceAdd appDeviceAdd : appDeviceAddList) { if (ToolUtil.isNotEmpty(appDeviceAdd.getLongitude()) && ToolUtil.isNotEmpty(appDeviceAdd.getLatitude())) { @@ -141,12 +158,115 @@ } + @Override + public void exportImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); + Long stampeDir = System.currentTimeMillis(); + //以当前时间戳为目录 + String currentStampDir = filePath + stampeDir + File.separator; + setLocalFileDir(currentStampDir); + List batchExportLogsList = new ArrayList<>(); + try { + setStartTask(); + ExecutorService executor = Executors.newFixedThreadPool(10); + for (int appDeviceAddsIndex = 0; appDeviceAddsIndex < appDeviceAdds.size(); appDeviceAddsIndex += batchNumber) { + int postIndex = getBatchNumberPostIndex(appDeviceAdds, appDeviceAddsIndex); + List appDeviceBatchList = appDeviceAdds.subList(appDeviceAddsIndex, postIndex); + String partitionNumber = appDeviceAddsIndex + "-" + postIndex; + String fileName = "设备安装基础信息表" + partitionNumber + ".xls"; + String currentFileName = currentStampDir + fileName; + Runnable task = new Runnable() { + @Override + public void run() { + ExportExcelUtil exportExcelUtil = new ExportExcelUtil(); + exportExcelUtil.fileExport(appDeviceBatchList, currentFileName, photoPath); + } + }; + executor.submit(task); + batchExportLogsList.add(createBatchFileLogs(currentUserId, partitionNumber, fileName, String.valueOf(stampeDir))); + } + while (true) { + Long activeCount = ((ThreadPoolExecutor) executor).getTaskCount() - ((ThreadPoolExecutor) executor).getCompletedTaskCount(); + if (activeCount == 0) { + //删除所有的文件日志 + this.batchExportLogMapper.delete(null); + //删除所有历史文件 + deleteFile(new File(filePath),String.valueOf(stampeDir)); + //批量导入日志 + batchExportLogsList.stream().forEach( + batchExportLog -> this.batchExportLogMapper.insert(batchExportLog) + ); + System.out.println("所有的子线程都结束了!"); + List userList = new ArrayList<>(); + userList.add(String.valueOf(currentUserId)); + Map map = new HashMap(); + map.put("message", "你在" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(stampeDir)) + "的文件导出已经生成了,请到导出列表页面查看"); + map.put("type", "alarm"); + for (int i = 0; i < 3; i++) { + webSocket.sendListMessage(userList, JSON.toJSONString(map)); + Thread.sleep(3000); + } + break; + } + Thread.sleep(5000); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + /** + * 对导出产生的日志、进行清除,还原空间 + */ + private void deleteFile(File invalidFile,String currentFileStr) { + //为当前文件目录删除 + if(invalidFile.getAbsoluteFile().getName().equals(currentFileStr)){ + return; + } + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + if (!invalidFile.getAbsolutePath().equals(filePath.substring(0,filePath.length()-1))) { + //删除子文件 + files[i].delete(); + } + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i],currentFileStr); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + if (!invalidFile.getAbsolutePath().equals(filePath)) { + //删除子目录 + if (invalidFile != null && invalidFile.isDirectory()) { + invalidFile.delete(); + } + } + } @Override - public void exportUsersToExcel(List list,HttpServletResponse response) { - + public void exportNotImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); try { - //设置信息头,告诉浏览器内容为excel类型 response.setHeader("content-Type", "application/vnd.ms-excel"); //设置下载名称 @@ -160,16 +280,137 @@ params.setSheetName("设备安装信息"); //设置标题 params.setTitle("设备安装信息"); - //转成对应的类型;要不然会报错,虽然也可以导出成功 - List AppDevicAddDTOs = AppDevicAddDTO.convert(list,photoPath); - + List AppDeviceAddDTOs = AppDevicAddDTO.convert(appDeviceAdds, null); //导入excel - Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDevicAddDTOs); + Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDeviceAddDTOs); //写入 workbook.write(out); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception ex) { + ex.printStackTrace(); } } + + + @Override + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + FileInputStream is = null; + BufferedOutputStream out = null; + String zipPath = ""; + try { + response.reset(); + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/zip;charset=utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("设备安装基础信息表.zip", StandardCharsets.UTF_8.name())); + response.setHeader("Access-Control-Allow-Origin", "*"); + System.out.println(response.getHeader("Content-Disposition")); + ZipUtils zipUtils = new ZipUtils(); + zipPath = zipUtils.zipFileCreator(filePath, recentDir); + //开始下载 + is = new FileInputStream(new File(zipPath)); + out = new BufferedOutputStream(response.getOutputStream()); + byte[] buff = new byte[1024]; + int len = 0; + while ((len = is.read(buff, 0, buff.length)) != -1) { + out.write(buff, 0, len); + } + out.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + try { + out.close(); + if (StringUtils.isNotEmpty(zipPath)) { + new ZipUtils().zipFileDeletor(zipPath); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + + @Override + public Page batchLogs(String begTime, String endTime, Page page) { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.le(StringUtils.isNotEmpty(begTime), "create_time", begTime) + .or().ge(StringUtils.isNotEmpty(endTime), "create_time", endTime); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")); + List batchExportLogs = this.batchExportLogMapper.selectPage(page, batchEntityWrapper); + page.setRecords(batchExportLogs); + return page; + } + + + private BatchExportLog createBatchFileLogs(Long currentUserId, String partitionNumber, String fileName, String fileDir) { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setPartitionNumber(partitionNumber); + batchExportLog.setCreateUserId(currentUserId); + batchExportLog.setFileDir(fileDir + File.separator); + batchExportLog.setTaskId(0); + batchExportLog.setFileName(fileName); + return batchExportLog; + } + + @Override + public Integer getStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.where("create_time>date_add(now(), interval -1 hour) "); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + return optionalBatchExportLog.isPresent() ? optionalBatchExportLog.get().getTaskId() : null; + } + + private void setStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + if (optionalBatchExportLog.isPresent()) { + optionalBatchExportLog.get().setTaskId(1); + this.batchExportLogMapper.updateById(optionalBatchExportLog.get()); + } else { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setTaskId(1); + this.batchExportLogMapper.insert(batchExportLog); + } + } + + /** + * 获取分批次要导出的目录列表 + * + * @return + */ + private int getBatchNumberPostIndex(List appDeviceAdds, int appDeviceAddsIndex) { + int postIndex = 0; + if (appDeviceAddsIndex + batchNumber > appDeviceAdds.size()) { + postIndex = appDeviceAdds.size(); + } else { + postIndex = appDeviceAddsIndex + batchNumber; + } + return postIndex; + } + + /** + * 创建文件目录 + */ + private void setLocalFileDir(String tempLocalFileDir) { + File file = new File(tempLocalFileDir); + if (!file.exists()) { + file.mkdirs(); + } + } + } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java new file mode 100644 index 0000000..cf9307c --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java @@ -0,0 +1,47 @@ +package com.casic.missiles.modular.app.util; + +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.casic.missiles.modular.app.dto.AppDevicAddDTO; +import com.casic.missiles.modular.app.model.AppDeviceAdd; +import org.apache.poi.ss.usermodel.Workbook; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +public class ExportExcelUtil { + /** + * 导出文件主要内容 + */ + public void fileExport(List appDeviceBatchList, String currentFileName,String photoPath) { + FileOutputStream fileOutputStream = null; + try { + fileOutputStream = new FileOutputStream(currentFileName); + //设置excel参数 + ExportParams params = new ExportParams(); + //设置sheet名名称 + params.setSheetName("设备安装信息"); + //设置标题 + params.setTitle("设备安装信息"); + //转成对应的类型;要不然会报错,虽然也可以导出成功 + List AppDeviceAddDTOs = AppDevicAddDTO.convert(appDeviceBatchList, photoPath); + //导入excel + Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDeviceAddDTOs); + workbook.write(fileOutputStream); + fileOutputStream.flush(); + } catch (Exception e) { + + } finally { + if (fileOutputStream != null) { + try { + fileOutputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java new file mode 100644 index 0000000..50f24dc --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java @@ -0,0 +1,101 @@ +package com.casic.missiles.modular.app.util; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets =new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value="userId")String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId+"【websocket消息】有新的连接,总数为:"+webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:"+webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:"+message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for(WebSocket webSocket : webSockets) { + System.out.println("【websocket消息】广播消息:"+message); + try { + webSocket.session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + // 发送列表消息 + public void sendListMessage(List userIds, String message){ + System.out.println("【websocket消息】列表消息:"+message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 发送列表消息 + +// public void sendListMessage(List userIds, Object data){ +// System.out.println("【websocket消息】列表消息:"+data); +// for (String userId : userIds) { +// Session session = sessionPool.get(userId); +// if (session != null) { +// try { +//// session.getAsyncRemote().sendText(message); +// session.getAsyncRemote().sendObject(data); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:"+message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java new file mode 100644 index 0000000..ea267bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java @@ -0,0 +1,84 @@ +package com.casic.missiles.modular.app.util; + + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * @author zhouxuan + * @since 2019/4/19 + */ +public class ZipUtils { + + /** + * 批量打包 + * + * @param downloadPath 项目根目录 + * @return tempDir 文件保存绝对路径 + */ + public String zipFileCreator(String downloadPath,String tempDir) { + ZipOutputStream out = null; + try { + //生成打包下载后的zip文件:Papers.zip + String papersZipName = "设备安装基础信息表.zip"; + //zip文件保存路径 + String zipPath = downloadPath + papersZipName; + String fileSaveRootPath=downloadPath+File.separator+tempDir; + File file = new File(fileSaveRootPath); + File[] files = file.listFiles(); + out = new ZipOutputStream(new FileOutputStream(zipPath)); + //遍历jsonArray列表获取所有JSONObject对象 + for (int i = 0; i < files.length; i++) { + //以论文标题为每个文件命名 + FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); + out.putNextEntry(new ZipEntry(files[i].getName())); + //写入压缩包 + int len; + byte[] buffer = new byte[1024]; + while ((len = fis.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + out.closeEntry(); + fis.close(); + } + out.close(); + out.flush(); + return zipPath; + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + + /** + * 批量打包 + * + * @param zipPath zip路径 + * @return zip文件保存绝对路径 + */ + public void zipFileDeletor(String zipPath) { + try { + File zipFile=new File(zipPath); + zipFile.delete(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java index 59b2097..5ab81c7 100644 --- a/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java +++ b/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -10,9 +10,12 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletResponse; +import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; /** * 控制器 @@ -31,41 +34,56 @@ * 文件模板下载 */ @GetMapping("/template/download") - public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) - throws ServletException, IOException { + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) throws IOException { logger.info(downloadPath); - if (downloadPath.startsWith("/")) { - downloadPath = downloadPath.substring(1); + String tempDownloadPath=downloadPath; + if (tempDownloadPath.startsWith("/")) { + tempDownloadPath = tempDownloadPath.substring(1); } - File file = new File(downloadPath, filename); + + File file = new File(tempDownloadPath, filename); // 获取文件名 String fileName = null; - if (filename.contains("/")) { - fileName = filename.substring(filename.lastIndexOf("/") + 1); + if (filename.contains(File.separator)) { + fileName = filename.substring(filename.lastIndexOf(File.separator) + 1); } else { fileName = filename; } // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 response.setContentType("application/octet-stream"); - response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setCharacterEncoding("UTF-8"); + response.addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, StandardCharsets.UTF_8.name())); response.setContentLength((int) file.length()); - + BufferedOutputStream out = null; FileInputStream fis = null; try { + out = new BufferedOutputStream(response.getOutputStream()); fis = new FileInputStream(file); byte[] buffer = new byte[1024]; int readTmp = 0; while ((readTmp = fis.read(buffer)) != -1) { - response.getOutputStream().write(buffer, 0, readTmp); + out.write(buffer, 0, readTmp); } + out.flush(); } catch (Exception e) { logger.info(e.getMessage()); e.printStackTrace(); } finally { - response.getOutputStream().flush(); - response.getOutputStream().close(); - fis.close(); + if (out != null) { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } } } } diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 0faf332..9b9943a 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -288,10 +288,13 @@ - src/main/webapp - - src/main/resources + + + /config/*/* + /config/*-*.yml + + true src/main/java diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java index 0b0c3fb..47a8b06 100644 --- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -1,5 +1,7 @@ package com.casic.missiles; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; @@ -23,7 +25,6 @@ public static void main(String[] args){ SpringApplication.run(CasicApplication.class, args); logger.info("GunsApplication is success!"); - } } @@ -33,3 +34,4 @@ + diff --git a/casic-web/src/main/java/com/casic/missiles/controller/MockController.java b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java index a8285e8..3cebcd0 100644 --- a/casic-web/src/main/java/com/casic/missiles/controller/MockController.java +++ b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java @@ -46,7 +46,7 @@ SuccessResponseData resultData = new SuccessResponseData(); if (ToolUtil.isOneEmpty(username, password)) { username = "admin"; - password = "1111111a"; + password = "casic203"; } Subject currentUser = ShiroKit.getSubject(); diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java new file mode 100644 index 0000000..e9f04bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.app.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java index 1fe427f..cbfaa4d 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java @@ -11,15 +11,17 @@ import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dto.SelectDTO; -import com.casic.missiles.modular.app.enums.DeviceBaseExportEnum; import com.casic.missiles.modular.app.model.AppDeviceAdd; import com.casic.missiles.modular.app.model.AppDeviceLog; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; import com.casic.missiles.modular.app.service.IAppDeviceLogService; import com.casic.missiles.modular.app.util.LonlatConver; import com.casic.missiles.modular.system.model.Dict; import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @@ -30,8 +32,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; import java.util.stream.Collectors; /** @@ -54,6 +55,9 @@ @Resource private ICommonPermissionService permissionService; + @Value("${casic.photoPath}") + private String photoPath; + /** * 获取施工添加设备列表 */ @@ -164,7 +168,6 @@ // @ResponseBody // public Object imageBase64Upload(@RequestBody(required =false) String fileBase64) throws IOException { // return ResponseData.success(commonFileService.saveFileBase64Image(fileBase64)); -// // } @RequestMapping({"/getWellTypeList"}) @@ -240,32 +243,49 @@ //照片一起导出 - @RequestMapping(value = "/listExp") - public void listExps(String devcode, String devtype, - String begTime, String endTime, - String project, String installPerson, - HttpServletResponse response) throws IOException { + @RequestMapping(value = "/image/listExp") + @ResponseBody + public Object listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson) { + List dictList = permissionService.findInDictByCode("sluicewellType"); - List list = appDeviceAddService.reportExport(devcode, devtype, - begTime, endTime, project, installPerson); + Map sluiceWellDictMap = dictList.stream() + .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); + Integer taskId = appDeviceAddService.getStartTask(); + if (null == taskId || taskId != 1) { + Long currentUserId = permissionService.getCurrLoginUser().getId(); + ExecutorService executor = Executors.newFixedThreadPool(1); + executor.execute(() -> appDeviceAddService.exportImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, currentUserId)); + return ResponseData.success("执行成功,请稍等..."); + } else { + return ResponseData.error("有任务正在执行,请稍等!"); + } + } + + + @RequestMapping(value = "/listExp") + @ResponseBody + public void listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { List dictList = permissionService.findInDictByCode("sluicewellType"); Map sluiceWellDictMap = dictList.stream() .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); - list.forEach(appDeviceAdd -> { - appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); - }); - ExecutorService cachedExecutorService = Executors.newCachedThreadPool(); - cachedExecutorService.execute(new Runnable() { - @Override - public void run() { - appDeviceAddService.exportUsersToExcel(list, response); - } - }); -// List res = new ArrayList<>(); -// res.addAll(list); -// //获取导出文件header -// super.exportExcel(DeviceBaseExportEnum.DeviceBase_EXPORT, res); + appDeviceAddService.exportNotImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, response); } + @RequestMapping(value = "/batch/logs") + @ResponseBody + public Object batchLogs(String begTime, String endTime) { + Page page = new PageFactory().defaultPage(); + return ResponseData.success(super.packForBT(appDeviceAddService.batchLogs(begTime, endTime, page))); + } + + @CrossOrigin + @RequestMapping(value = "/batchzip") + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + appDeviceAddService.batchDownloadFiles(recentDir, response); + } } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java new file mode 100644 index 0000000..b741f4e --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.modular.app.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.app.model.BatchExportLog; + +public interface BatchExportLogMapper extends BaseMapper { + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java index 6ed5d35..9acca94 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java @@ -1,11 +1,11 @@ package com.casic.missiles.modular.app.dto; import cn.afterturn.easypoi.excel.annotation.Excel; +import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.model.AppDeviceAdd; import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; +import org.apache.commons.lang3.StringUtils; import java.io.Serializable; import java.util.ArrayList; @@ -33,7 +33,7 @@ private String installheigt; @Excel(name = "负责人", width = 10.0) private String installperson; - @Excel(name = "安装时间", format = "yyyy-MM-dd",width = 10.0) + @Excel(name = "安装时间", format = "yyyy-MM-dd", width = 10.0) private Date installtime; @Excel(name = "照片1", type = 2, width = 20.0, height = 60.0, imageType = 1) private String photopath1; @@ -61,16 +61,16 @@ private String latitude84; - public static List convert (List appDeviceAdds,String photoPath) { + public static List convert(List appDeviceAdds, String photoPath) { List appDevicAddDTOS = new ArrayList<>(); appDeviceAdds.forEach(appDeviceAdd -> { - appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd,photoPath)); + appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd, photoPath)); }); return appDevicAddDTOS; } - public AppDevicAddDTO(AppDeviceAdd appDeviceAdd,String photoPath) { + public AppDevicAddDTO(AppDeviceAdd appDeviceAdd, String photoPath) { this.devcode = appDeviceAdd.getDevcode(); this.devicetype = appDeviceAdd.getDevicetype(); this.wellcode = appDeviceAdd.getWellcode(); @@ -80,9 +80,12 @@ this.installheigt = appDeviceAdd.getInstallheigt(); this.installperson = appDeviceAdd.getInstallperson(); this.installtime = appDeviceAdd.getInstalltime(); - this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1())?photoPath+appDeviceAdd.getPhotopath1():appDeviceAdd.getPhotopath1(); - this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2())?photoPath+appDeviceAdd.getPhotopath2():appDeviceAdd.getPhotopath2(); - this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3())?photoPath+appDeviceAdd.getPhotopath3():appDeviceAdd.getPhotopath3(); +// && this.installtime.getTime()>=DateUtil.parseDate("2023-04-01").getTime() + if (StringUtils.isNotEmpty(photoPath) ) { + this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1()) ? photoPath + appDeviceAdd.getPhotopath1() : appDeviceAdd.getPhotopath1(); + this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2()) ? photoPath + appDeviceAdd.getPhotopath2() : appDeviceAdd.getPhotopath2(); + this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3()) ? photoPath + appDeviceAdd.getPhotopath3() : appDeviceAdd.getPhotopath3(); + } this.project = appDeviceAdd.getProject(); this.position = appDeviceAdd.getPosition(); this.description = appDeviceAdd.getDescription(); diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java new file mode 100644 index 0000000..a8701e5 --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.app.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cz + */ +@Data +@TableName("batch_export_log") +public class BatchExportLog extends Model { + + private static final long serialVersionUID = 1L; + + @TableId("id") + private Long id; + @TableField("file_name") + private String fileName; + @TableField("file_dir") + private String fileDir; + @TableField("partition_number") + private String partitionNumber; + @TableField("create_time") + private String createTime; + @TableField("create_user_id") + private Long createUserId; + @TableField("task_id") + private int taskId; + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java index 96bd6fb..a8921c5 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java @@ -1,16 +1,19 @@ package com.casic.missiles.modular.app.service; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; +import java.util.Map; /** *

- * 服务类 + * 服务类 *

* * @author stylefeng123 @@ -18,13 +21,33 @@ */ public interface IAppDeviceAddService extends IService { - List getAppDevice(String devcode); + List getAppDevice(String devcode); + String saveFile(MultipartFile var1) throws IOException; - String fileUploadMarker(MultipartFile var1,String text) throws IOException; + + String fileUploadMarker(MultipartFile var1, String text) throws IOException; + String findModeCodeByCode(String devcode); + List reportExport(String devcode, String devtype, String begTime, String endTime, String project, String installPerson); + void convert84(); - void exportUsersToExcel(List list, HttpServletResponse response); + + void exportImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId); + + void exportNotImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson,HttpServletResponse response); + + void batchDownloadFiles(String recentDir,HttpServletResponse response); + + Integer getStartTask(); + + Page batchLogs(String begTime, String endTime, Page page); } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java index 69f2254..7c2865f 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java @@ -2,32 +2,41 @@ import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dao.AppDeviceAddMapper; +import com.casic.missiles.modular.app.dao.BatchExportLogMapper; import com.casic.missiles.modular.app.dto.AppDevicAddDTO; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; -import com.casic.missiles.modular.app.util.LonlatConver; -import com.casic.missiles.modular.app.util.PhotoUtils; +import com.casic.missiles.modular.app.util.*; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.ListUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.management.Query; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.awt.*; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.*; import java.util.List; -import java.util.UUID; +import java.util.concurrent.*; /** *

@@ -38,12 +47,21 @@ * @since 2020-05-24 */ @Service +@Slf4j public class AppDeviceAddServiceImpl extends ServiceImpl implements IAppDeviceAddService { + @Value("${casic.file-upload-path}") private String filePath; @Value("${casic.photoPath}") private String photoPath; + @Value("${casic.batchNumber}") + private Integer batchNumber; + @Autowired + private BatchExportLogMapper batchExportLogMapper; + @Autowired + private WebSocket webSocket; + @Override public List getAppDevice(String devcode) { @@ -127,7 +145,6 @@ EntityWrapper query = new EntityWrapper<>(); query.le("id", 5241); List appDeviceAddList = selectList(query); - for (AppDeviceAdd appDeviceAdd : appDeviceAddList) { if (ToolUtil.isNotEmpty(appDeviceAdd.getLongitude()) && ToolUtil.isNotEmpty(appDeviceAdd.getLatitude())) { @@ -141,12 +158,115 @@ } + @Override + public void exportImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); + Long stampeDir = System.currentTimeMillis(); + //以当前时间戳为目录 + String currentStampDir = filePath + stampeDir + File.separator; + setLocalFileDir(currentStampDir); + List batchExportLogsList = new ArrayList<>(); + try { + setStartTask(); + ExecutorService executor = Executors.newFixedThreadPool(10); + for (int appDeviceAddsIndex = 0; appDeviceAddsIndex < appDeviceAdds.size(); appDeviceAddsIndex += batchNumber) { + int postIndex = getBatchNumberPostIndex(appDeviceAdds, appDeviceAddsIndex); + List appDeviceBatchList = appDeviceAdds.subList(appDeviceAddsIndex, postIndex); + String partitionNumber = appDeviceAddsIndex + "-" + postIndex; + String fileName = "设备安装基础信息表" + partitionNumber + ".xls"; + String currentFileName = currentStampDir + fileName; + Runnable task = new Runnable() { + @Override + public void run() { + ExportExcelUtil exportExcelUtil = new ExportExcelUtil(); + exportExcelUtil.fileExport(appDeviceBatchList, currentFileName, photoPath); + } + }; + executor.submit(task); + batchExportLogsList.add(createBatchFileLogs(currentUserId, partitionNumber, fileName, String.valueOf(stampeDir))); + } + while (true) { + Long activeCount = ((ThreadPoolExecutor) executor).getTaskCount() - ((ThreadPoolExecutor) executor).getCompletedTaskCount(); + if (activeCount == 0) { + //删除所有的文件日志 + this.batchExportLogMapper.delete(null); + //删除所有历史文件 + deleteFile(new File(filePath),String.valueOf(stampeDir)); + //批量导入日志 + batchExportLogsList.stream().forEach( + batchExportLog -> this.batchExportLogMapper.insert(batchExportLog) + ); + System.out.println("所有的子线程都结束了!"); + List userList = new ArrayList<>(); + userList.add(String.valueOf(currentUserId)); + Map map = new HashMap(); + map.put("message", "你在" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(stampeDir)) + "的文件导出已经生成了,请到导出列表页面查看"); + map.put("type", "alarm"); + for (int i = 0; i < 3; i++) { + webSocket.sendListMessage(userList, JSON.toJSONString(map)); + Thread.sleep(3000); + } + break; + } + Thread.sleep(5000); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + /** + * 对导出产生的日志、进行清除,还原空间 + */ + private void deleteFile(File invalidFile,String currentFileStr) { + //为当前文件目录删除 + if(invalidFile.getAbsoluteFile().getName().equals(currentFileStr)){ + return; + } + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + if (!invalidFile.getAbsolutePath().equals(filePath.substring(0,filePath.length()-1))) { + //删除子文件 + files[i].delete(); + } + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i],currentFileStr); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + if (!invalidFile.getAbsolutePath().equals(filePath)) { + //删除子目录 + if (invalidFile != null && invalidFile.isDirectory()) { + invalidFile.delete(); + } + } + } @Override - public void exportUsersToExcel(List list,HttpServletResponse response) { - + public void exportNotImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); try { - //设置信息头,告诉浏览器内容为excel类型 response.setHeader("content-Type", "application/vnd.ms-excel"); //设置下载名称 @@ -160,16 +280,137 @@ params.setSheetName("设备安装信息"); //设置标题 params.setTitle("设备安装信息"); - //转成对应的类型;要不然会报错,虽然也可以导出成功 - List AppDevicAddDTOs = AppDevicAddDTO.convert(list,photoPath); - + List AppDeviceAddDTOs = AppDevicAddDTO.convert(appDeviceAdds, null); //导入excel - Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDevicAddDTOs); + Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDeviceAddDTOs); //写入 workbook.write(out); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception ex) { + ex.printStackTrace(); } } + + + @Override + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + FileInputStream is = null; + BufferedOutputStream out = null; + String zipPath = ""; + try { + response.reset(); + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/zip;charset=utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("设备安装基础信息表.zip", StandardCharsets.UTF_8.name())); + response.setHeader("Access-Control-Allow-Origin", "*"); + System.out.println(response.getHeader("Content-Disposition")); + ZipUtils zipUtils = new ZipUtils(); + zipPath = zipUtils.zipFileCreator(filePath, recentDir); + //开始下载 + is = new FileInputStream(new File(zipPath)); + out = new BufferedOutputStream(response.getOutputStream()); + byte[] buff = new byte[1024]; + int len = 0; + while ((len = is.read(buff, 0, buff.length)) != -1) { + out.write(buff, 0, len); + } + out.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + try { + out.close(); + if (StringUtils.isNotEmpty(zipPath)) { + new ZipUtils().zipFileDeletor(zipPath); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + + @Override + public Page batchLogs(String begTime, String endTime, Page page) { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.le(StringUtils.isNotEmpty(begTime), "create_time", begTime) + .or().ge(StringUtils.isNotEmpty(endTime), "create_time", endTime); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")); + List batchExportLogs = this.batchExportLogMapper.selectPage(page, batchEntityWrapper); + page.setRecords(batchExportLogs); + return page; + } + + + private BatchExportLog createBatchFileLogs(Long currentUserId, String partitionNumber, String fileName, String fileDir) { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setPartitionNumber(partitionNumber); + batchExportLog.setCreateUserId(currentUserId); + batchExportLog.setFileDir(fileDir + File.separator); + batchExportLog.setTaskId(0); + batchExportLog.setFileName(fileName); + return batchExportLog; + } + + @Override + public Integer getStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.where("create_time>date_add(now(), interval -1 hour) "); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + return optionalBatchExportLog.isPresent() ? optionalBatchExportLog.get().getTaskId() : null; + } + + private void setStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + if (optionalBatchExportLog.isPresent()) { + optionalBatchExportLog.get().setTaskId(1); + this.batchExportLogMapper.updateById(optionalBatchExportLog.get()); + } else { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setTaskId(1); + this.batchExportLogMapper.insert(batchExportLog); + } + } + + /** + * 获取分批次要导出的目录列表 + * + * @return + */ + private int getBatchNumberPostIndex(List appDeviceAdds, int appDeviceAddsIndex) { + int postIndex = 0; + if (appDeviceAddsIndex + batchNumber > appDeviceAdds.size()) { + postIndex = appDeviceAdds.size(); + } else { + postIndex = appDeviceAddsIndex + batchNumber; + } + return postIndex; + } + + /** + * 创建文件目录 + */ + private void setLocalFileDir(String tempLocalFileDir) { + File file = new File(tempLocalFileDir); + if (!file.exists()) { + file.mkdirs(); + } + } + } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java new file mode 100644 index 0000000..cf9307c --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java @@ -0,0 +1,47 @@ +package com.casic.missiles.modular.app.util; + +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.casic.missiles.modular.app.dto.AppDevicAddDTO; +import com.casic.missiles.modular.app.model.AppDeviceAdd; +import org.apache.poi.ss.usermodel.Workbook; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +public class ExportExcelUtil { + /** + * 导出文件主要内容 + */ + public void fileExport(List appDeviceBatchList, String currentFileName,String photoPath) { + FileOutputStream fileOutputStream = null; + try { + fileOutputStream = new FileOutputStream(currentFileName); + //设置excel参数 + ExportParams params = new ExportParams(); + //设置sheet名名称 + params.setSheetName("设备安装信息"); + //设置标题 + params.setTitle("设备安装信息"); + //转成对应的类型;要不然会报错,虽然也可以导出成功 + List AppDeviceAddDTOs = AppDevicAddDTO.convert(appDeviceBatchList, photoPath); + //导入excel + Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDeviceAddDTOs); + workbook.write(fileOutputStream); + fileOutputStream.flush(); + } catch (Exception e) { + + } finally { + if (fileOutputStream != null) { + try { + fileOutputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java new file mode 100644 index 0000000..50f24dc --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java @@ -0,0 +1,101 @@ +package com.casic.missiles.modular.app.util; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets =new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value="userId")String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId+"【websocket消息】有新的连接,总数为:"+webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:"+webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:"+message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for(WebSocket webSocket : webSockets) { + System.out.println("【websocket消息】广播消息:"+message); + try { + webSocket.session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + // 发送列表消息 + public void sendListMessage(List userIds, String message){ + System.out.println("【websocket消息】列表消息:"+message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 发送列表消息 + +// public void sendListMessage(List userIds, Object data){ +// System.out.println("【websocket消息】列表消息:"+data); +// for (String userId : userIds) { +// Session session = sessionPool.get(userId); +// if (session != null) { +// try { +//// session.getAsyncRemote().sendText(message); +// session.getAsyncRemote().sendObject(data); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:"+message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java new file mode 100644 index 0000000..ea267bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java @@ -0,0 +1,84 @@ +package com.casic.missiles.modular.app.util; + + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * @author zhouxuan + * @since 2019/4/19 + */ +public class ZipUtils { + + /** + * 批量打包 + * + * @param downloadPath 项目根目录 + * @return tempDir 文件保存绝对路径 + */ + public String zipFileCreator(String downloadPath,String tempDir) { + ZipOutputStream out = null; + try { + //生成打包下载后的zip文件:Papers.zip + String papersZipName = "设备安装基础信息表.zip"; + //zip文件保存路径 + String zipPath = downloadPath + papersZipName; + String fileSaveRootPath=downloadPath+File.separator+tempDir; + File file = new File(fileSaveRootPath); + File[] files = file.listFiles(); + out = new ZipOutputStream(new FileOutputStream(zipPath)); + //遍历jsonArray列表获取所有JSONObject对象 + for (int i = 0; i < files.length; i++) { + //以论文标题为每个文件命名 + FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); + out.putNextEntry(new ZipEntry(files[i].getName())); + //写入压缩包 + int len; + byte[] buffer = new byte[1024]; + while ((len = fis.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + out.closeEntry(); + fis.close(); + } + out.close(); + out.flush(); + return zipPath; + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + + /** + * 批量打包 + * + * @param zipPath zip路径 + * @return zip文件保存绝对路径 + */ + public void zipFileDeletor(String zipPath) { + try { + File zipFile=new File(zipPath); + zipFile.delete(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java index 59b2097..5ab81c7 100644 --- a/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java +++ b/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -10,9 +10,12 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletResponse; +import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; /** * 控制器 @@ -31,41 +34,56 @@ * 文件模板下载 */ @GetMapping("/template/download") - public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) - throws ServletException, IOException { + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) throws IOException { logger.info(downloadPath); - if (downloadPath.startsWith("/")) { - downloadPath = downloadPath.substring(1); + String tempDownloadPath=downloadPath; + if (tempDownloadPath.startsWith("/")) { + tempDownloadPath = tempDownloadPath.substring(1); } - File file = new File(downloadPath, filename); + + File file = new File(tempDownloadPath, filename); // 获取文件名 String fileName = null; - if (filename.contains("/")) { - fileName = filename.substring(filename.lastIndexOf("/") + 1); + if (filename.contains(File.separator)) { + fileName = filename.substring(filename.lastIndexOf(File.separator) + 1); } else { fileName = filename; } // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 response.setContentType("application/octet-stream"); - response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setCharacterEncoding("UTF-8"); + response.addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, StandardCharsets.UTF_8.name())); response.setContentLength((int) file.length()); - + BufferedOutputStream out = null; FileInputStream fis = null; try { + out = new BufferedOutputStream(response.getOutputStream()); fis = new FileInputStream(file); byte[] buffer = new byte[1024]; int readTmp = 0; while ((readTmp = fis.read(buffer)) != -1) { - response.getOutputStream().write(buffer, 0, readTmp); + out.write(buffer, 0, readTmp); } + out.flush(); } catch (Exception e) { logger.info(e.getMessage()); e.printStackTrace(); } finally { - response.getOutputStream().flush(); - response.getOutputStream().close(); - fis.close(); + if (out != null) { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } } } } diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 0faf332..9b9943a 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -288,10 +288,13 @@ - src/main/webapp - - src/main/resources + + + /config/*/* + /config/*-*.yml + + true src/main/java diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java index 0b0c3fb..47a8b06 100644 --- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -1,5 +1,7 @@ package com.casic.missiles; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; @@ -23,7 +25,6 @@ public static void main(String[] args){ SpringApplication.run(CasicApplication.class, args); logger.info("GunsApplication is success!"); - } } @@ -33,3 +34,4 @@ + diff --git a/casic-web/src/main/java/com/casic/missiles/controller/MockController.java b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java index a8285e8..3cebcd0 100644 --- a/casic-web/src/main/java/com/casic/missiles/controller/MockController.java +++ b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java @@ -46,7 +46,7 @@ SuccessResponseData resultData = new SuccessResponseData(); if (ToolUtil.isOneEmpty(username, password)) { username = "admin"; - password = "1111111a"; + password = "casic203"; } Subject currentUser = ShiroKit.getSubject(); diff --git a/casic-web/src/main/resources/application-dev.yml b/casic-web/src/main/resources/application-dev.yml new file mode 100644 index 0000000..59163c7 --- /dev/null +++ b/casic-web/src/main/resources/application-dev.yml @@ -0,0 +1,31 @@ +server: + port: 5905 + + maxPostSize: -1 + maxHttpHeaderSize: 102400 +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://139.198.18.188:3306/product_device?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: pcroot + password: pcroot#203 + initial-size: 2 + min-idle: 1 +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken,/process/processDiagram,/appDeviceLog/listPage,/appDeviceAdd/add,/appDeviceLog/deviceDetail,/appDeviceLog/add,/appDeviceAdd/fileUpload,/appDeviceAdd/findListByCodes,/appDeviceAdd/findModeCodeByCode,/deviceType/getUser,/project/getProject,/appDeviceLog/deletePhoto,/deviceType/deviceType,/productRepairRecords/add,/appDeviceAdd/fileUploadMarker,/appDeviceAdd/getDevTypeLength,/appDeviceAdd/delete,/appUserOpenid/login,/appUserOpenid/add,/appUserOpenid/validate,/appDeviceAdd/getWellTypeList,/appDeviceAdd/*,/websocket/*,/template/download + file-upload-path: D:\casic\tmp\ + file-download-path: D:\casic\tmp\ + producerName: producer + repairName: repair + wxUrl: https://api.weixin.qq.com/sns/jscode2session #获取微信openid + appid: wx8f4b331065a9ac2e #微信小程序开发appid + secret: 335847f265b3875804c8f8de4231730b #微信小程序开发密钥 + photoPath: https://logapi.smartlog.work/static/ #导出照片位置存放目录 +logging: + level.root: info + level.com.casic: debug + path: logs/ + file: missiles.log + diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java new file mode 100644 index 0000000..e9f04bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.app.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java index 1fe427f..cbfaa4d 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java @@ -11,15 +11,17 @@ import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dto.SelectDTO; -import com.casic.missiles.modular.app.enums.DeviceBaseExportEnum; import com.casic.missiles.modular.app.model.AppDeviceAdd; import com.casic.missiles.modular.app.model.AppDeviceLog; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; import com.casic.missiles.modular.app.service.IAppDeviceLogService; import com.casic.missiles.modular.app.util.LonlatConver; import com.casic.missiles.modular.system.model.Dict; import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @@ -30,8 +32,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; import java.util.stream.Collectors; /** @@ -54,6 +55,9 @@ @Resource private ICommonPermissionService permissionService; + @Value("${casic.photoPath}") + private String photoPath; + /** * 获取施工添加设备列表 */ @@ -164,7 +168,6 @@ // @ResponseBody // public Object imageBase64Upload(@RequestBody(required =false) String fileBase64) throws IOException { // return ResponseData.success(commonFileService.saveFileBase64Image(fileBase64)); -// // } @RequestMapping({"/getWellTypeList"}) @@ -240,32 +243,49 @@ //照片一起导出 - @RequestMapping(value = "/listExp") - public void listExps(String devcode, String devtype, - String begTime, String endTime, - String project, String installPerson, - HttpServletResponse response) throws IOException { + @RequestMapping(value = "/image/listExp") + @ResponseBody + public Object listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson) { + List dictList = permissionService.findInDictByCode("sluicewellType"); - List list = appDeviceAddService.reportExport(devcode, devtype, - begTime, endTime, project, installPerson); + Map sluiceWellDictMap = dictList.stream() + .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); + Integer taskId = appDeviceAddService.getStartTask(); + if (null == taskId || taskId != 1) { + Long currentUserId = permissionService.getCurrLoginUser().getId(); + ExecutorService executor = Executors.newFixedThreadPool(1); + executor.execute(() -> appDeviceAddService.exportImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, currentUserId)); + return ResponseData.success("执行成功,请稍等..."); + } else { + return ResponseData.error("有任务正在执行,请稍等!"); + } + } + + + @RequestMapping(value = "/listExp") + @ResponseBody + public void listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { List dictList = permissionService.findInDictByCode("sluicewellType"); Map sluiceWellDictMap = dictList.stream() .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); - list.forEach(appDeviceAdd -> { - appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); - }); - ExecutorService cachedExecutorService = Executors.newCachedThreadPool(); - cachedExecutorService.execute(new Runnable() { - @Override - public void run() { - appDeviceAddService.exportUsersToExcel(list, response); - } - }); -// List res = new ArrayList<>(); -// res.addAll(list); -// //获取导出文件header -// super.exportExcel(DeviceBaseExportEnum.DeviceBase_EXPORT, res); + appDeviceAddService.exportNotImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, response); } + @RequestMapping(value = "/batch/logs") + @ResponseBody + public Object batchLogs(String begTime, String endTime) { + Page page = new PageFactory().defaultPage(); + return ResponseData.success(super.packForBT(appDeviceAddService.batchLogs(begTime, endTime, page))); + } + + @CrossOrigin + @RequestMapping(value = "/batchzip") + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + appDeviceAddService.batchDownloadFiles(recentDir, response); + } } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java new file mode 100644 index 0000000..b741f4e --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.modular.app.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.app.model.BatchExportLog; + +public interface BatchExportLogMapper extends BaseMapper { + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java index 6ed5d35..9acca94 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java @@ -1,11 +1,11 @@ package com.casic.missiles.modular.app.dto; import cn.afterturn.easypoi.excel.annotation.Excel; +import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.model.AppDeviceAdd; import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; +import org.apache.commons.lang3.StringUtils; import java.io.Serializable; import java.util.ArrayList; @@ -33,7 +33,7 @@ private String installheigt; @Excel(name = "负责人", width = 10.0) private String installperson; - @Excel(name = "安装时间", format = "yyyy-MM-dd",width = 10.0) + @Excel(name = "安装时间", format = "yyyy-MM-dd", width = 10.0) private Date installtime; @Excel(name = "照片1", type = 2, width = 20.0, height = 60.0, imageType = 1) private String photopath1; @@ -61,16 +61,16 @@ private String latitude84; - public static List convert (List appDeviceAdds,String photoPath) { + public static List convert(List appDeviceAdds, String photoPath) { List appDevicAddDTOS = new ArrayList<>(); appDeviceAdds.forEach(appDeviceAdd -> { - appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd,photoPath)); + appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd, photoPath)); }); return appDevicAddDTOS; } - public AppDevicAddDTO(AppDeviceAdd appDeviceAdd,String photoPath) { + public AppDevicAddDTO(AppDeviceAdd appDeviceAdd, String photoPath) { this.devcode = appDeviceAdd.getDevcode(); this.devicetype = appDeviceAdd.getDevicetype(); this.wellcode = appDeviceAdd.getWellcode(); @@ -80,9 +80,12 @@ this.installheigt = appDeviceAdd.getInstallheigt(); this.installperson = appDeviceAdd.getInstallperson(); this.installtime = appDeviceAdd.getInstalltime(); - this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1())?photoPath+appDeviceAdd.getPhotopath1():appDeviceAdd.getPhotopath1(); - this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2())?photoPath+appDeviceAdd.getPhotopath2():appDeviceAdd.getPhotopath2(); - this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3())?photoPath+appDeviceAdd.getPhotopath3():appDeviceAdd.getPhotopath3(); +// && this.installtime.getTime()>=DateUtil.parseDate("2023-04-01").getTime() + if (StringUtils.isNotEmpty(photoPath) ) { + this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1()) ? photoPath + appDeviceAdd.getPhotopath1() : appDeviceAdd.getPhotopath1(); + this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2()) ? photoPath + appDeviceAdd.getPhotopath2() : appDeviceAdd.getPhotopath2(); + this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3()) ? photoPath + appDeviceAdd.getPhotopath3() : appDeviceAdd.getPhotopath3(); + } this.project = appDeviceAdd.getProject(); this.position = appDeviceAdd.getPosition(); this.description = appDeviceAdd.getDescription(); diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java new file mode 100644 index 0000000..a8701e5 --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.app.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cz + */ +@Data +@TableName("batch_export_log") +public class BatchExportLog extends Model { + + private static final long serialVersionUID = 1L; + + @TableId("id") + private Long id; + @TableField("file_name") + private String fileName; + @TableField("file_dir") + private String fileDir; + @TableField("partition_number") + private String partitionNumber; + @TableField("create_time") + private String createTime; + @TableField("create_user_id") + private Long createUserId; + @TableField("task_id") + private int taskId; + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java index 96bd6fb..a8921c5 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java @@ -1,16 +1,19 @@ package com.casic.missiles.modular.app.service; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; +import java.util.Map; /** *

- * 服务类 + * 服务类 *

* * @author stylefeng123 @@ -18,13 +21,33 @@ */ public interface IAppDeviceAddService extends IService { - List getAppDevice(String devcode); + List getAppDevice(String devcode); + String saveFile(MultipartFile var1) throws IOException; - String fileUploadMarker(MultipartFile var1,String text) throws IOException; + + String fileUploadMarker(MultipartFile var1, String text) throws IOException; + String findModeCodeByCode(String devcode); + List reportExport(String devcode, String devtype, String begTime, String endTime, String project, String installPerson); + void convert84(); - void exportUsersToExcel(List list, HttpServletResponse response); + + void exportImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId); + + void exportNotImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson,HttpServletResponse response); + + void batchDownloadFiles(String recentDir,HttpServletResponse response); + + Integer getStartTask(); + + Page batchLogs(String begTime, String endTime, Page page); } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java index 69f2254..7c2865f 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java @@ -2,32 +2,41 @@ import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dao.AppDeviceAddMapper; +import com.casic.missiles.modular.app.dao.BatchExportLogMapper; import com.casic.missiles.modular.app.dto.AppDevicAddDTO; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; -import com.casic.missiles.modular.app.util.LonlatConver; -import com.casic.missiles.modular.app.util.PhotoUtils; +import com.casic.missiles.modular.app.util.*; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.ListUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.management.Query; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.awt.*; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.*; import java.util.List; -import java.util.UUID; +import java.util.concurrent.*; /** *

@@ -38,12 +47,21 @@ * @since 2020-05-24 */ @Service +@Slf4j public class AppDeviceAddServiceImpl extends ServiceImpl implements IAppDeviceAddService { + @Value("${casic.file-upload-path}") private String filePath; @Value("${casic.photoPath}") private String photoPath; + @Value("${casic.batchNumber}") + private Integer batchNumber; + @Autowired + private BatchExportLogMapper batchExportLogMapper; + @Autowired + private WebSocket webSocket; + @Override public List getAppDevice(String devcode) { @@ -127,7 +145,6 @@ EntityWrapper query = new EntityWrapper<>(); query.le("id", 5241); List appDeviceAddList = selectList(query); - for (AppDeviceAdd appDeviceAdd : appDeviceAddList) { if (ToolUtil.isNotEmpty(appDeviceAdd.getLongitude()) && ToolUtil.isNotEmpty(appDeviceAdd.getLatitude())) { @@ -141,12 +158,115 @@ } + @Override + public void exportImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); + Long stampeDir = System.currentTimeMillis(); + //以当前时间戳为目录 + String currentStampDir = filePath + stampeDir + File.separator; + setLocalFileDir(currentStampDir); + List batchExportLogsList = new ArrayList<>(); + try { + setStartTask(); + ExecutorService executor = Executors.newFixedThreadPool(10); + for (int appDeviceAddsIndex = 0; appDeviceAddsIndex < appDeviceAdds.size(); appDeviceAddsIndex += batchNumber) { + int postIndex = getBatchNumberPostIndex(appDeviceAdds, appDeviceAddsIndex); + List appDeviceBatchList = appDeviceAdds.subList(appDeviceAddsIndex, postIndex); + String partitionNumber = appDeviceAddsIndex + "-" + postIndex; + String fileName = "设备安装基础信息表" + partitionNumber + ".xls"; + String currentFileName = currentStampDir + fileName; + Runnable task = new Runnable() { + @Override + public void run() { + ExportExcelUtil exportExcelUtil = new ExportExcelUtil(); + exportExcelUtil.fileExport(appDeviceBatchList, currentFileName, photoPath); + } + }; + executor.submit(task); + batchExportLogsList.add(createBatchFileLogs(currentUserId, partitionNumber, fileName, String.valueOf(stampeDir))); + } + while (true) { + Long activeCount = ((ThreadPoolExecutor) executor).getTaskCount() - ((ThreadPoolExecutor) executor).getCompletedTaskCount(); + if (activeCount == 0) { + //删除所有的文件日志 + this.batchExportLogMapper.delete(null); + //删除所有历史文件 + deleteFile(new File(filePath),String.valueOf(stampeDir)); + //批量导入日志 + batchExportLogsList.stream().forEach( + batchExportLog -> this.batchExportLogMapper.insert(batchExportLog) + ); + System.out.println("所有的子线程都结束了!"); + List userList = new ArrayList<>(); + userList.add(String.valueOf(currentUserId)); + Map map = new HashMap(); + map.put("message", "你在" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(stampeDir)) + "的文件导出已经生成了,请到导出列表页面查看"); + map.put("type", "alarm"); + for (int i = 0; i < 3; i++) { + webSocket.sendListMessage(userList, JSON.toJSONString(map)); + Thread.sleep(3000); + } + break; + } + Thread.sleep(5000); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + /** + * 对导出产生的日志、进行清除,还原空间 + */ + private void deleteFile(File invalidFile,String currentFileStr) { + //为当前文件目录删除 + if(invalidFile.getAbsoluteFile().getName().equals(currentFileStr)){ + return; + } + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + if (!invalidFile.getAbsolutePath().equals(filePath.substring(0,filePath.length()-1))) { + //删除子文件 + files[i].delete(); + } + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i],currentFileStr); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + if (!invalidFile.getAbsolutePath().equals(filePath)) { + //删除子目录 + if (invalidFile != null && invalidFile.isDirectory()) { + invalidFile.delete(); + } + } + } @Override - public void exportUsersToExcel(List list,HttpServletResponse response) { - + public void exportNotImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); try { - //设置信息头,告诉浏览器内容为excel类型 response.setHeader("content-Type", "application/vnd.ms-excel"); //设置下载名称 @@ -160,16 +280,137 @@ params.setSheetName("设备安装信息"); //设置标题 params.setTitle("设备安装信息"); - //转成对应的类型;要不然会报错,虽然也可以导出成功 - List AppDevicAddDTOs = AppDevicAddDTO.convert(list,photoPath); - + List AppDeviceAddDTOs = AppDevicAddDTO.convert(appDeviceAdds, null); //导入excel - Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDevicAddDTOs); + Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDeviceAddDTOs); //写入 workbook.write(out); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception ex) { + ex.printStackTrace(); } } + + + @Override + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + FileInputStream is = null; + BufferedOutputStream out = null; + String zipPath = ""; + try { + response.reset(); + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/zip;charset=utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("设备安装基础信息表.zip", StandardCharsets.UTF_8.name())); + response.setHeader("Access-Control-Allow-Origin", "*"); + System.out.println(response.getHeader("Content-Disposition")); + ZipUtils zipUtils = new ZipUtils(); + zipPath = zipUtils.zipFileCreator(filePath, recentDir); + //开始下载 + is = new FileInputStream(new File(zipPath)); + out = new BufferedOutputStream(response.getOutputStream()); + byte[] buff = new byte[1024]; + int len = 0; + while ((len = is.read(buff, 0, buff.length)) != -1) { + out.write(buff, 0, len); + } + out.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + try { + out.close(); + if (StringUtils.isNotEmpty(zipPath)) { + new ZipUtils().zipFileDeletor(zipPath); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + + @Override + public Page batchLogs(String begTime, String endTime, Page page) { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.le(StringUtils.isNotEmpty(begTime), "create_time", begTime) + .or().ge(StringUtils.isNotEmpty(endTime), "create_time", endTime); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")); + List batchExportLogs = this.batchExportLogMapper.selectPage(page, batchEntityWrapper); + page.setRecords(batchExportLogs); + return page; + } + + + private BatchExportLog createBatchFileLogs(Long currentUserId, String partitionNumber, String fileName, String fileDir) { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setPartitionNumber(partitionNumber); + batchExportLog.setCreateUserId(currentUserId); + batchExportLog.setFileDir(fileDir + File.separator); + batchExportLog.setTaskId(0); + batchExportLog.setFileName(fileName); + return batchExportLog; + } + + @Override + public Integer getStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.where("create_time>date_add(now(), interval -1 hour) "); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + return optionalBatchExportLog.isPresent() ? optionalBatchExportLog.get().getTaskId() : null; + } + + private void setStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + if (optionalBatchExportLog.isPresent()) { + optionalBatchExportLog.get().setTaskId(1); + this.batchExportLogMapper.updateById(optionalBatchExportLog.get()); + } else { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setTaskId(1); + this.batchExportLogMapper.insert(batchExportLog); + } + } + + /** + * 获取分批次要导出的目录列表 + * + * @return + */ + private int getBatchNumberPostIndex(List appDeviceAdds, int appDeviceAddsIndex) { + int postIndex = 0; + if (appDeviceAddsIndex + batchNumber > appDeviceAdds.size()) { + postIndex = appDeviceAdds.size(); + } else { + postIndex = appDeviceAddsIndex + batchNumber; + } + return postIndex; + } + + /** + * 创建文件目录 + */ + private void setLocalFileDir(String tempLocalFileDir) { + File file = new File(tempLocalFileDir); + if (!file.exists()) { + file.mkdirs(); + } + } + } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java new file mode 100644 index 0000000..cf9307c --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java @@ -0,0 +1,47 @@ +package com.casic.missiles.modular.app.util; + +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.casic.missiles.modular.app.dto.AppDevicAddDTO; +import com.casic.missiles.modular.app.model.AppDeviceAdd; +import org.apache.poi.ss.usermodel.Workbook; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +public class ExportExcelUtil { + /** + * 导出文件主要内容 + */ + public void fileExport(List appDeviceBatchList, String currentFileName,String photoPath) { + FileOutputStream fileOutputStream = null; + try { + fileOutputStream = new FileOutputStream(currentFileName); + //设置excel参数 + ExportParams params = new ExportParams(); + //设置sheet名名称 + params.setSheetName("设备安装信息"); + //设置标题 + params.setTitle("设备安装信息"); + //转成对应的类型;要不然会报错,虽然也可以导出成功 + List AppDeviceAddDTOs = AppDevicAddDTO.convert(appDeviceBatchList, photoPath); + //导入excel + Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDeviceAddDTOs); + workbook.write(fileOutputStream); + fileOutputStream.flush(); + } catch (Exception e) { + + } finally { + if (fileOutputStream != null) { + try { + fileOutputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java new file mode 100644 index 0000000..50f24dc --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java @@ -0,0 +1,101 @@ +package com.casic.missiles.modular.app.util; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets =new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value="userId")String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId+"【websocket消息】有新的连接,总数为:"+webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:"+webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:"+message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for(WebSocket webSocket : webSockets) { + System.out.println("【websocket消息】广播消息:"+message); + try { + webSocket.session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + // 发送列表消息 + public void sendListMessage(List userIds, String message){ + System.out.println("【websocket消息】列表消息:"+message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 发送列表消息 + +// public void sendListMessage(List userIds, Object data){ +// System.out.println("【websocket消息】列表消息:"+data); +// for (String userId : userIds) { +// Session session = sessionPool.get(userId); +// if (session != null) { +// try { +//// session.getAsyncRemote().sendText(message); +// session.getAsyncRemote().sendObject(data); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:"+message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java new file mode 100644 index 0000000..ea267bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java @@ -0,0 +1,84 @@ +package com.casic.missiles.modular.app.util; + + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * @author zhouxuan + * @since 2019/4/19 + */ +public class ZipUtils { + + /** + * 批量打包 + * + * @param downloadPath 项目根目录 + * @return tempDir 文件保存绝对路径 + */ + public String zipFileCreator(String downloadPath,String tempDir) { + ZipOutputStream out = null; + try { + //生成打包下载后的zip文件:Papers.zip + String papersZipName = "设备安装基础信息表.zip"; + //zip文件保存路径 + String zipPath = downloadPath + papersZipName; + String fileSaveRootPath=downloadPath+File.separator+tempDir; + File file = new File(fileSaveRootPath); + File[] files = file.listFiles(); + out = new ZipOutputStream(new FileOutputStream(zipPath)); + //遍历jsonArray列表获取所有JSONObject对象 + for (int i = 0; i < files.length; i++) { + //以论文标题为每个文件命名 + FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); + out.putNextEntry(new ZipEntry(files[i].getName())); + //写入压缩包 + int len; + byte[] buffer = new byte[1024]; + while ((len = fis.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + out.closeEntry(); + fis.close(); + } + out.close(); + out.flush(); + return zipPath; + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + + /** + * 批量打包 + * + * @param zipPath zip路径 + * @return zip文件保存绝对路径 + */ + public void zipFileDeletor(String zipPath) { + try { + File zipFile=new File(zipPath); + zipFile.delete(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java index 59b2097..5ab81c7 100644 --- a/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java +++ b/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -10,9 +10,12 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletResponse; +import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; /** * 控制器 @@ -31,41 +34,56 @@ * 文件模板下载 */ @GetMapping("/template/download") - public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) - throws ServletException, IOException { + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) throws IOException { logger.info(downloadPath); - if (downloadPath.startsWith("/")) { - downloadPath = downloadPath.substring(1); + String tempDownloadPath=downloadPath; + if (tempDownloadPath.startsWith("/")) { + tempDownloadPath = tempDownloadPath.substring(1); } - File file = new File(downloadPath, filename); + + File file = new File(tempDownloadPath, filename); // 获取文件名 String fileName = null; - if (filename.contains("/")) { - fileName = filename.substring(filename.lastIndexOf("/") + 1); + if (filename.contains(File.separator)) { + fileName = filename.substring(filename.lastIndexOf(File.separator) + 1); } else { fileName = filename; } // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 response.setContentType("application/octet-stream"); - response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setCharacterEncoding("UTF-8"); + response.addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, StandardCharsets.UTF_8.name())); response.setContentLength((int) file.length()); - + BufferedOutputStream out = null; FileInputStream fis = null; try { + out = new BufferedOutputStream(response.getOutputStream()); fis = new FileInputStream(file); byte[] buffer = new byte[1024]; int readTmp = 0; while ((readTmp = fis.read(buffer)) != -1) { - response.getOutputStream().write(buffer, 0, readTmp); + out.write(buffer, 0, readTmp); } + out.flush(); } catch (Exception e) { logger.info(e.getMessage()); e.printStackTrace(); } finally { - response.getOutputStream().flush(); - response.getOutputStream().close(); - fis.close(); + if (out != null) { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } } } } diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 0faf332..9b9943a 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -288,10 +288,13 @@ - src/main/webapp - - src/main/resources + + + /config/*/* + /config/*-*.yml + + true src/main/java diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java index 0b0c3fb..47a8b06 100644 --- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -1,5 +1,7 @@ package com.casic.missiles; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; @@ -23,7 +25,6 @@ public static void main(String[] args){ SpringApplication.run(CasicApplication.class, args); logger.info("GunsApplication is success!"); - } } @@ -33,3 +34,4 @@ + diff --git a/casic-web/src/main/java/com/casic/missiles/controller/MockController.java b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java index a8285e8..3cebcd0 100644 --- a/casic-web/src/main/java/com/casic/missiles/controller/MockController.java +++ b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java @@ -46,7 +46,7 @@ SuccessResponseData resultData = new SuccessResponseData(); if (ToolUtil.isOneEmpty(username, password)) { username = "admin"; - password = "1111111a"; + password = "casic203"; } Subject currentUser = ShiroKit.getSubject(); diff --git a/casic-web/src/main/resources/application-dev.yml b/casic-web/src/main/resources/application-dev.yml new file mode 100644 index 0000000..59163c7 --- /dev/null +++ b/casic-web/src/main/resources/application-dev.yml @@ -0,0 +1,31 @@ +server: + port: 5905 + + maxPostSize: -1 + maxHttpHeaderSize: 102400 +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://139.198.18.188:3306/product_device?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: pcroot + password: pcroot#203 + initial-size: 2 + min-idle: 1 +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken,/process/processDiagram,/appDeviceLog/listPage,/appDeviceAdd/add,/appDeviceLog/deviceDetail,/appDeviceLog/add,/appDeviceAdd/fileUpload,/appDeviceAdd/findListByCodes,/appDeviceAdd/findModeCodeByCode,/deviceType/getUser,/project/getProject,/appDeviceLog/deletePhoto,/deviceType/deviceType,/productRepairRecords/add,/appDeviceAdd/fileUploadMarker,/appDeviceAdd/getDevTypeLength,/appDeviceAdd/delete,/appUserOpenid/login,/appUserOpenid/add,/appUserOpenid/validate,/appDeviceAdd/getWellTypeList,/appDeviceAdd/*,/websocket/*,/template/download + file-upload-path: D:\casic\tmp\ + file-download-path: D:\casic\tmp\ + producerName: producer + repairName: repair + wxUrl: https://api.weixin.qq.com/sns/jscode2session #获取微信openid + appid: wx8f4b331065a9ac2e #微信小程序开发appid + secret: 335847f265b3875804c8f8de4231730b #微信小程序开发密钥 + photoPath: https://logapi.smartlog.work/static/ #导出照片位置存放目录 +logging: + level.root: info + level.com.casic: debug + path: logs/ + file: missiles.log + diff --git a/casic-web/src/main/resources/application.yml b/casic-web/src/main/resources/application.yml index c85523d..288c7e1 100644 --- a/casic-web/src/main/resources/application.yml +++ b/casic-web/src/main/resources/application.yml @@ -3,7 +3,7 @@ ########################################################## spring: profiles: - active: @activatedProperties@ + active: dev datasource: driver-class-name: com.mysql.jdbc.Driver jms: @@ -15,4 +15,5 @@ casic: kaptcha-open: true #是否开启登录时验证码 (true/false) file-upload-path: d:/tmp #文件上传目录(不配置的话为java.io.tmpdir目录) + batchNumber: 200 nologin-urls: /user/login,/kaptcha,/config/baseConfig,/appDeviceLog/listPage \ No newline at end of file diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java new file mode 100644 index 0000000..e9f04bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/config/WebSocketConfig.java @@ -0,0 +1,18 @@ +package com.casic.missiles.modular.app.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +// tomcat启动无需配置 +@Configuration +public class WebSocketConfig { + /** + * 注入ServerEndpointExporter, + * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint + */ + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java index 1fe427f..cbfaa4d 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/controller/AppDeviceAddController.java @@ -11,15 +11,17 @@ import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dto.SelectDTO; -import com.casic.missiles.modular.app.enums.DeviceBaseExportEnum; import com.casic.missiles.modular.app.model.AppDeviceAdd; import com.casic.missiles.modular.app.model.AppDeviceLog; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; import com.casic.missiles.modular.app.service.IAppDeviceLogService; import com.casic.missiles.modular.app.util.LonlatConver; import com.casic.missiles.modular.system.model.Dict; import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @@ -30,8 +32,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; import java.util.stream.Collectors; /** @@ -54,6 +55,9 @@ @Resource private ICommonPermissionService permissionService; + @Value("${casic.photoPath}") + private String photoPath; + /** * 获取施工添加设备列表 */ @@ -164,7 +168,6 @@ // @ResponseBody // public Object imageBase64Upload(@RequestBody(required =false) String fileBase64) throws IOException { // return ResponseData.success(commonFileService.saveFileBase64Image(fileBase64)); -// // } @RequestMapping({"/getWellTypeList"}) @@ -240,32 +243,49 @@ //照片一起导出 - @RequestMapping(value = "/listExp") - public void listExps(String devcode, String devtype, - String begTime, String endTime, - String project, String installPerson, - HttpServletResponse response) throws IOException { + @RequestMapping(value = "/image/listExp") + @ResponseBody + public Object listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson) { + List dictList = permissionService.findInDictByCode("sluicewellType"); - List list = appDeviceAddService.reportExport(devcode, devtype, - begTime, endTime, project, installPerson); + Map sluiceWellDictMap = dictList.stream() + .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); + Integer taskId = appDeviceAddService.getStartTask(); + if (null == taskId || taskId != 1) { + Long currentUserId = permissionService.getCurrLoginUser().getId(); + ExecutorService executor = Executors.newFixedThreadPool(1); + executor.execute(() -> appDeviceAddService.exportImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, currentUserId)); + return ResponseData.success("执行成功,请稍等..."); + } else { + return ResponseData.error("有任务正在执行,请稍等!"); + } + } + + + @RequestMapping(value = "/listExp") + @ResponseBody + public void listExps(String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { List dictList = permissionService.findInDictByCode("sluicewellType"); Map sluiceWellDictMap = dictList.stream() .collect(Collectors.toMap(e -> e.getCode(), e -> e.getName())); - list.forEach(appDeviceAdd -> { - appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); - }); - ExecutorService cachedExecutorService = Executors.newCachedThreadPool(); - cachedExecutorService.execute(new Runnable() { - @Override - public void run() { - appDeviceAddService.exportUsersToExcel(list, response); - } - }); -// List res = new ArrayList<>(); -// res.addAll(list); -// //获取导出文件header -// super.exportExcel(DeviceBaseExportEnum.DeviceBase_EXPORT, res); + appDeviceAddService.exportNotImageExcel(sluiceWellDictMap, devcode, devtype, begTime, endTime, project, installPerson, response); } + @RequestMapping(value = "/batch/logs") + @ResponseBody + public Object batchLogs(String begTime, String endTime) { + Page page = new PageFactory().defaultPage(); + return ResponseData.success(super.packForBT(appDeviceAddService.batchLogs(begTime, endTime, page))); + } + + @CrossOrigin + @RequestMapping(value = "/batchzip") + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + appDeviceAddService.batchDownloadFiles(recentDir, response); + } } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java new file mode 100644 index 0000000..b741f4e --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dao/BatchExportLogMapper.java @@ -0,0 +1,8 @@ +package com.casic.missiles.modular.app.dao; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.casic.missiles.modular.app.model.BatchExportLog; + +public interface BatchExportLogMapper extends BaseMapper { + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java index 6ed5d35..9acca94 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/dto/AppDevicAddDTO.java @@ -1,11 +1,11 @@ package com.casic.missiles.modular.app.dto; import cn.afterturn.easypoi.excel.annotation.Excel; +import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.model.AppDeviceAdd; import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; +import org.apache.commons.lang3.StringUtils; import java.io.Serializable; import java.util.ArrayList; @@ -33,7 +33,7 @@ private String installheigt; @Excel(name = "负责人", width = 10.0) private String installperson; - @Excel(name = "安装时间", format = "yyyy-MM-dd",width = 10.0) + @Excel(name = "安装时间", format = "yyyy-MM-dd", width = 10.0) private Date installtime; @Excel(name = "照片1", type = 2, width = 20.0, height = 60.0, imageType = 1) private String photopath1; @@ -61,16 +61,16 @@ private String latitude84; - public static List convert (List appDeviceAdds,String photoPath) { + public static List convert(List appDeviceAdds, String photoPath) { List appDevicAddDTOS = new ArrayList<>(); appDeviceAdds.forEach(appDeviceAdd -> { - appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd,photoPath)); + appDevicAddDTOS.add(new AppDevicAddDTO(appDeviceAdd, photoPath)); }); return appDevicAddDTOS; } - public AppDevicAddDTO(AppDeviceAdd appDeviceAdd,String photoPath) { + public AppDevicAddDTO(AppDeviceAdd appDeviceAdd, String photoPath) { this.devcode = appDeviceAdd.getDevcode(); this.devicetype = appDeviceAdd.getDevicetype(); this.wellcode = appDeviceAdd.getWellcode(); @@ -80,9 +80,12 @@ this.installheigt = appDeviceAdd.getInstallheigt(); this.installperson = appDeviceAdd.getInstallperson(); this.installtime = appDeviceAdd.getInstalltime(); - this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1())?photoPath+appDeviceAdd.getPhotopath1():appDeviceAdd.getPhotopath1(); - this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2())?photoPath+appDeviceAdd.getPhotopath2():appDeviceAdd.getPhotopath2(); - this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3())?photoPath+appDeviceAdd.getPhotopath3():appDeviceAdd.getPhotopath3(); +// && this.installtime.getTime()>=DateUtil.parseDate("2023-04-01").getTime() + if (StringUtils.isNotEmpty(photoPath) ) { + this.photopath1 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath1()) ? photoPath + appDeviceAdd.getPhotopath1() : appDeviceAdd.getPhotopath1(); + this.photopath2 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath2()) ? photoPath + appDeviceAdd.getPhotopath2() : appDeviceAdd.getPhotopath2(); + this.photopath3 = ToolUtil.isNotEmpty(appDeviceAdd.getPhotopath3()) ? photoPath + appDeviceAdd.getPhotopath3() : appDeviceAdd.getPhotopath3(); + } this.project = appDeviceAdd.getProject(); this.position = appDeviceAdd.getPosition(); this.description = appDeviceAdd.getDescription(); diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java new file mode 100644 index 0000000..a8701e5 --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/model/BatchExportLog.java @@ -0,0 +1,38 @@ +package com.casic.missiles.modular.app.model; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author cz + */ +@Data +@TableName("batch_export_log") +public class BatchExportLog extends Model { + + private static final long serialVersionUID = 1L; + + @TableId("id") + private Long id; + @TableField("file_name") + private String fileName; + @TableField("file_dir") + private String fileDir; + @TableField("partition_number") + private String partitionNumber; + @TableField("create_time") + private String createTime; + @TableField("create_user_id") + private Long createUserId; + @TableField("task_id") + private int taskId; + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java index 96bd6fb..a8921c5 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/IAppDeviceAddService.java @@ -1,16 +1,19 @@ package com.casic.missiles.modular.app.service; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; +import java.util.Map; /** *

- * 服务类 + * 服务类 *

* * @author stylefeng123 @@ -18,13 +21,33 @@ */ public interface IAppDeviceAddService extends IService { - List getAppDevice(String devcode); + List getAppDevice(String devcode); + String saveFile(MultipartFile var1) throws IOException; - String fileUploadMarker(MultipartFile var1,String text) throws IOException; + + String fileUploadMarker(MultipartFile var1, String text) throws IOException; + String findModeCodeByCode(String devcode); + List reportExport(String devcode, String devtype, String begTime, String endTime, String project, String installPerson); + void convert84(); - void exportUsersToExcel(List list, HttpServletResponse response); + + void exportImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId); + + void exportNotImageExcel(Map sluiceWellDictMap, + String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson,HttpServletResponse response); + + void batchDownloadFiles(String recentDir,HttpServletResponse response); + + Integer getStartTask(); + + Page batchLogs(String begTime, String endTime, Page page); } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java index 69f2254..7c2865f 100644 --- a/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/service/impl/AppDeviceAddServiceImpl.java @@ -2,32 +2,41 @@ import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.casic.missiles.core.util.DateUtil; import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.app.dao.AppDeviceAddMapper; +import com.casic.missiles.modular.app.dao.BatchExportLogMapper; import com.casic.missiles.modular.app.dto.AppDevicAddDTO; import com.casic.missiles.modular.app.model.AppDeviceAdd; +import com.casic.missiles.modular.app.model.BatchExportLog; import com.casic.missiles.modular.app.service.IAppDeviceAddService; -import com.casic.missiles.modular.app.util.LonlatConver; -import com.casic.missiles.modular.app.util.PhotoUtils; +import com.casic.missiles.modular.app.util.*; +import com.casic.missiles.modular.system.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.ListUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.management.Query; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.awt.*; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.*; import java.util.List; -import java.util.UUID; +import java.util.concurrent.*; /** *

@@ -38,12 +47,21 @@ * @since 2020-05-24 */ @Service +@Slf4j public class AppDeviceAddServiceImpl extends ServiceImpl implements IAppDeviceAddService { + @Value("${casic.file-upload-path}") private String filePath; @Value("${casic.photoPath}") private String photoPath; + @Value("${casic.batchNumber}") + private Integer batchNumber; + @Autowired + private BatchExportLogMapper batchExportLogMapper; + @Autowired + private WebSocket webSocket; + @Override public List getAppDevice(String devcode) { @@ -127,7 +145,6 @@ EntityWrapper query = new EntityWrapper<>(); query.le("id", 5241); List appDeviceAddList = selectList(query); - for (AppDeviceAdd appDeviceAdd : appDeviceAddList) { if (ToolUtil.isNotEmpty(appDeviceAdd.getLongitude()) && ToolUtil.isNotEmpty(appDeviceAdd.getLatitude())) { @@ -141,12 +158,115 @@ } + @Override + public void exportImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, Long currentUserId) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); + Long stampeDir = System.currentTimeMillis(); + //以当前时间戳为目录 + String currentStampDir = filePath + stampeDir + File.separator; + setLocalFileDir(currentStampDir); + List batchExportLogsList = new ArrayList<>(); + try { + setStartTask(); + ExecutorService executor = Executors.newFixedThreadPool(10); + for (int appDeviceAddsIndex = 0; appDeviceAddsIndex < appDeviceAdds.size(); appDeviceAddsIndex += batchNumber) { + int postIndex = getBatchNumberPostIndex(appDeviceAdds, appDeviceAddsIndex); + List appDeviceBatchList = appDeviceAdds.subList(appDeviceAddsIndex, postIndex); + String partitionNumber = appDeviceAddsIndex + "-" + postIndex; + String fileName = "设备安装基础信息表" + partitionNumber + ".xls"; + String currentFileName = currentStampDir + fileName; + Runnable task = new Runnable() { + @Override + public void run() { + ExportExcelUtil exportExcelUtil = new ExportExcelUtil(); + exportExcelUtil.fileExport(appDeviceBatchList, currentFileName, photoPath); + } + }; + executor.submit(task); + batchExportLogsList.add(createBatchFileLogs(currentUserId, partitionNumber, fileName, String.valueOf(stampeDir))); + } + while (true) { + Long activeCount = ((ThreadPoolExecutor) executor).getTaskCount() - ((ThreadPoolExecutor) executor).getCompletedTaskCount(); + if (activeCount == 0) { + //删除所有的文件日志 + this.batchExportLogMapper.delete(null); + //删除所有历史文件 + deleteFile(new File(filePath),String.valueOf(stampeDir)); + //批量导入日志 + batchExportLogsList.stream().forEach( + batchExportLog -> this.batchExportLogMapper.insert(batchExportLog) + ); + System.out.println("所有的子线程都结束了!"); + List userList = new ArrayList<>(); + userList.add(String.valueOf(currentUserId)); + Map map = new HashMap(); + map.put("message", "你在" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(stampeDir)) + "的文件导出已经生成了,请到导出列表页面查看"); + map.put("type", "alarm"); + for (int i = 0; i < 3; i++) { + webSocket.sendListMessage(userList, JSON.toJSONString(map)); + Thread.sleep(3000); + } + break; + } + Thread.sleep(5000); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + /** + * 对导出产生的日志、进行清除,还原空间 + */ + private void deleteFile(File invalidFile,String currentFileStr) { + //为当前文件目录删除 + if(invalidFile.getAbsoluteFile().getName().equals(currentFileStr)){ + return; + } + //返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 + File[] files = invalidFile.listFiles(); + if (files != null) {//如果包含文件进行删除操作 + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + if (!invalidFile.getAbsolutePath().equals(filePath.substring(0,filePath.length()-1))) { + //删除子文件 + files[i].delete(); + } + } else if (files[i].isDirectory()) { + //通过递归的方法找到子目录的文件 + deleteFile(files[i],currentFileStr); + } + } + } + if (invalidFile.list().length == 0) { + log.debug("invalid print file has already delete success!"); + } + if (!invalidFile.getAbsolutePath().equals(filePath)) { + //删除子目录 + if (invalidFile != null && invalidFile.isDirectory()) { + invalidFile.delete(); + } + } + } @Override - public void exportUsersToExcel(List list,HttpServletResponse response) { - + public void exportNotImageExcel(Map sluiceWellDictMap, String devcode, String devtype, + String begTime, String endTime, + String project, String installPerson, HttpServletResponse response) { + //获取数据条数 + List appDeviceAdds = this.reportExport(devcode, devtype, + begTime, endTime, project, installPerson); + appDeviceAdds.forEach(appDeviceAdd -> { + appDeviceAdd.setWelltype(sluiceWellDictMap.get(appDeviceAdd.getWelltype())); + }); try { - //设置信息头,告诉浏览器内容为excel类型 response.setHeader("content-Type", "application/vnd.ms-excel"); //设置下载名称 @@ -160,16 +280,137 @@ params.setSheetName("设备安装信息"); //设置标题 params.setTitle("设备安装信息"); - //转成对应的类型;要不然会报错,虽然也可以导出成功 - List AppDevicAddDTOs = AppDevicAddDTO.convert(list,photoPath); - + List AppDeviceAddDTOs = AppDevicAddDTO.convert(appDeviceAdds, null); //导入excel - Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDevicAddDTOs); + Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDeviceAddDTOs); //写入 workbook.write(out); - } catch (Exception e) { - e.printStackTrace(); + } catch (Exception ex) { + ex.printStackTrace(); } } + + + @Override + public void batchDownloadFiles(String recentDir, HttpServletResponse response) { + FileInputStream is = null; + BufferedOutputStream out = null; + String zipPath = ""; + try { + response.reset(); + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/zip;charset=utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("设备安装基础信息表.zip", StandardCharsets.UTF_8.name())); + response.setHeader("Access-Control-Allow-Origin", "*"); + System.out.println(response.getHeader("Content-Disposition")); + ZipUtils zipUtils = new ZipUtils(); + zipPath = zipUtils.zipFileCreator(filePath, recentDir); + //开始下载 + is = new FileInputStream(new File(zipPath)); + out = new BufferedOutputStream(response.getOutputStream()); + byte[] buff = new byte[1024]; + int len = 0; + while ((len = is.read(buff, 0, buff.length)) != -1) { + out.write(buff, 0, len); + } + out.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + try { + out.close(); + if (StringUtils.isNotEmpty(zipPath)) { + new ZipUtils().zipFileDeletor(zipPath); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + + @Override + public Page batchLogs(String begTime, String endTime, Page page) { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.le(StringUtils.isNotEmpty(begTime), "create_time", begTime) + .or().ge(StringUtils.isNotEmpty(endTime), "create_time", endTime); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")); + List batchExportLogs = this.batchExportLogMapper.selectPage(page, batchEntityWrapper); + page.setRecords(batchExportLogs); + return page; + } + + + private BatchExportLog createBatchFileLogs(Long currentUserId, String partitionNumber, String fileName, String fileDir) { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setPartitionNumber(partitionNumber); + batchExportLog.setCreateUserId(currentUserId); + batchExportLog.setFileDir(fileDir + File.separator); + batchExportLog.setTaskId(0); + batchExportLog.setFileName(fileName); + return batchExportLog; + } + + @Override + public Integer getStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.where("create_time>date_add(now(), interval -1 hour) "); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + return optionalBatchExportLog.isPresent() ? optionalBatchExportLog.get().getTaskId() : null; + } + + private void setStartTask() { + EntityWrapper batchEntityWrapper = new EntityWrapper<>(); + batchEntityWrapper.orderDesc(Arrays.asList("create_time")) + .last(" limit 1"); + List batchExportLogs = this.batchExportLogMapper.selectList(batchEntityWrapper); + Optional optionalBatchExportLog = batchExportLogs.stream().findFirst(); + if (optionalBatchExportLog.isPresent()) { + optionalBatchExportLog.get().setTaskId(1); + this.batchExportLogMapper.updateById(optionalBatchExportLog.get()); + } else { + BatchExportLog batchExportLog = new BatchExportLog(); + batchExportLog.setTaskId(1); + this.batchExportLogMapper.insert(batchExportLog); + } + } + + /** + * 获取分批次要导出的目录列表 + * + * @return + */ + private int getBatchNumberPostIndex(List appDeviceAdds, int appDeviceAddsIndex) { + int postIndex = 0; + if (appDeviceAddsIndex + batchNumber > appDeviceAdds.size()) { + postIndex = appDeviceAdds.size(); + } else { + postIndex = appDeviceAddsIndex + batchNumber; + } + return postIndex; + } + + /** + * 创建文件目录 + */ + private void setLocalFileDir(String tempLocalFileDir) { + File file = new File(tempLocalFileDir); + if (!file.exists()) { + file.mkdirs(); + } + } + } diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java new file mode 100644 index 0000000..cf9307c --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ExportExcelUtil.java @@ -0,0 +1,47 @@ +package com.casic.missiles.modular.app.util; + +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.casic.missiles.modular.app.dto.AppDevicAddDTO; +import com.casic.missiles.modular.app.model.AppDeviceAdd; +import org.apache.poi.ss.usermodel.Workbook; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +public class ExportExcelUtil { + /** + * 导出文件主要内容 + */ + public void fileExport(List appDeviceBatchList, String currentFileName,String photoPath) { + FileOutputStream fileOutputStream = null; + try { + fileOutputStream = new FileOutputStream(currentFileName); + //设置excel参数 + ExportParams params = new ExportParams(); + //设置sheet名名称 + params.setSheetName("设备安装信息"); + //设置标题 + params.setTitle("设备安装信息"); + //转成对应的类型;要不然会报错,虽然也可以导出成功 + List AppDeviceAddDTOs = AppDevicAddDTO.convert(appDeviceBatchList, photoPath); + //导入excel + Workbook workbook = ExcelExportUtil.exportExcel(params, AppDevicAddDTO.class, AppDeviceAddDTOs); + workbook.write(fileOutputStream); + fileOutputStream.flush(); + } catch (Exception e) { + + } finally { + if (fileOutputStream != null) { + try { + fileOutputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java new file mode 100644 index 0000000..50f24dc --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/WebSocket.java @@ -0,0 +1,101 @@ +package com.casic.missiles.modular.app.util; + +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; + +@Component +@ServerEndpoint("/websocket/{userId}") +//此注解相当于设置访问URL +public class WebSocket { + private Session session; + + private static CopyOnWriteArraySet webSockets =new CopyOnWriteArraySet<>(); + private static Map sessionPool = new HashMap(); + + @OnOpen + public void onOpen(Session session, @PathParam(value="userId")String userId) { + this.session = session; + webSockets.add(this); + sessionPool.put(userId, session); + System.out.println(userId+"【websocket消息】有新的连接,总数为:"+webSockets.size()); + } + + @OnClose + public void onClose() { + webSockets.remove(this); + System.out.println("【websocket消息】连接断开,总数为:"+webSockets.size()); + } + + @OnMessage + public void onMessage(String message) { + System.out.println("【websocket消息】收到客户端消息:"+message); + } + + // 此为广播消息 + public void sendAllMessage(String message) { + for(WebSocket webSocket : webSockets) { + System.out.println("【websocket消息】广播消息:"+message); + try { + webSocket.session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + // 发送列表消息 + public void sendListMessage(List userIds, String message){ + System.out.println("【websocket消息】列表消息:"+message); + for (String userId : userIds) { + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 发送列表消息 + +// public void sendListMessage(List userIds, Object data){ +// System.out.println("【websocket消息】列表消息:"+data); +// for (String userId : userIds) { +// Session session = sessionPool.get(userId); +// if (session != null) { +// try { +//// session.getAsyncRemote().sendText(message); +// session.getAsyncRemote().sendObject(data); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// } + + // 此为单点消息 + public void sendOneMessage(String userId, String message) { + System.out.println("【websocket消息】单点消息:"+message); + Session session = sessionPool.get(userId); + if (session != null) { + try { + session.getAsyncRemote().sendText(message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + +} diff --git a/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java new file mode 100644 index 0000000..ea267bf --- /dev/null +++ b/casic-app/src/main/java/com/casic/missiles/modular/app/util/ZipUtils.java @@ -0,0 +1,84 @@ +package com.casic.missiles.modular.app.util; + + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * @author zhouxuan + * @since 2019/4/19 + */ +public class ZipUtils { + + /** + * 批量打包 + * + * @param downloadPath 项目根目录 + * @return tempDir 文件保存绝对路径 + */ + public String zipFileCreator(String downloadPath,String tempDir) { + ZipOutputStream out = null; + try { + //生成打包下载后的zip文件:Papers.zip + String papersZipName = "设备安装基础信息表.zip"; + //zip文件保存路径 + String zipPath = downloadPath + papersZipName; + String fileSaveRootPath=downloadPath+File.separator+tempDir; + File file = new File(fileSaveRootPath); + File[] files = file.listFiles(); + out = new ZipOutputStream(new FileOutputStream(zipPath)); + //遍历jsonArray列表获取所有JSONObject对象 + for (int i = 0; i < files.length; i++) { + //以论文标题为每个文件命名 + FileInputStream fis = new FileInputStream(fileSaveRootPath + File.separator + files[i].getName()); + out.putNextEntry(new ZipEntry(files[i].getName())); + //写入压缩包 + int len; + byte[] buffer = new byte[1024]; + while ((len = fis.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + out.closeEntry(); + fis.close(); + } + out.close(); + out.flush(); + return zipPath; + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + + /** + * 批量打包 + * + * @param zipPath zip路径 + * @return zip文件保存绝对路径 + */ + public void zipFileDeletor(String zipPath) { + try { + File zipFile=new File(zipPath); + zipFile.delete(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java b/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java index 59b2097..5ab81c7 100644 --- a/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java +++ b/casic-device/src/main/java/com/casic/missiles/modular/system/controller/TemplateController.java @@ -10,9 +10,12 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletResponse; +import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; /** * 控制器 @@ -31,41 +34,56 @@ * 文件模板下载 */ @GetMapping("/template/download") - public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) - throws ServletException, IOException { + public void doPost(@RequestParam("filename") String filename, HttpServletResponse response) throws IOException { logger.info(downloadPath); - if (downloadPath.startsWith("/")) { - downloadPath = downloadPath.substring(1); + String tempDownloadPath=downloadPath; + if (tempDownloadPath.startsWith("/")) { + tempDownloadPath = tempDownloadPath.substring(1); } - File file = new File(downloadPath, filename); + + File file = new File(tempDownloadPath, filename); // 获取文件名 String fileName = null; - if (filename.contains("/")) { - fileName = filename.substring(filename.lastIndexOf("/") + 1); + if (filename.contains(File.separator)) { + fileName = filename.substring(filename.lastIndexOf(File.separator) + 1); } else { fileName = filename; } // 设置以流的形式下载文件,这样可以实现任意格式的文件下载 response.setContentType("application/octet-stream"); - response.addHeader("Content-Disposition", " attachment;filename=" + fileName); + response.setCharacterEncoding("UTF-8"); + response.addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, StandardCharsets.UTF_8.name())); response.setContentLength((int) file.length()); - + BufferedOutputStream out = null; FileInputStream fis = null; try { + out = new BufferedOutputStream(response.getOutputStream()); fis = new FileInputStream(file); byte[] buffer = new byte[1024]; int readTmp = 0; while ((readTmp = fis.read(buffer)) != -1) { - response.getOutputStream().write(buffer, 0, readTmp); + out.write(buffer, 0, readTmp); } + out.flush(); } catch (Exception e) { logger.info(e.getMessage()); e.printStackTrace(); } finally { - response.getOutputStream().flush(); - response.getOutputStream().close(); - fis.close(); + if (out != null) { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } } } } diff --git a/casic-web/pom.xml b/casic-web/pom.xml index 0faf332..9b9943a 100644 --- a/casic-web/pom.xml +++ b/casic-web/pom.xml @@ -288,10 +288,13 @@ - src/main/webapp - - src/main/resources + + + /config/*/* + /config/*-*.yml + + true src/main/java diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java index 0b0c3fb..47a8b06 100644 --- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -1,5 +1,7 @@ package com.casic.missiles; +import com.baomidou.mybatisplus.annotations.TableField; +import com.baomidou.mybatisplus.annotations.TableId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; @@ -23,7 +25,6 @@ public static void main(String[] args){ SpringApplication.run(CasicApplication.class, args); logger.info("GunsApplication is success!"); - } } @@ -33,3 +34,4 @@ + diff --git a/casic-web/src/main/java/com/casic/missiles/controller/MockController.java b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java index a8285e8..3cebcd0 100644 --- a/casic-web/src/main/java/com/casic/missiles/controller/MockController.java +++ b/casic-web/src/main/java/com/casic/missiles/controller/MockController.java @@ -46,7 +46,7 @@ SuccessResponseData resultData = new SuccessResponseData(); if (ToolUtil.isOneEmpty(username, password)) { username = "admin"; - password = "1111111a"; + password = "casic203"; } Subject currentUser = ShiroKit.getSubject(); diff --git a/casic-web/src/main/resources/application-dev.yml b/casic-web/src/main/resources/application-dev.yml new file mode 100644 index 0000000..59163c7 --- /dev/null +++ b/casic-web/src/main/resources/application-dev.yml @@ -0,0 +1,31 @@ +server: + port: 5905 + + maxPostSize: -1 + maxHttpHeaderSize: 102400 +################### spring配置 ################### +spring: + datasource: + url: jdbc:mysql://139.198.18.188:3306/product_device?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull + username: pcroot + password: pcroot#203 + initial-size: 2 + min-idle: 1 +#flowable数据源和多数据源配置 +casic: + kaptcha-open: false #是否开启登录时验证码 (true/false) + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken,/process/processDiagram,/appDeviceLog/listPage,/appDeviceAdd/add,/appDeviceLog/deviceDetail,/appDeviceLog/add,/appDeviceAdd/fileUpload,/appDeviceAdd/findListByCodes,/appDeviceAdd/findModeCodeByCode,/deviceType/getUser,/project/getProject,/appDeviceLog/deletePhoto,/deviceType/deviceType,/productRepairRecords/add,/appDeviceAdd/fileUploadMarker,/appDeviceAdd/getDevTypeLength,/appDeviceAdd/delete,/appUserOpenid/login,/appUserOpenid/add,/appUserOpenid/validate,/appDeviceAdd/getWellTypeList,/appDeviceAdd/*,/websocket/*,/template/download + file-upload-path: D:\casic\tmp\ + file-download-path: D:\casic\tmp\ + producerName: producer + repairName: repair + wxUrl: https://api.weixin.qq.com/sns/jscode2session #获取微信openid + appid: wx8f4b331065a9ac2e #微信小程序开发appid + secret: 335847f265b3875804c8f8de4231730b #微信小程序开发密钥 + photoPath: https://logapi.smartlog.work/static/ #导出照片位置存放目录 +logging: + level.root: info + level.com.casic: debug + path: logs/ + file: missiles.log + diff --git a/casic-web/src/main/resources/application.yml b/casic-web/src/main/resources/application.yml index c85523d..288c7e1 100644 --- a/casic-web/src/main/resources/application.yml +++ b/casic-web/src/main/resources/application.yml @@ -3,7 +3,7 @@ ########################################################## spring: profiles: - active: @activatedProperties@ + active: dev datasource: driver-class-name: com.mysql.jdbc.Driver jms: @@ -15,4 +15,5 @@ casic: kaptcha-open: true #是否开启登录时验证码 (true/false) file-upload-path: d:/tmp #文件上传目录(不配置的话为java.io.tmpdir目录) + batchNumber: 200 nologin-urls: /user/login,/kaptcha,/config/baseConfig,/appDeviceLog/listPage \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index b35d1ec..449ad98 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -1,6 +1,5 @@ server: port: 8083 - maxPostSize: -1 maxHttpHeaderSize: 102400 ################### spring配置 ################### @@ -14,9 +13,9 @@ #flowable数据源和多数据源配置 casic: kaptcha-open: false #是否开启登录时验证码 (true/false) - nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken,/process/processDiagram,/appDeviceLog/listPage,/appDeviceAdd/add,/appDeviceLog/deviceDetail,/appDeviceLog/add,/appDeviceAdd/fileUpload,/appDeviceAdd/findListByCodes,/appDeviceAdd/findModeCodeByCode,/deviceType/getUser,/project/getProject,/appDeviceLog/deletePhoto,/deviceType/deviceType,/productRepairRecords/add,/appDeviceAdd/fileUploadMarker,/appDeviceAdd/getDevTypeLength,/appDeviceAdd/delete,/appUserOpenid/login,/appUserOpenid/add,/appUserOpenid/validate,/appDeviceAdd/getWellTypeList,/appDeviceAdd/listExp - file-upload-path: C:\casic\tmp\ - file-download-path: D:\tmp\ + nologin-urls: /user/login,/user/appLogin,/kaptcha,/config/baseConfig,/route/mockToken,/process/processDiagram,/appDeviceLog/listPage,/appDeviceAdd/add,/appDeviceLog/deviceDetail,/appDeviceLog/add,/appDeviceAdd/fileUpload,/appDeviceAdd/findListByCodes,/appDeviceAdd/findModeCodeByCode,/deviceType/getUser,/project/getProject,/appDeviceLog/deletePhoto,/deviceType/deviceType,/productRepairRecords/add,/appDeviceAdd/fileUploadMarker,/appDeviceAdd/getDevTypeLength,/appDeviceAdd/delete,/appUserOpenid/login,/appUserOpenid/add,/appUserOpenid/validate,/appDeviceAdd/getWellTypeList,/appDeviceAdd/*,/websocket/*,/template/download + file-upload-path: D:\casic\tmp\ + file-download-path: D:\casic\tmp\ producerName: producer repairName: repair wxUrl: https://api.weixin.qq.com/sns/jscode2session #获取微信openid