using Model.InterFaceModel; using SqlSugar; using System; using System.Collections.Generic; using System.Text; using WMS.DAL; using WMS.Entity.BllAsnEntity; using WMS.Entity.Context; using WMS.Entity.DataEntity; using WMS.Entity.LogEntity; using WMS.Entity.SysEntity; using WMS.IBLL.IBllTransServer; namespace WMS.BLL.BllTransServer { public class NoticeServer : DbHelper, INoticeServer { private static readonly SqlSugarScope Db = DataContext.Db; public NoticeServer() : base(Db) { } /// /// 下发入库单 /// /// /// public ErpModel CreateAsn(AsnInfo model) { try { var resultModel = new ErpModel() { Success = -1, Message = "" }; if (string.IsNullOrEmpty(model.OrderCode)) { resultModel.Message = "上游系统单号不可为空!"; return resultModel; } if (model.AsnDetails.Count <= 0) { resultModel.Message = "入库单明细不可为空!"; return resultModel; } // 入库总表信息 string asnNo = new Common().GetMaxNo("ASN"); var asnModel = new BllArrivalNotice() { ASNNo = asnNo, Status = "0",//等待执行 Type = "0",//原料入库 Origin = string.IsNullOrEmpty(model.Origin) ? "MES" : model.Origin, CustomerNo = model.Customer, CustomerName = "", OrderCode = model.OrderCode, }; // 入库明细表信息 List detailModels = new List(); foreach (AsnDetail asnDetailModel in model.AsnDetails) { if (string.IsNullOrEmpty(asnDetailModel.SkuNo)) { resultModel.Message = "物料编码不可为空!"; return resultModel; } if (string.IsNullOrEmpty(asnDetailModel.SkuName)) { resultModel.Message = "物料名称不可为空!"; return resultModel; } if (asnDetailModel.Qty <= 0) { resultModel.Message = "数量应大于0!"; return resultModel; } if (string.IsNullOrEmpty(asnDetailModel.LotNo)) { resultModel.Message = "批次号不可为空!"; return resultModel; } var detailModel = new BllArrivalNoticeDetail() { ASNNo = asnNo, OrderDetailCode = asnDetailModel.OrderDetailCode, SkuNo = asnDetailModel.SkuNo, SkuName = asnDetailModel.SkuName, LotNo = asnDetailModel.LotNo, LotText = "", Qty = (decimal)asnDetailModel.Qty,//这里是桶数量 FactQty = 0, CompleteQty = 0, SupplierLot = asnDetailModel.SupplierLot, Status = "0", IsSampling = "0", InspectStatus = "0", CreateUser = 0 }; detailModels.Add(detailModel); } Db.BeginTran(); // 插入入库单总表 Db.Insertable(asnModel).ExecuteCommand(); // 插入入库单明细表 Db.Insertable(detailModels).ExecuteCommand(); Db.CommitTran(); resultModel.Success = 0; resultModel.Message = "成功"; return resultModel; } catch (Exception ex) { Db.RollbackTran(); throw ex; } } /// /// 任务完成 /// /// /// /// public ErpModel FinishTask(string TaskNo,string Status) { try { #region 条件判断 var resultModel = new ErpModel() { Success = -1, Message = "" }; if (string.IsNullOrEmpty(TaskNo)) { resultModel.Message = "任务号不可为空!"; return resultModel; } //任务信息 var taskInfo = Db.Queryable().First(w => w.TaskNo == TaskNo); if (taskInfo == null) { resultModel.Message = $"任务号为:{TaskNo}的任务不存在!"; return resultModel; } if (taskInfo.Status != "1") { resultModel.Message = $"任务号为:{TaskNo}的任务状态异常!"; return resultModel; } #endregion //开启事务 Db.BeginTran(); var comTime = DateTime.Now; if (Status == "0") { taskInfo.Status = "3";//异常结束 //修改任务状态 Db.Updateable(taskInfo).ExecuteCommand(); resultModel.Success = 0; resultModel.Message = "成功"; return resultModel; } switch (taskInfo.OrderType) { //入库完成 case "0": //入库单明细信息 var noticeDetail = Db.Queryable().First(w => w.Id == taskInfo.ASNDetailNo); if (noticeDetail == null) { resultModel.Message = "该任务对应的入库单明细不存在!"; return resultModel; } //入库单信息 var notice = Db.Queryable().First(w => w.ASNNo == noticeDetail.ASNNo); if (notice == null) { resultModel.Message = "该任务对应的入库单不存在!"; return resultModel; } if (notice.Status == "3" || notice.Status == "4") { resultModel.Message = "该任务对应的入库单已执行完成!"; return resultModel; } //目标储位信息 var locatInfo = Db.Queryable().First(w => w.LocatNo == taskInfo.EndLocat && w.IsDel == "0"); if (locatInfo == null) { resultModel.Message = "目标储位信息不存在!"; return resultModel; } //库存明细 var sd1 = new DataStockDetail() { LotNo = noticeDetail.LotNo, LotText = noticeDetail.LotText, SupplierLot = noticeDetail.SupplierLot, SkuNo = noticeDetail.SkuNo, SkuName = noticeDetail.SkuName, Standard = noticeDetail.Standard, Qty = 1, LockQty = 0, FrozenQty = 0, InspectQty = 0, ASNNo = noticeDetail.ASNNo, ASNDetailNo = noticeDetail.Id, WareHouseNo = locatInfo.WareHouseNo,//所属仓库 RoadwayNo = locatInfo.RoadwayNo,//所属巷道 AreaNo = locatInfo.AreaNo,//所属区域 LocatNo = locatInfo.LocatNo,//储位地址 PalletNo = taskInfo.PalletNo, PalletNo2 = "", PalletNo3 = "", PalletTags = "0", CompleteTime = comTime, ProductionTime = null, ExpirationTime = null, Status = "0", InspectMark = "0", InspectStatus = "0",//待检验 BitPalletMark = "0", PackagNo = "", IsBale = "0", IsBelt = "0", IsDel = "0", CreateUser = 0, CreateTime = comTime }; //插入库存明细 Db.Insertable(sd1).ExecuteCommand(); noticeDetail.CompleteQty += 1;//完成数量 noticeDetail.Status = "1";//0:等待执行 1:正在执行 2:执行完成 if (noticeDetail.CompleteQty >= noticeDetail.Qty) { noticeDetail.Status = "2"; noticeDetail.CompleteTime = comTime; } noticeDetail.UpdateUser = 0; noticeDetail.UpdateTime = comTime; //更新入库单明细 Db.Updateable(noticeDetail).ExecuteCommand(); notice.UpdateUser = 0; notice.UpdateTime = comTime; if (notice.Status == "0") { notice.Status = "1"; } var asnDetailNum = Db.Queryable().Count(m => m.IsDel == "0" && m.ASNNo == noticeDetail.ASNNo && m.Status != "2"); if (asnDetailNum == 0) { notice.Status = "2"; notice.CompleteTime = comTime;//完成时间 } //更新入库单 Db.Updateable(notice).ExecuteCommand(); locatInfo.Status = "1";//有物品 //更新储位状态 Db.Updateable(locatInfo).ExecuteCommand(); break; } taskInfo.Status = "2";//执行完成 //修改任务状态 Db.Updateable(taskInfo).ExecuteCommand(); //提交事务 Db.CommitTran(); resultModel.Success = 0; resultModel.Message = "成功"; return resultModel; } catch (Exception ex) { //回滚事务 Db.RollbackTran(); throw ex; } } /*public SoResInfo ErpAddExportNotice(SoInfo model) { try { if (string.IsNullOrEmpty(model.SoType)) { throw new Exception("单据类型不可为空!"); } if (string.IsNullOrEmpty(model.OrderCode)) { throw new Exception("系统单号不可为空!"); } if (model.SoDetails.Count <= 0) { throw new Exception("出库单明细不可为空!"); } //返回信息 SoResInfo result = new SoResInfo(); //获取库存明细 var stockDetailList = Db.Queryable().Where(s => skuNos.Contains(s.SkuNo) && (s.Qty - s.FrozenQty - s.LockQty) > 0 && s.InspectStatus == "1").ToList(); //获取库存 var stockList = Db.Queryable().Where(s => skuNos.Contains(s.SkuNo) && (s.Qty - s.FrozenQty - s.LockQty) > 0).ToList(); string CustomerName = string.Empty; if (!string.IsNullOrEmpty(model.Customer)) { //客户信息 var customer = Db.Queryable().First(m => m.IsDel == "0" && m.CustomerNo == model.Customer); if (customer == null) { throw new Exception("客户信息不存在!"); } CustomerName = customer.CustomerName; } //承运商信息 var logistics = Db.Queryable().First(m => m.IsDel == "0" && m.CarrierName == model.LogisticsNo); int? logisticsId = null; if (logistics != null) { logisticsId = logistics.Id; } var billNo = ""; var bl = true; do { //获取自增单据号 billNo = new Common().GetMaxNo("SO"); var no = billNo; bl = Db.Queryable().Any(m => m.SONo == no); } while (bl); List soDetailList = new List(); //开启事务 Db.BeginTran(); try { var list = new List(); //添加出库单 foreach (var d in model.SoDetails) { if (d.Qty < 1) { throw new Exception("出库数量必须大于0"); } var sku = skuList.FirstOrDefault(a => a.SkuNo == d.SkuNo); if (sku == null) { throw new Exception($"物料信息中未查询到出库物料信息:{d.SkuNo}"); } //0:成品出库、1:领料出库、3:物料取样出库、4:不合格品出库、6:代储出库、7:其他出库、 ///2:抽检出库、5:中间品出库、8:寄存出库 if (model.SoType == "0" || model.SoType == "3" || model.SoType == "4" || model.SoType == "7") { if (string.IsNullOrWhiteSpace(d.LotNo)) { throw new Exception("批次不可为空!"); } } //库存明细 List stockDetails; //指定批次 if (!string.IsNullOrWhiteSpace(d.LotNo)) { stockDetails = stockDetailList.Where(s => s.SkuNo == d.SkuNo && s.LotNo == d.LotNo).ToList(); if (stockDetails.Count < 1) { throw new Exception($"库存中未查询到出库物料信息:{d.SkuNo}"); } //判断数量 var qty = stockDetails.Sum(s => s.Qty - s.FrozenQty - s.LockQty); if (d.Qty > qty) { throw new Exception($"总库存中出库物料信息:{d.SkuNo}、{d.LotNo} 库存数量不足"); } //库存信息 var stockInfo = stockList.First(w => w.SkuNo == d.SkuNo && w.LotNo == d.LotNo); if (stockInfo == null) { throw new Exception($"总库存中未查询到出库物料信息:{d.SkuNo}"); } //判断总库存数量 if (d.Qty > stockInfo.Qty - stockInfo.FrozenQty - stockInfo.LockQty) { throw new Exception($"总库存中出库物料信息:{d.SkuNo}、{d.LotNo} 库存数量不足"); } //添加出库单明细 var noticeDetail = new BllExportNoticeDetail() { SONo = billNo, SkuNo = sku.SkuNo, SkuName = sku.SkuName, Standard = sku.Standard, LotNo = d.LotNo, LotText = stockInfo.LotText, Qty = d.Qty, AllotQty = 0, FactQty = 0, CompleteQty = 0, PackagNo = sku.PackagNo, Price = sku.Price, Money = string.IsNullOrWhiteSpace(sku.Price.ToString()) ? null : sku.Price * d.Qty, IsBale = "", IsBelt = "", SupplierLot = stockInfo.SupplierLot, IsWave = "0", WaveNo = "", IsIssueLotNo = string.IsNullOrWhiteSpace(d.LotNo) ? "0" : "1", OrderDetailCode = d.OrderDetailCode, CreateUser = 0, }; list.Add(noticeDetail); //更新库存锁定数量 stockInfo.LockQty += d.Qty; var i = Db.Updateable(stockInfo).UpdateColumns(it => new { it.LockQty }).ExecuteCommand(); SoDetailInfo soDetail = new SoDetailInfo(); soDetail.OrderDetailCode = d.OrderDetailCode; soDetail.LockQty = d.Qty; soDetail.LotNo = d.LotNo; soDetailList.Add(soDetail); } else//未指定批次 { Dictionary dic = new Dictionary(); decimal q1 = 0; //首先查询当前这种物料批次号为空的 stockDetails = stockDetailList.Where(s => s.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(s.LotNo)).ToList(); if (stockDetails.Count > 0) { q1 = (decimal)stockDetails.Sum(s => s.Qty - s.FrozenQty - s.LockQty); //库存信息 var stockInfo = stockList.FirstOrDefault(w => w.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(w.LotNo)); if (stockInfo != null) { var q2 = stockInfo.Qty - stockInfo.FrozenQty - stockInfo.LockQty; if (q2 < q1) { q1 = q2; } if (d.Qty > q1) { dic.Add(stockInfo.Id, q1); } else { dic.Add(stockInfo.Id, d.Qty); } } } //如果批次号为空的数量不够,根据批次先进先出原则查找其它批次的 if (d.Qty > q1) { stockDetails = stockDetailList.Where(m => m.SkuNo == d.SkuNo && !string.IsNullOrWhiteSpace(m.LotNo)).OrderBy(s => s.LotNo).ToList(); foreach (var demo in stockDetails) { if (q1 >= d.Qty) { break; } var q2 = demo.Qty - demo.FrozenQty - demo.LockQty; //库存信息 var stockInfo = stockList.FirstOrDefault(w => w.SkuNo == d.SkuNo && w.LotNo == demo.LotNo); if (stockInfo == null) { continue; } decimal q4 = 0; if (dic.ContainsKey(stockInfo.Id)) { q4 = dic[stockInfo.Id]; } var q3 = stockInfo.Qty - stockInfo.FrozenQty - stockInfo.LockQty - q4; if (q3 < q2) { q2 = q3; } if (q2 > d.Qty - q1) { if (!dic.ContainsKey(stockInfo.Id)) { dic.Add(stockInfo.Id, d.Qty - q1); } else { //更新值 dic[stockInfo.Id] += d.Qty - q1; } q1 += d.Qty - q1; } else { if (!dic.ContainsKey(stockInfo.Id)) { dic.Add(stockInfo.Id, (decimal)q2); } else { //更新值 dic[stockInfo.Id] = dic[stockInfo.Id] + (decimal)q2; } q1 += (decimal)q2; } } } if (d.Qty > q1) { throw new Exception($"总库存中出库物料信息:{d.SkuNo} 库存数量不足"); } foreach (var s in dic) { var st = stockList.First(a => a.Id == s.Key); var item = new BllExportNoticeDetail() { SONo = billNo, OrderDetailCode = d.OrderDetailCode, SkuNo = sku.SkuNo, SkuName = sku.SkuName, Standard = sku.Standard, LotNo = st.LotNo, LotText = st.LotText, Qty = s.Value, AllotQty = 0, FactQty = 0, CompleteQty = 0, PackagNo = sku.PackagNo, Price = sku.Price, Money = string.IsNullOrWhiteSpace(sku.Price.ToString()) ? null : sku.Price * d.Qty, IsBale = "", IsBelt = "", SupplierLot = st.SupplierLot, IsWave = "0", WaveNo = "", IsIssueLotNo = string.IsNullOrWhiteSpace(d.LotNo) ? "0" : "1", CreateUser = 0, }; list.Add(item); st.LockQty += s.Value;//锁定数量 var i = Db.Updateable(st).UpdateColumns(it => new { it.LockQty }).ExecuteCommand(); SoDetailInfo soDetail = new SoDetailInfo(); soDetail.OrderDetailCode = d.OrderDetailCode; soDetail.LockQty = s.Value; soDetail.LotNo = st.LotNo; soDetailList.Add(soDetail); } } } var notice = new BllExportNotice() { SONo = billNo, OrderCode = model.OrderCode, Type = model.SoType, Status = "0", Origin = "WMS", CustomerNo = model.Customer, CustomerName = CustomerName, LogisticsId = logisticsId, IsWave = "0", WaveNo = "", IsDespatch = "0", CreateUser = 0, }; var n = Db.Insertable(notice).ExecuteCommand(); var m = Db.Insertable(list).ExecuteCommand(); if (n <= 0 || m <= 0) { Db.RollbackTran(); throw new Exception("操作失败"); } Db.CommitTran(); //回传上游系统锁定数量信息 result.Success = "0"; result.Message = "操作成功"; result.SoDetails = soDetailList; return result; } catch (Exception ex) { Db.RollbackTran(); throw new Exception(ex.Message); } } catch (Exception ex) { Db.RollbackTran(); throw new Exception(ex.Message); } }*/ } }