ソースを参照

报告办结调整

xuzhancheng 2 週間 前
コミット
8ed86d9d30

+ 75 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/dal/dataobject/taskordernontaxapply/TaskOrderNonTaxApplyDO.java

@@ -0,0 +1,75 @@
+package cn.start.tz.module.pressure2.dal.dataobject.taskordernontaxapply;
+
+import cn.start.tz.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 任务单非税开单申请 DO
+ *
+ * @author 特种管理员
+ */
+@TableName("pressure_task_order_non_tax_apply")
+@KeySequence("pressure_task_order_non_tax_apply_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TaskOrderNonTaxApplyDO extends BaseDO {
+
+    /**
+     * ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    private String id;
+    /**
+     * 任务单id
+     */
+    private String orderId;
+    /**
+     * 状态(0=未开单,100=审核中,200=已开单,300=已退回 400=已拆单)
+     */
+    private Integer status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 退回原因
+     */
+    private String returnReason;
+    /**
+     * 开单日期
+     */
+    private LocalDateTime billingTime;
+
+    /**
+     *  设备
+     * */
+    private Integer equipType;
+
+    /**
+     *  记录id
+     **/
+    private String recordId;
+
+    /**
+     * 应收金额
+     */
+    private BigDecimal receivableAmount;
+
+    /**
+     * 拆单金额
+     */
+    private BigDecimal splitAmount;
+
+}

+ 17 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/dal/mysql/taskordernontaxapply/TaskOrderNonTaxApplyMapper.java

@@ -0,0 +1,17 @@
+package cn.start.tz.module.pressure2.dal.mysql.taskordernontaxapply;
+
+
+import cn.start.tz.framework.mybatis.core.mapper.BaseMapperX;
+import cn.start.tz.module.pressure2.dal.dataobject.taskordernontaxapply.TaskOrderNonTaxApplyDO;
+import org.apache.ibatis.annotations.Mapper;
+
+
+/**
+ * 任务单非税开单申请 Mapper
+ *
+ * @author 特种管理员
+ */
+@Mapper
+public interface TaskOrderNonTaxApplyMapper extends BaseMapperX<TaskOrderNonTaxApplyDO> {
+
+}

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

@@ -2,7 +2,13 @@ package cn.start.tz.module.pressure2.service.boilertaskorderitemreport;
 
 import cn.hutool.core.util.ObjectUtil;
 import cn.start.tz.framework.common.exception.ErrorCode;
+import cn.start.tz.framework.common.util.QRCodeUtil;
+import cn.start.tz.framework.common.util.date.DateUtils;
+import cn.start.tz.framework.env.core.enums.EnvEnum;
 import cn.start.tz.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.start.tz.module.infra.api.file.FileApi;
+import cn.start.tz.module.pressure.enums.EquipmentCheckTypeEnum;
+import cn.start.tz.module.pressure.enums.TaskOrderItemReportTypeEnum;
 import cn.start.tz.module.pressure.enums.TaskOrderStatusEnum;
 import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.BatchRecheckOrderItemVO;
 import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.InspectionOpinionApprovalVo;
@@ -11,21 +17,32 @@ import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.TaskOrde
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorder.BoilerTaskOrderDO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitem.BoilerTaskOrderItemDO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitemreportrecord.BoilerTaskOrderItemReportRecordDO;
-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.pipetaskorderitemreport.PipeTaskOrderItemReportDO;
-import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderitemreportrecord.PipeTaskOrderItemReportRecordDO;
+import cn.start.tz.module.pressure2.dal.dataobject.equipboiler.EquipBoilerDO;
+import cn.start.tz.module.pressure2.dal.dataobject.equipboilercheckhistory.EquipBoilerCheckHistoryDO;
+import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorder.BoilerTaskOrderDO;
+import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitem.BoilerTaskOrderItemDO;
+import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitemreport.BoilerTaskOrderItemReportDO;
+import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitemreportrecord.BoilerTaskOrderItemReportRecordDO;
 import cn.start.tz.module.pressure2.dal.dataobject.reporttemplate.ReportTemplateDO;
 import cn.start.tz.module.pressure2.dal.mysql.boilertaskorder.BoilerTaskOrderMapper;
 import cn.start.tz.module.pressure2.dal.mysql.boilertaskorderitem.BoilerTaskOrderItemMapper;
 import cn.start.tz.module.pressure2.dal.mysql.boilertaskorderitemreportrecord.BoilerTaskOrderItemReportRecordMapper;
+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.reporttemplate.ReportTemplateMapper;
+import cn.start.tz.module.pressure2.framework.thread.CommonThread;
 import cn.start.tz.module.pressure2.service.externalOA.ExternalOAService;
 import cn.start.tz.module.pressure2.service.externalOA.vo.ExternalOACommentInfoRes;
 import cn.start.tz.module.pressure2.service.externalOA.vo.ExternalOACommentRes;
 import cn.start.tz.module.pressure2.service.externalOA.vo.ExternalOARes;
+import cn.start.tz.module.pressure2.service.boilertaskorderissuereport.BoilerTaskOrderIssueReportService;
+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.taskordernontaxapply.TaskOrderNonTaxApplyService;
+import cn.start.tz.module.pressure2.service.taskordernontaxapply.vo.TaskOrderNonTaxApplyCreateVO;
+import cn.start.tz.module.system.api.user.AdminUserApi;
+import cn.start.tz.module.system.api.user.dto.AdminUserRespDTO;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.fasterxml.jackson.databind.JsonNode;
@@ -34,13 +51,17 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
 import jodd.util.StringUtil;
 import lombok.extern.log4j.Log4j2;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import jakarta.annotation.Resource;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.transaction.annotation.Transactional;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import cn.start.tz.module.pressure2.controller.admin.boilertaskorderitemreport.vo.*;
@@ -52,8 +73,11 @@ import cn.start.tz.framework.common.util.object.BeanUtils;
 import cn.start.tz.module.pressure2.dal.mysql.boilertaskorderitemreport.BoilerTaskOrderItemReportMapper;
 
 import static cn.start.tz.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.start.tz.framework.common.exception.util.ServiceExceptionUtil.exception0;
