Browse Source

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

yangyj 1 year ago
parent
commit
d40414cbdd

+ 12 - 0
blade-common/pom.xml

@@ -49,6 +49,18 @@
             <scope>compile</scope>
         </dependency>
 
+<!--        <dependency>-->
+<!--            <groupId>com.google.collections</groupId>-->
+<!--            <artifactId>google-collections</artifactId>-->
+<!--            <version>1.0-rc2</version>-->
+<!--        </dependency>-->
+
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>30.1.1-jre</version>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 100 - 0
blade-common/src/main/java/org/springblade/common/utils/CommonUtil.java

@@ -8,6 +8,8 @@ import com.drew.imaging.ImageMetadataReader;
 import com.drew.imaging.ImageProcessingException;
 import com.drew.metadata.Metadata;
 import com.drew.metadata.exif.ExifIFD0Directory;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.util.CollectionUtils;
 
@@ -261,6 +263,104 @@ public class CommonUtil {
                 .collect(Collectors.toList());
     }
 
+    /**
+     * Map拆分 (指定分组大小)
+     * @param map Map
+     * @param chunkSize 每个分组的大小 (>=1)
+     * @param <K> Key
+     * @param <V> Value
+     * @return 子Map列表
+     */
+    public static <K,V> List<Map<K,V>> splitByChunkSize(Map<K,V> map, int chunkSize){
+        if(Objects.isNull(map) || map.isEmpty() || chunkSize<1){
+            //空map或者分组大小<1,无法拆分
+            return Collections.emptyList();
+        }
+
+        int mapSize = map.size(); //键值对总数
+        int groupSize = mapSize/chunkSize + (mapSize%chunkSize==0?0:1); //计算分组个数
+        List<Map<K,V>> list = Lists.newArrayListWithCapacity(groupSize); //子Map列表
+
+        if(chunkSize >= mapSize){ //只能分1组的情况
+            list.add(map);
+            return list;
+        }
+
+        int count = 0; //每个分组的组内计数
+        Map<K,V> subMap = Maps.newHashMapWithExpectedSize(chunkSize); //子Map
+
+        for (Map.Entry<K, V> entry : map.entrySet()) {
+            if (count < chunkSize) {
+                //给每个分组放chunkSize个键值对,最后一个分组可能会装不满
+                subMap.put(entry.getKey(), entry.getValue());
+                count++; //组内计数+1
+            } else {
+                //结束上一个分组
+                list.add(subMap); //当前分组装满了->加入列表
+
+                //开始下一个分组
+                subMap = Maps.newHashMapWithExpectedSize(chunkSize); //新的分组
+                subMap.put(entry.getKey(), entry.getValue()); //添加当前键值对
+                count = 1; //组内计数重置为1
+            }
+        }
+
+        list.add(subMap);  //添加最后一个分组
+        return list;
+    }
+
+    /**
+     * Map拆分(指定分组个数)
+     * @param map Map
+     * @param groupSize 分组个数 (>=1)
+     * @param <K> Key
+     * @param <V> Value
+     * @return 子Map列表
+     */
+    public static <K,V> List<Map<K,V>> splitByGroupSize(Map<K,V> map, int groupSize){
+        if(Objects.isNull(map) || map.isEmpty() || groupSize<1){
+            //空map或者分组数<1,无法拆分
+            return Collections.emptyList();
+        }
+
+        List<Map<K,V>> list = Lists.newArrayListWithCapacity(groupSize);
+        if(groupSize == 1){ //只有1个分组的情况
+            list.add(map);
+            return list;
+        }
+
+        int mapSize = map.size(); //键值对总数
+        int chunkIndex = 0; //当前分组的下标,[0, groupSize-1]
+        int restCount = mapSize % groupSize; //平均后剩余的键值对数
+        int chunkSize0 = mapSize / groupSize; //每个分组键值对数量
+        int chunkSize1 = chunkSize0 + 1; //多分一个
+        int chunkSize = chunkIndex<restCount ? chunkSize1 : chunkSize0; //实际每组的大小(前面的部分分组可能会多分1个)
+        int count = 0; //每个分组的组内计数
+        Map<K,V> subMap = Maps.newHashMapWithExpectedSize(chunkSize);//子Map
+
+        for (Map.Entry<K, V> entry : map.entrySet()) {
+            if(count < chunkSize){
+                //每个分组按实际分组大小(chunkSize)加入键值对
+                subMap.put(entry.getKey(), entry.getValue());
+                count ++; //组内计数+1
+            }else{
+                //结束上一个分组
+                list.add(subMap); //当前分组装满了->加入列表
+                chunkIndex ++; //分组个数+1
+
+                //开始下一个分组
+                chunkSize = chunkIndex<restCount ? chunkSize1 : chunkSize0; //重新计算分组大小
+                subMap = Maps.newHashMapWithExpectedSize(chunkSize); //新的分组
+                subMap.put(entry.getKey(), entry.getValue()); //添加当前键值对
+                count = 1; //组内计数重置为1
+            }
+        }
+
+        list.add(subMap); //添加最后一个分组
+        return list;
+    }
+
+
     /**
      * 流写入文件
      *

+ 39 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ContractIsPidVO.java

@@ -0,0 +1,39 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+
+import java.util.Objects;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2024/5/13 11:52
+ **/
+@Data
+public class ContractIsPidVO {
+
+    private Long id;
+
+    private String wbsId;
+
+    public ContractIsPidVO() {
+    }
+
+    public ContractIsPidVO(Long id, String wbsId) {
+        this.id = id;
+        this.wbsId = wbsId;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        ContractIsPidVO that = (ContractIsPidVO) o;
+        return Objects.equals(id, that.id) && Objects.equals(wbsId, that.wbsId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, wbsId);
+    }
+}

