Browse Source

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

lvy 21 hours ago
parent
commit
e1e7eb9123

+ 9 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java

@@ -66,6 +66,7 @@ public class WbsTreePrivateController extends BladeController {
     private final IExcelTabService iExcelTabService;
     private final JdbcTemplate jdbcTemplate;
     private final IWbsParamService iWbsParamService;
+    private final ExcelTabController excelTabController;
 
     /**
      * 保存项目日志划分
@@ -418,15 +419,18 @@ public class WbsTreePrivateController extends BladeController {
 
                 List<String> keys = wbsFormElements.stream().map(WbsFormElement::getEKey).collect(Collectors.toList());
 
-                //解析html
+
                 // 读取html页面信息
-                InputStream inputStream = null;
+                String htmlString = "";
+                //解析html
                 try {
-                    inputStream = FileUtils.getInputStreamByUrl(htmlUrl);
+                    R excelHtml = excelTabController.getExcelHtml(f.getPKeyId());
+                    htmlString = excelHtml.getData().toString();
                 } catch (Exception e) {
-                    throw new RuntimeException("解析html失败");
                 }
-                String htmlString = IoUtil.readToString(inputStream);
+                if(StringUtil.isEmpty(htmlString)){
+                    throw new RuntimeException("html解析失败");
+                }
                 // 样式集合
                 Document doc = Jsoup.parse(htmlString);
                 //获取所有input标签

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

@@ -169,6 +169,7 @@ public class WbsTreeSynchronousRecordController {
                 .eq(WbsTreeSynchronousRecord::getProjectId, projectId)
                 .eq(WbsTreeSynchronousRecord::getIsDeleted, 0)
                 .ne(WbsTreeSynchronousRecord::getStatus, 2)
+                .orderByDesc(WbsTreeSynchronousRecord::getCreateTime)
         );
         List<WbsTreeSynchronousRecordDTO> wbsTreeSynchronousRecordDTOS = BeanUtil.copyProperties(list, WbsTreeSynchronousRecordDTO.class);
         wbsTreeSynchronousRecordDTOS.forEach(m -> {

+ 64 - 30
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -1480,43 +1480,21 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         Document doc = Jsoup.parse(htmlString);
         Element table = doc.select("table").first();
         Elements td = table.select("td");
-        Map<String, String> set = new HashMap<>();
+        Set<String> set = new HashSet<>();
         for (Element element : td) {
-            if (element.childNodes().size() >= 2) {
-                String title = element.childNodes().get(1).attr("placeholder");
-                if (StringUtils.isNotBlank(title)) {
-                    if (title.contains("&")) {
-                        // 处理 &lt; 之类的转义字符
-                        if (title.contains("&amp;")) {
-                            title = Parser.unescapeEntities(title, false);
-                        }
-                        title = Parser.unescapeEntities(title, false);
+            if (element.childNodes().size() >= 1) {
+                element.childNodes().forEach(f->{
+                    String title = f.attr("placeholder");
+                    if (StringUtils.isNotBlank(title)) {
+                        set.add(title);
                     }
-                    set.put(title, title);
-                }
+                });
             }
         }
         //获取未匹配的字段
         List<WbsFormElement> list = new ArrayList<>();
         if (set != null && set.size() > 0) {
-//            list = baseMapper.getUnMatchField(tabId, set);
-            List<WbsFormElement> elements = jdbcTemplate.query("select * from m_wbs_form_element where f_id = ? and is_deleted = 0", new Object[]{tabId}, new BeanPropertyRowMapper<>(WbsFormElement.class));
-            elements.forEach(wbsFormElement -> {
-                String name = wbsFormElement.getEName();
-                if (StringUtils.isNotBlank(name)) {
-                    if (name.contains("&")) {
-                        // 处理 &lt; 之类的转义字符
-                        if (name.contains("&amp;")) {
-                            name = Parser.unescapeEntities(name, false);
-                        }
-                        name = Parser.unescapeEntities(name, false);
-                    }
-                }
-                if (set.containsKey(name)) {
-                    return;
-                }
-                list.add(wbsFormElement);
-            });
+            list = baseMapper.getUnMatchField(tabId, set);
         }
         return list;
     }
@@ -1735,6 +1713,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     LinkedHashMap<String, String> dataMap2 = tableInfo.getDataMap();
                     /*检查发现有p_key_id缺失的情况,导致表单数据丢失,所以强制覆盖*/
                     dataMap2.put("p_key_id", tableInfo.getPkeyId());
+                    dataMap2=isPartition(wbsTreeContract,tabName,dataMap2);
                     sqlInfo = buildMTableInsertSql(tabName, dataMap2, SnowFlakeUtil.getId(), null, null).toString();
                     //统计保存的字段
 
@@ -1854,6 +1833,61 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
        return R.data(tableInfoList2);
        // return R.success(fileName1);
     }