+import static cn.start.tz.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 import static cn.start.tz.module.pressure.enums.ErrorCodeConstants.REPORT_INSPECTION_OPINION_RECTIFY;
 import static cn.start.tz.module.pressure2.enums.ErrorCodeConstants.*;
+import static java.time.LocalDate.now;
 
 /**
  * 锅炉任务单设备关联报告 Service 实现类
@@ -219,7 +243,7 @@ public class BoilerTaskOrderItemReportServiceImpl extends ServiceImpl<BoilerTask
     @Override
     public void orderItemReportUpload(ReportUploadVO reportUploadVO) {
 
-        reportUploadVO.getItems().forEach(item->{
+        reportUploadVO.getItems().forEach(item -> {
             boilerTaskOrderItemReportMapper.update(new LambdaUpdateWrapper<BoilerTaskOrderItemReportDO>()
                     .eq(BoilerTaskOrderItemReportDO::getId, item.getReportId())
                     .set(BoilerTaskOrderItemReportDO::getImage, item.getImage())
@@ -245,9 +269,9 @@ public class BoilerTaskOrderItemReportServiceImpl extends ServiceImpl<BoilerTask
         if (Integer.valueOf(0).equals(reqVo.getApprovalType())) {
             status = 4;
             updateWrapper.set(BoilerTaskOrderItemReportDO::getTaskStatus, TaskOrderStatusEnum.REPORT_FINISH.getStatus());
-        }else if(Integer.valueOf(2).equals(reqVo.getApprovalType())){
-            status =5;
-            updateWrapper.set(BoilerTaskOrderItemReportDO::getTaskStatus,TaskOrderStatusEnum.REPORT_FINISH.getStatus());
+        } else if (Integer.valueOf(2).equals(reqVo.getApprovalType())) {
+            status = 5;
+            updateWrapper.set(BoilerTaskOrderItemReportDO::getTaskStatus, TaskOrderStatusEnum.REPORT_FINISH.getStatus());
         } else {
             if (StringUtil.isEmpty(reqVo.getRejectionReason())) {
                 throw exception(new ErrorCode(10070, "拒绝原因不能为空"));
@@ -357,7 +381,7 @@ public class BoilerTaskOrderItemReportServiceImpl extends ServiceImpl<BoilerTask
                     boilerTaskOrderItemReportRecordDO.setCreateTime(comment.getCreateDate());
                     boilerTaskOrderItemReportRecordDO.setCreator(comment.getUserName());
 
-                    if (comment.getComment().contains("【") && comment.getComment().contains("】")){
+                    if (comment.getComment().contains("【") && comment.getComment().contains("】")) {
                         String substring = comment.getComment().substring(comment.getComment().indexOf("【") + 1, comment.getComment().indexOf("】"));
                         boilerTaskOrderItemReportRecordDO.setResult(switch (substring) {
                             case "已阅" -> 300;
@@ -378,32 +402,33 @@ 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);
-        }
+//        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 orderItemRollback(String id, ExternalOARes externalOARes) {
@@ -445,4 +470,261 @@ public class BoilerTaskOrderItemReportServiceImpl extends ServiceImpl<BoilerTask
         }
     }
 
+    @Resource
+    private FileApi fileApi;
+
+    @Value("${spring.profiles.active}")
+    private String env;
+
+    @Resource
+    private EquipBoilerMapper equipBoilerMapper;
+
+    @Resource
+    private ObjectMapper objectMapper;
+    @Resource
+    private EquipBoilerCheckHistoryMapper equipBoilerCheckHistoryMapper;
+
+    @Resource
+    private BoilerTaskOrderIssueReportService boilerTaskOrderIssueReportService;
+    @Resource
+    private CommonThread commonThread;
+    @Resource
+    private PushTaskOrderService pushTaskOrderService;
+    @Resource
+    private TaskOrderNonTaxApplyService taskOrderNonTaxApplyService;
+    @Resource
+    private AdminUserApi adminUserApi;
+
+    @Resource
+    private BoilerTaskOrderItemReportRecordMapper boilerTaskOrderItemReportRecordMapper;
+
+    /**
+     * 报告审批通过
+     *
+     * @param id 报告id
+     */
+    public void updateOrderItemRatifyFinish(String id) {
+        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) {
+            updateObj.setApprovalTime(updateObj.getRatifyTime());
+        }
+
+        if (TaskOrderItemReportTypeEnum.MAIN_REPORT.getType().equals(taskOrderItemReportDO.getReportType())) {
+            // 生成报告qrCode
+            String orderItemId = taskOrderItemReportDO.getOrderItemId();
+            String type = "0";
+            String url = String.format("https://yudao-h5.hofo.co/mp/pagesSub/reportInfoList/index?id=%s&type=%s", orderItemId, type);
+            if (EnvEnum.UAT.getEnvName().equals(env)) {
+                url = String.format("https://tjt.gzsei.cn/mp/pagesSub/reportInfoList/index?id=%s&type=%s", orderItemId, type);
+            }
+            byte[] qrCodeBytes = QRCodeUtil.generateQRCodeToBytes(url);
+            String file = fileApi.createFile(taskOrderItemReportDO.getOrderItemId() + ".png", null, qrCodeBytes);
+//            updateObj.setQrCodeUrl(file);
+        }
+
+        taskOrderItemReportMapper.updateById(updateObj);
+
+        // 流转记录
+        BoilerTaskOrderItemReportRecordDO taskOrderItemReportRecordDO = new BoilerTaskOrderItemReportRecordDO();
+        taskOrderItemReportRecordDO.setReportId(id);
+        taskOrderItemReportRecordDO.setProcess(TaskOrderStatusEnum.REPORT_RATIFY.getStatus());
+        taskOrderItemReportRecordDO.setResult(100);
+        boilerTaskOrderItemReportRecordMapper.insert(taskOrderItemReportRecordDO);
+
+//        TaskOrderItemReportDO taskOrderItemReportDO = taskOrderItemReportMapper.selectById(orderItemRatifyVO.getId());
+        if (taskOrderItemReportDO.getReportType() != null && taskOrderItemReportDO.getReportType() == 100) {
+            // 任务完成
+            BoilerTaskOrderItemDO updateOrderItem = new BoilerTaskOrderItemDO();
+            updateOrderItem.setId(taskOrderItemReportDO.getOrderItemId());
+            updateOrderItem.setTaskStatus(TaskOrderStatusEnum.REPORT_FINISH.getStatus());
+            boilerTaskOrderItemMapper.updateById(updateOrderItem);
+
+            BoilerTaskOrderItemDO taskOrderItemTmp = boilerTaskOrderItemMapper.selectById(taskOrderItemReportDO.getOrderItemId());
+
+            List<BoilerTaskOrderItemDO> boilerTaskOrderItemDOList = boilerTaskOrderItemMapper.selectList(new LambdaQueryWrapperX<BoilerTaskOrderItemDO>().
+                    eq(BoilerTaskOrderItemDO::getOrderId, taskOrderItemTmp.getOrderId()).
+                    ne(BoilerTaskOrderItemDO::getTaskStatus, TaskOrderStatusEnum.CANCEL.getStatus()));
+
+            BoilerTaskOrderDO boilerTaskOrderDO = boilerTaskOrderMapper.selectById(taskOrderItemTmp.getOrderId());
+
+            //任务单办结后重置容器设备排期状态
+            EquipBoilerDO equipBoilerDO = new EquipBoilerDO();
+            equipBoilerDO.setId(taskOrderItemTmp.getEquipId());
+            // 内检
+            if (100 == boilerTaskOrderDO.getCheckType()) {
+                equipBoilerDO.setHasInternal(false);
+
+                // 获取主报告信息, taskOrderItemReportDO
+                String prepareJson = taskOrderItemReportDO.getPrepareJson();
+                try {
+                    Map<String, String> map = objectMapper.readValue(prepareJson, Map.class);
+
+                    String lastCheckReportNo = taskOrderItemReportDO.getReportNo();
+                    LocalDate nextCheckDate = DateUtils.parseDateWithMultipleFormats(map.get("nextCheckDate"));
+                    LocalDate nextCheckYearDate2 = DateUtils.parseDateWithMultipleFormats(map.get("nextCheckYearDate"));
+                    equipBoilerDO.setNextcheckdate(nextCheckDate.atStartOfDay());
+                    equipBoilerDO.setNextInCheckDate(nextCheckYearDate2.atStartOfDay());
+                } catch (Exception e) {
+                    throw exception0(1001, "获取主报告结论失败");
+                }
+
+                if (EquipmentCheckTypeEnum.OVERDUE_INSPECTION.getType().equals(boilerTaskOrderDO.getCheckType())) {
+//                    equipBoilerDO.setIsExceedTimeLimit(true);
+                }
+            } else if (200 == boilerTaskOrderDO.getCheckType()) {
+                // 外检
+//                equipBoilerDO.setIsYearScheduling(false);
+
+                // 获取主报告信息, taskOrderItemReportDO
+                String prepareJson = taskOrderItemReportDO.getPrepareJson();
+                try {
+                    Map<String, String> map = objectMapper.readValue(prepareJson, Map.class);
+                    String lastCheckReportNo = taskOrderItemReportDO.getReportNo();
+//
+//                    LocalDate nextCheckDate = DateUtils.parseDateWithMultipleFormats(map.get("nextCheckDate"));
+//                    LocalDate nextCheckYearDate2 = DateUtils.parseDateWithMultipleFormats(map.get("nextYearCheckDate2"));
+//                    equipBoilerDO.setNextCheckDate(nextCheckDate);
+//                    equipBoilerDO.setNextYearCheckDate(nextCheckYearDate2);
+
+                } catch (Exception e) {
+                    // throw exception0(1001,"获取主报告结论失败");
+                    log.error("获取主报告结论失败", e);
+                }
+
+                if (Integer.valueOf(200).equals(boilerTaskOrderDO.getCheckType())) {
+                    //当主报告完成审核后更新所有子报告的审核人(年检的审批后)
+                    LambdaUpdateWrapper<BoilerTaskOrderItemReportDO> updateBySubReport = new LambdaUpdateWrapper<>();
+                    updateBySubReport.eq(BoilerTaskOrderItemReportDO::getOrderItemId, taskOrderItemReportDO.getOrderItemId());
+                    updateBySubReport.eq(BoilerTaskOrderItemReportDO::getReportType, TaskOrderItemReportTypeEnum.SUB_REPORT.getType());
+                    updateBySubReport.set(BoilerTaskOrderItemReportDO::getApprovalId, taskOrderItemReportDO.getApprovalId());
+                    updateBySubReport.set(BoilerTaskOrderItemReportDO::getApprovalName, taskOrderItemReportDO.getApprovalName());
+                    updateBySubReport.set(BoilerTaskOrderItemReportDO::getApprovalTime, LocalDateTime.now());
+                    taskOrderItemReportMapper.update(updateBySubReport);
+                }
+            } else if (300 == boilerTaskOrderDO.getCheckType()) {
+                // 耐压检
+//                equipBoilerDO.setIsYearScheduling(false);
+
+                // 获取主报告信息, taskOrderItemReportDO
+                String prepareJson = taskOrderItemReportDO.getPrepareJson();
+                try {
+                    Map<String, String> map = objectMapper.readValue(prepareJson, Map.class);
+                    String lastCheckReportNo = taskOrderItemReportDO.getReportNo();
+//
+//                    LocalDate nextCheckDate = DateUtils.parseDateWithMultipleFormats(map.get("nextCheckDate"));
+//                    LocalDate nextCheckYearDate2 = DateUtils.parseDateWithMultipleFormats(map.get("nextYearCheckDate2"));
+//                    equipBoilerDO.setNextCheckDate(nextCheckDate);
+//                    equipBoilerDO.setNextYearCheckDate(nextCheckYearDate2);
+//
+
+                } catch (Exception e) {
+                    // throw exception0(1001,"获取主报告结论失败");
+                    log.error("获取主报告结论失败", e);
+                }
+
+                if (Integer.valueOf(200).equals(boilerTaskOrderDO.getCheckType())) {
+                    //当主报告完成审核后更新所有子报告的审核人(年检的审批后)
+                    LambdaUpdateWrapper<BoilerTaskOrderItemReportDO> updateBySubReport = new LambdaUpdateWrapper<>();
+                    updateBySubReport.eq(BoilerTaskOrderItemReportDO::getOrderItemId, taskOrderItemReportDO.getOrderItemId());
+                    updateBySubReport.eq(BoilerTaskOrderItemReportDO::getReportType, TaskOrderItemReportTypeEnum.SUB_REPORT.getType());
+                    updateBySubReport.set(BoilerTaskOrderItemReportDO::getApprovalId, taskOrderItemReportDO.getApprovalId());
+                    updateBySubReport.set(BoilerTaskOrderItemReportDO::getApprovalName, taskOrderItemReportDO.getApprovalName());
+                    updateBySubReport.set(BoilerTaskOrderItemReportDO::getApprovalTime, LocalDateTime.now());
+                    taskOrderItemReportMapper.update(updateBySubReport);
+                }
+            }
+
+            equipBoilerMapper.updateById(equipBoilerDO);
+            //todo 推送公众号催费消息
+
+            Long count = equipBoilerCheckHistoryMapper.selectCount(new LambdaQueryWrapperX<EquipBoilerCheckHistoryDO>().
+                    eq(EquipBoilerCheckHistoryDO::getOrderId, boilerTaskOrderDO.getId()).
+                    eq(EquipBoilerCheckHistoryDO::getEquipId, equipBoilerDO.getId())
+            );
+            if (count == null || count == 0) {
+                EquipBoilerCheckHistoryDO historyDO = new EquipBoilerCheckHistoryDO();
+
+                historyDO.setCheckType(boilerTaskOrderDO.getCheckType());
+                historyDO.setProgress(100);
+                historyDO.setCheckDate(boilerTaskOrderDO.getCheckDate());
+                historyDO.setOrderId(boilerTaskOrderDO.getId());
+                historyDO.setEquipId(equipBoilerDO.getId());
+
+                historyDO.setDeptId(boilerTaskOrderDO.getDeptId());
+                historyDO.setIsFirst(false);
+                equipBoilerCheckHistoryMapper.insert(historyDO);
+            }
+
+
+            Boolean isAllFinish = boilerTaskOrderItemDOList.stream().allMatch(item -> item.getTaskStatus() == TaskOrderStatusEnum.REPORT_FINISH.getStatus().intValue());
+            if (isAllFinish && boilerTaskOrderItemDOList != null && !boilerTaskOrderItemDOList.isEmpty()) {
+                BoilerTaskOrderItemDO boilerTaskOrderItemDO = boilerTaskOrderItemDOList.get(0);
+                // 任务完成
+                BoilerTaskOrderDO updateOrder = new BoilerTaskOrderDO();
+                updateOrder.setId(boilerTaskOrderItemDO.getOrderId());
+                updateOrder.setTaskStatus(TaskOrderStatusEnum.REPORT_FINISH.getStatus());
+                updateOrder.setConfirmDate(now());
+                boilerTaskOrderMapper.updateById(updateOrder);
+
+                //任务单办结后添加任务单非税开单申请
+                try {
+                    taskOrderNonTaxApplyService.create(new TaskOrderNonTaxApplyCreateVO().setOrderId(boilerTaskOrderItemDO.getOrderId()));
+                } catch (Exception e) {
+                    log.error(e.getMessage());
+                }
+
+
+                CompletableFuture.runAsync(() -> {
+                    // 任务单办结
+                    boilerTaskOrderDO.setTaskStatus(TaskOrderStatusEnum.REPORT_FINISH.getStatus());
+                    pushTaskOrderService.pushFinanceSystem(boilerTaskOrderDO);
+                });
+
+                //生成任务单下所有设备报告
+                commonThread.runWithOutResult(() -> boilerTaskOrderIssueReportService.createIssueUrl(boilerTaskOrderDO.getId()));
+
+                //合同收费/属于免征则直接发送报告
+                if (Integer.valueOf(200).equals(boilerTaskOrderDO.getFeeType()) || Integer.valueOf(300).equals(boilerTaskOrderDO.getFeeNature())) {
+                    boilerTaskOrderIssueReportService.autoIssueTaskOrderReport(boilerTaskOrderDO, boilerTaskOrderItemDOList);
+                }
+
+            }
+
+            //当主报告完成审批后更新所有子报告的审批人
+            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::getRatifyName, updateObj.getRatifyName());
+            updateBySubReport.set(BoilerTaskOrderItemReportDO::getRatifyTime, updateObj.getRatifyTime());
+            taskOrderItemReportMapper.update(updateBySubReport);
+
+        }
+
+    }
 }

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

