Jelajahi Sumber

检测录入附件上传

xy 2 minggu lalu
induk
melakukan
362b3699b8
15 mengubah file dengan 584 tambahan dan 0 penghapusan
  1. 29 0
      build-uat/update.sql
  2. 3 0
      tz-module-pressure2/tz-module-pressure2-api/src/main/java/cn/start/tz/module/pressure2/enums/ErrorCodeConstants.java
  3. 21 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilertaskorder/vo/BoilerTaskOrderArchiveDetailRespVO.java
  4. 21 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/pipetaskorder/vo/PipeTaskOrderArchiveDetailRespVO.java
  5. 89 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/taskorderfile/TaskOrderFileController.java
  6. 37 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/taskorderfile/vo/TaskOrderFilePageReqVO.java
  7. 43 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/taskorderfile/vo/TaskOrderFileRespVO.java
  8. 30 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/taskorderfile/vo/TaskOrderFileSaveReqVO.java
  9. 51 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/dal/dataobject/taskorderfile/TaskOrderFileDO.java
  10. 31 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/dal/mysql/taskorderfile/TaskOrderFileMapper.java
  11. 24 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilertaskorderissuereport/BoilerTaskOrderIssueReportServiceImpl.java
  12. 24 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pipetaskorderissuereport/PipeTaskOrderIssueReportServiceImpl.java
  13. 68 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/taskorderfile/TaskOrderFileService.java
  14. 101 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/taskorderfile/TaskOrderFileServiceImpl.java
  15. 12 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/resources/mapper/taskorderfile/TaskOrderFileMapper.xml

+ 29 - 0
build-uat/update.sql

@@ -1628,3 +1628,32 @@ COMMENT ON COLUMN "PRESSURE2_BOILER_TASK_ORDER_ITEM_REPORT"."ENTER_PDF_URL" IS '
 ALTER TABLE "PRESSURE2_PIPE_TASK_ORDER_ITEM_REPORT" ADD COLUMN "ENTER_PDF_URL" VARCHAR(64);
 COMMENT ON COLUMN "PRESSURE2_PIPE_TASK_ORDER_ITEM_REPORT"."ENTER_PDF_URL" IS '记录pdfurl';
 
+--20260622
+CREATE TABLE "PRESSURE2_TASK_ORDER_FILE"
+(
+    "ID" VARCHAR2(64),
+    "FILE_URL" VARCHAR2(255),
+    "CREATE_TIME" TIMESTAMP(6),
+    "CREATOR" VARCHAR2(64),
+    "UPDATE_TIME" TIMESTAMP(6),
+    "UPDATER" VARCHAR2(64),
+    "DELETED" BIT,
+    "ORDER_ID" VARCHAR(50),
+    "ORDER_ITEM_ID" VARCHAR(50),
+    "EQUIP_MAIN_TYPE" INTEGER,
+    "FILE_NAME" VARCHAR(50)) STORAGE(ON "MAIN", CLUSTERBTR) ;
+
+COMMENT ON TABLE "PRESSURE2_TASK_ORDER_FILE" IS '任务单附件表';
+COMMENT ON COLUMN "PRESSURE2_TASK_ORDER_FILE"."ID" IS 'ID';
+COMMENT ON COLUMN "PRESSURE2_TASK_ORDER_FILE"."FILE_URL" IS '文件路径';
+COMMENT ON COLUMN "PRESSURE2_TASK_ORDER_FILE"."CREATE_TIME" IS '创建人';
+COMMENT ON COLUMN "PRESSURE2_TASK_ORDER_FILE"."CREATOR" IS '创建时间';
+COMMENT ON COLUMN "PRESSURE2_TASK_ORDER_FILE"."UPDATE_TIME" IS '修改人';
+COMMENT ON COLUMN "PRESSURE2_TASK_ORDER_FILE"."UPDATER" IS '修改时间';
+COMMENT ON COLUMN "PRESSURE2_TASK_ORDER_FILE"."DELETED" IS '是否删除';
+COMMENT ON COLUMN "PRESSURE2_TASK_ORDER_FILE"."ORDER_ID" IS '任务单ID';
+COMMENT ON COLUMN "PRESSURE2_TASK_ORDER_FILE"."ORDER_ITEM_ID" IS '检验设备单ID';
+COMMENT ON COLUMN "PRESSURE2_TASK_ORDER_FILE"."EQUIP_MAIN_TYPE" IS '设备类型 200锅炉 300管道';
+COMMENT ON COLUMN "PRESSURE2_TASK_ORDER_FILE"."FILE_NAME" IS '文件名称';
+
+--已加

