Просмотр исходного кода

Merge remote-tracking branch 'origin/dev' into dev

liyuhui_ex 5 дней назад
Родитель
Сommit
deb7ca4f9f
42 измененных файлов с 1306 добавлено и 134 удалено
  1. 7 0
      build-uat/update.sql
  2. 6 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilertaskorder/vo/BoilerOrderItemPageRespVO.java
  3. 4 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/pipetaskorder/vo/PipeOrderItemPageRespVO.java
  4. 25 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/synchronization/SynchronizationController.java
  5. 5 5
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/app/taskorder/BoilerTaskOrderAppApiController.java
  6. 7 11
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/app/taskorder/BoilerTaskOrderIssueReportAppController.java
  7. 7 10
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/app/taskorder/PipeTaskOrderIssueReportAppController.java
  8. 56 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/app/taskorderitemreport/BoilerAppReportTemplateController.java
  9. 59 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/app/taskorderitemreport/PipeAppReportTemplateController.java
  10. 74 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/appapi/boilertaskorderitemsuspend/AppBoilerTaskOrderItemSuspendController.java
  11. 9 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/appapi/equipboiler/AppApiEquipBoilerController.java
  12. 22 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/appapi/equipboiler/dto/EquipBoilerSafetyManagerReqVO.java
  13. 9 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/appapi/equippipe/AppApiEquipPipeController.java
  14. 18 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/appapi/equippipe/dto/EquipPipeSafetyManagerReqVO.java
  15. 74 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/appapi/pipetaskorderitemsuspend/AppapiPipeTaskOrderItemSuspendController.java
  16. 223 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/appapi/reporttemplate/AppapiReportTemplateController.java
  17. 2 2
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/appointmentconfirmorder/AppointmentConfirmOrderServiceImpl.java
  18. 14 4
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/appointmentconfirmorder/PipeAppointmentConfirmOrderServiceImpl.java
  19. 1 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilertaskorder/BoilerTaskOrderInspectionServiceImpl.java
  20. 36 19
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilertaskorder/BoilerTaskOrderServiceImpl.java
  21. 16 16
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilertaskorderitemreport/BoilerTaskOrderItemReportServiceImpl.java
  22. 4 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/equipboiler/EquipBoilerService.java
  23. 10 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/equipboiler/EquipBoilerServiceImpl.java
  24. 3 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/equippipe/EquipPipeService.java
  25. 10 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/equippipe/EquipPipeServiceImpl.java
  26. 2 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/externalOA/vo/ExternalOACreateFlowBodyDataReq.java
  27. 38 19
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pipetaskorder/PipeTaskOrderServiceImpl.java
  28. 16 16
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pipetaskorderitemreport/PipeTaskOrderItemReportServiceImpl.java
  29. 60 4
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pushtaskorder/PushTaskOrderServiceImpl.java
  30. 20 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/synchronization/SynchronizationService.java
  31. 221 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/synchronization/SynchronizationServiceImpl.java
  32. 97 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/synchronization/dto/CheckTaskDto.java
  33. 42 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/synchronization/dto/TaskEquipmentDto.java
  34. 19 14
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/taskordernontaxrecord/TaskOrderNonTaxRecordServiceImpl.java
  35. 33 3
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/tasksign/TaskSignServiceImpl.java
  36. BIN
      tz-module-pressure2/tz-module-pressure2-biz/src/main/resources/SFS.pfx
  37. 3 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/resources/mapper/boilertaskorder/BoilerTaskOrderMapper.xml
  38. 1 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/resources/mapper/pipetaskorder/PipeTaskOrderMapper.xml
  39. 13 5
      tz-module-system/tz-module-system-biz/src/main/java/cn/start/tz/module/system/controller/admin/cas/CasController.java
  40. 2 2
      tz-module-system/tz-module-system-biz/src/main/java/cn/start/tz/module/system/service/oauth2/OAuth2TokenServiceImpl.java
  41. 21 3
      tz-module-system/tz-module-system-biz/src/main/resources/application-hsd.yaml
  42. 17 1
      tz-module-system/tz-module-system-biz/src/main/resources/application-uat.yaml

+ 7 - 0
build-uat/update.sql

@@ -1531,4 +1531,10 @@ COMMENT ON COLUMN "PRESSURE2_PIPE_TASK_ORDER_ITEM_REPORT"."CONFIRMATION_TIME" IS
 ALTER TABLE "PRESSURE2_BOILER_TASK_ORDER_ITEM_REPORT" ADD COLUMN "CONFIRMATION_TIME" DATE;
 COMMENT ON COLUMN "PRESSURE2_BOILER_TASK_ORDER_ITEM_REPORT"."CONFIRMATION_TIME" IS '检验意见通知书确认日期';
 
+-- 0527以上已加
+
+--20260602
+ALTER TABLE "SYSTEM_OAUTH2_REFRESH_TOKEN" MODIFY "REFRESH_TOKEN" VARCHAR(36 CHAR) NOT NULL;
+ALTER TABLE "SYSTEM_OAUTH2_ACCESS_TOKEN" MODIFY "REFRESH_TOKEN" VARCHAR(36 CHAR) NOT NULL;
+
+--已加

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

@@ -31,6 +31,12 @@ public class BoilerOrderItemPageRespVO {
     @Schema(description = "单位地址")
     private String unitAddress;
 
+    @Schema(description = "安全管理人员")
+    private String safery;
+
+    @Schema(description = "安全管理人员电话")
+    private String saferydh;
+
     @Schema(description = "检验性质", example = "2")
     private Integer checkType;
 

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

@@ -413,4 +413,8 @@ public class PipeOrderItemPageRespVO {
     private String approvalId;
 
     private String ratifyId;
+
+    private String securityMan;
+
+    private String securityManPhone;
 }

+ 25 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/synchronization/SynchronizationController.java

@@ -29,4 +29,29 @@ public class SynchronizationController {
         synchronizationService.pipe(null);
         return CommonResult.success(null);
     }
+
+    @GetMapping("/checkTask/boiler")
+    public CommonResult<Object> checkTaskBoiler() {
+        synchronizationService.checkTaskBoiler(null);
+        return CommonResult.success(null);
+    }
+
+    @GetMapping("/checkTask/pipe")
+    public CommonResult<Object> checkTaskPipe() {
+        synchronizationService.checkTaskPipe(null);
+        return CommonResult.success(null);
+    }
+
+    @GetMapping("/taskEquipment/boiler")
+    public CommonResult<Object> taskEquipmentBoiler() {
+        synchronizationService.taskEquipmentBoiler(null);
+        return CommonResult.success(null);
+    }
+
+    @GetMapping("/taskEquipment/pipe")
+    public CommonResult<Object> taskEquipmentPipe() {
+        synchronizationService.taskEquipmentPipe(null);
+        return CommonResult.success(null);
+    }
+
 }

+ 5 - 5
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/app/taskorder/BoilerTaskOrderAppApiController.java

@@ -135,12 +135,12 @@ public class BoilerTaskOrderAppApiController {
     @PermitAll
     public CommonResult<PageResult<TaskOrderNonTaxRecordRespVO>> getNonTaxRecordPage(@Valid TaskOrderNonTaxRecordPageReqVO pageReqVO) {
         // 获取登录用户的手机号作为过滤条件
-//        String mobile = getLoginUserMobile();
-//        if (StringUtils.isEmpty(mobile)) {
-//            return success(new PageResult<>());
-//        }
+        String mobile = getLoginUserMobile();
+        if (StringUtils.isEmpty(mobile)) {
+            return success(new PageResult<>());
+        }
 //        // 设置联系电话过滤条件
-//        pageReqVO.setContactPhone(mobile);
+        pageReqVO.setContactPhone(mobile);
         // 审核通过的数据
         pageReqVO.setStatus(List.of(200));
         PageResult<TaskOrderNonTaxRecordRespVO> pageResult = taskOrderNonTaxRecordService.getTaskOrderNonTaxRecordPageApp(pageReqVO);

+ 7 - 11
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/app/taskorder/BoilerTaskOrderIssueReportAppController.java

@@ -9,6 +9,7 @@ import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.BoilerTa
 import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.BoilerTaskOrderRespVO;
 import cn.start.tz.module.pressure2.controller.admin.boilertaskorderissuereport.vo.BoilerTaskOrderIssueReportPageReqVO;
 import cn.start.tz.module.pressure2.controller.admin.boilertaskorderissuereport.vo.BoilerTaskOrderIssueReportRespVO;
+import cn.start.tz.module.pressure2.framework.appauth.core.context.AppAuthContextHolder;
 import cn.start.tz.module.pressure2.service.boilertaskorder.BoilerTaskOrderService;
 import cn.start.tz.module.pressure2.service.boilertaskorderissuereport.BoilerTaskOrderIssueReportService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -90,17 +91,12 @@ public class BoilerTaskOrderIssueReportAppController {
      @GetMapping("/record-equip/page")
      @PermitAll
      public CommonResult<PageResult<TaskOrderIssueReportItemRespVO>> getTaskOrderIssueReportEquipPageApp(@Valid TaskOrderIssueReportPageReqVO pageReqVO) {
-//         String mobile = getLoginUserMobile();
-//         if(StringUtils.isNotBlank(mobile)){
-//             pageReqVO.setRecipientPhone(mobile);
-//         }else{
-//             return success(PageResult.empty());
-//         }
-
-//         String currentUserUnitId = miniAuthService.getCurrentUserUnitCode();
-//         if(!"-1".equals(currentUserUnitId)){
-//             pageReqVO.setUnitCode(currentUserUnitId);
-//         }
+         String mobile = AppAuthContextHolder.getMobile();
+         if(StringUtils.isNotBlank(mobile)){
+             pageReqVO.setRecipientPhone(mobile);
+         }else{
+             return success(PageResult.empty());
+         }
 
          PageResult<TaskOrderIssueReportItemRespVO> pageResult = boilerTaskOrderIssueReportService.getTaskOrderIssueReportEquipPageApp(pageReqVO);
          return success(pageResult);

+ 7 - 10
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/app/taskorder/PipeTaskOrderIssueReportAppController.java

@@ -9,6 +9,7 @@ import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.BoilerTa
 import cn.start.tz.module.pressure2.controller.admin.pipetaskorder.vo.PipeTaskOrderRespVO;
 import cn.start.tz.module.pressure2.controller.admin.pipetaskorderissuereport.vo.PipeTaskOrderIssueReportPageReqVO;
 import cn.start.tz.module.pressure2.controller.admin.pipetaskorderissuereport.vo.PipeTaskOrderIssueReportRespVO;
+import cn.start.tz.module.pressure2.framework.appauth.core.context.AppAuthContextHolder;
 import cn.start.tz.module.pressure2.service.pipetaskorder.PipeTaskOrderService;
 import cn.start.tz.module.pressure2.service.pipetaskorderissuereport.PipeTaskOrderIssueReportService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -108,17 +109,13 @@ public class PipeTaskOrderIssueReportAppController {
     @PermitAll
 
     public CommonResult<PageResult<TaskOrderIssueReportItemRespVO>> getTaskOrderIssueReportEquipPageApp(@Valid TaskOrderIssueReportPageReqVO pageReqVO) {
-//        String mobile = getLoginUserMobile();
-//        if(StringUtils.isNotBlank(mobile)){
-//            pageReqVO.setRecipientPhone(mobile);
-//        }else{
-//            return success(PageResult.empty());
-//        }
+        String mobile = AppAuthContextHolder.getMobile();
+        if(StringUtils.isNotBlank(mobile)){
+            pageReqVO.setRecipientPhone(mobile);
+        }else{
+            return success(PageResult.empty());
+        }
 
-//         String currentUserUnitId = miniAuthService.getCurrentUserUnitCode();
-//         if(!"-1".equals(currentUserUnitId)){
-//             pageReqVO.setUnitCode(currentUserUnitId);
-//         }
 
         PageResult<TaskOrderIssueReportItemRespVO> pageResult = pipeTaskOrderIssueReportService.getTaskOrderIssueReportEquipPageApp(pageReqVO);
         return success(pageResult);

+ 56 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/app/taskorderitemreport/BoilerAppReportTemplateController.java

@@ -1,6 +1,8 @@
 package cn.start.tz.module.pressure2.controller.app.taskorderitemreport;
 
+import cn.start.tz.framework.common.pojo.CommonResult;
 import cn.start.tz.framework.ratelimiter.core.annotation.RateLimiter;
+import cn.start.tz.module.infra.api.file.FileApi;
 import cn.start.tz.module.pressure2.framework.appauth.core.annotation.AppAuth;
 import cn.start.tz.module.pressure2.controller.admin.pipetaskorderinput.vo.PipeTaskOrderInputPrintReqVO;
 import cn.start.tz.module.pressure2.controller.admin.reporttemplate.vo.ReportMockPreviewVO;
@@ -103,4 +105,58 @@ public class BoilerAppReportTemplateController {
         }
         response.getOutputStream().write(bos.toByteArray());
     }
+    @Resource
+    private FileApi fileApi;
+
+    @PostMapping("/image")
+    @Operation(summary = "通用文件获取(图片/视频/PDF等)")
+    @PermitAll
+    public void printFromPdf(HttpServletResponse response, @RequestParam("imageUrl") String imageUrl) throws Exception {
+        CommonResult<byte[]> file = fileApi.getFileByPath(imageUrl);
+        byte[] data = file.getData();
+
+        // 根据文件后缀动态设置 Content-Type
+        String contentType = getContentType(imageUrl);
+        response.setContentType(contentType);
+
+        // 图片类型内联显示,其他类型触发下载
+        if (contentType.startsWith("image/")) {
+            response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode(extractFileName(imageUrl), StandardCharsets.UTF_8));
+        } else {
+            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(extractFileName(imageUrl), StandardCharsets.UTF_8));
+        }
+
+        response.getOutputStream().write(data);
+    }
+
+    /**
+     * 根据文件后缀返回对应的 MIME 类型
+     */
+    private String getContentType(String fileUrl) {
+        String lowerUrl = fileUrl.toLowerCase();
+        if (lowerUrl.endsWith(".png"))  return "image/png";
+        if (lowerUrl.endsWith(".jpg") || lowerUrl.endsWith(".jpeg")) return "image/jpeg";
+        if (lowerUrl.endsWith(".gif"))  return "image/gif";
+        if (lowerUrl.endsWith(".webp")) return "image/webp";
+        if (lowerUrl.endsWith(".bmp"))  return "image/bmp";
+        if (lowerUrl.endsWith(".svg"))  return "image/svg+xml";
+        if (lowerUrl.endsWith(".mp4"))  return "video/mp4";
+        if (lowerUrl.endsWith(".mov"))  return "video/quicktime";
+        if (lowerUrl.endsWith(".avi"))  return "video/x-msvideo";
+        if (lowerUrl.endsWith(".pdf"))  return "application/pdf";
+        if (lowerUrl.endsWith(".doc"))  return "application/msword";
+        if (lowerUrl.endsWith(".docx")) return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
+        if (lowerUrl.endsWith(".xls"))  return "application/vnd.ms-excel";
+        if (lowerUrl.endsWith(".xlsx")) return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
+        // 默认按图片处理
+        return "image/png";
+    }
+
+    /**
+     * 从路径中提取文件名
+     */
+    private String extractFileName(String fileUrl) {
+        int lastSlash = fileUrl.lastIndexOf('/');
+        return lastSlash >= 0 ? fileUrl.substring(lastSlash + 1) : fileUrl;
+    }
 }

+ 59 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/app/taskorderitemreport/PipeAppReportTemplateController.java

@@ -1,5 +1,8 @@
 package cn.start.tz.module.pressure2.controller.app.taskorderitemreport;
 
+import cn.start.tz.framework.common.pojo.CommonResult;
+import cn.start.tz.framework.ratelimiter.core.annotation.RateLimiter;
+import cn.start.tz.module.infra.api.file.FileApi;
 import cn.start.tz.module.pressure2.framework.appauth.core.annotation.AppAuth;
 import cn.start.tz.module.pressure2.controller.admin.pipetaskorderinput.vo.PipeTaskOrderInputPrintReqVO;
 import cn.start.tz.module.pressure2.controller.admin.reporttemplate.vo.ReportMockPreviewVO;
@@ -98,4 +101,60 @@ public class PipeAppReportTemplateController {
         }
         response.getOutputStream().write(bos.toByteArray());
     }
+
+    @Resource
+    private FileApi fileApi;
+
+    @PostMapping("/image/{imageUrl}")
+    @Operation(summary = "通用文件获取(图片/视频/PDF等)")
+    @PermitAll
+    @RateLimiter
+    public void printFromPdf(HttpServletResponse response, @PathVariable String imageUrl) throws Exception {
+        CommonResult<byte[]> file = fileApi.getFileByPath(imageUrl);
+        byte[] data = file.getData();
+
+        // 根据文件后缀动态设置 Content-Type
+        String contentType = getContentType(imageUrl);
+        response.setContentType(contentType);
+
+        // 图片类型内联显示,其他类型触发下载
+        if (contentType.startsWith("image/")) {
+            response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode(extractFileName(imageUrl), StandardCharsets.UTF_8));
+        } else {
+            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(extractFileName(imageUrl), StandardCharsets.UTF_8));
+        }
+
+        response.getOutputStream().write(data);
+    }
+
+    /**
+     * 根据文件后缀返回对应的 MIME 类型
+     */
+    private String getContentType(String fileUrl) {
+        String lowerUrl = fileUrl.toLowerCase();
+        if (lowerUrl.endsWith(".png"))  return "image/png";
+        if (lowerUrl.endsWith(".jpg") || lowerUrl.endsWith(".jpeg")) return "image/jpeg";
+        if (lowerUrl.endsWith(".gif"))  return "image/gif";
+        if (lowerUrl.endsWith(".webp")) return "image/webp";
+        if (lowerUrl.endsWith(".bmp"))  return "image/bmp";
+        if (lowerUrl.endsWith(".svg"))  return "image/svg+xml";
+        if (lowerUrl.endsWith(".mp4"))  return "video/mp4";
+        if (lowerUrl.endsWith(".mov"))  return "video/quicktime";
+        if (lowerUrl.endsWith(".avi"))  return "video/x-msvideo";
+        if (lowerUrl.endsWith(".pdf"))  return "application/pdf";
+        if (lowerUrl.endsWith(".doc"))  return "application/msword";
+        if (lowerUrl.endsWith(".docx")) return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
+        if (lowerUrl.endsWith(".xls"))  return "application/vnd.ms-excel";
+        if (lowerUrl.endsWith(".xlsx")) return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
+        // 默认按图片处理
+        return "image/png";
+    }
+
+    /**
+     * 从路径中提取文件名
+     */
+    private String extractFileName(String fileUrl) {
+        int lastSlash = fileUrl.lastIndexOf('/');
+        return lastSlash >= 0 ? fileUrl.substring(lastSlash + 1) : fileUrl;
+    }
 }