@@ -1,9 +1,16 @@
 package cn.start.tz.module.pressure2.service.pipetaskorderitemreport;
 
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.start.tz.framework.common.exception.ErrorCode;
 import cn.start.tz.framework.common.pojo.CommonResult;
+import cn.start.tz.framework.common.util.QRCodeUtil;
+import cn.start.tz.framework.common.util.date.DateUtils;
+import cn.start.tz.framework.env.core.enums.EnvEnum;
 import cn.start.tz.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.start.tz.module.infra.api.file.FileApi;
+import cn.start.tz.module.pressure.enums.EquipmentCheckTypeEnum;
+import cn.start.tz.module.pressure.enums.TaskOrderItemReportTypeEnum;
 import cn.start.tz.module.pressure.enums.TaskOrderStatusEnum;
 import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.BoilerTaskOrderSyncReportVO;
 import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.InspectionOpinionApprovalVo;
@@ -11,32 +18,46 @@ import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.ReportUp
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorder.BoilerTaskOrderDO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitem.BoilerTaskOrderItemDO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitemreport.BoilerTaskOrderItemReportDO;
+import cn.start.tz.module.pressure2.dal.dataobject.equippipe.EquipPipeDO;
+import cn.start.tz.module.pressure2.dal.dataobject.equippipecheckhistory.EquipPipeCheckHistoryDO;
 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.pipetaskorderitemreportrecord.PipeTaskOrderItemReportRecordDO;