+ 3 - 0
tz-module-pressure2/tz-module-pressure2-api/src/main/java/cn/start/tz/module/pressure2/enums/ErrorCodeConstants.java

@@ -157,6 +157,9 @@ public interface ErrorCodeConstants{
 
     ErrorCode INDEX_TODO_NOT_EXISTS = new ErrorCode(1076, "首页代办不存在");
 
+    ErrorCode TASK_ORDER_FILE_NOT_EXISTS = new ErrorCode(1077, "任务单附件不存在");
+    ErrorCode TASK_ORDER_FILE_UPLOAD_FAIL = new ErrorCode(1078, "任务单附件上传失败");
+
     ErrorCode EQUIP_BOILER_NOT_EXISTS = new ErrorCode(2000, "锅炉设备不存在");
 
     ErrorCode BOILER_EQUIP_OPERATION_RECORD_NOT_EXISTS = new ErrorCode(2001, "锅炉操作记录不存在");

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

@@ -24,6 +24,9 @@ public class BoilerTaskOrderArchiveDetailRespVO implements Serializable {
     @Schema(description = "项目文件")
     private List<ItemFile> itemFiles;
 
+    @Schema(description = "附件文件")
+    private List<AttachmentFile> attachmentFiles;
+
     @Schema(description = "任务单号")
     private String orderNo;
 
@@ -139,4 +142,22 @@ public class BoilerTaskOrderArchiveDetailRespVO implements Serializable {
         private String filePdf;
     }
 
+    @Data
+    public static class AttachmentFile implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        @Schema(description = "附件记录ID", example = "6948")
+        private String id;
+
+        @Schema(description = "文件名称", example = "检验报告附件.pdf")
+        private String fileName;
+
+        @Schema(description = "文件路径", example = "/path/to/file.pdf")
+        private String fileUrl;
+
+        @Schema(description = "上传时间", example = "2025-01-01 12:00:00")
+        private LocalDateTime createTime;
+    }
+
 }

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

@@ -24,6 +24,9 @@ public class PipeTaskOrderArchiveDetailRespVO implements Serializable {
     @Schema(description = "项目文件")
     private List<ItemFile> itemFiles;
 
+    @Schema(description = "附件文件")
+    private List<AttachmentFile> attachmentFiles;
+
     @Schema(description = "任务单号")
     private String orderNo;
 
@@ -142,4 +145,22 @@ public class PipeTaskOrderArchiveDetailRespVO implements Serializable {
 
     }
 
+    @Data
+    public static class AttachmentFile implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        @Schema(description = "附件记录ID", example = "6948")
+        private String id;
+
+        @Schema(description = "文件名称", example = "检验报告附件.pdf")
+        private String fileName;
+
+        @Schema(description = "文件路径", example = "/path/to/file.pdf")
+        private String fileUrl;
+
+        @Schema(description = "上传时间", example = "2025-01-01 12:00:00")
+        private LocalDateTime createTime;
+    }
+
 }

+ 89 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/taskorderfile/TaskOrderFileController.java

