ソースを参照

feat(synchronization): 添加按注册号和项目号同步锅炉管道功能

- 在SynchronizationService接口中修改boiler和pipe方法,添加REGISTERNO和PROJECT_NO参数
- 修改SynchronizationController控制器,添加带路径参数的GET请求映射
- 更新定时任务UpdateEquipJob中对同步服务方法的调用
- 在SynchronizationServiceImpl实现类中添加条件查询逻辑
- 移除并行流处理改为普通流处理
- 在PDF服务中扩展fullPdf方法签名以支持模板和实例参数
- 添加动态表格服务注入和续页配置处理逻辑
- 在动态表格插入操作中清空ID字段避免主键冲突
xuzhancheng 4 日 前
コミット
642b3f8b12

+ 13 - 2
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/synchronization/SynchronizationController.java

@@ -20,15 +20,26 @@ public class SynchronizationController {
     @Resource
     private SynchronizationService synchronizationService;
 
+    @GetMapping("/boiler/{REGISTERNO}")
+    public CommonResult<Object> boiler(@PathVariable String REGISTERNO) {
+        synchronizationService.boiler(null, REGISTERNO);
+        return CommonResult.success(null);
+    }
+
+    @GetMapping("/pipe/{PROJECT_NO}")
+    public CommonResult<Object> pipe(@PathVariable String PROJECT_NO) {
+        synchronizationService.pipe(null, PROJECT_NO);
+        return CommonResult.success(null);
+    }
     @GetMapping("/boiler")
     public CommonResult<Object> boiler() {
-        synchronizationService.boiler(null);
+        synchronizationService.boiler(null, null);
         return CommonResult.success(null);
     }
 
     @GetMapping("/pipe")
     public CommonResult<Object> pipe() {
-        synchronizationService.pipe(null);
+        synchronizationService.pipe(null, null);
         return CommonResult.success(null);
     }
 

ファイルの差分が大きいため隠しています
+ 1575 - 1502
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/framework/cron/SyncTaskPipeEquipmentJob.java


+ 2 - 2
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/framework/cron/UpdateEquipJob.java

@@ -35,7 +35,7 @@ public class UpdateEquipJob {
         log.info("更新设备定时任务执行中...");
         DateTime yesterday = DateUtil.yesterday();
         String date = DateUtil.formatDate(yesterday);
-        synchronizationService.boiler(date);
-        synchronizationService.pipe(date);
+        synchronizationService.boiler(date, null);
+        synchronizationService.pipe(date, null);
     }
 }

+ 2 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/dynamictb/DynamicTbServiceImpl.java

@@ -567,6 +567,7 @@ public class DynamicTbServiceImpl extends ServiceImpl<DynamicTbMapper, DynamicTb
                 dynamicTbMapper.updateById(tbDO);
             } else {
                 // 新增:使用导出的ID
+                tbDO.setId(null);
                 dynamicTbMapper.insert(tbDO);
             }
         }
@@ -580,6 +581,7 @@ public class DynamicTbServiceImpl extends ServiceImpl<DynamicTbMapper, DynamicTb
         // 批量插入列定义
         for (DynamicTbColDO colDO : colList) {
             if (colDO.getTbId() != null) {
+                colDO.setId(null);
                 dynamicTbColMapper.insert(colDO);
             }
         }

+ 1 - 1
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pdf/PdfService.java

@@ -8,5 +8,5 @@ import java.util.Map;
 public interface PdfService {
     byte[] addPageNumbersToPdf(byte[] pdfBytes) throws IOException;
     byte[] pdf(String templateId, String instanceId) throws Exception;
-    byte[] fullPdf(byte[] templateBytes, Map<String, Object> data, List<String> imgIns) throws Exception;
+    byte[] fullPdf(byte[] templateBytes, Map<String, Object> data, List<String> imgIns, String templateId, String instanceId) throws Exception;
 }

+ 36 - 11
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pdf/PdfServiceImpl.java

@@ -2,17 +2,15 @@ package cn.start.tz.module.pressure2.service.pdf;
 
 import cn.hutool.http.HttpResponse;
 import cn.hutool.http.HttpUtil;
-import cn.start.tz.framework.common.exception.ServiceException;
-import cn.start.tz.framework.common.pojo.CommonResult;
-import cn.start.tz.module.grape.city.api.GrapeCityApi;
 import cn.start.tz.module.grape.city.api.vo.GrapeCityReqDTO;
 import cn.start.tz.module.infra.api.file.FileApi;
+import cn.start.tz.module.pressure2.controller.admin.dynamictb.vo.DynamicTbRespVO;
 import cn.start.tz.module.pressure2.controller.admin.dynamictbcol.vo.DynamicTbColRespVO;
-import cn.start.tz.module.pressure2.controller.admin.dynamictbcol.vo.DynamicTbImgColRespVO;
-import cn.start.tz.module.pressure2.dal.dataobject.dynamictbcol.DynamicTbColDO;
+import cn.start.tz.module.pressure2.controller.admin.dynamictbval.vo.DynamicTBAndColVO;
+import cn.start.tz.module.pressure2.controller.admin.dynamictbval.vo.DynamicTBViewOrAddVO;
 import cn.start.tz.module.pressure2.dal.dataobject.dynamictbins.DynamicTbInsDO;
 import cn.start.tz.module.pressure2.dal.dataobject.dynamictbval.DynamicTbValDO;
