Explorar el Código

Merge branch 'dev' of http://219.151.181.73:3000/zhuwei/bladex into dev

lvy hace 1 día
padre
commit
984a20ec7e
Se han modificado 38 ficheros con 399 adiciones y 207 borrados
  1. 1 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyFinishTestReport.java
  2. 5 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyTestType.java
  3. 1 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialCyThirdReportQueryVo.java
  4. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsNodeTableVO.java
  5. 1 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  6. 22 5
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  7. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialCyController.java
  8. 13 54
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TrialCyAccessoriesClientImpl.java
  9. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyAccessoriesMapper.java
  10. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyAccessoriesMapper.xml
  11. 7 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyFinishTestReportMapper.java
  12. 32 14
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyFinishTestReportMapper.xml
  13. 2 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyTestTypeMapper.java
  14. 3 2
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyTestTypeMapper.xml
  15. 12 13
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyThirdReportMapper.xml
  16. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialSelfInspectionRecordMapper.xml
  17. 24 53
      blade-service/blade-business/src/main/java/org/springblade/business/scheduled/ChenYuTestScheduled.java
  18. 8 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyFinishTestReportService.java
  19. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyService.java
  20. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyTestTypeService.java
  21. 5 3
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/EntrustInfoServiceImpl.java
  22. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  23. 3 19
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyAccessoriesServiceImpl.java
  24. 14 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyFinishTestReportServiceImpl.java
  25. 9 11
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyServiceImpl.java
  26. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyTestTypeServiceImpl.java
  27. 3 15
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java
  28. 9 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TableFileController.java
  29. 15 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeSynchronousRecordController.java
  30. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java
  31. 4 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml
  32. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java
  33. 43 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  34. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/WbsTreeSynchronousRecordService.java
  35. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  36. 57 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeSynchronousRecordServiceImpl.java
  37. 18 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/config/RedissonConfig.java
  38. 61 2
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MiddleMeterApplyController.java

+ 1 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyFinishTestReport.java

@@ -138,7 +138,7 @@ public class TrialCyFinishTestReport {
      * 试验树id
      */
     @ApiModelProperty("组装文件(报告+记录+委托单)")
-    @TableField("assemble_file")
+        @TableField("assemble_file")
     public String assembleFile;
     /**
      * 附件

+ 5 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyTestType.java

@@ -23,6 +23,11 @@ public class TrialCyTestType {
      */
     @ApiModelProperty("项目id")
     private Long projectId;
+    /**
+     * 项目id
+     */
+    @ApiModelProperty("合同段id")
+    private Long contractId;
     /**
      * ID唯一标识
      */

+ 1 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialCyThirdReportQueryVo.java

@@ -19,7 +19,7 @@ public class TrialCyThirdReportQueryVo {
     private String endTime;
     @ApiModelProperty("树节点id")
     @NotNull(message = "树节点id不能为空")
-    private Long nodeId;
+    private String nodeId;
     @ApiModelProperty("合同段id")
     @NotNull(message = "合同段id不能为空")
     private Long contractId;

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsNodeTableVO.java

@@ -94,4 +94,10 @@ public class WbsNodeTableVO implements Serializable {
     private String nodeType;
     private Integer wbsType;
 
+    @ApiModelProperty(value = "父级节点名称")
+    private String parentName;
+
+    @ApiModelProperty(value = "祖级路径")
+    private String ancestorPId;
+
 }

+ 1 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -3630,6 +3630,7 @@ public R<Boolean> updateContractNodeParameter(@RequestParam Long pKeyId, @Reques
             if (sourceType >= targetType) {
                 throw new ServiceException("当前节点类型不能大于或等于父级节点类型");
             }
+            node.setNodeType(nodeType);
         }
     }else {
         node.setNodeType(nodeType);

+ 22 - 5
blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java

@@ -1743,11 +1743,11 @@ public class TaskController extends BladeController {
             if (dto.getSelectedType().equals(1)) {
                 // 待办页面逻辑
                 if (ObjectUtil.isNotEmpty(dto.getStatusValue()) && dto.getStatusValue().equals(1)) {
-                    sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.status = ? AND u_task_parallel.task_user = ?)");
+                    sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.status = ? AND u_task_parallel.task_user = ? AND (u_task_parallel.e_visa_status IS NULL OR u_task_parallel.e_visa_status=0) AND (u_task_parallel.e_visa_content IS NULL OR u_task_parallel.e_visa_content != '当前等待电签的批次较多,请等待几分钟后刷新页面查看........'))");
                     params.add(1);
                     params.add(SecureUtil.getUserId());
                     // 关联电签状态字段
-                    sqlResult = "SELECT *, (SELECT ifnull(e_visa_status, -1)  FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.STATUS = 1 " +
+                    sqlResult = "SELECT *, (SELECT ifnull(e_visa_status, -1)  FROM u_task_parallel WHERE is_resign = 0 and u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.STATUS = 1 " +
                             "AND u_task_parallel.task_user = " + SecureUtil.getUserId() + " and is_deleted = 0 order by id desc limit 1) as e_status";
                 } else if (ObjectUtil.isNotEmpty(dto.getStatusValue()) && !dto.getStatusValue().equals(1)) {
                     // 待办页选非待审批状态:直接返回空分页
@@ -1757,21 +1757,26 @@ public class TaskController extends BladeController {
                     return R.data(emptyPage);
                 } else {
                     // 待办页未选状态:默认查待审批
-                    sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.status = ? AND u_task_parallel.task_user = ?)");
+                    sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.status = ? AND u_task_parallel.task_user = ? AND (u_task_parallel.e_visa_status IS NULL OR u_task_parallel.e_visa_status=0) AND (u_task_parallel.e_visa_content IS NULL OR u_task_parallel.e_visa_content != '当前等待电签的批次较多,请等待几分钟后刷新页面查看........'))");
                     params.add(1);
                     params.add(SecureUtil.getUserId());
                     sqlString.append(" AND status = 1");
-                    sqlResult = "SELECT *, (SELECT ifnull(e_visa_status, -1)  FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.STATUS = 1 " +
+                    sqlResult = "SELECT *, (SELECT ifnull(e_visa_status, -1)  FROM u_task_parallel WHERE is_resign = 0 and u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.STATUS = 1 " +
                             "AND u_task_parallel.task_user = " + SecureUtil.getUserId() + " and is_deleted = 0 order by id desc limit 1) as e_status";
                 }
             } else if (dto.getSelectedType().equals(2)) {
                 // 已办页面逻辑
-                sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.status in(2,3) AND u_task_parallel.task_user = ?)");
+                sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE is_resign = 0 and u_task.process_instance_id = u_task_parallel.process_instance_id  AND u_task_parallel.task_user = ? AND u_task_parallel.e_visa_status >0)");
                 params.add(SecureUtil.getUserId());
             } else if (dto.getSelectedType().equals(3)) {
                 // 我发起页面逻辑
                 sqlString.append("report_user = ?");
                 params.add(SecureUtil.getUserId());
+            } else if (dto.getSelectedType().equals(4)) {
+                sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.status = ? AND u_task_parallel.task_user = ? AND (u_task_parallel.e_visa_status IS NULL OR u_task_parallel.e_visa_status=0) AND u_task_parallel.e_visa_content='当前等待电签的批次较多,请等待几分钟后刷新页面查看........')");
+                params.add(1);
+                params.add(SecureUtil.getUserId());
+                sqlString.append(" AND status = 1");
             }
             sqlString.append(")");
         }