+import cn.start.tz.module.pressure2.dal.mysql.equippipe.EquipPipeMapper;
+import cn.start.tz.module.pressure2.dal.mysql.equippipecheckhistory.EquipPipeCheckHistoryMapper;
 import cn.start.tz.module.pressure2.dal.mysql.pipetaskorder.PipeTaskOrderMapper;
 import cn.start.tz.module.pressure2.dal.mysql.pipetaskorderitem.PipeTaskOrderItemMapper;
 import cn.start.tz.module.pressure2.dal.mysql.pipetaskorderitemreportrecord.PipeTaskOrderItemReportRecordMapper;
+import cn.start.tz.module.pressure2.framework.thread.CommonThread;
 import cn.start.tz.module.pressure2.service.externalOA.ExternalOAService;
 import cn.start.tz.module.pressure2.service.externalOA.vo.ExternalOACommentInfoRes;
 import cn.start.tz.module.pressure2.service.externalOA.vo.ExternalOACommentRes;
 import cn.start.tz.module.pressure2.service.externalOA.vo.ExternalOARes;
 import cn.start.tz.module.pressure2.service.pipetaskorder.PipeTaskOrderService;
+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.taskordernontaxapply.TaskOrderNonTaxApplyService;
+import cn.start.tz.module.pressure2.service.taskordernontaxapply.vo.TaskOrderNonTaxApplyCreateVO;
 import cn.start.tz.module.system.api.user.AdminUserApi;
 import cn.start.tz.module.system.api.user.dto.AdminUserRespDTO;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import jodd.util.StringUtil;
 import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import jakarta.annotation.Resource;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import cn.start.tz.module.pressure2.controller.admin.pipetaskorderitemreport.vo.*;
