using Admin.NET.Core.Service; using Admin.NET.Application.Entity; using Microsoft.AspNetCore.Http; using System.Data; using System.Web; using System.Text; namespace Admin.NET.Application; /// /// 波次单服务 /// [ApiDescriptionSettings(ApplicationConst.WmsOrderGroupName, Order = 100)] public class WmsOrderSortService : IDynamicApiController, ITransient { private readonly SqlSugarRepository _rep; private readonly SqlSugarRepository _WmsOrderSortDetailsRep; private readonly SqlSugarRepository _WmsOrderMovementRep; private readonly SqlSugarRepository _WmsOrderMovementDetailsRep; private readonly SqlSugarRepository _WmsOrderDeliverDetailsRep; private readonly SqlSugarRepository _WmsOrderDeliverRep; public WmsOrderSortService(SqlSugarRepository rep, SqlSugarRepository wmsOrderSortDetailsRep, SqlSugarRepository WmsOrderMovementRep, SqlSugarRepository WmsOrderMovementDetailsRep, SqlSugarRepository wmsOrderDeliverDetailsRep, SqlSugarRepository wmsOrderDeliverRep) { _rep = rep; _WmsOrderSortDetailsRep = wmsOrderSortDetailsRep; _WmsOrderMovementRep = WmsOrderMovementRep; _WmsOrderMovementDetailsRep = WmsOrderMovementDetailsRep; _WmsOrderDeliverDetailsRep = wmsOrderDeliverDetailsRep; _WmsOrderDeliverRep = wmsOrderDeliverRep; } /// /// 分页查询波次单 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Page")] [Description("WmsOrderSort/Page")] public async Task> Page(WmsOrderSortInput input) { var query = CommonPageFilter(input); return await query .OrderBy(x => x.SortStatus).OrderByDescending(x => x.CreateTime) // .OrderBuilder(input, "", "Id") .ToPagedListAsync(input.Page, input.PageSize); } /// /// 不分页查询波次单 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "List")] [Description("WmsOrderSort/List")] public async Task> List([FromQuery] WmsOrderSortInput input) { var query = CommonPageFilter(input); return await query.OrderBuilder(input, "", "Id").Select().ToListAsync(); } /// /// 增加波次单 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Add")] [Description("WmsOrderSort/Add")] public async Task Add(AddWmsOrderSortInput input) { var entity = input.Adapt(); //重复性验证 await CheckExist(entity); await _rep.InsertAsync(entity); return entity.Id; } /// /// 取消波次单 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Delete")] [Description("WmsOrderSort/Delete")] public async Task Delete(DeleteWmsOrderSortInput input) { var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); if (entity.SortStatus != OrderStatusEnum.新建) { throw Oops.Oh($"{entity.SortNo}单据状态是{entity.SortStatusName},不允许取消波次"); } //----------主表单据-状态变取消 entity.SortStatus = OrderStatusEnum.已取消; entity.SortStatusName =GetEnumDescriptionUtil.GetEnumDescription(OrderStatusEnum.已取消); var OrderDetails = await _WmsOrderSortDetailsRep.AsQueryable() .Where(x => x.SortId == entity.Id) .Where(u => u.IsDelete == false) .Select() .ToListAsync(); //-----------波次单-取消明细-状态变取消 List deleteWareOrderDetails = new List(); var deleteList = OrderDetails.Where(x => x.IsDelete == false).ToList(); foreach (var item in deleteList) { if (item.SortDetailStatus != OrderStatusEnum.新建) { throw Oops.Oh($"物料{item.MaterialCode}的状态是{item.SortDetailStatusName},不允许取消波次"); } if (item.IssueQuantity > 0) { throw Oops.Oh($"物料{item.MaterialCode}已下发,不允许取消波次"); } item.SortDetailStatus = OrderStatusEnum.已取消; item.SortDetailStatusName = GetEnumDescriptionUtil.GetEnumDescription(OrderStatusEnum.已取消); deleteWareOrderDetails.Add(item); } //-------------寻找更新下架单物料明细 单号 List queryCodeList = deleteList.Select(v => v.RelationNo).Distinct().ToList(); List UpdateWmsOrderMovementDetailsList = new List(); var handleList = await _WmsOrderMovementDetailsRep.GetListAsync(u => queryCodeList.Contains(u.MovementNo) && u.IsDelete == false); if (handleList == null || handleList.Count<=0) { throw Oops.Oh($"没有查到需要更新的下架单物料明细"); } //下架单-明细状态 -改 新建|执行中 波次数量回退 foreach (var item in handleList) { if (item.OrderStatus == OrderStatusEnum.已取消 || item.OrderStatus == OrderStatusEnum.已关闭) { throw Oops.Oh($"物料{item.MaterialCode}状态{item.OrderStatusName},不允许取消波次"); } //波次单存在的物料 var itemBoc = deleteWareOrderDetails.FirstOrDefault(x => x.MaterialCode == item.MaterialCode && x.RelationNoLineNumber == item.LineNumber && x.RelationNo == item.MovementNo); if (itemBoc != null) { if (itemBoc.Quantity < 0) { throw Oops.Oh($"物料{item.MaterialCode}下架单号{item.MovementNo}下架单行号{item.LineNumber},数量小于0!"); } item.CreateWaveQuantity -= itemBoc.Quantity; if (item.CreateWaveQuantity <= 0) { item.OrderStatus = OrderStatusEnum.新建; item.OrderStatusName = GetEnumDescriptionUtil.GetEnumDescription(OrderStatusEnum.新建); } else { item.OrderStatus = OrderStatusEnum.处理中; item.OrderStatusName = GetEnumDescriptionUtil.GetEnumDescription(OrderStatusEnum.处理中); } if (item.CreateWaveQuantity < 0) { throw Oops.Oh($"物料{item.MaterialCode}下架单号{item.MovementNo}下架单行号{item.LineNumber},波次数量小于0!"); } UpdateWmsOrderMovementDetailsList.Add(item); } } //下架单-主表状态 - 新建|处理中 List UpdateWmsOrderMovementList = new List(); var handleListXjdMain = await _WmsOrderMovementRep.GetListAsync(u => queryCodeList.Contains(u.OrderNo) && u.IsDelete == false); if (handleListXjdMain.Count <= 0) { throw Oops.Oh($"没有查到需要更新的下架单单号"); } var handleListXjdDetails = await _WmsOrderMovementDetailsRep.GetListAsync(u => queryCodeList.Contains(u.MovementNo) && u.IsDelete == false); foreach (var item in handleListXjdMain) { if (item.OrderStatus == OrderStatusEnum.已取消 || item.OrderStatus == OrderStatusEnum.已关闭) { throw Oops.Oh($"下架单{item.OrderNo}状态{item.OrderStatusName},不允许取消波次"); } var totalXjdDetailStatusWc = handleListXjdDetails.Where(x => x.MovementNo == item.OrderNo && x.OrderStatus == OrderStatusEnum.已完成).Count(); var totalXjdDetailStatus = handleListXjdDetails.Where(x => x.MovementNo == item.OrderNo && x.OrderStatus == OrderStatusEnum.处理中).Count(); var changeXjdDetailStatus = UpdateWmsOrderMovementDetailsList.Where(x => x.MovementNo == item.OrderNo && x.OrderStatus == OrderStatusEnum.新建).Count(); if (totalXjdDetailStatus <= changeXjdDetailStatus && totalXjdDetailStatusWc<=0) { item.OrderStatus = OrderStatusEnum.新建; item.OrderStatusName = GetEnumDescriptionUtil.GetEnumDescription(OrderStatusEnum.新建); } else { item.OrderStatus = OrderStatusEnum.处理中; item.OrderStatusName = GetEnumDescriptionUtil.GetEnumDescription(OrderStatusEnum.处理中); } UpdateWmsOrderMovementList.Add(item); } //-------- ly 绑定的DO 波次数 和 状态回退 已关闭的DO单不允许取消------------ var WmsOrderDeliverDetailsArr = new List(); var WmsOrderDeliverArr = new List(); List queryCodeListForDo = handleListXjdDetails.Where(v => !string.IsNullOrWhiteSpace(v.RelationNo)).Select(v => v.RelationNo).Distinct().ToList(); if (queryCodeListForDo.Count > 0) { var handleListForDo = await _WmsOrderDeliverDetailsRep.GetListAsync(u => queryCodeListForDo.Contains(u.DoNo) && u.IsDelete == false); foreach (var w in handleListForDo) { //下架单物料 var item = handleListXjdDetails.FirstOrDefault(x => x.MaterialCode == w.MaterialCode && x.RelationNoLineNumber == w.DoLineNumber && x.RelationNo == w.DoNo); if (item != null ) { //波次物料 - 回退数量 var itemBc = deleteWareOrderDetails.FirstOrDefault(x => x.MaterialCode == item.MaterialCode && x.RelationNoLineNumber == item.LineNumber && x.RelationNo == item.MovementNo); if (itemBc != null) { var hasUseBoQty = w.CreateMovementQuantity; w.CreateMovementQuantity = w.CreateMovementQuantity - itemBc.Quantity; if (w.CreateMovementQuantity < 0) { throw Oops.Oh($"创建失败:DO单号{w.DoNo},物料编号{w.MaterialCode},DO行号{w.DoLineNumber},订单数{w.Quantity},已创建的波次数{hasUseBoQty},无可用回退数量{itemBc.Quantity}!"); } if (w.CreateMovementQuantity <= 0) { w.DoDetailStatus = OrderStatusEnum.新建; w.DoDetailStatusName = GetEnumDescriptionUtil.GetEnumDescription(OrderStatusEnum.新建); } else { w.DoDetailStatus = OrderStatusEnum.处理中; w.DoDetailStatusName = GetEnumDescriptionUtil.GetEnumDescription(OrderStatusEnum.处理中); } WmsOrderDeliverDetailsArr.Add(w); } } } if (WmsOrderDeliverDetailsArr.Count > 0) { var handleListForDoMain = await _WmsOrderDeliverRep.GetListAsync(u => queryCodeListForDo.Contains(u.DeliverNo) && u.IsDelete == false); if (handleListForDoMain == null || handleListForDoMain.Count <= 0) { throw Oops.Oh("创建失败:没有找到主DO订单单号"); } var handleListForDoOld = await _WmsOrderDeliverDetailsRep.GetListAsync(u => queryCodeListForDo.Contains(u.DoNo) && u.IsDelete == false); foreach (var w in handleListForDoMain) { if (w.DoStatus == OrderStatusEnum.处理中) { var totalDoStatusWc = handleListForDoOld.Where(x => x.DoNo == w.DeliverNo && x.IsDelete == false && x.DoDetailStatus == OrderStatusEnum.已完成).Count(); var totalDoStatus = handleListForDoOld.Where(x => x.DoNo == w.DeliverNo && x.IsDelete == false && x.DoDetailStatus == OrderStatusEnum.处理中).Count(); var changeStatus = WmsOrderDeliverDetailsArr.Where(x => x.DoNo == w.DeliverNo && x.IsDelete == false && x.DoDetailStatus == OrderStatusEnum.新建).Count(); var qtybcs = totalDoStatus - changeStatus; //所有处理中 - 撤回的处理中 if (qtybcs <= 0 && totalDoStatusWc<=0) { w.DoStatus = OrderStatusEnum.新建; w.DoStatusName = GetEnumDescriptionUtil.GetEnumDescription(OrderStatusEnum.新建); } else { w.DoStatus = OrderStatusEnum.处理中; w.DoStatusName = GetEnumDescriptionUtil.GetEnumDescription(OrderStatusEnum.处理中); } WmsOrderDeliverArr.Add(w); } } } //------------更新DO---------- } try { await _rep.AsTenant().BeginTranAsync(); if (entity != null) { await _rep.UpdateAsync(entity); //更新波次单-主表状态 } if (deleteWareOrderDetails.Count > 0) { await _WmsOrderSortDetailsRep.UpdateRangeAsync(deleteWareOrderDetails); //更新波次单-明细状态 } if (UpdateWmsOrderMovementList.Count > 0) { await _WmsOrderMovementRep.UpdateRangeAsync(UpdateWmsOrderMovementList); //更新下架单-主表状态 - 新建 } if (UpdateWmsOrderMovementDetailsList.Count > 0) { await _WmsOrderMovementDetailsRep.UpdateRangeAsync(UpdateWmsOrderMovementDetailsList); //更新下架单-明细状态 - 新建|执行中 波次数 } if (WmsOrderDeliverArr.Count > 0) { await _WmsOrderDeliverRep.UpdateRangeAsync(WmsOrderDeliverArr); //更新DO单主表 } if (WmsOrderDeliverDetailsArr.Count > 0) { await _WmsOrderDeliverDetailsRep.UpdateRangeAsync(WmsOrderDeliverDetailsArr); //更新DO单明细表 - 新建|执行中 波次数 } await _rep.AsTenant().CommitTranAsync(); } catch { await _rep.AsTenant().RollbackTranAsync(); throw; } } /// /// 更新波次单 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Update")] [Description("WmsOrderSort/Update")] public async Task Update(UpdateWmsOrderSortInput input) { var entity = input.Adapt(); //重复性验证 await CheckExist(entity,true); await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); } /// /// 获取波次单 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "Detail")] [Description("WmsOrderSort/Detail")] public async Task Detail([FromQuery] QueryByIdWmsOrderSortInput input) { return await _rep.GetFirstAsync(u => u.Id == input.Id); } #region 私有方法 /// /// 公共查询波次单条件 /// /// /// private ISugarQueryable CommonPageFilter(WmsOrderSortInput input) { //ly0802-关联单号查询 List queryOderNosForRelationNos = null; if (!string.IsNullOrEmpty(input.RelationNo)) { queryOderNosForRelationNos = _WmsOrderSortDetailsRep.AsQueryable() .Where(x => x.RelationNo == input.RelationNo).Select(x => x.SortNo).Distinct().ToList(); } var query = _rep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => u.SortNo.Contains(input.SearchKey.Trim()) || u.OrderTypeName.Contains(input.SearchKey.Trim()) || u.BusinessTypeName.Contains(input.SearchKey.Trim()) || u.SortStatusName.Contains(input.SearchKey.Trim()) || u.ErpOrderNo.Contains(input.SearchKey.Trim()) || u.RelationNo.Contains(input.SearchKey.Trim()) || u.Remarks.Contains(input.SearchKey.Trim()) || u.CreateUserName.Contains(input.SearchKey.Trim()) || u.UpdateUserName.Contains(input.SearchKey.Trim()) ) .WhereIF(!string.IsNullOrWhiteSpace(input.SortNo), u => u.SortNo.Contains(input.SortNo.Trim())) .WhereIF(input.OrderType.HasValue, u => u.OrderType == input.OrderType) .WhereIF(!string.IsNullOrWhiteSpace(input.OrderTypeName), u => u.OrderTypeName.Contains(input.OrderTypeName.Trim())) .WhereIF(input.BusinessType.HasValue, u => u.BusinessType == input.BusinessType) .WhereIF(!string.IsNullOrWhiteSpace(input.BusinessTypeName), u => u.BusinessTypeName.Contains(input.BusinessTypeName.Trim())) .WhereIF(input.OrderSocure.HasValue, u => u.OrderSocure == input.OrderSocure) .WhereIF(input.SortStatus.HasValue, u => u.SortStatus == input.SortStatus) .WhereIF(!string.IsNullOrWhiteSpace(input.SortStatusName), u => u.SortStatusName.Contains(input.SortStatusName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.ErpOrderNo), u => u.ErpOrderNo.Contains(input.ErpOrderNo.Trim())) .WhereIF(queryOderNosForRelationNos != null, u => queryOderNosForRelationNos.Contains(u.SortNo)) .WhereIF(!string.IsNullOrWhiteSpace(input.Remarks), u => u.Remarks.Contains(input.Remarks.Trim())) .Select(); return query; } /// /// 重复性验证 /// /// 验证对象 /// 是否是编辑 /// private async Task CheckExist( WmsOrderSort input,bool isEdit=false) { //没有配置组合校验,不需要验重 //没有配置单独校验,不需要验重 } /// /// 根据组合校验和单独校验验证数据是否已存在-导入时验证 /// /// /// private async Task CheckExisitForImport(List inputs) { if (inputs?.Count <= 0) { throw Oops.Oh($"导入数据不能为空"); } //根据组合校验验证表格中中是否已存在相同数据 //根据单独校验验证表格中中是否已存在相同数据 } #endregion }