Explorar el Código

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

# Conflicts:
#	blade-service/blade-dingding/src/main/java/org/springblade/dingding/service/impl/MeetingServiceImpl.java
#	blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/ScrDataServiceImpl.java
cr hace 2 semanas
padre
commit
4ff1baac95
Se han modificado 15 ficheros con 202 adiciones y 73 borrados
  1. 12 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTreeContract.java
  2. 48 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/external/impl/ExternalDataArchiveTreeService.java
  3. 2 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  4. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  5. 0 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TrialSummaryController.java
  6. 2 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  7. 1 1
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVController.java
  8. 10 20
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVDataServiceImpl.java
  9. 64 40
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/ScrDataServiceImpl.java
  10. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TrialSummaryClassificationConfigurationController.java
  11. 49 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ArchiveTreeContractImpl.java
  12. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  13. 8 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/PdfAddimgUtil.java
  14. 1 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java
  15. 2 2
      blade-service/blade-repair/src/main/java/org/springblade/repair/controller/CheckAndRepairController.java

+ 12 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTreeContract.java

@@ -406,6 +406,18 @@ public class ArchiveTreeContract extends BaseEntity {
         this.associationType = 1;
         this.setExtType(1);
 
+
+        if (archiveTree.getExtNodeType() != null) {
+            Integer externalExtNodeType = archiveTree.getExtNodeType();
+            if (externalExtNodeType == 1) {
+                this.extNodeType = 1; // 如果为1,则this同名属性也取1
+            } else if (externalExtNodeType == 2) {
+                this.extNodeType = 2; // 如果为2,则this同名属性取2
+            } else if (externalExtNodeType == 3) {
+                this.extNodeType = 4; // 如果为3,则同名属性取值为4
+            }
+        }
+
 //        this.majorDataType = archiveTree.getMajorDataType();
 //        this.displayHierarchy = archiveTree.getDisplayHierarchy();
         this.isStorageNode = archiveTree.getIsStorage();

+ 48 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/external/impl/ExternalDataArchiveTreeService.java

@@ -220,6 +220,7 @@ public class ExternalDataArchiveTreeService {
         }
     }
 
