From ed3f9c94a4ab05502e6a69f824aebc763c83a1d7 Mon Sep 17 00:00:00 2001 From: erdanergou Date: Wed, 19 Jul 2023 11:49:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=BA=93=E5=AD=98=E6=97=AD?= =?UTF-8?q?=E6=97=A5=E5=9B=BE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DepositoryRecordController.java | 33 +++- .../service/DepositoryRecordService.java | 10 ++ .../impl/DepositoryRecordServiceImpl.java | 154 ++++++++++++++++++ .../InventorySunburstDataTest.java | 22 ++- 4 files changed, 207 insertions(+), 12 deletions(-) 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 eadb52cd..645fd056 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/DepositoryRecordController.java @@ -2606,14 +2606,27 @@ public class DepositoryRecordController { } } + Map data = new HashMap<>(); + boolean flagForInventoryByOtherMethod = false; + if ("3".equals(type)) { + int nowMonthNum = Calendar.getInstance().get(Calendar.MONTH) + 1; + if (month != nowMonthNum) { + flagForInventoryByOtherMethod = true; + } + } // 获取当前month月与下个月的月初 Map timeSpaceMap = DateUtil.getThisMonthTimeSpace(month); Long start = timeSpaceMap.get("start"); Long end = timeSpaceMap.get("end"); // 获取所有顶级物料类型 List materialTypeNoParent = materialTypeService.findMaterialTypeNoParent(); - Map data = new HashMap<>(); - data = depositoryRecordService.getSunBurstDataByForApplication(dateName, type, start, end, materialTypeNoParent, depositoryId); + if (flagForInventoryByOtherMethod) { + data = depositoryRecordService.getSunBurstDataForInventoryByMonth(dateName, "", depositoryId); + } else { + + data = depositoryRecordService.getSunBurstDataByForApplication(dateName, type, start, end, materialTypeNoParent, depositoryId); + } + return new RestResponse(data); } @@ -2648,14 +2661,24 @@ public class DepositoryRecordController { Long start = timeSpaceMap.get("start"); Long end = timeSpaceMap.get("end"); Map data = new HashMap<>(); + if (map.containsKey("mtName")) { // 如果包含名称 String mtName = map.get("mtName"); - data = depositoryRecordService.getSunBurstDataByMtName(mtName, type, start, end, mtName, depositoryId); + if("3".equals(type)){ + data = depositoryRecordService.getSunBurstDataForInventoryByMonth(dateName, 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); + if("3".equals(type)){ + data = depositoryRecordService.getSunBurstDataForInventoryByMonth(dateName, "", depositoryId); + } else { + List materialTypeNoParent = materialTypeService.findMaterialTypeNoParent(); + data = depositoryRecordService.getSunBurstDataByForApplication(dateName, type, start, end, materialTypeNoParent, depositoryId); + + } } return new RestResponse(data); } 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 5b17e189..cc44963c 100644 --- a/src/main/java/com/dreamchaser/depository_manage/service/DepositoryRecordService.java +++ b/src/main/java/com/dreamchaser/depository_manage/service/DepositoryRecordService.java @@ -532,6 +532,16 @@ public interface DepositoryRecordService { + /** + * 用于获取库存旭日图数据 + * + * @param dayName 待获取日期名称 + * @param mtName 待查询物料类型 + * @param depositoryId 待查询仓库 + * @return + */ + Map getSunBurstDataForInventoryByMonth(String dayName, String mtName, 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 216dee6e..abe5af63 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 @@ -6150,6 +6150,160 @@ public class DepositoryRecordServiceImpl implements DepositoryRecordService { return result; } + /** + * 用于获取库存旭日图数据 + * + * @param dayName 待获取日期名称 + * @param mtName 待查询物料类型 + * @param depositoryId 待查询仓库 + * @return + */ + public Map getSunBurstDataForInventoryByMonth(String dayName, String mtName, Integer depositoryId) { + // 定义结果集 + Map result = new HashMap(); + + // 用于生产随机的颜色 + 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); + + String dayNumberString = dayName.split("月")[0]; + int dayNumber = Integer.parseInt(dayNumberString); + // 获取本月之前的月份 + Map previousMonth = DateUtil.getPreviousMonth(); + // 获取月份的时间戳 + List months = ObjectFormatUtil.objToList(previousMonth.get("months"), Long.class); + List materialTypeList = new ArrayList<>(); + + // 获取开始时间 + Long start = months.get(months.size() - dayNumber - 1); + // 获取结束时间 + Long end = months.get(0); + + + /** + * 用于执行获取旭日图数据的线程类 + */ + class TemporaryClass implements Callable> { + private String type; + private List materialTypeList; + + public TemporaryClass(String type, List materialTypeList) { + this.type = type; + this.materialTypeList = materialTypeList; + } + + @Override + public Map call() throws Exception { + Map data = getSunBurstDataByForApplication(dayName, type, start, end, materialTypeList, depositoryId); + return data; + } + } + + // 定义线程池 + ExecutorService exs = new ThreadPoolExecutor(3, 6, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(6)); + if (mtName == null || "".equals(mtName)) { + // 获取要执行的物料类型列表 + materialTypeList = materialTypeMapper.findMaterialTypeNoParent(); + result.put("name", dayName); + } else { + List materialTypeByNames = materialTypeMapper.findMaterialTypeByName(mtName); + MaterialType materialType = null; + if (materialTypeByNames.size() > 0) { + materialType = materialTypeByNames.get(0); + } else { + throw new MyException("错误,不存在当前名称的类型"); + } + materialTypeList = materialTypeMapper.findMaterialTypeByParent(materialType.getOldId()); + result.put("name", mtName); + if (materialTypeList.size() <= 0) { + double sum = 0.0; + try { + Object call = new getSunBurstDataForInventoryByDepository( materialType, depositoryId).call(); + sum = ObjectFormatUtil.sum(sum, ObjectFormatUtil.toDouble(ObjectFormatUtil.objToMap(call, String.class, Object.class).get("value"))); + } catch (Exception e) { + e.printStackTrace(); + } + result.put("value", sum); + return result; + } + } + + // 结果集 + List> futureList = new ArrayList>(); + // 1.定义CompletionService + CompletionService> completionService = new ExecutorCompletionService>(exs); + + // 获取入库的旭日图数据 + Future> applicationInThread = completionService.submit(new TemporaryClass("1", materialTypeList)); + // 获取出库的旭日图数据 + Future> applicationOutThread = completionService.submit(new TemporaryClass("2", materialTypeList)); + // 获取当前库存的旭日图数据 + Future> InventoryThread = completionService.submit(new TemporaryClass("3", materialTypeList)); + + try { + // 获取入库的旭日图数据列表 + List applicationInDataList = ObjectFormatUtil.objToList(applicationInThread.get().get("children"), Object.class); + // 获取出库的旭日图数据列表 + List applicationOutDataList = ObjectFormatUtil.objToList(applicationOutThread.get().get("children"), Object.class); + // 获取库存的旭日图数据列表 + List inventoryDataList = ObjectFormatUtil.objToList(InventoryThread.get().get("children"), Object.class); + PublicConfig.closeThreadPool(exs); + // 用于存储入库时的旭日图具体数据 + Map applicationInData = new HashMap<>(); + // 用于存储出库时的旭日图具体数据 + Map applicationOutData = new HashMap<>(); + // 用于存储库存时的旭日图具体数据 + Map inventoryData = new HashMap<>(); + for (int i = 0; i < applicationInDataList.size(); i++) { + // 循环获取所有出库、入库、库存的旭日图对应类型与其值 + Map applicationInDataMap = ObjectFormatUtil.objToMap(applicationInDataList.get(i), String.class, Object.class); + applicationInData.put((String) applicationInDataMap.get("name"), ObjectFormatUtil.toDouble(applicationInDataMap.get("value"))); + Map applicationOutDataMap = ObjectFormatUtil.objToMap(applicationOutDataList.get(i), String.class, Object.class); + applicationOutData.put((String) applicationOutDataMap.get("name"), ObjectFormatUtil.toDouble(applicationOutDataMap.get("value"))); + Map inventoryDataMap = ObjectFormatUtil.objToMap(inventoryDataList.get(i), String.class, Object.class); + inventoryData.put((String) inventoryDataMap.get("name"), ObjectFormatUtil.toDouble(inventoryDataMap.get("value"))); + } + double sumInventory = 0.0; + List resultData = new ArrayList<>(); + + + for (String key : inventoryData.keySet()) { + Map resultDataItem = new HashMap<>(); + // 获取当前类型库存 + double value = inventoryData.get(key); + // 获取当前类型入库数 + double inQuantity = applicationInData.get(key); + // 获取当前类型出库数 + double outQuantity = applicationOutData.get(key); + // 获取计算后的库存(库存+出库-入库) + double inventory = ObjectFormatUtil.subtract(ObjectFormatUtil.sum(value, outQuantity), inQuantity); + resultDataItem.put("name", key); + resultDataItem.put("value", inventory); + Map itemStyleTemp = new HashMap<>(); + r = random.nextInt(256); + g = random.nextInt(256); + b = random.nextInt(256); + itemStyleTemp.put("color", "rgb(" + r + "," + g + "," + b + ")"); + resultDataItem.put("itemStyle", itemStyleTemp); + // 更新当前类型库存数 + sumInventory = ObjectFormatUtil.sum(sumInventory, inventory); + resultData.add(resultDataItem); + } + result.put("children", resultData); + result.put("value", sumInventory); + + + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + return result; + + } /** * 用于获取当前类别名称下当前月份的出入库的旭日图数据 diff --git a/src/test/java/com/dreamchaser/depository_manage/InventorySunburstDataTest.java b/src/test/java/com/dreamchaser/depository_manage/InventorySunburstDataTest.java index 6d0bdf35..65ded7e6 100644 --- a/src/test/java/com/dreamchaser/depository_manage/InventorySunburstDataTest.java +++ b/src/test/java/com/dreamchaser/depository_manage/InventorySunburstDataTest.java @@ -7,6 +7,7 @@ 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.security.pool.RedisPool; import com.dreamchaser.depository_manage.service.DepositoryRecordService; import com.dreamchaser.depository_manage.service.DepositoryService; import com.dreamchaser.depository_manage.service.MaterialService; @@ -17,6 +18,7 @@ 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.data.redis.core.RedisTemplate; import org.springframework.test.context.junit4.SpringRunner; import java.text.SimpleDateFormat; @@ -40,16 +42,19 @@ public class InventorySunburstDataTest { @Autowired DepositoryService depositoryService; + @Autowired + RedisPool redisPool; + @Test public void main() { String type = "2"; String dayName = "6月"; String dayNumberString = dayName.split("月")[0]; - Map sunBurstDataForInventoryByMonth = getSunBurstDataForInventoryByMonth(dayName, "办公用品", 40); - System.out.println(JSONObject.toJSONString(sunBurstDataForInventoryByMonth)); - +// Map sunBurstDataForInventoryByMonth = getSunBurstDataForInventoryByMonth(dayName, "办公用品", 40); +// System.out.println(JSONObject.toJSONString(sunBurstDataForInventoryByMonth)); + System.out.println(Calendar.getInstance().get(Calendar.MONTH)); // int dayNumber = Integer.parseInt(dayNumberString); // 获取本月之前的月份 // Map previousMonth = DateUtil.getPreviousMonth(); @@ -66,12 +71,15 @@ public class InventorySunburstDataTest { /** * 用于获取库存旭日图数据 - * @param dayName 待获取日期名称 - * @param mtName 待查询物料类型 - * @param depositoryId 待查询仓库 + * + * @param dayName 待获取日期名称 + * @param mtName 待查询物料类型 + * @param depositoryId 待查询仓库 * @return */ public Map getSunBurstDataForInventoryByMonth(String dayName, String mtName, Integer depositoryId) { + // 定义结果集 + Map result = new HashMap(); String dayNumberString = dayName.split("月")[0]; int dayNumber = Integer.parseInt(dayNumberString); @@ -132,7 +140,7 @@ public class InventorySunburstDataTest { Future> applicationOutThread = completionService.submit(new TemporaryClass("2", materialTypeList)); // 获取当前库存的旭日图数据 Future> InventoryThread = completionService.submit(new TemporaryClass("3", materialTypeList)); - Map result = new HashMap(); + try { // 获取入库的旭日图数据列表 List applicationInDataList = ObjectFormatUtil.objToList(applicationInThread.get().get("children"), Object.class);