Ver código fonte

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

LHB 2 meses atrás
pai
commit
407e3f736b
42 arquivos alterados com 950 adições e 274 exclusões
  1. 10 0
      blade-common/pom.xml
  2. 5 1
      blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java
  3. 77 1
      blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java
  4. 35 21
      blade-common/src/main/java/org/springblade/common/utils/YiKeYunApiUtils.java
  5. 5 2
      blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/SmsEndpoint.java
  6. 2 2
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClient.java
  7. 4 3
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClientFallBack.java
  8. 5 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/MeterApprovalDTO.java
  9. 2 2
      blade-service/blade-business/pom.xml
  10. 25 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/EntrustInfoController.java
  11. 3 3
      blade-service/blade-business/src/main/java/org/springblade/business/controller/NeiYeController.java
  12. 0 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/OperationLogController.java
  13. 4 3
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  14. 6 4
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/EntrustInfoServiceImpl.java
  15. 4 4
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java
  16. 29 19
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/WeatherInfoServiceImpl.java
  17. 2 2
      blade-service/blade-manager/pom.xml
  18. 0 88
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  19. 5 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java
  20. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeService.java
  21. 8 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java
  22. 59 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  23. 16 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  24. 37 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  25. 9 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  26. 17 6
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java
  27. 8 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.java
  28. 29 2
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.xml
  29. 2 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenInventoryMapper.java
  30. 3 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenInventoryMapper.xml
  31. 2 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/InventoryFormMeterMapper.java
  32. 4 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/InventoryFormMeterMapper.xml
  33. 1 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IChangeTokenInventoryService.java
  34. 3 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IInventoryFormMeterService.java
  35. 91 37
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenFormServiceImpl.java
  36. 5 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenInventoryServiceImpl.java
  37. 5 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/InventoryFormMeterServiceImpl.java
  38. 11 0
      blade-service/blade-repair/pom.xml
  39. 1 1
      blade-service/blade-repair/src/main/java/org/springblade/RepairApplication.java
  40. 205 37
      blade-service/blade-repair/src/main/java/org/springblade/repair/controller/CheckAndRepairController.java
  41. 208 0
      blade-service/blade-repair/src/main/java/org/springblade/repair/util/ExcelInfoUtils.java
  42. 1 1
      blade-service/blade-repair/src/main/resources/application-dev.yml

+ 10 - 0
blade-common/pom.xml

@@ -28,6 +28,16 @@
             <artifactId>blade-core-auto</artifactId>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>com.twelvemonkeys.imageio</groupId>
+            <artifactId>imageio-jpeg</artifactId>
+            <version>3.9.4</version>
+        </dependency>
+        <dependency>
+            <groupId>net.coobird</groupId>
+            <artifactId>thumbnailator</artifactId>
+            <version>0.4.14</version>
+        </dependency>
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>

+ 5 - 1
blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java

@@ -77,12 +77,16 @@ public interface LauncherConstant {
      */
     String APPLICATION_XXLJOB_ADMIN_NAME = APPLICATION_NAME_PREFIX + "xxljob-admin";
 
+
+    String  APPLICATION_REPAIR_NAME = APPLICATION_NAME_PREFIX + "repair";
+
+
     /**
      * nacos dev 地址 215==172.31.222.127   192.168.0.109     127.0.0.1  210-=-172.30.224.81
      * nacos dev 地址 172.31.222.127   192.168.0.109     127.0.0.1    172.30.224.81(39.108.216.210) 152.168.2.11
      */
     //更107服务器时打包的时候要改成192.168.0.109
-    //127.0.0.1
+    // 73用这个 127.0.0.1    113要用这个 10.0.0.6
     String NACOS_DEV_ADDR = "127.0.0.1:8848";
 
     /**

+ 77 - 1
blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java

@@ -42,7 +42,7 @@ import java.util.zip.ZipOutputStream;
 import com.drew.metadata.MetadataException;
 import org.springframework.util.ResourceUtils;
 import org.springframework.web.util.UriUtils;
-
+import net.coobird.thumbnailator.Thumbnails;
 /**
  * 通用工具类
  *
@@ -840,6 +840,82 @@ public class CommonUtil {
         return baos.toByteArray();
     }
 
+    public static byte[] compressImage3(String url) throws IOException, ImageProcessingException, MetadataException {
+        try(InputStream file = CommonUtil.getOSSInputStream(url)) {
+            byte[] imageData = InputStreamToBytes(file);
+            return compressImage3(imageData);
+        }
+    }
+
+    public static byte[] compressImage3(byte[] imageData) throws ImageProcessingException, IOException, MetadataException {
+        // 读取原始图像(处理旋转问题)
+        int orientation = 1;
+        Metadata metadata = ImageMetadataReader.readMetadata(new ByteArrayInputStream(imageData));
+        if (metadata.containsDirectoryOfType(ExifIFD0Directory.class)) {
+            ExifIFD0Directory exifIFD0Directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
+            if (exifIFD0Directory.containsTag(ExifIFD0Directory.TAG_ORIENTATION)) {
+                // 获取 Orientation 标签的值
+                orientation = exifIFD0Directory.getInt(ExifIFD0Directory.TAG_ORIENTATION);
+            }
+        }
+        // 缩放图像
+        String formatName = "JPEG";
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        long sizeLimit = 1024*1024*5; //5M 1920 ×1080
+        int width = 1080;
+        int height = 1920;
+        // 需要旋转图片
+        // 1 无需纠正 2 水平翻转(镜像)3 垂直翻转(旋转180°) 4 水平翻转+垂直翻转 5 水平翻转+旋转90°
+        // 6 旋转90° 7 水平翻转+旋转270° 8 +旋转270°
+        float quality = 0.99f; // 初始化压缩质量
+        int retries = 10; // 最多尝试 10 次
+        double rotate = 0;
+        if (orientation > 1) {
+            if (orientation == 3) {
+                rotate = 180;
+            } else if (orientation == 6) {
+                rotate = 90;
+            } else if (orientation == 8) {
+                rotate = 270;
+            }
+        }
+        rotateAndScaleImageByThumbnails(new ByteArrayInputStream(imageData),baos, rotate, formatName, quality, width, height, true);
+        if (baos.size() <= sizeLimit) {
+            // 图片大小已经小于等于目标大小,直接返回原始数据
+            return baos.toByteArray();
+        }
+        ByteArrayInputStream bais;
+        while (baos.size() > sizeLimit && retries > 0) {
+            // 压缩图像并重新计算压缩质量
+            byte[] data = baos.toByteArray();
+            bais = new ByteArrayInputStream(data);
+            rotateAndScaleImageByThumbnails(bais,baos, 0, formatName, quality, width, height, true);
+            float ratio = sizeLimit * 1.0f / baos.size();
+            quality *= Math.sqrt(ratio);
+            retries--;
+        }
+        return baos.toByteArray();
+    }
+
+    /**
+     * @param is URL InputStream File BufferedImage path
+     * @param os 输出流
+     * @param rotate 旋转角度(正数顺时针,负数逆时针)
+     * @param format 输出格式,jpg,jpeg,png等
+     * @param quality  输出质量(0.0-1.0)
+     * @param width 宽
+     * @param height 高
+     * @param keepAspectRatio 是否保持原比例
+     */
+    public static void rotateAndScaleImageByThumbnails(InputStream is, OutputStream os, double rotate, String format, double quality, int width, int height, boolean keepAspectRatio) throws IOException {
+        Thumbnails.of(is)
+                .size(width, height)
+                .keepAspectRatio(keepAspectRatio)
+                .rotate(rotate)
+                .outputFormat(format)
+                .outputQuality(quality)
+                .toOutputStream(os);
+    }
 
     /**
      * 根据起止日期获取工作日

+ 35 - 21
blade-common/src/main/java/org/springblade/common/utils/YiKeYunApiUtils.java

@@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.net.ConnectException;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
@@ -17,6 +18,24 @@ public class YiKeYunApiUtils {
     private static final String API_YIKEYUN_APPID = "97543277";
     private static final String API_YIKEYUN_APPSECRET = "PXd7GE2j";
 
+    public static Map<String, String> getTodayWeatherByAdcodeTry(String adcode) {
+        for (int i = 0; i < 3; i++) {
+            try {
+                return getTodayWeatherByAdcode(adcode);
+            } catch (IOException e) {
+                // 重试
+                try {
+                    Thread.sleep(500);
+                } catch (InterruptedException ex) {
+                    e.printStackTrace();
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                return null;
+            }
+        }
+        return null;
+    }
 
 
     /**
@@ -25,29 +44,24 @@ public class YiKeYunApiUtils {
      * @param adcode
      * @return
      */
-    public static Map<String, String> getTodayWeatherByAdcode(String adcode) {
+    public static Map<String, String> getTodayWeatherByAdcode(String adcode) throws IOException {
         String getUrl = String.format("http://v1.yiketianqi.com/free/day?appid=%s&appsecret=%s&unescape=1&adcode=%s", API_YIKEYUN_APPID, API_YIKEYUN_APPSECRET, adcode);
         Map<String, String> map = new HashMap<>();
-        try {
-            URL url = new URL(getUrl);
-            BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8));
-            String res;
-            StringBuilder sb = new StringBuilder();
-            while ((res = in.readLine()) != null) {
-                sb.append(res.trim());
-            }
-            log.info("获取当天天气 ======= sb.toString():" + sb);
-            JSONObject jsonData = JSONObject.parseObject(sb.toString());
-            map.put("temp", jsonData.get("tem").toString());
-            map.put("weather", jsonData.get("wea").toString());
-            map.put("high", jsonData.get("tem_day").toString());
-            map.put("low", jsonData.get("tem_night").toString());
-            map.put("windLevel", jsonData.get("win_speed").toString());
-            map.put("nums", jsonData.getInteger("nums").toString());
-        } catch (IOException e) {
-            e.printStackTrace();
-            return null;
+        URL url = new URL(getUrl);
+        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8));
+        String res;
+        StringBuilder sb = new StringBuilder();
+        while ((res = in.readLine()) != null) {
+            sb.append(res.trim());
         }
+        log.info("获取当天天气 ======= sb.toString():" + sb);
+        JSONObject jsonData = JSONObject.parseObject(sb.toString());
+        map.put("temp", jsonData.get("tem").toString());
+        map.put("weather", jsonData.get("wea").toString());
+        map.put("high", jsonData.get("tem_day").toString());
+        map.put("low", jsonData.get("tem_night").toString());
+        map.put("windLevel", jsonData.get("win_speed").toString());
+        map.put("nums", jsonData.getInteger("nums").toString());
         return map;
     }
 
@@ -119,7 +133,7 @@ public class YiKeYunApiUtils {
             });
 
 
-        } catch (IOException e) {
+        } catch (Exception e) {
             e.printStackTrace();
             return null;
         }

+ 5 - 2
blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/SmsEndpoint.java

@@ -19,6 +19,7 @@ package org.springblade.resource.endpoint;
 import io.swagger.annotations.Api;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
+import org.springblade.core.secure.BladeUser;
 import org.springblade.core.sms.model.SmsCode;
 import org.springblade.core.sms.model.SmsData;
 import org.springblade.core.sms.model.SmsResponse;
