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 | 343 +++++++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 294 insertions(+), 49 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 05f4ba4..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,9 @@
锘縰sing AngleSharp.Dom;
+using Dm;
using Mapster;
using Masuit.Tools;
+using NewLife.Reflection;
+using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using SqlSugar;
using System.Collections;
using System.Collections.Generic;
@@ -10,18 +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 ISimpleCacheService _simpleCacheService;
private readonly ILocationStatusChangeRecordRepository _locationStatusChangeRecordRepository;
- public StockInfoService(IStockInfoRepository BaseDal, ISimpleCacheService simpleCacheService, 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)
{
- _simpleCacheService = simpleCacheService;
_locationStatusChangeRecordRepository = locationStatusChangeRecordRepository;
+ _inboundOrderRepository = inboundOrderRepository;
+ _unitOfWorkManage = unitOfWorkManage;
+ _stockInfoDetailRepository = stockInfoDetailRepository;
+ _taskService = taskService;
+ _locationRepository = locationRepository;
+ _taskRepository = taskRepository;
+ _outDetailsRepository = outDetailsRepository;
}
/// <summary>
@@ -33,7 +67,7 @@
{
string wheres = ValidatePageOptions(options);
//鑾峰彇鎺掑簭瀛楁
- Dictionary<string, SqlSugar.OrderByType> orderbyDic = GetPageDataSort(options, TProperties);
+ Dictionary<string, OrderByType> orderbyDic = GetPageDataSort(options, TProperties);
List<OrderByModel> orderByModels = new List<OrderByModel>();
foreach (var item in orderbyDic)
{
@@ -59,7 +93,8 @@
}
Expression<Func<DtStockInfo, bool>> locationStatus = null;
- Expression<Func<DtStockInfo, bool>> roadwayNo = null;
+ Expression<Func<DtStockInfo, bool>> floor = null;
+ Expression<Func<DtStockInfo, bool>> areaId = null;
Expression<Func<DtStockInfo, bool>> materielCode = null;
foreach (var item in searchParametersList)
{
@@ -67,13 +102,17 @@
{
locationStatus = x => x.LocationInfo.LocationStatus == Convert.ToInt32(item.Value);
}
- else if (item.Name.Contains("roadwayNo"))
+ else if (item.Name.Contains("floor"))
{
- roadwayNo = x => x.LocationInfo.RoadwayNo.Contains(item.Value);
+ floor = x => x.LocationInfo.Floor.Contains(item.Value);
+ }
+ else if (item.Name.Contains("areaId"))
+ {
+ areaId = x => x.LocationInfo.AreaId == Convert.ToInt32(item.Value);
}
else if (item.Name.Contains("materielCode"))
{
- materielCode = x => x.StockInfoDetails.Any(d => d.MaterielCode.Contains(item.Value));
+ materielCode = x => x.StockInfoDetails.Any(d => d.MaterielCode == item.Value);
}
}
//.IncludesAllFirstLayer()
@@ -82,7 +121,8 @@
.Includes(x => x.LocationInfo)
.WhereIF(!wheres.IsNullOrEmpty(), wheres)
.WhereIF(locationStatus != null, locationStatus)
- .WhereIF(roadwayNo != null, roadwayNo)
+ .WhereIF(floor != null, floor)
+ .WhereIF(areaId != null, areaId)
.WhereIF(materielCode != null, materielCode)
.OrderBy(orderByModels)
.ToPageList(options.Page, options.Rows, ref totalCount);
@@ -90,57 +130,262 @@
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)
{
- try
+ List<DtLocationInfo> locationsNew = new List<DtLocationInfo>();
+ foreach (var item in locations)
{
- List<DtStockInfo_Hty> stockInfos = new List<DtStockInfo_Hty>();
- List<DtLocationInfo> locationInfos = new List<DtLocationInfo>();
-
- foreach (var item in keys)
+ if (item.AreaId == 1)
{
- var stock = BaseDal.QueryFirstNavAsync(x => x.Id == item.ObjToInt()).Result;
- var stockHty = stock.Adapt<DtStockInfo_Hty>();
- stockInfos.Add(stockHty);
+ if (item.Depth == 2)
+ {
+ var locationLateral = _locationRepository.QueryFirst(x => x.Row == 1 && x.Column == item.Column && x.Layer == item.Layer);
- var location = SqlSugarHelper.DbWMS.Queryable<DtLocationInfo>().FirstAsync(x => x.Id == stock.LocationId).Result;
- var lastStatus = location.LocationStatus;
- location.LocationStatus = (int)LocationEnum.Free;
- locationInfos.Add(location);
- _locationStatusChangeRecordRepository.AddLocationStatusChangeRecord(location, lastStatus, (int)StatusChangeTypeEnum.ManualOperation, 0);
+ if (locationLateral.LocationStatus == (int)LocationEnum.Lock && locationLateral.EnalbeStatus == 1)
+ {
+ locationsNew.Remove(item);
+ continue;
+ }
+ }
+ locationsNew.Add(item);
}
- var hty = BaseDal.Db.InsertNav(stockInfos)
- .Include(x => x.StockInfoDetails)
- .ExecuteCommand();
+ else if (item.AreaId == 2)
+ {
+ var locationLateral = _locationRepository.QueryData(x => x.Row == item.Row && x.Column > item.Column && x.Remark == item.Remark);
- var locationd = SqlSugarHelper.DbWMS.Updateable(locationInfos).ExecuteCommandHasChange();
- return base.DeleteData(keys);
+ 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);
+ }
+ }
}
- catch (Exception ex)
- {
- return WebResponseContent.Instance.Error(ex.Message);
- }
+ return locationsNew;
}
- // 鏍规嵁浼犲叆搴撳瓨绫诲瀷鑾峰彇涓嶅悓宸烽亾鐨勫簱瀛�
- public async Task<Dictionary<string, int>> GetLocationByStockType(bool stockType, string areaCode)
+ #region 搴撳瓨瑙嗗浘
+ public List<StockSelectViewDTO> GetStockSelectViews(GetStockSelectViewDto viewDto)
{
- var stockInfos = await BaseDal.Db.Queryable<DtStockInfo>().Where(x => x.IsFull == stockType && x.AreaCode == areaCode)
- .Includes(x => x.LocationInfo).ToListAsync();
+ 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);
- var result = stockInfos
- .GroupBy(x => x.LocationInfo.RoadwayNo)
- .ToDictionary(x => x.Key, x => x.Count());
+ 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 override WebResponseContent UpdateData(DtStockInfo entity)
- //{
- // return base.UpdateData(entity);
- //}
+ public WebResponseContent GetStockView(GetStockSelectViewDto viewDto)
+ {
+ WebResponseContent content = new WebResponseContent();
+ try
+ {
+ Expression<Func<DtStockInfoDetail, bool>> expressionOrder = x => true;
+ if (!string.IsNullOrEmpty(viewDto.materielCode))
+ {
+ expressionOrder = x => x.MaterielCode.Contains(viewDto.materielCode);
+ }
+ 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();
+
+
+ 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)
+ {
+ 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