Bladeren bron

续页处理、受压元件导入、选择审核人

徐展城 5 dagen geleden
bovenliggende
commit
ba8f4d22a2

+ 16 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/equipboiler/EquipBoilerController.java

@@ -31,6 +31,7 @@ import cn.start.tz.module.pressure2.controller.admin.equipboiler.vo.*;
 import cn.start.tz.module.pressure2.dal.dataobject.equipboiler.EquipBoilerDO;
 import cn.start.tz.module.pressure2.dal.dataobject.equipboilerpressurepart.EquipBoilerPressurePartDO;
 import cn.start.tz.module.pressure2.service.equipboiler.EquipBoilerService;
+import org.springframework.web.multipart.MultipartFile;
 
 @Tag(name = "管理后台 - 锅炉设备")
 @RestController
@@ -111,4 +112,19 @@ public class EquipBoilerController {
     public CommonResult<List<Map<String ,String>>> getNameByIds(@RequestBody List<String> ids) {
         return success(equipBoilerService.getNameByIds(ids));
     }
+
+    @PostMapping("/pressure-parts/import")
+    @Operation(summary = "导入锅炉受压元件 Excel")
+    @ApiAccessLog(operateType = IMPORT)
+    public CommonResult<List<EquipBoilerPressurePartExportVO>> importPressureParts(@RequestParam("file") MultipartFile file) throws IOException {
+        List<EquipBoilerPressurePartExportVO> list = ExcelUtils.read(file, EquipBoilerPressurePartExportVO.class);
+        return success(list);
+    }
+
+    @GetMapping("/pressure-parts/get-import-template")
+    @Operation(summary = "下载锅炉受压元件导入模板")
+    public void getPressurePartsImportTemplate(HttpServletResponse response) throws IOException {
+        ExcelUtils.write(response, "锅炉受压元件导入模板.xls", "受压元件", EquipBoilerPressurePartExportVO.class,
+                Collections.emptyList());
+    }
 }

+ 28 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/equipboiler/vo/EquipBoilerPressurePartExportVO.java

@@ -0,0 +1,28 @@
+package cn.start.tz.module.pressure2.controller.admin.equipboiler.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 锅炉受压元件 Excel 导出/导入 VO")
+@Data
+@ExcelIgnoreUnannotated
+public class EquipBoilerPressurePartExportVO {
+
+    @ExcelProperty("部件")
+    private String partType;
+
+    @ExcelProperty("受压元件名称")
+    private String partName;
+
+    @ExcelProperty("规格")
+    private String specification;
+
+    @ExcelProperty("材质")
+    private String material;
+
+    @ExcelProperty("备注")
+    private String remark;
+
+}

+ 1 - 2
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilertaskorder/BoilerTaskOrderServiceImpl.java

@@ -3937,8 +3937,7 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
                 taskOrderItemReportMapper.updateById(updateObj);
             }
         } catch (Exception e) {
-            log.error("发起oa审核异常", e);
-            throw e;
+            log.error("发起oa审核异常,OA流程已发起但响应解析失败,不中断业务流程", e);
         }
     }
 

+ 20 - 9
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/dynamicOFData/boiler/QC10063_202402ReportOFData.java

@@ -19,11 +19,13 @@ import cn.start.tz.module.pressure2.service.dynamicOFData.util.AutoDataBoilerSer
 import cn.start.tz.module.pressure2.service.dynamicOFData.util.GenerateReportJsonService;
 import cn.start.tz.module.system.api.user.AdminUserApi;
 import cn.start.tz.module.system.api.user.dto.AdminUserRespDTO;
