1
0

2 Commitit a4253666da ... 43a59c5f22

Tekijä SHA1 Viesti Päivämäärä
  cr 43a59c5f22 检查元素库的元素 根据key和html上的元素是否对应 4 päivää sitten
  cr 6cfd403737 优化支座垫石特殊公式 4 päivää sitten

+ 122 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaZhiZuo.java

@@ -16,6 +16,8 @@ import org.springblade.manager.utils.RandomNumberHolder;
 import org.springframework.stereotype.Component;
 
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 
 @Component
@@ -116,6 +118,126 @@ public class FormulaZhiZuo implements FormulaStrategy {
         }
         System.out.println(values);
     }
+     //优化之后的代码 放开注释可直接使用
+//    @Override
+//    public void execute(FormData cur, TableElementConverter tec) {
+//        // 1. 提取关键信息,增加空指针防护
+//        String relyStr = cur.getFormula().getRely();
+//        if (relyStr == null || !relyStr.contains(":")) {
+//            throw new IllegalArgumentException("无效的依赖格式: " + relyStr);
+//        }
+//        String key = relyStr.substring(relyStr.indexOf(':') + 1);
+//
+//        // 2. 获取随机数映射并检查非空
+//        HashMap<Long, String> randomNumberMap = RandomNumberHolder.getRandomNumber();
+//        if (randomNumberMap == null || randomNumberMap.isEmpty()) {
+//            throw new IllegalStateException("随机数映射为空,无法继续处理");
+//        }
+//        Map.Entry<Long, String> firstRandomEntry = randomNumberMap.entrySet().iterator().next();
+//
+//        // 3. 查找对应的表格信息
+//        Optional<TableInfo> tableInfoOpt = tec.getTableInfoList().stream()
+//                .filter(tableInfo -> firstRandomEntry.getKey().toString().equals(tableInfo.getPkeyId()))
+//                .findFirst();
+//        if (!tableInfoOpt.isPresent()) {
+//            throw new IllegalStateException("未找到对应的表格信息,pkeyId: " + firstRandomEntry.getKey());
+//        }
+//        TableInfo targetTableInfo = tableInfoOpt.get();
+//
+//        // 4. 解析数据字符串(预编译正则提升性能)
+//        String dataStr = targetTableInfo.getDataMap().get(key);
+//        if (dataStr == null) {
+//            throw new IllegalArgumentException("表格数据中未找到key: " + key);
+//        }
+//        String[] dataSegments = dataStr.split("☆");
+//        Pattern pattern = Pattern.compile("_\\^_(.*?)_"); // 预编译正则表达式
+//        Map<Integer, Double> keyToValueMap = new HashMap<>();
+//
+//        for (String segment : dataSegments) {
+//            Matcher matcher = pattern.matcher(segment);
+//            if (matcher.find()) {
+//                try {
+//                    Integer mapKey = Integer.parseInt(matcher.group(1));
+//                    int splitIndex = segment.indexOf("_^_");
+//                    if (splitIndex > 0) {
+//                        Double value = Double.valueOf(segment.substring(0, splitIndex));
+//                        keyToValueMap.put(mapKey, value);
+//                    }
+//                } catch (NumberFormatException e) {
+//                    // 记录日志而非中断,提高容错性
+//                    System.err.println("解析数据失败,segment: " + segment + ", 错误: " + e.getMessage());
+//                }
+//            }
+//        }
+//
+//        // 5. 准备目标值列表(清空原有值)
+//        List<ElementData> elementDataList = cur.getValues();
+//        elementDataList.forEach(e -> e.setValue(null));
+//
+//        // 6. 排序并创建Y值到ElementData的映射(优化查找效率)
+//        TreeMap<Integer, Double> sortedDataMap = new TreeMap<>(keyToValueMap);
+//        Map<Integer, ElementData> yToElementMap = new HashMap<>();
+//        for (ElementData data : elementDataList) {
+//            yToElementMap.put(data.getY(), data);
+//        }
+//
+//        // 7. 处理数据(提取重复逻辑为方法)
+//        if (!sortedDataMap.isEmpty()) {
+//            Map.Entry<Integer, Double> firstEntry = sortedDataMap.firstEntry();
+//            processDataRange(sortedDataMap, yToElementMap, firstEntry, 0, 4, 1);
+//            processDataRange(sortedDataMap, yToElementMap, firstEntry, 5, 9, 5);
+//            processDataRange(sortedDataMap, yToElementMap, firstEntry, 10, Integer.MAX_VALUE, 10);
+//        }
+//
+//        System.out.println(elementDataList);
+//    }
+//
+//    /**
+//     * 处理指定范围的数据
+//     * @param sortedDataMap 排序后的数据映射
+//     * @param yToElementMap Y值到ElementData的映射
+//     * @param firstEntry 第一个数据条目
+//     * @param startIndex 起始索引
+//     * @param endIndex 结束索引
+//     * @param offset 偏移量
+//     */
+//    private void processDataRange(TreeMap<Integer, Double> sortedDataMap,
+//                                  Map<Integer, ElementData> yToElementMap,
+//                                  Map.Entry<Integer, Double> firstEntry,
+//                                  int startIndex,
+//                                  int endIndex,
+//                                  int offset) {
+//        if (sortedDataMap.size() < startIndex + 1) {
+//            return; // 数据量不足,直接返回
+//        }
+//
+//        Integer baseKey = firstEntry.getKey() + offset;
+//        Double baseValue = sortedDataMap.get(baseKey);
+//        if (baseValue == null) {
+//            return;
+//        }
+//
+//        for (int i = startIndex; i <= endIndex; i++) {
+//            if (i >= sortedDataMap.size()) {
+//                break;
+//            }
+//
+//            Integer currentKey = baseKey + (i - offset);
+//            Double currentValue = sortedDataMap.get(currentKey);
+//            if (currentValue == null) {
+//                continue;
+//            }
+//
+//            // 计算绝对值差值
+//            Double diffValue = Math.abs(baseValue - currentValue);
+//
+//            // 查找并设置值(O(1)复杂度)
+//            ElementData targetData = yToElementMap.get(currentKey);
+//            if (targetData != null) {
+//                targetData.setValue(diffValue);
+//            }
+//        }
+//    }
 
     @Override
     public boolean accept(FormData fd) {

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

@@ -25,6 +25,7 @@ import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.manager.entity.*;
+import org.springblade.manager.entity.*;
 import org.springblade.repair.util.ExcelInfoUtils;
 import org.springblade.repair.util.FileUtils;
 import org.springblade.resource.feign.NewIOSSClient;
@@ -732,4 +733,47 @@ public class CheckAndRepairController {
           i++;
         }
     }
