xy 1 тиждень тому
батько
коміт
e418765a45
14 змінених файлів з 766 додано та 178 видалено
  1. 31 0
      build-uat/update.sql
  2. 2 0
      tz-module-pressure2/tz-module-pressure2-api/src/main/java/cn/start/tz/module/pressure2/enums/ErrorCodeConstants.java
  3. 95 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/usesignreport/UseSignReportController.java
  4. 38 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/usesignreport/vo/UseSignReportPageReqVO.java
  5. 45 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/usesignreport/vo/UseSignReportRespVO.java
  6. 32 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/usesignreport/vo/UseSignReportSaveReqVO.java
  7. 53 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/dal/dataobject/usesignreport/UseSignReportDO.java
  8. 31 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/dal/mysql/usesignreport/UseSignReportMapper.java
  9. 87 89
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilertaskorderissuereport/BoilerTaskOrderIssueReportServiceImpl.java
  10. 126 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/dynamicOFData/comm/SBSYBZOFData.java
  11. 83 89
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pipetaskorderissuereport/PipeTaskOrderIssueReportServiceImpl.java
  12. 56 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/usesignreport/UseSignReportService.java
  13. 75 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/usesignreport/UseSignReportServiceImpl.java
  14. 12 0
      tz-module-pressure2/tz-module-pressure2-biz/src/main/resources/mapper/usesignreport/UseSignReportMapper.xml

+ 31 - 0
build-uat/update.sql

@@ -1015,4 +1015,35 @@ COMMENT ON COLUMN "PRESSURE2_ORDER_ITEM_REPORT_COMPLETED"."UPDATE_TIME" IS '更
 COMMENT ON COLUMN "PRESSURE2_ORDER_ITEM_REPORT_COMPLETED"."DELETED" IS '是否删除';
 COMMENT ON COLUMN "PRESSURE2_ORDER_ITEM_REPORT_COMPLETED"."EQUIP_MAIN_TYPE" IS '设备类别';
 
+--20250515
+CREATE TABLE "PRESSURE2_USE_SIGN_REPORT"
+(
+    "ID" VARCHAR(64) NOT NULL,
+    "TASK_ORDER_ID" VARCHAR(50),
+    "TEMPLATE_ID" VARCHAR(64),
+    "CREATOR" VARCHAR(64),
+    "CREATE_TIME" TIMESTAMP(6) NOT NULL,
+    "UPDATER" VARCHAR(64),
+    "UPDATE_TIME" TIMESTAMP(6) NOT NULL,
+    "DELETED" BIT NOT NULL,
+    "REPORT_NAME" VARCHAR(100),
+    "EQUIP_ID" VARCHAR(50),
+    "EQUIP_MAIN_TYPE" INTEGER,
+    "ORDER_ITEM_ID" VARCHAR(50),
+    NOT CLUSTER PRIMARY KEY("ID")) STORAGE(ON "MAIN", CLUSTERBTR) ;
+
+COMMENT ON TABLE "PRESSURE2_USE_SIGN_REPORT" IS '使用标志表';
+COMMENT ON COLUMN "PRESSURE2_USE_SIGN_REPORT"."ID" IS '主键';
+COMMENT ON COLUMN "PRESSURE2_USE_SIGN_REPORT"."TASK_ORDER_ID" IS '任务单号';
+COMMENT ON COLUMN "PRESSURE2_USE_SIGN_REPORT"."TEMPLATE_ID" IS '模板ID';
+COMMENT ON COLUMN "PRESSURE2_USE_SIGN_REPORT"."CREATOR" IS '创建人';
+COMMENT ON COLUMN "PRESSURE2_USE_SIGN_REPORT"."CREATE_TIME" IS '创建时间';
+COMMENT ON COLUMN "PRESSURE2_USE_SIGN_REPORT"."UPDATER" IS '修改人';
+COMMENT ON COLUMN "PRESSURE2_USE_SIGN_REPORT"."UPDATE_TIME" IS '修改时间';
+COMMENT ON COLUMN "PRESSURE2_USE_SIGN_REPORT"."DELETED" IS '是否删除';
+COMMENT ON COLUMN "PRESSURE2_USE_SIGN_REPORT"."REPORT_NAME" IS '报告名称';
+COMMENT ON COLUMN "PRESSURE2_USE_SIGN_REPORT"."EQUIP_ID" IS '设备ID';
+COMMENT ON COLUMN "PRESSURE2_USE_SIGN_REPORT"."EQUIP_MAIN_TYPE" IS '设备分类';
+COMMENT ON COLUMN "PRESSURE2_USE_SIGN_REPORT"."ORDER_ITEM_ID" IS '检验ID';
+
 

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

