diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java index 5dbe969..2160c5f 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java @@ -46,7 +46,6 @@ // TODO: 2023/10/10 柴壮:检定数据管理中点击生成原始记录和检定证书(生成证书和原始记录编号,二者编号相同),找到模板、填充模板,调用草稿箱保存接口后(保证编号填充时和保存草稿一致), // 即在保存草稿箱接口中保存成功后实现填充模板逻辑,最后提供查询接口显示在检定审批管理新建页面 - @ApiOperation("草稿箱-保存") @PostMapping("/save") public ReturnDTO addMeasureApproval(@RequestBody @Valid BizBusinessDeviceMeasureApproval MeasureApproval) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java index 5dbe969..2160c5f 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java @@ -46,7 +46,6 @@ // TODO: 2023/10/10 柴壮:检定数据管理中点击生成原始记录和检定证书(生成证书和原始记录编号,二者编号相同),找到模板、填充模板,调用草稿箱保存接口后(保证编号填充时和保存草稿一致), // 即在保存草稿箱接口中保存成功后实现填充模板逻辑,最后提供查询接口显示在检定审批管理新建页面 - @ApiOperation("草稿箱-保存") @PostMapping("/save") public ReturnDTO addMeasureApproval(@RequestBody @Valid BizBusinessDeviceMeasureApproval MeasureApproval) { diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java index b510327..6412cc8 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java @@ -8,13 +8,30 @@ public interface MeasureCategoryEnum { - String MEASURE_ITEMS_WITHOUT_CERTIFICATE = ""; + String MEASURE_ITEMS_WITHOUT_CERTIFICATE = "多功能电力参数测量仪-原始记录、交流电压表、交流电流表、直流电压表、直流电流表、75mV电流表"; /** * 测试 */ String TEST_REPORT = "测试"; + + /** + * 校准 + */ + String CALIBRATE_REPORT = "校准"; + + /** + * 检定 + */ + String MEASURE_REPORT = "检定"; + + /** + * 校验 + */ + String CHECKOUT_REPORT = "校验"; + + /** * 检定有效日期 */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java index 5dbe969..2160c5f 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java @@ -46,7 +46,6 @@ // TODO: 2023/10/10 柴壮:检定数据管理中点击生成原始记录和检定证书(生成证书和原始记录编号,二者编号相同),找到模板、填充模板,调用草稿箱保存接口后(保证编号填充时和保存草稿一致), // 即在保存草稿箱接口中保存成功后实现填充模板逻辑,最后提供查询接口显示在检定审批管理新建页面 - @ApiOperation("草稿箱-保存") @PostMapping("/save") public ReturnDTO addMeasureApproval(@RequestBody @Valid BizBusinessDeviceMeasureApproval MeasureApproval) { diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java index b510327..6412cc8 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java @@ -8,13 +8,30 @@ public interface MeasureCategoryEnum { - String MEASURE_ITEMS_WITHOUT_CERTIFICATE = ""; + String MEASURE_ITEMS_WITHOUT_CERTIFICATE = "多功能电力参数测量仪-原始记录、交流电压表、交流电流表、直流电压表、直流电流表、75mV电流表"; /** * 测试 */ String TEST_REPORT = "测试"; + + /** + * 校准 + */ + String CALIBRATE_REPORT = "校准"; + + /** + * 检定 + */ + String MEASURE_REPORT = "检定"; + + /** + * 校验 + */ + String CHECKOUT_REPORT = "校验"; + + /** * 检定有效日期 */ diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java index 00d69ef..39a838a 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java @@ -254,6 +254,7 @@ @TableField(exist = false) private List measureDataCalibratorList; + @ApiModelProperty(value = "依据的技术文件(前端必传,打印需要)", dataType = "String") @TableField(exist = false) private String technologyFile; diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java index 5dbe969..2160c5f 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java @@ -46,7 +46,6 @@ // TODO: 2023/10/10 柴壮:检定数据管理中点击生成原始记录和检定证书(生成证书和原始记录编号,二者编号相同),找到模板、填充模板,调用草稿箱保存接口后(保证编号填充时和保存草稿一致), // 即在保存草稿箱接口中保存成功后实现填充模板逻辑,最后提供查询接口显示在检定审批管理新建页面 - @ApiOperation("草稿箱-保存") @PostMapping("/save") public ReturnDTO addMeasureApproval(@RequestBody @Valid BizBusinessDeviceMeasureApproval MeasureApproval) { diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java index b510327..6412cc8 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java @@ -8,13 +8,30 @@ public interface MeasureCategoryEnum { - String MEASURE_ITEMS_WITHOUT_CERTIFICATE = ""; + String MEASURE_ITEMS_WITHOUT_CERTIFICATE = "多功能电力参数测量仪-原始记录、交流电压表、交流电流表、直流电压表、直流电流表、75mV电流表"; /** * 测试 */ String TEST_REPORT = "测试"; + + /** + * 校准 + */ + String CALIBRATE_REPORT = "校准"; + + /** + * 检定 + */ + String MEASURE_REPORT = "检定"; + + /** + * 校验 + */ + String CHECKOUT_REPORT = "校验"; + + /** * 检定有效日期 */ diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java index 00d69ef..39a838a 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java @@ -254,6 +254,7 @@ @TableField(exist = false) private List measureDataCalibratorList; + @ApiModelProperty(value = "依据的技术文件(前端必传,打印需要)", dataType = "String") @TableField(exist = false) private String technologyFile; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BizBusinessDeviceMeasureApprovalServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BizBusinessDeviceMeasureApprovalServiceImpl.java index e3f8000..a510c41 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BizBusinessDeviceMeasureApprovalServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BizBusinessDeviceMeasureApprovalServiceImpl.java @@ -1,7 +1,9 @@ package com.casic.missiles.service.Impl.business; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.page.PageFactory; @@ -21,21 +23,25 @@ import com.casic.missiles.mapper.business.BizBusinessDeviceMeasureApprovalMapper; import com.casic.missiles.mapper.business.BusinessLabExecutiveInfoMapper; import com.casic.missiles.model.business.BizBusinessDeviceMeasureApproval; +import com.casic.missiles.model.business.BizBusinessDeviceMeasureDataCalibrator; import com.casic.missiles.model.business.BizBusinessDeviceMeasureInfo; import com.casic.missiles.service.Impl.GeneralApprovalServiceImpl; import com.casic.missiles.service.business.IBizBusinessDeviceMeasureApprovalService; import com.casic.missiles.service.listeners.register.PrintFileRegister; import com.casic.missiles.utils.DictCodeUtils; import com.casic.missiles.utils.NoGeneratorUtil; +import com.casic.missiles.utils.SnowflakeUtil; import com.casic.missiles.utils.SpringContextUtil; import liquibase.pro.packaged.F; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.*; +import java.util.stream.Collectors; /** *

