Przeglądaj źródła

是否收费、指导书

xzc 1 tydzień temu
rodzic
commit
ede0a66619
20 zmienionych plików z 571 dodań i 16 usunięć
  1. 6 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilerconnectrecordreport/vo/BoilerConnectRecordReportPageReqVO.java
  2. 3 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilerconnectrecordreport/vo/BoilerConnectRecordReportRespVO.java
  3. 6 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilerconnectrecordreport/vo/BoilerConnectRecordReportSaveReqVO.java
  4. 52 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilerpartinstructionconfig/BoilerPartInstructionConfigController.java
  5. 20 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilerpartinstructionconfig/vo/BoilerPartInstructionConfigPageReqVO.java
  6. 34 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilerpartinstructionconfig/vo/BoilerPartInstructionConfigRespVO.java
  7. 20 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilerpartinstructionconfig/vo/BoilerPartInstructionConfigSaveVO.java
  8. 16 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilertaskorder/BoilerTaskOrderController.java
  9. 32 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilertaskorder/vo/BoilerOrderItemAddFromExistingVO.java
  10. 3 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilertaskorder/vo/BoilerOrderItemCostInfoRepsVO.java
  11. 6 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilertaskorderitemreport/vo/BoilerTaskOrderItemReportPageReqVO.java
  12. 5 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilertaskorderitemreport/vo/BoilerTaskOrderItemReportRespVO.java
  13. 6 1
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/dal/dataobject/boilerconnectrecordreport/BoilerConnectRecordReportDO.java
  14. 39 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/dal/dataobject/boilerpartinstructionconfig/BoilerPartInstructionConfigDO.java
  15. 9 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/dal/mysql/boilerpartinstructionconfig/BoilerPartInstructionConfigMapper.java
  16. 32 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilerpartinstructionconfig/BoilerPartInstructionConfigService.java
  17. 98 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilerpartinstructionconfig/BoilerPartInstructionConfigServiceImpl.java
  18. 5 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilertaskorder/BoilerTaskOrderService.java
  19. 161 3
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilertaskorder/BoilerTaskOrderServiceImpl.java
  20. 18 12
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pipetaskorder/PipeTaskOrderServiceImpl.java

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

@@ -79,4 +79,10 @@ public class BoilerConnectRecordReportPageReqVO extends PageParam {
      */
     @Schema(description = "是否需要签名")
     private String isSign;
+
+    /**
+     * 是否收费
+     */
+    @Schema(description = "是否收费")
+    private String isFee;
 }

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

@@ -94,4 +94,7 @@ public class BoilerConnectRecordReportRespVO {
      */
     @Schema(description = "是否需要签名")
     private String  isSign;
+
+    @Schema(description = "是否收费")
+    private String isFee;
 }

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

@@ -67,4 +67,10 @@ public class BoilerConnectRecordReportSaveReqVO {
      */
     @Schema(description = "是否需要签名")
     private String  isSign;
+
+    /**
+     * 是否收费
+     */
+    @Schema(description = "是否收费")
+    private String isFee;
 }

+ 52 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilerpartinstructionconfig/BoilerPartInstructionConfigController.java