+    public LinkedHashMap<String ,String> isPartition(WbsTreeContract wbsTreeContract,String tabName,LinkedHashMap<String, String> dataMap2){
+        //判断是否需要移除编号 当工序 子分项 分项的划分编码有一个不为null就移除编号
+        String sqlContractInfo="select * from m_contract_info where id="+wbsTreeContract.getContractId();
+        ContractInfo contractInfo=jdbcTemplate.queryForObject(sqlContractInfo,new BeanPropertyRowMapper<>(ContractInfo.class));
+        if (contractInfo != null && contractInfo.getIsReferenceNumber() == 2) {
+            Boolean b = isPartition1(wbsTreeContract);
+            if(b){
+                String sqlElement = "select e.* from m_wbs_form_element e left join m_table_info t on e.f_id=t.id where t.tab_en_name='" + tabName+"'";
+                List<WbsFormElement> elements = jdbcTemplate.query(sqlElement, new BeanPropertyRowMapper<>(WbsFormElement.class));
+                if (!elements.isEmpty()) {
+                    Map<String, String> bh=new HashMap<>();
+                    bh.put("编号","编号");
+                    bh.put("编号:","编号");
+                    bh.put("编号:","编号");
+                    bh.put("工程编号","编号");
+                    bh.put("分项工程编号","编号");
+                    bh.put("单元工程编码","编号");
+                    bh.put("编 号","编号");
+                    bh.put("分项工程编号:","编号");
+                    bh.put("分项工程编号:","编号");
+                    for (WbsFormElement element : elements) {
+                        if(bh.containsKey(element.getEName())){
+                            dataMap2.remove(element.getEKey());
+                            break;
+                        }
+                    }
+                    return dataMap2;
+                }
+            }
+
+        }
+        return dataMap2;
+    }
+    public Boolean isPartition1(WbsTreeContract wbsTreeContract){
+        if(StringUtils.isNotEmpty(wbsTreeContract.getAncestorsPId())){
+            List<WbsTreeContract> list = wbsTreeContractService.getBaseMapper().selectList(Wrappers.<WbsTreeContract>query().lambda().in(WbsTreeContract::getPKeyId, Func.toLongList(",", wbsTreeContract.getAncestorsPId())).in(WbsTreeContract::getNodeType, Arrays.asList(4,5,6)));
+            if(!list.isEmpty()){
+                // 获取第一个节点类型为6的元素
+                WbsTreeContract result1 = list.stream().filter(item -> item.getNodeType() == 6).findFirst().orElse(null);
+                if(result1!=null&&StringUtils.isNotEmpty(result1.getPartitionCode())){
+                    return  true;
+                }
+                // 获取第一个节点类型为5的元素
+                WbsTreeContract result2 = list.stream().filter(item -> item.getNodeType() == 5).findFirst().orElse(null);
+                if(result2!=null&&StringUtils.isNotEmpty(result2.getPartitionCode())){
+                    return true;
+                }
+                WbsTreeContract result3 = list.stream().filter(item -> item.getNodeType() == 4).findFirst().orElse(null);
+                if(result3!=null&&StringUtils.isNotEmpty(result3.getPartitionCode())){
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
     public String reason(String log) {
         /*保存的时候错误提示例如:字段过短提示 yangyj*/
         StringBuilder sb = new StringBuilder();

+ 36 - 14
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/NumberStringSubtraction.java

@@ -29,7 +29,7 @@ public class NumberStringSubtraction {
 
             for (int aNum : aNumbers) {
                 // 在b数字中找到最接近且小于等于aNum的数字
-                int bestB = findClosestLessOrEqual(aNum, sortedBNumbers);
+                int bestB = findClosestWithPreference(aNum, sortedBNumbers);
                 result.add(aNum - bestB);
             }
         }
@@ -37,27 +37,49 @@ public class NumberStringSubtraction {
         return result;
     }
 
-    private static int findClosestLessOrEqual(int aNum, List<Integer> sortedBNumbers) {
-        // 默认值,如果没有找到合适的就用0
-        int closest = 0;
+    private static int findClosestWithPreference(int aNum, List<Integer> sortedBNumbers) {
+        // 如果b列表为空,返回0
+        if (sortedBNumbers.isEmpty()) {
+            return 0;
+        }
+
+        // 找到所有与aNum差值最小的数字
+        List<Integer> closestNumbers = new ArrayList<>();
         int minDiff = Integer.MAX_VALUE;
 
         for (int bNum : sortedBNumbers) {
-            if (bNum <= aNum) {
-                int diff = aNum - bNum;
-                if (diff < minDiff) {
-                    minDiff = diff;
-                    closest = bNum;
-                }
+            int diff = Math.abs(aNum - bNum);
+            if (diff < minDiff) {
+                minDiff = diff;
+                closestNumbers.clear();
+                closestNumbers.add(bNum);
+            } else if (diff == minDiff) {
+                closestNumbers.add(bNum);
+            }
+        }
+
+        // 如果只有一个最接近的数字,直接返回
+        if (closestNumbers.size() == 1) {
+            return closestNumbers.get(0);
+        }
+
+        // 如果有多个相同接近的数字,优先选择小于aNum的
+        List<Integer> greaterThanA = new ArrayList<>();
+        for (int num : closestNumbers) {
+            if (num < aNum) {
+                greaterThanA.add(num);
             }
         }
 
-        // 如果没有找到小于等于aNum的b数字,就使用最小的b数字
-        if (minDiff == Integer.MAX_VALUE && !sortedBNumbers.isEmpty()) {
-            closest = sortedBNumbers.get(0);
+        // 如果有大于aNum的数字,返回其中最小的
+        if (!greaterThanA.isEmpty()) {
+            Collections.sort(greaterThanA);
+            return greaterThanA.get(0);
         }
 
-        return closest;
+        // 如果没有大于aNum的数字,返回最大的那个(最接近但小于等于aNum的)
+        Collections.sort(closestNumbers);
+        return closestNumbers.get(closestNumbers.size() - 1);
     }
 
     private static List<Integer> parseNumbers(String str) {