From a296223898d61a9838bbd35ed75c87575e308a36 Mon Sep 17 00:00:00 2001
From: huangxiaoqiang <huangxiaoqiang@hnkhzn.com>
Date: 星期五, 07 十一月 2025 17:19:38 +0800
Subject: [PATCH] 1
---
项目代码/WMS/WIDESEA_WMSServer/WIDESEA_StorageBasicServices/Stock/StockInfoService.cs | 318 ++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 290 insertions(+), 28 deletions(-)
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StorageBasicServices/Stock/StockInfoService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StorageBasicServices/Stock/StockInfoService.cs"
index bcd9bd1..2a555ff 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StorageBasicServices/Stock/StockInfoService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StorageBasicServices/Stock/StockInfoService.cs"
@@ -1,6 +1,8 @@
锘縰sing AngleSharp.Dom;
+using Dm;
using Mapster;
using Masuit.Tools;
+using NewLife.Reflection;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using SqlSugar;
using System.Collections;
@@ -11,16 +13,49 @@
using WIDESEA_Cache;
using WIDESEA_Common;
using WIDESEA_Core;
+using WIDESEA_Core.Enums;
+using WIDESEA_DTO;
+using WIDESEA_DTO.Basic;
+using WIDESEA_DTO.Order;
+using WIDESEA_DTO.Stock;
+using WIDESEA_DTO.WMS;
+using WIDESEA_IOrderRepository;
using WIDESEA_Model.Models;
+using WIDESEA_Model.Models.Order;
+using WIDESEA_OrderRepository;
+using WIDESEA_StorageTaskRepository;
namespace WIDESEA_StorageBasicService;
public class StockInfoService : ServiceBase<DtStockInfo, IStockInfoRepository>, IStockInfoService
{
private readonly ILocationStatusChangeRecordRepository _locationStatusChangeRecordRepository;
- public StockInfoService(IStockInfoRepository BaseDal, ILocationStatusChangeRecordRepository locationStatusChangeRecordRepository) : base(BaseDal)
+ private readonly IDt_InboundOrderRepository _inboundOrderRepository;
+ private readonly IUnitOfWorkManage _unitOfWorkManage;
+ private readonly IStockInfoDetailRepository _stockInfoDetailRepository;
+ private readonly IDt_TaskService _taskService;
+ private readonly ILocationInfoRepository _locationRepository;
+ private readonly IDt_TaskRepository _taskRepository;
+ private readonly IDt_OrderOutDetailsRepository _outDetailsRepository;
+
+ public StockInfoService(IStockInfoRepository BaseDal,
+ ILocationStatusChangeRecordRepository locationStatusChangeRecordRepository,
+ IDt_InboundOrderRepository inboundOrderRepository,
+ IUnitOfWorkManage unitOfWorkManage,
+ IStockInfoDetailRepository stockInfoDetailRepository,
+ IDt_TaskService taskService,
+ ILocationInfoRepository locationRepository,
+ IDt_TaskRepository taskRepository,
+ IDt_OrderOutDetailsRepository outDetailsRepository) : base(BaseDal)
{
_locationStatusChangeRecordRepository = locationStatusChangeRecordRepository;
+ _inboundOrderRepository = inboundOrderRepository;
+ _unitOfWorkManage = unitOfWorkManage;
+ _stockInfoDetailRepository = stockInfoDetailRepository;
+ _taskService = taskService;
+ _locationRepository = locationRepository;
+ _taskRepository = taskRepository;
+ _outDetailsRepository = outDetailsRepository;
}
/// <summary>
@@ -60,6 +95,7 @@
Expression<Func<DtStockInfo, bool>> locationStatus = null;
Expression<Func<DtStockInfo, bool>> floor = null;
Expression<Func<DtStockInfo, bool>> areaId = null;
+ Expression<Func<DtStockInfo, bool>> materielCode = null;
foreach (var item in searchParametersList)
{
if (item.Name.Contains("locationStatus"))
@@ -72,7 +108,11 @@
}
else if (item.Name.Contains("areaId"))
{
- areaId = x => x.LocationInfo.AreaId== Convert.ToInt32(item.Value);
+ areaId = x => x.LocationInfo.AreaId == Convert.ToInt32(item.Value);
+ }
+ else if (item.Name.Contains("materielCode"))
+ {
+ materielCode = x => x.StockInfoDetails.Any(d => d.MaterielCode == item.Value);
}
}
//.IncludesAllFirstLayer()
@@ -83,47 +123,269 @@
.WhereIF(locationStatus != null, locationStatus)
.WhereIF(floor != null, floor)
.WhereIF(areaId != null, areaId)
+ .WhereIF(materielCode != null, materielCode)
.OrderBy(orderByModels)
.ToPageList(options.Page, options.Rows, ref totalCount);
new PageGridData<DtStockInfo>(totalCount, data);
return new PageGridData<DtStockInfo>(totalCount, data);
}
- /// <summary>
- /// 鎵归噺鍒犻櫎
- /// </summary>
- /// <param name="keys"></param>
- /// <returns></returns>
- public override WebResponseContent DeleteData(object[] keys)
+ public List<DtLocationInfo> GetStockLocations(List<DtLocationInfo>? locations)
{
+ List<DtLocationInfo> locationsNew = new List<DtLocationInfo>();
+ foreach (var item in locations)
+ {
+ if (item.AreaId == 1)
+ {
+ if (item.Depth == 2)
+ {
+ var locationLateral = _locationRepository.QueryFirst(x => x.Row == 1 && x.Column == item.Column && x.Layer == item.Layer);
+
+ if (locationLateral.LocationStatus == (int)LocationEnum.Lock && locationLateral.EnalbeStatus == 1)
+ {
+ locationsNew.Remove(item);
+ continue;
+ }
+ }
+ locationsNew.Add(item);
+ }
+ else if (item.AreaId == 2)
+ {
+ var locationLateral = _locationRepository.QueryData(x => x.Row == item.Row && x.Column > item.Column && x.Remark == item.Remark);
+
+ foreach (var Lateral in locationLateral)
+ {
+ if (Lateral.LocationStatus == (int)LocationEnum.Lock && Lateral.EnalbeStatus == 1)
+ {
+ locationsNew.Remove(item);
+ continue;
+ }
+ locationsNew.Add(item);
+ }
+ }
+
+ else if (item.AreaId == 5 || item.AreaId == 6)
+ {
+ var locationLateral = _locationRepository.QueryData(x => x.Row == item.Row && x.Column < item.Column && x.Remark == item.Remark);
+
+ foreach (var lateral in locationLateral)
+ {
+ if (lateral.LocationStatus == (int)LocationEnum.Lock && lateral.EnalbeStatus == 1)
+ {
+ locationsNew.Remove(item);
+ continue;
+ }
+ locationsNew.Add(item);
+ }
+ }
+ }
+ return locationsNew;
+ }
+
+ #region 搴撳瓨瑙嗗浘
+ public List<StockSelectViewDTO> GetStockSelectViews(GetStockSelectViewDto viewDto)
+ {
+ var stocks = BaseDal.Db.Queryable<DtStockInfo>()
+ .Includes(x => x.StockInfoDetails)
+ .Includes(x => x.LocationInfo)
+ .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable)
+ .Where(x => x.StockInfoDetails.Any(d => d.MaterielCode == viewDto.materielCode && d.Quantity > 0 && d.Quantity > d.OutboundQuantity)).ToList().OrderBy(x => x.CreateDate);
+
+ List<DtLocationInfo> locationInfos = new List<DtLocationInfo>();
+ List<DtStockInfo> stockNew = new List<DtStockInfo>();
+ if (stocks != null || stocks.Count() > 0)
+ {
+ var locations = stocks.Select(s => s.LocationInfo).ToList();
+ locationInfos = GetStockLocations(locations).Distinct().ToList();
+ stockNew = stocks.Where(s => s.LocationInfo != null && locationInfos.Contains(s.LocationInfo)).ToList();
+ }
+
+ var result = stockNew.Select(s => new StockSelectViewDTO
+ {
+ MaterielCode = s.StockInfoDetails
+ .FirstOrDefault(d => d.MaterielCode == viewDto.materielCode)?.MaterielCode ?? string.Empty,
+
+ MaterielName = s.StockInfoDetails
+ .FirstOrDefault(d => d.MaterielCode == viewDto.materielCode)?.MaterielName ?? string.Empty,
+
+ UseableQuantity = s.StockInfoDetails
+ .Where(d => d.MaterielCode == viewDto.materielCode && d.Quantity > 0 && d.Quantity > d.OutboundQuantity)
+ .Sum(d => (decimal?)d.Quantity - d.OutboundQuantity) ?? 0, // 澶勭悊绌哄�兼儏鍐�
+
+ PalletCode = s.PalletCode ?? string.Empty,
+ LocationCode = s.LocationInfo?.LocationCode ?? string.Empty
+ }).ToList();
+
+ return result;
+ }
+
+ public WebResponseContent GetStockView(GetStockSelectViewDto viewDto)
+ {
+ WebResponseContent content = new WebResponseContent();
try
{
- List<DtStockInfo_Hty> stockInfos = new List<DtStockInfo_Hty>();
- List<DtLocationInfo> locationInfos = new List<DtLocationInfo>();
-
- foreach (var item in keys)
+ Expression<Func<DtStockInfoDetail, bool>> expressionOrder = x => true;
+ if (!string.IsNullOrEmpty(viewDto.materielCode))
{
- var stock = BaseDal.QueryFirstNavAsync(x => x.Id == item.ObjToInt()).Result;
- var stockHty = stock.Adapt<DtStockInfo_Hty>();
- stockInfos.Add(stockHty);
-
- var location = SqlSugarHelper.DbWMS.Queryable<DtLocationInfo>().FirstAsync(x => x.LocationCode == stock.LocationCode).Result;
- var lastStatus = location.LocationStatus;
- location.LocationStatus = (int)LocationEnum.Free;
- locationInfos.Add(location);
- _locationStatusChangeRecordRepository.AddLocationStatusChangeRecord(location, lastStatus, (int)StatusChangeTypeEnum.ManualOperation, 0);
+ expressionOrder = x => x.MaterielCode.Contains(viewDto.materielCode);
}
- //var hty = BaseDal.Db.InsertNav(stockInfos)
- // .Include(x => x.StockInfoDetails)
- // .ExecuteCommand();
- var isStockAdd = SqlSugarHelper.DbWMS.InsertNav(stockInfos).IncludesAllFirstLayer().ExecuteCommandAsync();
+ int count = 0;
+ count = BaseDal.Db.Queryable<DtStockInfo>()
+ .Includes(x => x.StockInfoDetails)
+ .Includes(x => x.LocationInfo)
+ .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable)
+ .WhereIF(!viewDto.materielCode.IsNullOrEmpty(), x => x.StockInfoDetails.Any(d => d.MaterielCode == viewDto.materielCode && d.Quantity > 0)).ToList().OrderBy(x => x.CreateDate).Count();
- var locationd = SqlSugarHelper.DbWMS.Updateable(locationInfos).ExecuteCommandHasChange();
- return base.DeleteData(keys);
+
+ int maxPage = Convert.ToInt32(Math.Ceiling(count / 10.0));
+ if (viewDto.pageNo <= maxPage)
+ {
+ var stocks = BaseDal.Db.Queryable<DtStockInfo>()
+ .Includes(x => x.StockInfoDetails)
+ .Includes(x => x.LocationInfo)
+ .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock
+ && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable)
+ .WhereIF(!viewDto.materielCode.IsNullOrEmpty(),
+ x => x.StockInfoDetails.Any(d => d.MaterielCode == viewDto.materielCode && d.Quantity > 0))
+ .Select(x => new DtStockInfo
+ {
+ Id = x.Id,
+ PalletCode = x.PalletCode,
+ LocationCode = x.LocationCode,
+ StockInfoDetails = x.StockInfoDetails
+ .OrderByDescending(d => d.CreateDate)
+ .Take(1)
+ .ToList(),
+ LocationInfo = x.LocationInfo
+ })
+ .OrderBy(x => x.CreateDate)
+ .ToList();
+
+ List<DtLocationInfo> locationInfos = new List<DtLocationInfo>();
+ List<DtStockInfo> stockNew = new List<DtStockInfo>();
+ if (stocks != null || stocks.Count() > 0)
+ {
+ var locations = stocks.Select(s => s.LocationInfo).ToList();
+ locationInfos = GetStockLocations(locations).Distinct().ToList();
+ stockNew = stocks.Where(s => s.LocationInfo != null && locationInfos.Contains(s.LocationInfo)).ToList();
+ }
+
+ var result = stockNew.Skip((maxPage - 1) * 10).Take(10).Select(s => new StockSelectViewDTO
+ {
+ Id = s.Id,
+
+ MaterielCode = s.StockInfoDetails
+ .FirstOrDefault()?.MaterielCode ?? string.Empty,
+
+ MaterielName = s.StockInfoDetails
+ .FirstOrDefault()?.MaterielName ?? string.Empty,
+
+ Quantity = s.StockInfoDetails
+ .FirstOrDefault()?.Quantity ?? 0, // 澶勭悊绌哄�兼儏鍐�
+
+ PalletCode = s.PalletCode ?? string.Empty,
+
+ LocationCode = s.LocationInfo?.LocationCode ?? string.Empty
+ }).ToList();
+
+ content = WebResponseContent.Instance.OK(data: result);
+ }
+ else
+ {
+ var stocks = BaseDal.Db.Queryable<DtStockInfo>()
+ .Includes(x => x.StockInfoDetails)
+ .Includes(x => x.LocationInfo)
+ .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock
+ && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable)
+ .WhereIF(!viewDto.materielCode.IsNullOrEmpty(),
+ x => x.StockInfoDetails.Any(d => d.MaterielCode == viewDto.materielCode && d.Quantity > 0))
+ .Select(x => new DtStockInfo
+ {
+ Id = x.Id,
+ PalletCode = x.PalletCode,
+ LocationCode = x.LocationCode,
+ StockInfoDetails = x.StockInfoDetails
+ .OrderByDescending(d => d.CreateDate)
+ .Take(1)
+ .ToList(),
+ LocationInfo = x.LocationInfo
+ })
+ .OrderBy(x => x.CreateDate)
+ .ToList();
+
+ List<DtLocationInfo> locationInfos = new List<DtLocationInfo>();
+ List<DtStockInfo> stockNew = new List<DtStockInfo>();
+ if (stocks != null || stocks.Count() > 0)
+ {
+ var locations = stocks.Select(s => s.LocationInfo).ToList();
+ locationInfos = GetStockLocations(locations).Distinct().ToList();
+ stockNew = stocks.Where(s => s.LocationInfo != null && locationInfos.Contains(s.LocationInfo)).ToList();
+ }
+
+ var result = stockNew.Skip(0 * 10).Take(10).Select(s => new StockSelectViewDTO
+ {
+ Id = s.Id,
+
+ MaterielCode = s.StockInfoDetails
+ .FirstOrDefault()?.MaterielCode ?? string.Empty,
+
+ MaterielName = s.StockInfoDetails
+ .FirstOrDefault()?.MaterielName ?? string.Empty,
+
+ Quantity = s.StockInfoDetails
+ .FirstOrDefault()?.Quantity ?? 0, // 澶勭悊绌哄�兼儏鍐�
+
+ PalletCode = s.PalletCode ?? string.Empty,
+
+ LocationCode = s.LocationInfo?.LocationCode ?? string.Empty
+ }).ToList();
+
+ content = WebResponseContent.Instance.OK(data: result);
+ }
}
catch (Exception ex)
{
- return WebResponseContent.Instance.Error(ex.Message);
+ content = WebResponseContent.Instance.Error($"鏌ヨ鍑哄簱鍗曟嵁閿欒,閿欒淇℃伅:{ex.Message}");
}
+ return content;
}
+
+ #endregion
+
+ #region 鍏朵粬鍑哄簱瑙嗗浘
+ public List<StockSelectViewDTO> GetOtherOutBoundView(int id)
+ {
+ DtStockInfo stock = BaseDal.Db.Queryable<DtStockInfo>()
+ .Includes(x => x.StockInfoDetails)
+ .Includes(x => x.LocationInfo)
+ .Where(x => x.Id == id)
+ .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable).First();
+
+ List<DtLocationInfo> locationInfos = new List<DtLocationInfo>();
+ List<DtStockInfo> stockNew = new List<DtStockInfo>();
+ if (stock != null)
+ {
+ if (_taskService.LocationIsOutBound(stock.LocationInfo))
+ {
+ return null;
+ }
+ }
+
+ var result = stock.StockInfoDetails.Select(s => new StockSelectViewDTO
+ {
+ MaterielCode = s.MaterielCode ?? string.Empty,
+
+ MaterielName = s.MaterielName ?? string.Empty,
+
+ Quantity = s.Quantity, // 澶勭悊绌哄�兼儏鍐�
+
+ PalletCode = stock.PalletCode ?? string.Empty,
+
+ LocationCode = stock.LocationCode ?? string.Empty
+ }).ToList();
+
+ return result;
+ }
+
+ #endregion
}
\ No newline at end of file
--
Gitblit v1.9.3