+import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Service;
 
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -102,17 +104,26 @@ public class QC10063_202402ReportOFData implements IDynamicOFData {
                 //受压元件
                 List<EquipBoilerPressurePartDO> equipBoilerPressurePartDOList = equipBoilerPressurePartMapper.selectList(new LambdaQueryWrapperX<EquipBoilerPressurePartDO>()
                         .eq(EquipBoilerPressurePartDO::getBoilerId, equipBoilerDO.getId()));
-                if (!equipBoilerPressurePartDOList.isEmpty()){
-                    for (int i = 0; i < equipBoilerPressurePartDOList.size(); i++){
-
+                if (!equipBoilerPressurePartDOList.isEmpty()) {
+                    List<String> list1 = new ArrayList<>();
+                    List<String> list2 = new ArrayList<>();
+                    List<String> list3 = new ArrayList<>();
+                    List<String> list4 = new ArrayList<>();
+                    List<String> list5 = new ArrayList<>();
+                    for (int i = 0; i < equipBoilerPressurePartDOList.size(); i++) {
                         EquipBoilerPressurePartDO partDO = equipBoilerPressurePartDOList.get(i);
-                        result.put("value1_"+(i+1),String.valueOf(i+1));
-                        result.put("value2_"+(i+1),partDO.getPartName());
-                        result.put("value3_"+(i+1),partDO.getSpecification());
-                        result.put("value4_"+(i+1),partDO.getMaterial());
-                        result.put("value5_"+(i+1),partDO.getRemark());
-
+                        list1.add(String.valueOf(i + 1));
+                        list2.add(partDO.getPartName());
+                        list3.add(partDO.getSpecification());
+                        list4.add(partDO.getMaterial());
+                        list5.add(partDO.getRemark());
                     }
+                    result.put("value1_1", JSONArray.toJSONString(list1));
+                    result.put("value2_1", JSONArray.toJSONString(list2));
+                    result.put("value3_1", JSONArray.toJSONString(list3));
+                    result.put("value4_1", JSONArray.toJSONString(list4));
+                    result.put("value5_1", JSONArray.toJSONString(list5));
+
                 }
             }
 

+ 63 - 25
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/dynamicOFData/pipe/QC12116_202400RecordOFData.java

@@ -22,6 +22,7 @@ import cn.start.tz.module.pressure2.service.dynamictbval.DynamicTbValService;
 import cn.start.tz.module.pressure2.service.pipetaskorderitemdetail.PipeTaskOrderItemDetailService;
 import cn.start.tz.module.system.api.user.AdminUserApi;
 import cn.start.tz.module.system.api.user.dto.AdminUserRespDTO;
+import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import jakarta.annotation.Resource;
 import jodd.util.StringUtil;
@@ -29,6 +30,7 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -123,47 +125,83 @@ public class QC12116_202400RecordOFData implements IDynamicOFData {
                                 })
                                 .toList();
                         if (!pipeDetails.isEmpty()){
+                            List<String> nos = new ArrayList<>();
+                            List<String> pipeNos = new ArrayList<>();
+                            List<String> pipeRegCodes = new ArrayList<>();
+                            List<String> pipeNames = new ArrayList<>();
+                            List<String> pipeLevels = new ArrayList<>();
+                            List<String> nominalDiameters = new ArrayList<>();
+                            List<String> nominalWallThicknesses = new ArrayList<>();
+                            List<String> pipeLengths = new ArrayList<>();
+                            List<String> pipeMaterials = new ArrayList<>();
+                            List<String> materialStandards = new ArrayList<>();
+                            List<String> weldCounts = new ArrayList<>();
+                            List<String> designPressures = new ArrayList<>();
+                            List<String> designTemperatures = new ArrayList<>();
+                            List<String> pipeMediums = new ArrayList<>();
+                            List<String> startEndPoints = new ArrayList<>();
+                            List<String> yearSafetyStatusLevels = new ArrayList<>();
+
+                            PipeTaskOrderDO taskOrderDO = null;
+                            if (firstInsDO == null) {
+                                taskOrderDO = pipeTaskOrderMapper.selectById(itemReportDO.getOrderId());
+                            }
+
                             for (int i = 0; i < pipeDetails.size(); i++){
                                 EquipPipeDetailDO pipeDetail = pipeDetails.get(i);
-                                result.put("no_"+(i+1),String.valueOf(i+1));
-                                result.put("pipeNo_"+(i+1),pipeDetail.getPipeNo());
-                                result.put("pipeRegCode_"+(i+1),pipeDetail.getPipeRegCode());
-                                result.put("pipeName_"+(i+1),pipeDetail.getPipeName());
-                                result.put("pipeLevel_"+(i+1),pipeDetail.getPipeLevel());
-                                result.put("nominalDiameter_"+(i+1),pipeDetail.getNominalDiameter());
-                                result.put("nominalWallThickness_"+(i+1),pipeDetail.getNominalWallThickness());
-                                if (pipeDetail.getPipeLength() != null){
-                                    result.put("pipeLength_"+(i+1), formatDecimal(pipeDetail.getPipeLength()));
-                                }
-                                result.put("pipeMaterial_"+(i+1),pipeDetail.getPipeMaterial());
-                                result.put("materialStandard_"+(i+1),pipeDetail.getMaterialStandard());
-                                result.put("weldCount_"+(i+1),pipeDetail.getWeldCount());
+                                nos.add(String.valueOf(i+1));
+                                pipeNos.add(pipeDetail.getPipeNo() != null ? pipeDetail.getPipeNo() : "");
+                                pipeRegCodes.add(pipeDetail.getPipeRegCode() != null ? pipeDetail.getPipeRegCode() : "");
+                                pipeNames.add(pipeDetail.getPipeName() != null ? pipeDetail.getPipeName() : "");
+                                pipeLevels.add(pipeDetail.getPipeLevel() != null ? pipeDetail.getPipeLevel() : "");
+                                nominalDiameters.add(pipeDetail.getNominalDiameter() != null ? pipeDetail.getNominalDiameter() : "");
+                                nominalWallThicknesses.add(pipeDetail.getNominalWallThickness() != null ? pipeDetail.getNominalWallThickness() : "");
+                                pipeLengths.add(pipeDetail.getPipeLength() != null ? formatDecimal(pipeDetail.getPipeLength()) : "");
+                                pipeMaterials.add(pipeDetail.getPipeMaterial() != null ? pipeDetail.getPipeMaterial() : "");
+                                materialStandards.add(pipeDetail.getMaterialStandard() != null ? pipeDetail.getMaterialStandard() : "");
+                                weldCounts.add(pipeDetail.getWeldCount() != null ? pipeDetail.getWeldCount() : "");
 
                                 String designPressure = pipeDetail.getDesignPressure() != null ? pipeDetail.getDesignPressure() : "";
                                 String workPressure = pipeDetail.getWorkPressure() != null ? pipeDetail.getWorkPressure() : "";
-                                result.put("designPressure_" + (i + 1), designPressure + "/" + workPressure);
+                                designPressures.add(designPressure + "/" + workPressure);
 
                                 String designTemperature = pipeDetail.getDesignTemperature() != null ? pipeDetail.getDesignTemperature() : "";
                                 String workTemperature = pipeDetail.getWorkTemperature() != null ? pipeDetail.getWorkTemperature() : "";
-                                result.put("designTemperature_" + (i + 1), designTemperature + "/" + workTemperature);
-                                result.put("pipeMedium_"+(i+1),pipeDetail.getPipeMedium());
+                                designTemperatures.add(designTemperature + "/" + workTemperature);
+
+                                pipeMediums.add(pipeDetail.getPipeMedium() != null ? pipeDetail.getPipeMedium() : "");
 
                                 String startPoint = pipeDetail.getStartPoint() != null ? pipeDetail.getStartPoint() : "";
                                 String endPoint = pipeDetail.getEndPoint() != null ? pipeDetail.getEndPoint() : "";
-                                result.put("startEndPoint_"+(i+1), startPoint + "-" + endPoint);
+                                startEndPoints.add(startPoint + "-" + endPoint);
 
-                                if (firstInsDO == null) {
-                                    //获取检验性质
-                                    PipeTaskOrderDO taskOrderDO = pipeTaskOrderMapper.selectById(itemReportDO.getOrderId());
+                                if (taskOrderDO != null) {
                                     if (taskOrderDO.getCheckType().equals(100)){
-                                        //定检
-                                        result.put("yearSafetyStatusLevel_"+(i+1),pipeDetail.getLegalSafetyStatusLevel());
+                                        yearSafetyStatusLevels.add(pipeDetail.getLegalSafetyStatusLevel() != null ? pipeDetail.getLegalSafetyStatusLevel() : "");
                                     }else if (taskOrderDO.getCheckType().equals(200)){
-                                        //年检
-                                        result.put("yearSafetyStatusLevel_"+(i+1),pipeDetail.getYearSafetyStatusLevel());
+                                        yearSafetyStatusLevels.add(pipeDetail.getYearSafetyStatusLevel() != null ? pipeDetail.getYearSafetyStatusLevel() : "");
                                     }
                                 }
                             }
+
+                            result.put("no_1", JSONArray.toJSONString(nos));
+                            result.put("pipeNo_1", JSONArray.toJSONString(pipeNos));
+                            result.put("pipeRegCode_1", JSONArray.toJSONString(pipeRegCodes));
+                            result.put("pipeName_1", JSONArray.toJSONString(pipeNames));
+                            result.put("pipeLevel_1", JSONArray.toJSONString(pipeLevels));
+                            result.put("nominalDiameter_1", JSONArray.toJSONString(nominalDiameters));
+                            result.put("nominalWallThickness_1", JSONArray.toJSONString(nominalWallThicknesses));
+                            result.put("pipeLength_1", JSONArray.toJSONString(pipeLengths));
+                            result.put("pipeMaterial_1", JSONArray.toJSONString(pipeMaterials));
+                            result.put("materialStandard_1", JSONArray.toJSONString(materialStandards));
+                            result.put("weldCount_1", JSONArray.toJSONString(weldCounts));
+                            result.put("designPressure_1", JSONArray.toJSONString(designPressures));
+                            result.put("designTemperature_1", JSONArray.toJSONString(designTemperatures));
+                            result.put("pipeMedium_1", JSONArray.toJSONString(pipeMediums));
+                            result.put("startEndPoint_1", JSONArray.toJSONString(startEndPoints));
+                            if (!yearSafetyStatusLevels.isEmpty()) {
+                                result.put("yearSafetyStatusLevel_1", JSONArray.toJSONString(yearSafetyStatusLevels));
+                            }
                         }
                     }
 
@@ -189,4 +227,4 @@ public class QC12116_202400RecordOFData implements IDynamicOFData {
         // toPlainString() 避免科学计数法
         return value.stripTrailingZeros().toPlainString();
     }
-}
+}

