Переглянути джерело

Merge remote-tracking branch 'origin/master'

liuyc 2 роки тому
батько
коміт
3a8d109986
28 змінених файлів з 726 додано та 372 видалено
  1. 5 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/feign/ArchiveAutoClient.java
  2. 6 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/DefaultConfig.java
  3. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/MoistureContentDTO.java
  4. 10 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/feign/ArchiveAutoClientImpl.java
  5. 9 5
      blade-service/blade-business/src/main/java/org/springblade/business/controller/DefaultConfigController.java
  6. 2 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  7. 1 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/DefaultConfigMapper.xml
  8. 13 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  9. 35 158
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java
  10. 18 102
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  11. 0 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java
  12. 5 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/MixProportionInfoController.java
  13. 248 53
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ITurnPointCalculator.java
  14. 5 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/TurnPoint.java
  15. 0 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaTurnPoint.java
  16. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ExcelTabMapper.java
  17. 8 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ExcelTabMapper.xml
  18. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/MixProportionInfoMapper.java
  19. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/MixProportionInfoMapper.xml
  20. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java
  21. 3 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IMixProportionInfoService.java
  22. 1 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java
  23. 24 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java
  24. 62 15
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  25. 9 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  26. 40 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/MixProportionInfoServiceImpl.java
  27. 9 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FTPUtils.java
  28. 197 13
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FileUtils.java

+ 5 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/feign/ArchiveAutoClient.java

@@ -1,5 +1,6 @@
 package org.springblade.archive.feign;
 
+import org.springblade.archive.entity.ArchiveProjectConfig;
 import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.archive.vo.ArchivesAutoVO;
 import org.springblade.common.constant.ArchiveConstant;
@@ -26,4 +27,8 @@ public interface ArchiveAutoClient {
 
     @PostMapping(API_PREFIX + "/saveArchiveAutoById")
     ArchivesAuto saveArchiveAutoById(@RequestParam Long id);
+
+
+    @PostMapping(API_PREFIX + "/getByProjectIdOrNew")
+    ArchiveProjectConfig getByProjectIdOrNew(@RequestParam Long projectId);
 }

+ 6 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/DefaultConfig.java

@@ -77,4 +77,10 @@ public class DefaultConfig extends BaseEntity {
 	 * 所属 模式
 	 */
 	private int indexModel;
+
+	/**
+	 * app 是否跳过引导页
+	 */
+	private int appCheck;
+
 }

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/MoistureContentDTO.java

