From 7b4fdb4289ded1adc3dc8466a8d0225a86a81e6a Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期三, 28 一月 2026 16:21:24 +0800
Subject: [PATCH] refactor(home): 删除质检信息,删除销售信息,回滚对应的库存信息
---
src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java | 282 +++++++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 226 insertions(+), 56 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 6085d2d..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,7 +12,6 @@
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;
@@ -52,6 +51,7 @@
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.staff.mapper.StaffOnJobMapper;
import com.ruoyi.staff.pojo.StaffOnJob;
+import com.ruoyi.stock.mapper.StockInventoryMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -83,6 +83,9 @@
@Autowired
private SalesLedgerProductMapper salesLedgerProductMapper;
+
+ @Autowired
+ private StockInventoryMapper stockInventoryMapper;
@Autowired
private ProcurementRecordMapper procurementRecordStorageMapper;
@@ -125,6 +128,9 @@
@Autowired
private SysUserDeptMapper sysUserDeptMapper;
+ @Autowired
+ private HomeMapper homeMapper;
+
@Override
public HomeBusinessDto business() {
// 鏋勫缓缁撴灉
@@ -136,7 +142,7 @@
salesLedgerLambdaQueryWrapper.ge(SalesLedger::getEntryDate, currentMonth.atDay(1).atStartOfDay()) // 澶т簬绛変簬鏈湀绗竴澶�
.lt(SalesLedger::getEntryDate, currentMonth.plusMonths(1).atDay(1).atStartOfDay()); // 灏忎簬涓嬫湀绗竴澶�
List<SalesLedger> salesLedgers = salesLedgerMapper.selectList(salesLedgerLambdaQueryWrapper);
- if(!CollectionUtils.isEmpty(salesLedgers)){
+ if (!CollectionUtils.isEmpty(salesLedgers)) {
// 鍚堣鍚堝悓閲戦
BigDecimal contractAmount = salesLedgers.stream().map(SalesLedger::getContractAmount)
.filter(Objects::nonNull)
@@ -158,7 +164,7 @@
.lt(PurchaseLedger::getEntryDate, currentMonth.plusMonths(1).atDay(1).atStartOfDay()); // 灏忎簬涓嬫湀绗竴澶�
// 鎵ц鏌ヨ骞惰绠楁�诲拰
List<PurchaseLedger> purchaseLedgers = purchaseLedgerMapper.selectList(queryWrapper);
- if(!CollectionUtils.isEmpty(purchaseLedgers)){
+ if (!CollectionUtils.isEmpty(purchaseLedgers)) {
LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductMapperLambdaQueryWrapperCopy = new LambdaQueryWrapper<SalesLedgerProduct>();
salesLedgerProductMapperLambdaQueryWrapperCopy.eq(SalesLedgerProduct::getType, 2)
.in(SalesLedgerProduct::getSalesLedgerId, purchaseLedgers.stream().map(PurchaseLedger::getId).collect(Collectors.toList()));
@@ -177,46 +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);
- IPage<ProductModel> productModelIPage = productModelMapper.listPageProductModel(new Page<>(1, -1), new ProductModel());
- if(!CollectionUtils.isEmpty(productModelIPage.getRecords())){
- //鑾峰彇瑙勬牸id
- List<Long> modelIds = productModelIPage.getRecords().stream().map(ProductModel::getId).collect(Collectors.toList());
- BigDecimal stockQuantityTotal = modelIds.stream()
- .map(stockUtils::getStockQuantity)
- .map(map -> map.get("stockQuantity"))
- .filter(Objects::nonNull)
- .reduce(BigDecimal.ZERO, BigDecimal::add);
- homeBusinessDto.setInventoryNum(stockQuantityTotal.setScale(2, RoundingMode.HALF_UP).toString());
- }
+ 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;
}
@@ -254,9 +227,9 @@
BigDecimal subtract = weekContractAmount.subtract(lastYearWeekContractAmount);
String weekYny = "";
// 鍛ㄥ悓姣�
- if(subtract.compareTo(BigDecimal.ZERO) == 0 || lastYearWeekContractAmount.compareTo(BigDecimal.ZERO) == 0){
+ if (subtract.compareTo(BigDecimal.ZERO) == 0 || lastYearWeekContractAmount.compareTo(BigDecimal.ZERO) == 0) {
weekYny = "0.00";
- }else{
+ } else {
weekYny = String.format("%.2f", subtract.divide(lastYearWeekContractAmount, 2, RoundingMode.HALF_UP).multiply(new BigDecimal("100")));
}
@@ -279,9 +252,9 @@
BigDecimal subtract1 = todayContractAmount.subtract(lastYearYesterdayContractAmount); // 淇敼锛氫娇鐢� todayContractAmount 鑰屼笉鏄� yesterdayContractAmount
// 鏃ョ幆姣�
String chain = "";
- if(subtract1.compareTo(BigDecimal.ZERO) == 0 || lastYearYesterdayContractAmount.compareTo(BigDecimal.ZERO) == 0){
+ if (subtract1.compareTo(BigDecimal.ZERO) == 0 || lastYearYesterdayContractAmount.compareTo(BigDecimal.ZERO) == 0) {
chain = "0.00";
- }else{
+ } else {
chain = String.format("%.2f", subtract1.divide(lastYearYesterdayContractAmount, 2, RoundingMode.HALF_UP).multiply(new BigDecimal("100")));
}
@@ -295,14 +268,14 @@
Map<String, BigDecimal> collect = salesLedgers.stream().collect(Collectors.groupingBy(SalesLedger::getCustomerName, Collectors.reducing(BigDecimal.ZERO,
SalesLedger::getContractAmount, BigDecimal::add)));
List<MapDto> mapDtos = new ArrayList<>();
- collect.forEach((k,v)->{
+ collect.forEach((k, v) -> {
MapDto mapDto = new MapDto();
mapDto.setName(k);
// 淇敼锛氬皢閲戦鍊间繚鐣欎袱浣嶅皬鏁�
mapDto.setValue(v.setScale(2, RoundingMode.HALF_UP).toString());
- if(contractAmount.compareTo(new BigDecimal(0)) == 0){
+ if (contractAmount.compareTo(new BigDecimal(0)) == 0) {
mapDto.setRate("0");
- }else{
+ } else {
mapDto.setRate(String.format("%.2f", v.divide(contractAmount, 2, RoundingMode.HALF_UP).multiply(new BigDecimal("100"))));
}
mapDtos.add(mapDto);
@@ -348,7 +321,7 @@
.filter(inspect -> inspect.getInspectType().equals(1))
.map(QualityInspect::getQuantity)
.reduce(BigDecimal.ZERO, BigDecimal::add);
- processNum= processNum.add(reduce1);
+ processNum = processNum.add(reduce1);
BigDecimal reduce2 = monthInspects.stream()
.filter(inspect -> inspect.getInspectType().equals(2))
.map(QualityInspect::getQuantity)
@@ -435,7 +408,6 @@
}
/**
- *
* @param type 1-鍛� 2-鏈� 3-瀛e害
* @return
*/
@@ -444,7 +416,7 @@
LocalDate today = LocalDate.now();
LocalDate startDate = null;
LocalDate endDate = null;
- switch (type){
+ switch (type) {
case 1:
// 鑾峰彇鏈懆鍛ㄤ竴
startDate = today.with(DayOfWeek.MONDAY);
@@ -502,6 +474,7 @@
return statisticsReceivablePayableDto;
}
+
public static <T> BigDecimal sumAmount(List<T> list, java.util.function.Function<T, BigDecimal> amountExtractor) {
return list.stream()
// 鎻愬彇閲戦鏃讹紝灏唍ull鏇挎崲涓築igDecimal.ZERO
@@ -509,6 +482,7 @@
// 绱姞锛屽垵濮嬪�间负0锛岄伩鍏嶇┖娴侀棶棰�
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
+
@Autowired
private DeviceRepairMapper deviceRepairMapper;
@@ -551,9 +525,10 @@
productionProgressDto.setTotalOrderCount(totalCount);
productionProgressDto.setCompletedOrderCount(count);
productionProgressDto.setUncompletedOrderCount(count2);
- productionProgressDto.setPartialCompletedOrderCount(totalCount-count-count2);
+ productionProgressDto.setPartialCompletedOrderCount(totalCount - count - count2);
return productionProgressDto;
}
+
@Override
public ProductionTurnoverDto workInProcessTurnover() {
ProductionTurnoverDto productionTurnoverDto = new ProductionTurnoverDto();
@@ -566,15 +541,15 @@
.map(ProductWorkOrder::getPlanQuantity)
.mapToLong(BigDecimal::longValue)
.sum();
- if (sum == 0)return null;
+ if (sum == 0) return null;
productionTurnoverDto.setTotalOrderCount(sum);//鎬诲湪鍒跺搧鏁伴噺
- productionTurnoverDto.setAverageTurnoverDays(BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(ChronoUnit.DAYS.between(LocalDateTime.now().minusMonths(1), LocalDateTime.now())),2,RoundingMode.HALF_UP));
+ productionTurnoverDto.setAverageTurnoverDays(BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(ChronoUnit.DAYS.between(LocalDateTime.now().minusMonths(1), LocalDateTime.now())), 2, RoundingMode.HALF_UP));
long completeQuantity = productWorkOrders.stream()
.filter(productWorkOrder -> productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) >= 0)
.map(ProductWorkOrder::getCompleteQuantity)
.mapToLong(BigDecimal::longValue)
.sum();
- productionTurnoverDto.setTurnoverEfficiency(BigDecimal.valueOf(completeQuantity).divide(BigDecimal.valueOf(sum),2,RoundingMode.HALF_UP));
+ productionTurnoverDto.setTurnoverEfficiency(BigDecimal.valueOf(completeQuantity).divide(BigDecimal.valueOf(sum), 2, RoundingMode.HALF_UP));
Map<String, List<ProductWorkOrderDto>> map = productWorkOrders.stream()
.filter(productWorkOrder -> productWorkOrder.getPlanQuantity().compareTo(productWorkOrder.getCompleteQuantity()) > 0)
.collect(Collectors.groupingBy(ProductWorkOrderDto::getProcessName));
@@ -928,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