Browse Source

项目成本查询加入线程池

lw 1 year ago
parent
commit
23e61c88e3

+ 110 - 74
module_kzks/src/main/java/org/jeecg/modules/projectCostHuiji/controller/ProjectCostHuijiController.java

@@ -1,5 +1,6 @@
 package org.jeecg.modules.projectCostHuiji.controller;
 
+import ch.qos.logback.core.util.TimeUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -133,12 +134,20 @@ public class ProjectCostHuijiController extends JeecgController<ProjectCostHuiji
         //if (AuthMark.BOSS.equals(role)) role = AuthMark.DEPT_LEADER;
         ProjectCostHuijiSumVO sumVO = new ProjectCostHuijiSumVO();
 
+        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(8, 8, 30, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100));
 
         ProjectCostHuiji huiji1 = new ProjectCostHuiji();
 
         QueryWrapper<ProjectCostHuiji> queryWrapper = QueryGenerator.initQueryWrapper(huiji1, req.getParameterMap());
         List<String> departNames = new ArrayList<>();
 
+        //高级查询参数不等于"null"并且有查询条件("[%5B%5D]" 高级查询无查询条件) 则返回true,获取满足查询条件的任务号
+        //普通查询有查询条件则returnFlag()返回true,判断条件是ProjectCostHuiji对象有任意属性不为null
+        String superQueryParams = Arrays.toString(req.getParameterMap().get("superQueryParams"));
+        String superQueryParamsMd5 = Md5Util.md5Encode(superQueryParams, "utf-8");
+        if (projectCostHuiji == null) projectCostHuiji = new ProjectCostHuiji();
+        boolean hasTaskno = projectCostHuiji.getTaskno() != null && !projectCostHuiji.getTaskno().isEmpty() ;
+
         if (AuthMark.STAFF.equals(role)) {
             LoginUser finalSysUser = sysUser;
             queryWrapper.lambda().and(i -> {
@@ -147,18 +156,24 @@ public class ProjectCostHuijiController extends JeecgController<ProjectCostHuiji
             });
         }
 
