xuzhancheng пре 2 недеља
родитељ
комит
93bdbe5977

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

@@ -149,4 +149,7 @@ public class BoilerOrderItemReportVO {
      * 是否手动上传
      */
     private Boolean isManual;
+
+    @Schema(description = "OA系统流程ID")
+    private String summaryId;
 }

+ 10 - 1
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/externalOA/ExternalOAController.java

@@ -137,14 +137,23 @@ public class ExternalOAController {
     }
 
 
+    /**
+     * 撤销流程
+     *
+     * @param summaryId
+     * @return
+     */
     @PostMapping("/cancleflow/{summaryId}")
     public CommonResult<Boolean> cancleflow(@PathVariable String summaryId) {
         return externalOAService.cancleflow(summaryId);
     }
 
+    /**
+     * 退回流程(外部OA系统回调接口)
+     * 当OA系统退回流程时,调用此接口更新本地报告状态
+     */
     @GetMapping("/returnFlow")
     @PermitAll
-    @Parameter(name = "returnFlowVO", description = "流程id", required = true)
     public CommonResult<Boolean> returnFlow(ReturnFlowVO returnFlowVO) {
         return externalOAService.returnFlow(returnFlowVO);
     }

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

@@ -152,4 +152,7 @@ public class PipeOrderItemReportVO {
      * 是否手动上传
      */
     private Boolean isManual;
+
+    @Schema(description = "OA系统流程ID")
+    private String summaryId;
 }

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

