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;
|
/// <summary>
|
/// 实时库存服务
|
/// </summary>
|
[ApiDescriptionSettings(ApplicationConst.WmsStockQuanGroupName, Order = 100)]
|
public class WmsStockQuanService : IDynamicApiController, ITransient
|
{
|
private readonly SqlSugarRepository<WmsBaseBusinessType> _wmsBaseBusinessTypeRep;
|
private readonly UserManager _userManager;
|
private readonly SqlSugarRepository<WmsStockQuan> _rep;
|
private readonly SqlSugarRepository<WmsStockQuanZero> _wmsStockQuanZeroRep;
|
private readonly SqlSugarRepository<WmsStockQuanOut> _wmsStockQuanOutRep;
|
private readonly SqlSugarRepository<v_wms_stock_quan> _v_wms_stock_quanRep;
|
private readonly SqlSugarRepository<WmsBasePlace> _repWmsPlace;
|
private readonly SqlSugarRepository<WmsBaseContainer> _repWmsContainer;
|
private readonly SqlSugarRepository<v_wms_stock_quan_for_use> _v_wms_stock_quan_for_useRep;
|
private readonly SqlSugarRepository<WmsRecordTrans> _wmsRecordTransRep;
|
private readonly SqlSugarRepository<WmsLogAction> _wmsLogActionRep;
|
private readonly SqlSugarRepository<WmsBasePlace> _wmsPlaceRep;
|
public WmsStockQuanService(
|
SqlSugarRepository<WmsStockQuanOut> wmsStockQuanOutRep,
|
SqlSugarRepository<WmsStockQuanZero> wmsStockQuanZeroRep,
|
SqlSugarRepository<WmsBaseBusinessType> wmsBaseBusinessTypeRep,
|
UserManager userManager,
|
SqlSugarRepository<WmsStockQuan> rep
|
|
|
, SqlSugarRepository<v_wms_stock_quan_for_use> v_wms_stock_quan_for_useRep
|
, SqlSugarRepository<v_wms_stock_quan> v_wms_stock_quanRep,
|
SqlSugarRepository<WmsBasePlace> repWmsPlace
|
, SqlSugarRepository<WmsBaseContainer> repWmsContainer,
|
SqlSugarRepository<WmsRecordTrans> wmsRecordTransRep,
|
SqlSugarRepository<WmsLogAction> wmsLogActionRep,
|
SqlSugarRepository<WmsBasePlace> 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;
|
}
|
|
/// <summary>
|
/// 分页查询实时库存
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[ApiDescriptionSettings(Name = "Page")]
|
[Description("WmsStockQuan/Page")]
|
public async Task<SqlSugarPagedList<WmsStockQuanOutput>> Page(WmsStockQuanInput input)
|
{
|
var query = CommonPageFilter(input);
|
return await query.OrderBuilder(input, "", "Id").ToPagedListAsync(input.Page, input.PageSize);
|
}
|
|
|
|
/// <summary>
|
/// 分页查询可用库存-细分到跟踪码
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[ApiDescriptionSettings(Name = "GetStockQuanPageForUse")]
|
[Description("WmsStockQuan/GetStockQuanPageForUse")]
|
public async Task<SqlSugarPagedList<v_wms_stock_quan_for_use>> 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<v_wms_stock_quan_for_use>();
|
return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize);
|
}
|
|
|
|
/// <summary>
|
/// 分页查询实时库存
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[ApiDescriptionSettings(Name = "PageView")]
|
[Description("WmsStockQuan/PageView")]
|
[AllowAnonymous]
|
public async Task<SqlSugarPagedList<v_wms_stock_quan>> 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);
|
}
|
|
/// <summary>
|
/// 分页查询abc分类实时库存
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[ApiDescriptionSettings(Name = "AbcClassPageView")]
|
[Description("WmsStockQuan/AbcClassPageView")]
|
[AllowAnonymous]
|
public async Task<SqlSugarPagedList<WmsStockQuanAbcClassOutput>> 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<WmsBaseMaterial>((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);
|
}
|
|
|
/// <summary>
|
/// 不分页查询实时库存
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpGet]
|
[ApiDescriptionSettings(Name = "List")]
|
[Description("WmsStockQuan/List")]
|
public async Task<List<WmsStockQuanOutput>> List([FromQuery] WmsStockQuanInput input)
|
{
|
var query = CommonPageFilter(input);
|
return await query.OrderBuilder(input, "", "Id").Select<WmsStockQuanOutput>().ToListAsync();
|
}
|
|
/// <summary>
|
/// 增加实时库存
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[ApiDescriptionSettings(Name = "Add")]
|
[Description("WmsStockQuan/Add")]
|
public async Task<long> Add(AddWmsStockQuanInput input)
|
{
|
var entity = input.Adapt<WmsStockQuan>();
|
|
//重复性验证
|
await CheckExist(entity);
|
|
await _rep.InsertAsync(entity);
|
return entity.Id;
|
}
|
|
/// <summary>
|
/// 删除实时库存
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[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); //真删除
|
}
|
|
/// <summary>
|
/// 更新实时库存
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[ApiDescriptionSettings(Name = "Update")]
|
[Description("WmsStockQuan/Update")]
|
public async Task Update(UpdateWmsStockQuanInput input)
|
{
|
var entity = input.Adapt<WmsStockQuan>();
|
|
//重复性验证
|
await CheckExist(entity, true);
|
|
await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
|
}
|
|
/// <summary>
|
/// 获取实时库存
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpGet]
|
[ApiDescriptionSettings(Name = "Detail")]
|
[Description("WmsStockQuan/Detail")]
|
public async Task<WmsStockQuan> Detail([FromQuery] QueryByIdWmsStockQuanInput input)
|
{
|
return await _rep.GetFirstAsync(u => u.Id == input.Id);
|
}
|
|
|
/// <summary>
|
/// 冻结
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[ApiDescriptionSettings(Name = "Frozen")]
|
[Description("WmsStockQuan/Frozen")]
|
[UnitOfWork]
|
public async Task Frozen([FromBody] FrozeningInput input)
|
{
|
int mark = 0;
|
List<WmsRecordTrans> addWmsRecordTransList = new List<WmsRecordTrans>();
|
List<WmsLogAction> addWmsLogActionList = new List<WmsLogAction>();
|
|
|
#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<WmsStockQuan>();
|
|
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("不能同时传入多个冻结信息");
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
/// <summary>
|
/// 解冻
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[ApiDescriptionSettings(Name = "Unfreezeing")]
|
[Description("WmsStockQuan/Unfreezeing")]
|
[UnitOfWork]
|
public async Task Unfreezeing([FromBody] FrozeningInput input)
|
{
|
|
//update by liuwq 20240720 查询库存视图
|
#region 事务入参
|
List<WmsRecordTrans> addWmsRecordTransList = new List<WmsRecordTrans>();
|
List<WmsLogAction> addWmsLogActionList = new List<WmsLogAction>();
|
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<WmsStockQuan>();
|
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("不能同时传入多个冻结信息");
|
}
|
|
/// <summary>
|
/// 寻找库存(包扣已经删除的)
|
/// </summary>
|
/// <param name="snCode"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[ApiDescriptionSettings(Name = "GetStockBySnCodeIncludeDelete")]
|
[Description("WmsStockQuan/GetStockBySnCodeIncludeDelete")]
|
public async Task<WmsStockQuan> 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<WmsStockQuan>();
|
}
|
else
|
{
|
var outStock = await _wmsStockQuanOutRep.GetFirstAsync(a => a.SNCode == snCode);
|
if (outStock != null)
|
{
|
return outStock.Adapt<WmsStockQuan>();
|
}
|
}
|
}
|
return null;
|
}
|
|
|
/////// <summary>
|
/////// 创建事务记录入参方法
|
/////// </summary>
|
/////// <param name="allStockQuanView"></param>
|
/////// <param name="moveType"></param>
|
/////// <param name="businessTypeEnum"></param>
|
/////// <param name="StockModel"></param>
|
/////// <param name="recordTransRemarks"></param>
|
/////// <returns></returns>
|
////private static WmsRecordTrans CreateRecordTransInfo(List<v_wms_stock_quan> 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<string> documents)
|
{
|
List<int> suffixes = new List<int>();
|
|
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 私有方法
|
|
/// <summary>
|
/// 公共查询实时库存条件
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
private ISugarQueryable<WmsStockQuanOutput> 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<WmsStockQuanOutput>();
|
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<v_wms_stock_quan> 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<v_wms_stock_quan>();
|
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<WmsBaseMaterial>()
|
.WhereIF(input.ABCClass.HasValue, wm => wm.MaterialCode == n.MaterialCode && wm.ABCClass == input.ABCClass).Any());
|
}
|
return query;
|
}
|
|
/// <summary>
|
/// 重复性验证
|
/// </summary>
|
/// <param name="input">验证对象</param>
|
/// <param name="isEdit">是否是编辑</param>
|
/// <returns></returns>
|
private async Task CheckExist(WmsStockQuan input, bool isEdit = false)
|
{
|
|
|
|
//没有配置组合校验,不需要验重
|
|
|
//没有配置单独校验,不需要验重
|
}
|
|
/// <summary>
|
/// 根据组合校验和单独校验验证数据是否已存在-导入时验证
|
/// </summary>
|
/// <param name="inputs"></param>
|
/// <returns></returns>
|
private async Task CheckExisitForImport(List<WmsStockQuan> inputs)
|
{
|
if (inputs?.Count <= 0)
|
{
|
throw Oops.Oh($"导入数据不能为空");
|
}
|
//根据组合校验验证表格中中是否已存在相同数据
|
|
|
|
|
|
|
|
|
//根据单独校验验证表格中中是否已存在相同数据
|
|
|
|
}
|
#endregion
|
|
}
|