+        boolean tips;
         if (AuthMark.DEPT_LEADER.equals(role)) {
+            tips = true;
             String[] deptIds = sysUser.getDepartIds().split(",");
             departNames = sysDepartMapper.getDepNameByIds(deptIds);
             List<String> finalDepartNames = departNames;
-            queryWrapper.lambda().and(i -> {
-                for (String departName : finalDepartNames) {
-                    i.or().like(StringUtils.isNotBlank(departName), ProjectCostHuiji::getJycs, departName)
-                            .or().like(StringUtils.isNotBlank(departName), ProjectCostHuiji::getZrbm, departName);
-                }
-            });
+            if (!hasTaskno) {
+                queryWrapper.lambda().and(i -> {
+                    for (String departName : finalDepartNames) {
+                        i.or().like(StringUtils.isNotBlank(departName), ProjectCostHuiji::getJycs, departName)
+                                .or().like(StringUtils.isNotBlank(departName), ProjectCostHuiji::getZrbm, departName);
+                    }
+                });
+            }
             projectCostHuiji.setDeptNames(departNames);
             sysUser = new LoginUser();
+        } else {
+            tips = false;
         }
 
         if (AuthMark.BOSS.equals(role)) {
@@ -170,8 +185,7 @@ public class ProjectCostHuijiController extends JeecgController<ProjectCostHuiji
         queryWrapper.lambda().like(StringUtils.isNotBlank(projectCostHuiji.getTaskno()), ProjectCostHuiji::getTaskno, projectCostHuiji.getTaskno());
         queryWrapper.lambda().like(StringUtils.isNotBlank(projectCostHuiji.getTaskname()), ProjectCostHuiji::getTaskname, projectCostHuiji.getTaskname());
 
-        String superQueryParams = Arrays.toString(req.getParameterMap().get("superQueryParams"));
-        String superQueryParamsMd5 = Md5Util.md5Encode(superQueryParams, "utf-8");
+        boolean flag = !superQueryParams.equals("null") && !"[%5B%5D]".equals(superQueryParams) || returnFlag(projectCostHuiji);
         String ObjectMd5 = Md5Util.md5Encode(projectCostHuiji.toString(), "utf-8");
         ProjectCostHuijiSumVO cacheResultOne = (ProjectCostHuijiSumVO) redisUtil.get(CacheKey.PROJECT_COST_HUIJI + ":" + role + ":" + departNames + ":" + sysUser.getRealname() + ":" + ObjectMd5 + ":" + superQueryParamsMd5 + ":" + pageNo + "&" + pageSize);
         ProjectCostSumVo cacheResultTwo = (ProjectCostSumVo) redisUtil.get(CacheKey.PROJECT_COST + ":" + role + ":" + departNames + ":" + sysUser.getRealname() + ":" + ObjectMd5 + ":" + superQueryParamsMd5 + ":" + pageNo + "&" + pageSize);
@@ -179,10 +193,6 @@ public class ProjectCostHuijiController extends JeecgController<ProjectCostHuiji
         if (cacheResultTwo != null) return Result.ok(cacheResultTwo);
 
 
-        //高级查询参数不等于"null"并且有查询条件("[%5B%5D]" 高级查询无查询条件) 则返回true,获取满足查询条件的任务号
-        //普通查询有查询条件则returnFlag()返回true,判断条件是ProjectCostHuiji对象有任意属性不为null
-        boolean flag = !superQueryParams.equals("null") && !"[%5B%5D]".equals(superQueryParams) || returnFlag(projectCostHuiji);
-
         List<String> taskNos;
         if (flag) {
             List<ProjectCostHuiji> resultList = projectCostHuijiService.selectList(queryWrapper);
@@ -191,13 +201,20 @@ public class ProjectCostHuijiController extends JeecgController<ProjectCostHuiji
             taskNos = new ArrayList<>();
         }
 
+        boolean finalFlag = flag;
+        ProjectCostHuiji finalProjectCostHuiji = projectCostHuiji;
         CompletableFuture<ProjectCostHuiji> huijiFuture = CompletableFuture.supplyAsync(() -> {
-            if (!flag)
-                return projectCostHuijiService.costHJSum(projectCostHuiji);//汇集总和
+            if (tips && !finalFlag) {
+                ProjectCostHuiji huiji = new ProjectCostHuiji();
+                huiji.setDeptNames(finalProjectCostHuiji.getDeptNames());
+                return projectCostHuijiService.costHJSum(huiji);
+            }
+            if (!finalFlag)
+                return projectCostHuijiService.costHJSum(finalProjectCostHuiji);//汇集总和
             if (taskNos.isEmpty())
                 return initProjectCostHuiji();
             return projectCostHuijiService.costHJSumByTaskNoList(taskNos);
-        });
+        },threadPoolExecutor);
 
         //当前任务号集合是查询的汇集表,一定是主任务的任务号集合,所以根据主任务号,查询子级任务号
         if (!taskNos.isEmpty()) {
@@ -206,17 +223,17 @@ public class ProjectCostHuijiController extends JeecgController<ProjectCostHuiji
         }
 
         CompletableFuture<KzksProjectCostYs> ysFuture = CompletableFuture.supplyAsync(() -> {
-            if (!flag)
+            if (!finalFlag)
                 return costYsService.selectSumClys();
             if (taskNos.isEmpty())
                 return new KzksProjectCostYs();
             return costYsService.selectSumClysByTaskNos(taskNos);
-        });
+        },threadPoolExecutor);
 
         Page<ProjectCostHuiji> page = new Page<>(pageNo, pageSize);
         CompletableFuture<Page<ProjectCostHuiji>> pageFuture = CompletableFuture.supplyAsync(() -> {
             return projectCostHuijiService.costHuijPage(page, queryWrapper);
-        });
+        },threadPoolExecutor);
 
         CompletableFuture<Void> future1 = CompletableFuture.allOf(huijiFuture, pageFuture, ysFuture);
         future1.join();