@@ -47,8 +68,11 @@ import cn.start.tz.framework.common.util.object.BeanUtils;
 import cn.start.tz.module.pressure2.dal.mysql.pipetaskorderitemreport.PipeTaskOrderItemReportMapper;
 
 import static cn.start.tz.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.start.tz.framework.common.exception.util.ServiceExceptionUtil.exception0;
+import static cn.start.tz.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 import static cn.start.tz.module.pressure.enums.ErrorCodeConstants.REPORT_INSPECTION_OPINION_RECTIFY;
 import static cn.start.tz.module.pressure2.enums.ErrorCodeConstants.*;
+import static java.time.LocalDate.now;
 
 /**
  * 管道任务单设备关联报告 Service 实现类
@@ -124,9 +148,9 @@ public class PipeTaskOrderItemReportServiceImpl extends ServiceImpl<PipeTaskOrde
         if (Integer.valueOf(0).equals(reqVo.getApprovalType())) {
             status = 4;
             updateWrapper.set(PipeTaskOrderItemReportDO::getTaskStatus, TaskOrderStatusEnum.REPORT_FINISH.getStatus());
-        }else if(Integer.valueOf(2).equals(reqVo.getApprovalType())){
-            status =5;
-            updateWrapper.set(PipeTaskOrderItemReportDO::getTaskStatus,TaskOrderStatusEnum.REPORT_FINISH.getStatus());
+        } else if (Integer.valueOf(2).equals(reqVo.getApprovalType())) {
+            status = 5;
+            updateWrapper.set(PipeTaskOrderItemReportDO::getTaskStatus, TaskOrderStatusEnum.REPORT_FINISH.getStatus());
         } else {
             if (StringUtil.isEmpty(reqVo.getRejectionReason())) {
                 throw exception(new ErrorCode(10070, "拒绝原因不能为空"));
@@ -143,7 +167,7 @@ public class PipeTaskOrderItemReportServiceImpl extends ServiceImpl<PipeTaskOrde
     @Override
     public void orderItemReportUpload(ReportUploadVO reportUploadVO) {
 
-        reportUploadVO.getItems().forEach(item->{
+        reportUploadVO.getItems().forEach(item -> {
             pipeTaskOrderItemReportMapper.update(new LambdaUpdateWrapper<PipeTaskOrderItemReportDO>()
                     .eq(PipeTaskOrderItemReportDO::getId, item.getReportId())
                     .set(PipeTaskOrderItemReportDO::getImage, item.getImage())
@@ -198,7 +222,7 @@ public class PipeTaskOrderItemReportServiceImpl extends ServiceImpl<PipeTaskOrde
 
                                 } else if ("结束".equals(externalOAComment.getData().getState())) {
                                     // 修改报告状态
-                                    updateReportStatus(pipeTaskOrderItemReportDO,comments);
+                                    updateReportStatus(pipeTaskOrderItemReportDO, comments);
                                 } else if ("退回".equals(externalOAComment.getData().getState())) {
                                     // 退回
 //                            boilerTaskOrderItemReportDO.setTaskStatus(TaskOrderStatusEnum.ENTER.getStatus());
@@ -237,7 +261,7 @@ public class PipeTaskOrderItemReportServiceImpl extends ServiceImpl<PipeTaskOrde
                     pipeTaskOrderItemReportRecordDO.setCreateTime(comment.getCreateDate());
                     pipeTaskOrderItemReportRecordDO.setCreator(comment.getUserName());
 
-                    if (comment.getComment().contains("【") && comment.getComment().contains("】")){
+                    if (comment.getComment().contains("【") && comment.getComment().contains("】")) {
                         String substring = comment.getComment().substring(comment.getComment().indexOf("【") + 1, comment.getComment().indexOf("】"));
                         pipeTaskOrderItemReportRecordDO.setResult(switch (substring) {
                             case "已阅" -> 300;
@@ -262,66 +286,67 @@ public class PipeTaskOrderItemReportServiceImpl extends ServiceImpl<PipeTaskOrde
      * 修改报告状态
      *
      * @param pipeTaskOrderItemReportDO 报告
-     * @param comments OA 流程评论列表
+     * @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);
+//        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());
     }
 
     public void orderItemRollback(String id, ExternalOARes externalOARes) {
@@ -364,5 +389,245 @@ public class PipeTaskOrderItemReportServiceImpl extends ServiceImpl<PipeTaskOrde
 //        }
     }
 
+    @Resource
+    private FileApi fileApi;
+
+    @Value("${spring.profiles.active}")
+    private String env;
+
+    @Resource
+    private EquipPipeMapper equipPipeMapper;
+
+    @Resource
+    private ObjectMapper objectMapper;
+    @Resource
+    private EquipPipeCheckHistoryMapper equipPipeCheckHistoryMapper;
+
+    @Resource
+    private PipeTaskOrderIssueReportService pipeTaskOrderIssueReportService;
+    @Resource
+    private CommonThread commonThread;
+    @Resource
+    private PushTaskOrderService pushTaskOrderService;
+    @Resource
+    private TaskOrderNonTaxApplyService taskOrderNonTaxApplyService;
+
+    /**
+     * 报告审批通过
+     *
+     * @param id 报告id
+     */
+    public void updateOrderItemRatifyFinish(String id) {
+        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) {
+            updateObj.setApprovalTime(updateObj.getRatifyTime());
+        }
+
+        if (TaskOrderItemReportTypeEnum.MAIN_REPORT.getType().equals(taskOrderItemReportDO.getReportType())) {
+            // 生成报告qrCode
+            String orderItemId = taskOrderItemReportDO.getOrderItemId();
+            String type = "0";
+            String url = String.format("https://yudao-h5.hofo.co/mp/pagesSub/reportInfoList/index?id=%s&type=%s", orderItemId, type);
+            if (EnvEnum.UAT.getEnvName().equals(env)) {
+                url = String.format("https://tjt.gzsei.cn/mp/pagesSub/reportInfoList/index?id=%s&type=%s", orderItemId, type);
+            }
+            byte[] qrCodeBytes = QRCodeUtil.generateQRCodeToBytes(url);
+            String file = fileApi.createFile(taskOrderItemReportDO.getOrderItemId() + ".png", null, qrCodeBytes);
+//            updateObj.setQrCodeUrl(file);
+        }
+
+        taskOrderItemReportMapper.updateById(updateObj);
+
+        // 流转记录
+        PipeTaskOrderItemReportRecordDO taskOrderItemReportRecordDO = new PipeTaskOrderItemReportRecordDO();
+        taskOrderItemReportRecordDO.setReportId(id);
+        taskOrderItemReportRecordDO.setProcess(TaskOrderStatusEnum.REPORT_RATIFY.getStatus());
+        taskOrderItemReportRecordDO.setResult(100);
+        pipeTaskOrderItemReportRecordMapper.insert(taskOrderItemReportRecordDO);
+
+//        TaskOrderItemReportDO taskOrderItemReportDO = taskOrderItemReportMapper.selectById(orderItemRatifyVO.getId());
+        if (taskOrderItemReportDO.getReportType() != null && taskOrderItemReportDO.getReportType() == 100) {
+            // 任务完成
+            PipeTaskOrderItemDO updateOrderItem = new PipeTaskOrderItemDO();
+            updateOrderItem.setId(taskOrderItemReportDO.getOrderItemId());
+            updateOrderItem.setTaskStatus(TaskOrderStatusEnum.REPORT_FINISH.getStatus());
+            pipeTaskOrderItemMapper.updateById(updateOrderItem);
+
+            PipeTaskOrderItemDO taskOrderItemTmp = pipeTaskOrderItemMapper.selectById(taskOrderItemReportDO.getOrderItemId());
+
+            List<PipeTaskOrderItemDO> pipeTaskOrderItemDOList = pipeTaskOrderItemMapper.selectList(new LambdaQueryWrapperX<PipeTaskOrderItemDO>().
+                    eq(PipeTaskOrderItemDO::getOrderId, taskOrderItemTmp.getOrderId()).
+                    ne(PipeTaskOrderItemDO::getTaskStatus, TaskOrderStatusEnum.CANCEL.getStatus()));
+
+            PipeTaskOrderDO pipeTaskOrderDO = pipeTaskOrderMapper.selectById(taskOrderItemTmp.getOrderId());
+
+            //任务单办结后重置容器设备排期状态
+            EquipPipeDO equipPipeDO = new EquipPipeDO();
+            equipPipeDO.setId(taskOrderItemTmp.getEquipId());
+            if (EquipmentCheckTypeEnum.PERIODICAL_SURVEY.getType().equals(pipeTaskOrderDO.getCheckType())) {
+//                equipPipeDO.setIsScheduling(false);
+//                equipPipeDO.setIsExpiredScheduling(false);
+
+                // 获取主报告信息, taskOrderItemReportDO
+                String prepareJson = taskOrderItemReportDO.getPrepareJson();
+                try {
+                    Map<String, String> map = objectMapper.readValue(prepareJson, Map.class);
+
+                    String lastCheckReportNo = taskOrderItemReportDO.getReportNo();
+                    LocalDate nextCheckDate = DateUtils.parseDateWithMultipleFormats(map.get("nextCheckDate"));
+                    LocalDate nextCheckYearDate2 = DateUtils.parseDateWithMultipleFormats(map.get("nextCheckYearDate"));
+//                    equipPipeDO.setNextCheckDate(nextCheckDate);
+//                    equipPipeDO.setNextYearCheckDate(nextCheckYearDate2);
+//
+//                    equipPipeDO.setCavityStructure(map.get("cavityStructure"));
+//                    equipPipeDO.setLastCheckSafetyStatus(map.get("lastCheckSafetyStatus"));
+//
+//                    equipPipeDO.setLastCheckAllowWorkPressure(map.get("lastCheckAllowWorkPressure"));
+//                    equipPipeDO.setLastCheckAllowWorkMedium(map.get("lastCheckAllowWorkMedium"));
+//                    equipPipeDO.setLastCheckAllowWorkTemperature(map.get("lastCheckAllowWorkTemperature"));
+//                    equipPipeDO.setLastCheckConclusion(map.get("reportConclusion"));
+//                    equipPipeDO.setLastCheckProblem(map.get("checkProblem"));
+//                    equipPipeDO.setLastCheckReportNo(lastCheckReportNo);
+
+                } catch (Exception e) {
+                    throw exception0(1001, "获取主报告结论失败");
+                }
+
+                if (EquipmentCheckTypeEnum.OVERDUE_INSPECTION.getType().equals(pipeTaskOrderDO.getCheckType())) {
+//                    equipPipeDO.setIsExceedTimeLimit(true);
+                }
+            } else if (EquipmentCheckTypeEnum.ANNUAL_INSPECTION.getType().equals(pipeTaskOrderDO.getCheckType())) {
+//                equipPipeDO.setIsYearScheduling(false);
+
+                // 获取主报告信息, taskOrderItemReportDO
+                String prepareJson = taskOrderItemReportDO.getPrepareJson();
+                try {
+                    Map<String, String> map = objectMapper.readValue(prepareJson, Map.class);
+                    String lastCheckReportNo = taskOrderItemReportDO.getReportNo();
+//
+//                    LocalDate nextCheckDate = DateUtils.parseDateWithMultipleFormats(map.get("nextCheckDate"));
+//                    LocalDate nextCheckYearDate2 = DateUtils.parseDateWithMultipleFormats(map.get("nextYearCheckDate2"));
+//                    equipPipeDO.setNextCheckDate(nextCheckDate);
+//                    equipPipeDO.setNextYearCheckDate(nextCheckYearDate2);
+//
+//                    equipPipeDO.setCavityStructure(map.get("cavityStructure"));
+//
+//                    equipPipeDO.setLastYearCheckConclusionPressure(map.get("lastYearCheckConclusionPressure"));
+//                    equipPipeDO.setLastYearCheckConclusionMedium(map.get("lastYearCheckConclusionMedium"));
+//                    equipPipeDO.setLastYearCheckConclusionTemperature(map.get("lastYearCheckConclusionTemperature"));
+//                    equipPipeDO.setLastYearCheckConclusion(map.get("reportConclusion"));
+//                    equipPipeDO.setLastYearCheckProblem(map.get("checkProblem"));
+//
+//                    equipPipeDO.setLastYearCheckReportNo(lastCheckReportNo);
+
+                } catch (Exception e) {
+                    // throw exception0(1001,"获取主报告结论失败");
+                    log.error("获取主报告结论失败", e);
+                }
+
+                if (Integer.valueOf(200).equals(pipeTaskOrderDO.getCheckType())) {
+                    //当主报告完成审核后更新所有子报告的审核人(年检的审批后)
+                    LambdaUpdateWrapper<PipeTaskOrderItemReportDO> updateBySubReport = new LambdaUpdateWrapper<>();
+                    updateBySubReport.eq(PipeTaskOrderItemReportDO::getOrderItemId, taskOrderItemReportDO.getOrderItemId());
+                    updateBySubReport.eq(PipeTaskOrderItemReportDO::getReportType, TaskOrderItemReportTypeEnum.SUB_REPORT.getType());
+                    updateBySubReport.set(PipeTaskOrderItemReportDO::getApprovalId, taskOrderItemReportDO.getApprovalId());
+                    updateBySubReport.set(PipeTaskOrderItemReportDO::getApprovalName, taskOrderItemReportDO.getApprovalName());
+                    updateBySubReport.set(PipeTaskOrderItemReportDO::getApprovalTime, LocalDateTime.now());
+                    taskOrderItemReportMapper.update(updateBySubReport);
+                }
+            }
+
+            equipPipeMapper.updateById(equipPipeDO);
+            //todo 推送公众号催费消息
+
+            Long count = equipPipeCheckHistoryMapper.selectCount(new LambdaQueryWrapperX<EquipPipeCheckHistoryDO>().
+                    eq(EquipPipeCheckHistoryDO::getOrderId, pipeTaskOrderDO.getId()).
+                    eq(EquipPipeCheckHistoryDO::getEquipId, equipPipeDO.getId())
+            );
+            if (count == null || count == 0) {
+                EquipPipeCheckHistoryDO historyDO = new EquipPipeCheckHistoryDO();
+
+                historyDO.setCheckType(pipeTaskOrderDO.getCheckType());
+                historyDO.setProgress(100);
+                historyDO.setCheckDate(pipeTaskOrderDO.getCheckDate());
+                historyDO.setOrderId(pipeTaskOrderDO.getId());
+                historyDO.setEquipId(equipPipeDO.getId());
+
+                historyDO.setDeptId(pipeTaskOrderDO.getDeptId());
+                historyDO.setIsFirst(false);
+                equipPipeCheckHistoryMapper.insert(historyDO);
+            }
+
+
+            Boolean isAllFinish = pipeTaskOrderItemDOList.stream().allMatch(item -> item.getTaskStatus() == TaskOrderStatusEnum.REPORT_FINISH.getStatus().intValue());
+            if (isAllFinish && pipeTaskOrderItemDOList != null && !pipeTaskOrderItemDOList.isEmpty()) {
+                PipeTaskOrderItemDO pipeTaskOrderItemDO = pipeTaskOrderItemDOList.get(0);
+                // 任务完成
+                PipeTaskOrderDO updateOrder = new PipeTaskOrderDO();
+                updateOrder.setId(pipeTaskOrderItemDO.getOrderId());
+                updateOrder.setTaskStatus(TaskOrderStatusEnum.REPORT_FINISH.getStatus());
+                updateOrder.setConfirmDate(now());
+                pipeTaskOrderMapper.updateById(updateOrder);
+
+                //任务单办结后添加任务单非税开单申请
+                try {
+                    taskOrderNonTaxApplyService.create(new TaskOrderNonTaxApplyCreateVO().setOrderId(pipeTaskOrderItemDO.getOrderId()));
+                } catch (Exception e) {
+                    log.error(e.getMessage());
+                }
+
+
+                CompletableFuture.runAsync(() -> {
+                    // 任务单办结
+                    pipeTaskOrderDO.setTaskStatus(TaskOrderStatusEnum.REPORT_FINISH.getStatus());
+                    pushTaskOrderService.pushFinanceSystem(pipeTaskOrderDO);
+                });
+
+                //生成任务单下所有设备报告
+                commonThread.runWithOutResult(() -> pipeTaskOrderIssueReportService.createIssueUrl(pipeTaskOrderDO.getId()));
+
+                //合同收费/属于免征则直接发送报告
+                if (Integer.valueOf(200).equals(pipeTaskOrderDO.getFeeType()) || Integer.valueOf(300).equals(pipeTaskOrderDO.getFeeNature())) {
+                    pipeTaskOrderIssueReportService.autoIssueTaskOrderReport(pipeTaskOrderDO, pipeTaskOrderItemDOList);
+                }
+
+            }
+
+            //当主报告完成审批后更新所有子报告的审批人
+            LambdaUpdateWrapper<PipeTaskOrderItemReportDO> updateBySubReport = new LambdaUpdateWrapper<>();
+            updateBySubReport.eq(PipeTaskOrderItemReportDO::getOrderItemId, taskOrderItemReportDO.getOrderItemId());
+            updateBySubReport.eq(PipeTaskOrderItemReportDO::getReportType, TaskOrderItemReportTypeEnum.SUB_REPORT.getType());
+            updateBySubReport.set(PipeTaskOrderItemReportDO::getRatifyId, userId);
+            updateBySubReport.set(PipeTaskOrderItemReportDO::getRatifyName, updateObj.getRatifyName());
+            updateBySubReport.set(PipeTaskOrderItemReportDO::getRatifyTime, updateObj.getRatifyTime());
+            taskOrderItemReportMapper.update(updateBySubReport);
+
+        }
+
+    }
 }