@@ -2566,6 +2571,18 @@ public class TaskController extends BladeController {
         return taskService.reSigningEVisaStatus0(dtos,header);
     }
 
+    @GetMapping("/checkAndRepairPDFisNull")
+    @ApiOperation(value = "检查PDF是否为空")
+    @ApiOperationSupport(order = 3)
+    public void checkAndRepairPDFisNull(HttpServletRequest request) throws Exception {
+        String header = request.getHeader("Blade-Auth");
+        Long projectId=1904814720589430785L;
+        String sql="select id,wbs_id,project_id,contract_id from u_information_query where project_id="+projectId+" and pdf_url is null and node_pdf_url is null  and status in(0,1,2) and is_deleted=0";
+        List<reSigningEVisaStatus> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(reSigningEVisaStatus.class));
+        taskService.reSigningEVisaStatus0(query,header);
+        System.out.println("完成");
+    }
+
     @PostMapping("/reSigningEntrust")
     @ApiOperationSupport(order = 3)
     @ApiOperation(value = "委托单管理-一键重签", notes = "传入taskIds、下拉框的contractId、projectId")

+ 2 - 2
blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialCyController.java

@@ -55,8 +55,8 @@ public class TrialCyController {
     @GetMapping("/getTree")
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "获取成渝那边的树", notes = "传入项目id")
-    public R<List<TrialCyTestType>> getTree(Long projectId, String parentId){
-        return R.data(trialCyService.getTree(projectId,parentId));
+    public R<List<TrialCyTestType>> getTree(Long projectId, String parentId, String contractId){
+        return R.data(trialCyService.getTree(projectId,parentId,contractId));
     }
 
     /**

+ 13 - 54
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TrialCyAccessoriesClientImpl.java

@@ -17,6 +17,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @author LHB
@@ -40,70 +41,28 @@ public class TrialCyAccessoriesClientImpl implements TrialCyAccessoriesClient {
     @Override
     public List<JSONObject> getTrialFilePdfRecord(String primaryKeyId, List<Integer> list) {
         //获取id
-        List<Map<String, Object>> trialFilePdfRecord = trialSelfInspectionRecordMapper.getTrialFilePdfRecord(primaryKeyId, list);
+        List<Map<String,Object>> trialFilePdfRecord = trialSelfInspectionRecordMapper.getTrialFilePdfRecord(primaryKeyId, list);
+        //
+        List<String> recordIds = trialFilePdfRecord.stream().map(f -> f.get("record_id").toString()).collect(Collectors.toList());
+        Map<String,Integer> map = trialFilePdfRecord.stream().collect(Collectors.toMap(f -> f.get("record_id").toString(), f -> Integer.valueOf(f.get("sort").toString())));
 
         if (CollectionUtil.isNotEmpty(trialFilePdfRecord)) {
 
-            //试验报告ids
-            List<Long> listOne = new ArrayList<>();
-            //第三方外委ids
-            List<Long> listTwo = new ArrayList<>();
-
-            for (Map<String, Object> stringObjectMap : trialFilePdfRecord) {
-
-                Integer type = (Integer) stringObjectMap.get("type");
-                Long recordId = (Long) stringObjectMap.get("record_id");
-                //试验报告
-                if (type == 11) {
-                    listOne.add(recordId);
-                } else {
-                    //第三方、外委
-                    listTwo.add(recordId);
-                }
-            }
-
             List<JSONObject> result = new ArrayList<>();
-
-            if (CollectionUtil.isNotEmpty(listOne)) {
-                List<TrialCyFinishTestReport> list1 = trialCyFinishTestReportService.list(Wrappers.<TrialCyFinishTestReport>lambdaQuery()
-                        .isNotNull(TrialCyFinishTestReport::getAssembleFile)
-                        .in(TrialCyFinishTestReport::getTaskId, listOne)
-                );
-
-                if (CollectionUtil.isNotEmpty(list1)) {
-                    list1.forEach(f -> {
-                        String[] split = f.getAssembleFile().split("/");
-                        JSONObject jsonObject = new JSONObject();
-                        jsonObject.put("id", f.getTaskId());
-                        jsonObject.put("name", split[split.length - 1]);
-                        jsonObject.put("contractId", f.getContractId());
-                        jsonObject.put("domainUrl", f.getAssembleFile());
-                        jsonObject.put("domainPdfUrl", f.getAssembleFile());
-                        jsonObject.put("tabId", primaryKeyId);
-                        jsonObject.put("extension", "pdf");
-                        //是否为试验关联的附件
-                        jsonObject.put("isTrial", true);
-                        result.add(jsonObject);
-                    });
-                }
-            }
-            if (CollectionUtil.isNotEmpty(listTwo)) {
-                List<TrialCyThirdReport> list1 = trialCyThirdReportService.list(Wrappers.<TrialCyThirdReport>lambdaQuery()
-                        .isNotNull(TrialCyThirdReport::getAssembleFile)
-                        .in(TrialCyThirdReport::getId, listTwo)
-                );
-
+            if (CollectionUtil.isNotEmpty(trialFilePdfRecord)) {
+                List<Map<String,Object>> list1 = trialCyFinishTestReportService.selectViewList(recordIds);
                 if (CollectionUtil.isNotEmpty(list1)) {
                     list1.forEach(f -> {
-                        String[] split = f.getAssembleFile().split("/");
+                        String[] split = f.get("assembleFile").toString().split("/");
                         JSONObject jsonObject = new JSONObject();
-                        jsonObject.put("id", f.getId());
+                        jsonObject.put("id", f.get("id"));
                         jsonObject.put("name", split[split.length - 1]);
-                        jsonObject.put("contractId", f.getContractId());
-                        jsonObject.put("domainUrl", f.getAssembleFile());
-                        jsonObject.put("domainPdfUrl", f.getAssembleFile());
+                        jsonObject.put("contractId", f.get("contractId"));
+                        jsonObject.put("domainUrl", f.get("assembleFile"));
+                        jsonObject.put("domainPdfUrl", f.get("assembleFile"));
                         jsonObject.put("tabId", primaryKeyId);
                         jsonObject.put("extension", "pdf");
+                        jsonObject.put("sort", map.get(f.get("id").toString()) == null ? 9999 : map.get(f.get("id").toString()));
                         //是否为试验关联的附件
                         jsonObject.put("isTrial", true);
                         result.add(jsonObject);

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyAccessoriesMapper.java

@@ -18,7 +18,7 @@ public interface TrialCyAccessoriesMapper extends BaseMapper<TrialCyAccessories>
     Boolean clearTrialAssociation(@Param("nodeId") Long nodeId,
                                   @Param("recordId") Long recordId);
 
-    List<String> selectFilePdfList(@Param("nodeId") Long nodeId,
+    List<Long> selectFilePdfList(@Param("nodeId") Long nodeId,
                                    @Param("types") Integer... types);
 }
 

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyAccessoriesMapper.xml

@@ -19,7 +19,7 @@
     <delete id="clearTrialAssociation">
         delete from u_trial_file_pdf_record where node_id = #{nodeId} and record_id=#{recordId}
     </delete>
-    <select id="selectFilePdfList" resultType="java.lang.String">
+    <select id="selectFilePdfList" resultType="java.lang.Long">
         select record_id from u_trial_file_pdf_record where node_id = #{nodeId} and type in
           <foreach collection="types" item="type" open="(" close=")" separator=",">
               #{type}

+ 7 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyFinishTestReportMapper.java

@@ -7,6 +7,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.springblade.business.vo.ThirdReportVo;
 import org.springblade.business.vo.TrialCyThirdReportQueryVo;
 
+import java.util.List;
+import java.util.Map;
+
 /**
 * @author LHB
 * @description 针对表【u_trial_cy_finish_test_report(成渝-获取标段已完成(已签章完成)的检测报告)】的数据库操作Mapper
@@ -16,6 +19,10 @@ import org.springblade.business.vo.TrialCyThirdReportQueryVo;
 public interface TrialCyFinishTestReportMapper extends BaseMapper<TrialCyFinishTestReport> {
 
     Page<ThirdReportVo> myPage(Page<ThirdReportVo> page, @Param("query") TrialCyThirdReportQueryVo queryVo);
+
+    List<String> selectViewPdfList(@Param("ids") List<Long> ids);
+
+    List<Map<String,Object>> selectViewList(@Param("ids") List<String> ids);
 }
 
 

+ 32 - 14
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyFinishTestReportMapper.xml

@@ -5,33 +5,51 @@
 <mapper namespace="org.springblade.business.mapper.TrialCyFinishTestReportMapper">
     <select id="myPage" resultType="org.springblade.business.vo.ThirdReportVo">
         select
-            task_id id,
-            contract_id contractId,
-            report_number reportNo,
-            report_date reportDate,
-            position projectPositionName,
-            case
-                when experiment_result = 1 then '合格'
-                else '不合格'
-            end detectionResultName,
+            id,
+            contractId,
+            reportNo,
+            reportDate,
+            projectPositionName,
+            detectionResultName,
         (select count(0) > 0 from u_trial_file_pdf_record where node_id = #{query.qualityTestPKeyId}  and type = 11 and record_id = t.id) isSelectedStatus
-        from u_trial_cy_finish_test_report t
+        from vw_u_trial_cy_decoment t
         <where>
+            and `type` in(1,2)
             <if test="query.contractId != null">
-                AND contract_id = #{query.contractId}
+                AND contractId = #{query.contractId}
             </if>
             <if test="query.nodeId != null">
-                AND exam_name_info_id = #{query.nodeId}
+                AND node_id = #{query.nodeId}
             </if>
             <if test="query.startTime != null">
-                AND report_date >= #{query.startTime}
+                AND reportDate >= #{query.startTime}
             </if>
             <if test="query.endTime != null">
-                AND report_date &lt;= #{query.endTime}
+                AND reportDate &lt;= #{query.endTime}
             </if>
             <if test="query.reportType != null">
                 AND cs = #{query.reportType}
             </if>
         </where>
     </select>
+    <select id="selectViewPdfList" resultType="java.lang.String">
+        select
+            assemble_file
+        from vw_u_trial_cy_decoment
+        where id in
+        <foreach item="item" collection="ids" separator="," open="(" close=")" index="">
+            #{item}
+        </foreach>
+    </select>
+    <select id="selectViewList" resultType="java.util.Map">
+        select
+            id,
+            contractId,
+            assemble_file as assembleFile
+        from vw_u_trial_cy_decoment
+        where assemble_file is not null and id in
+        <foreach item="item" collection="ids" separator="," open="(" close=")" index="">
+            #{item}
+        </foreach>
+    </select>
 </mapper>

+ 2 - 1
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyTestTypeMapper.java

@@ -15,7 +15,8 @@ import java.util.List;
 public interface TrialCyTestTypeMapper extends BaseMapper<TrialCyTestType> {
 
     List<TrialCyTestType> getTree(@Param("projectId") Long projectId,
-                                  @Param("parentId") String parentId);
+                                  @Param("parentId") String parentId,
+                                  @Param("contractId") String contractId);
 }
 
 

+ 3 - 2
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyTestTypeMapper.xml

@@ -15,9 +15,10 @@
     <select id="getTree" resultType="org.springblade.business.entity.TrialCyTestType">
         select
             <include refid="Base_sql"/>,
-            (select count(1) > 0 from u_trial_cy_test_type where father_id = t.id) has_children
-        from u_trial_cy_test_type t
+            (select count(1) > 0 from vw_u_trial_cy_tree where father_id = t.id and contract_id = #{contractId}) has_children
+        from vw_u_trial_cy_tree t
         where project_id = #{projectId}
+          and contract_id = #{contractId}
           and father_id = #{parentId}
         order by order_index
     </select>

+ 12 - 13
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyThirdReportMapper.xml

@@ -6,30 +6,29 @@
     <select id="myPage" resultType="org.springblade.business.vo.ThirdReportVo">
         select
             id,
-            contract_id contractId,
-            report_no reportNo,
-            report_date reportDate,
-            project_part projectPositionName,
-            case when is_qualified = 1 then '合格'
-                else '不合格'
-            end detectionResultName,
+            contractId,
+            reportNo,
+            reportDate,
+            projectPositionName,
+            detectionResultName,
         (select count(0) > 0 from u_trial_file_pdf_record where node_id = #{query.qualityTestPKeyId}  and type in(12,13) and record_id = t.id) isSelectedStatus
-        from u_trial_cy_third_report t
+        from vw_u_trial_cy_decoment t
         <where>
+            AND `type` in(3,4)
             <if test="query.contractId != null">
-                AND contract_id = #{query.contractId}
+                AND contractId = #{query.contractId}
             </if>
             <if test="query.type != null">
-                AND `third_type` = #{query.type}
+                AND `type` = #{query.type}
             </if>
             <if test="query.startTime != null">
-                AND report_date >= #{query.startTime}
+                AND reportDate >= #{query.startTime}
             </if>
             <if test="query.endTime != null">
-                AND report_date &lt;= #{query.endTime}
+                AND reportDate &lt;= #{query.endTime}
             </if>
             <if test="query.nodeId != null">
-                AND exam_name_info_id = #{query.nodeId}
+                AND node_id = #{query.nodeId}
             </if>
         </where>
     </select>

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialSelfInspectionRecordMapper.xml

@@ -109,7 +109,7 @@
         </where>
     </select>
     <select id="getTrialFilePdfRecord" resultType="java.util.Map">
-        select record_id,type from u_trial_file_pdf_record where node_id = #{nodeId} and `type` in
+        select record_id,IFNULL(sort,9999) sort from u_trial_file_pdf_record where node_id = #{nodeId} and `type` in
        <foreach collection="types" item="type" open="(" close=")" separator=",">
            #{type}
        </foreach>

+ 24 - 53
blade-service/blade-business/src/main/java/org/springblade/business/scheduled/ChenYuTestScheduled.java

@@ -101,6 +101,7 @@ public class ChenYuTestScheduled {
     private CloseableHttpClient httpClient;
     private static final String TOKEN_REDIS_KEY = "blade:cqcy:token";
     private static final String PROJECT_CODE = "cqcyfx";
+    private static final String CONTRACT_CODE = "CYTJ03";
     private static Long PROJECT_ID = null;
     private static final String BASE_URL = "https://apicqcyfx.qdm123.com";
     private final Map<String, Long> contractCodeMap = new ConcurrentHashMap<>();
@@ -209,62 +210,20 @@ public class ChenYuTestScheduled {
         if (!SystemUtils.isLinux()) {
             return;
         }
-
-        contractCodeMap.clear();
-        String token = getToken();
-        ensureProjectIdInitialized();
-
-        if (token == null || PROJECT_ID == null) {
-            log.error("Invalid token or project ID");
-            return;
-        }
-
         try {
-            //获取合同段列表接口
-            Result result = getContractList();
-            if (result == null || result.getState() != 1) {
-                log.error("Failed to get contract sections: {}",
-                        result != null ? result.getMessage() : "No response");
-                return;
-            }
-
-            JSONArray data = (JSONArray) result.getData();
-            if (CollectionUtil.isEmpty(data)) {
-                log.warn("No contract sections found");
-                return;
-            }
-
-            List<String> codes = new ArrayList<>();
-            for (int i = 0; i < data.size(); i++) {
-                JSONObject obj = data.getJSONObject(i);
-                String name = obj.getString("Name");
-                if (StringUtil.isNotBlank(name)) {
-                    codes.add(name);
-                }
-            }
-
-            if (CollectionUtil.isEmpty(codes)) {
-                log.info("No valid contract codes found");
-                return;
-            }
-
             // 构建参数化查询
-            String placeholders = String.join(",", Collections.nCopies(codes.size(), "?"));
-            String sql = "SELECT * FROM m_contract_info WHERE contract_number IN (" + placeholders + ")";
-
+            String sql = "SELECT id FROM m_contract_info WHERE contract_number = '" + CONTRACT_CODE + "'";
             List<ContractInfo> contracts = jdbcTemplate.query(
                     sql,
-                    codes.toArray(),
                     new BeanPropertyRowMapper<>(ContractInfo.class)
             );
-
-            for (ContractInfo contract : contracts) {
-                contractCodeMap.put(contract.getContractNumber(), contract.getId());
+            if(CollectionUtil.isNotEmpty(contracts)){
+                ContractInfo contractInfo = contracts.get(0);
+                contractCodeMap.put(CONTRACT_CODE, contractInfo.getId());
             }
-
             log.info("Loaded {} contract mappings", contractCodeMap.size());
         } catch (Exception e) {
-            log.error("Error processing contract sections", e);
+            log.error(CONTRACT_CODE + " 合同段编码不存在", e);
         }
     }
 
@@ -294,6 +253,8 @@ public class ChenYuTestScheduled {
                     .eq(TrialCyFinishTestReport::getContractId, contractId));
             //等会准备删除的历史数据
             List<Long> ids = list.stream().map(TrialCyFinishTestReport::getId).collect(Collectors.toList());
+            //获取旧数据 task_id 与 id的映射关系
+            Map<Integer, Long> taskIdMap = list.stream().collect(Collectors.toMap(TrialCyFinishTestReport::getTaskId, TrialCyFinishTestReport::getId));
 
             int pageIndex = 0;
             final int pageSize = 100;
@@ -335,7 +296,10 @@ public class ChenYuTestScheduled {
                     for (TrialCyFinishTestReport report : reports) {
                         //数据太长且不需要
                         report.setTestParamInfo(null);
-                        Long id = SnowFlakeUtil.getId();
+                        Long id = taskIdMap.get(report.getTaskId());
+                        if(id == null){
+                            id = SnowFlakeUtil.getId();
+                        }
                         report.setId(id);
                         report.setContractId(contractId);
                         //处理boolean值
@@ -352,9 +316,10 @@ public class ChenYuTestScheduled {
                         //处理附件
                         List<TrialCyAccessories> accessories = report.getAccessories();
                         if (CollectionUtil.isNotEmpty(accessories)) {
+                            Long finalId = id;
                             accessories.forEach(f -> {
                                 f.setId(SnowFlakeUtil.getId());
-                                f.setReportId(id);
+                                f.setReportId(finalId);
                                 if (StringUtil.isNotBlank(f.getFilePath())) {
                                     urls.add(f.getFilePath());
                                 }
@@ -438,7 +403,8 @@ public class ChenYuTestScheduled {
                     .eq(TrialCyThirdReport::getContractId, contractId));
             //等会要删除的id
             List<Long> ids = list.stream().map(TrialCyThirdReport::getPKeyId).collect(Collectors.toList());
-
+            //获取旧数据 id 和 pKId的映射关系
+            Map<String, Long> linkMap = list.stream().collect(Collectors.toMap(TrialCyThirdReport::getId, TrialCyThirdReport::getPKeyId));
 
             int pageIndex = 0;
             final int pageSize = 100;
@@ -489,8 +455,11 @@ public class ChenYuTestScheduled {
                             if (StringUtil.isNotBlank(report.getRecordDocFilePath())) {
                                 urls.add(report.getRecordDocFilePath());
                             }
-
-                            Long id = SnowFlakeUtil.getId();
+                            //如果能通过id找到旧pkid 就使用旧pkid
+                            Long id = linkMap.get(report.getId());
+                            if(id == null){
+                                id = SnowFlakeUtil.getId();
+                            }
                             report.setPKeyId(id);
                             report.setContractId(contractId);
                             //报告类型
@@ -502,9 +471,10 @@ public class ChenYuTestScheduled {
                             //处理附件
                             List<TrialCyAccessories> accessories = report.getAccessories();
                             if (CollectionUtil.isNotEmpty(accessories)) {
+                                Long finalId = id;
                                 accessories.forEach(f -> {
                                     f.setId(SnowFlakeUtil.getId());
-                                    f.setReportId(id);
+                                    f.setReportId(finalId);
 
                                     if (StringUtil.isNotBlank(f.getFilePath())) {
                                         urls.add(f.getFilePath());
@@ -600,6 +570,7 @@ public class ChenYuTestScheduled {
             for (TrialCyTestType type : testTypes) {
                 type.setPKeyId(SnowFlakeUtil.getId());
                 type.setProjectId(PROJECT_ID);
+                type.setContractId(contractCodeMap.get(CONTRACT_CODE));
                 type.setFatherId(type.getFatherId() == null || type.getFatherId().isEmpty() ? "0" : type.getFatherId());
             }
             //先删除旧数据

+ 8 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyFinishTestReportService.java

@@ -7,6 +7,9 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import org.springblade.business.vo.ThirdReportVo;
 import org.springblade.business.vo.TrialCyThirdReportQueryVo;
 
+import java.util.List;
+import java.util.Map;
+
 /**
 * @author LHB
 * @description 针对表【u_trial_cy_finish_test_report(成渝-获取标段已完成(已签章完成)的检测报告)】的数据库操作Service
@@ -16,4 +19,9 @@ public interface TrialCyFinishTestReportService extends IService<TrialCyFinishTe
 
     Page<ThirdReportVo> myPage(Page<ThirdReportVo> objectPage,
                                TrialCyThirdReportQueryVo queryVo);
+
+    List<String> selectViewPdfList(List<Long> longList);
+
+    List<Map<String,Object>> selectViewList(List<String> trialFilePdfRecord);
+
 }

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyService.java

@@ -15,7 +15,7 @@ import java.util.List;
 public interface TrialCyService {
     Boolean isCyAndTestModule(Long projectId, Long contractId);
 
-    List<TrialCyTestType> getTree(Long projectId, String parentId);
+    List<TrialCyTestType> getTree(Long projectId, String parentId, String contractId);
 
     Page<ThirdReportVo> getTrialDetectionReport(TrialCyThirdReportQueryVo queryVo);
 

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/TrialCyTestTypeService.java

@@ -12,5 +12,5 @@ import java.util.List;
 */
 public interface TrialCyTestTypeService extends IService<TrialCyTestType> {
 
-    List<TrialCyTestType> getTree(Long projectId, String parentId);
+    List<TrialCyTestType> getTree(Long projectId, String parentId, String contractId);
 }

+ 5 - 3
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/EntrustInfoServiceImpl.java

@@ -287,9 +287,11 @@ public class EntrustInfoServiceImpl extends BaseServiceImpl<EntrustInfoMapper, E
                 if(entrustInfo.getStatus()!=2&&entrustInfo.getStatus()!=3){
                     throw new ServiceException("该委托单不能废除"+entrustInfo.getEntrustNo());
                 }
-                entrustInfo.setEntrustEPdf(null);
-                entrustInfo.setStatus(1);
-                entrustInfoMapper.updateById(entrustInfo);
+				// mybatis plus 默认的updateById 会跳过null值字段, 改为 lambda 方式
+                entrustInfoMapper.update(null,Wrappers.<EntrustInfo>lambdaUpdate()
+						.set(EntrustInfo::getStatus, 1)
+						.set(EntrustInfo::getEntrustEPdf, null)
+						.eq(EntrustInfo::getId, Long.parseLong(i)));
             }
             List<InformationQuery> queryList = this.informationQueryService.list(Wrappers.<InformationQuery>lambdaQuery().in(InformationQuery::getId, Arrays.asList(ids)));
             if (queryList.size() == 0) {

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

@@ -1391,7 +1391,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                         if (!b) {
                             throw new ServiceException("清空电签PDF失败");
                         }
-                        result.setData("成功");
+                        result.setMsg("操作成功");
                     }
                     //重新电签
                     if (result != null && "操作成功".equals(result.getMsg())) {

+ 3 - 19
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyAccessoriesServiceImpl.java

@@ -54,8 +54,7 @@ public class TrialCyAccessoriesServiceImpl extends ServiceImpl<TrialCyAccessorie
 
         baseMapper.clearTrialAssociation(nodeId, recordId);
         //重新生成pdf
-        List<String> listOne = baseMapper.selectFilePdfList(nodeId, 11);
-        List<String> listTwo = baseMapper.selectFilePdfList(nodeId, 11, 12);
+        List<Long> listOne = baseMapper.selectFilePdfList(nodeId, 11,12,13);
 
         InformationQuery informationQuery = informationQueryService.getBaseMapper().selectList(Wrappers.<InformationQuery>lambdaQuery()
                 .eq(InformationQuery::getWbsId, nodeId)
@@ -66,25 +65,10 @@ public class TrialCyAccessoriesServiceImpl extends ServiceImpl<TrialCyAccessorie
         List<String> pdfList = new ArrayList<>();
         //成渝自检
         if (CollectionUtil.isNotEmpty(listOne)) {
-            List<TrialCyFinishTestReport> trialCyFinishTestReports = trialCyFinishTestReportService.getBaseMapper().selectList(Wrappers.<TrialCyFinishTestReport>lambdaQuery()
-                    .in(TrialCyFinishTestReport::getTaskId, listOne));
-            trialCyFinishTestReports.forEach(f -> {
-                if (StringUtils.isNotBlank(f.getAssembleFile())) {
-                    pdfList.add(f.getAssembleFile());
-                }
-            });
+            List<String> pdfFiles = trialCyFinishTestReportService.selectViewPdfList(listOne);
+            pdfList.addAll(pdfFiles);
         }
 
-        //外委-第三方
-        if (CollectionUtil.isNotEmpty(listOne)) {
-            List<TrialCyThirdReport> trialCyThirdReports = trialCyThirdReportService.getBaseMapper().selectList(Wrappers.<TrialCyThirdReport>lambdaQuery()
-                    .in(TrialCyThirdReport::getId, listTwo));
-            trialCyThirdReports.forEach(f -> {
-                if (StringUtils.isNotBlank(f.getAssembleFile())) {
-                    pdfList.add(f.getAssembleFile());
-                }
-            });
-        }
 
         String pdfTrialUrl = informationQuery.getPdfTrialUrl();
         //删除之前的文件

+ 14 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyFinishTestReportServiceImpl.java

@@ -9,6 +9,10 @@ import org.springblade.business.vo.ThirdReportVo;
 import org.springblade.business.vo.TrialCyThirdReportQueryVo;
 import org.springframework.stereotype.Service;
 
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
 /**
 * @author LHB
 * @description 针对表【u_trial_cy_finish_test_report(成渝-获取标段已完成(已签章完成)的检测报告)】的数据库操作Service实现
@@ -22,6 +26,16 @@ public class TrialCyFinishTestReportServiceImpl extends ServiceImpl<TrialCyFinis
     public Page<ThirdReportVo> myPage(Page<ThirdReportVo> page, TrialCyThirdReportQueryVo queryVo) {
         return baseMapper.myPage(page,queryVo);
     }
+
+    @Override
+    public List<String> selectViewPdfList(List<Long> ids) {
+        return baseMapper.selectViewPdfList(ids);
+    }
+
+    @Override
+    public List<Map<String,Object>> selectViewList(List<String> ids) {
+        return baseMapper.selectViewList(ids);
+    }
 }
 
 

+ 9 - 11
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyServiceImpl.java

@@ -52,29 +52,27 @@ public class TrialCyServiceImpl implements TrialCyService {
     }
 
     @Override
-    public List<TrialCyTestType> getTree(Long projectId, String parentId) {
-        List<TrialCyTestType> list = trialCyTestTypeService.getTree(projectId, parentId);
+    public List<TrialCyTestType> getTree(Long projectId, String parentId, String contractId) {
+        List<TrialCyTestType> list = trialCyTestTypeService.getTree(projectId, parentId, contractId);
         return list;
     }
 
     @Override
     public Page<ThirdReportVo> getTrialDetectionReport(TrialCyThirdReportQueryVo queryVo) {
-        TrialCyTestType byId = trialCyTestTypeService.getById(queryVo.getNodeId());
-        if(StringUtils.isBlank(byId.getId())){
-            return new Page<>();
-        }
-        queryVo.setNodeId(Long.valueOf(byId.getId()));
         Page<ThirdReportVo> page = trialCyFinishTestReportService.myPage(new Page<ThirdReportVo>(queryVo.getCurrent(), queryVo.getSize()),queryVo);
         return page;
     }
 
     @Override
     public Page<ThirdReportVo> getThirdReport(TrialCyThirdReportQueryVo queryVo) {
-        TrialCyTestType byId = trialCyTestTypeService.getById(queryVo.getNodeId());
-        if(StringUtils.isBlank(byId.getId())){
-            return new Page<>();
+        if(queryVo.getType() != null){
+            if(queryVo.getType() == 0){
+                queryVo.setType(3);
+            }
+            if(queryVo.getType() == 1){
+                queryVo.setType(4);
+            }
         }
-        queryVo.setNodeId(Long.valueOf(byId.getId()));
         Page<ThirdReportVo> page = trialCyThirdReportService.myPage(new Page<ThirdReportVo>(queryVo.getCurrent(), queryVo.getSize()), queryVo);
         return page;
     }

+ 2 - 2
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyTestTypeServiceImpl.java

@@ -18,8 +18,8 @@ import java.util.List;
 public class TrialCyTestTypeServiceImpl extends ServiceImpl<TrialCyTestTypeMapper, TrialCyTestType>
     implements TrialCyTestTypeService {
     @Override
-    public List<TrialCyTestType> getTree(Long projectId, String parentId) {
-        return baseMapper.getTree(projectId, parentId);
+    public List<TrialCyTestType> getTree(Long projectId, String parentId, String contractId) {
+        return baseMapper.getTree(projectId, parentId,contractId);
     }
 }
 

+ 3 - 15
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java

@@ -2073,21 +2073,9 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
                 }
 
                 //成渝自检
-                if (dto.getType().equals(11)) {
-                    List<TrialCyFinishTestReport> trialCyFinishTestReports = trialCyFinishTestReportService.getBaseMapper().selectList(Wrappers.<TrialCyFinishTestReport>lambdaQuery().in(TrialCyFinishTestReport::getTaskId, Func.toLongList(dto.getIds())));
-                    trialCyFinishTestReports.forEach(f -> {
-                        if (StringUtils.isNotBlank(f.getAssembleFile())) {
-                            pdfList.add(f.getAssembleFile());
-                        }
-
-                    });
-                } else if (dto.getType().equals(12) || dto.getType().equals(13)) {
-                    List<TrialCyThirdReport> trialCyThirdReports = trialCyThirdReportService.getBaseMapper().selectList(Wrappers.<TrialCyThirdReport>lambdaQuery().in(TrialCyThirdReport::getId, Func.toLongList(dto.getIds())));
-                    trialCyThirdReports.forEach(f -> {
-                        if (StringUtils.isNotBlank(f.getAssembleFile())) {
-                            pdfList.add(f.getAssembleFile());
-                        }
-                    });
+                if (dto.getType().equals(11) || dto.getType().equals(12) || dto.getType().equals(13)) {
+                    List<String> files = trialCyFinishTestReportService.selectViewPdfList(Func.toLongList(dto.getIds()));
+                    pdfList.addAll(files);
                 }
 
                 if (pdfList.size() > 0) {

+ 9 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TableFileController.java

@@ -297,6 +297,15 @@ public class TableFileController extends BladeController {
                 for (TableFile file : list) {
                     file.setSort(i++);
                 }
+
+                //获取type为空的数据
+                List<TableFile> collect1 = list.stream().filter(f -> f.getType() == null).collect(Collectors.toList());
+                for (TableFile tableFile : collect1) {
+                    String sql = "update u_trial_file_pdf_record set sort = " + tableFile.getSort() + " where record_id = " + tableFile.getId()
+                            + " and node_id = " + vo.getPKeyId();
+                    jdbcTemplate.update(sql);
+                }
+                //修改
             }
             tableFileService.updateBatchById(list);
         }

+ 15 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeSynchronousRecordController.java

@@ -16,6 +16,7 @@ import org.springblade.manager.service.WbsTreeSynchronousRecordService;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
+import org.springblade.manager.vo.WbsNodeTableVO;
 import org.springblade.manager.vo.WbsTreeSynchronousRecordVo;
 import org.springframework.web.bind.annotation.*;
 
@@ -210,5 +211,19 @@ public class WbsTreeSynchronousRecordController {
                 .eq(WbsTreeSynchronousRecord::getId, id)
         ));
     }
+    /**
+     * 同步其他表单 推荐表单查询
+     */
+    @GetMapping("getRecommendTable")
+    @ApiOperation(value = "同步其他表单 推荐表单查询", notes = "传入表单projectId、pKeyId")
+    public R<List<WbsNodeTableVO>> getRecommendTable(@RequestParam Long projectId,@RequestParam Long pKeyId) {
+        if (projectId == null) {
+            return R.fail("项目Id不能为空");
+        }
+        if (pKeyId == null) {
+            return R.fail("表单pKeyId不能为空");
+        }
+        return R.data(this.mWbsTreeSynchronousRecordService.getRecommendTable(projectId,pKeyId));
+    }
 }
 

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java

@@ -177,6 +177,9 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
         if(StringUtils.isNotEmpty(node.getMajorDataType())){
             wrappers.set(WbsTreeContract::getMajorDataType,node.getMajorDataType());
         }
+        if(StringUtils.isNotEmpty(node.getNodeType())){
+            wrappers.set(WbsTreeContract::getNodeType,node.getNodeType());
+        }
         return this.wbsTreeContractService.update(wrappers.eq(WbsTreeContract::getPKeyId, node.getPKeyId()));
     }
 

