浏览代码

Merge remote-tracking branch 'origin/master' into master

yangyj 1 年之前
父节点
当前提交
d037639832
共有 35 个文件被更改,包括 510 次插入164 次删除
  1. 2 2
      blade-common/src/main/java/org/springblade/common/utils/AsyncConfigurer.java
  2. 5 3
      blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java
  3. 3 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/InformationQueryVO.java
  4. 1 1
      blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/feign/EVisaClient.java
  5. 36 30
      blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/feign/EVisaClientFallBack.java
  6. 3 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenInventory.java
  7. 5 2
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MiddleMeterApply.java
  8. 3 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ContractFromVO.java
  9. 6 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/InventoryFormMeterVO.java
  10. 4 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterInventoryVO.java
  11. 50 0
      blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/NodeSortVO.java
  12. 0 1
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileTaskController.java
  13. 0 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/UserOpinionController.java
  14. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskBatchMapper.xml
  15. 16 3
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java
  16. 29 43
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  17. 1 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/EVisaApplication.java
  18. 28 23
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVisaController.java
  19. 4 0
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java
  20. 8 3
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/PDFUtils.java
  21. 2 2
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java
  22. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  23. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  24. 8 3
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MiddleMeterApplyController.java
  25. 11 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.java
  26. 35 5
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.xml
  27. 8 3
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ContractInventoryFormMapper.xml
  28. 9 4
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MiddleMeterApplyMapper.java
  29. 43 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MiddleMeterApplyMapper.xml
  30. 4 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/IMiddleMeterApplyService.java
  31. 85 14
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenFormServiceImpl.java
  32. 1 1
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ContractInventoryFormServiceImpl.java
  33. 28 4
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/InventoryFormMeterServiceImpl.java
  34. 5 0
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MeterTreeContractServiceImpl.java
  35. 64 12
      blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MiddleMeterApplyServiceImpl.java

+ 2 - 2
blade-common/src/main/java/org/springblade/common/utils/AsyncConfigurer.java