@@ -227,50 +244,67 @@ public class ProjectCostHuijiController extends JeecgController<ProjectCostHuiji
         if (ObjectUtils.isEmpty(ys.getClys())) ys.setClys(BigDecimal.valueOf(0));
         if (ObjectUtils.isEmpty(ys.getWxys())) ys.setWxys(BigDecimal.valueOf(0));
         if (pageList != null && !pageList.getRecords().isEmpty()) {//costYsService
-            List<ProjectCostHuijiListVO> list = pageList.getRecords().stream().map(i -> {
-
-                List<ProjectCostVO> children1 = costService.costListByTaskNoMain(i.getTaskno()); //主任务及批产的主任务
-                List<ProjectCostVO> children2 = costService.costListByTaskNoSub(i.getTaskno()); //子任务及批产的子任务
-                List<ProjectCostVO> children = new ArrayList<>();
-
-                CompletableFuture<List<ProjectCostVO>> children3Future = CompletableFuture.supplyAsync(() -> {
-                    return children1.stream().map(this::apply).collect(Collectors.toList());
-                });
-
-                CompletableFuture<List<ProjectCostVO>> children4Future = CompletableFuture.supplyAsync(() -> {
-                    return children2.stream().map(this::apply).collect(Collectors.toList());
-                });
-
-                CompletableFuture<Void> future = CompletableFuture.allOf(children3Future, children4Future);
-                future.join();
-
-                List<ProjectCostVO> children3 = children3Future.join();
-                List<ProjectCostVO> children4 = children4Future.join();
-                children.addAll(children3);
-                children.addAll(children4);
-                BigDecimal wxysSum = BigDecimal.valueOf(0);
-                BigDecimal clysSum = BigDecimal.valueOf(0);
-
-                CompletableFuture<BigDecimal> wxysFuture = CompletableFuture.supplyAsync(() -> {
-                    return children.stream().filter(o -> {
-                        return ObjectUtils.isEmpty(o.getStatus()) || (!"1".equals(o.getStatus()));
-                    }).map(ProjectCostVO::getWxys).filter(ObjectUtils::isNotEmpty).reduce(BigDecimal.ZERO, BigDecimal::add);
-                });
-
-                CompletableFuture<BigDecimal> clysFuture = CompletableFuture.supplyAsync(() -> {
-                    return children.stream().filter(o -> {
-                        return ObjectUtils.isEmpty(o.getStatus()) || (!"1".equals(o.getStatus()));
-                    }).map(ProjectCostVO::getClys).filter(ObjectUtils::isNotEmpty).reduce(BigDecimal.ZERO, BigDecimal::add);
-                });
-
-                CompletableFuture<Void> future2 = CompletableFuture.allOf(wxysFuture, clysFuture);
-                future2.join();
-                wxysSum = wxysFuture.join();
-                clysSum = clysFuture.join();
-
-                return projectCostHuijiConverCustom.toHuijiListVOAndYs(i, children, 1, wxysSum, clysSum);
 
+            List<CompletableFuture<ProjectCostHuijiListVO>> collect = pageList.getRecords().stream().map(i -> {
+                return CompletableFuture.supplyAsync(() -> {
+                    List<ProjectCostVO> children1 = costService.costListByTaskNoMain(i.getTaskno()); //主任务及批产的主任务
+                    List<ProjectCostVO> children2 = costService.costListByTaskNoSub(i.getTaskno()); //子任务及批产的子任务
+                    List<ProjectCostVO> children = new ArrayList<>();
+
+                    CompletableFuture<List<ProjectCostVO>> children3Future = CompletableFuture.supplyAsync(() -> {
+                        return children1.stream().map(this::apply).collect(Collectors.toList());
+                    });
+
+                    CompletableFuture<List<ProjectCostVO>> children4Future = CompletableFuture.supplyAsync(() -> {
+                        return children2.stream().map(this::apply).collect(Collectors.toList());
+                    });
+
+                    CompletableFuture<Void> future = CompletableFuture.allOf(children3Future, children4Future);
+                    future.join();
+
+                    List<ProjectCostVO> children3 = children3Future.join();
+                    List<ProjectCostVO> children4 = children4Future.join();
+                    children.addAll(children3);
+                    children.addAll(children4);
+                    BigDecimal wxysSum = BigDecimal.valueOf(0);
+                    BigDecimal clysSum = BigDecimal.valueOf(0);
+
+                    CompletableFuture<BigDecimal> wxysFuture = CompletableFuture.supplyAsync(() -> {
+                        return children.stream().filter(o -> {
+                            return ObjectUtils.isEmpty(o.getStatus()) || (!"1".equals(o.getStatus()));
+                        }).map(ProjectCostVO::getWxys).filter(ObjectUtils::isNotEmpty).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    });
+
+                    CompletableFuture<BigDecimal> clysFuture = CompletableFuture.supplyAsync(() -> {
+                        return children.stream().filter(o -> {
+                            return ObjectUtils.isEmpty(o.getStatus()) || (!"1".equals(o.getStatus()));
+                        }).map(ProjectCostVO::getClys).filter(ObjectUtils::isNotEmpty).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    });
+
+                    CompletableFuture<Void> future2 = CompletableFuture.allOf(wxysFuture, clysFuture);
+                    future2.join();
+                    wxysSum = wxysFuture.join();
+                    clysSum = clysFuture.join();
+
+                    return projectCostHuijiConverCustom.toHuijiListVOAndYs(i, children, 1, wxysSum, clysSum);
+                },threadPoolExecutor);
             }).collect(Collectors.toList());
+            CompletableFuture<?>[] futures = collect.toArray(new CompletableFuture[0]);
+            CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures);
+            try {
+                allFutures.get(); // 等待所有任务完成
+            } catch (InterruptedException | ExecutionException e) {
+                e.printStackTrace();
+            }
+
+            List<ProjectCostHuijiListVO> list = new ArrayList<>();
+            for (CompletableFuture<ProjectCostHuijiListVO> future : collect) {
+                try {
+                    list.add(future.get()); // 获取每个任务的结果
+                } catch (InterruptedException | ExecutionException e) {
+                    e.printStackTrace();
+                }
+            }
 
             IPage<ProjectCostHuijiListVO> pageList1 = ProjectCostHuijiConvert.INSTANCE.toHuijiListVOPage(pageList, list);
 
@@ -285,7 +319,7 @@ public class ProjectCostHuijiController extends JeecgController<ProjectCostHuiji
             sumVO.setPageList(pageList1);
 
             redisUtil.set(CacheKey.PROJECT_COST_HUIJI + ":" + role + ":" + departNames + ":" + sysUser.getRealname() + ":" + ObjectMd5 + ":" + superQueryParamsMd5 + ":" + pageNo + "&" + pageSize, sumVO, 1000L * 60 * 60 * 10);
-
+            threadPoolExecutor.shutdown();
             return Result.OK(sumVO);
         } else {
             ProjectCost projectCost = new ProjectCost();
@@ -307,12 +341,14 @@ public class ProjectCostHuijiController extends JeecgController<ProjectCostHuiji
 
             if (AuthMark.DEPT_LEADER.equals(role)) {
                 List<String> finalDepartNames1 = departNames;
-                query.lambda().and(i -> {
-                    for (String departName : finalDepartNames1) {
-                        i.or().like(StringUtils.isNotBlank(departName), ProjectCost::getClys, departName)
-                                .or().like(StringUtils.isNotBlank(departName), ProjectCost::getZrbm, departName);
-                    }
-                });
+                if (!hasTaskno) {
+                    query.lambda().and(i -> {
+                        for (String departName : finalDepartNames1) {
+                            i.or().like(StringUtils.isNotBlank(departName), ProjectCost::getClys, departName)
+                                    .or().like(StringUtils.isNotBlank(departName), ProjectCost::getZrbm, departName);
+                        }
+                    });
+                }
                 projectCost.setDeptNames(departNames);
                 sysUser = new LoginUser();
             }
@@ -328,13 +364,13 @@ public class ProjectCostHuijiController extends JeecgController<ProjectCostHuiji
             CompletableFuture<Page<ProjectCost>> pageCompletableFuture = CompletableFuture.supplyAsync(() -> {
                 Page<ProjectCost> page1 = new Page<ProjectCost>(pageNo, pageSize);
                 return costService.getCostListPage(page1, query);
-            });
+            },threadPoolExecutor);
 
             //根据条件查询所有满足条件的任务号
             CompletableFuture<List<String>> listCompletableFuture = CompletableFuture.supplyAsync(() -> {
                 List<ProjectCost> costs = costService.projectCostlist(clone);
                 return costs.stream().map(ProjectCost::getTaskno).collect(Collectors.toList());
-            });
+            },threadPoolExecutor);
 
             CompletableFuture<Void> future = CompletableFuture.allOf(pageCompletableFuture, listCompletableFuture);
             future.join();
