From 1f5fdca1ab73461fb930f64c26dcb4038a9d4bf7 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期一, 25 五月 2026 10:10:06 +0800
Subject: [PATCH] 11
---
src/main/resources/mapper/sales/SalesLedgerProductMapper.xml | 40 +++++++++----
src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java | 109 +++++++++++++++--------------------
2 files changed, 75 insertions(+), 74 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 d3c21a2..87a2358 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -1019,7 +1019,7 @@
public List<Map<String, Object>> productInOutAnalysis(Integer type) {
String targetName;
if (type == 1) {
- targetName = "鍘熸潗鏂�";
+ targetName = "鍘熸枡";
} else if (type == 2) {
targetName = "鎴愬搧";
} else if (type == 3) {
@@ -1478,95 +1478,80 @@
String endStr = endDate.atTime(LocalTime.MAX).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
List<ProductionTaskStatisticsDto> startList = productionOperationTaskMapper.selectTaskStartStats(startStr, endStr);
-
- List<ProductionProductOutputDto> outputList = productionProductOutputMapper
- .selectOutputStats(startStr, endStr);
+ List<ProductionProductOutputDto> outputList = productionProductOutputMapper.selectOutputStats(startStr, endStr);
Map<String, WorkOrderEfficiencyDto> dateMap = new HashMap<>();
+ // 1. 澶勭悊寮�宸ユ暟閲忥紙缁熶竴灏嗘椂闂磋浆涓� LocalDate 瀛楃涓诧紝鍘婚櫎鏃跺垎绉掞級
if (!CollectionUtils.isEmpty(startList)) {
for (ProductionTaskStatisticsDto item : startList) {
if (item.getActualStartTime() != null) {
- String date = item.getActualStartTime().toString();
- WorkOrderEfficiencyDto dto = dateMap.getOrDefault(date, new WorkOrderEfficiencyDto());
- dto.setDate(date);
+ // 馃挕 鍏抽敭淇敼锛氬鏋滄槸 LocalDateTime锛屽繀椤诲厛 toLocalDate() 鍐� toString()
+ String dateStr = item.getActualStartTime().toString();
+ WorkOrderEfficiencyDto dto = dateMap.computeIfAbsent(dateStr, k -> {
+ WorkOrderEfficiencyDto newDto = new WorkOrderEfficiencyDto();
+ newDto.setDate(k);
+ newDto.setStartQuantity(BigDecimal.ZERO);
+ newDto.setFinishQuantity(BigDecimal.ZERO);
+ newDto.setYieldRate("0.00");
+ return newDto;
+ });
+
BigDecimal qty = item.getPlanQuantity() != null ? item.getPlanQuantity() : BigDecimal.ZERO;
- dto.setStartQuantity(dto.getStartQuantity() != null ? dto.getStartQuantity().add(qty) : qty);
- dateMap.put(date, dto);
+ dto.setStartQuantity(dto.getStartQuantity().add(qty));
}
}
}
- // 瀹屽伐鏁伴噺鍜岃壇鍝佺巼
+ // 2. 澶勭悊瀹屽伐鏁伴噺鍜屾姤搴熸暟閲忥紙浠呴�氳繃 1 娆″惊鐜悶瀹氾紝澶у箙鎻愬崌鎬ц兘锛�
if (!CollectionUtils.isEmpty(outputList)) {
+ // 瀹氫箟涓�涓复鏃剁殑鎶ュ簾鏁拌鏁板櫒锛屾柟渚垮悗闈㈢畻鑹搧鐜�
+ Map<String, BigDecimal> scrapMap = new HashMap<>();
+
for (ProductionProductOutputDto item : outputList) {
if (item.getCreateTime() != null) {
- String date = item.getCreateTime().toLocalDate().toString();
- WorkOrderEfficiencyDto dto = dateMap.getOrDefault(date, new WorkOrderEfficiencyDto());
- dto.setDate(date);
+ String dateStr = item.getCreateTime().toLocalDate().toString();
- BigDecimal finishQty = item.getQuantity() != null ? item.getQuantity() : BigDecimal.ZERO;
- BigDecimal scrapQty = item.getScrapQty() != null ? item.getScrapQty() : BigDecimal.ZERO;
+ WorkOrderEfficiencyDto dto = dateMap.computeIfAbsent(dateStr, k -> {
+ WorkOrderEfficiencyDto newDto = new WorkOrderEfficiencyDto();
+ newDto.setDate(k);
+ newDto.setStartQuantity(BigDecimal.ZERO);
+ newDto.setFinishQuantity(BigDecimal.ZERO);
+ newDto.setYieldRate("0.00");
+ return newDto;
+ });
- dto.setFinishQuantity(
- dto.getFinishQuantity() != null ? dto.getFinishQuantity().add(finishQty) : finishQty);
+ BigDecimal qty = item.getQuantity() != null ? item.getQuantity() : BigDecimal.ZERO;
+ BigDecimal scrap = item.getScrapQty() != null ? item.getScrapQty() : BigDecimal.ZERO;
+
+ // 鑹搧鏁� = 鎬绘姇鍏ユ暟 - 鎶ュ簾鏁� (瀵瑰簲浣犲師浠g爜涓� finishMap 鐨勯�昏緫)
+ BigDecimal goodQty = qty.subtract(scrap);
+ dto.setFinishQuantity(dto.getFinishQuantity().add(goodQty));
+
+ // 绱姞鎶ュ簾鏁�
+ scrapMap.put(dateStr, scrapMap.getOrDefault(dateStr, BigDecimal.ZERO).add(scrap));
}
}
- Map<String, BigDecimal> scrapMap = outputList.stream()
- .filter(i -> i.getCreateTime() != null)
- .collect(Collectors.groupingBy(
- i -> i.getCreateTime().toLocalDate().toString(),
- Collectors.reducing(BigDecimal.ZERO,
- i -> i.getScrapQty() != null ? i.getScrapQty() : BigDecimal.ZERO,
- BigDecimal::add)));
-
- Map<String, BigDecimal> finishMap = outputList.stream()
- .filter(i -> i.getCreateTime() != null)
- .collect(Collectors.groupingBy(
- i -> i.getCreateTime().toLocalDate().toString(),
- Collectors.reducing(BigDecimal.ZERO, i -> {
- BigDecimal qty = (i.getQuantity() != null) ? i.getQuantity() : BigDecimal.ZERO;
- BigDecimal scrap = (i.getScrapQty() != null) ? i.getScrapQty() : BigDecimal.ZERO;
- return qty.subtract(scrap);
- }, BigDecimal::add)));
-
- finishMap.forEach((date, qty) -> {
- WorkOrderEfficiencyDto dto = dateMap.getOrDefault(date, new WorkOrderEfficiencyDto());
- dto.setDate(date);
- dto.setFinishQuantity(qty);
- dateMap.put(date, dto);
- });
-
- dateMap.forEach((date, dto) -> {
- BigDecimal finish = dto.getFinishQuantity() != null ? dto.getFinishQuantity() : BigDecimal.ZERO;
- BigDecimal scrap = scrapMap.getOrDefault(date, BigDecimal.ZERO);
+ // 3. 璁$畻鑹搧鐜�
+ dateMap.forEach((dateStr, dto) -> {
+ BigDecimal finish = dto.getFinishQuantity();
+ BigDecimal scrap = scrapMap.getOrDefault(dateStr, BigDecimal.ZERO);
BigDecimal total = finish.add(scrap);
if (total.compareTo(BigDecimal.ZERO) > 0) {
- BigDecimal rate = finish.divide(total, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"))
- .setScale(2, RoundingMode.HALF_UP);
+ // 馃挕 寤剁画浣犱箣鍓嶇殑閫昏緫锛氫娇鐢� RoundingMode.DOWN 鎴柇锛岄槻姝� 99.999% 鍥涜垗浜斿叆鍙樻垚 100.00
+ BigDecimal rate = finish.divide(total, 4, RoundingMode.DOWN)
+ .multiply(new BigDecimal("100"))
+ .setScale(2, RoundingMode.DOWN);
dto.setYieldRate(rate.toString());
} else {
dto.setYieldRate("0.00");
}
-
- if (dto.getStartQuantity() == null)
- dto.setStartQuantity(BigDecimal.ZERO);
- if (dto.getFinishQuantity() == null)
- dto.setFinishQuantity(BigDecimal.ZERO);
});
}
- dateMap.values().forEach(dto -> {
- if (dto.getStartQuantity() == null)
- dto.setStartQuantity(BigDecimal.ZERO);
- if (dto.getFinishQuantity() == null)
- dto.setFinishQuantity(BigDecimal.ZERO);
- if (dto.getYieldRate() == null)
- dto.setYieldRate("0.00");
- });
-
+ // 4. 鎺掑簭骞惰緭鍑�
return dateMap.values().stream()
.sorted(Comparator.comparing(WorkOrderEfficiencyDto::getDate))
.collect(Collectors.toList());
@@ -1915,7 +1900,7 @@
}
switch (parent.getProductName()) {
- case "鍘熸潗鏂�":
+ case "鍘熸枡":
rawMaterialCount = rawMaterialCount.add(quantity);
break;
case "鍗婃垚鍝�":
diff --git a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
index dde96d9..4016b2a 100644
--- a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
+++ b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -60,9 +60,9 @@
GROUP BY sales_ledger_product_id
) t3 ON t3.sales_ledger_product_id = T1.id
LEFT JOIN (
- SELECT
- purchase_ledger_id,
- product_model_id,
+ SELECT
+ purchase_ledger_id,
+ product_model_id,
SUM(IFNULL(quantity, 0)) AS approved_stock_in_num
FROM quality_inspect
WHERE inspect_state = 1
@@ -183,7 +183,7 @@
JOIN product pr ON slp.product_id = pr.id
WHERE
slp.type = 2
- AND pr.parent_id = ( SELECT id FROM product WHERE product_name = '鍘熸潗鏂�' )
+ AND pr.parent_id = ( SELECT id FROM product WHERE product_name = '鍘熸枡' )
GROUP BY
pr.id,
pr.product_name
@@ -194,20 +194,36 @@
<select id="selectProductCountByTypeAndDate" resultType="int">
SELECT IFNULL(COUNT(*), 0)
- FROM sales_ledger_product
+ FROM sales_ledger_product slp
+ LEFT JOIN sales_ledger sl ON sl.id = slp.sales_ledger_id
+ LEFT JOIN purchase_ledger pl ON pl.id = slp.sales_ledger_id
WHERE type = #{type}
- <if test="startDate != null">
- AND register_date >= #{startDate}
- </if>
- <if test="endDate != null">
- AND register_date <= #{endDate}
- </if>
+
+ <choose>
+ <when test="type == 1">
+ <if test="startDate != null">
+ AND sl.entry_date >= #{startDate}
+ </if>
+ <if test="endDate != null">
+ AND sl.entry_date <= #{endDate}
+ </if>
+ </when>
+
+ <when test="type == 2">
+ <if test="startDate != null">
+ AND pl.entry_date >= #{startDate}
+ </if>
+ <if test="endDate != null">
+ AND pl.entry_date <= #{endDate}
+ </if>
+ </when>
+ </choose>
</select>
<select id="selectRawMaterialExpense" resultType="java.math.BigDecimal">
WITH RECURSIVE product_tree AS (SELECT id
FROM product
- WHERE product_name = '鍘熸潗鏂�'
+ WHERE product_name = '鍘熸枡'
UNION ALL
--
Gitblit v1.9.3