+
     private void getAddAndUpdateContracts(
             ExternalDataInfo externalDataInfo,
             List<ArchiveTreeContract> externalContracts,
@@ -227,6 +228,53 @@ public class ExternalDataArchiveTreeService {
             List<ArchiveTreeContract> addContracts,
             List<ArchiveTreeContract> upContracts) {
 
+        // 1. 创建本地合同的 Map:key 为 outId,value 为合同对象
+        Map<String, ArchiveTreeContract> localContractMap = new HashMap<>();
+        for (ArchiveTreeContract localContract : localContracts) {
+            String outId = localContract.getOutId();
+            if (outId != null && !outId.isEmpty()) {
+                localContractMap.put(outId, localContract);
+            }
+        }
+
+        // 2. 遍历外部合同,判断新增或更新
+        for (ArchiveTreeContract externalContract : externalContracts) {
+            String externalOutId = externalContract.getOutId();
+
+            // 处理空 outId(根据业务需求决定是否跳过或新增)
+            if (externalOutId == null || externalOutId.isEmpty()) {
+                // addContracts.add(externalContract); // 如果需要处理空 outId 则取消注释
+                continue;
+            }
+
+            // 通过 Map 查找对应的本地合同
+            ArchiveTreeContract localContract = localContractMap.get(externalOutId);
+
+            if (localContract == null) {
+                // 本地不存在该合同,需要新增
+                addContracts.add(externalContract);
+            } else {
+                // 新增的判断逻辑:如果 localContract 的 extNodeType 为 null 或 -1,
+                // 且 externalContract 的 extNodeType 不为 null,则添加到更新列表
+                Integer localExtNodeType = localContract.getExtNodeType();
+                Integer externalExtNodeType = externalContract.getExtNodeType();
+
+                if ((localExtNodeType == null || localExtNodeType == -1)
+                        && externalExtNodeType != null) {
+                    localContract.setExtNodeType(externalExtNodeType);
+                    upContracts.add(localContract);
+                }
+                // 这里可以添加其他更新条件的判断,例如时间戳比较
+            }
+        }
+    }
+    private void getAddAndUpdateContracts1(
+            ExternalDataInfo externalDataInfo,
+            List<ArchiveTreeContract> externalContracts,
+            List<ArchiveTreeContract> localContracts,
+            List<ArchiveTreeContract> addContracts,
+            List<ArchiveTreeContract> upContracts) {
+
         // 1. 提取本地合同的 outId 集合(用于快速判断外部合同是否已存在)
         Set<String> localOutIdSet = localContracts.stream()
                 .map(ArchiveTreeContract::getOutId)  // 直接使用本地合同的 outId 字段

+ 2 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml

@@ -153,6 +153,7 @@
         <result column="archive_name_suffix" property="archiveNameSuffix"/>
         <result column="ext_key_id" property="extKeyId"/>
         <result column="out_id" property="outId"/>
+        <result column="ext_node_type" property="extNodeType"/>
     </resultMap>
 
     <!-- 通用查询映射结果 -->
@@ -1566,7 +1567,7 @@
         where is_deleted = 0
     </select>
     <select id="getOutNodesByOutIds" resultMap="archiveTreeContractResultMap">
-        select id,node_name,parent_id,out_id
+        select id,node_name,parent_id,out_id,ext_node_type
         from m_archive_tree_contract
         where project_id = #{projectId} and is_deleted = 0 and
         out_id in

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

@@ -1884,7 +1884,7 @@ public class TaskController extends BladeController {
             for (TaskParallel taskParallel : taskApproveUserNamesList) {
                 String eVisaContent = taskParallel.getEVisaContent();
                 if(ObjectUtil.isNotEmpty(eVisaContent) && eVisaContent.contains("当前等待电签的批次较多")){
-                    String sql = "INSERT INTO  `u_task_batch` (id,json_data,create_user,update_user,nick_name)VALUES("+i+",'{\"approvalFileList\":[],\"approvalType\":"+businessTaskPageVO.getApprovalType()+",\"comment\":\"OK\",\"flag\":\"OK\",\"formDataId\":\""+businessTaskPageVO.getFormDataId()+"\",\"parallelProcessInstanceId\":\""+taskParallel.getParallelProcessInstanceId()+"\",\"pass\":true,\"taskId\":\""+businessTaskPageVO.getTaskId()+"\"}',"+taskParallel.getTaskUser()+","+taskParallel.getTaskUser()+",'"+taskParallel.getTaskUserName()+"')";
+                    String sql = "INSERT INTO  `u_task_batch` (id,json_data,create_user,update_user,nick_name,update_time)VALUES("+i+",'{\"approvalFileList\":[],\"approvalType\":"+businessTaskPageVO.getApprovalType()+",\"comment\":\"OK\",\"flag\":\"OK\",\"formDataId\":\""+businessTaskPageVO.getFormDataId()+"\",\"parallelProcessInstanceId\":\""+taskParallel.getParallelProcessInstanceId()+"\",\"pass\":true,\"taskId\":\""+businessTaskPageVO.getTaskId()+"\"}',"+taskParallel.getTaskUser()+","+taskParallel.getTaskUser()+",'"+taskParallel.getTaskUserName()+"',SYSDATE())";
                     jdbcTemplate.execute(sql);
                     i++;
                 }

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

@@ -321,8 +321,6 @@ public class TrialSummaryController {
                  }
              }
 
-
-
             String htmlString = this.html(classC.getHtmlUrl());
             Map<String, String> indexMap = this.indexMap(htmlString, map2);
 

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

@@ -656,6 +656,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                     }
                     taskBatch.setNickName(nickName);
                     taskBatch.setCreateTime(new Date());
+                    taskBatch.setUpdateTime(new Date());
                     taskList.add(taskBatch);
                     //设置委托单的状态
                     try {
@@ -2260,7 +2261,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
         String sqlForTaskPall = "UPDATE u_task_parallel a  set a.`status`=2 , a.e_visa_status=1 ,a.e_visa_content='电签成功' where a.process_instance_id in(select process_instance_id  from u_task b  where b.form_data_id in( " + ids2 + ") and b.status in(0,1,2) and b.is_deleted = 0)  and a.`status` in(0,1)";
 
         String taskBtech = "insert into u_task_batch(id,task_parallel_id,json_data,create_user,create_dept,create_time,update_user,update_time,status,is_deleted,nick_name,sign_format,sign_type)  " +
-                " SELECT a.id,a.process_instance_id,json_object('approvalFileList',json_array(),'approvalType',b.approval_type,'comment','','flag','OK','formDataId',b.form_data_id,'parallelProcessInstanceId',a.parallel_process_instance_id,'pass',true,'taskId',b.id) as  json_data,a.task_user,a.create_dept,a.create_time,a.update_user,a.update_time,1 as status,0 as is_deleted,a.task_user_name as nick_name ,1 as sign_format,1 as sign_type from u_task_parallel a,u_task b where b.`status` in(1,2) and a.`status` in(2)  and   a.process_instance_id=b.process_instance_id " +
+                " SELECT a.id,a.process_instance_id,json_object('approvalFileList',json_array(),'approvalType',b.approval_type,'comment','','flag','OK','formDataId',b.form_data_id,'parallelProcessInstanceId',a.parallel_process_instance_id,'pass',true,'taskId',b.id) as  json_data,a.task_user,a.create_dept,a.create_time,a.update_user,SYSDATE(),1 as status,0 as is_deleted,a.task_user_name as nick_name ,1 as sign_format,1 as sign_type from u_task_parallel a,u_task b where b.`status` in(1,2) and a.`status` in(2)  and   a.process_instance_id=b.process_instance_id " +
                 " and b.form_data_id in( " + ids2 + ") and a.parallel_process_instance_id not in(SELECT JSON_EXTRACT(c.json_data, '$.parallelProcessInstanceId') from u_task_batch c)";
 
         if(userIds!=null && userIds.length()>=1){

+ 1 - 1
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVController.java

@@ -58,7 +58,7 @@ public class EVController {
     @Resource(name = "taskExecutor1")
     private ThreadPoolExecutor executor;
 
-    //@Scheduled(cron = "0/10 * * * * ?")
+    @Scheduled(cron = "0/10 * * * * ?")
     public void SignInfo() {
         //执行代码
 

+ 10 - 20
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVDataServiceImpl.java

@@ -190,7 +190,7 @@ public class EVDataServiceImpl implements EVDataService {
                 }
 
                 String sql2 = "INSERT into u_task_batch(id,task_parallel_id,json_data,create_user,create_dept,create_time,update_user,update_time,status,is_deleted,nick_name,sign_format,sign_type)" +
-                        "SELECT " + id + " as id,task_parallel_id,json_data,create_user,create_dept,create_time,update_user,update_time,status,is_deleted,nick_name,sign_format,2 as sign_type from u_task_batch where id=" + batchId + "";
+                        "SELECT " + id + " as id,task_parallel_id,json_data,create_user,create_dept,create_time,update_user,SYSDATE(),status,is_deleted,nick_name,sign_format,2 as sign_type from u_task_batch where id=" + batchId + "";
                 jdbcTemplate.execute(sql2);
             }
         }
@@ -445,24 +445,14 @@ public class EVDataServiceImpl implements EVDataService {
 
             } else if (taskApp.getApprovalType() == 5) {
                 map = this.jdbcTemplate.queryForMap("select * from s_interim_pay_certificate where  is_deleted=0 and contract_period_id = " + taskApp.getFormDataId());
-                String pdfUrl=map.get("raw_url") + "";
+                String pdfUrl = "";
                 //中间计量用逗号拼接pagePdfUrl
-               /* String pageUrl = map.get("page_pdf_url")+"";
-                if(StringUtils.isNotEmpty(pageUrl) && pageUrl.length()>=20 ){
-                    String jsonStr=map.get("page_pdf_url")+"";
-                    ObjectMapper mapper = new ObjectMapper();
-                    JsonNode jsonNode = mapper.readTree(jsonStr);
-                    StringBuilder result = new StringBuilder();
-                    Iterator<Map.Entry<String, JsonNode>> fields = jsonNode.fields();
-                    while (fields.hasNext()) {
-                        Map.Entry<String, JsonNode> entry = fields.next();
-                        result.append(entry.getValue().asText());
-                        if (fields.hasNext()) {
-                            result.append(",");
-                        }
-                    }
-                    pdfUrl=result.toString();
-                }*/
+                String pageUrl = map.get("page_pdf_url")+"";
+                if(StringUtils.isNotEmpty(pageUrl) && pageUrl.length()>=20 ) {
+                    pageUrl = pageUrl.replaceAll(" ", "");
+                }else{
+                    pdfUrl=map.get("raw_url") + "";
+                }
                 taskApp.setSignPdfUrl(pdfUrl);
             } else if (taskApp.getApprovalType() == 6 || taskApp.getApprovalType() == 7) {
                 map = this.jdbcTemplate.queryForMap("select * from  s_material_start_statement where is_deleted=0 and meter_period_id = " + taskApp.getFormDataId());
@@ -906,7 +896,7 @@ public class EVDataServiceImpl implements EVDataService {
             int i = SignFtpUtil.uploadFile(locPdfUrl, inputStream);
             if (i == 1) {
                  result = eVisaService.signPdfByAXQZ(pdfVO, locPdfUrl, OutPdfUrl);
-                if(result!=null){
+                if(result!=null && result[0]!=null){
                     int i1 = SignFtpUtil.downloadFile(dataFileUrl, OutPdfUrl);
                     fileUrl = dataFileUrl;
                     SignFtpUtil.FTPDeleteDir(locPdfUrl);
@@ -921,7 +911,7 @@ public class EVDataServiceImpl implements EVDataService {
         } else {
             result = eVisaService.signPdfByAXQZ(pdfVO, fileByte);
             //执行电签
-            if (result != null) {
+            if(result!=null && result[0]!=null){
                 try {
                     //对文件流做判断
                     byte[] bytes = (byte[]) result[0];

+ 64 - 40
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/ScrDataServiceImpl.java

@@ -34,7 +34,7 @@ public class ScrDataServiceImpl implements ScrDataService {
     @Override
     public void sctTaskBatch(ScrSignInfoVO taskApp) throws Exception {
         // 电签检查
-        this.sctTaskBatch2(taskApp);
+        this.sctTaskBatch3(taskApp);
     }
 
 
@@ -242,8 +242,6 @@ public class ScrDataServiceImpl implements ScrDataService {
                     total = Func.toInt(map.get("total"));
                     pCount = Func.toInt(map.get("pCount"));
                 }
-                Object o = map.get("initiative");
-                Object o1 = map.get("status");
                 if((map.get("initiative")+"").equals("2") && (map.get("status")+"").equals("2")){
                     strArray.add(map.get("task_user").toString());
                 }
@@ -273,12 +271,7 @@ public class ScrDataServiceImpl implements ScrDataService {
                 List<Map<String, Object>> maps2 = null;
                 if (dqIds.length() > 0) {
                     String sqlinfo = " SELECT * from ( SELECT a.id as keyWord,a.project_id,a.pyzbx ,a.pyzby,(SELECT acc_code from blade_user where id='" + strArray.get(i) + "' and is_deleted=0  ) as sealId from m_textdict_info a where  a.type =2 and a.id in (" + dqIds + ")  and sig_role_id in (SELECT DISTINCT c.role_id from m_project_assignment_user c  where c.contract_id=" + task.getContractId() + " and user_id=" + strArray.get(i) + " and c.is_deleted=0 ) ) x where x.sealId is not null ";
-                    if (total==pCount) {
-                        sqlinfo = "SELECT a.id as keyWord,a.pyzbx,a.pyzby,b.certificate_number as sealId from m_textdict_info a ,m_sign_pfx_file b where a.sig_role_id = b.pfx_type and b.project_contract_role like '%" + task.getContractId() + "%' and a.is_deleted=0 and b.is_deleted=0 and a.type=6 and a.id in(" + dqIds + ")";
-                        System.out.println("东方中讯--签章--" + sqlinfo);
-                    } else {
-                        System.out.println("东方中讯--签字--" + sqlinfo);
-                    }
+                    System.out.println("东方中讯--签字--" + sqlinfo);
                     maps2 = jdbcTemplate.queryForList(sqlinfo);
                 }
                 if(CollectionUtil.isNotEmpty(maps2)) {
@@ -303,25 +296,34 @@ public class ScrDataServiceImpl implements ScrDataService {
                         }
                     }
                 }
-             /*   if (signIds.length() > 0 && task.getSigType() != 2) {
-                    String sql = "SELECT * from ( SELECT a.conf_id as keyWord,0.0 as pyzbx ,0.0 as pyzby,(SELECT acc_code from blade_user where id = " + strArray[i] + " and is_deleted=0  ) as sealId " +
-                            "from m_sign_config_relation a where a.type = 1 and a.is_deleted = 0 and a.conf_id in (" + signIds + ") " +
-                            "and a.relation_id in (SELECT DISTINCT c.role_id from m_project_assignment_user c  where c.contract_id= " + task.getContractId() + " and user_id= " + strArray[i] + " and c.is_deleted=0 ) ) x where x.sealId is not null ";
-                    List<Map<String, Object>> maps3 = jdbcTemplate.queryForList(sql);
-                    System.out.println("东方中讯--签字--key =" + sql);
-                    if (!maps3.isEmpty()) {
-                        Map<String, List<Map<String, Object>>> peopleByAge = maps2.stream()
-                                .collect(Collectors.groupingBy(hada -> (Func.toStr(hada.get("keyWord")))));
-                        for (String keyId : peopleByAge.keySet()) {
-                            List<Map<String, Object>> keyList = peopleByAge.get(keyId);
-                            if (keyList != null && !keyList.isEmpty()) {
-                                Map<String, Object> map = keyList.get(0);
-                                map.put("keyWord", "✹" + map.get("keyWord"));
-                                maps.add(map);
+            }
+
+
+
+            String sqlinfo = "SELECT a.id as keyWord,a.pyzbx,a.pyzby,b.certificate_number as sealId from m_textdict_info a ,m_sign_pfx_file b where a.sig_role_id = b.pfx_type and b.project_contract_role like '%" + task.getContractId() + "%' and a.is_deleted=0 and b.is_deleted=0 and a.type=6 and a.id in(" + dqIds + ")";
+            System.out.println("东方中讯--签章--" + sqlinfo);
+            List<Map<String, Object>> maps2 = jdbcTemplate.queryForList(sqlinfo);
+            if(CollectionUtil.isNotEmpty(maps2)) {
+                Map<String, List<Map<String, Object>>> peopleByAge = maps2.stream()
+                        .collect(Collectors.groupingBy(hada -> (Func.toStr(hada.get("keyWord")))));
+                for (String keyId : peopleByAge.keySet()) {
+                    int exId = 0;
+                    List<Map<String, Object>> keyList = peopleByAge.get(keyId);
+                    if (keyList != null && keyList.size() == 1) {
+                        maps.addAll(keyList);
+                        exId = 1;
+                    } else if (keyList != null && keyList.size() >= 2) {
+                        for (Map<String, Object> datax : keyList) {
+                            if ((datax.get("project_id") + "").equals(task.getProjectId())) {
+                                maps.add(datax);
+                                exId = 1;
                             }
                         }
                     }
-                }*/
+                    if (exId == 0) {
+                        maps.add(keyList.get(0));
+                    }
+                }
             }
         }
         return maps;
@@ -583,7 +585,7 @@ public class ScrDataServiceImpl implements ScrDataService {
                     }
                 }
             }
-
+            Map<String, String> dataUserMap = new HashMap<>(dataMap);
             boolean isSign = true;
             //判断章是否签完
             List<String> companList = strategyListByDFZX.stream().filter(item -> item.get("type").equals("2")).map(map -> map.get("keyWord").toString()).collect(Collectors.toList());
@@ -601,23 +603,45 @@ public class ScrDataServiceImpl implements ScrDataService {
                 }
             }
 
-            boolean isSign1 = true;
-            //判断个人是否签完
-            List<String> userList = strategyListByDFZX.stream().filter(item -> item.get("type").equals("1")).map(map -> map.get("keyWord").toString()).collect(Collectors.toList());
-            if (!userList.isEmpty()) {
-                Set<String> differentElements = new HashSet<>(userList);
-                sucessUser.forEach(differentElements::remove);
-                if (!differentElements.isEmpty()) {
-                    isSign1 = false;
-                    StringBuilder sb = new StringBuilder();
-                    sb.append("id = ").append(taskApp.getId()).append(", 人总共:").append(userList.size()).append(", 剩下:").append(differentElements.size());
-                    for (String element : differentElements) {
-                        sb.append(", ").append(element);
+//            boolean isSign1 = true;
+//            //判断个人是否签完
+//            List<String> userList = strategyListByDFZX.stream().filter(item -> item.get("type").equals("1")).map(map -> map.get("keyWord").toString()).collect(Collectors.toList());
+//            if (!userList.isEmpty()) {
+//                Set<String> differentElements = new HashSet<>(userList);
+//                sucessUser.forEach(differentElements::remove);
+//                if (!differentElements.isEmpty()) {
+//                    isSign1 = false;
+//                    StringBuilder sb = new StringBuilder();
+//                    sb.append("id = ").append(taskApp.getId()).append(", 人总共:").append(userList.size()).append(", 剩下:").append(differentElements.size());
+//                    for (String element : differentElements) {
+//                        sb.append(", ").append(element);
+//                    }
+//                    System.err.println(sb);
+//                }
+//            }
+            if(!sucessUser.isEmpty() && isSign){
+                for(String user:sucessUser){
+                    for(String mapkey:dataMap.keySet()){
+                        String mapval = dataMap.get(mapkey);
+                        if(mapval.contains(user)){
+                            dataUserMap.remove(mapkey) ;
+                        }
                     }
-                    System.err.println(sb);
                 }
+                for(String company:sucessCompan){
+                    for(String mapkey:dataMap.keySet()){
+                        String mapval = dataMap.get(mapkey);
+                        if(mapval != null && (mapval.equals(company) || mapval.equals(company+"\r"))){
+                            dataUserMap.remove(mapkey) ;
+                        }
+                    }
+                }
+                if(!dataUserMap.isEmpty()){
+                    isSign = false ;
+                }
+                System.out.println(taskApp.getId() +"-"+"个人总共:" + sucessUser.size() + "-剩下-" +dataUserMap.keySet().size());
             }
-            if (isSign && isSign1) {
+            if (isSign ) {
                 String sql2 = "UPDATE u_information_query set chek_status=2 where id='" + taskApp.getId() + "'";
                 jdbcTemplate.execute(sql2);
             } else {

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TrialSummaryClassificationConfigurationController.java

@@ -170,6 +170,7 @@ public class TrialSummaryClassificationConfigurationController extends BladeCont
                         .in(WbsTreePrivate::getParentId, ids).eq(WbsTreePrivate::getProjectId, projectId)
                         .eq(WbsTreePrivate::getWbsType, wbsType)
                         .eq(WbsTreePrivate::getType, 2)
+                        .isNull(WbsTreePrivate::getTrialTabContractId)
                         .eq(WbsTreePrivate::getWbsId, wbsId));
                 List<SelectedTabVO> list = new ArrayList<>();
                 for (WbsTreePrivate wbsTreePrivate : wbsTreePrivates) {

+ 49 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ArchiveTreeContractImpl.java

@@ -1,5 +1,7 @@
 package org.springblade.manager.feign;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.archive.dto.JiLinQueryDto;
@@ -13,6 +15,8 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 @RestController
 @AllArgsConstructor
@@ -166,10 +170,54 @@ public class ArchiveTreeContractImpl implements ArchiveTreeContractClient {
         return archiveTreeContractMapper.getOutNodesByOutIds(projectId,outIds);
     }
 
+//    @Override
+//    public void updateArchiveTreeContract(List<ArchiveTreeContract> archiveTreeContracts) {
+//        archiveTreeContractService.updateBatchById(archiveTreeContracts);
+//    }
+
     @Override
     public void updateArchiveTreeContract(List<ArchiveTreeContract> archiveTreeContracts) {
-        archiveTreeContractService.updateBatchById(archiveTreeContracts);
+        // 1. 提取传入合同列表中的所有ID(过滤空值)
+        List<Long> ids = archiveTreeContracts.stream()
+                .map(ArchiveTreeContract::getId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+
+        if (ids.isEmpty()) {
+            return;
+        }
+
+        // 2. 根据ID批量查询现有记录
+        LambdaQueryWrapper<ArchiveTreeContract> wrapper = Wrappers.lambdaQuery();
+        wrapper.in(ArchiveTreeContract::getId, ids);
+        List<ArchiveTreeContract> existContracts = archiveTreeContractService.list(wrapper);
+
+        // 3. 将传入合同列表转换为Map<ID, 合同对象>便于查找
+        Map<Long, ArchiveTreeContract> externalContractMap = archiveTreeContracts.stream()
+                .collect(Collectors.toMap(
+                        ArchiveTreeContract::getId,
+                        Function.identity(),
+                        (existing, replacement) -> existing // 处理重复ID,保留第一个
+                ));
+
+        // 4. 准备更新列表 - 只更新ext_node_type字段
+        List<ArchiveTreeContract> updateList = new ArrayList<>();
+
+        for (ArchiveTreeContract local : existContracts) {
+            ArchiveTreeContract external = externalContractMap.get(local.getId());
+            if (external != null) {
+                // 只更新ext_node_type字段
+                local.setExtNodeType(external.getExtNodeType());
+                updateList.add(local);
+            }
+        }
+
+        // 5. 批量更新(建议分批处理,如每500条一次)
+        if (!updateList.isEmpty()) {
+            archiveTreeContractService.updateBatchById(updateList);
+        }
     }
+
     @Override
     public void addArchiveTreeContract(@RequestBody List<ArchiveTreeContract> archiveTreeContracts, @RequestParam Long rootId){
 //        archiveTreeContractService.saveBatch(archiveTreeContracts);

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

@@ -1037,7 +1037,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 if (!fieldMap.isEmpty()) {
                     Map<String, Object> map1 = fieldMap.stream().filter(map -> map.get("fieldName") != null).collect(Collectors.toMap(map -> map.get("fieldName") + "", map -> map.get("fieldLength")));
                     Object length = map1.get(info.getKey());
-                    if (length != null && Integer.parseInt(length.toString()) > dataCol.length()) {
+                    if (length != null && Integer.parseInt(length.toString()) < dataCol.length()) {
                         flag = true;
                         if (map1.get("key_201") == null) {
                             jdbcTemplate.execute("alter table " + wbsInfo.getInitTableName() + " add column key_201 text ");

+ 8 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/PdfAddimgUtil.java

@@ -120,8 +120,8 @@ public class PdfAddimgUtil {
         float height = pageSize.getHeight();
         float width = pageSize.getWidth();
         if(type.equals("6")){
-            x = width * x - 27+pyzbx;
-            y = height - height * y - 30+pyzby;
+            x = width * x + pyzbx;
+            y = height - height * y + pyzby - 0.5f;
             imagePath = FileUtils.getSysLocalFileUrl()+"print/ht1234567890.png";
         }else{
             x = width * x - 20+pyzbx;
@@ -140,6 +140,12 @@ public class PdfAddimgUtil {
             float newWidth = 75f; // 新的宽度
             float newHeight = image.getScaledHeight() * (newWidth / image.getScaledWidth()); // 根据宽度计算高度
             image.scaleAbsolute(newWidth, newHeight); // 设置图片的新尺寸
+        } else {
+            image.scaleAbsolute(image.getWidth() * (8 / 9f), image.getHeight() * (8 / 9f));
+            float imageWidth = image.getWidth();
+            float imageHeight = image.getHeight();
+            x = x - imageWidth / 2;
+            y = y - imageHeight / 2;
         }
         //调整图片尺寸
         image.setAbsolutePosition(x, y);

+ 1 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java

@@ -4769,7 +4769,7 @@ public class TaskController extends BladeController {
                 String UPSqlJL = " update u_task_parallel a set a.e_visa_status=1,e_visa_content='电签成功',initiative=2 where sort in( SELECT a.fixed_flow_branch_sort from u_task b,u_fixed_flow_link a where b.`status` in(1,2) and b.form_data_id='" + report.getPeriodId() + "' and a.fixed_flow_id=b.fixed_flow_id and a.flow_task_type=2 ) and a.process_instance_id in(SELECT process_instance_id from u_task b where b.`status` in(1,2) and b.form_data_id='" + report.getPeriodId() + "')";
                 String DeSql = "delete from u_task_batch where task_parallel_id in(select b.process_instance_id from u_task b where b.`status` in(1,2) and b.form_data_id=" + report.getPeriodId() + ")";
                 //删除以前存在的电签
-                String sql = "insert into u_task_batch(id,task_parallel_id,json_data,create_user,create_dept,create_time,update_user,update_time,status,is_deleted,nick_name,sign_format,sign_type) " + " SELECT a.id,a.process_instance_id,json_object('approvalFileList',json_array(),'approvalType',b.approval_type,'comment','','flag','OK','formDataId',b.form_data_id,'parallelProcessInstanceId',a.parallel_process_instance_id,'pass',true,'taskId',b.id) as  json_data,a.task_user,a.create_dept,a.create_time,a.update_user,a.update_time,1 as status,0 as is_deleted,a.task_user_name as nick_name ,1 as sign_format,1 as sign_type from u_task_parallel a,u_task b,u_fixed_flow_link c where b.`status` in(1,2) and  a.process_instance_id=b.process_instance_id and c.flow_task_type!=2 and a.sort = c.fixed_flow_branch_sort and c.fixed_flow_id=b.fixed_flow_id and b.form_data_id= '" + report.getPeriodId() + "'";
+                String sql = "insert into u_task_batch(id,task_parallel_id,json_data,create_user,create_dept,create_time,update_user,update_time,status,is_deleted,nick_name,sign_format,sign_type) " + " SELECT a.id,a.process_instance_id,json_object('approvalFileList',json_array(),'approvalType',b.approval_type,'comment','','flag','OK','formDataId',b.form_data_id,'parallelProcessInstanceId',a.parallel_process_instance_id,'pass',true,'taskId',b.id) as  json_data,a.task_user,a.create_dept,a.create_time,a.update_user,SYSDATE(),1 as status,0 as is_deleted,a.task_user_name as nick_name ,1 as sign_format,1 as sign_type from u_task_parallel a,u_task b,u_fixed_flow_link c where b.`status` in(1,2) and  a.process_instance_id=b.process_instance_id and c.flow_task_type!=2 and a.sort = c.fixed_flow_branch_sort and c.fixed_flow_id=b.fixed_flow_id and b.form_data_id= '" + report.getPeriodId() + "'";
 
                 jdbcTemplate.execute(DeSql);
                 jdbcTemplate.execute(UPSql);

+ 2 - 2
blade-service/blade-repair/src/main/java/org/springblade/repair/controller/CheckAndRepairController.java

@@ -157,10 +157,10 @@ public class CheckAndRepairController {
         System.out.println("开始扫描private和contract的html");
         StringBuilder result=new StringBuilder("");
         try {
-            String sql="SELECT a.p_key_id,a.is_type_private_pid FROM m_wbs_tree_contract a,m_wbs_tree_private b WHERE a.html_url != b.html_url AND a.is_type_private_pid=b.p_key_id AND a.type=2 AND a.is_deleted=0 AND b.type=2 AND b.html_url is not NULL AND a.project_id=b.project_id";
+            String sql="SELECT a.p_key_id,a.is_type_private_pid FROM m_wbs_tree_contract a,m_wbs_tree_private b WHERE a.html_url != b.html_url AND a.is_type_private_pid=b.p_key_id AND a.type=2 AND a.is_deleted=0 AND b.type=2 AND b.html_url is not NULL AND a.html !='null' AND b.html_url !='nul' AND a.project_id=b.project_id";
             List<WbsTreeContract> contractListlist = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
             for (WbsTreeContract wbsTreeContract : contractListlist) {
-                String update=" update m_wbs_tree_contract set html_url=(select html_url from m_wbs_tree_private where p_key_id="+wbsTreeContract.getIsTypePrivatePid()+") where p_key_id="+wbsTreeContract.getPKeyId();
+                String update=" update m_wbs_tree_contract set html_url=(select html_url from m_wbs_tree_private where html !='null' and  p_key_id="+wbsTreeContract.getIsTypePrivatePid()+") where p_key_id="+wbsTreeContract.getPKeyId();
                 int i = jdbcTemplate.update(update);
                 if(i!=1){
                     result.append(wbsTreeContract.getPKeyId()+"\n");