@@ -334,7 +334,7 @@ public class BoilerTaskOrderItemReportServiceImpl extends ServiceImpl<BoilerTask
 
                                 } else if ("结束".equals(externalOAComment.getData().getState())) {
                                     // 修改报告状态
-                                    updateReportStatus(boilerTaskOrderItemReportDO);
+                                    updateReportStatus(boilerTaskOrderItemReportDO, externalOAComment);
                                 } else if ("退回".equals(externalOAComment.getData().getState())) {
                                     // 退回
 //                            boilerTaskOrderItemReportDO.setTaskStatus(TaskOrderStatusEnum.ENTER.getStatus());
@@ -402,34 +402,54 @@ public class BoilerTaskOrderItemReportServiceImpl extends ServiceImpl<BoilerTask
      *
      * @param boilerTaskOrderItemReportDO 报告
      */
-    public void updateReportStatus(BoilerTaskOrderItemReportDO boilerTaskOrderItemReportDO) {
-//        boilerTaskOrderItemReportDO.setTaskStatus(cn.start.tz.module.pressure2.enums.TaskOrderStatusEnum.REPORT_FINISH.getStatus());
-//        taskOrderItemReportMapper.updateById(boilerTaskOrderItemReportDO);
-//        boilerTaskOrderItemMapper.update(
-//                new LambdaUpdateWrapper<BoilerTaskOrderItemDO>()
-//                        .set(BoilerTaskOrderItemDO::getTaskStatus, cn.start.tz.module.pressure2.enums.TaskOrderStatusEnum.FINISH_CONFIRM.getStatus())
-//                        .eq(BoilerTaskOrderItemDO::getId, boilerTaskOrderItemReportDO.getOrderItemId())
-//        );
-//        // 如果全部设备已办结,则修改任务单状态为完成
-//        List<BoilerTaskOrderItemDO> boilerTaskOrderItemDOS = boilerTaskOrderItemMapper.selectList(
-//                new LambdaQueryWrapper<BoilerTaskOrderItemDO>()
-//                        .eq(BoilerTaskOrderItemDO::getOrderId, boilerTaskOrderItemReportDO.getOrderId())
-//        );
-//
-//        boolean allFinished = true;
-//        for (BoilerTaskOrderItemDO boilerTaskOrderItemDO : boilerTaskOrderItemDOS) {
-//            if (!Objects.equals(boilerTaskOrderItemDO.getTaskStatus(), cn.start.tz.module.pressure2.enums.TaskOrderStatusEnum.FINISH_CONFIRM.getStatus())) {
-//                allFinished = false;
-//                break;
-//            }
-//        }
-//
-//        if (allFinished) {
-//            BoilerTaskOrderDO boilerTaskOrderDO = boilerTaskOrderMapper.selectById(boilerTaskOrderItemReportDO.getOrderId());
-//            boilerTaskOrderDO.setTaskStatus(cn.start.tz.module.pressure2.enums.TaskOrderStatusEnum.FINISH_CONFIRM.getStatus());
-//            boilerTaskOrderMapper.updateById(boilerTaskOrderDO);
-//        }
-        updateOrderItemRatifyFinish(boilerTaskOrderItemReportDO.getId());
+    public void updateReportStatus(BoilerTaskOrderItemReportDO boilerTaskOrderItemReportDO,ExternalOACommentRes commentRes) {
+        // 从OA评论中提取审核人和审批人信息
+        List<ExternalOACommentInfoRes> comments = commentRes != null && commentRes.getData() != null
+                ? commentRes.getData().getComments() : null;
+        String approvalId = null;
+        String approvalName = null;
+        LocalDateTime approvalTime = null;
+        String ratifyId = null;
+        String ratifyName = null;
+        LocalDateTime ratifyTime = null;
+
+        if (comments != null && !comments.isEmpty()) {
+            // 拿到最近两个"同意"或"已阅"的评论
+            List<ExternalOACommentInfoRes> approvalComments = comments.stream()
+                    .filter(comment -> comment.getComment() != null &&
+                            (comment.getComment().contains("同意") || comment.getComment().contains("已阅")))
+                    .sorted(Comparator.comparing(ExternalOACommentInfoRes::getCreateDate).reversed())
+                    .limit(2)
+                    .toList();
+
+            // 最近一条评论对应审核人(approval)
+            ExternalOACommentInfoRes approval = !approvalComments.isEmpty() ? approvalComments.get(0) : null;
+            // 第二条评论对应审批人(ratify)
+            ExternalOACommentInfoRes ratify = approvalComments.size() > 1 ? approvalComments.get(1) : null;
+
+            if (approval != null) {
+                List<AdminUserRespDTO> userListByNickname = adminUserApi.getUserListByNickname(approval.getUserName()).getCheckedData();
+                if (!userListByNickname.isEmpty()) {
+                    AdminUserRespDTO approvalUser = userListByNickname.get(0);
+                    approvalId = approvalUser.getId();
+                    approvalName = approvalUser.getNickname();
+                    approvalTime = approval.getCreateDate();
+                }
+            }
+
+            if (ratify != null) {
+                List<AdminUserRespDTO> userListByNickname1 = adminUserApi.getUserListByNickname(ratify.getUserName()).getCheckedData();
+                if (!userListByNickname1.isEmpty()) {
+                    AdminUserRespDTO ratifyUser = userListByNickname1.get(0);
+                    ratifyId = ratifyUser.getId();
+                    ratifyName = ratifyUser.getNickname();
+                    ratifyTime = ratify.getCreateDate();
+                }
+            }
+        }
+
+        // 调用重载方法,传入从OA评论中提取的审核人和审批人信息
+        updateOrderItemRatifyFinish(boilerTaskOrderItemReportDO.getId(), approvalId, approvalName, approvalTime, ratifyId, ratifyName, ratifyTime);
     }
 
     public void orderItemRollback(String id, ExternalOARes externalOARes) {
@@ -506,33 +526,41 @@ public class BoilerTaskOrderItemReportServiceImpl extends ServiceImpl<BoilerTask
      * @param id 报告id
      */
     public void updateOrderItemRatifyFinish(String id) {
+        String userId = getLoginUserId();
+        AdminUserRespDTO userRespDTO = adminUserApi.getUser(userId).getData();
+        updateOrderItemRatifyFinish(id, userId, userRespDTO != null ? userRespDTO.getNickname() : null, LocalDateTime.now(), null, null, null);
+    }
+
+    /**
+     * 办结报告(轮询调用,从OA评论中获取审核人和审批人)
+     */
+    public void updateOrderItemRatifyFinish(String id, String approvalId, String approvalName, LocalDateTime approvalTime,
+                                            String ratifyId, String ratifyName, LocalDateTime ratifyTime) {
         BoilerTaskOrderItemReportDO taskOrderItemReportDO = taskOrderItemReportMapper.selectById(id);
         if (ObjectUtil.isEmpty(taskOrderItemReportDO)) {
             throw exception(new ErrorCode(1001, "任务单设备关联报告不存在"));
         }
-        String userId = getLoginUserId();
-        if (Boolean.FALSE.equals(taskOrderItemReportDO.getIsRatify())) {
-            if (!userId.equals(taskOrderItemReportDO.getRatifyId()) && !userId.equals(taskOrderItemReportDO.getApprovalId())) {
-                throw exception(new ErrorCode(1001, "当前账号无法执行此记录的【审批】操作。"));
-            }
-        } else {
-            if (!userId.equals(taskOrderItemReportDO.getRatifyId())) {
-                throw exception(new ErrorCode(1001, "当前账号无法执行此记录的【审批】操作。"));
-            }
-        }
-
-        AdminUserRespDTO userRespDTO = adminUserApi.getUser(userId).getData();
         BoilerTaskOrderItemReportDO updateObj = new BoilerTaskOrderItemReportDO();
         updateObj.setId(id);
-        if (userRespDTO != null) {
-            updateObj.setRatifyName(userRespDTO.getNickname());
-        }
         updateObj.setTaskStatus(TaskOrderStatusEnum.REPORT_FINISH.getStatus());
-        updateObj.setRatifyId(userId);
-        updateObj.setRatifyTime(LocalDateTime.now());
         updateObj.setReturnReason("");
 
-        if (taskOrderItemReportDO.getApprovalTime() == null) {
+        // 设置审核人信息
+        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);
+            updateObj.setRatifyTime(ratifyTime != null ? ratifyTime : LocalDateTime.now());
+        } else {
+            updateObj.setRatifyTime(LocalDateTime.now());
+        }
+
+        if (taskOrderItemReportDO.getApprovalTime() == null && updateObj.getApprovalTime() == null) {
             updateObj.setApprovalTime(updateObj.getRatifyTime());
         }
 
@@ -704,7 +732,7 @@ public class BoilerTaskOrderItemReportServiceImpl extends ServiceImpl<BoilerTask
                 CompletableFuture.runAsync(() -> {
                     // 任务单办结
                     boilerTaskOrderDO.setTaskStatus(TaskOrderStatusEnum.REPORT_FINISH.getStatus());
-                    pushTaskOrderService.pushFinanceSystem(boilerTaskOrderDO);
+//                    pushTaskOrderService.pushFinanceSystem(boilerTaskOrderDO);
                 });
 
                 //生成任务单下所有设备报告
@@ -721,7 +749,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());
-            updateBySubReport.set(BoilerTaskOrderItemReportDO::getRatifyId, userId);
+            updateBySubReport.set(BoilerTaskOrderItemReportDO::getRatifyId, ratifyId);
             updateBySubReport.set(BoilerTaskOrderItemReportDO::getRatifyName, updateObj.getRatifyName());
             updateBySubReport.set(BoilerTaskOrderItemReportDO::getRatifyTime, updateObj.getRatifyTime());
             taskOrderItemReportMapper.update(updateBySubReport);

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

@@ -10,9 +10,16 @@ import cn.start.tz.module.grape.city.api.GrapeCityApi;
 import cn.start.tz.module.grape.city.api.vo.GrapeCityReqDTO;
 import cn.start.tz.module.infra.api.file.FileApi;
 import cn.start.tz.module.pressure2.controller.admin.externalOA.vo.ReturnFlowVO;
+import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitemreport.BoilerTaskOrderItemReportDO;
 import cn.start.tz.module.pressure2.dal.dataobject.dynamictbval.DynamicTbValDO;
+import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderitemreport.PipeTaskOrderItemReportDO;
+import cn.start.tz.module.pressure2.dal.mysql.boilertaskorderitemreport.BoilerTaskOrderItemReportMapper;
+import cn.start.tz.module.pressure2.dal.mysql.pipetaskorderitemreport.PipeTaskOrderItemReportMapper;
+import cn.start.tz.module.pressure2.enums.TaskOrderStatusEnum;
+import cn.start.tz.module.pressure2.service.boilertaskorderitemreport.BoilerTaskOrderItemReportService;
 import cn.start.tz.module.pressure2.service.dynamictbval.DynamicTbValService;
 import cn.start.tz.module.pressure2.service.externalOA.vo.*;
+import cn.start.tz.module.pressure2.service.pipetaskorderitemreport.PipeTaskOrderItemReportService;
 import cn.start.tz.module.pressure2.util.ImageUtil;
 import cn.start.tz.module.system.api.standard.StandardTemplateApi;
 import cn.start.tz.module.system.api.standard.dto.StandardTemplateRespDTO;
@@ -20,6 +27,8 @@ import com.alibaba.cloud.commons.lang.StringUtils;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.grapecity.documents.excel.*;
 import com.grapecity.documents.excel.drawing.ImageType;
 import com.grapecity.documents.excel.template.DataSource.JsonDataSource;
@@ -62,6 +71,12 @@ public class ExternalOAServiceImpl implements ExternalOAService {
     @Resource
     private DynamicTbValService dynamicTbValService;
 
+    @Resource
+    private BoilerTaskOrderItemReportMapper boilerTaskOrderItemReportMapper;
+
+    @Resource
+    private PipeTaskOrderItemReportMapper pipeTaskOrderItemReportMapper;
+
     @Value("${tz.fonts-folder-path:}")
     private String fontsFolderPath;
 
@@ -189,17 +204,109 @@ public class ExternalOAServiceImpl implements ExternalOAService {
 
     @Override
     public CommonResult<Boolean> cancleflow(String summaryId) {
+        log.info("撤销OA流程,summaryId={}", summaryId);
+        // 调用OA系统撤销流程接口
         String url = this.oaHost + "/seeyon/rest/myflow/cancleflow?token=" + this.getExternalOAToken(null).getId() + "&summaryId=" + summaryId;
         String result = HttpUtil.createGet(url)
                 .execute().body();
         log.info("撤销OA流程结果:{}", result);
+
+        // 撤销成功后,回退本地报告状态到报告编制(520)
+        Integer rollbackStatus = TaskOrderStatusEnum.REPORT_PREPARE.getStatus();
+
+        // 在锅炉报告表中查找
+        BoilerTaskOrderItemReportDO boilerReport = boilerTaskOrderItemReportMapper.selectOne(
+                new LambdaQueryWrapper<BoilerTaskOrderItemReportDO>()
+                        .eq(BoilerTaskOrderItemReportDO::getSummaryId, summaryId));
+        if (boilerReport != null) {
+            LambdaUpdateWrapper<BoilerTaskOrderItemReportDO> updateObj = new LambdaUpdateWrapper<>();
+            updateObj.eq(BoilerTaskOrderItemReportDO::getId, boilerReport.getId());
+            updateObj.set(BoilerTaskOrderItemReportDO::getTaskStatus, rollbackStatus);
+            // 清空审批相关字段
+            updateObj.set(BoilerTaskOrderItemReportDO::getApprovalId, null);
+            updateObj.set(BoilerTaskOrderItemReportDO::getApprovalTime, null);
+            updateObj.set(BoilerTaskOrderItemReportDO::getRatifyId, null);
+            updateObj.set(BoilerTaskOrderItemReportDO::getRatifyTime, null);
+            boilerTaskOrderItemReportMapper.update(updateObj);
+            log.info("撤销OA流程:锅炉报告状态已回退到{}", rollbackStatus);
+        } else {
+            // 在管道报告表中查找
+            PipeTaskOrderItemReportDO pipeReport = pipeTaskOrderItemReportMapper.selectOne(
+                    new LambdaQueryWrapper<PipeTaskOrderItemReportDO>()
+                            .eq(PipeTaskOrderItemReportDO::getSummaryId, summaryId));
+            if (pipeReport != null) {
+                LambdaUpdateWrapper<PipeTaskOrderItemReportDO> updateObj = new LambdaUpdateWrapper<>();
+                updateObj.eq(PipeTaskOrderItemReportDO::getId, pipeReport.getId());
+                updateObj.set(PipeTaskOrderItemReportDO::getTaskStatus, rollbackStatus);
+                // 清空审批相关字段
+                updateObj.set(PipeTaskOrderItemReportDO::getApprovalId, null);
+                updateObj.set(PipeTaskOrderItemReportDO::getApprovalTime, null);
+                updateObj.set(PipeTaskOrderItemReportDO::getRatifyId, null);
+                updateObj.set(PipeTaskOrderItemReportDO::getRatifyTime, null);
+                pipeTaskOrderItemReportMapper.update(updateObj);
+                log.info("撤销OA流程:管道报告状态已回退到{}", rollbackStatus);
+            } else {
+                log.warn("撤销OA流程:未找到summaryId={}对应的报告记录", summaryId);
+            }
+        }
+
         return CommonResult.success(true);
     }
 
     @Override
     public CommonResult<Boolean> returnFlow(ReturnFlowVO returnFlowVO) {
-        log.info("退回OA流程,{}", JSON.toJSONString(returnFlowVO));
-        return CommonResult.success(true);
+        log.info("OA退回流程回调,参数:{}", JSON.toJSONString(returnFlowVO));
+        String summaryId = returnFlowVO.getSummaryId();
+        if (StringUtils.isBlank(summaryId)) {
+            log.error("OA退回流程失败:summaryId为空");
+            return CommonResult.error(400, "流程ID不能为空");
+        }
+
+        // 回退目标状态:报告编制(520)
+        Integer rollbackStatus = TaskOrderStatusEnum.REPORT_PREPARE.getStatus();
+
+        // 先在锅炉报告表中查找
+        BoilerTaskOrderItemReportDO boilerReport = boilerTaskOrderItemReportMapper.selectOne(
+                new LambdaQueryWrapper<BoilerTaskOrderItemReportDO>()
+                        .eq(BoilerTaskOrderItemReportDO::getSummaryId, summaryId));
+        if (boilerReport != null) {
+            log.info("OA退回流程:找到锅炉报告记录,id={}, 当前状态={}", boilerReport.getId(), boilerReport.getTaskStatus());
+            LambdaUpdateWrapper<BoilerTaskOrderItemReportDO> updateObj = new LambdaUpdateWrapper<>();
+            updateObj.eq(BoilerTaskOrderItemReportDO::getId, boilerReport.getId());
+            updateObj.set(BoilerTaskOrderItemReportDO::getTaskStatus, rollbackStatus);
+            updateObj.set(BoilerTaskOrderItemReportDO::getReturnReason, returnFlowVO.getHandleType());
+            // 清空审批相关字段
+            updateObj.set(BoilerTaskOrderItemReportDO::getApprovalId, null);
+            updateObj.set(BoilerTaskOrderItemReportDO::getApprovalTime, null);
+            updateObj.set(BoilerTaskOrderItemReportDO::getRatifyId, null);
+            updateObj.set(BoilerTaskOrderItemReportDO::getRatifyTime, null);
+            boilerTaskOrderItemReportMapper.update(updateObj);
+            log.info("OA退回流程:锅炉报告状态已回退到{}", rollbackStatus);
+            return CommonResult.success(true);
+        }
+
+        // 在管道报告表中查找
+        PipeTaskOrderItemReportDO pipeReport = pipeTaskOrderItemReportMapper.selectOne(
+                new LambdaQueryWrapper<PipeTaskOrderItemReportDO>()
+                        .eq(PipeTaskOrderItemReportDO::getSummaryId, summaryId));
+        if (pipeReport != null) {
+            log.info("OA退回流程:找到管道报告记录,id={}, 当前状态={}", pipeReport.getId(), pipeReport.getTaskStatus());
+            LambdaUpdateWrapper<PipeTaskOrderItemReportDO> updateObj = new LambdaUpdateWrapper<>();
+            updateObj.eq(PipeTaskOrderItemReportDO::getId, pipeReport.getId());
+            updateObj.set(PipeTaskOrderItemReportDO::getTaskStatus, rollbackStatus);
+            updateObj.set(PipeTaskOrderItemReportDO::getReturnReason, returnFlowVO.getHandleType());
+            // 清空审批相关字段
+            updateObj.set(PipeTaskOrderItemReportDO::getApprovalId, null);
+            updateObj.set(PipeTaskOrderItemReportDO::getApprovalTime, null);
+            updateObj.set(PipeTaskOrderItemReportDO::getRatifyId, null);
+            updateObj.set(PipeTaskOrderItemReportDO::getRatifyTime, null);
+            pipeTaskOrderItemReportMapper.update(updateObj);
+            log.info("OA退回流程:管道报告状态已回退到{}", rollbackStatus);
+            return CommonResult.success(true);
+        }
+
+        log.warn("OA退回流程:未找到summaryId={}对应的报告记录", summaryId);
+        return CommonResult.error(500, "未找到对应的报告记录");
     }
 
     @Override

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

@@ -290,64 +290,48 @@ public class PipeTaskOrderItemReportServiceImpl extends ServiceImpl<PipeTaskOrde
      * @param comments                  OA 流程评论列表
      */
     public void updateReportStatus(PipeTaskOrderItemReportDO pipeTaskOrderItemReportDO, List<ExternalOACommentInfoRes> comments) {
-//        pipeTaskOrderItemReportDO.setTaskStatus(cn.start.tz.module.pressure2.enums.TaskOrderStatusEnum.REPORT_FINISH.getStatus());
-//
-//        // 拿到两个最近同意或者已阅的评论
-//        List<ExternalOACommentInfoRes> approvalComments = comments.stream()
-//                .filter(comment -> comment.getComment() != null &&
-//                        (comment.getComment().contains("同意") || comment.getComment().contains("已阅")))
-//                .sorted(Comparator.comparing(ExternalOACommentInfoRes::getCreateDate).reversed())
-//                .limit(2)
-//                .toList();
-//
-//        ExternalOACommentInfoRes approval = !approvalComments.isEmpty() ? approvalComments.get(0) : null;
-//        ExternalOACommentInfoRes ratify = approvalComments.size() > 1 ? approvalComments.get(1) : null;
-//
-//        // 通过名字找到 user
-//        if (approval != null) {
-//            List<AdminUserRespDTO> userListByNickname = adminUserApi.getUserListByNickname(approval.getUserName()).getCheckedData();
-//            if (!userListByNickname.isEmpty()) {
-//                AdminUserRespDTO approvalUser = userListByNickname.get(0);
-//                pipeTaskOrderItemReportDO.setApprovalId(approvalUser.getId());
-//                pipeTaskOrderItemReportDO.setApprovalName(approvalUser.getNickname());
-//                pipeTaskOrderItemReportDO.setApprovalTime(approval.getCreateDate());
-//            }
-//        }
-//
-//        if (ratify != null) {
-//            List<AdminUserRespDTO> userListByNickname1 = adminUserApi.getUserListByNickname(ratify.getUserName()).getCheckedData();
-//            if (!userListByNickname1.isEmpty()) {
-//                AdminUserRespDTO ratifyUser = userListByNickname1.get(0);
-//                pipeTaskOrderItemReportDO.setRatifyId(ratifyUser.getId());
-//                pipeTaskOrderItemReportDO.setRatifyName(ratifyUser.getNickname());
-//                pipeTaskOrderItemReportDO.setRatifyTime(ratify.getCreateDate());
-//            }
-//        }
-//
-//        taskOrderItemReportMapper.updateById(pipeTaskOrderItemReportDO);
-//
-//        BoilerTaskOrderSyncReportVO syncReportVO = new BoilerTaskOrderSyncReportVO();
-//        syncReportVO.setRefId(pipeTaskOrderItemReportDO.getId());
-//        if (pipeTaskOrderItemReportDO.getReportTemplateId() != null) {
-//            syncReportVO.setReportType("report");
-//            pipeTaskOrderService.syncReportData(syncReportVO);
-//        }
-//        if (pipeTaskOrderItemReportDO.getResultTemplateId() != null) {
-//            syncReportVO.setReportType("result");
-//            pipeTaskOrderService.syncReportData(syncReportVO);
-//        }
-//
-//        //TODO:结构调整
-////        pipeTaskOrderItemMapper.update(
-////                new LambdaUpdateWrapper<PipeTaskOrderItemDO>()
-////                        .set(PipeTaskOrderItemDO::getTaskStatus, cn.start.tz.module.pressure2.enums.TaskOrderStatusEnum.FINISH_CONFIRM.getStatus())
-////                        .eq(PipeTaskOrderItemDO::getId, pipeTaskOrderItemReportDO.getOrderItemId())
-////        );
-//        // 修改任务单状态为完成
-//        PipeTaskOrderDO pipeTaskOrderDO = pipeTaskOrderMapper.selectById(pipeTaskOrderItemReportDO.getOrderId());
-//        pipeTaskOrderDO.setTaskStatus(cn.start.tz.module.pressure2.enums.TaskOrderStatusEnum.FINISH_CONFIRM.getStatus());
-//        pipeTaskOrderMapper.updateById(pipeTaskOrderDO);
-        updateOrderItemRatifyFinish(pipeTaskOrderItemReportDO.getId());
+        // 从OA评论中提取最近两个"同意"或"已阅"的评论,分别作为审核人和审批人
+        String approvalId = null;
+        String approvalName = null;
+        LocalDateTime approvalTime = null;
+        String ratifyId = null;
+        String ratifyName = null;
+        LocalDateTime ratifyTime = null;
+
+        List<ExternalOACommentInfoRes> approvalComments = comments.stream()
+                .filter(comment -> comment.getComment() != null &&
+                        (comment.getComment().contains("同意") || comment.getComment().contains("已阅")))
+                .sorted(Comparator.comparing(ExternalOACommentInfoRes::getCreateDate).reversed())
+                .limit(2)
+                .toList();
+
+        // 最近一条评论对应审核人(approval)
+        ExternalOACommentInfoRes approval = !approvalComments.isEmpty() ? approvalComments.get(0) : null;
+        // 第二条评论对应审批人(ratify)
+        ExternalOACommentInfoRes ratify = approvalComments.size() > 1 ? approvalComments.get(1) : null;
+
+        if (approval != null) {
+            List<AdminUserRespDTO> userListByNickname = adminUserApi.getUserListByNickname(approval.getUserName()).getCheckedData();
+            if (!userListByNickname.isEmpty()) {
+                AdminUserRespDTO approvalUser = userListByNickname.get(0);
+                approvalId = approvalUser.getId();
+                approvalName = approvalUser.getNickname();
+                approvalTime = approval.getCreateDate();
+            }
+        }
+
+        if (ratify != null) {
+            List<AdminUserRespDTO> userListByNickname1 = adminUserApi.getUserListByNickname(ratify.getUserName()).getCheckedData();
+            if (!userListByNickname1.isEmpty()) {
+                AdminUserRespDTO ratifyUser = userListByNickname1.get(0);
+                ratifyId = ratifyUser.getId();
+                ratifyName = ratifyUser.getNickname();
+                ratifyTime = ratify.getCreateDate();
+            }
+        }
+
+        // 调用重载方法,传入从OA评论中提取的审核人和审批人信息
+        updateOrderItemRatifyFinish(pipeTaskOrderItemReportDO.getId(), approvalId, approvalName, approvalTime, ratifyId, ratifyName, ratifyTime);
     }
 
     public void orderItemRollback(String id, ExternalOARes externalOARes) {
@@ -420,33 +404,41 @@ public class PipeTaskOrderItemReportServiceImpl extends ServiceImpl<PipeTaskOrde
      * @param id 报告id
      */
     public void updateOrderItemRatifyFinish(String id) {
+        String userId = getLoginUserId();
+        AdminUserRespDTO userRespDTO = adminUserApi.getUser(userId).getData();
+        updateOrderItemRatifyFinish(id, userId, userRespDTO != null ? userRespDTO.getNickname() : null, LocalDateTime.now(), null, null, null);
+    }
+
+    /**
+     * 办结报告(轮询调用,从OA评论中获取审核人和审批人)
+     */
+    public void updateOrderItemRatifyFinish(String id, String approvalId, String approvalName, LocalDateTime approvalTime,
+                                            String ratifyId, String ratifyName, LocalDateTime ratifyTime) {
         PipeTaskOrderItemReportDO taskOrderItemReportDO = taskOrderItemReportMapper.selectById(id);
         if (ObjectUtil.isEmpty(taskOrderItemReportDO)) {
             throw exception(new ErrorCode(1001, "任务单设备关联报告不存在"));
         }
-        String userId = getLoginUserId();
-        if (Boolean.FALSE.equals(taskOrderItemReportDO.getIsRatify())) {
-            if (!userId.equals(taskOrderItemReportDO.getRatifyId()) && !userId.equals(taskOrderItemReportDO.getApprovalId())) {
-                throw exception(new ErrorCode(1001, "当前账号无法执行此记录的【审批】操作。"));
-            }
-        } else {
-            if (!userId.equals(taskOrderItemReportDO.getRatifyId())) {
-                throw exception(new ErrorCode(1001, "当前账号无法执行此记录的【审批】操作。"));
-            }
-        }
-
-        AdminUserRespDTO userRespDTO = adminUserApi.getUser(userId).getData();
         PipeTaskOrderItemReportDO updateObj = new PipeTaskOrderItemReportDO();
         updateObj.setId(id);
-        if (userRespDTO != null) {
-            updateObj.setRatifyName(userRespDTO.getNickname());
-        }
         updateObj.setTaskStatus(TaskOrderStatusEnum.REPORT_FINISH.getStatus());
-        updateObj.setRatifyId(userId);
-        updateObj.setRatifyTime(LocalDateTime.now());
         updateObj.setReturnReason("");
 
-        if (taskOrderItemReportDO.getApprovalTime() == null) {
+        // 设置审核人信息
+        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);
+            updateObj.setRatifyTime(ratifyTime != null ? ratifyTime : LocalDateTime.now());
+        } else {
+            updateObj.setRatifyTime(LocalDateTime.now());
+        }
+
+        if (taskOrderItemReportDO.getApprovalTime() == null && updateObj.getApprovalTime() == null) {
             updateObj.setApprovalTime(updateObj.getRatifyTime());
         }
 
@@ -607,7 +599,7 @@ public class PipeTaskOrderItemReportServiceImpl extends ServiceImpl<PipeTaskOrde
                 CompletableFuture.runAsync(() -> {
                     // 任务单办结
                     pipeTaskOrderDO.setTaskStatus(TaskOrderStatusEnum.REPORT_FINISH.getStatus());
-                    pushTaskOrderService.pushFinanceSystem(pipeTaskOrderDO);
+//                    pushTaskOrderService.pushFinanceSystem(pipeTaskOrderDO);
                 });
 
                 //生成任务单下所有设备报告
@@ -624,7 +616,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());
-            updateBySubReport.set(PipeTaskOrderItemReportDO::getRatifyId, userId);
+            updateBySubReport.set(PipeTaskOrderItemReportDO::getRatifyId, ratifyId);
             updateBySubReport.set(PipeTaskOrderItemReportDO::getRatifyName, updateObj.getRatifyName());
             updateBySubReport.set(PipeTaskOrderItemReportDO::getRatifyTime, updateObj.getRatifyTime());
             taskOrderItemReportMapper.update(updateBySubReport);