liuyc 1 жил өмнө
parent
commit
bca5c69c08

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

@@ -206,12 +206,13 @@ public class WbsTreeContractController extends BladeController {
             parentId = primaryKeyId;
         }
         List<WbsTreeContractLazyVO> vos;
-        String dataInfoId;
+        String dataInfoId = "";
         if (("1").equals(classifyType)) {
             dataInfoId = contractId + "_" + parentId + "_" + classifyType + "_" + tableOwner;
-        } else {
+        }/* else {
+            //监理合同段先不加缓存,存在问题
             dataInfoId = contractIdRelation + "_" + parentId + "_" + classifyType + "_" + tableOwner;
-        }
+        }*/
         Object data = redisTemplate.opsForValue().get("blade-manager::contract:wbstree:" + dataInfoId);
         if (data != null) {
             vos = JSON.parseArray(data.toString(), WbsTreeContractLazyVO.class);

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.java

@@ -78,7 +78,7 @@ public interface WbsTreeContractMapper extends EasyBaseMapper<WbsTreeContract> {
 
     void updateBatchByIds2(@Param("wbsTreePrivate") WbsTreePrivate wbsTreePrivate, @Param("id") Long id);
 
-    void updateContractTablesInfo(@Param("contractInfoId") Long contractInfoId, @Param("wbsTreePrivate") WbsTreePrivate wbsTreePrivate);
+    void updateContractTablesInfo(@Param("contractInfoId") Long contractInfoId, @Param("wbsTreePrivate") WbsTreePrivate wbsTreePrivate, @Param("pKeyIdsContracts") List<Long> pKeyIdsContracts);
 
     void updateBatchWbsContract(@Param("listContract") List<WbsTreeContract> listContract);
 

+ 4 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml

@@ -583,12 +583,10 @@
                 ,sort = #{wbsTreePrivate.sort}
             </if>
         WHERE
-            (id = #{wbsTreePrivate.id} OR old_id = #{wbsTreePrivate.id})
-          AND project_id = #{wbsTreePrivate.projectId}
-          AND contract_id = #{contractInfoId}
-          AND type = 2
-          AND status = 1
-          AND is_deleted = 0
+            p_key_id in
+        <foreach collection="pKeyIdsContracts" item="pKeyIds" open="(" close=")" separator=",">
+            #{pKeyIds}
+        </foreach>
     </update>
 
     <update id="updateBatchWbsContract" parameterType="java.util.List">

+ 64 - 50
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -327,43 +327,56 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     @Override
     public boolean updateBatchByPid(List<WbsTreePrivateDTO3> wbsTreePrivates) {
         try {
-            //修改当前私有项目元素表基础信息
-            wbsTreePrivates.forEach(list -> {
-                this.update(Wrappers.<WbsTreePrivate>lambdaUpdate()
-                        .set(WbsTreePrivate::getNodeName, list.getNodeName())
-                        .set(WbsTreePrivate::getFullName, list.getNodeName())
-                        .set(WbsTreePrivate::getTableType, list.getTableType())
-                        .set(WbsTreePrivate::getTableOwner, list.getTableOwner())
-                        .set(WbsTreePrivate::getFillRate, list.getFillRate())
-                        .set(WbsTreePrivate::getNodeType, list.getNodeType())
-                        .eq(WbsTreePrivate::getPKeyId, list.getPKeyId())
-                );
-            });
-
-            //获取最新项目表信息
+            //获取数据源
             List<Long> pKeyIds = wbsTreePrivates.stream().map(WbsTreePrivateDTO3::getPKeyId).collect(Collectors.toList());
             List<WbsTreePrivate> wbsTreePrivateNew = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
-                    .select(WbsTreePrivate::getNodeName, WbsTreePrivate::getTableType, WbsTreePrivate::getTableOwner, WbsTreePrivate::getId, WbsTreePrivate::getSort, WbsTreePrivate::getProjectId)
+                    .select(WbsTreePrivate::getProjectId, WbsTreePrivate::getPKeyId, WbsTreePrivate::getNodeName, WbsTreePrivate::getTableOwner, WbsTreePrivate::getTableType, WbsTreePrivate::getFillRate)
                     .in(WbsTreePrivate::getPKeyId, pKeyIds));
+
+            //将wbsTreePrivateNew转为对应Map
+            Map<Long, String> wbsTreePrivateNameMap = wbsTreePrivateNew.stream().collect(Collectors.toMap(WbsTreePrivate::getPKeyId, WbsTreePrivate::getNodeName));
+            Map<Long, Integer> wbsTreePrivateTabTypeMap = wbsTreePrivateNew.stream().collect(Collectors.toMap(WbsTreePrivate::getPKeyId, WbsTreePrivate::getTableType));
+            Map<Long, String> wbsTreePrivateTabOwnerMap = wbsTreePrivateNew.stream().collect(Collectors.toMap(WbsTreePrivate::getPKeyId, WbsTreePrivate::getTableOwner));
+            Map<Long, String> wbsTreePrivateFillRateMap = wbsTreePrivateNew.stream().collect(Collectors.toMap(WbsTreePrivate::getPKeyId, WbsTreePrivate::getFillRate));
+
+            //获取项目下所有合同段ids
             String projectId = wbsTreePrivateNew.stream().map(WbsTreePrivate::getProjectId).findAny().orElse(null);
+            List<Long> contractInfoIds = contractInfoMapper.selectList(Wrappers.<ContractInfo>lambdaQuery().select(ContractInfo::getId, ContractInfo::getContractType).eq(ContractInfo::getPId, projectId)).stream().filter(f -> f.getContractType() == 1).map(ContractInfo::getId).collect(Collectors.toList());
 
-            //修改当前项目下所有合同段中的元素表基础信息
-            if (StringUtils.isNotEmpty(projectId) && wbsTreePrivateNew.size() > 0) {
-                //获取所有合同段ids
-                List<Long> contractInfoIds = contractInfoMapper.selectList(Wrappers.<ContractInfo>lambdaQuery().select(ContractInfo::getId).eq(ContractInfo::getPId, projectId)).stream().map(ContractInfo::getId).collect(Collectors.toList());
-                if (contractInfoIds.size() > 0) {
-                    for (Long contractId : contractInfoIds) {
-                        for (WbsTreePrivate wbsTreePrivate : wbsTreePrivateNew) {
-                            //判断当前合同段是否存在该元素表、以及该元素表父级节点(包括新增、复制节点)
-                            long row = wbsTreeContractMapper.selectCount(Wrappers.<WbsTreeContract>lambdaQuery()
-                                    .eq(WbsTreeContract::getStatus, 1)
-                                    .eq(WbsTreeContract::getContractId, contractId)
-                                    .eq(WbsTreeContract::getProjectId, projectId)
-                                    .and(obj -> obj.eq(WbsTreeContract::getId, wbsTreePrivate.getId()).or().eq(WbsTreeContract::getParentId, wbsTreePrivate.getId()).or().eq(WbsTreeContract::getOldId, wbsTreePrivate.getId()))
-                            );
-                            //修改原始、复制、新增节点下的元素表
-                            if (row > 0) {
-                                wbsTreeContractMapper.updateContractTablesInfo(contractId, wbsTreePrivate);
+            //修改当前私有项目元素表基础信息
+            for (WbsTreePrivateDTO3 wbsTreePrivate : wbsTreePrivates) {
+                //数据变动才修改
+                if (!wbsTreePrivateNameMap.get(wbsTreePrivate.getPKeyId()).equals(wbsTreePrivate.getNodeName())
+                        || !wbsTreePrivateTabTypeMap.get(wbsTreePrivate.getPKeyId()).equals(wbsTreePrivate.getTableType())
+                        || !wbsTreePrivateTabOwnerMap.get(wbsTreePrivate.getPKeyId()).equals(wbsTreePrivate.getTableOwner())
+                        || !wbsTreePrivateFillRateMap.get(wbsTreePrivate.getPKeyId()).equals(wbsTreePrivate.getFillRate())
+                ) {
+                    WbsTreePrivate wbsTreePrivateParam = BeanUtil.copyProperties(wbsTreePrivate, WbsTreePrivate.class);
+                    if (wbsTreePrivateParam != null) {
+                        //修改
+                        boolean update = this.update(Wrappers.<WbsTreePrivate>lambdaUpdate()
+                                .set(WbsTreePrivate::getNodeName, wbsTreePrivate.getNodeName())
+                                .set(WbsTreePrivate::getFullName, wbsTreePrivate.getNodeName())
+                                .set(WbsTreePrivate::getTableType, wbsTreePrivate.getTableType())
+                                .set(WbsTreePrivate::getTableOwner, wbsTreePrivate.getTableOwner())
+                                .set(WbsTreePrivate::getFillRate, wbsTreePrivate.getFillRate())
+                                .set(WbsTreePrivate::getNodeType, wbsTreePrivate.getNodeType())
+                                .eq(WbsTreePrivate::getPKeyId, wbsTreePrivate.getPKeyId())
+                        );
+                        if (update) {
+                            //直接修改合同段下所有类似的表(根据full_name=node_name模糊搜索)
+                            for (Long contractInfoId : contractInfoIds) {
+                                List<WbsTreeContract> wbsTreeContracts = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                                        .select(WbsTreeContract::getPKeyId)
+                                        .eq(WbsTreeContract::getStatus, 1)
+                                        .eq(WbsTreeContract::getProjectId, projectId)
+                                        .eq(WbsTreeContract::getContractId, contractInfoId)
+                                        .like(WbsTreeContract::getFullName, wbsTreePrivateNameMap.get(wbsTreePrivate.getPKeyId())));
+                                //批量修改
+                                if (wbsTreeContracts.size() > 0) {
+                                    List<Long> pKeyIdsContracts = wbsTreeContracts.stream().map(WbsTreeContract::getPKeyId).collect(Collectors.toList());
+                                    wbsTreeContractMapper.updateContractTablesInfo(contractInfoId, wbsTreePrivateParam, pKeyIdsContracts);
+                                }
                             }
                         }
                     }
@@ -907,14 +920,14 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             /*源配置sourceListMap,目标配置distListMap*/
             List<Map<String, Object>> distListMap = this.jdbcTemplate.queryForList("select a.id,a.name,a.k,a.v,a.remark,a.node_id nodeId ,b.id privateId,a.update_time updateTime  " +
                     "from m_wbs_param a join m_wbs_tree_private b on a.node_id = b.p_key_id   where  b.project_id in(?) and b.p_key_id in(" + distNodeIds.stream().map(Object::toString).collect(Collectors.joining(",")) + ") and a.is_deleted=0  and a.type=1 ", Long.parseLong(projectId));
-            List<Map<String, Object>> sourceListMap =this.getSourceListMap(projectInfo,selectNodeNow,selectNodeAndChildNodes);
-            compareAndSync(sourceListMap,distListMap,projectId);
+            List<Map<String, Object>> sourceListMap = this.getSourceListMap(projectInfo, selectNodeNow, selectNodeAndChildNodes);
+            compareAndSync(sourceListMap, distListMap, projectId);
             return true;
         }
         return false;
     }
 
-    private List<Map<String, Object>> getSourceListMap(ProjectInfo projectInfo, WbsTreePrivate selectNodeNow,List<WbsTreePrivate> selectNodeAndChildNodes){
+    private List<Map<String, Object>> getSourceListMap(ProjectInfo projectInfo, WbsTreePrivate selectNodeNow, List<WbsTreePrivate> selectNodeAndChildNodes) {
         List<Map<String, Object>> sourceListMap = new ArrayList<>();
         if (("private").equals(projectInfo.getReferenceWbsTemplateType())) {
             // 节点参数nodeId绑定的是m_wbs_private 的p_key_id
@@ -927,38 +940,38 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                 selectNodeAndChildNodes.add(selectNodeNow);*/
             List<Long> sourceNodeIds = jdbcTemplate.queryForList("select p_key_id from m_wbs_tree_private where id in(" + selectNodeAndChildNodes.stream().map(WbsTreePrivate::getId).map(Object::toString).collect(Collectors.joining(",")) + ") and  is_deleted=0 and project_id =" + sourceRootNode.getProjectId(), Long.class);
             /*List<Long> distNodeIds = selectNodeAndChildNodes.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());*/
-             sourceListMap = this.jdbcTemplate.queryForList("select a.id,a.name ,a.k,a.v,a.remark,a.node_id nodeId ,b.id privateId,a.update_time updateTime  " +
+            sourceListMap = this.jdbcTemplate.queryForList("select a.id,a.name ,a.k,a.v,a.remark,a.node_id nodeId ,b.id privateId,a.update_time updateTime  " +
                     "from m_wbs_param a join m_wbs_tree_private b on a.node_id = b.p_key_id   where  b.project_id in(?) and b.p_key_id in(" + sourceNodeIds.stream().map(Object::toString).collect(Collectors.joining(",")) + ") and a.is_deleted=0  and a.type=1 ", Long.parseLong(sourceRootNode.getProjectId()));
                 /*List<Map<String, Object>> distListMap = this.jdbcTemplate.queryForList("select a.id,a.name,a.k,a.v,a.remark,a.node_id nodeId ,b.id privateId,a.update_time updateTime  " +
                         "from m_wbs_param a join m_wbs_tree_private b on a.node_id = b.p_key_id   where  b.project_id in(?) and b.p_key_id in(" + distNodeIds.stream().map(Object::toString).collect(Collectors.joining(",")) + ") and a.is_deleted=0  and a.type=1 ", Long.parseLong(projectId));*/
-           /* compareAndSync(sourceListMap,distListMap,projectId);*/
-        }else{
+            /* compareAndSync(sourceListMap,distListMap,projectId);*/
+        } else {
             /*WBS同步到public*/
                /* List<WbsTreePrivate> selectNodeAndChildNodes = Optional.ofNullable(this.getChildNodes(selectNodeNow)).orElse(new ArrayList<>());
                 selectNodeAndChildNodes.add(selectNodeNow);*/
-            List<Long> sourceNodeIds = jdbcTemplate.queryForList("select id from m_wbs_tree where id in ("+selectNodeAndChildNodes.stream().map(WbsTreePrivate::getId).map(Objects::toString).collect(Collectors.joining(","))+")",Long.class);
+            List<Long> sourceNodeIds = jdbcTemplate.queryForList("select id from m_wbs_tree where id in (" + selectNodeAndChildNodes.stream().map(WbsTreePrivate::getId).map(Objects::toString).collect(Collectors.joining(",")) + ")", Long.class);
             /* List<Long> distNodeIds = selectNodeAndChildNodes.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());*/
-             sourceListMap = this.jdbcTemplate.queryForList("select  a.id,a.name ,a.k,a.v,a.remark,a.node_id nodeId ,b.id privateId,a.update_time updateTime  from m_wbs_param a join m_wbs_tree b on a.node_id = b.id where b.id in(" + sourceNodeIds.stream().map(Object::toString).collect(Collectors.joining(",")) + ") and a.is_deleted=0  and a.type=1");
+            sourceListMap = this.jdbcTemplate.queryForList("select  a.id,a.name ,a.k,a.v,a.remark,a.node_id nodeId ,b.id privateId,a.update_time updateTime  from m_wbs_param a join m_wbs_tree b on a.node_id = b.id where b.id in(" + sourceNodeIds.stream().map(Object::toString).collect(Collectors.joining(",")) + ") and a.is_deleted=0  and a.type=1");
                 /*List<Map<String, Object>> distListMap = this.jdbcTemplate.queryForList("select a.id,a.name,a.k,a.v,a.remark,a.node_id nodeId ,b.id privateId,a.update_time updateTime  " +
                         "from m_wbs_param a join m_wbs_tree_private b on a.node_id = b.p_key_id   where  b.project_id in(?) and b.p_key_id in(" + distNodeIds.stream().map(Object::toString).collect(Collectors.joining(",")) + ") and a.is_deleted=0  and a.type=1 ", Long.parseLong(projectId));*/
-           /* compareAndSync(sourceListMap,distListMap,projectId);*/
+            /* compareAndSync(sourceListMap,distListMap,projectId);*/
         }
         return sourceListMap;
     }
 
-    public void compareAndSync( List<Map<String, Object>> sourceListMap,List<Map<String, Object>> distListMap,String projectId){
+    public void compareAndSync(List<Map<String, Object>> sourceListMap, List<Map<String, Object>> distListMap, String projectId) {
         /*存在多个同名参数;保留日期最新那个参数*/
         BinaryOperator<Map<String, Object>> mapBinaryOperator = (m1, m2) -> {
             Object sts = m1.get("updateTime");
             Object dts = m2.get("updateTime");
             if (Func.isNotEmpty(sts) && Func.isNotEmpty(dts)) {
                 LocalDateTime sldt = ((Timestamp) sts).toLocalDateTime();
-                LocalDateTime tldt = ((Timestamp)dts).toLocalDateTime();
+                LocalDateTime tldt = ((Timestamp) dts).toLocalDateTime();
                 return sldt.isAfter(tldt) ? m1 : m2;
             }
             return m2;
         };
-        BiPredicate<Map<String, Object>, Map<String, Object>> timeComparison = (m1, m2) -> mapBinaryOperator.apply(m1,m2).equals(m1);
+        BiPredicate<Map<String, Object>, Map<String, Object>> timeComparison = (m1, m2) -> mapBinaryOperator.apply(m1, m2).equals(m1);
         /*id+k 就是匹配码*/
         /*用匹配码链接源节点和目标节点的参数*/
         /*源无目标有不复制,源有目标无,则复制*/
@@ -974,7 +987,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                 Map<String, Object> u = distMap.get(k);
                 String t = Func.toStr(u.get("v"));
                 if (!s.equals(t)) {
-                    if(timeComparison.test(v,u)){
+                    if (timeComparison.test(v, u)) {
                         u.put("v", s);
                         updateMap.put(u.get("id").toString(), u);
                     }
@@ -1764,20 +1777,21 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
 
     /**
      * 批量同步表单配置信息
+     *
      * @param map
      */
     @Async
     @Override
-    public void batchSynTableConfig(Map<Long,Long> map) {
-        System.out.println("异步同步表单配置:map大小:"+map.size());
+    public void batchSynTableConfig(Map<Long, Long> map) {
+        System.out.println("异步同步表单配置:map大小:" + map.size());
         //获取所有表单配置
         List<TextdictInfo> list = baseMapper.getALLTableConfig(map.keySet());
-        if (list != null && list.size() > 0){
-            System.out.println("异步同步表单配置:配置总条数:"+list.size());
+        if (list != null && list.size() > 0) {
+            System.out.println("异步同步表单配置:配置总条数:" + list.size());
             //id设置为null,替换调tableId
             for (TextdictInfo info : list) {
                 info.setId(null);
-                info.setTabId(map.get(Long.parseLong(info.getTabId()))+"");
+                info.setTabId(map.get(Long.parseLong(info.getTabId())) + "");
             }
             //批量保存
             if (list.size() > 1000) {