using MES.Service.DB; using MES.Service.Dto.service; using MES.Service.Dto.webApi; using MES.Service.Modes; using SqlSugar; namespace MES.Service.service.Warehouse; /// /// 销售托盘管理服务 /// public class SalesPalletManager : Repository { /// /// 获取销售托盘分页数据 /// /// 查询请求参数 /// public (List item, int TotalCount) GetSalesPalletPage(SalesPalletSearchDto request) { var query = Db.Queryable() .LeftJoin((z, a) => a.BillNo == z.BillNo) .LeftJoin((z, a, b) => a.ErpId == b.ErpHeadId && z.ItemId.ToString() == b.MaterialId) .LeftJoin((z, a, b, s) => s.Id.ToString() == b.MaterialId) .LeftJoin((z, a, b, s, u) => u.Id.ToString() == b.SalesUnitId) .LeftJoin((z, a, b, s, u, su) => su.Fcode == z.CheckUser) .LeftJoin((z, a, b, s, u, su, d) => d.DepotId.ToString() == b.Warehouse) .Where((z, a, b, s, u, su, d)=>z.SalesQuantity > 0) .WhereIF(!string.IsNullOrEmpty(request.BillNo), (z, a, b, s, u, su, d) => z.BillNo.Contains(request.BillNo)) .WhereIF(!string.IsNullOrEmpty(request.ItemNo), (z, a, b, s, u, su, d) => s.ItemNo.Contains(request.ItemNo)) .WhereIF(!string.IsNullOrEmpty(request.ItemName), (z, a, b, s, u, su, d) => s.ItemName.Contains(request.ItemName)) .WhereIF(request.Status.HasValue, (z, a, b, s, u, su, d) => z.Status == request.Status) .Select((z, a, b, s, u, su, d) => new SalesPalletQueryDto { Id = z.Id, Status = z.Status, CheckDate = z.CheckDate, CheckUser = su.Fname, BillNo = z.BillNo, ItemNo = s.ItemNo, ItemName = s.ItemName, ItemModel = s.ItemModel, UnitName = u.Fname, Xsdd = b.SalesQuantity, Yb = z.SalesQuantity, Wyj = a.BillNo + s.Id.ToString() }); var totalCount = 0; var items = query.ToPageList(request.PageIndex, request.Limit, ref totalCount); return (items, totalCount); } public List GetSalesPalletDetail(SalesPalletDetailQueryDto request) { var subQuery = Db.Queryable() .LeftJoin((a, b) => a.TicketNo == b.Daa001) .LeftJoin((a, b, it) => it.Id.ToString() == b.Daa002) .GroupBy((a, b, it) => new { a.Stackcode, it.Id }) .Select((a, b, it) => new { StackCode = a.Stackcode, ItemId = it.Id, ItemNo = SqlFunc.AggregateMax(it.ItemNo), ItemName = SqlFunc.AggregateMax(it.ItemName), ItemModel = SqlFunc.AggregateMax(it.ItemModel) }); var query = Db.Queryable() .LeftJoin(subQuery, (b, o) => b.Stackcode == o.StackCode) .Where((b, o) => b.Mid == request.Mid) .Select((b, o) => new SalesPalletDetailQueryDto { Id = b.Id, Mid = b.Mid, BillNo = b.BillNo, Stackcode = b.Stackcode, Qty = b.Qty, ItemNo = o.ItemNo, ItemName = o.ItemName, ItemModel = o.ItemModel }); return query.ToList(); } /// /// 创建销售订单发货 /// /// 发货请求参数 /// public int CreateSalesOrderShipping(CreateSalesOrderShippingRequestDto request) { //验证request.PalletIds是否为空 if (request.PalletIds == null || !request.PalletIds.Any()) { throw new Exception("销售托盘ID列表不能为空"); } //调用GetSalesPalletDetail方法拿到返回值 var allDetails = new List(); foreach (var palletId in request.PalletIds) { var detailQuery = new SalesPalletDetailQueryDto { Mid = palletId }; var details = GetSalesPalletDetail(detailQuery); allDetails.AddRange(details); } if (!allDetails.Any()) { throw new Exception("未找到销售托盘明细数据"); } //提取出结果集的Stackcode并去重 var stackCodes = allDetails .Where(d => !string.IsNullOrEmpty(d.Stackcode)) .Select(d => d.Stackcode) .Distinct() .ToList(); if (!stackCodes.Any()) { throw new Exception("未找到有效的栈板码"); } //select * from MES_INV_ITEM_STOCKS where STACKCODE in (Stackcode去重后的结果); var stockItems = Db.Queryable() .Where(s => stackCodes.Contains(s.StackCode) && s.Quantity > 0) .ToList(); if (!stockItems.Any()) { throw new Exception("未找到对应的库存数据"); } //调用MesInvItemStocksManager.CreateReturnMaterialRequest方法 var stockManager = new MesInvItemStocksManager(); var itemStockQuery = new ItemStockQueryDto { UserCode = request.UserCode, Station = request.Station, ItemBarcodes = stackCodes }; stockManager.CreateReturnMaterialRequest(itemStockQuery); return stackCodes.Count; } }