+ 4 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml

@@ -1014,7 +1014,10 @@
             p_key_id code,
             node_name name,
             null stake,
-            p_id pid,
+            case
+                when node_type = 1 then null
+                else p_id
+            end pid,
             CASE
                 WHEN node_type = 18 THEN 1
                 WHEN node_type = 2 THEN 2

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java

@@ -163,4 +163,6 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
                             @Param("contractId") Long contractId,
                             @Param("wbsId") String wbsId,
                             @Param("id") Long id);
+
+    List<WbsNodeTableVO> getRecommendTable(WbsTreePrivate wbsTreePrivate);
 }

+ 43 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml

@@ -1099,4 +1099,47 @@
                 AND (trial_tab_contract_id is null OR (trial_tab_contract_id = #{contractId}))
             </if>
     </select>
+    <select id="getRecommendTable" resultType="org.springblade.manager.vo.WbsNodeTableVO">
+        SELECT
+            a.p_key_id AS "pKeyId",
+            a.node_name AS tableName,
+            IFNULL(if(length(trim(a.full_name)) > 0, a.full_name, a.node_name), a.node_name) AS fullName,
+            a.table_owner AS tableOwner,
+            case
+                when a.table_type in (1, 9) then 1
+                when a.table_type in (2, 10) then 2
+                else a.table_type
+                end as tableType,
+            b.node_name parentName,
+            a.ancestors_p_id as ancestorPId
+        FROM
+            m_wbs_tree_private a
+            left join m_wbs_tree_private b on a.p_id = b.p_key_id
+        WHERE
+            a.project_id = #{projectId}
+            AND a.is_deleted = 0
+            <choose>
+                <when test="initTableName == null or initTableName == ''">
+                    AND a.id IN (
+                        SELECT
+                            a.id
+                        FROM
+                            m_wbs_tree a
+                        INNER JOIN ( SELECT init_table_name, wbs_id FROM m_wbs_tree WHERE id = #{id} ) b ON a.wbs_id = b.wbs_id
+                        AND a.init_table_name = b.init_table_name
+                        WHERE a.id != #{id}
+                    )
+                </when>
+                <otherwise>
+                    AND a.init_table_name = #{initTableName}
+                </otherwise>
+            </choose>
+            AND a.excel_id IS NOT NULL
+            AND a.init_table_name IS NOT NULL
+            AND a.html_url IS NOT NULL
+            AND a.init_table_id IS NOT NULL
+            GROUP BY
+                a.excel_id,
+                a.init_table_name
+    </select>
 </mapper>

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/WbsTreeSynchronousRecordService.java

@@ -6,6 +6,7 @@ import org.springblade.core.mp.support.Query;
 import org.springblade.manager.entity.ProjectInfo;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.entity.WbsTreeSynchronousRecord;
+import org.springblade.manager.vo.WbsNodeTableVO;
 import org.springblade.manager.vo.WbsTreeSynchronousRecordVo;
 
 import java.util.List;
@@ -22,4 +23,6 @@ public interface WbsTreeSynchronousRecordService extends IService<WbsTreeSynchro
     List<WbsTreeSynchronousRecordVo> getProjectTemplate(String nodeIds);
 
     WbsTreeSynchronousRecord getNodeStatus(Long id);
+
+    List<WbsNodeTableVO> getRecommendTable(Long projectId, Long pKeyId);
 }

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -1494,6 +1494,9 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 voList.add(vo);
             }
         }