+ 74 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/appapi/boilertaskorderitemsuspend/AppBoilerTaskOrderItemSuspendController.java

@@ -0,0 +1,74 @@
+package cn.start.tz.module.pressure2.controller.appapi.boilertaskorderitemsuspend;
+
+import cn.start.tz.framework.common.pojo.CommonResult;
+import cn.start.tz.framework.common.pojo.PageResult;
+import cn.start.tz.framework.common.util.object.BeanUtils;
+import cn.start.tz.module.pressure2.controller.admin.boilertaskorderitemsuspend.vo.BoilerTaskOrderItemSuspendPageReqVO;
+import cn.start.tz.module.pressure2.controller.admin.boilertaskorderitemsuspend.vo.BoilerTaskOrderItemSuspendRespVO;
+import cn.start.tz.module.pressure2.controller.admin.boilertaskorderitemsuspend.vo.BoilerTaskOrderItemSuspendSaveReqVO;
+import cn.start.tz.module.pressure2.controller.admin.boilertaskorderitemsuspend.vo.TaskOrderItemSuspendSubmitReqVO;
+import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitemsuspend.BoilerTaskOrderItemSuspendDO;
+import cn.start.tz.module.pressure2.service.boilertaskorderitemsuspend.BoilerTaskOrderItemSuspendService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import static cn.start.tz.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 锅炉中止检验记录")
+@RestController
+@RequestMapping("/pressure2/boiler-task-order-item-suspend")
+@Validated
+public class AppBoilerTaskOrderItemSuspendController {
+
+    @Resource
+    private BoilerTaskOrderItemSuspendService boilerTaskOrderItemSuspendService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建锅炉中止检验记录")
+    public CommonResult<String> createBoilerTaskOrderItemSuspend(@Valid @RequestBody BoilerTaskOrderItemSuspendSaveReqVO createReqVO) {
+        return success(boilerTaskOrderItemSuspendService.createBoilerTaskOrderItemSuspend(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新锅炉中止检验记录")
+    public CommonResult<Boolean> updateBoilerTaskOrderItemSuspend(@Valid @RequestBody BoilerTaskOrderItemSuspendSaveReqVO updateReqVO) {
+        boilerTaskOrderItemSuspendService.updateBoilerTaskOrderItemSuspend(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除锅炉中止检验记录")
+    @Parameter(name = "id", description = "编号", required = true)
+    public CommonResult<Boolean> deleteBoilerTaskOrderItemSuspend(@RequestParam("id") String id) {
+        boilerTaskOrderItemSuspendService.deleteBoilerTaskOrderItemSuspend(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得锅炉中止检验记录")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    public CommonResult<BoilerTaskOrderItemSuspendRespVO> getBoilerTaskOrderItemSuspend(@RequestParam("id") String id) {
+        BoilerTaskOrderItemSuspendDO boilerTaskOrderItemSuspend = boilerTaskOrderItemSuspendService.getBoilerTaskOrderItemSuspend(id);
+        return success(BeanUtils.toBean(boilerTaskOrderItemSuspend, BoilerTaskOrderItemSuspendRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得锅炉中止检验记录分页")
+    public CommonResult<PageResult<BoilerTaskOrderItemSuspendRespVO>> getBoilerTaskOrderItemSuspendPage(@Valid BoilerTaskOrderItemSuspendPageReqVO pageReqVO) {
+        PageResult<BoilerTaskOrderItemSuspendRespVO> pageResult = boilerTaskOrderItemSuspendService.getBoilerTaskOrderItemSuspendPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, BoilerTaskOrderItemSuspendRespVO.class));
+    }
+
+    @PostMapping("/suspend")
+    @Operation(summary = "批量中止检验")
+    public CommonResult<Boolean> submitTaskOrderItemSuspend(@Valid @RequestBody TaskOrderItemSuspendSubmitReqVO submitReqVO) {
+        boilerTaskOrderItemSuspendService.submitTaskOrderItemSuspend(submitReqVO);
+        return success(true);
+    }
+
+}

+ 9 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/appapi/equipboiler/AppApiEquipBoilerController.java

@@ -10,6 +10,7 @@ import cn.start.tz.module.pressure2.controller.admin.equipboiler.vo.EquipBoilerP
 import cn.start.tz.module.pressure2.controller.admin.equipboiler.vo.EquipBoilerPageRespVO;
 import cn.start.tz.module.pressure2.controller.admin.equipboiler.vo.EquipBoilerRespVO;
 import cn.start.tz.module.pressure2.controller.admin.equipboiler.vo.EquipBoilerSaveReqVO;
+import cn.start.tz.module.pressure2.controller.appapi.equipboiler.dto.EquipBoilerSafetyManagerReqVO;
 import cn.start.tz.module.pressure2.dal.dataobject.equipboiler.EquipBoilerDO;
 import cn.start.tz.module.pressure2.service.equipboiler.EquipBoilerService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -58,6 +59,14 @@ public class AppApiEquipBoilerController {
         return success(true);
     }
 
+    @PutMapping("/updateSafetyManager")
+    @Operation(summary = "更新锅炉设备")
+    //@PreAuthorize("@ss.hasPermission('pressure2:equip-boiler:update')")
+    public CommonResult<Boolean> updateSafetyManager(@Valid @RequestBody EquipBoilerSafetyManagerReqVO updateReqVO) {
+        equipBoilerService.updateSafetyManager(updateReqVO);
+        return success(true);
+    }
+
     @DeleteMapping("/delete")
     @Operation(summary = "删除锅炉设备")
     @Parameter(name = "id", description = "编号", required = true)

+ 22 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/appapi/equipboiler/dto/EquipBoilerSafetyManagerReqVO.java

@@ -0,0 +1,22 @@
+package cn.start.tz.module.pressure2.controller.appapi.equipboiler.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 锅炉设备新增/修改 Request VO")
+@Data
+public class EquipBoilerSafetyManagerReqVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "25953")
+    private String id;
+
+    /**
+     * SAFERY - 使用单位安全管理员
+     */
+    private String safery;
+    /**
+     * SAFERYDH - 安全人员电话
+     */
+    private String saferydh;
+
+}

+ 9 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/appapi/equippipe/AppApiEquipPipeController.java

@@ -11,6 +11,7 @@ import cn.start.tz.framework.ip.core.utils.AreaUtils;
 import cn.start.tz.module.pressure2.controller.admin.equippipe.vo.EquipPipePageReqVO;
 import cn.start.tz.module.pressure2.controller.admin.equippipe.vo.EquipPipeRespVO;
 import cn.start.tz.module.pressure2.controller.admin.equippipe.vo.EquipPipeSaveReqVO;
+import cn.start.tz.module.pressure2.controller.appapi.equippipe.dto.EquipPipeSafetyManagerReqVO;
 import cn.start.tz.module.pressure2.dal.dataobject.equippipe.EquipPipeDO;
 import cn.start.tz.module.pressure2.service.equippipe.EquipPipeService;
 import com.alibaba.fastjson2.JSONObject;
@@ -71,6 +72,14 @@ public class AppApiEquipPipeController {
         return success(true);
     }
 
+    @PutMapping("/updateSafetyManager")
+    @Operation(summary = "更新管道设备")
+    public CommonResult<Boolean> updateSafetyManager(@Valid @RequestBody EquipPipeSafetyManagerReqVO updateReqVO) throws IOException {
+        equipPipeService.updateSafetyManager(updateReqVO);
+        return success(true);
+    }
+
+
     @DeleteMapping("/delete")
     @Operation(summary = "删除管道设备")
     @Parameter(name = "id", description = "编号", required = true)

+ 18 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/appapi/equippipe/dto/EquipPipeSafetyManagerReqVO.java

@@ -0,0 +1,18 @@
+package cn.start.tz.module.pressure2.controller.appapi.equippipe.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 管道设备新增/修改 Request VO")
+@Data
+public class EquipPipeSafetyManagerReqVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1753")
+    private String id;
+
+    @Schema(description = "安全管理人员")
+    private String securityMan;
+
+    @Schema(description = "安全管理人电话")
+    private String securityManPhone;
+}

+ 74 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/appapi/pipetaskorderitemsuspend/AppapiPipeTaskOrderItemSuspendController.java

@@ -0,0 +1,74 @@
+package cn.start.tz.module.pressure2.controller.appapi.pipetaskorderitemsuspend;
+
+import cn.start.tz.framework.common.pojo.CommonResult;
+import cn.start.tz.framework.common.pojo.PageResult;
+import cn.start.tz.framework.common.util.object.BeanUtils;
+import cn.start.tz.module.pressure2.controller.admin.pipetaskorderitemsuspend.vo.PipeTaskOrderItemSuspendPageReqVO;
+import cn.start.tz.module.pressure2.controller.admin.pipetaskorderitemsuspend.vo.PipeTaskOrderItemSuspendRespVO;
+import cn.start.tz.module.pressure2.controller.admin.pipetaskorderitemsuspend.vo.PipeTaskOrderItemSuspendSaveReqVO;
+import cn.start.tz.module.pressure2.controller.admin.pipetaskorderitemsuspend.vo.PipeTaskOrderItemSuspendSubmitReqVO;
+import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderitemsuspend.PipeTaskOrderItemSuspendDO;
+import cn.start.tz.module.pressure2.service.pipetaskorderitemsuspend.PipeTaskOrderItemSuspendService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import static cn.start.tz.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 管道中止检验记录")
+@RestController
+@RequestMapping("/pressure2/pipe-task-order-item-suspend")
+@Validated
+public class AppapiPipeTaskOrderItemSuspendController {
+
+    @Resource
+    private PipeTaskOrderItemSuspendService pipeTaskOrderItemSuspendService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建管道中止检验记录")
+    public CommonResult<String> createPipeTaskOrderItemSuspend(@Valid @RequestBody PipeTaskOrderItemSuspendSaveReqVO createReqVO) {
+        return success(pipeTaskOrderItemSuspendService.createPipeTaskOrderItemSuspend(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新管道中止检验记录")
+    public CommonResult<Boolean> updatePipeTaskOrderItemSuspend(@Valid @RequestBody PipeTaskOrderItemSuspendSaveReqVO updateReqVO) {
+        pipeTaskOrderItemSuspendService.updatePipeTaskOrderItemSuspend(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除管道中止检验记录")
+    @Parameter(name = "id", description = "编号", required = true)
+    public CommonResult<Boolean> deletePipeTaskOrderItemSuspend(@RequestParam("id") String id) {
+        pipeTaskOrderItemSuspendService.deletePipeTaskOrderItemSuspend(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得管道中止检验记录")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    public CommonResult<PipeTaskOrderItemSuspendRespVO> getPipeTaskOrderItemSuspend(@RequestParam("id") String id) {
+        PipeTaskOrderItemSuspendDO pipeTaskOrderItemSuspend = pipeTaskOrderItemSuspendService.getPipeTaskOrderItemSuspend(id);
+        return success(BeanUtils.toBean(pipeTaskOrderItemSuspend, PipeTaskOrderItemSuspendRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得管道中止检验记录分页")
+    public CommonResult<PageResult<PipeTaskOrderItemSuspendRespVO>> getPipeTaskOrderItemSuspendPage(@Valid PipeTaskOrderItemSuspendPageReqVO pageReqVO) {
+        PageResult<PipeTaskOrderItemSuspendRespVO> pageResult = pipeTaskOrderItemSuspendService.getPipeTaskOrderItemSuspendPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, PipeTaskOrderItemSuspendRespVO.class));
+    }
+
+    @PostMapping("/suspend")
+    @Operation(summary = "批量中止检验")
+    public CommonResult<Boolean> submitTaskOrderItemSuspend(@Valid @RequestBody PipeTaskOrderItemSuspendSubmitReqVO submitReqVO) {
+        pipeTaskOrderItemSuspendService.submitTaskOrderItemSuspend(submitReqVO);
+        return success(true);
+    }
+
+}

+ 223 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/appapi/reporttemplate/AppapiReportTemplateController.java

@@ -0,0 +1,223 @@
+package cn.start.tz.module.pressure2.controller.appapi.reporttemplate;
+
+import cn.start.tz.framework.common.pojo.CommonResult;
+import cn.start.tz.framework.common.pojo.PageResult;
+import cn.start.tz.module.pressure2.controller.admin.reporttemplate.vo.*;
+import cn.start.tz.module.pressure2.dal.dataobject.dynamictb.DynamicTbDO;
+import cn.start.tz.module.pressure2.service.reporttemplate.ReportTemplateService;
+import cn.start.tz.module.system.api.template.TemplateInitDataApi;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+import static cn.start.tz.framework.common.pojo.CommonResult.success;
+
+@Slf4j
+@Tag(name = "管理后台 - 承压报告模版")
+@RestController
+@RequestMapping("/pressure2/report-template")
+@Validated
+public class AppapiReportTemplateController {
+
+    @Resource
+    private ReportTemplateService reportTemplateService;
+
+    @Resource
+    private TemplateInitDataApi templateInitDataApi;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建承压报告模版")
+    //@PreAuthorize("@ss.hasPermission('pressure:report-template:create')")
+    public CommonResult<String> createReportTemplate(@Valid @RequestBody ReportTemplateSaveReqVO createReqVO) {
+        return success(reportTemplateService.createReportTemplate(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新承压报告模版")
+    //@PreAuthorize("@ss.hasPermission('pressure:report-template:update')")
+    public CommonResult<Boolean> updateReportTemplate(@Valid @RequestBody ReportTemplateSaveReqVO updateReqVO) {
+        reportTemplateService.updateReportTemplate(updateReqVO);
+        return success(true);
+    }
+
+    @PutMapping("/update-status")
+    @Operation(summary = "更新承压报告模版状态")
+    //@PreAuthorize("@ss.hasPermission('pressure:report-template:update')")
+    public CommonResult<Boolean> updateReportTemplateStatus(@Valid @RequestBody ReportTemplateUpdateReqVO updateReqVO) {
+        reportTemplateService.updateReportTemplateStatus(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除承压报告模版")
+    @Parameter(name = "id", description = "编号", required = true)
+    //@PreAuthorize("@ss.hasPermission('pressure:report-template:delete')")
+    public CommonResult<Boolean> deleteReportTemplate(@RequestParam("id") String id) {
+        reportTemplateService.deleteReportTemplate(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得承压报告模版")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    //@PreAuthorize("@ss.hasPermission('pressure:report-template:query')")
+    public CommonResult<ReportTemplateDetailRespVO> getReportTemplate(@RequestParam("id") String id) {
+        ReportTemplateDetailRespVO detailRespVO = reportTemplateService.getReportTemplateDetail(id);
+        return success(detailRespVO);
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得承压报告模版分页")
+    //@PreAuthorize("@ss.hasPermission('pressure:report-template:query')")
+    public CommonResult<PageResult<ReportTemplateRespVO>> getReportTemplatePage(@Valid ReportTemplatePageReqVO pageReqVO) {
+        PageResult<ReportTemplateRespVO> pageResult = reportTemplateService.getPage(pageReqVO);
+        return success(pageResult);
+    }
+
+    @GetMapping("/audit/page")
+    @Operation(summary = "获得承压报告模版审核列表分页")
+    //@PreAuthorize("@ss.hasPermission('pressure:report-template:query')")
+    public CommonResult<PageResult<ReportTemplateRespVO>> getReportTemplateAuditPage(@Valid ReportTemplatePageReqVO pageReqVO) {
+        PageResult<ReportTemplateRespVO> pageResult = reportTemplateService.getAuditPage(pageReqVO);
+        return success(pageResult);
+    }
+
+    @GetMapping("/notVerifyPage")
+    @Operation(summary = "获得承压报告模版分页(不校验菜单权限)")
+    public CommonResult<List<DynamicTbDO>> notReportTemplateVerifyPage(@Valid ReportTemplatePageReqVO pageReqVO) {
+        List<DynamicTbDO> list = reportTemplateService.getReportTemplatePage(pageReqVO);
+        return success(list);
+    }
+
+//    @GetMapping("/export-excel")
+//    @Operation(summary = "导出承压报告模版 Excel")
+//    //@PreAuthorize("@ss.hasPermission('pressure:report-template:export')")
+//    @ApiAccessLog(operateType = EXPORT)
+//    public void exportReportTemplateExcel(@Valid ReportTemplatePageReqVO pageReqVO,
+//                                          HttpServletResponse response) throws IOException {
+//        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+//        List<ReportTemplateRespVO> list = reportTemplateService.getReportTemplatePage(pageReqVO).getList();
+//        // 导出 Excel
+//        ExcelUtils.write(response, "承压报告模版.xls", "数据", ReportTemplateRespVO.class,
+//                BeanUtils.toBean(list, ReportTemplateRespVO.class));
+//    }
+
+//    @GetMapping("/reportPreview")
+//    @Operation(summary = "承压报告xlsx预览测试接口 type 默认100 100报告记录 200报告结论 300 报告模板 400 金额计算&关联关系, fileType 默认100 xlsx ,200 pdf")
+//    public void reportPreview(HttpServletResponse response, @RequestParam(name = "templateId") String templateId,
+//                              @RequestParam(name = "equipCode") String equipCode,
+//                              @RequestParam(name = "type", defaultValue = "100") Integer type,
+//                              @RequestParam(name = "fileType", defaultValue = "100") Integer fileType,
+//                              @RequestParam(name = "reportId", required = false) String reportId
+//
+//    ) throws Exception {
+//        try (ByteArrayOutputStream outputStream = reportTemplateService.getRecordOutputStream(templateId, equipCode, type, fileType, reportId)) {
+//            ServletOutputStream responseOutputStream = response.getOutputStream();
+//            outputStream.writeTo(responseOutputStream);
+//        } catch (Exception e) {
+//            // 5. 错误处理
+//            response.reset();
+//            response.setContentType("application/json");
+//            response.setCharacterEncoding("UTF-8");
+//            response.getWriter().write("{\"error\":\"文件生成失败: " + e.getMessage() + "\"}");
+//        }
+//    }
+//
+//
+//    @PostMapping("/reportPreview")
+//    @Operation(summary = "承压报告xlsx预览测试接口 type 默认100 100报告记录 200报告结论 300 报告模板 400 金额计算&关联关系, fileType 默认100 xlsx ,200 pdf")
+//    public void reportPreviewPost(HttpServletResponse response, @RequestBody ReportPreviewVO reportPreviewVO) throws Exception {
+//        try (ByteArrayOutputStream outputStream = reportTemplateService.getRecordOutputStreamMerge(reportPreviewVO)) {
+//            ServletOutputStream responseOutputStream = response.getOutputStream();
+//            outputStream.writeTo(responseOutputStream);
+//        } catch (Exception e) {
+//            log.error("reportPreview error",e);
+//            // 5. 错误处理
+//            response.reset();
+//            response.setContentType("application/json");
+//            response.setCharacterEncoding("UTF-8");
+//            response.getWriter().write("{\"error\":\"文件生成失败: " + e.getMessage() + "\"}");
+//        }
+//    }
+
+//    @PutMapping("/updateBindingPathNameJson")
+//    @Operation(summary = "更新绑定数据json字符串带注释")
+//    //@PreAuthorize("@ss.hasPermission('pressure:report-template:update')")
+//    public CommonResult<Boolean> updateBindingPathNameJson(@Valid @RequestBody ReportTemplateSaveReqVO updateReqVO) {
+//        reportTemplateService.updateBindingPathNameJson(updateReqVO);
+//        return success(true);
+//    }
+
+
+    @GetMapping("/report/json")
+    @Operation(summary = "获得承压报告json")
+    public CommonResult<String> getReportJson(@RequestParam(name = "type", defaultValue = "100") Integer type,
+                                              @RequestParam(name = "fileType", defaultValue = "100") Integer fileType,
+                                              @RequestParam(name = "reportId", required = true) String reportId) throws Exception {
+        return CommonResult.success(reportTemplateService.getReportJson(reportId, type, fileType));
+    }
+
+
+//    @PutMapping("/initiateApproval")
+//    @Operation(summary = "发起审批")
+//    public CommonResult<Boolean> reportTemplateInitiateApproval(@RequestBody ReportTemplateSubmitVO reportTemplateSubmitVO) {
+//        Boolean result = reportTemplateService.initiateApproval(reportTemplateSubmitVO);
+//        return success(result);
+//    }
+
+//    @PostMapping("/approve")
+//    @Operation(summary = "审批通过")
+//    public CommonResult<Boolean> reportTemplateApprove(@RequestBody ReportTemplateAuditVO reportTemplateAuditVO) {
+//        reportTemplateService.approve(reportTemplateAuditVO);
+//        return success(true);
+//    }
+
+//    @PostMapping("/reject")
+//    @Operation(summary = "审批拒绝")
+//    public CommonResult<Boolean> reportTemplateReject(@RequestBody ReportTemplateAuditVO reportTemplateAuditVO) {
+//        reportTemplateService.reject(reportTemplateAuditVO);
+//        return success(true);
+//    }
+
+
+//    @GetMapping("/circulationRecord")
+//    @Operation(summary = "流转列表")
+//    public CommonResult<List<BpmTaskRespVO>> reportTemplateCirculationRecord(
+//            @RequestParam(name = "id") String id) {
+//        List<BpmTaskRespVO> pageResult = reportTemplateService.circulationRecord(id);
+//        return success(pageResult);
+//    }
+
+//    @PostMapping("/mock/preview")
+//    @Operation(summary = "预览")
+//    public void reportTemplateMockPreview(HttpServletResponse response, @RequestBody ReportMockPreviewVO reportPreviewVO) throws IOException {
+//        try (ByteArrayOutputStream outputStream = reportTemplateService.reportTemplateMockPreview(reportPreviewVO)) {
+//            ServletOutputStream responseOutputStream = response.getOutputStream();
+//            outputStream.writeTo(responseOutputStream);
+//        } catch (Exception e) {
+//            // 5. 错误处理
+//            response.reset();
+//            response.setContentType("application/json");
+//            response.setCharacterEncoding("UTF-8");
+//            response.getWriter().write("\"error\":\"文件生成失败: " + e.getMessage() + "\"");
+//        }
+//    }
+
+    // json
+    @PostMapping("/mock/json")
+    @Operation(summary = "预览")
+    public CommonResult<String> reportTemplateMockJson(HttpServletResponse response,
+                                                       @RequestBody ReportMockPreviewVO reportPreviewVO) {
+        String json = reportTemplateService.reportTemplateMockJson(reportPreviewVO);
+        return success(json);
+    }
+
+}

+ 2 - 2
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/appointmentconfirmorder/AppointmentConfirmOrderServiceImpl.java

@@ -602,7 +602,7 @@ public class AppointmentConfirmOrderServiceImpl implements AppointmentConfirmOrd
             return;
         }
         // 拒绝检验
-        if(200 == appointmentRefuseVO.getType()){
+/*        if(200 == appointmentRefuseVO.getType()){
 
             List<AppointmentConfirmRefuseYearItemDO> list = equipContainerDOS.stream().map(item -> {
                 AppointmentConfirmRefuseYearItemDO appointmentConfirmOrderRefuseItemDO = new AppointmentConfirmRefuseYearItemDO();
@@ -658,7 +658,7 @@ public class AppointmentConfirmOrderServiceImpl implements AppointmentConfirmOrd
             }
 
             return ;
-        }
+        }*/
 
         Map<String, Object> processInstanceVariables = new HashMap<>();
 

+ 14 - 4
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/appointmentconfirmorder/PipeAppointmentConfirmOrderServiceImpl.java

@@ -641,7 +641,7 @@ public class PipeAppointmentConfirmOrderServiceImpl implements PipeAppointmentCo
             return;
         }
         // 拒绝检验
-        if(200 == appointmentRefuseVO.getType()){
+        /*if(200 == appointmentRefuseVO.getType()){
 
             List<EquipPipeDetailDO> equipPipeDetailDOS = equipPipeDetailMapper.selectByIds(equipDetailIds);
             List<AppointmentConfirmRefuseYearItemDO> list = equipPipeDetailDOS.stream().map(item -> {
@@ -674,7 +674,7 @@ public class PipeAppointmentConfirmOrderServiceImpl implements PipeAppointmentCo
             updateConfirmOrderByPipeDetail(appointmentRefuseVO.getOrderId(),equipContainerDOS,equipDetailIds);
 
             return ;
-        }
+        }*/
 
         //上报市局
         Map<String, Object> processInstanceVariables = new HashMap<>();
@@ -1263,11 +1263,21 @@ public class PipeAppointmentConfirmOrderServiceImpl implements PipeAppointmentCo
         }
     }
 
+    @Resource
+    private PipeAppointmentConfirmOrderItemMapper pipeAppointmentConfirmOrderItemMapper;
+
     @Override
     public void refuseCheckApp(AppAppointmentRefuseVO appointmentRefuseVO) {
         AppointmentRefuseVO refuseVO = new AppointmentRefuseVO();
-        refuseVO.setEquipIds(appointmentRefuseVO.getEquipIds());
-        refuseVO.setDetailEquipRows(appointmentRefuseVO.getDetailEquipRows());
+        List<PipeAppointmentConfirmOrderItemDO> pipeAppointmentConfirmOrderItemDOS = pipeAppointmentConfirmOrderItemMapper.selectByIds(appointmentRefuseVO.getEquipIds());
+        refuseVO.setEquipIds(pipeAppointmentConfirmOrderItemDOS.stream().map(PipeAppointmentConfirmOrderItemDO::getEquipId).toList());
+        List<EquipPipeDetailDO> detailEquipRows = appointmentRefuseVO.getDetailEquipRows();
+        if (!CollUtil.isEmpty(detailEquipRows)) {
+            List<PipeAppointmentConfirmOrderItemDetailDO> pipeAppointmentConfirmOrderItemDetailDOS = pipeAppointmentConfirmOrderItemDetailMapper.selectByIds(detailEquipRows.stream().map(EquipPipeDetailDO::getId).toList());
+            List<String> list = pipeAppointmentConfirmOrderItemDetailDOS.stream().map(PipeAppointmentConfirmOrderItemDetailDO::getEquipId).toList();
+            List<EquipPipeDetailDO> equipPipeDetailDOS = equipPipeDetailMapper.selectByIds(list);
+            refuseVO.setDetailEquipRows(equipPipeDetailDOS);
+        }
         refuseVO.setOrderId(appointmentRefuseVO.getOrderId());
         refuseVO.setOrderNo(appointmentRefuseVO.getOrderNo());
         refuseVO.setCheckType(appointmentRefuseVO.getCheckType());

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

@@ -206,6 +206,7 @@ public class BoilerTaskOrderInspectionServiceImpl implements BoilerTaskOrderInsp
                     updateObj.setId(taskOrderItemReportDO.getId());
                     updateObj.setMpSendStatus(4);
                     updateObj.setRecipient(inspectionOpinionSendVo.getRecipient());
+                    updateObj.setRecipientPhone(inspectionOpinionSendVo.getRecipientPhone());
                     taskOrderItemReportMapper.updateById(updateObj);
 
                     //添加业务与平台用户关联

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

@@ -10,6 +10,7 @@ import cn.start.tz.framework.common.exception.ServiceException;
 import cn.start.tz.framework.common.exception.enums.GlobalErrorCodeConstants;
 import cn.start.tz.framework.common.pojo.CommonResult;
 import cn.start.tz.framework.common.util.date.DateUtils;
+import cn.start.tz.framework.env.core.enums.EnvEnum;
 import cn.start.tz.framework.ip.core.Area;
 import cn.start.tz.framework.ip.core.utils.AreaUtils;
 import cn.start.tz.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -164,6 +165,7 @@ import cn.start.tz.module.pressure2.service.pdf.PdfService;
 import cn.start.tz.module.pressure2.service.pipetaskorder.PipeTaskOrderService;
 import cn.start.tz.module.pressure2.service.pipetaskorder.PipeTaskOrderServiceImpl;
 import cn.start.tz.module.pressure2.service.pipetaskorderissuereport.PipeTaskOrderIssueReportService;
+import cn.start.tz.module.pressure2.service.pushtaskorder.PushTaskOrderService;
 import cn.start.tz.module.pressure2.service.synchronization.SynchronizationService;
 import cn.start.tz.module.pressure2.service.synchronization.dto.ReportDto;
 import cn.start.tz.module.pressure2.service.userwallthicknesstemplate.UserWallThicknessTemplateService;
@@ -1924,6 +1926,9 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
         return true;
     }
 
+    @Resource
+    private PushTaskOrderService pushTaskOrderService;
+
     @Transactional
     @Override
     public Boolean audit(String id, Integer status, String reason) {
@@ -2011,6 +2016,7 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
             BoilerTaskOrderItemDO taskOrderItem = new BoilerTaskOrderItemDO();
             taskOrderItem.setTaskStatus(TaskOrderStatusEnum.CANCEL.getStatus());
             boilerTaskOrderItemMapper.update(taskOrderItem, new LambdaUpdateWrapper<BoilerTaskOrderItemDO>().eq(BoilerTaskOrderItemDO::getOrderId, id));
+//            pushTaskOrderService.pushFinanceSystem(taskOrderDO);
         }
 
         return true;
@@ -3917,11 +3923,19 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
     private ExternalOACreateFlowRes createExternalOAFlow(BoilerTaskOrderItemReportDO taskOrderItemReportDO, BoilerTaskOrderItemReportDO updateObj) throws Exception {
         BoilerTaskOrderItemDO boilerTaskOrderItemDO = boilerTaskOrderItemMapper.selectById(taskOrderItemReportDO.getOrderItemId());
         BoilerTaskOrderDO boilerTaskOrderDO = boilerTaskOrderMapper.selectById(boilerTaskOrderItemDO.getOrderId());
+        String equipId = boilerTaskOrderItemDO.getEquipId();
+        EquipBoilerDO equipBoilerDO = equipBoilerMapper.selectById(equipId);
         ExternalOACreateFlowReq externalOACreateFlowReq = new ExternalOACreateFlowReq();
         ExternalOACreateFlowBodyDataReq.FormMain formmain_0042 = new ExternalOACreateFlowBodyDataReq.FormMain();
         formmain_0042.setContractno(boilerTaskOrderDO.getUnitName());
         formmain_0042.setUnitname(taskOrderItemReportDO.getReportNo());
         formmain_0042.setDeptName("锅炉");
+        formmain_0042.setReportnum(taskOrderItemReportDO.getReportNo().substring(2, 4));
+        //  设备类型是锅炉,设备小类非电站锅炉,且关联部门是电站锅炉检验部的就传1,否则传0
+        if (formmain_0042.getReportnum().equals("06")){
+            DeptRespDTO data = deptApi.getDept(equipBoilerDO.getRelatedDepartment()).getCheckedData();
+            formmain_0042.setProperty(!equipBoilerDO.getType().equals("1") && data.getName().equals("锅炉检验部") ? "1" : "0");
+        }
         formmain_0042.setBeginDate(boilerTaskOrderDO.getRemark());
         ExternalOACreateFlowBodyDataReq externalOACreateFlowBodyDataReq = new ExternalOACreateFlowBodyDataReq();
 
@@ -5836,45 +5850,48 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
             return false;
         }
 
-        // 取消支付
+        // 取消支付 - 使用数据库原子操作扣减,避免并发丢失更新
         if (payInfo.getIsCancel() != null && payInfo.getIsCancel()) {
             LambdaUpdateWrapper<BoilerTaskOrderDO> wrap = new LambdaUpdateWrapper<>();
             wrap.eq(BoilerTaskOrderDO::getId, boilerTaskOrderDO.getId());
 
-            wrap.set(BoilerTaskOrderDO::getPaymentStatus, 0);
-            wrap.set(BoilerTaskOrderDO::getPayAmount, 0);
+            BigDecimal cancelAmount = payInfo.getChargeAmount() != null ? payInfo.getChargeAmount() : BigDecimal.ZERO;
+            String cancelAmountStr = cancelAmount.toPlainString();
+            // 单 setSql 合并两个列更新,所有表达式只依赖旧列值,确保不依赖求值顺序
+            // 旧 pay_amount <= cancelAmount 说明扣减后为 0 → 未支付(0);否则 → 部分结算(2)
+            wrap.setSql("pay_amount = GREATEST(0, COALESCE(pay_amount, 0) - " + cancelAmountStr
+                + "), payment_status = CASE WHEN COALESCE(pay_amount, 0) <= " + cancelAmountStr + " THEN 0 ELSE 2 END");
             wrap.set(BoilerTaskOrderDO::getPayTime, null);
             boilerTaskOrderMapper.update(wrap);
             return true;
         }
 
-        BoilerTaskOrderDO updateOrder = new BoilerTaskOrderDO();
-        updateOrder.setId(boilerTaskOrderDO.getId());
-        updateOrder.setPaymentStatus(1);
+        // 正常缴费 - 使用数据库原子操作累加,避免并发丢失更新
+        LambdaUpdateWrapper<BoilerTaskOrderDO> wrap = new LambdaUpdateWrapper<>();
+        wrap.eq(BoilerTaskOrderDO::getId, boilerTaskOrderDO.getId());
+
+        BigDecimal chargeAmount = payInfo.getChargeAmount() != null ? payInfo.getChargeAmount() : BigDecimal.ZERO;
+        String chargeAmountStr = chargeAmount.toPlainString();
+        // 单 setSql 合并两个列更新,所有表达式只依赖旧列值,确保不依赖求值顺序
+        // 旧 pay_amount + chargeAmount >= serviceAmount → 已结算(1);否则 → 部分结算(2)
+        wrap.setSql("pay_amount = COALESCE(pay_amount, 0) + " + chargeAmountStr
+            + ", payment_status = CASE WHEN COALESCE(service_amount, 0) <= COALESCE(pay_amount, 0) + " + chargeAmountStr + " THEN 1 ELSE 2 END");
+
         String chargeTime = payInfo.getChargeTime();
         try {
             LocalDateTime localDateTime = DateUtils.parseDateTimeWithMultipleFormats(chargeTime);
-            updateOrder.setPayTime(localDateTime);
+            wrap.set(BoilerTaskOrderDO::getPayTime, localDateTime);
         } catch (Exception e) {
             log.error("日期转换失败", e);
-            updateOrder.setPayTime(LocalDateTime.now());
-        }
-        try {
-            updateOrder.setPayAmount(payInfo.getChargeAmount());
-            if (payInfo.getChargeAmount() == null) {
-                updateOrder.setPayAmount(boilerTaskOrderDO.getActualAmount());
-            }
-
-        } catch (Exception e) {
-            log.error("payAmount 设置错误", e);
+            wrap.set(BoilerTaskOrderDO::getPayTime, LocalDateTime.now());
         }
 
         if (payInfo.getFeeType() != null) {
             log.info("更新收费形式" + payInfo.getOrderNo());
-            updateOrder.setFeeType(payInfo.getFeeType());
+            wrap.set(BoilerTaskOrderDO::getFeeType, payInfo.getFeeType());
         }
 
-        boilerTaskOrderMapper.updateById(updateOrder);
+        boilerTaskOrderMapper.update(wrap);
         //非合同收费并且不属于免征范围时结算回调后自动发放报告
         if (Integer.valueOf(100).equals(boilerTaskOrderDO.getFeeType()) && (Integer.valueOf(200).equals(boilerTaskOrderDO.getFeeNature()) || boilerTaskOrderDO.getFeeNature() == null)) {
             List<BoilerTaskOrderItemDO> taskOrderItemDOList = boilerTaskOrderItemMapper.selectList(new LambdaQueryWrapperX<BoilerTaskOrderItemDO>().

+ 16 - 16
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilertaskorderitemreport/BoilerTaskOrderItemReportServiceImpl.java

@@ -498,7 +498,7 @@ public class BoilerTaskOrderItemReportServiceImpl extends ServiceImpl<BoilerTask
                     BoilerTaskOrderItemReportRecordDO boilerTaskOrderItemReportRecordDO = new BoilerTaskOrderItemReportRecordDO();
                     boilerTaskOrderItemReportRecordDO.setReportId(boilerTaskOrderItemReportDO.getId());
                     boilerTaskOrderItemReportRecordDO.setProcess(
-                            "审批人".equals(comment.getNodeName()) ? 700 : 600);
+                            comment.getNodeName() != null && comment.getNodeName().contains("审批") ? 700 : 600);
                     boilerTaskOrderItemReportRecordDO.setRemark(comment.getComment());
                     boilerTaskOrderItemReportRecordDO.setCreateTime(comment.getCreateDate());
                     CommonResult<List<AdminUserRespDTO>> userListByNickname = adminUserApi.getUserListByNickname(comment.getUserName());
@@ -522,14 +522,14 @@ public class BoilerTaskOrderItemReportServiceImpl extends ServiceImpl<BoilerTask
                 }).toList();
         taskOrderItemReportRecordMapper.insertBatch(newComments);
 
-        // 根据NODE_NAME实时更新报告的审核人/审批人信息
-        // 找最新的"审核人"节点的【同意】或【已阅】评论
+        // 根据NODE_NAME实时更新报告的审核人/审批人信息
+        // 找最新的"审核人"节点的【同意】或【已阅】评论
         comments.stream()
                 .filter(comment -> latestRecord == null || comment.getCreateDate().isAfter(latestRecord.getCreateTime()))
                 .filter(c -> c.getComment() != null
                         && (c.getComment().contains("【同意】") || c.getComment().contains("【已阅】"))
                         && !"common.toolbar.stepBack.label".equals(c.getExtAtt3())
-                        && "审核人".equals(c.getNodeName()))
+                        && c.getNodeName() != null && c.getNodeName().contains("审核"))
                 .max(Comparator.comparing(ExternalOACommentInfoRes::getCreateDate))
                 .ifPresent(approval -> {
                     List<AdminUserRespDTO> userList = adminUserApi.getUserListByNickname(approval.getUserName()).getCheckedData();
@@ -541,13 +541,13 @@ public class BoilerTaskOrderItemReportServiceImpl extends ServiceImpl<BoilerTask
                     }
                 });
 
-        // 找最新的"审批人"节点的【同意】或【已阅】评论
+        // 找最新的"审批人"节点的【同意】或【已阅】评论
         comments.stream()
                 .filter(comment -> latestRecord == null || comment.getCreateDate().isAfter(latestRecord.getCreateTime()))
                 .filter(c -> c.getComment() != null
                         && (c.getComment().contains("【同意】") || c.getComment().contains("【已阅】"))
                         && !"common.toolbar.stepBack.label".equals(c.getExtAtt3())
-                        && "审批人".equals(c.getNodeName()))
+                        && c.getNodeName() != null && c.getNodeName().contains("审批"))
                 .max(Comparator.comparing(ExternalOACommentInfoRes::getCreateDate))
                 .ifPresent(ratify -> {
                     List<AdminUserRespDTO> userList = adminUserApi.getUserListByNickname(ratify.getUserName()).getCheckedData();
@@ -569,7 +569,7 @@ public class BoilerTaskOrderItemReportServiceImpl extends ServiceImpl<BoilerTask
      * @param boilerTaskOrderItemReportDO 报告
      */
     public void updateReportStatus(BoilerTaskOrderItemReportDO boilerTaskOrderItemReportDO, ExternalOACommentRes commentRes) {
-        // 根据NODE_NAME区分审核人和审批人
+        // 根据NODE_NAME区分审核人和审批人
         List<ExternalOACommentInfoRes> comments = commentRes != null && commentRes.getData() != null
                 ? commentRes.getData().getComments() : null;
         String approvalId = null;
@@ -580,21 +580,21 @@ public class BoilerTaskOrderItemReportServiceImpl extends ServiceImpl<BoilerTask
         LocalDateTime ratifyTime = null;
 
         if (comments != null && !comments.isEmpty()) {
-            // NODE_NAME="审核人" → approval(审核人)
+            // NODE_NAME="审核人" → approval(审核人
             ExternalOACommentInfoRes approval = comments.stream()
                     .filter(c -> c.getComment() != null
                             && (c.getComment().contains("【同意】") || c.getComment().contains("【已阅】"))
                             && !"common.toolbar.stepBack.label".equals(c.getExtAtt3())
-                            && "审核人".equals(c.getNodeName()))
+                            && c.getNodeName() != null && c.getNodeName().contains("审核"))
                     .max(Comparator.comparing(ExternalOACommentInfoRes::getCreateDate))
                     .orElse(null);
 
-            // NODE_NAME="审批人" → ratify(审批人)
+            // NODE_NAME="审批人" → ratify(审批人
             ExternalOACommentInfoRes ratify = comments.stream()
                     .filter(c -> c.getComment() != null
                             && (c.getComment().contains("【同意】") || c.getComment().contains("【已阅】"))
                             && !"common.toolbar.stepBack.label".equals(c.getExtAtt3())
-                            && "审批人".equals(c.getNodeName()))
+                            && c.getNodeName() != null && c.getNodeName().contains("审批"))
                     .max(Comparator.comparing(ExternalOACommentInfoRes::getCreateDate))
                     .orElse(null);
 
@@ -653,7 +653,7 @@ public class BoilerTaskOrderItemReportServiceImpl extends ServiceImpl<BoilerTask
             }
         }
 
-        // 调用重载方法,传入从OA评论中提取的审核人和审批人信息
+        // 调用重载方法,传入从OA评论中提取的审核人和审批人信息
         updateOrderItemRatifyFinish(boilerTaskOrderItemReportDO.getId(), approvalId, approvalName, approvalTime, ratifyId, ratifyName, ratifyTime);
     }
 
@@ -741,7 +741,7 @@ public class BoilerTaskOrderItemReportServiceImpl extends ServiceImpl<BoilerTask
     }
 
     /**
-     * 办结报告(轮询调用,从OA评论中获取审核人和审批人)
+     * 办结报告(轮询调用,从OA评论中获取审核人和审批人
      */
     public void updateOrderItemRatifyFinish(String id, String approvalId, String approvalName, LocalDateTime approvalTime,
                                             String ratifyId, String ratifyName, LocalDateTime ratifyTime) {
@@ -754,13 +754,13 @@ public class BoilerTaskOrderItemReportServiceImpl extends ServiceImpl<BoilerTask
         updateObj.setTaskStatus(TaskOrderStatusEnum.REPORT_FINISH.getStatus());
         updateObj.setReturnReason("");
 
-        // 设置审核人信息
+        // 设置审核人信息
         if (approvalId != null) {
             updateObj.setApprovalId(approvalId);
             updateObj.setApprovalName(approvalName);
             updateObj.setApprovalTime(approvalTime != null ? approvalTime : LocalDateTime.now());
         }
-        // 设置审批人信息
+        // 设置审批人信息
         if (ratifyId != null) {
             updateObj.setRatifyId(ratifyId);
             updateObj.setRatifyName(ratifyName);
@@ -946,7 +946,7 @@ public class BoilerTaskOrderItemReportServiceImpl extends ServiceImpl<BoilerTask
 
             }
 
-            //当主报告完成审批后更新所有子报告的审批人
+            //当主报告完成审批后更新所有子报告的审批人
             LambdaUpdateWrapper<BoilerTaskOrderItemReportDO> updateBySubReport = new LambdaUpdateWrapper<>();
             updateBySubReport.eq(BoilerTaskOrderItemReportDO::getOrderItemId, taskOrderItemReportDO.getOrderItemId());
             updateBySubReport.eq(BoilerTaskOrderItemReportDO::getReportType, TaskOrderItemReportTypeEnum.SUB_REPORT.getType());

+ 4 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/equipboiler/EquipBoilerService.java

@@ -1,6 +1,8 @@
 package cn.start.tz.module.pressure2.service.equipboiler;
 
 import java.util.*;
+
+import cn.start.tz.module.pressure2.controller.appapi.equipboiler.dto.EquipBoilerSafetyManagerReqVO;
 import jakarta.validation.*;
 import cn.start.tz.module.pressure2.controller.admin.equipboiler.vo.*;
 import cn.start.tz.module.pressure2.dal.dataobject.equipboiler.EquipBoilerDO;
@@ -103,4 +105,6 @@ public interface EquipBoilerService extends IService<EquipBoilerDO>  {
      * @return 受压元件列表
      */
     List<EquipBoilerPressurePartDO> getPressureParts(String boilerId);
+
+    void updateSafetyManager(@Valid EquipBoilerSafetyManagerReqVO updateReqVO);
 }

+ 10 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/equipboiler/EquipBoilerServiceImpl.java

@@ -6,6 +6,7 @@ import cn.start.tz.framework.common.exception.ServerException;
 import cn.start.tz.framework.common.pojo.CommonResult;
 import cn.start.tz.framework.ip.core.utils.AreaUtils;
 import cn.start.tz.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.start.tz.module.pressure2.controller.appapi.equipboiler.dto.EquipBoilerSafetyManagerReqVO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilerequipoperationrecord.BoilerEquipOperationRecordDO;
 import cn.start.tz.module.pressure2.dal.mysql.boilerequipoperationrecord.BoilerEquipOperationRecordMapper;
 import cn.start.tz.module.system.api.clientunit.ClientUnitApi;
@@ -451,4 +452,13 @@ public class EquipBoilerServiceImpl extends ServiceImpl<EquipBoilerMapper, Equip
         return equipBoilerPressurePartMapper.selectByBoilerId(boilerId);
     }
 
+    @Override
+    public void updateSafetyManager(EquipBoilerSafetyManagerReqVO updateReqVO) {
+        EquipBoilerDO equipBoilerDO = new EquipBoilerDO();
+        equipBoilerDO.setId(updateReqVO.getId());
+        equipBoilerDO.setSafery(updateReqVO.getSafery());
+        equipBoilerDO.setSaferydh(updateReqVO.getSaferydh());
+        equipBoilerMapper.updateById(equipBoilerDO);
+    }
+
 }

+ 3 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/equippipe/EquipPipeService.java

@@ -2,6 +2,7 @@ package cn.start.tz.module.pressure2.service.equippipe;
 
 import java.util.*;
 
+import cn.start.tz.module.pressure2.controller.appapi.equippipe.dto.EquipPipeSafetyManagerReqVO;
 import cn.start.tz.module.pressure2.dal.dataobject.equipboiler.EquipBoilerDO;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import jakarta.validation.*;
@@ -85,4 +86,6 @@ public interface EquipPipeService extends IService<EquipPipeDO>  {
      * @return 管道设备
      */
     Map<String, EquipPipeSaveReqVO> getEquipPipeByNo(List<String> projectNos);
+
+    void updateSafetyManager(@Valid EquipPipeSafetyManagerReqVO updateReqVO);
 }

+ 10 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/equippipe/EquipPipeServiceImpl.java

@@ -13,6 +13,7 @@ import cn.start.tz.module.pressure2.controller.admin.equippipedetail.vo.EquipPip
 import cn.start.tz.module.pressure2.controller.admin.equippipedetail.vo.EquipPipeDetailSaveReqVO;
 import cn.start.tz.module.pressure2.controller.admin.pipeequipmentoperationrecord.vo.PipeEquipmentOperationRecordPageReqVO;
 import cn.start.tz.module.pressure2.controller.admin.pipeequipmentoperationrecord.vo.PipeEquipmentOperationRecordRespVO;
+import cn.start.tz.module.pressure2.controller.appapi.equippipe.dto.EquipPipeSafetyManagerReqVO;
 import cn.start.tz.module.pressure2.dal.dataobject.equippipe.EquipPipeDO;
 import cn.start.tz.module.pressure2.dal.dataobject.equippipedetail.EquipPipeDetailDO;
 import cn.start.tz.module.pressure2.dal.dataobject.pipeequipmentoperationrecord.PipeEquipmentOperationRecordDO;
@@ -279,4 +280,13 @@ public class EquipPipeServiceImpl extends ServiceImpl<EquipPipeMapper, EquipPipe
         return map;
     }
 
+    @Override
+    public void updateSafetyManager(EquipPipeSafetyManagerReqVO updateReqVO) {
+        EquipPipeDO equipPipeDO = new EquipPipeDO();
+        equipPipeDO.setId(updateReqVO.getId());
+        equipPipeDO.setSecurityMan(updateReqVO.getSecurityMan());
+        equipPipeDO.setSecurityManPhone(updateReqVO.getSecurityManPhone());
+        equipPipeMapper.updateById(equipPipeDO);
+    }
+
 }

+ 2 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/externalOA/vo/ExternalOACreateFlowBodyDataReq.java

@@ -16,5 +16,7 @@ public class ExternalOACreateFlowBodyDataReq {
         private String beginDate;
         private String totalFee;
         private String discount;
+        private String reportnum;
+        private String property;
     }
 }

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

@@ -3132,12 +3132,28 @@ public class PipeTaskOrderServiceImpl extends ServiceImpl<PipeTaskOrderMapper, P
      */
     private ExternalOACreateFlowRes createExternalOAFlow(PipeTaskOrderItemReportDO taskOrderItemReportDO, PipeTaskOrderItemReportDO updateObj) throws Exception {
         PipeTaskOrderDO pipeTaskOrderDO = pipeTaskOrderMapper.selectById(taskOrderItemReportDO.getOrderId());
+        List<PipeTaskOrderItemDO> pipeTaskOrderItemDOS = pipeTaskOrderItemMapper.selectList(PipeTaskOrderItemDO::getOrderId, pipeTaskOrderDO.getId());
+        if (pipeTaskOrderItemDOS.isEmpty()){
+            throw new Exception("没有任务单明细");
+        }
+        PipeTaskOrderItemDO pipeTaskOrderItemDO = pipeTaskOrderItemDOS.get(0);
+        List<PipeTaskOrderItemDetailDO> pipeTaskOrderItemDetailDOS = pipeTaskOrderItemDetailMapper.selectList(PipeTaskOrderItemDetailDO::getOrderId, pipeTaskOrderItemDO.getOrderId());
+        if (pipeTaskOrderItemDetailDOS.isEmpty()){
+            throw new Exception("没有任务单明细");
+        }
+        String equipId = pipeTaskOrderItemDetailDOS.get(0).getEquipDetailId();
+        EquipPipeDetailDO equipPipeDetailDO = equipPipeDetailMapper.selectById(equipId);
         ExternalOACreateFlowReq externalOACreateFlowReq = new ExternalOACreateFlowReq();
         ExternalOACreateFlowBodyDataReq.FormMain formmain_0042 = new ExternalOACreateFlowBodyDataReq.FormMain();
         formmain_0042.setContractno(pipeTaskOrderDO.getUnitName());
         formmain_0042.setUnitname(taskOrderItemReportDO.getReportNo());
         formmain_0042.setDeptName("管道");
         formmain_0042.setBeginDate(pipeTaskOrderDO.getRemark());
+        formmain_0042.setReportnum(taskOrderItemReportDO.getReportNo().substring(2, 4));
+        // 如果注册代码是81开头的,就传1,否则传0
+        if (formmain_0042.getReportnum().equals("22")){
+            formmain_0042.setProperty(equipPipeDetailDO.getPipeRegCode().startsWith("81") ? "1" : "0");
+        }
         ExternalOACreateFlowBodyDataReq externalOACreateFlowBodyDataReq = new ExternalOACreateFlowBodyDataReq();
 
         // 重新发送
@@ -5670,45 +5686,48 @@ public class PipeTaskOrderServiceImpl extends ServiceImpl<PipeTaskOrderMapper, P
             return false;
         }
 
-        // 取消支付
+        // 取消支付 - 使用数据库原子操作扣减,避免并发丢失更新
         if (payInfo.getIsCancel() != null && payInfo.getIsCancel()) {
             LambdaUpdateWrapper<PipeTaskOrderDO> wrap = new LambdaUpdateWrapper<>();
             wrap.eq(PipeTaskOrderDO::getId, pipeTaskOrderDO.getId());
 
-            wrap.set(PipeTaskOrderDO::getPaymentStatus, 0);
-            wrap.set(PipeTaskOrderDO::getPayAmount, 0);
+            BigDecimal cancelAmount = payInfo.getChargeAmount() != null ? payInfo.getChargeAmount() : BigDecimal.ZERO;
+            String cancelAmountStr = cancelAmount.toPlainString();
+            // 单 setSql 合并两个列更新,所有表达式只依赖旧列值,确保不依赖求值顺序
+            // 旧 pay_amount <= cancelAmount 说明扣减后为 0 → 未支付(0);否则 → 部分结算(2)
+            wrap.setSql("pay_amount = GREATEST(0, COALESCE(pay_amount, 0) - " + cancelAmountStr
+                + "), payment_status = CASE WHEN COALESCE(pay_amount, 0) <= " + cancelAmountStr + " THEN 0 ELSE 2 END");
             wrap.set(PipeTaskOrderDO::getPayTime, null);
             pipeTaskOrderMapper.update(wrap);
             return true;
         }
 
-        PipeTaskOrderDO updateOrder = new PipeTaskOrderDO();
-        updateOrder.setId(pipeTaskOrderDO.getId());
-        updateOrder.setPaymentStatus(1);
+        // 正常缴费 - 使用数据库原子操作累加,避免并发丢失更新
+        LambdaUpdateWrapper<PipeTaskOrderDO> wrap = new LambdaUpdateWrapper<>();
+        wrap.eq(PipeTaskOrderDO::getId, pipeTaskOrderDO.getId());
+
+        BigDecimal chargeAmount = payInfo.getChargeAmount() != null ? payInfo.getChargeAmount() : BigDecimal.ZERO;
+        String chargeAmountStr = chargeAmount.toPlainString();
+        // 单 setSql 合并两个列更新,所有表达式只依赖旧列值,确保不依赖求值顺序
+        // 旧 pay_amount + chargeAmount >= serviceAmount → 已结算(1);否则 → 部分结算(2)
+        wrap.setSql("pay_amount = COALESCE(pay_amount, 0) + " + chargeAmountStr
+            + ", payment_status = CASE WHEN COALESCE(service_amount, 0) <= COALESCE(pay_amount, 0) + " + chargeAmountStr + " THEN 1 ELSE 2 END");
+
         String chargeTime = payInfo.getChargeTime();
         try {
             LocalDateTime localDateTime = DateUtils.parseDateTimeWithMultipleFormats(chargeTime);
-            updateOrder.setPayTime(localDateTime);
+            wrap.set(PipeTaskOrderDO::getPayTime, localDateTime);
         } catch (Exception e) {
             log.error("日期转换失败", e);
-            updateOrder.setPayTime(LocalDateTime.now());
-        }
-        try {
-            updateOrder.setPayAmount(payInfo.getChargeAmount());
-            if (payInfo.getChargeAmount() == null) {
-                updateOrder.setPayAmount(pipeTaskOrderDO.getActualAmount());
-            }
-
-        } catch (Exception e) {
-            log.error("payAmount 设置错误", e);
+            wrap.set(PipeTaskOrderDO::getPayTime, LocalDateTime.now());
         }
 
         if (payInfo.getFeeType() != null) {
             log.info("更新收费形式" + payInfo.getOrderNo());
-            updateOrder.setFeeType(payInfo.getFeeType());
+            wrap.set(PipeTaskOrderDO::getFeeType, payInfo.getFeeType());
         }
 
-        pipeTaskOrderMapper.updateById(updateOrder);
+        pipeTaskOrderMapper.update(wrap);
         //非合同收费并且不属于免征范围时结算回调后自动发放报告
         if (Integer.valueOf(100).equals(pipeTaskOrderDO.getFeeType()) && (Integer.valueOf(200).equals(pipeTaskOrderDO.getFeeNature()) || pipeTaskOrderDO.getFeeNature() == null)) {
             List<PipeTaskOrderItemDO> taskOrderItemDOList = pipeTaskOrderItemMapper.selectList(new LambdaQueryWrapperX<PipeTaskOrderItemDO>().

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

@@ -287,7 +287,7 @@ public class PipeTaskOrderItemReportServiceImpl extends ServiceImpl<PipeTaskOrde
                     PipeTaskOrderItemReportRecordDO pipeTaskOrderItemReportRecordDO = new PipeTaskOrderItemReportRecordDO();
                     pipeTaskOrderItemReportRecordDO.setReportId(pipeTaskOrderItemReportDO.getId());
                     pipeTaskOrderItemReportRecordDO.setProcess(
-                            "审批人".equals(comment.getNodeName()) ? 700 : 600);
+                            comment.getNodeName() != null && comment.getNodeName().contains("审核") ? 700 : 600);
                     pipeTaskOrderItemReportRecordDO.setRemark(comment.getComment());
                     pipeTaskOrderItemReportRecordDO.setCreateTime(comment.getCreateDate());
                     String userName = comment.getUserName();
@@ -309,14 +309,14 @@ public class PipeTaskOrderItemReportServiceImpl extends ServiceImpl<PipeTaskOrde
                 }).toList();
         pipeTaskOrderItemReportRecordMapper.insertBatch(newComments);
 
-        // 根据NODE_NAME实时更新报告的审核人/审批人信息
-        // 找最新的"审核人"节点的【同意】或【已阅】评论
+        // 根据NODE_NAME实时更新报告的审核人/审批人信息
+        // 找最新的"审核人"节点的【同意】或【已阅】评论
         comments.stream()
                 .filter(comment -> latestRecord == null || comment.getCreateDate().isAfter(latestRecord.getCreateTime()))
                 .filter(c -> c.getComment() != null
                         && (c.getComment().contains("【同意】") || c.getComment().contains("【已阅】"))
                         && !"common.toolbar.stepBack.label".equals(c.getExtAtt3())
-                        && "审核人".equals(c.getNodeName()))
+                        && c.getNodeName() != null && c.getNodeName().contains("审核"))
                 .max(Comparator.comparing(ExternalOACommentInfoRes::getCreateDate))
                 .ifPresent(approval -> {
                     List<AdminUserRespDTO> userList = adminUserApi.getUserListByNickname(approval.getUserName()).getCheckedData();
@@ -328,13 +328,13 @@ public class PipeTaskOrderItemReportServiceImpl extends ServiceImpl<PipeTaskOrde
                     }
                 });
 
-        // 找最新的"审批人"节点的【同意】或【已阅】评论
+        // 找最新的"审批人"节点的【同意】或【已阅】评论
         comments.stream()
                 .filter(comment -> latestRecord == null || comment.getCreateDate().isAfter(latestRecord.getCreateTime()))
                 .filter(c -> c.getComment() != null
                         && (c.getComment().contains("【同意】") || c.getComment().contains("【已阅】"))
                         && !"common.toolbar.stepBack.label".equals(c.getExtAtt3())
-                        && "审批人".equals(c.getNodeName()))
+                        && c.getNodeName() != null && c.getNodeName().contains("审批"))
                 .max(Comparator.comparing(ExternalOACommentInfoRes::getCreateDate))
                 .ifPresent(ratify -> {
                     List<AdminUserRespDTO> userList = adminUserApi.getUserListByNickname(ratify.getUserName()).getCheckedData();
@@ -476,7 +476,7 @@ public class PipeTaskOrderItemReportServiceImpl extends ServiceImpl<PipeTaskOrde
      * @param comments                  OA 流程评论列表
      */
     public void updateReportStatus(PipeTaskOrderItemReportDO pipeTaskOrderItemReportDO, List<ExternalOACommentInfoRes> comments) {
-        // 根据NODE_NAME区分审核人和审批人
+        // 根据NODE_NAME区分审核人和审批人
         String approvalId = null;
         String approvalName = null;
         LocalDateTime approvalTime = null;
@@ -485,21 +485,21 @@ public class PipeTaskOrderItemReportServiceImpl extends ServiceImpl<PipeTaskOrde
         LocalDateTime ratifyTime = null;
 
         if (comments != null && !comments.isEmpty()) {
-            // NODE_NAME="审核人" → approval(审核人)
+            // NODE_NAME="审核人" → approval(审核人
             ExternalOACommentInfoRes approval = comments.stream()
                     .filter(c -> c.getComment() != null
                             && (c.getComment().contains("【同意】") || c.getComment().contains("【已阅】"))
                             && !"common.toolbar.stepBack.label".equals(c.getExtAtt3())
-                            && "审核人".equals(c.getNodeName()))
+                            && c.getNodeName() != null && c.getNodeName().contains("审核"))
                     .max(Comparator.comparing(ExternalOACommentInfoRes::getCreateDate))
                     .orElse(null);
 
-            // NODE_NAME="审批人" → ratify(审批人)
+            // NODE_NAME="审批人" → ratify(审批人
             ExternalOACommentInfoRes ratify = comments.stream()
                     .filter(c -> c.getComment() != null
                             && (c.getComment().contains("【同意】") || c.getComment().contains("【已阅】"))
                             && !"common.toolbar.stepBack.label".equals(c.getExtAtt3())
-                            && "审批人".equals(c.getNodeName()))
+                            && c.getNodeName() != null && c.getNodeName().contains("审批"))
                     .max(Comparator.comparing(ExternalOACommentInfoRes::getCreateDate))
                     .orElse(null);
 
@@ -557,7 +557,7 @@ public class PipeTaskOrderItemReportServiceImpl extends ServiceImpl<PipeTaskOrde
                 }
             }
 
-            // 调用重载方法,传入从OA评论中提取的审核人和审批人信息
+            // 调用重载方法,传入从OA评论中提取的审核人和审批人信息
             updateOrderItemRatifyFinish(pipeTaskOrderItemReportDO.getId(), approvalId, approvalName, approvalTime, ratifyId, ratifyName, ratifyTime);
         }
     }
@@ -638,7 +638,7 @@ public class PipeTaskOrderItemReportServiceImpl extends ServiceImpl<PipeTaskOrde
     }
 
     /**
-     * 办结报告(轮询调用,从OA评论中获取审核人和审批人)
+     * 办结报告(轮询调用,从OA评论中获取审核人和审批人
      */
     public void updateOrderItemRatifyFinish(String id, String approvalId, String approvalName, LocalDateTime approvalTime,
                                             String ratifyId, String ratifyName, LocalDateTime ratifyTime) {
@@ -651,13 +651,13 @@ public class PipeTaskOrderItemReportServiceImpl extends ServiceImpl<PipeTaskOrde
         updateObj.setTaskStatus(TaskOrderStatusEnum.REPORT_FINISH.getStatus());
         updateObj.setReturnReason("");
 
-        // 设置审核人信息
+        // 设置审核人信息
         if (approvalId != null) {
             updateObj.setApprovalId(approvalId);
             updateObj.setApprovalName(approvalName);
             updateObj.setApprovalTime(approvalTime != null ? approvalTime : LocalDateTime.now());
         }
-        // 设置审批人信息
+        // 设置审批人信息
         if (ratifyId != null) {
             updateObj.setRatifyId(ratifyId);
             updateObj.setRatifyName(ratifyName);
@@ -851,7 +851,7 @@ public class PipeTaskOrderItemReportServiceImpl extends ServiceImpl<PipeTaskOrde
 
             }
 
-            //当主报告完成审批后更新所有子报告的审批人
+            //当主报告完成审批后更新所有子报告的审批人
             LambdaUpdateWrapper<PipeTaskOrderItemReportDO> updateBySubReport = new LambdaUpdateWrapper<>();
             updateBySubReport.eq(PipeTaskOrderItemReportDO::getOrderItemId, taskOrderItemReportDO.getOrderItemId());
             updateBySubReport.eq(PipeTaskOrderItemReportDO::getReportType, TaskOrderItemReportTypeEnum.SUB_REPORT.getType());

+ 60 - 4
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pushtaskorder/PushTaskOrderServiceImpl.java

@@ -81,6 +81,7 @@ import cn.start.tz.module.pressure2.dal.dataobject.equipboilerscheduling.EquipBo
 import cn.start.tz.module.pressure2.dal.dataobject.equipboilerschedulingitem.EquipBoilerSchedulingCheckDO;
 import cn.start.tz.module.pressure2.dal.dataobject.inspectionnature.InspectionNatureTemplateDO;
 import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorder.PipeTaskOrderDO;
+import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderitem.PipeTaskOrderItemDO;
 import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderuser.PipeTaskOrderUserDO;
 import cn.start.tz.module.pressure2.dal.dataobject.reporttemplate.ReportTemplateDO;
 import cn.start.tz.module.pressure2.dal.mysql.acceptorder.AcceptOrderMapper;
@@ -112,6 +113,8 @@ import cn.start.tz.module.pressure2.dal.mysql.equipboiler.EquipBoilerMapper;
 import cn.start.tz.module.pressure2.dal.mysql.equipboilercheckhistory.EquipBoilerCheckHistoryMapper;
 import cn.start.tz.module.pressure2.dal.mysql.equipboilerscheduling.EquipBoilerSchedulingRecordMapper;
 import cn.start.tz.module.pressure2.dal.mysql.equipboilerschedulingitem.EquipBoilerSchedulingCheckMapper;
+import cn.start.tz.module.pressure2.dal.mysql.pipetaskorderinput.PipeTaskOrderInputMapper;
+import cn.start.tz.module.pressure2.dal.mysql.pipetaskorderitem.PipeTaskOrderItemMapper;
 import cn.start.tz.module.pressure2.dal.mysql.pipetaskorderuser.PipeTaskOrderUserMapper;
 import cn.start.tz.module.pressure2.dal.mysql.reporttemplate.ReportTemplateMapper;
 import cn.start.tz.module.pressure2.enums.AcceptOrderStatusEnum;
@@ -228,6 +231,11 @@ public class PushTaskOrderServiceImpl implements PushTaskOrderService {
     @Resource
     private DeptApi deptApi;
 
+    @Resource
+    private BoilerTaskOrderItemMapper boilerTaskOrderItemMapper;
+
+    @Resource
+    private PipeTaskOrderItemMapper pipeTaskOrderItemMapper;
 
     @Resource
     private AppointmentConfirmOrderMapper appointmentConfirmOrderMapper;
@@ -262,11 +270,35 @@ public class PushTaskOrderServiceImpl implements PushTaskOrderService {
         reqDTO.setOrderFlag("1");// 服务单
         reqDTO.setChangeStatus("0");
         // reqDTO.setReportFinishFlag("2");
-
-        if (taskOrderDO.getTaskStatus() != null && taskOrderDO.getTaskStatus() == cn.start.tz.module.pressure.enums.TaskOrderStatusEnum.REPORT_FINISH.getStatus().intValue()) {
+        if (taskOrderDO.getTaskStatus() != null && taskOrderDO.getTaskStatus() == TaskOrderStatusEnum.REPORT_FINISH.getStatus().intValue()) {
             reqDTO.setReportFinishFlag("2");
+            // 全部未发放
+            reqDTO.setReportFlag("0");
+
+            // 统计发放数量
+            List<BoilerTaskOrderItemDO> taskOrderItemDOS = boilerTaskOrderItemMapper.selectList(BoilerTaskOrderItemDO::getOrderId, taskOrderDO.getId());
+            if (CollUtil.isNotEmpty(taskOrderItemDOS)) {
+                int itemSize = taskOrderItemDOS.size();
+                Integer i = 1;
+                int pushPlatform = taskOrderItemDOS.stream().filter(item -> i.equals(item.getIsPushPlatform())).toList().size();
+
+                log.info("taskOrder {} ,itemSize {} , pushPlatform {}", taskOrderDO.getOrderNo(), itemSize, pushPlatform);
+                if (itemSize == pushPlatform) {
+                    // 全部发放
+                    log.info("taskOrder 全部发放 {}", taskOrderDO.getOrderNo());
+                    reqDTO.setReportFlag("2");
+                } else if (pushPlatform > 0) {
+                    // 部分发放
+                    reqDTO.setReportFlag("1");
+                    log.info("taskOrder 部分发放 {}", taskOrderDO.getOrderNo());
+                }
+            }
         }
 
+//        if (taskOrderDO.getTaskStatus() != null && taskOrderDO.getTaskStatus() == cn.start.tz.module.pressure.enums.TaskOrderStatusEnum.REPORT_FINISH.getStatus().intValue()) {
+//            reqDTO.setReportFinishFlag("2");
+//        }
+
         if (taskOrderDO.getTaskStatus() != null && taskOrderDO.getTaskStatus() == TaskOrderStatusEnum.CANCEL.getStatus().intValue()) {
             // 任务单状态,0 正常 1被替换 2作废
             reqDTO.setChangeStatus("2");
@@ -423,11 +455,35 @@ public class PushTaskOrderServiceImpl implements PushTaskOrderService {
         reqDTO.setOrderFlag("1");// 服务单
         reqDTO.setChangeStatus("0");
         // reqDTO.setReportFinishFlag("2");
-
-        if (taskOrderDO.getTaskStatus() != null && taskOrderDO.getTaskStatus() == cn.start.tz.module.pressure.enums.TaskOrderStatusEnum.REPORT_FINISH.getStatus().intValue()) {
+        if (taskOrderDO.getTaskStatus() != null && taskOrderDO.getTaskStatus() == TaskOrderStatusEnum.REPORT_FINISH.getStatus().intValue()) {
             reqDTO.setReportFinishFlag("2");
+            // 全部未发放
+            reqDTO.setReportFlag("0");
+
+            // 统计发放数量
+            List<PipeTaskOrderItemDO> taskOrderItemDOS = pipeTaskOrderItemMapper.selectList(PipeTaskOrderItemDO::getOrderId, taskOrderDO.getId());
+            if (CollUtil.isNotEmpty(taskOrderItemDOS)) {
+                int itemSize = taskOrderItemDOS.size();
+                Integer i = 1;
+                int pushPlatform = taskOrderItemDOS.stream().filter(item -> i.equals(item.getIsPushPlatform())).toList().size();
+
+                log.info("taskOrder {} ,itemSize {} , pushPlatform {}", taskOrderDO.getOrderNo(), itemSize, pushPlatform);
+                if (itemSize == pushPlatform) {
+                    // 全部发放
+                    log.info("taskOrder 全部发放 {}", taskOrderDO.getOrderNo());
+                    reqDTO.setReportFlag("2");
+                } else if (pushPlatform > 0) {
+                    // 部分发放
+                    reqDTO.setReportFlag("1");
+                    log.info("taskOrder 部分发放 {}", taskOrderDO.getOrderNo());
+                }
+            }
         }
 
+//        if (taskOrderDO.getTaskStatus() != null && taskOrderDO.getTaskStatus() == cn.start.tz.module.pressure.enums.TaskOrderStatusEnum.REPORT_FINISH.getStatus().intValue()) {
+//            reqDTO.setReportFinishFlag("2");
+//        }
+
         if (taskOrderDO.getTaskStatus() != null && taskOrderDO.getTaskStatus() == TaskOrderStatusEnum.CANCEL.getStatus().intValue()) {
             // 任务单状态,0 正常 1被替换 2作废
             reqDTO.setChangeStatus("2");

+ 20 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/synchronization/SynchronizationService.java

@@ -23,4 +23,24 @@ public interface SynchronizationService {
      * 上传报告
      */
     boolean uploadReport(ReportDto reportDto);
+
+    /**
+     * 同步锅炉检验任务
+     */
+    void checkTaskBoiler(String updateDate);
+
+    /**
+     * 同步管道检验任务
+     */
+    void checkTaskPipe(String updateDate);
+
+    /**
+     * 同步锅炉任务设备
+     */
+    void taskEquipmentBoiler(String updateDate);
+
+    /**
+     * 同步管道任务设备
+     */
+    void taskEquipmentPipe(String updateDate);
 }

+ 221 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/synchronization/SynchronizationServiceImpl.java

@@ -252,6 +252,227 @@ public class SynchronizationServiceImpl implements SynchronizationService {
         return false;
     }
 
+    /**
+     * 同步锅炉检验任务数据
+     *
+     * @param updateDate 更新时间,只同步此时间之后的数据
+     */
+    @Override
+    public void checkTaskBoiler(String updateDate) {
+        log.info("同步锅炉检验任务定时任务执行中...");
+        
+        Map<String, Object> form = new HashMap<>();
+        form.put("pageNum", 0);
+        form.put("pageSize", DEFAULT_PAGE_SIZE);
+        if (updateDate != null) {
+            form.put("UPDATEDATE_gt", updateDate);
+        }
+        // 添加锅炉类型过滤条件
+        form.put("CHECK_TASK_TYPE", "锅炉");
+        
+        String checkTaskData = getRequest("chcektask", form);
+        ResponseDto checkTaskResponseDto = JSONObject.parseObject(checkTaskData, ResponseDto.class);
+        log.info("同步数据中台返回锅炉检验任务数据:{}", checkTaskResponseDto);
+        
+        if (checkTaskResponseDto.getTotal() > 0 && !checkTaskResponseDto.getData().isEmpty()) {
+            List<CheckTaskDto> list = checkTaskResponseDto.getData().stream()
+                    .map(data -> ((JSONObject) data).toJavaObject(CheckTaskDto.class))
+                    .toList();
+            
+            log.info("同步锅炉检验任务数据共{}条", list.size());
+            
+            // 这里可以根据业务需求进行处理,例如:
+            // 1. 保存到本地数据库
+            // 2. 更新相关状态
+            // 3. 触发后续业务流程
+            
+            for (CheckTaskDto checkTaskDto : list) {
+                try {
+                    // 处理单个检验任务
+                    processCheckTask(checkTaskDto, "BOILER");
+                } catch (Exception e) {
+                    log.error("处理锅炉检验任务失败,任务号:{}", checkTaskDto.getTaskNo(), e);
+                }
+            }
+        }
+    }
+
+    /**
+     * 同步管道检验任务数据
+     *
+     * @param updateDate 更新时间,只同步此时间之后的数据
+     */
+    @Override
+    public void checkTaskPipe(String updateDate) {
+        log.info("同步管道检验任务定时任务执行中...");
+        
+        Map<String, Object> form = new HashMap<>();
+        form.put("pageNum", 0);
+        form.put("pageSize", DEFAULT_PAGE_SIZE);
+        if (updateDate != null) {
+            form.put("UPDATEDATE_gt", updateDate);
+        }
+        // 添加管道类型过滤条件
+        form.put("CHECK_TASK_TYPE", "管道");
+        
+        String checkTaskData = getRequest("chcektask", form);
+        ResponseDto checkTaskResponseDto = JSONObject.parseObject(checkTaskData, ResponseDto.class);
+        log.info("同步数据中台返回管道检验任务数据:{}", checkTaskResponseDto);
+        
+        if (checkTaskResponseDto.getTotal() > 0 && !checkTaskResponseDto.getData().isEmpty()) {
+            List<CheckTaskDto> list = checkTaskResponseDto.getData().stream()
+                    .map(data -> ((JSONObject) data).toJavaObject(CheckTaskDto.class))
+                    .toList();
+            
+            log.info("同步管道检验任务数据共{}条", list.size());
+            
+            // 这里可以根据业务需求进行处理,例如:
+            // 1. 保存到本地数据库
+            // 2. 更新相关状态
+            // 3. 触发后续业务流程
+            
+            for (CheckTaskDto checkTaskDto : list) {
+                try {
+                    // 处理单个检验任务
+                    processCheckTask(checkTaskDto, "PIPE");
+                } catch (Exception e) {
+                    log.error("处理管道检验任务失败,任务号:{}", checkTaskDto.getTaskNo(), e);
+                }
+            }
+        }
+    }
+
+    /**
+     * 处理单个检验任务
+     *
+     * @param checkTaskDto 检验任务DTO
+     * @param taskType     任务类型(BOILER/PIPE)
+     */
+    private void processCheckTask(CheckTaskDto checkTaskDto, String taskType) {
+        log.info("处理{}检验任务,任务号:{}", taskType, checkTaskDto.getTaskNo());
+        
+        // 这里可以实现具体的业务逻辑,例如:
+        // 1. 根据任务号查询本地是否存在该任务
+        // 2. 如果存在则更新,不存在则新增
+        // 3. 关联相关的设备信息
+        // 4. 更新单位信息等
+        
+        // 示例:记录日志
+        log.info("检验任务详情 - 任务号:{}, 单位:{}, 联系人:{}, 检验日期:{}",
+                checkTaskDto.getTaskNo(),
+                checkTaskDto.getUnitName(),
+                checkTaskDto.getLinkMan(),
+                checkTaskDto.getCheckDate());
+    }
+
+    /**
+     * 同步锅炉任务设备数据
+     *
+     * @param updateDate 更新时间,只同步此时间之后的数据
+     */
+    @Override
+    public void taskEquipmentBoiler(String updateDate) {
+        log.info("同步锅炉任务设备定时任务执行中...");
+        
+        Map<String, Object> form = new HashMap<>();
+        form.put("pageNum", 0);
+        form.put("pageSize", DEFAULT_PAGE_SIZE);
+        if (updateDate != null) {
+            form.put("UPDATEDATE_gt", updateDate);
+        }
+        // 添加设备类型过滤条件 - 锅炉
+        form.put("EQUIPMENT_TYPE", "锅炉");
+        
+        String taskEquipmentData = getRequest("task_equipment", form);
+        ResponseDto taskEquipmentResponseDto = JSONObject.parseObject(taskEquipmentData, ResponseDto.class);
+        log.info("同步数据中台返回锅炉任务设备数据:{}", taskEquipmentResponseDto);
+        
+        if (taskEquipmentResponseDto.getTotal() > 0 && !taskEquipmentResponseDto.getData().isEmpty()) {
+            List<TaskEquipmentDto> list = taskEquipmentResponseDto.getData().stream()
+                    .map(data -> ((JSONObject) data).toJavaObject(TaskEquipmentDto.class))
+                    .toList();
+            
+            log.info("同步锅炉任务设备数据共{}条", list.size());
+            
+            for (TaskEquipmentDto taskEquipmentDto : list) {
+                try {
+                    // 处理单个任务设备
+                    processTaskEquipment(taskEquipmentDto, "BOILER");
+                } catch (Exception e) {
+                    log.error("处理锅炉任务设备失败,任务号:{},设备注册号:{}", 
+                            taskEquipmentDto.getTaskNo(), taskEquipmentDto.getRegisterNo(), e);
+                }
+            }
+        }
+    }
+
+    /**
+     * 同步管道任务设备数据
+     *
+     * @param updateDate 更新时间,只同步此时间之后的数据
+     */
+    @Override
+    public void taskEquipmentPipe(String updateDate) {
+        log.info("同步管道任务设备定时任务执行中...");
+        
+        Map<String, Object> form = new HashMap<>();
+        form.put("pageNum", 0);
+        form.put("pageSize", DEFAULT_PAGE_SIZE);
+        if (updateDate != null) {
+            form.put("UPDATEDATE_gt", updateDate);
+        }
+        // 添加设备类型过滤条件 - 管道
+        form.put("EQUIPMENT_TYPE", "管道");
+        
+        String taskEquipmentData = getRequest("task_equipment", form);
+        ResponseDto taskEquipmentResponseDto = JSONObject.parseObject(taskEquipmentData, ResponseDto.class);
+        log.info("同步数据中台返回管道任务设备数据:{}", taskEquipmentResponseDto);
+        
+        if (taskEquipmentResponseDto.getTotal() > 0 && !taskEquipmentResponseDto.getData().isEmpty()) {
+            List<TaskEquipmentDto> list = taskEquipmentResponseDto.getData().stream()
+                    .map(data -> ((JSONObject) data).toJavaObject(TaskEquipmentDto.class))
+                    .toList();
+            
+            log.info("同步管道任务设备数据共{}条", list.size());
+            
+            for (TaskEquipmentDto taskEquipmentDto : list) {
+                try {
+                    // 处理单个任务设备
+                    processTaskEquipment(taskEquipmentDto, "PIPE");
+                } catch (Exception e) {
+                    log.error("处理管道任务设备失败,任务号:{},设备注册号:{}", 
+                            taskEquipmentDto.getTaskNo(), taskEquipmentDto.getRegisterNo(), e);
+                }
+            }
+        }
+    }
+
+    /**
+     * 处理单个任务设备
+     *
+     * @param taskEquipmentDto 任务设备DTO
+     * @param equipmentType    设备类型(BOILER/PIPE)
+     */
+    private void processTaskEquipment(TaskEquipmentDto taskEquipmentDto, String equipmentType) {
+        log.info("处理{}任务设备,任务号:{},设备注册号:{}", 
+                equipmentType, taskEquipmentDto.getTaskNo(), taskEquipmentDto.getRegisterNo());
+        
+        // 这里可以实现具体的业务逻辑,例如:
+        // 1. 根据任务号和设备注册号查询本地是否存在该任务设备
+        // 2. 如果存在则更新,不存在则新增
+        // 3. 关联相关的检验任务信息
+        // 4. 更新费用信息、检验项目等
+        
+        // 示例:记录日志
+        log.info("任务设备详情 - 任务号:{}, 设备注册号:{}, 主检员:{}, 法定费用:{}, 服务费用:{}, 检验项目:{}",
+                taskEquipmentDto.getTaskNo(),
+                taskEquipmentDto.getRegisterNo(),
+                taskEquipmentDto.getMasterChecker(),
+                taskEquipmentDto.getLegalTotalFee(),
+                taskEquipmentDto.getServiceTotalFee(),
+                taskEquipmentDto.getCheckItem());
+    }
+
 
     /**
      * 发起get请求到数据中台

+ 97 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/synchronization/dto/CheckTaskDto.java

@@ -0,0 +1,97 @@
+package cn.start.tz.module.pressure2.service.synchronization.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 检验任务DTO - 对应数据中台的chcektask表
+ */
+@Data
+public class CheckTaskDto {
+    private Long id;
+    private String taskNo;
+    private Long apprizeId;
+    private String apprizeNo;
+    private String contractNo;
+    private String superviseNo;
+    private String unitCode;
+    private String unitName;
+    private String linkMan;
+    private String linkBranch;
+    private String tel;
+    private String mobile;
+    private String address;
+    private String zipCode;
+    private String hasUseNo;
+    private String withoutUseNo;
+    private String security; // 0否 1是
+    private String traffic;
+    private String checkDate;
+    private String feeType;
+    private String acceptType;
+    private String sendType;
+    private String checkType;
+    private String others;
+    private String remark;
+    private String isWaterOil; // 0不是 1是
+    private String woChecker;
+    private String userId;
+    private String inputDate;
+    private String masterChecker;
+    private String checker;
+    private String status;
+    private String assessor;
+    private String auditingDate;
+    private String confirm;
+    private String affirmant;
+    private String confirmDate;
+    private String chargeNo;
+    private String isBalance;
+    private BigDecimal legalFee;
+    private BigDecimal serviceFee;
+    private String cancelUser;
+    private String cancelDate;
+    private String cancelReason;
+    private Integer safetyNums;
+    private String getDate;
+    private String reAuditingFlag;
+    private String reAssessor;
+    private String reAuditingDate;
+    private String isAdjust;
+    private String isTag;
+    private String isCheckMobileNow;
+    private String printStatus;
+    private String printDate;
+    private String sendNo;
+    private String isOver20Years;
+    private String isUpload;
+    private String isCurrentInstall;
+    private String installType;
+    private String isLiquidPressure;
+    private String isSubsidyStatistics;
+    private String planId;
+    private String checkTaskType;
+    private String eqRegisterNo;
+    private String safeReceive;
+    private String safeAppearanceCheck;
+    private String safeCheckOut;
+    private String safeSeal;
+    private String safeProofread;
+    private BigDecimal receivableFee;
+    private BigDecimal deratePercent;
+    private String azxkzbh;
+    private String checkDate2;
+    private String aqfsjfs;
+    private String azdw;
+    private String agent;
+    private String unitNameBill;
+    private String flag;
+    private String isLegalFree;
+    private BigDecimal legalFree;
+    private String feeNature;
+    private String apprVolNo;
+    private String orgName;
+    private String changeStatus;
+    private String oldTaskNo;
+}

+ 42 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/synchronization/dto/TaskEquipmentDto.java

@@ -0,0 +1,42 @@
+package cn.start.tz.module.pressure2.service.synchronization.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 任务设备DTO - 对应数据中台的task_equipment表
+ */
+@Data
+public class TaskEquipmentDto {
+    private Long id;
+    private String taskNo;
+    private String recordNo;
+    private String registerNo;
+    private String equipmentType;
+    private String tableName;
+    private String masterChecker;
+    private String typeCode;
+    private String itemCodes;
+    private String checkItem;
+    private BigDecimal legalTotalFee;
+    private BigDecimal serviceTotalFee;
+    private String isPlan;
+    private String isUpload;
+    private String hasPressure;
+    private String isClient;
+    private String pressureUser;
+    private String itemNames;
+    private String feeItem;
+    private String aheadFeeItem;
+    private String deviceId;
+    private String isExchange;
+    private String isWaterSubmit;
+    private String checkResultFee;
+    private String isCheck;
+    private String waterPressChecker;
+    private String waterPressDate;
+    private String resultAndFee;
+    private String apprizeInfoId;
+    private String relevantDept;
+}

+ 19 - 14
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/taskordernontaxrecord/TaskOrderNonTaxRecordServiceImpl.java

@@ -385,7 +385,7 @@ public class TaskOrderNonTaxRecordServiceImpl extends ServiceImpl<TaskOrderNonTa
 
             // 作废调用
             IncomepaymentData cancelData = new IncomepaymentData();
-            if (env.equals(EnvConstants.ENV_PROD)) {
+            if (env.equals(EnvConstants.ENV_PROD) || env.equals(EnvConstants.ENV_UAT)) {
                 TaskOrderNonTaxRecordDO taxRecordDO = taskOrderNonTaxRecordMapper.selectById(id);
                 cancelData.setIncomepaymentData(taxRecordDO.getPaymentInstructionNo());
                 cancelData.setReceivingUnitCode(taxRecordDO.getClientUnitCode());
@@ -469,16 +469,6 @@ public class TaskOrderNonTaxRecordServiceImpl extends ServiceImpl<TaskOrderNonTa
         if (status == BpmTaskStatusEnum.APPROVE.getStatus().intValue()) {
             String payNoticeNo = financialSystemService.getPayNoticeNo();
             updateObj.setPaymentInstructionNo(payNoticeNo);
-            try {
-                //生成缴费通知书
-                ByteArrayOutputStream outputStream = this.getRecordOutputStream(id);
-                if (outputStream != null){
-                    String attachmentPath = fileApi.createFile(outputStream.toByteArray());
-                    updateObj.setNoticePdfUrl(attachmentPath);
-                }
-            } catch (Exception e) {
-                log.error("e:{}", e.getMessage());
-            }
         }
         taskOrderNonTaxRecordMapper.updateById(updateObj);
 
@@ -554,7 +544,7 @@ public class TaskOrderNonTaxRecordServiceImpl extends ServiceImpl<TaskOrderNonTa
 
         TaskOrderNonTaxRecordDO taxRecordDO = taskOrderNonTaxRecordMapper.selectById(id);
 
-        if (env.equals(EnvConstants.ENV_PROD)) {
+        if (EnvConstants.ENV_UAT.equals(env) || EnvConstants.ENV_PROD.equals(env)) {
             IncomepaymentData data = new IncomepaymentData();
             data.setIncomepaymentData(updateObj.getPaymentInstructionNo());
             data.setAmountMoney(taxRecordDO.getActualAmount().doubleValue());
@@ -579,6 +569,19 @@ public class TaskOrderNonTaxRecordServiceImpl extends ServiceImpl<TaskOrderNonTa
             taskOrderNonTaxRecordMapper.updateById(updateObj);
         }
 
+        try {
+            //生成缴费通知书
+            ByteArrayOutputStream outputStream = this.getRecordOutputStream(id);
+            if (outputStream != null){
+                String attachmentPath = fileApi.createFile(outputStream.toByteArray());
+                updateObj.setId(id);
+                updateObj.setNoticePdfUrl(attachmentPath);
+                taskOrderNonTaxRecordMapper.updateById(updateObj);
+            }
+        } catch (Exception e) {
+            log.error("e:{} 生成缴费通知书失败!", e.getMessage());
+        }
+
         return true;
     }
 
@@ -589,8 +592,10 @@ public class TaskOrderNonTaxRecordServiceImpl extends ServiceImpl<TaskOrderNonTa
         if (taskOrderNonTaxRecordDO == null) {
             throw new ServiceException(902, "未找到记录");
         }
-        if (EnvConstants.ENV_PROD.equals(env)) {
-            qrcode = taskOrderNonTaxRecordDO.getPaymentInstruction();
+        if (EnvConstants.ENV_PROD.equals(env) || EnvConstants.ENV_UAT.equals(env)) {
+            if (taskOrderNonTaxRecordDO.getPaymentInstruction() != null){
+                qrcode = taskOrderNonTaxRecordDO.getPaymentInstruction();
+            }
         }
 
         return qrcode;

+ 33 - 3
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/tasksign/TaskSignServiceImpl.java

@@ -54,6 +54,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.awt.Graphics2D;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -429,10 +430,39 @@ public class TaskSignServiceImpl implements TaskSignService {
     
         try (PDDocument document = PDDocument.load(new ByteArrayInputStream(pdfBytes))) {
             PDFRenderer pdfRenderer = new PDFRenderer(document);
-            BufferedImage image = pdfRenderer.renderImageWithDPI(0, 150);
+            int pageCount = document.getNumberOfPages();
+
+            if (pageCount == 1) {
+                // 单页直接渲染
+                BufferedImage image = pdfRenderer.renderImageWithDPI(0, 150);
+                ByteArrayOutputStream bos = new ByteArrayOutputStream();
+                ImageIO.write(image, "png", bos);
+                return bos;
+            }
+
+            // 多页PDF:逐页渲染并纵向拼接
+            List<BufferedImage> images = new ArrayList<>();
+            int totalHeight = 0;
+            int maxWidth = 0;
+            for (int i = 0; i < pageCount; i++) {
+                BufferedImage pageImage = pdfRenderer.renderImageWithDPI(i, 150);
+                images.add(pageImage);
+                totalHeight += pageImage.getHeight();
+                maxWidth = Math.max(maxWidth, pageImage.getWidth());
+            }
+
+            // 创建合并后的图像,将所有页纵向拼接
+            BufferedImage combined = new BufferedImage(maxWidth, totalHeight, BufferedImage.TYPE_INT_ARGB);
+            Graphics2D g2d = combined.createGraphics();
+            int currentY = 0;
+            for (BufferedImage img : images) {
+                g2d.drawImage(img, 0, currentY, null);
+                currentY += img.getHeight();
+            }
+            g2d.dispose();
+
             ByteArrayOutputStream bos = new ByteArrayOutputStream();
-            ImageIO.write(image, "png", bos);
-    
+            ImageIO.write(combined, "png", bos);
             return bos;
         } catch (IOException e) {
             log.error("PDF转图片失败,文件大小: {} bytes, 错误信息: {}", pdfBytes.length, e.getMessage(), e);

BIN
tz-module-pressure2/tz-module-pressure2-biz/src/main/resources/SFS.pfx


+ 3 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/resources/mapper/boilertaskorder/BoilerTaskOrderMapper.xml

@@ -211,10 +211,13 @@
         select DISTINCT tt.ID
         ,bto.ID as ORDER_ID
         ,bto.ORDER_NO
+        ,eb.ID AS EQUIP_ID
         ,eb.EQUIP_CODE
         ,eb.EQUIP_NAME
         ,eb.BOILER_MODEL
         ,eb.UNIT_NAME
+        ,eb.SAFERY
+        ,eb.SAFERYDH
         ,bto.CHECK_TYPE
         ,bto.DEPT_ID
         ,btoir.TASK_STATUS

+ 1 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/resources/mapper/pipetaskorder/PipeTaskOrderMapper.xml

@@ -168,6 +168,7 @@
             ,tt.MAIN_CHECKER
             ,tt.END_CHECK_DATE
             ,bto.CREATE_TIME
+            ,epp.ID AS EQUIP_ID
             -- 去重后聚合
             ,WM_CONCAT(epp.PROJECT_NO) as PROJECT_NO
             -- 设备任务

+ 13 - 5
tz-module-system/tz-module-system-biz/src/main/java/cn/start/tz/module/system/controller/admin/cas/CasController.java

@@ -92,16 +92,17 @@ public class CasController {
             // 1. 从 Session 中获取 CAS Assertion(由 CAS ValidationFilter 验证后存储)
             Assertion assertion = (Assertion) request.getSession().getAttribute("_const_cas_assertion_");
 
+            String username = "";
             if (assertion == null || assertion.getPrincipal() == null) {
-                log.error("[casCallback] CAS Assertion 为空,ticket 未通过验证");
+                log.error("[casCallback] CAS Assertion 为空,ticket 未通过验证" + assertion);
                 response.sendError(401, "CAS ticket验证失败,请检查CAS服务器配置和网络连接");
                 return;
+            }else{
+                // 2. 获取用户名
+                username = assertion.getPrincipal().getName();
+                log.info("[casCallback] CAS认证成功,用户名: {}", username);
             }
 
-            // 2. 获取用户名
-            String username = assertion.getPrincipal().getName();
-            log.info("[casCallback] CAS认证成功,用户名: {}", username);
-
             // 3. 查询本地用户
             AdminUserDO user = adminUserService.getUserByUsername(username);
             if (user == null) {
@@ -141,6 +142,12 @@ public class CasController {
 
             // 7. 重定向到前端页面,只携带一次性 code(不暴露 token)
             String frontUrl = casProperties.getFrontUrl();
+            if (frontUrl == null || frontUrl.isBlank()) {
+                log.error("[casCallback] CAS 前端回调地址未配置,请在配置文件中设置 cas.front-url");
+                response.sendError(500, "CAS 前端回调地址未配置,请联系管理员");
+                return;
+            }
+            
             String redirectUrl = UriComponentsBuilder.fromHttpUrl(frontUrl)
                     .queryParam("loginType", "cas")
                     .queryParam("code", code)
@@ -279,6 +286,7 @@ public class CasController {
      * 返回 code 后,30秒内调用:GET /admin-api/system/cas/mineInfo?code=返回的code
      */
     @GetMapping("/test-generate-code")
+    @PermitAll
     @Operation(summary = "【测试】模拟生成授权码,用于调试 mineInfo 接口")
     public CommonResult<String> testGenerateCode(@RequestParam("username") String username) {
         // 1. 查询本地用户

+ 2 - 2
tz-module-system/tz-module-system-biz/src/main/java/cn/start/tz/module/system/service/oauth2/OAuth2TokenServiceImpl.java

@@ -324,11 +324,11 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService {
     }
 
     private static String generateAccessToken() {
-        return IdUtil.fastSimpleUUID();
+        return "a." + IdUtil.fastSimpleUUID();
     }
 
     private static String generateRefreshToken() {
-        return IdUtil.fastSimpleUUID();
+        return "r." + IdUtil.fastSimpleUUID();
     }
 
 }

+ 21 - 3
tz-module-system/tz-module-system-biz/src/main/resources/application-hsd.yaml

@@ -8,12 +8,12 @@ spring:
       username: # Nacos 账号
       password: # Nacos 密码
       discovery: # 【配置中心】配置项
-        namespace: dev_xzc # 命名空间。这里使用 dev 开发环境
+        namespace: dev_xy # 命名空间。这里使用 dev 开发环境
         group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
         metadata:
           version: 1.0.0 # 服务实例的版本号,可用于灰度发布
       config: # 【注册中心】配置项
-        namespace: dev_xzc # 命名空间。这里使用 dev 开发环境
+        namespace: dev_xy # 命名空间。这里使用 dev 开发环境
         group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
 --- #################### 数据库相关配置 ####################
 spring:
@@ -183,4 +183,22 @@ feign:
     direct-grape-service: http://8.138.109.252:48010
 
 tjy:
-  fileHost: https://www.gzsei.com:6443/tjw/file
+  fileHost: https://www.gzsei.com:6443/tjw/file
+
+# 集成cas相关配置信息
+cas:
+  # 单点登录URL
+  server-url-prefix: https://auth.gzsei.work/prod-api/protocols/cas20
+  # CAS 过滤器拦截的 URL 路径模式(只拦截后台管理系统,不影响移动端/小程序等)
+  url-patterns: /admin-api/*
+  # 忽略的地址
+  ignore-url-list: /admin-api/system/auth/**,/admin-api/system/cas/**,/file/**,/tile/**,/actuator/**,/druid/**,/swagger-ui/**,/v3/api-docs/**,/webjars/**,/error
+  # 认证成功后回调地址
+  front-url: http://localhost:8086
+  #  front-url: http://192.168.19.165:40080
+  # cas客户端地址
+  client-host-url: http://localhost:8086
+  #  client-host-url: http://192.168.19.165:48080
+
+  # 应用秘钥
+  secret: Zk8qMjQwNDIwMjYwNzE0MzI2NTUZip

+ 17 - 1
tz-module-system/tz-module-system-biz/src/main/resources/application-uat.yaml

@@ -181,4 +181,20 @@ justauth:
 feign:
   client:
     #direct-grape-service: http://127.0.0.1:48010  # 本地测试
-    direct-grape-service: http://8.138.109.252:48010
+    direct-grape-service: http://8.138.109.252:48010
+
+# 集成cas相关配置信息
+cas:
+  # 单点登录URL
+  #server-url-prefix: https://auth.gzsei.work/prod-api/protocols/cas20
+  server-url-prefix: http://192.168.19.80/prod-api/protocols/cas20
+  # CAS 过滤器拦截的 URL 路径模式(只拦截后台管理系统,不影响移动端/小程序等)
+  url-patterns: /admin-api/*
+  # 忽略的地址
+  ignore-url-list: /admin-api/system/auth/**,/admin-api/system/cas/**,/file/**,/tile/**,/actuator/**,/druid/**,/swagger-ui/**,/v3/api-docs/**,/webjars/**,/error
+  # 认证成功后回调地址
+  #front-url: http://192.168.19.165:40081
+  front-url: https://cyjw.gzsei.work
+  # cas客户端地址
+  #client-host-url: http://192.168.19.165:40081
+  client-host-url: https://cyjw.gzsei.work