@@ -137,6 +137,8 @@ public interface ErrorCodeConstants{
 
     ErrorCode PIPE_USE_REGISTRATION_REPORT_NOT_EXISTS = new ErrorCode(1066, "管道使用登记不存在");
 
+    ErrorCode USE_SIGN_REPORT_NOT_EXISTS = new ErrorCode(1067, "使用标志不存在");
+
     ErrorCode EQUIP_BOILER_NOT_EXISTS = new ErrorCode(2000, "锅炉设备不存在");
 
     ErrorCode BOILER_EQUIP_OPERATION_RECORD_NOT_EXISTS = new ErrorCode(2001, "锅炉操作记录不存在");

+ 95 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/usesignreport/UseSignReportController.java

@@ -0,0 +1,95 @@
+package cn.start.tz.module.pressure2.controller.admin.usesignreport;
+
+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.usesignreport.vo.*;
+import cn.start.tz.module.pressure2.dal.dataobject.usesignreport.UseSignReportDO;
+import cn.start.tz.module.pressure2.service.usesignreport.UseSignReportService;
+
+@Tag(name = "管理后台 - 使用标志")
+@RestController
+@RequestMapping("/pressure2/use-sign-report")
+@Validated
+public class UseSignReportController {
+
+    @Resource
+    private UseSignReportService useSignReportService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建使用标志")
+    @PreAuthorize("@ss.hasPermission('pressure2:use-sign-report:create')")
+    public CommonResult<String> createUseSignReport(@Valid @RequestBody UseSignReportSaveReqVO createReqVO) {
+        return success(useSignReportService.createUseSignReport(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新使用标志")
+    @PreAuthorize("@ss.hasPermission('pressure2:use-sign-report:update')")
+    public CommonResult<Boolean> updateUseSignReport(@Valid @RequestBody UseSignReportSaveReqVO updateReqVO) {
+        useSignReportService.updateUseSignReport(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除使用标志")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('pressure2:use-sign-report:delete')")
+    public CommonResult<Boolean> deleteUseSignReport(@RequestParam("id") String id) {
+        useSignReportService.deleteUseSignReport(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得使用标志")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('pressure2:use-sign-report:query')")
+    public CommonResult<UseSignReportRespVO> getUseSignReport(@RequestParam("id") String id) {
+        UseSignReportDO useSignReport = useSignReportService.getUseSignReport(id);
+        return success(BeanUtils.toBean(useSignReport, UseSignReportRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得使用标志分页")
+    @PreAuthorize("@ss.hasPermission('pressure2:use-sign-report:query')")
+    public CommonResult<PageResult<UseSignReportRespVO>> getUseSignReportPage(@Valid UseSignReportPageReqVO pageReqVO) {
+        PageResult<UseSignReportDO> pageResult = useSignReportService.getUseSignReportPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, UseSignReportRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出使用标志 Excel")
+    @PreAuthorize("@ss.hasPermission('pressure2:use-sign-report:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportUseSignReportExcel(@Valid UseSignReportPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<UseSignReportDO> list = useSignReportService.getUseSignReportPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "使用标志.xls", "数据", UseSignReportRespVO.class,
+                        BeanUtils.toBean(list, UseSignReportRespVO.class));
+    }
+
+}

+ 38 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/usesignreport/vo/UseSignReportPageReqVO.java

@@ -0,0 +1,38 @@
+package cn.start.tz.module.pressure2.controller.admin.usesignreport.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 UseSignReportPageReqVO extends PageParam {
+
+    @Schema(description = "任务单号", example = "32006")
+    private String taskOrderId;
+
+    @Schema(description = "模板ID", example = "26798")
+    private String templateId;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "报告名称", example = "赵六")
+    private String reportName;
+
+    @Schema(description = "设备ID", example = "16150")
+    private String equipId;
+
+    @Schema(description = "设备分类", example = "2")
+    private Integer equipMainType;
+
+    private String orderItemId;
+}

+ 45 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/usesignreport/vo/UseSignReportRespVO.java

@@ -0,0 +1,45 @@
+package cn.start.tz.module.pressure2.controller.admin.usesignreport.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 UseSignReportRespVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "30289")
+    @ExcelProperty("主键")
+    private String id;
+
+    @Schema(description = "任务单号", example = "32006")
+    @ExcelProperty("任务单号")
+    private String taskOrderId;
+
+    @Schema(description = "模板ID", example = "26798")
+    @ExcelProperty("模板ID")
+    private String templateId;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "报告名称", example = "赵六")
+    @ExcelProperty("报告名称")
+    private String reportName;
+
+    @Schema(description = "设备ID", example = "16150")
+    @ExcelProperty("设备ID")
+    private String equipId;
+
+    @Schema(description = "设备分类", example = "2")
+    @ExcelProperty("设备分类")
+    private Integer equipMainType;
+
+    private String orderItemId;
+
+}

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

@@ -0,0 +1,32 @@
+package cn.start.tz.module.pressure2.controller.admin.usesignreport.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 UseSignReportSaveReqVO {
+
+    @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "30289")
+    private String id;
+
+    @Schema(description = "任务单号", example = "32006")
+    private String taskOrderId;
+
+    @Schema(description = "模板ID", example = "26798")
+    private String templateId;
+
+    @Schema(description = "报告名称", example = "赵六")
+    private String reportName;
+
+    @Schema(description = "设备ID", example = "16150")
+    private String equipId;
+
+    @Schema(description = "设备分类", example = "2")
+    private Integer equipMainType;
+
+    private String orderItemId;
+
+}

+ 53 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/dal/dataobject/usesignreport/UseSignReportDO.java

@@ -0,0 +1,53 @@
+package cn.start.tz.module.pressure2.dal.dataobject.usesignreport;
+
+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_use_sign_report")
+@KeySequence("pressure2_use_sign_report_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UseSignReportDO extends BaseDO {
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    private String id;
+    /**
+     * 任务单号
+     */
+    private String taskOrderId;
+    /**
+     * 模板ID
+     */
+    private String templateId;
+    /**
+     * 报告名称
+     */
+    private String reportName;
+    /**
+     * 设备ID
+     */
+    private String equipId;
+    /**
+     * 设备分类
+     */
+    private Integer equipMainType;
+
+    private String orderItemId;
+
+}

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

@@ -0,0 +1,31 @@
+package cn.start.tz.module.pressure2.dal.mysql.usesignreport;
+
+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.usesignreport.UseSignReportDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.start.tz.module.pressure2.controller.admin.usesignreport.vo.*;
+
+/**
+ * 使用标志 Mapper
+ *
+ * @author 特种管理员
+ */
+@Mapper
+public interface UseSignReportMapper extends BaseMapperX<UseSignReportDO> {
+
+    default PageResult<UseSignReportDO> selectPage(UseSignReportPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<UseSignReportDO>()
+                .eqIfPresent(UseSignReportDO::getTaskOrderId, reqVO.getTaskOrderId())
+                .eqIfPresent(UseSignReportDO::getTemplateId, reqVO.getTemplateId())
+                .betweenIfPresent(UseSignReportDO::getCreateTime, reqVO.getCreateTime())
+                .likeIfPresent(UseSignReportDO::getReportName, reqVO.getReportName())
+                .eqIfPresent(UseSignReportDO::getEquipId, reqVO.getEquipId())
+                .eqIfPresent(UseSignReportDO::getEquipMainType, reqVO.getEquipMainType())
+                .orderByDesc(UseSignReportDO::getId));
+    }
+
+}

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

@@ -36,6 +36,9 @@ import cn.start.tz.module.pressure2.controller.admin.boilertaskorderitemreportve
 import cn.start.tz.module.pressure2.controller.admin.boilertaskordersignfile.vo.BoilerTaskOrderSignFilePageReqVO;
 import cn.start.tz.module.pressure2.controller.admin.boilertaskordersignfile.vo.BoilerTaskOrderSignFileRespVO;
 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.dal.dataobject.boilerconnecttbservice.BoilerConnectTbServiceDO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilerelectronicreportauditrecord.BoilerElectronicReportAuditRecordDO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorder.BoilerTaskOrderDO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderfollowrecord.BoilerTaskOrderFollowRecordDO;
@@ -46,8 +49,11 @@ import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitemreportuser
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitemuser.BoilerTaskOrderItemUserDO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderuser.BoilerTaskOrderUserDO;
 import cn.start.tz.module.pressure2.dal.dataobject.dynamictb.DynamicTbDO;
+import cn.start.tz.module.pressure2.dal.dataobject.dynamictbins.DynamicTbInsDO;
 import cn.start.tz.module.pressure2.dal.dataobject.equipboiler.EquipBoilerDO;
 import cn.start.tz.module.pressure2.dal.dataobject.reporttemplate.ReportTemplateDO;
+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;
 import cn.start.tz.module.pressure2.dal.mysql.boilertaskorder.BoilerTaskOrderMapper;
 import cn.start.tz.module.pressure2.dal.mysql.boilertaskorderfollowrecord.BoilerTaskOrderFollowRecordMapper;
@@ -61,11 +67,13 @@ import cn.start.tz.module.pressure2.dal.mysql.boilertaskorderuser.BoilerTaskOrde
 import cn.start.tz.module.pressure2.dal.mysql.dynamictb.DynamicTbMapper;
 import cn.start.tz.module.pressure2.dal.mysql.equipboiler.EquipBoilerMapper;
 import cn.start.tz.module.pressure2.dal.mysql.reporttemplate.ReportTemplateMapper;
+import cn.start.tz.module.pressure2.dal.mysql.usesignreport.UseSignReportMapper;
 import cn.start.tz.module.pressure2.framework.thread.CommonThread;
 import cn.start.tz.module.pressure2.service.boilertaskorder.BoilerTaskOrderService;
 import cn.start.tz.module.pressure2.service.boilertaskorderitemreportrecord.BoilerTaskOrderItemReportRecordService;
 import cn.start.tz.module.pressure2.service.boilertaskorderitemreportversion.BoilerTaskOrderItemReportVersionService;
 import cn.start.tz.module.pressure2.service.boilertaskordersignfile.BoilerTaskOrderSignFileService;
+import cn.start.tz.module.pressure2.service.dynamictbins.DynamicTbInsService;
 import cn.start.tz.module.pressure2.service.pdf.PdfService;
 import cn.start.tz.module.pressure2.util.JwApiClient;
 import cn.start.tz.module.pressure2.util.vo.ApiResponse;
@@ -87,9 +95,11 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.Lists;
 import com.grapecity.documents.excel.cn;
+import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.Valid;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.pdfbox.multipdf.PDFMergerUtility;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import jakarta.annotation.Resource;
@@ -100,6 +110,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import java.io.*;
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
@@ -175,6 +187,15 @@ public class BoilerTaskOrderIssueReportServiceImpl extends ServiceImpl<BoilerTas
     @Resource
     private BoilerTaskOrderMapper taskOrderMapper;
 
+    @Resource
+    private UseSignReportMapper useSignReportMapper;
+
+    @Resource
+    private BoilerConnectTbServiceMapper boilerConnectTbServiceMapper;
+
+    @Resource
+    private DynamicTbInsService dynamicTbInsService;
+
     @Resource
     private DynamicTbMapper dynamicTbMapper;
 
@@ -769,17 +790,20 @@ public class BoilerTaskOrderIssueReportServiceImpl extends ServiceImpl<BoilerTas
         }
 
         EquipBoilerDO equipBoilerDO = equipBoilerMapper.selectOne(new LambdaQueryWrapperX<EquipBoilerDO>().
-                eq(EquipBoilerDO::getEquipCode, taskOrderItemDO.getEquipCode()), false);
+                eq(EquipBoilerDO::getId, taskOrderItemDO.getEquipId()), false);
+        if(equipBoilerDO == null){
+            throw exception0(502,"设备不存在");
+        }
 
-        ReportTemplateDO reportTemplateDO = reportTemplateMapper.selectOne(new LambdaQueryWrapperX<ReportTemplateDO>().
-                eq(ReportTemplateDO::getName, "压力容器使用标志"), false);
-        if (reportTemplateDO == null){
-            throw exception0(502,"模版不存在");
+        DynamicTbDO dynamicTbDO = dynamicTbMapper.selectOne(new LambdaQueryWrapperX<DynamicTbDO>().
+                eq(DynamicTbDO::getTbName, "设备使用标志"), false);
+        if (dynamicTbDO == null){
+            throw exception0(503,"模版不存在");
         }
 
         String useRegisterNo = equipBoilerDO.getUseRegisterNo();
         if(useRegisterNo.equals("-") || useRegisterNo.equals("未领证") || useRegisterNo.equals("未办证") || StringUtils.isBlank(useRegisterNo)){
-            throw exception0(503,"使用登记证为空,不能生成使用标志");
+            throw exception0(504,"使用登记证为空,不能生成使用标志");
         }
 
         if(StringUtils.isNotBlank(taskOrderItemDO.getUseLogo()) && fileType == 100){
@@ -790,98 +814,72 @@ public class BoilerTaskOrderIssueReportServiceImpl extends ServiceImpl<BoilerTas
             return byteArrayOutputStream;
         }
 
-        //实体
-        Map<String,String> dataMap = new HashMap<>();
-
-        String equipCategory = "";
-        DictDataRespDTO boilerTypeDTO = dictDataApi.getDictData("system_equip_boiler_type",equipBoilerDO.getType().toString()).getData();
-        if (boilerTypeDTO != null){
-            equipCategory = boilerTypeDTO.getLabel();
-        }
-        //String equipType = loadByDict("system_equip_container_equip_type", equipContainerDO.getEquipType());
-        dataMap.put("equipmentType","锅炉");
-        dataMap.put("equipCategory",equipCategory);
-        dataMap.put("unitName",equipBoilerDO.getUnitName());
-//        dataMap.put("unitInnerNo",equipBoilerDO.getUnitInnerNo());
-        dataMap.put("equipCode",equipBoilerDO.getEquipCode());
-        dataMap.put("useRegisterNo",useRegisterNo);
-        // 查询主报告
-
-        BoilerTaskOrderItemReportDO mainReport = taskOrderItemReportMapper.selectOne(new LambdaQueryWrapperX<BoilerTaskOrderItemReportDO>().
-                        eq(BoilerTaskOrderItemReportDO::getOrderItemId,id).
-                        eq(BoilerTaskOrderItemReportDO::getReportType, 100).
-                        eq(BoilerTaskOrderItemReportDO::getTaskStatus, TaskOrderStatusEnum.REPORT_FINISH.getStatus())
-                , false);
-        if(mainReport == null){
-            throw exception0(501,"");
-        }
-        String nextCheckDate = JsonUtils.getHandleDateValue(mainReport.getPrepareJson(), "nextCheckDate");
-        if(StringUtils.isNotBlank(nextCheckDate)){
-            // 2026年1月1日 -> 2026年1月 (只保留年月部分)
-            try{
-                DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy年M月d日");
-                DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy年M月");
-
-                LocalDate date = LocalDate.parse(nextCheckDate, inputFormatter);
-                String yearMonth = date.format(outputFormatter);
-                dataMap.put("nextCheckDate", yearMonth);
-            } catch (Exception e) {
-                dataMap.put("nextCheckDate", nextCheckDate);
-            }
-        }
+        UseSignReportDO signReportDO = new UseSignReportDO();
+        signReportDO.setTemplateId(dynamicTbDO.getId());
+        signReportDO.setReportName(dynamicTbDO.getTbName());
+        signReportDO.setTaskOrderId(taskOrderItemDO.getOrderId());
+        signReportDO.setOrderItemId(taskOrderItemDO.getId());
+        signReportDO.setEquipId(equipBoilerDO.getId());
+        signReportDO.setEquipMainType(200);
+        useSignReportMapper.insert(signReportDO);
 
-        String dataJson = objectMapper.writeValueAsString(dataMap);
+        //生成报表
+        CreateInstantiateWithRuleVO ruleVO = new CreateInstantiateWithRuleVO();
+        ruleVO.setTemplateId(dynamicTbDO.getId());
+        ruleVO.setRefId(signReportDO.getId());
+        ruleVO.setReportType(1);
+        //获取tbCode的服务方法名
+        BoilerConnectTbServiceDO tbServiceDO = boilerConnectTbServiceMapper.selectOne(BoilerConnectTbServiceDO::getTbId,dynamicTbDO.getId());
+        String instanceId = "";
+        if (tbServiceDO != null){
+            ruleVO.setServiceName(tbServiceDO.getInitServiceName());
+            DynamicTbInsDO instantiateWithRule = dynamicTbInsService.createInstantiateWithRule(ruleVO);
+            instanceId = instantiateWithRule.getId();
+        }else{
+            ruleVO.setServiceName("");
+            DynamicTbInsDO instantiateWithRule = dynamicTbInsService.createInstantiateWithRule(ruleVO);
+            instanceId = instantiateWithRule.getId();
+        }
 
-        byte[] bytes = fileApi.getFileByPath(reportTemplateDO.getRecordTemplateUrl()).getCheckedData();
-        GrapeCityReqDTO grapeCityReqDTO = new GrapeCityReqDTO();
-        grapeCityReqDTO.setCode(TEMPLATE_NON_TAX);
+        if (instanceId == null || instanceId.isEmpty()){
+            throw exception0(504,"生成使用标志表单失败");
+        }
 
-        grapeCityReqDTO.setTemplateBytes(bytes);
-        grapeCityReqDTO.setDataJson(dataJson);
-        // 根据 fileType 设置是否生成 PDF (100=PDF, 200=图片)
-        grapeCityReqDTO.setIsPdf(fileType == 100);
-        grapeCityReqDTO.setIsImage(fileType == 200);
+        byte[] pdf = pdfService.pdf(dynamicTbDO.getId(), instanceId);
 
         String qrcode = String.format("https://yudao-h5.hofo.co/mp/pagesSub/reportInfoList/index?id=%s&type=0",id);
         if(env.equals("uat")){
             qrcode = String.format("https://tjt.gzsei.cn/mp/pagesSub/reportInfoList/index?id=%s&type=0",id);
         }
-//        if(StringUtils.isNotBlank(qrcode)){
-//            ByteArrayOutputStream byteArrayOutputStream = ImageUtils.generateQRCode(qrcode, 80, 80);
-//            grapeCityReqDTO.setImageData(byteArrayOutputStream.toByteArray());
-//        }
-//        grapeCityReqDTO.setImageWidth(53);
-//        grapeCityReqDTO.setImageHeight(50);
-        grapeCityReqDTO.setIsShrinkToFit(false);
-        bytes = grapeCityApi.getByteArrayOutputStream(grapeCityReqDTO).getData();
-        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-        byteArrayOutputStream.write(bytes);
 
-        byte[] resultByte = bytes;
-        try {
-            List<SignValuesDTO> valuesDTOList = Lists.newArrayList();
-            SignValuesDTO valuesDTO1 = new SignValuesDTO();
-            valuesDTO1.setSealType("JYZ");
-            valuesDTO1.setTextonce(0);
-            valuesDTO1.setText("机构公章或");
-            valuesDTOList.add(valuesDTO1);
-
-            QrCodeValuesDTO qrCodeValuesDTO = new QrCodeValuesDTO();
-            qrCodeValuesDTO.setMetaname("特检院相关二维码");
-            qrCodeValuesDTO.setTextval(qrcode);
-            qrCodeValuesDTO.setPageno("1");
-            qrCodeValuesDTO.setWidth(71);
-            qrCodeValuesDTO.setHeight(71);
-            qrCodeValuesDTO.setX("441");
-            qrCodeValuesDTO.setY("568");
-
-            resultByte = this.sign(bytes, valuesDTOList, qrCodeValuesDTO);
-            log.info("签章成功");
-            byteArrayOutputStream = new ByteArrayOutputStream();
-            byteArrayOutputStream.write(resultByte);
-        } catch (Exception e) {
-            log.error("签章异常, 记录ID: {}, 错误信息: {}", id, e.getMessage(), e);
-        }
+        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+        byteArrayOutputStream.write(pdf);
+
+        byte[] resultByte = pdf;
+//        try {
+//            List<SignValuesDTO> valuesDTOList = Lists.newArrayList();
+//            SignValuesDTO valuesDTO1 = new SignValuesDTO();
+//            valuesDTO1.setSealType("JYZ");
+//            valuesDTO1.setTextonce(0);
+//            valuesDTO1.setText("机构公章或");
+//            valuesDTOList.add(valuesDTO1);
+//
+//            QrCodeValuesDTO qrCodeValuesDTO = new QrCodeValuesDTO();
+//            qrCodeValuesDTO.setMetaname("特检院相关二维码");
+//            qrCodeValuesDTO.setTextval(qrcode);
+//            qrCodeValuesDTO.setPageno("1");
+//            qrCodeValuesDTO.setWidth(71);
+//            qrCodeValuesDTO.setHeight(71);
+//            qrCodeValuesDTO.setX("441");
+//            qrCodeValuesDTO.setY("568");
+//
+//            resultByte = this.sign(pdf, valuesDTOList, qrCodeValuesDTO);
+//            log.info("签章成功");
+//            byteArrayOutputStream = new ByteArrayOutputStream();
+//            byteArrayOutputStream.write(resultByte);
+//        } catch (Exception e) {
+//            log.error("签章异常, 记录ID: {}, 错误信息: {}", id, e.getMessage(), e);
+//        }
 
         if(fileType == 100){
             String filePath = fileApi.createFile(resultByte);

+ 126 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/dynamicOFData/comm/SBSYBZOFData.java

@@ -0,0 +1,126 @@
+package cn.start.tz.module.pressure2.service.dynamicOFData.comm;
+
+import cn.start.tz.framework.ip.core.utils.AreaUtils;
+import cn.start.tz.module.pressure2.controller.admin.dynamictbins.vo.CreateInstantiateWithRuleVO;
+import cn.start.tz.module.pressure2.controller.admin.equipboiler.vo.EquipBoilerReportVO;
+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.boilertaskordersignfile.BoilerTaskOrderSignFileDO;
+import cn.start.tz.module.pressure2.dal.dataobject.equippipe.EquipPipeDO;
+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.usesignreport.UseSignReportDO;
+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.boilertaskorderitemreport.BoilerTaskOrderItemReportMapper;
+import cn.start.tz.module.pressure2.dal.mysql.equipboiler.EquipBoilerMapper;
+import cn.start.tz.module.pressure2.dal.mysql.equippipe.EquipPipeMapper;
+import cn.start.tz.module.pressure2.dal.mysql.pipetaskorderitem.PipeTaskOrderItemMapper;
+import cn.start.tz.module.pressure2.dal.mysql.pipetaskorderitemreport.PipeTaskOrderItemReportMapper;
+import cn.start.tz.module.pressure2.dal.mysql.usesignreport.UseSignReportMapper;
+import cn.start.tz.module.pressure2.service.boilertaskorder.BoilerTaskOrderService;
+import cn.start.tz.module.pressure2.service.boilertaskordersignfile.BoilerTaskOrderSignFileService;
+import cn.start.tz.module.pressure2.service.dynamicOFData.IDynamicOFData;
+import cn.start.tz.module.system.api.clientunit.ClientUnitApi;
+import cn.start.tz.module.system.api.clientunit.dto.ClientUnitDTO;
+import cn.start.tz.module.system.api.dict.DictDataApi;
+import cn.start.tz.module.system.api.dict.dto.DictDataRespDTO;
+import cn.start.tz.module.system.api.user.AdminUserApi;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+/**
+ * 设备使用标志
+ * */
+@Service("SBSYBZOFData")
+public class SBSYBZOFData implements IDynamicOFData {
+
+    @Resource
+    private EquipBoilerMapper equipBoilerMapper;
+
+    @Resource
+    private EquipPipeMapper equipPipeMapper;
+
+    @Resource
+    private PipeTaskOrderItemReportMapper pipeTaskOrderItemReportMapper;
+
+    @Resource
+    private PipeTaskOrderItemMapper pipeTaskOrderItemMapper;
+
+    @Resource
+    private DictDataApi dictDataApi;
+
+    @Resource
+    private UseSignReportMapper useSignReportMapper;
+
+    @Override
+    public JSONObject getOFData(JSONObject params) {
+        return null;
+    }
+
+    @Override
+    public JSONObject getOfDataByVO(CreateInstantiateWithRuleVO ruleVO) {
+
+        //日期格式
+        DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy年MM月");
+
+        //设备报表ID
+        String refId = ruleVO.getRefId();
+        JSONObject result = new JSONObject();
+
+        UseSignReportDO useSignReportDO = useSignReportMapper.selectById(refId);
+
+        if (useSignReportDO != null){
+
+            if (useSignReportDO.getEquipMainType() == 200){
+
+                EquipBoilerReportVO equipBoilerDO = equipBoilerMapper.selectDetailsById(useSignReportDO.getEquipId());
+                if (equipBoilerDO != null){
+                    //设备信息
+                    result.put("equipmentType", "锅炉");
+                    DictDataRespDTO boilerTypeDTO = dictDataApi.getDictData("system_equip_boiler_type",equipBoilerDO.getType().toString()).getData();
+                    if (boilerTypeDTO != null){
+                        result.put("equipCategory",boilerTypeDTO.getLabel());
+                    }
+                    result.put("unitName",equipBoilerDO.getUnitName());
+                    result.put("unitInnerNo",equipBoilerDO.getUnitCode());
+                    result.put("equipCode",equipBoilerDO.getEquipCode());
+                    result.put("useRegisterNo",equipBoilerDO.getUseRegisterNo());
+                    if (equipBoilerDO.getNextInCheckDate() != null){
+                        result.put("nextCheckDate",equipBoilerDO.getNextInCheckDate().format(dateFormat));
+                    }
+
+                }
+
+            }else if (useSignReportDO.getEquipMainType() == 300){
+
+                EquipPipeDO equipPipeDO = equipPipeMapper.selectById(useSignReportDO.getEquipId());
+                if (equipPipeDO != null){
+                    //设备信息
+                    result.put("equipmentType", "管道");
+                    DictDataRespDTO boilerTypeDTO = dictDataApi.getDictData("PIPE_TYPE",equipPipeDO.getPipeCategory()).getData();
+                    if (boilerTypeDTO != null){
+                        result.put("equipCategory",boilerTypeDTO.getLabel());
+                    }
+                    result.put("unitName",equipPipeDO.getUnitName());
+                    result.put("unitInnerNo",equipPipeDO.getUnitCode());
+                    result.put("equipCode",equipPipeDO.getProjectNo());
+                    result.put("useRegisterNo",equipPipeDO.getCertificateNo());
+                    if (equipPipeDO.getNextLegalCheckDate() != null){
+                        result.put("nextCheckDate",equipPipeDO.getNextLegalCheckDate().format(dateFormat));
+                    }
+                }
+            }
+
+        }
+
+        return result;
+
+    }
+}

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

@@ -32,16 +32,19 @@ import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.BoilerTa
 import cn.start.tz.module.pressure2.controller.admin.boilertaskordersignfile.vo.BoilerTaskOrderSignFilePageReqVO;
 import cn.start.tz.module.pressure2.controller.admin.boilertaskordersignfile.vo.BoilerTaskOrderSignFileRespVO;
 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.pipetaskorder.vo.*;
 import cn.start.tz.module.pressure2.controller.admin.pipetaskorderfollowrecord.vo.PipeTaskOrderFollowRecordRespVO;
 import cn.start.tz.module.pressure2.controller.admin.pipetaskorderitemreportrecord.vo.PipeTaskOrderItemReportRecordPageReqVO;
 import cn.start.tz.module.pressure2.controller.admin.pipetaskorderitemreportrecord.vo.PipeTaskOrderItemReportRecordRespVO;
 import cn.start.tz.module.pressure2.controller.admin.pipetaskorderitemreportversion.vo.PipeTaskOrderItemReportVersionPageReqVO;
 import cn.start.tz.module.pressure2.controller.admin.pipetaskorderitemreportversion.vo.PipeTaskOrderItemReportVersionRespVO;
+import cn.start.tz.module.pressure2.dal.dataobject.boilerconnecttbservice.BoilerConnectTbServiceDO;
 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.dynamictb.DynamicTbDO;
+import cn.start.tz.module.pressure2.dal.dataobject.dynamictbins.DynamicTbInsDO;
 import cn.start.tz.module.pressure2.dal.dataobject.equipboiler.EquipBoilerDO;
 import cn.start.tz.module.pressure2.dal.dataobject.equippipe.EquipPipeDO;
 import cn.start.tz.module.pressure2.dal.dataobject.pipeelectronicreportauditrecord.PipeElectronicReportAuditRecordDO;
@@ -55,6 +58,8 @@ import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderitemreportuser.P
 import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderitemuser.PipeTaskOrderItemUserDO;
 import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderuser.PipeTaskOrderUserDO;
 import cn.start.tz.module.pressure2.dal.dataobject.reporttemplate.ReportTemplateDO;
+import cn.start.tz.module.pressure2.dal.dataobject.usesignreport.UseSignReportDO;
+import cn.start.tz.module.pressure2.dal.mysql.boilerconnecttbservice.BoilerConnectTbServiceMapper;
 import cn.start.tz.module.pressure2.dal.mysql.dynamictb.DynamicTbMapper;
 import cn.start.tz.module.pressure2.dal.mysql.equippipe.EquipPipeMapper;
 import cn.start.tz.module.pressure2.dal.mysql.pipeelectronicreportauditrecord.PipeElectronicReportAuditRecordMapper;
@@ -69,9 +74,11 @@ import cn.start.tz.module.pressure2.dal.mysql.pipetaskorderitemreportuser.PipeTa
 import cn.start.tz.module.pressure2.dal.mysql.pipetaskorderitemuser.PipeTaskOrderItemUserMapper;
 import cn.start.tz.module.pressure2.dal.mysql.pipetaskorderuser.PipeTaskOrderUserMapper;
 import cn.start.tz.module.pressure2.dal.mysql.reporttemplate.ReportTemplateMapper;
+import cn.start.tz.module.pressure2.dal.mysql.usesignreport.UseSignReportMapper;
 import cn.start.tz.module.pressure2.framework.thread.CommonThread;
 import cn.start.tz.module.pressure2.service.boilertaskorderissuereport.BoilerTaskOrderIssueReportServiceImpl;
 import cn.start.tz.module.pressure2.service.boilertaskordersignfile.BoilerTaskOrderSignFileService;
+import cn.start.tz.module.pressure2.service.dynamictbins.DynamicTbInsService;
 import cn.start.tz.module.pressure2.service.pdf.PdfService;
 import cn.start.tz.module.pressure2.service.pipetaskorder.PipeTaskOrderService;
 import cn.start.tz.module.pressure2.service.pipetaskorderitemreportrecord.PipeTaskOrderItemReportRecordService;
@@ -178,6 +185,15 @@ public class PipeTaskOrderIssueReportServiceImpl extends ServiceImpl<PipeTaskOrd
     @Resource
     private PipeTaskOrderItemReportUserMapper taskOrderItemReportUserMapper;
 
+    @Resource
+    private UseSignReportMapper useSignReportMapper;
+
+    @Resource
+    private BoilerConnectTbServiceMapper boilerConnectTbServiceMapper;
+
+    @Resource
+    private DynamicTbInsService dynamicTbInsService;
+
     @Resource
     private EquipPipeMapper equipPipeMapper;
 
@@ -780,17 +796,20 @@ public class PipeTaskOrderIssueReportServiceImpl extends ServiceImpl<PipeTaskOrd
         }
 
         EquipPipeDO equipPipeDO = equipPipeMapper.selectOne(new LambdaQueryWrapperX<EquipPipeDO>().
-                eq(EquipPipeDO::getProjectNo, taskOrderItemDO.getEquipCode()), false);
+                eq(EquipPipeDO::getId, taskOrderItemDO.getEquipId()), false);
+        if(equipPipeDO == null){
+            throw exception0(502,"设备不存在");
+        }
 
-        ReportTemplateDO reportTemplateDO = reportTemplateMapper.selectOne(new LambdaQueryWrapperX<ReportTemplateDO>().
-                eq(ReportTemplateDO::getName, "压力容器使用标志"), false);
-        if (reportTemplateDO == null){
-            throw exception0(502,"模版不存在");
+        DynamicTbDO dynamicTbDO = dynamicTbMapper.selectOne(new LambdaQueryWrapperX<DynamicTbDO>().
+                eq(DynamicTbDO::getTbName, "设备使用标志"), false);
+        if (dynamicTbDO == null){
+            throw exception0(503,"模版不存在");
         }
 
         String useRegisterNo = equipPipeDO.getCertificateNo();
         if(useRegisterNo.equals("-") || useRegisterNo.equals("未领证") || useRegisterNo.equals("未办证") || StringUtils.isBlank(useRegisterNo)){
-            throw exception0(503,"使用登记证为空,不能生成使用标志");
+            throw exception0(504,"使用登记证为空,不能生成使用标志");
         }
 
         if(StringUtils.isNotBlank(taskOrderItemDO.getUseLogo()) && fileType == 100){
@@ -801,98 +820,73 @@ public class PipeTaskOrderIssueReportServiceImpl extends ServiceImpl<PipeTaskOrd
             return byteArrayOutputStream;
         }
 
-        //实体
-        Map<String,String> dataMap = new HashMap<>();
-
-        String equipCategory = "";
-        DictDataRespDTO pipeTypeDTO = dictDataApi.getDictData("PIPE_TYPE",equipPipeDO.getPipeCategory().toString()).getData();
-        if (pipeTypeDTO != null){
-            equipCategory = pipeTypeDTO.getLabel();
-        }
-        //String equipType = loadByDict("system_equip_container_equip_type", equipContainerDO.getEquipType());
-        dataMap.put("equipmentType","管道");
-        dataMap.put("equipCategory",equipCategory);
-        dataMap.put("unitName",equipPipeDO.getUnitName());
-//        dataMap.put("unitInnerNo",equipPipeDO.getUnitInnerNo());
-        dataMap.put("equipCode",equipPipeDO.getProjectNo());
-        dataMap.put("useRegisterNo",useRegisterNo);
-        // 查询主报告
-
-        PipeTaskOrderItemReportDO mainReport = taskOrderItemReportMapper.selectOne(new LambdaQueryWrapperX<PipeTaskOrderItemReportDO>().
-                        eq(PipeTaskOrderItemReportDO::getOrderId,taskOrderItemDO.getOrderId()).
-                        eq(PipeTaskOrderItemReportDO::getReportType, 100).
-                        eq(PipeTaskOrderItemReportDO::getTaskStatus, TaskOrderStatusEnum.REPORT_FINISH.getStatus())
-                , false);
-        if(mainReport == null){
-            throw exception0(501,"");
-        }
-        String nextCheckDate = JsonUtils.getHandleDateValue(mainReport.getPrepareJson(), "nextCheckDate");
-        if(StringUtils.isNotBlank(nextCheckDate)){
-            // 2026年1月1日 -> 2026年1月 (只保留年月部分)
-            try{
-                DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy年M月d日");
-                DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy年M月");
-
-                LocalDate date = LocalDate.parse(nextCheckDate, inputFormatter);
-                String yearMonth = date.format(outputFormatter);
-                dataMap.put("nextCheckDate", yearMonth);
-            } catch (Exception e) {
-                dataMap.put("nextCheckDate", nextCheckDate);
-            }
-        }
+        UseSignReportDO signReportDO = new UseSignReportDO();
+        signReportDO.setTemplateId(dynamicTbDO.getId());
+        signReportDO.setReportName(dynamicTbDO.getTbName());
+        signReportDO.setTaskOrderId(taskOrderItemDO.getOrderId());
+        signReportDO.setOrderItemId(taskOrderItemDO.getId());
+        signReportDO.setEquipId(equipPipeDO.getId());
+        signReportDO.setEquipMainType(300);
+        useSignReportMapper.insert(signReportDO);
 
-        String dataJson = objectMapper.writeValueAsString(dataMap);
+        //生成报表
+        CreateInstantiateWithRuleVO ruleVO = new CreateInstantiateWithRuleVO();
+        ruleVO.setTemplateId(dynamicTbDO.getId());
+        ruleVO.setRefId(signReportDO.getId());
+        ruleVO.setReportType(1);
+        //获取tbCode的服务方法名
+        BoilerConnectTbServiceDO tbServiceDO = boilerConnectTbServiceMapper.selectOne(BoilerConnectTbServiceDO::getTbId,dynamicTbDO.getId());
+        String instanceId = "";
+        if (tbServiceDO != null){
+            ruleVO.setServiceName(tbServiceDO.getInitServiceName());
+            DynamicTbInsDO instantiateWithRule = dynamicTbInsService.createInstantiateWithRule(ruleVO);
+            instanceId = instantiateWithRule.getId();
+        }else{
+            ruleVO.setServiceName("");
+            DynamicTbInsDO instantiateWithRule = dynamicTbInsService.createInstantiateWithRule(ruleVO);
+            instanceId = instantiateWithRule.getId();
+        }
 
-        byte[] bytes = fileApi.getFileByPath(reportTemplateDO.getRecordTemplateUrl()).getCheckedData();
-        GrapeCityReqDTO grapeCityReqDTO = new GrapeCityReqDTO();
-        grapeCityReqDTO.setCode(TEMPLATE_NON_TAX);
+        if (instanceId == null || instanceId.isEmpty()){
+            throw exception0(504,"生成使用标志表单失败");
+        }
 
-        grapeCityReqDTO.setTemplateBytes(bytes);
-        grapeCityReqDTO.setDataJson(dataJson);
-        // 根据 fileType 设置是否生成 PDF (100=PDF, 200=图片)
-        grapeCityReqDTO.setIsPdf(fileType == 100);
-        grapeCityReqDTO.setIsImage(fileType == 200);
+        byte[] pdf = pdfService.pdf(dynamicTbDO.getId(), instanceId);
 
         String qrcode = String.format("https://yudao-h5.hofo.co/mp/pagesSub/reportInfoList/index?id=%s&type=0",id);
         if(env.equals("uat")){
             qrcode = String.format("https://tjt.gzsei.cn/mp/pagesSub/reportInfoList/index?id=%s&type=0",id);
         }
-//        if(StringUtils.isNotBlank(qrcode)){
-//            ByteArrayOutputStream byteArrayOutputStream = ImageUtils.generateQRCode(qrcode, 80, 80);
-//            grapeCityReqDTO.setImageData(byteArrayOutputStream.toByteArray());
-//        }
-//        grapeCityReqDTO.setImageWidth(53);
-//        grapeCityReqDTO.setImageHeight(50);
-        grapeCityReqDTO.setIsShrinkToFit(false);
-        bytes = grapeCityApi.getByteArrayOutputStream(grapeCityReqDTO).getData();
-        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-        byteArrayOutputStream.write(bytes);
 
-        byte[] resultByte = bytes;
-        try {
-            List<SignValuesDTO> valuesDTOList = Lists.newArrayList();
-            SignValuesDTO valuesDTO1 = new SignValuesDTO();
-            valuesDTO1.setSealType("JYZ");
-            valuesDTO1.setTextonce(0);
-            valuesDTO1.setText("机构公章或");
-            valuesDTOList.add(valuesDTO1);
-
-            QrCodeValuesDTO qrCodeValuesDTO = new QrCodeValuesDTO();
-            qrCodeValuesDTO.setMetaname("特检院相关二维码");
-            qrCodeValuesDTO.setTextval(qrcode);
-            qrCodeValuesDTO.setPageno("1");
-            qrCodeValuesDTO.setWidth(71);
-            qrCodeValuesDTO.setHeight(71);
-            qrCodeValuesDTO.setX("441");
-            qrCodeValuesDTO.setY("568");
-
-            resultByte = this.sign(bytes, valuesDTOList, qrCodeValuesDTO);
-            log.info("签章成功");
-            byteArrayOutputStream = new ByteArrayOutputStream();
-            byteArrayOutputStream.write(resultByte);
-        } catch (Exception e) {
-            log.error("签章异常, 记录ID: {}, 错误信息: {}", id, e.getMessage(), e);
-        }
+        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+        byteArrayOutputStream.write(pdf);
+
+        byte[] resultByte = pdf;
+
+//        try {
+//            List<SignValuesDTO> valuesDTOList = Lists.newArrayList();
+//            SignValuesDTO valuesDTO1 = new SignValuesDTO();
+//            valuesDTO1.setSealType("JYZ");
+//            valuesDTO1.setTextonce(0);
+//            valuesDTO1.setText("机构公章或");
+//            valuesDTOList.add(valuesDTO1);
+//
+//            QrCodeValuesDTO qrCodeValuesDTO = new QrCodeValuesDTO();
+//            qrCodeValuesDTO.setMetaname("特检院相关二维码");
+//            qrCodeValuesDTO.setTextval(qrcode);
+//            qrCodeValuesDTO.setPageno("1");
+//            qrCodeValuesDTO.setWidth(71);
+//            qrCodeValuesDTO.setHeight(71);
+//            qrCodeValuesDTO.setX("441");
+//            qrCodeValuesDTO.setY("568");
+//
+//            resultByte = this.sign(pdf, valuesDTOList, qrCodeValuesDTO);
+//            log.info("签章成功");
+//            byteArrayOutputStream = new ByteArrayOutputStream();
+//            byteArrayOutputStream.write(resultByte);
+//        } catch (Exception e) {
+//            log.error("签章异常, 记录ID: {}, 错误信息: {}", id, e.getMessage(), e);
+//        }
 
         if(fileType == 100){
             String filePath = fileApi.createFile(resultByte);

+ 56 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/usesignreport/UseSignReportService.java

@@ -0,0 +1,56 @@
+package cn.start.tz.module.pressure2.service.usesignreport;
+
+import java.util.*;
+import jakarta.validation.*;
+import cn.start.tz.module.pressure2.controller.admin.usesignreport.vo.*;
+import cn.start.tz.module.pressure2.dal.dataobject.usesignreport.UseSignReportDO;
+import cn.start.tz.framework.common.pojo.PageResult;
+import cn.start.tz.framework.common.pojo.PageParam;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * 使用标志 Service 接口
+ *
+ * @author 特种管理员
+ */
+public interface UseSignReportService extends IService<UseSignReportDO>  {
+
+    /**
+     * 创建使用标志
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    String createUseSignReport(@Valid UseSignReportSaveReqVO createReqVO);
+
+    /**
+     * 更新使用标志
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateUseSignReport(@Valid UseSignReportSaveReqVO updateReqVO);
+
+    /**
+     * 删除使用标志
+     *
+     * @param id 编号
+     */
+    void deleteUseSignReport(String id);
+
+    /**
+     * 获得使用标志
+     *
+     * @param id 编号
+     * @return 使用标志
+     */
+    UseSignReportDO getUseSignReport(String id);
+
+    /**
+     * 获得使用标志分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 使用标志分页
+     */
+    PageResult<UseSignReportDO> getUseSignReportPage(UseSignReportPageReqVO pageReqVO);
+
+}

+ 75 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/usesignreport/UseSignReportServiceImpl.java

@@ -0,0 +1,75 @@
+package cn.start.tz.module.pressure2.service.usesignreport;
+
+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.usesignreport.vo.*;
+import cn.start.tz.module.pressure2.dal.dataobject.usesignreport.UseSignReportDO;
+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.usesignreport.UseSignReportMapper;
+
+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 UseSignReportServiceImpl extends ServiceImpl<UseSignReportMapper, UseSignReportDO> implements UseSignReportService {
+
+    @Resource
+    private UseSignReportMapper useSignReportMapper;
+
+    @Override
+    public String createUseSignReport(UseSignReportSaveReqVO createReqVO) {
+        // 插入
+        UseSignReportDO useSignReport = BeanUtils.toBean(createReqVO, UseSignReportDO.class);
+        useSignReportMapper.insert(useSignReport);
+        // 返回
+        return useSignReport.getId();
+    }
+
+    @Override
+    public void updateUseSignReport(UseSignReportSaveReqVO updateReqVO) {
+        // 校验存在
+        validateUseSignReportExists(updateReqVO.getId());
+        // 更新
+        UseSignReportDO updateObj = BeanUtils.toBean(updateReqVO, UseSignReportDO.class);
+        useSignReportMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteUseSignReport(String id) {
+        // 校验存在
+        validateUseSignReportExists(id);
+        // 删除
+        useSignReportMapper.deleteById(id);
+    }
+
+    private void validateUseSignReportExists(String id) {
+        if (useSignReportMapper.selectById(id) == null) {
+            throw exception(USE_SIGN_REPORT_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public UseSignReportDO getUseSignReport(String id) {
+        return useSignReportMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<UseSignReportDO> getUseSignReportPage(UseSignReportPageReqVO pageReqVO) {
+        return useSignReportMapper.selectPage(pageReqVO);
+    }
+
+}

+ 12 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/resources/mapper/usesignreport/UseSignReportMapper.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.usesignreport.UseSignReportMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
+     -->
+
+</mapper>