@@ -351,17 +387,17 @@ public class ProjectCostHuijiController extends JeecgController<ProjectCostHuiji
                 }
                 if (projectCostHuiji1 == null) projectCostHuiji1 = initProjectCostHuiji();
                 return projectCostHuiji1;
-            });
+            },threadPoolExecutor);
 
             CompletableFuture<KzksProjectCostYs> kzksProjectCostYsCompletableFuture = CompletableFuture.supplyAsync(() -> {
                 if (taskList.isEmpty()) return new KzksProjectCostYs();
                 return costYsService.selectSumClysByTaskNos(taskList);
-            });
+            },threadPoolExecutor);
 
             CompletableFuture<Integer> yzslCompletableFuture = CompletableFuture.supplyAsync(() -> {
                 if (taskList.isEmpty()) return 0;
                 return costService.getYzslSumByTaskNos(taskList);
-            });
+            },threadPoolExecutor);
 
 
             CompletableFuture<ArrayList<ProjectCostVO>> arrayListCompletableFuture = CompletableFuture.supplyAsync(() -> {
@@ -384,7 +420,7 @@ public class ProjectCostHuijiController extends JeecgController<ProjectCostHuiji
                     projectCostVOS.add(projectCostVO);
                 }
                 return projectCostVOS;
-            });
+            },threadPoolExecutor);
 
             CompletableFuture<Void> future2 = CompletableFuture.allOf(projectCostHuijiCompletableFuture, kzksProjectCostYsCompletableFuture, arrayListCompletableFuture, yzslCompletableFuture);
             future2.join();
@@ -427,7 +463,7 @@ public class ProjectCostHuijiController extends JeecgController<ProjectCostHuiji
             projectCostSumVo.setPageList(projectCostListVOPage);
 
             redisUtil.set(CacheKey.PROJECT_COST + ":" + role + ":" + departNames + ":" + sysUser.getRealname() + ":" + ObjectMd5 + ":" + superQueryParamsMd5 + ":" + pageNo + "&" + pageSize, projectCostSumVo, 1000L * 60 * 60 * 10);
-
+            threadPoolExecutor.shutdown();
             return Result.OK(projectCostSumVo);
         }
     }

+ 1 - 1
module_kzks/src/main/java/org/jeecg/modules/projectCostHuiji/mapper/xml/ProjectCostHuijiMapper.xml

@@ -29,7 +29,7 @@
                     #{name}
                 </foreach>
             </if>
-            <if test="deptNames != null">and jycs in
+            <if test="deptNames != null">or jycs in
                 <foreach collection="deptNames" index="index" item="name" open="(" separator="," close=")">
                     #{name}
                 </foreach>