+ 43 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeController.java

@@ -7,6 +7,8 @@ import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
+import org.hibernate.validator.internal.engine.messageinterpolation.InterpolationTermType;
+import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.cache.utils.CacheUtil;
 import org.springblade.core.excel.util.ExcelUtil;
 import org.springblade.core.log.exception.ServiceException;
@@ -25,8 +27,7 @@ import org.springblade.manager.excel.WbsTreeExcel;
 import org.springblade.manager.mapper.WbsInfoMapper;
 import org.springblade.manager.mapper.WbsTreeContractMapper;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
-import org.springblade.manager.service.IFormulaService;
-import org.springblade.manager.service.IWbsFormElementService;
+import org.springblade.manager.service.*;
 import org.springblade.manager.vo.*;
 import org.springblade.system.cache.DictCache;
 import org.springblade.system.entity.Role;
@@ -38,7 +39,6 @@ import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
-import org.springblade.manager.service.IWbsTreeService;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -57,6 +57,8 @@ import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
 @Api(value = "公有wbs树", tags = "公有wbs树接口")
 public class WbsTreeController extends BladeController {
 
+    private final IProjectInfoService projectInfoService;
+    private final IContractInfoService contractInfoService;
     private final IWbsTreeService wbsTreeService;
     private final IWbsFormElementService wbsFormElementService;
     private final WbsTreePrivateMapper wbsTreePrivateMapper;
@@ -502,6 +504,44 @@ public class WbsTreeController extends BladeController {
         return R.data(result);
     }
 
+    @GetMapping("setContractIsPid")
+    public void setContractIsPid(){
+        //为合同段节点没有设置is_pid的字段设置isPid
+        //   1 获取所有项目,循环项目
+        List<ProjectInfo> projects = projectInfoService.list();
+        Map<Long,Long> updateMap = new HashMap<>();
+        for (ProjectInfo project : projects) {
+            //   2 查询wbs_private中的节点
+            List<WbsTreePrivate> privates = wbsTreePrivateMapper.getAllNodeByProjectId(project.getId());
+            //   3 查询wbs_contract中的节点,排除is_pid有值的
+            List<WbsTreeContract> contracts = wbsTreeContractMapper.getAllNodeByProjectId(project.getId());
+            if (privates.size() == 0 || contracts.size() == 0){
+                continue;
+            }
+            //      分组,key为项目id,id,wbs_id,值为合同节点主键拼接
+            Map<ContractIsPidVO, List<Long>> listMap = contracts.stream().collect(Collectors
+                    .groupingBy(l -> new ContractIsPidVO(l.getId(), l.getWbsId()),Collectors.mapping(WbsTreeContract::getPKeyId,Collectors.toList())));
+            //   4 循环private,从分组中获取数据
+            for (WbsTreePrivate aPrivate : privates) {
+                List<Long> pIds = listMap.get(new ContractIsPidVO(aPrivate.getId(), aPrivate.getWbsId()));
+                if (pIds != null && pIds.size() > 0){
+                    //存在数据,设置主键和isPid,添加进修改集合
+                    for (Long pId : pIds) {
+                        updateMap.put(pId,aPrivate.getPKeyId());
+                    }
+                }
+            }
+        }
+        //   5 批量修改
+        if (updateMap.size() != 0) {
+            List<Map<Long, Long>> mapList = CommonUtil.splitByChunkSize(updateMap, 1000);
+            for (Map<Long, Long> map : mapList) {
+                wbsTreeContractMapper.updateIsPId(map);
+            }
+        }
+        System.out.println(updateMap.size());
+    }
+
 }
 
 

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