@@ -47,10 +53,12 @@ */ @Service public class BizBusinessDeviceMeasureApprovalServiceImpl extends GeneralApprovalServiceImpl implements IBizBusinessDeviceMeasureApprovalService, PrintFileModuleNameEnum, MeasureCategoryEnum { - @Autowired + @Resource private BusinessLabExecutiveInfoMapper labExecutiveInfoMapper; @Autowired private PrintFileRegister printFileRegister; + @Resource + private SnowflakeUtil snowflakeUtil; @Override public ReturnDTO addMeasureApproval(BizBusinessDeviceMeasureApproval request) { @@ -63,10 +71,10 @@ request.setCreateUserName(request.getUserName()); request.setApprovalStatus(ApprovalStatusEnum.DRAFT); //草稿箱状态 request.setCertificateNo(certNo); - int row = this.baseMapper.insert(request); - Assert.isFalse(row <= 0, () -> { - throw new BusinessException(BusinessExceptionEnum.MEASURE_APPROVAL_SAVE_FAILED); - }); +// int row = this.baseMapper.insert(request); +// Assert.isFalse(row <= 0, () -> { +// throw new BusinessException(BusinessExceptionEnum.MEASURE_APPROVAL_SAVE_FAILED); +// }); DeviceMeasureApprovalSaveResponse saveResponse = new DeviceMeasureApprovalSaveResponse(); saveResponse.setId(request.getId()); saveResponse.setCertNo(certNo); @@ -102,10 +110,11 @@ //生成原始记录的线程 CompletableFuture originalFutureTask = CompletableFuture.supplyAsync( () -> createOriginalFile(request), threadPool); + //等到所有线程异步结束 CompletableFuture combinedFuture = CompletableFuture.allOf(certificateFutureTask, originalFutureTask); - combinedFuture.thenAccept(result -> { + combinedFuture.thenRunAsync(() -> { try { - //执行线程 + //获取结果 String certificateFileUrl = certificateFutureTask.join(); String originalRecordFileUrl = originalFutureTask.join(); //生成证书文件 @@ -113,8 +122,8 @@ //原始记录文件 request.setOriginalRecordFile(originalRecordFileUrl); BizBusinessDeviceMeasureApprovalMapper bizBusinessMapper = SpringContextUtil.getBean(BizBusinessDeviceMeasureApprovalMapper.class); - //更新 - bizBusinessMapper.updateById(request); + //更新记录文件 +// bizBusinessMapper.updateById(request); } catch (Exception ex) { throw new BusinessException(BusinessExceptionEnum.MEASURE_APPROVAL_UPDATE_FAILED); } @@ -123,10 +132,16 @@ private String createCertificateFile(BizBusinessDeviceMeasureApproval measureItemInfo) { try { + //过滤不能生成原始记录的报告 if (checkOutUnablePrint(measureItemInfo)) { return ""; } semaphore.acquire(); + if (CollectionUtil.isEmpty(measureItemInfo.getMeasureDataCalibratorList())) { + List bizBusinessDeviceMeasureDataCalibrators = new ArrayList<>(); + bizBusinessDeviceMeasureDataCalibrators.add(new BizBusinessDeviceMeasureDataCalibrator()); + measureItemInfo.setMeasureDataCalibratorList(bizBusinessDeviceMeasureDataCalibrators); + } Map map = BeanUtil.beanToMap(measureItemInfo); //准备封面参数 prepareCoverParams(map, measureItemInfo.getLabCode()); @@ -135,6 +150,7 @@ //这一块逻辑比较复杂 customTemplateUrls.add(bizBusinessMapper.customTemplateUrl(MEASURE_DATA, "2", measureItemInfo.getMeasureCategoryName())); customTemplateUrls.add(bizBusinessMapper.customTemplateUrl(MEASURE_DATA, "2", "数字记录表内容")); + map.put("id", snowflakeUtil.nextId()); //除了选用的模板不一致,模板配置流程是一致的 return printFileRegister.registerPrintFile(MEASURE_DATA, "证书打印", null, map, false, null, customTemplateUrls); } catch (Exception ex) { @@ -149,13 +165,22 @@ private String createOriginalFile(BizBusinessDeviceMeasureApproval measureItemInfo) { try { semaphore.acquire(); + if (CollectionUtil.isEmpty(measureItemInfo.getMeasureDataCalibratorList())) { + List bizBusinessDeviceMeasureDataCalibrators = new ArrayList<>(); + bizBusinessDeviceMeasureDataCalibrators.add(new BizBusinessDeviceMeasureDataCalibrator()); + measureItemInfo.setMeasureDataCalibratorList(bizBusinessDeviceMeasureDataCalibrators); + } Map map = BeanUtil.beanToMap(measureItemInfo); List customTemplateUrls = new ArrayList<>(); BizBusinessDeviceMeasureApprovalMapper bizBusinessMapper = SpringContextUtil.getBean(BizBusinessDeviceMeasureApprovalMapper.class); //准备封面参数 prepareCoverParams(map, measureItemInfo.getLabCode()); + //定制化原始记录参数 + prepareCustomCoverParams(map, measureItemInfo.getMeasureDataCalibratorList()); //这一块逻辑比较复杂 customTemplateUrls.add(bizBusinessMapper.customTemplateUrl(MEASURE_DATA, "1", measureItemInfo.getItemCategoryName())); + //与证书模板区分 + map.put("id", snowflakeUtil.nextId()); //除了选用的模板不一致,模板配置流程是一致的 return printFileRegister.registerPrintFile(MEASURE_DATA, "原始记录打印", null, map, false, null, customTemplateUrls); } catch (Exception ex) { @@ -173,7 +198,7 @@ log.warn(BusinessExceptionEnum.ITEM_CATEGORY_NOT_NULL.getMessage()); return true; } - if (measureItemInfo.getMeasureCategoryName().equals(TEST_REPORT)) { + if (CHECKOUT_REPORT.equals(measureItemInfo.getMeasureCategoryName())) { log.warn(BusinessExceptionEnum.TEST_CATEGORY_IS_NONE.getMessage()); return true; } @@ -188,23 +213,12 @@ * 填充固定的信息参数 */ private void prepareCoverParams(Map map, String labCode) { - if (ObjectUtils.isNotEmpty(map.get(MEASURE_VALID_DATE))) { - String measureValidDate = (String) map.get(MEASURE_VALID_DATE); - Calendar calendar = Calendar.getInstance(); - try { - calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(measureValidDate)); - } catch (Exception e) { - throw new BusinessException(1500, String.format(measureValidDate, "检定有效日期,格式不正确")); - } - //设置时间 - map.put(MEASURE_VALID_Y, calendar.get(Calendar.YEAR)); - map.put(MEASURE_VALID_M, calendar.get(Calendar.MONTH) + 1); - map.put(MEASURE_VALID_D, calendar.get(Calendar.DAY_OF_MONTH)); - } + //健壮性校验 if (StringUtils.isEmpty(labCode)) { log.warn("组织接口不能传入为空,打印文档生成文档填充组织失败..."); return; } + //西昌海口基本信息录入 if ("x".equals(labCode)) { map.put("s", XICHANG); map.put("communicationAddress", XICHANG_ADDRESS); @@ -219,7 +233,79 @@ map.put("postalCode", HAIKOU_POSTAL_CODE); } } + } + private void prepareCustomCoverParams(Map map, List measureDataCalibrators) { + //定制参数 + doCustomParam(map, measureDataCalibrators); + //初始化方框 + map.put("test", "\uF0A3"); + map.put("calibrate", "\uF0A3"); + map.put("measure", "\uF0A3"); + //选择方框 + switch ((String) map.get("measureCategoryName")) { + case TEST_REPORT: + map.put("test", "\uF052"); + break; + case CALIBRATE_REPORT: + map.put("calibrate", "\uF052"); + break; + case MEASURE_REPORT: + map.put("measure", "\uF052"); + break; + default: + return; + } + //填充有效日期 + if (ObjectUtils.isNotEmpty(map.get(MEASURE_VALID_DATE))) { + String measureValidDate = (String) map.get(MEASURE_VALID_DATE); + Calendar calendar = Calendar.getInstance(); + try { + calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(measureValidDate)); + } catch (Exception e) { + throw new BusinessException(1500, String.format(measureValidDate, "检定有效日期,格式不正确")); + } + //设置时间 + map.put(MEASURE_VALID_Y, calendar.get(Calendar.YEAR)); + map.put(MEASURE_VALID_M, calendar.get(Calendar.MONTH) + 1); + map.put(MEASURE_VALID_D, calendar.get(Calendar.DAY_OF_MONTH)); + } + + } + + /** + * 直流电压表没有HZ + * 多功能 + * + * @param map + */ + private void doCustomParam(Map map, List measureDataCalibrators) { + if (StringUtils.isNotEmpty((String) map.get("itemCategoryName"))) { + //直流表,交流表 75mv电压表定制表格内容 + if (((String) map.get("itemCategoryName")).contains("交流")) { + map.put("fName", "频率:"); + map.put("frequency", measureDataCalibrators.get(0).getFrequency()); + map.put("frequencyUnit", measureDataCalibrators.get(0).getFrequencyUnit()); + } + //多功能电力参数仪定制表格内容 + if (((String) map.get("itemCategoryName")).contains("多功能")) { + Map> measureDataMap = measureDataCalibrators.stream().collect( + Collectors.groupingBy(BizBusinessDeviceMeasureDataCalibrator::getParams) + ); + if (measureDataMap.containsKey("ACV") && CollectionUtils.isNotEmpty(measureDataMap.get("ACV"))) { + map.put("frequency2", measureDataMap.get("ACV").get(0).getFrequency()); + map.put("frequencyUnit2", measureDataMap.get("ACV").get(0).getFrequencyUnit()); + map.put("unit2", measureDataMap.get("ACV").get(0).getUnit()); + map.put("measureDataCalibratorListV", measureDataMap.get("ACV")); + } + if (measureDataMap.containsKey("ACI") && CollectionUtils.isNotEmpty(measureDataMap.get("ACI"))) { + map.put("frequency1", measureDataMap.get("ACI").get(0).getFrequency()); + map.put("frequencyUnit1", measureDataMap.get("ACI").get(0).getFrequencyUnit()); + map.put("unit1", measureDataMap.get("ACI").get(0).getUnit()); + map.put("measureDataCalibratorListI", measureDataMap.get("ACI")); + } + } + } } @Override diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java index 5dbe969..2160c5f 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java @@ -46,7 +46,6 @@ // TODO: 2023/10/10 柴壮:检定数据管理中点击生成原始记录和检定证书(生成证书和原始记录编号,二者编号相同),找到模板、填充模板,调用草稿箱保存接口后(保证编号填充时和保存草稿一致), // 即在保存草稿箱接口中保存成功后实现填充模板逻辑,最后提供查询接口显示在检定审批管理新建页面 - @ApiOperation("草稿箱-保存") @PostMapping("/save") public ReturnDTO addMeasureApproval(@RequestBody @Valid BizBusinessDeviceMeasureApproval MeasureApproval) { diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java index b510327..6412cc8 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java @@ -8,13 +8,30 @@ public interface MeasureCategoryEnum { - String MEASURE_ITEMS_WITHOUT_CERTIFICATE = ""; + String MEASURE_ITEMS_WITHOUT_CERTIFICATE = "多功能电力参数测量仪-原始记录、交流电压表、交流电流表、直流电压表、直流电流表、75mV电流表"; /** * 测试 */ String TEST_REPORT = "测试"; + + /** + * 校准 + */ + String CALIBRATE_REPORT = "校准"; + + /** + * 检定 + */ + String MEASURE_REPORT = "检定"; + + /** + * 校验 + */ + String CHECKOUT_REPORT = "校验"; + + /** * 检定有效日期 */ diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java index 00d69ef..39a838a 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java @@ -254,6 +254,7 @@ @TableField(exist = false) private List measureDataCalibratorList; + @ApiModelProperty(value = "依据的技术文件(前端必传,打印需要)", dataType = "String") @TableField(exist = false) private String technologyFile; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BizBusinessDeviceMeasureApprovalServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BizBusinessDeviceMeasureApprovalServiceImpl.java index e3f8000..a510c41 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BizBusinessDeviceMeasureApprovalServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BizBusinessDeviceMeasureApprovalServiceImpl.java @@ -1,7 +1,9 @@ package com.casic.missiles.service.Impl.business; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.page.PageFactory; @@ -21,21 +23,25 @@ import com.casic.missiles.mapper.business.BizBusinessDeviceMeasureApprovalMapper; import com.casic.missiles.mapper.business.BusinessLabExecutiveInfoMapper; import com.casic.missiles.model.business.BizBusinessDeviceMeasureApproval; +import com.casic.missiles.model.business.BizBusinessDeviceMeasureDataCalibrator; import com.casic.missiles.model.business.BizBusinessDeviceMeasureInfo; import com.casic.missiles.service.Impl.GeneralApprovalServiceImpl; import com.casic.missiles.service.business.IBizBusinessDeviceMeasureApprovalService; import com.casic.missiles.service.listeners.register.PrintFileRegister; import com.casic.missiles.utils.DictCodeUtils; import com.casic.missiles.utils.NoGeneratorUtil; +import com.casic.missiles.utils.SnowflakeUtil; import com.casic.missiles.utils.SpringContextUtil; import liquibase.pro.packaged.F; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.*; +import java.util.stream.Collectors; /** *

@@ -47,10 +53,12 @@ */ @Service public class BizBusinessDeviceMeasureApprovalServiceImpl extends GeneralApprovalServiceImpl implements IBizBusinessDeviceMeasureApprovalService, PrintFileModuleNameEnum, MeasureCategoryEnum { - @Autowired + @Resource private BusinessLabExecutiveInfoMapper labExecutiveInfoMapper; @Autowired private PrintFileRegister printFileRegister; + @Resource + private SnowflakeUtil snowflakeUtil; @Override public ReturnDTO addMeasureApproval(BizBusinessDeviceMeasureApproval request) { @@ -63,10 +71,10 @@ request.setCreateUserName(request.getUserName()); request.setApprovalStatus(ApprovalStatusEnum.DRAFT); //草稿箱状态 request.setCertificateNo(certNo); - int row = this.baseMapper.insert(request); - Assert.isFalse(row <= 0, () -> { - throw new BusinessException(BusinessExceptionEnum.MEASURE_APPROVAL_SAVE_FAILED); - }); +// int row = this.baseMapper.insert(request); +// Assert.isFalse(row <= 0, () -> { +// throw new BusinessException(BusinessExceptionEnum.MEASURE_APPROVAL_SAVE_FAILED); +// }); DeviceMeasureApprovalSaveResponse saveResponse = new DeviceMeasureApprovalSaveResponse(); saveResponse.setId(request.getId()); saveResponse.setCertNo(certNo); @@ -102,10 +110,11 @@ //生成原始记录的线程 CompletableFuture originalFutureTask = CompletableFuture.supplyAsync( () -> createOriginalFile(request), threadPool); + //等到所有线程异步结束 CompletableFuture combinedFuture = CompletableFuture.allOf(certificateFutureTask, originalFutureTask); - combinedFuture.thenAccept(result -> { + combinedFuture.thenRunAsync(() -> { try { - //执行线程 + //获取结果 String certificateFileUrl = certificateFutureTask.join(); String originalRecordFileUrl = originalFutureTask.join(); //生成证书文件 @@ -113,8 +122,8 @@ //原始记录文件 request.setOriginalRecordFile(originalRecordFileUrl); BizBusinessDeviceMeasureApprovalMapper bizBusinessMapper = SpringContextUtil.getBean(BizBusinessDeviceMeasureApprovalMapper.class); - //更新 - bizBusinessMapper.updateById(request); + //更新记录文件 +// bizBusinessMapper.updateById(request); } catch (Exception ex) { throw new BusinessException(BusinessExceptionEnum.MEASURE_APPROVAL_UPDATE_FAILED); } @@ -123,10 +132,16 @@ private String createCertificateFile(BizBusinessDeviceMeasureApproval measureItemInfo) { try { + //过滤不能生成原始记录的报告 if (checkOutUnablePrint(measureItemInfo)) { return ""; } semaphore.acquire(); + if (CollectionUtil.isEmpty(measureItemInfo.getMeasureDataCalibratorList())) { + List bizBusinessDeviceMeasureDataCalibrators = new ArrayList<>(); + bizBusinessDeviceMeasureDataCalibrators.add(new BizBusinessDeviceMeasureDataCalibrator()); + measureItemInfo.setMeasureDataCalibratorList(bizBusinessDeviceMeasureDataCalibrators); + } Map map = BeanUtil.beanToMap(measureItemInfo); //准备封面参数 prepareCoverParams(map, measureItemInfo.getLabCode()); @@ -135,6 +150,7 @@ //这一块逻辑比较复杂 customTemplateUrls.add(bizBusinessMapper.customTemplateUrl(MEASURE_DATA, "2", measureItemInfo.getMeasureCategoryName())); customTemplateUrls.add(bizBusinessMapper.customTemplateUrl(MEASURE_DATA, "2", "数字记录表内容")); + map.put("id", snowflakeUtil.nextId()); //除了选用的模板不一致,模板配置流程是一致的 return printFileRegister.registerPrintFile(MEASURE_DATA, "证书打印", null, map, false, null, customTemplateUrls); } catch (Exception ex) { @@ -149,13 +165,22 @@ private String createOriginalFile(BizBusinessDeviceMeasureApproval measureItemInfo) { try { semaphore.acquire(); + if (CollectionUtil.isEmpty(measureItemInfo.getMeasureDataCalibratorList())) { + List bizBusinessDeviceMeasureDataCalibrators = new ArrayList<>(); + bizBusinessDeviceMeasureDataCalibrators.add(new BizBusinessDeviceMeasureDataCalibrator()); + measureItemInfo.setMeasureDataCalibratorList(bizBusinessDeviceMeasureDataCalibrators); + } Map map = BeanUtil.beanToMap(measureItemInfo); List customTemplateUrls = new ArrayList<>(); BizBusinessDeviceMeasureApprovalMapper bizBusinessMapper = SpringContextUtil.getBean(BizBusinessDeviceMeasureApprovalMapper.class); //准备封面参数 prepareCoverParams(map, measureItemInfo.getLabCode()); + //定制化原始记录参数 + prepareCustomCoverParams(map, measureItemInfo.getMeasureDataCalibratorList()); //这一块逻辑比较复杂 customTemplateUrls.add(bizBusinessMapper.customTemplateUrl(MEASURE_DATA, "1", measureItemInfo.getItemCategoryName())); + //与证书模板区分 + map.put("id", snowflakeUtil.nextId()); //除了选用的模板不一致,模板配置流程是一致的 return printFileRegister.registerPrintFile(MEASURE_DATA, "原始记录打印", null, map, false, null, customTemplateUrls); } catch (Exception ex) { @@ -173,7 +198,7 @@ log.warn(BusinessExceptionEnum.ITEM_CATEGORY_NOT_NULL.getMessage()); return true; } - if (measureItemInfo.getMeasureCategoryName().equals(TEST_REPORT)) { + if (CHECKOUT_REPORT.equals(measureItemInfo.getMeasureCategoryName())) { log.warn(BusinessExceptionEnum.TEST_CATEGORY_IS_NONE.getMessage()); return true; } @@ -188,23 +213,12 @@ * 填充固定的信息参数 */ private void prepareCoverParams(Map map, String labCode) { - if (ObjectUtils.isNotEmpty(map.get(MEASURE_VALID_DATE))) { - String measureValidDate = (String) map.get(MEASURE_VALID_DATE); - Calendar calendar = Calendar.getInstance(); - try { - calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(measureValidDate)); - } catch (Exception e) { - throw new BusinessException(1500, String.format(measureValidDate, "检定有效日期,格式不正确")); - } - //设置时间 - map.put(MEASURE_VALID_Y, calendar.get(Calendar.YEAR)); - map.put(MEASURE_VALID_M, calendar.get(Calendar.MONTH) + 1); - map.put(MEASURE_VALID_D, calendar.get(Calendar.DAY_OF_MONTH)); - } + //健壮性校验 if (StringUtils.isEmpty(labCode)) { log.warn("组织接口不能传入为空,打印文档生成文档填充组织失败..."); return; } + //西昌海口基本信息录入 if ("x".equals(labCode)) { map.put("s", XICHANG); map.put("communicationAddress", XICHANG_ADDRESS); @@ -219,7 +233,79 @@ map.put("postalCode", HAIKOU_POSTAL_CODE); } } + } + private void prepareCustomCoverParams(Map map, List measureDataCalibrators) { + //定制参数 + doCustomParam(map, measureDataCalibrators); + //初始化方框 + map.put("test", "\uF0A3"); + map.put("calibrate", "\uF0A3"); + map.put("measure", "\uF0A3"); + //选择方框 + switch ((String) map.get("measureCategoryName")) { + case TEST_REPORT: + map.put("test", "\uF052"); + break; + case CALIBRATE_REPORT: + map.put("calibrate", "\uF052"); + break; + case MEASURE_REPORT: + map.put("measure", "\uF052"); + break; + default: + return; + } + //填充有效日期 + if (ObjectUtils.isNotEmpty(map.get(MEASURE_VALID_DATE))) { + String measureValidDate = (String) map.get(MEASURE_VALID_DATE); + Calendar calendar = Calendar.getInstance(); + try { + calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(measureValidDate)); + } catch (Exception e) { + throw new BusinessException(1500, String.format(measureValidDate, "检定有效日期,格式不正确")); + } + //设置时间 + map.put(MEASURE_VALID_Y, calendar.get(Calendar.YEAR)); + map.put(MEASURE_VALID_M, calendar.get(Calendar.MONTH) + 1); + map.put(MEASURE_VALID_D, calendar.get(Calendar.DAY_OF_MONTH)); + } + + } + + /** + * 直流电压表没有HZ + * 多功能 + * + * @param map + */ + private void doCustomParam(Map map, List measureDataCalibrators) { + if (StringUtils.isNotEmpty((String) map.get("itemCategoryName"))) { + //直流表,交流表 75mv电压表定制表格内容 + if (((String) map.get("itemCategoryName")).contains("交流")) { + map.put("fName", "频率:"); + map.put("frequency", measureDataCalibrators.get(0).getFrequency()); + map.put("frequencyUnit", measureDataCalibrators.get(0).getFrequencyUnit()); + } + //多功能电力参数仪定制表格内容 + if (((String) map.get("itemCategoryName")).contains("多功能")) { + Map> measureDataMap = measureDataCalibrators.stream().collect( + Collectors.groupingBy(BizBusinessDeviceMeasureDataCalibrator::getParams) + ); + if (measureDataMap.containsKey("ACV") && CollectionUtils.isNotEmpty(measureDataMap.get("ACV"))) { + map.put("frequency2", measureDataMap.get("ACV").get(0).getFrequency()); + map.put("frequencyUnit2", measureDataMap.get("ACV").get(0).getFrequencyUnit()); + map.put("unit2", measureDataMap.get("ACV").get(0).getUnit()); + map.put("measureDataCalibratorListV", measureDataMap.get("ACV")); + } + if (measureDataMap.containsKey("ACI") && CollectionUtils.isNotEmpty(measureDataMap.get("ACI"))) { + map.put("frequency1", measureDataMap.get("ACI").get(0).getFrequency()); + map.put("frequencyUnit1", measureDataMap.get("ACI").get(0).getFrequencyUnit()); + map.put("unit1", measureDataMap.get("ACI").get(0).getUnit()); + map.put("measureDataCalibratorListI", measureDataMap.get("ACI")); + } + } + } } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index 925b7b7..8268aed 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -84,7 +84,7 @@ if (ObjectUtils.isNotEmpty(selectSeal)) { //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = filePrintRegister.getFileNames().get(0).replaceAll("docx", "pdf"); - String tempPdfUrl = filePrintRegister.getTemDir()+ "temp" + pdfNewUrl; + String tempPdfUrl = filePrintRegister.getTemDir() + "temp" + pdfNewUrl; FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl); DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), pdfNewUrl); return pdfNewUrl; @@ -395,7 +395,9 @@ e.printStackTrace(); } finally { try { - fos.close(); + if (fos != null) { + fos.close(); + } } catch (IOException e) { e.printStackTrace(); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java index 5dbe969..2160c5f 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java @@ -46,7 +46,6 @@ // TODO: 2023/10/10 柴壮:检定数据管理中点击生成原始记录和检定证书(生成证书和原始记录编号,二者编号相同),找到模板、填充模板,调用草稿箱保存接口后(保证编号填充时和保存草稿一致), // 即在保存草稿箱接口中保存成功后实现填充模板逻辑,最后提供查询接口显示在检定审批管理新建页面 - @ApiOperation("草稿箱-保存") @PostMapping("/save") public ReturnDTO addMeasureApproval(@RequestBody @Valid BizBusinessDeviceMeasureApproval MeasureApproval) { diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java index b510327..6412cc8 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java @@ -8,13 +8,30 @@ public interface MeasureCategoryEnum { - String MEASURE_ITEMS_WITHOUT_CERTIFICATE = ""; + String MEASURE_ITEMS_WITHOUT_CERTIFICATE = "多功能电力参数测量仪-原始记录、交流电压表、交流电流表、直流电压表、直流电流表、75mV电流表"; /** * 测试 */ String TEST_REPORT = "测试"; + + /** + * 校准 + */ + String CALIBRATE_REPORT = "校准"; + + /** + * 检定 + */ + String MEASURE_REPORT = "检定"; + + /** + * 校验 + */ + String CHECKOUT_REPORT = "校验"; + + /** * 检定有效日期 */ diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java index 00d69ef..39a838a 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java @@ -254,6 +254,7 @@ @TableField(exist = false) private List measureDataCalibratorList; + @ApiModelProperty(value = "依据的技术文件(前端必传,打印需要)", dataType = "String") @TableField(exist = false) private String technologyFile; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BizBusinessDeviceMeasureApprovalServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BizBusinessDeviceMeasureApprovalServiceImpl.java index e3f8000..a510c41 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BizBusinessDeviceMeasureApprovalServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BizBusinessDeviceMeasureApprovalServiceImpl.java @@ -1,7 +1,9 @@ package com.casic.missiles.service.Impl.business; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.page.PageFactory; @@ -21,21 +23,25 @@ import com.casic.missiles.mapper.business.BizBusinessDeviceMeasureApprovalMapper; import com.casic.missiles.mapper.business.BusinessLabExecutiveInfoMapper; import com.casic.missiles.model.business.BizBusinessDeviceMeasureApproval; +import com.casic.missiles.model.business.BizBusinessDeviceMeasureDataCalibrator; import com.casic.missiles.model.business.BizBusinessDeviceMeasureInfo; import com.casic.missiles.service.Impl.GeneralApprovalServiceImpl; import com.casic.missiles.service.business.IBizBusinessDeviceMeasureApprovalService; import com.casic.missiles.service.listeners.register.PrintFileRegister; import com.casic.missiles.utils.DictCodeUtils; import com.casic.missiles.utils.NoGeneratorUtil; +import com.casic.missiles.utils.SnowflakeUtil; import com.casic.missiles.utils.SpringContextUtil; import liquibase.pro.packaged.F; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.*; +import java.util.stream.Collectors; /** *

@@ -47,10 +53,12 @@ */ @Service public class BizBusinessDeviceMeasureApprovalServiceImpl extends GeneralApprovalServiceImpl implements IBizBusinessDeviceMeasureApprovalService, PrintFileModuleNameEnum, MeasureCategoryEnum { - @Autowired + @Resource private BusinessLabExecutiveInfoMapper labExecutiveInfoMapper; @Autowired private PrintFileRegister printFileRegister; + @Resource + private SnowflakeUtil snowflakeUtil; @Override public ReturnDTO addMeasureApproval(BizBusinessDeviceMeasureApproval request) { @@ -63,10 +71,10 @@ request.setCreateUserName(request.getUserName()); request.setApprovalStatus(ApprovalStatusEnum.DRAFT); //草稿箱状态 request.setCertificateNo(certNo); - int row = this.baseMapper.insert(request); - Assert.isFalse(row <= 0, () -> { - throw new BusinessException(BusinessExceptionEnum.MEASURE_APPROVAL_SAVE_FAILED); - }); +// int row = this.baseMapper.insert(request); +// Assert.isFalse(row <= 0, () -> { +// throw new BusinessException(BusinessExceptionEnum.MEASURE_APPROVAL_SAVE_FAILED); +// }); DeviceMeasureApprovalSaveResponse saveResponse = new DeviceMeasureApprovalSaveResponse(); saveResponse.setId(request.getId()); saveResponse.setCertNo(certNo); @@ -102,10 +110,11 @@ //生成原始记录的线程 CompletableFuture originalFutureTask = CompletableFuture.supplyAsync( () -> createOriginalFile(request), threadPool); + //等到所有线程异步结束 CompletableFuture combinedFuture = CompletableFuture.allOf(certificateFutureTask, originalFutureTask); - combinedFuture.thenAccept(result -> { + combinedFuture.thenRunAsync(() -> { try { - //执行线程 + //获取结果 String certificateFileUrl = certificateFutureTask.join(); String originalRecordFileUrl = originalFutureTask.join(); //生成证书文件 @@ -113,8 +122,8 @@ //原始记录文件 request.setOriginalRecordFile(originalRecordFileUrl); BizBusinessDeviceMeasureApprovalMapper bizBusinessMapper = SpringContextUtil.getBean(BizBusinessDeviceMeasureApprovalMapper.class); - //更新 - bizBusinessMapper.updateById(request); + //更新记录文件 +// bizBusinessMapper.updateById(request); } catch (Exception ex) { throw new BusinessException(BusinessExceptionEnum.MEASURE_APPROVAL_UPDATE_FAILED); } @@ -123,10 +132,16 @@ private String createCertificateFile(BizBusinessDeviceMeasureApproval measureItemInfo) { try { + //过滤不能生成原始记录的报告 if (checkOutUnablePrint(measureItemInfo)) { return ""; } semaphore.acquire(); + if (CollectionUtil.isEmpty(measureItemInfo.getMeasureDataCalibratorList())) { + List bizBusinessDeviceMeasureDataCalibrators = new ArrayList<>(); + bizBusinessDeviceMeasureDataCalibrators.add(new BizBusinessDeviceMeasureDataCalibrator()); + measureItemInfo.setMeasureDataCalibratorList(bizBusinessDeviceMeasureDataCalibrators); + } Map map = BeanUtil.beanToMap(measureItemInfo); //准备封面参数 prepareCoverParams(map, measureItemInfo.getLabCode()); @@ -135,6 +150,7 @@ //这一块逻辑比较复杂 customTemplateUrls.add(bizBusinessMapper.customTemplateUrl(MEASURE_DATA, "2", measureItemInfo.getMeasureCategoryName())); customTemplateUrls.add(bizBusinessMapper.customTemplateUrl(MEASURE_DATA, "2", "数字记录表内容")); + map.put("id", snowflakeUtil.nextId()); //除了选用的模板不一致,模板配置流程是一致的 return printFileRegister.registerPrintFile(MEASURE_DATA, "证书打印", null, map, false, null, customTemplateUrls); } catch (Exception ex) { @@ -149,13 +165,22 @@ private String createOriginalFile(BizBusinessDeviceMeasureApproval measureItemInfo) { try { semaphore.acquire(); + if (CollectionUtil.isEmpty(measureItemInfo.getMeasureDataCalibratorList())) { + List bizBusinessDeviceMeasureDataCalibrators = new ArrayList<>(); + bizBusinessDeviceMeasureDataCalibrators.add(new BizBusinessDeviceMeasureDataCalibrator()); + measureItemInfo.setMeasureDataCalibratorList(bizBusinessDeviceMeasureDataCalibrators); + } Map map = BeanUtil.beanToMap(measureItemInfo); List customTemplateUrls = new ArrayList<>(); BizBusinessDeviceMeasureApprovalMapper bizBusinessMapper = SpringContextUtil.getBean(BizBusinessDeviceMeasureApprovalMapper.class); //准备封面参数 prepareCoverParams(map, measureItemInfo.getLabCode()); + //定制化原始记录参数 + prepareCustomCoverParams(map, measureItemInfo.getMeasureDataCalibratorList()); //这一块逻辑比较复杂 customTemplateUrls.add(bizBusinessMapper.customTemplateUrl(MEASURE_DATA, "1", measureItemInfo.getItemCategoryName())); + //与证书模板区分 + map.put("id", snowflakeUtil.nextId()); //除了选用的模板不一致,模板配置流程是一致的 return printFileRegister.registerPrintFile(MEASURE_DATA, "原始记录打印", null, map, false, null, customTemplateUrls); } catch (Exception ex) { @@ -173,7 +198,7 @@ log.warn(BusinessExceptionEnum.ITEM_CATEGORY_NOT_NULL.getMessage()); return true; } - if (measureItemInfo.getMeasureCategoryName().equals(TEST_REPORT)) { + if (CHECKOUT_REPORT.equals(measureItemInfo.getMeasureCategoryName())) { log.warn(BusinessExceptionEnum.TEST_CATEGORY_IS_NONE.getMessage()); return true; } @@ -188,23 +213,12 @@ * 填充固定的信息参数 */ private void prepareCoverParams(Map map, String labCode) { - if (ObjectUtils.isNotEmpty(map.get(MEASURE_VALID_DATE))) { - String measureValidDate = (String) map.get(MEASURE_VALID_DATE); - Calendar calendar = Calendar.getInstance(); - try { - calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(measureValidDate)); - } catch (Exception e) { - throw new BusinessException(1500, String.format(measureValidDate, "检定有效日期,格式不正确")); - } - //设置时间 - map.put(MEASURE_VALID_Y, calendar.get(Calendar.YEAR)); - map.put(MEASURE_VALID_M, calendar.get(Calendar.MONTH) + 1); - map.put(MEASURE_VALID_D, calendar.get(Calendar.DAY_OF_MONTH)); - } + //健壮性校验 if (StringUtils.isEmpty(labCode)) { log.warn("组织接口不能传入为空,打印文档生成文档填充组织失败..."); return; } + //西昌海口基本信息录入 if ("x".equals(labCode)) { map.put("s", XICHANG); map.put("communicationAddress", XICHANG_ADDRESS); @@ -219,7 +233,79 @@ map.put("postalCode", HAIKOU_POSTAL_CODE); } } + } + private void prepareCustomCoverParams(Map map, List measureDataCalibrators) { + //定制参数 + doCustomParam(map, measureDataCalibrators); + //初始化方框 + map.put("test", "\uF0A3"); + map.put("calibrate", "\uF0A3"); + map.put("measure", "\uF0A3"); + //选择方框 + switch ((String) map.get("measureCategoryName")) { + case TEST_REPORT: + map.put("test", "\uF052"); + break; + case CALIBRATE_REPORT: + map.put("calibrate", "\uF052"); + break; + case MEASURE_REPORT: + map.put("measure", "\uF052"); + break; + default: + return; + } + //填充有效日期 + if (ObjectUtils.isNotEmpty(map.get(MEASURE_VALID_DATE))) { + String measureValidDate = (String) map.get(MEASURE_VALID_DATE); + Calendar calendar = Calendar.getInstance(); + try { + calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(measureValidDate)); + } catch (Exception e) { + throw new BusinessException(1500, String.format(measureValidDate, "检定有效日期,格式不正确")); + } + //设置时间 + map.put(MEASURE_VALID_Y, calendar.get(Calendar.YEAR)); + map.put(MEASURE_VALID_M, calendar.get(Calendar.MONTH) + 1); + map.put(MEASURE_VALID_D, calendar.get(Calendar.DAY_OF_MONTH)); + } + + } + + /** + * 直流电压表没有HZ + * 多功能 + * + * @param map + */ + private void doCustomParam(Map map, List measureDataCalibrators) { + if (StringUtils.isNotEmpty((String) map.get("itemCategoryName"))) { + //直流表,交流表 75mv电压表定制表格内容 + if (((String) map.get("itemCategoryName")).contains("交流")) { + map.put("fName", "频率:"); + map.put("frequency", measureDataCalibrators.get(0).getFrequency()); + map.put("frequencyUnit", measureDataCalibrators.get(0).getFrequencyUnit()); + } + //多功能电力参数仪定制表格内容 + if (((String) map.get("itemCategoryName")).contains("多功能")) { + Map> measureDataMap = measureDataCalibrators.stream().collect( + Collectors.groupingBy(BizBusinessDeviceMeasureDataCalibrator::getParams) + ); + if (measureDataMap.containsKey("ACV") && CollectionUtils.isNotEmpty(measureDataMap.get("ACV"))) { + map.put("frequency2", measureDataMap.get("ACV").get(0).getFrequency()); + map.put("frequencyUnit2", measureDataMap.get("ACV").get(0).getFrequencyUnit()); + map.put("unit2", measureDataMap.get("ACV").get(0).getUnit()); + map.put("measureDataCalibratorListV", measureDataMap.get("ACV")); + } + if (measureDataMap.containsKey("ACI") && CollectionUtils.isNotEmpty(measureDataMap.get("ACI"))) { + map.put("frequency1", measureDataMap.get("ACI").get(0).getFrequency()); + map.put("frequencyUnit1", measureDataMap.get("ACI").get(0).getFrequencyUnit()); + map.put("unit1", measureDataMap.get("ACI").get(0).getUnit()); + map.put("measureDataCalibratorListI", measureDataMap.get("ACI")); + } + } + } } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index 925b7b7..8268aed 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -84,7 +84,7 @@ if (ObjectUtils.isNotEmpty(selectSeal)) { //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = filePrintRegister.getFileNames().get(0).replaceAll("docx", "pdf"); - String tempPdfUrl = filePrintRegister.getTemDir()+ "temp" + pdfNewUrl; + String tempPdfUrl = filePrintRegister.getTemDir() + "temp" + pdfNewUrl; FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl); DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), pdfNewUrl); return pdfNewUrl; @@ -395,7 +395,9 @@ e.printStackTrace(); } finally { try { - fos.close(); + if (fos != null) { + fos.close(); + } } catch (IOException e) { e.printStackTrace(); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index 83fbe86..856ff6a 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -64,6 +64,8 @@ public String registerPrintFile(String moduleName, String moduleType, Long moduleIdValue, Map customParam, Boolean isPdf, HttpServletResponse response, List customTemplateUrls) { + //多线程验证 + log.info("我进来...,模块类型{}", moduleType); String tempLocalFileDir = localFileDir; Assert.isFalse(StringUtils.isEmpty(moduleName), () -> { throw new RuntimeException("the moduleName is null,please check your params..."); @@ -105,7 +107,7 @@ //删除无效的文件 File invalidFile = new File(tempLocalFileDir); //删除运行空间下的文件 - deleteFile(invalidFile); +// deleteFile(invalidFile); } return miniName; } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java index 5dbe969..2160c5f 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java @@ -46,7 +46,6 @@ // TODO: 2023/10/10 柴壮:检定数据管理中点击生成原始记录和检定证书(生成证书和原始记录编号,二者编号相同),找到模板、填充模板,调用草稿箱保存接口后(保证编号填充时和保存草稿一致), // 即在保存草稿箱接口中保存成功后实现填充模板逻辑,最后提供查询接口显示在检定审批管理新建页面 - @ApiOperation("草稿箱-保存") @PostMapping("/save") public ReturnDTO addMeasureApproval(@RequestBody @Valid BizBusinessDeviceMeasureApproval MeasureApproval) { diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java index b510327..6412cc8 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java @@ -8,13 +8,30 @@ public interface MeasureCategoryEnum { - String MEASURE_ITEMS_WITHOUT_CERTIFICATE = ""; + String MEASURE_ITEMS_WITHOUT_CERTIFICATE = "多功能电力参数测量仪-原始记录、交流电压表、交流电流表、直流电压表、直流电流表、75mV电流表"; /** * 测试 */ String TEST_REPORT = "测试"; + + /** + * 校准 + */ + String CALIBRATE_REPORT = "校准"; + + /** + * 检定 + */ + String MEASURE_REPORT = "检定"; + + /** + * 校验 + */ + String CHECKOUT_REPORT = "校验"; + + /** * 检定有效日期 */ diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java index 00d69ef..39a838a 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java @@ -254,6 +254,7 @@ @TableField(exist = false) private List measureDataCalibratorList; + @ApiModelProperty(value = "依据的技术文件(前端必传,打印需要)", dataType = "String") @TableField(exist = false) private String technologyFile; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BizBusinessDeviceMeasureApprovalServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BizBusinessDeviceMeasureApprovalServiceImpl.java index e3f8000..a510c41 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BizBusinessDeviceMeasureApprovalServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BizBusinessDeviceMeasureApprovalServiceImpl.java @@ -1,7 +1,9 @@ package com.casic.missiles.service.Impl.business; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.page.PageFactory; @@ -21,21 +23,25 @@ import com.casic.missiles.mapper.business.BizBusinessDeviceMeasureApprovalMapper; import com.casic.missiles.mapper.business.BusinessLabExecutiveInfoMapper; import com.casic.missiles.model.business.BizBusinessDeviceMeasureApproval; +import com.casic.missiles.model.business.BizBusinessDeviceMeasureDataCalibrator; import com.casic.missiles.model.business.BizBusinessDeviceMeasureInfo; import com.casic.missiles.service.Impl.GeneralApprovalServiceImpl; import com.casic.missiles.service.business.IBizBusinessDeviceMeasureApprovalService; import com.casic.missiles.service.listeners.register.PrintFileRegister; import com.casic.missiles.utils.DictCodeUtils; import com.casic.missiles.utils.NoGeneratorUtil; +import com.casic.missiles.utils.SnowflakeUtil; import com.casic.missiles.utils.SpringContextUtil; import liquibase.pro.packaged.F; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.*; +import java.util.stream.Collectors; /** *

@@ -47,10 +53,12 @@ */ @Service public class BizBusinessDeviceMeasureApprovalServiceImpl extends GeneralApprovalServiceImpl implements IBizBusinessDeviceMeasureApprovalService, PrintFileModuleNameEnum, MeasureCategoryEnum { - @Autowired + @Resource private BusinessLabExecutiveInfoMapper labExecutiveInfoMapper; @Autowired private PrintFileRegister printFileRegister; + @Resource + private SnowflakeUtil snowflakeUtil; @Override public ReturnDTO addMeasureApproval(BizBusinessDeviceMeasureApproval request) { @@ -63,10 +71,10 @@ request.setCreateUserName(request.getUserName()); request.setApprovalStatus(ApprovalStatusEnum.DRAFT); //草稿箱状态 request.setCertificateNo(certNo); - int row = this.baseMapper.insert(request); - Assert.isFalse(row <= 0, () -> { - throw new BusinessException(BusinessExceptionEnum.MEASURE_APPROVAL_SAVE_FAILED); - }); +// int row = this.baseMapper.insert(request); +// Assert.isFalse(row <= 0, () -> { +// throw new BusinessException(BusinessExceptionEnum.MEASURE_APPROVAL_SAVE_FAILED); +// }); DeviceMeasureApprovalSaveResponse saveResponse = new DeviceMeasureApprovalSaveResponse(); saveResponse.setId(request.getId()); saveResponse.setCertNo(certNo); @@ -102,10 +110,11 @@ //生成原始记录的线程 CompletableFuture originalFutureTask = CompletableFuture.supplyAsync( () -> createOriginalFile(request), threadPool); + //等到所有线程异步结束 CompletableFuture combinedFuture = CompletableFuture.allOf(certificateFutureTask, originalFutureTask); - combinedFuture.thenAccept(result -> { + combinedFuture.thenRunAsync(() -> { try { - //执行线程 + //获取结果 String certificateFileUrl = certificateFutureTask.join(); String originalRecordFileUrl = originalFutureTask.join(); //生成证书文件 @@ -113,8 +122,8 @@ //原始记录文件 request.setOriginalRecordFile(originalRecordFileUrl); BizBusinessDeviceMeasureApprovalMapper bizBusinessMapper = SpringContextUtil.getBean(BizBusinessDeviceMeasureApprovalMapper.class); - //更新 - bizBusinessMapper.updateById(request); + //更新记录文件 +// bizBusinessMapper.updateById(request); } catch (Exception ex) { throw new BusinessException(BusinessExceptionEnum.MEASURE_APPROVAL_UPDATE_FAILED); } @@ -123,10 +132,16 @@ private String createCertificateFile(BizBusinessDeviceMeasureApproval measureItemInfo) { try { + //过滤不能生成原始记录的报告 if (checkOutUnablePrint(measureItemInfo)) { return ""; } semaphore.acquire(); + if (CollectionUtil.isEmpty(measureItemInfo.getMeasureDataCalibratorList())) { + List bizBusinessDeviceMeasureDataCalibrators = new ArrayList<>(); + bizBusinessDeviceMeasureDataCalibrators.add(new BizBusinessDeviceMeasureDataCalibrator()); + measureItemInfo.setMeasureDataCalibratorList(bizBusinessDeviceMeasureDataCalibrators); + } Map map = BeanUtil.beanToMap(measureItemInfo); //准备封面参数 prepareCoverParams(map, measureItemInfo.getLabCode()); @@ -135,6 +150,7 @@ //这一块逻辑比较复杂 customTemplateUrls.add(bizBusinessMapper.customTemplateUrl(MEASURE_DATA, "2", measureItemInfo.getMeasureCategoryName())); customTemplateUrls.add(bizBusinessMapper.customTemplateUrl(MEASURE_DATA, "2", "数字记录表内容")); + map.put("id", snowflakeUtil.nextId()); //除了选用的模板不一致,模板配置流程是一致的 return printFileRegister.registerPrintFile(MEASURE_DATA, "证书打印", null, map, false, null, customTemplateUrls); } catch (Exception ex) { @@ -149,13 +165,22 @@ private String createOriginalFile(BizBusinessDeviceMeasureApproval measureItemInfo) { try { semaphore.acquire(); + if (CollectionUtil.isEmpty(measureItemInfo.getMeasureDataCalibratorList())) { + List bizBusinessDeviceMeasureDataCalibrators = new ArrayList<>(); + bizBusinessDeviceMeasureDataCalibrators.add(new BizBusinessDeviceMeasureDataCalibrator()); + measureItemInfo.setMeasureDataCalibratorList(bizBusinessDeviceMeasureDataCalibrators); + } Map map = BeanUtil.beanToMap(measureItemInfo); List customTemplateUrls = new ArrayList<>(); BizBusinessDeviceMeasureApprovalMapper bizBusinessMapper = SpringContextUtil.getBean(BizBusinessDeviceMeasureApprovalMapper.class); //准备封面参数 prepareCoverParams(map, measureItemInfo.getLabCode()); + //定制化原始记录参数 + prepareCustomCoverParams(map, measureItemInfo.getMeasureDataCalibratorList()); //这一块逻辑比较复杂 customTemplateUrls.add(bizBusinessMapper.customTemplateUrl(MEASURE_DATA, "1", measureItemInfo.getItemCategoryName())); + //与证书模板区分 + map.put("id", snowflakeUtil.nextId()); //除了选用的模板不一致,模板配置流程是一致的 return printFileRegister.registerPrintFile(MEASURE_DATA, "原始记录打印", null, map, false, null, customTemplateUrls); } catch (Exception ex) { @@ -173,7 +198,7 @@ log.warn(BusinessExceptionEnum.ITEM_CATEGORY_NOT_NULL.getMessage()); return true; } - if (measureItemInfo.getMeasureCategoryName().equals(TEST_REPORT)) { + if (CHECKOUT_REPORT.equals(measureItemInfo.getMeasureCategoryName())) { log.warn(BusinessExceptionEnum.TEST_CATEGORY_IS_NONE.getMessage()); return true; } @@ -188,23 +213,12 @@ * 填充固定的信息参数 */ private void prepareCoverParams(Map map, String labCode) { - if (ObjectUtils.isNotEmpty(map.get(MEASURE_VALID_DATE))) { - String measureValidDate = (String) map.get(MEASURE_VALID_DATE); - Calendar calendar = Calendar.getInstance(); - try { - calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(measureValidDate)); - } catch (Exception e) { - throw new BusinessException(1500, String.format(measureValidDate, "检定有效日期,格式不正确")); - } - //设置时间 - map.put(MEASURE_VALID_Y, calendar.get(Calendar.YEAR)); - map.put(MEASURE_VALID_M, calendar.get(Calendar.MONTH) + 1); - map.put(MEASURE_VALID_D, calendar.get(Calendar.DAY_OF_MONTH)); - } + //健壮性校验 if (StringUtils.isEmpty(labCode)) { log.warn("组织接口不能传入为空,打印文档生成文档填充组织失败..."); return; } + //西昌海口基本信息录入 if ("x".equals(labCode)) { map.put("s", XICHANG); map.put("communicationAddress", XICHANG_ADDRESS); @@ -219,7 +233,79 @@ map.put("postalCode", HAIKOU_POSTAL_CODE); } } + } + private void prepareCustomCoverParams(Map map, List measureDataCalibrators) { + //定制参数 + doCustomParam(map, measureDataCalibrators); + //初始化方框 + map.put("test", "\uF0A3"); + map.put("calibrate", "\uF0A3"); + map.put("measure", "\uF0A3"); + //选择方框 + switch ((String) map.get("measureCategoryName")) { + case TEST_REPORT: + map.put("test", "\uF052"); + break; + case CALIBRATE_REPORT: + map.put("calibrate", "\uF052"); + break; + case MEASURE_REPORT: + map.put("measure", "\uF052"); + break; + default: + return; + } + //填充有效日期 + if (ObjectUtils.isNotEmpty(map.get(MEASURE_VALID_DATE))) { + String measureValidDate = (String) map.get(MEASURE_VALID_DATE); + Calendar calendar = Calendar.getInstance(); + try { + calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(measureValidDate)); + } catch (Exception e) { + throw new BusinessException(1500, String.format(measureValidDate, "检定有效日期,格式不正确")); + } + //设置时间 + map.put(MEASURE_VALID_Y, calendar.get(Calendar.YEAR)); + map.put(MEASURE_VALID_M, calendar.get(Calendar.MONTH) + 1); + map.put(MEASURE_VALID_D, calendar.get(Calendar.DAY_OF_MONTH)); + } + + } + + /** + * 直流电压表没有HZ + * 多功能 + * + * @param map + */ + private void doCustomParam(Map map, List measureDataCalibrators) { + if (StringUtils.isNotEmpty((String) map.get("itemCategoryName"))) { + //直流表,交流表 75mv电压表定制表格内容 + if (((String) map.get("itemCategoryName")).contains("交流")) { + map.put("fName", "频率:"); + map.put("frequency", measureDataCalibrators.get(0).getFrequency()); + map.put("frequencyUnit", measureDataCalibrators.get(0).getFrequencyUnit()); + } + //多功能电力参数仪定制表格内容 + if (((String) map.get("itemCategoryName")).contains("多功能")) { + Map> measureDataMap = measureDataCalibrators.stream().collect( + Collectors.groupingBy(BizBusinessDeviceMeasureDataCalibrator::getParams) + ); + if (measureDataMap.containsKey("ACV") && CollectionUtils.isNotEmpty(measureDataMap.get("ACV"))) { + map.put("frequency2", measureDataMap.get("ACV").get(0).getFrequency()); + map.put("frequencyUnit2", measureDataMap.get("ACV").get(0).getFrequencyUnit()); + map.put("unit2", measureDataMap.get("ACV").get(0).getUnit()); + map.put("measureDataCalibratorListV", measureDataMap.get("ACV")); + } + if (measureDataMap.containsKey("ACI") && CollectionUtils.isNotEmpty(measureDataMap.get("ACI"))) { + map.put("frequency1", measureDataMap.get("ACI").get(0).getFrequency()); + map.put("frequencyUnit1", measureDataMap.get("ACI").get(0).getFrequencyUnit()); + map.put("unit1", measureDataMap.get("ACI").get(0).getUnit()); + map.put("measureDataCalibratorListI", measureDataMap.get("ACI")); + } + } + } } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index 925b7b7..8268aed 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -84,7 +84,7 @@ if (ObjectUtils.isNotEmpty(selectSeal)) { //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = filePrintRegister.getFileNames().get(0).replaceAll("docx", "pdf"); - String tempPdfUrl = filePrintRegister.getTemDir()+ "temp" + pdfNewUrl; + String tempPdfUrl = filePrintRegister.getTemDir() + "temp" + pdfNewUrl; FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl); DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), pdfNewUrl); return pdfNewUrl; @@ -395,7 +395,9 @@ e.printStackTrace(); } finally { try { - fos.close(); + if (fos != null) { + fos.close(); + } } catch (IOException e) { e.printStackTrace(); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index 83fbe86..856ff6a 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -64,6 +64,8 @@ public String registerPrintFile(String moduleName, String moduleType, Long moduleIdValue, Map customParam, Boolean isPdf, HttpServletResponse response, List customTemplateUrls) { + //多线程验证 + log.info("我进来...,模块类型{}", moduleType); String tempLocalFileDir = localFileDir; Assert.isFalse(StringUtils.isEmpty(moduleName), () -> { throw new RuntimeException("the moduleName is null,please check your params..."); @@ -105,7 +107,7 @@ //删除无效的文件 File invalidFile = new File(tempLocalFileDir); //删除运行空间下的文件 - deleteFile(invalidFile); +// deleteFile(invalidFile); } return miniName; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileSupport.java index f9d2c9e..ad5e9be 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileSupport.java @@ -37,7 +37,8 @@ */ protected String createResponseFileInput(String printDocUrl, HttpServletResponse response) { if (response == null) { - return uploadCertificate(printDocUrl); + return null; +// return uploadCertificate(printDocUrl); } File file = new File(printDocUrl); InputStream in = null; diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java index 5dbe969..2160c5f 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BizBusinessDeviceMeasureApprovalController.java @@ -46,7 +46,6 @@ // TODO: 2023/10/10 柴壮:检定数据管理中点击生成原始记录和检定证书(生成证书和原始记录编号,二者编号相同),找到模板、填充模板,调用草稿箱保存接口后(保证编号填充时和保存草稿一致), // 即在保存草稿箱接口中保存成功后实现填充模板逻辑,最后提供查询接口显示在检定审批管理新建页面 - @ApiOperation("草稿箱-保存") @PostMapping("/save") public ReturnDTO addMeasureApproval(@RequestBody @Valid BizBusinessDeviceMeasureApproval MeasureApproval) { diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java index b510327..6412cc8 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureCategoryEnum.java @@ -8,13 +8,30 @@ public interface MeasureCategoryEnum { - String MEASURE_ITEMS_WITHOUT_CERTIFICATE = ""; + String MEASURE_ITEMS_WITHOUT_CERTIFICATE = "多功能电力参数测量仪-原始记录、交流电压表、交流电流表、直流电压表、直流电流表、75mV电流表"; /** * 测试 */ String TEST_REPORT = "测试"; + + /** + * 校准 + */ + String CALIBRATE_REPORT = "校准"; + + /** + * 检定 + */ + String MEASURE_REPORT = "检定"; + + /** + * 校验 + */ + String CHECKOUT_REPORT = "校验"; + + /** * 检定有效日期 */ diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java index 00d69ef..39a838a 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BizBusinessDeviceMeasureApproval.java @@ -254,6 +254,7 @@ @TableField(exist = false) private List measureDataCalibratorList; + @ApiModelProperty(value = "依据的技术文件(前端必传,打印需要)", dataType = "String") @TableField(exist = false) private String technologyFile; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BizBusinessDeviceMeasureApprovalServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BizBusinessDeviceMeasureApprovalServiceImpl.java index e3f8000..a510c41 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BizBusinessDeviceMeasureApprovalServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BizBusinessDeviceMeasureApprovalServiceImpl.java @@ -1,7 +1,9 @@ package com.casic.missiles.service.Impl.business; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.core.page.PageFactory; @@ -21,21 +23,25 @@ import com.casic.missiles.mapper.business.BizBusinessDeviceMeasureApprovalMapper; import com.casic.missiles.mapper.business.BusinessLabExecutiveInfoMapper; import com.casic.missiles.model.business.BizBusinessDeviceMeasureApproval; +import com.casic.missiles.model.business.BizBusinessDeviceMeasureDataCalibrator; import com.casic.missiles.model.business.BizBusinessDeviceMeasureInfo; import com.casic.missiles.service.Impl.GeneralApprovalServiceImpl; import com.casic.missiles.service.business.IBizBusinessDeviceMeasureApprovalService; import com.casic.missiles.service.listeners.register.PrintFileRegister; import com.casic.missiles.utils.DictCodeUtils; import com.casic.missiles.utils.NoGeneratorUtil; +import com.casic.missiles.utils.SnowflakeUtil; import com.casic.missiles.utils.SpringContextUtil; import liquibase.pro.packaged.F; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.*; +import java.util.stream.Collectors; /** *

@@ -47,10 +53,12 @@ */ @Service public class BizBusinessDeviceMeasureApprovalServiceImpl extends GeneralApprovalServiceImpl implements IBizBusinessDeviceMeasureApprovalService, PrintFileModuleNameEnum, MeasureCategoryEnum { - @Autowired + @Resource private BusinessLabExecutiveInfoMapper labExecutiveInfoMapper; @Autowired private PrintFileRegister printFileRegister; + @Resource + private SnowflakeUtil snowflakeUtil; @Override public ReturnDTO addMeasureApproval(BizBusinessDeviceMeasureApproval request) { @@ -63,10 +71,10 @@ request.setCreateUserName(request.getUserName()); request.setApprovalStatus(ApprovalStatusEnum.DRAFT); //草稿箱状态 request.setCertificateNo(certNo); - int row = this.baseMapper.insert(request); - Assert.isFalse(row <= 0, () -> { - throw new BusinessException(BusinessExceptionEnum.MEASURE_APPROVAL_SAVE_FAILED); - }); +// int row = this.baseMapper.insert(request); +// Assert.isFalse(row <= 0, () -> { +// throw new BusinessException(BusinessExceptionEnum.MEASURE_APPROVAL_SAVE_FAILED); +// }); DeviceMeasureApprovalSaveResponse saveResponse = new DeviceMeasureApprovalSaveResponse(); saveResponse.setId(request.getId()); saveResponse.setCertNo(certNo); @@ -102,10 +110,11 @@ //生成原始记录的线程 CompletableFuture originalFutureTask = CompletableFuture.supplyAsync( () -> createOriginalFile(request), threadPool); + //等到所有线程异步结束 CompletableFuture combinedFuture = CompletableFuture.allOf(certificateFutureTask, originalFutureTask); - combinedFuture.thenAccept(result -> { + combinedFuture.thenRunAsync(() -> { try { - //执行线程 + //获取结果 String certificateFileUrl = certificateFutureTask.join(); String originalRecordFileUrl = originalFutureTask.join(); //生成证书文件 @@ -113,8 +122,8 @@ //原始记录文件 request.setOriginalRecordFile(originalRecordFileUrl); BizBusinessDeviceMeasureApprovalMapper bizBusinessMapper = SpringContextUtil.getBean(BizBusinessDeviceMeasureApprovalMapper.class); - //更新 - bizBusinessMapper.updateById(request); + //更新记录文件 +// bizBusinessMapper.updateById(request); } catch (Exception ex) { throw new BusinessException(BusinessExceptionEnum.MEASURE_APPROVAL_UPDATE_FAILED); } @@ -123,10 +132,16 @@ private String createCertificateFile(BizBusinessDeviceMeasureApproval measureItemInfo) { try { + //过滤不能生成原始记录的报告 if (checkOutUnablePrint(measureItemInfo)) { return ""; } semaphore.acquire(); + if (CollectionUtil.isEmpty(measureItemInfo.getMeasureDataCalibratorList())) { + List bizBusinessDeviceMeasureDataCalibrators = new ArrayList<>(); + bizBusinessDeviceMeasureDataCalibrators.add(new BizBusinessDeviceMeasureDataCalibrator()); + measureItemInfo.setMeasureDataCalibratorList(bizBusinessDeviceMeasureDataCalibrators); + } Map map = BeanUtil.beanToMap(measureItemInfo); //准备封面参数 prepareCoverParams(map, measureItemInfo.getLabCode()); @@ -135,6 +150,7 @@ //这一块逻辑比较复杂 customTemplateUrls.add(bizBusinessMapper.customTemplateUrl(MEASURE_DATA, "2", measureItemInfo.getMeasureCategoryName())); customTemplateUrls.add(bizBusinessMapper.customTemplateUrl(MEASURE_DATA, "2", "数字记录表内容")); + map.put("id", snowflakeUtil.nextId()); //除了选用的模板不一致,模板配置流程是一致的 return printFileRegister.registerPrintFile(MEASURE_DATA, "证书打印", null, map, false, null, customTemplateUrls); } catch (Exception ex) { @@ -149,13 +165,22 @@ private String createOriginalFile(BizBusinessDeviceMeasureApproval measureItemInfo) { try { semaphore.acquire(); + if (CollectionUtil.isEmpty(measureItemInfo.getMeasureDataCalibratorList())) { + List bizBusinessDeviceMeasureDataCalibrators = new ArrayList<>(); + bizBusinessDeviceMeasureDataCalibrators.add(new BizBusinessDeviceMeasureDataCalibrator()); + measureItemInfo.setMeasureDataCalibratorList(bizBusinessDeviceMeasureDataCalibrators); + } Map map = BeanUtil.beanToMap(measureItemInfo); List customTemplateUrls = new ArrayList<>(); BizBusinessDeviceMeasureApprovalMapper bizBusinessMapper = SpringContextUtil.getBean(BizBusinessDeviceMeasureApprovalMapper.class); //准备封面参数 prepareCoverParams(map, measureItemInfo.getLabCode()); + //定制化原始记录参数 + prepareCustomCoverParams(map, measureItemInfo.getMeasureDataCalibratorList()); //这一块逻辑比较复杂 customTemplateUrls.add(bizBusinessMapper.customTemplateUrl(MEASURE_DATA, "1", measureItemInfo.getItemCategoryName())); + //与证书模板区分 + map.put("id", snowflakeUtil.nextId()); //除了选用的模板不一致,模板配置流程是一致的 return printFileRegister.registerPrintFile(MEASURE_DATA, "原始记录打印", null, map, false, null, customTemplateUrls); } catch (Exception ex) { @@ -173,7 +198,7 @@ log.warn(BusinessExceptionEnum.ITEM_CATEGORY_NOT_NULL.getMessage()); return true; } - if (measureItemInfo.getMeasureCategoryName().equals(TEST_REPORT)) { + if (CHECKOUT_REPORT.equals(measureItemInfo.getMeasureCategoryName())) { log.warn(BusinessExceptionEnum.TEST_CATEGORY_IS_NONE.getMessage()); return true; } @@ -188,23 +213,12 @@ * 填充固定的信息参数 */ private void prepareCoverParams(Map map, String labCode) { - if (ObjectUtils.isNotEmpty(map.get(MEASURE_VALID_DATE))) { - String measureValidDate = (String) map.get(MEASURE_VALID_DATE); - Calendar calendar = Calendar.getInstance(); - try { - calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(measureValidDate)); - } catch (Exception e) { - throw new BusinessException(1500, String.format(measureValidDate, "检定有效日期,格式不正确")); - } - //设置时间 - map.put(MEASURE_VALID_Y, calendar.get(Calendar.YEAR)); - map.put(MEASURE_VALID_M, calendar.get(Calendar.MONTH) + 1); - map.put(MEASURE_VALID_D, calendar.get(Calendar.DAY_OF_MONTH)); - } + //健壮性校验 if (StringUtils.isEmpty(labCode)) { log.warn("组织接口不能传入为空,打印文档生成文档填充组织失败..."); return; } + //西昌海口基本信息录入 if ("x".equals(labCode)) { map.put("s", XICHANG); map.put("communicationAddress", XICHANG_ADDRESS); @@ -219,7 +233,79 @@ map.put("postalCode", HAIKOU_POSTAL_CODE); } } + } + private void prepareCustomCoverParams(Map map, List measureDataCalibrators) { + //定制参数 + doCustomParam(map, measureDataCalibrators); + //初始化方框 + map.put("test", "\uF0A3"); + map.put("calibrate", "\uF0A3"); + map.put("measure", "\uF0A3"); + //选择方框 + switch ((String) map.get("measureCategoryName")) { + case TEST_REPORT: + map.put("test", "\uF052"); + break; + case CALIBRATE_REPORT: + map.put("calibrate", "\uF052"); + break; + case MEASURE_REPORT: + map.put("measure", "\uF052"); + break; + default: + return; + } + //填充有效日期 + if (ObjectUtils.isNotEmpty(map.get(MEASURE_VALID_DATE))) { + String measureValidDate = (String) map.get(MEASURE_VALID_DATE); + Calendar calendar = Calendar.getInstance(); + try { + calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(measureValidDate)); + } catch (Exception e) { + throw new BusinessException(1500, String.format(measureValidDate, "检定有效日期,格式不正确")); + } + //设置时间 + map.put(MEASURE_VALID_Y, calendar.get(Calendar.YEAR)); + map.put(MEASURE_VALID_M, calendar.get(Calendar.MONTH) + 1); + map.put(MEASURE_VALID_D, calendar.get(Calendar.DAY_OF_MONTH)); + } + + } + + /** + * 直流电压表没有HZ + * 多功能 + * + * @param map + */ + private void doCustomParam(Map map, List measureDataCalibrators) { + if (StringUtils.isNotEmpty((String) map.get("itemCategoryName"))) { + //直流表,交流表 75mv电压表定制表格内容 + if (((String) map.get("itemCategoryName")).contains("交流")) { + map.put("fName", "频率:"); + map.put("frequency", measureDataCalibrators.get(0).getFrequency()); + map.put("frequencyUnit", measureDataCalibrators.get(0).getFrequencyUnit()); + } + //多功能电力参数仪定制表格内容 + if (((String) map.get("itemCategoryName")).contains("多功能")) { + Map> measureDataMap = measureDataCalibrators.stream().collect( + Collectors.groupingBy(BizBusinessDeviceMeasureDataCalibrator::getParams) + ); + if (measureDataMap.containsKey("ACV") && CollectionUtils.isNotEmpty(measureDataMap.get("ACV"))) { + map.put("frequency2", measureDataMap.get("ACV").get(0).getFrequency()); + map.put("frequencyUnit2", measureDataMap.get("ACV").get(0).getFrequencyUnit()); + map.put("unit2", measureDataMap.get("ACV").get(0).getUnit()); + map.put("measureDataCalibratorListV", measureDataMap.get("ACV")); + } + if (measureDataMap.containsKey("ACI") && CollectionUtils.isNotEmpty(measureDataMap.get("ACI"))) { + map.put("frequency1", measureDataMap.get("ACI").get(0).getFrequency()); + map.put("frequencyUnit1", measureDataMap.get("ACI").get(0).getFrequencyUnit()); + map.put("unit1", measureDataMap.get("ACI").get(0).getUnit()); + map.put("measureDataCalibratorListI", measureDataMap.get("ACI")); + } + } + } } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index 925b7b7..8268aed 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -84,7 +84,7 @@ if (ObjectUtils.isNotEmpty(selectSeal)) { //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = filePrintRegister.getFileNames().get(0).replaceAll("docx", "pdf"); - String tempPdfUrl = filePrintRegister.getTemDir()+ "temp" + pdfNewUrl; + String tempPdfUrl = filePrintRegister.getTemDir() + "temp" + pdfNewUrl; FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl); DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), pdfNewUrl); return pdfNewUrl; @@ -395,7 +395,9 @@ e.printStackTrace(); } finally { try { - fos.close(); + if (fos != null) { + fos.close(); + } } catch (IOException e) { e.printStackTrace(); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index 83fbe86..856ff6a 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -64,6 +64,8 @@ public String registerPrintFile(String moduleName, String moduleType, Long moduleIdValue, Map customParam, Boolean isPdf, HttpServletResponse response, List customTemplateUrls) { + //多线程验证 + log.info("我进来...,模块类型{}", moduleType); String tempLocalFileDir = localFileDir; Assert.isFalse(StringUtils.isEmpty(moduleName), () -> { throw new RuntimeException("the moduleName is null,please check your params..."); @@ -105,7 +107,7 @@ //删除无效的文件 File invalidFile = new File(tempLocalFileDir); //删除运行空间下的文件 - deleteFile(invalidFile); +// deleteFile(invalidFile); } return miniName; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileSupport.java index f9d2c9e..ad5e9be 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileSupport.java @@ -37,7 +37,8 @@ */ protected String createResponseFileInput(String printDocUrl, HttpServletResponse response) { if (response == null) { - return uploadCertificate(printDocUrl); + return null; +// return uploadCertificate(printDocUrl); } File file = new File(printDocUrl); InputStream in = null; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/util/ParseWord07.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/util/ParseWord07.java index 143a251..0f4099c 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/util/ParseWord07.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/util/ParseWord07.java @@ -227,8 +227,8 @@ } private List checkThisTableCellMergeIndex(XWPFTable table, List mergeColNames) { - Map mergeColNameMap=mergeColNames.stream().collect( - Collectors.toMap(e->e,e->e) + Map mergeColNameMap = mergeColNames.stream().collect( + Collectors.toMap(e -> e, e -> e) ); int colIndex = 0; List mergeIndexList = new ArrayList<>(); @@ -300,11 +300,11 @@ } } String text = cell.getText().trim(); - if (text != null && text.contains("fe:") && text.startsWith("{{")) { + if (StringUtils.isNotEmpty(text) && text.contains("fe:") && text.startsWith("{{")) { text = text.replace("!fe:", "").replace("$fe:", "").replace("fe:", "").replace("{{", ""); String[] keys = text.replaceAll("\\s{1,}", " ").trim().split(" "); Object result = PoiPublicUtil.getParamsValue(keys[0], map); - return Objects.nonNull(result) ? result : new ArrayList(0); + return Objects.isNull(result) ? null : result instanceof String ? null : result; } else { return null; }