From c91a08b65977bf506e0cb9176c403d0351bd0bb6 Mon Sep 17 00:00:00 2001 From: erdanergou Date: Tue, 18 Jul 2023 15:09:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=BA=93=E5=AD=98=E6=8A=98?= =?UTF-8?q?=E7=BA=BF=E5=9B=BE=E3=80=81=E6=9F=B1=E7=8A=B6=E5=9B=BE=E7=AE=97?= =?UTF-8?q?=E6=B3=95=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DepositoryRecordController.java | 49 ++- .../entity/SplitInventoryView.java | 67 ++++ .../mapper/MaterialMapper.java | 8 + .../mapper/MaterialMapper.xml | 6 + .../mapper/SplitUnitMapper.java | 9 + .../mapper/SplitUnitMapper.xml | 28 ++ .../service/DepositoryRecordService.java | 9 + .../service/MaterialService.java | 8 + .../impl/DepositoryRecordServiceImpl.java | 246 ++++++++++-- .../service/impl/MaterialServiceImpl.java | 32 +- .../InAndOut_echart/LineOrBarChart.html | 5 +- .../InAndOut_echart/SunburstChart.html | 21 +- .../templates/pages/depository/table-out.html | 9 +- .../pages/depository/table-stock.html | 46 ++- .../InventoryLineChartTest.java | 358 +++++++++--------- .../InventorySunburstDataTest.java | 338 ++++++++--------- .../LineChartForInventoryTest.java | 111 ------ .../depository_manage/SunburstChartTest.java | 12 +- 18 files changed, 809 insertions(+), 553 deletions(-) create mode 100644 src/main/java/com/dreamchaser/depository_manage/entity/SplitInventoryView.java delete mode 100644 src/test/java/com/dreamchaser/depository_manage/LineChartForInventoryTest.java 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 e2fbca02..1e5d39c0 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java @@ -485,7 +485,7 @@ public class DepositoryRecordController { List userByPortList = PublicConfig.FindUserByMap(paramForGetUserByPost, null, null); for (UserByPort userByPort : userByPortList) { int emptype = userByPort.getEmptype(); - if(emptype > 10){ + if (emptype > 10) { continue; } String workwechat = userByPort.getWorkwechat(); @@ -546,7 +546,7 @@ public class DepositoryRecordController { List userByPortList = PublicConfig.FindUserByMap(paramForGetUserByPost, finalUserKey, finalToken); for (UserByPort userByPort : userByPortList) { int emptype = userByPort.getEmptype(); - if(emptype > 10){ + if (emptype > 10) { continue; } String workwechat = userByPort.getWorkwechat(); @@ -1770,7 +1770,7 @@ public class DepositoryRecordController { UserByPort userByPort = PublicConfig.FindUserById(uid, finalUserkey, finalUsertoken); // 获取用户的用工关系 int emptype = userByPort.getEmptype(); - if(emptype > 10){ + if (emptype > 10) { continue; } String workwechat = userByPort.getWorkwechat(); @@ -1788,7 +1788,7 @@ public class DepositoryRecordController { List userByPortList = PublicConfig.FindUserByMap(paramForGetUserByPost, finalUserkey, finalUsertoken); for (UserByPort userByPort : userByPortList) { int emptype = userByPort.getEmptype(); - if(emptype > 10){ + if (emptype > 10) { continue; } String workwechat = userByPort.getWorkwechat(); @@ -1835,7 +1835,7 @@ public class DepositoryRecordController { UserByPort userByPort = PublicConfig.FindUserById(uid, finalUserkey, finalUsertoken); // 获取用户的用工关系 int emptype = userByPort.getEmptype(); - if(emptype > 10){ + if (emptype > 10) { continue; } String workwechat = userByPort.getWorkwechat(); @@ -1852,7 +1852,7 @@ public class DepositoryRecordController { List userByPortList = PublicConfig.FindUserByMap(paramForGetUserByPost, finalUserkey, finalUsertoken); for (UserByPort userByPort : userByPortList) { int emptype = userByPort.getEmptype(); - if(emptype > 10){ + if (emptype > 10) { continue; } String workwechat = userByPort.getWorkwechat(); @@ -2072,7 +2072,7 @@ public class DepositoryRecordController { UserByPort userByPort = PublicConfig.FindUserById(uid, finalUserkey, finalUsertoken); // 获取用户的用工关系 int emptype = userByPort.getEmptype(); - if(emptype > 10){ + if (emptype > 10) { continue; } String workwechat = userByPort.getWorkwechat(); @@ -2087,7 +2087,7 @@ public class DepositoryRecordController { List userByPortList = PublicConfig.FindUserByMap(paramForGetUserByPost, finalUserkey, finalUsertoken); for (UserByPort userByPort : userByPortList) { int emptype = userByPort.getEmptype(); - if(emptype > 10){ + if (emptype > 10) { continue; } String workwechat = userByPort.getWorkwechat(); @@ -2131,7 +2131,7 @@ public class DepositoryRecordController { UserByPort userByPort = PublicConfig.FindUserById(uid, finalUserkey, finalUsertoken); // 获取用户的用工关系 int emptype = userByPort.getEmptype(); - if(emptype > 10){ + if (emptype > 10) { continue; } String workwechat = userByPort.getWorkwechat(); @@ -2146,7 +2146,7 @@ public class DepositoryRecordController { List userByPortList = PublicConfig.FindUserByMap(paramForGetUserByPost, finalUserkey, finalUsertoken); for (UserByPort userByPort : userByPortList) { int emptype = userByPort.getEmptype(); - if(emptype > 10){ + if (emptype > 10) { continue; } String workwechat = userByPort.getWorkwechat(); @@ -2515,8 +2515,8 @@ public class DepositoryRecordController { * @param request * @return */ - @PostMapping("/getBarChartDataByDateType") - public RestResponse getBarChartDataByDateType(@RequestBody Map map, HttpServletRequest request) { + @PostMapping("/getLineOrBarChartDataByDateType") + public RestResponse getLineOrBarChartDataByDateType(@RequestBody Map map, HttpServletRequest request) { if (!map.containsKey("echartType")) { throw new MyException("错误,请指定图表类型"); } @@ -2550,7 +2550,12 @@ public class DepositoryRecordController { } Map data = new HashMap<>(); if (depositoryId != -1) { - data = depositoryRecordService.getLineOrBarChartData(depositoryId, type, dateType, echartType); + if ("3".equals(type)) { + data = depositoryRecordService.getLineOrBarChartDataForInventory(depositoryId, dateType, echartType); + } else { + data = depositoryRecordService.getLineOrBarChartData(depositoryId, type, dateType, echartType); + + } } return new RestResponse(data); } @@ -2558,7 +2563,8 @@ public class DepositoryRecordController { /** * 用于获取出入库的旭日图的数据 - * @param map 查询数据 + * + * @param map 查询数据 * @param request * @return */ @@ -2605,19 +2611,20 @@ public class DepositoryRecordController { Long end = timeSpaceMap.get("end"); // 获取所有顶级物料类型 List materialTypeNoParent = materialTypeService.findMaterialTypeNoParent(); - Map data = depositoryRecordService.getSunBurstDataByForApplication(dateName, type, start, end, materialTypeNoParent,depositoryId); + Map data = depositoryRecordService.getSunBurstDataByForApplication(dateName, type, start, end, materialTypeNoParent, depositoryId); return new RestResponse(data); } /** * 用于获取出入库的旭日图的数据 + * * @param map 查询数据 * @return */ @PostMapping("/getSunBurstDataForMtName") - public RestResponse getSunBurstDataForMtName(@RequestBody Map map){ - if(!map.containsKey("depositoryId")){ + public RestResponse getSunBurstDataForMtName(@RequestBody Map map) { + if (!map.containsKey("depositoryId")) { throw new MyException("错误,未选择查看的仓库"); } Integer depositoryId = ObjectFormatUtil.toInteger(map.get("depositoryId")); @@ -2639,14 +2646,14 @@ public class DepositoryRecordController { Long start = timeSpaceMap.get("start"); Long end = timeSpaceMap.get("end"); Map data = new HashMap<>(); - if(map.containsKey("mtName")){ + if (map.containsKey("mtName")) { // 如果包含名称 String mtName = map.get("mtName"); - data = depositoryRecordService.getSunBurstDataByMtName(mtName,type,start,end,mtName,depositoryId); - }else{ + data = depositoryRecordService.getSunBurstDataByMtName(mtName, type, start, end, mtName, depositoryId); + } else { // 如果不包含名称 List materialTypeNoParent = materialTypeService.findMaterialTypeNoParent(); - data = depositoryRecordService.getSunBurstDataByForApplication(dateName,type,start,end,materialTypeNoParent,depositoryId); + data = depositoryRecordService.getSunBurstDataByForApplication(dateName, type, start, end, materialTypeNoParent, depositoryId); } return new RestResponse(data); } diff --git a/src/main/java/com/dreamchaser/depository_manage/entity/SplitInventoryView.java b/src/main/java/com/dreamchaser/depository_manage/entity/SplitInventoryView.java new file mode 100644 index 00000000..e175a8a7 --- /dev/null +++ b/src/main/java/com/dreamchaser/depository_manage/entity/SplitInventoryView.java @@ -0,0 +1,67 @@ +package com.dreamchaser.depository_manage.entity; + +import lombok.Data; + +/** + * 拆单库存记录(视图) + */ +@Data +public class SplitInventoryView { + /** + * 拆单库存id + */ + private Integer id; + /** + * 拆单记录 + */ + private Integer sid; + /** + * 库存库位映射id + */ + private Integer mpId; + /** + * 拆单库存数 + */ + private Integer siQuantity; + /** + * 拆单物料id + */ + private Integer mid; + /** + * 所处仓库id + */ + private Integer depositoryId; + /** + * 库存id + */ + private Integer iid; + /** + * 库位id + */ + private Integer pid; + /** + * 拆单记录状态 + */ + private Integer sstate; + /** + * 当前拆单记录的进制 + */ + private Integer scale; + /** + * 旧单位 + */ + private String oldUnit ; + /** + * 新单位 + */ + private String newUnit; + /** + * 物料名称 + */ + private String mname ; + /** + * 仓库名称 + */ + private String dname ; + +} diff --git a/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java b/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java index e4040beb..10c24c8c 100644 --- a/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java +++ b/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.java @@ -158,6 +158,14 @@ public interface MaterialMapper { List findInventory(Map map); + /** + * 获取当前仓库的库存总额 + * @param depositoryId 带查询仓库id + * @return + */ + Integer findInventorySumForDepository(Integer depositoryId); + + /** * 根据条件查询符合条件的库存 * diff --git a/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml b/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml index d38a54af..9c984ada 100644 --- a/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml +++ b/src/main/java/com/dreamchaser/depository_manage/mapper/MaterialMapper.xml @@ -373,6 +373,12 @@ + + select @@ -328,5 +349,12 @@ + + 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 43242aed..917b61f5 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,15 @@ public interface DepositoryRecordService { Map getLineOrBarChartData(Integer depositoryId, String type, String dateType, String echartType); + /** + * 用于获取库存折线图数据 + * @param depositoryId 待获取仓库id + * @param dateType 日期类型 + * @param echartType 图表类型 + * @return + */ + public Map getLineOrBarChartDataForInventory(Integer depositoryId, String dateType, String echartType); + /** * 用于获取出入库的旭日图数据 * @param name 当前旭日图名称 diff --git a/src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java b/src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java index fd359f98..44ebf3ae 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java @@ -438,4 +438,12 @@ public interface MaterialService { * @return */ List findInventoryForCompleteOutTask(Map map); + + + /** + * 获取当前仓库的库存总额 + * @param depositoryId 带查询仓库id + * @return + */ + Double findInventorySumForDepository(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 6293245f..3fb79d93 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 @@ -1,5 +1,7 @@ package com.dreamchaser.depository_manage.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.dreamchaser.depository_manage.config.PublicConfig; import com.dreamchaser.depository_manage.config.QyWxConfig; @@ -18,6 +20,8 @@ import com.dreamchaser.depository_manage.service.DepositoryRecordService; import com.dreamchaser.depository_manage.service.RoleService; import com.dreamchaser.depository_manage.service.SplitUnitService; import com.dreamchaser.depository_manage.utils.*; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; @@ -26,6 +30,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.sql.Time; import java.util.*; import java.util.concurrent.*; @@ -5819,15 +5824,88 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { } /** - * 获取折线图数据 + * 获取出入库折线图数据 * * @param depositoryId 待获取仓库Id * @param type 查看类型(1入库2出库) * @param dateType 日期类型(day按天month按月) + * @param echartType 图表类型 * @return */ public Map getLineOrBarChartData(Integer depositoryId, String type, String dateType, String echartType) { + // 最终返回结果 + Map show_data = new HashMap<>(); + + String redisKey = "depositoryId:" + depositoryId; + String valueKey = ""; + if ("1".equals(type)) { + // 如果入库 + valueKey = "in:" + dateType; + } else if ("2".equals(type)) { + // 如果出库 + valueKey = "out:" + dateType; + } + + // 获取至今的日期名称 + List dayNames = new ArrayList<>(); + List dayTimeSpaces = new ArrayList<>(); + if ("month".equals(dateType)) { + //获取获取系统的当前日历对象 + Map monthBeginToNow = DateUtil.getPreviousMonth(); + // 获取至今的日期名称 + dayNames = ObjectFormatUtil.objToList(monthBeginToNow.get("monthNames"), String.class); + Collections.reverse(dayNames); + // 获取至今的日期时间戳 + dayTimeSpaces = ObjectFormatUtil.objToList(monthBeginToNow.get("months"), Long.class); + Collections.reverse(dayTimeSpaces); + } else if ("day".equals(dateType)) { + //获取获取系统的当前日历对象 + Map monthBeginToNow = DateUtil.getMonthBeginToNow(); + // 获取至今的日期名称 + dayNames = ObjectFormatUtil.objToList(monthBeginToNow.get("dayName"), String.class); + // 获取至今的日期时间戳 + dayTimeSpaces = ObjectFormatUtil.objToList(monthBeginToNow.get("dayTimeSpace"), Long.class); + dayTimeSpaces.add(Calendar.getInstance().getTimeInMillis()); + } + Object value = redisPool.getRedisTemplateByDb(15).opsForHash().get(redisKey, valueKey); + if (value != null) { + // 获取当前redis中的数据(不含当天数据) + List doubleList = JSONArray.parseArray(value.toString(), Double.class); + Double depositoryRecordByDate = findApplicationRecordByDate(dayTimeSpaces.get(dayTimeSpaces.size() - 1), dayTimeSpaces.get(dayTimeSpaces.size() - 2), ObjectFormatUtil.toInteger(type), depositoryId); + doubleList.add(depositoryRecordByDate); + Map map = createLineOrBarMap(echartType); + map.put("data", doubleList); + show_data.put("data", map); + } else { + + // 每天仓库出入库数目 + Map applicationRecordByDate = getLineOrBarChartDataForApplicationRecord(type, dayTimeSpaces, depositoryId, echartType); + show_data.put("data", applicationRecordByDate); + List doubleList = ObjectFormatUtil.objToList(applicationRecordByDate.get("data"), Double.class); + // 去掉当天数据 + doubleList.remove(doubleList.size() - 1); + redisPool.getRedisTemplateByDb(15).opsForHash().put(redisKey, valueKey, JSONObject.toJSONString(doubleList)); + redisPool.getRedisTemplateByDb(15).expire(redisKey,DateUtil.getSecondsNextEarlyMorning(), TimeUnit.SECONDS); + } + show_data.put("dayNames", dayNames); + return show_data; + } + + + /** + * 用于获取库存折线图数据 + * @param depositoryId 待获取仓库id + * @param dateType 日期类型 + * @param echartType 图表类型 + * @return + */ + public Map getLineOrBarChartDataForInventory(Integer depositoryId, String dateType, String echartType) { + // 声明仓库库存数据 + Map show_data = new HashMap<>(); + + // redisKey + String redisKey = "depositoryId:" + depositoryId; // 获取至今的日期名称 List dayNames = new ArrayList<>(); @@ -5853,14 +5931,130 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { dayTimeSpaces = ObjectFormatUtil.objToList(monthBeginToNow.get("dayTimeSpace"), Long.class); dayTimeSpaces.add(Calendar.getInstance().getTimeInMillis()); } - // 每天仓库出入库数目 - Map show_data = new HashMap<>(); - Map applicationRecordByDate = getLineOrBarChartDataForApplicationRecord(type, dayTimeSpaces, depositoryId, echartType); - show_data.put("data", applicationRecordByDate); + + Set keys = redisPool.getRedisTemplateByDb(15).opsForHash().keys(redisKey); + + // 声明仓库入库数据列表 + List applicationInDataList = new ArrayList<>(); + // 声明仓库出库数据列表 + List applicationOutDataList = new ArrayList<>(); + // 声明仓库库存数据列表 + List inventoryList = new ArrayList<>(); + + // 获取当前仓库的库存值 + Integer sumForDepository = materialMapper.findInventorySumForDepository(depositoryId); + double depositoryInventory = ObjectFormatUtil.divide(sumForDepository, 100.0, 2); + List splitInventoryViewByDepository = splitUnitMapper.findSplitInventoryViewByDepository(depositoryId); + Map scaleForSplitInfo = new HashMap<>(); + for (SplitInventoryView splitInventoryView : splitInventoryViewByDepository) { + Integer sid = splitInventoryView.getSid(); + int scale = 1; + if (scaleForSplitInfo.containsKey(sid)) { + scale = scaleForSplitInfo.get(sid); + } else { + SplitInfo splitInfoById = splitUnitMapper.findSplitInfoById(sid); + scale = splitUnitService.findSplitInfoScaleQuantity(splitInfoById, -1); + scaleForSplitInfo.put(sid, scale); + } + depositoryInventory = ObjectFormatUtil.sum(depositoryInventory, ObjectFormatUtil.divide(splitInventoryView.getSiQuantity(), scale, 2)); + } + if (keys.contains("inventory:" + dateType)) { + // 如果redis中存在当前值 + Object inventory = redisPool.getRedisTemplateByDb(15).opsForHash().get(redisKey, "inventory:" + dateType); + if (inventory != null) { + inventoryList = JSONArray.parseArray(inventory.toString(), Double.class); + } + } else { + if (keys.contains("in:" + dateType)) { + // 如果包含入库数据 + Object applicationInDataForRedis = redisPool.getRedisTemplateByDb(15).opsForHash().get(redisKey, "in:" + dateType); + if (applicationInDataForRedis != null) { + applicationInDataList = JSONArray.parseArray(applicationInDataForRedis.toString(), Double.class); + Double depositoryRecordByDate = findApplicationRecordByDate(dayTimeSpaces.get(dayTimeSpaces.size() - 1), dayTimeSpaces.get(dayTimeSpaces.size() - 2), 1, depositoryId); + applicationInDataList.add(depositoryRecordByDate); + } else { + for (int i = 0; i < dayTimeSpaces.size() - 1; i++) { + // 遍历 Map并计算各仓库的入库数 + // 获取一段时间内的库存额度 + Double depositoryRecordByDate = findApplicationRecordByDate(dayTimeSpaces.get(i + 1), dayTimeSpaces.get(i), 1, depositoryId); + applicationInDataList.add(depositoryRecordByDate); + } + } + } else { + for (int i = 0; i < dayTimeSpaces.size() - 1; i++) { + // 遍历 Map并计算各仓库的入库数 + // 获取一段时间内的库存额度 + Double depositoryRecordByDate = findApplicationRecordByDate(dayTimeSpaces.get(i + 1), dayTimeSpaces.get(i), 1, depositoryId); + applicationInDataList.add(depositoryRecordByDate); + } + } + + if (keys.contains("out:" + dateType)) { + // 如果包含出库数据 + Object applicationOutDataForRedis = redisPool.getRedisTemplateByDb(15).opsForHash().get(redisKey, "out:" + dateType); + if (applicationOutDataForRedis != null) { + applicationOutDataList = JSONArray.parseArray(applicationOutDataForRedis.toString(), Double.class); + Double depositoryRecordByDate = findApplicationRecordByDate(dayTimeSpaces.get(dayTimeSpaces.size() - 1), dayTimeSpaces.get(dayTimeSpaces.size() - 2), 2, depositoryId); + applicationOutDataList.add(depositoryRecordByDate); + } else { + for (int i = 0; i < dayTimeSpaces.size() - 1; i++) { + // 遍历 Map并计算各仓库的入库数 + // 获取一段时间内的库存额度 + Double depositoryRecordByDate = findApplicationRecordByDate(dayTimeSpaces.get(i + 1), dayTimeSpaces.get(i), 2, depositoryId); + applicationOutDataList.add(depositoryRecordByDate); + } + } + } else { + for (int i = 0; i < dayTimeSpaces.size() - 1; i++) { + // 遍历 Map并计算各仓库的入库数 + // 获取一段时间内的库存额度 + Double depositoryRecordByDate = findApplicationRecordByDate(dayTimeSpaces.get(i + 1), dayTimeSpaces.get(i), 2, depositoryId); + applicationOutDataList.add(depositoryRecordByDate); + } + } + } + inventoryList.add(depositoryInventory); + if (inventoryList.size() <= 1) { + // 如果没有 + inventoryList.add(depositoryInventory); + for (int i = applicationInDataList.size() - 1; i > 0; i--) { + // 入库数 + Double inQuantity = applicationInDataList.get(i); + // 出库数 + Double outQuantity = applicationOutDataList.get(i); + depositoryInventory = depositoryInventory - inQuantity + outQuantity; + inventoryList.add(depositoryInventory); + } + Collections.reverse(inventoryList); + } + + List inventoryListCopy = new ArrayList<>(); + ObjectMapper objectMap = new ObjectMapper(); + try { + inventoryListCopy = objectMap.readValue(objectMap.writeValueAsString(inventoryList), List.class); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + inventoryListCopy.remove(inventoryListCopy.size() - 1); + redisPool.getRedisTemplateByDb(15).opsForHash().put(redisKey, "inventory:" + dateType, JSONObject.toJSONString(inventoryListCopy)); + if (applicationInDataList.size() > 0) { + applicationInDataList.remove(applicationInDataList.size() - 1); + redisPool.getRedisTemplateByDb(15).opsForHash().put(redisKey, "in:" + dateType, JSONObject.toJSONString(applicationInDataList)); + + } + if (applicationOutDataList.size() > 0) { + applicationOutDataList.remove(applicationOutDataList.size() - 1); + redisPool.getRedisTemplateByDb(15).opsForHash().put(redisKey, "out:" + dateType, JSONObject.toJSONString(applicationOutDataList)); + } + redisPool.getRedisTemplateByDb(15).expire(redisKey, DateUtil.getSecondsNextEarlyMorning(), TimeUnit.SECONDS); + Map map = createLineOrBarMap(echartType); + map.put("data", inventoryList); + show_data.put("data", map); show_data.put("dayNames", dayNames); return show_data; } + /** * 获取当前折线图的具体数据 * @@ -5870,21 +6064,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { * @return */ public Map getLineOrBarChartDataForApplicationRecord(String type, List days, Integer depositoryId, String echartType) { - Map map = new HashMap<>(); - if ("line".equals(echartType)) { - map.put("type", "line"); - Map areaStyleItem = new HashMap<>(); - map.put("areaStyle", areaStyleItem); - } else if ("bar".equals(echartType)) { - map.put("type", "bar"); - Map emphasisItem = new HashMap<>(); - emphasisItem.put("focus", "series"); - map.put("emphasis", emphasisItem); - Map labelItem = new HashMap<>(); - labelItem.put("show", true); - labelItem.put("position", "inside"); - map.put("label", labelItem); - } + Map map = createLineOrBarMap(echartType); int i; List drCountbyDrName = new ArrayList<>(); for (i = 0; i < days.size() - 1; i++) { @@ -5893,6 +6073,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { Double depositoryRecordByDate = findApplicationRecordByDate(days.get(i + 1), days.get(i), ObjectFormatUtil.toInteger(type), depositoryId); drCountbyDrName.add(depositoryRecordByDate); } + map.put("data", drCountbyDrName); return map; } @@ -5909,7 +6090,6 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { */ public Map getSunBurstDataByForApplication(String name, String type, Long start, Long end, List materialTypeAll, Integer depositoryId) { - Map result = new HashMap<>(); int maxThreadSize = materialTypeAll.size(); @@ -5957,6 +6137,8 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { return result; } + + /** * 用于获取当前类别名称下当前月份的出入库的旭日图数据 * @@ -6014,7 +6196,7 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { } } result.put("children", resultForData); - }else{ + } else { try { Object call = new getSunBurstDataForApplicationByDepository(type, start, end, materialType, depositoryId).call(); sum = ObjectFormatUtil.sum(sum, ObjectFormatUtil.toDouble(ObjectFormatUtil.objToMap(call, String.class, Object.class).get("value"))); @@ -6136,4 +6318,24 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { } + public Map createLineOrBarMap(String echartType){ + Map map = new HashMap<>(); + if ("line".equals(echartType)) { + map.put("type", "line"); + Map areaStyleItem = new HashMap<>(); + map.put("areaStyle", areaStyleItem); + } else if ("bar".equals(echartType)) { + map.put("type", "bar"); + Map emphasisItem = new HashMap<>(); + emphasisItem.put("focus", "series"); + map.put("emphasis", emphasisItem); + Map labelItem = new HashMap<>(); + labelItem.put("show", true); + labelItem.put("position", "inside"); + map.put("label", labelItem); + } + return map; + } + + } diff --git a/src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java b/src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java index bd4478be..85ef755a 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java @@ -2138,7 +2138,7 @@ public class MaterialServiceImpl implements MaterialService { // 如果当前是库存 // 获取对应拆单库存处理记录 - title.append(",当前可用库存为:").append(inventory.getUnit()).append(":").append(ObjectFormatUtil.divide(ObjectFormatUtil.subtract(inventory.getQuantity(),inventory.getNumberOfTemporary()), 100.0, 2)); + title.append(",当前可用库存为:").append(inventory.getUnit()).append(":").append(ObjectFormatUtil.divide(ObjectFormatUtil.subtract(inventory.getQuantity(), inventory.getNumberOfTemporary()), 100.0, 2)); List splitInventoryList = splitUnitMapper.findSplitInventoryByIid(inventory.getId()); if (splitInventoryList.size() > 0) { // 如果存在 @@ -2168,7 +2168,7 @@ public class MaterialServiceImpl implements MaterialService { // 如果当前是库存 // 获取对应拆单库存处理记录 - title.append(",当前可用库存为:").append(inventory.getUnit()).append(":").append(ObjectFormatUtil.divide(ObjectFormatUtil.subtract(inventory.getQuantity(),inventory.getNumberOfTemporary()), 100.0, 2)); + title.append(",当前可用库存为:").append(inventory.getUnit()).append(":").append(ObjectFormatUtil.divide(ObjectFormatUtil.subtract(inventory.getQuantity(), inventory.getNumberOfTemporary()), 100.0, 2)); List splitInventoryList = splitUnitMapper.findSplitInventoryByIid(inventory.getId()); if (splitInventoryList.size() > 0) { // 如果存在 @@ -2747,6 +2747,34 @@ public class MaterialServiceImpl implements MaterialService { return midList; } + /** + * 获取当前仓库的库存总额 + * @param depositoryId 带查询仓库id + * @return + */ + @Override + public Double findInventorySumForDepository(Integer depositoryId) { + // 获取当前仓库的库存总数 + Integer sumForDepository = materialMapper.findInventorySumForDepository(depositoryId); + double result = ObjectFormatUtil.divide(sumForDepository, 100.0, 2); + List splitInventoryViewByDepository = splitUnitMapper.findSplitInventoryViewByDepository(depositoryId); + Map scaleForSplitInfo = new HashMap<>(); + for (SplitInventoryView splitInventoryView : splitInventoryViewByDepository) { + Integer sid = splitInventoryView.getSid(); + int scale = 1; + if (scaleForSplitInfo.containsKey(sid)) { + scale = scaleForSplitInfo.get(sid); + } else { + SplitInfo splitInfoById = splitUnitMapper.findSplitInfoById(sid); + scale = splitUnitService.findSplitInfoScaleQuantity(splitInfoById, -1); + scaleForSplitInfo.put(sid, scale); + } + result = ObjectFormatUtil.sum(result, ObjectFormatUtil.divide(splitInventoryView.getSiQuantity(), scale, 2)); + + } + return result; + } + List packMpvList(List materialAndPlaceForViewList, Map map) { for (MaterialAndPlaceForViewP mpv : materialAndPlaceForViewList 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 5f85bd17..47ea7e43 100644 --- a/src/main/resources/templates/pages/depository/InAndOut_echart/LineOrBarChart.html +++ b/src/main/resources/templates/pages/depository/InAndOut_echart/LineOrBarChart.html @@ -97,6 +97,9 @@ type: '' } ], + tooltip: { + trigger: 'axis' + }, toolbox: { feature: { myFull: { @@ -169,7 +172,7 @@ initBarChartByDateType = function (req) { $.ajax({ - url: '/depositoryRecord/getBarChartDataByDateType', + url: '/depositoryRecord/getLineOrBarChartDataByDateType', 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 index bee023da..8a6c0439 100644 --- a/src/main/resources/templates/pages/depository/InAndOut_echart/SunburstChart.html +++ b/src/main/resources/templates/pages/depository/InAndOut_echart/SunburstChart.html @@ -81,6 +81,7 @@ // 旭日图 var echartSunburstChart = echarts.init(document.getElementById('echarts-sunburst-chart')); var optionSunburstChart = { + title: { textStyle: { fontSize: 14, @@ -94,26 +95,8 @@ type: 'sunburst', data: [], radius: [0, '95%'], - itemStyle: { - borderWidth: 1, - borderColor: "white", - borderType: "solid", - shadowBlur: 0, - shadowColor: 'rgba(0, 0, 0, 0.2)', - shadowOffsetX: 0, - shadowOffsetY: 0, - opacity: 1 - }, emphasis: { - focus: 'ancestor' - }, - blue: { - itemStyle: { - opacity: 0.2 - }, - label: { - opacity: 0.1 - } + focus: 'descendant' }, label: { rotate: '0' diff --git a/src/main/resources/templates/pages/depository/table-out.html b/src/main/resources/templates/pages/depository/table-out.html index 1f51b67b..e8ed28ce 100644 --- a/src/main/resources/templates/pages/depository/table-out.html +++ b/src/main/resources/templates/pages/depository/table-out.html @@ -487,7 +487,8 @@ `; $("#showEchart").append(listItem) - }else if(obj.event === "showSunburstEchart"){ + } + else if(obj.event === "showSunburstEchart"){ layer.open({ type: 2, offset: 'r', @@ -499,7 +500,8 @@ id: 'applicationOutInfoForLeft', content: '/sunburstEchartForTable?type=2', }); - }else if(obj.event === "showLineEchart"){ + } + else if(obj.event === "showLineEchart"){ layer.open({ type: 2, offset: 'r', @@ -511,7 +513,8 @@ id: 'applicationOutInfoForLeft', content: '/lineOrBarEchartForTable?type=2&echartType=line', }); - }else if(obj.event === "showBarEchart"){ + } + else if(obj.event === "showBarEchart"){ layer.open({ type: 2, offset: 'r', diff --git a/src/main/resources/templates/pages/depository/table-stock.html b/src/main/resources/templates/pages/depository/table-stock.html index 61ae6e5c..93d847f9 100644 --- a/src/main/resources/templates/pages/depository/table-stock.html +++ b/src/main/resources/templates/pages/depository/table-stock.html @@ -469,15 +469,51 @@ } else if (obj.event === 'showEchart') { let listItem = `
    -
  • 查看面积图
  • +
  • 查看折线图
  • +
  • 查看柱状图
  • 查看旭日图
`; $("#showEchart").append(listItem) - }else if(obj.event === 'showLineEchart'){ - console.log("showLineEchart") - }else if(obj.event === "showSunburstEchart"){ - console.log("showSunburstEchart") + } + else if(obj.event === "showSunburstEchart"){ + /*layer.open({ + type: 2, + offset: 'r', + anim: 'slideLeft', // 从右往左 + area: ['40%', '100%'], + shade: 0.1, + title: "旭日图", + shadeClose: true, + id: 'applicationOutInfoForLeft', + content: '/sunburstEchartForTable?type=3', + });*/ + } + else if(obj.event === "showLineEchart"){ + layer.open({ + type: 2, + offset: 'r', + anim: 'slideLeft', // 从右往左 + area: ['40%', '100%'], + shade: 0.1, + title: "折线图", + shadeClose: true, + id: 'applicationOutInfoForLeft', + content: '/lineOrBarEchartForTable?type=3&echartType=line', + }); + } + else if(obj.event === "showBarEchart"){ + layer.open({ + type: 2, + offset: 'r', + anim: 'slideLeft', // 从右往左 + area: ['40%', '100%'], + shade: 0.1, + title: "柱状图", + shadeClose: true, + id: 'applicationOutInfoForLeft', + content: '/lineOrBarEchartForTable?type=3&echartType=bar', + }); } }); diff --git a/src/test/java/com/dreamchaser/depository_manage/InventoryLineChartTest.java b/src/test/java/com/dreamchaser/depository_manage/InventoryLineChartTest.java index 3786db06..b771ad99 100644 --- a/src/test/java/com/dreamchaser/depository_manage/InventoryLineChartTest.java +++ b/src/test/java/com/dreamchaser/depository_manage/InventoryLineChartTest.java @@ -1,14 +1,19 @@ package com.dreamchaser.depository_manage; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.dreamchaser.depository_manage.config.PublicConfig; import com.dreamchaser.depository_manage.entity.UserByPort; import com.dreamchaser.depository_manage.pojo.InventoryByDname; +import com.dreamchaser.depository_manage.security.pool.RedisPool; 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; +import com.dreamchaser.depository_manage.utils.ObjectFormatUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -36,212 +41,211 @@ public class InventoryLineChartTest { @Autowired DepositoryService depositoryService; + @Autowired + RedisPool redisPool; + + @Test + public void main() { + Map day = getLineOrBarChartDataForInventory(41, "day", "line"); + System.out.println(day); + } + /** - * 获取本月之前的月份 + * 获取折线图数据 * + * @param depositoryId 待获取仓库Id + * @param dateType 日期类型(day按天month按月) * @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()); + public Map getLineOrBarChartDataForInventory(Integer depositoryId, String dateType, String echartType) { + // 声明仓库库存数据 + Map show_data = new HashMap<>(); + + // redisKey + String redisKey = "depositoryId:" + depositoryId; + + // 获取至今的日期名称 + List dayNames = new ArrayList<>(); + List dayTimeSpaces = new ArrayList<>(); + if ("month".equals(dateType)) { + //获取获取系统的当前日历对象 + + Map monthBeginToNow = DateUtil.getPreviousMonth(); + + // 获取至今的日期名称 + dayNames = ObjectFormatUtil.objToList(monthBeginToNow.get("monthNames"), String.class); + Collections.reverse(dayNames); + // 获取至今的日期时间戳 + dayTimeSpaces = ObjectFormatUtil.objToList(monthBeginToNow.get("months"), Long.class); + Collections.reverse(dayTimeSpaces); + + } else if ("day".equals(dateType)) { + //获取获取系统的当前日历对象 + Map monthBeginToNow = DateUtil.getMonthBeginToNow(); + // 获取至今的日期名称 + dayNames = ObjectFormatUtil.objToList(monthBeginToNow.get("dayName"), String.class); + // 获取至今的日期时间戳 + dayTimeSpaces = ObjectFormatUtil.objToList(monthBeginToNow.get("dayTimeSpace"), Long.class); + dayTimeSpaces.add(Calendar.getInstance().getTimeInMillis()); } - instance.set(Calendar.MONTH, month); - instance.add(Calendar.MONTH, 1); - Map map = new HashMap<>(); - map.put("months", months); - map.put("sourceList", sourceList); - return map; - } - @Test - public void main() { - UserByPort userByPort = PublicConfig.FindUserById(87, null,null); - Map depositoryAllNameAndId = depositoryService.findDepositoryAllNameAndId(userByPort); - Map barChartData = getInventoryLineChartData(depositoryAllNameAndId); - System.out.println(JSONObject.toJSONString(barChartData)); - } + Set keys = redisPool.getRedisTemplateByDb(15).opsForHash().keys(redisKey); - // 获取柱状图数据 - public Map getInventoryLineChartData(Map depositoryAllNameAndId) { + // 声明仓库入库数据列表 + List applicationInDataList = new ArrayList<>(); + // 声明仓库出库数据列表 + List applicationOutDataList = new ArrayList<>(); + // 声明仓库库存数据列表 + List inventoryList = new ArrayList<>(); - // 每天各仓库入库数目 - Map show_data = new HashMap<>(); + // 获取当前仓库的库存值 + Double depositoryInventory = materialService.findInventorySumForDepository(depositoryId); - // 获取当前各仓库的库存数 - List toDayInventoryByDName = depositoryService.getToDayInventoryByDName(); - // 获取遍历器 - Iterator it = depositoryAllNameAndId.keySet().iterator(); - //获取获取系统的当前日历对象 - Calendar instance = Calendar.getInstance(); - int weekDay = instance.get(Calendar.DAY_OF_WEEK); - weekDay = weekDay - 1; - if (weekDay == 1) { - while (it.hasNext()) { - List objectList = new ArrayList<>(); - String key = it.next().toString(); - String dname = key.split(",")[0]; - Double inventoryByDname = getInventoryByDname(dname, toDayInventoryByDName); - Map map = new HashMap<>(); - map.put("type", "line"); - Map areaStyleItem = new HashMap<>(); - map.put("areaStyle", areaStyleItem); - List doubleList = new ArrayList<>(); - doubleList.add(inventoryByDname); - map.put("data", doubleList); - objectList.add(map); - show_data.put(key,objectList); + if (keys.contains("inventory:" + dateType)) { + // 如果redis中存在当前值 + Object inventory = redisPool.getRedisTemplateByDb(15).opsForHash().get(redisKey, "inventory:" + dateType); + if (inventory != null) { + inventoryList = JSONArray.parseArray(inventory.toString(), Double.class); } - }else{ - // 获取日期 - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); - int now = instance.get(Calendar.DAY_OF_WEEK) - 1 == 0 ? 7 : instance.get(Calendar.DAY_OF_WEEK) - 1; - List days = new ArrayList<>(); // 周一至今的每天 - instance.add(Calendar.DATE, 1); - days.add(DateUtil.DateTimeByDayToTimeStamp(formatter.format(instance.getTime()))); - instance.add(Calendar.DATE, -1); - days.add(DateUtil.DateTimeByDayToTimeStamp(formatter.format(instance.getTime()))); - while (now - 1 > 0) { - now--; - instance.add(Calendar.DATE, -1); - Long format = DateUtil.DateTimeByDayToTimeStamp(formatter.format(instance.getTime())); - days.add(format); - } - - // 定义线程 - int threadSize = depositoryAllNameAndId.size(); - ExecutorService exs = new ThreadPoolExecutor(threadSize, threadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(threadSize)); - - // 结果集 - List> futureList = new ArrayList>(); - // 1.定义CompletionService - CompletionService completionService = new ExecutorCompletionService(exs); - while (it.hasNext()) { - Object next = it.next(); - getInventoryByDate getApplicationRecordByDate = new getInventoryByDate(next.toString(), days, depositoryAllNameAndId, toDayInventoryByDName); - Future future = completionService.submit(getApplicationRecordByDate); - futureList.add(future); + } else { + if (keys.contains("in:" + dateType)) { + // 如果包含入库数据 + Object applicationInDataForRedis = redisPool.getRedisTemplateByDb(15).opsForHash().get(redisKey, "in:" + dateType); + if (applicationInDataForRedis != null) { + applicationInDataList = JSONArray.parseArray(applicationInDataForRedis.toString(), Double.class); + Double depositoryRecordByDate = depositoryRecordService.findApplicationRecordByDate(dayTimeSpaces.get(dayTimeSpaces.size() - 1), dayTimeSpaces.get(dayTimeSpaces.size() - 2), 1, depositoryId); + applicationInDataList.add(depositoryRecordByDate); + } else { + for (int i = 0; i < dayTimeSpaces.size() - 1; i++) { + // 遍历 Map并计算各仓库的入库数 + // 获取一段时间内的库存额度 + Double depositoryRecordByDate = depositoryRecordService.findApplicationRecordByDate(dayTimeSpaces.get(i + 1), dayTimeSpaces.get(i), 1, depositoryId); + applicationInDataList.add(depositoryRecordByDate); + } + } + } else { + for (int i = 0; i < dayTimeSpaces.size() - 1; i++) { + // 遍历 Map并计算各仓库的入库数 + // 获取一段时间内的库存额度 + Double depositoryRecordByDate = depositoryRecordService.findApplicationRecordByDate(dayTimeSpaces.get(i + 1), dayTimeSpaces.get(i), 1, depositoryId); + applicationInDataList.add(depositoryRecordByDate); + } } - for (int i = 0; i < depositoryAllNameAndId.size(); i++) { - Object result = null; - try { - result = completionService.take().get(); - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); + if (keys.contains("out:" + dateType)) { + // 如果包含出库数据 + Object applicationOutDataForRedis = redisPool.getRedisTemplateByDb(15).opsForHash().get(redisKey, "out:" + dateType); + if (applicationOutDataForRedis != null) { + applicationOutDataList = JSONArray.parseArray(applicationOutDataForRedis.toString(), Double.class); + Double depositoryRecordByDate = depositoryRecordService.findApplicationRecordByDate(dayTimeSpaces.get(dayTimeSpaces.size() - 1), dayTimeSpaces.get(dayTimeSpaces.size() - 2), 2, depositoryId); + applicationOutDataList.add(depositoryRecordByDate); + } else { + for (int i = 0; i < dayTimeSpaces.size() - 1; i++) { + // 遍历 Map并计算各仓库的入库数 + // 获取一段时间内的库存额度 + Double depositoryRecordByDate = depositoryRecordService.findApplicationRecordByDate(dayTimeSpaces.get(i + 1), dayTimeSpaces.get(i), 2, depositoryId); + applicationOutDataList.add(depositoryRecordByDate); + } + } + } else { + for (int i = 0; i < dayTimeSpaces.size() - 1; i++) { + // 遍历 Map并计算各仓库的入库数 + // 获取一段时间内的库存额度 + Double depositoryRecordByDate = depositoryRecordService.findApplicationRecordByDate(dayTimeSpaces.get(i + 1), dayTimeSpaces.get(i), 2, depositoryId); + applicationOutDataList.add(depositoryRecordByDate); } - show_data.putAll((Map) result); } } + inventoryList.add(depositoryInventory); + if (inventoryList.size() <= 1) { + // 如果没有 + inventoryList.add(depositoryInventory); + for (int i = applicationInDataList.size() - 1; i > 0; i--) { + // 入库数 + Double inQuantity = applicationInDataList.get(i); + // 出库数 + Double outQuantity = applicationOutDataList.get(i); + depositoryInventory = depositoryInventory - inQuantity + outQuantity; + inventoryList.add(depositoryInventory); + } + Collections.reverse(inventoryList); + } - - - return show_data; - } - - - /** - * 根据日期获取各仓库库存的数量 - */ - class getInventoryByDate implements Callable { - String key; - List days; - Map depositoryAllNameAndId; - List inventoryByDnameList; - - - getInventoryByDate(String key, List days, Map depositoryAllNameAndId, List inventoryByDnameList) { - this.key = key; - this.depositoryAllNameAndId = depositoryAllNameAndId; - this.days = days; - this.inventoryByDnameList = inventoryByDnameList; + List inventoryListCopy = new ArrayList<>(); + ObjectMapper objectMap = new ObjectMapper(); + try { + inventoryListCopy = objectMap.readValue(objectMap.writeValueAsString(inventoryList), List.class); + } catch (JsonProcessingException e) { + e.printStackTrace(); } + inventoryListCopy.remove(inventoryListCopy.size() - 1); + redisPool.getRedisTemplateByDb(15).opsForHash().put(redisKey, "inventory:" + dateType, JSONObject.toJSONString(inventoryListCopy)); + if (applicationInDataList.size() > 0) { + applicationInDataList.remove(applicationInDataList.size() - 1); + redisPool.getRedisTemplateByDb(15).opsForHash().put(redisKey, "in:" + dateType, JSONObject.toJSONString(applicationInDataList)); - @Override - public Object call() throws Exception { - Map result = new HashMap<>(); - Map map = new HashMap<>(); + } + if (applicationOutDataList.size() > 0) { + applicationOutDataList.remove(applicationOutDataList.size() - 1); + redisPool.getRedisTemplateByDb(15).opsForHash().put(redisKey, "out:" + dateType, JSONObject.toJSONString(applicationOutDataList)); + } + redisPool.getRedisTemplateByDb(15).expire(redisKey, DateUtil.getSecondsNextEarlyMorning(), TimeUnit.SECONDS); + Map map = new HashMap<>(); + if ("line".equals(echartType)) { map.put("type", "line"); Map areaStyleItem = new HashMap<>(); map.put("areaStyle", areaStyleItem); - int i; - List drCountbyDrName = new ArrayList<>(); - // 获取当前仓库 - String dname = key.split(",")[0]; - // 获取当前仓库下的库存 - Double inventoryByDname = getInventoryByDname(dname, inventoryByDnameList); - // 将当前仓库的库存添加到结果集中 - drCountbyDrName.add(inventoryByDname); - Integer val = (Integer) depositoryAllNameAndId.get(key); - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); - boolean flag = false; - // 判断当天是否有出入口记录 - Calendar IsInOut = Calendar.getInstance(); - Long start = DateUtil.DateTimeByDayToTimeStamp(formatter.format(IsInOut.getTime())); - IsInOut.add(Calendar.DATE, 1); - Long end = DateUtil.DateTimeByDayToTimeStamp(formatter.format(IsInOut.getTime())); - // 判断今天是否有出入库记录 - Integer inCount = depositoryRecordService.findApplicationInRecordByDate(end, start, null); - Integer OutCount = depositoryRecordService.findApplicationOutRecordByDate(end, start, null); - if (inCount > 0 || OutCount > 0) { - flag = true; - } - int j = 0; - for (i = days.size() - 1; i > 0; i--) { - // 当前日期额度 - Double aDouble = drCountbyDrName.get(j++); - // 如果今天有出入库记录 - if (flag) { - Integer inRecordByDate = depositoryRecordService.findApplicationInRecordByDate(end, start, val); - Integer OutRecordByDate = depositoryRecordService.findApplicationOutRecordByDate(end, start, val); - aDouble = aDouble - (inRecordByDate / 100.0) + (OutRecordByDate / 100.0); - flag = false; - } - // 获取当前仓库当前时间的入库数量 - Double depositoryRecordByDateForIn = depositoryRecordService.findApplicationRecordByDate(days.get(i - 1), days.get(i), 1, val); - // 获取当前仓库当前时间的出库数量 - Double depositoryRecordByDateForOut = depositoryRecordService.findApplicationRecordByDate(days.get(i - 1), days.get(i), 2, val); - Double warehouserCount = aDouble - depositoryRecordByDateForIn + depositoryRecordByDateForOut; - drCountbyDrName.add(warehouserCount); - } - Collections.reverse(drCountbyDrName); - map.put("data", drCountbyDrName); - result.put(val, map); - return result; + } else if ("bar".equals(echartType)) { + map.put("type", "bar"); + Map emphasisItem = new HashMap<>(); + emphasisItem.put("focus", "series"); + map.put("emphasis", emphasisItem); + Map labelItem = new HashMap<>(); + labelItem.put("show", true); + labelItem.put("position", "inside"); + map.put("label", labelItem); } - } + map.put("data", inventoryList); + show_data.put("data", map); + show_data.put("dayNames", dayNames); + return show_data; + } /** - * 获取当前仓库下的库存 + * 获取当前折线图的具体数据 * - * @param dname - * @param list + * @param type 查看类型(1入库2出库) + * @param days 查询日期 + * @param depositoryId 仓库id * @return */ - public Double getInventoryByDname(String dname, List list) { - for (InventoryByDname inventoryByDname : list) { - if (dname.equals(inventoryByDname.getDname())) { - return inventoryByDname.getInventory(); - } + public Map getLineOrBarChartDataForApplicationRecord(String type, List days, Integer depositoryId, String echartType) { + Map map = new HashMap<>(); + if ("line".equals(echartType)) { + map.put("type", "line"); + Map areaStyleItem = new HashMap<>(); + map.put("areaStyle", areaStyleItem); + } else if ("bar".equals(echartType)) { + map.put("type", "bar"); + Map emphasisItem = new HashMap<>(); + emphasisItem.put("focus", "series"); + map.put("emphasis", emphasisItem); + Map labelItem = new HashMap<>(); + labelItem.put("show", true); + labelItem.put("position", "inside"); + map.put("label", labelItem); } - return 0.0; + int i; + List drCountbyDrName = new ArrayList<>(); + for (i = 0; i < days.size() - 1; i++) { + // 遍历 Map并计算各仓库的入库数 + // 获取一段时间内的库存额度 + Double depositoryRecordByDate = depositoryRecordService.findApplicationRecordByDate(days.get(i + 1), days.get(i), ObjectFormatUtil.toInteger(type), depositoryId); + drCountbyDrName.add(depositoryRecordByDate); + } + map.put("data", drCountbyDrName); + return map; } } diff --git a/src/test/java/com/dreamchaser/depository_manage/InventorySunburstDataTest.java b/src/test/java/com/dreamchaser/depository_manage/InventorySunburstDataTest.java index 323d9c7a..b1c5debb 100644 --- a/src/test/java/com/dreamchaser/depository_manage/InventorySunburstDataTest.java +++ b/src/test/java/com/dreamchaser/depository_manage/InventorySunburstDataTest.java @@ -1,9 +1,11 @@ package com.dreamchaser.depository_manage; +import com.alibaba.fastjson.JSONObject; import com.dreamchaser.depository_manage.config.PublicConfig; import com.dreamchaser.depository_manage.entity.Depository; import com.dreamchaser.depository_manage.entity.MaterialType; import com.dreamchaser.depository_manage.entity.UserByPort; +import com.dreamchaser.depository_manage.exception.MyException; import com.dreamchaser.depository_manage.pojo.InventoryByMTAndDepository; import com.dreamchaser.depository_manage.service.DepositoryRecordService; import com.dreamchaser.depository_manage.service.DepositoryService; @@ -38,228 +40,194 @@ public class InventorySunburstDataTest { @Autowired DepositoryService depositoryService; + + @Test + public void main() { + String type = "2"; + // 获取本月之前的月份 + Map previousMonth = DateUtil.getPreviousMonth(); + // 获取月份的时间戳 + List months = ObjectFormatUtil.objToList(previousMonth.get("months"), Long.class); + List materialTypeNoParent = materialTypeService.findMaterialTypeNoParent(); + + Map sourceListTask = getSunBurstDataForApplication("7月", type, months.get(2), months.get(1), materialTypeNoParent); + System.out.println(JSONObject.toJSONString(sourceListTask)); + + } + + + /** - * 获取本月之前的月份 + * 用于获取出入库的旭日图数据 * + * @param dayName 当前月份名称 + * @param type 查看类型 + * @param start 开始时间 + * @param end 结束时间 + * @param materialTypeAll 当前查看物料类型 * @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; - } + public Map getSunBurstDataForApplication(String dayName, String type, Long start, Long end, List materialTypeAll) { - @Test - public void main() { + Map result = new HashMap<>(); - UserByPort userByPort = PublicConfig.FindUserById(78, null,null); + int maxThreadSize = materialTypeAll.size(); + int threadSize = Runtime.getRuntime().availableProcessors(); - } + ExecutorService exs = new ThreadPoolExecutor(threadSize, maxThreadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(maxThreadSize)); - public List getInventorySunburstData(UserByPort userByPort){ - Map previousMonth = DateUtil.getPreviousMonth(); - // 获取所有月份 - List months = (List) previousMonth.get("months"); - // 获取月份名称 - List sourceList = (List) previousMonth.get("sourceList"); - Calendar instance = Calendar.getInstance(); - instance.add(Calendar.MONTH, 1); - instance.set(Calendar.DATE, 1); - // 获取当前用于可见的仓库列表 - List depositoryList = depositoryService.findDepositoryByAdminorgAndUser(userByPort); - // 定义每次开启的线程数 - int threadSize = depositoryList.size(); - // 开启对应数量的线程 - ExecutorService exs = new ThreadPoolExecutor(threadSize, threadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(threadSize)); - - // 定义线程结果集 + // 结果集 List> futureList = new ArrayList>(); - // 定义CompletionService - CompletionService completionService = new ExecutorCompletionService<>(exs); - // 用于存储当前仓库各物料类型的库存数 - Map> inventoryForMTAndDepository = new HashMap<>(); - // 定义结果集 - List result = new ArrayList<>(); - // 定义各 - for (int num = 0; num < months.size() - 1; num++) { - // 获取起始时间 - Object start = months.get(num + 1); - // 获取结束时间 - Object end = months.get(num); - // 获取当前计算的月份 - Object month = ((Map) sourceList.get(num)).get("month"); - for (Depository depository : depositoryList - ) { - // 获取当前仓库id - Integer depositoryId = depository.getId(); - // 判断当前当前仓库各物料类型的库存是否存在 - List inventoryByMTAndDepositories = inventoryForMTAndDepository.get(depositoryId); - if (inventoryByMTAndDepositories == null || inventoryByMTAndDepositories.size() == 0) { - // 如果不存在则获取 - inventoryByMTAndDepositories = depositoryService.getTodayInventoryInfoByDidAndMt(depositoryId); - } - // 开启线程计算结果 - Future submit = completionService.submit(new inventoryByMaterialTypeForMonth(start, end, depository, inventoryByMTAndDepositories)); - futureList.add(submit); + // 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)); + futureList.add(future); + } + double sum = 0.0; + for (int i = 0; i < materialTypeAll.size(); i++) { + Object obj = null; + try { + obj = completionService.take().get(); + sum = ObjectFormatUtil.sum(sum,ObjectFormatUtil.toDouble(ObjectFormatUtil.objToMap(obj,String.class,Object.class).get("value"))); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); } + 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; + } + + /** + * 用于获取当前类别名称下当前月份的出入库的旭日图数据 + * + * @param dayName 当前月份 + * @param type 类型(1入库2出库) + * @param start 开始 + * @param end 结束 + * @param mtName 类别名称 + * @return + */ + public Map getSunBurstDataByMtName(String dayName, String type, Long start, Long end, String mtName) { + List materialTypeByNames = materialTypeService.findMaterialTypeByName(mtName); + MaterialType materialType = null; + if (materialTypeByNames.size() > 0) { + materialType = materialTypeByNames.get(0); + } else { + throw new MyException("错误,不存在当前名称的类型"); + } + List childMaterialTypeList = materialTypeService.findChildForMaterialTypeByParent(materialType.getOldId()); - List childItems = new ArrayList<>(); - double value = 0.0; - for (int i = 0; i < depositoryList.size(); i++) { - Object obj = null; - try { - obj = completionService.take().get(); - Map objectMap = (Map) obj; - Integer id = ObjectFormatUtil.toInteger((objectMap).get("id")); - List inventoryByMtAndD = (List)objectMap.get("inventoryByMtAndD"); - value += ObjectFormatUtil.toDouble(objectMap.get("value")); - inventoryForMTAndDepository.put(id,inventoryByMtAndD); - (objectMap).remove("id"); - (objectMap).remove("inventoryByMtAndD"); + int threadSize = PublicConfig.availableVirtualMachine; - childItems.add(obj); + int maxThreadSize = childMaterialTypeList.size(); + if (maxThreadSize < threadSize) { + maxThreadSize = threadSize * 2; + } + ExecutorService exs = new ThreadPoolExecutor(threadSize, maxThreadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(maxThreadSize)); + // 结果集 + List> futureList = new ArrayList>(); + // 1.定义CompletionService + CompletionService completionService = new ExecutorCompletionService(exs); + + int runThreadSize = 0; + for (MaterialType value : childMaterialTypeList) { + Future submit = completionService.submit(new getSunBurstDataForApplicationByDepository(type, start, end, value)); + runThreadSize++; + futureList.add(submit); + } - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } + double sum = 0.0; + List resultForData = new ArrayList<>(); + for (int i = 0; i < runThreadSize; i++) { + Object obj = null; + try { + obj = completionService.take().get(); + resultForData.add(obj); + sum = ObjectFormatUtil.sum(sum,ObjectFormatUtil.toDouble(ObjectFormatUtil.objToMap(obj,String.class,Object.class).get("value"))); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); } - Map stringObjectMap = new HashMap<>(); - stringObjectMap.put("children",childItems); - stringObjectMap.put("name",month); - stringObjectMap.put("value",value); - Random random = new Random(); - int r = random.nextInt(256); - int g = random.nextInt(256); - int b = random.nextInt(256); - Map itemStyle = new HashMap<>(); - itemStyle.put("color", "rgb(" + r + "," + g + "," + b + ")"); - stringObjectMap.put("itemStyle", itemStyle); - result.add(stringObjectMap); } + Map result = new HashMap<>(); + 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; } + + /** - * 用于计算当前时间段内当前仓库下各物料类型的库存 + * 用于具体执行查询旭日图的多线程类 */ - class inventoryByMaterialTypeForMonth implements Callable { - - // 开始时间 - Object start; - // 结束时间 - Object end; - // 查询仓库 - Depository depository; - // 当前仓库各物料类型库存数 - List todayInventoryInfoByDidAndMt; - - public inventoryByMaterialTypeForMonth(Object start, Object end, Depository depository, List todayInventoryInfoByDidAndMt) { + class getSunBurstDataForApplicationByDepository implements Callable { + + + String type; + Long start; + Long end; + MaterialType materialType; + + public getSunBurstDataForApplicationByDepository(String type, Long start, Long end, MaterialType materialType) { + this.type = type; this.start = start; this.end = end; - this.depository = depository; - this.todayInventoryInfoByDidAndMt = todayInventoryInfoByDidAndMt; + this.materialType = materialType; } @Override public Object call() throws Exception { - // 定义当前返回结果 - Map result = new HashMap<>(); - // 定义当前仓库的总数 - double inventorySum = 0.0; - for (InventoryByMTAndDepository item : todayInventoryInfoByDidAndMt - ) { - inventorySum += item.getInventory(); + Map map = new HashMap<>(); + map.put("type", ObjectFormatUtil.toInteger(type)); + if (ObjectFormatUtil.toInteger(type) == 1) { + map.put("state", "已入库"); + } else if (ObjectFormatUtil.toInteger(type) == 2) { + map.put("state", "已出库"); } - result.put("name", depository.getDname()); - result.put("id",depository.getId()); - result.put("value", inventorySum); + map.put("start", start); + map.put("end", end); + map.put("depositoryId", "41"); + map.put("oldId", materialType.getOldId()); + Map result = 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); - Map itemStyle = new HashMap<>(); itemStyle.put("color", "rgb(" + r + "," + g + "," + b + ")"); result.put("itemStyle", itemStyle); - - // 获取所有顶级物料类型 - List materialTypeNoParent = materialTypeService.findMaterialTypeNoParent(); - Map paramIn = new HashMap<>(); - Map paramOut = new HashMap<>(); - // 获取每月入库总额 - paramIn.put("type", 1); - paramIn.put("state", "已入库"); - paramIn.put("depository_id", depository.getId()); - paramIn.put("start", start); - paramIn.put("end", end); - // 获取每月出库总额 - paramOut.put("type", 2); - paramOut.put("state", "已出库"); - paramOut.put("depository_id", depository.getId()); - paramOut.put("start", start); - paramOut.put("end", end); - List children = new ArrayList<>(); - for (MaterialType materialType : materialTypeNoParent - ) { - // 生成子数据 - Map resultItem = new HashMap<>(); - resultItem.put("name", materialType.getTname()); - // 用于生产随机的颜色 - Map itemStyleItem = new HashMap<>(); - int rt = random.nextInt(256); - int gt = random.nextInt(256); - int bt = random.nextInt(256); - itemStyleItem.put("color", "rgb(" + rt + "," + gt + "," + bt + ")"); - result.put("itemStyle", itemStyleItem); - long oldId = materialType.getOldId(); - paramIn.put("oldId", oldId); - paramOut.put("oldId", oldId); - // 获取当前类别在当前仓库下当前月份的入库总额 - Double wareHouseInCountByMonth = depositoryRecordService.calMaterialTypeTopCount(paramIn); - // 获取当前类别在当前仓库下当前月份的出库总额 - Double wareHouseOutCountByMonth = depositoryRecordService.calMaterialTypeTopCount(paramOut); - for (InventoryByMTAndDepository item : todayInventoryInfoByDidAndMt - ) { - long mtId = item.getMtId(); - // 如果是同一类型 - if (mtId == oldId) { - // 计算上个月该类型库存数 - Double wareHouseCount = item.getInventory() - wareHouseInCountByMonth + wareHouseOutCountByMonth; - // 修改库存记录 - item.setInventory(wareHouseCount); - resultItem.put("value", wareHouseCount); - } - } - children.add(resultItem); - } - result.put("children", children); - result.put("inventoryByMtAndD",todayInventoryInfoByDidAndMt); return result; } } diff --git a/src/test/java/com/dreamchaser/depository_manage/LineChartForInventoryTest.java b/src/test/java/com/dreamchaser/depository_manage/LineChartForInventoryTest.java deleted file mode 100644 index f4ba769e..00000000 --- a/src/test/java/com/dreamchaser/depository_manage/LineChartForInventoryTest.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.dreamchaser.depository_manage; - -import com.dreamchaser.depository_manage.entity.Inventory; -import com.dreamchaser.depository_manage.pojo.RestResponse; -import com.dreamchaser.depository_manage.service.DepositoryRecordService; -import com.dreamchaser.depository_manage.service.MaterialService; -import com.dreamchaser.depository_manage.utils.DateUtil; -import com.dreamchaser.depository_manage.utils.ObjectFormatUtil; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import java.util.*; -import java.util.concurrent.*; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@RunWith(SpringRunner.class) -public class LineChartForInventoryTest { - - - @Autowired - private MaterialService materialService; - - @Autowired - private DepositoryRecordService depositoryRecordService; - - /** - * 用于获取当前物料的本月出入库记录 - * - * @param id 带查询库存id - */ - public RestResponse getInventoryApplication(Integer id) { - // 获取当前物料的库存数据 - Inventory inventoryById = materialService.findInventoryById(id); - // 获取本月至今的日期 - Map monthBeginToNow = DateUtil.getMonthBeginToNow(); - // 获取至今的日期名称 - List dayNames = ObjectFormatUtil.objToList(monthBeginToNow.get("dayName"), String.class); - // 获取至今的日期时间戳 - List dayTimeSpaces = ObjectFormatUtil.objToList(monthBeginToNow.get("dayTimeSpace"), Long.class); - dayTimeSpaces.add(Calendar.getInstance().getTimeInMillis()); - // 获取当前物料的入库总额与数量 - Map seriesForApplicationIn = depositoryRecordService.getApplicationByMaterial(id, dayTimeSpaces, 1,true,null); - - Object amountItemForIn = seriesForApplicationIn.get("amountItem"); - Object countItemForIn = seriesForApplicationIn.get("countItem"); - // 将入库总额项目转为map类型 - Map countItemForInMapString = ObjectFormatUtil.objToMap(countItemForIn, String.class, Object.class); - // 获取入库总额data并转为list类型 - List amountListForIn = ObjectFormatUtil.objToList(countItemForInMapString.get("data"), Double.class); - - // 获取当前物料的出库总额与数量 - Map seriesForApplicationOut = depositoryRecordService.getApplicationByMaterial(id, dayTimeSpaces, 2,true,null); - - Object amountItemForOut = seriesForApplicationOut.get("amountItem"); - Object countItemForOut = seriesForApplicationOut.get("countItem"); - // 将出库总额项目转为map类型 - Map countItemForOutMapString = ObjectFormatUtil.objToMap(countItemForOut, String.class, Object.class); - // 获取出库总额data并转为list类型 - List amountListForOut = ObjectFormatUtil.objToList(countItemForOutMapString.get("data"), Double.class); - // 定义库存数量列表 - List inventoryCountList = new ArrayList<>(); - // 定义库存总额列表 - List inventoryAmountList = new ArrayList<>(); - // 获取当前库存 - double inventory = inventoryById.getQuantity() / 100.0; - // 获取当前物料单价 - Double price = inventoryById.getPrice(); - // 获取当前物料总额 - double amount = ObjectFormatUtil.multiply(inventory, price); - // 添加 - inventoryAmountList.add(amount); - inventoryCountList.add(inventory); - for (int i = amountListForOut.size() - 1; i > 0; i--) { - // 获取当前日期下的库存 库存 = 库存 + 出库 - 入库 - inventory = ObjectFormatUtil.subtract(ObjectFormatUtil.sum(inventory, amountListForOut.get(i)), amountListForIn.get(i)); - inventoryCountList.add(inventory); - inventoryAmountList.add(ObjectFormatUtil.multiply(inventory, price)); - } - // 反转 - Collections.reverse(inventoryAmountList); - Collections.reverse(inventoryCountList); - Map countItemForInventory = depositoryRecordService.createStackedAreaChartSeriesItem("count", inventoryCountList); - Map amountItemForInventory = depositoryRecordService.createStackedAreaChartSeriesItem("count", inventoryAmountList); - Map result = new HashMap<>(); - result.put("amountItemForIn", amountItemForIn); - result.put("countItemForIn", countItemForIn); - result.put("amountItemForOut", amountItemForOut); - result.put("countItemForOut", countItemForOut); - System.out.println(countItemForIn); - System.out.println(countItemForOut); - Map> legendItem = new HashMap<>(); - List legends = new ArrayList<>(); - legends.add("count"); - legends.add("amount"); - legendItem.put("data", legends); - result.put("legend", legendItem); - result.put("dayNames", dayNames); - result.put("countItemForInventory",countItemForInventory); - result.put("amountItemForInventory",amountItemForInventory); - return new RestResponse(result); - } - - - @Test - public void Test() { - getInventoryApplication(3537); - } -} diff --git a/src/test/java/com/dreamchaser/depository_manage/SunburstChartTest.java b/src/test/java/com/dreamchaser/depository_manage/SunburstChartTest.java index a852d989..86ae62d9 100644 --- a/src/test/java/com/dreamchaser/depository_manage/SunburstChartTest.java +++ b/src/test/java/com/dreamchaser/depository_manage/SunburstChartTest.java @@ -49,17 +49,15 @@ public class SunburstChartTest { // 获取月份名称 List sourceList = ObjectFormatUtil.objToList(previousMonth.get("sourceList"), Object.class); // 结果集 -// List materialTypeNoParent = materialTypeService.findMaterialTypeNoParent(); + List materialTypeNoParent = materialTypeService.findMaterialTypeNoParent(); - // 1.定义CompletionService -// Map map = ObjectFormatUtil.objToMap(sourceList.get(4), String.class, Object.class); -// Map sourceListTask = getSunBurstDataForApplication("map", type, months.get(2), months.get(1), materialTypeNoParent); -// System.out.println(JSONObject.toJSONString(sourceListTask)); + Map sourceListTask = getSunBurstDataForApplication("map", type, months.get(2), months.get(1), materialTypeNoParent); + System.out.println(JSONObject.toJSONString(sourceListTask)); // 用于返回结果 - Map sunBurstDataByMtName = getSunBurstDataByMtName("7月", "1", months.get(2), months.get(1), "化验器具"); - System.out.println(sunBurstDataByMtName); +// Map sunBurstDataByMtName = getSunBurstDataByMtName("7月", "1", months.get(2), months.get(1), "化验器具"); +// System.out.println(sunBurstDataByMtName); } /**