|
@@ -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);
|
|
|
}
|
|
|
}
|