using Admin.NET.Core.Service; using Admin.NET.Application.Entity; using Microsoft.AspNetCore.Http; using System.Data; using System.Web; using System.Text; using Furion.DatabaseAccessor; using Admin.NET.Application.CommonHelper; using AngleSharp.Dom; using DocumentFormat.OpenXml.Office2013.Word; using NPOI.SS.Formula.Functions; using Admin.NET.Core; namespace Admin.NET.Application; /// /// 实时库存服务 /// [ApiDescriptionSettings(ApplicationConst.WmsStockQuanGroupName, Order = 100)] public class WmsStockQuanService : IDynamicApiController, ITransient { private readonly SqlSugarRepository _wmsBaseBusinessTypeRep; private readonly UserManager _userManager; private readonly SqlSugarRepository _rep; private readonly SqlSugarRepository _wmsStockQuanZeroRep; private readonly SqlSugarRepository _wmsStockQuanOutRep; private readonly SqlSugarRepository _v_wms_stock_quanRep; private readonly SqlSugarRepository _repWmsPlace; private readonly SqlSugarRepository _repWmsContainer; private readonly SqlSugarRepository _v_wms_stock_quan_for_useRep; private readonly SqlSugarRepository _wmsRecordTransRep; private readonly SqlSugarRepository _wmsLogActionRep; private readonly SqlSugarRepository _wmsPlaceRep; public WmsStockQuanService( SqlSugarRepository wmsStockQuanOutRep, SqlSugarRepository wmsStockQuanZeroRep, SqlSugarRepository wmsBaseBusinessTypeRep, UserManager userManager, SqlSugarRepository rep , SqlSugarRepository v_wms_stock_quan_for_useRep , SqlSugarRepository v_wms_stock_quanRep, SqlSugarRepository repWmsPlace , SqlSugarRepository repWmsContainer, SqlSugarRepository wmsRecordTransRep, SqlSugarRepository wmsLogActionRep, SqlSugarRepository wmsPlaceRep) { _wmsStockQuanOutRep = wmsStockQuanOutRep; _wmsStockQuanZeroRep = wmsStockQuanZeroRep; _wmsBaseBusinessTypeRep = wmsBaseBusinessTypeRep; _userManager = userManager; _rep = rep; _v_wms_stock_quanRep = v_wms_stock_quanRep; _v_wms_stock_quan_for_useRep = v_wms_stock_quan_for_useRep; _repWmsPlace = repWmsPlace; _repWmsContainer = repWmsContainer; _wmsRecordTransRep = wmsRecordTransRep; _wmsLogActionRep = wmsLogActionRep; _wmsPlaceRep = wmsPlaceRep; } /// /// 分页查询实时库存 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Page")] [Description("WmsStockQuan/Page")] public async Task> Page(WmsStockQuanInput input) { var query = CommonPageFilter(input); return await query.OrderBuilder(input, "", "Id").ToPagedListAsync(input.Page, input.PageSize); } /// /// 分页查询可用库存-细分到跟踪码 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "GetStockQuanPageForUse")] [Description("WmsStockQuan/GetStockQuanPageForUse")] public async Task> Page(WmsMaterialInput input) { var query = _v_wms_stock_quan_for_useRep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(input.MaterialName), u => u.MaterialName.Contains(input.MaterialName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.SnCode), u => u.SNCode.Contains(input.SnCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.MaterialCode), u => u.MaterialCode == input.MaterialCode) .WhereIF(!string.IsNullOrWhiteSpace(input.Batch), u => u.Batch.Contains(input.Batch.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.ErpCode), u => u.ErpCode.Contains(input.ErpCode.Trim())) .Where(p => p.ContainerIsDisabled == false) .Where(p => p.PlaceStatus == PlaceStatusEnum.正常) .Select(); return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); } /// /// 分页查询实时库存 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "PageView")] [Description("WmsStockQuan/PageView")] [AllowAnonymous] public async Task> PageView(WmsStockQuanInput input) { var query = CommonPageViewFilter(input); return await query.OrderBuilder(input, "", string.IsNullOrWhiteSpace(input.Field) ? "RecordInsertTime" : input.Field).OrderBuilder(input, "", "MaterialCode").OrderBuilder(input, "", "RelationNo").ToPagedListAsync(input.Page, input.PageSize); } /// /// 分页查询abc分类实时库存 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "AbcClassPageView")] [Description("WmsStockQuan/AbcClassPageView")] [AllowAnonymous] public async Task> AbcClassPageView(WmsStockQuanAbcClassInput input) { DateTime? start = null; DateTime? end = null; if (input.RecordInsertTimeRange != null && input.RecordInsertTimeRange.Count > 0) { DateTime stDateInput = input.RecordInsertTimeRange[0].Value; start = new DateTime(stDateInput.Year, stDateInput.Month, stDateInput.Day, 00, 00, 00); if (input.RecordInsertTimeRange.Count > 1 && input.RecordInsertTimeRange[1].HasValue) { DateTime edDateInput = input.RecordInsertTimeRange[1].Value; end = new DateTime(edDateInput.Year, edDateInput.Month, edDateInput.Day, 23, 59, 59); } } var query = _rep.AsQueryable() .LeftJoin((u, wm) => u.MaterialCode == wm.MaterialCode) .WhereIF(input.ABCClass.HasValue, (u, wm) => wm.ABCClass == input.ABCClass) .WhereIF(!string.IsNullOrWhiteSpace(input.MaterialCode), (u, wm) => u.MaterialCode.Contains(input.MaterialCode.Trim())) .WhereIF(start.HasValue, (u, wm) => u.RecordInsertTime > start) .WhereIF(end.HasValue, (u, wm) => u.RecordInsertTime < end) .GroupBy((u, wm) => new { wm.ABCClassName, u.MaterialCode, u.MaterialName, u.MaterialUnit }) .Select((u, wm) => new WmsStockQuanAbcClassOutput { MaterialName = u.MaterialName, MaterialCode = u.MaterialCode, MaterialUnit = u.MaterialUnit, AbcClassName = wm.ABCClassName, Quantity = SqlFunc.AggregateSumNoNull(u.Quantity) }) .OrderByDescending(u => SqlFunc.AggregateSumNoNull(u.Quantity)); return await query.ToPagedListAsync(input.Page, input.PageSize); } /// /// 不分页查询实时库存 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "List")] [Description("WmsStockQuan/List")] public async Task> List([FromQuery] WmsStockQuanInput input) { var query = CommonPageFilter(input); return await query.OrderBuilder(input, "", "Id").Select().ToListAsync(); } /// /// 增加实时库存 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Add")] [Description("WmsStockQuan/Add")] public async Task Add(AddWmsStockQuanInput input) { var entity = input.Adapt(); //重复性验证 await CheckExist(entity); await _rep.InsertAsync(entity); return entity.Id; } /// /// 删除实时库存 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Delete")] [Description("WmsStockQuan/Delete")] public async Task Delete(DeleteWmsStockQuanInput input) { var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); //await _rep.FakeDeleteAsync(entity); //假删除 await _rep.DeleteAsync(entity); //真删除 } /// /// 更新实时库存 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Update")] [Description("WmsStockQuan/Update")] public async Task Update(UpdateWmsStockQuanInput input) { var entity = input.Adapt(); //重复性验证 await CheckExist(entity, true); await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); } /// /// 获取实时库存 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "Detail")] [Description("WmsStockQuan/Detail")] public async Task Detail([FromQuery] QueryByIdWmsStockQuanInput input) { return await _rep.GetFirstAsync(u => u.Id == input.Id); } /// /// 冻结 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Frozen")] [Description("WmsStockQuan/Frozen")] [UnitOfWork] public async Task Frozen([FromBody] FrozeningInput input) { int mark = 0; List addWmsRecordTransList = new List(); List addWmsLogActionList = new List(); #region 事务入参 //update by liuwq 20240720 查询库存视图 var allStockQuanViewList = await _v_wms_stock_quanRep.GetListAsync(f => f.SNCode.Equals(input.SNCode) || input.WmsStockIdList.Contains(f.Id)); BusinessTypeEnum businessTypeEnum = BusinessTypeEnum.冻结; // 获取业务类型 update by liuwq 2024 07 30 var wmsBaseBusinessType = BusinessTypeHelper.GetBusinessTypeInfoFromDB((int)businessTypeEnum, _wmsBaseBusinessTypeRep); string recordTransRemarks = string.Empty; //获取库位相信 var placeCodeList = allStockQuanViewList.Select(s => s.PlaceCode).Distinct().ToList(); var allPlaeList = await _wmsPlaceRep.GetListAsync(u => placeCodeList.Contains(u.PlaceCode) && u.IsDelete == false); #endregion //声明库存表参数 var StockUpdateList = new List(); if (input == null) throw Oops.Oh("未传入需要冻结信息"); if (!string.IsNullOrEmpty(input.SNCode) && input.WmsStockIdList == null) { var StockModel = await _rep.AsQueryable().FirstAsync(p => p.SNCode == input.SNCode && p.StockStatus == StockStatusEnum.已上架); if (StockModel == null) throw Oops.Oh("库存未找到或者未上架"); if (StockModel.StockStatus == StockStatusEnum.已冻结) throw Oops.Oh("该物料已冻结!"); StockQuanHelper.UpdateStockStatus(StockModel, StockStatusEnum.已冻结, input.Reason, _userManager.RealName); #region 添加事务、操作日志 #region 创建事务日志入参 //获取源库存信息 var sourceStockView = StockQuanHelper.GetVMmsStockQuan(allStockQuanViewList, StockModel.SNCode); //update by liuwq 20240730 //获取目标库位 //冻结库存没有变更库位,目标库位还是源库位 var toPlace = BaseInfoHelper.GetPlace(sourceStockView.PlaceCode, allPlaeList); // 其他参数对象 TransferOtherDetail transferOtherDetail = new TransferOtherDetail() { RelationNo = "", RelationNoLineNumber = "", Remarks = recordTransRemarks, }; #endregion //新增事务记录 //仅变更冻结状态 addWmsRecordTransList.Add(LogRecordHelper.CreateWmsRecordTrans(wmsBaseBusinessType, sourceStockView, StockModel, toPlace, transferOtherDetail)); //新增操作日志 WmsLogAction wareActionLog = LogActionHelper.CreateWmsLogAction(StockModel.Id, recordTransRemarks, $"跟踪码{StockModel.SNCode}"); addWmsLogActionList.Add(wareActionLog); #endregion await _wmsLogActionRep.InsertRangeAsync(addWmsLogActionList); await _wmsRecordTransRep.InsertRangeAsync(addWmsRecordTransList); await _rep.UpdateAsync(StockModel); mark++; } else if (input.WmsStockIdList != null) { foreach (var item in input.WmsStockIdList) { var StockModel = await _rep.AsQueryable().FirstAsync(p => p.Id == item && p.StockStatus == StockStatusEnum.已上架); if (StockModel == null) throw Oops.Oh("库存未找到或者未上架"); if (StockModel.StockStatus == StockStatusEnum.已冻结) throw Oops.Oh("该物料已冻结!"); if (StockModel != null && StockModel.StockStatus == StockStatusEnum.已上架) { StockQuanHelper.UpdateStockStatus(StockModel, StockStatusEnum.已冻结,input.Reason, _userManager.RealName); StockUpdateList.Add(StockModel); #region 添加事务、操作日志 #region 创建事务日志入参 //获取源库存信息 var sourceStockView = StockQuanHelper.GetVMmsStockQuan(allStockQuanViewList, StockModel.SNCode); //update by liuwq 20240730 //获取目标库位 //冻结库存没有变更库位,目标库位还是源库位 var toPlace = BaseInfoHelper.GetPlace(sourceStockView.PlaceCode, allPlaeList); // 其他参数对象 TransferOtherDetail transferOtherDetail = new TransferOtherDetail() { RelationNo = "", RelationNoLineNumber = "", Remarks = recordTransRemarks, }; #endregion //新增事务记录 //仅变更冻结状态 addWmsRecordTransList.Add(LogRecordHelper.CreateWmsRecordTrans(wmsBaseBusinessType, sourceStockView, StockModel, toPlace, transferOtherDetail)); //新增操作日志 WmsLogAction wareActionLog = LogActionHelper.CreateWmsLogAction(StockModel.Id, recordTransRemarks, $"跟踪码{StockModel.SNCode}"); addWmsLogActionList.Add(wareActionLog); #endregion } } await _wmsLogActionRep.InsertRangeAsync(addWmsLogActionList); await _wmsRecordTransRep.InsertRangeAsync(addWmsRecordTransList); await _rep.UpdateRangeAsync(StockUpdateList); } else if (!string.IsNullOrEmpty(input.PlaceCode)) { var PlaceModel = await _repWmsPlace.AsQueryable().FirstAsync(p => p.PlaceCode == input.PlaceCode && p.PlaceStatus == PlaceStatusEnum.正常); if (PlaceModel == null) throw Oops.Oh("该库位状态异常或者不存在"); if (PlaceModel.PlaceStatus == PlaceStatusEnum.封存) throw Oops.Oh("该库位已冻结!"); PlaceModel.PlaceStatus = PlaceStatusEnum.封存; await _repWmsPlace.UpdateAsync(PlaceModel); mark++; } else if (!string.IsNullOrEmpty(input.ContainerCode)) { var ContainerModel = await _repWmsContainer.AsQueryable().FirstAsync(p => p.ContainerCode == input.ContainerCode && p.IsDisabled == false); if (ContainerModel == null) { throw Oops.Oh("该容器不需要冻结!"); } if (ContainerModel.IsDisabled == true) throw Oops.Oh("该容器已冻结!"); ContainerModel.IsDisabled = true; await _repWmsContainer.UpdateAsync(ContainerModel); mark++; } if (mark != 1 && mark != 0) throw Oops.Oh("不能同时传入多个冻结信息"); } /// /// 解冻 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Unfreezeing")] [Description("WmsStockQuan/Unfreezeing")] [UnitOfWork] public async Task Unfreezeing([FromBody] FrozeningInput input) { //update by liuwq 20240720 查询库存视图 #region 事务入参 List addWmsRecordTransList = new List(); List addWmsLogActionList = new List(); var allStockQuanViewList = await _v_wms_stock_quanRep.GetListAsync(f => f.SNCode.Equals(input.SNCode) || input.WmsStockIdList.Contains(f.Id)); BusinessTypeEnum businessTypeEnum = BusinessTypeEnum.解冻; // 获取业务类型 update by liuwq 2024 07 30 var wmsBaseBusinessType = BusinessTypeHelper.GetBusinessTypeInfoFromDB((int)businessTypeEnum, _wmsBaseBusinessTypeRep); string recordTransRemarks = string.Empty; //获取库位相信 var placeCodeList = allStockQuanViewList.Select(s => s.PlaceCode).Distinct().ToList(); var allPlaeList = await _wmsPlaceRep.GetListAsync(u => placeCodeList.Contains(u.PlaceCode) && u.IsDelete == false); #endregion int mark = 0; //声明库存表参数 var StockUpdateList = new List(); if (input == null) throw Oops.Oh("未传入需要冻结信息"); if (input.WmsStockIdList != null) { foreach (var item in input.WmsStockIdList) { var StockModel = await _rep.AsQueryable().FirstAsync(p => p.Id == item); //if (StockModel.OperReason.Contains("盘点冻结")) throw Oops.Oh("此物料" + StockModel.SNCode + "为盘点冻结无法解冻"); if (StockModel.StockStatus != StockStatusEnum.已冻结) throw Oops.Oh($"该物料库存状态是{StockModel.StockStatusName}!"); if (StockModel.OldStockStatus == null) { throw Oops.Oh("该物料变更前库存状态为空,无法解冻!"); } if (StockModel != null && (StockModel.StockStatus == StockStatusEnum.已冻结)) { //解冻库存 StockQuanHelper.UpdateStockStatus(StockModel, (StockStatusEnum)StockModel.OldStockStatus,input.Reason, _userManager.RealName); StockUpdateList.Add(StockModel); #region 添加事务、操作日志 #region 创建事务日志入参 //获取源库存信息 var sourceStockView = StockQuanHelper.GetVMmsStockQuan(allStockQuanViewList, StockModel.SNCode); //update by liuwq 20240730 //获取目标库位 //解冻库存没有变更库位,目标库位还是源库位 var toPlace = BaseInfoHelper.GetPlace(sourceStockView.PlaceCode, allPlaeList); // 其他参数对象 TransferOtherDetail transferOtherDetail = new TransferOtherDetail() { RelationNo = "", RelationNoLineNumber = "", Remarks = recordTransRemarks, }; #endregion //新增事务记录 //仅变更冻结状态 addWmsRecordTransList.Add(LogRecordHelper.CreateWmsRecordTrans(wmsBaseBusinessType, sourceStockView, StockModel, toPlace, transferOtherDetail)); //新增操作日志 WmsLogAction wareActionLog = LogActionHelper.CreateWmsLogAction(StockModel.Id, recordTransRemarks, $"跟踪码{StockModel.SNCode}"); addWmsLogActionList.Add(wareActionLog); #endregion } } await _wmsLogActionRep.InsertRangeAsync(addWmsLogActionList); await _wmsRecordTransRep.InsertRangeAsync(addWmsRecordTransList); await _rep.UpdateRangeAsync(StockUpdateList); } else if (!string.IsNullOrEmpty(input.SNCode) && input.WmsStockIdList == null) { var StockModel = await _rep.AsQueryable().FirstAsync(p => p.SNCode == input.SNCode); if (StockModel == null) throw Oops.Oh("库存未找到或者未冻结"); if (StockModel.StockStatus != StockStatusEnum.已冻结) throw Oops.Oh($"该物料库存状态是{StockModel.StockStatusName}!"); //解冻库存 StockQuanHelper.UpdateStockStatus(StockModel, (StockStatusEnum)StockModel.OldStockStatus, input.Reason, _userManager.RealName); #region 添加事务、操作日志 #region 创建事务日志入参 //获取源库存信息 var sourceStockView = StockQuanHelper.GetVMmsStockQuan(allStockQuanViewList, StockModel.SNCode); //update by liuwq 20240730 //获取目标库位 //冻结库存没有变更库位,目标库位还是源库位 var toPlace = BaseInfoHelper.GetPlace(sourceStockView.PlaceCode, allPlaeList); // 其他参数对象 TransferOtherDetail transferOtherDetail = new TransferOtherDetail() { RelationNo = "", RelationNoLineNumber = "", Remarks = recordTransRemarks, }; #endregion //新增事务记录 //仅变更冻结状态 addWmsRecordTransList.Add(LogRecordHelper.CreateWmsRecordTrans(wmsBaseBusinessType, sourceStockView, StockModel, toPlace, transferOtherDetail)); //新增操作日志 WmsLogAction wareActionLog = LogActionHelper.CreateWmsLogAction(StockModel.Id, recordTransRemarks, $"跟踪码{StockModel.SNCode}"); addWmsLogActionList.Add(wareActionLog); #endregion await _wmsLogActionRep.InsertRangeAsync(addWmsLogActionList); await _wmsRecordTransRep.InsertRangeAsync(addWmsRecordTransList); await _rep.UpdateAsync(StockModel); mark++; } else if (!string.IsNullOrEmpty(input.PlaceCode)) { var PlaceModel = await _repWmsPlace.AsQueryable().FirstAsync(p => p.PlaceCode == input.PlaceCode && p.PlaceStatus == PlaceStatusEnum.封存); if (PlaceModel.PlaceStatus == PlaceStatusEnum.正常) throw Oops.Oh("该库位已解冻"); if (PlaceModel == null) throw Oops.Oh("该库位状态异常或者不存在"); PlaceModel.PlaceStatus = PlaceStatusEnum.正常; await _repWmsPlace.UpdateAsync(PlaceModel); mark++; } else if (!string.IsNullOrEmpty(input.ContainerCode)) { var ContainerModel = await _repWmsContainer.AsQueryable().FirstAsync(p => p.ContainerCode == input.ContainerCode && p.IsDisabled == true); if (ContainerModel == null) throw Oops.Oh("该容器不需要解冻!"); if (ContainerModel.IsDisabled == false) throw Oops.Oh("该容器已解冻"); ContainerModel.IsDisabled = false; await _repWmsContainer.UpdateAsync(ContainerModel); mark++; } if (mark != 1 && mark != 0) throw Oops.Oh("不能同时传入多个冻结信息"); } /// /// 寻找库存(包扣已经删除的) /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "GetStockBySnCodeIncludeDelete")] [Description("WmsStockQuan/GetStockBySnCodeIncludeDelete")] public async Task GetStockBySnCodeIncludeDelete([FromBody] string snCode) { var stock = await _rep.GetFirstAsync(a => a.SNCode == snCode); if (stock != null) { return stock; } else { var zeroStock = await _wmsStockQuanZeroRep.GetFirstAsync(a => a.SNCode == snCode); if (zeroStock != null) { return zeroStock.Adapt(); } else { var outStock = await _wmsStockQuanOutRep.GetFirstAsync(a => a.SNCode == snCode); if (outStock != null) { return outStock.Adapt(); } } } return null; } /////// /////// 创建事务记录入参方法 /////// /////// /////// /////// /////// /////// /////// ////private static WmsRecordTrans CreateRecordTransInfo(List allStockQuanView, MoveTypeEnum moveType, BusinessTypeEnum businessTypeEnum, WmsStockQuan StockModel, string recordTransRemarks) ////{ //// //创建事务的入参 //// var currentStockQuanView = allStockQuanView.FirstOrDefault(f => f.SNCode.Equals(StockModel.SNCode)); //// if (currentStockQuanView == null) //// { //// throw Oops.Oh($"{businessTypeEnum.GetDescription()}跟踪码{StockModel.SNCode}没有获取到库存信息"); //// } //// TransferOtherDetail transferOtherDetail = new TransferOtherDetail() //// { //// RelationNo = StockModel.RelationNo, //// RelationNoLineNumber = string.Empty, //// Remarks = recordTransRemarks, //// }; //// //源信息 //// TransferStockDetail sourceStockDetail = new TransferStockDetail() //// { //// Quantity = currentStockQuanView.Quantity,//源库存数 //// StockStatus = currentStockQuanView.StockStatus,//源库存状态 //// StockQcStatus = currentStockQuanView.QCStatus,//源质量状态 //// LockStatus= currentStockQuanView.LockStatus,//源冻结状态 //// }; //// //目标信息 //// TransferStockDetail targetStockDetail = new TransferStockDetail() //// { //// Quantity = StockModel.Quantity,//目标库存数 //// StockStatus = StockModel.StockStatus,//目标库存状态 //// StockQcStatus = StockModel.QCStatus,//目标质量状态 //// LockStatus = StockModel.LockStatus,//目标冻结状态 //// }; //// WmsRecordTrans addWmsRecordTrans = LogRecordHelper.CreateWmsRecordTrans //// ( //// moveType, (int)businessTypeEnum,_wmsBaseBusinessTypeRep, currentStockQuanView, null, //// sourceStockDetail, targetStockDetail, transferOtherDetail //// ); //// return addWmsRecordTrans; ////} public static string GetNextSuffix(string baseNumber, List documents) { List suffixes = new List(); foreach (string document in documents) { if (document.StartsWith(baseNumber + "-")) { // Extract the suffix part after "-" string suffixString = document.Substring(baseNumber.Length + 1); int suffix; if (int.TryParse(suffixString, out suffix)) { suffixes.Add(suffix); } } } // Find the maximum suffix int maxSuffix = suffixes.Count > 0 ? suffixes.Max() : 0; // Return the next available suffix (max + 1) return baseNumber + (maxSuffix + 1).ToString(); } #region 私有方法 /// /// 公共查询实时库存条件 /// /// /// private ISugarQueryable CommonPageFilter(WmsStockQuanInput input) { var query = _rep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => u.ContainerCode.Contains(input.SearchKey.Trim()) || u.MaterialCode.Contains(input.SearchKey.Trim()) || u.SupplierBatch.Contains(input.SearchKey.Trim()) || u.Batch.Contains(input.SearchKey.Trim()) || u.CreateUserName.Contains(input.SearchKey.Trim()) || u.UpdateUserName.Contains(input.SearchKey.Trim()) || u.SupplierCode.Contains(input.SearchKey.Trim()) || u.SupplierName.Contains(input.SearchKey.Trim()) || u.MaterialName.Contains(input.SearchKey.Trim()) || u.SN_1d.Contains(input.SearchKey.Trim()) || u.SN_2d.Contains(input.SearchKey.Trim()) || u.SNCode.Contains(input.SearchKey.Trim()) || u.ErpOrderNo.Contains(input.SearchKey.Trim()) || u.ErpCode.Contains(input.SearchKey.Trim()) || u.ErpVoucher.Contains(input.SearchKey.Trim()) ) .WhereIF(input.ContainerId > 0, u => u.ContainerId == input.ContainerId) .WhereIF(!string.IsNullOrWhiteSpace(input.ContainerCode), u => u.ContainerCode.Contains(input.ContainerCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.MaterialCode), u => u.MaterialCode.Contains(input.MaterialCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.SupplierBatch), u => u.SupplierBatch.Contains(input.SupplierBatch.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.Batch), u => u.Batch.Contains(input.Batch.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.SupplierCode), u => u.SupplierCode.Contains(input.SupplierCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.SupplierName), u => u.SupplierName.Contains(input.SupplierName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.MaterialName), u => u.MaterialName.Contains(input.MaterialName.Trim())) .WhereIF(input.StockStatus.HasValue, u => u.StockStatus == input.StockStatus) .WhereIF(!string.IsNullOrWhiteSpace(input.SN_1d), u => u.SN_1d.Contains(input.SN_1d.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.SN_2d), u => u.SN_2d.Contains(input.SN_2d.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.SNCode), u => u.SNCode.Contains(input.SNCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.ErpOrderNo), u => u.ErpOrderNo.Contains(input.ErpOrderNo.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.ErpCode), u => u.ErpCode.Contains(input.ErpCode.Trim())) .WhereIF(input.QCStatus.HasValue, u => u.QCStatus == input.QCStatus) .WhereIF(!string.IsNullOrWhiteSpace(input.ErpVoucher), u => u.ErpVoucher.Contains(input.ErpVoucher.Trim())) .Select(); if (input.RecordInsertTimeRange != null && input.RecordInsertTimeRange.Count > 0) { DateTime? start = input.RecordInsertTimeRange[0].Value.AddDays(-1); query = query.WhereIF(start.HasValue, u => u.RecordInsertTime > start); if (input.RecordInsertTimeRange.Count > 1 && input.RecordInsertTimeRange[1].HasValue) { var end = input.RecordInsertTimeRange[1].Value.AddDays(1); query = query.Where(u => u.RecordInsertTime < end); } } if (input.ActionTimeRange != null && input.ActionTimeRange.Count > 0) { DateTime? start = input.ActionTimeRange[0].Value.AddDays(-1); query = query.WhereIF(start.HasValue, u => u.ActionTime > start); if (input.ActionTimeRange.Count > 1 && input.ActionTimeRange[1].HasValue) { var end = input.ActionTimeRange[1].Value.AddDays(1); query = query.Where(u => u.ActionTime < end); } } return query; } private ISugarQueryable CommonPageViewFilter(WmsStockQuanInput input) { var query = _v_wms_stock_quanRep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => u.ContainerCode.Contains(input.SearchKey.Trim()) || u.MaterialCode.Contains(input.SearchKey.Trim()) || u.SupplierBatch.Contains(input.SearchKey.Trim()) || u.Batch.Contains(input.SearchKey.Trim()) || u.CreateUserName.Contains(input.SearchKey.Trim()) || u.UpdateUserName.Contains(input.SearchKey.Trim()) || u.SupplierCode.Contains(input.SearchKey.Trim()) || u.SupplierName.Contains(input.SearchKey.Trim()) || u.MaterialName.Contains(input.SearchKey.Trim()) || u.SN_1d.Contains(input.SearchKey.Trim()) || u.SN_2d.Contains(input.SearchKey.Trim()) || u.SNCode.Contains(input.SearchKey.Trim()) || u.ErpOrderNo.Contains(input.SearchKey.Trim()) || u.ErpCode.Contains(input.SearchKey.Trim()) || u.ErpVoucher.Contains(input.SearchKey.Trim()) || u.ActionRemark.Contains(input.SearchKey.Trim()) ) .WhereIF(!string.IsNullOrWhiteSpace(input.ContainerCode), u => u.ContainerCode.Contains(input.ContainerCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.MaterialCode), u => u.MaterialCode.Contains(input.MaterialCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.SupplierBatch), u => u.SupplierBatch.Contains(input.SupplierBatch.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.Batch), u => u.Batch.Contains(input.Batch.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.PlaceName), u => u.PlaceName == input.PlaceName) .WhereIF(!string.IsNullOrWhiteSpace(input.AreaName), u => u.AreaName == input.AreaName) .WhereIF(!string.IsNullOrWhiteSpace(input.SupplierCode), u => u.SupplierCode.Contains(input.SupplierCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.SupplierName), u => u.SupplierName.Contains(input.SupplierName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.MaterialName), u => u.MaterialName.Contains(input.MaterialName.Trim())) .WhereIF(input.StockStatus.HasValue, u => u.StockStatus == input.StockStatus) .WhereIF(input.LockStatus.HasValue, u => u.LockStatus == input.LockStatus) .WhereIF(!string.IsNullOrWhiteSpace(input.OperReason), u => u.OperReason.Contains(input.OperReason.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.OperUser), u => u.OperUser.Contains(input.OperUser.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.SN_1d), u => u.SN_1d.Contains(input.SN_1d.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.SN_2d), u => u.SN_2d.Contains(input.SN_2d.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.SNCode), u => u.SNCode.Contains(input.SNCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.SNCodeForPda), u => u.SNCode == input.SNCodeForPda) //ly0720 pda物料拆分合并 需要精准跟踪码 .WhereIF(!string.IsNullOrWhiteSpace(input.ErpOrderNo), u => u.ErpOrderNo.Contains(input.ErpOrderNo.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.ErpCode), u => u.ErpCode.Contains(input.ErpCode.Trim())) .WhereIF(input.QCStatus.HasValue, u => u.QCStatus == input.QCStatus) .WhereIF(input.UsableFlag.HasValue, u => u.UsableFlag == input.UsableFlag) .WhereIF(!string.IsNullOrWhiteSpace(input.ErpVoucher), u => u.ErpVoucher.Contains(input.ErpVoucher.Trim())) .Select(); if (input.RecordInsertTimeRange != null && input.RecordInsertTimeRange.Count > 0) { DateTime? start = input.RecordInsertTimeRange[0].Value.AddDays(-1); query = query.WhereIF(start.HasValue, u => u.RecordInsertTime > start); if (input.RecordInsertTimeRange.Count > 1 && input.RecordInsertTimeRange[1].HasValue) { var end = input.RecordInsertTimeRange[1].Value.AddDays(1); query = query.Where(u => u.RecordInsertTime < end); } } if (input.ActionTimeRange != null && input.ActionTimeRange.Count > 0) { DateTime? start = input.ActionTimeRange[0].Value.AddDays(-1); query = query.WhereIF(start.HasValue, u => u.ActionTime > start); if (input.ActionTimeRange.Count > 1 && input.ActionTimeRange[1].HasValue) { var end = input.ActionTimeRange[1].Value.AddDays(1); query = query.Where(u => u.ActionTime < end); } } if (!string.IsNullOrWhiteSpace(input.PageFlage)) { query.Where(n => SqlFunc.Subqueryable() .WhereIF(input.ABCClass.HasValue, wm => wm.MaterialCode == n.MaterialCode && wm.ABCClass == input.ABCClass).Any()); } return query; } /// /// 重复性验证 /// /// 验证对象 /// 是否是编辑 /// private async Task CheckExist(WmsStockQuan input, bool isEdit = false) { //没有配置组合校验,不需要验重 //没有配置单独校验,不需要验重 } /// /// 根据组合校验和单独校验验证数据是否已存在-导入时验证 /// /// /// private async Task CheckExisitForImport(List inputs) { if (inputs?.Count <= 0) { throw Oops.Oh($"导入数据不能为空"); } //根据组合校验验证表格中中是否已存在相同数据 //根据单独校验验证表格中中是否已存在相同数据 } #endregion }