@@ -0,0 +1,52 @@
+package cn.start.tz.module.pressure2.controller.admin.boilerpartinstructionconfig;
+
+import cn.start.tz.framework.common.pojo.CommonResult;
+import cn.start.tz.framework.common.pojo.PageResult;
+import cn.start.tz.module.pressure2.controller.admin.boilerpartinstructionconfig.vo.*;
+import cn.start.tz.module.pressure2.service.boilerpartinstructionconfig.BoilerPartInstructionConfigService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import java.util.List;
+
+import static cn.start.tz.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "锅炉部件-操作指导书配置")
+@RestController
+@RequestMapping("/pressure2/boiler-part-instruction-config")
+public class BoilerPartInstructionConfigController {
+
+    @Resource
+    private BoilerPartInstructionConfigService configService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建部件-指导书配置")
+    public CommonResult<String> create(@Valid @RequestBody BoilerPartInstructionConfigSaveVO saveVO) {
+        String id = configService.createConfig(saveVO);
+        return success(id);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除部件-指导书配置")
+    public CommonResult<Boolean> delete(@RequestParam("id") String id) {
+        configService.deleteConfig(id);
+        return success(true);
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "部件-指导书配置分页")
+    public CommonResult<PageResult<BoilerPartInstructionConfigRespVO>> page(@Valid BoilerPartInstructionConfigPageReqVO pageReqVO) {
+        PageResult<BoilerPartInstructionConfigRespVO> pageResult = configService.getConfigPage(pageReqVO);
+        return success(pageResult);
+    }
+
+    @GetMapping("/list-by-part-type")
+    @Operation(summary = "根据部件类型获取关联的指导书模板ID列表")
+    public CommonResult<List<String>> listByPartType(@RequestParam("partType") String partType) {
+        List<String> templateIds = configService.getInstructionTemplateIdsByPartType(partType);
+        return success(templateIds);
+    }
+}

+ 20 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilerpartinstructionconfig/vo/BoilerPartInstructionConfigPageReqVO.java

@@ -0,0 +1,20 @@
+package cn.start.tz.module.pressure2.controller.admin.boilerpartinstructionconfig.vo;
+
+import cn.start.tz.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Schema(description = "锅炉部件-操作指导书配置 分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class BoilerPartInstructionConfigPageReqVO extends PageParam {
+
+    @Schema(description = "部件类型", example = "1")
+    private String partType;
+
+    @Schema(description = "指导书模板ID", example = "31564")
+    private String instructionTemplateId;
+}

+ 34 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilerpartinstructionconfig/vo/BoilerPartInstructionConfigRespVO.java

@@ -0,0 +1,34 @@
+package cn.start.tz.module.pressure2.controller.admin.boilerpartinstructionconfig.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "锅炉部件-操作指导书配置 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class BoilerPartInstructionConfigRespVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "23618")
+    @ExcelProperty("主键")
+    private String id;
+
+    @Schema(description = "部件类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty("部件类型")
+    private String partType;
+
+    @Schema(description = "操作指导书模板ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "31564")
+    @ExcelProperty("指导书模板ID")
+    private String instructionTemplateId;
+
+    @Schema(description = "模板名称")
+    @ExcelProperty("模板名称")
+    private String instructionTemplateName;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+}

+ 20 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilerpartinstructionconfig/vo/BoilerPartInstructionConfigSaveVO.java

@@ -0,0 +1,20 @@
+package cn.start.tz.module.pressure2.controller.admin.boilerpartinstructionconfig.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.Data;
+
+import java.util.List;
+
+@Schema(description = "锅炉部件-操作指导书配置 新增 Request VO")
+@Data
+public class BoilerPartInstructionConfigSaveVO {
+
+    @Schema(description = "部件类型(字典值)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotEmpty(message = "部件类型不能为空")
+    private String partType;
+
+    @Schema(description = "操作指导书模板ID列表", requiredMode = Schema.RequiredMode.REQUIRED, example = "[\"31564\",\"31565\"]")
+    @NotEmpty(message = "指导书模板不能为空")
+    private List<String> instructionTemplateIds;
+}

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

@@ -1,6 +1,7 @@
 package cn.start.tz.module.pressure2.controller.admin.boilertaskorder;
 
 import cn.start.tz.framework.common.exception.ErrorCode;
+import cn.start.tz.module.pressure2.controller.admin.boilertaskorderitemreport.vo.BoilerTaskOrderItemReportRespVO;
 import cn.start.tz.module.pressure2.controller.admin.boilertaskorderoperation.vo.BoilerTaskOrderOperationPageReqVO;
 import cn.start.tz.module.pressure2.controller.admin.boilertaskorderoperation.vo.BoilerTaskOrderOperationRespVO;
 import cn.start.tz.module.pressure2.controller.admin.boilertaskorderoperation.vo.BoilerTaskOrderOperationSaveReqVO;
@@ -317,6 +318,21 @@ public class BoilerTaskOrderController {
         return success(result);
     }
 
+    @PostMapping("/order-item/add-report-from-existing")
+    @Operation(summary = "任务单-从已有指导书引用创建新指导书")
+    public CommonResult<String> addReportFromExisting(@RequestBody BoilerOrderItemAddFromExistingVO addFromExistingVO) {
+        String result = boilerTaskOrderService.addReportFromExisting(addFromExistingVO);
+        return success(result);
+    }
+
+    @GetMapping("/order-item/history-instructions")
+    @Operation(summary = "获取设备上次任务单的指导书列表")
+    public CommonResult<List<BoilerTaskOrderItemReportRespVO>> getHistoryInstructions(
+            @RequestParam("equipId") String equipId,
+            @RequestParam(value = "currentOrderItemId", required = false) String currentOrderItemId) {
+        return success(boilerTaskOrderService.getHistoryInstructionsByEquipId(equipId, currentOrderItemId));
+    }
+
     @PutMapping("/order-item/initiateApproval")
     @Operation(summary = "任务单-检验意见通知书(重大事故)发起审批")
     public CommonResult<Boolean> opinionNoticeInitiateApproval(@RequestBody MajorIssuesSubmitVO majorIssuesSubmitVO) {

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

@@ -0,0 +1,32 @@
+package cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+@Data
+@Schema(description = "type=1设备添加作业指导书(模板生成/引用上次模板)")
+public class BoilerOrderItemAddFromExistingVO {
+
+    @Schema(description = "任务单id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1406")
+    private String orderId;
+
+    @Schema(description = "任务单设备id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32372")
+    private String orderItemId;
+
+    @Schema(description = "添加方式:2=模板生成,1=引用上次模板", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @NotBlank(message = "添加方式不能为空")
+    private String addType;
+
+    @Schema(description = "模板id(模板生成时必填)", example = "7363")
+    private String templateId;
+
+    @Schema(description = "源指导书报告id(引用上次模板时必填)", example = "20472")
+    private String instructionId;
+
+    @Schema(description = "部件id", example = "12345")
+    private String itemPartId;
+
+    @Schema(description = "备注", example = "")
+    private String remark;
+}

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

@@ -72,4 +72,7 @@ public class BoilerOrderItemCostInfoRepsVO {
 
     @Schema(description = "默认数量")
     private Integer defaultCount;
+
+    @Schema(description = "是否收费")
+    private String isFee;
 }

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

@@ -28,6 +28,12 @@ public class BoilerTaskOrderItemReportPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
+    /**
+     * 锅炉检验部件ID
+     */
+    @Schema(description = "炉检验部件ID")
+    private String itemPartId;
+
     @Schema(description = "报告编号")
     private String reportNo;
 

+ 5 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilertaskorderitemreport/vo/BoilerTaskOrderItemReportRespVO.java

@@ -27,6 +27,11 @@ public class BoilerTaskOrderItemReportRespVO {
     @ExcelProperty("报告模板")
     private String templateId;
 
+    /**
+     * 锅炉检验部件ID
+     */
+    private String itemPartId;
+
     @Schema(description = "创建时间")
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;

+ 6 - 1
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/dal/dataobject/boilerconnectrecordreport/BoilerConnectRecordReportDO.java

@@ -90,7 +90,12 @@ public class BoilerConnectRecordReportDO extends BaseDO {
      */
     private String isSign;
 
+    /**
+     * 是否收费
+     */
+    private String isFee;
+
     public String isMain(){
-        return String.valueOf("SUB".equals(this.projectType));
+        return String.valueOf("MAIN".equals(this.projectType));
     }
 }

+ 39 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/dal/dataobject/boilerpartinstructionconfig/BoilerPartInstructionConfigDO.java

@@ -0,0 +1,39 @@
+package cn.start.tz.module.pressure2.dal.dataobject.boilerpartinstructionconfig;
+
+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.*;
+
+/**
+ * 锅炉部件-操作指导书配置 DO
+ *
+ * @author 特种管理员
+ */
+@TableName("pressure2_boiler_part_instruction_config")
+@KeySequence("pressure2_boiler_part_instruction_config_seq")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class BoilerPartInstructionConfigDO extends BaseDO {
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    private String id;
+    /**
+     * 部件类型(字典值)
+     */
+    private String partType;
+    /**
+     * 操作指导书模板ID
+     */
+    private String instructionTemplateId;
+
+}

+ 9 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/dal/mysql/boilerpartinstructionconfig/BoilerPartInstructionConfigMapper.java

@@ -0,0 +1,9 @@
+package cn.start.tz.module.pressure2.dal.mysql.boilerpartinstructionconfig;
+
+import cn.start.tz.framework.mybatis.core.mapper.BaseMapperX;
+import cn.start.tz.module.pressure2.dal.dataobject.boilerpartinstructionconfig.BoilerPartInstructionConfigDO;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface BoilerPartInstructionConfigMapper extends BaseMapperX<BoilerPartInstructionConfigDO> {
+}

+ 32 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilerpartinstructionconfig/BoilerPartInstructionConfigService.java

@@ -0,0 +1,32 @@
+package cn.start.tz.module.pressure2.service.boilerpartinstructionconfig;
+
+import cn.start.tz.module.pressure2.controller.admin.boilerpartinstructionconfig.vo.*;
+import cn.start.tz.framework.common.pojo.PageResult;
+
+import java.util.List;
+
+/**
+ * 锅炉部件-操作指导书配置 Service 接口
+ */
+public interface BoilerPartInstructionConfigService {
+
+    /**
+     * 创建配置
+     */
+    String createConfig(BoilerPartInstructionConfigSaveVO saveVO);
+
+    /**
+     * 删除配置
+     */
+    void deleteConfig(String id);
+
+    /**
+     * 分页查询
+     */
+    PageResult<BoilerPartInstructionConfigRespVO> getConfigPage(BoilerPartInstructionConfigPageReqVO pageReqVO);
+
+    /**
+     * 根据部件类型获取关联的指导书模板ID列表
+     */
+    List<String> getInstructionTemplateIdsByPartType(String partType);
+}

+ 98 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilerpartinstructionconfig/BoilerPartInstructionConfigServiceImpl.java

@@ -0,0 +1,98 @@
+package cn.start.tz.module.pressure2.service.boilerpartinstructionconfig;
+
+import cn.start.tz.framework.common.pojo.PageResult;
+import cn.start.tz.framework.common.util.object.BeanUtils;
+import cn.start.tz.module.pressure2.controller.admin.boilerpartinstructionconfig.vo.*;
+import cn.start.tz.module.pressure2.dal.dataobject.boilerpartinstructionconfig.BoilerPartInstructionConfigDO;
+import cn.start.tz.module.pressure2.dal.dataobject.dynamictb.DynamicTbDO;
+import cn.start.tz.module.pressure2.dal.mysql.boilerpartinstructionconfig.BoilerPartInstructionConfigMapper;
+import cn.start.tz.module.pressure2.dal.mysql.dynamictb.DynamicTbMapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Service
+public class BoilerPartInstructionConfigServiceImpl implements BoilerPartInstructionConfigService {
+
+    @Resource
+    private BoilerPartInstructionConfigMapper configMapper;
+
+    @Resource
+    private DynamicTbMapper dynamicTbMapper;
+
+    @Override
+    public String createConfig(BoilerPartInstructionConfigSaveVO saveVO) {
+        int created = 0;
+        for (String templateId : saveVO.getInstructionTemplateIds()) {
+            // 检查是否已存在相同配置
+            Long count = configMapper.selectCount(new LambdaQueryWrapper<BoilerPartInstructionConfigDO>()
+                    .eq(BoilerPartInstructionConfigDO::getPartType, saveVO.getPartType())
+                    .eq(BoilerPartInstructionConfigDO::getInstructionTemplateId, templateId)
+            );
+            if (count != null && count > 0) {
+                continue; // 已存在则跳过
+            }
+            BoilerPartInstructionConfigDO configDO = new BoilerPartInstructionConfigDO();
+            configDO.setPartType(saveVO.getPartType());
+            configDO.setInstructionTemplateId(templateId);
+            configMapper.insert(configDO);
+            created++;
+        }
+        return String.valueOf(created);
+    }
+
+    @Override
+    public void deleteConfig(String id) {
+        configMapper.deleteById(id);
+    }
+
+    @Override
+    public PageResult<BoilerPartInstructionConfigRespVO> getConfigPage(BoilerPartInstructionConfigPageReqVO pageReqVO) {
+        LambdaQueryWrapper<BoilerPartInstructionConfigDO> wrapper = new LambdaQueryWrapper<>();
+        if (StringUtils.isNotBlank(pageReqVO.getPartType())) {
+            wrapper.eq(BoilerPartInstructionConfigDO::getPartType, pageReqVO.getPartType());
+        }
+        if (StringUtils.isNotBlank(pageReqVO.getInstructionTemplateId())) {
+            wrapper.eq(BoilerPartInstructionConfigDO::getInstructionTemplateId, pageReqVO.getInstructionTemplateId());
+        }
+        PageResult<BoilerPartInstructionConfigDO> pageResult = configMapper.selectPage(pageReqVO, wrapper);
+        
+        // 查询所有模板信息
+        List<String> templateIds = pageResult.getList().stream()
+                .map(BoilerPartInstructionConfigDO::getInstructionTemplateId)
+                .distinct()
+                .collect(Collectors.toList());
+        
+        Map<String, String> templateNameMap = Map.of();
+        if (!templateIds.isEmpty()) {
+            List<DynamicTbDO> templates = dynamicTbMapper.selectBatchIds(templateIds);
+            templateNameMap = templates.stream()
+                    .collect(Collectors.toMap(DynamicTbDO::getId, DynamicTbDO::getTbName, (a, b) -> a));
+        }
+
+        Map<String, String> finalTemplateNameMap = templateNameMap;
+        return new PageResult<>(
+                pageResult.getList().stream().map(config -> {
+                    BoilerPartInstructionConfigRespVO respVO = BeanUtils.toBean(config, BoilerPartInstructionConfigRespVO.class);
+                    respVO.setInstructionTemplateName(finalTemplateNameMap.getOrDefault(config.getInstructionTemplateId(), ""));
+                    return respVO;
+                }).collect(Collectors.toList()),
+                pageResult.getTotal()
+        );
+    }
+
+    @Override
+    public List<String> getInstructionTemplateIdsByPartType(String partType) {
+        List<BoilerPartInstructionConfigDO> configs = configMapper.selectList(
+                BoilerPartInstructionConfigDO::getPartType, partType
+        );
+        return configs.stream()
+                .map(BoilerPartInstructionConfigDO::getInstructionTemplateId)
+                .collect(Collectors.toList());
+    }
+}

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

@@ -16,6 +16,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import jakarta.validation.*;
 import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.*;
+import cn.start.tz.module.pressure2.controller.admin.boilertaskorderitemreport.vo.BoilerTaskOrderItemReportRespVO;
 import cn.start.tz.module.pressure2.controller.admin.boilertaskorderitemrecheck.vo.BoilerTaskOrderItemRecheckRespVO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorder.BoilerTaskOrderDO;
 import cn.start.tz.framework.common.pojo.PageResult;
@@ -141,6 +142,10 @@ public interface BoilerTaskOrderService extends IService<BoilerTaskOrderDO>  {
 
     String addMajorIssues(TaskOrderMajorIssuesVO taskOrderMajorIssuesVO);
 
+    String addReportFromExisting(BoilerOrderItemAddFromExistingVO addFromExistingVO);
+
+    List<BoilerTaskOrderItemReportRespVO> getHistoryInstructionsByEquipId(String equipId, String currentOrderItemId);
+
     Boolean opinionNotice(MajorIssuesSubmitVO majorIssuesSubmitVO);
 
     void orderItemReportNoticeBook(BoilerOrderItemIdVO orderItemIdVO);

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

@@ -141,6 +141,8 @@ import cn.start.tz.module.pressure2.service.common.RedisService;
 import cn.start.tz.module.pressure2.service.costfield.CostFieldService;
 import cn.start.tz.module.pressure2.service.dynamictb.DynamicTbService;
 import cn.start.tz.module.pressure2.service.dynamictbcol.DynamicTbColService;
+import cn.start.tz.module.pressure2.dal.mysql.dynamictbins.DynamicTbInsMapper;
+import cn.start.tz.module.pressure2.dal.mysql.dynamictbval.DynamicTbValMapper;
 import cn.start.tz.module.pressure2.service.dynamictbins.DynamicTbInsService;
 import cn.start.tz.module.pressure2.service.dynamictbval.DynamicTbValService;
 import cn.start.tz.module.pressure2.service.equipboiler.EquipBoilerService;
@@ -277,6 +279,12 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
     @Resource
     private BoilerTaskOrderItemReportUserMapper taskOrderItemReportUserMapper;
 
+    @Resource
+    private DynamicTbInsMapper dynamicTbInsMapper;
+
+    @Resource
+    private DynamicTbValMapper dynamicTbValMapper;
+
     @Resource
     private BoilerTaskOrderItemReportEquipMapper taskOrderItemReportEquipMapper;
 
@@ -1398,7 +1406,8 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
                             //repsVO.setName(dynamicTbDO.getTbName());
                             repsVO.setConnectId(connectRecordReportDO.getId());
                             repsVO.setName(connectRecordReportDO.getProjectName());
-                            repsVO.setFee(ConversionUtil.convert(connectRecordReportDO.getFee()));
+                            repsVO.setIsFee(connectRecordReportDO.getIsFee());
+                            repsVO.setFee("1".equals(connectRecordReportDO.getIsFee()) ? ConversionUtil.convert(connectRecordReportDO.getFee()) : BigDecimal.ZERO);
                             repsVO.setTemplateId(dynamicTbDO.getId());
                             repsVO.setIsAutoAmount("0");
                             repsVO.setReportType(dynamicTbDO.getTbType());
@@ -1417,7 +1426,8 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
                                 //repsVO.setName(dynamicTbDO.getTbName());
                                 repsVO.setConnectId(connectRecordReportDO.getId());
                                 repsVO.setName(connectRecordReportDO.getProjectName());
-                                repsVO.setFee(ConversionUtil.convert(connectRecordReportDO.getFee()));
+                                repsVO.setIsFee(connectRecordReportDO.getIsFee());
+                                repsVO.setFee("1".equals(connectRecordReportDO.getIsFee()) ? ConversionUtil.convert(connectRecordReportDO.getFee()) : BigDecimal.ZERO);
                                 repsVO.setTemplateId(dynamicTbDO.getId());
                                 repsVO.setIsAutoAmount("0");
                                 repsVO.setReportType(dynamicTbDO.getTbType());
@@ -2565,7 +2575,7 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
                             addInstructionReport.setTaskStatus(TaskOrderStatusEnum.ENTER.getStatus());
                             addInstructionReport.setSort(count + 1);
                             addInstructionReport.setFeeType(vo.getType());
-
+                            addInstructionReport.setItemPartId(itemPartId);
                             addInstructionReport.setProjectId(connectDO.getId());
                             if (vo.getFee() == null || vo.getFee().compareTo(BigDecimal.ZERO) == 0) {
                                 addInstructionReport.setFee(ConversionUtil.convert(connectDO.getFee()));
@@ -4599,6 +4609,154 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
 
     }
 
+    @Override
+    public String addReportFromExisting(BoilerOrderItemAddFromExistingVO addFromExistingVO) {
+        // 获取序号
+        Long count = taskOrderItemReportMapper.selectCount(
+                BoilerTaskOrderItemReportDO::getOrderId, addFromExistingVO.getOrderId());
+        if (count == null) {
+            count = 0L;
+        }
+
+        BoilerTaskOrderItemReportDO addReport = new BoilerTaskOrderItemReportDO();
+        addReport.setOrderId(addFromExistingVO.getOrderId());
+        addReport.setOrderItemId(addFromExistingVO.getOrderItemId());
+        addReport.setReportType(TaskOrderItemReportTypeEnum.WORK_INSTRUCTION.getType());
+        addReport.setTaskStatus(TaskOrderStatusEnum.CONFIRM.getStatus());
+        addReport.setStatus(0);
+        addReport.setSort(count.intValue() + 1);
+        addReport.setItemPartId(addFromExistingVO.getItemPartId());
+        addReport.setRemark(addFromExistingVO.getRemark());
+        addReport.setSubmitTime(LocalDateTime.now());
+        addReport.setPrepareTime(LocalDateTime.now());
+        addReport.setCreateTime(LocalDateTime.now());
+
+        BoilerTaskOrderItemReportDO sourceReport = null;
+        if ("1".equals(addFromExistingVO.getAddType())) {
+            // 引用上次模板:从源指导书复制
+            sourceReport = taskOrderItemReportMapper.selectById(addFromExistingVO.getInstructionId());
+            if (sourceReport == null) {
+                throw new ServiceException(GlobalErrorCodeConstants.FIND_NOT_DATA.getCode(), "源指导书不存在");
+            }
+            addReport.setTemplateId(sourceReport.getTemplateId());
+            addReport.setReportName(sourceReport.getReportName());
+            addReport.setPrepareJson(sourceReport.getPrepareJson());
+            addReport.setInstructionId(sourceReport.getId());
+            addReport.setPrepareId(sourceReport.getPrepareId());
+            addReport.setPrepareName(sourceReport.getPrepareName());
+            addReport.setReportUrl(sourceReport.getReportUrl());
+        } else {
+            // 模板生成:从模板创建
+            DynamicTbDO dynamicTbDO = dynamicTbMapper.selectById(addFromExistingVO.getTemplateId());
+            if (dynamicTbDO == null) {
+                throw new ServiceException(GlobalErrorCodeConstants.FIND_NOT_DATA.getCode(), "模板不存在");
+            }
+            addReport.setTemplateId(dynamicTbDO.getId());
+            addReport.setReportName(dynamicTbDO.getTbName());
+        }
+
+        taskOrderItemReportMapper.insert(addReport);
+
+        // 添加提交人
+        BoilerTaskOrderItemReportUserDO userDO = new BoilerTaskOrderItemReportUserDO();
+        userDO.setUserId(getLoginUserId());
+        userDO.setReportId(addReport.getId());
+        taskOrderItemReportUserMapper.insert(userDO);
+
+        if ("1".equals(addFromExistingVO.getAddType())) {
+            // 引用上次模板:复制源报告的 DynamicTbInsDO + DynamicTbValDO
+            copyReportInstance(sourceReport.getId(), addReport.getId(), sourceReport.getTemplateId());
+        } else {
+            // 模板生成:创建空模板实例
+            BoilerTaskOrderSyncReportVO syncReportVO = new BoilerTaskOrderSyncReportVO();
+            syncReportVO.setRefId(addReport.getId());
+            syncReportVO.setReportType("record");
+            syncReportData(syncReportVO);
+        }
+
+        return addReport.getId();
+    }
+
+    /**
+     * 复制报告的模板实例数据(DynamicTbInsDO + DynamicTbValDO)
+     */
+    private void copyReportInstance(String sourceReportId, String targetReportId, String templateId) {
+        // 查询源报告的模板实例
+        DynamicTbInsDO sourceIns = dynamicTbInsMapper.selectOne(
+                new LambdaQueryWrapper<DynamicTbInsDO>()
+                        .eq(DynamicTbInsDO::getRefId, sourceReportId)
+                        .eq(DynamicTbInsDO::getTbId, templateId)
+        );
+        if (sourceIns == null) {
+            // 源报告没有模板实例,走创建空实例
+            BoilerTaskOrderSyncReportVO syncReportVO = new BoilerTaskOrderSyncReportVO();
+            syncReportVO.setRefId(targetReportId);
+            syncReportVO.setReportType("record");
+            syncReportData(syncReportVO);
+            return;
+        }
+
+        // 创建新实例
+        DynamicTbInsDO newIns = new DynamicTbInsDO();
+        newIns.setTbId(sourceIns.getTbId());
+        newIns.setRefId(targetReportId);
+        newIns.setRefName(sourceIns.getRefName());
+        newIns.setNote(sourceIns.getNote());
+        newIns.setCreateorName(sourceIns.getCreateorName());
+        dynamicTbInsMapper.insert(newIns);
+
+        // 复制实例值
+        List<DynamicTbValDO> sourceVals = dynamicTbValMapper.selectList(
+                new LambdaQueryWrapper<DynamicTbValDO>()
+                        .eq(DynamicTbValDO::getInsId, sourceIns.getId())
+        );
+        if (CollUtil.isNotEmpty(sourceVals)) {
+            for (DynamicTbValDO val : sourceVals) {
+                DynamicTbValDO newVal = new DynamicTbValDO();
+                newVal.setInsId(newIns.getId());
+                newVal.setColCode(val.getColCode());
+                newVal.setValValue(val.getValValue());
+                newVal.setNote(val.getNote());
+                newVal.setCreateorName(val.getCreateorName());
+                dynamicTbValMapper.insert(newVal);
+            }
+        }
+    }
+
+    @Override
+    public List<BoilerTaskOrderItemReportRespVO> getHistoryInstructionsByEquipId(String equipId, String currentOrderItemId) {
+        // 查该设备的所有任务单项,按创建时间倒序(最近的在前面)
+        List<BoilerTaskOrderItemDO> orderItems = boilerTaskOrderItemMapper.selectList(
+                new LambdaQueryWrapperX<BoilerTaskOrderItemDO>()
+                        .eq(BoilerTaskOrderItemDO::getEquipId, equipId)
+                        .orderByDesc(BoilerTaskOrderItemDO::getCreateTime)
+        );
+        if (CollUtil.isEmpty(orderItems)) {
+            return List.of();
+        }
+
+        // 跳过当前任务单项,取上一次的任务单
+        BoilerTaskOrderItemDO previousItem = null;
+        for (BoilerTaskOrderItemDO item : orderItems) {
+            if (!item.getId().equals(currentOrderItemId)) {
+                previousItem = item;
+                break;
+            }
+        }
+        if (previousItem == null) {
+            return List.of();
+        }
+
+        // 查询上次任务单下的作业指导书(reportType=700)
+        List<BoilerTaskOrderItemReportDO> reports = taskOrderItemReportMapper.selectList(
+                new LambdaQueryWrapperX<BoilerTaskOrderItemReportDO>()
+                        .eq(BoilerTaskOrderItemReportDO::getOrderItemId, previousItem.getId())
+                        .eq(BoilerTaskOrderItemReportDO::getReportType, TaskOrderItemReportTypeEnum.WORK_INSTRUCTION.getType())
+        );
+
+        return BeanUtils.toBean(reports, BoilerTaskOrderItemReportRespVO.class);
+    }
+
     @Override
     public Boolean opinionNotice(MajorIssuesSubmitVO majorIssuesSubmitVO) {
 

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

@@ -1398,7 +1398,8 @@ public class PipeTaskOrderServiceImpl extends ServiceImpl<PipeTaskOrderMapper, P
                             repsVO.setName(connectRecordReportDO.getProjectName());
                             repsVO.setTemplateId(dynamicTbDO.getId());
                             repsVO.setIsAutoAmount("0");
-                            repsVO.setFee(ConversionUtil.convert(connectRecordReportDO.getFee()));
+                            repsVO.setIsFee(connectRecordReportDO.getIsFee());
+                            repsVO.setFee("1".equals(connectRecordReportDO.getIsFee()) ? ConversionUtil.convert(connectRecordReportDO.getFee()) : BigDecimal.ZERO);
                             repsVO.setReportType(dynamicTbDO.getTbType());
                             repsVO.setUse("1".equals(natureTemplateDO.getIsDefault())); // 默认值
                             repsVO.setProjectType(connectRecordReportDO.getProjectType());
@@ -1415,7 +1416,8 @@ public class PipeTaskOrderServiceImpl extends ServiceImpl<PipeTaskOrderMapper, P
                                 //repsVO.setName(dynamicTbDO.getTbName());
                                 repsVO.setConnectId(connectRecordReportDO.getId());
                                 repsVO.setName(connectRecordReportDO.getProjectName());
-                                repsVO.setFee(ConversionUtil.convert(connectRecordReportDO.getFee()));
+                                repsVO.setIsFee(connectRecordReportDO.getIsFee());
+                                repsVO.setFee("1".equals(connectRecordReportDO.getIsFee()) ? ConversionUtil.convert(connectRecordReportDO.getFee()) : BigDecimal.ZERO);
                                 repsVO.setTemplateId(dynamicTbDO.getId());
                                 repsVO.setIsAutoAmount("0");
                                 repsVO.setReportType(dynamicTbDO.getTbType());
@@ -1458,11 +1460,13 @@ public class PipeTaskOrderServiceImpl extends ServiceImpl<PipeTaskOrderMapper, P
         //vo.setReportTemplateUrl(templateDO.getReportTemplateUrl());
             vo.setProjectType(templateDO.getProjectType());
             // 将 String 类型的 fee 转换为 BigDecimal
-            if (StringUtils.isNotBlank(templateDO.getFee())) {
-                vo.setFee(new BigDecimal(templateDO.getFee()));
-            } else {
-                vo.setFee(BigDecimal.ZERO);
-            }
+//            if (StringUtils.isNotBlank(templateDO.getFee())) {
+//                vo.setFee(new BigDecimal(templateDO.getFee()));
+//            } else {
+//                vo.setFee(BigDecimal.ZERO);
+//            }
+            vo.setIsFee(templateDO.getIsFee());
+            vo.setFee("1".equals(templateDO.getIsFee()) ? ConversionUtil.convert(templateDO.getFee()) : BigDecimal.ZERO);
         }else if (templateDO.getReportTemplateId() != null){
             DynamicTbDO recordDO = dynamicTbMapper.selectById(templateDO.getReportTemplateId());
             vo.setOrderId(reqVO.getOrderId());
@@ -1473,11 +1477,13 @@ public class PipeTaskOrderServiceImpl extends ServiceImpl<PipeTaskOrderMapper, P
             vo.setReportType(recordDO.getTbType());
             vo.setProjectType(templateDO.getProjectType());
             // 将 String 类型的 fee 转换为 BigDecimal
-            if (StringUtils.isNotBlank(templateDO.getFee())) {
-                vo.setFee(new BigDecimal(templateDO.getFee()));
-            } else {
-                vo.setFee(BigDecimal.ZERO);
-            }
+//            if (StringUtils.isNotBlank(templateDO.getFee())) {
+//                vo.setFee(new BigDecimal(templateDO.getFee()));
+//            } else {
+//                vo.setFee(BigDecimal.ZERO);
+//            }
+            vo.setIsFee(templateDO.getIsFee());
+            vo.setFee("1".equals(templateDO.getIsFee()) ? ConversionUtil.convert(templateDO.getFee()) : BigDecimal.ZERO);
         }
         return vo;
     }