-import cn.start.tz.module.pressure2.dal.dataobject.standardfile.StandardTemplateDO;
+import cn.start.tz.module.pressure2.service.dynamictb.DynamicTbService;
 import cn.start.tz.module.pressure2.service.dynamictbcol.DynamicTbColService;
 import cn.start.tz.module.pressure2.service.dynamictbins.DynamicTbInsService;
 import cn.start.tz.module.pressure2.service.dynamictbval.DynamicTbValService;
@@ -20,11 +18,9 @@ import cn.start.tz.module.pressure2.service.standardfile.StandardTemplateService
 import cn.start.tz.module.pressure2.util.ImageUtil;
 import cn.start.tz.module.pressure2.util.WordToPdfUtils;
 import cn.start.tz.module.system.api.standard.StandardTemplateApi;
-import cn.start.tz.module.system.api.standard.dto.StandardTemplateRespDTO;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.grapecity.documents.excel.*;
 import com.grapecity.documents.excel.drawing.ImageType;
 import com.grapecity.documents.excel.template.DataSource.JsonDataSource;
@@ -36,10 +32,10 @@ import org.apache.pdfbox.pdmodel.PDPageContentStream;
 import org.apache.pdfbox.pdmodel.font.PDType0Font;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
-import org.springframework.web.multipart.MultipartFile;
 
 import java.io.*;
 import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 @Slf4j