@@ -91,8 +92,10 @@ public class SmsEndpoint {
      */
     @SneakyThrows
     @PostMapping("/send-message")
-    public R sendMessage(@RequestParam String code, @RequestParam String params, @RequestParam String phones) {
-        SmsData smsData = new SmsData(JsonUtil.readMap(params, String.class, String.class));
+    public R sendMessage(BladeUser user, @RequestParam String code, @RequestParam String params, @RequestParam String phones) {
+        Map<String, String> paramss = JsonUtil.readMap(params, String.class, String.class);
+        paramss.put("name",user.getNickName());
+        SmsData smsData = new SmsData(paramss);
         return send(code, smsData, phones);
     }
 

+ 2 - 2
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClient.java

@@ -77,11 +77,11 @@ public interface ExcelTabClient {
     R getPdfS(@RequestParam String nodeId, @RequestParam String classify, @RequestParam String contractId) throws IOException;
 
     @PostMapping(API_PREFIX + "/saveOrUpdate")
-    void saveOrUpdate(@RequestBody ExcelTab detail);
+    boolean saveOrUpdate(@RequestBody ExcelTab detail);
 
     @PostMapping(API_PREFIX + "/expailHtmlInfo")
     void expailHtmlInfo(@RequestParam String thmlUrl, @RequestParam Long id, @RequestParam String s) throws Exception;
 
     @PostMapping(API_PREFIX + "/excelInfo")
-    void excelInfo(@RequestParam InputStream inputStream, @RequestParam String exceUrl, @RequestParam String thmlUrl, @RequestParam String number);
+    void excelInfo(@RequestPart("file") MultipartFile file, @RequestParam String exceUrl, @RequestParam String thmlUrl, @RequestParam String number) throws IOException;
 }

+ 4 - 3
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ExcelTabClientFallBack.java

@@ -77,8 +77,8 @@ public class ExcelTabClientFallBack implements ExcelTabClient {
     }
 
     @Override
-    public void saveOrUpdate(ExcelTab detail) {
-
+    public boolean saveOrUpdate(ExcelTab detail) {
+        return true;
     }
 
     @Override
@@ -87,9 +87,10 @@ public class ExcelTabClientFallBack implements ExcelTabClient {
     }
 
     @Override
-    public void excelInfo(InputStream inputStream, String exceUrl, String thmlUrl, String number) {
+    public void excelInfo(MultipartFile file, String exceUrl, String thmlUrl, String number) throws IOException {
 
     }
 
 
+
 }

+ 5 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/dto/MeterApprovalDTO.java

@@ -5,6 +5,8 @@ import lombok.Data;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
 
 @Data
 public class MeterApprovalDTO implements Serializable {
@@ -45,5 +47,8 @@ public class MeterApprovalDTO implements Serializable {
     @ApiModelProperty("施工单位送审金额")
     private BigDecimal submitApprovalMoney;
 
+    @ApiModelProperty("变更令批量上报ids")
+    private String ids;
+
 
 }

+ 2 - 2
blade-service/blade-business/pom.xml

@@ -194,7 +194,7 @@
                     <target>${java.version}</target>
                     <encoding>${project.build.sourceEncoding}</encoding>
                     <compilerArguments>
-                        <bootclasspath>${java.home}/lib/rt.jar:${java.home}/lib/jce.jar:${java.home}/lib/jsse.jar
+                        <bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar;${java.home}/lib/jsse.jar
                         </bootclasspath>
                     </compilerArguments>
                 </configuration>
@@ -202,4 +202,4 @@
         </plugins>
     </build>
 
-</project>
+</project>

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

@@ -33,10 +33,13 @@ import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.entity.WbsTreePrivate;
+import org.springblade.manager.feign.WbsTreePrivateClient;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 
@@ -53,6 +56,7 @@ import java.util.List;
 public class  EntrustInfoController extends BladeController {
 
 	private final IEntrustInfoService entrustInfoService;
+	private final WbsTreePrivateClient wbsTreePrivateClient;
 
 	/**
 	 * 详情
@@ -168,7 +172,27 @@ public class  EntrustInfoController extends BladeController {
 		if(id==null && Func.isNull(id)){
 			return R.fail("id不能为空");
 		}
-		EntrustDataInfoVO reportDetail = entrustInfoService.getReportDetail(id);
+		EntrustInfo entrustInfo = entrustInfoService.getById(id);
+		if (entrustInfo == null) {
+			return R.fail("id不存在");
+		}
+		WbsTreePrivate wbsTreePrivate = null;
+		if (entrustInfo.getNodeId() != null) {
+			List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateClient.queryByPKeyIds(Collections.singletonList(entrustInfo.getNodeId()));
+			if (wbsTreePrivates != null && !wbsTreePrivates.isEmpty()) {
+				wbsTreePrivate = wbsTreePrivates.get(0);
+			}
+		}
+		EntrustDataInfoVO reportDetail;
+		if (wbsTreePrivate != null && wbsTreePrivate.getNodeType() == 51) {
+			reportDetail = new EntrustDataInfoVO();
+			reportDetail.setId(entrustInfo.getId() + "");
+			reportDetail.setEntrustInfo(entrustInfo.getEntrustInfo());
+			reportDetail.setEntrustName(wbsTreePrivate.getNodeName());
+			reportDetail.setExpCount(entrustInfo.getExpCount());
+		} else {
+			reportDetail = entrustInfoService.getReportDetail(id);
+		}
 		return R.data(reportDetail);
 	}
 

+ 3 - 3
blade-service/blade-business/src/main/java/org/springblade/business/controller/NeiYeController.java

@@ -369,7 +369,7 @@ public class NeiYeController {
                     if(info!=null){
                         if(info.indexOf("优良")>=0){
                             vo1.setGoodCount(1);
-                            vo1.setPassCount(0);
+                            vo1.setPassCount(1);
                             vo1.setGoodRate("100%");
                         }else {
                             vo1.setGoodCount(0);
@@ -427,7 +427,7 @@ public class NeiYeController {
                             if(info.indexOf("优良")>=0){
                                 if(type==2){
                                     vo2.setGoodCount(1);
-                                    vo2.setPassCount(0);
+                                    vo2.setPassCount(1);
                                     vo2.setGoodRate("100%");
                                 }else {
                                     goodCount++;
@@ -454,7 +454,7 @@ public class NeiYeController {
                 else if(type==1){
                     vo1.setUnitCount(unitCount);
                     vo1.setGoodCount(goodCount);
-                    vo1.setPassCount(passCount);
+                    vo1.setPassCount(passCount + goodCount);
                     vo1.setGoodRate(calculatePercentage(goodCount,unitCount));
                     vo1.setId(SnowFlakeUtil.getId());
                     voList.add(vo1);

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

@@ -158,8 +158,6 @@ public class OperationLogController extends BladeController {
         if (StringUtils.isNotEmpty(operationLog.getQueryValue())) {
             wrapper.lambda().like(OperationLog::getOperationContent, operationLog.getQueryValue());
         }
-
-
         IPage<OperationLog> pages = new Page<>(query.getCurrent(),query.getSize());
 //        IPage<OperationLog> pages = operationLogService.page(Condition.getPage(query), wrapper.lambda().orderBy(true, false, OperationLog::getCreateTime));
         pages = logMapper.getPage(pages,operationLog);

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

@@ -190,11 +190,12 @@ public class TaskController extends BladeController {
     @PostMapping("/send-notice")
     @ApiOperationSupport(order = 10)
     @ApiOperation(value = "短信验证")
-    public R<Boolean> sendNotice(@RequestParam String phone) {
+    public R<Boolean> sendNotice(BladeUser user,@RequestParam String phone) {
 //        String code = CommonUtil.getCharAndNumber(4);
         String code = String.valueOf((int) (Math.random() * 9000 + 1000));
         Map<String, String> params = new HashMap<>(3);
         params.put("code", code);
+        params.put("name", user.getNickName());
         R<SmsResponse> result = this.newSmsClient.sendMessage("test_code", JsonUtil.toJson(params), phone);
         if (result.getData().isSuccess()) {
             //记录当前验证码
@@ -1513,7 +1514,7 @@ public class TaskController extends BladeController {
                             task -> task));
         }
         //所有满足条件的日志 转map
-        String logQuery = "select business_id,create_user_name ,create_time, operation_type, save_data from u_operation_log where  operation_content like '%废除%'";
+        String logQuery = "select business_id,create_user_name ,create_time, operation_type, save_data from u_operation_log where operation_type in (6,9,26,61,62)";
         List<OperationLog> operationLogs = jdbcTemplate.query(logQuery, new BeanPropertyRowMapper<>(OperationLog.class));
         if(ObjectUtil.isNotEmpty(operationLogs)){
              operationLogMap = operationLogs.stream().collect(Collectors.groupingBy(OperationLog::getBusinessId));
@@ -1808,7 +1809,7 @@ public class TaskController extends BladeController {
                             task -> task));
         }
         //所有满足条件的日志 转map
-        String logQuery = "select business_id,create_user_name ,create_time from u_operation_log where  operation_content like '%废除%'";
+        String logQuery = "select business_id,create_user_name ,create_time, operation_type, save_data from u_operation_log where operation_type in (6,9,26,61,62)";
         List<OperationLog> operationLogs = jdbcTemplate.query(logQuery, new BeanPropertyRowMapper<>(OperationLog.class));
         if(ObjectUtil.isNotEmpty(operationLogs)){
             operationLogMap = operationLogs.stream().collect(Collectors.groupingBy(OperationLog::getBusinessId));

+ 6 - 4
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/EntrustInfoServiceImpl.java

@@ -122,9 +122,11 @@ public class EntrustInfoServiceImpl extends BaseServiceImpl<EntrustInfoMapper, E
 		}
 		String sampleId = "";
 		String contractId = "";
-        String sqlNodeName="select node_name from m_wbs_tree_private where p_key_id="+dataInfo.getString("nodeId");
-        String nodeName = jdbcTemplate.queryForObject(sqlNodeName, new SingleColumnRowMapper<>(String.class));
-        if(!nodeName.equals("回弹法检测混凝土抗压强度")&&!nodeName.equals("路基压实度")&&!nodeName.equals("地基承载力")&&!nodeName.equals("路基路面弯沉")&&!nodeName.equals("锚杆")&&!nodeName.equals("喷射混凝土厚度")){
+        String sqlNodeName="select node_name, node_type from m_wbs_tree_private where p_key_id="+dataInfo.getString("nodeId");
+		Map<String, Object> wbsTreePrivateMap = jdbcTemplate.queryForMap(sqlNodeName);
+		String nodeName = wbsTreePrivateMap.get("node_name").toString();
+		String nodeType = wbsTreePrivateMap.get("node_type").toString();
+		if(!"51".equals(nodeType) && !nodeName.equals("回弹法检测混凝土抗压强度")&&!nodeName.equals("路基压实度")&&!nodeName.equals("地基承载力")&&!nodeName.equals("路基路面弯沉")&&!nodeName.equals("锚杆")&&!nodeName.equals("喷射混凝土厚度")){
             // 创建 委托单信息
             if(!dataInfo.containsKey("sampleId")){
                 return R.fail("取样信息为sampleId不存在");
@@ -149,7 +151,7 @@ public class EntrustInfoServiceImpl extends BaseServiceImpl<EntrustInfoMapper, E
         if(!dataInfo.containsKey("sampleId")){
             entrustInfo.setSampleStatus("0");
         }else {
-            if(!nodeName.equals("回弹法检测混凝土抗压强度")&&!nodeName.equals("路基压实度")&&!nodeName.equals("地基承载力")&&!nodeName.equals("路基路面弯沉")&&!nodeName.equals("锚杆")){
+            if(!"51".equals(nodeType) && !nodeName.equals("回弹法检测混凝土抗压强度")&&!nodeName.equals("路基压实度")&&!nodeName.equals("地基承载力")&&!nodeName.equals("路基路面弯沉")&&!nodeName.equals("锚杆")){
                 entrustInfo = baseMapper.selectOne(Wrappers.<EntrustInfo>query().lambda().eq(EntrustInfo::getSampleId, sampleId).eq(EntrustInfo::getContractId,contractId));
             }else {
                 entrustInfo = baseMapper.selectOne(Wrappers.<EntrustInfo>query().lambda().eq(EntrustInfo::getId,dataInfo.get("id")).eq(EntrustInfo::getContractId,contractId));

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

@@ -62,7 +62,6 @@ import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.SingleColumnRowMapper;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -188,7 +187,7 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
                      }
                 }
                 //合并的pdfUrl
-                String pdf = this.getMergePdfToTrialNew(record.getContractId(), record.getId());
+                String pdf = this.getMergePdfToTrialNew(record.getContractId(), record.getId(), dto.getType());
                 record.setPdfUrl(pdf);
             }
 
@@ -264,11 +263,12 @@ public class TrialSelfInspectionRecordServiceImpl extends BaseServiceImpl<TrialS
      *新增返回该试验材料报告关联的委托单pdf也拼接在后面
      * @param contractId
      * @param nodeId
+     * @param type
      * @return
      * @throws FileNotFoundException
      */
-    private String getMergePdfToTrialNew(Long contractId, Long nodeId) throws FileNotFoundException {
-        String sql = "select pdf_url,e_visa_pdf_url from u_information_query where wbs_id='" + nodeId + "' and contract_id ='" + contractId + "'";
+    private String getMergePdfToTrialNew(Long contractId, Long nodeId, Integer type) throws FileNotFoundException {
+        String sql = "select pdf_url,e_visa_pdf_url from u_information_query where wbs_id='" + nodeId + "' and contract_id ='" + contractId + "' and classify = '" + type + "'" ;
         List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
         if (maps.size() >= 1) {
             Map<String, Object> stringObjectMap = maps.get(0);

+ 29 - 19
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/WeatherInfoServiceImpl.java

@@ -37,12 +37,10 @@ import java.io.IOException;
 import java.math.BigDecimal;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.time.Duration;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
+import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -141,20 +139,21 @@ public class WeatherInfoServiceImpl extends ServiceImpl<WeatherInfoMapper, Weath
                 }
                 Map<String, String> weatherMap = cachedWeatherMap.get(area.getCity_code());
                 if (weatherMap == null) {
-                    //获取天气信息(百度天气)
                     String nums = stringRedisTemplate.opsForValue().get("blade-business::contractArea:yiKeYun:todayWeatherNums");
-                    if (nums != null && Integer.parseInt(nums) <= 19000) {
-                        weatherMap = YiKeYunApiUtils.getTodayWeatherByAdcode(area.getCity_code() + "000000");
-                    }
-                    if (weatherMap == null) {
-                        weatherMap = BaiduApiUtil.getTodayWeather(area.getCity_code());
-                    }
-                    if (weatherMap != null) {
-                        cachedWeatherMap.put(area.getCity_code(), weatherMap);
-                        if (weatherMap.get("nums") != null) {
-                            stringRedisTemplate.opsForValue().set("blade-business::contractArea:yiKeYun:todayWeatherNums", weatherMap.get("nums"));
+                    if (nums == null || Integer.parseInt(nums) <= 19000) {
+                        // 重试三次
+                        weatherMap = YiKeYunApiUtils.getTodayWeatherByAdcodeTry(area.getCity_code() + "000000");
+                        if (weatherMap != null) {
+                            cachedWeatherMap.put(area.getCity_code(), weatherMap);
+                            if (weatherMap.get("nums") != null) {
+                                stringRedisTemplate.opsForValue().set("blade-business::contractArea:yiKeYun:todayWeatherNums", weatherMap.get("nums"), getSecondsUntilMidnight(), TimeUnit.SECONDS);
+                            }
                         }
                     }
+                    //获取天气信息(百度天气)
+//                    if (weatherMap == null) {
+//                        weatherMap = BaiduApiUtil.getTodayWeather(area.getCity_code());
+//                    }
                 }
                 if (weatherMap != null) {
                     //计算平均气温
@@ -419,7 +418,7 @@ public class WeatherInfoServiceImpl extends ServiceImpl<WeatherInfoMapper, Weath
 
     public Map<String, Map<String, String>> getHistoryWeather(ProjectContractArea area, String month) {
         String nums = stringRedisTemplate.opsForValue().get("blade-business::contractArea:yiKeYun:historyWeatherNums");
-        if (nums == null || Integer.parseInt(nums) > 19000) {
+        if (nums != null && Integer.parseInt(nums) > 19000) {
             log.info("获取历史天气失败:易客云获取历史天气的api次数已用完。");
             return null;
         }
@@ -432,11 +431,16 @@ public class WeatherInfoServiceImpl extends ServiceImpl<WeatherInfoMapper, Weath
             city = city.substring(0, city.length() - 1);
         }
         Integer count = jdbcTemplate.queryForObject("select count(*) from m_yikeyun_weather_city where cityZh like '" + county + "%'", Integer.class);
-        String cityId = null;
+        String cityId;
         if (count == null || count == 0) {
+            log.warn("获取历史天气失败:" + area.getCity()+"-"+area.getCounty());
             return null;
         } else if (count > 1) {
-            cityId = jdbcTemplate.queryForObject("select id from m_yikeyun_weather_city where cityZh like '" + county + "%' and leaderZh like '" + city + "%' limit 1", String.class);
+            try {
+                cityId = jdbcTemplate.queryForObject("select id from m_yikeyun_weather_city where cityZh like '" + county + "%' and leaderZh like '" + city + "%' limit 1", String.class);
+            } catch (Exception e) {
+                cityId = jdbcTemplate.queryForObject("select id from m_yikeyun_weather_city where cityZh like '" + county + "%' and leaderZh like '" + county + "%' limit 1", String.class);
+            }
         } else {
             cityId = jdbcTemplate.queryForObject("select id from m_yikeyun_weather_city where cityZh like '" + county + "%'", String.class);
         }
@@ -445,7 +449,7 @@ public class WeatherInfoServiceImpl extends ServiceImpl<WeatherInfoMapper, Weath
             if (historyWeather != null) {
                 Map<String, String> map = historyWeather.get("nums");
                 if (map != null && map.get("nums") != null) {
-                    stringRedisTemplate.opsForValue().set("blade-business::contractArea:yiKeYun:historyWeatherNums", map.get("nums"));
+                    stringRedisTemplate.opsForValue().set("blade-business::contractArea:yiKeYun:historyWeatherNums", map.get("nums"), getSecondsUntilMidnight(), TimeUnit.SECONDS);
                 }
             }
             return historyWeather;
@@ -493,4 +497,10 @@ public class WeatherInfoServiceImpl extends ServiceImpl<WeatherInfoMapper, Weath
         return map;
     }
 
+    public static long getSecondsUntilMidnight() {
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime nextMidnight = now.with(LocalTime.MIDNIGHT).plusDays(1);
+        return TimeUnit.MILLISECONDS.toSeconds(nextMidnight.atZone(java.time.ZoneId.systemDefault()).toInstant().toEpochMilli()
+                - now.atZone(java.time.ZoneId.systemDefault()).toInstant().toEpochMilli());
+    }
 }

+ 2 - 2
blade-service/blade-manager/pom.xml

@@ -234,11 +234,11 @@
                     <target>${java.version}</target>
                     <encoding>${project.build.sourceEncoding}</encoding>
                     <compilerArguments>
-                        <bootclasspath>${java.home}/lib/rt.jar:${java.home}/lib/jce.jar:${java.home}/lib/jsse.jar
+                        <bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar;${java.home}/lib/jsse.jar
                         </bootclasspath>
                     </compilerArguments>
                 </configuration>
             </plugin>
         </plugins>
     </build>
-</project>
+</project>

+ 0 - 88
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -4424,96 +4424,8 @@ public class ExcelTabController extends BladeController {
         }
     }
 
-    //@Scheduled(cron = "0 01 15 * * ?")
-    //检查excel路径有错的
-    public void cheackExcel() throws IOException {
-        StringBuilder result=new StringBuilder("");
-        String sql = "Select * from m_excel_tab where parent_id=0 and is_deleted=0";
-        List<ExcelTab> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ExcelTab.class));
-        for (ExcelTab excelTab : query) {
-            String sql1 = "Select * from m_excel_tab where parent_id=" + excelTab.getId() + " and is_deleted=0";
-            List<ExcelTab> query1 = jdbcTemplate.query(sql1, new BeanPropertyRowMapper<>(ExcelTab.class));
-            for (ExcelTab tab : query1) {
-                String sql2 = "Select * from m_excel_tab where parent_id=" + tab.getId() + " and is_deleted=0";
-                List<ExcelTab> query2 = jdbcTemplate.query(sql2, new BeanPropertyRowMapper<>(ExcelTab.class));
-                List<String> names = new ArrayList<>();
-                for (ExcelTab excelTab1 : query2) {
-                    if (excelTab1.getFileUrl() != null) {
-                        if (excelTab1.getFileUrl().endsWith(".xlsx") || excelTab1.getFileUrl().endsWith(".xls")) {
-                            long resourceLength = CommonUtil.getResourceLength(excelTab1.getFileUrl());
-                            if (resourceLength <= 500) {
-                                names.add(excelTab1.getName());
-                                result.append(excelTab.getName() + "--" + tab.getName() + "--" + excelTab1.getName()+"\n");
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
 
-    /**
-     * 检查清表html是否存在,不存在就下载重新上传
-     * 如果excel都不存在,就输出出来
-     * @throws Exception
-     */
-    //@Scheduled(cron = "00 13 10 * * ?")
-    public void checkHtmlIsExist() throws Exception {
-        StringBuilder result=new StringBuilder("");
-        StringBuilder result1=new StringBuilder("");
-        String sql = "Select * from m_excel_tab where parent_id=0 and is_deleted=0";
-        List<ExcelTab> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ExcelTab.class));
-        String excelPath="E:\\excel\\";
-        try {
-            for (ExcelTab excelTab : query) {
-                String sql1 = "Select * from m_excel_tab where parent_id=" + excelTab.getId() + " and is_deleted=0";
-                List<ExcelTab> query1 = jdbcTemplate.query(sql1, new BeanPropertyRowMapper<>(ExcelTab.class));
-                for (ExcelTab tab : query1) {
-                    String sql2 = "Select * from m_excel_tab where parent_id=" + tab.getId() + " and is_deleted=0 and file_url is not null ";
-                    List<ExcelTab> query2 = jdbcTemplate.query(sql2, new BeanPropertyRowMapper<>(ExcelTab.class));
-                    for (ExcelTab excelTab1 : query2) {
-                        if(!signFtpUtil.isExist(excelTab1.getHtmlUrl())){
-                            if(excelTab1.getFileUrl() != null&&excelTab1.getFileUrl().endsWith(".xlsx") || excelTab1.getFileUrl().endsWith(".xls")){
-                                long resourceLength = CommonUtil.getResourceLength(excelTab1.getFileUrl());
-                                if(resourceLength>=500){
-                                    //先下载这个文件,再上传
-                                    String fileUrl = excelTab1.getFileUrl();
-                                    String localPath=excelPath+excelTab1.getId()+".xlsx";
-                                    InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(fileUrl);
-                                    FileUtils.saveFile(inputStreamByUrl,localPath);
-                                    File file = new File(localPath);
-                                    if(file.exists()){
-                                        Map<String, Object> paramMap = new HashMap<>();
-                                        paramMap.put("nodeId", excelTab1.getId());
-                                        paramMap.put("type",2);
-                                        HashMap<String,String> headers=new HashMap<>();
-                                        headers.put("Content-Type", "multipart/form-data; boundary=----WebKitFormBoundary4tcP4daRPIFDBRvm");
-                                        headers.put("Authorization","Basic c2FiZXI6c2FiZXJfc2VjcmV0");
-                                        headers.put("Blade-auth","bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZW5hbnRfaWQiOiIwMDAwMDAiLCJ1c2VyX25hbWUiOiJjciIsInJlYWxfbmFtZSI6IumZiOeEtiIsImF2YXRhciI6IiIsImF1dGhvcml0aWVzIjpbImFkbWluaXN0cmF0b3IiXSwiY2xpZW50X2lkIjoiY2xpZW50Iiwicm9sZV9uYW1lIjoiYWRtaW5pc3RyYXRvciIsImxpY2Vuc2UiOiJwb3dlcmVkIGJ5IGJsYWRleCIsInBvc3RfaWQiOiIiLCJ1c2VyX2lkIjoiMTkxMjcwMTM4Mzk4MjQyNDA2NSIsInJvbGVfaWQiOiIxMTIzNTk4ODE2NzM4Njc1MjAxIiwicGhvbmUiOiIxNTIxNTA1Mjc4NiIsInNjb3BlIjpbImFsbCJdLCJuaWNrX25hbWUiOiLpmYjnhLYiLCJvYXV0aF9pZCI6IiIsImRldGFpbCI6eyJ0eXBlIjoid2ViIn0sImV4cCI6MTc0NjY4ODQxOCwiZGVwdF9pZCI6IjE1MzY5ODMwNTYzNjIzODEzMTMiLCJqdGkiOiI3ZjEwY2U0NC1lOWE2LTRlYjMtYjBjYi1iYTJlY2U2MDk3ZjAiLCJhY2NvdW50IjoiY3IifQ.2v68wLgQvCUXanrNdXE6WPnXSrnjjW6mmepPgeWbAMo");
-                                        headers.put("Tenant-Id","000000");
-                                        String url="http://testmanger.hcxxy.com/api/blade-manager/exceltab/put-file-attach";
-                                        String body = HttpUtil.createPost(url).addHeaders(headers).form(paramMap).form("file", file).execute().body();
-                                        Map map = JSON.parseObject(body, Map.class);
-                                        if((int)map.get("code")!=200){
-                                            result1.append(excelTab.getName() + "--" + tab.getName() + "--" + excelTab1.getName()+"\n");
-                                        }
-                                    }
-                                }else {
-                                    result.append(excelTab.getName() + "--" + tab.getName() + "--" + excelTab1.getName()+"\n");
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
 
-        System.out.println("完成");
-        System.out.println(result);
-        System.out.println(result1);
-    }
     @GetMapping("/checkParamElement")
     @ApiOperationSupport(order = 30)
     @ApiOperation(value = "检查参数元素", notes = "检查参数元素")

+ 5 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java

@@ -459,7 +459,7 @@ public class ExcelTabClientImpl implements ExcelTabClient {
     @Override
     public R saveReEntrustTabData(ReSigningEntrustDto dto, String header) {
         WbsTreePrivate wbsTreePrivate = jdbcTemplate.queryForObject("select * from m_wbs_tree_private where p_key_id=" + dto.getNodeId(), new BeanPropertyRowMapper<>(WbsTreePrivate.class));
-        Boolean isRemove=false;
+        Boolean isRemove=true;
         List<Map<String, Object>> list = excelTabService.getBussDataInfoTrialentrust(Long.parseLong(dto.getEntrustId()), wbsTreePrivate.getJlerTreeId(), Long.parseLong(dto.getContractId()), null, null,isRemove,false);
         Map<String, Object> map = list.get(0);
         if(!map.containsKey("contractId")){
@@ -481,8 +481,8 @@ public class ExcelTabClientImpl implements ExcelTabClient {
     }
 
     @Override
-    public void saveOrUpdate(ExcelTab detail) {
-        excelTabService.saveOrUpdate(detail);
+    public boolean saveOrUpdate(ExcelTab detail) {
+      return   excelTabService.saveOrUpdate(detail);
     }
 
     @Override
@@ -491,8 +491,8 @@ public class ExcelTabClientImpl implements ExcelTabClient {
     }
 
     @Override
-    public void excelInfo(InputStream inputStream, String exceUrl, String thmlUrl, String number) {
-        ExcelInfoUtils.excelInfo(inputStream, exceUrl, thmlUrl, number);
+    public void excelInfo(MultipartFile file, String exceUrl, String thmlUrl, String number) throws IOException {
+        ExcelInfoUtils.excelInfo(file.getInputStream(), exceUrl, thmlUrl, number);
     }
 
 

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

@@ -70,4 +70,6 @@ public interface IArchiveTreeService extends BaseService<ArchiveTree> {
 
     //删除子树
     boolean deleteTree(Long id);
+
+    List<ArchiveTreeVO2> getAllChildren(ArchiveTree node);
 }

+ 8 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java

@@ -355,13 +355,15 @@ public class ArTreeContractInitServiceImpl {
                     addNodes.addAll(tmpList);
                 }else {
                     Long contractId = ar.getContractId();
-                    List<ContractRelationJlyz> list = contractInfoService.searchContractRelationInfo(contractId.toString());
-                    for (ContractRelationJlyz contractRelationJlyz: list) {
-                        ar.setContractId(contractRelationJlyz.getId());
-                        List<ArchiveTreeContract> tmpList = getTreeContractFromWbs(tenantId, projectId, wbsId, ar,classify);
-                        addNodes.addAll(tmpList);
+                    if (contractId != null) {
+                        List<ContractRelationJlyz> list = contractInfoService.searchContractRelationInfo(contractId.toString());
+                        for (ContractRelationJlyz contractRelationJlyz: list) {
+                            ar.setContractId(contractRelationJlyz.getId());
+                            List<ArchiveTreeContract> tmpList = getTreeContractFromWbs(tenantId, projectId, wbsId, ar,classify);
+                            addNodes.addAll(tmpList);
+                        }
+                        ar.setContractId(contractId);
                     }
-                    ar.setContractId(contractId);
                 }
             }
         }

+ 59 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java

@@ -27,6 +27,7 @@ import org.springblade.archive.entity.ArchiveExpertConclusion;
 import org.springblade.archive.feign.ArchiveAutoClient;
 import org.springblade.archive.vo.UpdateExpertVO;
 import org.springblade.business.feign.ArchiveFileClient;
+import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
@@ -135,7 +136,7 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		}
 
 
-		List<ArchiveTreeVO2> tree = archiveTreeService.tree2(AuthUtil.getTenantId(), projectId,null, null,null,false);
+		List<ArchiveTreeVO2> tree = archiveTreeService.getAllChildren(archiveTree);
 		if (tree == null || tree.size() == 0) {
 			return false;
 		}
@@ -430,8 +431,8 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		}
 
 		//取出 -- 系统级 wbs树的数据
-		List<ArchiveTreeVO2> srcTrees = archiveTreeService.tree2(AuthUtil.getTenantId(), dstNode.getProjectId(),
-				null, null,null,false);
+//		List<ArchiveTreeVO2> srcTrees = archiveTreeService.tree2(AuthUtil.getTenantId(), dstNode.getProjectId(), null, null,null,false);
+		List<ArchiveTreeVO2> srcTrees = archiveTreeService.getAllChildren(srcNode);
 		ArchiveTreeVO2 srcTree = srcTrees.get(0);
 		if (srcTree == null) {
 			return false;
@@ -655,7 +656,7 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 
 						//getNormalSaveList 接口除了同步新增节点,还会同步已有节点的属性。
 						//因为关联工序的位置是固定的,先不考虑新增一个关联工序节点,且一次同步完成情况
-						tmpSaveList = archiveTreeContractSync.getNormalSaveListEx(srcNode.getId(),
+						tmpSaveList = archiveTreeContractSync.getNormalSaveListEx(tmpSubTree.getId(),
 								tmpSubTree,dstNodeId,contractNode);
 						saveList.addAll(tmpSaveList);
 
@@ -1001,12 +1002,64 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 
 		for (ArchiveTreeVO2 src : srcChilds) {
 			if (dstMap.get(src.getId()) == null ) {
-				List<ArchiveTreeContract> tmpSaveList = archiveTreeContractSync.getNormalSaveListEx(src.getId(),src,dstNode.getId(),dstTree);
-				saveList.addAll(tmpSaveList);
+				boolean flag = false;
+				if (contractInfos != null && !contractInfos.isEmpty()) {
+					List<ArchiveTreeContract> tmpSaveList = new ArrayList<>();
+					flag = addNewContract1(contractInfos,src,dstTree,tmpSaveList);
+					saveList.addAll(tmpSaveList);
+				}
+				if (!flag) {
+					List<ArchiveTreeContract> tmpSaveList = archiveTreeContractSync.getNormalSaveListEx(src.getId(),src,dstNode.getId(),dstTree);
+					if (tmpSaveList != null) {
+						saveList.addAll(tmpSaveList);
+					}
+				}
 			}
 		}
 
 	}
+	boolean addNewContract1(List<ContractInfo> contractInfos,ArchiveTreeVO2 srcTree,ArchiveTreeContractVO2 dstTree,List<ArchiveTreeContract> saveList){
+
+		dstTree.setValue(1L);
+		ArchiveTreeContract contractNode = null;
+		ArchiveTreeContractVO2 destNode = null;
+		for(ContractInfo contractInfo : contractInfos){
+			List<ArchiveTreeContract> tmpSaveList = new ArrayList<>();
+
+			if (srcTree.getTitle().contains("施工单位归档资料") && contractInfo.getContractType() == 1) {
+				if (contractNode == null) {
+					contractNode = new ArchiveTreeContract(srcTree);
+					contractNode.setId(SnowFlakeUtil.getId());
+					contractNode.setParentId(dstTree.getId());
+					contractNode.setContractId(contractInfo.getId());
+					saveList.add(contractNode);
+					contractNode.setTreeCode("C");
+				}
+				if (destNode == null) {
+					destNode = new ArchiveTreeContractVO2(contractNode);
+				}
+				tmpSaveList = archiveTreeContractSync.getContractSaveList(srcTree,destNode,contractInfo,contractNode);
+			}
+			if (srcTree.getTitle().contains("监理单位归档资料") && contractInfo.getContractType() == 2) {
+				//复制监理
+				if (contractNode == null) {
+					contractNode = new ArchiveTreeContract(srcTree);
+					contractNode.setId(SnowFlakeUtil.getId());
+					contractNode.setParentId(dstTree.getId());
+					contractNode.setContractId(contractInfo.getId());
+					saveList.add(contractNode);
+					contractNode.setTreeCode("S");
+				}
+				if (destNode == null) {
+					destNode = new ArchiveTreeContractVO2(contractNode);
+				}
+//				dstTree.getChildren().add(destNode);
+				tmpSaveList = archiveTreeContractSync.getContractSaveList(srcTree,destNode,contractInfo,contractNode);
+			}
+			saveList.addAll(tmpSaveList);
+		}
+		return contractNode != null;
+	}
 
 	/**
 	 * 返回某个合同段关联质检资料的节点

+ 16 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -1723,7 +1723,9 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         Map<String, Object> nodeBaseInfo = nodeBaseInfoService.getAllNodeBaseInfoByPkeyId(pkeyId, nodeId);
         if(nodeBaseInfo!=null){
             for (Map.Entry<String, Object> entry : nodeBaseInfo.entrySet()) {
-                reData.put(entry.getKey(), entry.getValue());
+                if (reData.get(entry.getKey()) == null || reData.get(entry.getKey()).toString().isEmpty()) {
+                    reData.put(entry.getKey(), entry.getValue());
+                }
             }
         }
 //        if(reData.size()>0){
@@ -2227,7 +2229,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                             if (myData.indexOf("http") >= 0 && (myData.indexOf("aliyuncs") >= 0 ||myData.indexOf("183.247.216.148") >= 0||myData.indexOf("xinan1.zos.ctyun.cn") >= 0)) {
                                 InputStream imageIn = CommonUtil.getOSSInputStream(myData);
                                 if (imageIn != null) {
-                                    byte[] bytes = CommonUtil.compressImage(myData);
+                                    byte[] bytes = CommonUtil.compressImage3(myData);
                                     // 这里根据实际需求选择图片类型
                                     int pictureIdx = workbook.addPicture(bytes, 6);
                                     CreationHelper helper = workbook.getCreationHelper();
@@ -3566,11 +3568,21 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             //修改合并后的pdf路径
             String querySql = "select id from u_information_query where classify ='" + classify + "' and wbs_id ='" + id + "' and contract_id ='" + contractId + "'";
             List<InformationQuery> query = jdbcTemplate.query(querySql, new BeanPropertyRowMapper<>(InformationQuery.class));
+            StringBuilder names=new StringBuilder("");
+            if(StringUtils.isNotEmpty(dto.getReportNo())){
+                names.append("[");
+                names.append(dto.getReportNo());
+                names.append("]");
+            }
+            if(StringUtils.isNotEmpty(dto.getTrialProjectName())){
+                names.append(dto.getTrialProjectName());
+            }
+            names.append("试验检测报告及附件");
             if (query.size() > 0) {
-                String updateSql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "', name ='" + (StringUtils.isNotEmpty(dto.getTrialProjectName()) ? dto.getTrialProjectName() : "") + "' where classify='" + classify + "' and wbs_id='" + id + "' and contract_id ='" + contractId + "'";
+                String updateSql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "', name ='" + names + "' where classify='" + classify + "' and wbs_id='" + id + "' and contract_id ='" + contractId + "'";
                 jdbcTemplate.execute(updateSql);
             } else {
-                informationQueryClient.saveData(id.toString(), projectId, contractId, classify, bladeFile.getLink(), StringUtils.isNotEmpty(dto.getTrialProjectName()) ? dto.getTrialProjectName() : "");
+                informationQueryClient.saveData(id.toString(), projectId, contractId, classify, bladeFile.getLink(), names.toString());
             }
             return bladeFile.getLink();
         }

+ 37 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -1181,9 +1181,12 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             checkTable = op.get().getInitTableName();
         }
         for (FormData fd : tec.formDataList) {
+            if(fd.getCode().equals("m_20220928153039_1575025176213454848:key_17")){
+                System.out.println("111");
+            }
             if (fd.verify()) {
-                if(fd.getCode().equals("m_20220928143955_1575012411126054912:key_2")){
-                    System.out.println("111");
+                if(fd.getAddPages()!=0){
+                    System.out.println("");
                 }
                 Formula formula = fd.getFormula();
                 System.out.println(formula.getId() + ":" + fd.getEName());
@@ -1231,9 +1234,24 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                             List<Object> e1 = (List<Object>) ((HashMap<?, ?>) e).get(ele.get(0).getCode());
                                             List<Object> values = (List<Object>) data;
                                             if (e1.size() != values.size()) {
-                                                for (int i = 0; i < e1.size(); i++) {
-                                                    if (e1.get(i).equals("")) {
-                                                        values.add(i, "");
+                                                //JL815获取CL10 JL815只有6行,CL10有8行导致生成空表
+                                                if(fd.getCode().equals("m_20220928153039_1575025176213454848:key_17")){
+                                                    for (int i = 0; i < e1.size(); i++) {
+                                                        if(i>=fd.getValues().size()){
+                                                            if(!e1.get(i).equals("")){
+                                                                values.add(i,e1.get(i));
+                                                            }
+                                                        }else {
+                                                            if (e1.get(i).equals("")) {
+                                                                values.add(i, "");
+                                                            }
+                                                        }
+                                                    }
+                                                }else {
+                                                    for (int i = 0; i < e1.size(); i++) {
+                                                        if (e1.get(i).equals("")) {
+                                                            values.add(i, "");
+                                                        }
                                                     }
                                                 }
                                             }
@@ -1288,6 +1306,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                         }
                                     }
                                 }
+
                                 write(tec, fd, data);
                             }
                             /*错位计算偏移量重置*/
@@ -3587,6 +3606,9 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             monthlyReport.setChangeMeterMoney(monthlyReport.getAfterCurrentMeterMoney().subtract(monthlyReport.getCurrentMeterMoney()));
             monthlyReport.setChapterSeq(vo.getChapterNumber());
             String key = vo.getChapterNumber();
+            if(StringUtils.isEmpty(key)){
+                key=vo.getFormNumber();
+            }
             if (list.size() > 0) {
                 OptionalInt index = IntStream.range(0, list.size())
                         .filter(i -> list.get(i).getId().equals(periodId))
@@ -4258,7 +4280,16 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             Map<String, List<MeterInventoryVO1>> groupedMeter = new HashMap<>();
             List<String> listUrl = new ArrayList<>();
             for (MeterInventoryVO1 vo1 : list1) {
-                String firstChar = vo1.getImportNumber().substring(0, 3);
+                String firstChar;
+                if(StringUtils.isEmpty(vo1.getImportNumber())){
+                    firstChar=vo1.getFormNumber();
+                }else if(vo1.getImportNumber().length()<3){
+                    firstChar=vo1.getFormNumber();
+                }else if(!vo1.getImportNumber().matches("\\d{3}")){
+                    firstChar=vo1.getFormNumber();
+                }else {
+                    firstChar = vo1.getImportNumber().substring(0, 3);
+                }
                 groupedMeter.computeIfAbsent(firstChar, k -> new ArrayList<>()).add(vo1);
             }
             //根据编号的不同建立不同的excel

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

@@ -2386,7 +2386,6 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         //本次修改的节点
         List<String> updateList=new ArrayList<>();
 
-        //新增
         String sqlList="Select parent_id,node_name from m_wbs_tree_contract where contract_id="+wbsTreeContractRoot.getContractId()+" and wbs_id="+wbsTreeContractRoot.getWbsId()+" and is_deleted=0";
         List<WbsTreeContract> WbsTreeContractListupdate = jdbcTemplate.query(sqlList, new BeanPropertyRowMapper<>(WbsTreeContract.class));
         //导入节点与现有节点进行比较。进行修改编号
@@ -2481,7 +2480,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         int i=0;
         for (ImportTreeDto dto : list) {
             //新增
-            String sqlList1="Select parent_id,node_name from m_wbs_tree_contract where contract_id="+wbsTreeContractRoot.getContractId()+" and wbs_id="+wbsTreeContractRoot.getWbsId()+" and is_deleted=0";
+            String sqlList1="Select parent_id,node_name,p_id from m_wbs_tree_contract where contract_id="+wbsTreeContractRoot.getContractId()+" and wbs_id="+wbsTreeContractRoot.getWbsId()+" and is_deleted=0";
             List<WbsTreeContract> WbsTreeContractList = jdbcTemplate.query(sqlList1, new BeanPropertyRowMapper<>(WbsTreeContract.class));
             i++;
             //单位工程:如果没有被处理过,说明需要新增
@@ -2557,6 +2556,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                             String sql="Select node_name from m_wbs_tree_contract where p_key_id in("+String.join(",", ids)+")";
                             List<String> nodeNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
                             String result = String.join("",nodeNames);
+                            result=result+contract.getNodeName();
                             String ancestorsName= wbsTreeContractRoot.getNodeName()+StringUtils.defaultString(dto.getUnitName())
                                 + StringUtils.defaultString(dto.getSubUnitName());
                             if(result.equals(ancestorsName)){
@@ -2608,6 +2608,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                             String sql="Select node_name from m_wbs_tree_contract where p_key_id in("+String.join(",", ids)+")";
                             List<String> nodeNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
                             String result = String.join("",nodeNames);
+                            result=result+contract.getNodeName();
                             String ancestorsName= wbsTreeContractRoot.getNodeName()+StringUtils.defaultString(dto.getUnitName())
                                 + StringUtils.defaultString(dto.getSubUnitName())
                                 +StringUtils.defaultString(dto.getDivisionName());
@@ -2663,6 +2664,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                             String sql="Select node_name from m_wbs_tree_contract where p_key_id in("+String.join(",", ids)+")";
                             List<String> nodeNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
                             String result = String.join("",nodeNames);
+                            result=result+contract.getNodeName();
                             String ancestorsName= wbsTreeContractRoot.getNodeName()+StringUtils.defaultString(dto.getUnitName())
                                 + StringUtils.defaultString(dto.getSubUnitName())
                                 +StringUtils.defaultString(dto.getDivisionName())
@@ -2721,6 +2723,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                             String sql="Select node_name from m_wbs_tree_contract where p_key_id in("+String.join(",", ids)+")";
                             List<String> nodeNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
                             String result = String.join("",nodeNames);
+                            result=result+contract.getNodeName();
                             String ancestorsName= wbsTreeContractRoot.getNodeName()+StringUtils.defaultString(dto.getUnitName())
                                 + StringUtils.defaultString(dto.getSubUnitName())
                                 +StringUtils.defaultString(dto.getDivisionName())
@@ -3081,7 +3084,7 @@ public static boolean hasConflictingCodes(List<ImportTreeDto> list) {
                 return true;
             }
             //如果数据库中存在名称相同的节点,查询该节点的祖级节点
-            String sql="select p_key_id,node_name from m_wbs_tree_contract where is_deleted=0 and contract_id="+contractId+" and p_key_id in ("+String.join(",", list.stream().map(String::valueOf).collect(Collectors.toList()))+")";
+            String sql="select p_key_id,node_name,contract_id from m_wbs_tree_contract where is_deleted=0 and contract_id="+contractId+" and p_key_id in ("+String.join(",", list.stream().map(String::valueOf).collect(Collectors.toList()))+")";
             List<WbsTreeContract> wbsContracts = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
             String  fatherNodeName="";
             if(type==2){
@@ -3105,11 +3108,12 @@ public static boolean hasConflictingCodes(List<ImportTreeDto> list) {
                         String ancestors = jdbcTemplate.queryForObject(Sql, new SingleColumnRowMapper<>(String.class));
                         String[] ids = ancestors.split(",");
                         ids=Arrays.stream(ids)
-                            .filter(id -> !id.equals("0")) // 过滤掉值为 "0" 的元素
+                            .filter(i->!i.equals("0"))
                             .toArray(String[]::new);
-                        String sql1="Select node_name from m_wbs_tree_contract where p_key_id in("+String.join(",", ids)+")";
+                        String sql1="Select node_name from m_wbs_tree_contract where p_key_id in("+String.join(",", ids)+") and contract_id="+wbsContract.getContractId()+" and is_deleted=0";
                         List<String> nodeNames = jdbcTemplate.query(sql1, new SingleColumnRowMapper<>(String.class));
                         String join = String.join("", nodeNames);
+                        join=join+wbsContract.getNodeName();
                         if(join.equals(fatherNodeName)){
                             return true;
                         }

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

@@ -177,6 +177,7 @@ public class TaskController extends BladeController {
     @ApiOperation(value = "获取任务名称", notes = "传入合同段contractId、期数id(变更令传勾选的id字符串英文逗号拼接)、type=1(中间计量申请)、=2(材料计量单)、3=(开工预付款计量单)、=4(变更令)")
     public R<Object> name(@RequestParam String contractId, @RequestParam String id, @RequestParam String type) {
         String name = null;
+        String ids=null;
         BigDecimal bigDecimal=BigDecimal.ZERO;
         if (ObjectUtil.isNotEmpty(contractId) && ObjectUtil.isNotEmpty(id)) {
             ContractInfo contractInfo = jdbcTemplate.query("SELECT contract_name FROM m_contract_info WHERE id = " + contractId, new BeanPropertyRowMapper<>(ContractInfo.class)).stream().findAny().orElse(null);
@@ -200,10 +201,14 @@ public class TaskController extends BladeController {
                 List<Long> longs = Func.toLongList(id);
                 if (contractInfo != null && longs.size() > 0) {
                     List<ChangeTokenForm> changeTokenForms = changeTokenFormService.getBaseMapper().selectBatchIds(longs);
-                    if (changeTokenForms.size() > 0) {
-                        List<String> collect = changeTokenForms.stream().map(ChangeTokenForm::getChangeNumber).collect(Collectors.toList());
-                        name = "【" + contractInfo.getContractName() + "】" + date + " 变更令【" + StringUtils.join(collect, "、") + "】";
+                    StringBuilder s=new StringBuilder("");
+                    StringBuilder s1=new StringBuilder("");
+                    for (ChangeTokenForm form : changeTokenForms) {
+                        s=s.append("【" + contractInfo.getContractName() + "】" + date + " 变更令【"+form.getChangeNumber()+"】"+",");
+                        s1=s1.append(form.getId()+",");
                     }
+                    name=s.substring(0,s.length()-1);
+                    ids=s1.substring(0,s1.length()-1);
                 }
             }
             List<Long> longs = Func.toLongList(id);
@@ -216,8 +221,9 @@ public class TaskController extends BladeController {
 
         }
         Map<String,Object> map=new HashMap<>();
-        map.put("name",name);
+        map.put("name", name);
         map.put("submitApprovalMoney",bigDecimal);
+        map.put("ids", ids);
         return R.data(200, map, "操作成功");
     }
 
@@ -641,6 +647,7 @@ public class TaskController extends BladeController {
         if (!objectR.isSuccess()) {
             throw new ServiceException(objectR.getMsg());
         }
+        List<String> taskNameList =Arrays.asList(approvalDTO.getTaskName().split(","));
 
         String[] formDataIds = approvalDTO.getPeriodId().split(",");
         String[] taskIdList = taskId.split(",");
@@ -664,7 +671,9 @@ public class TaskController extends BladeController {
             task.setTaskContent(ObjectUtil.isNotEmpty(approvalDTO.getTaskDesc()) ? approvalDTO.getTaskDesc() : null);
             task.setTaskUser(null);
             task.setFormDataId(formDataIds[i]); //数据指向,指向期数id(变更令为id英文逗号拼接)
-            task.setTaskName(approvalDTO.getTaskName());
+            if(i<=taskNameList.size()-1){
+                task.setTaskName(taskNameList.get(i));
+            }
             task.setContractId(approvalDTO.getContractId().toString());
             task.setProjectId(approvalDTO.getProjectId().toString());
             task.setBatch(approvalDTO.getBatch());
@@ -1423,8 +1432,10 @@ public class TaskController extends BladeController {
                             Task::getId,
                             task -> task));
         }
+
         //所有满足条件的日志 转map
-        String logQuery = "select business_id,create_user_name ,create_time, operation_type  from u_operation_log where  operation_content like '%废除%'";
+        //String logQuery = "select business_id,create_user_name ,create_time, operation_type  from u_operation_log where  operation_content like '%废除%'";
+        String logQuery="select business_id,create_user_name ,create_time, operation_type  from u_operation_log where  operation_type IN (6,9,26,61,62)";
         List<OperationLog> operationLogs = jdbcTemplate.query(logQuery, new BeanPropertyRowMapper<>(OperationLog.class));
         if(ObjectUtil.isNotEmpty(operationLogs)){
             operationLogMap = operationLogs.stream().collect(Collectors.groupingBy(OperationLog::getBusinessId));

+ 8 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.java

@@ -94,4 +94,12 @@ public interface ChangeTokenFormMapper extends BaseMapper<ChangeTokenForm> {
     void deleteCollectForm(@Param("tokenId")Long id);
 
     List<MiddleMeterApply> getChangeMiddleTotal(@Param("contractId") Long contractId,@Param("tokenId") Long id);
+
+    List<ChangeTokenInventory> getAllContractFormByTokenId(@Param("id") Long id);
+
+    List<ChangeTokenInventory> getInventoryByMeterIdAndFormId(@Param("contractMeterId") Long contractMeterId, @Param("contractFormId") Long contractFormId);
+
+    List<ChangeTokenForm> getChangeTokenFormByCommandDate(@Param("tokenIds") List<Long> tokenIds,@Param("id") Long id);
+
+    List<ChangeFormVO2> getFormList4(@Param("id") Long id, @Param("contractId") Long contractId);
 }

+ 29 - 2
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.xml

@@ -328,6 +328,33 @@
         where is_deleted = 0 and contract_id = #{contractId} and
             FIND_IN_SET(#{tokenId}, change_token_ids)
     </select>
-
-
+    <select id="getAllContractFormByTokenId" resultType="org.springblade.meter.entity.ChangeTokenInventory">
+        select * from s_change_token_inventory where change_token_id = #{id} and is_deleted = 0 and is_collect_form = 0
+    </select>
+    <select id="getInventoryByMeterIdAndFormId" resultType="org.springblade.meter.entity.ChangeTokenInventory">
+        select * from s_change_token_inventory where contract_meter_id=#{contractMeterId} and contract_form_id=#{contractFormId} and is_deleted = 0
+    </select>
+    <select id="getChangeTokenFormByCommandDate" resultType="org.springblade.meter.entity.ChangeTokenForm">
+        SELECT *
+        FROM s_change_token_form
+        WHERE id IN
+        <foreach collection="tokenIds" item="id" open="(" separator=", " close=")">
+            #{id}
+        </foreach>
+        AND command_status = 1
+        AND update_time > (
+        SELECT update_time
+        FROM s_change_token_form
+        WHERE id = #{id}
+        )
+        ORDER BY update_time ASC
+    </select>
+    <select id="getFormList4" resultType="org.springblade.meter.vo.ChangeFormVO2">
+        select cti.contract_form_id as id,cti.contract_meter_id as contractMeterId,
+               cti.change_total as changeTotal,
+               cti.current_price as currentPrice
+        from s_change_token_inventory as cti
+        where cti.contract_id = #{contractId} and cti.is_deleted = 0
+          AND cti.change_token_id = #{id} and is_collect_form = 0
+    </select>
 </mapper>

+ 2 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenInventoryMapper.java

@@ -30,4 +30,6 @@ public interface ChangeTokenInventoryMapper extends BaseMapper<ChangeTokenInvent
 
 
     void deleteByTokenId(@Param("id") Long id);
+
+    ChangeTokenInventory getCollectForm(@Param("changeTokenId")Long changeTokenId,@Param("contractFormId")Long contractFormId);
 }

+ 3 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenInventoryMapper.xml

@@ -24,6 +24,9 @@
         DELETE FROM s_change_token_inventory
         where change_token_id = #{id}
     </delete>
+    <select id="getCollectForm" resultType="org.springblade.meter.entity.ChangeTokenInventory">
+        SELECT * FROM s_change_token_inventory where  change_token_id=#{changeTokenId} and contract_form_id=#{contractFormId} and is_collect_form=1 and is_deleted=0
+    </select>
 
 
 </mapper>

+ 2 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/InventoryFormMeterMapper.java

@@ -43,4 +43,6 @@ public interface InventoryFormMeterMapper extends BaseMapper<InventoryFormMeter>
 
     //根据计量单元id,删除当前节点以及下层节点,关联的所有清单
     void deleteByNodeId(@Param("meterId") Long meterId,@Param("contractId") Long contractId);
+
+    InventoryFormMeter getifm(@Param("id") Long id, @Param("contractMeterId") Long contractMeterId);
 }

+ 4 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/InventoryFormMeterMapper.xml

@@ -54,5 +54,9 @@
             #{id}
         </foreach>
     </select>
+    <select id="getifm" resultType="org.springblade.meter.entity.InventoryFormMeter">
+        select * from s_inventory_form_meter
+        where contract_form_id = #{id} and contract_meter_id = #{contractMeterId}  and is_deleted = 0
+    </select>
 
 </mapper>

+ 1 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/IChangeTokenInventoryService.java

@@ -33,4 +33,5 @@ public interface IChangeTokenInventoryService extends BaseService<ChangeTokenInv
     //删除当前变更令下的清单
     void deleteByTokenId(Long tokenId);
 
+    ChangeTokenInventory getCollectForm(Long changeTokenId,Long contractFormId);
 }

+ 3 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/IInventoryFormMeterService.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.meter.service;
 
+import org.apache.ibatis.annotations.Param;
 import org.springblade.core.tool.api.R;
 import org.springblade.meter.dto.MeterTreeContractDTO;
 import org.springblade.meter.entity.InventoryFormMeter;
@@ -49,4 +50,6 @@ public interface IInventoryFormMeterService extends BaseService<InventoryFormMet
      * 删除 同合计量 清单
      */
     R delInMeterInfo(String meterId, Long formIds);
+
+    InventoryFormMeter getifm(@Param("id") Long id, @Param("contractMeterId") Long contractMeterId);
 }

+ 91 - 37
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenFormServiceImpl.java

@@ -25,6 +25,7 @@ import org.apache.commons.lang.StringUtils;
 import org.springblade.business.entity.Task;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.mp.base.BaseEntity;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
@@ -48,6 +49,7 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * 变更令表 服务实现类
@@ -715,12 +717,45 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
         }
 
         //判断是否有清单执行过二次变更,执行过则不能撤销
-        List<ChangeFormVO2> vo2 = baseMapper.getMultipleChange(id);
-        if (vo2.size() != 0){
-            String s = vo2.stream().map(ChangeFormVO2::getFormName).distinct().collect(Collectors.joining(",", "[", "]"));
-            throw new ServiceException("清单:"+s+"在当前变更之后又发生过变更,请先撤销上一次变更");
-        }
-
+//        List<ChangeFormVO2> vo2 = baseMapper.getMultipleChange(id);
+//        if (vo2.size() != 0){
+//            String s = vo2.stream().map(ChangeFormVO2::getFormName).distinct().collect(Collectors.joining(",", "[", "]"));
+//            throw new ServiceException("清单:"+s+"在当前变更之后又发生过变更,请先撤销上一次变更");
+//        }
+        //取消上面的限制,允许跳过第二次变更去撤销第一次的变更,根据增减量,所有相关的全部都要改变  2025-05-14 王博念
+        boolean flag=false;
+          List<ChangeFormVO2> vo2 = baseMapper.getMultipleChange(id);
+           if(vo2.size()!=0){
+               flag=true;
+            //查出当前变更令所有的清单
+             List<ChangeTokenInventory> list=baseMapper.getAllContractFormByTokenId(id);
+               //根据清单查出当前部位用了当前清单的所有的变更令
+               for (ChangeTokenInventory inventory : list) {
+                   List<ChangeTokenInventory> list1=baseMapper.getInventoryByMeterIdAndFormId(inventory.getContractMeterId(),inventory.getContractFormId());
+                   //查出当前变更令的下达时间,根据时间排序
+                   List<Long> tokenIds = list1.stream().map(o -> o.getChangeTokenId()).collect(Collectors.toList());
+                   List<ChangeTokenForm> list2 = baseMapper.getChangeTokenFormByCommandDate(tokenIds, inventory.getChangeTokenId());
+//                   for (ChangeTokenForm tokenForm : list2) {
+//                       tokenForm.setChangeMoney(tokenForm.getChangeMoney().subtract(inventory.getChangeMoney()));
+//                       baseMapper.updateById(tokenForm);
+//                   }
+                   List<Long> changeTokenIds = list2.stream().map(O -> O.getId()).collect(Collectors.toList());
+                   List<ChangeTokenInventory> updateInventory = list1.stream().filter(o -> changeTokenIds.contains(o.getChangeTokenId())).collect(Collectors.toList());
+                   for (ChangeTokenInventory tokenInventory : updateInventory) {
+                       tokenInventory.setChangeBeforeTotal(tokenInventory.getChangeBeforeTotal().subtract(inventory.getChangeTotal()));
+                       tokenInventory.setChangeAfterTotal(tokenInventory.getChangeAfterTotal().subtract(inventory.getChangeTotal()));
+                       tokenInventory.setChangeBeforeMoney(tokenInventory.getChangeBeforeTotal().multiply(tokenInventory.getCurrentPrice()));
+                       tokenInventory.setChangeAfterMoney(tokenInventory.getChangeAfterTotal().multiply(tokenInventory.getCurrentPrice()));
+                       changeTokenInventoryService.getBaseMapper().updateById(tokenInventory);
+                       ChangeTokenInventory cti=changeTokenInventoryService.getCollectForm(tokenInventory.getChangeTokenId(),tokenInventory.getContractFormId());
+                       cti.setChangeBeforeTotal(cti.getChangeBeforeTotal().subtract(inventory.getChangeTotal()));
+                       cti.setChangeAfterTotal(cti.getChangeAfterTotal().subtract(inventory.getChangeTotal()));
+                       cti.setChangeBeforeMoney(cti.getChangeBeforeTotal().multiply(inventory.getCurrentPrice()));
+                       cti.setChangeAfterMoney(cti.getChangeAfterTotal().multiply(inventory.getCurrentPrice()));
+                       changeTokenInventoryService.getBaseMapper().updateById(cti);
+                   }
+               }
+          }
         //双重验证,中间计量申请存在先删除变更清单,又添加回来的操作
         List<MiddleMeterApply> middles = baseMapper.getChangeMiddleTotal(form.getContractId(),id);
         if (middles.size() > 0){
@@ -740,41 +775,60 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                 throw new ServiceException("当前变更令已经修改中间计量申请的清单:"+s+"的数据,不能撤销变更,删除计量清单之后允许撤销");
             }
         }
+        //取消限制后的
+        if(flag){
+            //修改合同清单
+            List<ChangeTokenInventory> list=baseMapper.getAllContractFormByTokenId(id);
+            for (ChangeTokenInventory inventory : list) {
+                ContractInventoryForm form1 = contractInventoryFormService.getById(inventory.getContractFormId());
+                form1.setChangeTotal(form1.getChangeTotal().subtract(inventory.getChangeTotal()));
+                form1.setChangeMoney(form1.getChangeTotal().multiply(form1.getCurrentPrice()));
+                contractInventoryFormService.updateById(form1);
+            }
+            //修改清单与合同计量单元中间表
+            List<ChangeFormVO2> allForm = baseMapper.getFormList4(id,form.getContractId());
+            for (ChangeFormVO2 cf2 : allForm) {
+             InventoryFormMeter ifm=inventoryFormMeterService.getifm(cf2.getId(),cf2.getContractMeterId());
+                ifm.setChangeBuildPictureTotal(ifm.getChangeBuildPictureTotal().subtract(cf2.getChangeTotal()));
+                ifm.setBuildPictureMoney(ifm.getChangeBuildPictureTotal().multiply(cf2.getCurrentPrice()));
+                inventoryFormMeterService.getBaseMapper().updateById(ifm);
+            }
+        }else {
+            //通过汇总项修改合同清单
+            List<ChangeFormVO2> vo3 = baseMapper.getAllCollectForm(id);
+            if (vo3.size() == 0){
+                throw new ServiceException("当前变更令的变更清单为空,撤销失败");
+            }
+            List<ContractInventoryForm> list2 = new ArrayList<>();
+            for (ChangeFormVO2 vo : vo3) {
+                // 修改清单数量与金额
+                ContractInventoryForm fo = new ContractInventoryForm();
+                fo.setId(vo.getId());
+                fo.setChangeTotal(vo.getContractTotal());
+                fo.setChangeMoney(vo.getContractMoney());
+                list2.add(fo);
+            }
+            //批量修改合同工程清单,因为mybatis的修改是伪批量,所以手动拼接
+            baseMapper.batchUpdateForm(list2);
+            //修改清单与合同计量单元中间表
+            //清单与合同计量单元中间表集合,用于批量修改
+            List<InventoryFormMeter> list4 = new ArrayList<>();
+            //获取当前变更令的所有变更清单
+            List<ChangeFormVO2> allForm = baseMapper.getFormList3(id,form.getContractId());
+            for (ChangeFormVO2 v : allForm) {
+                InventoryFormMeter meter = new InventoryFormMeter();
+                meter.setContractFormId(v.getId());
+                meter.setContractMeterId(v.getContractMeterId());
+                meter.setChangeBuildPictureTotal(v.getChangeTotal());
+                meter.setChangeBuildPictureMoney(v.getChangeMoney());
+                list4.add(meter);
+            }
+            baseMapper.batchUpdateMeterForm(list4);
+        }
 
 
-        //通过汇总项修改合同清单
-        List<ChangeFormVO2> vo3 = baseMapper.getAllCollectForm(id);
-        if (vo3.size() == 0){
-            throw new ServiceException("当前变更令的变更清单为空,撤销失败");
-        }
-        List<ContractInventoryForm> list2 = new ArrayList<>();
-        for (ChangeFormVO2 vo : vo3) {
-            // 修改清单数量与金额
-            ContractInventoryForm fo = new ContractInventoryForm();
-            fo.setId(vo.getId());
-            fo.setChangeTotal(vo.getContractTotal());
-            fo.setChangeMoney(vo.getContractMoney());
-            list2.add(fo);
-        }
-        //批量修改合同工程清单,因为mybatis的修改是伪批量,所以手动拼接
-        baseMapper.batchUpdateForm(list2);
         //批量删除汇总项,因为撤销变更后,是可以下达的状态,下达时会重新生成最新的清单数据
         baseMapper.deleteCollectForm(id);
-
-        //修改清单与合同计量单元中间表
-        //清单与合同计量单元中间表集合,用于批量修改
-        List<InventoryFormMeter> list4 = new ArrayList<>();
-        //获取当前变更令的所有变更清单
-        List<ChangeFormVO2> allForm = baseMapper.getFormList3(id,form.getContractId());
-        for (ChangeFormVO2 v : allForm) {
-            InventoryFormMeter meter = new InventoryFormMeter();
-            meter.setContractFormId(v.getId());
-            meter.setContractMeterId(v.getContractMeterId());
-            meter.setChangeBuildPictureTotal(v.getChangeTotal());
-            meter.setChangeBuildPictureMoney(v.getChangeMoney());
-            list4.add(meter);
-        }
-        baseMapper.batchUpdateMeterForm(list4);
         //获取当前变更令的变更节点
         List<ChangeNodeVO> allNode = baseMapper.getNodeList3(id, form.getContractId());
         if (allNode.size() == 0){

+ 5 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenInventoryServiceImpl.java

@@ -36,4 +36,9 @@ public class ChangeTokenInventoryServiceImpl extends BaseServiceImpl<ChangeToken
     public void deleteByTokenId(Long id) {
         baseMapper.deleteByTokenId(id);
     }
+
+    @Override
+    public ChangeTokenInventory getCollectForm(Long changeTokenId,Long contractFormId) {
+        return baseMapper.getCollectForm(changeTokenId,contractFormId);
+    }
 }

+ 5 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/InventoryFormMeterServiceImpl.java

@@ -171,6 +171,11 @@ public class InventoryFormMeterServiceImpl extends BaseServiceImpl<InventoryForm
         return R.success("成功");
     }
 
+    @Override
+    public InventoryFormMeter getifm(Long id, Long contractMeterId) {
+        return baseMapper.getifm(id,contractMeterId);
+    }
+
     /**
      * 判断当前节点下当前清单是否已经分解或变更过,变更过返回true
      */

+ 11 - 0
blade-service/blade-repair/pom.xml

@@ -65,5 +65,16 @@
             <groupId>org.springframework</groupId>
             <artifactId>spring-test</artifactId>
         </dependency>
+        <dependency>
+            <groupId>e-iceblue</groupId>
+            <artifactId>spire.xls.free</artifactId>
+            <version>5.3.0</version>
+            <scope>system</scope>
+            <systemPath>${basedir}/../../doc/lib/eVisaLib/spire.xls.free-5.3.0.jar</systemPath>
+        </dependency>
+        <dependency>
+            <groupId>org.jsoup</groupId>
+            <artifactId>jsoup</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 1 - 1
blade-service/blade-repair/src/main/java/org/springblade/RepairApplication.java

@@ -13,6 +13,6 @@ import org.springframework.scheduling.annotation.EnableAsync;
 @EnableCaching
 public class RepairApplication {
     public static void main(String[] args) {
-        BladeApplication.run(LauncherConstant.APPLICATION_METER_NAME, RepairApplication.class, args);
+        BladeApplication.run(LauncherConstant.APPLICATION_REPAIR_NAME, RepairApplication.class, args);
     }
 }

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

@@ -9,22 +9,31 @@ import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.manager.entity.ExcelTab;
+import org.springblade.manager.entity.WbsTreeContract;
+import org.springblade.manager.entity.WbsTreePrivate;
+import org.springblade.repair.util.ExcelInfoUtils;
 import org.springblade.repair.util.FileUtils;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.SingleColumnRowMapper;
 import org.springframework.mock.web.MockMultipartFile;
 import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springblade.manager.feign.ExcelTabClient;
 import org.springframework.web.multipart.MultipartFile;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.file.Files;
+import java.time.chrono.JapaneseDate;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 
 @RestController
@@ -41,10 +50,9 @@ public class CheckAndRepairController {
      */
     @RequestMapping("/checkAndRepairExcelHtml")
     @ApiOperation("定时检测修复ExcelHtml")
-    @Scheduled(cron = "0  15 16 * * ?")
+    @Scheduled(cron = "00 00 00 * * ?")
     public void checkAndRepairExcelHtml() {
-        StringBuilder result=new StringBuilder("");
-        StringBuilder result1=new StringBuilder("");
+        StringBuilder result=new StringBuilder("清表损坏:");
         String sql = "Select * from m_excel_tab where parent_id=0 and is_deleted=0";
         List<ExcelTab> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ExcelTab.class));
         //String excelPath="E:\\excel\\";
@@ -57,27 +65,37 @@ public class CheckAndRepairController {
                     String sql2 = "Select * from m_excel_tab where parent_id=" + tab.getId() + " and is_deleted=0 and file_url is not null ";
                     List<ExcelTab> query2 = jdbcTemplate.query(sql2, new BeanPropertyRowMapper<>(ExcelTab.class));
                     for (ExcelTab excelTab1 : query2) {
+                        if(excelTab1.getId()==1800344270830305280L){
+                            continue;
+                        }
                         File html = new File(excelTab1.getHtmlUrl());
                         if(!html.exists()){
                             System.out.println(excelTab.getName() + "--" + tab.getName() + "--" + excelTab1.getName()+"html不存在 id:"+excelTab1.getId());
-                            if(excelTab1.getFileUrl() != null&&excelTab1.getFileUrl().endsWith(".xlsx") || excelTab1.getFileUrl().endsWith(".xls")){
-                                long resourceLength = CommonUtil.getResourceLength(excelTab1.getFileUrl());
-                                if(resourceLength>=500){
+                            if(excelTab1.getFileUrl() != null&&(excelTab1.getFileUrl().endsWith(".xlsx") || excelTab1.getFileUrl().endsWith(".xls"))){
+                                long resourceLength = CommonUtil.getFileContentLength(excelTab1.getFileUrl());
+                                System.out.println("文件大小:"+resourceLength);
+                                if(resourceLength!=415L&&resourceLength!=0L&&resourceLength!=234L){
                                     //先下载这个文件,再上传
                                     String fileUrl = excelTab1.getFileUrl();
                                     String localPath=excelPath+excelTab1.getId()+".xlsx";
-                                    InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(fileUrl);
-                                    FileUtils.saveFile(inputStreamByUrl,localPath);
-                                    File htmlFile = new File(localPath);
-                                    if(htmlFile.exists()){
-                                        try {
-                                            MultipartFile file = convert(htmlFile, excelTab1);
-                                            this.putFileAttach(file, excelTab1.getId());
-                                        }catch (Exception e){
-                                            e.printStackTrace();
+                                    System.out.println("开始下载:"+fileUrl);
+                                    try {
+                                        InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(fileUrl);
+                                        if(inputStreamByUrl!=null){
+                                            FileUtils.saveFile(inputStreamByUrl,localPath);
+                                            File htmlFile = new File(localPath);
+                                            if(htmlFile.exists()){
+                                                this.putFileAttach(new FileInputStream(htmlFile), excelTab1.getId(),excelTab1.getExtension());
+                                            }
+                                        }
+                                    }catch (Exception e){
+                                        System.out.println("下载失败:"+fileUrl);
+                                        if(resourceLength<500){
+                                            deletedExcel(excelTab1.getId());
                                         }
                                     }
                                 }else {
+                                    deletedExcel(excelTab1.getId());
                                     result.append(excelTab.getName() + "--" + tab.getName() + "--" + excelTab1.getName()+"\n");
                                 }
                             }
@@ -86,49 +104,199 @@ public class CheckAndRepairController {
                 }
             }
         } catch (Exception e) {
-            throw new RuntimeException(e);
+            e.printStackTrace();
         }
         System.out.println("完成");
         System.out.println(result);
-        System.out.println(result1);
     }
 
-    public static MultipartFile convert(File file,ExcelTab e) throws IOException {
-        String contentType = Files.probeContentType(file.toPath());
-        byte[] content = Files.readAllBytes(file.toPath());
-        return new MockMultipartFile(
-            "file",
-            e.getName(),
-            contentType,
-            content
-        );
+    public void deletedExcel(Long id){
+        String sql="update m_excel_tab set is_deleted=3 where id="+id;
+        jdbcTemplate.execute(sql);
+        System.out.println("删除成功:"+id);
     }
-    public R putFileAttach(@RequestParam("file") MultipartFile file, Long nodeId) throws Exception {
+
+    public void putFileAttach(InputStream inputStream, Long nodeId,String name) throws Exception {
+        System.out.println("开始上传");
         String file_path = FileUtils.getSysLocalFileUrl();
         String sql="Select * from m_excel_tab where id="+nodeId+" and is_deleted=0";
         ExcelTab detail = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(ExcelTab.class));
         String filecode = SnowFlakeUtil.getId() + "";
         String thmlUrl = file_path + filecode + ".html";
         String exceUrl = file_path + filecode + "123.xlsx";
-        excelTabClient.excelInfo(file.getInputStream(), exceUrl, thmlUrl, "1");
+        ExcelInfoUtils.excelInfo(inputStream, exceUrl, thmlUrl, "1");
         // 上传excel文件
-        BladeFile bladeFile = newIOSSClient.uploadFile(file.getOriginalFilename(), exceUrl);
-        if (bladeFile == null || ObjectUtil.isEmpty(bladeFile)) {
-            return R.fail("oss上传失败,请校验oss配置是否正确");
-        }
+        BladeFile bladeFile = newIOSSClient.uploadFile(name, exceUrl);
         // 解析原始excel
-        detail.setExtension(file.getOriginalFilename());
+        detail.setExtension(name);
         detail.setFileUrl(bladeFile.getLink());
         detail.setFileType(3); // 表示为清表信息  1 表示祖节点  2 表示为节点信息 3 表示清表
         detail.setHtmlUrl(thmlUrl);
-        excelTabClient.saveOrUpdate(detail);
+        String update="update m_excel_tab set file_url ="+"'"+bladeFile.getLink()+"' , html_url="+"'"+thmlUrl+"' where id="+nodeId;
+        System.out.println(update);
+        int i = jdbcTemplate.update(update);
         // 解析html
         excelTabClient.expailHtmlInfo(thmlUrl, detail.getId(), detail.getTabType() + "");
-        return R.success("上传成功");
+        if(i==1){
+            System.out.println("上传成功");
+        }else {
+            System.out.println("上传失败");
+        }
+
+    }
+
+
+    /**
+     * 定时更新private和contract的html,通过is_private_type_id;保证一样
+     */
+    @Scheduled(cron = "0 0  1 * * ?")
+    public void checkAndRepairPrivateAndContractHtml() {
+        System.out.println("开始扫描private和contract的html");
+        StringBuilder result=new StringBuilder("");
+        try {
+            String sql="SELECT a.p_key_id,a.is_type_private_pid FROM m_wbs_tree_contract a,m_wbs_tree_private b WHERE a.html_url != b.html_url AND a.is_type_private_pid=b.p_key_id AND a.type=2 AND a.is_deleted=0 AND b.type=2 AND b.html_url is not NULL";
+            List<WbsTreeContract> contractListlist = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+            for (WbsTreeContract wbsTreeContract : contractListlist) {
+                String update=" update m_wbs_tree_contract set html_url=(select html_url from m_wbs_tree_private where p_key_id="+wbsTreeContract.getIsTypePrivatePid()+") where p_key_id="+wbsTreeContract.getPKeyId();
+                int i = jdbcTemplate.update(update);
+                if(i!=1){
+                    result.append(wbsTreeContract.getPKeyId()+"\n");
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        System.out.println("更新完毕private和contract的html");
+        System.out.println(result);
+    }
+
+    /**
+     * 定时更新private initTable 通过excelID,保证一样
+     */
+    @GetMapping("/checkAndRepairPrivateInitTableAndExcelId")
+    @Scheduled(cron = "0 57  16 * * ?")
+    public void checkAndRepairPrivateInitTableAndExcelId() {
+        System.out.println("开始扫描private initTable和ExcelId");
+        String privateSql="select p_key_id,init_table_name,excel_id,html_url from m_wbs_tree_private where type=2 AND is_deleted=0 AND (excel_id IS NULL OR init_table_name IS NULL OR html_url IS NULL)";
+        List<WbsTreePrivate> list = jdbcTemplate.query(privateSql, new BeanPropertyRowMapper<>(WbsTreePrivate.class));
+        list = list.stream()
+            .filter(item ->
+                !ObjectUtil.isEmpty(item.getHtmlUrl()) ||
+                    !ObjectUtil.isEmpty(item.getExcelId()) ||
+                    !ObjectUtil.isEmpty(item.getInitTableName())
+            )
+            .collect(Collectors.toList());
+        //excelId不为空 但是initTableName为空
+        List<WbsTreePrivate> list1 = list.stream()
+            .filter(item ->
+                !ObjectUtil.isEmpty(item.getExcelId()) &&
+                    ObjectUtil.isEmpty(item.getInitTableName())
+            )
+            .collect(Collectors.toList());
+
+        //excelId为空 但是initTableName不为空
+        List<WbsTreePrivate> list2 = list.stream()
+            .filter(item ->
+                ObjectUtil.isEmpty(item.getExcelId()) &&
+                    !ObjectUtil.isEmpty(item.getInitTableName())
+            )
+            .collect(Collectors.toList());
+        if(!list1.isEmpty()){
+            for (WbsTreePrivate w : list1) {
+                String sql="select a.tab_en_name,b.html_url from m_table_info a left join m_excel_tab b on a.id=b.tab_id where b.id="+w.getExcelId()+" and a.is_deleted=0 and b.is_deleted=0";
+                Map<String, Object> map = jdbcTemplate.queryForMap(sql);
+                if(map.get("tab_en_name")!=null){
+                    String update="update m_wbs_tree_private set init_table_name="+map.get("tab_en_name")+" where p_key_id="+w.getPKeyId();
+                    jdbcTemplate.update(update);
+                }
+                if(w.getHtmlUrl()==null){
+                    String update="update m_wbs_tree_private set html_url="+map.get("html_url")+" where p_key_id="+w.getPKeyId();
+                    jdbcTemplate.update(update);
+                }
+            }
+        }
+        if(!list2.isEmpty()){
+            for (WbsTreePrivate w : list2) {
+                String sql=" select a.id,a.html_url from m_excel_tab a left join m_table_info b on b.id=a.tab_id where b.tab_en_name= '"+w.getInitTableName()+"' and a.is_deleted=0 and b.is_deleted=0";
+                Map<String, Object> map = jdbcTemplate.queryForMap(sql);
+                if(map.get("id")!=null){
+                    String update="update m_wbs_tree_private set excel_id="+map.get("id")+" where p_key_id="+w.getPKeyId();
+                    jdbcTemplate.update(update);
+                }
+                if(w.getHtmlUrl()==null){
+                    if(map.get("html_url")!=null){
+                        String update="update m_wbs_tree_private set html_url='"+map.get("html_url")+"' where p_key_id ="+w.getPKeyId();
+                        jdbcTemplate.update(update);
+                    }
+                }
+            }
+        }
+        System.out.println("更新完毕private initTable和ExcelId");
     }
 
     /**
-     * 每周天晚上2点定时更新private和contract的html,通过is_private_type_id;
+     * 定时更新contract initTable 通过excelID,保证一样
      */
-    public void checkAndRepairPrivateAndContractHtml() {}
+    @GetMapping("/checkAndRepairContractInitTableAndExcelId")
+    @Scheduled(cron = "0  00  2 * * ?")
+    public void checkAndRepairContractInitTableAndExcelId() {
+        System.out.println("定时更新contract initTable和ExcelId");
+        String contractSql="select p_key_id,init_table_name,excel_id,html_url from m_wbs_tree_contract where type=2 AND is_deleted=0 AND (excel_id IS NULL OR init_table_name IS NULL OR html_url IS NULL)";
+        List<WbsTreeContract> list = jdbcTemplate.query(contractSql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+        list = list.stream()
+            .filter(item ->
+                !ObjectUtil.isEmpty(item.getHtmlUrl()) ||
+                    !ObjectUtil.isEmpty(item.getExcelId()) ||
+                    !ObjectUtil.isEmpty(item.getInitTableName())
+            )
+            .collect(Collectors.toList());
+        //excelId不为空 但是initTableName为空
+        List<WbsTreeContract> list1 = list.stream()
+            .filter(item ->
+                !ObjectUtil.isEmpty(item.getExcelId()) &&
+                    ObjectUtil.isEmpty(item.getInitTableName())
+            )
+            .collect(Collectors.toList());
+
+        //excelId为空 但是initTableName不为空
+        List<WbsTreeContract> list2 = list.stream()
+            .filter(item ->
+                ObjectUtil.isEmpty(item.getExcelId()) &&
+                    !ObjectUtil.isEmpty(item.getInitTableName())
+            )
+            .collect(Collectors.toList());
+        if(!list1.isEmpty()){
+            for (WbsTreeContract w : list1) {
+                String sql="select a.tab_en_name,b.html_url from m_table_info a left join m_excel_tab b on a.id=b.tab_id where b.id="+w.getExcelId()+" and a.is_deleted=0 and b.is_deleted=0";
+                Map<String, Object> map = jdbcTemplate.queryForMap(sql);
+                if(map.get("tab_en_name")!=null){
+                    String update="update m_wbs_tree_contract set init_table_name="+map.get("tab_en_name")+" where p_key_id="+w.getPKeyId();
+                    jdbcTemplate.update(update);
+                }
+                if(w.getHtmlUrl()==null){
+                    String update="update m_wbs_tree_contract set html_url="+map.get("html_url")+" where p_key_id="+w.getPKeyId();
+                    jdbcTemplate.update(update);
+                }
+            }
+        }
+        if(!list2.isEmpty()){
+            for (WbsTreeContract w : list2) {
+                String sql=" select a.id,a.html_url from m_excel_tab a left join m_table_info b on b.id=a.tab_id where b.tab_en_name= '"+w.getInitTableName()+"' and a.is_deleted=0 and b.is_deleted=0";
+                Map<String, Object> map = jdbcTemplate.queryForMap(sql);
+                if(map.get("id")!=null){
+                    String update="update m_wbs_tree_contract set excel_id="+map.get("id")+" where p_key_id="+w.getPKeyId();
+                    jdbcTemplate.update(update);
+                }
+                if(w.getHtmlUrl()==null){
+                    if(map.get("html_url")!=null){
+                        String update="update m_wbs_tree_contract set html_url='"+map.get("html_url")+"' where p_key_id ="+w.getPKeyId();
+                        jdbcTemplate.update(update);
+                    }
+                }
+            }
+        }
+        System.out.println("更新完毕contract initTable和ExcelId");
+    }
+
+
 }

+ 208 - 0
blade-service/blade-repair/src/main/java/org/springblade/repair/util/ExcelInfoUtils.java

@@ -0,0 +1,208 @@
+package org.springblade.repair.util;
+
+import com.spire.xls.CellRange;
+import com.spire.xls.FileFormat;
+import com.spire.xls.Workbook;
+import com.spire.xls.Worksheet;
+import com.spire.xls.core.spreadsheet.HTMLOptions;
+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.SnowFlakeUtil;
+import org.springblade.core.tool.utils.FileUtil;
+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.vo.DateFormat;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class ExcelInfoUtils {
+    public static void excelInfo(InputStream inputStream, String excelURL, String htmlUrl, String type) {
+        try {
+            String file_path = "/Users/hongchuangyanfa/Desktop//pdf/";
+            String filecode = SnowFlakeUtil.getId() + "";
+            String thmlUrl2 = file_path + filecode + "123.html";
+
+            // 解析原始excel
+            Workbook wb = new Workbook();
+            wb.loadFromMHtml(inputStream);
+            Worksheet sheet = wb.getWorksheets().get(0);
+            HTMLOptions options = new HTMLOptions();
+            options.setImageEmbedded(true);
+
+            // 校验excel 是否正常
+            sheet.saveToHtml(htmlUrl, options);
+            File file1 = ResourceUtil.getFile(htmlUrl);
+            String htmlString = IoUtil.readToString(new FileInputStream(file1));
+            Document doc = Jsoup.parse(htmlString);
+            Element table = doc.select("table").first();
+            Elements trs = table.select("tr");
+            Elements cols = table.select("Col");
+            sheet.deleteRow(trs.size()+1,sheet.getRows().length - trs.size());
+            sheet.deleteColumn(cols.size()+1,sheet.getColumns().length - cols.size());
+            file1.delete();
+            //复制一份
+            wb.saveToFile(excelURL, FileFormat.Version2013);
+            // 操作
+            Workbook wb2 = new Workbook();
+            wb2.loadFromMHtml(excelURL);
+            Worksheet sheet2 = wb2.getWorksheets().get(0);
+
+            // 坐标map
+            Map<String, Map<String, Integer>> xyList = new HashMap<>();
+            int j = 0;
+            int maxVal = 0;
+            if(type.equals("2")){
+                CellRange[] sheet2Cells = sheet2.getCells();
+                for (int i = 0; i < sheet2Cells.length; i++) {
+                    CellRange oldcell = sheet2Cells[i];
+                    String data = oldcell.getDataValidation().getErrorMessage();
+                    int k = 0;
+                    if(Func.isNumeric(data)){
+                        k = Func.toInt(data);
+                    }
+                    if (maxVal < k) {
+                        maxVal = k;
+                    }
+                }
+            }else if(type.equals("1")){
+                CellRange[] sheet2Cells = sheet.getCells();
+                for (int i = 0; i < sheet2Cells.length; i++) {
+                    CellRange oldcell = sheet2Cells[i];
+                    oldcell.getDataValidation().setErrorMessage("");
+                    sheet.get(oldcell.getRow(),oldcell.getColumn()).getDataValidation().setErrorMessage("");
+                }
+            }
+
+            //合并单元格操作
+            CellRange[] mergedCells = sheet.getMergedCells();
+            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());
+                if(type.equals("2")){
+                    String data = mergedCell.getDataValidation().getErrorMessage();
+                    if (StringUtils.isEmpty(data)) {
+                        if(maxVal<=0){
+                            j = j + 1;
+                        }else{
+                            maxVal = maxVal+1;
+                            j=maxVal;
+                        }
+                    } else {
+                        j = Func.toInt(data);
+                    }
+                }else{
+                    j = j + 1;
+                }
+                // 目标表添加备注信息
+                mergedCell.getDataValidation().setErrorMessage(j+"");
+                oldcell.getDataValidation().setErrorMessage(j+"");
+                sheet2.getMergedCells()[i].setText(j+"");
+                dataMap.put("y1", oldcell.getRow());
+                dataMap.put("y2", oldcell.getLastRow());
+                dataMap.put("x1", oldcell.getColumn());
+                dataMap.put("x2", oldcell.getLastColumn());
+                xyList.put(j + "", dataMap);
+            }
+
+            //变更最大值
+            if(maxVal<=0){
+                maxVal = j;
+            }
+
+            // 单个
+            CellRange[] onCell = sheet.getCells();
+            // 单个cell
+            for (int i = 0; i < onCell.length; i++) {
+                CellRange oldcell = onCell[i];
+                String data = oldcell.getDataValidation().getErrorMessage();
+                System.out.println(oldcell.getRow()+"---"+oldcell.getColumn()+"---="+oldcell.getText()+"---x="+data);
+                if (StringUtils.isEmpty(data)) {
+                    if(maxVal<=0){
+                        j = j + 1;
+                    }else{
+                        maxVal = maxVal+1;
+                        j=maxVal;
+                    }
+                } else {
+                    j = Func.toInt(data);
+                }
+
+              /*  if(StringUtils.isEmpty(data)){
+                    oldcell.getDataValidation().setErrorMessage(j+"");
+                    sheet2.getCells()[i].setText(j+"");
+                }*/
+
+                if(!xyList.containsKey(j+"")){
+                    Map<String, Integer> dataMap = new HashMap<>();
+                    dataMap.put("y1", oldcell.getRow());
+                    dataMap.put("y2", oldcell.getLastRow());
+                    dataMap.put("x1", oldcell.getColumn());
+                    dataMap.put("x2", oldcell.getLastColumn());
+                    xyList.put(j + "", dataMap);
+                }
+            }
+
+            // 保存上传的excel
+            wb.saveToFile(excelURL,FileFormat.Version2013);
+            sheet.saveToHtml(htmlUrl, options);
+            sheet2.saveToHtml(thmlUrl2);
+
+            // html 转换值
+
+            // 组装坐标
+            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);
+
+            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.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();
+            }
+            wb2.dispose();
+            wb.dispose();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+}

+ 1 - 1
blade-service/blade-repair/src/main/resources/application-dev.yml

@@ -1,6 +1,6 @@
 #服务器端口
 server:
-  port: 9876
+  port: 9119
 
 #数据源配置
 spring: