ソースを参照

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

yangyj 1 年間 前
コミット
d913898aab

+ 51 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/enums/StorageTypeEnum.java

@@ -0,0 +1,51 @@
+package org.springblade.manager.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.springblade.core.tool.utils.ObjectUtil;
+
+/**
+ * 储存类型枚举
+ * @author xingqianji
+ */
+@Getter
+@AllArgsConstructor
+public enum StorageTypeEnum {
+
+    UNKNOWN(-1, ""),
+    ORDINARY(1, "普通"),
+    AS_BUILT_DRAWINGS(2, "竣工图"),
+    METERING(3, "计量"),
+    QUALITY_INSPECTION(4, "质检"),
+    SOUND_IMAGE(5, "声像"),
+    TRIAL(6, "试验"),
+    HIDE(7, "隐蔽"),
+    MANAGE_FILES(8, "管理文件"),
+    CHANGE_ORDER(9, "变更令");
+
+    /**
+     * 编码
+     */
+    private Integer code;
+
+    /**
+     * 描述
+     */
+    private String desc;
+
+    /**
+     * 根据编码获取枚举描述
+     */
+    public static String getByCode(int code) {
+        // 判断code
+        if(ObjectUtil.isNotEmpty(code)){
+            for (StorageTypeEnum storageTypeEnum : StorageTypeEnum.values()) {
+                if (storageTypeEnum.getCode() == code) {
+                    return storageTypeEnum.getDesc();
+                }
+            }
+        }
+        return StorageTypeEnum.UNKNOWN.getDesc();
+    }
+
+}

+ 5 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/AttachmentFormTask.java

@@ -48,6 +48,11 @@ public class AttachmentFormTask extends BaseEntity {
      */
     @ApiModelProperty(value = "附件pdf地址")
     private String filePdfUrl;
+    /**
+     * 中间计量申请专用字段 1中间计量附件,2变更令附件
+     */
+    @ApiModelProperty(value = "中间计量申请专用字段 1中间计量附件,2变更令附件")
+    private Integer fileType;
 
 
 }

+ 5 - 0
blade-service-api/blade-meter-api/src/main/java/org/springblade/meter/entity/MiddleMeterApplyTask.java

@@ -87,6 +87,11 @@ public class MiddleMeterApplyTask extends BaseEntity {
      */
     @ApiModelProperty(value = "变更令编号")
     private String changeTokenNumber;
+    /**
+     * 变更令id
+     */
+    @ApiModelProperty(value = "变更令id,逗号拼接")
+    private String changeTokenIds;
     /**
      * 图片地址
      */

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

@@ -10,4 +10,7 @@ public class MiddleMeterApplyTaskVO extends MiddleMeterApplyTask {
     @ApiModelProperty(value = "是否已批注,1=是,0=否")
     private Integer isComment;
 
+    @ApiModelProperty(value = "合同计量期名称")
+    private String contractPeriodIdName;
+
 }

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

@@ -1089,7 +1089,7 @@ public class InformationWriteQueryController extends BladeController {
                         /*修改任务副表u_task_parallel全部废除*/
                         List<Long> collect = linkList.stream().map(TaskParallel::getId).collect(Collectors.toList());
                         if (collect.size() > 0) {
-                            jdbcTemplate.execute("UPDATE u_task_parallel SET status = 3 WHERE id in(" + StringUtils.join(collect, ",") + ")");
+                            jdbcTemplate.execute("UPDATE u_task_parallel SET status = 3,e_visa_content = '废除成功' WHERE id in(" + StringUtils.join(collect, ",") + ")");
                         }
 
                         for (InformationQuery query : queries) {
@@ -1134,7 +1134,7 @@ public class InformationWriteQueryController extends BladeController {
                                 }
                             }
 
-                            if (linkList != null && linkList.size() > 0) {
+                            if (linkList.size() > 0) {
                                 ProjectInfo projectInfo = this.projectClient.queryProjectList(Func.toStrList(task.getProjectId())).get(0);
                                 ContractInfo contractInfo = this.contractClient.getContractById(Long.parseLong(task.getContractId()));
 

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

@@ -22,7 +22,7 @@
     </resultMap>
 
     <select id="queryApprovalUser" resultMap="taskParallelResultMap">
-        select task_user, task_user_name, e_visa_status, status
+        select task_user, task_user_name, e_visa_status, status, update_time
         from u_task_parallel
         where process_instance_id =
               #{processInstanceId}

+ 5 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/ITaskService.java

@@ -99,4 +99,9 @@ public interface ITaskService extends BaseService<Task> {
 
     @Async
     void reSigningEVisa(String classify, String taskIds, String contractId, String projectId, String header);
+
+    /**
+     * 根据数据源id查询任务
+     */
+    Task getTaskByFormDataId(String formDataId);
 }

+ 125 - 9
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/MetadataClassificationServiceImpl.java

@@ -3,36 +3,42 @@ package org.springblade.business.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.AllArgsConstructor;
-
+import org.apache.commons.lang.StringUtils;
 import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.archive.feign.ArchiveAutoClient;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.entity.MetadataClassification;
+import org.springblade.business.entity.Task;
+import org.springblade.business.entity.TaskParallel;
 import org.springblade.business.mapper.MetadataClassificationMapper;
 import org.springblade.business.service.IArchiveFileService;
 import org.springblade.business.service.IMetadataClassificationService;
-
+import org.springblade.business.service.ITaskParallelService;
+import org.springblade.business.service.ITaskService;
 import org.springblade.business.vo.MetadataClassificationVO;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.constant.BladeConstant;
-import org.springblade.core.tool.utils.BeanUtil;
-import org.springblade.core.tool.utils.DateUtil;
-import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.core.tool.utils.*;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.enums.StorageTypeEnum;
 import org.springblade.manager.feign.ArchiveTreeContractClient;
 import org.springblade.manager.feign.ContractClient;
-import org.springblade.manager.vo.WbsTreeVO;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
+import org.springblade.system.feign.ISysClient;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
 import org.springframework.dao.DataAccessException;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 @AllArgsConstructor
@@ -46,6 +52,15 @@ public class MetadataClassificationServiceImpl
     private final JdbcTemplate jdbcTemplate;
     private final IDictBizClient iDictBizClient;
 
+    private final ITaskService iTaskService;
+
+    private final ITaskParallelService iTaskParallelService;
+
+    private final IUserClient iUserClient;
+
+    private final ISysClient iSysClient;
+
+
     @Override
     public MetadataClassification classificationDetail(Integer type) {
         return baseMapper.classificationDetail(type);
@@ -276,7 +291,20 @@ public class MetadataClassificationServiceImpl
             List<ArchiveTreeContract> list = archiveTreeContractClient.getArchiveTreeContractListByIds(ancestors);
             StringBuffer paperAddress= new StringBuffer();
             StringBuffer nameStr = new StringBuffer();
+            // 单位工程
+            StringBuffer unitProjectString = new StringBuffer();
+            // 单位工程编码
+            StringBuffer unitProjectIdString = new StringBuffer();
+            // 分部工程
+            StringBuffer divisionProjectString = new StringBuffer();
+            // 分部工程编码
+            StringBuffer divisionProjectIdString = new StringBuffer();
+            // 分项工程
+            StringBuffer itemizedProjectString = new StringBuffer();
+            // 分项工程编码
+            StringBuffer itemizedProjectIdString = new StringBuffer();
             for (int i = 0 ;i<list.size();i++) {
+                metadataSetting(list.get(i), unitProjectString, unitProjectIdString, divisionProjectString, divisionProjectIdString, itemizedProjectString, itemizedProjectIdString);
                 if(i == 0){
                     continue;
                 }
@@ -310,7 +338,7 @@ public class MetadataClassificationServiceImpl
             keyValue.put("元数据目录文件", nameStr.toString());
 
             /**电子文件号**/
-//            keyValue.put("电子文件号", byId.getFilePage());
+            keyValue.put("电子文件号", fileId);
 
             /**文件页数**/
             keyValue.put("文件页数", byId.getFilePage());
@@ -346,14 +374,14 @@ public class MetadataClassificationServiceImpl
                 keyValue.put("文件件数",archivesAuto.getFileN());
 
                 /**验证码**/
-//                keyValue.put("验证码",archivesAuto.getFileN());
+                keyValue.put("验证码",archivesAuto.getId());
             }
 
 
             /**文号**/
             keyValue.put("文号", byId.getFileNumber());
             /**表单标识码**/
-//            keyValue.put("表单标识码", byId.getFileNumber());
+//            keyValue.put("表单标识码", fileId);
 
             /**主题**/
             keyValue.put("主题", byId.getFileName());
@@ -403,8 +431,63 @@ public class MetadataClassificationServiceImpl
                 keyValue.put("引用变更令 编号", byId.getCiteChangeNumber());
             }
 
+            /**业务事项**/
+            keyValue.put("业务事项", StorageTypeEnum.getByCode(archiveTreeContractById.getStorageType()));
+            /**单位工程**/
+            keyValue.put("单位工程", StringUtils.isNotBlank(unitProjectString.toString()) ? unitProjectString.substring(0, unitProjectString.length()-1) : null);
+            /**单位工程编码**/
+            keyValue.put("单位工程编码", StringUtils.isNotBlank(unitProjectIdString.toString()) ? unitProjectIdString.substring(0, unitProjectIdString.length()-1) : null);
+            /**分部工程**/
+            keyValue.put("分部工程", StringUtils.isNotBlank(divisionProjectString.toString()) ? divisionProjectString.substring(0, divisionProjectString.length()-1) : null);
+            /**分部工程编码**/
+            keyValue.put("分部工程编码", StringUtils.isNotBlank(divisionProjectIdString.toString()) ? divisionProjectIdString.substring(0, divisionProjectIdString.length()-1) : null);
+            /**分项工程**/
+            keyValue.put("分项工程", StringUtils.isNotBlank(itemizedProjectString.toString()) ? itemizedProjectString.substring(0, itemizedProjectString.length()-1) : null);
+            /**分项工程编码**/
+            keyValue.put("分项工程编码", StringUtils.isNotBlank(itemizedProjectIdString.toString()) ? itemizedProjectIdString.substring(0, itemizedProjectIdString.length()-1) : null);
+
             /**责任者名称**/
             keyValue.put("责任者名称", byId.getDutyUser());
+            /**关系**/
+            keyValue.put("关系", "引用");
+
+            // 获取签名信息
+            Task task = iTaskService.getTaskByFormDataId(byId.getId().toString());
+            if(ObjectUtil.isNotEmpty(task)){
+                // 拿到processInstanceId,查询电签信息
+                List<TaskParallel> taskParallelList = iTaskParallelService.queryApprovalUser(task.getProcessInstanceId());
+                taskParallelList = taskParallelList.stream().filter(taskParallel -> taskParallel.getEVisaStatus() == 1).collect(Collectors.toList());
+                if(CollectionUtil.isNotEmpty(taskParallelList)){
+                    // 签名者
+                    StringBuffer nameString = new StringBuffer();
+                    // 签名时间
+                    StringBuffer dateString = new StringBuffer();
+                    // 用户id集合
+                    List<Long> userIdList = new ArrayList<>();
+                    for (TaskParallel taskParallel : taskParallelList) {
+                        nameString.append(taskParallel.getTaskUserName());
+                        nameString.append("、");
+                        dateString.append(taskParallel.getUpdateTime());
+                        dateString.append("、");
+                        userIdList.add(Long.valueOf(task.getTaskUser()));
+                    }
+                    // 查询用户
+                    List<User> userList = iUserClient.userInfoByIds(userIdList);
+                    // 岗位id集合
+                    List<String> postIds = userList.stream().map(User::getPostId).collect(Collectors.toList());
+                    R<List<String>> postNames = iSysClient.getPostNames(Func.join(postIds));
+                    if(postNames.getCode() == 200){
+                        /**签名项**/
+                        keyValue.put("签名项", Func.join(postNames.getData()));
+                    }
+                    /**签名者**/
+                    keyValue.put("签名者", StringUtils.isNotBlank(nameString.toString()) ? nameString.substring(0, nameString.length()-1) : null);
+                    /**签名时间**/
+                    keyValue.put("签名时间", StringUtils.isNotBlank(dateString.toString()) ? dateString.substring(0, nameString.length()-1) : null);
+                }
+            }
+
+            // 更新判断
             if (isAdd) {
                 sqlBuild.append("insert into u_metadata_file ");
                 for (MetadataClassification key : metadataClassifications) {
@@ -440,7 +523,40 @@ public class MetadataClassificationServiceImpl
                 sqlBuild.append(" update_time = '" + DateUtil.formatDateTime(new Date()) + "' ");
                 sqlBuild.append(" where id = " + metadataMap.get("id"));
             }
+            System.out.println(sqlBuild.toString().replaceAll("\\\\",""));
             jdbcTemplate.execute(sqlBuild.toString().replaceAll("\\\\",""));
         }
     }
+
+    /**
+     * 元数据-M56-M61数据设置
+     */
+    private void metadataSetting(ArchiveTreeContract archiveTreeContract,
+                                 StringBuffer unitProjectString,
+                                 StringBuffer unitProjectIdString,
+                                 StringBuffer divisionProjectString,
+                                 StringBuffer divisionProjectIdString,
+                                 StringBuffer itemizedProjectString,
+                                 StringBuffer itemizedProjectIdString){
+        // 判断archiveTreeContract中displayHierarchy属性值
+        String displayHierarchy = archiveTreeContract.getDisplayHierarchy();
+        String nodeName = archiveTreeContract.getNodeName();
+        Long id = archiveTreeContract.getId();
+        if(displayHierarchy.equals("1")){// 单位工程
+            unitProjectString.append(nodeName);
+            unitProjectString.append("/");
+            unitProjectIdString.append(id);
+            unitProjectIdString.append("/");
+        }else if(displayHierarchy.equals("2")){// 分部工程
+            divisionProjectString.append(nodeName);
+            divisionProjectString.append("/");
+            divisionProjectIdString.append(id);
+            divisionProjectIdString.append("/");
+        }else if(displayHierarchy.equals("4")){// 分项工程
+            itemizedProjectString.append(nodeName);
+            itemizedProjectString.append("/");
+            itemizedProjectIdString.append(id);
+            itemizedProjectIdString.append("/");
+        }
+    }
 }

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

@@ -580,7 +580,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
     }
 
 
-    @Scheduled(cron = "0 */1 * * * ?")
+    //@Scheduled(cron = "0 */1 * * * ?")
     public void SignInfo() {
         //执行代码
         logger.debug("扫描开始");
@@ -1467,4 +1467,11 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
         return excelTabClient.synPDFInfo(contractId, nodePKeyIds, classify, projectId, header);
     }
 
+    @Override
+    public Task getTaskByFormDataId(String formDataId) {
+        return getOne(Wrappers.<Task>lambdaQuery()
+                .eq(Task::getIsDeleted, 0)
+                .eq(Task::getFormDataId, formDataId));
+    }
+
 }

