From 082a6761ec505550665094b124a2e520381f302a Mon Sep 17 00:00:00 2001 From: erdanergou Date: Fri, 14 Jul 2023 16:28:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=97=AD=E6=97=A5=E5=9B=BE?= =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 + .../config/PublicConfig.java | 2 + .../controller/DepositoryController.java | 48 +--- .../DepositoryRecordController.java | 106 ++++++++ .../controller/PageController.java | 25 +- .../mapper/DepositoryRecordMapper.xml | 3 + .../service/DepositoryRecordService.java | 10 + .../impl/DepositoryRecordServiceImpl.java | 136 ++++++++-- .../depository_manage/utils/DateUtil.java | 29 ++- .../InAndOut_echart/LineOrBarChart.html | 2 +- .../InAndOut_echart/SunburstChart.html | 245 ++++++++++++++++++ .../templates/pages/depository/table-in.html | 24 +- .../templates/pages/depository/table-out.html | 24 +- .../depository_manage/SunburstChartTest.java | 235 +++++++---------- 14 files changed, 667 insertions(+), 228 deletions(-) create mode 100644 src/main/resources/templates/pages/depository/InAndOut_echart/SunburstChart.html diff --git a/pom.xml b/pom.xml index 625de7ed..8d6c476b 100644 --- a/pom.xml +++ b/pom.xml @@ -48,6 +48,12 @@ 3.4.2 + + + + + + ch.qos.logback logback-classic diff --git a/src/main/java/com/dreamchaser/depository_manage/config/PublicConfig.java b/src/main/java/com/dreamchaser/depository_manage/config/PublicConfig.java index d6d8191a..8d0c11c9 100644 --- a/src/main/java/com/dreamchaser/depository_manage/config/PublicConfig.java +++ b/src/main/java/com/dreamchaser/depository_manage/config/PublicConfig.java @@ -41,6 +41,8 @@ public class PublicConfig { // 定义redis加锁的名称 public static String redis_Lock_name = "Wms_redis_lock"; + public static int availableVirtualMachine = Runtime.getRuntime().availableProcessors(); + /** * 获取相应部门的部门负责人 * diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryController.java b/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryController.java index 117bc2e1..c7b68e9c 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryController.java @@ -1261,52 +1261,10 @@ public class DepositoryController { } - /** - * 用于获取出入库的柱状图数据 - * - * @param map 查询数据 - * @param request - * @return - */ - @PostMapping("/getBarChartDataByDateType") - public RestResponse getBarChartDataByDateType(@RequestBody Map map, HttpServletRequest request) { - if (!map.containsKey("echartType")) { - throw new MyException("错误,请指定图表类型"); - } - String echartType = map.get("echartType"); - // 获取要查询的类型(1入库2出库) - String type = map.get("type"); - // 声明要查询时的日期类型 day代表按天,month代表按月 - String dateType = "day"; - if (map.containsKey("dateType")) { - dateType = map.get("dateType"); - } - Integer depositoryId = -1; - if (map.containsKey("depositoryId")) { - // 如果选择了仓库,则使用选中的仓库 - depositoryId = ObjectFormatUtil.toInteger(map.get("depositoryId")); - } else { - // 如果没选中仓库 - String token = request.getHeader("user-token"); - if (token == null) { - token = (String) request.getSession().getAttribute("userToken"); - } - UserByPort userToken = AuthenticationTokenPool.getUserToken(token); - // 获取当前用户可见的仓库id - List depositoryIdForUser = roleService.findDepositoryIdForUser(userToken); - // 如果存在仓库 - if (depositoryIdForUser != null && depositoryIdForUser.size() > 0) { - // 默认为第一个 - depositoryId = depositoryIdForUser.get(0); - } - } - Map data = new HashMap<>(); - if (depositoryId != -1) { - data = depositoryRecordService.getLineOrBarChartData(depositoryId, type, dateType, echartType); - } - return new RestResponse(data); - } + + + /** * 用于获取当前仓库的所有子类 diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java b/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java index 3aefa302..1d4654ab 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java @@ -56,6 +56,10 @@ public class DepositoryRecordController { private RoleService roleService; + @Autowired + private MaterialTypeService materialTypeService; + + @GetMapping("/myApply") public RestResponse findDepositoryInAndOutRecordPByCondition(@RequestParam Map map, HttpServletRequest request) { String token = request.getHeader("user-token"); @@ -2503,4 +2507,106 @@ public class DepositoryRecordController { return new RestResponse(result); } + + /** + * 用于获取出入库的柱状或折线图数据 + * + * @param map 查询数据 + * @param request + * @return + */ + @PostMapping("/getBarChartDataByDateType") + public RestResponse getBarChartDataByDateType(@RequestBody Map map, HttpServletRequest request) { + if (!map.containsKey("echartType")) { + throw new MyException("错误,请指定图表类型"); + } + String echartType = map.get("echartType"); + // 获取要查询的类型(1入库2出库) + String type = map.get("type"); + // 声明要查询时的日期类型 day代表按天,month代表按月 + String dateType = "day"; + + if (map.containsKey("dateType")) { + dateType = map.get("dateType"); + } + Integer depositoryId = -1; + if (map.containsKey("depositoryId")) { + // 如果选择了仓库,则使用选中的仓库 + depositoryId = ObjectFormatUtil.toInteger(map.get("depositoryId")); + } else { + // 如果没选中仓库 + String token = request.getHeader("user-token"); + if (token == null) { + token = (String) request.getSession().getAttribute("userToken"); + } + UserByPort userToken = AuthenticationTokenPool.getUserToken(token); + // 获取当前用户可见的仓库id + List depositoryIdForUser = roleService.findDepositoryIdForUser(userToken); + // 如果存在仓库 + if (depositoryIdForUser != null && depositoryIdForUser.size() > 0) { + // 默认为第一个 + depositoryId = depositoryIdForUser.get(0); + } + } + Map data = new HashMap<>(); + if (depositoryId != -1) { + data = depositoryRecordService.getLineOrBarChartData(depositoryId, type, dateType, echartType); + } + return new RestResponse(data); + } + + + /** + * 用于获取出入库的旭日图的数据 + * @param map 查询数据 + * @param request + * @return + */ + @PostMapping("/getSunBurstDataForApplication") + public RestResponse getSunBurstDataForApplication(@RequestBody Map map, HttpServletRequest request) { +// String dateName, String type, Long start, Long end, List materialTypeAll + if (!map.containsKey("type")) { + throw new MyException("错误,请指定图表类型"); + } + // 获取图表类型 + String type = map.get("type"); + // 获取要查看的日期 + String dateName = null; + int month = -1; + if (map.containsKey("dateName")) { + dateName = map.get("dateName"); + month = ObjectFormatUtil.toInteger(dateName.split("月")[0]); + } else { + Calendar instance = Calendar.getInstance(); + month = instance.get(Calendar.MONTH) + 1; + dateName = month + "月"; + } + Integer depositoryId = -1; + if (map.containsKey("depositoryId")) { + // 如果选择了仓库,则使用选中的仓库 + depositoryId = ObjectFormatUtil.toInteger(map.get("depositoryId")); + } else { + // 如果没选中仓库 + String token = request.getHeader("user-token"); + if (token == null) { + token = (String) request.getSession().getAttribute("userToken"); + } + UserByPort userToken = AuthenticationTokenPool.getUserToken(token); + // 获取当前用户可见的仓库id + List depositoryIdForUser = roleService.findDepositoryIdForUser(userToken); + // 如果存在仓库 + if (depositoryIdForUser != null && depositoryIdForUser.size() > 0) { + // 默认为第一个 + depositoryId = depositoryIdForUser.get(0); + } + } + // 获取当前month月与下个月的月初 + Map timeSpaceMap = DateUtil.getThisMonthTimeSpace(month); + Long start = timeSpaceMap.get("start"); + Long end = timeSpaceMap.get("end"); + // 获取所有顶级物料类型 + List materialTypeNoParent = materialTypeService.findMaterialTypeNoParent(); + Map data = depositoryRecordService.getSunBurstDataByForApplication(dateName, type, start, end, materialTypeNoParent,depositoryId); + return new RestResponse(data); + } } diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/PageController.java b/src/main/java/com/dreamchaser/depository_manage/controller/PageController.java index 71689cd2..3b5be42a 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/PageController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/PageController.java @@ -3944,8 +3944,14 @@ public class PageController { } - @GetMapping("/echartForTable") - public ModelAndView echartForTable(String type, String echartType) { + /** + * 用于跳转到折线或柱状图 + * @param type 要查看的出入库 + * @param echartType 图表类型 + * @return + */ + @GetMapping("/lineOrBarEchartForTable") + public ModelAndView lineOrBarEchartForTable(String type, String echartType) { ModelAndView mv = new ModelAndView(); mv.addObject("type", type); mv.addObject("echartType", echartType); @@ -3953,4 +3959,19 @@ public class PageController { return mv; } + /** + * 用于跳转到折线或柱状图 + * @param type 要查看的出入库 + * @return + */ + @GetMapping("/sunburstEchartForTable") + public ModelAndView sunburstEchartForTable(String type) { + ModelAndView mv = new ModelAndView(); + mv.addObject("type", type); + Map previousMonth = DateUtil.getPreviousMonth(); + List monthNames = ObjectFormatUtil.objToList(previousMonth.get("monthNames"), String.class); + mv.addObject("monthNames", monthNames); + mv.setViewName("pages/depository/InAndOut_echart/SunburstChart"); + return mv; + } } diff --git a/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryRecordMapper.xml b/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryRecordMapper.xml index ca1e7b72..47c284a3 100644 --- a/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryRecordMapper.xml +++ b/src/main/java/com/dreamchaser/depository_manage/mapper/DepositoryRecordMapper.xml @@ -1833,6 +1833,9 @@ and tname = #{tname} + + and did = #{depository_id} + and mtid in diff --git a/src/main/java/com/dreamchaser/depository_manage/service/DepositoryRecordService.java b/src/main/java/com/dreamchaser/depository_manage/service/DepositoryRecordService.java index b02c77e3..4e06ed80 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/DepositoryRecordService.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/DepositoryRecordService.java @@ -510,6 +510,16 @@ public interface DepositoryRecordService { Map getLineOrBarChartData(Integer depositoryId, String type, String dateType, String echartType); + /** + * 用于获取出入库的旭日图数据 + * @param dateName 当前月份名称 + * @param type 查看类型 + * @param start 开始时间 + * @param end 结束时间 + * @param materialTypeAll 当前查看物料类型 + * @return + */ + Map getSunBurstDataByForApplication(String dateName, String type, Long start, Long end, List materialTypeAll,Integer depositoryId); } diff --git a/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java b/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java index b3a08ca5..f6d7ea43 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/impl/DepositoryRecordServiceImpl.java @@ -5297,10 +5297,10 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { double sumCount = 0; if (type == 1) { // 如果入库 - sumCount = depositoryRecordMapper.findApplicationInByMonthTest(map) / 100.0; + sumCount = ObjectFormatUtil.divide(depositoryRecordMapper.findApplicationInByMonthTest(map) , 100.0,2); } else { // 如果出库 - sumCount = depositoryRecordMapper.findApplicationOutByMonth(map) / 100.0; + sumCount = ObjectFormatUtil.divide(depositoryRecordMapper.findApplicationOutByMonth(map), 100.0, 2); } return sumCount; } @@ -5728,33 +5728,19 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { public List findChildForMaterialTypeByParent(MaterialType mt) { List result = new ArrayList<>(); result.add(mt.getOldId()); - List parentId = new ArrayList<>(); - parentId.add(mt.getOldId()); + List parentIdList = new ArrayList<>(); + parentIdList.add(mt.getOldId()); List materialTypeAll = materialTypeMapper.findMaterialTypeAll(); for (MaterialType materialType : materialTypeAll) { - if (isTrueForParent(parentId, materialType.getParentId())) { - parentId.add(materialType.getOldId()); + Long parentId = materialType.getParentId(); + if (parentIdList.contains(parentId)) { + parentIdList.add(materialType.getOldId()); result.add(materialType.getOldId()); } } return result; } - /** - * 判断当前id是否在ids中 - * - * @param parentList - * @param id - * @return - */ - public Boolean isTrueForParent(List parentList, Long id) { - for (Long aLong : parentList) { - if (Long.compare(aLong, id) == 0) { - return true; - } - } - return false; - } /** * 判断当前id是否在ids中 @@ -5966,4 +5952,112 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { return map; } + + /** + * 用于获取出入库的旭日图数据 + * @param dateName 当前月份名称 + * @param type 查看类型 + * @param start 开始时间 + * @param end 结束时间 + * @param materialTypeAll 当前查看物料类型 + * @return + */ + public Map getSunBurstDataByForApplication(String dateName, String type, Long start, Long end, List materialTypeAll,Integer depositoryId) { + + + Map result = new HashMap<>(); + + int maxThreadSize = materialTypeAll.size(); + + int threadSize = Runtime.getRuntime().availableProcessors(); + + ExecutorService exs = new ThreadPoolExecutor(threadSize, maxThreadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(maxThreadSize)); + + // 结果集 + List> futureList = new ArrayList>(); + // 1.定义CompletionService + CompletionService completionService = new ExecutorCompletionService(exs); + + List resultForData = new ArrayList<>(); + for (MaterialType materialType : materialTypeAll) { + // 测试 + Future future = completionService.submit(new getSunBurstDataForApplicationByDepository(type, start, end, materialType,depositoryId)); + futureList.add(future); + } + double sum = 0.0; + for (int i = 0; i < materialTypeAll.size(); i++) { + Object obj = null; + try { + obj = completionService.take().get(); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + resultForData.add(obj); + if (obj != null) { + sum += ObjectFormatUtil.toDouble(ObjectFormatUtil.objToMap(obj, String.class, Object.class).get("value")); + } + } + result.put("children", resultForData); + result.put("name", dateName); + result.remove("month"); + result.put("value", sum); + // 用于生产随机的颜色 + Random random = new Random(); + Map itemStyle = new HashMap<>(); + int r = random.nextInt(256); + int g = random.nextInt(256); + int b = random.nextInt(256); + itemStyle.put("color", "rgb(" + r + "," + g + "," + b + ")"); + result.put("itemStyle", itemStyle); + return result; + } + + /** + * 用于具体执行查询旭日图的多线程类 + */ + class getSunBurstDataForApplicationByDepository implements Callable { + + + String type; + Long start; + Long end; + MaterialType materialType; + Integer depositoryId; + + public getSunBurstDataForApplicationByDepository(String type, Long start, Long end, MaterialType materialType,Integer depositoryId) { + this.type = type; + this.start = start; + this.end = end; + this.materialType = materialType; + this.depositoryId = depositoryId; + } + + @Override + public Object call() throws Exception { + Map map = new HashMap<>(); + map.put("type", ObjectFormatUtil.toInteger(type)); + map.put("start", start); + map.put("end", end); + map.put("depository_id", depositoryId); + map.put("oldId", materialType.getOldId()); + Map result = new HashMap<>(); + Double materialCountByMonth = calMaterialTypeTopCount(map); + result.put("name", materialType.getTname()); + result.put("value", materialCountByMonth); + Map itemStyle = new HashMap<>(); + // 用于生产随机的颜色 + Random random = new Random(); + int r = random.nextInt(256); + int g = random.nextInt(256); + int b = random.nextInt(256); + itemStyle.put("color", "rgb(" + r + "," + g + "," + b + ")"); + result.put("itemStyle", itemStyle); + return result; + } + } + + + + + } diff --git a/src/main/java/com/dreamchaser/depository_manage/utils/DateUtil.java b/src/main/java/com/dreamchaser/depository_manage/utils/DateUtil.java index 9f7541ea..b673eb82 100644 --- a/src/main/java/com/dreamchaser/depository_manage/utils/DateUtil.java +++ b/src/main/java/com/dreamchaser/depository_manage/utils/DateUtil.java @@ -292,6 +292,7 @@ public class DateUtil { /** * 获取本月至今每天零时的日期时间戳及日期名称 + * * @return */ public static Map getMonthBeginToNow() { @@ -305,7 +306,7 @@ public class DateUtil { List dayTimeSpaceList = new ArrayList<>(); Calendar cal = Calendar.getInstance(); // 获取当天是这个月的第几天 - int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH) ; + int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH); cal.add(Calendar.MONTH, 0); cal.set(Calendar.DAY_OF_MONTH, 1); // 时 @@ -327,9 +328,31 @@ public class DateUtil { Collections.reverse(dayTimeSpaceList); // 反转 Collections.reverse(dayNameStrings); - result.put("dayName",dayNameStrings); - result.put("dayTimeSpace",dayTimeSpaceList); + result.put("dayName", dayNameStrings); + result.put("dayTimeSpace", dayTimeSpaceList); + return result; + } + + /** + * 获取当前月份与下个月份的月初时间 + * + * @param month 待获取月份 + * @return + */ + public static Map getThisMonthTimeSpace(int month) { + Map result = new HashMap<>(); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM"); + Calendar instance = Calendar.getInstance(); + instance.set(Calendar.MONTH, month - 1); + String start = formatter.format(instance.getTime()); + Long startTimeSpace = DateUtil.DateTimeByMonthToTimeStamp(start); + instance.add(Calendar.MONTH, 1); + String end = formatter.format(instance.getTime()); + Long endTimeSpace = DateUtil.DateTimeByMonthToTimeStamp(end); + result.put("start", startTimeSpace); + result.put("end", endTimeSpace); return result; } + } diff --git a/src/main/resources/templates/pages/depository/InAndOut_echart/LineOrBarChart.html b/src/main/resources/templates/pages/depository/InAndOut_echart/LineOrBarChart.html index ed20dd60..5f85bd17 100644 --- a/src/main/resources/templates/pages/depository/InAndOut_echart/LineOrBarChart.html +++ b/src/main/resources/templates/pages/depository/InAndOut_echart/LineOrBarChart.html @@ -169,7 +169,7 @@ initBarChartByDateType = function (req) { $.ajax({ - url: '/repository/getBarChartDataByDateType', + url: '/depositoryRecord/getBarChartDataByDateType', type: 'post', dataType: "json", data: JSON.stringify(req), diff --git a/src/main/resources/templates/pages/depository/InAndOut_echart/SunburstChart.html b/src/main/resources/templates/pages/depository/InAndOut_echart/SunburstChart.html new file mode 100644 index 00000000..6c4754f5 --- /dev/null +++ b/src/main/resources/templates/pages/depository/InAndOut_echart/SunburstChart.html @@ -0,0 +1,245 @@ + + + + + 旭日图 + + + + + + + + + + + +
+
+

旭日图

+
+ + + +
+
+
+ +
+ + + + + + + diff --git a/src/main/resources/templates/pages/depository/table-in.html b/src/main/resources/templates/pages/depository/table-in.html index 31edf8a1..12806f82 100644 --- a/src/main/resources/templates/pages/depository/table-in.html +++ b/src/main/resources/templates/pages/depository/table-in.html @@ -329,30 +329,40 @@ $("#showEchart").append(listItem) }else if(obj.event === "showSunburstEchart"){ - console.log("showSunburstEchart") + layer.open({ + type: 2, + offset: 'r', + anim: 'slideLeft', // 从右往左 + area: ['40%', '100%'], + shade: 0.1, + title: "旭日图", + shadeClose: true, + id: 'applicationOutInfoForLeft', + content: '/sunburstEchartForTable?type=1', + }); }else if(obj.event === "showLineEchart"){ layer.open({ type: 2, - offset: 'l', - anim: 'slideRight', // 从右往左 + offset: 'r', + anim: 'slideLeft', // 从右往左 area: ['40%', '100%'], shade: 0.1, title: "折线图", shadeClose: true, id: 'applicationOutInfoForLeft', - content: '/echartForTable?type=1&echartType=line', + content: '/lineOrBarEchartForTable?type=1&echartType=line', }); }else if(obj.event === "showBarEchart"){ layer.open({ type: 2, - offset: 'l', - anim: 'slideRight', // 从右往左 + offset: 'r', + anim: 'slideLeft', // 从右往左 area: ['40%', '100%'], shade: 0.1, title: "柱状图", shadeClose: true, id: 'applicationOutInfoForLeft', - content: '/echartForTable?type=1&echartType=bar', + content: '/lineOrBarEchartForTable?type=1&echartType=bar', }); } diff --git a/src/main/resources/templates/pages/depository/table-out.html b/src/main/resources/templates/pages/depository/table-out.html index 40ece19e..1f51b67b 100644 --- a/src/main/resources/templates/pages/depository/table-out.html +++ b/src/main/resources/templates/pages/depository/table-out.html @@ -488,30 +488,40 @@ $("#showEchart").append(listItem) }else if(obj.event === "showSunburstEchart"){ - console.log("showSunburstEchart") + layer.open({ + type: 2, + offset: 'r', + anim: 'slideLeft', // 从右往左 + area: ['40%', '100%'], + shade: 0.1, + title: "旭日图", + shadeClose: true, + id: 'applicationOutInfoForLeft', + content: '/sunburstEchartForTable?type=2', + }); }else if(obj.event === "showLineEchart"){ layer.open({ type: 2, - offset: 'l', - anim: 'slideRight', // 从右往左 + offset: 'r', + anim: 'slideLeft', // 从右往左 area: ['40%', '100%'], shade: 0.1, title: "折线图", shadeClose: true, id: 'applicationOutInfoForLeft', - content: '/echartForTable?type=2&echartType=line', + content: '/lineOrBarEchartForTable?type=2&echartType=line', }); }else if(obj.event === "showBarEchart"){ layer.open({ type: 2, - offset: 'l', - anim: 'slideRight', // 从右往左 + offset: 'r', + anim: 'slideLeft', // 从右往左 area: ['40%', '100%'], shade: 0.1, title: "柱状图", shadeClose: true, id: 'applicationOutInfoForLeft', - content: '/echartForTable?type=2&echartType=bar', + content: '/lineOrBarEchartForTable?type=2&echartType=bar', }); } diff --git a/src/test/java/com/dreamchaser/depository_manage/SunburstChartTest.java b/src/test/java/com/dreamchaser/depository_manage/SunburstChartTest.java index 7a8eeb19..d5fb1e48 100644 --- a/src/test/java/com/dreamchaser/depository_manage/SunburstChartTest.java +++ b/src/test/java/com/dreamchaser/depository_manage/SunburstChartTest.java @@ -3,6 +3,7 @@ package com.dreamchaser.depository_manage; import com.alibaba.fastjson.JSONObject; import com.dreamchaser.depository_manage.entity.MaterialType; import com.dreamchaser.depository_manage.service.DepositoryRecordService; +import com.dreamchaser.depository_manage.service.DepositoryService; import com.dreamchaser.depository_manage.service.MaterialService; import com.dreamchaser.depository_manage.service.MaterialTypeService; import com.dreamchaser.depository_manage.utils.DateUtil; @@ -31,120 +32,119 @@ public class SunburstChartTest { @Autowired MaterialService materialService; - + @Autowired + DepositoryService depositoryService; @Test - public void main(){ + public void main() { String type = "2"; // 获取本月之前的月份 - Map previousMonth = getPreviousMonth(); + Map previousMonth = DateUtil.getPreviousMonth(); // 获取月份的时间戳 - List months = (List) previousMonth.get("months"); + List months = ObjectFormatUtil.objToList(previousMonth.get("months"), Long.class); // 获取月份名称 - List sourceList = (List) previousMonth.get("sourceList"); + List sourceList = ObjectFormatUtil.objToList(previousMonth.get("sourceList"), Object.class); // 结果集 - List> futureList = new ArrayList>(); - int threadSize = months.size(); + List materialTypeNoParent = materialTypeService.findMaterialTypeNoParent(); - ExecutorService exs = Executors.newFixedThreadPool(months.size()); + // 1.定义CompletionService + Map map = ObjectFormatUtil.objToMap(sourceList.get(4), String.class, Object.class); + Map sourceListTask = getSunBurstDataByForApplication("map", type, months.get(2), months.get(1), materialTypeNoParent); + System.out.println(JSONObject.toJSONString(sourceListTask)); + // 用于返回结果 + + } + + @Test + public void a(){ + int month = 7; + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM"); + Calendar instance = Calendar.getInstance(); + instance.set(Calendar.MONTH, month - 1); + String end = formatter.format(instance.getTime()); + Long endTimeSpace = DateUtil.DateTimeByMonthToTimeStamp(end); + System.out.println("end:"+end); + System.out.println("endTimeSpace:"+endTimeSpace); + instance.add(Calendar.MONTH, 1); + String start = formatter.format(instance.getTime()); + Long startTimeSpace = DateUtil.DateTimeByMonthToTimeStamp(formatter.format(instance.getTime())); + System.out.println("start:"+start); + System.out.println("startTimeSpace:"+startTimeSpace); + } + + + /** + * 用于获取出入库的旭日图数据 + * @param dayName 当前月份名称 + * @param type 查看类型 + * @param start 开始时间 + * @param end 结束时间 + * @param materialTypeAll 当前查看物料类型 + * @return + */ + public Map getSunBurstDataByForApplication(String dayName, String type, Long start, Long end, List materialTypeAll) { + + Map result = new HashMap<>(); + + int maxThreadSize = materialTypeAll.size(); + + int threadSize = Runtime.getRuntime().availableProcessors(); + + ExecutorService exs = new ThreadPoolExecutor(threadSize, maxThreadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(maxThreadSize)); + + // 结果集 + List> futureList = new ArrayList>(); // 1.定义CompletionService CompletionService completionService = new ExecutorCompletionService(exs); - for (int num = 0; num < months.size() - 1; num++) { - Map map = (Map) sourceList.get(num); - Future future = completionService.submit(new getSourceListTask(map,type, months.get(num + 1).toString(), months.get(num).toString())); + + List resultForData = new ArrayList<>(); + for (MaterialType materialType : materialTypeAll) { + // 测试 + Future future = completionService.submit(new getSunBurstDataForApplicationByDepository(type, start, end, materialType)); futureList.add(future); } - List result = new ArrayList<>(); - for (int i = 0; i < months.size() - 1; i++) { + double sum = 0.0; + for (int i = 0; i < materialTypeAll.size(); i++) { Object obj = null; try { obj = completionService.take().get(); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } - result.add(obj); - } - // 用于返回结果 - System.out.println(JSONObject.toJSONString(result)); - - } - - // 具体执行getSourceList逻辑 - class getSourceListTask implements Callable { - - String type; - String start; - String end; - Map map; - - getSourceListTask(Map map, String type, String start, String end) { - this.map = map; - this.type = type; - this.start = start; - this.end = end; - } - - @Override - public Object call() throws Exception { - List materialTypeAll = materialTypeService.findMaterialTypeNoParent(); - int threadSize = materialTypeAll.size(); - ExecutorService exs = new ThreadPoolExecutor(threadSize, threadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(threadSize)); - - // 结果集 - List> futureList = new ArrayList>(); - // 1.定义CompletionService - CompletionService completionService = new ExecutorCompletionService(exs); - - List result = new ArrayList<>(); - for (MaterialType materialType : materialTypeAll) { - // 测试 - Future future = completionService.submit(new findMaterialCountTaskForSourceList(type,start,end,materialType.getOldId())); - futureList.add(future); - } - double sum = 0.0; - for (int i = 0; i < materialTypeAll.size(); i++) { - Object obj = null; - try { - obj = completionService.take().get(); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); - } - result.add(obj); - sum+=ObjectFormatUtil.toDouble(((Map)obj).get("value")); - } - map.put("children",result); - map.put("name",map.get("month")); - map.remove("month"); - map.put("value",sum); - // 用于生产随机的颜色 - Random random = new Random(); - Map itemStyle = new HashMap<>(); - int r = random.nextInt(256); - int g = random.nextInt(256); - int b = random.nextInt(256); - itemStyle.put("color","rgb("+r+","+g+","+b+")"); - map.put("itemStyle",itemStyle); - return map; + resultForData.add(obj); } + result.put("children", resultForData); + result.put("name", dayName); + result.remove("month"); + result.put("value", sum); + // 用于生产随机的颜色 + Random random = new Random(); + Map itemStyle = new HashMap<>(); + int r = random.nextInt(256); + int g = random.nextInt(256); + int b = random.nextInt(256); + itemStyle.put("color", "rgb(" + r + "," + g + "," + b + ")"); + result.put("itemStyle", itemStyle); + return result; } - // 根据条件获取月份中物料的总额用于sourcelist - class findMaterialCountTaskForSourceList implements Callable { + /** + * 用于具体执行查询旭日图的多线程类 + */ + class getSunBurstDataForApplicationByDepository implements Callable { String type; - String start; - String end; - Long oldId; + Long start; + Long end; + MaterialType materialType; - public findMaterialCountTaskForSourceList(String type, String start, String end,Long oldId) { + public getSunBurstDataForApplicationByDepository(String type, Long start, Long end, MaterialType materialType) { this.type = type; this.start = start; this.end = end; - this.oldId = oldId; + this.materialType = materialType; } @Override @@ -158,71 +158,22 @@ public class SunburstChartTest { } map.put("start", start); map.put("end", end); - map.put("oldId", oldId); + map.put("depositoryId", "41"); + map.put("oldId", materialType.getOldId()); Map result = new HashMap<>(); - Double materialCountByMonth1 = depositoryRecordService.calMaterialTypeTopCount(map); - MaterialType materialTypeByOldId = materialTypeService.findMaterialTypeByOldId(oldId); - result.put("name",materialTypeByOldId.getTname()); - result.put("value",materialCountByMonth1); - Map itemStyle = new HashMap<>(); + Double materialCountByMonth = depositoryRecordService.calMaterialTypeTopCount(map); + result.put("name", materialType.getTname()); + result.put("value", materialCountByMonth); + Map itemStyle = new HashMap<>(); // 用于生产随机的颜色 Random random = new Random(); int r = random.nextInt(256); int g = random.nextInt(256); int b = random.nextInt(256); - itemStyle.put("color","rgb("+r+","+g+","+b+")"); - result.put("itemStyle",itemStyle); + itemStyle.put("color", "rgb(" + r + "," + g + "," + b + ")"); + result.put("itemStyle", itemStyle); return result; } } - public List findChildForMaterialTypeByParent(MaterialType mt) { - List result = new ArrayList<>(); - result.add(mt.getOldId()); - List parentId = new ArrayList<>(); - parentId.add(mt.getOldId()); - List materialTypeAll = materialTypeService.findMaterialTypeAll(); - for (MaterialType materialType : materialTypeAll) { - if (parentId.contains(materialType.getParentId())) { - parentId.add(materialType.getOldId()); - result.add(materialType.getOldId()); - } - } - return result; - } - - - /** - * 获取本月之前的月份 - * - * @return - */ - public static Map getPreviousMonth() { - Calendar instance = Calendar.getInstance(); - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM"); - Map source = new HashMap<>(); - List sourceList = new ArrayList<>(); - int month = instance.get(Calendar.MONTH) + 1; - // 获取下个月 - instance.add(Calendar.MONTH, 1); - Long nextMonth = DateUtil.DateTimeByMonthToTimeStamp(formatter.format(instance.getTime())); - ArrayList months = new ArrayList<>(); - months.add(nextMonth); - instance.add(Calendar.MONTH, -1); - - while (month > 0) { - instance.set(Calendar.MONTH, month); - instance.set(Calendar.DAY_OF_MONTH, -1); - source.put("month", month + "月"); - months.add(DateUtil.DateTimeByMonthToTimeStamp(formatter.format(instance.getTime()))); - month--; - sourceList.add(((HashMap) source).clone()); - } - instance.set(Calendar.MONTH, month); - instance.add(Calendar.MONTH, 1); - Map map = new HashMap<>(); - map.put("months", months); - map.put("sourceList", sourceList); - return map; - } }