@@ -59,6 +55,9 @@ public class PdfServiceImpl implements PdfService {
     @Resource
     private DynamicTbInsService dynamicTbInsService;
 
+    @Resource
+    private DynamicTbService dynamicTbService;
+
     @Resource
     private FileApi fileApi;
 
@@ -125,11 +124,11 @@ public class PdfServiceImpl implements PdfService {
             for (DynamicTbValDO dynamicTbValDO : list) {
                 map.put(dynamicTbValDO.getColCode(), dynamicTbValDO.getValValue());
             }
-            return this.fullPdf(bytes, map, imgIns);
+            return this.fullPdf(bytes, map, imgIns,templateId, instanceId);
     }
 
     @Override
-    public byte[] fullPdf(byte[] templateBytes, Map<String, Object> data, List<String> imgIns) throws Exception {
+    public byte[] fullPdf(byte[] templateBytes, Map<String, Object> data, List<String> imgIns, String templateId, String instanceId) throws Exception {
         // 将 data 中的 JSON 字符串值解析为实际对象/数组,确保 GcExcel 模板引擎能正确处理表格绑定
         normalizeDataForTemplate(data);
         if (grapecityUrl != null && !"null".equals(grapecityUrl)) {
@@ -165,6 +164,32 @@ public class PdfServiceImpl implements PdfService {
             fullPdfRequest.put("data", data);
             fullPdfRequest.put("fileBytes", fileBytes);
 
+
+            DynamicTbRespVO templateInfo = dynamicTbService.getDynamicTb(templateId);
+            com.alibaba.fastjson.JSONObject copyConfig = templateInfo.getCopyConfig();
+            if (copyConfig != null) {
+                // {"copyRange":{"topLeft":"0,7","topRight":"19,7","bottomLeft":"0,22","bottomRight":"19,22"},"sheetName":"续页","hidden":true,"isContinuePage":true}
+                String isContinuePage = copyConfig.getString("isContinuePage");
+                List<String> existingColCodes = null;
+
+
+
+                if (isContinuePage.equals("true")){
+                    DynamicTBViewOrAddVO queryVO = new DynamicTBViewOrAddVO();
+                    queryVO.setTemplateId(templateId);
+                    DynamicTbInsDO dynamicTBInsDO = dynamicTbInsService.getById(instanceId);
+                    queryVO.setRefId(dynamicTBInsDO.getRefId());
+                    DynamicTBAndColVO tbData = dynamicTbValService.getDynamicTbInsAndValByRefId(queryVO);
+                    existingColCodes = tbData.getDynamicTbColRespVOList().stream()
+                            .map(DynamicTbColRespVO::getColCode)
+                            .collect(Collectors.toList());
+                    fullPdfRequest.put("continuePage", isContinuePage);
+                    fullPdfRequest.put("copyConfig", copyConfig.toJSONString());
+                    fullPdfRequest.put("existingColCodes", existingColCodes);
+                }
+            }
+
+
             // 调用 fullPdf 接口生成 PDF
             String jsonString = JSON.toJSONString(fullPdfRequest);
             HttpResponse response = HttpUtil.createPost(grapecityUrl+"/grapecity/pdf")

+ 12 - 8
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/synchronization/SynchronizationService.java

@@ -4,15 +4,19 @@ import cn.start.tz.module.pressure2.service.synchronization.dto.CheckDto;
 import cn.start.tz.module.pressure2.service.synchronization.dto.ReportDto;
 
 public interface SynchronizationService {
-    /**
-     * 同步锅炉
-     */
-    void boiler(String updateDate);
+//    /**
+//     * 同步锅炉
+//     */
+//    void boiler(String updateDate);
+//
+//    /**
+//     * 同步管道
+//     */
+//    void pipe(String updateDate);
 
-    /**
-     * 同步管道
-     */
-    void pipe(String updateDate);
+    void boiler(String updateDate, String REGISTERNO);
+
+    void pipe(String updateDate, String PROJECT_NO);
 
     /**
      * 上传约检数据

+ 14 - 11
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/synchronization/SynchronizationServiceImpl.java

@@ -2,7 +2,6 @@ package cn.start.tz.module.pressure2.service.synchronization;
 
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.thread.ThreadUtil;
 import cn.hutool.http.HttpResponse;
 import cn.hutool.http.HttpUtil;
 
@@ -22,12 +21,10 @@ import cn.start.tz.module.system.api.dept.dto.DeptRespDTO;
 import cn.start.tz.module.system.api.dict.DictDataApi;
 import cn.start.tz.module.system.api.dict.dto.DictDataRespDTO;
 import com.alibaba.fastjson2.JSONObject;
-import com.fasterxml.jackson.core.JsonProcessingException;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
@@ -36,8 +33,6 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
 
 
@@ -91,14 +86,16 @@ public class SynchronizationServiceImpl implements SynchronizationService {
      * @param updateDate 更新时间,只同步此时间之后的数据
      */
     @Override
-    public void boiler(String updateDate) {
+    public void boiler(String updateDate, String REGISTERNO) {
         log.info("同步锅炉设备定时任务执行中...");
         initDict();
 
         Map<String, Object> form = new HashMap<>();
         form.put("pageNum", 0);
         form.put("pageSize", DEFAULT_PAGE_SIZE);
-//        form.put("REGISTERNO", "11204401152024120003");
+        if (REGISTERNO != null) {
+            form.put("REGISTERNO", REGISTERNO);
+        }
         if (updateDate != null) {
             form.put("UPDATEDATE_gt", updateDate);
         }
@@ -131,7 +128,7 @@ public class SynchronizationServiceImpl implements SynchronizationService {
                 log.info("同步,添加锅炉:{},更新锅炉:{}", addList.size(), updateList.size());
                 equipBoilerService.saveBatch(addList);
 
-                updateList.parallelStream().forEach(equipBoilerDO -> {
+                updateList.forEach(equipBoilerDO -> {
                             try {
                                 equipBoilerService.updateEquipBoiler(equipBoilerDO);
                             } catch (Exception e) {
@@ -149,7 +146,7 @@ public class SynchronizationServiceImpl implements SynchronizationService {
      * @param updateDate 更新时间,只同步此时间之后的数据
      */
     @Override
-    public void pipe(String updateDate) {
+    public void pipe(String updateDate, String PROJECT_NO) {
         log.info("同步管道设备定时任务执行中...");
 
         initDict();
@@ -158,6 +155,9 @@ public class SynchronizationServiceImpl implements SynchronizationService {
         Map<String, Object> form = new HashMap<>();
         form.put("pageNum", 0);
         form.put("pageSize", DEFAULT_PAGE_SIZE);
+        if (PROJECT_NO != null) {
+            form.put("PROJECT_NO", PROJECT_NO);
+        }
         if (updateDate != null) {
             form.put("UPDATEDATE_gt", updateDate);
         }
@@ -165,7 +165,7 @@ public class SynchronizationServiceImpl implements SynchronizationService {
         ResponseDto pipeDtoResponseDto = JSONObject.parseObject(pipeequipment, ResponseDto.class);
         log.info("同步数据中台返回管道数据:{}", pipeDtoResponseDto);
         // 获取所有管道详情数据
-        List<PipeDetailDto> pipeDetailDtoS = fetchAllPipeDetailData(updateDate);
+        List<PipeDetailDto> pipeDetailDtoS = fetchAllPipeDetailData(updateDate, PROJECT_NO);
         if (pipeDtoResponseDto.getTotal() > 0) {
             List<PipeDto> list = pipeDtoResponseDto.getData().stream()
                     .map(data -> ((JSONObject) data).toJavaObject(PipeDto.class))
@@ -197,11 +197,14 @@ public class SynchronizationServiceImpl implements SynchronizationService {
     /**
      * 分页获取所有管道详情数据
      */
-    private List<PipeDetailDto> fetchAllPipeDetailData(String updateDate) {
+    private List<PipeDetailDto> fetchAllPipeDetailData(String updateDate, String PROJECT_NO) {
 
         Map<String, Object> detailForm = new HashMap<>();
         detailForm.put("pageNum", 0);
         detailForm.put("pageSize", DEFAULT_DETAIL_PAGE_SIZE);
+        if (PROJECT_NO != null) {
+            detailForm.put("PROJECT_NO", PROJECT_NO);
+        }
         if (updateDate != null) {
             detailForm.put("UPDATEDATE_gt", updateDate);
         }