+ 18 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/taskordernontaxapply/TaskOrderNonTaxApplyService.java

@@ -0,0 +1,18 @@
+package cn.start.tz.module.pressure2.service.taskordernontaxapply;
+
+import cn.start.tz.framework.common.pojo.PageResult;
+import cn.start.tz.module.pressure.dal.dataobject.taskorder.TaskOrderDO;
+import cn.start.tz.module.pressure2.dal.dataobject.taskordernontaxapply.TaskOrderNonTaxApplyDO;
+import cn.start.tz.module.pressure2.service.taskordernontaxapply.vo.TaskOrderNonTaxApplyCreateVO;
+import com.baomidou.mybatisplus.extension.service.IService;
+import jakarta.validation.Valid;
+
+/**
+ * 任务单非税开单申请 Service 接口
+ *
+ * @author 特种管理员
+ */
+public interface TaskOrderNonTaxApplyService extends IService<TaskOrderNonTaxApplyDO>  {
+
+    String create(@Valid TaskOrderNonTaxApplyCreateVO createReqVO);
+}

+ 90 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/taskordernontaxapply/TaskOrderNonTaxApplyServiceImpl.java

@@ -0,0 +1,90 @@
+package cn.start.tz.module.pressure2.service.taskordernontaxapply;
+
+
+import cn.start.tz.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.start.tz.module.pressure.enums.TaskOrderNonTaxApplyStatusEnum;
+
+import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorder.BoilerTaskOrderDO;
+import cn.start.tz.module.pressure2.dal.dataobject.taskordernontaxapply.TaskOrderNonTaxApplyDO;
+import cn.start.tz.module.pressure2.dal.mysql.boilertaskorder.BoilerTaskOrderMapper;
+import cn.start.tz.module.pressure2.dal.mysql.taskordernontaxapply.TaskOrderNonTaxApplyMapper;
+import cn.start.tz.module.pressure2.service.taskordernontaxapply.vo.TaskOrderNonTaxApplyCreateVO;
+import cn.start.tz.module.system.api.clientunit.ClientUnitApi;
+import cn.start.tz.module.system.api.clientunit.dto.ClientUnitDTO;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.*;
+
+import static cn.start.tz.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.start.tz.framework.common.exception.util.ServiceExceptionUtil.exception0;
+import static cn.start.tz.module.pressure.enums.ErrorCodeConstants.TASK_ORDER_NOT_EXISTS;
+
+/**
+ * 任务单非税开单申请 Service 实现类
+ *
+ * @author 特种管理员
+ */
+@Slf4j
+@Service
+@Validated
+public class TaskOrderNonTaxApplyServiceImpl extends ServiceImpl<TaskOrderNonTaxApplyMapper, TaskOrderNonTaxApplyDO> implements TaskOrderNonTaxApplyService {
+
+    @Resource
+    private TaskOrderNonTaxApplyMapper taskOrderNonTaxApplyMapper;
+
+
+    @Resource
+    private BoilerTaskOrderMapper boilerTaskOrderMapper;
+
+
+    /**
+     * rpc api
+     */
+    @Resource
+    private ClientUnitApi clientUnitApi;
+
+
+    @Override
+    public String create(TaskOrderNonTaxApplyCreateVO createReqVO) {
+        BoilerTaskOrderDO boilerTaskOrderDO = boilerTaskOrderMapper.selectOne(new LambdaQueryWrapperX<BoilerTaskOrderDO>()
+                        .eqIfPresent(BoilerTaskOrderDO::getOrderNo, createReqVO.getOrderNo())
+                        .eqIfPresent(BoilerTaskOrderDO::getId, createReqVO.getOrderId())
+                , false);
+
+        if (boilerTaskOrderDO == null) {
+            throw exception(TASK_ORDER_NOT_EXISTS);
+        }
+
+        Long count = taskOrderNonTaxApplyMapper.selectCount(TaskOrderNonTaxApplyDO::getOrderId, boilerTaskOrderDO.getId());
+        if (count != null && count > 0) {
+            throw exception0(500, "此任务单已经生成非税数据,请确认后重新添加");
+        }
+
+        if (100 != boilerTaskOrderDO.getCheckType()) {
+            throw exception0(500, "此任务单非法定检验,请确认后重新填写");
+        }
+
+        ClientUnitDTO unitDTO = clientUnitApi.getClientUnitByName(boilerTaskOrderDO.getUnitName()).getCheckedData();
+
+        if (unitDTO == null) {
+            throw exception0(500, "未找到匹配的单位信息");
+        }
+
+        if (!"0".equals(unitDTO.getIsExempt())) {
+            throw exception0(500, "所属单位是免征单位");
+        }
+
+        TaskOrderNonTaxApplyDO apply = new TaskOrderNonTaxApplyDO();
+        apply.setOrderId(boilerTaskOrderDO.getId());
+        apply.setStatus(TaskOrderNonTaxApplyStatusEnum.NON_BILLING.getStatus());
+        apply.setEquipType(1);
+        taskOrderNonTaxApplyMapper.insert(apply);
+        return "";
+    }
+}

+ 16 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/taskordernontaxapply/vo/TaskOrderNonTaxApplyCreateVO.java

@@ -0,0 +1,16 @@
+package cn.start.tz.module.pressure2.service.taskordernontaxapply.vo;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.ToString;
+
+@Schema(description = "管理后台 - 任务单非税开单申请 Request VO")
+@Data
+@ToString(callSuper = true)
+public class TaskOrderNonTaxApplyCreateVO {
+
+    private String orderNo;
+
+    private String orderId;
+}