Pārlūkot izejas kodu

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

LHB 3 mēneši atpakaļ
vecāks
revīzija
d8cd62e65d
23 mainītis faili ar 387 papildinājumiem un 148 dzēšanām
  1. 30 0
      blade-common/src/main/java/org/springblade/common/utils/YiKeYunApiUtils.java
  2. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TaskParallel.java
  3. 6 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/BusinessTaskFailedPageVO.java
  4. 2 1
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/feign/CertificateItemClient.java
  5. 3 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/utils/ItextPdfUtils.java
  6. 1 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ContractLogController.java
  7. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/EVisaTaskCheckController.java
  8. 230 101
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  9. 1 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  10. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  11. 25 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/WeatherInfoServiceImpl.java
  12. 4 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  13. 19 18
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java
  14. 7 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  15. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaDaoImpl.java
  16. 16 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  17. 0 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/NodeBaseInfoServiceImpl.java
  18. 6 2
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java
  19. 2 2
      blade-service/blade-meter/src/main/java/org/springblade/meter/feign/CertificateItemClientImpl.java
  20. 2 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IInterimPayCertificateItemService.java
  21. 12 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/InterimPayCertificateItemServiceImpl.java
  22. 13 2
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MiddleMeterApplyServiceImpl.java
  23. 1 1
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

+ 30 - 0
blade-common/src/main/java/org/springblade/common/utils/YiKeYunApiUtils.java

