using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WCS.BLL.DbModels; using WCS.BLL.Manager; using WCS.BLL.Services.IService; using WCS.DAL.Db; using WCS.Model; namespace WCS.BLL.Services.Service { public class OutstoreService : IOutstoreService { public OutstoreService() { } public async Task SysOutOrderByMatCode(SysOutOrderByMatCodeRequest request) { //参数合法性校验 if (request.ItemList == null || request.ItemList.Count == 0) { return new ResponseBase() { Code = 201, Message = "单据同步失败:缺少需要出库的物料类型!" }; } //判断是否有单据号 没有单据号系统自动生成一个 if (string.IsNullOrEmpty(request.OrderNumber)) { request.OrderNumber = GetOrderNumber(); } Console.WriteLine(DateTime.Now); //保存数据 await DbHelp.db.BeginTranAsync(); try { var order = new OutOrder() { OrderNumber = request.OrderNumber, OrderSource = request.OrderSource, OrderType = request.OrderType, CreateUser = request.UserName, }; order.Id = await DbHelp.db.Insertable(order).ExecuteReturnIdentityAsync(); request.ItemList.ForEach(async item => { var orderDetail = new OutOrderDetail() { OrderId = order.Id, OrderNumber = order.OrderNumber, MatCode = item.MatCode, MatBatch = item.MatBatch, ReqQty = item.ReqQty, CreateUser = request.UserName }; await DbHelp.db.Insertable(orderDetail).ExecuteCommandAsync(); }); await DbHelp.db.CommitTranAsync(); return new ResponseCommon() { Code = 200, Message = "单据同步成功!" }; ; } catch (Exception ex) { await DbHelp.db.RollbackTranAsync(); Console.WriteLine(ex.Message); return new ResponseBase() { Code = 200, Message = $"单据同步失败:{ex.Message}" }; } } public async Task SysOutOrderByMatSn(SysOutOrderByMatSnRequest request) { //参数合法性校验 if (request.SnList == null || request.SnList.Count == 0) { return new ResponseBase() { Code = 201, Message = "单据同步失败:缺少物料明细!" }; } //库存有无校验 & 库存已锁校验 try { await DbHelp.db.BeginTranAsync(); var inventoryDetails = await DbHelp.db.Queryable() .Where(t => request.SnList.Contains(t.MatSN)) .TranLock(DbLockType.Wait) .ToListAsync(); if (inventoryDetails.Count < request.SnList.Count)//库存的物料少于需求的物料数量 { var existsSns = inventoryDetails.Select(t => t.MatSN).ToList(); request.SnList.RemoveAll(t => existsSns.Contains(t)); await DbHelp.db.RollbackTranAsync(); //返回提示哪些物料库存不存在 return new ResponseCommon() { Code = 201, Message = "单据同步失败:存在物料不在库存中!", Data = request.SnList }; } else if (inventoryDetails.Where(t => t.IsLocked).Any()) { await DbHelp.db.RollbackTranAsync(); //返回提示哪些物料库存已被锁定 return new ResponseCommon() { Code = 201, Message = "单据同步失败:存在物料被锁定!", Data = inventoryDetails.Where(t => t.IsLocked).Select(t => t.MatSN).ToList() }; } //判断是否有单据号 没有单据号系统自动生成一个 if (string.IsNullOrEmpty(request.OrderNumber)) { request.OrderNumber = GetOrderNumber(); } #region 保存数据 //锁库存 inventoryDetails.ForEach(t => { t.IsLocked = false; }); var lockTask = DbHelp.db.Updateable(inventoryDetails).ExecuteCommandAsync(); //保存数据 var order = new OutOrder() { OrderNumber = request.OrderNumber, OrderSource = request.OrderSource, OrderType = request.OrderType, CreateUser = request.UserName, }; order.Id = await DbHelp.db.Insertable(order).ExecuteReturnIdentityAsync(); //通过库存数据保存出库物料明细表 var matDetailTasks = inventoryDetails.Select(async t => { var orderMatDetail = new OutOrderMatDetail() { OrderId = order.Id, OrderNumber = order.OrderNumber, InventoryDetailId = t.Id, StoreId = t.StoreId, StoreCode = t.StoreCode, MatSN = t.MatSN, MatCode = t.MatCode, MatName = t.MatName, MatSpec = t.MatSpec, MatBatch = t.MatBatch, MatQty = t.MatQty, MatSupplier = t.MatSupplier, MatCustomer = t.MatCustomer, CreateUser = request.UserName }; await DbHelp.db.Insertable(orderMatDetail).ExecuteCommandAsync(); }).ToList(); await lockTask; await Task.WhenAll(matDetailTasks); await DbHelp.db.CommitTranAsync(); return new ResponseCommon() { Code = 200, Message = $"单据同步成功!", Data = order.Id }; #endregion } catch (Exception ex) { await DbHelp.db.RollbackTranAsync(); return new ResponseBase() { Code = 201, Message = $"单据同步失败:{ex.Message}" }; } } public async Task GetOutOrderList(GetOutOrderListRequest request) { //直接查询 var outOrderList = await DbHelp.db.Queryable() .WhereIF(!string.IsNullOrEmpty(request.OrderNumber), t => t.OrderNumber.Contains(request.OrderNumber)) .Skip((request.PageNumber - 1) * request.PageSize).Take(request.PageSize) .ToListAsync(); return new PageQueryResponse() { Code = 200, Message = "success", Data = new PageQueryResponseData() { Lists = outOrderList, Count = outOrderList.Count } }; } public async Task GetOutOrderDetail(GetOutOrderDetailRequest request) { OutOrder outOrder = null; #region 查询出库单 if (request.OrderId != 0) { outOrder = await DbHelp.db.Queryable().Where(t => t.Id == request.OrderId).FirstAsync(); if (outOrder == null) { return new ResponseCommon() { Code = 201, Message = $"查询失败:不存在Id为{request.OrderId}的出库单!", }; } } else if (string.IsNullOrEmpty(request.OrderNumber)) { outOrder = await DbHelp.db.Queryable().Where(t => t.OrderNumber == request.OrderNumber) .FirstAsync(); if (outOrder == null) { return new ResponseCommon() { Code = 201, Message = $"查询失败:不存在单据号为{request.OrderNumber}的出库单!", }; } } else { return new ResponseCommon() { Code = 201, Message = $"查询失败:缺少必要参数!", }; } #endregion #region 查询出库单明细 var orderDetailTask = DbHelp.db.Queryable() .Where(t => t.OrderId == outOrder.Id) .ToListAsync(); #endregion #region 出库物料明细 var orderMatDetailTask = DbHelp.db.Queryable() .Where(t => t.OrderId == outOrder.Id) .ToListAsync(); #endregion var orderDetail = await orderDetailTask; var orderMatDetail = await orderMatDetailTask; return new ResponseCommon() { Code = 200, Message = "Success", Data = new { OrderDetailLists = orderDetail, OrderMatDetailLists = orderMatDetail, } }; } private string GetOrderNumber() { var orderNumber = "PD" + DateTime.Now.ToString("yyyyMMddHHmmss"); return orderNumber; } public async Task GoInOutstore(GetOutOrderDetailRequest request) { //先找到所有物料 //分组 按物料找到对应得货架编码 //对应的货架进入出库模式 亮灯 //返回 return new ResponseCommon() { Code = 200, Message = "Success", Data = null }; } public async Task GoOutOutstore(GetOutOrderDetailRequest request) { //找到出库单号一致的货架列表 var shelves = ShelfManager.Shelves.Where(t => t.OutOrderNumber == request.OrderNumber) .ToList(); //退出出库模式 shelves.ForEach(t => { t.GoOutOutstore(); }); return new ResponseCommon() { Code = 200, Message = "Success", Data = null }; } } }