@@ -0,0 +1,89 @@
+package cn.start.tz.module.pressure2.controller.admin.taskorderfile;
+
+import org.springframework.web.bind.annotation.*;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import jakarta.validation.constraints.*;
+import jakarta.validation.*;
+import jakarta.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.start.tz.framework.common.pojo.PageParam;
+import cn.start.tz.framework.common.pojo.PageResult;
+import cn.start.tz.framework.common.pojo.CommonResult;
+import cn.start.tz.framework.common.util.object.BeanUtils;
+import static cn.start.tz.framework.common.pojo.CommonResult.success;
+
+import cn.start.tz.framework.excel.core.util.ExcelUtils;
+
+import cn.start.tz.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.start.tz.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.start.tz.module.pressure2.controller.admin.taskorderfile.vo.*;
+import cn.start.tz.module.pressure2.dal.dataobject.taskorderfile.TaskOrderFileDO;
+import cn.start.tz.module.pressure2.service.taskorderfile.TaskOrderFileService;
+import org.springframework.web.multipart.MultipartFile;
+
+@Tag(name = "管理后台 - 任务单附件")
+@RestController
+@RequestMapping("/pressure2/task-order-file")
+@Validated
+public class TaskOrderFileController {
+
+    @Resource
+    private TaskOrderFileService taskOrderFileService;
+
+    @PostMapping("/upload-and-create")
+    @Operation(summary = "上传文件并创建任务单附件")
+    public CommonResult<TaskOrderFileRespVO> uploadAndCreate(
+            @RequestParam("file") MultipartFile file,
+            @RequestParam("orderId") String orderId,
+            @RequestParam("orderItemId") String orderItemId,
+            @RequestParam("equipMainType") Integer equipMainType) {
+        TaskOrderFileDO taskOrderFile = taskOrderFileService.uploadAndCreate(file, orderId, orderItemId, equipMainType);
+        return success(BeanUtils.toBean(taskOrderFile, TaskOrderFileRespVO.class));
+    }
+
+    @PostMapping("/create")
+    @Operation(summary = "创建任务单附件")
+    public CommonResult<String> createTaskOrderFile(@Valid @RequestBody TaskOrderFileSaveReqVO createReqVO) {
+        return success(taskOrderFileService.createTaskOrderFile(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新任务单附件")
+    public CommonResult<Boolean> updateTaskOrderFile(@Valid @RequestBody TaskOrderFileSaveReqVO updateReqVO) {
+        taskOrderFileService.updateTaskOrderFile(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除任务单附件")
+    @Parameter(name = "id", description = "编号", required = true)
+    public CommonResult<Boolean> deleteTaskOrderFile(@RequestParam("id") String id) {
+        taskOrderFileService.deleteTaskOrderFile(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得任务单附件")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    public CommonResult<TaskOrderFileRespVO> getTaskOrderFile(@RequestParam("id") String id) {
+        TaskOrderFileDO taskOrderFile = taskOrderFileService.getTaskOrderFile(id);
+        return success(BeanUtils.toBean(taskOrderFile, TaskOrderFileRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得任务单附件分页")
+    public CommonResult<PageResult<TaskOrderFileRespVO>> getTaskOrderFilePage(@Valid TaskOrderFilePageReqVO pageReqVO) {
+        PageResult<TaskOrderFileDO> pageResult = taskOrderFileService.getTaskOrderFilePage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, TaskOrderFileRespVO.class));
+    }
+
+}

+ 37 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/taskorderfile/vo/TaskOrderFilePageReqVO.java

@@ -0,0 +1,37 @@
+package cn.start.tz.module.pressure2.controller.admin.taskorderfile.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.start.tz.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.start.tz.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 任务单附件分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class TaskOrderFilePageReqVO extends PageParam {
+
+    @Schema(description = "文件路径", example = "https://www.iocoder.cn")
+    private String fileUrl;
+
+    @Schema(description = "创建人")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "任务单ID", example = "25222")
+    private String orderId;
+
+    @Schema(description = "检验设备单ID", example = "25955")
+    private String orderItemId;
+
+    @Schema(description = "设备类型 200锅炉 300管道", example = "2")
+    private Integer equipMainType;
+
+    @Schema(description = "文件名称", example = "芋艿")
+    private String fileName;
+
+}

+ 43 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/taskorderfile/vo/TaskOrderFileRespVO.java

@@ -0,0 +1,43 @@
+package cn.start.tz.module.pressure2.controller.admin.taskorderfile.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 任务单附件 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class TaskOrderFileRespVO {
+
+    @Schema(description = "ID", example = "10035")
+    @ExcelProperty("ID")
+    private String id;
+
+    @Schema(description = "文件路径", example = "https://www.iocoder.cn")
+    @ExcelProperty("文件路径")
+    private String fileUrl;
+
+    @Schema(description = "创建人")
+    @ExcelProperty("创建人")
+    private LocalDateTime createTime;
+
+    @Schema(description = "任务单ID", example = "25222")
+    @ExcelProperty("任务单ID")
+    private String orderId;
+
+    @Schema(description = "检验设备单ID", example = "25955")
+    @ExcelProperty("检验设备单ID")
+    private String orderItemId;
+
+    @Schema(description = "设备类型 200锅炉 300管道", example = "2")
+    @ExcelProperty("设备类型 200锅炉 300管道")
+    private Integer equipMainType;
+
+    @Schema(description = "文件名称", example = "芋艿")
+    @ExcelProperty("文件名称")
+    private String fileName;
+
+}

+ 30 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/taskorderfile/vo/TaskOrderFileSaveReqVO.java

@@ -0,0 +1,30 @@
+package cn.start.tz.module.pressure2.controller.admin.taskorderfile.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+
+@Schema(description = "管理后台 - 任务单附件新增/修改 Request VO")
+@Data
+public class TaskOrderFileSaveReqVO {
+
+    @Schema(description = "ID", example = "10035")
+    private String id;
+
+    @Schema(description = "文件路径", example = "https://www.iocoder.cn")
+    private String fileUrl;
+
+    @Schema(description = "任务单ID", example = "25222")
+    private String orderId;
+
+    @Schema(description = "检验设备单ID", example = "25955")
+    private String orderItemId;
+
+    @Schema(description = "设备类型 200锅炉 300管道", example = "2")
+    private Integer equipMainType;
+
+    @Schema(description = "文件名称", example = "芋艿")
+    private String fileName;
+
+}

+ 51 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/dal/dataobject/taskorderfile/TaskOrderFileDO.java

@@ -0,0 +1,51 @@
+package cn.start.tz.module.pressure2.dal.dataobject.taskorderfile;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.start.tz.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 任务单附件 DO
+ *
+ * @author 特种管理员
+ */
+@TableName("pressure2_task_order_file")
+@KeySequence("pressure2_task_order_file_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TaskOrderFileDO extends BaseDO {
+
+    /**
+     * ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    private String id;
+    /**
+     * 文件路径
+     */
+    private String fileUrl;
+    /**
+     * 任务单ID
+     */
+    private String orderId;
+    /**
+     * 检验设备单ID
+     */
+    private String orderItemId;
+    /**
+     * 设备类型 200锅炉 300管道
+     */
+    private Integer equipMainType;
+    /**
+     * 文件名称
+     */
+    private String fileName;
+
+}

+ 31 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/dal/mysql/taskorderfile/TaskOrderFileMapper.java

@@ -0,0 +1,31 @@
+package cn.start.tz.module.pressure2.dal.mysql.taskorderfile;
+
+import java.util.*;
+
+import cn.start.tz.framework.common.pojo.PageResult;
+import cn.start.tz.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.start.tz.framework.mybatis.core.mapper.BaseMapperX;
+import cn.start.tz.module.pressure2.dal.dataobject.taskorderfile.TaskOrderFileDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.start.tz.module.pressure2.controller.admin.taskorderfile.vo.*;
+
+/**
+ * 任务单附件 Mapper
+ *
+ * @author 特种管理员
+ */
+@Mapper
+public interface TaskOrderFileMapper extends BaseMapperX<TaskOrderFileDO> {
+
+    default PageResult<TaskOrderFileDO> selectPage(TaskOrderFilePageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<TaskOrderFileDO>()
+                .eqIfPresent(TaskOrderFileDO::getFileUrl, reqVO.getFileUrl())
+                .betweenIfPresent(TaskOrderFileDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(TaskOrderFileDO::getOrderId, reqVO.getOrderId())
+                .eqIfPresent(TaskOrderFileDO::getOrderItemId, reqVO.getOrderItemId())
+                .eqIfPresent(TaskOrderFileDO::getEquipMainType, reqVO.getEquipMainType())
+                .likeIfPresent(TaskOrderFileDO::getFileName, reqVO.getFileName())
+                .orderByDesc(TaskOrderFileDO::getId));
+    }
+
+}

+ 24 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilertaskorderissuereport/BoilerTaskOrderIssueReportServiceImpl.java

@@ -38,6 +38,7 @@ import cn.start.tz.module.pressure2.controller.admin.boilertaskordersignfile.vo.
 import cn.start.tz.module.pressure2.controller.admin.bpmtaskinfo.vo.BpmTaskRespVO;
 import cn.start.tz.module.pressure2.controller.admin.dynamictbins.vo.CreateInstantiateWithRuleVO;
 import cn.start.tz.module.pressure2.controller.admin.pipetaskorderinput.vo.PipeTaskOrderInputPrintReqVO;
+import cn.start.tz.module.pressure2.controller.admin.taskorderfile.vo.TaskOrderFilePageReqVO;
 import cn.start.tz.module.pressure2.controller.admin.taskordernontaxrecord.vo.TaskOrderNonTaxRecordPageReqVO;
 import cn.start.tz.module.pressure2.controller.admin.taskordernontaxrecord.vo.TaskOrderNonTaxRecordRespVO;
 import cn.start.tz.module.pressure2.controller.app.taskorder.vo.TaskOrderIssueReportItemRespVO;
@@ -59,6 +60,7 @@ import cn.start.tz.module.pressure2.dal.dataobject.equipboiler.EquipBoilerDO;
 import cn.start.tz.module.pressure2.dal.dataobject.notificationformreport.NotificationformReportDO;
 import cn.start.tz.module.pressure2.dal.dataobject.orderreport.OrderReportDO;
 import cn.start.tz.module.pressure2.dal.dataobject.reporttemplate.ReportTemplateDO;
+import cn.start.tz.module.pressure2.dal.dataobject.taskorderfile.TaskOrderFileDO;
 import cn.start.tz.module.pressure2.dal.dataobject.usesignreport.UseSignReportDO;
 import cn.start.tz.module.pressure2.dal.mysql.boilerconnecttbservice.BoilerConnectTbServiceMapper;
 import cn.start.tz.module.pressure2.dal.mysql.boilerelectronicreportauditrecord.BoilerElectronicReportAuditRecordMapper;
@@ -93,6 +95,7 @@ import cn.start.tz.module.pressure2.service.membermessage.MemberMessageRemoteSer
 import cn.start.tz.module.pressure2.service.membermessage.vo.SendMpMessageReqVO;
 import cn.start.tz.module.pressure2.service.pdf.PdfService;
 import cn.start.tz.module.pressure2.service.pushtaskorder.PushTaskOrderService;
+import cn.start.tz.module.pressure2.service.taskorderfile.TaskOrderFileService;
 import cn.start.tz.module.pressure2.service.taskordernontaxrecord.TaskOrderNonTaxRecordService;
 import cn.start.tz.module.pressure2.util.JwApiClient;
 import cn.start.tz.module.pressure2.util.vo.ApiResponse;
@@ -302,6 +305,9 @@ public class BoilerTaskOrderIssueReportServiceImpl extends ServiceImpl<BoilerTas
     @Resource
     private FileApi fileApi;
 
+    @Resource
+    private TaskOrderFileService taskOrderFileService;
+
     @Resource
     private PushTaskOrderService pushTaskOrderService;
 
@@ -2508,6 +2514,24 @@ public class BoilerTaskOrderIssueReportServiceImpl extends ServiceImpl<BoilerTas
                 }
             }
         }
+        // 查询附件文件
+        TaskOrderFilePageReqVO filePageReqVO = new TaskOrderFilePageReqVO();
+        filePageReqVO.setOrderItemId(orderItemId);
+        filePageReqVO.setPageSize(Integer.MAX_VALUE);
+        PageResult<TaskOrderFileDO> filePageResult =
+                taskOrderFileService.getTaskOrderFilePage(filePageReqVO);
+        if (CollUtil.isNotEmpty(filePageResult.getList())) {
+            List<BoilerTaskOrderArchiveDetailRespVO.AttachmentFile> attachmentFiles = new ArrayList<>();
+            for (TaskOrderFileDO fileDO : filePageResult.getList()) {
+                BoilerTaskOrderArchiveDetailRespVO.AttachmentFile attachmentFile = new BoilerTaskOrderArchiveDetailRespVO.AttachmentFile();
+                attachmentFile.setId(fileDO.getId());
+                attachmentFile.setFileName(fileDO.getFileName());
+                attachmentFile.setFileUrl(fileDO.getFileUrl());
+                attachmentFile.setCreateTime(fileDO.getCreateTime());
+                attachmentFiles.add(attachmentFile);
+            }
+            taskOrderArchiveDetail.setAttachmentFiles(attachmentFiles);
+        }
         return taskOrderArchiveDetail;
     }
 

+ 24 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pipetaskorderissuereport/PipeTaskOrderIssueReportServiceImpl.java

@@ -25,6 +25,7 @@ import cn.start.tz.module.member.api.user.dto.MemberUserRespDTO;
 import cn.start.tz.module.member.api.user.dto.SendAppMpMessageReqDTO;
 import cn.start.tz.module.member.api.user.dto.WxMpTemplateDataReqDto;
 import cn.start.tz.module.pressure2.constant.TemplateIdConstants;
+import cn.start.tz.module.pressure2.controller.admin.taskorderfile.vo.TaskOrderFilePageReqVO;
 import cn.start.tz.module.pressure2.controller.admin.taskordernontaxrecord.vo.TaskOrderNonTaxRecordPageReqVO;
 import cn.start.tz.module.pressure2.controller.admin.taskordernontaxrecord.vo.TaskOrderNonTaxRecordRespVO;
 import cn.start.tz.module.pressure2.controller.app.taskorder.vo.TaskOrderIssueReportItemRespVO;
@@ -32,6 +33,7 @@ import cn.start.tz.module.pressure2.controller.app.taskorder.vo.TaskOrderIssueRe
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskordersignfile.BoilerTaskOrderSignFileDO;
 import cn.start.tz.module.pressure2.dal.dataobject.notificationformreport.NotificationformReportDO;
 import cn.start.tz.module.pressure2.dal.dataobject.orderreport.OrderReportDO;
+import cn.start.tz.module.pressure2.dal.dataobject.taskorderfile.TaskOrderFileDO;
 import cn.start.tz.module.pressure2.dal.mysql.boilertaskordersignfile.BoilerTaskOrderSignFileMapper;
 import cn.start.tz.module.pressure2.dal.mysql.dynamictbins.DynamicTbInsMapper;
 import cn.start.tz.module.pressure2.dal.mysql.notificationformreport.NotificationformReportMapper;
@@ -95,6 +97,7 @@ import cn.start.tz.module.pressure2.service.pipetaskorder.PipeTaskOrderService;
 import cn.start.tz.module.pressure2.service.pipetaskorderitemreportrecord.PipeTaskOrderItemReportRecordService;
 import cn.start.tz.module.pressure2.service.pipetaskorderitemreportversion.PipeTaskOrderItemReportVersionService;
 import cn.start.tz.module.pressure2.service.pushtaskorder.PushTaskOrderService;
+import cn.start.tz.module.pressure2.service.taskorderfile.TaskOrderFileService;
 import cn.start.tz.module.pressure2.service.taskordernontaxrecord.TaskOrderNonTaxRecordService;
 import cn.start.tz.module.pressure2.util.JwApiClient;
 import cn.start.tz.module.pressure2.util.vo.ApiResponse;
@@ -295,6 +298,9 @@ public class PipeTaskOrderIssueReportServiceImpl extends ServiceImpl<PipeTaskOrd
     @Resource
     private FileApi fileApi;
 
+    @Resource
+    private TaskOrderFileService taskOrderFileService;
+
     @Resource
     private PushTaskOrderService pushTaskOrderService;
 
@@ -2494,6 +2500,24 @@ public class PipeTaskOrderIssueReportServiceImpl extends ServiceImpl<PipeTaskOrd
                 }
             }
         }