@@ -43,6 +43,7 @@ public class YiKeYunApiUtils {
             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;
@@ -98,6 +99,9 @@ public class YiKeYunApiUtils {
             }
             log.info("获取当天天气 ======= sb.toString():" + sb);
             JSONObject jsonData = JSONObject.parseObject(sb.toString());
+            map.put("nums", new HashMap<String, String>(){{
+                put("nums", jsonData.getInteger("nums").toString());
+            }});
             JSONArray list = jsonData.getJSONArray("list");
 
             list.forEach(item -> {
@@ -122,5 +126,31 @@ public class YiKeYunApiUtils {
         return map;
     }
 
+    /**
+     * 易客 国内LBS逆地理编码服务 (区县级) 每日免费500次
+     * 根据经纬度坐标解析地址详情
+     */
+    public static Map<String, String> getPosition(String LatitudeAndLongitude) throws IOException {
+        String getUrl = String.format("http://apia.yikeapi.com/geocode?appid=%s&appsecret=%s&output=json&location=", API_YIKEYUN_APPID, API_YIKEYUN_APPSECRET, LatitudeAndLongitude);
+        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);
+        Map<String, String> map = new HashMap<>();
+        JSONObject jsonData = JSONObject.parseObject(sb.toString());
+        map.put("nums", jsonData.get("nums").toString());
+        JSONObject regeocode = (JSONObject) jsonData.get("regeocode");
+        JSONObject addressComponent = (JSONObject) regeocode.get("addressComponent");
+        map.put("province", addressComponent.get("province").toString());
+        map.put("city", addressComponent.get("city").toString());
+        map.put("district", addressComponent.get("district").toString());
+        map.put("adcode", addressComponent.get("adcode").toString());
+        return map;
+    }
+
 
 }

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TaskParallel.java

@@ -86,6 +86,9 @@ public class TaskParallel extends BaseEntity {
         this.setIsDeleted(0);
         this.setCreateUser(AuthUtil.getUserId());
         this.setCreateTime(new Date());
+        this.initiative = 1;
+        this.exeCount = 0;
+        this.setStatus(1);
     }
 
     public TaskParallel() {

+ 6 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/BusinessTaskFailedPageVO.java

@@ -46,4 +46,10 @@ public class BusinessTaskFailedPageVO implements Serializable {
     @ApiModelProperty(value = "电签PDF路径")
     private String sigPdf;
 
+    @ApiModelProperty(value = "审批类型")
+    // 1=填报数据(质量填报,试验上报) 2=工程文件(档案) 3=日志资料  4=档案数据   5=计量支付证书  6=计量 材料预付款  7= 计量 中间支付  8委托单
+    private Integer approvalType;
+
+
+
 }

+ 2 - 1
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/feign/CertificateItemClient.java

@@ -5,6 +5,7 @@ import org.springblade.meter.entity.InterimPayCertificateItem;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
 
@@ -19,5 +20,5 @@ public interface CertificateItemClient {
      * 保存中期证书项目详情
      */
     @PostMapping(API_PREFIX + "/saveOrUpdate")
-    void saveOrUpdate(@RequestBody List<InterimPayCertificateItem> items);
+    void saveOrUpdate(@RequestBody List<InterimPayCertificateItem> items,@RequestParam Long reportId);
 }

+ 3 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/utils/ItextPdfUtils.java

@@ -49,6 +49,9 @@ public class ItextPdfUtils {
         twoTable.setWidthPercentage(widthPercentage);
         //设置每页占满
         twoTable.setSplitLate(false);
+        if (text == null) {
+            text = "";
+        }
         String[] split = text.split("\n");
         for (String s : split) {
             PdfPCell cell = pdfTableStyle2(s, size10font);

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

@@ -552,6 +552,7 @@ public class ContractLogController extends BladeController {
                     //生成任务实体
                     TaskVO taskVO = new TaskVO();
                     BeanUtils.copyProperties(startTaskVO, taskVO);
+                    taskVO.setApprovalType(3);
                     if (taskVO.getUserTasks() != null && taskVO.getUserTasks().size() > 0) {
                         //标记为自定义流程
                         taskVO.setFixedFlowId(Long.parseLong("0"));

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

@@ -97,7 +97,7 @@ public class EVisaTaskCheckController {
             InformationQuery node = informationQueryService.getOne(new LambdaQueryWrapper<InformationQuery>()
                     .eq(InformationQuery::getWbsId, json.getString("nodeId"))
                     .eq(InformationQuery::getContractId, json.getString("contractId"))
-                    .eq(InformationQuery::getClassify, tableOwner));
+                    .eq(InformationQuery::getClassify, tableOwner).last("order by id desc limit 1"));
 
             if (node == null || StringUtils.isBlank(node.getPdfUrl())) {
                 return R.fail(300, "当前节点还未生成PDF,不能上报");
@@ -365,7 +365,7 @@ public class EVisaTaskCheckController {
         InformationQuery node = informationQueryService.getOne(new LambdaQueryWrapper<InformationQuery>()
                 .eq(InformationQuery::getWbsId, json.getString("nodeId"))
                 .eq(InformationQuery::getContractId, contractId)
-                .eq(InformationQuery::getClassify, tableOwner));
+                .eq(InformationQuery::getClassify, tableOwner).last("ORDER BY id DESC limit 1"));
 
         if (node == null || StringUtils.isBlank(node.getPdfUrl())) {
             return R.fail(300, "当前节点还未生成PDF,不能上报");

+ 230 - 101
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -147,6 +147,8 @@ public class InformationWriteQueryController extends BladeController {
 
     private final ExcelTabClient excelTabClient;
 
+    private final IRecycleBinService recycleBinService;
+
     @Autowired
     StringRedisTemplate RedisTemplate;
 
@@ -609,14 +611,16 @@ public class InformationWriteQueryController extends BladeController {
 //    @PushMessage(clientId = ClientIdConstant.BUSINESS_CLIENT_ID)
     public R<Object> abolishOne(@RequestParam String primaryKeyId, @RequestParam String classify, @RequestParam String projectId, @RequestParam String contractId) {
         //查询填报状态
-        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, primaryKeyId).eq(InformationQuery::getClassify, classify).eq(InformationQuery::getType, 1));
+        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, primaryKeyId).eq(InformationQuery::getContractId, contractId)
+                .eq(InformationQuery::getClassify, classify).eq(InformationQuery::getType, 1).ne(InformationQuery::getStatus, 3));
         primaryKeyId = primaryKeyId + "*";
         if (businessData != null) {
             //使用批量废除接口
             return this.batchAbolish(businessData.getId().toString(), primaryKeyId, projectId, contractId, "撤回成功");
         } else {
             //试验
-            InformationQuery businessDataTrial = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, primaryKeyId).eq(InformationQuery::getClassify, classify).eq(InformationQuery::getType, 2));
+            InformationQuery businessDataTrial = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, primaryKeyId).eq(InformationQuery::getClassify, classify).eq(InformationQuery::getContractId, contractId)
+                    .eq(InformationQuery::getType, 2).ne(InformationQuery::getStatus, 3));
             if (businessDataTrial != null) {
                 //使用批量废除接口
                 return this.batchAbolish(businessDataTrial.getId().toString(), primaryKeyId, projectId, contractId, "撤回成功");
@@ -653,7 +657,7 @@ public class InformationWriteQueryController extends BladeController {
         //记录状态
         String status = "1";
         //查询填报状态,type=1资料填报
-        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, primaryKeyId).eq(InformationQuery::getClassify, classify).eq(InformationQuery::getType, 1).last("limit 1"));
+        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, primaryKeyId).eq(InformationQuery::getClassify, classify).eq(InformationQuery::getType, 1).last("order by id desc limit 1"));
         if (businessData != null) {
             switch (businessData.getStatus()) {
                 case 0:
@@ -715,7 +719,7 @@ public class InformationWriteQueryController extends BladeController {
         //记录状态
         String status = "1";
         //查询填报状态,type=1资料填报
-        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, primaryKeyId).eq(InformationQuery::getClassify, classify).eq(InformationQuery::getType, 1));
+        InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, primaryKeyId).eq(InformationQuery::getClassify, classify).eq(InformationQuery::getType, 1).last("order by id desc limit 1"));
         if (businessData != null) {
             switch (businessData.getStatus()) {
                 case 0:
@@ -780,7 +784,7 @@ public class InformationWriteQueryController extends BladeController {
         //查询填报状态,type=3首件
         InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery()
                 .eq(InformationQuery::getId, id)
-                .eq(InformationQuery::getType, 3)
+                .eq(InformationQuery::getType, 3).last("order by id desc limit 1")
         );
         if (businessData != null) {
             switch (businessData.getStatus()) {
@@ -906,7 +910,7 @@ public class InformationWriteQueryController extends BladeController {
         //此时的ids是当前节点的primaryKeyId但并不是业务数据ID,需要根据ids和classify去查询具体的业务ID
         if (ObjectUtil.isNotEmpty(startTaskVO.getTrialSelfInspectionRecordId())) {
             //试验
-            businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, startTaskVO.getIds().replaceAll(",", "")).eq(InformationQuery::getClassify, startTaskVO.getClassify().toString()).eq(InformationQuery::getType, 2).eq(InformationQuery::getContractId,startTaskVO.getContractId()));
+            businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, startTaskVO.getIds().replaceAll(",", "")).eq(InformationQuery::getClassify, startTaskVO.getClassify().toString()).eq(InformationQuery::getType, 2).eq(InformationQuery::getContractId,startTaskVO.getContractId()).last("order by id desc limit 1"));
             if (businessData != null) {
                 //设置业务数据ID
                 startTaskVO.setIds(businessData.getWbsId().toString());
@@ -916,7 +920,7 @@ public class InformationWriteQueryController extends BladeController {
                 return R.data(300, false, "未查询到填报信息,上报失败");
             }
         } else { //质检
-            businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, startTaskVO.getIds().replaceAll(",", "")).eq(InformationQuery::getClassify, startTaskVO.getClassify().toString()).eq(InformationQuery::getType, 1));
+            businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, startTaskVO.getIds().replaceAll(",", "")).eq(InformationQuery::getClassify, startTaskVO.getClassify().toString()).eq(InformationQuery::getType, 1).last("order by id desc limit 1"));
             if (businessData != null) {
                 //设置业务数据ID
                 startTaskVO.setIds(businessData.getId().toString());
@@ -1170,7 +1174,7 @@ public R<String> batchDownloadFileToZip(String ids, HttpServletResponse response
                         //已审批、已撤销的任务,修改业务数据的审批状态为未上报并撤签即可
                         LambdaUpdateWrapper<InformationQuery> wrapper = Wrappers.lambdaUpdate();
                         //更改状态为未上报
-                        wrapper.set(InformationQuery::getStatus, 0);
+                        wrapper.set(InformationQuery::getStatus, 3);
                         //将电签的pdf路径置空
                         wrapper.set(InformationQuery::getEVisaPdfUrl, null);
                         //将上报批次置空
@@ -1208,6 +1212,9 @@ public R<String> batchDownloadFileToZip(String ids, HttpServletResponse response
                         }
 
                         for (InformationQuery query : queries) {
+                            if (query.getStatus() != null && query.getStatus() != 3) {
+                                this.informationQueryService.update(Wrappers.<InformationQuery>lambdaUpdate().eq(InformationQuery::getId, query.getId()).set(InformationQuery::getStatus, 3));
+                            }
                             if (StringUtils.isNotEmpty(query.getFileUserIdAndName())) {
                                 String[] userArray = query.getFileUserIdAndName().split(",");
                                 for (String str : userArray) {
@@ -1353,7 +1360,7 @@ public R<String> batchDownloadFileToZip(String ids, HttpServletResponse response
 @ApiOperation(value = "批量上报")
 //    @PushMessage(clientId = ClientIdConstant.BUSINESS_CLIENT_ID)
 public R<Object> batchTask(@RequestBody StartTaskVO startTaskVO) {
-    // 1= 代表 试验 流程上报  2=试验 - 委托单上报   其他=质检或别的项目上报
+    // 1= 代表 试验 流程上报  2=试验 - 委托单上报 3=首件上报  其他=质检或别的项目上报
     Long appType = startTaskVO.getTrialSelfInspectionRecordId();
     if (ObjectUtil.isEmpty(SecureUtil.getUserId()) || SecureUtil.getUserId() == -1L) {
         throw new ServiceException("未获取到当前用户信息");
@@ -1381,7 +1388,19 @@ public R<Object> batchTask(@RequestBody StartTaskVO startTaskVO) {
             }
 
             Map<String, InformationQuery> queryMap = new HashMap<>();
-            queryList.forEach(query -> queryMap.put(query.getId().toString(), query));
+            List<InformationQuery> saveQueryList = new ArrayList<>();
+            queryList.forEach(query -> {
+                if (query.getStatus() != null && query.getStatus() == 3) {
+                    query.setId(SnowFlakeUtil.getId());
+                    query.setStatus(0);
+                    saveQueryList.add(query);
+                }
+                queryMap.put(query.getId().toString(), query);
+            });
+            if (!saveQueryList.isEmpty()) {
+                this.informationQueryService.saveBatch(saveQueryList);
+                ids = queryList.stream().map(InformationQuery::getId).map(String::valueOf).toArray(String[]::new);
+            }
             boolean var = false;
 
             try {
@@ -1413,6 +1432,10 @@ public R<Object> batchTask(@RequestBody StartTaskVO startTaskVO) {
                     //设置上报类型
                     if (appType != null && appType == 2L) {
                         taskVO.setApprovalType(8);
+                    } else if (appType != null && appType == 1L) {
+                        taskVO.setApprovalType(9);
+                    } else if (appType != null && appType == 3L) {
+                        taskVO.setApprovalType(10);
                     } else {
                         taskVO.setApprovalType(1);
                     }
@@ -1454,7 +1477,7 @@ public R<Object> batchTask(@RequestBody StartTaskVO startTaskVO) {
                             jdbcTemplate.execute(sql);
                         }
                         var = true;
-                        getPdfs(queryMap.get(id));
+//                        getPdfs(queryMap.get(id));
                     } else {
                         return R.fail("创建主流程失败");
                     }
@@ -3087,8 +3110,8 @@ private void currentNodeAllParent(StringBuilder nodeName, WbsTreeContract curren
 private void currentNodeAllChild(List<WbsTreeContract> resultChildNodes, List<WbsTreeContract> childNodes, String contractId) {
     if (childNodes.size() > 0) {
         //如果存在子级,那么递归获取子级的子级
-        List<Long> ids = childNodes.stream().map(WbsTreeContract::getId).collect(Collectors.toList());
-        List<WbsTreeContract> childNodeList = jdbcTemplate.query("select p_key_id,id,parent_id,type from m_wbs_tree_contract where is_deleted = 0 and contract_id = " + contractId + " and parent_id in(" + StringUtils.join(ids, ",") + ")", new BeanPropertyRowMapper<>(WbsTreeContract.class));
+        List<Long> ids = childNodes.stream().map(WbsTreeContract::getId).distinct().collect(Collectors.toList());
+        List<WbsTreeContract> childNodeList = jdbcTemplate.query("select p_key_id,id,parent_id,type,contract_id,project_id,full_name,node_name from m_wbs_tree_contract where is_deleted = 0 and contract_id = " + contractId + " and parent_id in(" + StringUtils.join(ids, ",") + ")", new BeanPropertyRowMapper<>(WbsTreeContract.class));
         if (childNodeList.size() > 0) {
             resultChildNodes.addAll(childNodeList);
             this.currentNodeAllChild(resultChildNodes, childNodeList, contractId);
@@ -3123,105 +3146,211 @@ public R removeContractTreeNodeJudge(@RequestParam String ids) {
     return R.data(true);
 }
 
-/**
- * 删除节点
- *
- * @param ids 节点的primaryKeyId(只有一个值)
- * @return 删除结果
- */
-@PostMapping("/removeContractTreeNode")
-@ApiOperationSupport(order = 11)
-@ApiOperation(value = "删除节点")
-@ApiImplicitParam(name = "ids", value = "节点的primaryKeyId")
-public R<Boolean> removeContractTreeNode(@RequestParam String ids) {
-    //根据传入的节点,将其所有子节点删除
-    WbsTreeContract removeNode = this.wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(Long.parseLong(ids));
+    /**
+     * 删除节点
+     * @param ids 节点的primaryKeyId
+     * @return 删除结果
+     */
+    @PostMapping("/removeContractTreeNode")
+    @ApiOperationSupport(order = 11)
+    @ApiOperation(value = "批量删除节点")
+    @ApiImplicitParam(name = "ids", value = "节点的primaryKeyId, 逗号拼接")
+    public R<Boolean> removeContractTreeNode(@RequestParam String ids) {
+        if (!ids.isEmpty()) {
+            List<WbsTreeContract> removeWbsTreeContracts = this.jdbcTemplate.query("select p_key_id,id,parent_id,type,contract_id,project_id,full_name,node_name from m_wbs_tree_contract where is_deleted = 0 and p_key_id in (" + ids + ")", new BeanPropertyRowMapper<>(WbsTreeContract.class));
+            if (removeWbsTreeContracts.isEmpty()) {
+                return R.fail("删除失败:节点不存在");
+            }
 
-        /*//判断是否存在原始节点
-        if (ObjectUtil.isEmpty(removeNode.getOldId())) {
-            return R.data(300, false, "节点【" + removeNode.getFullName() + "】为原始节点,不允许删除");
-        }*/
+            String contractId = removeWbsTreeContracts.get(0).getContractId();
+            String projectId = removeWbsTreeContracts.get(0).getProjectId();
+            removeWbsTreeContracts.forEach(node -> {
+                if (contractId == null || !contractId.equals(node.getContractId())) {
+                    throw new ServiceException("删除失败:节点不属于同一合同段");
+                }
+            });
 
-    //查询当前操作的节点的父级关系
-    StringBuilder parentNodeName = new StringBuilder();
-    this.currentNodeAllParent(parentNodeName, removeNode);
+            List<WbsTreeContract> removeNodeList = new ArrayList<>();
+            Map<Long , WbsTreeContract> unremoveNodeMap = new HashMap<>();
+            // 查询所有子节点
+            this.currentNodeAllChild(removeNodeList, removeWbsTreeContracts, contractId);
+            removeNodeList.addAll(removeWbsTreeContracts);
+            // 根据pKeyId去重
+            removeNodeList = distinct(removeNodeList);
+            //获取pKeyId
+            List<Long> removeList = removeNodeList.stream().map(WbsTreeContract::getPKeyId).distinct().collect(Collectors.toList());
+            if (!removeList.isEmpty()) {
+                String wbsIds = removeList.stream().map(Object::toString).collect(Collectors.joining(","));
+                /** 判断是否子节点有上报或审批过的资料,因为父id和祖级节点错误,直接使用上面的值去查询上报情况*/
+                List<String> unRemoveIds = jdbcTemplate.queryForList("SELECT wbs_id from u_information_query WHERE wbs_id in (" + wbsIds + ") and is_deleted = 0 and status in (1,2) GROUP BY wbs_id HAVING count(1) > 0", String.class);
+                if (!unRemoveIds.isEmpty()) {
+                    // 剔除此节点
+                    Map<String, String> map = unRemoveIds.stream().collect(Collectors.toMap(id -> id, Function.identity()));
+                    removeNodeList.removeIf(node -> {
+                        //删除掉表格 TODO(不清楚为什么要剔除表格,按理说删除节点后,节点下的表也应该一起删除的,猜测或许是为了方便恢复节点的时候表数据还存在)2023年9月19日
+                        boolean removeIf = node.getType() != null && new Integer("2").equals(node.getType());
+                        boolean equals = map.containsKey(node.getPKeyId().toString());
+                        if (equals) {
+                            unremoveNodeMap.put(node.getPKeyId(), node);
+                        }
+                        return removeIf || equals;
+                    });
+                    Map<Long, WbsTreeContract> contractMap = removeNodeList.stream().collect(Collectors.toMap(WbsTreeContract::getId, Function.identity()));
+                    Map<Long, WbsTreeContract> tempMap = new HashMap<>();
+                    unremoveNodeMap.forEach((key, value) -> collectNodeAndAncestors(value, contractMap, tempMap));
+                    unremoveNodeMap.putAll(tempMap);
+                }
+            }
+            if(removeNodeList.isEmpty()) {
+                return R.fail("删除失败,该节点下有已填报的资料");
+            }
 
-    //判断是否子节点有上报或审批过的资料
-//        List<InformationQuery> list = informationQueryService.selectChildrenNodeInfo(removeNode);
-//        if (list != null && list.size() >= 1) {
-//            return R.data(300, false, "存在已经上报或审批的节点,不允许删除");
-//        }
+            StringBuilder position = new StringBuilder();
+            List<String> idArray = removeNodeList.stream().filter(wbsTreeContract -> !unremoveNodeMap.containsKey(wbsTreeContract.getPKeyId())).map(wbsTreeContract -> {
+                position.append(",").append(StringUtils.isNotEmpty(wbsTreeContract.getFullName()) ? wbsTreeContract.getFullName() : wbsTreeContract.getNodeName());
+                return wbsTreeContract.getPKeyId() + "";
+            }).distinct().collect(Collectors.toList());
 
-    //查询所有子节点 TODO(不能用ancestors字段获取,ancestors字段有问题,目前用递归获取)2023年9月19日
-    //List<WbsTreeContract> removeNodeList = jdbcTemplate.query("select p_key_id,type from m_wbs_tree_contract where is_deleted = 0 and contract_id = " + removeNode.getContractId() + " and ancestors like '%" + removeNode.getId() + "%'", new BeanPropertyRowMapper<>(WbsTreeContract.class));
-    List<WbsTreeContract> removeNodeList = new ArrayList<>();
-    this.currentNodeAllChild(removeNodeList, Collections.singletonList(removeNode), removeNode.getContractId());
+            JSONObject json = new JSONObject();
+            json.put("operationObjIds", idArray);
+            String positionStr = position.substring(1);
+            json.put("operationObjName", positionStr);
+            json.put("projectId", projectId);
+            json.put("contractId", contractId);
+            this.operationLogClient.saveUserOperationLog(4, "资料管理", "工序资料", json);
+
+            //保存进回收站
+            this.recycleBinService.save(new RecycleBin(String.join(",", idArray), "工程划分批量删除", 2, positionStr, projectId, contractId));
+            //改为物理删除 (8.28改为逻辑删除,方便恢复)
+            this.wbsTreeContractClient.removeContractTreeNode(idArray);
+            //更新redis
+            this.informationQueryService.delAsyncWbsTree(removeWbsTreeContracts.get(0).getContractId());
+        }
+        return R.data(true);
+    }
 
-    //获取pKeyId
-    List<Long> removeList = removeNodeList.stream().map(WbsTreeContract::getPKeyId).distinct().collect(Collectors.toList());
-    if (removeList.size() > 0) {
-        /** 判断是否子节点有上报或审批过的资料,因为父id和祖级节点错误,直接使用上面的值去查询上报情况*/
-        List<InformationQuery> list = informationQueryService.selectChildrenNodeInfo(removeList);
-        if (list != null && list.size() >= 1) {
-            return R.data(300, false, "存在已经上报或审批的节点,不允许删除");
+    // 递归收集节点及其所有父节点
+    private  void collectNodeAndAncestors(WbsTreeContract node, Map<Long, WbsTreeContract> contractMap, Map<Long , WbsTreeContract> unremoveNodeMap) {
+        if (node == null || node.getParentId() == null || contractMap == null || contractMap.isEmpty()) return;
+        WbsTreeContract item = contractMap.get(node.getParentId());
+        if (item != null && item.getId() != null && item.getId().equals(node.getParentId())) {
+            unremoveNodeMap.put(item.getPKeyId(), item);
+            collectNodeAndAncestors(item, contractMap, unremoveNodeMap);
         }
-        //拼接
-        ids = ids + "," + String.join(",", JSONArray.parseArray(JSONObject.toJSONString(removeList), String.class));
-        //删除掉表格 TODO(不清楚为什么要剔除表格,按理说删除节点后,节点下的表也应该一起删除的,猜测或许是为了方便恢复节点的时候表数据还存在)2023年9月19日
-        removeNodeList.removeIf(tree -> tree.getType() != null && new Integer("2").equals(tree.getType()));
     }
-    //获取被删除节点名称
-    //String nodeName = StringUtils.isNotEmpty(removeNode.getFullName()) ? removeNode.getFullName() : removeNode.getNodeName() + "," + removeNodeList.stream().map(wbs -> StringUtils.isNotEmpty(wbs.getFullName()) ? wbs.getFullName() : wbs.getNodeName()).collect(Collectors.joining());
-
-    //获取当前节点下所有填报节点
-        /*List<QueryProcessDataVO> queryProcess = new ArrayList<>();
-        if (!Arrays.asList("1,2,3,4".split(",")).contains(removeNode.getMajorDataType().toString())) {
-            queryProcess = this.informationQueryService.queryProcessDataByParentIdAndContractId2(removeNode.getId().toString(), 1, removeNode.getContractId());
-            if (queryProcess == null || queryProcess.size() == 0) {
-                //填报节点
-                queryProcess = this.informationQueryService.queryProcessDataByPrimaryKeyIdAndClassify(removeNode.getPKeyId().toString(), 1);
-            }
+    private List<WbsTreeContract> distinct(List<WbsTreeContract> list) {
+        if (list == null || list.isEmpty()) {
+            return list;
         }
-
-        if (queryProcess != null && queryProcess.size() > 0) {
-            //检查这些填报节点是否存在已经审批或已经上报的节点,如果存在则不允许删除
-            List<QueryProcessDataVO> approvalList = queryProcess.stream().filter(vo -> new Integer("2").equals(vo.getStatus()) && vo.getInformationQueryId() != null).collect(Collectors.toList());
-            List<QueryProcessDataVO> runTaskList = queryProcess.stream().filter(vo -> new Integer("1").equals(vo.getStatus()) && vo.getInformationQueryId() != null).collect(Collectors.toList());
-            if (approvalList.size() > 0 || runTaskList.size() > 0) {
-                //说明存在已经审批或已经上报的节点,不允许删除
-                return R.data(300, false, "存在已经上报或审批的节点,不允许删除");
+        Map<Long, WbsTreeContract> tempMap = new HashMap<>();
+        return list.stream().filter(node -> {
+            if (tempMap.containsKey(node.getPKeyId())) {
+                return false;
             }
-        }*/
-
-    //保存操作记录
-    List<String> idArray = JSONArray.parseArray(JSONObject.toJSONString(ids.split(",")), String.class);
-    //获取当前节点的所有父节点
-    List<WbsTreeContract> result = new ArrayList<>();
-    result.add(removeNode);
-    this.queryParentNode(removeNode, result);
-    StringBuilder pathName = new StringBuilder();
-    for (int i = 1, l = result.size(); i <= l; i++) {
-        WbsTreeContract node = result.get(result.size() - i);
-        pathName.append("-").append(StringUtils.isNotEmpty(node.getFullName()) ? node.getFullName() : node.getNodeName());
+            tempMap.put(node.getPKeyId(), node);
+            return true;
+        }).collect(Collectors.toList());
     }
-    JSONObject json = new JSONObject();
-    json.put("operationObjIds", idArray);
-    json.put("operationObjName", pathName.substring(1));
-    json.put("projectId", removeNode.getProjectId());
-    json.put("contractId", removeNode.getContractId());
-    this.operationLogClient.saveUserOperationLog(4, "资料管理", "工序资料", json);
-
-    //保存进回收站
-    this.recycleBinClient.saveDelBusinessData(idArray, StringUtils.isNotEmpty(removeNode.getFullName()) ? removeNode.getFullName() : removeNode.getNodeName(), 2, parentNodeName.toString(), removeNode.getProjectId(), removeNode.getContractId());
-
-    //改为物理删除 (8.28改为逻辑删除,方便恢复)
-    this.wbsTreeContractClient.removeContractTreeNode(idArray);
-
-    //更新redis
-    this.informationQueryService.delAsyncWbsTree(removeNode.getContractId());
 
-    return R.data(true);
-}
+///**
+// * 删除节点
+// *
+// * @param ids 节点的primaryKeyId(只有一个值)
+// * @return 删除结果
+// */
+//@PostMapping("/removeContractTreeNode")
+//@ApiOperationSupport(order = 11)
+//@ApiOperation(value = "删除节点")
+//@ApiImplicitParam(name = "ids", value = "节点的primaryKeyId")
+//public R<Boolean> removeContractTreeNode(@RequestParam String ids) {
+//    //根据传入的节点,将其所有子节点删除
+//    WbsTreeContract removeNode = this.wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(Long.parseLong(ids));
+//
+//        /*//判断是否存在原始节点
+//        if (ObjectUtil.isEmpty(removeNode.getOldId())) {
+//            return R.data(300, false, "节点【" + removeNode.getFullName() + "】为原始节点,不允许删除");
+//        }*/
+//
+//    //查询当前操作的节点的父级关系
+//    StringBuilder parentNodeName = new StringBuilder();
+//    this.currentNodeAllParent(parentNodeName, removeNode);
+//
+//    //判断是否子节点有上报或审批过的资料
+////        List<InformationQuery> list = informationQueryService.selectChildrenNodeInfo(removeNode);
+////        if (list != null && list.size() >= 1) {
+////            return R.data(300, false, "存在已经上报或审批的节点,不允许删除");
+////        }
+//
+//    //查询所有子节点 TODO(不能用ancestors字段获取,ancestors字段有问题,目前用递归获取)2023年9月19日
+//    //List<WbsTreeContract> removeNodeList = jdbcTemplate.query("select p_key_id,type from m_wbs_tree_contract where is_deleted = 0 and contract_id = " + removeNode.getContractId() + " and ancestors like '%" + removeNode.getId() + "%'", new BeanPropertyRowMapper<>(WbsTreeContract.class));
+//    List<WbsTreeContract> removeNodeList = new ArrayList<>();
+//    this.currentNodeAllChild(removeNodeList, Collections.singletonList(removeNode), removeNode.getContractId());
+//
+//    //获取pKeyId
+//    List<Long> removeList = removeNodeList.stream().map(WbsTreeContract::getPKeyId).distinct().collect(Collectors.toList());
+//    if (removeList.size() > 0) {
+//        /** 判断是否子节点有上报或审批过的资料,因为父id和祖级节点错误,直接使用上面的值去查询上报情况*/
+//        List<InformationQuery> list = informationQueryService.selectChildrenNodeInfo(removeList);
+//        if (list != null && list.size() >= 1) {
+//            return R.data(300, false, "存在已经上报或审批的节点,不允许删除");
+//        }
+//        //拼接
+//        ids = ids + "," + String.join(",", JSONArray.parseArray(JSONObject.toJSONString(removeList), String.class));
+//        //删除掉表格 TODO(不清楚为什么要剔除表格,按理说删除节点后,节点下的表也应该一起删除的,猜测或许是为了方便恢复节点的时候表数据还存在)2023年9月19日
+//        removeNodeList.removeIf(tree -> tree.getType() != null && new Integer("2").equals(tree.getType()));
+//    }
+//    //获取被删除节点名称
+//    //String nodeName = StringUtils.isNotEmpty(removeNode.getFullName()) ? removeNode.getFullName() : removeNode.getNodeName() + "," + removeNodeList.stream().map(wbs -> StringUtils.isNotEmpty(wbs.getFullName()) ? wbs.getFullName() : wbs.getNodeName()).collect(Collectors.joining());
+//
+//    //获取当前节点下所有填报节点
+//        /*List<QueryProcessDataVO> queryProcess = new ArrayList<>();
+//        if (!Arrays.asList("1,2,3,4".split(",")).contains(removeNode.getMajorDataType().toString())) {
+//            queryProcess = this.informationQueryService.queryProcessDataByParentIdAndContractId2(removeNode.getId().toString(), 1, removeNode.getContractId());
+//            if (queryProcess == null || queryProcess.size() == 0) {
+//                //填报节点
+//                queryProcess = this.informationQueryService.queryProcessDataByPrimaryKeyIdAndClassify(removeNode.getPKeyId().toString(), 1);
+//            }
+//        }
+//
+//        if (queryProcess != null && queryProcess.size() > 0) {
+//            //检查这些填报节点是否存在已经审批或已经上报的节点,如果存在则不允许删除
+//            List<QueryProcessDataVO> approvalList = queryProcess.stream().filter(vo -> new Integer("2").equals(vo.getStatus()) && vo.getInformationQueryId() != null).collect(Collectors.toList());
+//            List<QueryProcessDataVO> runTaskList = queryProcess.stream().filter(vo -> new Integer("1").equals(vo.getStatus()) && vo.getInformationQueryId() != null).collect(Collectors.toList());
+//            if (approvalList.size() > 0 || runTaskList.size() > 0) {
+//                //说明存在已经审批或已经上报的节点,不允许删除
+//                return R.data(300, false, "存在已经上报或审批的节点,不允许删除");
+//            }
+//        }*/
+//
+//    //保存操作记录
+//    List<String> idArray = JSONArray.parseArray(JSONObject.toJSONString(ids.split(",")), String.class);
+//    //获取当前节点的所有父节点
+//    List<WbsTreeContract> result = new ArrayList<>();
+//    result.add(removeNode);
+//    this.queryParentNode(removeNode, result);
+//    StringBuilder pathName = new StringBuilder();
+//    for (int i = 1, l = result.size(); i <= l; i++) {
+//        WbsTreeContract node = result.get(result.size() - i);
+//        pathName.append("-").append(StringUtils.isNotEmpty(node.getFullName()) ? node.getFullName() : node.getNodeName());
+//    }
+//    JSONObject json = new JSONObject();
+//    json.put("operationObjIds", idArray);
+//    json.put("operationObjName", pathName.substring(1));
+//    json.put("projectId", removeNode.getProjectId());
+//    json.put("contractId", removeNode.getContractId());
+//    this.operationLogClient.saveUserOperationLog(4, "资料管理", "工序资料", json);
+//
+//    //保存进回收站
+//    this.recycleBinClient.saveDelBusinessData(idArray, StringUtils.isNotEmpty(removeNode.getFullName()) ? removeNode.getFullName() : removeNode.getNodeName(), 2, parentNodeName.toString(), removeNode.getProjectId(), removeNode.getContractId());
+//
+//    //改为物理删除 (8.28改为逻辑删除,方便恢复)
+//    this.wbsTreeContractClient.removeContractTreeNode(idArray);
+//
+//    //更新redis
+//    this.informationQueryService.delAsyncWbsTree(removeNode.getContractId());
+//
+//    return R.data(true);
+//}
 
 /**
  * 新增子节点

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

@@ -1954,6 +1954,7 @@ public class TaskController extends BladeController {
                     vo.setEVisaStatusName(eVisaStatus == 1 ? "电签失败" : "电签成功");
                     vo.setTaskReportUserName(nameMap.get(Long.parseLong(task.getReportUser())));
                     vo.setSigPdf(query.get(Long.parseLong(task.getFormDataId())));
+                    vo.setApprovalType(task.getApprovalType());
                     List<TaskParallel> taskParallelList = finalTaskParallelGroupMap.get(task.getProcessInstanceId());
                     if (taskParallelList != null && taskParallelList.size() > 0) {
                         //判断签字人的验证 2=绿色 3=黄色 999=红色 其他代表=灰色

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

@@ -1202,7 +1202,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                                 approvalVO.setTaskId(task.getId().toString());
                                 approvalVO.setFlag("OK");
                                 approvalVO.setComment("重新发起电签");
-                                approvalVO.setApprovalType(1);
+                                approvalVO.setApprovalType(9);
                                 approvalVO.setFormDataId(task.getFormDataId());
                                 approvalVO.setParallelProcessInstanceId(taskParallel.getParallelProcessInstanceId());
                                 approvalVO.setYsNickName(taskParallel.getTaskUserName());

+ 25 - 2
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/WeatherInfoServiceImpl.java

@@ -26,6 +26,8 @@ import org.springblade.manager.feign.ProjectClient;
 import org.springblade.manager.feign.ProjectContractAreaClient;
 import org.springblade.manager.vo.ContractInfoVO;
 import org.springframework.dao.DataAccessException;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.ResultSetExtractor;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -54,6 +56,8 @@ public class WeatherInfoServiceImpl extends ServiceImpl<WeatherInfoMapper, Weath
 
     private final JdbcTemplate jdbcTemplate;
 
+    private final StringRedisTemplate stringRedisTemplate;
+
     /**
      * 根据所选年份获取当年所有天气台账
      */
@@ -138,11 +142,19 @@ public class WeatherInfoServiceImpl extends ServiceImpl<WeatherInfoMapper, Weath
                 Map<String, String> weatherMap = cachedWeatherMap.get(area.getCity_code());
                 if (weatherMap == null) {
                     //获取天气信息(百度天气)
-                    weatherMap = YiKeYunApiUtils.getTodayWeatherByAdcode(area.getCity_code() + "000000");
+                    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());
                     }
-                    cachedWeatherMap.put(area.getCity_code(), weatherMap);
+                    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 (weatherMap != null) {
                     //计算平均气温
@@ -406,6 +418,11 @@ 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) {
+            log.info("获取历史天气失败:易客云获取历史天气的api次数已用完。");
+            return null;
+        }
         String county = area.getCounty();
         if (county.length() > 2) {
             county = county.substring(0, county.length() - 1);
@@ -425,6 +442,12 @@ public class WeatherInfoServiceImpl extends ServiceImpl<WeatherInfoMapper, Weath
         }
         if (cityId != null) {
             Map<String, Map<String, String>> historyWeather = YiKeYunApiUtils.getHistoryWeather(cityId, Integer.parseInt(month.substring(0, 4)), Integer.parseInt(month.substring(4, 6)));
+            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"));
+                }
+            }
             return historyWeather;
         } else {
             log.info("获取历史天气失败:" + area.getCity()+"-"+area.getCounty());

+ 4 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -69,6 +69,7 @@ import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -4415,9 +4416,10 @@ public class ExcelTabController extends BladeController {
         }
     }
 
-    //@Scheduled(fixedDelay = 1000*60*60*24)
+    @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) {
@@ -4433,14 +4435,13 @@ public class ExcelTabController extends BladeController {
                             long resourceLength = CommonUtil.getResourceLength(excelTab1.getFileUrl());
                             if (resourceLength <= 500) {
                                 names.add(excelTab1.getName());
-                                System.out.println(excelTab.getName() + "--" + tab.getName() + "--" + excelTab1.getName());
+                                result.append(excelTab.getName() + "--" + tab.getName() + "--" + excelTab1.getName()+"\n");
                             }
                         }
                     }
                 }
             }
         }
-        System.out.println("检查完毕");
     }
     @GetMapping("/checkParamElement")
     @ApiOperationSupport(order = 30)

+ 19 - 18
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

@@ -1059,19 +1059,23 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
                 });
             }
             String projectPlace = contractInfo.getProjectPlace();
+            Map<String, String> position = new HashMap<>();
             try {
                 Map<String, Object> addressInfo = BaiduApiUtil.geocoding(projectPlace);
-                Map<String, String> position = BaiduApiUtil.getPosition(addressInfo.get("lat").toString()
+                position = BaiduApiUtil.getPosition(addressInfo.get("lat").toString()
                         + "," + addressInfo.get("lng").toString());
-                ProjectContractArea projectContractArea = new ProjectContractArea();
-                projectContractArea.setProvince(position.get("province"));
-                projectContractArea.setCity(position.get("city"));
-                projectContractArea.setCounty(position.get("district"));
-                projectContractArea.setCity_code(position.get("adcode"));
-                projectContractArea.setProjectId(contractInfo.getPId());
-                projectContractArea.setIsDeleted(0);
-                projectContractArea.setContractId(String.valueOf(contractInfo.getId()));
-                projectContractArea.setProjectId(contractInfo.getPId());
+            } catch (Exception e) {
+                throw new ServiceException("施工台账初始化失败: 百度地理编码API配额超限,今日限制访问");
+            }
+            ProjectContractArea projectContractArea = new ProjectContractArea();
+            projectContractArea.setProvince(position.get("province"));
+            projectContractArea.setCity(position.get("city"));
+            projectContractArea.setCounty(position.get("district"));
+            projectContractArea.setCity_code(position.get("adcode"));
+            projectContractArea.setProjectId(contractInfo.getPId());
+            projectContractArea.setIsDeleted(0);
+            projectContractArea.setContractId(String.valueOf(contractInfo.getId()));
+            projectContractArea.setProjectId(contractInfo.getPId());
 //                QueryWrapper<ProjectContractArea> queryWrapper = new QueryWrapper<>();
 //                queryWrapper.eq("project_id", contractInfo.getPId());
 //                queryWrapper.eq("contract_id", contractInfo.getId());
@@ -1085,15 +1089,12 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
 //                    int res = projectContractAreaMapper.insert(projectContractArea);
 //                    return res > 0;
 //                }
-                //删除之前所有的地址,再新增
-                projectContractAreaMapper.delete(new LambdaQueryWrapper<ProjectContractArea>()
-                        .eq(ProjectContractArea::getContractId, projectContractArea.getContractId()));
-                int res = projectContractAreaMapper.insert(projectContractArea);
-                return res > 0;
+            //删除之前所有的地址,再新增
+            projectContractAreaMapper.delete(new LambdaQueryWrapper<ProjectContractArea>()
+                    .eq(ProjectContractArea::getContractId, projectContractArea.getContractId()));
+            int res = projectContractAreaMapper.insert(projectContractArea);
+            return res > 0;
 //                return true;
-            } catch (IOException e) {
-                throw new ServiceException("施工台账初始化失败");
-            }
         }
         return false;
     }

