From e5d171107520aa5d40b00b8e3fb8cd26e32531e8 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期五, 13 三月 2026 12:39:13 +0800
Subject: [PATCH] feat: implement M region (Merker memory)
---
Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs | 283 ++++++++++++++++++++++++++------------------------------
1 files changed, 132 insertions(+), 151 deletions(-)
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs
index db183dd..1271ec3 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs
@@ -1,4 +1,5 @@
锘縰sing WIDESEA_Common.StockEnum;
+using WIDESEA_Core;
using WIDESEA_DTO.Stock;
using WIDESEA_IStockService;
using WIDESEA_Model.Models;
@@ -6,25 +7,42 @@
namespace WIDESEA_StockService
{
/// <summary>
- /// 搴撳瓨鏈嶅姟
+ /// 搴撳瓨鏈嶅姟鑱氬悎瀹炵幇绫�
/// </summary>
- public class StockSerivce : IStockService
+ public class StockService : IStockService
{
+ /// <summary>
+ /// 搴撳瓨鏄庣粏鏈嶅姟
+ /// </summary>
public IStockInfoDetailService StockInfoDetailService { get; }
+ /// <summary>
+ /// 搴撳瓨淇℃伅鏈嶅姟
+ /// </summary>
public IStockInfoService StockInfoService { get; }
+
+ /// <summary>
+ /// 搴撳瓨鏄庣粏鍘嗗彶鏈嶅姟
+ /// </summary>
public IStockInfoDetail_HtyService StockInfoDetail_HtyService { get; }
+ /// <summary>
+ /// 搴撳瓨鍘嗗彶鏈嶅姟
+ /// </summary>
public IStockInfo_HtyService StockInfo_HtyService { get; }
/// <summary>
/// 鏋勯�犲嚱鏁�
/// </summary>
/// <param name="stockInfoDetailService">搴撳瓨鏄庣粏鏈嶅姟</param>
- /// <param name="stockInfoService">搴撳瓨鏈嶅姟</param>
+ /// <param name="stockInfoService">搴撳瓨淇℃伅鏈嶅姟</param>
/// <param name="stockInfoDetail_HtyService">搴撳瓨鏄庣粏鍘嗗彶鏈嶅姟</param>
/// <param name="stockInfo_HtyService">搴撳瓨鍘嗗彶鏈嶅姟</param>
- public StockSerivce(IStockInfoDetailService stockInfoDetailService, IStockInfoService stockInfoService, IStockInfoDetail_HtyService stockInfoDetail_HtyService, IStockInfo_HtyService stockInfo_HtyService)
+ public StockService(
+ IStockInfoDetailService stockInfoDetailService,
+ IStockInfoService stockInfoService,
+ IStockInfoDetail_HtyService stockInfoDetail_HtyService,
+ IStockInfo_HtyService stockInfo_HtyService)
{
StockInfoDetailService = stockInfoDetailService;
StockInfoService = stockInfoService;
@@ -35,15 +53,14 @@
/// <summary>
/// 缁勭洏
/// </summary>
- /// <param name="stock">缁勭洏鏁版嵁</param>
- /// <returns>鏄惁鎴愬姛</returns>
- public async Task<bool> GroupPallet(StockDTO stock)
+ public async Task<WebResponseContent> GroupPalletAsync(StockDTO stock)
{
- // 缁勮鏄庣粏鏁版嵁
+ WebResponseContent content = new WebResponseContent();
var now = DateTime.Now;
- var details = stock.Details.Select(item => new Dt_StockInfoDetail()
+ var details = stock.Details.Select(item => new Dt_StockInfoDetail
{
MaterielCode = "鐢佃姱",
+ MaterielName = "鐢佃姱",
StockQuantity = item.Quantity,
Unit = "PCS",
Creater = "system",
@@ -52,20 +69,20 @@
EffectiveDate = now.AddYears(1).ToString(),
SerialNumber = item.CellBarcode,
InboundOrderRowNo = item.Channel,
- MaterielName = "鐢佃姱",
Status = StockStatusEmun.缁勭洏鏆傚瓨.GetHashCode(),
}).ToList();
- // 濡傛灉鎵樼洏宸插瓨鍦紝鐩存帴鏂板鏄庣粏
var existingStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.TargetPalletNo);
+ var result = false;
if (existingStock != null)
{
- details.ForEach(detail => detail.StockId = existingStock.Id);
- return await StockInfoDetailService.Repository.AddDataAsync(details) > 0;
+ details.ForEach(d => d.StockId = existingStock.Id);
+ result = await StockInfoDetailService.Repository.AddDataAsync(details) > 0;
+ if (result) return content.OK("缁勭洏鎴愬姛");
+ return content.Error("缁勭洏澶辫触");
}
- // 鎵樼洏涓嶅瓨鍦ㄥ垯鍒涘缓骞跺啓鍏ユ槑缁�
- var entity = new Dt_StockInfo()
+ var entity = new Dt_StockInfo
{
PalletCode = stock.TargetPalletNo,
WarehouseId = 1,
@@ -74,205 +91,169 @@
Details = details
};
- //Dt_Task dt_Task = new Dt_Task()
- //{
- // TaskNum = 0,
- // PalletCode = stock.PalletNo,
- // PalletType = 1,
- // Roadway = "1",
- // TaskType = TaskTypeEnum.Inbound.GetHashCode(),
- // TaskStatus = TaskStatusEnum.New.GetHashCode(),
- // SourceAddress = stock.LineNo,
- // TargetAddress = "缁勭洏鍖�",
- // CurrentAddress = stock.LineNo,
- // NextAddress = "缁勭洏鍖�",
- // WarehouseId = 1,
- // Grade = 1,
- // Creater = "system",
- //};
-
- return StockInfoService.Repository.AddData(entity, x => x.Details);
+ result = StockInfoService.Repository.AddData(entity, x => x.Details);
+ if (result) return content.OK("缁勭洏鎴愬姛");
+ return content.Error("缁勭洏澶辫触");
}
/// <summary>
/// 鎹㈢洏
/// </summary>
- /// <param name="stock">闇�瑕佹崲鐩樼殑鏄庣粏鏁版嵁</param>
- /// <returns>鏄惁鎴愬姛</returns>
- public async Task<bool> ChangePallet(StockDTO stock)
+ public async Task<WebResponseContent> ChangePalletAsync(StockDTO stock)
{
- // 鍙傛暟鏍¢獙
- if (stock == null || string.IsNullOrWhiteSpace(stock.TargetPalletNo) || string.IsNullOrWhiteSpace(stock.SourcePalletNo))
+ WebResponseContent content = new WebResponseContent();
+ if (stock == null ||
+ string.IsNullOrWhiteSpace(stock.TargetPalletNo) ||
+ string.IsNullOrWhiteSpace(stock.SourcePalletNo) ||
+ string.Equals(stock.SourcePalletNo, stock.TargetPalletNo, StringComparison.OrdinalIgnoreCase))
{
- return false;
+ return content.Error("婧愭墭鐩樺彿涓庣洰鏍囨墭鐩樺彿鐩稿悓");
}
- // 鏂版棫鎵樼洏涓�鑷翠笉澶勭悊
- if (string.Equals(stock.SourcePalletNo, stock.TargetPalletNo, StringComparison.OrdinalIgnoreCase))
- {
- return false;
- }
-
- // 鏌ヨ婧愭墭鐩�
var sourceStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.SourcePalletNo);
- if (sourceStock == null)
- {
- return false;
- }
+ if (sourceStock == null) return content.Error("婧愭墭鐩樹笉瀛樺湪");
- // 鏌ヨ鎴栧垱寤虹洰鏍囨墭鐩�
var targetStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.TargetPalletNo);
if (targetStock == null)
{
- var newStock = new Dt_StockInfo()
+ var newStock = new Dt_StockInfo
{
PalletCode = stock.TargetPalletNo,
WarehouseId = sourceStock.WarehouseId,
- StockStatus = sourceStock.StockStatus,
- Creater = "system"
+ StockStatus = StockStatusEmun.缁勭洏鏆傚瓨.GetHashCode(),
+ Creater = "system",
};
var newId = StockInfoService.Repository.AddData(newStock);
- if (newId <= 0)
- {
- return false;
- }
+ if (newId <= 0) return content.Error("鎹㈢洏澶辫触");
targetStock = newStock;
targetStock.Id = newId;
}
- // 鑾峰彇闇�瑕佽浆绉荤殑鏉$爜
var serialNumbers = stock.Details.Select(d => d.CellBarcode).Distinct().ToList();
- if (!serialNumbers.Any())
- {
- return false;
- }
+ if (!serialNumbers.Any()) return content.Error("鏈壘鍒版湁鏁堢殑搴忓垪鍙�");
- // 鏌ヨ婧愭墭鐩樺搴旂殑鏄庣粏
- var detailEntities = StockInfoDetailService.Repository.QueryData(d => d.StockId == sourceStock.Id && serialNumbers.Contains(d.SerialNumber));
+ var detailEntities = StockInfoDetailService.Repository.QueryData(
+ d => d.StockId == sourceStock.Id && serialNumbers.Contains(d.SerialNumber));
+ if (!detailEntities.Any()) return content.Error("鏈壘鍒版湁鏁堢殑搴撳瓨鏄庣粏");
- if (!detailEntities.Any())
- {
- return false;
- }
+ if (await StockInfoDetail_HtyService.Repository.AddDataAsync(CreateDetailHistory(detailEntities, "鎹㈢洏")) <= 0)
+ return content.Error("鎹㈢洏鍘嗗彶璁板綍淇濆瓨澶辫触");
- // 鍐欏叆鍘嗗彶璁板綍
- var detailHistory = CreateDetailHistory(detailEntities, "鎹㈢洏");
- if (await StockInfoDetail_HtyService.Repository.AddDataAsync(detailHistory) <= 0)
- {
- return false;
- }
+ if (await StockInfo_HtyService.Repository.AddDataAsync(CreateStockHistory(new[] { sourceStock, targetStock }, "鎹㈢洏")) <= 0)
+ return content.Error("鎹㈢洏鍘嗗彶璁板綍淇濆瓨澶辫触");
- var stockHistory = CreateStockHistory(new List<Dt_StockInfo> { sourceStock, targetStock }, "鎹㈢洏");
- if (await StockInfo_HtyService.Repository.AddDataAsync(stockHistory) <= 0)
- {
- return false;
- }
-
- // 鏇存柊鏄庣粏鐨勬墭鐩樹富閿�
- detailEntities.ForEach(detail => detail.StockId = targetStock.Id);
- return await StockInfoDetailService.Repository.UpdateDataAsync(detailEntities);
+ detailEntities.ForEach(d => d.StockId = targetStock.Id);
+ var result = await StockInfoDetailService.Repository.UpdateDataAsync(detailEntities);
+ if (!result) return content.Error("鎹㈢洏澶辫触");
+ return content.OK("鎹㈢洏鎴愬姛");
}
/// <summary>
/// 鎷嗙洏
/// </summary>
- /// <param name="stock">闇�瑕佹媶鐩樼殑鏄庣粏鏁版嵁</param>
- /// <returns>鏄惁鎴愬姛</returns>
- public async Task<bool> SplitPallet(StockDTO stock)
+ public async Task<WebResponseContent> SplitPalletAsync(StockDTO stock)
{
- // 鍙傛暟鏍¢獙
+ WebResponseContent content = new WebResponseContent();
if (stock == null || string.IsNullOrWhiteSpace(stock.SourcePalletNo))
- {
- return false;
- }
+ return content.Error("婧愭墭鐩樺彿涓嶈兘涓虹┖");
- // 鏌ヨ婧愭墭鐩�
var sourceStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.SourcePalletNo);
- if (sourceStock == null)
- {
- return false;
- }
+ if (sourceStock == null) return content.Error("婧愭墭鐩樹笉瀛樺湪");
- // 鑾峰彇闇�瑕佹媶闄ょ殑鏉$爜
var serialNumbers = stock.Details.Select(d => d.CellBarcode).Distinct().ToList();
if (!serialNumbers.Any())
{
- return false;
+ serialNumbers = sourceStock.Details
+ .Where(x => stock.Details.Any(d => d.Channel == x.InboundOrderRowNo))
+ .Select(x => x.SerialNumber)
+ .ToList();
}
- // 鏌ヨ婧愭墭鐩樺搴旂殑鏄庣粏
- var detailEntities = StockInfoDetailService.Repository.QueryData(d => d.StockId == sourceStock.Id && serialNumbers.Contains(d.SerialNumber));
- if (!detailEntities.Any())
- {
- return false;
- }
+ var detailEntities = StockInfoDetailService.Repository.QueryData(
+ d => d.StockId == sourceStock.Id && serialNumbers.Contains(d.SerialNumber));
+ if (!detailEntities.Any()) return content.Error("鏈壘鍒版湁鏁堢殑搴撳瓨鏄庣粏");
- // 鍐欏叆鍘嗗彶璁板綍
- var detailHistory = CreateDetailHistory(detailEntities, "鎷嗙洏");
- if (await StockInfoDetail_HtyService.Repository.AddDataAsync(detailHistory) <= 0)
- {
- return false;
- }
+ if (await StockInfoDetail_HtyService.Repository.AddDataAsync(CreateDetailHistory(detailEntities, "鎷嗙洏")) <= 0)
+ return content.Error("鎷嗙洏鍘嗗彶璁板綍淇濆瓨澶辫触");
- var stockHistory = CreateStockHistory(new List<Dt_StockInfo> { sourceStock }, "鎷嗙洏");
- if (await StockInfo_HtyService.Repository.AddDataAsync(stockHistory) <= 0)
- {
- return false;
- }
+ if (await StockInfo_HtyService.Repository.AddDataAsync(CreateStockHistory(new[] { sourceStock }, "鎷嗙洏")) <= 0)
+ return content.Error("鎷嗙洏鍘嗗彶璁板綍淇濆瓨澶辫触");
- // 鍒犻櫎鏄庣粏
- return await StockInfoDetailService.Repository.DeleteDataAsync(detailEntities);
+ var result = await StockInfoDetailService.Repository.DeleteDataAsync(detailEntities);
+ if (!result) return content.Error("鎷嗙洏澶辫触");
+ return content.OK("鎷嗙洏鎴愬姛");
}
- private List<Dt_StockInfoDetail_Hty> CreateDetailHistory(IEnumerable<Dt_StockInfoDetail> details, string operateType)
+ /// <summary>
+ /// 鍫嗗灈鏈烘崲鐩樺悗鏇存柊搴撳瓨淇℃伅锛堟竻绌哄簱浣嶄俊鎭級
+ /// </summary>
+ /// <param name="stock"></param>
+ /// <returns></returns>
+ public async Task<WebResponseContent> UpdateStockInfoAsync(StockInfoDTO stock)
+ {
+ WebResponseContent content = new WebResponseContent();
+ if (string.IsNullOrWhiteSpace(stock.PalletCode)) return content.Error("鎵樼洏鍙蜂笉鑳戒负绌�");
+
+ var existingStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.PalletCode);
+ if (existingStock == null) return content.Error("鎵樼洏淇℃伅涓嶅瓨鍦�");
+
+ existingStock.LocationCode = "";
+ existingStock.LocationId = 0;
+
+ var result = await StockInfoService.Repository.UpdateDataAsync(existingStock);
+ if (!result) return content.Error("鏇存柊搴撳瓨淇℃伅澶辫触");
+ return content.OK("鏇存柊搴撳瓨淇℃伅鎴愬姛");
+ }
+
+ private static List<Dt_StockInfoDetail_Hty> CreateDetailHistory(IEnumerable<Dt_StockInfoDetail> details, string operateType)
{
var now = DateTime.Now;
- return details.Select(detail => new Dt_StockInfoDetail_Hty
+ return details.Select(d => new Dt_StockInfoDetail_Hty
{
- SourceId = detail.Id,
+ SourceId = d.Id,
OperateType = operateType,
InsertTime = now,
- StockId = detail.StockId,
- MaterielCode = detail.MaterielCode,
- MaterielName = detail.MaterielName,
- OrderNo = detail.OrderNo,
- BatchNo = detail.BatchNo,
- ProductionDate = detail.ProductionDate,
- EffectiveDate = detail.EffectiveDate,
- SerialNumber = detail.SerialNumber,
- StockQuantity = detail.StockQuantity,
- OutboundQuantity = detail.OutboundQuantity,
- Status = detail.Status,
- Unit = detail.Unit,
- InboundOrderRowNo = detail.InboundOrderRowNo,
- Remark = detail.Remark,
- Creater = detail.Creater,
- CreateDate = detail.CreateDate,
- Modifier = detail.Modifier,
- ModifyDate = detail.ModifyDate
+ StockId = d.StockId,
+ MaterielCode = d.MaterielCode,
+ MaterielName = d.MaterielName,
+ OrderNo = d.OrderNo,
+ BatchNo = d.BatchNo,
+ ProductionDate = d.ProductionDate,
+ EffectiveDate = d.EffectiveDate,
+ SerialNumber = d.SerialNumber,
+ StockQuantity = d.StockQuantity,
+ OutboundQuantity = d.OutboundQuantity,
+ Status = d.Status,
+ Unit = d.Unit,
+ InboundOrderRowNo = d.InboundOrderRowNo,
+ Remark = d.Remark,
+ Creater = d.Creater,
+ CreateDate = d.CreateDate,
+ Modifier = d.Modifier,
+ ModifyDate = d.ModifyDate
}).ToList();
}
- private List<Dt_StockInfo_Hty> CreateStockHistory(IEnumerable<Dt_StockInfo> stocks, string operateType)
+ private static List<Dt_StockInfo_Hty> CreateStockHistory(IEnumerable<Dt_StockInfo> stocks, string operateType)
{
var now = DateTime.Now;
- return stocks.Select(stock => new Dt_StockInfo_Hty
+ return stocks.Select(s => new Dt_StockInfo_Hty
{
- SourceId = stock.Id,
+ SourceId = s.Id,
OperateType = operateType,
InsertTime = now,
- PalletCode = stock.PalletCode,
- PalletType = stock.PalletType,
- LocationCode = stock.LocationCode,
- WarehouseId = stock.WarehouseId,
- StockStatus = stock.StockStatus,
- Remark = stock.Remark,
- Creater = stock.Creater,
- CreateDate = stock.CreateDate,
- Modifier = stock.Modifier,
- ModifyDate = stock.ModifyDate
+ PalletCode = s.PalletCode,
+ PalletType = s.PalletType,
+ LocationCode = s.LocationCode,
+ WarehouseId = s.WarehouseId,
+ StockStatus = s.StockStatus,
+ Remark = s.Remark,
+ Creater = s.Creater,
+ CreateDate = s.CreateDate,
+ Modifier = s.Modifier,
+ ModifyDate = s.ModifyDate
}).ToList();
}
}
--
Gitblit v1.9.3