From 257d0b3af878ebb0ca714a318a9fcfd5e5d8f412 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B4=BE=E5=90=8C=E5=AD=A6?= Date: Fri, 15 Aug 2025 16:21:10 +0800 Subject: [PATCH] =?UTF-8?q?ADD:=E5=AF=BC=E5=87=BA=E5=AD=90=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E5=85=83=E4=BF=A1=E6=81=AFzip=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/njcn/gather/device/pojo/po/PqDev.java | 5 + .../plan/controller/AdPlanController.java | 24 +- .../plan/pojo/vo/AdSubPlanMetaDataVO.java | 43 ++++ .../gather/plan/service/IAdPlanService.java | 4 +- .../plan/service/impl/AdPlanServiceImpl.java | 233 +++++++++++++++--- 5 files changed, 265 insertions(+), 44 deletions(-) create mode 100644 detection/src/main/java/com/njcn/gather/plan/pojo/vo/AdSubPlanMetaDataVO.java diff --git a/detection/src/main/java/com/njcn/gather/device/pojo/po/PqDev.java b/detection/src/main/java/com/njcn/gather/device/pojo/po/PqDev.java index f8cc0d84..a2a7f21a 100644 --- a/detection/src/main/java/com/njcn/gather/device/pojo/po/PqDev.java +++ b/detection/src/main/java/com/njcn/gather/device/pojo/po/PqDev.java @@ -9,11 +9,13 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import com.njcn.db.mybatisplus.bo.BaseEntity; +import com.njcn.gather.monitor.pojo.po.PqMonitor; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; import java.time.LocalDate; +import java.util.List; /** * @author caozehui @@ -186,5 +188,8 @@ public class PqDev extends BaseEntity implements Serializable { * 状态:0-删除 1-正常 */ private Integer state; + + @TableField(exist = false) + private List monitorList; } diff --git a/detection/src/main/java/com/njcn/gather/plan/controller/AdPlanController.java b/detection/src/main/java/com/njcn/gather/plan/controller/AdPlanController.java index 4b44f45e..cc84a701 100644 --- a/detection/src/main/java/com/njcn/gather/plan/controller/AdPlanController.java +++ b/detection/src/main/java/com/njcn/gather/plan/controller/AdPlanController.java @@ -351,12 +351,32 @@ public class AdPlanController extends BaseController { @OperateInfo(operateType = OperateType.DOWNLOAD) @PostMapping("/exportSubPlan") - @ApiOperation("导出子计划") + @ApiOperation("导出子计划元信息") @ApiImplicitParam(name = "planId", value = "子计划id", required = true) public void exportSubPlan(@RequestParam("planId") String planId, HttpServletResponse response) { String methodDescribe = getMethodDescribe("exportSubPlan"); LogUtil.njcnDebug(log, "{},导出ID数据为:{}", methodDescribe, planId); - adPlanService.exportSubPlan(planId, response); + adPlanService.exportSubPlanDataZip(planId, response); + } + + @OperateInfo(info = LogEnum.BUSINESS_COMMON, operateType = OperateType.UPLOAD) + @PostMapping(value = "/importSubPlan") + @ApiOperation("导入子计划元信息") + @ApiImplicitParams({ + @ApiImplicitParam(name = "file", value = "检测计划数据文件", required = true), + @ApiImplicitParam(name = "patternId", value = "模式Id", required = true) + }) + public HttpResult importSubPlan(@RequestParam("file") MultipartFile file, @RequestParam("patternId") String patternId, HttpServletResponse response) { + String methodDescribe = getMethodDescribe("importSubPlan"); + LogUtil.njcnDebug(log, "{},上传文件为:{}", methodDescribe, file.getOriginalFilename()); + boolean fileType = FileUtil.judgeFileIsZip(file.getOriginalFilename()); + if (!fileType) { + CommonResponseEnum fileTypeError = CommonResponseEnum.FILE_XLSX_ERROR; + fileTypeError.setMessage("请上传zip文件"); + throw new BusinessException(fileTypeError); + } + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, true, methodDescribe); + } } diff --git a/detection/src/main/java/com/njcn/gather/plan/pojo/vo/AdSubPlanMetaDataVO.java b/detection/src/main/java/com/njcn/gather/plan/pojo/vo/AdSubPlanMetaDataVO.java new file mode 100644 index 00000000..2acbfc54 --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/plan/pojo/vo/AdSubPlanMetaDataVO.java @@ -0,0 +1,43 @@ +package com.njcn.gather.plan.pojo.vo; + +import com.njcn.gather.device.pojo.po.PqDev; +import com.njcn.gather.device.pojo.po.PqStandardDev; +import com.njcn.gather.err.pojo.po.PqErrSys; +import com.njcn.gather.err.pojo.po.PqErrSysDtls; +import com.njcn.gather.plan.pojo.po.AdPlan; +import com.njcn.gather.report.pojo.po.PqReport; +import com.njcn.gather.system.cfg.pojo.po.SysTestConfig; +import com.njcn.gather.system.dictionary.pojo.po.DictData; +import com.njcn.gather.system.dictionary.pojo.po.DictTree; +import com.njcn.gather.system.dictionary.pojo.po.DictType; +import com.njcn.gather.type.pojo.po.DevType; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = false) +public class AdSubPlanMetaDataVO { + + private Dict dict; + private AdPlan plan; + private SysTestConfig testConfig; + private List devList; + private List standardDevList; + private List devTypeList; + private List errSysList; + private List errSysDtlsList; + private PqReport reportTemplate; + + + @Data + @EqualsAndHashCode(callSuper = false) + public static class Dict{ + private List typeList; + + private List dataList; + + private List treeList; + } +} diff --git a/detection/src/main/java/com/njcn/gather/plan/service/IAdPlanService.java b/detection/src/main/java/com/njcn/gather/plan/service/IAdPlanService.java index 37d1f78d..6ac078a4 100644 --- a/detection/src/main/java/com/njcn/gather/plan/service/IAdPlanService.java +++ b/detection/src/main/java/com/njcn/gather/plan/service/IAdPlanService.java @@ -174,10 +174,10 @@ public interface IAdPlanService extends IService { boolean updateBindStandardDev(String planId, List standardDevIds); /** - * 根据计划Id导出子计划数据 + * 导出子计划元信息 * * @param planId * @param response */ - void exportSubPlan(String planId, HttpServletResponse response); + void exportSubPlanDataZip(String planId, HttpServletResponse response); } diff --git a/detection/src/main/java/com/njcn/gather/plan/service/impl/AdPlanServiceImpl.java b/detection/src/main/java/com/njcn/gather/plan/service/impl/AdPlanServiceImpl.java index d22e5c2a..11f442cd 100644 --- a/detection/src/main/java/com/njcn/gather/plan/service/impl/AdPlanServiceImpl.java +++ b/detection/src/main/java/com/njcn/gather/plan/service/impl/AdPlanServiceImpl.java @@ -6,14 +6,19 @@ import cn.afterturn.easypoi.excel.entity.ImportParams; import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ZipUtil; +import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.njcn.common.pojo.enums.common.DataStateEnum; +import com.njcn.common.pojo.enums.response.CommonResponseEnum; import com.njcn.common.pojo.exception.BusinessException; import com.njcn.common.pojo.poi.PullDown; import com.njcn.gather.device.mapper.PqDevMapper; @@ -29,7 +34,11 @@ import com.njcn.gather.device.pojo.vo.ProvinceDevExcel; import com.njcn.gather.device.service.IPqDevService; import com.njcn.gather.device.service.IPqDevSubService; import com.njcn.gather.err.pojo.po.PqErrSys; +import com.njcn.gather.err.pojo.po.PqErrSysDtls; +import com.njcn.gather.err.service.IPqErrSysDtlsService; import com.njcn.gather.err.service.IPqErrSysService; +import com.njcn.gather.monitor.pojo.po.PqMonitor; +import com.njcn.gather.monitor.service.IPqMonitorService; import com.njcn.gather.plan.mapper.AdPlanMapper; import com.njcn.gather.plan.mapper.AdPlanStandardDevMapper; import com.njcn.gather.plan.pojo.enums.DataSourceEnum; @@ -37,15 +46,13 @@ import com.njcn.gather.plan.pojo.enums.PlanReportStateEnum; import com.njcn.gather.plan.pojo.param.AdPlanParam; import com.njcn.gather.plan.pojo.po.AdPlan; import com.njcn.gather.plan.pojo.po.AdPlanStandardDev; -import com.njcn.gather.plan.pojo.vo.AdPlanVO; -import com.njcn.gather.plan.pojo.vo.CNPlanExcel; -import com.njcn.gather.plan.pojo.vo.ContrastPlanExcel; -import com.njcn.gather.plan.pojo.vo.ProvincePlanExcel; +import com.njcn.gather.plan.pojo.vo.*; import com.njcn.gather.plan.service.IAdPlanService; import com.njcn.gather.plan.service.IAdPlanSourceService; import com.njcn.gather.plan.service.IAdPlanStandardDevService; import com.njcn.gather.pojo.enums.DetectionResponseEnum; import com.njcn.gather.report.pojo.po.PqReport; +import com.njcn.gather.report.service.IPqReportService; import com.njcn.gather.script.pojo.po.PqScript; import com.njcn.gather.script.pojo.po.PqScriptDtls; import com.njcn.gather.script.service.IPqScriptDtlsService; @@ -84,6 +91,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; +import java.io.File; import java.io.IOException; import java.net.URLEncoder; import java.util.*; @@ -116,6 +124,8 @@ public class AdPlanServiceImpl extends ServiceImpl impleme private final IAdPlanStandardDevService adPlanStandardDevService; private final AdPlanStandardDevMapper adPlanStandardDevMapper; private final IAdPlanStandardDevService adPlanContrastStandardDevService; + private final IPqMonitorService pqMonitorService; + private final IPqErrSysDtlsService pqErrSysDtlsService; @Override public List listAdPlan(AdPlanParam.QueryParam queryParam) { @@ -160,7 +170,7 @@ public class AdPlanServiceImpl extends ServiceImpl impleme adPlanVO.setSourceName(pqSourceList.stream().map(PqSource::getName).collect(Collectors.toList())); PqDevParam.QueryParam queryParam1 = new PqDevParam.QueryParam(); - queryParam1.setPlanIdList(Arrays.asList(adPlan.getId())); + queryParam1.setPlanIdList(Collections.singletonList(adPlan.getId())); List pqDevVOList = pqDevMapper.selectByQueryParam(queryParam1); if (CollUtil.isNotEmpty(pqDevVOList)) { @@ -261,7 +271,7 @@ public class AdPlanServiceImpl extends ServiceImpl impleme // 关联检测源 adPlanSourceService.addAdPlanSource(planId, param.getSourceIds()); } - tableGenService.deleteTable(Arrays.asList(adPlan.getCode().toString())); + tableGenService.deleteTable(Collections.singletonList(adPlan.getCode().toString())); tableGenService.genTable(adPlan.getCode().toString(), PatternEnum.CONTRAST.getValue().equals(dictData.getCode())); return true; @@ -273,14 +283,42 @@ public class AdPlanServiceImpl extends ServiceImpl impleme param.setName(param.getName().trim()); AdPlan plan1 = this.getById(param.getId()); // 更新子计划 - if (StrUtil.isNotEmpty(plan1.getFatherPlanId())) { + String fatherPlanId = plan1.getFatherPlanId(); + if (StrUtil.isNotEmpty(fatherPlanId) && !StrUtil.equals(fatherPlanId,"0")) { + this.updateBindStandardDev(param.getId(), param.getStandardDevIds()); - PqDevParam.BindPlanParam bindPlanParam = new PqDevParam.BindPlanParam(); - bindPlanParam.setPlanId(param.getId()); - bindPlanParam.setDevIds(param.getDevIds()); - bindPlanParam.setBindFlag(1); - this.updateBindDev(bindPlanParam); - return true; + List list = new ArrayList<>(); + AdPlan fatherPlan = this.getById(fatherPlanId); + // 原始绑定被检设备 + List oldDevList = pqDevService.list(new QueryWrapper().eq("Plan_Id", param.getId()).eq("State", DataStateEnum.ENABLE.getCode())); + List oldDevIds = oldDevList.stream().map(PqDev::getId).collect(Collectors.toList()); + List newDevIds = param.getDevIds(); + if (CollUtil.isNotEmpty(newDevIds)) { + plan1.setTestState(pqDevService.bind(param.getId(), newDevIds)); + // 获取并集 + List unionDevIds = new ArrayList<>(CollUtil.union(oldDevIds, newDevIds)); + // 排除 + newDevIds.forEach(unionDevIds::remove); + List fatherNowDevList = pqDevService.list(new QueryWrapper().eq("Plan_Id", fatherPlanId).eq("State", DataStateEnum.ENABLE.getCode())); + List fatherNowDevIds = fatherNowDevList.stream().map(PqDev::getId).collect(Collectors.toList()); + + // 把排除绑定到主计划 + fatherNowDevIds.addAll(unionDevIds); + fatherPlan.setTestState(pqDevService.bind(fatherPlanId, fatherNowDevIds)); + list.add(fatherPlan); + + } else { + if (CollUtil.isNotEmpty(oldDevIds)) { + List fatherNowDevList = pqDevService.list(new QueryWrapper().eq("Plan_Id", fatherPlanId).eq("State", DataStateEnum.ENABLE.getCode())); + List fatherNowDevIds = fatherNowDevList.stream().map(PqDev::getId).collect(Collectors.toList()); + fatherNowDevIds.addAll(oldDevIds); + // 把原始都绑定到主计划 + fatherPlan.setTestState(pqDevService.bind(fatherPlanId, fatherNowDevIds)); + list.add(fatherPlan); + } + } + + return this.updateBatchById(list); } this.checkRepeat(param, true, CommonEnum.FATHER_ID.getValue()); AdPlan plan2 = new AdPlan(); @@ -360,7 +398,7 @@ public class AdPlanServiceImpl extends ServiceImpl impleme public boolean deleteAdPlan(List ids, String pattern) { for (String id : ids) { PqDevParam.QueryParam queryParam = new PqDevParam.QueryParam(); - queryParam.setPlanIdList(Arrays.asList(id)); + queryParam.setPlanIdList(Collections.singletonList(id)); if (ObjectUtils.isNotEmpty(pqDevService.listByPlanId(queryParam))) { throw new BusinessException(DetectionResponseEnum.PLAN_HAS_DEVICE_BIND); } @@ -558,7 +596,7 @@ public class AdPlanServiceImpl extends ServiceImpl impleme } } PqDevParam.QueryParam queryParam = new PqDevParam.QueryParam(); - queryParam.setPlanIdList(Arrays.asList(planId)); + queryParam.setPlanIdList(Collections.singletonList(planId)); List pqDevVOList1 = pqDevMapper.selectByQueryParam(queryParam); List collect = pqDevVOList1.stream().filter(x -> !x.getCheckState().equals(CheckStateEnum.UNCHECKED.getValue())).collect(Collectors.toList()); if (CollUtil.isEmpty(collect)) { @@ -605,7 +643,7 @@ public class AdPlanServiceImpl extends ServiceImpl impleme List allDevList = new ArrayList<>(); for (AdPlan plan : planList) { PqDevParam.QueryParam queryParam = new PqDevParam.QueryParam(); - queryParam.setPlanIdList(Arrays.asList(plan.getId())); + queryParam.setPlanIdList(Collections.singletonList(plan.getId())); List pqDevVOList = pqDevMapper.selectByQueryParam(queryParam); pqDevVOList = pqDevVOList.stream().filter(x -> !x.getCheckResult().equals(CheckResultEnum.UNCHECKED.getValue())).collect(Collectors.toList()); allDevList.addAll(pqDevVOList); @@ -623,7 +661,7 @@ public class AdPlanServiceImpl extends ServiceImpl impleme } else { AdPlan plan = planList.get(0); PqDevParam.QueryParam queryParam = new PqDevParam.QueryParam(); - queryParam.setPlanIdList(Arrays.asList(plan.getId())); + queryParam.setPlanIdList(Collections.singletonList(plan.getId())); List pqDevVOList = pqDevMapper.selectByQueryParam(queryParam); pqDevVOList = pqDevVOList.stream().filter(x -> !x.getCheckResult().equals(CheckResultEnum.UNCHECKED.getValue())).collect(Collectors.toList()); @@ -671,7 +709,7 @@ public class AdPlanServiceImpl extends ServiceImpl impleme sheet.put("entity", ContrastDevExcel.class); PqDevParam.QueryParam param = new PqDevParam.QueryParam(); - param.setPlanIdList(Arrays.asList(plan.getId())); + param.setPlanIdList(Collections.singletonList(plan.getId())); List pqDevVOList = pqDevService.listByPlanId(param); List exportContrastDevData = pqDevService.getExportContrastDevData(pqDevVOList); sheet.put("data", exportContrastDevData); @@ -806,24 +844,6 @@ public class AdPlanServiceImpl extends ServiceImpl impleme return true; } - @Override - public void exportSubPlan(String planId, HttpServletResponse response) { - // 子计划数据 - AdPlan subPlan = this.getById(planId); - //子计划绑定的标准设备 - List pqStandardDevs = adPlanStandardDevMapper.listByPlanId(Collections.singletonList(planId)); - // 子计划绑定的被检设备 - PqDevParam.QueryParam queryParam = new PqDevParam.QueryParam(); - queryParam.setPlanIdList(Collections.singletonList(planId)); - - List pqDevList = pqDevService.list(new QueryWrapper().eq("Plan_Id", planId)); - List pqDevSubList = new ArrayList<>(); - if (CollUtil.isNotEmpty(pqDevList)) { - pqDevSubList.addAll(pqDevSubService.list(new QueryWrapper().in("dev_Id", pqDevList.stream().map(PqDev::getId).collect(Collectors.toList())))); - } - - } - /** * 省级平台导出检测计划数据 * @@ -838,7 +858,7 @@ public class AdPlanServiceImpl extends ServiceImpl impleme planExcelList.get(i).setSource(pqSources.stream().map(PqSource::getName).collect(Collectors.joining(StrUtil.COMMA))); PqDevParam.QueryParam queryParam1 = new PqDevParam.QueryParam(); - queryParam1.setPlanIdList(Arrays.asList(planList.get(i).getId())); + queryParam1.setPlanIdList(Collections.singletonList(planList.get(i).getId())); List pqDevVOList = pqDevMapper.selectByQueryParam(queryParam1); pqDevService.visualizeProvinceDev(pqDevVOList); List deviceExportData = BeanUtil.copyToList(pqDevVOList, ProvinceDevExcel.class); @@ -861,7 +881,7 @@ public class AdPlanServiceImpl extends ServiceImpl impleme planExcelList.get(i).setSource(pqSources.stream().map(PqSource::getName).collect(Collectors.joining(StrUtil.COMMA))); PqDevParam.QueryParam queryParam1 = new PqDevParam.QueryParam(); - queryParam1.setPlanIdList(Arrays.asList(planList.get(i).getId())); + queryParam1.setPlanIdList(Collections.singletonList(planList.get(i).getId())); List pqDevs = pqDevMapper.selectByQueryParam(queryParam1); pqDevService.visualizeCNDev(pqDevs); List deviceExportData = BeanUtil.copyToList(pqDevs, CNDevExcel.class); @@ -943,7 +963,7 @@ public class AdPlanServiceImpl extends ServiceImpl impleme List cnDevExcelList = planExcel.getDevices(); pqDevService.importCNDev(cnDevExcelList, patternId, planId); - tableGenService.deleteTable(Arrays.asList(code.toString())); + tableGenService.deleteTable(Collections.singletonList(code.toString())); tableGenService.genTable(code.toString(), PatternEnum.CONTRAST.getValue().equals(patternCode)); } // 逆向可视化 @@ -1001,7 +1021,7 @@ public class AdPlanServiceImpl extends ServiceImpl impleme Integer code = this.generateCode(); adPlans.get(i).setCode(code); - tableGenService.deleteTable(Arrays.asList(code.toString())); + tableGenService.deleteTable(Collections.singletonList(code.toString())); tableGenService.genTable(code.toString(), PatternEnum.CONTRAST.getValue().equals(patternCode)); String source = planExcel.getSource(); @@ -1484,4 +1504,137 @@ public class AdPlanServiceImpl extends ServiceImpl impleme } return pullDowns; } + + @Override + public void exportSubPlanDataZip(String planId, HttpServletResponse response) { + AdSubPlanMetaDataVO subPlanMetaData = new AdSubPlanMetaDataVO(); + // 获取所有字典数据 + AdSubPlanMetaDataVO.Dict dict = new AdSubPlanMetaDataVO.Dict(); + List dictTypeList = dictTypeService.list(); + List dictDataList = dictDataService.list(); + List dictTreeList = dictTreeService.list(); + dict.setTypeList(dictTypeList); + dict.setDataList(dictDataList); + dict.setTreeList(dictTreeList); + subPlanMetaData.setDict(dict); + + // 获取检测相关配置 + SysTestConfig testConfig = sysTestConfigService.getOneConfig(); + subPlanMetaData.setTestConfig(testConfig); + + // 获取误差体系数据 + List errSysList = pqErrSysService.list(); + subPlanMetaData.setErrSysList(errSysList); + List errSysDtlsList = pqErrSysDtlsService.list(); + subPlanMetaData.setErrSysDtlsList(errSysDtlsList); + + // 获取检测计划基本数据 + AdPlan subPlan = this.getById(planId); + subPlanMetaData.setPlan(subPlan); + + // 获取检设备类型数据 + List devTypeList = devTypeService.list(); + subPlanMetaData.setDevTypeList(devTypeList); + + // 获取检测计划绑定的被检设备数据 + List devList = pqDevService.list(new QueryWrapper().eq("Plan_Id", planId)); + if (CollUtil.isNotEmpty(devList)) { + List devIds = devList.stream().map(PqDev::getId).collect(Collectors.toList()); + // 被检设备监测点 + List pqMonitorList = pqMonitorService.lambdaQuery().in(PqMonitor::getDevId, devIds).list(); + Map> monitorListMap = pqMonitorList.stream().collect(Collectors.groupingBy(PqMonitor::getDevId)); + devList.forEach(dev -> { + dev.setMonitorList(monitorListMap.getOrDefault(dev.getId(), new ArrayList<>())); + }); + } + subPlanMetaData.setDevList(devList); + + // 获取检测计划绑定的标准设备数据 + List standardDevList = adPlanStandardDevMapper.listByPlanId(Collections.singletonList(planId)); + subPlanMetaData.setStandardDevList(standardDevList); + + + // 获取检测计划关联的检测报告模板数据以及文件 + PqReport reportTemplate = SpringUtil.getBean(IPqReportService.class).getById(subPlan.getReportTemplateId()); + subPlanMetaData.setReportTemplate(reportTemplate); + String basePath = reportTemplate.getBasePath(); + + // 导出数据.zip文件 + String jsonStr = JSONUtil.toJsonStr(subPlanMetaData); + try { + // 创建临时目录 + File tempDir = FileUtil.mkdir(FileUtil.getTmpDirPath() + "export_" + System.currentTimeMillis() + "/"); + + // 创建 JSON 文件 + String jsonFileName = subPlan.getName() + ".json"; + File jsonFile = FileUtil.file(tempDir, jsonFileName); + FileUtil.writeUtf8String(jsonStr, jsonFile); + + // 创建 ZIP 文件 + String zipFileName = URLEncoder.encode(subPlan.getName() + ".zip", "UTF-8"); + File zipFile = FileUtil.file(tempDir, zipFileName); + + // 先将json文件添加到zip中 + ZipUtil.zip(jsonFile.getAbsolutePath(), zipFile.getAbsolutePath()); + + // 如果basePath存在,则将basePath中的文件添加到已有的zip文件中 + if (FileUtil.exist(basePath)) { + File baseFile = new File(basePath); + if (baseFile.isDirectory()) { + // 如果是目录,将目录内容添加到zip中 + File[] files = baseFile.listFiles(); + if (files != null && files.length > 0) { + // 创建一个临时目录用于存放所有需要压缩的文件 + File tempZipDir = FileUtil.mkdir(FileUtil.getTmpDirPath() + "zip_temp_" + System.currentTimeMillis() + "/"); + + // 复制json文件到临时目录 + FileUtil.copy(jsonFile, tempZipDir, true); + + // 复制basePath目录下的所有文件到临时目录 + for (File file : files) { + FileUtil.copy(file, tempZipDir, true); + } + + // 重新创建zip文件,包含所有文件 + ZipUtil.zip(tempZipDir.getAbsolutePath(), zipFile.getAbsolutePath()); + + // 删除临时目录 + FileUtil.del(tempZipDir); + } + } else { + // 如果是单个文件,创建一个临时目录存放两个文件 + File tempZipDir = FileUtil.mkdir(FileUtil.getTmpDirPath() + "zip_temp_" + System.currentTimeMillis() + "/"); + + // 复制json文件到临时目录 + FileUtil.copy(jsonFile, tempZipDir, true); + + // 复制baseFile到临时目录 + FileUtil.copy(baseFile, tempZipDir, true); + + // 重新创建zip文件,包含所有文件 + ZipUtil.zip(tempZipDir.getAbsolutePath(), zipFile.getAbsolutePath()); + + // 删除临时目录 + FileUtil.del(tempZipDir); + } + } + + // 设置响应头 + response.reset(); + response.setContentType("application/octet-stream;charset=UTF-8"); + response.setHeader("Content-Disposition", "attachment; filename=\"" + zipFileName + "\""); + + // 将 ZIP 文件写入响应 + ServletOutputStream os = response.getOutputStream(); + FileUtil.writeToStream(zipFile, os); + os.flush(); + os.close(); + + // 删除临时文件 + FileUtil.del(tempDir); + } catch (IOException e) { + log.error("导出子计划.zip文件失败: ", e); + throw new BusinessException(CommonResponseEnum.FAIL); + } + } }