+ 7 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -1439,7 +1439,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
             Elements jltitle = doc.select("el-input[placeholder~=监理单位.*]");
 
-            //编号为父节点划分编号 “编号:”、“工程编号:”、“编号”、“分项工程编号”、“分部分项编号”
+            //编号为父节点划分编号 “编号:”、“工程编号:”、“编号”、“分项工程编号”、“分部分项编号”、“分项工程编号:”、“编 号”
             Elements bhtitle = doc.select("el-input[placeholder~=^编号]");
             if(Func.isNotEmpty(wbsTreeContract.getWbsType()) && wbsTreeContract.getWbsType()==1){
                 Elements bhtitle2 = doc.select("el-input[placeholder~=^工程编号]");
@@ -1447,7 +1447,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 Elements bhtitle4 = doc.select("el-input[placeholder~=^分部分项编号]");
                 Elements bhtitle5 = doc.select("el-input[placeholder~=^单元工程编码]");
                 Elements bhtitle6 = doc.select("el-input[placeholder~=^编 号]");
-                Elements bhtitle7 = doc.select("el-input[placeholder~=^分项工程编号]");
+                Elements bhtitle7 = doc.select("el-input[placeholder~=^分项工程编号:]");
                 bhtitle.addAll(bhtitle2);
                 bhtitle.addAll(bhtitle3);
                 bhtitle.addAll(bhtitle4);
@@ -2175,10 +2175,12 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                 Object obj = DataInfo.get(val);
                                 if (obj instanceof String[]) {
                                     String[] dataDate = (String[]) obj;
+
                                     String HtmlEle = data.toString();
-                                    if (HtmlEle.indexOf("el-date-picker") >= 0) {//时间时间段处理格式
-                                        if ((dataDate[0].trim()).equals((dataDate[1].trim()))) {
-                                            myData = dataDate[0];
+                                    if (HtmlEle.indexOf("el-date-picker") >= 0) {
+                                        //时间时间段处理格式
+                                        if ((dataDate[0].replaceAll("\"", "").trim()).equals((dataDate[1].replaceAll("\"", "").trim()))) {
+                                            myData = dataDate[0].replaceAll("\"","");
                                         } else {
                                             myData = dataDate[0].replace("\"", "") + "-" + dataDate[1].trim().replace("\"", "");
                                         }

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

@@ -238,7 +238,7 @@ public class FormulaDaoImpl implements IFormulaDao {
     @Override
     public Function<String, List<InterimPayCertificateItem>> getInterimPayCertificateItemFc() {
         return  certificateIds->{
-            String sql="select * from s_interim_pay_certificate_item where certificate_id in ("+certificateIds+") order by sort";
+            String sql="select * from s_interim_pay_certificate_item where certificate_id in ("+certificateIds+") and is_deleted=0 order by sort";
             return getEntityList(sql,InterimPayCertificateItem.class);
         };
     }

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

@@ -1182,7 +1182,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         }
         for (FormData fd : tec.formDataList) {
             if (fd.verify()) {
-                if(fd.getCode().equals("m_20240313110033_1767747549965320192:key_34")){
+                if(fd.getCode().equals("m_20220928143955_1575012411126054912:key_2")){
                     System.out.println("111");
                 }
                 Formula formula = fd.getFormula();
@@ -1242,9 +1242,8 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                 } catch (Exception ee) {
                                     ee.printStackTrace();
                                 }
-
-                                //临时处理这个公式,多出来的空数据会导致多出一张表格出来,所以当依赖元素超过表格的size,并且后面数据全为空,就截取掉后面的值
                                 if(ele.size()>0&&!ele.get(0).getCode().isEmpty()){
+                                    //临时处理这个公式,多出来的空数据会导致多出一张表格出来,所以当依赖元素超过表格的size,并且后面数据全为空,就截取掉后面的值
                                     //依赖的  C8.144钻(挖)孔灌注桩、地下连续墙钢筋安装检验记录表的设计和实测
                                     if(ele.get(0).getCode().equals("m_20230308150036_1633362063201927168:key_28")||ele.get(0).getCode().equals("m_20230308150036_1633362063201927168:key_24")){
                                         if(data!=null){
@@ -1260,6 +1259,17 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                             }
                                         }
                                     }
+                                    //ZJ401平整度,空值也会被拿到,导致多表,依赖的JL709路基平整度检验表
+                                    if(ele.get(0).getCode().equals("m_20220928101924_1574946848735494144:key_4")){
+                                        if(data!=null){
+                                            List<Object> list = (List<Object>)data;
+                                            //过滤掉空值或空字符串
+                                            data = list.stream()
+                                                .filter(obj -> obj != null && !"".equals(obj))
+                                                .collect(Collectors.toList());
+                                        }
+
+                                    }
                                 }
                                 //专门用来做试验的处理 水泥报告单的检测依据
                                 if(fd.getCode().equals("m_20240313110817_1767749493136031744:key_32")||fd.getCode().equals("m_20240313110033_1767747549965320192:key_34")){
@@ -5646,14 +5656,14 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         executionTime.info("公式计算");
         CompletableFuture.runAsync(() -> {
             /*支付项*/
-            saveInterimPayCertificateItems(tec.meterInfo.getInterimPayCertificateItems());
+            saveInterimPayCertificateItems(tec.meterInfo.getInterimPayCertificateItems(),tec.getReportId());
         });
         return tec.getReportResults();
     }
 
-    public void saveInterimPayCertificateItems(List<InterimPayCertificateItem> items) {
+    public void saveInterimPayCertificateItems(List<InterimPayCertificateItem> items,Long reportId) {
         if (items != null && items.size() > 0) {
-            this.certificateItemClient.saveOrUpdate(items);
+            this.certificateItemClient.saveOrUpdate(items,reportId);
         }
     }
 

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

@@ -235,7 +235,6 @@ public class NodeBaseInfoServiceImpl extends BaseServiceImpl<NodeBaseInfoMapper,
             try {
                 nodeBaseInfo = jdbcTemplate.queryForObject(nodeSql, new BeanPropertyRowMapper<>(NodeBaseInfo.class));
             }catch (Exception e){
-                e.printStackTrace();
                 return null;
             }
             List<WbsTreeContract> ancestorsNodes = iWbsTreeContractService.getBaseMapper().selectList(new QueryWrapper<WbsTreeContract>().in("p_key_id", Arrays.stream(wbsTreeContractNode.getAncestors().split(",")).toArray()).eq("contract_id", wbsTreeContractNode.getContractId()));

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

@@ -672,7 +672,11 @@ public class TaskController extends BladeController {
 
             task.setType(1);
 
-            task.setApprovalType(meterTaskType+4); //计量
+            if (meterTaskType == 4) {
+                task.setApprovalType(11); //计量
+            } else {
+                task.setApprovalType(meterTaskType+4); //计量
+            }
             task.setFixedFlowId(ObjectUtil.isNotEmpty(approvalDTO.getFixedFlowId()) ? Long.parseLong(approvalDTO.getFixedFlowId()) : 0L);
             task.setStatus(1); //待审批
             task.setIsDeleted(0);
@@ -3960,7 +3964,7 @@ public class TaskController extends BladeController {
                 jdbcTemplate.execute(uptPeriod);
                 jdbcTemplate.execute(updta);
                 jdbcTemplate.execute(upData);
-                jdbcTemplate.execute("update s_contract_material_adjust set `status` = 0 where (contract_period_id = "+ periodId +"or meter_period_id = "+ periodId +") and is_deleted = 0;");
+                jdbcTemplate.execute("update s_contract_material_adjust set `status` = 0 where (contract_period_id = "+ periodId +" or meter_period_id = "+ periodId +") and is_deleted = 0;");
 
                 //同时删除映射task表数据
                 deleteMapTask1 = "DELETE from s_middle_meter_apply_task where task_id = "+task.getId();

+ 2 - 2
blade-service/blade-meter/src/main/java/org/springblade/meter/feign/CertificateItemClientImpl.java

@@ -18,7 +18,7 @@ public class CertificateItemClientImpl implements CertificateItemClient{
     private final IInterimPayCertificateItemService iInterimPayCertificateItemService;
 
     @Override
-    public void saveOrUpdate(List<InterimPayCertificateItem> items) {
-              this.iInterimPayCertificateItemService.saveOrUpdateBatch(items);
+    public void saveOrUpdate(List<InterimPayCertificateItem> items,Long reportId) {
+        this.iInterimPayCertificateItemService.saveOrUpdateBatchList(items,reportId);
     }
 }

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

@@ -17,4 +17,6 @@ public interface IInterimPayCertificateItemService extends BaseService<InterimPa
 
     @Async
     void sendJLSmg(Long taskId);
+
+    void saveOrUpdateBatchList(List<InterimPayCertificateItem> items,Long reportId);
 }

+ 12 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/InterimPayCertificateItemServiceImpl.java

@@ -124,4 +124,16 @@ public class InterimPayCertificateItemServiceImpl extends BaseServiceImpl<Interi
             }
         }
     }
+
+    @Override
+    public void saveOrUpdateBatchList(List<InterimPayCertificateItem> items,Long reportId) {
+        List<InterimPayCertificateItem> list = baseMapper.selectList(new QueryWrapper<InterimPayCertificateItem>().eq("certificate_id", reportId));
+        if(list.size()>0){
+            for (InterimPayCertificateItem item : items) {
+                baseMapper.updateById(item);
+            }
+        }else {
+            saveBatch(items);
+        }
+    }
 }

+ 13 - 2
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MiddleMeterApplyServiceImpl.java

@@ -264,7 +264,8 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
 //                        throw new ServiceException("计量量超出施工图数量,保存失败");
 //                    }
 //                }
-                if(l.getAllMeterTotal().compareTo(l.getContractChangeAllTotal())>0){
+
+                if(compare(l.getAllMeterTotal(),l.getContractChangeAllTotal())>0){
                     throw new ServiceException(l.getFormName()+"的累计计量量已超过清单数量,请申请变更流程");
                 }
                 InventoryFormApply formApply = new InventoryFormApply();
@@ -333,6 +334,16 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
 
     }
 
+    public static int compare(BigDecimal a, BigDecimal b) {
+          if(a==null){
+              a=BigDecimal.ZERO;
+          }
+          if(b==null){
+              b=BigDecimal.ZERO;
+          }
+        return a.compareTo(b);
+    }
+
     /**
      * 获取当前节点变更令
      */
@@ -460,7 +471,7 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
             //保存清单
             List<InventoryFormApply> formApplies = formList.stream().map(l -> {
                 //校验数据
-                if(l.getAllMeterTotal().compareTo(l.getContractChangeAllTotal())>0){
+                if(compare(l.getAllMeterTotal(),l.getContractChangeAllTotal())>0){
                     throw new ServiceException(l.getFormName()+"的累计计量量已超过清单数量,请申请变更流程");
                 }
                 InventoryFormApply formApply = new InventoryFormApply();

+ 1 - 1
blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

@@ -1641,7 +1641,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                 if (ObjectUtil.isNotEmpty(vor.getCreateTime())) {
                     vor.setStartTime(DateUtil.format(vor.getCreateTime(), "yyyy-MM-dd"));
                 }
-                vor.setTaskStatusStr(new Integer("0").equals(vor.getStatus()) ? "未上报" : new Integer("1").equals(vor.getStatus()) ? "待审批" : new Integer("2").equals(vor.getStatus()) ? "已审批" : "已废除");
+                vor.setTaskStatusStr(new Integer("0").equals(vor.getStatus()) ? "未上报" : new Integer("1").equals(vor.getStatus()) ? "待审批" : new Integer("2").equals(vor.getStatus()) ? "已审批" : "未上报");
                 try {
                     String fileUserIdAndName = vor.getFileUserIdAndName();
                     String[] fileUserIdAndNames = fileUserIdAndName.split(",");