@@ -15,7 +15,7 @@ public class AsyncConfigurer {
     /**
      * cpu 核心数量
      */
-    public static final int cpuNum = 8;//Runtime.getRuntime().availableProcessors();
+    public static final int cpuNum =10 ;//Runtime.getRuntime().availableProcessors();
 
     /**
      * 线程池配置
@@ -26,7 +26,7 @@ public class AsyncConfigurer {
     public ThreadPoolExecutor getAsyncExecutor() {
         return new ThreadPoolMonitor(cpuNum
                 , 20
-                , 60
+                , 30
                 , TimeUnit.SECONDS
                 , new LinkedBlockingQueue<>(2000)
                 , new ThreadPoolExecutor.DiscardOldestPolicy(), "manager-thread-pool");

+ 5 - 3
blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java

@@ -112,12 +112,14 @@ public class CommonUtil {
      */
     public static InputStream getOSSInputStream(String urlStr) throws Exception {
         //获取OSS文件流
-//        urlStr = replaceOssUrl(urlStr);
         URL imageUrl = new URL(urlStr);
+        HttpURLConnection conn = null;
         try {
-            HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();
+            conn = (HttpURLConnection) imageUrl.openConnection();
             conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
-            return conn.getInputStream();
+            InputStream inputStream = conn.getInputStream();
+
+            return inputStream;
         } catch (Exception e) {
             return null;
         }

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/InformationQueryVO.java

@@ -76,6 +76,9 @@ public class InformationQueryVO extends InformationQuery {
     @ApiModelProperty("任务人")
     private List<WaitingUser> waitingUserList;
 
+    @ApiModelProperty(value = "电签失败原因")
+    private String eVisaFailedInfo;
+
     public void setWaitingUserList(String waitingUserName, Integer status) {
         if (this.waitingUserList == null) {
             this.waitingUserList = new ArrayList<>();

+ 1 - 1
blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/feign/EVisaClient.java

@@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
 
-@FeignClient(value = EVisaConstant.APPLICATION_WEATHER_NAME)
+@FeignClient(value = EVisaConstant.APPLICATION_WEATHER_NAME,fallbackFactory = EVisaClientFallBack.class)
 public interface EVisaClient {
 
     /**

+ 36 - 30
blade-service-api/blade-e-visa-api/src/main/java/org/springblade/evisa/feign/EVisaClientFallBack.java

@@ -6,41 +6,47 @@ import org.springblade.evisa.vo.CertBeanVO;
 import org.springblade.evisa.vo.EVisaMakeSealVO;
 import org.springblade.evisa.vo.EVisaTaskApprovalVO;
 import org.springblade.evisa.vo.TaskArchiveDTO;
+import org.springframework.cloud.openfeign.FallbackFactory;
 import org.springframework.stereotype.Component;
 
 @Component
-public class EVisaClientFallBack implements EVisaClient {
-
+public class EVisaClientFallBack implements FallbackFactory<EVisaClient> {
     private static final Logger logger = LoggerFactory.getLogger(EVisaClientFallBack.class);
 
     @Override
-    public String eVisaContractSeal(EVisaTaskApprovalVO task, String finalPdfUrl) {
-        return null;
-    }
-
-    @Override
-    public String eVisa(EVisaTaskApprovalVO task) {
-        return null;
-    }
-
-    @Override
-    public String eVisaCustom(TaskArchiveDTO eVisaObj) {
-        logger.info("-----------------远程feign调用电签自定义签章服务EVisaCustom方法失败-----------------");
-        return "500";
-    }
-
-    @Override
-    public String createSeal(EVisaMakeSealVO vo) {
-        return null;
-    }
-
-    @Override
-    public String certification(String pdfUrl, String fileName, String contractId) {
-        return null;
-    }
-
-    @Override
-    public CertBeanVO onlineCheckSeal(String pdfUrl) {
-        return null;
+    public EVisaClient create(Throwable throwable) {
+        return new EVisaClient() {
+            @Override
+            public String eVisaContractSeal(EVisaTaskApprovalVO task, String finalPdfUrl) {
+                return null;
+            }
+
+            @Override
+            public String eVisa(EVisaTaskApprovalVO task) {
+                System.out.println("throwable.getMessage() = " + throwable.getMessage());
+                logger.info("throwable.getMessage() = " +throwable.getMessage());
+                return null;
+            }
+
+            @Override
+            public String eVisaCustom(TaskArchiveDTO eVisaObj) {
+                return null;
+            }
+
+            @Override
+            public String createSeal(EVisaMakeSealVO vo) {
+                return null;
+            }
+
+            @Override
+            public String certification(String pdfUrl, String fileName, String contractId) {
+                return null;
+            }
+
+            @Override
+            public CertBeanVO onlineCheckSeal(String pdfUrl) {
+                return null;
+            }
+        };
     }
 }

+ 3 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/ChangeTokenInventory.java

@@ -118,5 +118,8 @@ public class ChangeTokenInventory extends BaseEntity {
     @ApiModelProperty(value = "是否汇总清单,0分解清单1汇总清单")
     private Integer isCollectForm;
 
+    @ApiModelProperty(value = "需要修改的中间计量申请ids")
+    private String applyIds;
+
 
 }

+ 5 - 2
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MiddleMeterApply.java

@@ -106,10 +106,13 @@ public class MiddleMeterApply extends BaseEntity {
     @ApiModelProperty(value = "变更令编号")
     private String changeTokenNumber;
     /**
-     * 图片地址
+     * 草图文件
      */
-    @ApiModelProperty(value = "图片地址")
+    @ApiModelProperty(value = "草图文件地址")
     private String pictureUrl;
+
+    @ApiModelProperty(value = "草图文件名称")
+    private String pictureName;
     /**
      * 计算式
      */

+ 3 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/ContractFromVO.java

@@ -27,6 +27,9 @@ public class ContractFromVO {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long id;
 
+    @ApiModelProperty(value = "清单id")
+    private Long contractFormId;
+
     /**
      * 清单编号
      */

+ 6 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/InventoryFormMeterVO.java

@@ -16,10 +16,13 @@
  */
 package org.springblade.meter.vo;
 
+import io.swagger.annotations.ApiModelProperty;
 import org.springblade.meter.entity.InventoryFormMeter;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.math.BigDecimal;
+
 /**
  * 工程清单与合同计量单元	中间表视图实体类
  *
@@ -31,4 +34,7 @@ import lombok.EqualsAndHashCode;
 public class InventoryFormMeterVO extends InventoryFormMeter {
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty(value = "当前部位当前清单当前计量总和")
+	private BigDecimal allMeterMoney;
+
 }

+ 4 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/MeterInventoryVO.java

@@ -46,4 +46,8 @@ public class MeterInventoryVO {
     @ApiModelProperty(value = "累计计量数量")
     private BigDecimal allMeterTotal;
 
+    @ApiModelProperty(value = "其他计量期计量量")
+    private BigDecimal otherMeterTotal;
+
+
 }

+ 50 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/vo/NodeSortVO.java

@@ -0,0 +1,50 @@
+package org.springblade.meter.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+import org.springblade.core.tool.node.INode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Param   计量节点按最底层排序VO
+ * @Author wangwl
+ * @Date 2023/12/26 15:38
+ **/
+@Data
+public class NodeSortVO implements INode<NodeSortVO> {
+    /**
+     * 主键ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+
+    /**
+     * 父节点ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long parentId;
+
+    /**
+     * 子孙节点
+     */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private List<NodeSortVO> children;
+
+    /**
+     * 是否有子孙节点
+     */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private Boolean hasChildren;
+
+    @Override
+    public List<NodeSortVO> getChildren() {
+        if (this.children == null) {
+            this.children = new ArrayList<>();
+        }
+        return this.children;
+    }
+}

+ 0 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileTaskController.java

@@ -13,7 +13,6 @@ import org.springblade.archive.vo.ArchiveTaskPageVO;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.entity.Task;
 import org.springblade.business.entity.TaskParallel;
-import org.springblade.business.feign.ArchiveFileClient;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.log.exception.ServiceException;

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

@@ -41,7 +41,6 @@ import org.springblade.system.user.feign.IUserClient;
 import org.springblade.system.vo.DictBizVO;
 import org.springframework.beans.BeanUtils;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.business.entity.UserOpinion;
 import org.springblade.business.vo.UserOpinionVO;

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

@@ -26,7 +26,7 @@
     </delete>
 
     <select id="queryDataInfo" resultMap="taskBatchResultMap">
-        SELECT * from u_task_batch where is_deleted not in(4) LIMIT 40
+        SELECT DISTINCT JSON_EXTRACT(a.json_data, '$.formDataId') ,a.* from u_task_batch a GROUP BY JSON_EXTRACT(a.json_data, '$.formDataId') LIMIT 140
     </select>
 
 </mapper>

+ 16 - 3
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java

@@ -23,6 +23,7 @@ import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.*;
 import org.springblade.manager.entity.ContractInfo;
@@ -545,7 +546,7 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
 
                 Set<String> processInstanceIds = query.stream().map(Task::getProcessInstanceId).map(id -> "'" + id + "'").collect(Collectors.toSet());
                 if (processInstanceIds.size() > 0) {
-                    List<TaskParallel> taskParallels = jdbcTemplate.query("select task_user, task_user_name, e_visa_status, status, process_instance_id, initiative from u_task_parallel where is_deleted = 0 and process_instance_id in(" + StringUtils.join(processInstanceIds, ",") + ")", new BeanPropertyRowMapper<>(TaskParallel.class));
+                    List<TaskParallel> taskParallels = jdbcTemplate.query("select task_user, task_user_name, e_visa_status, status, process_instance_id, initiative,e_visa_content from u_task_parallel where is_deleted = 0 and process_instance_id in(" + StringUtils.join(processInstanceIds, ",") + ")", new BeanPropertyRowMapper<>(TaskParallel.class));
                     taskParallelMaps = taskParallels.stream().collect(Collectors.groupingBy(TaskParallel::getProcessInstanceId));
                 }
             }
@@ -598,7 +599,7 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
                         List<TaskParallel> linkTasks = finalTaskParallelMaps.getOrDefault(tasks.get(0).getProcessInstanceId(), null);
                         if (linkTasks != null && linkTasks.size() > 0) {
                             //处理审批状态
-                            this.integrationMethod(vor, linkTasks);
+                            this.integrationMethod(vor, linkTasks,vo.getTaskStatus());
                         }
                         //设置上报批次
                         vor.setReportNumber(String.valueOf(tasks.get(0).getBatch()));
@@ -816,7 +817,8 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
     /**
      * 统合方法
      */
-    private void integrationMethod(InformationQueryVO vo, List<TaskParallel> linkList) {
+    private void integrationMethod(InformationQueryVO vo, List<TaskParallel> linkList,String taskStatus) {
+
         for (TaskParallel link : linkList) {
             vo.setWaitingUserList
                     (link.getTaskUserName(),
@@ -824,6 +826,17 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
                                     (new Integer(2).equals(link.getStatus()) ? 2 :
                                             (new Integer(3).equals(link.getStatus()) && new Integer(1).equals(link.getInitiative())) ? 3
                                                     : 1));
+            String eVisaFailedInfo = "";
+            if (link.getStatus() == 2 && ObjectUtil.isNotEmpty(link.getEVisaStatus()) && link.getEVisaStatus() == 2) {
+                if (link.getEVisaContent().contains("请等待") && ObjectUtil.isEmpty(eVisaFailedInfo)) {
+                    eVisaFailedInfo = link.getEVisaContent();
+                }
+            } else if (ObjectUtil.isNotEmpty(link.getEVisaStatus()) && link.getEVisaStatus() == 99) {
+                if (ObjectUtil.isEmpty(eVisaFailedInfo)) {
+                    eVisaFailedInfo = link.getEVisaContent();
+                }
+            }
+            vo.setEVisaFailedInfo(eVisaFailedInfo);
         }
     }
 

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

@@ -20,6 +20,7 @@ import org.springblade.business.vo.*;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.FileUtils;
 import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.cloud.feign.EnableBladeFeign;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Query;
@@ -51,6 +52,7 @@ import org.springblade.system.user.cache.UserCache;
 import org.springblade.system.user.entity.User;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
@@ -79,6 +81,7 @@ import java.util.stream.Collectors;
 @Slf4j
 @Service
 @AllArgsConstructor
+@EnableFeignClients
 public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implements ITaskService {
 
     private static final Logger logger = LoggerFactory.getLogger(TaskServiceImpl.class);
@@ -388,7 +391,6 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
      */
     @Override
     public Map<String, String> getTaskCount(String projectId, String contractId, String userId) {
-        Map<String, String> map = new HashMap<>();
         if (StringUtils.isNotEmpty(projectId) && StringUtils.isNotEmpty(contractId)) {
             List<Task> tasks = this.baseMapper.selectList(Wrappers.<Task>lambdaQuery()
                     .select(Task::getProcessInstanceId)
@@ -423,7 +425,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             long messageCount3 = messageWarnings.stream().filter(f -> f.getType().equals(3)).count();
             long messageCount4 = messageWarnings.stream().filter(f -> f.getType().equals(4)).count();
             long messageCount5 = messageWarnings.stream().filter(f -> f.getType().equals(5)).count();
-
+            Map<String, String> map = new HashMap<>();
             map.put("allCount", String.valueOf(taskAllCount + messageWarnings.size()));//任务管理
             map.put("taskCount", String.valueOf(taskAllCount));//任务查看
             map.put("messageCount", String.valueOf(messageWarnings.size()));//消息提醒
@@ -433,15 +435,14 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             map.put("messageCount_4", String.valueOf(messageCount4));//工单反馈
             map.put("messageCount_5", String.valueOf(messageCount5));//系统消息
             map.put("userId", userId);
-        }
-        return map;
-        /*else {
+            return map;
+        } else {
             Map<String, String> map = new HashMap<>();
             List<BusinessUserOpinionVO> businessUserOpinionVOS = userOpinionService.getBaseMapper().queryManageUserOpinionList(userId).stream().filter(f -> f.getIsCurrent().equals(false)).collect(Collectors.toList());
             map.put("myMessageCount", String.valueOf(businessUserOpinionVOS.size()));//后管消息区-我的消息-未处理
             map.put("userId", userId);
             return map;
-        }*/
+        }
     }
 
     /**
@@ -454,7 +455,6 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
      */
     @Override
     public Map<String, String> getTaskCountArchive(String projectId, String contractId, String userId) {
-        Map<String, String> map = new HashMap<>();
         if (StringUtils.isNotEmpty(projectId) && StringUtils.isNotEmpty(contractId)) {
             List<Task> tasks = this.baseMapper.selectList(Wrappers.<Task>lambdaQuery()
                     .select(Task::getProcessInstanceId)
@@ -489,7 +489,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             long messageCount3 = messageWarnings.stream().filter(f -> f.getType().equals(3)).count();
             long messageCount4 = messageWarnings.stream().filter(f -> f.getType().equals(4)).count();
             long messageCount5 = messageWarnings.stream().filter(f -> f.getType().equals(5)).count();
-
+            Map<String, String> map = new HashMap<>();
             map.put("allCount", String.valueOf(taskAllCount + messageWarnings.size()));//任务管理
             map.put("taskCount", String.valueOf(taskAllCount));//任务查看
             map.put("messageCount", String.valueOf(messageWarnings.size()));//消息提醒
@@ -499,8 +499,14 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             map.put("messageCount_4", String.valueOf(messageCount4));//工单反馈
             map.put("messageCount_5", String.valueOf(messageCount5));//系统消息
             map.put("userId", userId);
+            return map;
+        } else {
+            Map<String, String> map = new HashMap<>();
+            List<BusinessUserOpinionVO> businessUserOpinionVOS = userOpinionService.getBaseMapper().queryManageUserOpinionList(userId).stream().filter(f -> f.getIsCurrent().equals(false)).collect(Collectors.toList());
+            map.put("myMessageCount", String.valueOf(businessUserOpinionVOS.size()));//后管消息区-我的消息-未处理
+            map.put("userId", userId);
+            return map;
         }
-        return map;
     }
 
     /**
@@ -573,12 +579,12 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
     }
 
 
-    // @Scheduled(cron = "0 */1 * * * ?")
+    @Scheduled(cron = "0 */1 * * * ?")
     public void SignInfo() {
         //执行代码
         logger.debug("扫描开始");
         List<TaskBatch> maps = taskBatchService.queryDataInfo();
-        if (maps != null && maps.size() >= 1) {
+        if (maps != null && maps.size() >= 1 && executor.getQueue().size()<=200) {
             for (TaskBatch dataInfo : maps) {
                 String jsonData = dataInfo.getJsonData();
                 TaskApprovalVO taskApprovalVO = JSON.parseObject(jsonData, TaskApprovalVO.class);
@@ -586,36 +592,18 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                 Long userId = dataInfo.getCreateUser();
                 String nickName = dataInfo.getNickName();
 
-                Boolean istrue = true;
-                try {
-                    Thread.sleep(500);
-                } catch (InterruptedException e) {
-                    throw new RuntimeException(e);
-                }
-
                 Boolean aBoolean = RedisTemplate.hasKey("sign-" + taskApprovalVO.getFormDataId());
-                System.out.println(taskApprovalVO.getFormDataId() + "---" + aBoolean);
-                if (aBoolean) {
-                    istrue = false;
-                }
-                if (istrue) {
-                    int wtask = executor.getQueue().size();
-                    if (wtask >= 200) {
-                        break;
-                    }
-                    // taskBatchService.update(Wrappers.<TaskBatch>update().set("is_deleted", 2).eq("id", taskBatchId));
-                    RedisTemplate.opsForValue().set("sign-" + taskApprovalVO.getFormDataId(), "1", 70, TimeUnit.SECONDS);
+                System.out.println("---------"+aBoolean);
+                if (!aBoolean) {
+                    RedisTemplate.opsForValue().set("sign-" + taskApprovalVO.getFormDataId(), "1");
                     CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
                         try {
-
                             /*===============执行批量任务===============*/
                             this.checkIsExsitTaskBatch(taskApprovalVO, taskBatchId, userId, nickName);
-
                         } catch (FileNotFoundException e) {
                             e.printStackTrace();
                         }
                     }, executor);
-
                 }
             }
         }
@@ -639,7 +627,6 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
         /*===============试验自检任务相关===============*/
         this.trialSelfTaskRelated(taskApprovalVO, pdfUrlEVisa, batchId);
 
-        RedisTemplate.delete("sign-" + taskApprovalVO.getFormDataId());
     }
 
     // 电签主流程业务
@@ -659,29 +646,30 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             return "无当前分支信息";
         }
         //获取主流程
-        Task masterTask = this.getOne(Wrappers.<Task>lambdaQuery().eq(Task::getIsDeleted, 0).eq(Task::getProcessInstanceId, currentLink.getProcessInstanceId()));
+        Task masterTask = getOne(Wrappers.<Task>lambdaQuery().eq(Task::getIsDeleted, 0).eq(Task::getProcessInstanceId, currentLink.getProcessInstanceId()));
 
         if ("OK".equals(taskApprovalVO.getFlag())) {
             //同意,执行签章
             //todo ============================ 执行电签区域 ============================
             //电签状态
-            String eVisaStatus = this.eVisaClient.eVisa(JSONObject.parseObject(JSONObject.toJSONString(taskApprovalVO), EVisaTaskApprovalVO.class));
-            System.out.println("+++++" + eVisaStatus);
+            System.out.println("++buess-开始+++" + taskApprovalVO.getFormDataId());
+            String eVisaStatus = eVisaClient.eVisa(JSONObject.parseObject(JSONObject.toJSONString(taskApprovalVO), EVisaTaskApprovalVO.class));
+            System.out.println("+++evsin-返回++"+ taskApprovalVO.getFormDataId()+"--"+ eVisaStatus);
             //todo ============================ 执行电签区域 ============================
 
             //电签状态分为success/notPfxOrFile/error,当状态为error时就需要重新提交请求
             if (eVisaStatus == null || StringUtils.isEmpty(eVisaStatus)) {
-                this.taskBatchService.update(Wrappers.<TaskBatch>lambdaUpdate()
+                taskBatchService.update(Wrappers.<TaskBatch>lambdaUpdate()
                         .set(TaskBatch::getIsDeleted, 4)
                         .eq(TaskBatch::getId, taskApprovalVO.getId())
                 );
-
+                RedisTemplate.delete("sign-" + taskApprovalVO.getFormDataId());
             } else if ("success".equals(eVisaStatus) || eVisaStatus.contains("success")) {
                 //审批通过会返回签章成功的文件,需要设置替换
                 //完成/审批当前分支流程
                 //    this.newFlowClient.completeApprovalTask(taskId, parallelProcessInstanceId, comment).getData();
                 //修改分支状态,改为已完成
-                this.taskParallelService.update(Wrappers.<TaskParallel>lambdaUpdate()
+                taskParallelService.update(Wrappers.<TaskParallel>lambdaUpdate()
                         .set(TaskParallel::getStatus, 2)
                         .set(TaskParallel::getEVisaStatus, 1)
                         .set(TaskParallel::getEVisaContent, "电签成功")
@@ -816,9 +804,6 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             this.abolishMessage(masterTask, currentLink, comment, taskApprovalVO.getNickName());
         }
 
-        /*//return前先删除合同段树redis缓存
-        informationQueryService.delAsyncWbsTree(masterTask.getContractId());*/
-
         return "";
     }
 
@@ -931,13 +916,14 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             this.iTrialSelfInspectionRecordService.updateTrialSelfInspectionRecordStatus(pdfUrlEVisa, taskApprovalVO);
             //executor删除掉对应批次
             this.taskBatchService.deletedById(batchId);
+            RedisTemplate.delete("sign-" + taskApprovalVO.getFormDataId());
         }
 
         if (!"OK".equals(taskApprovalVO.getFlag())) {
             //已废除
             this.iTrialSelfInspectionRecordService.updateTrialSelfInspectionRecordStatusFC(taskApprovalVO);
             //executor删除掉对应批次
-            this.taskBatchService.deletedById(batchId);
+            RedisTemplate.delete("sign-" + taskApprovalVO.getFormDataId());
         }
     }
 

+ 1 - 0
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/EVisaApplication.java

@@ -13,6 +13,7 @@ import org.springframework.cloud.client.SpringCloudApplication;
 public class EVisaApplication {
 
     public static void main(String[] args) {
+
         BladeApplication.run(EVisaConstant.APPLICATION_WEATHER_NAME, EVisaApplication.class, args);
     }
 

+ 28 - 23
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVisaController.java

@@ -20,13 +20,13 @@ import java.io.BufferedReader;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStreamReader;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.*;
 
 import java.lang.management.ManagementFactory;
 import java.lang.management.OperatingSystemMXBean;
+import java.util.concurrent.locks.ReentrantLock;
+
 /**
  * 清表基础数据表 控制器
  *
@@ -49,10 +49,10 @@ public class EVisaController {
     @Resource(name = "taskExecutor1")
     private ThreadPoolExecutor executor;
 
-
     // 电签主类
-    @Scheduled(cron = "0 */1 * * * ?")
+  //  @Scheduled(cron = "0 */1 * * * ?")
     public void SignInfo() {
+
         //执行代码
         log.info("扫描开始");
         String sql = "SELECT * from u_task_batch where is_deleted =0 LIMIT 100";
@@ -64,29 +64,34 @@ public class EVisaController {
                 String taskBatchId = dataInfo.get("id").toString();
                 Long userId = Long.valueOf(dataInfo.get("create_user")+"");
                 String nickName = dataInfo.get("nick_name")+"";
-                String formDataId = taskApprovalVO.getFormDataId();
+                Boolean aBoolean = RedisTemplate.hasKey("sign-" + taskApprovalVO.getFormDataId());
+                System.out.println(aBoolean);
+
+                RedisTemplate.opsForValue().set("sign-" + taskApprovalVO.getFormDataId(), "1", 600, TimeUnit.SECONDS);
 
-                CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
-                        try {
-                           this.checkIsExsitTaskBatch(taskApprovalVO, taskBatchId, userId, nickName);
-                        } catch (FileNotFoundException e) {
-                            e.printStackTrace();
+               /* String formDataId = taskApprovalVO.getFormDataId().substring(0,5);
+                synchronized (formDataId){
+                    executor.execute(new Runnable() {
+                        @Override
+                        public void run() {
+                            checkIsExsitTaskBatch(taskApprovalVO,formDataId,userId,nickName);
                         }
-                }, executor);
+                    });
+                }*/
             }
         }
     }
 
-    private void checkIsExsitTaskBatch(TaskApprovalVO taskApprovalVO, String batchId, Long userId, String nickName) throws FileNotFoundException {
-        synchronized (taskApprovalVO.getFormDataId()) {
-            try {
-                System.out.println(taskApprovalVO.getFormDataId());
-                Thread.sleep(8000);
-            } catch (InterruptedException e) {
-                throw new RuntimeException(e);
-            }
-        }
-        System.out.println();
+    public void checkIsExsitTaskBatch(TaskApprovalVO taskApprovalVO, String batchId, Long userId, String nickName){
+           synchronized (batchId){
+               try {
+                   System.out.println("开始执行-------");
+                   Thread.sleep(8000);
+                   System.out.println(batchId);
+                   System.out.println("结束执行-------");
+               } catch (InterruptedException e) {
+                   throw new RuntimeException(e);
+               }
+           }
     }
-
 }

+ 4 - 0
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java

@@ -511,6 +511,7 @@ public class EVisaServiceImpl implements EVisaService {
                             MultipartFile newFiles = new MockMultipartFile("file", SnowFlakeUtil.getId() + ".pdf", "text/plain", IOUtils.toByteArray(new ByteArrayInputStream((byte[]) result[0])));
                             //重新上传
                             BladeFile bladeFile = this.newIOSSClient.uploadFileByInputStream(newFiles);
+
                             if (bladeFile != null) {
                                 resultMessage = SUCCESS + "@@@@" + bladeFile.getLink();
                             } else {
@@ -532,6 +533,7 @@ public class EVisaServiceImpl implements EVisaService {
         //释放锁
         //  DistributedRedisLock.release(task.getUserId().toString());
 
+        System.out.println("bladeFile---eVisa"+task.getFormDataId()+"--"+resultMessage);
         return resultMessage;
     }
 
@@ -825,7 +827,9 @@ public class EVisaServiceImpl implements EVisaService {
 
             compoundSealPdfListDetachedRequest.setBody(requestBody);
             //****************************** 请求服务端进行签章 *********************************************
+            System.out.println("-----------------------"+new Date().toString()+"开始"+transactionNo +"----------------------------");
             ResponseDto responseDto = paperlessClient.execute(compoundSealPdfListDetachedRequest);
+            System.out.println("-----------------------"+new Date().toString()+"结束"+transactionNo +"----------------------------");
 
             //******************************解析响应结果 *********************************************
             CompoundSealPdfListDetachedResponse compoundSealPdfListDetachedResponse = (CompoundSealPdfListDetachedResponse) responseDto;

+ 8 - 3
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/utils/PDFUtils.java

@@ -11,6 +11,7 @@ import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.tool.utils.Func;
 
 import java.io.InputStream;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -65,7 +66,8 @@ public class PDFUtils {
         PdfDocument pdf = new PdfDocument();
         List<String> eVisaConfigList = new ArrayList<>();
         try {
-            InputStream ossInputStream = CommonUtil.getOSSInputStream(pdfUrl);
+            InputStream ossInputStream = CommonUtil.getOSSInputStream(pdfUrl);;
+          //  InputStream ossInputStream = new URL(pdfUrl).openStream();
             //加载PDF文档
             pdf.loadFromStream(ossInputStream);
 
@@ -81,12 +83,15 @@ public class PDFUtils {
                     }
                 }
             }
+
+
+            List<String> unique = eVisaConfigList.stream().distinct().collect(Collectors.toList());
             ossInputStream.close();
+            return unique;
         }catch (Exception e){
             e.printStackTrace();
         }
-        List<String> unique = eVisaConfigList.stream().distinct().collect(Collectors.toList());
-        return unique;
+        return null;
     }
 
     public static void main123(String[] args) {

+ 2 - 2
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -2706,11 +2706,11 @@ public class CustomFunction {
             if (StringUtils.isEmpty(scale)) {
                 scale = 0;
             }
-            String delimiter = handleNull(matcherFindGroup("[^0-9./E\\-]", design.toString(), 0, false));
+            String delimiter = handleNull(matcherFindGroup("[^0-9./E]", design.toString(), 0, false));
             if (StringUtils.isEmpty(delimiter)) {
                 delimiter = CONCAT;
             }
-            String delimiter2 = handleNull(matcherFindGroup("[^0-9.E\\-]", data.toString(), 0, false));
+            String delimiter2 = handleNull(matcherFindGroup("[^0-9.E]", data.toString(), 0, false));
             if (StringUtils.isEmpty(delimiter2)) {
                 delimiter2 = CONCAT;
             }

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

@@ -314,7 +314,7 @@ public class ExcelTabController extends BladeController {
             @ApiImplicitParam(name = "nodeId", value = "节点id", required = true)
     })
     public R putFileAttach(@RequestParam("file") MultipartFile file, Long nodeId) {
-        String file_path = FileUtils.getSysLocalFileUrl();
+        String file_path = "/Users/hongchuangyanfa/Desktop/";//FileUtils.getSysLocalFileUrl();
         ExcelTab detail = excelTabService.getById(nodeId);
 
         String filecode = SnowFlakeUtil.getId() + "";

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

@@ -2460,6 +2460,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         return R.fail("无数据");
     }
 
+
     String[] tabArr=new String[]{"计量报表","动员预付款报表","材料预付款报表"};
     @Override
     public void execute3(Long contractId,Long periodId ,Integer type) {

+ 8 - 3
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MiddleMeterApplyController.java

@@ -154,10 +154,11 @@ public class MiddleMeterApplyController extends BladeController {
 	@ApiImplicitParams(value = {
 			@ApiImplicitParam(name = "contractId", value = "合同id", required = true),
 			@ApiImplicitParam(name = "contractUnitId", value = "节点id", required = true),
-			@ApiImplicitParam(name = "contractPeriodId", value = "合同计量期id", required = true)
+			@ApiImplicitParam(name = "contractPeriodId", value = "合同计量期id", required = true),
+			@ApiImplicitParam(name = "type", value = "类型1按部位排序2按时间排序", required = true)
 	})
-	public R<IPage<MiddleMeterApplyVO>> list(MiddleMeterApply middleMeterApply, Query query) {
-		IPage<MiddleMeterApplyVO> pages = middleMeterApplyService.page2(middleMeterApply,query);
+	public R<IPage<MiddleMeterApplyVO>> list(MiddleMeterApply middleMeterApply, Query query,Integer type) {
+		IPage<MiddleMeterApplyVO> pages = middleMeterApplyService.page2(middleMeterApply,query,type);
 		return R.data(pages);
 	}
 
@@ -214,6 +215,10 @@ public class MiddleMeterApplyController extends BladeController {
 		return R.data(middleMeterApplyService.getCurrentMeterMoney(middleMeterApply));
 	}
 
+	@GetMapping("/test")
+	public R<String> test() {
+		return R.data(middleMeterApplyService.test());
+	}
 
 	
 }

+ 11 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.java

@@ -53,10 +53,14 @@ public interface ChangeTokenFormMapper extends BaseMapper<ChangeTokenForm> {
     List<ChangeNodeVO> getNodeList(@Param("contractId") Long contractId,@Param("id") Long id);
     //获取变更令下节点,附带最新施工图金额和变更后金额
     List<ChangeNodeVO> getNodeList2(@Param("id") Long id,@Param("contractId") Long contractId);
+    //获取变更令下节点,回退时使用,附带修改前的施工图号
+    List<ChangeNodeVO> getNodeList3(@Param("id") Long id,@Param("contractId") Long contractId);
     //获取变更令下清单
     List<ChangeFormVO2> getFormList(@Param("contractId") Long contractId,@Param("id") Long id);
     //获取变更令下清单,附带最新变更后数量和变更后金额
     List<ChangeFormVO2> getFormList2(@Param("id") Long id,@Param("contractId") Long contractId);
+    //获取变更令下清单,回退时使用,附带修改前的变更后数量与变更后金额
+    List<ChangeFormVO2> getFormList3(@Param("id") Long id,@Param("contractId") Long contractId);
 
     IPage<ChangeTokenPageVO> page2(IPage<ChangeTokenPageVO> page,@Param("contractId") Long contractId);
 
@@ -70,5 +74,11 @@ public interface ChangeTokenFormMapper extends BaseMapper<ChangeTokenForm> {
 
     List<ChangeFormVO2> getMultipleChange(@Param("tokenId") Long id);
 
-    List<ChangeFormVO2> getUpdateMiddleForm(@Param("tokenId") Long id);
+    String getUpdateMiddleForm(@Param("tokenId") Long id);
+
+    InventoryFormMeterVO getNodeFormAndMeterMoney(@Param("id") Long id,@Param("meterId") Long contractMeterId);
+
+    List<ChangeFormVO2> getAllCollectForm(@Param("tokenId") Long id);
+
+    void deleteCollectForm(@Param("tokenId")Long id);
 }

+ 35 - 5
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ChangeTokenFormMapper.xml

@@ -47,7 +47,8 @@
                 change_before_total = #{item.changeBeforeTotal},
                 change_after_total = #{item.changeAfterTotal},
                 change_before_money = #{item.changeBeforeMoney},
-                change_after_money = #{item.changeAfterMoney}
+                change_after_money = #{item.changeAfterMoney},
+                apply_ids = #{item.applyIds}
             </set>
             where id = #{item.id}
         </foreach>
@@ -71,6 +72,9 @@
             where id = #{item.id}
         </foreach>
     </update>
+    <delete id="deleteCollectForm">
+        delete from s_change_token_inventory where change_token_id = #{tokenId} and is_collect_form = 1
+    </delete>
     <select id="getAllForm" resultType="org.springblade.meter.entity.ContractInventoryForm">
         select cif.id,
                IFNULL((select sum(build_picture_total) from s_inventory_form_meter ifm
@@ -191,6 +195,13 @@
         where ctm.contract_id = #{contractId} and ctm.is_deleted = 0
           AND ctm.change_token_id = #{id}
     </select>
+    <select id="getNodeList3" resultType="org.springblade.meter.vo.ChangeNodeVO">
+        select ctm.contract_meter_id as id,
+               ctm.before_contract_picture as contractPicture
+        from s_change_token_meter ctm
+        where ctm.contract_id = #{contractId} and ctm.is_deleted = 0
+          AND ctm.change_token_id = #{id}
+    </select>
     <select id="getFormList" resultType="org.springblade.meter.vo.ChangeFormVO2">
         select cti.contract_form_id as id,cti.form_number,cti.form_name,cti.current_price,cti.contract_meter_id,
                cti.change_before_total as contractTotal,cti.change_total as currentChangeTotal,
@@ -216,6 +227,14 @@
         where cti.contract_id = #{contractId} and cti.is_deleted = 0
           AND cti.change_token_id = #{id} and is_collect_form = 0
     </select>
+    <select id="getFormList3" resultType="org.springblade.meter.vo.ChangeFormVO2">
+        select cti.contract_form_id as id,cti.contract_meter_id,
+               cti.change_before_total as changeTotal,
+               cti.change_before_money as changeMoney
+        from s_change_token_inventory cti
+        where cti.contract_id = #{contractId} and cti.is_deleted = 0
+          AND cti.change_token_id = #{id} and is_collect_form = 0
+    </select>
 
     <select id="page2" resultType="org.springblade.meter.vo.ChangeTokenPageVO">
         select *,
@@ -233,11 +252,22 @@
         where is_deleted = 0 and is_collect_form = 1 and change_token_id = #{tokenId}
             and change_after_total != (select change_total from s_contract_inventory_form where is_deleted = 0 and id = cti.contract_form_id)
     </select>
-    <select id="getUpdateMiddleForm" resultType="org.springblade.meter.vo.ChangeFormVO2">
-        select form_name
+    <select id="getNodeFormAndMeterMoney" resultType="org.springblade.meter.vo.InventoryFormMeterVO">
+        select change_build_picture_total,
+                (select sum(current_meter_total) from s_inventory_form_apply ifa where ifa.is_deleted = 0
+                        and ifa.contract_form_id = ifm.contract_form_id and ifa.contract_meter_id = ifm.contract_meter_id) as allMeterMoney
+        from s_inventory_form_meter ifm
+        where is_deleted = 0 and contract_form_id = #{id} and contract_meter_id = #{meterId}
+    </select>
+    <select id="getUpdateMiddleForm" resultType="java.lang.String">
+        select GROUP_CONCAT(apply_ids)
+        from s_change_token_inventory
+        WHERE change_token_id = #{tokenId} and is_deleted = 0 and is_collect_form = 0
+    </select>
+    <select id="getAllCollectForm" resultType="org.springblade.meter.vo.ChangeFormVO2">
+        select contract_form_id as id,change_before_total as contractTotal,change_before_money as contractMoney
         from s_change_token_inventory cti
-        where is_deleted = 0 and is_collect_form = 0 and change_token_id = #{tokenId}
-          and change_after_total &lt;= (select change_total from s_contract_inventory_form where is_deleted = 0 and id = cti.contract_form_id)
+        where is_deleted = 0 and is_collect_form = 1 and change_token_id = #{tokenId}
     </select>
 
 

+ 8 - 3
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/ContractInventoryFormMapper.xml

@@ -137,16 +137,21 @@
                        WHERE contract_id = #{contractId} and contract_form_id = cif.id),0)  as poseNum
         from s_contract_inventory_form cif
         WHERE cif.contract_id = #{contractId} and cif.is_deleted = 0 and cif.is_form_node = 1
-            <if test="formNum != null and formNum != '' and type==1">
+            <if test="formNum != null and formNum != ''">
                 and cif.form_number like concat('%',#{formNum},'%')
             </if>
           and cif.id not in (SELECT contract_form_id from s_inventory_form_meter WHERE contract_id = #{contractId} and contract_meter_id = #{meterId} and is_deleted = 0)
     </select>
     <select id="getNodeResolveForm" resultType="org.springblade.meter.vo.ContractFromVO">
-        select ifm.id, cif.form_number,cif.form_name,cif.current_price,cif.contract_total,cif.change_total,cif.is_supplement,
+        select ifm.id, ifm.contract_form_id ,cif.form_number,cif.form_name,cif.current_price,cif.contract_total,cif.change_total,cif.is_supplement,
                ifm.build_picture_total,ifm.change_build_picture_total,ifm.build_picture_money,ifm.change_build_picture_money,
+
                if(ifm.build_picture_total=ifm.change_build_picture_total,if((select count(1) from s_inventory_form_apply
-                   where contract_id = #{contractId} and is_deleted = 0 and contract_form_id = ifm.contract_form_id)=0,0,1),1) as citeStatus,
+                   where contract_id = #{contractId} and is_deleted = 0 and contract_form_id = ifm.contract_form_id and contract_meter_id = ifm.contract_meter_id)=0,
+                       if((select count(1) from s_change_token_inventory
+                          where contract_id = #{contractId} and is_deleted = 0 and contract_form_id = ifm.contract_form_id and contract_meter_id = ifm.contract_meter_id)=0,0,1)
+                   ,1),1) as citeStatus,
+
             IFNULL((SELECT SUM(build_picture_total) from s_inventory_form_meter WHERE contract_id = #{contractId} and contract_form_id = cif.id
                      and is_deleted = 0 and contract_meter_id and contract_meter_id != #{meterId}),0)  as otherPoseNum,
             IFNULL((SELECT SUM(build_picture_total) from s_inventory_form_meter

+ 9 - 4
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MiddleMeterApplyMapper.java

@@ -23,10 +23,7 @@ import org.springblade.meter.entity.ChangeTokenMeter;
 import org.springblade.meter.entity.MeterTreeContract;
 import org.springblade.meter.entity.MiddleMeterApply;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.springblade.meter.vo.MeterInventoryDetailVO;
-import org.springblade.meter.vo.MeterInventoryVO;
-import org.springblade.meter.vo.MiddleMeterApplyVO;
-import org.springblade.meter.vo.ResolveInventoryVO;
+import org.springblade.meter.vo.*;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -49,6 +46,8 @@ public interface MiddleMeterApplyMapper extends BaseMapper<MiddleMeterApply> {
     List<MeterTreeContract> getNodeDivide(@Param("contractId") Long contractId, @Param("ids") List<Long> ids);
 
     IPage<MiddleMeterApplyVO> page2(IPage<MiddleMeterApplyVO> iPage,@Param("apply") MiddleMeterApply middleMeterApply);
+    //根据部位排序
+    IPage<MiddleMeterApplyVO> page3(IPage<MiddleMeterApplyVO> iPage,@Param("apply") MiddleMeterApply middleMeterApply,@Param("ids") List<Long> ids);
 
     List<MeterInventoryDetailVO> meterPeriodAllForm(@Param("apply") MiddleMeterApply apply);
 
@@ -65,4 +64,10 @@ public interface MiddleMeterApplyMapper extends BaseMapper<MiddleMeterApply> {
     List<Long> getNodeOtherFormId(@Param("contractId") Long contractId,@Param("contractPeriodId") Long contractPeriodId,@Param("nodeId") Long nodeId);
 
     BigDecimal getCurrentMeterMoney(@Param("contractId") Long contractId,@Param("contractPeriodId") Long contractPeriodId);
+
+    Integer getAllAPPly(@Param("contractId") Long contractId,@Param("contractPeriodId") Long contractPeriodId);
+
+    List<NodeSortVO> getLowestNodeBySort(@Param("contractId") Long contractId,@Param("nodeId") Long nodeId);
+
+    List<NodeSortVO> getAllNode(@Param("contractId") Long contractId);
 }

+ 43 - 0
blade-service/blade-meter/src/main/java/org/springblade/meter/mapper/MiddleMeterApplyMapper.xml

@@ -76,6 +76,26 @@
                     WHERE contract_id = #{apply.contractId} and is_deleted = 0
                     and (mtc.id = #{apply.contractUnitId} or FIND_IN_SET(#{apply.contractUnitId}, ancestor))
                   )
+            order by mma.create_time desc
+    </select>
+    <select id="page3" resultType="org.springblade.meter.vo.MiddleMeterApplyVO">
+        SELECT *,
+               CASE when approve_status = 0 then '未上报' when approve_status = 1 then '待审批' when approve_status = 2 then '已审批'
+                    else '已废除' end as approveStatusName,
+               (select period_number from s_contract_meter_period cmp where cmp.id = mma.contract_period_id) as periodNumber
+        FROM s_middle_meter_apply mma
+        WHERE contract_id = #{apply.contractId} and is_deleted = 0 and contract_period_id = #{apply.contractPeriodId}
+          and contract_unit_id in (
+                <foreach collection="ids" item="id"  separator=",">
+                    #{id}
+                </foreach>
+            )
+        order by FIELD(contract_unit_id,
+            <foreach collection="ids" item="id"  separator=",">
+                #{id}
+            </foreach>
+        )
+
     </select>
     <select id="meterPeriodAllForm" resultType="org.springblade.meter.vo.MeterInventoryDetailVO">
         SELECT cif.id,ifa.meter_number,cif.form_number,cif.form_name,cif.current_price,cif.change_total,ifa.current_meter_total,ifa.current_meter_money,ifa.contract_form_id,
@@ -95,6 +115,8 @@
                ifa.change_build_picture_total as changeTotal,
                ifa.current_meter_total as currentMeterTotal,0 as containChangeTotal,
                ifa.current_meter_money as currentMeterMoney,
+               (IFNULL((select sum(current_meter_total) from s_inventory_form_apply where is_deleted = 0
+                      and contract_meter_id = #{nodeId} and contract_form_id = ifa.contract_form_id and id != ifa.id),0)) as otherMeterTotal,
                (IFNULL((select sum(current_meter_total) from s_inventory_form_apply where is_deleted = 0
                       and contract_meter_id = #{nodeId} and contract_form_id = ifa.contract_form_id),0)) as allMeterTotal
         from s_inventory_form_apply ifa
@@ -120,6 +142,27 @@
         from s_middle_meter_apply
         where contract_id = #{contractId} and is_deleted = 0 and contract_period_id = #{contractPeriodId} and approve_status != 3
     </select>
+    <select id="getAllAPPly" resultType="java.lang.Integer">
+        select count(1)
+        from s_middle_meter_apply
+        where contract_id = #{contractId} and contract_period_id = #{contractPeriodId}
+    </select>
+
+    <select id="getAllNode" resultType="org.springblade.meter.vo.NodeSortVO">
+        SELECT id,parent_id from m_wbs_tree_private  WHERE project_id  = 1578599210897772545 and is_deleted = 0 and type != 10 and wbs_type = 1
+    </select>
+    <select id="getLowestNodeBySort" resultType="org.springblade.meter.vo.NodeSortVO">
+        SELECT id,parent_id
+        FROM s_meter_tree_contract mtc
+        WHERE is_deleted = 0 and contract_id = #{contractId}
+          and id in (SELECT id FROM s_meter_tree_contract mtc2
+                     WHERE mtc2.contract_id = #{contractId} and mtc2.is_deleted = 0
+                       and (mtc2.id = #{nodeId} or FIND_IN_SET(#{nodeId}, mtc2.ancestor))
+        )
+        ORDER BY mtc.sort,mtc.create_time
+
+
+    </select>
 
 
 </mapper>

+ 4 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/service/IMiddleMeterApplyService.java

@@ -50,7 +50,7 @@ public interface IMiddleMeterApplyService extends BaseService<MiddleMeterApply>
 
     void update2(MiddleMeterApplyDTO dto);
 
-    IPage<MiddleMeterApplyVO> page2(MiddleMeterApply middleMeterApply, Query query);
+    IPage<MiddleMeterApplyVO> page2(MiddleMeterApply middleMeterApply, Query query,Integer type);
 
     void delete(List<Long> ids);
 
@@ -61,4 +61,7 @@ public interface IMiddleMeterApplyService extends BaseService<MiddleMeterApply>
     String getMeterNumber(MiddleMeterApply middleMeterApply);
 
     BigDecimal getCurrentMeterMoney(MiddleMeterApply middleMeterApply);
+
+    String test();
+
 }

+ 85 - 14
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ChangeTokenFormServiceImpl.java

@@ -74,6 +74,9 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
     //合同计量单元与清单中间表
     private final IInventoryFormMeterService inventoryFormMeterService;
 
+    //中间计量申请与清单中间表
+    private final IInventoryFormApplyService inventoryFormApplyService;
+
     //合同计量单元
     private final MeterTreeContractService meterTreeContractService;
 
@@ -186,16 +189,19 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                 }
                 //如果是负变更,判断当前节点下是否存在当前清单
                 if (vo2.getCurrentChangeTotal().compareTo(BigDecimal.ZERO) == -1){
-                    //获取当前节点下当前清单的分解信息
-                    InventoryFormMeter meter = inventoryFormMeterService.getOne(new LambdaQueryWrapper<InventoryFormMeter>()
-                            .eq(InventoryFormMeter::getContractFormId, vo2.getId())
-                            .eq(InventoryFormMeter::getContractMeterId, vo2.getContractMeterId()));
+                    //获取当前节点下当前清单的分解信息,与计量总和
+                    InventoryFormMeterVO meter = baseMapper.getNodeFormAndMeterMoney(vo2.getId(),vo2.getContractMeterId());
                     if (meter == null){
-                        throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,未找到清单("+vo2.getFormName()+")的分解信息,不能负变更");
+                        throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,未找到清单["+vo2.getFormName()+"]的分解信息,不能负变更");
                     }else {
+                        //如果负变更后小于变更后施工图数量,则不能负变更
                         if (meter.getChangeBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(BigDecimal.ZERO) == -1){
                             throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单["+vo2.getFormName()+"]负变更超过施工图变更后数量,不能负变更");
                         }
+                        //如果负变更后变更后施工图数量小于已经计量的数量,则不能负变更
+                        if (meter.getChangeBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(meter.getAllMeterMoney()) == -1){
+                            throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单["+vo2.getFormName()+"]负变更后变更后施工图数量小于已计量量,导致超计,不能负变更");
+                        }
                     }
                 }else if (vo2.getCurrentChangeTotal().compareTo(BigDecimal.ZERO) == 0){
                     throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单("+vo2.getFormName()+")的变更数量为0,请确认后再提交");
@@ -380,16 +386,19 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                 }
                 //如果是负变更,判断当前节点下是否存在当前清单
                 if (vo2.getCurrentChangeTotal().compareTo(BigDecimal.ZERO) == -1){
-                    //获取当前节点下当前清单的分解信息
-                    InventoryFormMeter meter = inventoryFormMeterService.getOne(new LambdaQueryWrapper<InventoryFormMeter>()
-                            .eq(InventoryFormMeter::getContractFormId, vo2.getId())
-                            .eq(InventoryFormMeter::getContractMeterId, vo2.getContractMeterId()));
+                    //获取当前节点下当前清单的分解信息,与计量总和
+                    InventoryFormMeterVO meter = baseMapper.getNodeFormAndMeterMoney(vo2.getId(),vo2.getContractMeterId());
                     if (meter == null){
                         throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,未找到清单["+vo2.getFormName()+"]的分解信息,不能负变更");
                     }else {
-                        if (meter.getBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(BigDecimal.ZERO) == -1){
+                        //如果负变更后小于变更后施工图数量,则不能负变更
+                        if (meter.getChangeBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(BigDecimal.ZERO) == -1){
                             throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单["+vo2.getFormName()+"]负变更超过施工图变更后数量,不能负变更");
                         }
+                        //如果负变更后变更后施工图数量小于已经计量的数量,则不能负变更
+                        if (meter.getChangeBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(meter.getAllMeterMoney()) == -1){
+                            throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单["+vo2.getFormName()+"]负变更后变更后施工图数量小于已计量量,导致超计,不能负变更");
+                        }
                     }
                 }else if (vo2.getCurrentChangeTotal().compareTo(BigDecimal.ZERO) == 0){
                     throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单["+vo2.getFormName()+"]的变更数量为0,请确认后再提交");
@@ -506,8 +515,14 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
         //为防止中途其他变更执行,获取节点和清单的最新数据进行重新计算再变更
         //获取当前变更令的变更节点
         List<ChangeNodeVO> allNode = baseMapper.getNodeList2(id, form.getContractId());
+        if (allNode.size() == 0){
+            throw new ServiceException("当前变更令的变更节点为空,下达失败");
+        }
         //获取当前变更令的所有变更清单
         List<ChangeFormVO2> allForm = baseMapper.getFormList2(id,form.getContractId());
+        if (allForm.size() == 0){
+            throw new ServiceException("当前变更令的变更清单为空,下达失败");
+        }
         //修改合同清单,此条清单的变更后数量和变更后金额,
         // 所有清单按照清单id分组,
         Map<Long, List<ChangeFormVO2>> map = allForm.stream().collect(Collectors.groupingBy(ChangeFormVO2::getId));
@@ -584,7 +599,7 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                 list5.add(meter);
             }else {
                 //判断施工图数量是否发生变化,发生变化代表新增之后下达之前,变更过,则修改中间表的变更前数量和变更前金额
-                if (!vo2.getNewestChangeTotal().equals(vo2.getContractTotal())) {
+                if (!vo2.getNewestChangeTotal().equals(vo2.getContractTotal()) || StringUtils.isNotBlank(vo2.getApplyIds())) {
                     //为allForm设置最终的当前节点当前清单变更后数量,用于修改清单与中间计量申请
                     vo2.setChangeTotal(vo2.getNewestChangeTotal().add(vo2.getCurrentChangeTotal()));
                     vo2.setChangeMoney(vo2.getNewestChangeMoney().add(vo2.getCurrentChangeMoney()));
@@ -594,6 +609,7 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
                     ct.setChangeAfterTotal(vo2.getChangeTotal());
                     ct.setChangeBeforeMoney(vo2.getNewestChangeMoney());
                     ct.setChangeAfterMoney(vo2.getChangeMoney());
+                    ct.setApplyIds(vo2.getApplyIds());
                     list3.add(ct);
                 }
                 InventoryFormMeter meter = new InventoryFormMeter();
@@ -636,7 +652,11 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
         meterTreeContractService.asyncCalculateNodeMoney(allNode);
     }
 
+    /**
+     * 撤销变更 变更令表
+     */
     @Override
+    @Transactional
     public void annulChange(Long id) {
         //判断当前状态是否是已下达
         ChangeTokenForm form = this.getById(id);
@@ -646,16 +666,67 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
         if (form.getApproveStatus() != 2){
             throw new ServiceException("当前变更任务未审批通过,撤销失败");
         }
+
         //判断是否有清单执行过二次变更,执行过则不能撤销
         List<ChangeFormVO2> vo2 = baseMapper.getMultipleChange(id);
         if (vo2.size() != 0){
-            vo2.stream().map(ChangeFormVO2::getFormName).collect(Collectors.joining(",","[","]"));
-            throw new ServiceException("当前变更之后又发生过变更,请先撤销上一次变更");
+            String s = vo2.stream().map(ChangeFormVO2::getFormName).distinct().collect(Collectors.joining(",", "[", "]"));
+            throw new ServiceException("清单:"+s+"在当前变更之后又发生过变更,请先撤销上一次变更");
         }
+
         //判断是否修改过中间计量申请,修改过则不能撤销
-        vo2 = baseMapper.getUpdateMiddleForm(id);
+        //获取当前变更令所有修改的中间计量申请的id
+        String ids = baseMapper.getUpdateMiddleForm(id);
+        if (StringUtils.isNotBlank(ids)){
+            //存在修改,则判断这些修改是否已经删除
+            List<Long> longs = Func.toLongList(ids);
+            List<InventoryFormApply> list = inventoryFormApplyService.listByIds(longs);
+            if (list.size() != 0){
+                String s = list.stream().map(InventoryFormApply::getFormName).distinct().collect(Collectors.joining(",", "[", "]"));
+                throw new ServiceException("当前变更令已经修改中间计量申请的清单:"+s+"的数据,不能撤销变更,删除计量之后允许撤销");
+            }
+        }
 
+        //通过汇总项修改合同清单
+        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){
+            throw new ServiceException("当前变更令的变更节点为空,下达失败");
+        }
+        //异步重新计算节点金额,和还原施工图号,此方法放到最后,待所有操作成功后再执行
+        meterTreeContractService.asyncCalculateNodeMoney(allNode);
         this.update(new LambdaUpdateWrapper<ChangeTokenForm>()
                 .eq(ChangeTokenForm::getId,id)
                 .set(ChangeTokenForm::getCommandStatus,0));

+ 1 - 1
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/ContractInventoryFormServiceImpl.java

@@ -586,7 +586,7 @@ public class ContractInventoryFormServiceImpl extends BaseServiceImpl<ContractIn
     }
 
     /**
-     * 判断当前节点是否已经分解或变更过,变更过返回true
+     * 判断当前清单是否已经分解或变更过,变更过返回true
      */
     private Boolean nodeIsChange(ContractInventoryForm form) {
         if (form.getBuildChangeTotal() != null) {

+ 28 - 4
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/InventoryFormMeterServiceImpl.java

@@ -26,11 +26,9 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.manager.entity.WbsTree;
-import org.springblade.meter.entity.ContractInventoryForm;
-import org.springblade.meter.entity.InventoryFormApply;
-import org.springblade.meter.entity.InventoryFormMeter;
-import org.springblade.meter.entity.MeterTreeContract;
+import org.springblade.meter.entity.*;
 import org.springblade.meter.mapper.InventoryFormMeterMapper;
+import org.springblade.meter.service.IChangeTokenInventoryService;
 import org.springblade.meter.service.IInventoryFormApplyService;
 import org.springblade.meter.service.IInventoryFormMeterService;
 import org.springblade.core.mp.base.BaseServiceImpl;
@@ -55,6 +53,8 @@ public class InventoryFormMeterServiceImpl extends BaseServiceImpl<InventoryForm
 
     private final IInventoryFormApplyService inventoryFormApplyService;
 
+    private final IChangeTokenInventoryService tokenInventoryService;
+
     @Override
     public List<Long> getNodeAllForm(Long nodeId) {
         return baseMapper.getNodeAllForm(nodeId);
@@ -95,6 +95,10 @@ public class InventoryFormMeterServiceImpl extends BaseServiceImpl<InventoryForm
             if (vo.getBuildPictureTotal() == null){
                 throw new ServiceException("请填写施工图数量");
             }
+            //校验当前节点下当前清单,是否在变更令中变更,或计量中计量
+            if (vo.getCiteStatus() == 0 && formIsChange(meterId,vo.getContractFormId())){
+                throw new ServiceException("清单["+vo.getFormName()+"]已经变更或计量,请刷新页面");
+            }
             //统计
             vo.setBuildPictureMoney(vo.getCurrentPrice().multiply(vo.getBuildPictureTotal()));
             vo.setChangeBuildPictureMoney(vo.getCurrentPrice().multiply(vo.getChangeBuildPictureTotal()));
@@ -132,6 +136,7 @@ public class InventoryFormMeterServiceImpl extends BaseServiceImpl<InventoryForm
         //判断当前清单是否被计量
         List<InventoryFormApply> list = inventoryFormApplyService.list(new LambdaQueryWrapper<InventoryFormApply>()
                 .eq(InventoryFormApply::getContractId, meter.getContractId())
+                .eq(InventoryFormApply::getContractMeterId,Long.parseLong(meterId))
                 .eq(InventoryFormApply::getContractFormId, meter.getContractFormId()));
         if (list.size() > 0){
             throw new ServiceException("当前清单已经计量,不能删除");
@@ -140,4 +145,23 @@ public class InventoryFormMeterServiceImpl extends BaseServiceImpl<InventoryForm
         this.removeById(formIds);
         return R.success("成功");
     }
+
+    /**
+     * 判断当前节点下当前清单是否已经分解或变更过,变更过返回true
+     */
+    private Boolean formIsChange(Long meterId,Long formId) {
+        long count = inventoryFormApplyService.count(new LambdaQueryWrapper<InventoryFormApply>()
+                .eq(InventoryFormApply::getContractFormId, formId)
+                .eq(InventoryFormApply::getContractMeterId, meterId));
+        if (count > 0) {
+            return true;
+        }
+        long count1 = tokenInventoryService.count(new LambdaQueryWrapper<ChangeTokenInventory>()
+                .eq(ChangeTokenInventory::getContractFormId, formId)
+                .eq(ChangeTokenInventory::getContractMeterId, meterId));
+        if (count1 > 0) {
+            return true;
+        }
+        return false;
+    }
 }

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

@@ -546,6 +546,11 @@ public class MeterTreeContractServiceImpl extends BaseServiceImpl<MeterTreeContr
     @Override
 //    @Async
     public void asyncCalculateNodeMoney(List<ChangeNodeVO> vos) {
+        for (ChangeNodeVO vo : vos) {
+            if (StringUtils.isBlank(vo.getContractPicture())){
+                vo.setContractPicture("");
+            }
+        }
         Map<Long, String> map = vos.stream().collect(Collectors.toMap(l -> l.getId(), l -> l.getContractPicture()));
         //获取所有要重新计算的节点的最新数据
         List<MeterTreeContract> list = this.listByIds(map.keySet());

+ 64 - 12
blade-service/blade-meter/src/main/java/org/springblade/meter/service/impl/MiddleMeterApplyServiceImpl.java

@@ -30,10 +30,8 @@ import org.springblade.meter.entity.*;
 import org.springblade.meter.mapper.MiddleMeterApplyMapper;
 import org.springblade.meter.service.*;
 import org.springblade.core.mp.base.BaseServiceImpl;
-import org.springblade.meter.vo.MeterInventoryDetailVO;
-import org.springblade.meter.vo.MeterInventoryVO;
-import org.springblade.meter.vo.MiddleMeterApplyVO;
-import org.springblade.meter.vo.ResolveInventoryVO;
+import org.springblade.meter.utils.ForestNodeMerger;
+import org.springblade.meter.vo.*;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -107,6 +105,9 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
         //获取清单和分解信息
         List<Long> longs = Func.toLongList(ids);
         vos = baseMapper.getResolveFormInfo(contractId,nodeId,longs);
+        for (MeterInventoryVO vo : vos) {
+            vo.setOtherMeterTotal(vo.getAllMeterTotal().subtract(vo.getCurrentMeterTotal()));
+        }
         return vos;
     }
 
@@ -300,9 +301,28 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
      * 分页 中间计量申请表
      */
     @Override
-    public IPage<MiddleMeterApplyVO> page2(MiddleMeterApply middleMeterApply, Query query) {
+    public IPage<MiddleMeterApplyVO> page2(MiddleMeterApply middleMeterApply, Query query,Integer type) {
         IPage<MiddleMeterApplyVO> iPage = new Page<>(query.getCurrent(),query.getSize());
-        iPage = baseMapper.page2(iPage,middleMeterApply);
+        if (type == 1){
+            //根据部位分页,先查出部位
+            List<NodeSortVO> vos = baseMapper.getLowestNodeBySort(middleMeterApply.getContractId(),middleMeterApply.getContractUnitId());
+            //转换为树
+            Long l1 = System.currentTimeMillis();
+            List<NodeSortVO> list = ForestNodeMerger.merge(vos);
+            Long l2 = System.currentTimeMillis();
+            System.out.println(l2-l1);
+            //递归循环树,存在子节点就深入,不存在子节点就add后返回上一层
+            List<Long> ids = new ArrayList<>();
+            gatherSortNode(list,ids);
+            if (ids.size() != 0){
+                Long l3 = System.currentTimeMillis();
+                iPage = baseMapper.page3(iPage,middleMeterApply,ids);
+                Long l4 = System.currentTimeMillis();
+                System.out.println(l4-l3);
+            }
+        }else {
+            iPage = baseMapper.page2(iPage, middleMeterApply);
+        }
         return iPage;
     }
 
@@ -313,9 +333,9 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
     @Transactional
     public void delete(List<Long> ids) {
         for (Long id : ids) {
-            //校验当前计量是否已经上报
-            ContractMeterPeriod period = contractMeterPeriodService.getById(id);
-            if (period.getApproveStatus() != 0){
+            //校验当前计量申请是否已经上报
+            MiddleMeterApply apply = this.getById(id);
+            if (apply.getApproveStatus() != 0){
                 throw new ServiceException("删除,当前计量期已经上报或审批");
             }
             //删除中间计量申请信息
@@ -344,6 +364,7 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
             List<MeterInventoryDetailVO> voList = map.get(aLong);
             MeterInventoryDetailVO vo = new MeterInventoryDetailVO();
             MeterInventoryDetailVO vo1 = voList.get(0);
+            vo.setId(vo1.getId());
             vo.setFormNumber(vo1.getFormNumber());
             vo.setFormName(vo1.getFormName());
             vo.setChangeTotal(vo1.getChangeTotal());
@@ -399,9 +420,7 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
         }
         str.append(contractMeterPeriod.getPeriodNumber()+"-");
         //获取流水号:当前合同段存在的当前计量期的申请单总数+1
-        long count = this.count(new LambdaQueryWrapper<MiddleMeterApply>()
-                .eq(MiddleMeterApply::getContractId, apply.getContractId())
-                .eq(MiddleMeterApply::getContractPeriodId,apply.getContractPeriodId()));
+        Integer count = baseMapper.getAllAPPly(apply.getContractId(),apply.getContractPeriodId());
         str.append(count+1);
         return str.toString();
     }
@@ -413,4 +432,37 @@ public class MiddleMeterApplyServiceImpl extends BaseServiceImpl<MiddleMeterAppl
     public BigDecimal getCurrentMeterMoney(MiddleMeterApply middleMeterApply) {
         return baseMapper.getCurrentMeterMoney(middleMeterApply.getContractId(),middleMeterApply.getContractPeriodId());
     }
+
+    @Override
+    public String test() {
+        Long contractId = 1612329251049537537L;
+        //获取当前合同下所以计量单元
+        List<NodeSortVO> vos = baseMapper.getAllNode(contractId);
+        //转换为树
+        Long l1 = System.currentTimeMillis();
+        List<NodeSortVO> list = ForestNodeMerger.merge(vos);
+        Long l2 = System.currentTimeMillis();
+        System.out.println("----------------------");
+        System.out.println(l2-l1);
+        //递归循环树,存在子节点就深入,不存在子节点就add后返回上一层
+        List<Long> ids = new ArrayList<>();
+        Long l3 = System.currentTimeMillis();
+        gatherSortNode(list,ids);
+        Long l4 = System.currentTimeMillis();
+        System.out.println("---------------");
+        System.out.println(l4-l3);
+        return "";
+    }
+
+    //递归方法
+    private void gatherSortNode(List<NodeSortVO> list,List<Long> ids){
+        for (NodeSortVO vo : list) {
+            if (vo.getChildren().size() == 0){
+                ids.add(vo.getId());
+                continue;
+            }else {
+                gatherSortNode(vo.getChildren(), ids);
+            }
+        }
+    }
 }