From 12067f657bc3dc169a7a466e433374368e8daf73 Mon Sep 17 00:00:00 2001
From: chen.llin <1442464845@qq.comm>
Date: 星期日, 18 一月 2026 16:14:27 +0800
Subject: [PATCH] 越库订单逻辑调整
---
src/main/java/com/zy/asrs/service/impl/MonthlySettleServiceImpl.java | 183 ++++++++++++++++++++++++++++++++++-----------
1 files changed, 139 insertions(+), 44 deletions(-)
diff --git a/src/main/java/com/zy/asrs/service/impl/MonthlySettleServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MonthlySettleServiceImpl.java
index 79921c6..7e14911 100644
--- a/src/main/java/com/zy/asrs/service/impl/MonthlySettleServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MonthlySettleServiceImpl.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.core.common.Cools;
import com.core.common.SnowflakeIdWorker;
import com.core.exception.CoolException;
import com.zy.asrs.entity.MonthlySettle;
@@ -91,12 +92,21 @@
cal.set(Calendar.MILLISECOND, 999);
endDate = cal.getTime();
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+ // 娉ㄦ剰锛歰rder_time 鏄� varchar 绫诲瀷锛岄渶瑕佹牸寮忓寲涓哄畬鏁寸殑鏃ユ湡鏃堕棿瀛楃涓茶繘琛屾瘮杈�
SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- String startDateStr = dateFormat.format(startDate);
+ // 璧峰鏃ユ湡璁剧疆涓哄綋澶╃殑 00:00:00
+ Calendar startCal = Calendar.getInstance();
+ startCal.setTime(startDate);
+ startCal.set(Calendar.HOUR_OF_DAY, 0);
+ startCal.set(Calendar.MINUTE, 0);
+ startCal.set(Calendar.SECOND, 0);
+ startCal.set(Calendar.MILLISECOND, 0);
+ String startDateStr = dateTimeFormat.format(startCal.getTime());
String endDateStr = dateTimeFormat.format(endDate);
- int count = this.baseMapper.countUnfinishedOrdersInRange(startDateStr, endDateStr);
- return count > 0;
+ // 鍒嗕袱娆℃煡璇細鍏ュ簱鍜屽嚭搴�
+ int pakinCount = this.baseMapper.countUnfinishedOrdersInRangePakin(startDateStr, endDateStr);
+ int pakoutCount = this.baseMapper.countUnfinishedOrdersInRangePakout(startDateStr, endDateStr);
+ return (pakinCount + pakoutCount) > 0;
}
@Override
@@ -141,9 +151,16 @@
}
// 缁熻鐗╂枡鍑哄叆搴撴暟閲忥紙鍒嗗埆鏌ヨ涓や釜琛紝鍦↗ava浠g爜涓悎骞讹級
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+ // 娉ㄦ剰锛歰rder_time 鏄� varchar 绫诲瀷锛岄渶瑕佹牸寮忓寲涓哄畬鏁寸殑鏃ユ湡鏃堕棿瀛楃涓茶繘琛屾瘮杈�
SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- String startDateStr = dateFormat.format(startDate);
+ // 璧峰鏃ユ湡璁剧疆涓哄綋澶╃殑 00:00:00
+ Calendar startCal = Calendar.getInstance();
+ startCal.setTime(startDate);
+ startCal.set(Calendar.HOUR_OF_DAY, 0);
+ startCal.set(Calendar.MINUTE, 0);
+ startCal.set(Calendar.SECOND, 0);
+ startCal.set(Calendar.MILLISECOND, 0);
+ String startDateStr = dateTimeFormat.format(startCal.getTime());
String endDateStr = dateTimeFormat.format(endDate);
// 鍒嗗埆鏌ヨ鍏ュ簱琛ㄥ拰鍑哄簱琛�
@@ -259,6 +276,9 @@
currentMaterialMap.put(key, stat);
}
+ // 鏀堕泦鎵�鏈夋槑缁嗚褰曪紝鐢ㄤ簬鎵归噺鎻掑叆
+ List<MonthlySettleDetail> detailList = new java.util.ArrayList<>();
+
// 1. 澶勭悊鏈湡鏈夊嚭鍏ュ簱鐨勭墿鏂�
for (MaterialInOutStatDTO stat : materialStats) {
// 1. 鎻愬彇鍩虹淇℃伅
@@ -274,16 +294,16 @@
// 3. 璁$畻搴撳瓨鐩稿叧鏁伴噺
BigDecimal beginningQty = getBeginningQty(matnr, batch, brand, previousEndingQtyMap);
BigDecimal endingQty = calculateEndingQty(beginningQty, inQty, outQty);
- BigDecimal stockQtyDecimal = getCurrentStockQty(matnr, batch);
- BigDecimal diffQty = calculateDiffQty(stockQtyDecimal, endingQty);
+ // 宸紓鏁伴噺 = 鏈熸湯搴撳瓨 - 鏈熷垵搴撳瓨锛堟湡鏈ぇ浜庢湡鍒濇椂涓烘鏁帮級
+ BigDecimal diffQty = calculateDiffQty(beginningQty, endingQty);
- // 4. 鍒涘缓骞朵繚瀛樻槑缁嗚褰�
+ // 4. 鍒涘缓鏄庣粏璁板綍锛堟殏涓嶆彃鍏ワ級
MonthlySettleDetail detail = buildMonthlySettleDetail(
monthlySettle.getId(), settleNo, matnr, batch, maktx, brand,
- beginningQty, inQty, outQty, endingQty, stockQtyDecimal, diffQty
+ beginningQty, inQty, outQty, endingQty, diffQty
);
detail.setIsDeleted(0); // 鏈垹闄�
- monthlySettleDetailMapper.insert(detail);
+ detailList.add(detail);
// 5. 绱缁熻
totalInQty = totalInQty.add(inQty);
@@ -315,21 +335,33 @@
BigDecimal beginningQty = previousEndingQty;
// 鏈熸湯搴撳瓨 = 鏈熷垵 + 鍏ュ簱 - 鍑哄簱 = 鏈熷垵锛堝洜涓烘湰鏈熸病鏈夊嚭鍏ュ簱锛�
BigDecimal endingQty = beginningQty;
- // 鑾峰彇褰撳墠瀹為檯搴撳瓨
- BigDecimal stockQtyDecimal = getCurrentStockQty(matnr, batch);
- // 璁$畻宸紓
- BigDecimal diffQty = calculateDiffQty(stockQtyDecimal, endingQty);
+ // 宸紓鏁伴噺 = 鏈熷垵搴撳瓨 - 鏈熸湯搴撳瓨锛堟湡鍒濆ぇ浜庢湡鏈椂涓烘鏁帮級
+ BigDecimal diffQty = calculateDiffQty(beginningQty, endingQty);
- // 鍒涘缓骞朵繚瀛樻槑缁嗚褰�
+ // 鍒涘缓鏄庣粏璁板綍锛堟殏涓嶆彃鍏ワ級
MonthlySettleDetail detail = buildMonthlySettleDetail(
monthlySettle.getId(), settleNo, matnr, batch, maktx, brand,
- beginningQty, inQty, outQty, endingQty, stockQtyDecimal, diffQty
+ beginningQty, inQty, outQty, endingQty, diffQty
);
detail.setIsDeleted(0); // 鏈垹闄�
- monthlySettleDetailMapper.insert(detail);
+ detailList.add(detail);
// 绱缁熻锛堣櫧鐒跺叆搴撳拰鍑哄簱涓�0锛屼絾涔熻璁″叆鐗╂枡绉嶇被鏁帮級
materialCount++;
+ }
+ }
+ }
+
+ // 鍒嗘壒鎻掑叆锛屾瘡鎵�1000鏉★紝閬垮厤涓�娆℃�ф彃鍏ヨ繃澶氭暟鎹�
+ if (!detailList.isEmpty()) {
+ int batchSize = 1000;
+ for (int i = 0; i < detailList.size(); i += batchSize) {
+ int end = Math.min(i + batchSize, detailList.size());
+ List<MonthlySettleDetail> batch = detailList.subList(i, end);
+ for (MonthlySettleDetail detail : batch) {
+ if (monthlySettleDetailMapper.insert(detail) <= 0) {
+ throw new CoolException("鎻掑叆鏈堢粨鏄庣粏澶辫触");
+ }
}
}
}
@@ -363,12 +395,35 @@
throw new CoolException("鏈堢粨璁板綍涓嶅瓨鍦�");
}
- // 鍏宠仈鐗╂枡琛ㄦ煡璇㈡槑缁�
+ // 鍏宠仈鐗╂枡琛ㄦ煡璇㈡槑缁嗭紙姹囨�伙級
List<MonthlySettleDetail> details = monthlySettleDetailMapper.selectDetailWithMat(settleId);
+
+ // 鏌ヨ鏄庣粏娴佹按锛堣鍗曟槑缁嗭級
+ List<com.zy.asrs.entity.result.MonthlySettleDetailFlowVO> pakinFlows = this.baseMapper.selectDetailFlowFromPakin(settleId);
+ List<com.zy.asrs.entity.result.MonthlySettleDetailFlowVO> pakoutFlows = this.baseMapper.selectDetailFlowFromPakout(settleId);
+
+ // 鍚堝苟鍏ュ簱鍜屽嚭搴撶殑鏄庣粏娴佹按
+ List<com.zy.asrs.entity.result.MonthlySettleDetailFlowVO> detailFlows = new java.util.ArrayList<>();
+ if (pakinFlows != null && !pakinFlows.isEmpty()) {
+ detailFlows.addAll(pakinFlows);
+ }
+ if (pakoutFlows != null && !pakoutFlows.isEmpty()) {
+ detailFlows.addAll(pakoutFlows);
+ }
+
+ // 鎸変笟鍔℃椂闂村拰璁㈠崟缂栧彿鎺掑簭
+ detailFlows.sort((a, b) -> {
+ int timeCompare = (a.getOrderTime() != null ? a.getOrderTime() : "").compareTo(b.getOrderTime() != null ? b.getOrderTime() : "");
+ if (timeCompare != 0) {
+ return timeCompare;
+ }
+ return (a.getOrderNo() != null ? a.getOrderNo() : "").compareTo(b.getOrderNo() != null ? b.getOrderNo() : "");
+ });
MonthlySettleStatisticsVO result = new MonthlySettleStatisticsVO();
result.setSettle(settle);
result.setDetails(details);
+ result.setDetailFlows(detailFlows);
return result;
}
@@ -392,25 +447,9 @@
}
wrapper.orderBy("create_time", false);
- List<MonthlySettle> list = this.selectList(wrapper);
-
- EntityWrapper<MonthlySettle> countWrapper = new EntityWrapper<>();
- countWrapper.eq("is_deleted", 0);
- if (condition != null) {
- if (condition.get("settleNo") != null) {
- countWrapper.like("settle_no", condition.get("settleNo").toString());
- }
- if (condition.get("status") != null) {
- countWrapper.eq("status", condition.get("status"));
- }
- if (condition.get("startDate") != null && condition.get("endDate") != null) {
- countWrapper.ge("start_date", condition.get("startDate"));
- countWrapper.le("end_date", condition.get("endDate"));
- }
- }
- page.setRecords(list);
- page.setTotal(this.selectCount(countWrapper));
- return page;
+ // 浣跨敤鍒嗛〉鏌ヨ锛屽湪鏁版嵁搴撳眰闈㈣繘琛屽垎椤碉紝鑰屼笉鏄煡璇㈡墍鏈夎褰�
+ Page<MonthlySettle> resultPage = this.selectPage(page, wrapper);
+ return resultPage;
}
/**
@@ -429,18 +468,21 @@
}
/**
- * 鑾峰彇褰撳墠瀹為檯搴撳瓨鏁伴噺
+ * 鑾峰彇褰撳墠瀹為檯搴撳瓨鏁伴噺锛堝凡搴熷純锛屾敼鐢ㄦ壒閲忔煡璇級
+ * @deprecated 浣跨敤鎵归噺鏌ヨ鏂规硶鏇夸唬锛岄伩鍏峃+1鏌ヨ闂
*/
+ @Deprecated
private BigDecimal getCurrentStockQty(String matnr, String batch) {
Double stockQty = manLocDetlService.queryStockAnfme(matnr, batch);
return stockQty != null ? BigDecimal.valueOf(stockQty) : BigDecimal.ZERO;
}
/**
- * 璁$畻宸紓鏁伴噺锛堝疄闄呭簱瀛�-鏈熸湯搴撳瓨锛�
+ * 璁$畻宸紓鏁伴噺锛堟湡鏈簱瀛�-鏈熷垵搴撳瓨锛�
+ * 鏈熸湯澶т簬鏈熷垵鏃朵负姝f暟锛岃〃绀哄簱瀛樺鍔�
*/
- private BigDecimal calculateDiffQty(BigDecimal stockQty, BigDecimal endingQty) {
- return stockQty.subtract(endingQty);
+ private BigDecimal calculateDiffQty(BigDecimal beginningQty, BigDecimal endingQty) {
+ return endingQty.subtract(beginningQty);
}
/**
@@ -449,7 +491,7 @@
private MonthlySettleDetail buildMonthlySettleDetail(
Long settleId, String settleNo, String matnr, String batch, String maktx, String brand,
BigDecimal beginningQty, BigDecimal inQty, BigDecimal outQty, BigDecimal endingQty,
- BigDecimal stockQty, BigDecimal diffQty) {
+ BigDecimal diffQty) {
MonthlySettleDetail detail = new MonthlySettleDetail();
// 鍩烘湰淇℃伅
detail.setSettleId(settleId);
@@ -463,7 +505,6 @@
detail.setInQty(inQty);
detail.setOutQty(outQty);
detail.setEndingQty(endingQty);
- detail.setStockQty(stockQty);
detail.setDiffQty(diffQty);
// 鏃堕棿淇℃伅
detail.setCreateTime(new Date());
@@ -499,5 +540,59 @@
settle.setUpdateTime(new Date());
this.updateById(settle);
}
+
+ @Override
+ public boolean isOrderTimeInSettledRange(String orderTime) {
+ if (Cools.isEmpty(orderTime)) {
+ return false;
+ }
+ try {
+ // 瑙f瀽璁㈠崟涓氬姟鏃堕棿
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ Date orderDate = sdf.parse(orderTime);
+
+ // 鏌ヨ鎵�鏈夊凡鏈堢粨鐨勮褰曪紙status=1涓旀湭鍒犻櫎锛�
+ EntityWrapper<MonthlySettle> wrapper = new EntityWrapper<>();
+ wrapper.eq("status", 1);
+ wrapper.eq("is_deleted", 0);
+ List<MonthlySettle> settledList = this.selectList(wrapper);
+
+ if (settledList == null || settledList.isEmpty()) {
+ return false;
+ }
+
+ // 妫�鏌ヨ鍗曟椂闂存槸鍚﹀湪浠讳綍宸叉湀缁撶殑鍖洪棿鍐�
+ for (MonthlySettle settle : settledList) {
+ Date startDate = settle.getStartDate();
+ Date endDate = settle.getEndDate();
+
+ // 纭繚startDate鏄綋澶╃殑00:00:00
+ Calendar startCal = Calendar.getInstance();
+ startCal.setTime(startDate);
+ startCal.set(Calendar.HOUR_OF_DAY, 0);
+ startCal.set(Calendar.MINUTE, 0);
+ startCal.set(Calendar.SECOND, 0);
+ startCal.set(Calendar.MILLISECOND, 0);
+
+ // 纭繚endDate鏄綋澶╃殑23:59:59.999
+ Calendar endCal = Calendar.getInstance();
+ endCal.setTime(endDate);
+ endCal.set(Calendar.HOUR_OF_DAY, 23);
+ endCal.set(Calendar.MINUTE, 59);
+ endCal.set(Calendar.SECOND, 59);
+ endCal.set(Calendar.MILLISECOND, 999);
+
+ // 鍒ゆ柇璁㈠崟鏃堕棿鏄惁鍦ㄥ尯闂村唴锛歔startDate鐨�00:00:00, endDate鐨�23:59:59.999]
+ if (!orderDate.before(startCal.getTime()) && !orderDate.after(endCal.getTime())) {
+ return true;
+ }
+ }
+
+ return false;
+ } catch (Exception e) {
+ log.error("妫�鏌ヨ鍗曟椂闂存槸鍚﹀湪宸叉湀缁撳尯闂村唴澶辫触", e);
+ return false;
+ }
+ }
}
--
Gitblit v1.9.1