+ 169 - 31
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -221,30 +221,30 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
 
     @Override
     public IPage<TreeNodeVOByTabType> tabTypeLazyTreeAll(IPage<TreeNodeVOByTabType> page, Long parentId, String titleName, Boolean hasPartFormula) {
-        boolean base=false;
-        if(hasPartFormula==null){
-            hasPartFormula=true;
+        boolean base = false;
+        if (hasPartFormula == null) {
+            hasPartFormula = true;
         }
         if ((parentId + "").equals("12345678910")) {
             page.setSize(100);
-            base=true;
+            base = true;
         }
-        List<TreeNodeVOByTabType>data ;
-        if(SelectorModel.ID.equals(parentId)){
-             data =this.baseList();
-        }else{
-             data= baseMapper.tabTypeLazyTreeAll(page, parentId, titleName);
+        List<TreeNodeVOByTabType> data;
+        if (SelectorModel.ID.equals(parentId)) {
+            data = this.baseList();
+        } else {
+            data = baseMapper.tabTypeLazyTreeAll(page, parentId, titleName);
         }
-        addBase(data,base);
-        if(base&&!hasPartFormula){
-            data.removeIf(e->e.getId()!=20&&!e.getId().equals(SelectorModel.ID));
+        addBase(data, base);
+        if (base && !hasPartFormula) {
+            data.removeIf(e -> e.getId() != 20 && !e.getId().equals(SelectorModel.ID));
         }
         return page.setRecords(data);
     }
 
 
-    public void addBase(List<TreeNodeVOByTabType> data,Boolean base){
-        if(base){
+    public void addBase(List<TreeNodeVOByTabType> data, Boolean base) {
+        if (base) {
             TreeNodeVOByTabType baseInfo = new TreeNodeVOByTabType();
             baseInfo.setTitle(SelectorModel.NODE_NAME);
             /*baseInfo.setPrimaryKeyId("BASIN");*/
@@ -254,11 +254,12 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             data.add(baseInfo);
         }
     }
-    public  List<TreeNodeVOByTabType> baseList(){
-        Map<String,String[]> titleMap = new HashMap<>();
-        titleMap.put(BaseInfo.TBN_CH,new String[]{BaseInfo.TBN,BaseInfo.ID});
-        titleMap.put(MeterPeriodInfo.TBN_CH,new String[]{MeterPeriodInfo.TBN,MeterPeriodInfo.ID});
-        return titleMap.entrySet().stream().map(kv->{
+
+    public List<TreeNodeVOByTabType> baseList() {
+        Map<String, String[]> titleMap = new HashMap<>();
+        titleMap.put(BaseInfo.TBN_CH, new String[]{BaseInfo.TBN, BaseInfo.ID});
+        titleMap.put(MeterPeriodInfo.TBN_CH, new String[]{MeterPeriodInfo.TBN, MeterPeriodInfo.ID});
+        return titleMap.entrySet().stream().map(kv -> {
             TreeNodeVOByTabType tn = new TreeNodeVOByTabType();
             tn.setTitle(kv.getKey());
             tn.setTabType(SelectorModel.NODE_NAME);
@@ -1415,16 +1416,17 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             //获取当前节点对应节点信息
             WbsTreePrivate wbsTreePrivate = baseMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, primaryKeyId));
             //获取项目信息
-            ProjectInfo projectInfo = projectInfoMapper.selectOne(Wrappers.<ProjectInfo>lambdaQuery().select(ProjectInfo::getReferenceWbsTemplateType, ProjectInfo::getReferenceWbsTemplateTypeTrial).eq(ProjectInfo::getId, wbsTreePrivate.getProjectId()));
+            ProjectInfo projectInfo = projectInfoMapper.selectOne(Wrappers.<ProjectInfo>lambdaQuery().eq(ProjectInfo::getId, wbsTreePrivate.getProjectId()));
             //结果集
             List<WbsTreePrivate> insertDataPrivateList = new ArrayList<>();
             List<WbsTreeContract> insertDataContractList = new ArrayList<>();
 
             if (("1").equals(wbsTreePrivate.getWbsType())) {
                 if (("public").equals(projectInfo.getReferenceWbsTemplateType())) {
-                    /*TODO-------------------------------------质检公有引用同步--------------------------------------------*/
+                    /*-------------------------------------质检公有引用同步--------------------------------------------*/
                     //获取当前节点对应的公有引用树下的元素表
                     WbsTree wbsTree = wbsTreeMapper.selectOne(Wrappers.<WbsTree>lambdaQuery().select(WbsTree::getAncestors, WbsTree::getWbsId, WbsTree::getId).eq(WbsTree::getId, wbsTreePrivate.getId()));
+
                     List<WbsTree> wbsTreesPublicTables;
                     if (wbsTree.getAncestors().equals("0")) {
                         //根节点
@@ -1485,11 +1487,10 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     }
 
                 } else if (("private").equals(projectInfo.getReferenceWbsTemplateType())) {
-                    /*TODO-------------------------------------质检私有引用同步--------------------------------------------*/
+                    /*-------------------------------------质检私有引用同步--------------------------------------------*/
                     //根据wbsTreePrivate的wbsId=私有引用的pKeyId来获取引用树根节点
-                    WbsTreePrivate wbsTreePrivateRoot = baseMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery()
-                            .select(WbsTreePrivate::getWbsId, WbsTreePrivate::getProjectId)
-                            .eq(WbsTreePrivate::getPKeyId, wbsTreePrivate.getWbsId()));
+                    WbsTreePrivate wbsTreePrivateRoot = baseMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, wbsTreePrivate.getWbsId()));
+
                     //获取当前私有引用树的元素表信息
                     List<WbsTreePrivate> wbsTreePrivateRootTables;
                     if (wbsTreePrivate.getAncestors().equals("0")) {
@@ -1549,12 +1550,14 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     }
                 }
             }
+
             if (("2").equals(wbsTreePrivate.getWbsType())) {
                 if (("public").equals(projectInfo.getReferenceWbsTemplateTypeTrial())) {
-                    /*TODO-------------------------------------试验公有引用同步--------------------------------------------*/
+                    /*-------------------------------------试验公有引用同步--------------------------------------------*/
                     //获取当前节点对应的公有引用树下的元素表
                     WbsTree wbsTree = wbsTreeMapper.selectOne(Wrappers.<WbsTree>lambdaQuery().eq(WbsTree::getId, wbsTreePrivate.getId()));
                     List<WbsTree> wbsTreesPublicTables;
+
                     if (wbsTree.getAncestors().equals("0")) {
                         //根节点
                         wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery()
@@ -1613,9 +1616,10 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     }
 
                 } else if (("private").equals(projectInfo.getReferenceWbsTemplateTypeTrial())) {
-                    /*TODO-------------------------------------试验私有引用同步--------------------------------------------*/
+                    /*-------------------------------------试验私有引用同步--------------------------------------------*/
                     //根据wbsTreePrivate的wbsId=私有引用的pKeyId来获取引用树根节点
                     WbsTreePrivate wbsTreePrivateRoot = baseMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, wbsTreePrivate.getWbsId()));
+
                     //获取当前私有引用树的元素表信息
                     List<WbsTreePrivate> wbsTreePrivateRootTables;
                     if (wbsTreePrivate.getAncestors().equals("0")) {
@@ -1676,6 +1680,134 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                 }
             }
 
+            if (("3").equals(wbsTreePrivate.getWbsType())) {
+                if (("public").equals(projectInfo.getReferenceWbsTemplateTypeMeter())) {
+                    /*-------------------------------------计量公有引用同步--------------------------------------------*/
+                    //获取当前节点对应的公有引用树下的元素表
+                    WbsTree wbsTree = wbsTreeMapper.selectOne(Wrappers.<WbsTree>lambdaQuery().eq(WbsTree::getId, wbsTreePrivate.getId()));
+                    List<WbsTree> wbsTreesPublicTables;
+                    if (wbsTree.getAncestors().equals("0")) {
+                        //根节点
+                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
+                                        .select(WbsTree::getId, WbsTree::getParentId)
+                                        .eq(WbsTree::getWbsId, wbsTree.getWbsId()).eq(WbsTree::getType, 2)
+                                /*.eq(WbsTree::getStatus,1)*/
+                        );
+                    } else {
+                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
+                                .select(WbsTree::getId, WbsTree::getParentId)
+                                .eq(WbsTree::getWbsId, wbsTree.getWbsId()).eq(WbsTree::getType, 2)
+                                /*.eq(WbsTree::getStatus,1)*/
+                                .like(WbsTree::getAncestors, wbsTree.getId()));
+                    }
+
+                    //获取当前项目树下的元素表 节点
+                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestors)
+                                    .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                                    .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
+                            /*.eq(WbsTreePrivate::getStatus, 1)*/
+                    );
+                    List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
+
+                    List<WbsTreePrivate> wbsTreePrivatesProjectTables;
+                    if (wbsTreePrivate.getAncestors().equals("0")) {
+                        //根节点
+                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
+                    } else {
+                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestors().contains(String.valueOf(wbsTreePrivate.getId()))).collect(Collectors.toList());
+                    }
+
+                    //获取新增的公有元素表addPublicTable
+                    List<WbsTree> addPublicTable = wbsTreesPublicTables.stream().filter(f ->
+                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId())).collect(Collectors.toList());
+
+                    //判断当前新增的表在项目的wbs树中是否存在上级节点,存在表示可以新增,不存在表示不新增
+                    List<WbsTree> addPublicTables = addPublicTable.stream().filter(node ->
+                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
+
+                    //构造
+                    List<Long> ids = addPublicTables.stream().map(WbsTree::getId).collect(Collectors.toList());
+                    if (ids.size() > 0) {
+                        List<WbsTree> resultDataList = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery().in(WbsTree::getId, ids));
+                        for (WbsTree tree : resultDataList) {
+                            WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
+                            if (dataPrivate != null) {
+                                dataPrivate.setPKeyId(SnowFlakeUtil.getId());
+                                dataPrivate.setWbsType(wbsTreePrivate.getWbsType());
+                                dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
+                                dataPrivate.setFullName(dataPrivate.getNodeName());
+                                dataPrivate.setInitTableId(tree.getInitTableId().toString());
+                                insertDataPrivateList.add(dataPrivate);//新增
+                            }
+                        }
+                    }
+
+                } else if (("private").equals(projectInfo.getReferenceWbsTemplateTypeMeter())) {
+                    /*-------------------------------------计量私有引用同步--------------------------------------------*/
+                    //根据wbsTreePrivate的wbsId=私有引用的pKeyId来获取引用树根节点
+                    WbsTreePrivate wbsTreePrivateRoot = baseMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, wbsTreePrivate.getWbsId()));
+
+                    //获取当前私有引用树的元素表信息
+                    List<WbsTreePrivate> wbsTreePrivateRootTables;
+                    if (wbsTreePrivate.getAncestors().equals("0")) {
+                        //根节点
+                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                                        .select(WbsTreePrivate::getId, WbsTreePrivate::getParentId, WbsTreePrivate::getPKeyId)
+                                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2)
+                                /*.eq(WbsTreePrivate::getStatus, 1)*/
+                        );
+                    } else {
+                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                                .select(WbsTreePrivate::getId, WbsTreePrivate::getParentId, WbsTreePrivate::getPKeyId)
+                                .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2)
+                                /*.eq(WbsTreePrivate::getStatus, 1)*/
+                                .like(WbsTreePrivate::getAncestors, wbsTreePrivate.getId()));
+                    }
+
+                    //获取当前项目选择的节点下的所有元素表 节点
+                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestors)
+                                    .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
+                            /*.eq(WbsTreePrivate::getStatus, 1)*/
+                    );
+
+                    List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
+                    List<WbsTreePrivate> wbsTreePrivatesProjectTables;
+                    if (wbsTreePrivate.getAncestors().equals("0")) {
+                        //根节点
+                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
+                    } else {
+                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestors().contains(String.valueOf(wbsTreePrivate.getId()))).collect(Collectors.toList());
+                    }
+
+                    //获取新增的私有元素表addPrivateTable
+                    List<WbsTreePrivate> addPrivateTable = wbsTreePrivateRootTables.stream().filter(f ->
+                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId())).collect(Collectors.toList());
+
+                    //判断当前新增的表在私有wbs中是否存在上级节点,存在表示可以新增,不存在表示不新增
+                    List<WbsTreePrivate> addPrivateTables = addPrivateTable.stream().filter(node ->
+                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
+
+                    //构造
+                    List<Long> ids = addPrivateTables.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
+                    if (ids.size() > 0) {
+                        List<WbsTreePrivate> resultDataList = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().in(WbsTreePrivate::getPKeyId, ids));
+                        for (WbsTreePrivate tree : resultDataList) {
+                            WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
+                            if (dataPrivate != null) {
+                                dataPrivate.setPKeyId(SnowFlakeUtil.getId());
+                                dataPrivate.setWbsId(wbsTreePrivate.getWbsId());
+                                dataPrivate.setWbsType(tree.getWbsType());
+                                dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
+                                dataPrivate.setInitTableId(tree.getInitTableId());
+                                insertDataPrivateList.add(dataPrivate);
+                            }
+                        }
+                    }
+                }
+            }
+
             //新增同步到项目
             if (!insertDataPrivateList.isEmpty()) {
                 List<List<WbsTreePrivate>> partition = Lists.partition(insertDataPrivateList, 1000);
@@ -1706,6 +1838,9 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                                 wbsTreeContract.setIsBussShow(1);
                                 wbsTreeContract.setIsDeleted(0);
                                 wbsTreeContract.setStatus(1);
+
+                                wbsTreeContract.setIsTypePrivatePid(wbsTreeContract.getPKeyId()); //记录原始表的pKeyId
+
                                 wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
                                 wbsTreeContract.setParentId(addOrCopyOrYsNode.getId());
                                 wbsTreeContract.setContractId(addOrCopyOrYsNode.getContractId());
@@ -1721,6 +1856,9 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                                 wbsTreeContract.setIsBussShow(1);
                                 wbsTreeContract.setIsDeleted(0);
                                 wbsTreeContract.setStatus(1);
+
+                                wbsTreeContract.setIsTypePrivatePid(wbsTreeContract.getPKeyId()); //记录原始表的pKeyId
+
                                 wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
                                 wbsTreeContract.setParentId(addOrCopyOrYsNode.getId());
                                 wbsTreeContract.setContractId(addOrCopyOrYsNode.getContractId());
@@ -2422,10 +2560,10 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         return true;
     }
 
