diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java new file mode 100644 index 0000000..fb02cb5 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java @@ -0,0 +1,52 @@ +package com.casic.missiles.listeners; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2025/3/17 17:20 + */ +public class ImportCustomListener extends AnalysisEventListener { + private final int headerRowNumber; + private final int headerColumnNumber; + private List headers = new ArrayList<>(); + private List> data = new ArrayList<>(); + private int currentRow = 0; + + public ImportCustomListener(int headerRowNumber, int headerColumnNumber) { + this.headerRowNumber = headerRowNumber; + this.headerColumnNumber = headerColumnNumber; + } + + @Override + public void invoke(Object row, AnalysisContext context) { + if (currentRow == headerRowNumber - 1) { + // 读取表头 + List rowData = (List) row; + headers = rowData.subList(headerColumnNumber - 1, rowData.size()); + } else if (currentRow >= headerRowNumber) { + // 读取数据 + List rowData = (List) row; + data.add(rowData.subList(headerColumnNumber - 1, rowData.size())); + } + currentRow++; + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // 读取完成后执行 + } + + public List getHeaders() { + return headers; + } + + public List> getData() { + return data; + } +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java new file mode 100644 index 0000000..fb02cb5 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java @@ -0,0 +1,52 @@ +package com.casic.missiles.listeners; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2025/3/17 17:20 + */ +public class ImportCustomListener extends AnalysisEventListener { + private final int headerRowNumber; + private final int headerColumnNumber; + private List headers = new ArrayList<>(); + private List> data = new ArrayList<>(); + private int currentRow = 0; + + public ImportCustomListener(int headerRowNumber, int headerColumnNumber) { + this.headerRowNumber = headerRowNumber; + this.headerColumnNumber = headerColumnNumber; + } + + @Override + public void invoke(Object row, AnalysisContext context) { + if (currentRow == headerRowNumber - 1) { + // 读取表头 + List rowData = (List) row; + headers = rowData.subList(headerColumnNumber - 1, rowData.size()); + } else if (currentRow >= headerRowNumber) { + // 读取数据 + List rowData = (List) row; + data.add(rowData.subList(headerColumnNumber - 1, rowData.size())); + } + currentRow++; + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // 读取完成后执行 + } + + public List getHeaders() { + return headers; + } + + public List> getData() { + return data; + } +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml index bbcad14..84ea39d 100644 --- a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml @@ -15,7 +15,6 @@ - diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java new file mode 100644 index 0000000..fb02cb5 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java @@ -0,0 +1,52 @@ +package com.casic.missiles.listeners; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2025/3/17 17:20 + */ +public class ImportCustomListener extends AnalysisEventListener { + private final int headerRowNumber; + private final int headerColumnNumber; + private List headers = new ArrayList<>(); + private List> data = new ArrayList<>(); + private int currentRow = 0; + + public ImportCustomListener(int headerRowNumber, int headerColumnNumber) { + this.headerRowNumber = headerRowNumber; + this.headerColumnNumber = headerColumnNumber; + } + + @Override + public void invoke(Object row, AnalysisContext context) { + if (currentRow == headerRowNumber - 1) { + // 读取表头 + List rowData = (List) row; + headers = rowData.subList(headerColumnNumber - 1, rowData.size()); + } else if (currentRow >= headerRowNumber) { + // 读取数据 + List rowData = (List) row; + data.add(rowData.subList(headerColumnNumber - 1, rowData.size())); + } + currentRow++; + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // 读取完成后执行 + } + + public List getHeaders() { + return headers; + } + + public List> getData() { + return data; + } +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml index bbcad14..84ea39d 100644 --- a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml @@ -15,7 +15,6 @@ - diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java index 2623321..64ce6c6 100644 --- a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -137,6 +137,27 @@ return CollUtil.isNotEmpty(result.getUnDuplicationResult()) ? ReturnUtil.success(200,message) : ReturnUtil.failed(message); } + @Deprecated + @ApiOperation("某运维系统仪表设备导入(仅录入仪表)(废弃,且入参未按某运维系统中导出模板调整完," + + "使用上方设备导入接口即可并且字段更丰富,设备量不大,用户更倾向使用上方设备导入)") + @PostMapping("/info/maintain/system/import") + @ResponseBody + public ReturnDTO maintainSystemInfoImport(@RequestParam("file") MultipartFile file) throws IOException { + EquipmentImportDuplicationResult result = equipmentInfoService.maintainSystemInfoImport(file); + List messages = new ArrayList<>(); + if(CollUtil.isNotEmpty(result.getUnDuplicationResult())){ + messages.add(String.format("成功导入%d条数据",result.getUnDuplicationResult().size())); + } + if(CollUtil.isNotEmpty(result.getHasExist())){ + messages.add(String.format("第%s行设备信息已存在", StrUtil.join("、",result.getHasExist()))); + } + if(CollUtil.isNotEmpty(result.getTableDuplication())){ + messages.add(String.format("第%s行设备信息在导入表中重复", StrUtil.join("、",result.getTableDuplication()))); + } + String message = StrUtil.join(",",messages); + return CollUtil.isNotEmpty(result.getUnDuplicationResult()) ? ReturnUtil.success(200,message) : ReturnUtil.failed(message); + } + @ApiOperation("到期提醒分页列表") @PostMapping("/remind/listPage") @ResponseBody diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java new file mode 100644 index 0000000..fb02cb5 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java @@ -0,0 +1,52 @@ +package com.casic.missiles.listeners; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2025/3/17 17:20 + */ +public class ImportCustomListener extends AnalysisEventListener { + private final int headerRowNumber; + private final int headerColumnNumber; + private List headers = new ArrayList<>(); + private List> data = new ArrayList<>(); + private int currentRow = 0; + + public ImportCustomListener(int headerRowNumber, int headerColumnNumber) { + this.headerRowNumber = headerRowNumber; + this.headerColumnNumber = headerColumnNumber; + } + + @Override + public void invoke(Object row, AnalysisContext context) { + if (currentRow == headerRowNumber - 1) { + // 读取表头 + List rowData = (List) row; + headers = rowData.subList(headerColumnNumber - 1, rowData.size()); + } else if (currentRow >= headerRowNumber) { + // 读取数据 + List rowData = (List) row; + data.add(rowData.subList(headerColumnNumber - 1, rowData.size())); + } + currentRow++; + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // 读取完成后执行 + } + + public List getHeaders() { + return headers; + } + + public List> getData() { + return data; + } +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml index bbcad14..84ea39d 100644 --- a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml @@ -15,7 +15,6 @@ - diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java index 2623321..64ce6c6 100644 --- a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -137,6 +137,27 @@ return CollUtil.isNotEmpty(result.getUnDuplicationResult()) ? ReturnUtil.success(200,message) : ReturnUtil.failed(message); } + @Deprecated + @ApiOperation("某运维系统仪表设备导入(仅录入仪表)(废弃,且入参未按某运维系统中导出模板调整完," + + "使用上方设备导入接口即可并且字段更丰富,设备量不大,用户更倾向使用上方设备导入)") + @PostMapping("/info/maintain/system/import") + @ResponseBody + public ReturnDTO maintainSystemInfoImport(@RequestParam("file") MultipartFile file) throws IOException { + EquipmentImportDuplicationResult result = equipmentInfoService.maintainSystemInfoImport(file); + List messages = new ArrayList<>(); + if(CollUtil.isNotEmpty(result.getUnDuplicationResult())){ + messages.add(String.format("成功导入%d条数据",result.getUnDuplicationResult().size())); + } + if(CollUtil.isNotEmpty(result.getHasExist())){ + messages.add(String.format("第%s行设备信息已存在", StrUtil.join("、",result.getHasExist()))); + } + if(CollUtil.isNotEmpty(result.getTableDuplication())){ + messages.add(String.format("第%s行设备信息在导入表中重复", StrUtil.join("、",result.getTableDuplication()))); + } + String message = StrUtil.join(",",messages); + return CollUtil.isNotEmpty(result.getUnDuplicationResult()) ? ReturnUtil.success(200,message) : ReturnUtil.failed(message); + } + @ApiOperation("到期提醒分页列表") @PostMapping("/remind/listPage") @ResponseBody diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java index d7bf569..5919aac 100644 --- a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.resource.CustomerQuestionnaireListRequest; @@ -58,12 +59,18 @@ return ReturnUtil.success(); } -// @ApiOperation("委托方满意度调查表新增") -// @PostMapping("/add") -// @ResponseBody -// public ReturnDTO questionnaireAdd(@RequestBody @Valid BizResourceCustomerQuestionnaire questionnaire) { -// return questionnaireService.questionnaireAdd(questionnaire); -// } + //@ApiOperation("委托方满意度调查表新增") + //@PostMapping("/add") + //@ResponseBody + //public ReturnDTO questionnaireAdd(@RequestBody @Valid BizResourceCustomerQuestionnaire questionnaire) { + // return questionnaireService.questionnaireAdd(questionnaire); + //} + @ApiOperation("委托方满意度调查表详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO questionnaireDetail(@RequestBody @Valid IdDTO idDTO) { + return questionnaireService.questionnaireDetail(idDTO.getId()); + } } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java new file mode 100644 index 0000000..fb02cb5 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java @@ -0,0 +1,52 @@ +package com.casic.missiles.listeners; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2025/3/17 17:20 + */ +public class ImportCustomListener extends AnalysisEventListener { + private final int headerRowNumber; + private final int headerColumnNumber; + private List headers = new ArrayList<>(); + private List> data = new ArrayList<>(); + private int currentRow = 0; + + public ImportCustomListener(int headerRowNumber, int headerColumnNumber) { + this.headerRowNumber = headerRowNumber; + this.headerColumnNumber = headerColumnNumber; + } + + @Override + public void invoke(Object row, AnalysisContext context) { + if (currentRow == headerRowNumber - 1) { + // 读取表头 + List rowData = (List) row; + headers = rowData.subList(headerColumnNumber - 1, rowData.size()); + } else if (currentRow >= headerRowNumber) { + // 读取数据 + List rowData = (List) row; + data.add(rowData.subList(headerColumnNumber - 1, rowData.size())); + } + currentRow++; + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // 读取完成后执行 + } + + public List getHeaders() { + return headers; + } + + public List> getData() { + return data; + } +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml index bbcad14..84ea39d 100644 --- a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml @@ -15,7 +15,6 @@ - diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java index 2623321..64ce6c6 100644 --- a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -137,6 +137,27 @@ return CollUtil.isNotEmpty(result.getUnDuplicationResult()) ? ReturnUtil.success(200,message) : ReturnUtil.failed(message); } + @Deprecated + @ApiOperation("某运维系统仪表设备导入(仅录入仪表)(废弃,且入参未按某运维系统中导出模板调整完," + + "使用上方设备导入接口即可并且字段更丰富,设备量不大,用户更倾向使用上方设备导入)") + @PostMapping("/info/maintain/system/import") + @ResponseBody + public ReturnDTO maintainSystemInfoImport(@RequestParam("file") MultipartFile file) throws IOException { + EquipmentImportDuplicationResult result = equipmentInfoService.maintainSystemInfoImport(file); + List messages = new ArrayList<>(); + if(CollUtil.isNotEmpty(result.getUnDuplicationResult())){ + messages.add(String.format("成功导入%d条数据",result.getUnDuplicationResult().size())); + } + if(CollUtil.isNotEmpty(result.getHasExist())){ + messages.add(String.format("第%s行设备信息已存在", StrUtil.join("、",result.getHasExist()))); + } + if(CollUtil.isNotEmpty(result.getTableDuplication())){ + messages.add(String.format("第%s行设备信息在导入表中重复", StrUtil.join("、",result.getTableDuplication()))); + } + String message = StrUtil.join(",",messages); + return CollUtil.isNotEmpty(result.getUnDuplicationResult()) ? ReturnUtil.success(200,message) : ReturnUtil.failed(message); + } + @ApiOperation("到期提醒分页列表") @PostMapping("/remind/listPage") @ResponseBody diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java index d7bf569..5919aac 100644 --- a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.resource.CustomerQuestionnaireListRequest; @@ -58,12 +59,18 @@ return ReturnUtil.success(); } -// @ApiOperation("委托方满意度调查表新增") -// @PostMapping("/add") -// @ResponseBody -// public ReturnDTO questionnaireAdd(@RequestBody @Valid BizResourceCustomerQuestionnaire questionnaire) { -// return questionnaireService.questionnaireAdd(questionnaire); -// } + //@ApiOperation("委托方满意度调查表新增") + //@PostMapping("/add") + //@ResponseBody + //public ReturnDTO questionnaireAdd(@RequestBody @Valid BizResourceCustomerQuestionnaire questionnaire) { + // return questionnaireService.questionnaireAdd(questionnaire); + //} + @ApiOperation("委托方满意度调查表详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO questionnaireDetail(@RequestBody @Valid IdDTO idDTO) { + return questionnaireService.questionnaireDetail(idDTO.getId()); + } } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/MaintainEquipmentImportDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/MaintainEquipmentImportDTO.java new file mode 100644 index 0000000..5ef3843 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/MaintainEquipmentImportDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.equipment; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.excel.enums.poi.VerticalAlignmentEnum; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import com.casic.missiles.converter.DateExcelConverter; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import java.math.BigDecimal; +import java.util.Date; + +@Getter +@Setter +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN, +verticalAlignment = VerticalAlignmentEnum.CENTER) +public class MaintainEquipmentImportDTO { + + /** + * 名称 + */ + @NotBlank(message = "设备名称不能为空") + @ExcelProperty(value = "名称",order = 1) + private String equipmentName; + /** + * 型号规格 + */ + @NotBlank(message = "规格型号不能为空") + @ExcelProperty(value = "规格型号",order = 2) + private String model; + + /** + * 出厂编号 + */ + @ExcelProperty(value = "出厂编号",order = 3) + private String manufactureNo; + + @ExcelProperty(value = "所在位置",order = 4) + private String installLocationExt; + + @DictCodeField(cacheName = MeterDictCode.EQUIPMENT_METER_IDENTITY, needValid = true, message = "计量标识不合法") + @ExcelProperty(value = "计量标识",order = 5) + private String meterIdentify; + + @ExcelProperty(value = "检定周期",order = 6) + private Integer checkCycle; + + @ExcelProperty(value = "检定有效期", converter = DateExcelConverter.class, order = 7) + private Date certificateValid; + + /** + * 检定(校准)机构 + */ + @ExcelProperty(value = "溯源单位",order = 8) + private String checkOrganization; + + @DictCodeField(cacheName = MeterDictCode.EQUIPMENT_QUALITY, needValid = true, message = "质量状况不合法") + @ExcelProperty(value = "质量状况", order = 9) + private String qualityCondition; + + @ExcelProperty(value = "备注",order = 10) + private String remark; + + @ExcelIgnore + private String checkDuplication; + +} diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java new file mode 100644 index 0000000..fb02cb5 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java @@ -0,0 +1,52 @@ +package com.casic.missiles.listeners; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2025/3/17 17:20 + */ +public class ImportCustomListener extends AnalysisEventListener { + private final int headerRowNumber; + private final int headerColumnNumber; + private List headers = new ArrayList<>(); + private List> data = new ArrayList<>(); + private int currentRow = 0; + + public ImportCustomListener(int headerRowNumber, int headerColumnNumber) { + this.headerRowNumber = headerRowNumber; + this.headerColumnNumber = headerColumnNumber; + } + + @Override + public void invoke(Object row, AnalysisContext context) { + if (currentRow == headerRowNumber - 1) { + // 读取表头 + List rowData = (List) row; + headers = rowData.subList(headerColumnNumber - 1, rowData.size()); + } else if (currentRow >= headerRowNumber) { + // 读取数据 + List rowData = (List) row; + data.add(rowData.subList(headerColumnNumber - 1, rowData.size())); + } + currentRow++; + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // 读取完成后执行 + } + + public List getHeaders() { + return headers; + } + + public List> getData() { + return data; + } +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml index bbcad14..84ea39d 100644 --- a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml @@ -15,7 +15,6 @@ - diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java index 2623321..64ce6c6 100644 --- a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -137,6 +137,27 @@ return CollUtil.isNotEmpty(result.getUnDuplicationResult()) ? ReturnUtil.success(200,message) : ReturnUtil.failed(message); } + @Deprecated + @ApiOperation("某运维系统仪表设备导入(仅录入仪表)(废弃,且入参未按某运维系统中导出模板调整完," + + "使用上方设备导入接口即可并且字段更丰富,设备量不大,用户更倾向使用上方设备导入)") + @PostMapping("/info/maintain/system/import") + @ResponseBody + public ReturnDTO maintainSystemInfoImport(@RequestParam("file") MultipartFile file) throws IOException { + EquipmentImportDuplicationResult result = equipmentInfoService.maintainSystemInfoImport(file); + List messages = new ArrayList<>(); + if(CollUtil.isNotEmpty(result.getUnDuplicationResult())){ + messages.add(String.format("成功导入%d条数据",result.getUnDuplicationResult().size())); + } + if(CollUtil.isNotEmpty(result.getHasExist())){ + messages.add(String.format("第%s行设备信息已存在", StrUtil.join("、",result.getHasExist()))); + } + if(CollUtil.isNotEmpty(result.getTableDuplication())){ + messages.add(String.format("第%s行设备信息在导入表中重复", StrUtil.join("、",result.getTableDuplication()))); + } + String message = StrUtil.join(",",messages); + return CollUtil.isNotEmpty(result.getUnDuplicationResult()) ? ReturnUtil.success(200,message) : ReturnUtil.failed(message); + } + @ApiOperation("到期提醒分页列表") @PostMapping("/remind/listPage") @ResponseBody diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java index d7bf569..5919aac 100644 --- a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.resource.CustomerQuestionnaireListRequest; @@ -58,12 +59,18 @@ return ReturnUtil.success(); } -// @ApiOperation("委托方满意度调查表新增") -// @PostMapping("/add") -// @ResponseBody -// public ReturnDTO questionnaireAdd(@RequestBody @Valid BizResourceCustomerQuestionnaire questionnaire) { -// return questionnaireService.questionnaireAdd(questionnaire); -// } + //@ApiOperation("委托方满意度调查表新增") + //@PostMapping("/add") + //@ResponseBody + //public ReturnDTO questionnaireAdd(@RequestBody @Valid BizResourceCustomerQuestionnaire questionnaire) { + // return questionnaireService.questionnaireAdd(questionnaire); + //} + @ApiOperation("委托方满意度调查表详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO questionnaireDetail(@RequestBody @Valid IdDTO idDTO) { + return questionnaireService.questionnaireDetail(idDTO.getId()); + } } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/MaintainEquipmentImportDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/MaintainEquipmentImportDTO.java new file mode 100644 index 0000000..5ef3843 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/MaintainEquipmentImportDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.equipment; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.excel.enums.poi.VerticalAlignmentEnum; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import com.casic.missiles.converter.DateExcelConverter; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import java.math.BigDecimal; +import java.util.Date; + +@Getter +@Setter +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN, +verticalAlignment = VerticalAlignmentEnum.CENTER) +public class MaintainEquipmentImportDTO { + + /** + * 名称 + */ + @NotBlank(message = "设备名称不能为空") + @ExcelProperty(value = "名称",order = 1) + private String equipmentName; + /** + * 型号规格 + */ + @NotBlank(message = "规格型号不能为空") + @ExcelProperty(value = "规格型号",order = 2) + private String model; + + /** + * 出厂编号 + */ + @ExcelProperty(value = "出厂编号",order = 3) + private String manufactureNo; + + @ExcelProperty(value = "所在位置",order = 4) + private String installLocationExt; + + @DictCodeField(cacheName = MeterDictCode.EQUIPMENT_METER_IDENTITY, needValid = true, message = "计量标识不合法") + @ExcelProperty(value = "计量标识",order = 5) + private String meterIdentify; + + @ExcelProperty(value = "检定周期",order = 6) + private Integer checkCycle; + + @ExcelProperty(value = "检定有效期", converter = DateExcelConverter.class, order = 7) + private Date certificateValid; + + /** + * 检定(校准)机构 + */ + @ExcelProperty(value = "溯源单位",order = 8) + private String checkOrganization; + + @DictCodeField(cacheName = MeterDictCode.EQUIPMENT_QUALITY, needValid = true, message = "质量状况不合法") + @ExcelProperty(value = "质量状况", order = 9) + private String qualityCondition; + + @ExcelProperty(value = "备注",order = 10) + private String remark; + + @ExcelIgnore + private String checkDuplication; + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentInfoService.java index 07433d2..fb1b167 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentInfoService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentInfoService.java @@ -51,6 +51,8 @@ EquipmentImportDuplicationResult infoImport(MultipartFile file, String equipmentType) throws IOException; + EquipmentImportDuplicationResult maintainSystemInfoImport(MultipartFile file) throws IOException; + List allCertificate(Long equipmentId, String equipmentType); void updateByModel(EquipmentModelInfo modelInfo); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java new file mode 100644 index 0000000..fb02cb5 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java @@ -0,0 +1,52 @@ +package com.casic.missiles.listeners; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2025/3/17 17:20 + */ +public class ImportCustomListener extends AnalysisEventListener { + private final int headerRowNumber; + private final int headerColumnNumber; + private List headers = new ArrayList<>(); + private List> data = new ArrayList<>(); + private int currentRow = 0; + + public ImportCustomListener(int headerRowNumber, int headerColumnNumber) { + this.headerRowNumber = headerRowNumber; + this.headerColumnNumber = headerColumnNumber; + } + + @Override + public void invoke(Object row, AnalysisContext context) { + if (currentRow == headerRowNumber - 1) { + // 读取表头 + List rowData = (List) row; + headers = rowData.subList(headerColumnNumber - 1, rowData.size()); + } else if (currentRow >= headerRowNumber) { + // 读取数据 + List rowData = (List) row; + data.add(rowData.subList(headerColumnNumber - 1, rowData.size())); + } + currentRow++; + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // 读取完成后执行 + } + + public List getHeaders() { + return headers; + } + + public List> getData() { + return data; + } +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml index bbcad14..84ea39d 100644 --- a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml @@ -15,7 +15,6 @@ - diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java index 2623321..64ce6c6 100644 --- a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -137,6 +137,27 @@ return CollUtil.isNotEmpty(result.getUnDuplicationResult()) ? ReturnUtil.success(200,message) : ReturnUtil.failed(message); } + @Deprecated + @ApiOperation("某运维系统仪表设备导入(仅录入仪表)(废弃,且入参未按某运维系统中导出模板调整完," + + "使用上方设备导入接口即可并且字段更丰富,设备量不大,用户更倾向使用上方设备导入)") + @PostMapping("/info/maintain/system/import") + @ResponseBody + public ReturnDTO maintainSystemInfoImport(@RequestParam("file") MultipartFile file) throws IOException { + EquipmentImportDuplicationResult result = equipmentInfoService.maintainSystemInfoImport(file); + List messages = new ArrayList<>(); + if(CollUtil.isNotEmpty(result.getUnDuplicationResult())){ + messages.add(String.format("成功导入%d条数据",result.getUnDuplicationResult().size())); + } + if(CollUtil.isNotEmpty(result.getHasExist())){ + messages.add(String.format("第%s行设备信息已存在", StrUtil.join("、",result.getHasExist()))); + } + if(CollUtil.isNotEmpty(result.getTableDuplication())){ + messages.add(String.format("第%s行设备信息在导入表中重复", StrUtil.join("、",result.getTableDuplication()))); + } + String message = StrUtil.join(",",messages); + return CollUtil.isNotEmpty(result.getUnDuplicationResult()) ? ReturnUtil.success(200,message) : ReturnUtil.failed(message); + } + @ApiOperation("到期提醒分页列表") @PostMapping("/remind/listPage") @ResponseBody diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java index d7bf569..5919aac 100644 --- a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.resource.CustomerQuestionnaireListRequest; @@ -58,12 +59,18 @@ return ReturnUtil.success(); } -// @ApiOperation("委托方满意度调查表新增") -// @PostMapping("/add") -// @ResponseBody -// public ReturnDTO questionnaireAdd(@RequestBody @Valid BizResourceCustomerQuestionnaire questionnaire) { -// return questionnaireService.questionnaireAdd(questionnaire); -// } + //@ApiOperation("委托方满意度调查表新增") + //@PostMapping("/add") + //@ResponseBody + //public ReturnDTO questionnaireAdd(@RequestBody @Valid BizResourceCustomerQuestionnaire questionnaire) { + // return questionnaireService.questionnaireAdd(questionnaire); + //} + @ApiOperation("委托方满意度调查表详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO questionnaireDetail(@RequestBody @Valid IdDTO idDTO) { + return questionnaireService.questionnaireDetail(idDTO.getId()); + } } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/MaintainEquipmentImportDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/MaintainEquipmentImportDTO.java new file mode 100644 index 0000000..5ef3843 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/MaintainEquipmentImportDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.equipment; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.excel.enums.poi.VerticalAlignmentEnum; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import com.casic.missiles.converter.DateExcelConverter; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import java.math.BigDecimal; +import java.util.Date; + +@Getter +@Setter +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN, +verticalAlignment = VerticalAlignmentEnum.CENTER) +public class MaintainEquipmentImportDTO { + + /** + * 名称 + */ + @NotBlank(message = "设备名称不能为空") + @ExcelProperty(value = "名称",order = 1) + private String equipmentName; + /** + * 型号规格 + */ + @NotBlank(message = "规格型号不能为空") + @ExcelProperty(value = "规格型号",order = 2) + private String model; + + /** + * 出厂编号 + */ + @ExcelProperty(value = "出厂编号",order = 3) + private String manufactureNo; + + @ExcelProperty(value = "所在位置",order = 4) + private String installLocationExt; + + @DictCodeField(cacheName = MeterDictCode.EQUIPMENT_METER_IDENTITY, needValid = true, message = "计量标识不合法") + @ExcelProperty(value = "计量标识",order = 5) + private String meterIdentify; + + @ExcelProperty(value = "检定周期",order = 6) + private Integer checkCycle; + + @ExcelProperty(value = "检定有效期", converter = DateExcelConverter.class, order = 7) + private Date certificateValid; + + /** + * 检定(校准)机构 + */ + @ExcelProperty(value = "溯源单位",order = 8) + private String checkOrganization; + + @DictCodeField(cacheName = MeterDictCode.EQUIPMENT_QUALITY, needValid = true, message = "质量状况不合法") + @ExcelProperty(value = "质量状况", order = 9) + private String qualityCondition; + + @ExcelProperty(value = "备注",order = 10) + private String remark; + + @ExcelIgnore + private String checkDuplication; + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentInfoService.java index 07433d2..fb1b167 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentInfoService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentInfoService.java @@ -51,6 +51,8 @@ EquipmentImportDuplicationResult infoImport(MultipartFile file, String equipmentType) throws IOException; + EquipmentImportDuplicationResult maintainSystemInfoImport(MultipartFile file) throws IOException; + List allCertificate(Long equipmentId, String equipmentType); void updateByModel(EquipmentModelInfo modelInfo); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentInfoServiceImpl.java index ffaf4d1..63335b2 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentInfoServiceImpl.java @@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.exception.ExcelDataConvertException; +import com.alibaba.excel.read.builder.ExcelReaderBuilder; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; @@ -34,6 +35,7 @@ import com.casic.missiles.enums.plan.SampleStatusEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.listeners.CommonExcelListener; +import com.casic.missiles.listeners.ImportCustomListener; import com.casic.missiles.mapper.equipment.EquipmentInfoApprovalMapper; import com.casic.missiles.model.equipment.*; import com.casic.missiles.mapper.equipment.EquipmentInfoMapper; @@ -619,7 +621,123 @@ checkResult.setTableDuplication(tableDuplication); checkResult.setHasExist(hasExist); return checkResult; + } + @Override + public EquipmentImportDuplicationResult maintainSystemInfoImport(MultipartFile file) throws IOException { + InputStream inputStream = file.getInputStream(); + List list = null; + try { + int headerRowNumber = 2; // 第n行作为表头 + int headerColumnNumber = 2; // 第n列作为表头 + // 创建监听器 + ImportCustomListener listener = new ImportCustomListener(headerRowNumber, headerColumnNumber); + // 读取Excel文件 + EasyExcel.read(inputStream, listener) + .registerReadListener(new CommonExcelListener<>()) + .head(EquipmentImportDTO.class) //对应导入的实体类 + .sheet(1) //导入数据的sheet页编号,0代表第一个sheet页,如果不填,则会导入所有sheet页的数据 + .headRowNumber(1) //列表头行数,1代表列表头有1行,第二行开始为数据行 + .doReadSync(); //开始读Excel,返回一个List集合,继续后续入库操作 + } catch (Exception ex) { + if (ex instanceof ExcelDataConvertException) { + String rowStr = StringUtils.substringBetween(ex.getMessage(), "rowIndex=", ","); + String colStr = StringUtils.substringBetween(ex.getMessage(), "columnIndex=", ")"); + Integer rowIndex = 0, colIndex = 0; + try { + rowIndex = Integer.valueOf(rowStr); + colIndex = Integer.valueOf(colStr) + 1; + } catch (NumberFormatException nfx) { + throw new BusinessException(1500, String.format("导入日期格式错误,获取日期位置信息转换异常,行:" + rowStr, "列:" + colStr)); + } + throw new BusinessException(1500, String.format("第" + rowIndex + "行,第" + colIndex + "列" + "日期格式不正确")); + } + } + //空字段判断 + String validMsg = "第%d行数据校验失败:%s"; + for (int i = 0; i < list.size(); i++) { + MaintainEquipmentImportDTO importDTO = list.get(i); + // 设备名称、规格型号 + if (StrUtil.isBlank(importDTO.getEquipmentName())) { + throw new BusinessException(1500, String.format(validMsg, i + 1, "设备名称不能为空")); + } + if (StrUtil.isBlank(importDTO.getModel())) { + throw new BusinessException(1500, String.format(validMsg, i + 1, "规格型号不能为空")); + } + } + //重复导入判断, 根据设备名称、型号规格、出厂编号判重; + EquipmentImportDuplicationResult checkResult = checkMaintainImportDuplication(list); + if (CollUtil.isNotEmpty(checkResult.getUnDuplicationResult())) { + List unDuplicationList = checkResult.getUnDuplicationResult(); + saveMaintainImport(unDuplicationList); + } + return checkResult; + } + + private void saveMaintainImport(List list) { + Long maxNo = this.baseMapper.selectMaxNo(EQUIPMENT_TYPE_NORMAL); + String prefix = PrefixCodeEnum.EQUIPMENT_PREFIX; + AuthUser user = permissionContext.getAuthService().getLoginUser(); + List equipmentInfos = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + MaintainEquipmentImportDTO importDTO = list.get(i); + EquipmentInfo equipmentInfo = new EquipmentInfo(); + BeanUtil.copyProperties(importDTO, equipmentInfo); + equipmentInfo.setId(IdWorker.getId()); + String equipmentNo = NumberGeneratorUtil.getContactNo(prefix, maxNo); + equipmentInfo.setEquipmentNo(equipmentNo); + maxNo = Long.parseLong(equipmentNo.substring(equipmentNo.length() - 12)); + equipmentInfo.setEquipmentType(EQUIPMENT_TYPE_NORMAL); + equipmentInfo.setCreateUserId(user.getId()); + equipmentInfo.setCreateUserName(user.getName()); + equipmentInfo.setCreateTime(new Date()); + equipmentInfo.setUpdateTime(new Date()); + equipmentInfo.setIsDel(0); + equipmentInfos.add(equipmentInfo); + } + if (CollUtil.isNotEmpty(equipmentInfos)) { + this.saveBatch(equipmentInfos); + } + for (EquipmentInfo equipmentInfo : equipmentInfos) { + turnoverLogService.saveLog(equipmentInfo, null, user.getId()); + } + } + + private EquipmentImportDuplicationResult checkMaintainImportDuplication(List importList) { + //根据设备名称、型号规格、出厂编号判重; + importList.forEach(i -> { + i.setCheckDuplication(String.format("%s%s%s", i.getEquipmentName(), i.getModel(), i.getManufactureNo())); + }); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("is_del", "0"); + List equipmentInfos = this.list(queryWrapper); + + List unDuplicationResult = new ArrayList<>(); + List hasExist = new ArrayList<>(); + List tableDuplication = new ArrayList<>(); + for (int i = 0; i < importList.size(); i++) { + MaintainEquipmentImportDTO importDTO = importList.get(i); + if (equipmentInfos.stream() + .filter(e -> (StrUtil.isBlank(e.getEquipmentName()) && StrUtil.isBlank(importDTO.getEquipmentName())) + || (StrUtil.isNotBlank(e.getEquipmentName()) && e.getEquipmentName().equals(importDTO.getEquipmentName()))) + .filter(e -> (StrUtil.isBlank(e.getModel()) && StrUtil.isBlank(importDTO.getModel())) + || (StrUtil.isNotBlank(e.getModel()) && e.getModel().equals(importDTO.getModel()))) + .filter(e -> (StrUtil.isBlank(e.getManufactureNo()) && StrUtil.isBlank(importDTO.getManufactureNo())) + || (StrUtil.isNotBlank(e.getManufactureNo()) && e.getManufactureNo().equals(importDTO.getManufactureNo()))) + .count() > 0) { + hasExist.add(i + 1); + } else if (importList.stream().filter(e -> e.getCheckDuplication().equals(importDTO.getCheckDuplication())).count() > 1) { + tableDuplication.add(i + 1); + } else { + unDuplicationResult.add(importDTO); + } + } + + EquipmentImportDuplicationResult checkResult = new EquipmentImportDuplicationResult<>(); + checkResult.setUnDuplicationResult(unDuplicationResult); + checkResult.setTableDuplication(tableDuplication); + checkResult.setHasExist(hasExist); + return checkResult; } public void filledImport(List list){ diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java new file mode 100644 index 0000000..fb02cb5 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java @@ -0,0 +1,52 @@ +package com.casic.missiles.listeners; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2025/3/17 17:20 + */ +public class ImportCustomListener extends AnalysisEventListener { + private final int headerRowNumber; + private final int headerColumnNumber; + private List headers = new ArrayList<>(); + private List> data = new ArrayList<>(); + private int currentRow = 0; + + public ImportCustomListener(int headerRowNumber, int headerColumnNumber) { + this.headerRowNumber = headerRowNumber; + this.headerColumnNumber = headerColumnNumber; + } + + @Override + public void invoke(Object row, AnalysisContext context) { + if (currentRow == headerRowNumber - 1) { + // 读取表头 + List rowData = (List) row; + headers = rowData.subList(headerColumnNumber - 1, rowData.size()); + } else if (currentRow >= headerRowNumber) { + // 读取数据 + List rowData = (List) row; + data.add(rowData.subList(headerColumnNumber - 1, rowData.size())); + } + currentRow++; + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // 读取完成后执行 + } + + public List getHeaders() { + return headers; + } + + public List> getData() { + return data; + } +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml index bbcad14..84ea39d 100644 --- a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml @@ -15,7 +15,6 @@ - diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java index 2623321..64ce6c6 100644 --- a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -137,6 +137,27 @@ return CollUtil.isNotEmpty(result.getUnDuplicationResult()) ? ReturnUtil.success(200,message) : ReturnUtil.failed(message); } + @Deprecated + @ApiOperation("某运维系统仪表设备导入(仅录入仪表)(废弃,且入参未按某运维系统中导出模板调整完," + + "使用上方设备导入接口即可并且字段更丰富,设备量不大,用户更倾向使用上方设备导入)") + @PostMapping("/info/maintain/system/import") + @ResponseBody + public ReturnDTO maintainSystemInfoImport(@RequestParam("file") MultipartFile file) throws IOException { + EquipmentImportDuplicationResult result = equipmentInfoService.maintainSystemInfoImport(file); + List messages = new ArrayList<>(); + if(CollUtil.isNotEmpty(result.getUnDuplicationResult())){ + messages.add(String.format("成功导入%d条数据",result.getUnDuplicationResult().size())); + } + if(CollUtil.isNotEmpty(result.getHasExist())){ + messages.add(String.format("第%s行设备信息已存在", StrUtil.join("、",result.getHasExist()))); + } + if(CollUtil.isNotEmpty(result.getTableDuplication())){ + messages.add(String.format("第%s行设备信息在导入表中重复", StrUtil.join("、",result.getTableDuplication()))); + } + String message = StrUtil.join(",",messages); + return CollUtil.isNotEmpty(result.getUnDuplicationResult()) ? ReturnUtil.success(200,message) : ReturnUtil.failed(message); + } + @ApiOperation("到期提醒分页列表") @PostMapping("/remind/listPage") @ResponseBody diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java index d7bf569..5919aac 100644 --- a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.resource.CustomerQuestionnaireListRequest; @@ -58,12 +59,18 @@ return ReturnUtil.success(); } -// @ApiOperation("委托方满意度调查表新增") -// @PostMapping("/add") -// @ResponseBody -// public ReturnDTO questionnaireAdd(@RequestBody @Valid BizResourceCustomerQuestionnaire questionnaire) { -// return questionnaireService.questionnaireAdd(questionnaire); -// } + //@ApiOperation("委托方满意度调查表新增") + //@PostMapping("/add") + //@ResponseBody + //public ReturnDTO questionnaireAdd(@RequestBody @Valid BizResourceCustomerQuestionnaire questionnaire) { + // return questionnaireService.questionnaireAdd(questionnaire); + //} + @ApiOperation("委托方满意度调查表详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO questionnaireDetail(@RequestBody @Valid IdDTO idDTO) { + return questionnaireService.questionnaireDetail(idDTO.getId()); + } } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/MaintainEquipmentImportDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/MaintainEquipmentImportDTO.java new file mode 100644 index 0000000..5ef3843 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/MaintainEquipmentImportDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.equipment; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.excel.enums.poi.VerticalAlignmentEnum; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import com.casic.missiles.converter.DateExcelConverter; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import java.math.BigDecimal; +import java.util.Date; + +@Getter +@Setter +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN, +verticalAlignment = VerticalAlignmentEnum.CENTER) +public class MaintainEquipmentImportDTO { + + /** + * 名称 + */ + @NotBlank(message = "设备名称不能为空") + @ExcelProperty(value = "名称",order = 1) + private String equipmentName; + /** + * 型号规格 + */ + @NotBlank(message = "规格型号不能为空") + @ExcelProperty(value = "规格型号",order = 2) + private String model; + + /** + * 出厂编号 + */ + @ExcelProperty(value = "出厂编号",order = 3) + private String manufactureNo; + + @ExcelProperty(value = "所在位置",order = 4) + private String installLocationExt; + + @DictCodeField(cacheName = MeterDictCode.EQUIPMENT_METER_IDENTITY, needValid = true, message = "计量标识不合法") + @ExcelProperty(value = "计量标识",order = 5) + private String meterIdentify; + + @ExcelProperty(value = "检定周期",order = 6) + private Integer checkCycle; + + @ExcelProperty(value = "检定有效期", converter = DateExcelConverter.class, order = 7) + private Date certificateValid; + + /** + * 检定(校准)机构 + */ + @ExcelProperty(value = "溯源单位",order = 8) + private String checkOrganization; + + @DictCodeField(cacheName = MeterDictCode.EQUIPMENT_QUALITY, needValid = true, message = "质量状况不合法") + @ExcelProperty(value = "质量状况", order = 9) + private String qualityCondition; + + @ExcelProperty(value = "备注",order = 10) + private String remark; + + @ExcelIgnore + private String checkDuplication; + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentInfoService.java index 07433d2..fb1b167 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentInfoService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentInfoService.java @@ -51,6 +51,8 @@ EquipmentImportDuplicationResult infoImport(MultipartFile file, String equipmentType) throws IOException; + EquipmentImportDuplicationResult maintainSystemInfoImport(MultipartFile file) throws IOException; + List allCertificate(Long equipmentId, String equipmentType); void updateByModel(EquipmentModelInfo modelInfo); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentInfoServiceImpl.java index ffaf4d1..63335b2 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentInfoServiceImpl.java @@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.exception.ExcelDataConvertException; +import com.alibaba.excel.read.builder.ExcelReaderBuilder; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; @@ -34,6 +35,7 @@ import com.casic.missiles.enums.plan.SampleStatusEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.listeners.CommonExcelListener; +import com.casic.missiles.listeners.ImportCustomListener; import com.casic.missiles.mapper.equipment.EquipmentInfoApprovalMapper; import com.casic.missiles.model.equipment.*; import com.casic.missiles.mapper.equipment.EquipmentInfoMapper; @@ -619,7 +621,123 @@ checkResult.setTableDuplication(tableDuplication); checkResult.setHasExist(hasExist); return checkResult; + } + @Override + public EquipmentImportDuplicationResult maintainSystemInfoImport(MultipartFile file) throws IOException { + InputStream inputStream = file.getInputStream(); + List list = null; + try { + int headerRowNumber = 2; // 第n行作为表头 + int headerColumnNumber = 2; // 第n列作为表头 + // 创建监听器 + ImportCustomListener listener = new ImportCustomListener(headerRowNumber, headerColumnNumber); + // 读取Excel文件 + EasyExcel.read(inputStream, listener) + .registerReadListener(new CommonExcelListener<>()) + .head(EquipmentImportDTO.class) //对应导入的实体类 + .sheet(1) //导入数据的sheet页编号,0代表第一个sheet页,如果不填,则会导入所有sheet页的数据 + .headRowNumber(1) //列表头行数,1代表列表头有1行,第二行开始为数据行 + .doReadSync(); //开始读Excel,返回一个List集合,继续后续入库操作 + } catch (Exception ex) { + if (ex instanceof ExcelDataConvertException) { + String rowStr = StringUtils.substringBetween(ex.getMessage(), "rowIndex=", ","); + String colStr = StringUtils.substringBetween(ex.getMessage(), "columnIndex=", ")"); + Integer rowIndex = 0, colIndex = 0; + try { + rowIndex = Integer.valueOf(rowStr); + colIndex = Integer.valueOf(colStr) + 1; + } catch (NumberFormatException nfx) { + throw new BusinessException(1500, String.format("导入日期格式错误,获取日期位置信息转换异常,行:" + rowStr, "列:" + colStr)); + } + throw new BusinessException(1500, String.format("第" + rowIndex + "行,第" + colIndex + "列" + "日期格式不正确")); + } + } + //空字段判断 + String validMsg = "第%d行数据校验失败:%s"; + for (int i = 0; i < list.size(); i++) { + MaintainEquipmentImportDTO importDTO = list.get(i); + // 设备名称、规格型号 + if (StrUtil.isBlank(importDTO.getEquipmentName())) { + throw new BusinessException(1500, String.format(validMsg, i + 1, "设备名称不能为空")); + } + if (StrUtil.isBlank(importDTO.getModel())) { + throw new BusinessException(1500, String.format(validMsg, i + 1, "规格型号不能为空")); + } + } + //重复导入判断, 根据设备名称、型号规格、出厂编号判重; + EquipmentImportDuplicationResult checkResult = checkMaintainImportDuplication(list); + if (CollUtil.isNotEmpty(checkResult.getUnDuplicationResult())) { + List unDuplicationList = checkResult.getUnDuplicationResult(); + saveMaintainImport(unDuplicationList); + } + return checkResult; + } + + private void saveMaintainImport(List list) { + Long maxNo = this.baseMapper.selectMaxNo(EQUIPMENT_TYPE_NORMAL); + String prefix = PrefixCodeEnum.EQUIPMENT_PREFIX; + AuthUser user = permissionContext.getAuthService().getLoginUser(); + List equipmentInfos = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + MaintainEquipmentImportDTO importDTO = list.get(i); + EquipmentInfo equipmentInfo = new EquipmentInfo(); + BeanUtil.copyProperties(importDTO, equipmentInfo); + equipmentInfo.setId(IdWorker.getId()); + String equipmentNo = NumberGeneratorUtil.getContactNo(prefix, maxNo); + equipmentInfo.setEquipmentNo(equipmentNo); + maxNo = Long.parseLong(equipmentNo.substring(equipmentNo.length() - 12)); + equipmentInfo.setEquipmentType(EQUIPMENT_TYPE_NORMAL); + equipmentInfo.setCreateUserId(user.getId()); + equipmentInfo.setCreateUserName(user.getName()); + equipmentInfo.setCreateTime(new Date()); + equipmentInfo.setUpdateTime(new Date()); + equipmentInfo.setIsDel(0); + equipmentInfos.add(equipmentInfo); + } + if (CollUtil.isNotEmpty(equipmentInfos)) { + this.saveBatch(equipmentInfos); + } + for (EquipmentInfo equipmentInfo : equipmentInfos) { + turnoverLogService.saveLog(equipmentInfo, null, user.getId()); + } + } + + private EquipmentImportDuplicationResult checkMaintainImportDuplication(List importList) { + //根据设备名称、型号规格、出厂编号判重; + importList.forEach(i -> { + i.setCheckDuplication(String.format("%s%s%s", i.getEquipmentName(), i.getModel(), i.getManufactureNo())); + }); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("is_del", "0"); + List equipmentInfos = this.list(queryWrapper); + + List unDuplicationResult = new ArrayList<>(); + List hasExist = new ArrayList<>(); + List tableDuplication = new ArrayList<>(); + for (int i = 0; i < importList.size(); i++) { + MaintainEquipmentImportDTO importDTO = importList.get(i); + if (equipmentInfos.stream() + .filter(e -> (StrUtil.isBlank(e.getEquipmentName()) && StrUtil.isBlank(importDTO.getEquipmentName())) + || (StrUtil.isNotBlank(e.getEquipmentName()) && e.getEquipmentName().equals(importDTO.getEquipmentName()))) + .filter(e -> (StrUtil.isBlank(e.getModel()) && StrUtil.isBlank(importDTO.getModel())) + || (StrUtil.isNotBlank(e.getModel()) && e.getModel().equals(importDTO.getModel()))) + .filter(e -> (StrUtil.isBlank(e.getManufactureNo()) && StrUtil.isBlank(importDTO.getManufactureNo())) + || (StrUtil.isNotBlank(e.getManufactureNo()) && e.getManufactureNo().equals(importDTO.getManufactureNo()))) + .count() > 0) { + hasExist.add(i + 1); + } else if (importList.stream().filter(e -> e.getCheckDuplication().equals(importDTO.getCheckDuplication())).count() > 1) { + tableDuplication.add(i + 1); + } else { + unDuplicationResult.add(importDTO); + } + } + + EquipmentImportDuplicationResult checkResult = new EquipmentImportDuplicationResult<>(); + checkResult.setUnDuplicationResult(unDuplicationResult); + checkResult.setTableDuplication(tableDuplication); + checkResult.setHasExist(hasExist); + return checkResult; } public void filledImport(List list){ diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/resource/BizResourceCustomerQuestionnaireServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/resource/BizResourceCustomerQuestionnaireServiceImpl.java index cf3ec6c..97e289c 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/resource/BizResourceCustomerQuestionnaireServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/resource/BizResourceCustomerQuestionnaireServiceImpl.java @@ -139,4 +139,10 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public ReturnDTO questionnaireDetail(Long id) { + BizResourceCustomerQuestionnaire questionnaire = this.baseMapper.selectById(id); + return ReturnUtil.success(questionnaire); + } + } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java new file mode 100644 index 0000000..fb02cb5 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java @@ -0,0 +1,52 @@ +package com.casic.missiles.listeners; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2025/3/17 17:20 + */ +public class ImportCustomListener extends AnalysisEventListener { + private final int headerRowNumber; + private final int headerColumnNumber; + private List headers = new ArrayList<>(); + private List> data = new ArrayList<>(); + private int currentRow = 0; + + public ImportCustomListener(int headerRowNumber, int headerColumnNumber) { + this.headerRowNumber = headerRowNumber; + this.headerColumnNumber = headerColumnNumber; + } + + @Override + public void invoke(Object row, AnalysisContext context) { + if (currentRow == headerRowNumber - 1) { + // 读取表头 + List rowData = (List) row; + headers = rowData.subList(headerColumnNumber - 1, rowData.size()); + } else if (currentRow >= headerRowNumber) { + // 读取数据 + List rowData = (List) row; + data.add(rowData.subList(headerColumnNumber - 1, rowData.size())); + } + currentRow++; + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // 读取完成后执行 + } + + public List getHeaders() { + return headers; + } + + public List> getData() { + return data; + } +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml index bbcad14..84ea39d 100644 --- a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml @@ -15,7 +15,6 @@ - diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java index 2623321..64ce6c6 100644 --- a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -137,6 +137,27 @@ return CollUtil.isNotEmpty(result.getUnDuplicationResult()) ? ReturnUtil.success(200,message) : ReturnUtil.failed(message); } + @Deprecated + @ApiOperation("某运维系统仪表设备导入(仅录入仪表)(废弃,且入参未按某运维系统中导出模板调整完," + + "使用上方设备导入接口即可并且字段更丰富,设备量不大,用户更倾向使用上方设备导入)") + @PostMapping("/info/maintain/system/import") + @ResponseBody + public ReturnDTO maintainSystemInfoImport(@RequestParam("file") MultipartFile file) throws IOException { + EquipmentImportDuplicationResult result = equipmentInfoService.maintainSystemInfoImport(file); + List messages = new ArrayList<>(); + if(CollUtil.isNotEmpty(result.getUnDuplicationResult())){ + messages.add(String.format("成功导入%d条数据",result.getUnDuplicationResult().size())); + } + if(CollUtil.isNotEmpty(result.getHasExist())){ + messages.add(String.format("第%s行设备信息已存在", StrUtil.join("、",result.getHasExist()))); + } + if(CollUtil.isNotEmpty(result.getTableDuplication())){ + messages.add(String.format("第%s行设备信息在导入表中重复", StrUtil.join("、",result.getTableDuplication()))); + } + String message = StrUtil.join(",",messages); + return CollUtil.isNotEmpty(result.getUnDuplicationResult()) ? ReturnUtil.success(200,message) : ReturnUtil.failed(message); + } + @ApiOperation("到期提醒分页列表") @PostMapping("/remind/listPage") @ResponseBody diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java index d7bf569..5919aac 100644 --- a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.resource.CustomerQuestionnaireListRequest; @@ -58,12 +59,18 @@ return ReturnUtil.success(); } -// @ApiOperation("委托方满意度调查表新增") -// @PostMapping("/add") -// @ResponseBody -// public ReturnDTO questionnaireAdd(@RequestBody @Valid BizResourceCustomerQuestionnaire questionnaire) { -// return questionnaireService.questionnaireAdd(questionnaire); -// } + //@ApiOperation("委托方满意度调查表新增") + //@PostMapping("/add") + //@ResponseBody + //public ReturnDTO questionnaireAdd(@RequestBody @Valid BizResourceCustomerQuestionnaire questionnaire) { + // return questionnaireService.questionnaireAdd(questionnaire); + //} + @ApiOperation("委托方满意度调查表详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO questionnaireDetail(@RequestBody @Valid IdDTO idDTO) { + return questionnaireService.questionnaireDetail(idDTO.getId()); + } } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/MaintainEquipmentImportDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/MaintainEquipmentImportDTO.java new file mode 100644 index 0000000..5ef3843 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/MaintainEquipmentImportDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.equipment; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.excel.enums.poi.VerticalAlignmentEnum; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import com.casic.missiles.converter.DateExcelConverter; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import java.math.BigDecimal; +import java.util.Date; + +@Getter +@Setter +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN, +verticalAlignment = VerticalAlignmentEnum.CENTER) +public class MaintainEquipmentImportDTO { + + /** + * 名称 + */ + @NotBlank(message = "设备名称不能为空") + @ExcelProperty(value = "名称",order = 1) + private String equipmentName; + /** + * 型号规格 + */ + @NotBlank(message = "规格型号不能为空") + @ExcelProperty(value = "规格型号",order = 2) + private String model; + + /** + * 出厂编号 + */ + @ExcelProperty(value = "出厂编号",order = 3) + private String manufactureNo; + + @ExcelProperty(value = "所在位置",order = 4) + private String installLocationExt; + + @DictCodeField(cacheName = MeterDictCode.EQUIPMENT_METER_IDENTITY, needValid = true, message = "计量标识不合法") + @ExcelProperty(value = "计量标识",order = 5) + private String meterIdentify; + + @ExcelProperty(value = "检定周期",order = 6) + private Integer checkCycle; + + @ExcelProperty(value = "检定有效期", converter = DateExcelConverter.class, order = 7) + private Date certificateValid; + + /** + * 检定(校准)机构 + */ + @ExcelProperty(value = "溯源单位",order = 8) + private String checkOrganization; + + @DictCodeField(cacheName = MeterDictCode.EQUIPMENT_QUALITY, needValid = true, message = "质量状况不合法") + @ExcelProperty(value = "质量状况", order = 9) + private String qualityCondition; + + @ExcelProperty(value = "备注",order = 10) + private String remark; + + @ExcelIgnore + private String checkDuplication; + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentInfoService.java index 07433d2..fb1b167 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentInfoService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentInfoService.java @@ -51,6 +51,8 @@ EquipmentImportDuplicationResult infoImport(MultipartFile file, String equipmentType) throws IOException; + EquipmentImportDuplicationResult maintainSystemInfoImport(MultipartFile file) throws IOException; + List allCertificate(Long equipmentId, String equipmentType); void updateByModel(EquipmentModelInfo modelInfo); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentInfoServiceImpl.java index ffaf4d1..63335b2 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentInfoServiceImpl.java @@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.exception.ExcelDataConvertException; +import com.alibaba.excel.read.builder.ExcelReaderBuilder; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; @@ -34,6 +35,7 @@ import com.casic.missiles.enums.plan.SampleStatusEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.listeners.CommonExcelListener; +import com.casic.missiles.listeners.ImportCustomListener; import com.casic.missiles.mapper.equipment.EquipmentInfoApprovalMapper; import com.casic.missiles.model.equipment.*; import com.casic.missiles.mapper.equipment.EquipmentInfoMapper; @@ -619,7 +621,123 @@ checkResult.setTableDuplication(tableDuplication); checkResult.setHasExist(hasExist); return checkResult; + } + @Override + public EquipmentImportDuplicationResult maintainSystemInfoImport(MultipartFile file) throws IOException { + InputStream inputStream = file.getInputStream(); + List list = null; + try { + int headerRowNumber = 2; // 第n行作为表头 + int headerColumnNumber = 2; // 第n列作为表头 + // 创建监听器 + ImportCustomListener listener = new ImportCustomListener(headerRowNumber, headerColumnNumber); + // 读取Excel文件 + EasyExcel.read(inputStream, listener) + .registerReadListener(new CommonExcelListener<>()) + .head(EquipmentImportDTO.class) //对应导入的实体类 + .sheet(1) //导入数据的sheet页编号,0代表第一个sheet页,如果不填,则会导入所有sheet页的数据 + .headRowNumber(1) //列表头行数,1代表列表头有1行,第二行开始为数据行 + .doReadSync(); //开始读Excel,返回一个List集合,继续后续入库操作 + } catch (Exception ex) { + if (ex instanceof ExcelDataConvertException) { + String rowStr = StringUtils.substringBetween(ex.getMessage(), "rowIndex=", ","); + String colStr = StringUtils.substringBetween(ex.getMessage(), "columnIndex=", ")"); + Integer rowIndex = 0, colIndex = 0; + try { + rowIndex = Integer.valueOf(rowStr); + colIndex = Integer.valueOf(colStr) + 1; + } catch (NumberFormatException nfx) { + throw new BusinessException(1500, String.format("导入日期格式错误,获取日期位置信息转换异常,行:" + rowStr, "列:" + colStr)); + } + throw new BusinessException(1500, String.format("第" + rowIndex + "行,第" + colIndex + "列" + "日期格式不正确")); + } + } + //空字段判断 + String validMsg = "第%d行数据校验失败:%s"; + for (int i = 0; i < list.size(); i++) { + MaintainEquipmentImportDTO importDTO = list.get(i); + // 设备名称、规格型号 + if (StrUtil.isBlank(importDTO.getEquipmentName())) { + throw new BusinessException(1500, String.format(validMsg, i + 1, "设备名称不能为空")); + } + if (StrUtil.isBlank(importDTO.getModel())) { + throw new BusinessException(1500, String.format(validMsg, i + 1, "规格型号不能为空")); + } + } + //重复导入判断, 根据设备名称、型号规格、出厂编号判重; + EquipmentImportDuplicationResult checkResult = checkMaintainImportDuplication(list); + if (CollUtil.isNotEmpty(checkResult.getUnDuplicationResult())) { + List unDuplicationList = checkResult.getUnDuplicationResult(); + saveMaintainImport(unDuplicationList); + } + return checkResult; + } + + private void saveMaintainImport(List list) { + Long maxNo = this.baseMapper.selectMaxNo(EQUIPMENT_TYPE_NORMAL); + String prefix = PrefixCodeEnum.EQUIPMENT_PREFIX; + AuthUser user = permissionContext.getAuthService().getLoginUser(); + List equipmentInfos = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + MaintainEquipmentImportDTO importDTO = list.get(i); + EquipmentInfo equipmentInfo = new EquipmentInfo(); + BeanUtil.copyProperties(importDTO, equipmentInfo); + equipmentInfo.setId(IdWorker.getId()); + String equipmentNo = NumberGeneratorUtil.getContactNo(prefix, maxNo); + equipmentInfo.setEquipmentNo(equipmentNo); + maxNo = Long.parseLong(equipmentNo.substring(equipmentNo.length() - 12)); + equipmentInfo.setEquipmentType(EQUIPMENT_TYPE_NORMAL); + equipmentInfo.setCreateUserId(user.getId()); + equipmentInfo.setCreateUserName(user.getName()); + equipmentInfo.setCreateTime(new Date()); + equipmentInfo.setUpdateTime(new Date()); + equipmentInfo.setIsDel(0); + equipmentInfos.add(equipmentInfo); + } + if (CollUtil.isNotEmpty(equipmentInfos)) { + this.saveBatch(equipmentInfos); + } + for (EquipmentInfo equipmentInfo : equipmentInfos) { + turnoverLogService.saveLog(equipmentInfo, null, user.getId()); + } + } + + private EquipmentImportDuplicationResult checkMaintainImportDuplication(List importList) { + //根据设备名称、型号规格、出厂编号判重; + importList.forEach(i -> { + i.setCheckDuplication(String.format("%s%s%s", i.getEquipmentName(), i.getModel(), i.getManufactureNo())); + }); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("is_del", "0"); + List equipmentInfos = this.list(queryWrapper); + + List unDuplicationResult = new ArrayList<>(); + List hasExist = new ArrayList<>(); + List tableDuplication = new ArrayList<>(); + for (int i = 0; i < importList.size(); i++) { + MaintainEquipmentImportDTO importDTO = importList.get(i); + if (equipmentInfos.stream() + .filter(e -> (StrUtil.isBlank(e.getEquipmentName()) && StrUtil.isBlank(importDTO.getEquipmentName())) + || (StrUtil.isNotBlank(e.getEquipmentName()) && e.getEquipmentName().equals(importDTO.getEquipmentName()))) + .filter(e -> (StrUtil.isBlank(e.getModel()) && StrUtil.isBlank(importDTO.getModel())) + || (StrUtil.isNotBlank(e.getModel()) && e.getModel().equals(importDTO.getModel()))) + .filter(e -> (StrUtil.isBlank(e.getManufactureNo()) && StrUtil.isBlank(importDTO.getManufactureNo())) + || (StrUtil.isNotBlank(e.getManufactureNo()) && e.getManufactureNo().equals(importDTO.getManufactureNo()))) + .count() > 0) { + hasExist.add(i + 1); + } else if (importList.stream().filter(e -> e.getCheckDuplication().equals(importDTO.getCheckDuplication())).count() > 1) { + tableDuplication.add(i + 1); + } else { + unDuplicationResult.add(importDTO); + } + } + + EquipmentImportDuplicationResult checkResult = new EquipmentImportDuplicationResult<>(); + checkResult.setUnDuplicationResult(unDuplicationResult); + checkResult.setTableDuplication(tableDuplication); + checkResult.setHasExist(hasExist); + return checkResult; } public void filledImport(List list){ diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/resource/BizResourceCustomerQuestionnaireServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/resource/BizResourceCustomerQuestionnaireServiceImpl.java index cf3ec6c..97e289c 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/resource/BizResourceCustomerQuestionnaireServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/resource/BizResourceCustomerQuestionnaireServiceImpl.java @@ -139,4 +139,10 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public ReturnDTO questionnaireDetail(Long id) { + BizResourceCustomerQuestionnaire questionnaire = this.baseMapper.selectById(id); + return ReturnUtil.success(questionnaire); + } + } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java index 0c8daec..f6b84ed 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java @@ -291,8 +291,12 @@ log.error("流程定义删除失败,deployId:{}", request.getDeployId()); return ReturnUtil.failed("流程定义删除失败"); } - //true:允许级联删除,不设置会导致数据库外键关联异常 - repositoryService.deleteDeployment(request.getDeployId(), true); + try { + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(request.getDeployId(), true); + } catch (Exception e) { + log.error("flowable中流程定义删除失败"); + } return ReturnUtil.success(); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java b/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java new file mode 100644 index 0000000..fb02cb5 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/listeners/ImportCustomListener.java @@ -0,0 +1,52 @@ +package com.casic.missiles.listeners; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2025/3/17 17:20 + */ +public class ImportCustomListener extends AnalysisEventListener { + private final int headerRowNumber; + private final int headerColumnNumber; + private List headers = new ArrayList<>(); + private List> data = new ArrayList<>(); + private int currentRow = 0; + + public ImportCustomListener(int headerRowNumber, int headerColumnNumber) { + this.headerRowNumber = headerRowNumber; + this.headerColumnNumber = headerColumnNumber; + } + + @Override + public void invoke(Object row, AnalysisContext context) { + if (currentRow == headerRowNumber - 1) { + // 读取表头 + List rowData = (List) row; + headers = rowData.subList(headerColumnNumber - 1, rowData.size()); + } else if (currentRow >= headerRowNumber) { + // 读取数据 + List rowData = (List) row; + data.add(rowData.subList(headerColumnNumber - 1, rowData.size())); + } + currentRow++; + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // 读取完成后执行 + } + + public List getHeaders() { + return headers; + } + + public List> getData() { + return data; + } +} diff --git a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml index bbcad14..84ea39d 100644 --- a/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/equipment/EquipmentModelInfoMapper.xml @@ -15,7 +15,6 @@ - diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java index 2623321..64ce6c6 100644 --- a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/equipment/EquipmentInfoController.java @@ -137,6 +137,27 @@ return CollUtil.isNotEmpty(result.getUnDuplicationResult()) ? ReturnUtil.success(200,message) : ReturnUtil.failed(message); } + @Deprecated + @ApiOperation("某运维系统仪表设备导入(仅录入仪表)(废弃,且入参未按某运维系统中导出模板调整完," + + "使用上方设备导入接口即可并且字段更丰富,设备量不大,用户更倾向使用上方设备导入)") + @PostMapping("/info/maintain/system/import") + @ResponseBody + public ReturnDTO maintainSystemInfoImport(@RequestParam("file") MultipartFile file) throws IOException { + EquipmentImportDuplicationResult result = equipmentInfoService.maintainSystemInfoImport(file); + List messages = new ArrayList<>(); + if(CollUtil.isNotEmpty(result.getUnDuplicationResult())){ + messages.add(String.format("成功导入%d条数据",result.getUnDuplicationResult().size())); + } + if(CollUtil.isNotEmpty(result.getHasExist())){ + messages.add(String.format("第%s行设备信息已存在", StrUtil.join("、",result.getHasExist()))); + } + if(CollUtil.isNotEmpty(result.getTableDuplication())){ + messages.add(String.format("第%s行设备信息在导入表中重复", StrUtil.join("、",result.getTableDuplication()))); + } + String message = StrUtil.join(",",messages); + return CollUtil.isNotEmpty(result.getUnDuplicationResult()) ? ReturnUtil.success(200,message) : ReturnUtil.failed(message); + } + @ApiOperation("到期提醒分页列表") @PostMapping("/remind/listPage") @ResponseBody diff --git a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java index d7bf569..5919aac 100644 --- a/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java +++ b/casic-metering-eqpt-api/src/main/java/com/casic/missiles/controller/resource/BizResourceCustomerQuestionnaireController.java @@ -4,6 +4,7 @@ import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.page.PageFactory; import com.casic.missiles.core.page.PageInfoBT; +import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; import com.casic.missiles.dto.resource.CustomerQuestionnaireListRequest; @@ -58,12 +59,18 @@ return ReturnUtil.success(); } -// @ApiOperation("委托方满意度调查表新增") -// @PostMapping("/add") -// @ResponseBody -// public ReturnDTO questionnaireAdd(@RequestBody @Valid BizResourceCustomerQuestionnaire questionnaire) { -// return questionnaireService.questionnaireAdd(questionnaire); -// } + //@ApiOperation("委托方满意度调查表新增") + //@PostMapping("/add") + //@ResponseBody + //public ReturnDTO questionnaireAdd(@RequestBody @Valid BizResourceCustomerQuestionnaire questionnaire) { + // return questionnaireService.questionnaireAdd(questionnaire); + //} + @ApiOperation("委托方满意度调查表详情") + @PostMapping("/detail") + @ResponseBody + public ReturnDTO questionnaireDetail(@RequestBody @Valid IdDTO idDTO) { + return questionnaireService.questionnaireDetail(idDTO.getId()); + } } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/MaintainEquipmentImportDTO.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/MaintainEquipmentImportDTO.java new file mode 100644 index 0000000..5ef3843 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/equipment/MaintainEquipmentImportDTO.java @@ -0,0 +1,78 @@ +package com.casic.missiles.dto.equipment; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.ContentStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import com.alibaba.excel.enums.poi.BorderStyleEnum; +import com.alibaba.excel.enums.poi.VerticalAlignmentEnum; +import com.casic.missiles.annotation.DictCodeField; +import com.casic.missiles.constants.MeterDictCode; +import com.casic.missiles.converter.DateExcelConverter; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import java.math.BigDecimal; +import java.util.Date; + +@Getter +@Setter +@ColumnWidth(35) +@HeadRowHeight(20) +@ContentRowHeight(20) +@ContentStyle(borderLeft = BorderStyleEnum.THIN, borderBottom = BorderStyleEnum.THIN, borderTop = BorderStyleEnum.THIN, borderRight = BorderStyleEnum.THIN, +verticalAlignment = VerticalAlignmentEnum.CENTER) +public class MaintainEquipmentImportDTO { + + /** + * 名称 + */ + @NotBlank(message = "设备名称不能为空") + @ExcelProperty(value = "名称",order = 1) + private String equipmentName; + /** + * 型号规格 + */ + @NotBlank(message = "规格型号不能为空") + @ExcelProperty(value = "规格型号",order = 2) + private String model; + + /** + * 出厂编号 + */ + @ExcelProperty(value = "出厂编号",order = 3) + private String manufactureNo; + + @ExcelProperty(value = "所在位置",order = 4) + private String installLocationExt; + + @DictCodeField(cacheName = MeterDictCode.EQUIPMENT_METER_IDENTITY, needValid = true, message = "计量标识不合法") + @ExcelProperty(value = "计量标识",order = 5) + private String meterIdentify; + + @ExcelProperty(value = "检定周期",order = 6) + private Integer checkCycle; + + @ExcelProperty(value = "检定有效期", converter = DateExcelConverter.class, order = 7) + private Date certificateValid; + + /** + * 检定(校准)机构 + */ + @ExcelProperty(value = "溯源单位",order = 8) + private String checkOrganization; + + @DictCodeField(cacheName = MeterDictCode.EQUIPMENT_QUALITY, needValid = true, message = "质量状况不合法") + @ExcelProperty(value = "质量状况", order = 9) + private String qualityCondition; + + @ExcelProperty(value = "备注",order = 10) + private String remark; + + @ExcelIgnore + private String checkDuplication; + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentInfoService.java index 07433d2..fb1b167 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentInfoService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/equipment/IEquipmentInfoService.java @@ -51,6 +51,8 @@ EquipmentImportDuplicationResult infoImport(MultipartFile file, String equipmentType) throws IOException; + EquipmentImportDuplicationResult maintainSystemInfoImport(MultipartFile file) throws IOException; + List allCertificate(Long equipmentId, String equipmentType); void updateByModel(EquipmentModelInfo modelInfo); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentInfoServiceImpl.java index ffaf4d1..63335b2 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/equipment/EquipmentInfoServiceImpl.java @@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.exception.ExcelDataConvertException; +import com.alibaba.excel.read.builder.ExcelReaderBuilder; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; @@ -34,6 +35,7 @@ import com.casic.missiles.enums.plan.SampleStatusEnum; import com.casic.missiles.exception.BusinessException; import com.casic.missiles.listeners.CommonExcelListener; +import com.casic.missiles.listeners.ImportCustomListener; import com.casic.missiles.mapper.equipment.EquipmentInfoApprovalMapper; import com.casic.missiles.model.equipment.*; import com.casic.missiles.mapper.equipment.EquipmentInfoMapper; @@ -619,7 +621,123 @@ checkResult.setTableDuplication(tableDuplication); checkResult.setHasExist(hasExist); return checkResult; + } + @Override + public EquipmentImportDuplicationResult maintainSystemInfoImport(MultipartFile file) throws IOException { + InputStream inputStream = file.getInputStream(); + List list = null; + try { + int headerRowNumber = 2; // 第n行作为表头 + int headerColumnNumber = 2; // 第n列作为表头 + // 创建监听器 + ImportCustomListener listener = new ImportCustomListener(headerRowNumber, headerColumnNumber); + // 读取Excel文件 + EasyExcel.read(inputStream, listener) + .registerReadListener(new CommonExcelListener<>()) + .head(EquipmentImportDTO.class) //对应导入的实体类 + .sheet(1) //导入数据的sheet页编号,0代表第一个sheet页,如果不填,则会导入所有sheet页的数据 + .headRowNumber(1) //列表头行数,1代表列表头有1行,第二行开始为数据行 + .doReadSync(); //开始读Excel,返回一个List集合,继续后续入库操作 + } catch (Exception ex) { + if (ex instanceof ExcelDataConvertException) { + String rowStr = StringUtils.substringBetween(ex.getMessage(), "rowIndex=", ","); + String colStr = StringUtils.substringBetween(ex.getMessage(), "columnIndex=", ")"); + Integer rowIndex = 0, colIndex = 0; + try { + rowIndex = Integer.valueOf(rowStr); + colIndex = Integer.valueOf(colStr) + 1; + } catch (NumberFormatException nfx) { + throw new BusinessException(1500, String.format("导入日期格式错误,获取日期位置信息转换异常,行:" + rowStr, "列:" + colStr)); + } + throw new BusinessException(1500, String.format("第" + rowIndex + "行,第" + colIndex + "列" + "日期格式不正确")); + } + } + //空字段判断 + String validMsg = "第%d行数据校验失败:%s"; + for (int i = 0; i < list.size(); i++) { + MaintainEquipmentImportDTO importDTO = list.get(i); + // 设备名称、规格型号 + if (StrUtil.isBlank(importDTO.getEquipmentName())) { + throw new BusinessException(1500, String.format(validMsg, i + 1, "设备名称不能为空")); + } + if (StrUtil.isBlank(importDTO.getModel())) { + throw new BusinessException(1500, String.format(validMsg, i + 1, "规格型号不能为空")); + } + } + //重复导入判断, 根据设备名称、型号规格、出厂编号判重; + EquipmentImportDuplicationResult checkResult = checkMaintainImportDuplication(list); + if (CollUtil.isNotEmpty(checkResult.getUnDuplicationResult())) { + List unDuplicationList = checkResult.getUnDuplicationResult(); + saveMaintainImport(unDuplicationList); + } + return checkResult; + } + + private void saveMaintainImport(List list) { + Long maxNo = this.baseMapper.selectMaxNo(EQUIPMENT_TYPE_NORMAL); + String prefix = PrefixCodeEnum.EQUIPMENT_PREFIX; + AuthUser user = permissionContext.getAuthService().getLoginUser(); + List equipmentInfos = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + MaintainEquipmentImportDTO importDTO = list.get(i); + EquipmentInfo equipmentInfo = new EquipmentInfo(); + BeanUtil.copyProperties(importDTO, equipmentInfo); + equipmentInfo.setId(IdWorker.getId()); + String equipmentNo = NumberGeneratorUtil.getContactNo(prefix, maxNo); + equipmentInfo.setEquipmentNo(equipmentNo); + maxNo = Long.parseLong(equipmentNo.substring(equipmentNo.length() - 12)); + equipmentInfo.setEquipmentType(EQUIPMENT_TYPE_NORMAL); + equipmentInfo.setCreateUserId(user.getId()); + equipmentInfo.setCreateUserName(user.getName()); + equipmentInfo.setCreateTime(new Date()); + equipmentInfo.setUpdateTime(new Date()); + equipmentInfo.setIsDel(0); + equipmentInfos.add(equipmentInfo); + } + if (CollUtil.isNotEmpty(equipmentInfos)) { + this.saveBatch(equipmentInfos); + } + for (EquipmentInfo equipmentInfo : equipmentInfos) { + turnoverLogService.saveLog(equipmentInfo, null, user.getId()); + } + } + + private EquipmentImportDuplicationResult checkMaintainImportDuplication(List importList) { + //根据设备名称、型号规格、出厂编号判重; + importList.forEach(i -> { + i.setCheckDuplication(String.format("%s%s%s", i.getEquipmentName(), i.getModel(), i.getManufactureNo())); + }); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("is_del", "0"); + List equipmentInfos = this.list(queryWrapper); + + List unDuplicationResult = new ArrayList<>(); + List hasExist = new ArrayList<>(); + List tableDuplication = new ArrayList<>(); + for (int i = 0; i < importList.size(); i++) { + MaintainEquipmentImportDTO importDTO = importList.get(i); + if (equipmentInfos.stream() + .filter(e -> (StrUtil.isBlank(e.getEquipmentName()) && StrUtil.isBlank(importDTO.getEquipmentName())) + || (StrUtil.isNotBlank(e.getEquipmentName()) && e.getEquipmentName().equals(importDTO.getEquipmentName()))) + .filter(e -> (StrUtil.isBlank(e.getModel()) && StrUtil.isBlank(importDTO.getModel())) + || (StrUtil.isNotBlank(e.getModel()) && e.getModel().equals(importDTO.getModel()))) + .filter(e -> (StrUtil.isBlank(e.getManufactureNo()) && StrUtil.isBlank(importDTO.getManufactureNo())) + || (StrUtil.isNotBlank(e.getManufactureNo()) && e.getManufactureNo().equals(importDTO.getManufactureNo()))) + .count() > 0) { + hasExist.add(i + 1); + } else if (importList.stream().filter(e -> e.getCheckDuplication().equals(importDTO.getCheckDuplication())).count() > 1) { + tableDuplication.add(i + 1); + } else { + unDuplicationResult.add(importDTO); + } + } + + EquipmentImportDuplicationResult checkResult = new EquipmentImportDuplicationResult<>(); + checkResult.setUnDuplicationResult(unDuplicationResult); + checkResult.setTableDuplication(tableDuplication); + checkResult.setHasExist(hasExist); + return checkResult; } public void filledImport(List list){ diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/resource/BizResourceCustomerQuestionnaireServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/resource/BizResourceCustomerQuestionnaireServiceImpl.java index cf3ec6c..97e289c 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/resource/BizResourceCustomerQuestionnaireServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/resource/BizResourceCustomerQuestionnaireServiceImpl.java @@ -139,4 +139,10 @@ throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } + @Override + public ReturnDTO questionnaireDetail(Long id) { + BizResourceCustomerQuestionnaire questionnaire = this.baseMapper.selectById(id); + return ReturnUtil.success(questionnaire); + } + } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java index 0c8daec..f6b84ed 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/impl/system/FlowDefDefServiceImpl.java @@ -291,8 +291,12 @@ log.error("流程定义删除失败,deployId:{}", request.getDeployId()); return ReturnUtil.failed("流程定义删除失败"); } - //true:允许级联删除,不设置会导致数据库外键关联异常 - repositoryService.deleteDeployment(request.getDeployId(), true); + try { + //true:允许级联删除,不设置会导致数据库外键关联异常 + repositoryService.deleteDeployment(request.getDeployId(), true); + } catch (Exception e) { + log.error("flowable中流程定义删除失败"); + } return ReturnUtil.success(); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/resource/IBizResourceCustomerQuestionnaireService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/resource/IBizResourceCustomerQuestionnaireService.java index 6fac6e6..0cfd42b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/resource/IBizResourceCustomerQuestionnaireService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/resource/IBizResourceCustomerQuestionnaireService.java @@ -23,4 +23,5 @@ ReturnDTO questionnaireAdd(BizResourceCustomerQuestionnaire questionnaire); + ReturnDTO questionnaireDetail(Long id); }