@@ -8,6 +8,7 @@ import org.springblade.manager.injector.EasyBaseMapper;
 import org.springblade.manager.vo.*;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 //@CacheNamespace
@@ -101,4 +102,8 @@ public interface WbsTreeContractMapper extends EasyBaseMapper<WbsTreeContract> {
 
     Integer getAllAppTotal2(@Param("projectId")Long projectId);
 
+    //根据项目id,获取所有type为1的,并且没有指向项目级的节点
+    List<WbsTreeContract> getAllNodeByProjectId(@Param("projectId") Long id);
+
+    void updateIsPId(@Param("map") Map<Long, Long> map);
 }

+ 13 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml

@@ -721,6 +721,15 @@
         WHERE project_id = #{wbsTreePrivate.projectId}
           and excel_id = #{wbsTreePrivate.excelId}
     </update>
+    <update id="updateIsPId">
+        <foreach item="value" collection="map" index="key" separator=";">
+            UPDATE m_wbs_tree_contract
+            <set>
+                is_type_private_pid = #{value}
+            </set>
+            where p_key_id = #{key}
+        </foreach>
+    </update>
 
     <select id="selectQueryValueLikeNodeName" resultMap="ResultMap">
         select *
@@ -787,4 +796,8 @@
         select COUNT(1) from u_construction_ledger
         WHERE project_id = #{projectId} and is_deleted = 0 and site_end_time &lt; NOW()
     </select>
+    <select id="getAllNodeByProjectId" resultType="org.springblade.manager.entity.WbsTreeContract">
+        select p_key_id,id,wbs_id,project_id from m_wbs_tree_contract
+        WHERE project_id = #{projectId} and type = 1 and is_deleted = 0 and is_type_private_pid is null
+    </select>
 </mapper>

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java

@@ -112,4 +112,7 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
     WbsTreePrivate getThisForm(@Param("projectId") String projectId,@Param("parentId") Long parentId,@Param("id") Long id);
 
     List<WbsTreeContract> getcontractAllNode(@Param("projectId") Long projectId);
+
+    //根据项目id,获取所有type为1的节点
+    List<WbsTreePrivate> getAllNodeByProjectId(@Param("projectId") Long projectId);
 }

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml

@@ -852,6 +852,9 @@
         select p_key_id,project_id,contract_id,id,wbs_id,old_id
         from m_wbs_tree_contract where project_id = #{projectId} and `type` = 1 and is_deleted = 0
     </select>
+    <select id="getAllNodeByProjectId" resultType="org.springblade.manager.entity.WbsTreePrivate">
+        select p_key_id,id,wbs_id,project_id from m_wbs_tree_private where project_id = #{projectId} and type = 1 and is_deleted = 0
+    </select>
 
 
     <delete id="delTabProjectById">