+
+    /**
+     * 检查元素库的元素 根据key和html上的元素是否对应
+     */
+    @GetMapping("/checkAndRepairElementAndHtml")
+    @Scheduled(cron = "0 00  4 * * ?")
+    public void checkAndRepairElementAndHtml() throws Exception {
+        String sql=" select id,tab_en_name from m_table_info where is_deleted=0";
+        List<TableInfo> TableInfoList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TableInfo.class));
+        int i=TableInfoList.size();
+        for (TableInfo tableInfo : TableInfoList) {
+            String sql1="select e_key,e_name from m_wbs_form_element where f_id="+tableInfo.getId()+" and is_deleted=0";
+            List<WbsFormElement> wbsFormElementList = jdbcTemplate.query(sql1, new BeanPropertyRowMapper<>(WbsFormElement.class));
+            String sql2="select DISTINCT html_url from m_wbs_tree_private where init_table_name='"+tableInfo.getTabEnName()+"' and is_deleted=0 and html_url is not null";
+            List<String> htmlUrlList = jdbcTemplate.query(sql2,new SingleColumnRowMapper<>(String.class));
+            if(!htmlUrlList.isEmpty()&&!wbsFormElementList.isEmpty()){
+                for (String htmlurl : htmlUrlList) {
+                    InputStream inputStream = FileUtils.getInputStreamByUrl(htmlurl);
+                    if(inputStream==null){
+                        continue;
+                    }
+                    String htmlString = IoUtil.readToString(inputStream);
+                    Document doc = Jsoup.parse(htmlString);
+                    for (WbsFormElement wbsFormElement : wbsFormElementList) {
+                        Elements elements = doc.select("[keyname^=" + wbsFormElement.getEKey() + "__]");;
+                        for (Element element : elements) {
+                            element.attr("placeholder", wbsFormElement.getEName());
+                        }
+                    }
+                    try {
+                        File writefile = new File(htmlurl);
+                        FileUtil.writeToFile(writefile, doc.html(), Boolean.parseBoolean("UTF-8"));
+                        System.out.println("修改成功:"+ htmlurl);
+                    }catch (Exception e){
+                        System.out.println("修改html文件异常:"+ htmlurl);
+                    }finally {
+                        inputStream.close();
+                    }
+                }
+            }
+            System.out.println("已处理"+i+"条数据,还剩下条"+(TableInfoList.size()-i)+"数据:"+tableInfo.getId());
+        }
+    }
 }