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 00000000..82aefdbf Binary files /dev/null and b/entrance/src/main/resources/model/BaseDataModel.docx differ diff --git a/entrance/src/main/resources/model/BaseModel.docx b/entrance/src/main/resources/model/BaseModel.docx new file mode 100644 index 00000000..815f0447 Binary files /dev/null and b/entrance/src/main/resources/model/BaseModel.docx differ diff --git a/storage/src/main/java/com/njcn/gather/storage/pojo/param/SingleNonHarmParam.java b/storage/src/main/java/com/njcn/gather/storage/pojo/param/SingleNonHarmParam.java new file mode 100644 index 00000000..565db804 --- /dev/null +++ b/storage/src/main/java/com/njcn/gather/storage/pojo/param/SingleNonHarmParam.java @@ -0,0 +1,42 @@ +package com.njcn.gather.storage.pojo.param; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author hongawen + * @version 1.0 + * @data 2025/1/10 16:06 + */ +@Data +public class SingleNonHarmParam implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 检测计划编码 + */ + private Integer planCode; + + /** + * 被检设备ID + */ + private String devId; + + /** + * 通道数 + */ + private Integer channelNo; + + /** + * 测试项类型Id + */ + private String adType; + + /** + * 测试项所在脚本的位置 + */ + private Integer sort; + +} diff --git a/storage/src/main/java/com/njcn/gather/storage/service/AdHarmonicService.java b/storage/src/main/java/com/njcn/gather/storage/service/AdHarmonicService.java index 01009422..67f5a53b 100644 --- a/storage/src/main/java/com/njcn/gather/storage/service/AdHarmonicService.java +++ b/storage/src/main/java/com/njcn/gather/storage/service/AdHarmonicService.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.AdHarmonicResult; @@ -20,7 +21,6 @@ public interface AdHarmonicService extends IService { * 根据设备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() {