+        voList.stream().filter(f -> CollectionUtil.isNotEmpty(f.getFileList())).forEach(f -> {
+            f.setFileList(f.getFileList().stream().sorted(Comparator.comparing(TableFile::getSort)).collect(Collectors.toList()));
+        });
         return voList;
     }
 

+ 57 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeSynchronousRecordServiceImpl.java

@@ -1,11 +1,9 @@
 package org.springblade.manager.service.impl;
 
 import cn.hutool.core.date.DateTime;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.redisson.api.RedissonClient;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.common.utils.SystemUtils;
 import org.springblade.core.log.exception.ServiceException;
@@ -15,6 +13,7 @@ import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.mapper.*;
 import org.springblade.manager.service.WbsTreeSynchronousRecordService;
+import org.springblade.manager.vo.WbsNodeTableVO;
 import org.springblade.manager.vo.WbsTreeSynchronousRecordVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -202,6 +201,58 @@ public class WbsTreeSynchronousRecordServiceImpl extends ServiceImpl<WbsTreeSync
         return null;
     }
 
+    @Override
+    public List<WbsNodeTableVO> getRecommendTable(Long projectId, Long pKeyId) {
+        //查询当前节点是否存在 initTableName
+        WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.selectById(pKeyId);
+        List<WbsNodeTableVO> list = wbsTreePrivateMapper.getRecommendTable(wbsTreePrivate);
+        list.sort((obj1, obj2) -> {
+            String ancestors1 = obj1.getAncestorPId();
+            String ancestors2 = obj2.getAncestorPId();
+            return compareAncestors(ancestors1, ancestors2);
+        });
+        return list;
+    }
+
+    //排序规则
+    private int compareAncestors(String ancestors1, String ancestors2) {
+        if (ancestors1 == null && ancestors2 == null) return 0;
+        if (ancestors1 == null) return -1;
+        if (ancestors2 == null) return 1;
+
+        String[] arr1 = ancestors1.split(",");
+        String[] arr2 = ancestors2.split(",");
+
+        int minLength = Math.min(arr1.length, arr2.length);
+
+        // 比较相同索引的ID
+        for (int i = 0; i < minLength; i++) {
+            String id1 = arr1[i].trim();
+            String id2 = arr2[i].trim();
+
+            if (!id1.equals(id2)) {
+                // 查询数据库获取排序值
+                Integer sort1 = wbsTreePrivateMapper.selectById(id1).getSort();
+                Integer sort2 = wbsTreePrivateMapper.selectById(id2).getSort();
+
+                // 比较排序值
+                if (sort1 != null && sort2 != null) {
+                    return Integer.compare(sort1, sort2);
+                } else if (sort1 != null) {
+                    return -1;
+                } else if (sort2 != null) {
+                    return 1;
+                } else {
+                    return id1.compareTo(id2); // 降级方案
+                }
+            }
+        }
+
+        // 如果共同部分都相同,长度短的排在前面(父级在子级前面)
+        return Integer.compare(arr1.length, arr2.length);
+    }
+
+
     @Override
     public List<WbsTreeSynchronousRecordVo> getProjectTemplate(String nodeIds) {
 
@@ -289,6 +340,10 @@ public class WbsTreeSynchronousRecordServiceImpl extends ServiceImpl<WbsTreeSync
                     .eq(WbsTreeSynchronousRecord::getId, wbsTreeSynchronousRecord.getId()));
         }
     }
