From bb6d3de7c1758fc0e4d3e8e2f364c28b501e65b4 Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期四, 29 一月 2026 15:41:40 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_New' into dev_New
---
src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java | 386 ++++++++++++++++++++++++++++++++++++------------------
1 files changed, 257 insertions(+), 129 deletions(-)
diff --git a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
index cb5d600..137c5fb 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -2,8 +2,8 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.home.mapper.HomeMapper;
import com.ruoyi.approve.mapper.ApproveProcessMapper;
import com.ruoyi.approve.pojo.ApproveProcess;
import com.ruoyi.basic.mapper.CustomerMapper;
@@ -12,10 +12,10 @@
import com.ruoyi.basic.mapper.SupplierManageMapper;
import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.basic.pojo.Product;
-import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.basic.pojo.SupplierManage;
import com.ruoyi.collaborativeApproval.mapper.NoticeMapper;
import com.ruoyi.collaborativeApproval.pojo.Notice;
+import com.ruoyi.common.enums.ApproveTypeEnum;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.mapper.DeviceRepairMapper;
import com.ruoyi.device.pojo.DeviceRepair;
@@ -32,9 +32,11 @@
import com.ruoyi.production.mapper.ProductWorkOrderMapper;
import com.ruoyi.production.pojo.ProductWorkOrder;
import com.ruoyi.project.system.domain.SysDept;
+import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.domain.SysUserDept;
import com.ruoyi.project.system.mapper.SysDeptMapper;
import com.ruoyi.project.system.mapper.SysUserDeptMapper;
+import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.purchase.mapper.PaymentRegistrationMapper;
import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
import com.ruoyi.purchase.pojo.PaymentRegistration;
@@ -44,8 +46,6 @@
import com.ruoyi.sales.mapper.ReceiptPaymentMapper;
import com.ruoyi.sales.mapper.SalesLedgerMapper;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
-import com.ruoyi.project.system.domain.SysUser;
-import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.sales.pojo.ReceiptPayment;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
@@ -83,6 +83,9 @@
@Autowired
private SalesLedgerProductMapper salesLedgerProductMapper;
+
+ @Autowired
+ private StockInventoryMapper stockInventoryMapper;
@Autowired
private ProcurementRecordMapper procurementRecordStorageMapper;
@@ -124,7 +127,9 @@
private SysUserMapper sysUserMapper;
@Autowired
private SysUserDeptMapper sysUserDeptMapper;
- private StockInventoryMapper stockInventoryMapper;
+
+ @Autowired
+ private HomeMapper homeMapper;
@Override
public HomeBusinessDto business() {
@@ -178,38 +183,13 @@
homeBusinessDto.setMonthPurchaseHaveMoney(unReceiptPaymentAmount.setScale(2, RoundingMode.HALF_UP).toString());
}
// 缁熻搴撳瓨
-// List<ProcurementRecordStorage> procurementRecordStorages = procurementRecordStorageMapper.selectList(null);
-// BigDecimal stockAmount = procurementRecordStorages.stream()
-// .map(ProcurementRecordStorage::getInboundNum)
-// .filter(Objects::nonNull)
-// .reduce(BigDecimal.ZERO, BigDecimal::add);
-// // 鑷畾涔夊簱瀛�
-// List<CustomStorage> customStorages = customStorageMapper.selectList(null);
-// BigDecimal customStockAmount = customStorages.stream()
-// .map(CustomStorage::getInboundNum)
-// .filter(Objects::nonNull)
-// .reduce(BigDecimal.ZERO, BigDecimal::add);
-// List<ProcurementRecordOut> procurementRecordOuts = procurementRecordOutMapper.selectList(null);
-// BigDecimal outboundAmount = procurementRecordOuts.stream()
-// .map(ProcurementRecordOut::getInboundNum)
-// .filter(Objects::nonNull)
-// .reduce(BigDecimal.ZERO, BigDecimal::add);
-// BigDecimal stock = stockAmount.add(customStockAmount).subtract(outboundAmount);
BigDecimal stockQuantityTotal = stockInventoryMapper.selectTotal();
homeBusinessDto.setInventoryNum(stockQuantityTotal.setScale(2, RoundingMode.HALF_UP).toString());
// 鑾峰彇褰撳ぉ鍏ュ簱鏁伴噺
- LambdaQueryWrapper<ProcurementRecordStorage> procurementRecordStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
- procurementRecordStorageLambdaQueryWrapper.ge(ProcurementRecordStorage::getCreateTime, now) // 澶т簬绛変簬褰撳ぉ
- .lt(ProcurementRecordStorage::getCreateTime, now.plusDays(1)); // 灏忎簬鏄庡ぉ
- List<ProcurementRecordStorage> procurementRecordStorages1 = procurementRecordStorageMapper.selectList(procurementRecordStorageLambdaQueryWrapper);
- BigDecimal stockAmount1 = procurementRecordStorages1.stream()
- .map(ProcurementRecordStorage::getInboundNum)
- .filter(Objects::nonNull)
- .reduce(BigDecimal.ZERO, BigDecimal::add);
-// homeBusinessDto.setInventoryNum(stock.setScale(2, RoundingMode.HALF_UP).toString());
- homeBusinessDto.setTodayInventoryNum(stockAmount1.setScale(2, RoundingMode.HALF_UP).toString());
+ BigDecimal bigDecimal = stockInventoryMapper.selectTotalByDate(LocalDate.now());
+ homeBusinessDto.setTodayInventoryNum(bigDecimal.setScale(2, RoundingMode.HALF_UP).toString());
return homeBusinessDto;
}
@@ -399,6 +379,12 @@
if (CollectionUtils.isEmpty(approveProcesses)) {
approveProcesses = new ArrayList<>();
}
+
+ approveProcesses.forEach(a -> {
+ if (a.getApproveType() != null) {
+ a.setApproveTypeName(ApproveTypeEnum.getNameByCode(a.getApproveType()));
+ }
+ });
// // 鏌ヨ鏈鐢ㄥ姵淇濊褰�
// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//
@@ -416,6 +402,8 @@
// approveProcesses.add(approveProcess);
// }
// }
+
+
return approveProcesses;
}
@@ -695,15 +683,15 @@
LocalDate startDate;
LocalDate endDate;
switch (type) {
- case 0: // 鍛�
+ case 1: // 鍛�
startDate = today.with(DayOfWeek.MONDAY);
endDate = today.with(DayOfWeek.SUNDAY);
break;
- case 1: // 鏈�
+ case 2: // 鏈�
startDate = today.with(TemporalAdjusters.firstDayOfMonth());
endDate = today.with(TemporalAdjusters.lastDayOfMonth());
break;
- case 2: // 瀛e害
+ case 3: // 瀛e害
Month currentMonth = today.getMonth();
Month firstMonthOfQuarter = currentMonth.firstMonthOfQuarter();
Month lastMonthOfQuarter = Month.of(firstMonthOfQuarter.getValue() + 2);
@@ -745,15 +733,15 @@
boolean groupByMonth = false;
switch (type) {
- case 0: // 鍛�
+ case 1: // 鍛�
start = today.with(DayOfWeek.MONDAY);
end = today.with(DayOfWeek.SUNDAY);
break;
- case 1: // 鏈�
+ case 2: // 鏈�
start = today.with(TemporalAdjusters.firstDayOfMonth());
end = today.with(TemporalAdjusters.lastDayOfMonth());
break;
- case 2: // 瀛e害
+ case 3: // 瀛e害
Month firstMonthOfQuarter = today.getMonth().firstMonthOfQuarter();
start = today.withMonth(firstMonthOfQuarter.getValue()).with(TemporalAdjusters.firstDayOfMonth());
end = today.withMonth(firstMonthOfQuarter.plus(2).getValue()).with(TemporalAdjusters.lastDayOfMonth());
@@ -814,109 +802,54 @@
ProductCategoryDistributionDto dto = new ProductCategoryDistributionDto();
List<ProductCategoryDistributionDto.MajorCategoryDto> majorItems = new ArrayList<>();
- // 鎵�鏈夌殑浜у搧澶х被鍜屽皬绫�
- List<Product> allProducts = productMapper.selectList(new LambdaQueryWrapper<Product>());
+ // 鏌ヨ鎵�鏈夌殑浜у搧绫诲埆
+ List<Product> allProducts = productMapper.selectList(new LambdaQueryWrapper<>());
if (CollectionUtils.isEmpty(allProducts)) {
dto.setItems(majorItems);
return dto;
}
- List<Product> majorCategories = allProducts.stream().filter(p -> p.getParentId() == null).collect(Collectors.toList());
- List<Product> minorCategories = allProducts.stream().filter(p -> p.getParentId() != null).collect(Collectors.toList());
+ // 鍒嗙澶х被鍜屽皬绫�
+ List<Product> majorCategories = allProducts.stream()
+ .filter(p -> p.getParentId() == null)
+ .collect(Collectors.toList());
+ List<Product> minorCategories = allProducts.stream()
+ .filter(p -> p.getParentId() != null)
+ .collect(Collectors.toList());
- // 浠� sales_ledger_product 鎷垮埌姣忎釜浜у搧鐨勫瀷鍙峰簱瀛�
- // 闇�鍖呭惈瑙勬牸鍨嬪彿浠ユ敮鎸佷笁绾у垎甯�
- List<Map<String, Object>> quantityMaps = salesLedgerProductMapper.selectMaps(new QueryWrapper<SalesLedgerProduct>()
- .select("product_id", "specification_model", "type", "SUM(quantity) as sum_qty")
- .isNotNull("product_id")
- .groupBy("product_id", "specification_model", "type"));
+ // 鎸夌埗绫籌D瀵瑰皬绫昏繘琛屽垎缁�
+ Map<Long, List<Product>> minorGroupMap = minorCategories.stream()
+ .collect(Collectors.groupingBy(Product::getParentId));
- Map<Long, Map<String, Map<Integer, BigDecimal>>> modelStockGroups = new HashMap<>();
- for (Map<String, Object> map : quantityMaps) {
- Long productId = Long.parseLong(map.get("product_id").toString());
- String model = map.get("specification_model") != null ? map.get("specification_model").toString() : "鏈煡鍨嬪彿";
- Integer type = Integer.parseInt(map.get("type").toString());
- BigDecimal sum = map.get("sum_qty") != null ? new BigDecimal(map.get("sum_qty").toString()) : BigDecimal.ZERO;
+ int totalMinorCount = minorCategories.size();
- modelStockGroups.computeIfAbsent(productId, k -> new HashMap<>())
- .computeIfAbsent(model, k -> new HashMap<>())
- .put(type, sum);
- }
-
- // 搴撳瓨骞舵眹鎬�
- Map<Long, List<MapDto>> productModelsMap = new HashMap<>();
- Map<Long, BigDecimal> productTotalStockMap = new HashMap<>();
-
- for (Long pid : modelStockGroups.keySet()) {
- Map<String, Map<Integer, BigDecimal>> models = modelStockGroups.get(pid);
- BigDecimal productStock = BigDecimal.ZERO;
- List<MapDto> modelDtos = new ArrayList<>();
-
- for (String modelName : models.keySet()) {
- Map<Integer, BigDecimal> types = models.get(modelName);
- BigDecimal procurement = types.getOrDefault(2, BigDecimal.ZERO);
- BigDecimal sales = types.getOrDefault(1, BigDecimal.ZERO);
- BigDecimal stock = procurement.subtract(sales);
- if (stock.compareTo(BigDecimal.ZERO) < 0) stock = BigDecimal.ZERO;
-
- MapDto modelDto = new MapDto();
- modelDto.setName(modelName);
- modelDto.setValue(stock.stripTrailingZeros().toPlainString());
- modelDtos.add(modelDto);
- productStock = productStock.add(stock);
- }
- productModelsMap.put(pid, modelDtos);
- productTotalStockMap.put(pid, productStock);
- }
-
- BigDecimal totalInventory = productTotalStockMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add);
-
- // 鍨嬪彿鍗犳瘮
- if (totalInventory.compareTo(BigDecimal.ZERO) > 0) {
- for (List<MapDto> dtos : productModelsMap.values()) {
- for (MapDto m : dtos) {
- BigDecimal val = new BigDecimal(m.getValue());
- m.setRate(val.multiply(new BigDecimal("100"))
- .divide(totalInventory, 2, RoundingMode.HALF_UP).toString());
- }
- }
- }
-
- // 鍒嗗眰鏁版嵁
for (Product major : majorCategories) {
ProductCategoryDistributionDto.MajorCategoryDto majorDto = new ProductCategoryDistributionDto.MajorCategoryDto();
majorDto.setName(major.getProductName());
- List<ProductCategoryDistributionDto.MinorCategoryDto> minorDtos = new ArrayList<>();
- BigDecimal majorStock = BigDecimal.ZERO;
+ List<Product> children = minorGroupMap.getOrDefault(major.getId(), new ArrayList<>());
+ int childrenSize = children.size();
+ // 璁剧疆灏忕被鐨勬�绘暟
+ majorDto.setValue(String.valueOf(childrenSize));
- for (Product minor : minorCategories) {
- if (major.getId().equals(minor.getParentId())) {
- BigDecimal stock = productTotalStockMap.getOrDefault(minor.getId(), BigDecimal.ZERO);
- ProductCategoryDistributionDto.MinorCategoryDto minorDto = new ProductCategoryDistributionDto.MinorCategoryDto();
- minorDto.setName(minor.getProductName());
- minorDto.setValue(stock.stripTrailingZeros().toPlainString());
-
- if (totalInventory.compareTo(BigDecimal.ZERO) > 0) {
- minorDto.setRate(stock.multiply(new BigDecimal("100"))
- .divide(totalInventory, 2, RoundingMode.HALF_UP).toString());
- } else {
- minorDto.setRate("0.00");
- }
-
- minorDto.setChildren(productModelsMap.getOrDefault(minor.getId(), new ArrayList<>()));
- minorDtos.add(minorDto);
- majorStock = majorStock.add(stock);
- }
- }
-
- majorDto.setValue(majorStock.stripTrailingZeros().toPlainString());
-
- if (totalInventory.compareTo(BigDecimal.ZERO) > 0) {
- majorDto.setRate(majorStock.multiply(new BigDecimal("100"))
- .divide(totalInventory, 2, RoundingMode.HALF_UP).toString());
+ // 璁$畻鍗犳瘮
+ if (totalMinorCount > 0) {
+ BigDecimal rate = BigDecimal.valueOf(childrenSize)
+ .multiply(new BigDecimal("100"))
+ .divide(BigDecimal.valueOf(totalMinorCount), 2, RoundingMode.HALF_UP);
+ majorDto.setRate(rate.toString());
} else {
majorDto.setRate("0.00");
+ }
+
+ List<ProductCategoryDistributionDto.MinorCategoryDto> minorDtos = new ArrayList<>();
+ for (Product minor : children) {
+ ProductCategoryDistributionDto.MinorCategoryDto minorDto = new ProductCategoryDistributionDto.MinorCategoryDto();
+ minorDto.setName(minor.getProductName());
+ minorDto.setValue("0");
+ minorDto.setRate("0.00");
+ minorDto.setChildren(new ArrayList<>());
+ minorDtos.add(minorDto);
}
majorDto.setChildren(minorDtos);
majorItems.add(majorDto);
@@ -932,15 +865,15 @@
LocalDate startDate = null;
LocalDate endDate = null;
switch (type) {
- case 0:
+ case 1:
startDate = today.with(DayOfWeek.MONDAY);
endDate = today.with(DayOfWeek.SUNDAY);
break;
- case 1:
+ case 2:
startDate = today.with(TemporalAdjusters.firstDayOfMonth());
endDate = today.with(TemporalAdjusters.lastDayOfMonth());
break;
- case 2:
+ case 3:
Month currentMonth = today.getMonth();
Month firstMonthOfQuarter = currentMonth.firstMonthOfQuarter();
Month lastMonthOfQuarter = Month.of(firstMonthOfQuarter.getValue() + 2);
@@ -970,4 +903,199 @@
}
return result;
}
+
+ @Override
+ public List<MapDto> productSalesAnalysis() {
+ // 鑾峰彇鎵�鏈変骇鍝佸ぇ绫荤殑閿�鍞
+ List<Map<String, Object>> analysisResults = salesLedgerProductMapper.selectProductSalesAnalysis();
+ if (CollectionUtils.isEmpty(analysisResults)) {
+ return new ArrayList<>();
+ }
+
+ // 璁$畻鎬婚攢鍞
+ BigDecimal totalSalesAmount = analysisResults.stream()
+ .map(r -> (BigDecimal) r.get("value"))
+ .filter(Objects::nonNull)
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+ return analysisResults.stream()
+ .map(result -> {
+ MapDto mapDto = new MapDto();
+ String name = (String) result.get("name");
+ BigDecimal value = (BigDecimal) result.get("value");
+
+ mapDto.setName(name);
+ mapDto.setValue(value != null ? value.setScale(2, RoundingMode.HALF_UP).toString() : "0.00");
+
+ if (totalSalesAmount.compareTo(BigDecimal.ZERO) == 0 || value == null) {
+ mapDto.setRate("0.00");
+ } else {
+ String rate = value.divide(totalSalesAmount, 4, RoundingMode.HALF_UP)
+ .multiply(new BigDecimal("100"))
+ .setScale(2, RoundingMode.HALF_UP)
+ .toString();
+ mapDto.setRate(rate);
+ }
+ return mapDto;
+ })
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ public List<MapDto> rawMaterialPurchaseAmountRatio() {
+ // 鑾峰彇鎵�鏈夊師鏉愭枡鐨勯噰璐
+ List<Map<String, Object>> analysisResults = salesLedgerProductMapper.selectRawMaterialPurchaseAnalysis();
+ if (CollectionUtils.isEmpty(analysisResults)) {
+ return new ArrayList<>();
+ }
+
+ // 璁$畻鎬婚噰璐
+ BigDecimal totalPurchaseAmount = analysisResults.stream()
+ .map(r -> (BigDecimal) r.get("value"))
+ .filter(Objects::nonNull)
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+ return analysisResults.stream()
+ .map(result -> {
+ MapDto mapDto = new MapDto();
+ String name = (String) result.get("name");
+ BigDecimal value = (BigDecimal) result.get("value");
+
+ mapDto.setName(name);
+ mapDto.setValue(value != null ? value.setScale(2, RoundingMode.HALF_UP).toString() : "0.00");
+
+ if (totalPurchaseAmount.compareTo(BigDecimal.ZERO) == 0 || value == null) {
+ mapDto.setRate("0.00");
+ } else {
+ String rate = value.divide(totalPurchaseAmount, 4, RoundingMode.HALF_UP)
+ .multiply(new BigDecimal("100"))
+ .setScale(2, RoundingMode.HALF_UP)
+ .toString();
+ mapDto.setRate(rate);
+ }
+ return mapDto;
+ })
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ public List<MapDto> salesPurchaseStorageProductCount() {
+ LocalDate now = LocalDate.now();
+ DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+ String currentMonthStart = now.with(TemporalAdjusters.firstDayOfMonth()).format(dtf);
+ String currentMonthNow = now.format(dtf);
+
+ LocalDate lastMonth = now.minusMonths(1);
+ String lastMonthStart = lastMonth.with(TemporalAdjusters.firstDayOfMonth()).format(dtf);
+ String lastMonthEnd = lastMonth.with(TemporalAdjusters.lastDayOfMonth()).format(dtf);
+
+ // 閿�鍞�
+ int currentSales = salesLedgerProductMapper.selectProductCountByTypeAndDate(1, currentMonthStart, currentMonthNow);
+ int lastSales = salesLedgerProductMapper.selectProductCountByTypeAndDate(1, lastMonthStart, lastMonthEnd);
+
+ // 閲囪喘
+ int currentPurchase = salesLedgerProductMapper.selectProductCountByTypeAndDate(2, currentMonthStart, currentMonthNow);
+ int lastPurchase = salesLedgerProductMapper.selectProductCountByTypeAndDate(2, lastMonthStart, lastMonthEnd);
+
+ // 鍌ㄥ瓨
+ int currentStorage = stockInventoryMapper.selectStorageProductCountByDate(currentMonthStart, currentMonthNow);
+ int lastStorage = stockInventoryMapper.selectStorageProductCountByDate(lastMonthStart, lastMonthEnd);
+
+ List<MapDto> list = new ArrayList<>();
+ list.add(createMapDto("閿�鍞骇鍝佹暟", currentSales, lastSales));
+ list.add(createMapDto("閲囪喘浜у搧鏁�", currentPurchase, lastPurchase));
+ list.add(createMapDto("鍌ㄥ瓨浜у搧鏁�", currentStorage, lastStorage));
+
+ return list;
+ }
+
+ private MapDto createMapDto(String name, int current, int last) {
+ MapDto dto = new MapDto();
+ dto.setName(name);
+ dto.setValue(String.valueOf(current));
+
+ if (last == 0) {
+ dto.setRate(current > 0 ? "100.00" : "0.00");
+ } else {
+ BigDecimal curDec = new BigDecimal(current);
+ BigDecimal lastDec = new BigDecimal(last);
+ // 澧為暱鐜�
+ String rate = curDec.subtract(lastDec)
+ .divide(lastDec, 4, RoundingMode.HALF_UP)
+ .multiply(new BigDecimal("100"))
+ .setScale(2, RoundingMode.HALF_UP)
+ .toString();
+ dto.setRate(rate);
+ }
+ return dto;
+ }
+
+ @Override
+ public List<Map<String, Object>> productInOutAnalysis(Integer type) {
+ String targetName;
+ if (type == 1) {
+ targetName = "鍘熸潗鏂�";
+ } else if (type == 2) {
+ targetName = "鎴愬搧";
+ } else if (type == 3) {
+ targetName = "鍗婃垚鍝�";
+ } else {
+ return new ArrayList<>();
+ }
+
+ LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.eq(Product::getProductName, targetName).isNull(Product::getParentId);
+ Product rootCategory = productMapper.selectOne(queryWrapper);
+
+ if (rootCategory == null) {
+ log.warn("鏈壘鍒板悕绉颁负 {} 鐨勯《绾т骇鍝佸垎绫�", targetName);
+ return new ArrayList<>();
+ }
+ Long rootCategoryId = rootCategory.getId();
+
+ LocalDate now = LocalDate.now();
+ DateTimeFormatter displayDtf = DateTimeFormatter.ofPattern("M/d");
+
+ String startDate = now.minusDays(6).toString();
+ String endDate = now.toString();
+
+ List<Map<String, Object>> inCounts = stockInventoryMapper.selectDailyStockInCounts(rootCategoryId, startDate, endDate + " 23:59:59");
+
+ List<Map<String, Object>> outCounts = stockInventoryMapper.selectDailyStockOutCounts(rootCategoryId, startDate, endDate + " 23:59:59");
+
+ Map<LocalDate, BigDecimal> inMap = inCounts.stream()
+ .collect(Collectors.toMap(
+ m -> ((java.sql.Date) m.get("date")).toLocalDate(),
+ m -> (BigDecimal) m.get("count"),
+ BigDecimal::add
+ ));
+
+ Map<LocalDate, BigDecimal> outMap = outCounts.stream()
+ .collect(Collectors.toMap(
+ m -> ((java.sql.Date) m.get("date")).toLocalDate(),
+ m -> (BigDecimal) m.get("count"),
+ BigDecimal::add
+ ));
+
+ List<Map<String, Object>> result = new ArrayList<>();
+
+ for (int i = 6; i >= 0; i--) {
+ LocalDate date = now.minusDays(i);
+
+ Map<String, Object> dataPoint = new LinkedHashMap<>();
+ dataPoint.put("date", date.format(displayDtf)); // 1/23
+ dataPoint.put("inCount", inMap.getOrDefault(date, BigDecimal.ZERO));
+ dataPoint.put("outCount", outMap.getOrDefault(date, BigDecimal.ZERO));
+
+ result.add(dataPoint);
+ }
+
+ return result;
+ }
+
+ @Override
+ public List<MapDto> productTurnoverDays() {
+ return homeMapper.productTurnoverDays();
+ }
}
--
Gitblit v1.9.3