From f2fc74d27d5cd78caca4c92992a34a1ead63bd41 Mon Sep 17 00:00:00 2001 From: hongawen <83944980@qq.com> Date: Mon, 13 Jan 2025 09:09:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A5=BC=E4=B8=8B=E6=8A=A5=E5=91=8A=E8=BE=93?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- detection/pom.xml | 29 ++ .../report/controller/ReportController.java | 46 ++ .../gather/report/pojo/DevReportParam.java | 27 ++ .../gather/report/service/IReportService.java | 12 + .../service/impl/ReportServiceImpl.java | 448 ++++++++++++++++++ .../njcn/gather/report/utils/WordUtil.java | 150 ++++++ device/Readme.md | 4 +- .../script/controller/PqScriptController.java | 1 - entrance/pom.xml | 8 + entrance/src/main/resources/application.yml | 2 +- .../main/resources/model/BaseDataModel.docx | Bin 0 -> 27663 bytes .../src/main/resources/model/BaseModel.docx | Bin 0 -> 28281 bytes .../pojo/param/SingleNonHarmParam.java | 42 ++ .../storage/service/AdHarmonicService.java | 4 +- .../storage/service/AdNonHarmonicService.java | 7 + .../service/impl/AdHarmonicServiceImpl.java | 20 + .../impl/AdNonHarmonicServiceImpl.java | 19 + .../system/auth/filter/AuthGlobalFilter.java | 2 +- 18 files changed, 814 insertions(+), 7 deletions(-) create mode 100644 detection/src/main/java/com/njcn/gather/report/controller/ReportController.java create mode 100644 detection/src/main/java/com/njcn/gather/report/pojo/DevReportParam.java create mode 100644 detection/src/main/java/com/njcn/gather/report/service/IReportService.java create mode 100644 detection/src/main/java/com/njcn/gather/report/service/impl/ReportServiceImpl.java create mode 100644 detection/src/main/java/com/njcn/gather/report/utils/WordUtil.java create mode 100644 entrance/src/main/resources/model/BaseDataModel.docx create mode 100644 entrance/src/main/resources/model/BaseModel.docx create mode 100644 storage/src/main/java/com/njcn/gather/storage/pojo/param/SingleNonHarmParam.java diff --git a/detection/pom.xml b/detection/pom.xml index 09036292..a2d0cfaa 100644 --- a/detection/pom.xml +++ b/detection/pom.xml @@ -54,6 +54,35 @@ 1.0.0 compile + + + + + org.apache.poi + poi-scratchpad + 4.1.2 + + + + + org.apache.poi + poi + 4.1.2 + + + + + org.apache.poi + poi-ooxml-schemas + 4.1.2 + + + + org.apache.poi + poi-ooxml + 4.1.2 + + \ No newline at end of file diff --git a/detection/src/main/java/com/njcn/gather/report/controller/ReportController.java b/detection/src/main/java/com/njcn/gather/report/controller/ReportController.java new file mode 100644 index 00000000..b949a753 --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/report/controller/ReportController.java @@ -0,0 +1,46 @@ +package com.njcn.gather.report.controller; + +import com.njcn.common.pojo.annotation.OperateInfo; +import com.njcn.common.utils.LogUtil; +import com.njcn.gather.report.pojo.DevReportParam; +import com.njcn.gather.report.service.IReportService; +import com.njcn.web.controller.BaseController; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + + +/** + * @author hongawen + * @version 1.0 + * @data 2025/1/9 14:02 + */ +@Slf4j +@Api(tags = "报表管理") +@RestController +@RequestMapping("/report") +@RequiredArgsConstructor +public class ReportController extends BaseController { + + private final IReportService reportService; + + /** + * 此方法临时的,给楼下使用,实际需要优化 + * 1、不同的设备需要不同的模板; + * 2、数据页的内容暂时是固定的,后期可能是动态的; + */ + @OperateInfo + @PostMapping("/generateReport") + @ApiOperation("生成测试报告") + @ApiImplicitParam(name = "param", value = "查询参数", required = true) + public void generateReport(@RequestBody DevReportParam devReportParam) { + String methodDescribe = getMethodDescribe("list"); + LogUtil.njcnDebug(log, "{},终端参数为:{}", methodDescribe, devReportParam); + reportService.generateReport(devReportParam); + } + + +} diff --git a/detection/src/main/java/com/njcn/gather/report/pojo/DevReportParam.java b/detection/src/main/java/com/njcn/gather/report/pojo/DevReportParam.java new file mode 100644 index 00000000..5604d63b --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/report/pojo/DevReportParam.java @@ -0,0 +1,27 @@ +package com.njcn.gather.report.pojo; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author hongawen + * @version 1.0 + * @data 2025/1/9 20:55 + */ +@Data +public class DevReportParam implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 计划ID + */ + private String planId; + + /** + * 被检设备ID + */ + private String devId; + +} diff --git a/detection/src/main/java/com/njcn/gather/report/service/IReportService.java b/detection/src/main/java/com/njcn/gather/report/service/IReportService.java new file mode 100644 index 00000000..b8476987 --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/report/service/IReportService.java @@ -0,0 +1,12 @@ +package com.njcn.gather.report.service; + +import com.njcn.gather.report.pojo.DevReportParam; + +/** + * @author hongawen + * @version 1.0 + * @data 2025/1/9 20:59 + */ +public interface IReportService { + void generateReport(DevReportParam devReportParam); +} diff --git a/detection/src/main/java/com/njcn/gather/report/service/impl/ReportServiceImpl.java b/detection/src/main/java/com/njcn/gather/report/service/impl/ReportServiceImpl.java new file mode 100644 index 00000000..d0fe56ec --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/report/service/impl/ReportServiceImpl.java @@ -0,0 +1,448 @@ +package com.njcn.gather.report.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.njcn.common.pojo.enums.common.DataStateEnum; +import com.njcn.common.pojo.exception.BusinessException; +import com.njcn.gather.detection.pojo.vo.DetectionData; +import com.njcn.gather.device.device.pojo.vo.PqDevVO; +import com.njcn.gather.device.device.service.IPqDevService; +import com.njcn.gather.device.script.pojo.po.PqScript; +import com.njcn.gather.device.script.pojo.po.PqScriptCheckData; +import com.njcn.gather.device.script.pojo.po.PqScriptDtls; +import com.njcn.gather.device.script.service.IPqScriptCheckDataService; +import com.njcn.gather.device.script.service.IPqScriptDtlsService; +import com.njcn.gather.plan.pojo.po.AdPlan; +import com.njcn.gather.plan.service.IAdPlanService; +import com.njcn.gather.report.pojo.DevReportParam; +import com.njcn.gather.report.service.IReportService; +import com.njcn.gather.report.utils.WordUtil; +import com.njcn.gather.storage.pojo.param.SingleNonHarmParam; +import com.njcn.gather.storage.pojo.po.AdHarmonicResult; +import com.njcn.gather.storage.pojo.po.AdNonHarmonicResult; +import com.njcn.gather.storage.service.AdHarmonicService; +import com.njcn.gather.storage.service.AdNonHarmonicService; +import com.njcn.gather.system.dictionary.pojo.po.DictData; +import com.njcn.gather.system.dictionary.service.IDictDataService; +import io.swagger.models.auth.In; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.stereotype.Service; + +import java.io.*; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; + +/** + * @author hongawen + * @version 1.0 + * @data 2025/1/9 21:00 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class ReportServiceImpl implements IReportService { + + private final IPqDevService iPqDevService; + + private final IDictDataService dictDataService; + + private final IAdPlanService adPlanService; + + private final IPqScriptDtlsService pqScriptDtlsService; + + private final IPqScriptCheckDataService pqScriptCheckDataService; + + private final AdNonHarmonicService adNonHarmonicService; + + private final AdHarmonicService adHarmonicService; + + + @Override + public void generateReport(DevReportParam devReportParam) { + // 读取模板文件 + Resource baseModel = new ClassPathResource("model/BaseModel.docx"); + try (FileInputStream baseModelFis = new FileInputStream(baseModel.getFile())) { + // 加载Word文档 + XWPFDocument baseModelDocument = new XWPFDocument(baseModelFis); + + // 处理基础模版中的信息 + dealBaseModel(baseModelDocument, devReportParam); + // 处理数据页中的信息 + dealDataModel(baseModelDocument, devReportParam); + //最终文件输出的路径 + FileOutputStream out = new FileOutputStream("C:\\Users\\hongawen\\Desktop\\testModel\\BaseDataModel" + DateUtil.format(new Date(), DatePattern.CHINESE_DATE_TIME_PATTERN) + ".docx"); + // 4. 保存新的Word文档 + try { + baseModelDocument.write(out); + } catch (IOException e) { + throw new BusinessException("生成报告文件失败"); + } + out.close(); + System.out.println("报告生成成功!"); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + + /** + * 处理基础模版中的信息,非数据页报告 + * + * @param baseModelDocument 模板文件 + * @param devReportParam 被检设备参数 + */ + private void dealBaseModel(XWPFDocument baseModelDocument, DevReportParam devReportParam) { + // 首先获取非数据页中需要的信息 + Map baseModelMap = new HashMap<>(16); + PqDevVO pqDevVO = iPqDevService.getPqDevById(devReportParam.getDevId()); + // 获取设备型号 + DictData devTypeDictData = dictDataService.getDictDataById(pqDevVO.getDevType()); + baseModelMap.put("${devType}", devTypeDictData.getName()); + // 调试人员,todo... 待咨询曹泽辉如何获取当前用户信息,目前先写死 + baseModelMap.put("${userName}", "管理员"); + // 调试日期 + baseModelMap.put("${testDate}", DateUtil.format(new Date(), DatePattern.CHINESE_DATE_PATTERN)); + // 装置编码 + baseModelMap.put("${CreateId}", pqDevVO.getCreateId()); + // 额定电流 + baseModelMap.put("${devCurr}", pqDevVO.getDevCurr().toString().concat("A")); + // 额定电压 + baseModelMap.put("${devVolt}", pqDevVO.getDevVolt().toString().concat("V")); + + // 共有多少通道参与测试 +// if (CollectionUtil.isEmpty(pqDevById.getMonitorList())) { +// baseModelMap.put("${count}", "0"); +// } else { +// baseModelMap.put("${count}", pqDevById.getMonitorList().size() + ""); +// } + + baseModelMap.put("${count}", pqDevVO.getDevChns().toString()); + + // 替换模板中的信息,避免信息丢失,段落和表格均参与替换 + WordUtil.replacePlaceholdersInParagraphs(baseModelDocument, baseModelMap); + WordUtil.replacePlaceholdersInTables(baseModelDocument, baseModelMap); + + } + + /** + * 获取数据页的信息 + * + * @param baseModelDocument 非数据页的内容 + * @param devReportParam 查询参数 + */ + private void dealDataModel(XWPFDocument baseModelDocument, DevReportParam devReportParam) throws IOException { + PqDevVO pqDevVO = iPqDevService.getPqDevById(devReportParam.getDevId()); + AdPlan adPlan = adPlanService.getById(devReportParam.getPlanId()); + String scriptId = adPlan.getScriptId(); + Integer devChns = pqDevVO.getDevChns(); + for (int i = 1; i <= devChns; i++) { + Resource dataModel = new ClassPathResource("model/BaseDataModel.docx"); + FileInputStream dataModelFis = new FileInputStream(dataModel.getFile()); + XWPFDocument dataModelDocumentTemp = new XWPFDocument(dataModelFis); + + SingleNonHarmParam singleNonHarmParam = new SingleNonHarmParam(); + singleNonHarmParam.setPlanCode(adPlan.getCode()); + singleNonHarmParam.setDevId(pqDevVO.getId()); + singleNonHarmParam.setChannelNo(i); + + // 获取数据 + Map dataModelMap = new HashMap<>(16); + dataModelMap.put("${CreateId}", pqDevVO.getCreateId()); + dataModelMap.put("${total}", pqDevVO.getDevChns().toString()); + dataModelMap.put("${count}", i + ""); + // 区分谐波和非谐波数据 + // 谐波类 + + + // 非谐波类 + // 57V电压 电压&相角 index 不用计算了,固定为1 +// Integer testItemIndex = getTestItemIndex(scriptId, "e797c4b940389404e64fb92e4507c5f4", "Base", "VOL", 57); + // 获取输出脚本ID + Integer testItemIndex = 1; +// String pqScriptCheckDataService = getPqScriptCheckDataByScriptId(scriptId,testItemIndex,1,Arrays.asList("A","B","C")); + String pqScriptCheckDataService = "8e221487f242c77f1eff05234580d4c5"; + // 获取数据 + singleNonHarmParam.setAdType(pqScriptCheckDataService); + singleNonHarmParam.setSort(testItemIndex); + fillMapValue(singleNonHarmParam, dataModelMap, "57Ua", "57Ub", "57Uc"); + + // 57V相角 + testItemIndex = 1; + pqScriptCheckDataService = "e8bbfaad7a3fa343d3c46d345fb45fa3"; + // 获取数据 + singleNonHarmParam.setAdType(pqScriptCheckDataService); + singleNonHarmParam.setSort(testItemIndex); + fillMapValue(singleNonHarmParam, dataModelMap, "57UaA", "57UbA", "57UcA"); + + // 10V电压 + testItemIndex = 2; + pqScriptCheckDataService = "8e221487f242c77f1eff05234580d4c5"; + // 获取数据 + singleNonHarmParam.setAdType(pqScriptCheckDataService); + singleNonHarmParam.setSort(testItemIndex); + fillMapValue(singleNonHarmParam, dataModelMap, "10Ua", "10Ub", "10Uc"); + + // 5A 电流 + testItemIndex = 3; + pqScriptCheckDataService = "7fbadbeb9dd5ccb69d216f4f9ad60b4f"; + // 获取数据 + singleNonHarmParam.setAdType(pqScriptCheckDataService); + singleNonHarmParam.setSort(testItemIndex); + fillMapValue(singleNonHarmParam, dataModelMap, "5Ia", "5Ib", "5Ic"); + + // 5A 电流相角 + testItemIndex = 3; + pqScriptCheckDataService = "fdffc6b5dfdc8751b9fde9b599b8ea51"; + // 获取数据 + singleNonHarmParam.setAdType(pqScriptCheckDataService); + singleNonHarmParam.setSort(testItemIndex); + fillMapValue(singleNonHarmParam, dataModelMap, "5IaA", "5IbA", "5IcA"); + + // 1A 电流 + testItemIndex = 4; + pqScriptCheckDataService = "7fbadbeb9dd5ccb69d216f4f9ad60b4f"; + // 获取数据 + singleNonHarmParam.setAdType(pqScriptCheckDataService); + singleNonHarmParam.setSort(testItemIndex); + fillMapValue(singleNonHarmParam, dataModelMap, "1Ia", "1Ib", "1Ic"); + + // 电压偏差 + testItemIndex = 5; + pqScriptCheckDataService = "148faabd2630aaac0b70be8609075f69"; + // 获取数据 + singleNonHarmParam.setAdType(pqScriptCheckDataService); + singleNonHarmParam.setSort(testItemIndex); + fillMapValue(singleNonHarmParam, dataModelMap, "DELTA_Ua", "DELTA_Ub", "DELTA_Uc"); + + // 三相电压不平衡度 + testItemIndex = 6; + pqScriptCheckDataService = "9e9910f3627870c7fcf5846342f29d26"; + // 获取数据 + singleNonHarmParam.setAdType(pqScriptCheckDataService); + singleNonHarmParam.setSort(testItemIndex); + fillMapValueT(singleNonHarmParam, dataModelMap, "V_UNBAN"); + + + // 频率 45 + testItemIndex = 7; + pqScriptCheckDataService = "2da2a32c0cd19fb6368b9f4c249c2b3c"; + // 获取数据 + singleNonHarmParam.setAdType(pqScriptCheckDataService); + singleNonHarmParam.setSort(testItemIndex); + fillMapValueT(singleNonHarmParam, dataModelMap, "FREQ45"); + + + // 频率 50 + testItemIndex = 7; + pqScriptCheckDataService = "2da2a32c0cd19fb6368b9f4c249c2b3c"; + // 获取数据 + singleNonHarmParam.setAdType(pqScriptCheckDataService); + singleNonHarmParam.setSort(testItemIndex); + fillMapValueT(singleNonHarmParam, dataModelMap, "FREQ50"); + + + // 频率 55 + testItemIndex = 9; + pqScriptCheckDataService = "2da2a32c0cd19fb6368b9f4c249c2b3c"; + // 获取数据 + singleNonHarmParam.setAdType(pqScriptCheckDataService); + singleNonHarmParam.setSort(testItemIndex); + fillMapValueT(singleNonHarmParam, dataModelMap, "FREQ55"); + + // 谐波电压,少了基波 todo... + testItemIndex = 10; + pqScriptCheckDataService = "cce92410f1902897a61f644d875f2216"; + // 获取数据 + singleNonHarmParam.setAdType(pqScriptCheckDataService); + singleNonHarmParam.setSort(testItemIndex); + fillMapValueHarm(singleNonHarmParam, dataModelMap, "Uha", "Uhb", "Uhc", 57.74); + + // 谐波电电流,少了基波 todo... + testItemIndex = 11; + pqScriptCheckDataService = "3e5e384d38485ca4242152fba336de1d"; + // 获取数据 + singleNonHarmParam.setAdType(pqScriptCheckDataService); + singleNonHarmParam.setSort(testItemIndex); + fillMapValueHarm(singleNonHarmParam, dataModelMap, "Iha", "Ihb", "Ihc", 1); + + // 间谐波电压 + testItemIndex = 12; + pqScriptCheckDataService = "d57ea0e085ecf6c4e9f4da09b948befe"; + // 获取数据 + singleNonHarmParam.setAdType(pqScriptCheckDataService); + singleNonHarmParam.setSort(testItemIndex); + fillMapValueHarm(singleNonHarmParam, dataModelMap, "InUa", "InUb", "InUc", 57.74); + + // 间谐波电流 + testItemIndex = 13; + pqScriptCheckDataService = "6bc58769dcbb2f83a13ff965a20a3cf3"; + // 获取数据 + singleNonHarmParam.setAdType(pqScriptCheckDataService); + singleNonHarmParam.setSort(testItemIndex); + fillMapValueHarm(singleNonHarmParam, dataModelMap, "InIa", "InIb", "InIc", 1); + + + // 替换文档内容 + WordUtil.replacePlaceholdersInParagraphs(dataModelDocumentTemp, dataModelMap); + WordUtil.replacePlaceholdersInTables(dataModelDocumentTemp, dataModelMap); + WordUtil.appendDocument(baseModelDocument, dataModelDocumentTemp); + } + } + + /** + * 填充谐波Map数据 + */ + private void fillMapValueHarm(SingleNonHarmParam singleNonHarmParam, Map dataModelMap, String aSymbol, String bSymbol, String cSymbol, double baseValue) { + AdHarmonicResult adHarmonicResult = adHarmonicService.getSingleResult(singleNonHarmParam); + if (Objects.nonNull(adHarmonicResult)) { + // 要处理 2 5 7 11 23 35 43 50 + dataModelMap.put("${" + aSymbol + "2}", devValue(adHarmonicResult.getAValue2(), baseValue)); + dataModelMap.put("${" + bSymbol + "2}", devValue(adHarmonicResult.getBValue2(), baseValue)); + dataModelMap.put("${" + cSymbol + "2}", devValue(adHarmonicResult.getCValue2(), baseValue)); + + dataModelMap.put("${" + aSymbol + "5}", devValue(adHarmonicResult.getAValue5(), baseValue)); + dataModelMap.put("${" + bSymbol + "5}", devValue(adHarmonicResult.getBValue5(), baseValue)); + dataModelMap.put("${" + cSymbol + "5}", devValue(adHarmonicResult.getCValue5(), baseValue)); + + dataModelMap.put("${" + aSymbol + "7}", devValue(adHarmonicResult.getAValue7(), baseValue)); + dataModelMap.put("${" + bSymbol + "7}", devValue(adHarmonicResult.getBValue7(), baseValue)); + dataModelMap.put("${" + cSymbol + "7}", devValue(adHarmonicResult.getCValue7(), baseValue)); + + dataModelMap.put("${" + aSymbol + "11}", devValue(adHarmonicResult.getAValue11(), baseValue)); + dataModelMap.put("${" + bSymbol + "11}", devValue(adHarmonicResult.getBValue11(), baseValue)); + dataModelMap.put("${" + cSymbol + "11}", devValue(adHarmonicResult.getCValue11(), baseValue)); + + dataModelMap.put("${" + aSymbol + "23}", devValue(adHarmonicResult.getAValue23(), baseValue)); + dataModelMap.put("${" + bSymbol + "23}", devValue(adHarmonicResult.getBValue23(), baseValue)); + dataModelMap.put("${" + cSymbol + "23}", devValue(adHarmonicResult.getCValue23(), baseValue)); + + dataModelMap.put("${" + aSymbol + "35}", devValue(adHarmonicResult.getAValue35(), baseValue)); + dataModelMap.put("${" + bSymbol + "35}", devValue(adHarmonicResult.getBValue35(), baseValue)); + dataModelMap.put("${" + cSymbol + "35}", devValue(adHarmonicResult.getCValue35(), baseValue)); + + dataModelMap.put("${" + aSymbol + "43}", devValue(adHarmonicResult.getAValue43(), baseValue)); + dataModelMap.put("${" + bSymbol + "43}", devValue(adHarmonicResult.getBValue43(), baseValue)); + dataModelMap.put("${" + cSymbol + "43}", devValue(adHarmonicResult.getCValue43(), baseValue)); + + dataModelMap.put("${" + aSymbol + "50}", devValue(adHarmonicResult.getAValue50(), baseValue)); + dataModelMap.put("${" + bSymbol + "50}", devValue(adHarmonicResult.getBValue50(), baseValue)); + dataModelMap.put("${" + cSymbol + "50}", devValue(adHarmonicResult.getCValue50(), baseValue)); + + + } + } + + private String devValue(String dataJson, double baseValue) { + DetectionData tempA = JSONUtil.toBean(dataJson, DetectionData.class); + if (Objects.nonNull(tempA) && Objects.nonNull(tempA.getData())) { + return doubleRound(4, (tempA.getData()/100) * baseValue); + } + return "/"; + } + + + /** + * 填充非谐波Map数据,ABC三相 + */ + private void fillMapValue(SingleNonHarmParam singleNonHarmParam, Map dataModelMap, String aSymbol, String bSymbol, String cSymbol) { + AdNonHarmonicResult adNonHarmonicResult = adNonHarmonicService.getSingleResult(singleNonHarmParam); + if (Objects.nonNull(adNonHarmonicResult)) { + dataModelMap.put("${".concat(aSymbol).concat("}"), devValue(adNonHarmonicResult.getAValue(), 1)); + dataModelMap.put("${".concat(bSymbol).concat("}"), devValue(adNonHarmonicResult.getBValue(), 1)); + dataModelMap.put("${".concat(cSymbol).concat("}"), devValue(adNonHarmonicResult.getCValue(), 1)); + } + } + + /** + * 填充非谐波Map数据,T相 + */ + private void fillMapValueT(SingleNonHarmParam singleNonHarmParam, Map dataModelMap, String tSymbol) { + AdNonHarmonicResult adNonHarmonicResult = adNonHarmonicService.getSingleResult(singleNonHarmParam); + if (Objects.nonNull(adNonHarmonicResult)) { + dataModelMap.put("${".concat(tSymbol).concat("}"), devValue(adNonHarmonicResult.getTValue(), 1)); + } + } + + + private String getPqScriptCheckDataByScriptId(String scriptId, Integer index, Integer errFlag, List phase) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + // todo... 不参与比较的数据没有了 + queryWrapper.eq(PqScriptCheckData::getScriptId, scriptId) + .eq(PqScriptCheckData::getEnable, DataStateEnum.ENABLE.getCode()) + .in(PqScriptCheckData::getPhase, phase) + .eq(PqScriptCheckData::getIndex, index); + List list = pqScriptCheckDataService.list(queryWrapper); + if (CollectionUtil.isNotEmpty(list)) { + return list.get(0).getValueType(); + } + return null; + } + + + public static void main(String[] args) throws IOException { + String path = "F:\\gitea\\fusionForce\\CN_Gather\\entrance\\src\\main\\resources\\model\\BaseDataModel.docx"; + FileInputStream dataModelFis = new FileInputStream(new File(path)); + XWPFDocument dataModelDocumentTemp = new XWPFDocument(dataModelFis); + Map dataModelMap = new HashMap<>(16); + dataModelMap.put("${CreateId}", "123"); + dataModelMap.put("${total}", "123"); + dataModelMap.put("${count}", "1"); + dataModelMap.put("${57Ua}", "123456"); + dataModelMap.put("${Uha1}", "123456"); + dataModelMap.put("${Uha2}", "123456"); + WordUtil.replacePlaceholdersInParagraphs(dataModelDocumentTemp, dataModelMap); + WordUtil.replacePlaceholdersInTables(dataModelDocumentTemp, dataModelMap); + //最终文件输出的路径 + FileOutputStream out = new FileOutputStream("C:\\Users\\hongawen\\Desktop\\testModel\\BaseDataModel" + DateUtil.format(new Date(), DatePattern.CHINESE_DATE_TIME_PATTERN) + ".docx"); + // 4. 保存新的Word文档 + try { + dataModelDocumentTemp.write(out); + } catch (IOException e) { + throw new BusinessException("生成报告文件失败"); + } + out.close(); + System.out.println("报告生成成功!"); + } + + + /** + * 获取测试小项的index + * 注:测试项下发的ABCT的index均是一样的 + */ + private Integer getTestItemIndex(String scriptId, String sourceScriptId, String subType, String valueType, Integer value) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(PqScriptDtls::getScriptId, scriptId) + .eq(PqScriptDtls::getScriptType, sourceScriptId) + .eq(PqScriptDtls::getScriptSubType, subType) + .eq(PqScriptDtls::getValueType, valueType) + .in(PqScriptDtls::getPhase, Arrays.asList("A", "B", "C")) + .eq(PqScriptDtls::getValue, value); + List pqScriptDtls = pqScriptDtlsService.list(queryWrapper); + if (CollectionUtil.isNotEmpty(pqScriptDtls)) { + return pqScriptDtls.get(0).getIndex(); + } + return null; + } + + + /** + * 根据参数返回double的四舍五入值 + * + * @param i 保留的位数 + * @param value double原值 + */ + public static String doubleRound(int i, double value) { + BigDecimal bp = new BigDecimal(value); + return String.format("%.4f", bp.setScale(i, RoundingMode.HALF_UP).doubleValue()); + } + + +} diff --git a/detection/src/main/java/com/njcn/gather/report/utils/WordUtil.java b/detection/src/main/java/com/njcn/gather/report/utils/WordUtil.java new file mode 100644 index 00000000..7fdae256 --- /dev/null +++ b/detection/src/main/java/com/njcn/gather/report/utils/WordUtil.java @@ -0,0 +1,150 @@ +package com.njcn.gather.report.utils; + +import org.apache.poi.xwpf.usermodel.*; + +import java.util.List; +import java.util.Map; + +/** + * @author hongawen + * @version 1.0 + * @data 2025/1/9 20:52 + */ +public class WordUtil { + + + /** + * 将源文档的内容(包括段落、表格等)追加到目标文档中 + * + * @param target 目标文档 + * @param source 源文档 + */ + public static void appendDocument(XWPFDocument target, XWPFDocument source) { + // 在追加内容之前,插入分页符 +// insertPageBreak(target); + // 遍历源文档的所有块(段落、表格等) + source.getBodyElements().forEach(bodyElement -> { + switch (bodyElement.getElementType()) { + case PARAGRAPH: + // 处理段落 + XWPFParagraph sourceParagraph = (XWPFParagraph) bodyElement; + XWPFParagraph newParagraph = target.createParagraph(); + newParagraph.getCTP().set(sourceParagraph.getCTP()); + break; + case TABLE: + // 处理表格 + XWPFTable sourceTable = (XWPFTable) bodyElement; + XWPFTable newTable = target.createTable(); + newTable.getCTTbl().set(sourceTable.getCTTbl()); + break; + default: + // 针对其他类型(如图片、页眉页脚等)可以扩展处理逻辑 + System.out.println("未处理的内容类型:" + bodyElement.getElementType()); + break; + } + }); + } + + private static void insertPageBreak(XWPFDocument target) { + if(!isDocumentEmpty(target)){ + // 获取最后一个页面的段落 + XWPFParagraph pageBreakParagraph = getLastPageParagraph(target); + // 设置分页符 + pageBreakParagraph.setPageBreak(true); + } + + } + + public static boolean isDocumentEmpty(XWPFDocument document) { + // 检查段落 + List paragraphs = document.getParagraphs(); + if (paragraphs != null && !paragraphs.isEmpty()) { + for (XWPFParagraph paragraph : paragraphs) { + if (paragraph.getText() != null && !paragraph.getText().trim().isEmpty()) { + return false; + } + } + } + + // 检查表格 + List tables = document.getTables(); + if (tables != null && !tables.isEmpty()) { + return false; + } + + return true; + } + + public static XWPFParagraph getLastPageParagraph(XWPFDocument document) { + XWPFParagraph lastPageParagraph = null; + for (XWPFParagraph paragraph : document.getParagraphs()) { + lastPageParagraph = paragraph; + } + + return lastPageParagraph; + } + + private static boolean containsPageBreak(XWPFParagraph paragraph) { + for (XWPFRun run : paragraph.getRuns()) { + if (run.getText(0) != null && run.getText(0).contains("\f")) { + return true; + } + } + return false; + } + + + /** + * 替换表格中的占位符 + * @param document 文档 + * @param placeholders 待替换的占位符 + */ + public static void replacePlaceholdersInTables(XWPFDocument document, Map placeholders) { + for (XWPFTable table : document.getTables()) { + for (XWPFTableRow row : table.getRows()) { + for (XWPFTableCell cell : row.getTableCells()) { + for (XWPFParagraph paragraph : cell.getParagraphs()) { + List runs = paragraph.getRuns(); + if (runs != null) { + for (XWPFRun run : runs) { + String text = run.getText(0); + if (text != null) { + for (Map.Entry entry : placeholders.entrySet()) { + text = text.replace(entry.getKey(), entry.getValue()); + } + run.setText(text, 0); + } + } + } + } + } + } + } + } + + + /** + * 替换段落中的占位符 + * @param document 文档 + * @param placeholders 待替换的占位符 + */ + public static void replacePlaceholdersInParagraphs(XWPFDocument document, Map placeholders) { + for (XWPFParagraph paragraph : document.getParagraphs()) { + List runs = paragraph.getRuns(); + if (runs != null) { + for (XWPFRun run : runs) { + String text = run.getText(0); + if (text != null) { + for (Map.Entry entry : placeholders.entrySet()) { + text = text.replace(entry.getKey(), entry.getValue()); + } + run.setText(text, 0); + } + } + } + } + } + + + +} diff --git a/device/Readme.md b/device/Readme.md index f45e8d5c..440dbe1a 100644 --- a/device/Readme.md +++ b/device/Readme.md @@ -3,6 +3,4 @@ * 被检设备管理 * 检测脚本管理 * 误差体系管理 -* 检测源管理 - - \ No newline at end of file +* 检测源管理 \ No newline at end of file diff --git a/device/src/main/java/com/njcn/gather/device/script/controller/PqScriptController.java b/device/src/main/java/com/njcn/gather/device/script/controller/PqScriptController.java index f9cd8d72..67a9452a 100644 --- a/device/src/main/java/com/njcn/gather/device/script/controller/PqScriptController.java +++ b/device/src/main/java/com/njcn/gather/device/script/controller/PqScriptController.java @@ -18,7 +18,6 @@ import com.njcn.gather.device.script.service.IPqScriptDtlsService; import com.njcn.gather.device.script.service.IPqScriptService; import com.njcn.web.controller.BaseController; import com.njcn.web.utils.HttpResultUtil; -import com.sun.xml.internal.bind.v2.runtime.output.SAXOutput; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; diff --git a/entrance/pom.xml b/entrance/pom.xml index d8b91ac8..8122c169 100644 --- a/entrance/pom.xml +++ b/entrance/pom.xml @@ -65,6 +65,14 @@ + + + src/main/resources + + **/* + + + \ No newline at end of file diff --git a/entrance/src/main/resources/application.yml b/entrance/src/main/resources/application.yml index 1869212d..b5b64b21 100644 --- a/entrance/src/main/resources/application.yml +++ b/entrance/src/main/resources/application.yml @@ -6,7 +6,7 @@ spring: datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://192.168.1.24:13306/pqs9100?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=CTT + url: jdbc:mysql://127.0.0.1:13306/pqs9100?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=CTT username: root password: njcnpqs #初始化建立物理连接的个数、最小、最大连接数 diff --git a/entrance/src/main/resources/model/BaseDataModel.docx b/entrance/src/main/resources/model/BaseDataModel.docx new file mode 100644 index 0000000000000000000000000000000000000000..82aefdbfd065d69d50723ab3f5a84a109ce8f875 GIT binary patch literal 27663 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 V1=wHe3kOV^N&xQK@~cPC{{b6*Q5ygN literal 0 HcmV?d00001 diff --git a/entrance/src/main/resources/model/BaseModel.docx b/entrance/src/main/resources/model/BaseModel.docx new file mode 100644 index 0000000000000000000000000000000000000000..815f0447b78eaa493034185e6fd3375a51a62f77 GIT binary patch literal 28281 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 fKcyP}8~8`hPDvK(uh9w { * 根据设备ID和通道号获取谐波结果 * * @param scriptId 脚本id - * @param sort 序号列表 * @param deviceId 设备ID * @param chnNum 通道号,从1开始 * @param code 计划code @@ -45,4 +45,6 @@ public interface AdHarmonicService extends IService { List getIndex(StorageParam param); + + AdHarmonicResult getSingleResult(SingleNonHarmParam singleNonHarmParam); } diff --git a/storage/src/main/java/com/njcn/gather/storage/service/AdNonHarmonicService.java b/storage/src/main/java/com/njcn/gather/storage/service/AdNonHarmonicService.java index bbc8983b..a1640101 100644 --- a/storage/src/main/java/com/njcn/gather/storage/service/AdNonHarmonicService.java +++ b/storage/src/main/java/com/njcn/gather/storage/service/AdNonHarmonicService.java @@ -1,6 +1,7 @@ package com.njcn.gather.storage.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.njcn.gather.storage.pojo.param.SingleNonHarmParam; import com.njcn.gather.storage.pojo.param.StorageParam; import com.njcn.gather.storage.pojo.po.AdBaseResult; import com.njcn.gather.storage.pojo.po.AdNonHarmonicResult; @@ -39,4 +40,10 @@ public interface AdNonHarmonicService extends IService { * @return */ Map listNonHarmResultData(StorageParam param); + + /** + * 根据参数查询指定非谐波结果 + * @param singleNonHarmParam 查询参数 + */ + AdNonHarmonicResult getSingleResult(SingleNonHarmParam singleNonHarmParam); } diff --git a/storage/src/main/java/com/njcn/gather/storage/service/impl/AdHarmonicServiceImpl.java b/storage/src/main/java/com/njcn/gather/storage/service/impl/AdHarmonicServiceImpl.java index ba91e8b1..1d1fc695 100644 --- a/storage/src/main/java/com/njcn/gather/storage/service/impl/AdHarmonicServiceImpl.java +++ b/storage/src/main/java/com/njcn/gather/storage/service/impl/AdHarmonicServiceImpl.java @@ -2,6 +2,7 @@ package com.njcn.gather.storage.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; @@ -11,6 +12,7 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.njcn.db.mybatisplus.handler.DynamicTableNameHandler; import com.njcn.gather.storage.mapper.AdHarmonicMappper; import com.njcn.gather.storage.mapper.AdNonHarmonicMapper; +import com.njcn.gather.storage.pojo.param.SingleNonHarmParam; import com.njcn.gather.storage.pojo.param.StorageParam; import com.njcn.gather.storage.pojo.po.AdBaseResult; import com.njcn.gather.storage.pojo.po.AdHarmonicResult; @@ -191,6 +193,24 @@ public class AdHarmonicServiceImpl extends ServiceImpl wrapper = new MPJLambdaWrapper<>(); + wrapper.like(AdHarmonicResult::getMonitorId, singleNonHarmParam.getDevId() + "_" + singleNonHarmParam.getChannelNo()) + .eq(AdHarmonicResult::getSort, singleNonHarmParam.getSort()) + .eq(AdHarmonicResult::getAdType, singleNonHarmParam.getAdType()); + List adHarmonicResults = this.getBaseMapper().selectJoinList(AdHarmonicResult.class, wrapper); + if (CollectionUtil.isNotEmpty(adHarmonicResults)){ + return adHarmonicResults.get(0); + } + } + return null; + } + + public Double isHarmOrInHarm(Double value) { if (value == value.longValue()) { return value; diff --git a/storage/src/main/java/com/njcn/gather/storage/service/impl/AdNonHarmonicServiceImpl.java b/storage/src/main/java/com/njcn/gather/storage/service/impl/AdNonHarmonicServiceImpl.java index c554cb02..c6a344ce 100644 --- a/storage/src/main/java/com/njcn/gather/storage/service/impl/AdNonHarmonicServiceImpl.java +++ b/storage/src/main/java/com/njcn/gather/storage/service/impl/AdNonHarmonicServiceImpl.java @@ -2,6 +2,7 @@ package com.njcn.gather.storage.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; @@ -9,6 +10,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.njcn.db.mybatisplus.handler.DynamicTableNameHandler; import com.njcn.gather.storage.mapper.AdNonHarmonicMapper; +import com.njcn.gather.storage.pojo.param.SingleNonHarmParam; import com.njcn.gather.storage.pojo.param.StorageParam; import com.njcn.gather.storage.pojo.po.AdBaseResult; import com.njcn.gather.storage.pojo.po.AdNonHarmonicResult; @@ -131,6 +133,23 @@ public class AdNonHarmonicServiceImpl extends ServiceImpl wrapper = new MPJLambdaWrapper<>(); + wrapper.like(AdNonHarmonicResult::getMonitorId, singleNonHarmParam.getDevId() + "_" + singleNonHarmParam.getChannelNo()) + .eq(AdNonHarmonicResult::getSort, singleNonHarmParam.getSort()) + .eq(AdNonHarmonicResult::getAdType, singleNonHarmParam.getAdType()); + List adHarmonicResults = this.getBaseMapper().selectJoinList(AdNonHarmonicResult.class, wrapper); + if (CollectionUtil.isNotEmpty(adHarmonicResults)){ + return adHarmonicResults.get(0); + } + } + return null; + } + private String unit(String code){ String unit=""; switch (code) { diff --git a/system/src/main/java/com/njcn/gather/system/auth/filter/AuthGlobalFilter.java b/system/src/main/java/com/njcn/gather/system/auth/filter/AuthGlobalFilter.java index 28c3f057..aa5d8946 100644 --- a/system/src/main/java/com/njcn/gather/system/auth/filter/AuthGlobalFilter.java +++ b/system/src/main/java/com/njcn/gather/system/auth/filter/AuthGlobalFilter.java @@ -22,7 +22,7 @@ import java.util.List; @Slf4j @Component public class AuthGlobalFilter implements Filter, Ordered { - private final static List IGNORE_URI = Arrays.asList("/admin/login"); + private final static List IGNORE_URI = Arrays.asList("/admin/login","/report/generateReport"); @Override public int getOrder() {