xzc 1 dienu atpakaļ
vecāks
revīzija
f294222a1b

+ 3 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilertaskorder/vo/BoilerOrderItemReportVO.java

@@ -15,6 +15,9 @@ public class    BoilerOrderItemReportVO {
 
     private String id;
 
+    @Schema(description = "创建人ID")
+    private String creator;
+
     @Schema(description = "报告书编号")
     private String reportNo;
     @Schema(description = "报告书名称")

+ 3 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/pipetaskorder/vo/PipeOrderItemReportVO.java

@@ -15,6 +15,9 @@ public class PipeOrderItemReportVO {
 
     private String id;
 
+    @Schema(description = "创建人ID")
+    private String creator;
+
     @Schema(description = "报告书编号")
     private String reportNo;
     @Schema(description = "报告书名称")

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

@@ -141,6 +141,7 @@ import cn.start.tz.module.pressure2.service.boilertaskorderissuereport.BoilerTas
 import cn.start.tz.module.pressure2.service.boilertaskorderitempart.BoilerTaskOrderItemPartService;
 import cn.start.tz.module.pressure2.service.boilertaskorderitemreport.BoilerTaskOrderItemReportService;
 import cn.start.tz.module.pressure2.service.boilertaskorderitemreportversion.BoilerTaskOrderItemReportVersionService;
+import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitemreportversionarchiving.BoilerTaskOrderItemReportVersionArchivingDO;
 import cn.start.tz.module.pressure2.service.boilertaskorderitemreportversionarchiving.BoilerTaskOrderItemReportVersionArchivingService;
 import cn.start.tz.module.pressure2.service.boilertaskorderoperation.BoilerTaskOrderOperationService;
 import cn.start.tz.module.pressure2.service.boilertaskordersecuritycheck.BoilerTaskOrderSecurityCheckService;
@@ -909,7 +910,7 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
         });
 
         // 锅炉设备检验,定检存在委托收费项目时,每个设备项都需要生成一份委托检验报告
-        boilerLegalReportService.generateLegalReportForAuto(taskOrderDO.getId());
+//        boilerLegalReportService.generateLegalReportForAuto(taskOrderDO.getId());
     }
 
     private void checkAddReport(String id, BoilerTaskOrderDO taskOrderDO) {
@@ -3088,7 +3089,7 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
         // 锅炉设备检验,定检存在委托收费项目时,需要生成一份委托检验报告
         log.info("[addReportVo][准备调用委托检验报告生成 itemListSize={} orderItemSize={}]",
                 orderItemEnterVO.getItemList().size(), orderItemDOS.size());
-        boilerLegalReportService.generateLegalReport(orderItemEnterVO, orderItemDOS, itemPartId);
+//        boilerLegalReportService.generateLegalReport(orderItemEnterVO, orderItemDOS, itemPartId);
 
     }
 
@@ -6152,18 +6153,58 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
         if (reportDO == null) {
             throw exception(REPORT_NOT_EXISTS);
         }
