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
}