+
+
+
+
 }
 
 

+ 18 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/config/RedissonConfig.java

@@ -0,0 +1,18 @@
+package org.springblade.meter.config;
+
+import org.redisson.Redisson;
+import org.redisson.api.RedissonClient;
+import org.redisson.config.Config;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class RedissonConfig {
+    @Bean
+    public RedissonClient redissonClient() {
+        Config config = new Config();
+        config.useSingleServer()
+                .setAddress("redis://127.0.0.1:6379");
+        return Redisson.create(config);
+    }
+}

+ 61 - 2
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MiddleMeterApplyController.java

@@ -16,19 +16,25 @@
  */
 package org.springblade.meter.controller;
 
+import com.alibaba.nacos.shaded.com.google.protobuf.ServiceException;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 
 import javax.validation.Valid;
 
+import org.redisson.Redisson;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.redis.cache.BladeRedis;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.meter.dto.MiddleMeterApplyDTO;
 import org.springblade.meter.dto.WbsNodeDTO;
 import org.springblade.meter.entity.AttachmentForm;
 import org.springblade.meter.vo.*;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -39,6 +45,7 @@ import org.springblade.core.boot.ctrl.BladeController;
 
 import java.math.BigDecimal;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 中间计量申请表 控制器
@@ -53,6 +60,9 @@ import java.util.List;
 public class MiddleMeterApplyController extends BladeController {
 
     private final IMiddleMeterApplyService middleMeterApplyService;
+    private final BladeRedis bladeRedis;
+    @Autowired
+    private  RedissonClient redissonClient;
 
 
     /**
@@ -205,10 +215,59 @@ public class MiddleMeterApplyController extends BladeController {
             @ApiImplicitParam(name = "contractId", value = "合同id", required = true),
             @ApiImplicitParam(name = "contractPeriodId", value = "合同计量期id", required = true)
     })
-    public R<String> getMeterNumber(MiddleMeterApply middleMeterApply) {
-        return R.data(middleMeterApplyService.getMeterNumber(middleMeterApply));
+    public R<String> getMeterNumber(MiddleMeterApply middleMeterApply) throws ServiceException {
+        RLock lock = redissonClient.getLock("getMeterNumber:" + middleMeterApply.getContractId() + ":" + middleMeterApply.getContractPeriodId());
+        // 不指定leaseTime,Redisson会自动续期(默认30秒,可通过Config配置)
+        lock.lock();
+        try {
+            String meterNumber = middleMeterApplyService.getMeterNumber(middleMeterApply);
+            String redisKey = "getMeterNumber:" + middleMeterApply.getContractId() + ":" + middleMeterApply.getContractPeriodId() + ":" + meterNumber;
+
+            if (bladeRedis.exists(redisKey)) {
+                // 初始编号已存在,生成新编号
+                String meterNumber1 = getMeterNumber1(meterNumber, middleMeterApply.getContractId(), middleMeterApply.getContractPeriodId());
+                String newRedisKey = "getMeterNumber:" + middleMeterApply.getContractId() + ":" + middleMeterApply.getContractPeriodId() + ":" + meterNumber1;
+                bladeRedis.setEx(newRedisKey, meterNumber1, 300L);
+                return R.data(meterNumber1); // 返回新编号
+            } else {
+                bladeRedis.setEx(redisKey, meterNumber, 300L);
+                return R.data(meterNumber);
+            }
+        } finally {
+            // 确保锁释放(判断是否持有锁,避免异常场景下误释放)
+            if (lock.isHeldByCurrentThread()) {
+                lock.unlock();
+            }
+        }
+    }
+
+    public String getMeterNumber1(String meterNumber, Long contractId, Long contractPeriodId) throws ServiceException {
+        // 校验编号格式,避免substring异常
+        int lastDashIndex = meterNumber.lastIndexOf("-");
+        if (lastDashIndex == -1) {
+            throw new ServiceException("编号格式错误,缺少分隔符 '-'");
+        }
+        String prefix = meterNumber.substring(0, lastDashIndex + 1);
+        int lastNumber = Integer.parseInt(meterNumber.substring(lastDashIndex + 1));
+
+        // 循环生成新编号,直到不存在于Redis中
+        while (true) {
+            lastNumber++;
+            String newMeterNumber = prefix + lastNumber;
+            String redisKey = "getMeterNumber:" + contractId + ":" + contractPeriodId + ":" + newMeterNumber;
+            // 如果新编号不存在,则返回
+            if (!bladeRedis.exists(redisKey)) {
+                return newMeterNumber;
+            }
+            // 防止无限循环(极端情况:连续N个编号都被占用,可加最大次数限制)
+            if (lastNumber > 1000) { // 例如最多尝试1000次
+                throw new ServiceException("生成编号失败,尝试次数过多");
+            }
+        }
     }
 
+
+
     /**
      * 获取本期计量总金额
      */