+        // 查询附件文件
+        TaskOrderFilePageReqVO filePageReqVO = new TaskOrderFilePageReqVO();
+        filePageReqVO.setOrderItemId(orderItemId);
+        filePageReqVO.setPageSize(Integer.MAX_VALUE);
+        PageResult<TaskOrderFileDO> filePageResult =
+                taskOrderFileService.getTaskOrderFilePage(filePageReqVO);
+        if (CollUtil.isNotEmpty(filePageResult.getList())) {
+            List<PipeTaskOrderArchiveDetailRespVO.AttachmentFile> attachmentFiles = new ArrayList<>();
+            for (TaskOrderFileDO fileDO : filePageResult.getList()) {
+                PipeTaskOrderArchiveDetailRespVO.AttachmentFile attachmentFile = new PipeTaskOrderArchiveDetailRespVO.AttachmentFile();
+                attachmentFile.setId(fileDO.getId());
+                attachmentFile.setFileName(fileDO.getFileName());
+                attachmentFile.setFileUrl(fileDO.getFileUrl());
+                attachmentFile.setCreateTime(fileDO.getCreateTime());
+                attachmentFiles.add(attachmentFile);
+            }
+            taskOrderArchiveDetail.setAttachmentFiles(attachmentFiles);
+        }
         return taskOrderArchiveDetail;
     }
 