-    public Boolean hasPart(String id){
-        if(Func.isNotBlank(id)) {
-            List<Map<String,Object>> mapList =this.jdbcTemplate.queryForList("select a.id from m_wbs_tree a join m_wbs_info b on a.wbs_id=b.id where a.id="+id+"  and b.wbs_type=3  union  select p_key_id from m_wbs_tree_private where p_key_id ="+id+" and wbs_type =3");
-            return mapList.size()==0;
+    public Boolean hasPart(String id) {
+        if (Func.isNotBlank(id)) {
+            List<Map<String, Object>> mapList = this.jdbcTemplate.queryForList("select a.id from m_wbs_tree a join m_wbs_info b on a.wbs_id=b.id where a.id=" + id + "  and b.wbs_type=3  union  select p_key_id from m_wbs_tree_private where p_key_id =" + id + " and wbs_type =3");
+            return mapList.size() == 0;
         }
         return true;
     }

+ 89 - 12
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/MidPayItemController.java

@@ -153,21 +153,51 @@ public class MidPayItemController extends BladeController {
     @PostMapping("/system/list")
     @ApiOperationSupport(order = 5)
     @ApiOperation(value = "系统中期支付项列表", notes = "传入项目id、选择的recordId(系统级id)")
-    public R<List<MeterMidPayItemSystem>> systemList(@RequestParam String projectId, String recordId) {
+    public R<List<MeterMidPayItemSystemVO>> systemList(@RequestParam String projectId, String recordId) {
+        Map<String, String> meterPayTypeMap = jdbcTemplate.query("SELECT dict_key,dict_value FROM blade_dict WHERE is_deleted = 0 AND code = 'meter_pay_type'", new BeanPropertyRowMapper<>(Dict.class)).stream().collect(Collectors.toMap(Dict::getDictKey, Dict::getDictValue));
+        Map<String, String> meterPayAppTypeMap = jdbcTemplate.query("SELECT dict_key,dict_value FROM blade_dict WHERE is_deleted = 0 AND code = 'meter_pay_applicable_type'", new BeanPropertyRowMapper<>(Dict.class)).stream().collect(Collectors.toMap(Dict::getDictKey, Dict::getDictValue));
+
         /*后管添加汇总项*/
         if (ObjectUtil.isNotEmpty(recordId) && ObjectUtil.isNotEmpty(projectId)) {
-            List<MeterMidPayItemSystem> meterMidPayItemSystems = payItemSystemService.getBaseMapper().selectList(Wrappers.<MeterMidPayItemSystem>lambdaQuery()
-                    .ne(MeterMidPayItemSystem::getId, recordId)
-                    .orderByAsc(MeterMidPayItemSystem::getCreateTime)).stream().sorted(
+            List<MeterMidPayItemRelation> relationList = jdbcTemplate.query("SELECT * FROM s_meter_mid_pay_item_relation WHERE mid_pay_id = " + recordId, new BeanPropertyRowMapper<>(MeterMidPayItemRelation.class));
+            Map<Long, MeterMidPayItemRelation> collect = relationList.stream().collect(Collectors.toMap(MeterMidPayItemRelation::getMidPayIdRelation, Function.identity()));
+
+            List<MeterMidPayItemSystemVO> meterMidPayItemSystems = payItemSystemService.getBaseMapper().selectList(Wrappers.<MeterMidPayItemSystem>lambdaQuery()
+                    .orderByAsc(MeterMidPayItemSystem::getCreateTime)).stream().map(system -> {
+                MeterMidPayItemSystemVO vo = new MeterMidPayItemSystemVO();
+                BeanUtil.copyProperties(system, vo);
+
+                /*剔除本身*/
+                if (ObjectUtil.isNotEmpty(recordId) && recordId.equals(vo.getId().toString())) {
+                    return null;
+                }
+
+                /*剔除已引用过的*/
+                if (collect.size() > 0) {
+                    MeterMidPayItemRelation orDefault = collect.getOrDefault(vo.getId(), null);
+                    if (orDefault != null) {
+                        return null;
+                    }
+                }
+
+                if (ObjectUtil.isNotEmpty(system.getPayApplicableType())) {
+                    vo.setPayApplicableTypeName(meterPayAppTypeMap.getOrDefault(system.getPayApplicableType().toString(), null));
+                }
+                if (ObjectUtil.isNotEmpty(system.getPayType())) {
+                    vo.setPayTypeName(meterPayTypeMap.getOrDefault(system.getPayType().toString(), null));
+                }
+                return vo;
+            }).sorted(
                     Comparator.nullsLast(
-                            Comparator.<MeterMidPayItemSystem, Integer>comparing(
+                            Comparator.<MeterMidPayItemSystemVO, Integer>comparing(
                                     systemVO -> {
                                         Integer sortValue = systemVO.getSort();
                                         return sortValue != null ? sortValue : Integer.MAX_VALUE;
                                     }))
                             .thenComparing(
-                                    Comparator.nullsLast(Comparator.comparing(MeterMidPayItemSystem::getCreateTime)))
-            ).collect(Collectors.toList());
+                                    Comparator.nullsLast(Comparator.comparing(MeterMidPayItemSystemVO::getCreateTime))))
+                    .filter(Objects::nonNull)
+                    .collect(Collectors.toList());
 
             return R.data(meterMidPayItemSystems);
         }
@@ -175,11 +205,54 @@ public class MidPayItemController extends BladeController {
         /*计量客户端项目引用系统*/
         List<MeterMidPayItemProject> meterMidPayItemProjects = payItemProjectService.getBaseMapper().selectList(Wrappers.<MeterMidPayItemProject>lambdaQuery().eq(MeterMidPayItemProject::getProjectId, projectId));
         List<Long> collect = meterMidPayItemProjects.stream().map(MeterMidPayItemProject::getDataSourceId).collect(Collectors.toList());
-        List<MeterMidPayItemSystem> meterMidPayItemSystems;
+        List<MeterMidPayItemSystemVO> meterMidPayItemSystems;
         if (collect.size() > 0) {
-            meterMidPayItemSystems = payItemSystemService.getBaseMapper().selectList(Wrappers.<MeterMidPayItemSystem>lambdaQuery().notIn(MeterMidPayItemSystem::getId, collect).orderByAsc(MeterMidPayItemSystem::getCreateTime));
+            meterMidPayItemSystems = payItemSystemService.getBaseMapper().selectList(Wrappers.<MeterMidPayItemSystem>lambdaQuery()
+                    .notIn(MeterMidPayItemSystem::getId, collect)
+                    .orderByAsc(MeterMidPayItemSystem::getCreateTime))
+                    .stream().map(system -> {
+                        MeterMidPayItemSystemVO vo = new MeterMidPayItemSystemVO();
+                        BeanUtil.copyProperties(system, vo);
+                        if (ObjectUtil.isNotEmpty(system.getPayApplicableType())) {
+                            vo.setPayApplicableTypeName(meterPayAppTypeMap.getOrDefault(system.getPayApplicableType().toString(), null));
+                        }
+                        if (ObjectUtil.isNotEmpty(system.getPayType())) {
+                            vo.setPayTypeName(meterPayTypeMap.getOrDefault(system.getPayType().toString(), null));
+                        }
+                        return vo;
+                    }).sorted(
+                            Comparator.nullsLast(
+                                    Comparator.<MeterMidPayItemSystemVO, Integer>comparing(
+                                            systemVO -> {
+                                                Integer sortValue = systemVO.getSort();
+                                                return sortValue != null ? sortValue : Integer.MAX_VALUE;
+                                            }))
+                                    .thenComparing(
+                                            Comparator.nullsLast(Comparator.comparing(MeterMidPayItemSystemVO::getCreateTime)))
+                    ).collect(Collectors.toList());
         } else {
-            meterMidPayItemSystems = payItemSystemService.getBaseMapper().selectList(Wrappers.<MeterMidPayItemSystem>lambdaQuery().orderByAsc(MeterMidPayItemSystem::getCreateTime));
+            meterMidPayItemSystems = payItemSystemService.getBaseMapper().selectList(Wrappers.<MeterMidPayItemSystem>lambdaQuery()
+                    .orderByAsc(MeterMidPayItemSystem::getCreateTime))
+                    .stream().map(system -> {
+                        MeterMidPayItemSystemVO vo = new MeterMidPayItemSystemVO();
+                        BeanUtil.copyProperties(system, vo);
+                        if (ObjectUtil.isNotEmpty(system.getPayApplicableType())) {
+                            vo.setPayApplicableTypeName(meterPayAppTypeMap.getOrDefault(system.getPayApplicableType().toString(), null));
+                        }
+                        if (ObjectUtil.isNotEmpty(system.getPayType())) {
+                            vo.setPayTypeName(meterPayTypeMap.getOrDefault(system.getPayType().toString(), null));
+                        }
+                        return vo;
+                    }).sorted(
+                            Comparator.nullsLast(
+                                    Comparator.<MeterMidPayItemSystemVO, Integer>comparing(
+                                            systemVO -> {
+                                                Integer sortValue = systemVO.getSort();
+                                                return sortValue != null ? sortValue : Integer.MAX_VALUE;
+                                            }))
+                                    .thenComparing(
+                                            Comparator.nullsLast(Comparator.comparing(MeterMidPayItemSystemVO::getCreateTime)))
+                    ).collect(Collectors.toList());
         }
         return R.data(meterMidPayItemSystems);
     }
@@ -418,8 +491,12 @@ public class MidPayItemController extends BladeController {
     @ApiOperation(value = "合同段中期支付项引用项目级数据", notes = "传入数据id逗号拼接ids、projectId、contractId")
     public R<Object> contractReferenced(@RequestParam String ids, @RequestParam Long projectId, @RequestParam Long contractId) {
         if (StringUtils.isNotEmpty(ids)) {
-            List<Long> projectIds = Func.toLongList(ids);
-            List<MeterMidPayItemProject> meterMidPayItemProjects = payItemProjectService.getBaseMapper().selectList(Wrappers.<MeterMidPayItemProject>lambdaQuery().in(MeterMidPayItemProject::getId, projectIds).orderByAsc(MeterMidPayItemProject::getCreateTime));
+            List<Long> projectDataIds = Func.toLongList(ids);
+            List<MeterMidPayItemProject> meterMidPayItemProjects = payItemProjectService.getBaseMapper().selectList(Wrappers.<MeterMidPayItemProject>lambdaQuery().in(MeterMidPayItemProject::getId, projectDataIds).orderByAsc(MeterMidPayItemProject::getCreateTime));
+
+            /*List<MeterMidPayItemRelation> meterMidPayItemProjectsRelation = jdbcTemplate.query("SELECT * FROM s_meter_mid_pay_item_relation WHERE mid_pay_id in(" + ids + ")", new BeanPropertyRowMapper<>(MeterMidPayItemRelation.class));
+            List<MeterMidPayItemContract> meterMidPayItemContractsRelation = new ArrayList<>();*/
+
             List<MeterMidPayItemContract> meterMidPayItemContracts = new ArrayList<>();
             for (MeterMidPayItemProject projectPay : meterMidPayItemProjects) {
                 MeterMidPayItemContract contractPay = BeanUtil.copyProperties(projectPay, MeterMidPayItemContract.class);

+ 202 - 48
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java

@@ -11,6 +11,7 @@ import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.time.DateUtils;
+import org.springblade.business.entity.FixedFlowLink;
 import org.springblade.business.entity.Task;
 import org.springblade.business.entity.TaskParallel;
 import org.springblade.business.feign.TaskClient;
@@ -27,6 +28,7 @@ import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.feign.ArchiveFileTaskClient;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.meter.dto.*;
@@ -59,6 +61,7 @@ public class TaskController extends BladeController {
     private final JdbcTemplate jdbcTemplate;
     private final BladeRedis bladeRedis;
     private final TaskClient taskClient;
+    private final ArchiveFileTaskClient archiveFileTaskClient;
     private final ContractMeterPeriodServiceImpl contractMeterPeriodService;
     private final MeterPeriodServiceImpl periodService;
     private final MiddleMeterApplyServiceImpl middleMeterApplyService;
@@ -120,7 +123,7 @@ public class TaskController extends BladeController {
 
     @PostMapping("/report")
     @ApiOperationSupport(order = 2)
-    @ApiOperation(value = "任务上报", notes = "(中期计量申请、材料计量单、开工预付款计量单)传入MeterApprovalDTO")
+    @ApiOperation(value = "任务上报", notes = "(中期计量申请、材料计量单、开工预付款计量单、变更令)传入MeterApprovalDTO")
     @PushMessage(clientId = ClientIdConstant.METER_CLIENT_ID)
     @Transactional(rollbackFor = Exception.class)
     public R<Object> approval(@RequestBody MeterApprovalDTO approvalDTO) {
@@ -153,6 +156,10 @@ public class TaskController extends BladeController {
                 List<MiddleMeterApply> middleMeterApplies = middleMeterApplyService.getBaseMapper().selectList(Wrappers.<MiddleMeterApply>lambdaQuery()
                         .eq(MiddleMeterApply::getContractPeriodId, approvalDTO.getPeriodId()));
 
+                if (middleMeterApplies.size() <= 0) {
+                    throw new ServiceException("当前期数不存在中间计量单,操作失败");
+                }
+
                 /*判断是否都是未上报、或已废除*/
                 long countMiddleMeterApplies = middleMeterApplies.stream().filter(f -> !Arrays.asList(0, 3).contains(f.getApproveStatus())).count();
                 if (countMiddleMeterApplies > 0) {
@@ -166,6 +173,10 @@ public class TaskController extends BladeController {
                         .eq(InventoryFormApply::getContractPeriodId, approvalDTO.getPeriodId()));
                 List<Long> inventoryFormAppliesIds = inventoryFormApplies.stream().map(InventoryFormApply::getId).collect(Collectors.toList());
 
+                if (inventoryFormAppliesIds.size() <= 0) {
+                    throw new ServiceException("当前期数不存在分解清单,操作失败");
+                }
+
                 /*判断是否都是未上报、或已废除*/
                 long countInventoryFormApplies = inventoryFormApplies.stream().filter(f -> !Arrays.asList(0, 3).contains(f.getApproveStatus())).count();
                 if (countInventoryFormApplies > 0) {
@@ -204,7 +215,7 @@ public class TaskController extends BladeController {
                     try {
                         this.buildTaskInfo(taskId, approvalDTO, aopParamsSet, 1);
                     } catch (Exception e) {
-                        throw new ServiceException("创建审批任务异常,操作失败");
+                        throw new ServiceException("创建审批任务异常,操作失败" + e.getMessage());
                     }
 
                     /*修改数据源状态为=待审批*/
@@ -237,6 +248,10 @@ public class TaskController extends BladeController {
                 List<MaterialMeterForm> materialMeterForms = materialMeterFormService.getBaseMapper().selectList(Wrappers.<MaterialMeterForm>lambdaQuery()
                         .eq(MaterialMeterForm::getMeterPeriodId, approvalDTO.getPeriodId()));
 
+                if (materialMeterForms.size() <= 0) {
+                    throw new ServiceException("当前期数不存在材料计量单,操作失败");
+                }
+
                 /*判断是否都是未上报、或已废除*/
                 long countMaterialMeterForms = materialMeterForms.stream().filter(f -> !Arrays.asList(0, 3).contains(f.getApproveStatus())).count();
                 if (countMaterialMeterForms > 0) {
@@ -270,7 +285,7 @@ public class TaskController extends BladeController {
                     try {
                         this.buildTaskInfo(taskId, approvalDTO, aopParamsSet, 2);
                     } catch (Exception e) {
-                        throw new ServiceException("创建审批任务异常,操作失败");
+                        throw new ServiceException("创建审批任务异常,操作失败" + e.getMessage());
                     }
 
                     /*修改数据源状态为=待审批*/
@@ -298,6 +313,10 @@ public class TaskController extends BladeController {
                 List<StartPayMeterForm> startPayMeterForms = startPayMeterFormService.getBaseMapper().selectList(Wrappers.<StartPayMeterForm>lambdaQuery()
                         .eq(StartPayMeterForm::getMeterPeriodId, approvalDTO.getPeriodId()));
 
+                if (startPayMeterForms.size() <= 0) {
+                    throw new ServiceException("当前期数不存在开工预付款计量单,操作失败");
+                }
+
                 /*判断是否都是未上报、或已废除*/
                 long countStartPayMeterForms = startPayMeterForms.stream().filter(f -> !Arrays.asList(0, 3).contains(f.getApproveStatus())).count();
                 if (countStartPayMeterForms > 0) {
@@ -331,7 +350,7 @@ public class TaskController extends BladeController {
                     try {
                         this.buildTaskInfo(taskId, approvalDTO, aopParamsSet, 3);
                     } catch (Exception e) {
-                        throw new ServiceException("创建审批任务异常,操作失败");
+                        throw new ServiceException("创建审批任务异常,操作失败" + e.getMessage());
                     }
 
                     /*修改数据源状态为=待审批*/
@@ -361,7 +380,7 @@ public class TaskController extends BladeController {
                     if (changeTokenForm != null) {
                         /*判断是否是未上报、或已废除*/
                         if (!Arrays.asList(0, 3).contains(changeTokenForm.getApproveStatus())) {
-                            throw new ServiceException("当前变更令已上报,操作失败");
+                            throw new ServiceException("【" + changeTokenForm.getChangeName() + "】变更令已上报,操作失败");
                         }
                         /*获取变更令下的计量单元部位信息*/
                         List<ChangeTokenMeter> changeTokenMeters = changeTokenMeterService.getBaseMapper().selectList(Wrappers.<ChangeTokenMeter>lambdaQuery().eq(ChangeTokenMeter::getChangeTokenId, changeTokenForm.getId()));
@@ -370,6 +389,10 @@ public class TaskController extends BladeController {
                             List<ChangeTokenInventory> changeTokenInventories = changeTokenInventoryService.getBaseMapper().selectList(Wrappers.<ChangeTokenInventory>lambdaQuery()
                                     .eq(ChangeTokenInventory::getChangeTokenId, changeTokenForm.getId()));
 
+                            if (changeTokenInventories.size() <= 0) {
+                                throw new ServiceException("【" + changeTokenForm.getChangeName() + "】变更令下不存在变更申请清单,操作失败");
+                            }
+
                             /*复制taskVO数据*/
                             ChangeTokenFormTask changeTokenFormTask = BeanUtil.copyProperties(changeTokenForm, ChangeTokenFormTask.class);
                             if (changeTokenFormTask != null) {
@@ -392,7 +415,7 @@ public class TaskController extends BladeController {
                                 try {
                                     this.buildTaskInfo(taskId, approvalDTO, aopParamsSet, 4);
                                 } catch (Exception e) {
-                                    throw new ServiceException("创建审批任务异常,操作失败");
+                                    throw new ServiceException("创建审批任务异常,操作失败" + e.getMessage());
                                 }
 
                                 /*修改变更令原始数据的审批状态=待审批*/
@@ -405,7 +428,11 @@ public class TaskController extends BladeController {
                                         .eq(ChangeTokenFormTask::getTaskId, taskId)
                                         .eq(ChangeTokenFormTask::getId, id));
                             }
+                        } else {
+                            throw new ServiceException("【" + changeTokenForm.getChangeName() + "】变更令下不存在变更申请部位,操作失败");
                         }
+                    } else {
+                        throw new ServiceException("未获取到当前变更令信息,操作失败");
                     }
                 }
                 return R.data(200, aopParamsSet, "操作成功");
@@ -423,8 +450,34 @@ public class TaskController extends BladeController {
      * @param meterTaskType
      */
     private void buildTaskInfo(Long taskId, MeterApprovalDTO approvalDTO, Set<String> aopParamsSet, Integer meterTaskType) {
+        /*预设流程*/
+        String resultString = "";
+        if (ObjectUtil.isNotEmpty(approvalDTO.getFixedFlowId())) {
+            List<FixedFlowLink> fixedFlowLinks = jdbcTemplate.query("select fixed_flow_link_user,fixed_flow_link_sort from u_fixed_flow_link where fixed_flow_id = " + approvalDTO.getFixedFlowId(), new BeanPropertyRowMapper<>(FixedFlowLink.class));
+            if (fixedFlowLinks.size() > 0) {
+                fixedFlowLinks.sort(Comparator.comparingInt(FixedFlowLink::getFixedFlowLinkSort));
+                StringBuilder sortStr = new StringBuilder();
+                for (FixedFlowLink link : fixedFlowLinks) {
+                    sortStr.append(link.getFixedFlowLinkUser()).append(",");
+                }
+                if (sortStr.length() > 0) {
+                    sortStr.deleteCharAt(sortStr.length() - 1);
+                }
+                resultString = sortStr.toString();
+            }
+        }
+        /*检查签字证书信息*/
+        if (ObjectUtil.isNotEmpty(resultString)) {
+            R<Object> objectR = archiveFileTaskClient.checkTaskUserCertificateInfo(resultString);
+            if (objectR.isSuccess()) {
+                approvalDTO.setTaskUserIds(resultString);
+            } else {
+                throw new ServiceException("预设流程任务人没有签字证书信息");
+            }
+        }
+
         if (ObjectUtil.isEmpty(approvalDTO.getTaskUserIds())) {
-            throw new ServiceException("未获取到任务人信息,操作失败");
+            throw new ServiceException("未获取到任务人信息");
         }
 
         /*主任务*/
@@ -683,7 +736,7 @@ public class TaskController extends BladeController {
 
                     Set<String> aopParamsSet = new HashSet<>();
                     for (String userId : taskParallelsUserIds) {
-                        String param = userId + "," + taskRepealDTO.getProjectId() + "," + taskRepealDTO.getContractId();
+                        String param = userId + "," + task.getProjectId() + "," + task.getContractId();
                         aopParamsSet.add(param);
                     }
                     return R.data(200, aopParamsSet, "操作成功");
@@ -1017,11 +1070,18 @@ public class TaskController extends BladeController {
         if (task != null) {
             if (task.getMeterTaskType().equals(1)) {
                 MiddleMeterApplyTask middleMeterApplyTask = middleMeterApplyServiceTask.getById(dataId);
-                vo.setBasicsInfo(middleMeterApplyTask);
-
-                /*清单信息*/
-                List<MeterInventoryVO> formToTask = middleMeterApplyMapper.getFormCopy(Long.parseLong(dataId), middleMeterApplyTask.getContractId(), middleMeterApplyTask.getContractUnitId());
-                vo.setAssociatedDataInfoList(formToTask);
+                MiddleMeterApplyTaskVO middleMeterApplyTaskVO = BeanUtil.copyProperties(middleMeterApplyTask, MiddleMeterApplyTaskVO.class);
+                if (middleMeterApplyTaskVO != null) {
+                    ContractMeterPeriod contractMeterPeriod = contractMeterPeriodService.getById(middleMeterApplyTaskVO.getContractPeriodId());
+                    if (contractMeterPeriod != null) {
+                        middleMeterApplyTaskVO.setContractPeriodIdName(contractMeterPeriod.getPeriodNumber());
+                        vo.setBasicsInfo(middleMeterApplyTaskVO);
+
+                        /*清单信息*/
+                        List<MeterInventoryVO> formToTask = middleMeterApplyMapper.getFormCopy(Long.parseLong(dataId), middleMeterApplyTask.getContractId(), middleMeterApplyTask.getContractUnitId());
+                        vo.setAssociatedDataInfoList(formToTask);
+                    }
+                }
 
             } else if (task.getMeterTaskType().equals(2)) {
                 MaterialMeterFormTask materialMeterFormTask = materialMeterFormServiceTask.getById(dataId);
@@ -1075,7 +1135,7 @@ public class TaskController extends BladeController {
         if (ObjectUtil.isEmpty(dto.getTaskId())) {
             throw new ServiceException("未获取到taskId");
         }
-        String sql = "SELECT meter_task_type,form_data_id,process_instance_id FROM u_task WHERE id = ?";
+        String sql = "SELECT meter_task_type,form_data_id,process_instance_id,contract_id,project_id FROM u_task WHERE id = ?";
         Task task = jdbcTemplate.query(sql, new Object[]{dto.getTaskId()}, new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
         if (task != null) {
             check(task);
@@ -1094,11 +1154,31 @@ public class TaskController extends BladeController {
 
                         BigDecimal updatedMeterMoney = meterMoney.subtract(result); //相减
 
-                        String updateSql = "UPDATE s_middle_meter_apply_task SET meter_money = ? WHERE id = ?";
-                        Object[] params = {updatedMeterMoney, inventoryFormApplyTask.getMiddleMeterId()};
-                        jdbcTemplate.update(updateSql, params);
+                        /*获取当前节点变更令*/
+                        MiddleMeterTokenVO nodeToken = middleMeterApplyService.getNodeToken(Long.parseLong(task.getContractId()), middleMeterApplyTask.getContractUnitId(),
+                                inventoryFormApplyTask.getContractFormId().toString(), new SimpleDateFormat("yyyy-MM-dd").format(middleMeterApplyTask.getBusinessDate()));
+
+                        if (nodeToken != null) {//TODO
+                            /*修改中间计量申请金额,变更令id、编号、以及文件信息*/
+                            String updateSql = "UPDATE s_middle_meter_apply_task SET meter_money = ?,change_token_number = ?,change_token_ids = ? WHERE id = ?";
+                            Object[] params = {updatedMeterMoney, nodeToken.getChangeTokenNumber(), nodeToken.getChangeTokenIds(), inventoryFormApplyTask.getMiddleMeterId()};
+                            jdbcTemplate.update(updateSql, params);
+
+                            /*删除该中间计量的变更令附件*/
+                            jdbcTemplate.execute("DELETE FROM s_attachment_form_task WHERE file_type = 2 AND master_id = " + dto.getDataId());
 
-                        return R.data(200, updatedMeterMoney, "操作成功");
+                            /*新增*/
+                            List<AttachmentForm> files = nodeToken.getFiles();
+                            List<AttachmentFormTask> attachmentFormTasks = BeanUtil.copyProperties(files, AttachmentFormTask.class);
+                            for (AttachmentFormTask attachmentFormTask : attachmentFormTasks) {
+                                attachmentFormTask.setMasterId(dto.getDataId());
+                                attachmentFormTask.setTaskId(dto.getTaskId());
+                                attachmentFormTask.setFileType(2);
+                            }
+                            attachmentFormServiceTask.saveBatch(attachmentFormTasks);
+
+                            return R.data(200, updatedMeterMoney, "操作成功");
+                        }
                     }
                 }
 
@@ -1111,7 +1191,7 @@ public class TaskController extends BladeController {
                         ChangeTokenMeterTask changeTokenMeterTask = changeTokenMeterServiceTask.getBaseMapper().selectById(dto.getPrimaryKeyId());
                         if (changeTokenMeterTask != null) {
                             /*获取清单信息*/
-                            List<ChangeFormVO2> formListCopy = changeTokenFormService.getBaseMapper().getFormListCopyByMeterId(dto.getContractId(), dto.getDataId(), changeTokenMeterTask.getContractMeterId());
+                            List<ChangeFormVO2> formListCopy = changeTokenFormService.getBaseMapper().getFormListCopyByMeterId(Long.parseLong(task.getContractId()), dto.getDataId(), changeTokenMeterTask.getContractMeterId());
                             if (formListCopy.size() > 0) {
                                 BigDecimal currentChangeMoneyAll = formListCopy.stream().map(ChangeFormVO2::getCurrentChangeMoney).reduce(BigDecimal.ZERO, BigDecimal::add); //累加
                                 BigDecimal remainingChangeMoney = tokenFormTask.getChangeMoney().subtract(currentChangeMoneyAll); //相减
@@ -1171,7 +1251,7 @@ public class TaskController extends BladeController {
         if (ObjectUtil.isEmpty(dto.getTaskId())) {
             throw new ServiceException("未获取到taskId");
         }
-        Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id FROM u_task WHERE id = " + dto.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
+        Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id,contract_id,project_id FROM u_task WHERE id = " + dto.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
         if (task != null) {
             check(task);
 
@@ -1185,6 +1265,8 @@ public class TaskController extends BladeController {
                 throw new ServiceException("未获取到清单数据");
             }
 
+            obj.setProjectId(Long.parseLong(task.getProjectId()));
+            obj.setContractId(Long.parseLong(task.getContractId()));
             if (inventoryFormApplyServiceTask.updateById(obj)) {
                 MiddleMeterApplyTask middleMeterApplyTask = middleMeterApplyServiceTask.getById(inventoryFormApplyTask.getMiddleMeterId());
                 if (middleMeterApplyTask != null) {
@@ -1195,8 +1277,8 @@ public class TaskController extends BladeController {
                     BigDecimal totalSum = BigDecimal.ZERO;
                     for (MeterInventoryVO meterInventoryVO : formToTask) {
                         BigDecimal currentMeterTotal = meterInventoryVO.getCurrentMeterTotal();
-                        BigDecimal currentMeterMoney = meterInventoryVO.getCurrentMeterMoney();
-                        BigDecimal product = currentMeterTotal.multiply(currentMeterMoney);
+                        BigDecimal currentPrice = meterInventoryVO.getCurrentPrice();
+                        BigDecimal product = currentMeterTotal.multiply(currentPrice);
                         totalSum = totalSum.add(product);
                     }
 
@@ -1218,7 +1300,7 @@ public class TaskController extends BladeController {
         if (ObjectUtil.isEmpty(dto.getTaskId())) {
             throw new ServiceException("未获取到taskId");
         }
-        Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id FROM u_task WHERE id = " + dto.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
+        Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id,contract_id,project_id FROM u_task WHERE id = " + dto.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
         if (task != null) {
             check(task);
 
@@ -1230,7 +1312,7 @@ public class TaskController extends BladeController {
             }
 
             /*获取数据源分解清单*/
-            List<MeterInventoryVO> formList = middleMeterApplyService.addResolveForm(dto.getContractId(), dto.getNodeId(), dto.getIds());
+            List<MeterInventoryVO> formList = middleMeterApplyService.addResolveForm(Long.parseLong(task.getContractId()), dto.getNodeId(), dto.getIds());
 
             if (formList.size() != 0) {
                 /*复制表taskVO数据*/
@@ -1239,8 +1321,8 @@ public class TaskController extends BladeController {
                     InventoryFormApplyTask formApplyTask = new InventoryFormApplyTask();
                     formApplyTask.setTaskId(dto.getTaskId());
                     formApplyTask.setBusinessDate(middleMeterApplyTask.getBusinessDate());
-                    formApplyTask.setProjectId(dto.getProjectId());
-                    formApplyTask.setContractId(dto.getContractId());
+                    formApplyTask.setProjectId(Long.parseLong(task.getProjectId()));
+                    formApplyTask.setContractId(Long.parseLong(task.getContractId()));
                     formApplyTask.setContractFormId(l.getId());
                     formApplyTask.setMiddleMeterId(dto.getDataId());
                     formApplyTask.setContractPeriodId(dto.getContractPeriodId());
@@ -1263,12 +1345,39 @@ public class TaskController extends BladeController {
                 for (InventoryFormApplyTask formApplyTask : formAppliesTask) {
                     currentMeterMoneyTotal = currentMeterMoneyTotal.add(formApplyTask.getCurrentMeterMoney());
                 }
-                inventoryFormApplyServiceTask.saveBatch(formAppliesTask);
 
-                /*修改计量单当前总金额*/
-                String updateSql = "UPDATE s_middle_meter_apply_task SET meter_money = ? WHERE id = ?";
-                Object[] params = {currentMeterMoneyTotal, middleMeterApplyTask.getId()};
-                jdbcTemplate.update(updateSql, params);
+                /*获取所有清单ids*/
+                List<Long> collect = formAppliesTask.stream().map(InventoryFormApplyTask::getContractFormId).collect(Collectors.toList());
+
+                /*获取当前节点变更令*/
+                MiddleMeterTokenVO nodeToken = middleMeterApplyService.getNodeToken(Long.parseLong(task.getContractId()), middleMeterApplyTask.getContractUnitId(),
+                        StringUtils.join(collect, ","), new SimpleDateFormat("yyyy-MM-dd").format(middleMeterApplyTask.getBusinessDate()));
+
+                if (nodeToken != null) {//TODO
+
+                    /*入库*/
+                    inventoryFormApplyServiceTask.saveBatch(formAppliesTask);
+
+                    /*修改中间计量申请金额,变更令id、编号、以及文件信息*/
+                    String updateSql = "UPDATE s_middle_meter_apply_task SET meter_money = ?,change_token_number = ?,change_token_ids = ? WHERE id = ?";
+                    Object[] params = {currentMeterMoneyTotal, nodeToken.getChangeTokenNumber(), nodeToken.getChangeTokenIds(), middleMeterApplyTask.getId()};
+                    jdbcTemplate.update(updateSql, params);
+
+                    /*删除该中间计量的变更令附件*/
+                    jdbcTemplate.execute("DELETE FROM s_attachment_form_task WHERE file_type = 2 AND master_id = " + dto.getDataId());
+
+                    /*新增*/
+                    List<AttachmentForm> files = nodeToken.getFiles();
+                    List<AttachmentFormTask> attachmentFormTasks = BeanUtil.copyProperties(files, AttachmentFormTask.class);
+                    for (AttachmentFormTask attachmentFormTask : attachmentFormTasks) {
+                        attachmentFormTask.setMasterId(dto.getDataId());
+                        attachmentFormTask.setTaskId(dto.getTaskId());
+                        attachmentFormTask.setFileType(2);
+                    }
+                    attachmentFormServiceTask.saveBatch(attachmentFormTasks);
+
+                    return R.data(200, currentMeterMoneyTotal, "操作成功");
+                }
 
                 return R.data(200, formList, "操作成功");
             }
@@ -1284,7 +1393,7 @@ public class TaskController extends BladeController {
         if (ObjectUtil.isEmpty(obj.getTaskId())) {
             throw new ServiceException("未获取到taskId");
         }
-        Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id FROM u_task WHERE id = " + obj.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
+        Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id,contract_id,project_id FROM u_task WHERE id = " + obj.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
         if (task != null) {
             check(task);
 
@@ -1292,7 +1401,7 @@ public class TaskController extends BladeController {
             if (ObjectUtil.isEmpty(obj.getPrice())) {
                 obj.setPrice(old.getPrice());
             }
-            if (ObjectUtil.isEmpty(obj.getMeterAmount())){
+            if (ObjectUtil.isEmpty(obj.getMeterAmount())) {
                 obj.setMeterAmount(old.getMeterAmount());
             }
 
@@ -1301,6 +1410,8 @@ public class TaskController extends BladeController {
             BigDecimal meterMoney = price.multiply(meterAmount);
             obj.setMeterMoney(meterMoney);
 
+            obj.setProjectId(Long.parseLong(task.getProjectId()));
+            obj.setContractId(Long.parseLong(task.getContractId()));
             if (materialMeterFormServiceTask.updateById(obj)) {
                 return R.success("操作成功");
             }
@@ -1315,10 +1426,12 @@ public class TaskController extends BladeController {
         if (ObjectUtil.isEmpty(obj.getTaskId())) {
             throw new ServiceException("未获取到taskId");
         }
-        Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id FROM u_task WHERE id = " + obj.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
+        Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id,contract_id,project_id FROM u_task WHERE id = " + obj.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
         if (task != null) {
             check(task);
 
+            obj.setProjectId(Long.parseLong(task.getProjectId()));
+            obj.setContractId(Long.parseLong(task.getContractId()));
             if (startPayMeterFormServiceTask.updateById(obj)) {
                 return R.success("操作成功");
             }
@@ -1333,10 +1446,12 @@ public class TaskController extends BladeController {
         if (ObjectUtil.isEmpty(obj.getTaskId())) {
             throw new ServiceException("未获取到taskId");
         }
-        Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id FROM u_task WHERE id = " + obj.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
+        Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id,contract_id,project_id FROM u_task WHERE id = " + obj.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
         if (task != null) {
             check(task);
 
+            obj.setProjectId(Long.parseLong(task.getProjectId()));
+            obj.setContractId(Long.parseLong(task.getContractId()));
             if (changeTokenFormServiceTask.updateById(obj)) {
                 return R.success("操作成功");
             }
@@ -1372,7 +1487,7 @@ public class TaskController extends BladeController {
         if (ObjectUtil.isEmpty(dto.getTaskId())) {
             throw new ServiceException("未获取到taskId");
         }
-        Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id FROM u_task WHERE id = " + dto.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
+        Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id,contract_id,project_id FROM u_task WHERE id = " + dto.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
         if (task != null) {
             check(task);
 
@@ -1400,7 +1515,7 @@ public class TaskController extends BladeController {
 
                     /*修改部位变更金额*/
                     ChangeTokenMeterTask changeTokenMeterTask = changeTokenMeterServiceTask.getBaseMapper().selectById(dto.getPrimaryKeyIdMeter());
-                    List<ChangeFormVO2> formListCopyByMeterId = changeTokenFormService.getBaseMapper().getFormListCopyByMeterId(dto.getContractId(), dto.getDataId(), changeTokenMeterTask.getContractMeterId());
+                    List<ChangeFormVO2> formListCopyByMeterId = changeTokenFormService.getBaseMapper().getFormListCopyByMeterId(Long.parseLong(task.getContractId()), dto.getDataId(), changeTokenMeterTask.getContractMeterId());
                     BigDecimal sumOfCurrentChangeMoneyByMeterId = formListCopyByMeterId.stream().map(ChangeFormVO2::getCurrentChangeMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
                     BigDecimal add = changeTokenMeterTask.getChangeMoney().add(sumOfCurrentChangeMoneyByMeterId);
                     String updateSqlMeter = "UPDATE s_change_token_meter_task SET change_money = ? WHERE id = ?";
@@ -1408,7 +1523,7 @@ public class TaskController extends BladeController {
                     jdbcTemplate.update(updateSqlMeter, updateParamsMeter);
 
                     /*修改变更令申请金额*/
-                    List<ChangeFormVO2> formListCopyAll = changeTokenFormService.getBaseMapper().getFormListCopy(dto.getContractId(), dto.getDataId());
+                    List<ChangeFormVO2> formListCopyAll = changeTokenFormService.getBaseMapper().getFormListCopy(Long.parseLong(task.getContractId()), dto.getDataId());
                     BigDecimal sumOfCurrentChangeMoneyAll = formListCopyAll.stream().map(ChangeFormVO2::getCurrentChangeMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
                     String updateSqlForm = "UPDATE s_change_token_form_task SET change_money = ? WHERE id = ?";
                     Object[] updateParamsForm = {sumOfCurrentChangeMoneyAll, dto.getDataId()};
@@ -1428,7 +1543,7 @@ public class TaskController extends BladeController {
         if (ObjectUtil.isEmpty(dto.getTaskId())) {
             throw new ServiceException("未获取到taskId");
         }
-        Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id FROM u_task WHERE id = " + dto.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
+        Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id,contract_id,project_id FROM u_task WHERE id = " + dto.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
         if (task != null) {
             check(task);
 
@@ -1436,8 +1551,8 @@ public class TaskController extends BladeController {
                 List<ChangeTokenInventoryTask> inventoryList = new ArrayList<>();
                 for (ChangeFormVO2 vo2 : dto.getFormList()) {
                     ChangeTokenInventoryTask inventory = new ChangeTokenInventoryTask();
-                    inventory.setProjectId(dto.getProjectId());
-                    inventory.setContractId(dto.getContractId());
+                    inventory.setProjectId(Long.parseLong(task.getProjectId()));
+                    inventory.setContractId(Long.parseLong(task.getContractId()));
                     inventory.setChangeTokenId(dto.getDataId());
                     inventory.setContractFormId(vo2.getId());
                     inventory.setChangeBeforeTotal(vo2.getContractTotal());
@@ -1464,7 +1579,7 @@ public class TaskController extends BladeController {
 
                 /*修改部位变更金额*/
                 ChangeTokenMeterTask changeTokenMeterTask = changeTokenMeterServiceTask.getBaseMapper().selectById(dto.getPrimaryKeyIdMeter());
-                List<ChangeFormVO2> formListCopyByMeterId = changeTokenFormService.getBaseMapper().getFormListCopyByMeterId(dto.getContractId(), dto.getDataId(), changeTokenMeterTask.getContractMeterId());
+                List<ChangeFormVO2> formListCopyByMeterId = changeTokenFormService.getBaseMapper().getFormListCopyByMeterId(Long.parseLong(task.getContractId()), dto.getDataId(), changeTokenMeterTask.getContractMeterId());
                 BigDecimal sumOfCurrentChangeMoneyByMeterId = formListCopyByMeterId.stream().map(ChangeFormVO2::getCurrentChangeMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
                 BigDecimal add = changeTokenMeterTask.getChangeMoney().add(sumOfCurrentChangeMoneyByMeterId);
                 String updateSqlMeter = "UPDATE s_change_token_meter_task SET change_money = ? WHERE id = ?";
@@ -1472,7 +1587,7 @@ public class TaskController extends BladeController {
                 jdbcTemplate.update(updateSqlMeter, updateParamsMeter);
 
                 /*修改变更令申请金额*/
-                List<ChangeFormVO2> formListCopyAll = changeTokenFormService.getBaseMapper().getFormListCopy(dto.getContractId(), dto.getDataId());
+                List<ChangeFormVO2> formListCopyAll = changeTokenFormService.getBaseMapper().getFormListCopy(Long.parseLong(task.getContractId()), dto.getDataId());
                 BigDecimal sumOfCurrentChangeMoneyAll = formListCopyAll.stream().map(ChangeFormVO2::getCurrentChangeMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
                 String updateSqlForm = "UPDATE s_change_token_form_task SET change_money = ? WHERE id = ?";
                 Object[] updateParamsForm = {sumOfCurrentChangeMoneyAll, dto.getDataId()};
@@ -1493,17 +1608,18 @@ public class TaskController extends BladeController {
         if (ObjectUtil.isEmpty(dto.getTaskId())) {
             throw new ServiceException("未获取到taskId");
         }
-        Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id FROM u_task WHERE id = " + dto.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
+        Task task = jdbcTemplate.query("SELECT meter_task_type,process_instance_id,contract_id,project_id FROM u_task WHERE id = " + dto.getTaskId(), new BeanPropertyRowMapper<>(Task.class)).stream().findAny().orElse(null);
         if (task != null) {
             check(task);
 
             List<AttachmentFormTask> fileList = dto.getFileList();
             if (fileList != null && fileList.size() != 0) {
                 for (AttachmentFormTask file : fileList) {
-                    file.setProjectId(dto.getProjectId());
-                    file.setContractId(dto.getContractId());
+                    file.setProjectId(Long.parseLong(task.getProjectId()));
+                    file.setContractId(Long.parseLong(task.getContractId()));
                     file.setMasterId(dto.getDataId());
                     file.setTaskId(dto.getTaskId());
+                    file.setFileType(1);
                 }
                 attachmentFormServiceTask.saveOrUpdateBatch(fileList);
                 return R.success("操作成功");
@@ -1625,7 +1741,7 @@ public class TaskController extends BladeController {
 
             Set<String> aopParamsSet = new HashSet<>();
             for (TaskParallel taskParallel : taskParallels) {
-                String param = taskParallel.getTaskUser() + "," + dto.getProjectId() + "," + dto.getContractId();
+                String param = taskParallel.getTaskUser() + "," + task.getProjectId() + "," + task.getContractId();
                 aopParamsSet.add(param);
             }
             return R.data(200, aopParamsSet, "操作成功");
@@ -1726,6 +1842,7 @@ public class TaskController extends BladeController {
             List<MiddleMeterApplyTask> middleMeterApplyTasks = middleMeterApplyServiceTask.getBaseMapper().selectList(Wrappers.<MiddleMeterApplyTask>lambdaQuery()
                     .eq(MiddleMeterApplyTask::getContractPeriodId, formDataId)
                     .eq(MiddleMeterApplyTask::getTaskId, dto.getTaskId())
+                    .eq(MiddleMeterApplyTask::getStatus, 1)
             );
             List<Long> middleMeterApplyTasksIds = middleMeterApplyTasks.stream().map(MiddleMeterApplyTask::getId).collect(Collectors.toList());
             if (middleMeterApplyTasksIds.size() > 0) {
@@ -1739,6 +1856,7 @@ public class TaskController extends BladeController {
             List<InventoryFormApplyTask> inventoryFormAppliesTasks = inventoryFormApplyServiceTask.getBaseMapper().selectList(Wrappers.<InventoryFormApplyTask>lambdaQuery()
                     .eq(InventoryFormApplyTask::getContractPeriodId, formDataId)
                     .eq(InventoryFormApplyTask::getTaskId, dto.getTaskId())
+                    .eq(InventoryFormApplyTask::getStatus, 1)
             );
             List<Long> inventoryFormAppliesTasksIds = inventoryFormAppliesTasks.stream().map(InventoryFormApplyTask::getId).collect(Collectors.toList());
             if (inventoryFormAppliesTasksIds.size() > 0) {
@@ -1753,6 +1871,7 @@ public class TaskController extends BladeController {
             List<MaterialMeterFormTask> materialMeterFormTasks = materialMeterFormServiceTask.getBaseMapper().selectList(Wrappers.<MaterialMeterFormTask>lambdaQuery()
                     .eq(MaterialMeterFormTask::getMeterPeriodId, formDataId)
                     .eq(MaterialMeterFormTask::getTaskId, dto.getTaskId())
+                    .eq(MaterialMeterFormTask::getStatus, 1)
             );
             List<Long> ids = materialMeterFormTasks.stream().map(MaterialMeterFormTask::getId).collect(Collectors.toList());
             if (ids.size() > 0) {
@@ -1766,6 +1885,7 @@ public class TaskController extends BladeController {
             List<StartPayMeterFormTask> startPayMeterFormTasks = startPayMeterFormServiceTask.getBaseMapper().selectList(Wrappers.<StartPayMeterFormTask>lambdaQuery()
                     .eq(StartPayMeterFormTask::getMeterPeriodId, formDataId)
                     .eq(StartPayMeterFormTask::getTaskId, dto.getTaskId())
+                    .eq(StartPayMeterFormTask::getStatus, 1)
             );
             List<Long> ids = startPayMeterFormTasks.stream().map(StartPayMeterFormTask::getId).collect(Collectors.toList());
             if (ids.size() > 0) {
@@ -1776,7 +1896,18 @@ public class TaskController extends BladeController {
                 startPayMeterFormServiceTask.update(updateEntity, updateWrapper);
             }
         } else if (task.getMeterTaskType().equals(4)) {
-            jdbcTemplate.execute("UPDATE s_change_token_form_task SET approve_status = 2 WHERE id IN(" + formDataId + ")");
+            List<String> formDataIds = Func.toStrList(formDataId);
+            List<ChangeTokenFormTask> changeTokenFormTasks = changeTokenFormServiceTask.getBaseMapper().selectList(Wrappers.<ChangeTokenFormTask>lambdaQuery()
+                    .in(ChangeTokenFormTask::getId, formDataIds)
+                    .eq(ChangeTokenFormTask::getStatus, 1));
+            List<Long> ids = changeTokenFormTasks.stream().map(ChangeTokenFormTask::getId).collect(Collectors.toList());
+            if (ids.size() > 0) {
+                UpdateWrapper<ChangeTokenFormTask> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.in("id", ids);
+                ChangeTokenFormTask updateEntity = new ChangeTokenFormTask();
+                updateEntity.setApproveStatus(2);
+                changeTokenFormServiceTask.update(updateEntity, updateWrapper);
+            }
         }
         return this;
     }
@@ -1810,7 +1941,17 @@ public class TaskController extends BladeController {
             jdbcTemplate.execute("DELETE FROM s_inventory_form_apply WHERE contract_period_id = " + task.getFormDataId());
 
             List<MiddleMeterApply> middleMeterApplies = BeanUtil.copyProperties(middleMeterApplyTasks, MiddleMeterApply.class);
+            for (MiddleMeterApply apply : middleMeterApplies) {
+                if (apply.getStatus() == 2) {
+                    apply.setApproveStatus(3);
+                }
+            }
             List<InventoryFormApply> inventoryFormApplies = BeanUtil.copyProperties(inventoryFormApplyTasks, InventoryFormApply.class);
+            for (InventoryFormApply apply : inventoryFormApplies) {
+                if (apply.getStatus() == 2) {
+                    apply.setApproveStatus(3);
+                }
+            }
             middleMeterApplyService.saveBatch(middleMeterApplies, 1000);
             inventoryFormApplyService.saveBatch(inventoryFormApplies, 1000);
 
@@ -1821,6 +1962,11 @@ public class TaskController extends BladeController {
             jdbcTemplate.execute("DELETE FROM s_material_meter_form WHERE meter_period_id = " + task.getFormDataId());
 
             List<MaterialMeterForm> materialMeterForms = BeanUtil.copyProperties(materialMeterFormTasks, MaterialMeterForm.class);
+            for (MaterialMeterForm form : materialMeterForms) {
+                if (form.getStatus() == 2) {
+                    form.setApproveStatus(3);
+                }
+            }
             materialMeterFormService.saveBatch(materialMeterForms, 1000);
 
         } else if (task.getMeterTaskType().equals(3)) {
@@ -1830,6 +1976,11 @@ public class TaskController extends BladeController {
             jdbcTemplate.execute("DELETE FROM s_start_pay_meter_form WHERE meter_period_id = " + task.getFormDataId());
 
             List<StartPayMeterForm> startPayMeterForms = BeanUtil.copyProperties(startPayMeterFormTasks, StartPayMeterForm.class);
+            for (StartPayMeterForm form : startPayMeterForms) {
+                if (form.getStatus() == 2) {
+                    form.setApproveStatus(3);
+                }
+            }
             startPayMeterFormService.saveBatch(startPayMeterForms, 1000);
 
         } else if (task.getMeterTaskType().equals(4)) {
@@ -1849,6 +2000,9 @@ public class TaskController extends BladeController {
                             jdbcTemplate.execute("DELETE FROM s_change_token_form WHERE id = " + dataId);
 
                             ChangeTokenForm changeTokenForm = BeanUtil.copyProperties(changeTokenFormTask, ChangeTokenForm.class);
+                            if (changeTokenForm != null && changeTokenForm.getStatus().equals(2)) {
+                                changeTokenForm.setApproveStatus(3);
+                            }
                             changeTokenFormService.save(changeTokenForm);
 
                             List<ChangeTokenMeter> changeTokenMeter = BeanUtil.copyProperties(changeTokenMeterTasks, ChangeTokenMeter.class);