+ 17 - 1
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/externalOA/ExternalOAServiceImpl.java

@@ -247,7 +247,23 @@ public class ExternalOAServiceImpl implements ExternalOAService {
                 JSON.toJSONString(req),
                 r -> String.valueOf(r.getBindingUser().getId()));
         log.info("发起OA流程结果:{}", result);
-        return JSON.parseObject(result, ExternalOACreateFlowRes.class);
+        try {
+            return JSON.parseObject(result, ExternalOACreateFlowRes.class);
+        } catch (Exception e) {
+            // OA接口可能返回 data 为字符串(如"表单更新成功!")而非对象,做容错处理
+            log.warn("OA流程响应解析为对象失败,尝试兼容解析: {}", e.getMessage());
+            try {
+                JSONObject json = JSON.parseObject(result);
+                ExternalOACreateFlowRes res = new ExternalOACreateFlowRes();
+                res.setCode(json.getString("code"));
+                res.setMessage(json.getString("message"));
+                // data 为字符串时无法获取 summaryId,由调用方判断处理
+                return res;
+            } catch (Exception ex) {
+                log.error("OA流程响应解析完全失败", ex);
+                throw new RuntimeException("OA流程响应解析失败", ex);
+            }
+        }
     }
 
     /**

+ 1 - 2
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pipetaskorder/PipeTaskOrderServiceImpl.java

@@ -3145,8 +3145,7 @@ public class PipeTaskOrderServiceImpl extends ServiceImpl<PipeTaskOrderMapper, P
                 taskOrderItemReportMapper.updateById(updateObj);
             }
         } catch (Exception e) {
-            log.error("发起oa审核异常", e);
-            throw e;
+            log.error("发起oa审核异常,OA流程已发起但响应解析失败,不中断业务流程", e);
         }
     }
 

+ 29 - 29
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pipetaskorderitemreport/PipeTaskOrderItemReportServiceImpl.java

@@ -770,44 +770,44 @@ public class PipeTaskOrderItemReportServiceImpl extends ServiceImpl<PipeTaskOrde
             reqVO.setOrderId(taskOrderItemReportDO.getOrderId());
             pipeTaskOrderService.syncAllReportDataByOrderId(reqVO);
 
-            if (!pipeTaskOrderItemDOList.isEmpty()) {
-                PipeTaskOrderItemDO pipeTaskOrderItemDO = pipeTaskOrderItemDOList.get(0);
-                // 任务完成
-                PipeTaskOrderDO updateOrder = new PipeTaskOrderDO();
-                updateOrder.setId(pipeTaskOrderItemDO.getOrderId());
-                updateOrder.setTaskStatus(TaskOrderStatusEnum.REPORT_FINISH.getStatus());
-                updateOrder.setConfirmDate(now());
-                pipeTaskOrderMapper.updateById(updateOrder);
-
-                pipeTaskOrderInputMapper.update(new LambdaUpdateWrapper<PipeTaskOrderInputDO>()
-                        .eq(PipeTaskOrderInputDO::getOrderId, pipeTaskOrderItemDO.getOrderId())
-                        .set(PipeTaskOrderInputDO::getTaskStatus, TaskOrderStatusEnum.REPORT_FINISH.getStatus())
-                );
 
-                //任务单办结后添加任务单非税开单申请
-                try {
+            PipeTaskOrderDO updateOrder = new PipeTaskOrderDO();
+            updateOrder.setId(taskOrderItemReportDO.getOrderId());
+            updateOrder.setTaskStatus(TaskOrderStatusEnum.REPORT_FINISH.getStatus());
+            updateOrder.setConfirmDate(now());
+            pipeTaskOrderMapper.updateById(updateOrder);
+
+            pipeTaskOrderInputMapper.update(new LambdaUpdateWrapper<PipeTaskOrderInputDO>()
+                    .eq(PipeTaskOrderInputDO::getOrderId, taskOrderItemReportDO.getOrderId())
+                    .set(PipeTaskOrderInputDO::getTaskStatus, TaskOrderStatusEnum.REPORT_FINISH.getStatus())
+            );
+
+            //任务单办结后添加任务单非税开单申请
+            try {
+                if (!pipeTaskOrderItemDOList.isEmpty()) {
+                    PipeTaskOrderItemDO pipeTaskOrderItemDO = pipeTaskOrderItemDOList.get(0);
                     taskOrderNonTaxApplyService.create(new TaskOrderNonTaxApplyCreateVO().setOrderId(pipeTaskOrderItemDO.getOrderId()));
-                } catch (Exception e) {
-                    log.error(e.getMessage());
                 }
+            } catch (Exception e) {
+                log.error(e.getMessage());
+            }
 
 
-                CompletableFuture.runAsync(() -> {
-                    // 任务单办结
-                    pipeTaskOrderDO.setTaskStatus(TaskOrderStatusEnum.REPORT_FINISH.getStatus());
-                    pushTaskOrderService.pushFinanceSystem(pipeTaskOrderDO);
-                });
-
-                //生成任务单下所有设备报告
-                commonThread.runWithOutResult(() -> pipeTaskOrderIssueReportService.createIssueUrl(pipeTaskOrderDO.getId()));
+            CompletableFuture.runAsync(() -> {
+                // 任务单办结
+                pipeTaskOrderDO.setTaskStatus(TaskOrderStatusEnum.REPORT_FINISH.getStatus());
+                pushTaskOrderService.pushFinanceSystem(pipeTaskOrderDO);
+            });
 
-                //合同收费/属于免征则直接发送报告
-                if (Integer.valueOf(200).equals(pipeTaskOrderDO.getFeeType()) || Integer.valueOf(300).equals(pipeTaskOrderDO.getFeeNature())) {
-                    pipeTaskOrderIssueReportService.autoIssueTaskOrderReport(pipeTaskOrderDO, pipeTaskOrderItemDOList);
-                }
+            //生成任务单下所有设备报告
+            commonThread.runWithOutResult(() -> pipeTaskOrderIssueReportService.createIssueUrl(pipeTaskOrderDO.getId()));
 
+            //合同收费/属于免征则直接发送报告
+            if (Integer.valueOf(200).equals(pipeTaskOrderDO.getFeeType()) || Integer.valueOf(300).equals(pipeTaskOrderDO.getFeeNature())) {
+                pipeTaskOrderIssueReportService.autoIssueTaskOrderReport(pipeTaskOrderDO, pipeTaskOrderItemDOList);
             }
 
+
             //当主报告完成审批后更新所有子报告的审批人员
             LambdaUpdateWrapper<PipeTaskOrderItemReportDO> updateBySubReport = new LambdaUpdateWrapper<>();
             String taskOrderItemReportDOId = taskOrderItemReportDO.getId();