-        // 1.1 仅校核通过(200)且未编制报告(报告编制520)状态可撤回
-        if (!Integer.valueOf(200).equals(reportDO.getRecheckStatus())
-                || !TaskOrderStatusEnum.REPORT_PREPARE.getStatus().equals(reportDO.getTaskStatus())) {
+        // 1.1 校验报告类型和状态:主报告报告编制(520)、子报告报告办结(800)、独审报告报告编制(520)或报告办结(800)
+        Integer reportType = reportDO.getReportType();
+        Integer taskStatus = reportDO.getTaskStatus();
+        boolean canCancel = false;
+        if (Integer.valueOf(100).equals(reportType)
+                && TaskOrderStatusEnum.REPORT_PREPARE.getStatus().equals(taskStatus)) {
+            // 主报告报告编制
+            canCancel = true;
+        } else if (Integer.valueOf(200).equals(reportType)
+                && (TaskOrderStatusEnum.REPORT_PREPARE.getStatus().equals(taskStatus)
+                || TaskOrderStatusEnum.REPORT_FINISH.getStatus().equals(taskStatus))) {
+            // 子报告报告编制或报告办结
+            canCancel = true;
+        } else if (Integer.valueOf(300).equals(reportType)
+                && (TaskOrderStatusEnum.REPORT_PREPARE.getStatus().equals(taskStatus)
+                || TaskOrderStatusEnum.REPORT_FINISH.getStatus().equals(taskStatus))) {
+            // 独审报告报告编制或报告办结
+            canCancel = true;
+        }
+        if (!canCancel) {
             throw exception(RECHECK_CANNOT_CANCEL);
         }
-        // 1.2 仅提交人可撤回
+        // 1.2 创建人或提交校核人可撤回
         String userId = String.valueOf(getLoginUserId());
-        if (!userId.equals(reportDO.getRecheckSubmitId())) {
+        if (!userId.equals(reportDO.getRecheckSubmitId()) && !userId.equals(reportDO.getCreator())) {
             throw exception(RECHECK_CANCEL_NOT_SUBMITTER);
         }
 
-        // 2. 回退报告状态到记录录入
+        // 2. 清理校核通过时生成的报表数据(dynamic_tb_ins + dynamic_tb_val)
+        // refId 规则:record=reportId, report="report_"+reportId, result="result_"+reportId
+        // 撤回后状态回退到记录录入(500),记录数据需保留,只删除报告和结论的实例
+        List<String> refIds = new ArrayList<>();
+        if (StringUtils.isNotBlank(reportDO.getReportTemplateId())) {
+            refIds.add("report_" + reportId);
+        }
+        if (StringUtils.isNotBlank(reportDO.getResultTemplateId())) {
+            refIds.add("result_" + reportId);
+        }
+        List<DynamicTbInsDO> insList = dynamicTbInsService.lambdaQuery()
+                .in(DynamicTbInsDO::getRefId, refIds).list();
+        if (insList != null && !insList.isEmpty()) {
+            List<String> insIds = insList.stream().map(DynamicTbInsDO::getId).collect(Collectors.toList());
+            // 先删字段值表,再删实例表
+            dynamicTbValService.lambdaUpdate().in(DynamicTbValDO::getInsId, insIds).remove();
+            dynamicTbInsService.lambdaUpdate().in(DynamicTbInsDO::getId, insIds).remove();
+        }
+
+        // 3. 清理版本归档记录
+        versionArchivingService.lambdaUpdate()
+                .eq(BoilerTaskOrderItemReportVersionArchivingDO::getReportId, reportId).remove();
+
+        // 4. 回退报告状态到记录录入,清空所有校核相关字段(含校核通过时设置的auditor/reportTemplateId/resultTemplateId/enterPdfUrl/issueUrl)
         BoilerTaskOrderItemReportDO updateDO = new BoilerTaskOrderItemReportDO();
         updateDO.setId(reportId);
         updateDO.setRecheckStatus(null);
@@ -6174,31 +6215,40 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
         updateDO.setRecheckDate(null);
         updateDO.setRecheckReason("");
         updateDO.setReturnReason("");
+        updateDO.setAuditor("");
+        updateDO.setReportTemplateId("");
+        updateDO.setResultTemplateId("");
+        updateDO.setEnterPdfUrl("");
+        updateDO.setIssueUrl("");
         updateDO.setTaskStatus(TaskOrderStatusEnum.ENTER.getStatus());
         taskOrderItemReportMapper.updateById(updateDO);
 
-        // 3. 报告流转记录
+        // 5. 报告流转记录
         BoilerTaskOrderItemReportRecordDO recordDO = new BoilerTaskOrderItemReportRecordDO();
         recordDO.setReportId(reportId);
         recordDO.setProcess(TaskOrderStatusEnum.ENTER.getStatus());
         taskOrderItemReportRecordMapper.insert(recordDO);
 
-        // 4. 回退设备项状态(如果该设备项下没有其他校核通过的报告,回退到记录录入)
+        // 6. 回退设备项状态(如果该设备项下没有其他校核通过或审核中的报告,回退到记录录入)
         BoilerTaskOrderItemDO taskOrderItemDO = boilerTaskOrderItemMapper.selectById(reportDO.getOrderItemId());
         if (taskOrderItemDO != null
-                && taskOrderItemDO.getTaskStatus().equals(TaskOrderStatusEnum.REPORT_PREPARE.getStatus())) {
-            Long approvedCount = taskOrderItemReportMapper.selectCount(
+                && taskOrderItemDO.getTaskStatus() > TaskOrderStatusEnum.ENTER.getStatus()) {
+            Long activeCount = taskOrderItemReportMapper.selectCount(
                     new LambdaQueryWrapperX<BoilerTaskOrderItemReportDO>()
                             .eq(BoilerTaskOrderItemReportDO::getOrderItemId, reportDO.getOrderItemId())
                             .ne(BoilerTaskOrderItemReportDO::getId, reportId)
-                            .eq(BoilerTaskOrderItemReportDO::getRecheckStatus, 200));
-            if (approvedCount == 0) {
+                            .gt(BoilerTaskOrderItemReportDO::getTaskStatus, TaskOrderStatusEnum.ENTER.getStatus()));
+            if (activeCount == 0) {
                 BoilerTaskOrderItemDO updateItem = new BoilerTaskOrderItemDO();
                 updateItem.setId(taskOrderItemDO.getId());
                 updateItem.setTaskStatus(TaskOrderStatusEnum.ENTER.getStatus());
                 boilerTaskOrderItemMapper.updateById(updateItem);
             }
         }
+
+        // 7. 移除首页待办
+        indexTodoService.deleteIndexToDO(IndexTodoTypeNameEnum.RECHECK_ORDER_ITEM.getCode(),
+                null, reportId, 200);
     }
 
     @Override

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

@@ -164,6 +164,7 @@ import cn.start.tz.module.pressure2.service.pipetaskorderinput.PipeTaskOrderInpu
 import cn.start.tz.module.pressure2.service.pipetaskorderissuereport.PipeTaskOrderIssueReportService;
 import cn.start.tz.module.pressure2.service.pipetaskorderissuereportversion.PipeTaskOrderIssueReportVersionService;
 import cn.start.tz.module.pressure2.service.pipetaskorderitemreportversion.PipeTaskOrderItemReportVersionService;
+import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderitemreportversionarchiving.PipeTaskOrderItemReportVersionArchivingDO;
 import cn.start.tz.module.pressure2.service.pipetaskorderitemreportversionarchiving.PipeTaskOrderItemReportVersionArchivingService;
 import cn.start.tz.module.pressure2.service.pipetaskorderoperation.PipeTaskOrderOperationService;
 import cn.start.tz.module.pressure2.service.pipetaskordersecuritycheck.PipeTaskOrderSecurityCheckService;
@@ -4473,18 +4474,58 @@ public class PipeTaskOrderServiceImpl extends ServiceImpl<PipeTaskOrderMapper, P
         if (reportDO == null) {
             throw exception(REPORT_NOT_EXISTS);
         }
-        // 1.1 仅校核通过(200)且未编制报告(报告编制520)状态可撤回
-        if (!Integer.valueOf(200).equals(reportDO.getRecheckStatus())
-                || !TaskOrderStatusEnum.REPORT_PREPARE.getStatus().equals(reportDO.getTaskStatus())) {
+        // 1.1 校验报告类型和状态:主报告报告编制(520)、子报告报告办结(800)、独审报告报告编制(520)或报告办结(800)
+        Integer reportType = reportDO.getReportType();
+        Integer taskStatus = reportDO.getTaskStatus();
+        boolean canCancel = false;
+        if (Integer.valueOf(100).equals(reportType)
+                && TaskOrderStatusEnum.REPORT_PREPARE.getStatus().equals(taskStatus)) {
+            // 主报告报告编制
+            canCancel = true;
+        } else if (Integer.valueOf(200).equals(reportType)
+                && (TaskOrderStatusEnum.REPORT_PREPARE.getStatus().equals(taskStatus)
+                || TaskOrderStatusEnum.REPORT_FINISH.getStatus().equals(taskStatus))) {
+            // 子报告报告编制或报告办结
+            canCancel = true;
+        } else if (Integer.valueOf(300).equals(reportType)
+                && (TaskOrderStatusEnum.REPORT_PREPARE.getStatus().equals(taskStatus)
+                || TaskOrderStatusEnum.REPORT_FINISH.getStatus().equals(taskStatus))) {
+            // 独审报告报告编制或报告办结
+            canCancel = true;
+        }
+        if (!canCancel) {
             throw exception(RECHECK_CANNOT_CANCEL);
         }
-        // 1.2 仅提交人可撤回
+        // 1.2 创建人或提交校核人可撤回
         String userId = String.valueOf(getLoginUserId());
-        if (!userId.equals(reportDO.getRecheckSubmitId())) {
+        if (!userId.equals(reportDO.getRecheckSubmitId()) && !userId.equals(reportDO.getCreator())) {
             throw exception(RECHECK_CANCEL_NOT_SUBMITTER);
         }
 
-        // 2. 回退报告状态到记录录入
+        // 2. 清理校核通过时生成的报表数据(dynamic_tb_ins + dynamic_tb_val)
+        // refId 规则:record=reportId, report="report_"+reportId, result="result_"+reportId
+        // 撤回后状态回退到记录录入(500),记录数据需保留,只删除报告和结论的实例
+        List<String> refIds = new ArrayList<>();
+        if (StringUtils.isNotBlank(reportDO.getReportTemplateId())) {
+            refIds.add("report_" + reportId);
+        }
+        if (StringUtils.isNotBlank(reportDO.getResultTemplateId())) {
+            refIds.add("result_" + reportId);
+        }
+        List<DynamicTbInsDO> insList = dynamicTbInsService.lambdaQuery()
+                .in(DynamicTbInsDO::getRefId, refIds).list();
+        if (insList != null && !insList.isEmpty()) {
+            List<String> insIds = insList.stream().map(DynamicTbInsDO::getId).collect(Collectors.toList());
+            // 先删字段值表,再删实例表
+            dynamicTbValService.lambdaUpdate().in(DynamicTbValDO::getInsId, insIds).remove();
+            dynamicTbInsService.lambdaUpdate().in(DynamicTbInsDO::getId, insIds).remove();
+        }
+
+        // 3. 清理版本归档记录
+        versionArchivingService.lambdaUpdate()
+                .eq(PipeTaskOrderItemReportVersionArchivingDO::getReportId, reportId).remove();
+
+        // 4. 回退报告状态到记录录入,清空所有校核相关字段(含校核通过时设置的auditor/reportTemplateId/resultTemplateId/enterPdfUrl/issueUrl)
         PipeTaskOrderItemReportDO updateDO = new PipeTaskOrderItemReportDO();
         updateDO.setId(reportId);
         updateDO.setRecheckStatus(null);
@@ -4495,14 +4536,23 @@ public class PipeTaskOrderServiceImpl extends ServiceImpl<PipeTaskOrderMapper, P
         updateDO.setRecheckDate(null);
         updateDO.setRecheckReason("");
         updateDO.setReturnReason("");
+        updateDO.setAuditor("");
+        updateDO.setReportTemplateId("");
+        updateDO.setResultTemplateId("");
+        updateDO.setEnterPdfUrl("");
+        updateDO.setIssueUrl("");
         updateDO.setTaskStatus(TaskOrderStatusEnum.ENTER.getStatus());
         taskOrderItemReportMapper.updateById(updateDO);
 
-        // 3. 报告流转记录
+        // 5. 报告流转记录
         PipeTaskOrderItemReportRecordDO recordDO = new PipeTaskOrderItemReportRecordDO();
         recordDO.setReportId(reportId);
         recordDO.setProcess(TaskOrderStatusEnum.ENTER.getStatus());
         taskOrderItemReportRecordMapper.insert(recordDO);
+
+        // 6. 移除首页待办
+        indexTodoService.deleteIndexToDO(IndexTodoTypeNameEnum.RECHECK_ORDER_ITEM.getCode(),
+                null, reportId, 300);
     }
 
     @Override