+ 68 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/taskorderfile/TaskOrderFileService.java

@@ -0,0 +1,68 @@
+package cn.start.tz.module.pressure2.service.taskorderfile;
+
+import java.util.*;
+import jakarta.validation.*;
+import cn.start.tz.module.pressure2.controller.admin.taskorderfile.vo.*;
+import cn.start.tz.module.pressure2.dal.dataobject.taskorderfile.TaskOrderFileDO;
+import cn.start.tz.framework.common.pojo.PageResult;
+import cn.start.tz.framework.common.pojo.PageParam;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 任务单附件 Service 接口
+ *
+ * @author 特种管理员
+ */
+public interface TaskOrderFileService extends IService<TaskOrderFileDO>  {
+
+    /**
+     * 创建任务单附件
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    String createTaskOrderFile(@Valid TaskOrderFileSaveReqVO createReqVO);
+
+    /**
+     * 更新任务单附件
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateTaskOrderFile(@Valid TaskOrderFileSaveReqVO updateReqVO);
+
+    /**
+     * 删除任务单附件
+     *
+     * @param id 编号
+     */
+    void deleteTaskOrderFile(String id);
+
+    /**
+     * 获得任务单附件
+     *
+     * @param id 编号
+     * @return 任务单附件
+     */
+    TaskOrderFileDO getTaskOrderFile(String id);
+
+    /**
+     * 获得任务单附件分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 任务单附件分页
+     */
+    PageResult<TaskOrderFileDO> getTaskOrderFilePage(TaskOrderFilePageReqVO pageReqVO);
+
+    /**
+     * 上传文件并创建附件记录
+     *
+     * @param file 上传的文件
+     * @param orderId 任务单ID
+     * @param orderItemId 检验设备单ID
+     * @param equipMainType 设备类型 200锅炉 300管道
+     * @return 附件记录
+     */
+    TaskOrderFileDO uploadAndCreate(MultipartFile file, String orderId, String orderItemId, Integer equipMainType);
+
+}