@@ -16,6 +16,9 @@ public class MoistureContentDTO {
     @ApiModelProperty(value = "当前位置")
     private String key ;
 
+    @ApiModelProperty(value = "表单pKeyId")
+    private Long keyId ;
+
     @ApiModelProperty(value = "合同段id")
     private String contractId ;
 

+ 10 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/feign/ArchiveAutoClientImpl.java

@@ -1,11 +1,14 @@
 package org.springblade.archive.feign;
 
 import lombok.AllArgsConstructor;
+import org.springblade.archive.entity.ArchiveProjectConfig;
 import org.springblade.archive.entity.ArchivesAuto;
+import org.springblade.archive.service.IArchiveProjectConfigService;
 import org.springblade.archive.service.IArchivesAutoService;
 import org.springblade.archive.vo.ArchivesAutoVO;
 import org.springblade.core.tool.api.R;
 import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.ArrayList;
@@ -17,6 +20,8 @@ public class ArchiveAutoClientImpl implements ArchiveAutoClient {
 
     private IArchivesAutoService archivesAutoService;
 
+    private final IArchiveProjectConfigService archiveProjectConfigService;
+
     @Override
     public R saveArchiveAutoByNodes(@RequestBody List<ArchivesAuto> list) {
 
@@ -28,4 +33,9 @@ public class ArchiveAutoClientImpl implements ArchiveAutoClient {
     public ArchivesAuto saveArchiveAutoById(Long id) {
         return archivesAutoService.getById(id);
     }
+
+    @Override
+    public ArchiveProjectConfig getByProjectIdOrNew(@RequestParam Long projectId){
+        return archiveProjectConfigService.getByProjectIdOrNew(projectId);
+    }
 }

+ 9 - 5
blade-service/blade-business/src/main/java/org/springblade/business/controller/DefaultConfigController.java

@@ -62,10 +62,11 @@ public class DefaultConfigController extends BladeController {
 	@ApiOperationSupport(order = 1)
 	@ApiOperation(value = "详情", notes = "传入defaultConfig")
 	public R<DefaultConfig> detail(DefaultConfig defaultConfig, BladeUser user) {
-		defaultConfig.setCreateUser(user.getUserId());
-		defaultConfig.setClientId(user.getClientId());
-		DefaultConfig detail = defaultConfigService.getOne(Condition.getQueryWrapper(defaultConfig));
-		return R.data(detail);
+		DefaultConfig oldConfig = this.defaultConfigService.getOne(Wrappers.<DefaultConfig>lambdaQuery()
+				.eq(DefaultConfig::getCreateUser, user.getUserId())
+				.eq(DefaultConfig::getClientId, user.getClientId()));
+
+		return R.data(oldConfig);
 	}
 
 	/**
@@ -144,6 +145,7 @@ public class DefaultConfigController extends BladeController {
         DefaultConfig oldConfig = this.defaultConfigService.getOne(Wrappers.<DefaultConfig>lambdaQuery()
 				.eq(DefaultConfig::getCreateUser, bladeUser.getUserId())
 				.eq(DefaultConfig::getClientId, bladeUser.getClientId()));
+
         if (oldConfig != null) {
             //修改
             if (StringUtils.isNotEmpty(newConfig.getColor())) {
@@ -161,6 +163,9 @@ public class DefaultConfigController extends BladeController {
             if (StringUtils.isNotEmpty(newConfig.getFullScreen())) {
                 oldConfig.setFullScreen(newConfig.getFullScreen());
             }
+			if (StringUtils.isNotEmpty(newConfig.getAppCheck()+"")) {
+				oldConfig.setAppCheck(newConfig.getAppCheck());
+			}
             oldConfig.setOpinionView(newConfig.getOpinionView());
             return R.data(this.defaultConfigService.updateById(oldConfig));
         }
@@ -169,7 +174,6 @@ public class DefaultConfigController extends BladeController {
         newConfig.setCreateUser(AuthUtil.getUserId());
         newConfig.setCreateTime(new Date());
         newConfig.setClientId(bladeUser.getClientId());
-
         return R.status(defaultConfigService.save(newConfig));
     }
 }

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

@@ -180,7 +180,8 @@ public class TaskController extends BladeController {
         R<SmsResponse> result = this.newSmsClient.sendMessage("test_code", JsonUtil.toJson(params), phone);
         if (result.getData().isSuccess()) {
             //记录当前验证码
-            DefaultConfig config = this.defaultConfigService.getOne(Wrappers.<DefaultConfig>lambdaQuery().eq(DefaultConfig::getCreateUser, AuthUtil.getUserId()));
+            DefaultConfig config = this.defaultConfigService.getOne(Wrappers.<DefaultConfig>lambdaQuery().eq(DefaultConfig::getCreateUser, AuthUtil.getUserId())
+                    .isNotNull(DefaultConfig::getSmsCode));
             if (config != null) {
                 //修改
                 config.setSmsCode(code);

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

@@ -22,6 +22,7 @@
         <result column="full_screen" property="fullScreen"/>
         <result column="client_id" property="clientId"/>
         <result column="index_model" property="indexModel"/>
+        <result column="app_check" property="appCheck"/>
     </resultMap>
 
 

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

@@ -999,7 +999,19 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                     String querySql = "select "+tabBusstimeInfo.getColKey()+" from "+tabBusstimeInfo.getTabEnName()+" where p_key_id="+idMap.get(tabBusstimeInfo.getTabEnName());
                     Map<String, Object> maps = jdbcTemplate.queryForMap(querySql);
                     if(maps!=null){
-                        dateInfo = maps.get(tabBusstimeInfo.getColKey())+"";
+                      String  keyData = maps.get(tabBusstimeInfo.getColKey())+"";
+                        if(StringUtils.isNotEmpty(keyData)){
+                            dateInfo = keyData.split("_\\^_")[0];
+                            if(dateInfo.indexOf("年")>=0){
+                                dateInfo = dateInfo.replace("年","-");
+                            }
+                            if(dateInfo.indexOf("月")>=0){
+                                dateInfo = dateInfo.replace("月","-");
+                            }
+                            if(dateInfo.indexOf("日")>=0){
+                                dateInfo = dateInfo.replace("日","");
+                            }
+                        }
                     }
                 }
                 System.out.println("----- 电签成功--------==修改---="+dateInfo);

+ 35 - 158
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -44,6 +44,9 @@ import java.awt.Shape;
 import java.awt.geom.Ellipse2D;
 import java.io.*;
 
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
 import java.util.*;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -222,155 +225,7 @@ public class FormulaUtils {
             e.printStackTrace();
         }
     }
-    /*public static  List<TableInfo> getTableInfoList(JSONArray dataArray) {
-        if (dataArray != null && !dataArray.isEmpty()) {
-            List<TableInfo> result = new ArrayList<>();
-            for (int m = 0; m < dataArray.size(); m++) {
-                TableInfo tableInfo = new TableInfo();
-                JSONObject dataInfo2 = dataArray.getJSONObject(m);
-                //
-                tableInfo.setContractId(dataInfo2.getString("contractId"));
-                tableInfo.setPkeyId(dataInfo2.getString("pkeyId"));
-                tableInfo.setProjectId(dataInfo2.getString("projectId"));
-                //huangjn 填报的类型,施工或监理
-                tableInfo.setClassify(dataInfo2.getString("classify"));
-
-                //设置首件信息
-                setFirstData(dataInfo2, tableInfo);
-//                //设置日志信息
-                setTheLogData(dataInfo2, tableInfo);
-
-                dataInfo2.fluentRemove("contractId")
-                        .fluentRemove("pkeyId")
-                        .fluentRemove("p_key_id")
-                        .fluentRemove("projectId")
-                        .fluentRemove("classify")
-                        .fluentRemove("pickerKey")
-                        .fluentRemove("id")
-                        .fluentRemove("isFirst")
-                        .fluentRemove("firstNodeId")
-                        .fluentRemove("isTheLog")
-                        .fluentRemove("theLogId")
-                        .fluentRemove("linkTabIds")
-                        .fluentRemove("recordTime")
-                        .fluentRemove("businessId")
-                        .fluentRemove("sourceUrl")
-                        .fluentRemove("pdfUrl")
-                        .fluentRemove("firstFileName")
-                        .fluentRemove("");
-                // 计算数据
-                LinkedHashMap<String, List<String>> dataMap = dataInfo2.keySet().stream().filter(e -> e.contains("__")).collect(Collectors.groupingBy(e -> e.split("__")[0], LinkedHashMap<String, List<String>>::new, Collectors.toList()));
-                LinkedHashMap<String, String> dataMap2 = new LinkedHashMap<>();
-                // 字段组合
-                for (String k : dataMap.keySet()) {
-                    if (dataMap.get(k).size() > 1 && !dataMap.get(k).contains("000Z")) {
-                        String[] ziduan = dataMap.get(k).toArray(new String[]{});
-                        String temp = "";
-                        for (int i = 0; i < ziduan.length - 1; i++) {
-                            for (int j = 0; j < ziduan.length - i - 1; j++) {
-                                Integer tr = Integer.parseInt((ziduan[j].split("__")[1]).split("_")[0]);
-                                Integer td = Integer.parseInt(ziduan[j].split("__")[1].split("_")[1]);
-
-                                Integer tr_1 = Integer.parseInt(ziduan[j + 1].split("__")[1].split("_")[0]);
-                                Integer td_1 = Integer.parseInt(ziduan[j + 1].split("__")[1].split("_")[1]);
-
-                                if (tr > tr_1 && td == td_1) { //纵向排序
-                                    temp = ziduan[j];
-                                    ziduan[j] = ziduan[j + 1];
-                                    ziduan[j + 1] = temp;
-                                }
-                            }
-                        }
-
-                        String lastStr = dataInfo2.getString(ziduan[0]) + "_^_" + ziduan[0].split("__")[1];
-                        for (int i = 1; i < ziduan.length; i++) {
-                            String keyData = dataInfo2.getString(ziduan[i]);
-                            if (!keyData.equals("")) {
-                                lastStr += "☆" + dataInfo2.getString(ziduan[i]) + "_^_" + ziduan[i].split("__")[1];
-                            }
-
-                        }
-                        dataMap2.put(k, lastStr);
-                    } else {
-                        String dataVal = dataInfo2.getString(dataMap.get(k).get(0));
-                        dataMap2.put(k, dataVal + "_^_" + dataMap.get(k).get(0).split("__")[1]);
-                    }
-                }
-                dataMap2.put("p_key_id", tableInfo.getPkeyId());
-                tableInfo.setDataMap(dataMap2);
-                result.add(tableInfo);
-            }
-            return result;
-        }
-        return null;
-    }*/
-/*
-    public static void setFirstData(JSONObject dataInfo2, TableInfo tableInfo) {
-        //huangjn 判断是否是首件
-        if (dataInfo2.containsKey("isFirst")) {
-            tableInfo.setIsFirst(dataInfo2.getString("isFirst"));
-        }
-        //huangjn 判断是否是首件
-
-        //首件资料绑定的节点
-        if (dataInfo2.containsKey("firstNodeId")) {
-            tableInfo.setFirstNodeId(dataInfo2.getString("firstNodeId"));
-        }
-        //首件ID(编辑时有值,新增时为空)
-        if (dataInfo2.containsKey("firstId")) {
-            tableInfo.setFirstId(dataInfo2.getString("firstId"));
-        }
-        //源文件
-        if (dataInfo2.containsKey("sourceUrl")) {
-            tableInfo.setSourceUrl(dataInfo2.getString("sourceUrl"));
-        }
-        //pdfUrl
-        if (dataInfo2.containsKey("pdfUrl")) {
-            tableInfo.setPdfUrl(dataInfo2.getString("pdfUrl"));
-        }
-        //文件名称
-        if (dataInfo2.containsKey("firstFileName")) {
-            tableInfo.setFirstFileName(dataInfo2.getString("firstFileName"));
-        }
-        //关联的信息
-        if (dataInfo2.containsKey("linkProcessList")) {
-            tableInfo.setLinkProcessList(dataInfo2.getJSONArray("linkProcessList"));
-        }
-    }
 
-    *//**
-     * 设置日志信息
-     *//*
-    public static void setTheLogData(JSONObject dataInfo2, TableInfo tableInfo) {
-        //huangjn 判断是否是日志
-        if (dataInfo2.containsKey("isTheLog")) {
-            tableInfo.setIsTheLog(dataInfo2.getString("isTheLog"));
-        }
-        //huangjn 判断是否是日志
-
-        //huangjn 日志ID
-        if (dataInfo2.containsKey("theLogId")) {
-            tableInfo.setTheLogId(dataInfo2.getString("theLogId"));
-        }
-        //huangjn 日志ID
-
-        //huangjn 日志勾选的工序
-        if (dataInfo2.containsKey("linkTabIds")) {
-            tableInfo.setLinkTabIds(dataInfo2.getJSONArray("linkTabIds"));
-        }
-        //huangjn 日志勾选的工序
-
-        //huangjn 日志所选时间
-        if (dataInfo2.containsKey("recordTime")) {
-            tableInfo.setRecordTime(dataInfo2.getString("recordTime"));
-        }
-        //huangjn 日志所选时间
-        //huangjn 每份填报数据的id,目前日志专用
-        if (dataInfo2.containsKey("id")) {
-            tableInfo.setBusinessId(dataInfo2.getString("id"));
-        }
-        //huangjn 每份填报数据的id,目前日志专用
-    }*/
 
     /**从元素名称中解析项目名称,细化项目匹配用*/
     public static  String parseItemName(String eName){
@@ -423,6 +278,7 @@ public class FormulaUtils {
         return keywords.stream().anyMatch(s::contains);
     }
 
+    /*回归·测试变量*/
     public static List<String> itemNames =Arrays.asList(
             ""
             ,"压 实 度 (%)下路床 特重、极重交通荷载等级 设计值"
@@ -595,6 +451,7 @@ public class FormulaUtils {
             e.printStackTrace();
         }
     }
+
     public static Map<String, String> getElementCell(String uri){
         return getElementCell(uri,null);
     }
@@ -864,17 +721,37 @@ public class FormulaUtils {
 
     }
 
-/*    public static void main(String[] args) {
-        JSONObject job = new JSONObject();
-        JSONObject job2 = new JSONObject();
-        job2.put("K","K");
-        job.fluentPut("A",1).fluentPut("B",2).fluentPut("C","bird").fluentPut("job",job2);
-        job.forEach((k,v)->{
-           // System.out.println(k);
-            System.out.println(v);
-        });
+    /**字符串sha256映射*/
+    public static String sha256(String input) {
+        try {
+            MessageDigest digest = MessageDigest.getInstance("SHA-256");
+            byte[] encodedHash = digest.digest(input.getBytes(StandardCharsets.UTF_8));
+            StringBuilder hexString = new StringBuilder();
+            for (byte b : encodedHash) {
+                String hex = Integer.toHexString(0xff & b);
+                if (hex.length() == 1) {
+                    hexString.append('0');
+                }
+                hexString.append(hex);
+            }
+            return hexString.toString();
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+
+    /**根据步长获取字符*/
+    public static String getEveryNthChar(String input, int step) {
+        StringBuilder result = new StringBuilder();
+        for (int i = 0; i < input.length(); i += step) {
+            result.append(input.charAt(i));
+        }
+        return result.toString();
+    }
+
+
 
-    }*/
 
 
 }

+ 18 - 102
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -293,112 +293,17 @@ public class ExcelTabController extends BladeController {
 
         String filecode = SnowFlakeUtil.getId() + "";
         String thmlUrl = file_path + filecode + ".html";
-        String thmlUrl2 = file_path + filecode + "123.html";
         String exceUrl = file_path + filecode + "123.xlsx";
-
-        // 解析原始excel
-        Workbook wb = new Workbook();
-        wb.loadFromMHtml(file.getInputStream());
-
-        // 操作
-        Workbook wb2 = new Workbook();
-        wb2.loadFromMHtml(file.getInputStream());
-        Worksheet sheet2 = wb2.getWorksheets().get(0);
-
-        HTMLOptions options = new HTMLOptions();
-        options.setImageEmbedded(true);
-        //获取工作表
-        Worksheet sheet = wb.getWorksheets().get(0);
-        sheet.saveToHtml(thmlUrl, options);
-
-        CellRange[] mergedCells = sheet.getMergedCells();
-        CellRange[] mergedCells3 = sheet2.getMergedCells();
-        Map<String, Map<String, Integer>> xyList = new HashMap<>();
-        int j = 0;
-        for (int i = 0; i < mergedCells.length; i++) {
-            Map<String, Integer> dataMap = new HashMap<>();
-            CellRange mergedCell = mergedCells[i];
-            j = j + 1;
-            mergedCells3[i].getComment().getRichText().setText(j + "");
-            mergedCell.setValue(j + "");
-            dataMap.put("x1", mergedCell.getRow());
-            dataMap.put("x2", mergedCell.getLastRow());
-            dataMap.put("y1", mergedCell.getColumn());
-            dataMap.put("y2", mergedCell.getLastColumn());
-            xyList.put(j + "", dataMap);
-        }
-
-        CellRange[] mergedCells2 = sheet.getCells();
-        CellRange[] mergedCells4 = sheet2.getCells();
-        for (int i = 0; i < mergedCells2.length; i++) {
-            CellRange mergedCell = mergedCells2[i];
-            String data = mergedCell.getComment().getRichText().getText();
-            if (StringUtils.isEmpty(data)) {
-                j = j + 1;
-                mergedCells4[i].getComment().getRichText().setText(j + "");
-                mergedCell.setValue(j + "");
-                Map<String, Integer> dataMap = new HashMap<>();
-                dataMap.put("x1", mergedCell.getRow());
-                dataMap.put("x2", mergedCell.getLastRow());
-                dataMap.put("y1", mergedCell.getColumn());
-                dataMap.put("y2", mergedCell.getLastColumn());
-                xyList.put(j + "", dataMap);
-            }
-        }
-        sheet.saveToHtml(thmlUrl2, options);
-
-        // 组装坐标
-        File html1 = new File(thmlUrl);  // 原始html
-        File html2 = new File(thmlUrl2); // 坐标html
-        InputStream inputStream1 = new FileInputStream(html1);
-        InputStream inputStream2 = new FileInputStream(html2);
-        String htmlString1 = IoUtil.readToString(inputStream1);
-        String htmlString2 = IoUtil.readToString(inputStream2);
-
-        Document doc1 = Jsoup.parse(htmlString1);
-        Element table1 = doc1.select("table").first();
-        Elements trs1 = table1.select("tr");
-        Document doc2 = Jsoup.parse(htmlString2);
-        Element table2 = doc2.select("table").first();
-        Elements trs2 = table2.select("tr");
-
-        for (int i = 0; i < trs1.size(); i++) {
-            Elements td1 = trs1.get(i).select("td");
-            Elements td2 = trs2.get(i).select("td");
-            for (int x = 0; x < td1.size(); x++) {
-                Element cell1 = td1.get(x);
-                Element cell2 = td2.get(x);
-                String html = cell2.html();
-                if (html.indexOf("div") >= 0) {
-                    html = cell2.children().get(0).html();
-                }
-                Map<String, Integer> xyMap = xyList.get(html);
-                if (xyMap != null) {
-                    cell1.attr("x1", xyMap.get("x1") + "");
-                    cell1.attr("x2", xyMap.get("x2") + "");
-                    cell1.attr("y1", xyMap.get("y1") + "");
-                    cell1.attr("y2", xyMap.get("y2") + "");
-                }
-            }
-        }
-
+        FileUtils.excelInfo(file.getInputStream(),exceUrl,thmlUrl,"1");
         // 上传excel文件
-        wb2.saveToFile(exceUrl,FileFormat.Version2013);
-
         BladeFile bladeFile = newIOSSClient.uploadFile(file.getOriginalFilename(),exceUrl);
-
-        File writeFile = new File(thmlUrl);
-        FileUtil.writeToFile(writeFile, doc1.html(), Boolean.parseBoolean("UTF-8"));
-
+      //  R<BladeFile> bladeFile = iossClient.addFileInfo(file);
+      //  BladeFile bladeFile1 = bladeFile.getData();
         detail.setExtension(file.getOriginalFilename());
         detail.setFileUrl(bladeFile.getLink());
         detail.setFileType(3); // 表示为清表信息  1 表示祖节点  2 表示为节点信息 3 表示清表
         detail.setHtmlUrl(thmlUrl);
         excelTabService.saveOrUpdate(detail);
-
-        if (html2.exists()) {
-            html2.delete();
-        }
         // 解析html
         expailHtmlInfo(thmlUrl, detail.getId());
         return R.success("上传成功");
@@ -855,7 +760,7 @@ public class ExcelTabController extends BladeController {
         ProjectInfo projectInfo = projectInfoService.getById(wbsTreePrivate.getProjectId());
         // 添加标题显示
         Elements trs = table.select("tr");
-        for (int i = 0; i < 6; i++) {
+        for (int i = 1; i < 6; i++) {
             Element tr = trs.get(i);
             Elements tds = tr.select("td");
             for (int j = 0; j < tds.size(); j++) {
@@ -2177,10 +2082,8 @@ public class ExcelTabController extends BladeController {
         } catch (Exception e) {
             e.printStackTrace();
         }
-
         //更新缓存
         informationQueryClient.delAsyncWbsTree(contractId);
-
         return R.data("操作成功");
     }
 
@@ -3512,7 +3415,6 @@ public class ExcelTabController extends BladeController {
         InputStream fileInputStream = null;
         if (file1.exists()) {
             fileInputStream = new FileInputStream(file1);
-            ;
         } else {
             String path = sys_file_net_url + fileUrl.replaceAll("//", "/").replaceAll(file_path, "");
             fileInputStream = CommonUtil.getOSSInputStream(path);
@@ -3669,4 +3571,18 @@ public class ExcelTabController extends BladeController {
         }
     }
 
+    /**
+     * 编辑元素,提示未匹配元素
+     */
+    @GetMapping("/getUnMatchField")
+    @ApiOperationSupport(order = 20)
+    @ApiOperation(value = "编辑元素,提示未匹配元素", notes = "返回未匹配元素数组")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "pkeyId", value = "WBS私有库的pkeyId", required = true),
+            @ApiImplicitParam(name = "tabId", value = "表信息id", required = true)
+    })
+    public R<List<WbsFormElement>> getUnMatchField(Long pkeyId,Long tabId) throws FileNotFoundException {
+        return R.data(excelTabService.getUnMatchField(pkeyId,tabId));
+    }
+
 }

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

@@ -66,7 +66,6 @@ public class FormulaController {
     private final IElementFormulaMappingService elementFormulaMappingService;
     private final JdbcTemplate jdbcTemplate;
     private final IContractInfoService contractInfoService;
-    private final ITextdictInfoService textdictInfoService;
     private final IFormulaOptionService formulaOptionService;
     // 合同段服务-
     private final IWbsTreeContractService wbsTreeContractService;

+ 5 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/MixProportionInfoController.java

@@ -17,6 +17,8 @@ import org.springblade.manager.service.IMixProportionInfoService;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import javax.validation.Valid;
+import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
@@ -36,7 +38,8 @@ public class MixProportionInfoController extends BladeController {
     @ApiOperationSupport(order = 5)
     @ApiOperation(value = "计算含水率", notes = "计算含水率")
     @ApiImplicitParams(value = {
-            @ApiImplicitParam(name = "key", value = "当前输入框位置", required = true),
+            @ApiImplicitParam(name = "key", value = "当前输入框位置", required = false),
+            @ApiImplicitParam(name = "pKeyId", value = "表单pKeyId", required = true),
             @ApiImplicitParam(name = "contractId", value = "合同段id", required = true),
             @ApiImplicitParam(name = "designStrength", value = "设计强度", required = true),
             @ApiImplicitParam(name = "sand", value = "黄砂含水率", required = false),
@@ -44,7 +47,7 @@ public class MixProportionInfoController extends BladeController {
             @ApiImplicitParam(name = "macadamTwo", value = "碎石2含水率", required = false),
             @ApiImplicitParam(name = "macadamThree", value = "碎石3含水率", required = false),
     })
-    public R calculateWater(@Valid @RequestBody MoistureContentDTO dto) {
+    public R calculateWater(@Valid @RequestBody MoistureContentDTO dto) throws IOException {
         return mixProportionInfoService.calculateWater(dto);
     }
 

+ 248 - 53
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ITurnPointCalculator.java

@@ -20,49 +20,38 @@ import static org.springblade.manager.formula.TurnPoint.*;
  */
 public interface ITurnPointCalculator {
 
-
+     String ZD_REG="(?i)zd\\d+";
     static List<TurnPoint> create(List<Map<String, Object>> data, LinkedHashMap<String, String> configMap,String g8pcfw) {
+        /*1.验证数据的合理性,如果已经合理则不需要计算,直接返回
+        * 2.尝试补充数据,如果不合理则重新生成转点,并用正尺方式生成
+        * 3.合理性定义(测点前视不存在或者非负数则视线高-测点实测高程在【0.5~4.8】范围,如果前视为负数则视线高-实际高程在【-0.5~-4.8】范围)*/
         if (Func.isNotEmpty(data) && configMap != null) {
             LevelInfo levelInfo = new LevelInfo();
             levelInfo.setDx(g8pcfw);
             List<TurnPoint> tmp = new ArrayList<>();
+            /*是否尝试初步补充数据*/
+            boolean ckecked=true;
             for (int i = 0; i < data.size(); i++) {
                 Map<String, Object> dm = data.get(i);
                 Map<String, Object> dataMap = new HashMap<>(configMap.size() * 2);
                 TurnPoint tp = new TurnPoint(levelInfo, dataMap);
                 /*V判断*/
                 tp.setVertical(StringUtils.isEquals(1, dm.get("vertical")));
-                for (Map.Entry<String, String> kv : configMap.entrySet()) {
-                    String key = kv.getKey();
-                    String field = kv.getValue();
-                    String value = StringUtils.handleNull(dm.get(field));
-                    switch (key) {
-                        case CD:
-                            tp.setName(value);
-                            break;
-                        case YG:
-                            tp.setBmd(value);
-                            break;
-                        case HS:
-                            tp.setH(value);
-                            break;
-                        case QS:
-                            tp.setQ(value);
-                            break;
-                        case SC:
-                            tp.setSc(value);
-                            break;
-                        case SJ:
-                            tp.setSj(value);
-                            break;
-                        case GC:
-                            tp.setDx(value);
-                            break;
-                        default:
-                            dataMap.put(key, value);
+                /*属性赋值*/
+                property(configMap,dataMap,dm,tp);
+                if(ckecked) {
+                    boolean isHead = (i == 0);
+                    boolean isTail = (i == data.size() - 1);
+                    /*检验水准点数据合法性&节点定性&补充缺失闭合点*/
+                    ckecked = identifying(levelInfo, tmp, tp, isHead, isTail);
+                    if(!ckecked){
+                        /*ckecked失败需要主动加入tmp,后续不执行identifying直接add*/
+                        tmp.add(tp);
                     }
+                }else{
+                    tmp.add(tp);
                 }
-                if (i == 0) {
+/*                if (i == 0) {
                     if (tp.checkBmd()) {
                         tp.setType(TurnPoint.BMD);
                         tp.setBmd(tp.getSj0L() + tp.getH0L());
@@ -91,7 +80,7 @@ public interface ITurnPointCalculator {
                         TurnPoint close = new TurnPoint(levelInfo, new HashMap<>());
                         close.setName(levelInfo.getBmdName());
                         close.setSj(levelInfo.getBmdSj());
-                        /*闭合点的偏差范围是±3mm*/
+                        *//*闭合点的偏差范围是±3mm*//*
                         double ldx=Arrays.asList(-0.003,-0.002,-0.001,0.001,0.002,0.003).get(ThreadLocalRandom.current().nextInt(6));
                         close.setSc(close.getSj0L() + ldx);
                         close.setDx(ldx);
@@ -105,11 +94,14 @@ public interface ITurnPointCalculator {
                     }
                 } else {
                     tp.setType(TurnPoint.CE);
-                }
-                tmp.add(tp);
+                }*/
+            }
+            if(!ckecked){
+                tmp.forEach(ITurnPointCalculator::putCache);
+                return tmp;
             }
             /*根据黄飞扬反馈情况,暂时去掉手填转点的可能性,每次重新生成20230803*/
-            tmp.removeIf(e-> ZD.equals(e.getType()));
+            //tmp.removeIf(e-> ZD.equals(e.getType()));
             List<TurnPoint> result = fill(tmp);
             if (ListUtils.isNotEmpty(result)) {
                 return  result;
@@ -118,23 +110,106 @@ public interface ITurnPointCalculator {
         return Collections.emptyList();
     }
 
+    static boolean identifying(LevelInfo levelInfo, List<TurnPoint> tmp,TurnPoint tp,boolean isHead,boolean isTail ){
+        if (isHead) {
+            if (tp.checkBmd()) {
+                tp.setType(TurnPoint.BMD);
+                tp.setBmd(tp.getSj0L() + tp.getH0L());
+                levelInfo.setBmdName(tp.getName());
+                levelInfo.setBmdSj(tp.getSj0L());
+                levelInfo.setSightHeight(tp.getBmd0L());
+            } else {
+                return false;
+            }
+        } else if (tp.getName().matches(ZD_REG)) {
+            tp.setType(TurnPoint.ZD);
+        } else if (isTail) {
+            if (StringUtils.isEquals(tp.getName(), levelInfo.getBmdName())) {
+                if (tp.getSj() == null) {
+                    tp.setSj(levelInfo.getBmdSj());
+                }
+                if (tp.getSc() == null && tp.getQ() == null) {
+                    double ldx = Double.parseDouble(rangeList(1, 0, levelInfo.getDx(), 0.001, 3, 1).get(0).toString());
+                    tp.setSc(tp.getSj0L() + ldx);
+                    tp.setDx(ldx);
+                }
+                tp.setType(TurnPoint.CLOSE);
+            } else {
+                tp.setType(TurnPoint.CE);
+                tmp.add(tp);
+                TurnPoint close = new TurnPoint(levelInfo, new HashMap<>());
+                close.setName(levelInfo.getBmdName());
+                close.setSj(levelInfo.getBmdSj());
+                /*闭合点的偏差范围是±3mm*/
+                double ldx=Arrays.asList(-0.003,-0.002,-0.001,0.001,0.002,0.003).get(ThreadLocalRandom.current().nextInt(6));
+                close.setSc(close.getSj0L() + ldx);
+                close.setDx(ldx);
+                close.setType(TurnPoint.CLOSE);
+                close.getDataMap().put(CD, close.getName());
+                close.getDataMap().put(YG, close.getBmd());
+                close.getDataMap().put(QS, close.getQ());
+                close.getDataMap().put(HS, close.getH());
+                tmp.add(close);
+                return true;
+            }
+        } else {
+            tp.setType(TurnPoint.CE);
+        }
+        tmp.add(tp);
+        return true;
+    }
 
+    static void  property(LinkedHashMap<String, String> configMap,Map<String, Object> dataMap,Map<String, Object> dm ,TurnPoint tp){
+         for (Map.Entry<String, String> kv : configMap.entrySet()) {
+             String key = kv.getKey();
+             String field = kv.getValue();
+             String value = StringUtils.handleNull(dm.get(field));
+             switch (key) {
+                 case CD:
+                     tp.setName(value);
+                     break;
+                 case YG:
+                     tp.setBmd(value);
+                     break;
+                 case HS:
+                     tp.setH(value);
+                     break;
+                 case QS:
+                     tp.setQ(value);
+                     break;
+                 case SC:
+                     tp.setSc(value);
+                     break;
+                 case SJ:
+                     tp.setSj(value);
+                     break;
+                 case GC:
+                     tp.setDx(value);
+                     break;
+                 default:
+                     dataMap.put(key, value);
+             }
+         }
+     }
 
     static List<TurnPoint> fill(List<TurnPoint> turnPointList) {
         if (ListUtils.isNotEmpty(turnPointList)) {
-            Random rd = new Random();
+            /*Random rd = new Random();*/
             LevelInfo info = turnPointList.get(0).getLevelInfo();
             List<TurnPoint> result = new ArrayList<>();
             TurnPoint lastCd = turnPointList.stream().filter(TurnPoint::isCe).reduce((a, b) -> b).orElse(null);
+            /*checked==false的情况下不再计算个点数据,但需要把已有数据放回输出缓存,否则改组数据会被置空*/
+            boolean checked=true;
             for (TurnPoint tp : turnPointList) {
                 try {
                     if (tp.equals(lastCd)) {
                         /*已经是最后一个测点*/
                         tp.getLevelInfo().setHasCe(Boolean.FALSE);
                     }
-                    /*先判断是不是转点*/
-                    if (tp.getType().equals(TurnPoint.ZD)) {
-                        if (Func.isBlank(tp.getQ()) && Func.isBlank(tp.getH()) && Func.isNotBlank(tp.getBmd())) {
+                    if(checked) {
+                        /*先判断是不是转点*/
+                        if (tp.getType().equals(TurnPoint.ZD)) {
+                       /* if (Func.isBlank(tp.getQ()) && Func.isBlank(tp.getH()) && Func.isNotBlank(tp.getBmd())) {
                             double dh = Math.abs(tp.getLevelInfo().getSightHeight() - tp.getBmd0L());
                             double big = BigDecimal.valueOf(rd.nextDouble() * (info.getStep() - dh) + dh).setScale(info.getScale(), ROUND_HALF_UP).doubleValue();
                             double small = big - dh;
@@ -145,7 +220,7 @@ public interface ITurnPointCalculator {
                                 tp.setH(small);
                                 tp.setQ(big);
                             }
-                            /* 更新仪器高*/
+                            *//* 更新仪器高*//*
                             info.setSightHeight(tp.getBmd0L());
                         } else if (Func.isBlank(tp.getQ()) && Func.isNotBlank(tp.getH()) && Func.isNotBlank(tp.getBmd())) {
                             tp.setQ(info.getSightHeight() + tp.getH0L() - tp.getBmd0L());
@@ -161,21 +236,25 @@ public interface ITurnPointCalculator {
                         } else {
                             return Collections.emptyList();
                         }
-                        /*可能存在自动插入转点情况,所以每个转点的序号需要实时计算*/
+                        *//*可能存在自动插入转点情况,所以每个转点的序号需要实时计算*//*
                         if (tp.getLevelInfo().getHasCe()) {
                             tp.setName("ZD" + info.getCloseZd().size());
                             tp.getLevelInfo().getCloseZd().add(tp.clone());
                         } else {
                             tp.getLevelInfo().getCloseZd().remove(tp.getLevelInfo().getCloseZd().size() - 1);
-                        }
-                    } else if (tp.getType().equals(TurnPoint.CLOSE)) {
-                        /*闭合转点*/
-                        tp.setQ(info.getSightHeight() - tp.getSc0L());
+                        }*/
+                            /*转点处理,失败则直接返回空集合*/
+                            checked = tpHandlerZd(info, tp);
+                        } else if (tp.getType().equals(TurnPoint.CLOSE)) {
+                            /*闭合转点*/
+                       /* tp.setQ(info.getSightHeight() - tp.getSc0L());
                         if (tp.needClose()) {
                             result.addAll(tp.close());
-                        }
-                    } else if (tp.getType().equals(TurnPoint.CE)) {
-                        if (StringUtils.isNotEmpty(tp.getSc())) {
+                        }*/
+                            /*闭合点处理*/
+                            tpHandlerClose(result, info, tp);
+                        } else if (tp.getType().equals(TurnPoint.CE)) {
+                        /*if (StringUtils.isNotEmpty(tp.getSc())) {
                             if (StringUtils.isNotEmpty(tp.getSj())) {
                                 tp.setDx(tp.getSc0L() - tp.getSj0L());
                             }
@@ -193,22 +272,30 @@ public interface ITurnPointCalculator {
                         }
                         if (!tp.isVisible()) {
                             result.addAll(tp.limit());
-                        }
-                    } else if (tp.getType().equals(TurnPoint.BMD)) {
-                        TurnPoint st = new TurnPoint(tp.getLevelInfo(), new HashMap<>());
+                        }*/
+                            /*测点处理*/
+                            tpHandlerCe(result, info, tp);
+                        } else if (tp.getType().equals(TurnPoint.BMD)) {
+                      /*  TurnPoint st = new TurnPoint(tp.getLevelInfo(), new HashMap<>());
                         st.setBmd(tp.getBmd());
                         st.setType(TurnPoint.ZD);
-                        tp.getLevelInfo().getCloseZd().add(st);
+                        tp.getLevelInfo().getCloseZd().add(st);*/
+                            /*水准点处理*/
+                            tpHandlerBmd(tp);
+                        }
                     }
-                    tp.getDataMap().put(CD, tp.getName());
+                   /* tp.getDataMap().put(CD, tp.getName());
                     tp.getDataMap().put(YG, tp.getBmd());
                     tp.getDataMap().put(QS, tp.getQ());
                     tp.getDataMap().put(HS, tp.getH());
                     tp.getDataMap().put(SC, tp.getSc());
                     tp.getDataMap().put(SJ, tp.getSj());
-                    tp.getDataMap().put(GC, StringUtils.number2StringZero(StringUtils.isNotEmpty(tp.getDx()) ? tp.getDx0L() * 1000 : "", 0));
+                    tp.getDataMap().put(GC, StringUtils.number2StringZero(StringUtils.isNotEmpty(tp.getDx()) ? tp.getDx0L() * 1000 : "", 0));*/
+                    /*把数据放到输出缓存*/
+                    putCache(tp);
                     result.add(tp);
                 } catch (Exception e) {
+                    e.printStackTrace();
                     tp.getDataMap().put("数据异常", tp.getName());
                     result.add(tp);
                     return result;
@@ -221,4 +308,112 @@ public interface ITurnPointCalculator {
     }
 
 
+    static void tpHandlerBmd(TurnPoint tp){
+        TurnPoint st = new TurnPoint(tp.getLevelInfo(), new HashMap<>());
+        st.setBmd(tp.getBmd());
+        st.setType(TurnPoint.ZD);
+        tp.getLevelInfo().getCloseZd().add(st);
+    }
+    static boolean tpHandlerZd(LevelInfo info ,TurnPoint tp){
+        if(!finalizeZd(tp)) {
+            if (Func.isBlank(tp.getQ()) && Func.isBlank(tp.getH()) && Func.isNotBlank(tp.getBmd())) {
+                double dh = Math.abs(tp.getLevelInfo().getSightHeight() - tp.getBmd0L());
+                double big = BigDecimal.valueOf(ThreadLocalRandom.current().nextDouble() * (info.getStep() - dh) + dh).setScale(info.getScale(), ROUND_HALF_UP).doubleValue();
+                double small = big - dh;
+                if (tp.isHigher()) {
+                    tp.setH(big);
+                    tp.setQ(small);
+                } else {
+                    tp.setH(small);
+                    tp.setQ(big);
+                }
+                /* 更新仪器高*/
+                /*info.setSightHeight(tp.getBmd0L());*/
+            } else if (Func.isBlank(tp.getQ()) && Func.isNotBlank(tp.getH()) && Func.isNotBlank(tp.getBmd())) {
+                tp.setQ(info.getSightHeight() + tp.getH0L() - tp.getBmd0L());
+                /*info.setSightHeight(tp.getBmd0L());*/
+            } else if (Func.isNotBlank(tp.getQ()) && Func.isBlank(tp.getH()) && Func.isNotBlank(tp.getBmd())) {
+                tp.setH(info.getSightHeight() - tp.getQ0L() - tp.getBmd0L());
+               /* info.setSightHeight(tp.getBmd0L());*/
+            } else if (Func.isNotBlank(tp.getQ()) && Func.isNotBlank(tp.getH()) && Func.isBlank(tp.getBmd())) {
+                tp.setBmd(info.getSightHeight() + tp.getH0L() - tp.getQ0L());
+                /*info.setSightHeight(tp.getBmd0L());*/
+            }  else {
+                return false;
+            }
+        }
+        /*更新当前视线高*/
+        info.setSightHeight(tp.getBmd0L());
+        /*可能存在自动插入转点情况,所以每个转点的序号需要实时计算*/
+        if (tp.getLevelInfo().getHasCe()) {
+            tp.setName("ZD" + info.getCloseZd().size());
+            tp.getLevelInfo().getCloseZd().add(tp.clone());
+        } else {
+            tp.getLevelInfo().getCloseZd().remove(tp.getLevelInfo().getCloseZd().size() - 1);
+        }
+        return true;
+    }
+    static void tpHandlerCe(List<TurnPoint> result,LevelInfo info ,TurnPoint tp){
+        if(!finalizeCe(tp)) {
+            if (StringUtils.isNotEmpty(tp.getSc())) {
+                if (StringUtils.isNotEmpty(tp.getSj())) {
+                    tp.setDx(tp.getSc0L() - tp.getSj0L());
+                }
+                tp.setQ(info.getSightHeight() - tp.getSc0L());
+            } else if (StringUtils.isNotEmpty(tp.getSj())) {
+                String dx = rangeList(1, 0, info.getDx(), 1, 0, 1).get(0).toString();
+                tp.setDx(dx);
+                tp.setSc(tp.getSj0L() + tp.getDx0L());
+                tp.setQ(info.getSightHeight() - tp.getSc0L());
+            } else if (StringUtils.isNotEmpty(tp.getQ())) {
+                tp.setSc(info.getSightHeight() - tp.getQ0L());
+                if (tp.getSj() != null) {
+                    tp.setDx(tp.getSj0L() - tp.getSj0L());
+                }
+            }
+        }
+        if (!tp.isVisible()) {
+            result.addAll(tp.limit());
+        }
+    }
+
+    /**验证当前测点数据的合理性*/
+    static boolean finalizeCe(TurnPoint tp){
+        if(Func.isNotBlank(tp.getSc())&&Func.isNotBlank(tp.getSj())&&Func.isNotBlank(tp.getQ())&&Func.isNotBlank(tp.getDx())){
+            /*实测高程=视线高-前视*/
+            boolean f1= tp.getSc0L()==tp.getLevelInfo().getSightHeight()-tp.getQ0L();
+            /*实测高程-设计值高程=偏差值*/
+            boolean f2=tp.getSc0L()-tp.getSj0L()==tp.getDx0L();
+            return f1&&f2;
+        }
+        return false;
+    }
+    /**验证当前转点数据的合理性*/
+    static boolean finalizeZd(TurnPoint tp){
+        if(Func.isNotBlank(tp.getQ()) && Func.isNotBlank(tp.getH()) && Func.isNotBlank(tp.getBmd())){
+            /*仪器高pre+后视cur-前视cur=仪器高cur*/
+            return tp.getLevelInfo().getSightHeight()+tp.getH0L()-tp.getQ0L()==tp.getBmd0L();
+        }
+        return false;
+    }
+
+    static void tpHandlerClose(List<TurnPoint> result,LevelInfo info ,TurnPoint tp){
+        /*闭合转点*/
+        tp.setQ(info.getSightHeight() - tp.getSc0L());
+        if (tp.needClose()) {
+            result.addAll(tp.close());
+        }
+    }
+
+    static void putCache(TurnPoint tp){
+        tp.getDataMap().put(CD, tp.getName());
+        tp.getDataMap().put(YG, tp.getBmd());
+        tp.getDataMap().put(QS, tp.getQ());
+        tp.getDataMap().put(HS, tp.getH());
+        tp.getDataMap().put(SC, tp.getSc());
+        tp.getDataMap().put(SJ, tp.getSj());
+        tp.getDataMap().put(GC, StringUtils.number2StringZero(StringUtils.isNotEmpty(tp.getDx()) ? tp.getDx0L() * 1000 : "", 0));
+    }
+
+
 }

+ 5 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/TurnPoint.java

@@ -229,8 +229,11 @@ public class TurnPoint {
     }
 
     public Boolean isVisible() {
-        /*只有测点落在0.5到step之间才有效*/
+        /*只有测点落在0.5到step之间才有效,负数前视取绝对值*/
         double d = getQ0L();
+        if(d<0){
+            d=  Math.abs(d);
+        }
         return d >= levelInfo.getMin() && d <= levelInfo.getStep();
     }
 
@@ -250,7 +253,7 @@ public class TurnPoint {
     }
 
     public static Random r = new Random();
-
+    /*转点的核心处理算法,当测点不在测量范围会触发*/
     public List<TurnPoint> limit() {
         List<TurnPoint> result = new ArrayList<>();
         double step = levelInfo.getStep();

+ 0 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaTurnPoint.java

@@ -33,9 +33,7 @@ import static org.springblade.manager.formula.TurnPoint.*;
 @Data
 public class FormulaTurnPoint implements FormulaStrategy {
     public static final String TURN_REG = "(?<=T\\(com.mixsmart.utils.CustomFunction\\).TURNPOINT\\()([^)]+)(?=\\))";
-//    private FormData cur;
     static final List<String> KEYS;
-//    private List<String> args;
     /**从节点参数获取G8偏差范围的公式脚本*/
     static final String F_DEV="WP['g8pcfw']";
 

+ 4 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ExcelTabMapper.java

@@ -20,6 +20,7 @@ import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.springblade.business.entity.TrialSelfInspectionRecord;
 import org.springblade.manager.entity.ExcelTab;
+import org.springblade.manager.entity.WbsFormElement;
 import org.springblade.manager.vo.ExceTabTreVO;
 import org.springblade.manager.vo.ExcelTabVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -28,6 +29,7 @@ import org.springblade.manager.vo.ExcelTabWbsTypeVO;
 import org.springblade.manager.vo.WbsTreeVO;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * 清表基础数据表 Mapper 接口
@@ -75,4 +77,6 @@ public interface ExcelTabMapper extends BaseMapper<ExcelTab> {
     List<String> queryTrialRecordId(String nodeId);
 
     ExcelTab getWaterByTableId(@Param("id") Long excelId);
+
+    List<WbsFormElement> getUnMatchField(@Param("tabId") Long tabId, @Param("set") Set<String> set);
 }

+ 8 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ExcelTabMapper.xml

@@ -204,6 +204,14 @@
                                         AND met.id =
                                             (SELECT SUBSTRING_INDEX(alias,',',1)  from m_excel_tab WHERE  id = #{id})
     </select>
+    <select id="getUnMatchField" resultType="org.springblade.manager.entity.WbsFormElement">
+        select * from m_wbs_form_element
+        WHERE f_id = #{tabId}  and is_deleted = 0 and e_name not in
+        <foreach collection="set" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
+
 
     <delete id="removeBussTabInfoById">
         delete from m_wbs_tree_contract where p_key_id = #{pkeyid}

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

@@ -41,4 +41,6 @@ public interface MixProportionInfoMapper extends BaseMapper<MixProportionInfo> {
     List<String> designStrengthList(@Param("contractId") Long contractId);
 
     Integer compareInfo(@Param("number") Set<String> number,@Param("strength") Set<String> strength,@Param("contractId") Long contractId);
+
+    String getExcelUrlByPKeyId(@Param("pKeyId") Long pKeyId);
 }

+ 4 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/MixProportionInfoMapper.xml

@@ -21,4 +21,8 @@
         from m_mix_proportion_info
         WHERE is_deleted = 0 and contract_id = #{contractId}
     </select>
+    <select id="getExcelUrlByPKeyId" resultType="java.lang.String">
+        select html_url from m_wbs_tree_contract
+        WHERE p_key_id = #{pKeyId}
+    </select>
 </mapper>

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

@@ -23,6 +23,7 @@ import org.springblade.core.tool.api.R;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.entity.ExcelEditCallback;
 import org.springblade.manager.entity.ExcelTab;
+import org.springblade.manager.entity.WbsFormElement;
 import org.springblade.manager.enums.ExecuteType;
 import org.springblade.manager.vo.ExceTabTreVO;
 import org.springblade.manager.vo.ExcelTabVO;
@@ -172,4 +173,6 @@ public interface IExcelTabService extends BaseService<ExcelTab> {
      * 已经关联公式元素的单元格灰色背景设置
      */
     void gsColor(Long pKeyId, String nodeId, String projectId, Document doc);
+
+    List<WbsFormElement> getUnMatchField(Long pkeyId, Long tabId) throws FileNotFoundException;
 }

+ 3 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IMixProportionInfoService.java

@@ -7,6 +7,8 @@ import org.springblade.manager.entity.MixProportionInfo;
 import org.springblade.manager.entity.RawMaterialsInfo;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -19,5 +21,5 @@ public interface IMixProportionInfoService extends BaseService<MixProportionInfo
 
     R importMixProportionInfo(MultipartFile file, Long projectId, Long contractId);
 
-    R calculateWater(MoistureContentDTO dto);
+    R calculateWater(MoistureContentDTO dto) throws IOException;
 }

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

@@ -318,10 +318,7 @@ public class ArTreeContractInitServiceImpl {
 
         for (ArchiveTreeContractVO2 ar : archiveTreeContractVO2s) {
             //关联质检资料
-            if (ar.getAssociationType() != null
-                    && ar.getAssociationType() == 1
-                    && ar.getDisplayHierarchy() != null
-                    &&  ar.getStorageType() != null &&  ar.getStorageType() == 4) {
+            if (ar.IsQualityAssociationNode()) {
                 List<ArchiveTreeContract> tmpList = getTreeContractFromWbs(tenantId, projectId, wbsId, ar);
                 addNodes.addAll(tmpList);
             }

+ 24 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java

@@ -3,6 +3,9 @@ package org.springblade.manager.service.impl;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springblade.archive.entity.ArchiveProjectConfig;
+import org.springblade.archive.feign.ArchiveAutoClient;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.entity.InformationQuery;
 import org.springblade.business.feign.ArchiveFileClient;
@@ -49,6 +52,8 @@ public class ArchiveTreeContractSyncImpl {
 
     private ExecutorService executorService;
 
+    private final ArchiveAutoClient archiveAutoClient;
+
 
     /**
      * 普通同步
@@ -181,9 +186,13 @@ public class ArchiveTreeContractSyncImpl {
         ArchiveTreeContractVO2 dstTree = ForestNodeMergerEx.getSubTree(dstTrees, dstNodeId);
 
         List<ArchiveTreeContract> saveList = new ArrayList<>();
-        //todo 等测试OK再打开
-        //saveList =arTreeContractInitService.getContractExtNodes(AuthUtil.getTenantId(),projectId,dstTree);
 
+        ArchiveProjectConfig archiveProjectConfig = archiveAutoClient.getByProjectIdOrNew(projectId);
+        //测试阶段,必须打开项目配置才能同步wbs节点
+        if (archiveProjectConfig!= null && archiveProjectConfig.getFactorType().contains("6")) {
+            //todo 等测试OK再打开
+            saveList =arTreeContractInitService.getContractExtNodes(AuthUtil.getTenantId(),projectId,dstTree);
+        }
         return saveList;
     }
 
@@ -452,6 +461,8 @@ public class ArchiveTreeContractSyncImpl {
         //更新的文件
         List<ArchiveFile> updateArchiveFiles = new ArrayList<>();
 
+        Map<Long,String> updateMap = new HashMap<>();
+
         //遍历,所有已归档文件
         for (InformationQuery info: informationQueryList) {
             Long keyId = info.getWbsId();
@@ -484,10 +495,19 @@ public class ArchiveTreeContractSyncImpl {
                 else if (!archiveFile.getPdfFileUrl().equals(info.getEVisaPdfUrl())
                         || (!sort.equals(archiveFile.getSort()))) {
 
+                    if (updateMap.get(archiveFile.getId())!= null) {
+                        continue;
+                    }
+
+                    if (StringUtils.isEmpty(info.getEVisaPdfUrl())) {
+                        continue;
+                    }
+
                     //需要更新的
                     //todo 后续需增加判断已组件或者锁定的不要更新?
                     archiveFile.setPdfFileUrl(info.getEVisaPdfUrl());
                     archiveFile.setEVisaFile(info.getEVisaPdfUrl());
+
                     archiveFile.setFilePage(info.getEVisaPdfPage());
                     archiveFile.setFileSize(info.getEVisaPdfSize());
                     archiveFile.setIsCertification(1);
@@ -495,6 +515,8 @@ public class ArchiveTreeContractSyncImpl {
                     archiveFile.setFileTime(info.getBusinessTime());
                     archiveFile.setSort(sort);
                     updateArchiveFiles.add(archiveFile);
+
+                    updateMap.put(archiveFile.getId(),"1");
                 }
             }
         }

+ 62 - 15
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.log.StaticLog;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -13,6 +14,7 @@ import com.mixsmart.utils.FormulaUtils;
 import com.mixsmart.utils.ListUtils;
 import com.mixsmart.utils.RegexUtils;
 import com.spire.xls.FileFormat;
+import com.spire.xls.Worksheet;
 import lombok.AllArgsConstructor;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
@@ -613,24 +615,25 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 }
                 //获取数据库信息
                 ExcelTab excelTab = baseMapper.selectById(Long.parseLong(tabId));
-                //上传新文件到文件服务器
-                byte[] officeByte = IoUtil.readToByteArray(inputStream);
 
-                FileOutputStream fs = new FileOutputStream(dataUrl);
-                fs.write(officeByte);
-                fs.flush();
+                //上传新文件到文件服务器
+                //excel修改 同步修改html 对象
+                String thmlUrl = file_path + filecode + ".html";
+                FileUtils.excelInfo(inputStream,dataUrl,thmlUrl,"2");
                 BladeFile bladeFile = newIOSSClient.uploadFile(excelTab.getExtension(), dataUrl);
                 //获取文件大小
-                int size = connection.getContentLength() / 1024 / 1024; //单位M
+               int size = connection.getContentLength() / 1024 / 1024; //单位M
                 excelTab.setAttachSize(Long.parseLong(size + ""));
                 excelTab.setStatus(3);
                 excelTab.setFileUrl(bladeFile.getLink());
+                excelTab.setHtmlUrl(thmlUrl);
                 baseMapper.updateById(excelTab);
-                File file = new File(dataUrl);
-               /* if (file.exists()) {
-                    file.delete();
-                }*/
-                System.out.println("123456");
+
+                File file2 = new File(dataUrl);
+                if (file2.exists()) {
+                    file2.delete();
+                }
+                inputStream.close();
             } catch (Exception e) {
                 editCallback.setError(1);
                 e.printStackTrace();
@@ -702,17 +705,56 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                         .filter(e -> e.getFormulaId() != null)
                         .forEach(e -> {
                             String key = e.getField() + "__";
-                            processElements(doc.select("el-input[keyname^=" + key + "]"));
-                            processElements(doc.select("el-date-picker[keyname^=" + key + "]"));
+                            processElements(doc.select("table").first().select("[keyname^=" + key + "]"));
                         });
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
+    public  Element findParentTd(Element element) {
+        Element parent = element.parent();
+        while (parent != null && !parent.tagName().equalsIgnoreCase("td")) {
+            parent = parent.parent();
+        }
+        return parent;
+    }
+
+    /**
+     *编辑元素,提示未匹配元素
+     * @param pkeyId
+     * @param tabId
+     * @return
+     */
+    @Override
+    public List<WbsFormElement> getUnMatchField(Long pkeyId, Long tabId) throws FileNotFoundException {
+        // 获取 节点信息
+        WbsTreePrivate wbsTreePrivate = wbsTreePrivateService.getOne(
+                new LambdaQueryWrapper<WbsTreePrivate>().eq(WbsTreePrivate::getPKeyId,pkeyId));
+        // 读取html页面信息
+        File file1 = ResourceUtil.getFile(wbsTreePrivate.getHtmlUrl());
+        FileInputStream inputStream = new FileInputStream(file1);
+        String htmlString = IoUtil.readToString(inputStream);
+        // 样式集合
+        Document doc = Jsoup.parse(htmlString);
+        Element table = doc.select("table").first();
+        Elements td = table.select("td");
+        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)) {
+                    set.add(title);
+                }
+            }
+        }
+        //获取未匹配的字段
+        List<WbsFormElement> list = baseMapper.getUnMatchField(tabId, set);
+        return list;
+    }
 
     private void processElements(Elements elements) {
-        elements.forEach(element -> element.parent().attr("gscolor", "11"));
+        elements.stream().map(this::findParentTd).filter(Objects::nonNull).forEach(element -> element.attr("gscolor", "11"));
     }
 
     public void dataInfo(List<WbsTreeContract> collect, Map<Long, String> lastList, Map<String, List<WbsTreeContract>> Data) {
@@ -1490,7 +1532,12 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                             if(StringUtils.isNotEmpty(dataJson)){
                                                 JSONArray jsonArray = JSONArray.parseArray(dataJson);
                                                 List<Integer> idList = Func.toIntList(myData);
-                                                String dataInfo = jsonArray.getJSONObject(idList.get(0)-1).getString("name");
+                                                int indexx = 0;
+                                                if(idList.get(0)>=1){
+                                                    indexx =idList.get(0)-1;
+                                                }
+
+                                                String dataInfo = jsonArray.getJSONObject(indexx).getString("name");
                                                 for(int inx=1 ; inx<idList.size() ; inx++){
                                                    int valIndex = idList.get(inx)-1;
                                                     dataInfo = dataInfo+","+jsonArray.getJSONObject(valIndex).getString("name");

+ 9 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -1263,8 +1263,15 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     @Override
     public WbsTreePrivate wtpId(Long pkeyId){
        WbsTreeContract wtc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId,pkeyId));
-       while (wtc.getOldId()!=null){
-           wtc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getId,wtc.getOldId()).eq(WbsTreeContract::getProjectId,wtc.getProjectId()).last(" limit 1 "));
+       int loop=0;
+       while (wtc.getOldId()!=null&&loop<10){
+           loop++;
+           WbsTreeContract tmp = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getId,wtc.getOldId()).eq(WbsTreeContract::getProjectId,wtc.getProjectId()).last(" limit 1 "));
+           if(tmp==null){
+               return this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getId,wtc.getOldId()).eq(WbsTreePrivate::getProjectId,wtc.getProjectId()));
+           }else{
+               wtc=tmp;
+           }
        }
        return this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getId,wtc.getId()).eq(WbsTreePrivate::getProjectId,wtc.getProjectId()));
     }

+ 40 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/MixProportionInfoServiceImpl.java

@@ -7,6 +7,10 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import javassist.runtime.DotClass;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
 import org.springblade.common.utils.ForestNodeMergerEx;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.excel.util.ExcelUtil;
@@ -17,6 +21,8 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.constant.BladeConstant;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.IoUtil;
+import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.manager.dto.ArchiveTreeContractAutoRuleMapDTO;
 import org.springblade.manager.dto.ArchiveTreeDTO;
 import org.springblade.manager.dto.ArchiveTreeSortDTO;
@@ -38,6 +44,10 @@ import org.springblade.manager.vo.WbsTreeVO2;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -121,13 +131,38 @@ public class MixProportionInfoServiceImpl extends BaseServiceImpl<MixProportionI
      * @return
      */
     @Override
-    public R calculateWater(MoistureContentDTO dto) {
+    public R calculateWater(MoistureContentDTO dto) throws IOException {
         if (StringUtils.isBlank(dto.getDesignStrength())){
             throw new ServiceException("请先选择设计强度");
         }
+        //获取表单,获取配合比位置
+        String url = baseMapper.getExcelUrlByPKeyId(dto.getKeyId());
+        // 读取html页面信息
+        File file1 = ResourceUtil.getFile(url);
+//        File file1 = ResourceUtil.getFile("C:\\Users\\泓创研发01\\Desktop\\privateUrl\\1694957051815395328.html");
+        FileInputStream inputStream = new FileInputStream(file1);
+        String htmlString = IoUtil.readToString(inputStream);
+        Document doc = Jsoup.parse(htmlString);
+        Element table = doc.select("table").first();
+        Elements td = table.select("td");
+        Boolean isFiled = false;
+        String key = "";
+        for (Element element : td) {
+            if (isFiled){
+                key = element.childNodes().get(1).attr("keyname");
+                break;
+            }
+            if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(element.text()) && element.text().equals("施工配合比")){
+                isFiled = true;
+            }
+        }
+        if (!isFiled){
+            inputStream.close();
+            return R.data(null);
+        }
         //获取位置前缀后缀
-        String prefix= dto.getKey().replaceAll("__[\\d_]+", "");
-        String suffix = dto.getKey().replaceAll("key_\\d+__", "");
+        String prefix= key.replaceAll("__[\\d_]+", "");
+        String suffix = key.replaceAll("key_\\d+__", "");
         String[] split = suffix.split("_");
         String s1 = split[0];
         Integer s2 = Integer.parseInt(split[1]);
@@ -138,6 +173,7 @@ public class MixProportionInfoServiceImpl extends BaseServiceImpl<MixProportionI
                 .eq(MixProportionInfo::getContractId,dto.getContractId())
                 .eq(MixProportionInfo::getDesignStrength,dto.getDesignStrength()));
         if (info == null){
+            inputStream.close();
             throw new ServiceException("获取配合比信息失败");
         }
         //含水量计算
@@ -193,6 +229,7 @@ public class MixProportionInfoServiceImpl extends BaseServiceImpl<MixProportionI
         //矿渣粉
         BigDecimal slagPowder = info.getSlagPowder();
         map.put(prefix + "__" +s1 + "_" +(s2+8),slagPowder);
+        inputStream.close();
         return R.data(map);
     }
 }

+ 9 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FTPUtils.java

@@ -2,6 +2,8 @@ package org.springblade.manager.utils;
 
 import org.apache.commons.net.ftp.FTPClient;
 
+import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
@@ -35,20 +37,22 @@ public class FTPUtils {
     }
 
     //文件覆盖上传
-/*    public static void main(String[] args) throws Exception {
+    public static void main1(String[] args) throws Exception {
 
-        InputStream input = FileUtils.getInputStreamByUrl("http://192.168.0.109:6371/1534807810770993152.html");
+       // InputStream input = FileUtils.getInputStreamByUrl("http://192.168.0.109:6371/1534807810770993152.html");
+        String dataUrl = "/Users/hongchuangyanfa/Desktop/预览图_千图网_编号357539942.jpg";
+        InputStream input = new FileInputStream(new File(dataUrl));
 
         FTPUtils ftpUtils = new FTPUtils();
         try {
             FTPClient ftp = ftpUtils.getFTPClinet();
             // 获取本地文件并上传
 
-            ftp.changeWorkingDirectory("/Desktop/");//跳转目录
+            ftp.changeWorkingDirectory("/localArchive/");//跳转目录
             ftp.setFileType(FTPClient.BINARY_FILE_TYPE);//必须要设置以二进制的方式传输文件
             ftp.enterLocalPassiveMode();//被动模式
 
-            if (!ftp.storeFile("1534807810770993152.html", input)) {
+            if (!ftp.storeFile("1534807810770993152.jpg", input)) {
                 System.out.println("失败,服务器返回:" + ftp.getReplyString());//获取上传失败的原因
             } else {
                 System.out.println("文件:1534807810770993152.html 上传成功");
@@ -58,6 +62,6 @@ public class FTPUtils {
         } catch (IOException e) {
             System.out.println("ftp连接失败");
         }
-    }*/
+    }
 
 }

+ 197 - 13
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FileUtils.java

@@ -1,11 +1,16 @@
 package org.springblade.manager.utils;
 
+import com.aliyun.oss.common.utils.DateUtil;
 import com.aspose.cells.SaveFormat;
 import com.aspose.cells.Workbook;
 import com.itextpdf.text.Document;
 import com.itextpdf.text.pdf.PdfCopy;
 import com.itextpdf.text.pdf.PdfReader;
 import com.spire.xls.*;
+import com.spire.xls.CellRange;
+import com.spire.xls.collections.CommentsCollection;
+import com.spire.xls.core.INamedRange;
+import com.spire.xls.core.spreadsheet.HTMLOptions;
 import com.sun.image.codec.jpeg.JPEGCodec;
 import com.sun.image.codec.jpeg.JPEGImageEncoder;
 import org.apache.commons.lang.StringUtils;
@@ -29,9 +34,7 @@ import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.common.utils.SystemUtils;
 import org.springblade.common.vo.DataVO;
 import org.springblade.core.tool.api.ResultCode;
-import org.springblade.core.tool.utils.FileUtil;
-import org.springblade.core.tool.utils.IoUtil;
-import org.springblade.core.tool.utils.ResourceUtil;
+import org.springblade.core.tool.utils.*;
 import org.springblade.system.cache.ParamCache;
 
 import javax.imageio.ImageIO;
@@ -40,6 +43,8 @@ import java.awt.image.BufferedImage;
 import java.io.*;
 import java.net.URL;
 import java.net.URLEncoder;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.zip.ZipEntry;
@@ -305,12 +310,6 @@ public class FileUtils {
         }
     }
 
-    public static void main11(String[] args) {
-        String excelPath="/Users/hongchuangyanfa/Downloads/A11 施工放样报验单 (1).xlsx";
-        String pdfPath="/Users/hongchuangyanfa/Downloads/A11 施工放样报验单 (1).pdf";
-
-        FileUtils.setExcelScaleToPdf(excelPath, pdfPath);
-    }
 
     /**
      * excel设置 打印缩放比例
@@ -347,7 +346,7 @@ public class FileUtils {
                 sheet.setHorizontallyCenter(true);//设置打印页面为水平居中
                 sheet.setVerticallyCenter(true);
                 sheet.setAutobreaks(true);
-               // printSetup.setLandscape(false);
+                // printSetup.setLandscape(false);
                 sheet.setMargin(XSSFSheet.BottomMargin, (double) 0.1);// 页边距(下)
                 sheet.setMargin(XSSFSheet.LeftMargin, (double) 0.7);// 页边距(左)
                 sheet.setMargin(XSSFSheet.RightMargin, (double) 0.7);// 页边距(右)
@@ -355,9 +354,9 @@ public class FileUtils {
                 printSetup.setScale((short) 100);//自定义缩放①,此处100为无缩放
                 System.out.print(sheet.getAutobreaks());
                 printSetup.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE);
-              //  printSetup.setFitHeight((short) 1);//设置高度为自动分页
-               // printSetup.setFitWidth((short) 1);//设置宽度为一页
-               // sheet.setFitToPage(true);
+                //  printSetup.setFitHeight((short) 1);//设置高度为自动分页
+                // printSetup.setFitWidth((short) 1);//设置宽度为一页
+                // sheet.setFitToPage(true);
             }
             // Excel文件生成后存储的位置。
             outReport = new ByteArrayOutputStream();
@@ -415,4 +414,189 @@ public class FileUtils {
         return file_path;
     }
 
+
+    public static void main123(String[] args) throws Exception {
+       String excelUrl = "/Users/hongchuangyanfa/Downloads/C4.13路基压实度汇总表.xlsx";
+        String old_html = "/Users/hongchuangyanfa/Desktop/pdf/old_html.html";
+        String old_xlsx = "/Users/hongchuangyanfa/Desktop/pdf/old_html.xlsx";
+
+      //  File data = new File(excelUrl);
+      //  InputStream inputStream = new FileInputStream(data);
+      //  excelInfo(inputStream,old_xlsx,old_html,"1");
+
+        String new_html = "/Users/hongchuangyanfa/Desktop/pdf/new_html.html";
+        String new_xlsx = "/Users/hongchuangyanfa/Desktop/pdf/new_html.xlsx";
+
+        File data = new File(old_xlsx);
+        InputStream inputStream = new FileInputStream(data);
+        excelInfo(inputStream,new_xlsx,new_html,"2");
+    }
+
+
+    /**
+     * 在线编辑excel 操作
+     *
+     * @param fileInputStream
+     * @param excelURL
+     * @param htmlUrl
+     * @throws Exception
+     */
+    public static void excelInfo(InputStream fileInputStream, String excelURL, String htmlUrl, String type) {
+        try {
+            String file_path = FileUtils.getSysLocalFileUrl() + "/pdf/";
+            String filecode = SnowFlakeUtil.getId() + "";
+            String thmlUrl2 = file_path + filecode + "123.html";
+
+            // 解析原始excel
+            com.spire.xls.Workbook wb = new com.spire.xls.Workbook();
+            wb.loadFromMHtml(fileInputStream);
+
+            wb.saveToFile(excelURL, FileFormat.Version2013);
+            // 操作
+            com.spire.xls.Workbook wb2 = new com.spire.xls.Workbook();
+            wb2.loadFromMHtml(excelURL);
+            Worksheet sheet2 = wb2.getWorksheets().get(0);
+
+            HTMLOptions options = new HTMLOptions();
+            options.setImageEmbedded(true);
+            //获取工作表
+            Worksheet sheet = wb.getWorksheets().get(0);
+            sheet.saveToHtml(htmlUrl, options);
+
+            CellRange[] mergedCells = sheet.getMergedCells();
+            Map<String, Map<String, Integer>> xyList = new HashMap<>();
+
+            CellRange[] cellRanges = sheet.getCells();
+
+            int j = 0;
+            int maxVal = 0;
+
+            for (int i = 0; i < cellRanges.length; i++) {
+                CellRange oldcell = cellRanges[i];
+                CellRange mergedCell = sheet.getCellRange(oldcell.getRow(), oldcell.getColumn());
+                String data = mergedCell.getDataValidation().getErrorMessage();
+                int k = 0;
+                if(Func.isNumeric(data)){
+                    k = Func.toInt(data);
+                }
+                if (maxVal < k) {
+                        maxVal = k;
+                }
+            }
+
+            for (int i = 0; i < mergedCells.length; i++) {
+                Map<String, Integer> dataMap = new HashMap<>();
+                CellRange oldcell = mergedCells[i];
+                CellRange mergedCell = sheet.getCellRange(oldcell.getRow(), oldcell.getColumn());
+                String data = mergedCell.getDataValidation().getErrorMessage();
+                System.out.println(mergedCell.getValue()+"---"+data);
+                if (StringUtils.isEmpty(data)) {
+                    if(maxVal<=0){
+                        j = j + 1;
+                    }else{
+                        maxVal = maxVal+1;
+                        j=maxVal;
+                    }
+                } else {
+                    if(Func.isNumeric(data)){
+                        j = Func.toInt(data);
+                    }else {
+                        j = Func.toInt((data.trim().replaceAll("\r|\n", "")).split(":")[1] + "");
+                    }
+                }
+                // 目标表添加备注信息
+                sheet2.getCellRange(oldcell.getRow(), oldcell.getColumn()).getDataValidation().setErrorMessage(j+"");
+                mergedCell.getDataValidation().setErrorMessage(j+"");
+                mergedCell.setValue(j + "");
+                dataMap.put("x1", mergedCell.getRow());
+                dataMap.put("x2", mergedCell.getLastRow());
+                dataMap.put("y1", mergedCell.getColumn());
+                dataMap.put("y2", mergedCell.getLastColumn());
+                xyList.put(j + "", dataMap);
+            }
+
+            // 单个cell
+            for (int i = 0; i < cellRanges.length; i++) {
+                CellRange oldcell = cellRanges[i];
+                CellRange mergedCell = sheet.getCellRange(oldcell.getRow(), oldcell.getColumn());
+                String data = mergedCell.getDataValidation().getErrorMessage();
+                Map<String, Integer> dataMap = new HashMap<>();
+                if (StringUtils.isEmpty(data)) {
+                    if(maxVal<=0){
+                        j = j + 1;
+                    }else{
+                        maxVal = maxVal+1;
+                        j=maxVal;
+                    }
+                } else {
+                    if(Func.isNumeric(data)){
+                        j = Func.toInt(data);
+                    }else {
+                        j = Func.toInt((data.trim().replaceAll("\r|\n", "")).split(":")[1] + "");
+                    }
+                }
+                sheet2.getCellRange(oldcell.getRow(), oldcell.getColumn()).getDataValidation().setErrorMessage(j+"");
+                oldcell.getComment().getRichText().setText(j + "");
+                mergedCell.setValue(j + "");
+                dataMap.put("x1", mergedCell.getRow());
+                dataMap.put("x2", mergedCell.getLastRow());
+                dataMap.put("y1", mergedCell.getColumn());
+                dataMap.put("y2", mergedCell.getLastColumn());
+                xyList.put(j + "", dataMap);
+            }
+            sheet.saveToHtml(thmlUrl2, options);
+
+            // 上传excel文件
+            wb2.saveToFile(excelURL, FileFormat.Version2013);
+
+            // 组装坐标
+            File html1 = new File(htmlUrl);  // 原始html
+            File html2 = new File(thmlUrl2); // 坐标html
+            InputStream inputStream1 = new FileInputStream(html1);
+            InputStream inputStream2 = new FileInputStream(html2);
+            String htmlString1 = IoUtil.readToString(inputStream1);
+            String htmlString2 = IoUtil.readToString(inputStream2);
+
+            org.jsoup.nodes.Document doc1 = Jsoup.parse(htmlString1);
+            Element table1 = doc1.select("table").first();
+            Elements trs1 = table1.select("tr");
+            org.jsoup.nodes.Document doc2 = Jsoup.parse(htmlString2);
+            Element table2 = doc2.select("table").first();
+            Elements trs2 = table2.select("tr");
+
+            for (int i = 0; i < trs1.size(); i++) {
+                Elements td1 = trs1.get(i).select("td");
+                Elements td2 = trs2.get(i).select("td");
+                for (int x = 0; x < td1.size(); x++) {
+                    Element cell1 = td1.get(x);
+                    if (cell1.children().size() >= 1) {
+                        cell1.empty();
+                    }
+                    Element cell2 = td2.get(x);
+                    String html = cell2.text();
+                    Map<String, Integer> xyMap = xyList.get(html);
+                    if (xyMap != null) {
+                        cell1.attr("x1", xyMap.get("x1") + "");
+                        cell1.attr("x2", xyMap.get("x2") + "");
+                        cell1.attr("y1", xyMap.get("y1") + "");
+                        cell1.attr("y2", xyMap.get("y2") + "");
+                        cell1.attr("exceVal",html);
+                    }
+                }
+            }
+
+            File writeFile = new File(htmlUrl);
+            FileUtil.writeToFile(writeFile, doc1.html(), Boolean.parseBoolean("UTF-8"));
+            if (html2.exists()) {
+                html2.delete();
+            }
+            fileInputStream.close();
+            wb2.dispose();
+            wb.dispose();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
 }