+ 101 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/taskorderfile/TaskOrderFileServiceImpl.java

@@ -0,0 +1,101 @@
+package cn.start.tz.module.pressure2.service.taskorderfile;
+
+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.util.*;
+import cn.start.tz.module.pressure2.controller.admin.taskorderfile.vo.*;
+import cn.start.tz.module.pressure2.dal.dataobject.taskorderfile.TaskOrderFileDO;
+import cn.start.tz.framework.common.pojo.PageResult;
+import cn.start.tz.framework.common.pojo.PageParam;
+import cn.start.tz.framework.common.util.object.BeanUtils;
+
+import cn.start.tz.module.pressure2.dal.mysql.taskorderfile.TaskOrderFileMapper;
+import cn.start.tz.module.infra.api.file.FileApi;
+import org.springframework.web.multipart.MultipartFile;
+import cn.hutool.core.io.IoUtil;
+
+import static cn.start.tz.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.start.tz.module.pressure2.enums.ErrorCodeConstants.*;
+
+/**
+ * 任务单附件 Service 实现类
+ *
+ * @author 特种管理员
+ */
+@Service
+@Validated
+public class TaskOrderFileServiceImpl extends ServiceImpl<TaskOrderFileMapper, TaskOrderFileDO> implements TaskOrderFileService {
+
+    @Resource
+    private TaskOrderFileMapper taskOrderFileMapper;
+
+    @Resource
+    private FileApi fileApi;
+
+    @Override
+    public String createTaskOrderFile(TaskOrderFileSaveReqVO createReqVO) {
+        // 插入
+        TaskOrderFileDO taskOrderFile = BeanUtils.toBean(createReqVO, TaskOrderFileDO.class);
+        taskOrderFileMapper.insert(taskOrderFile);
+        // 返回
+        return taskOrderFile.getId();
+    }
+
+    @Override
+    public void updateTaskOrderFile(TaskOrderFileSaveReqVO updateReqVO) {
+        // 校验存在
+        validateTaskOrderFileExists(updateReqVO.getId());
+        // 更新
+        TaskOrderFileDO updateObj = BeanUtils.toBean(updateReqVO, TaskOrderFileDO.class);
+        taskOrderFileMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteTaskOrderFile(String id) {
+        // 校验存在
+        validateTaskOrderFileExists(id);
+        // 删除
+        taskOrderFileMapper.deleteById(id);
+    }
+
+    @Override
+    public TaskOrderFileDO uploadAndCreate(MultipartFile file, String orderId, String orderItemId, Integer equipMainType) {
+        try {
+            // 上传文件到文件服务
+            byte[] content = IoUtil.readBytes(file.getInputStream());
+            String fileUrl = fileApi.createFile(file.getOriginalFilename(), null, content);
+            // 创建附件记录
+            TaskOrderFileDO taskOrderFile = new TaskOrderFileDO();
+            taskOrderFile.setFileUrl(fileUrl);
+            taskOrderFile.setFileName(file.getOriginalFilename());
+            taskOrderFile.setOrderId(orderId);
+            taskOrderFile.setOrderItemId(orderItemId);
+            taskOrderFile.setEquipMainType(equipMainType);
+            taskOrderFileMapper.insert(taskOrderFile);
+            return taskOrderFile;
+        } catch (Exception e) {
+            throw exception(TASK_ORDER_FILE_UPLOAD_FAIL);
+        }
+    }
+
+    private void validateTaskOrderFileExists(String id) {
+        if (taskOrderFileMapper.selectById(id) == null) {
+            throw exception(TASK_ORDER_FILE_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public TaskOrderFileDO getTaskOrderFile(String id) {
+        return taskOrderFileMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<TaskOrderFileDO> getTaskOrderFilePage(TaskOrderFilePageReqVO pageReqVO) {
+        return taskOrderFileMapper.selectPage(pageReqVO);
+    }
+
+}

+ 12 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/resources/mapper/taskorderfile/TaskOrderFileMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.start.tz.module.pressure2.dal.mysql.taskorderfile.TaskOrderFileMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
+     -->
+
+</mapper>