| | |
| | | using Model.InterFaceModel; |
| | | using Newtonsoft.Json; |
| | | using SqlSugar; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using Utility.Tools; |
| | | using WMS.BLL.LogServer; |
| | | using WMS.DAL; |
| | | using WMS.Entity.BllAsnEntity; |
| | | using WMS.Entity.BllQualityEntity; |
| | | using WMS.Entity.BllSoEntity; |
| | | using WMS.Entity.Context; |
| | | using WMS.Entity.DataEntity; |
| | | using WMS.Entity.LogEntity; |
| | | using WMS.Entity.SysEntity; |
| | | using WMS.IBLL.IBllTransServer; |
| | | using static Model.InterFaceModel.RCSModel; |
| | | |
| | | namespace WMS.BLL.BllTransServer |
| | | { |
| | |
| | | public NoticeServer() : base(Db) |
| | | { |
| | | } |
| | | |
| | | public ErpModel CreateAsn(AsnInfo model) |
| | | /// <summary> |
| | | /// 下发入库单 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | public ErpModel CreateAsnWork(AsnInfo model) |
| | | { |
| | | try |
| | | { |
| | |
| | | Origin = string.IsNullOrEmpty(model.Origin) ? "MES" : model.Origin, |
| | | CustomerNo = model.Customer, |
| | | CustomerName = "", |
| | | OrderCode = model.OrderCode, |
| | | OrderCode = model.OrderCode |
| | | }; |
| | | |
| | | // 入库明细表信息 |
| | |
| | | SkuName = asnDetailModel.SkuName, |
| | | LotNo = asnDetailModel.LotNo, |
| | | LotText = "", |
| | | Qty = (decimal)asnDetailModel.Qty, |
| | | Qty = (decimal)asnDetailModel.Qty,//这里是桶数量 |
| | | FactQty = 0, |
| | | CompleteQty = 0, |
| | | SupplierLot = asnDetailModel.SupplierLot, |
| | |
| | | throw ex; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 任务完成 |
| | | /// </summary> |
| | | /// <param name="TaskNo"></param> |
| | | /// <param name="Status"></param> |
| | | /// <returns></returns> |
| | | public ErpModel RCSFinishTask(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<LogTask>().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 = "成功"; |
| | | |
| | | //提交事务 |
| | | Db.CommitTran(); |
| | | |
| | | return resultModel; |
| | | } |
| | | switch (taskInfo.OrderType) |
| | | { |
| | | #region 入库完成 |
| | | case "0": |
| | | |
| | | //目标储位信息 |
| | | var locatInfo = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == taskInfo.EndLocat && w.IsDel == "0"); |
| | | if (locatInfo == null) |
| | | { |
| | | resultModel.Message = "目标储位信息不存在!"; |
| | | return resultModel; |
| | | } |
| | | |
| | | //库存明细 |
| | | var sd1 = Db.Queryable<DataStockDetail>().First(w => w.PalletNo == taskInfo.PalletNo); |
| | | if (sd1 == null) |
| | | { |
| | | resultModel.Message = $"该桶对应的库存信息不存在,桶号:{taskInfo.PalletNo}!"; |
| | | return resultModel; |
| | | } |
| | | else |
| | | { |
| | | sd1.Qty = 1; |
| | | sd1.LockQty = 0; |
| | | sd1.FrozenQty = 0; |
| | | sd1.InspectQty = 0; |
| | | sd1.WareHouseNo = locatInfo.WareHouseNo;//所属仓库 |
| | | sd1.RoadwayNo = locatInfo.RoadwayNo;//所属巷道 |
| | | sd1.AreaNo = locatInfo.AreaNo;//所属区域 |
| | | sd1.LocatNo = locatInfo.LocatNo;//储位地址 |
| | | sd1.CompleteTime = comTime; |
| | | sd1.InspectStatus = "0";//待检验 |
| | | sd1.PalletStatus = "2";//半成品 |
| | | |
| | | //修改库存明细 |
| | | Db.Updateable(sd1).ExecuteCommand(); |
| | | } |
| | | locatInfo.Status = "1";//有物品 |
| | | //更新储位状态 |
| | | Db.Updateable(locatInfo).ExecuteCommand(); |
| | | |
| | | //入库单明细信息 |
| | | var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().First(w => w.Id == taskInfo.NoticeDetailNo); |
| | | if (noticeDetail != null) |
| | | { |
| | | //入库单信息 |
| | | var notice = Db.Queryable<BllArrivalNotice>().First(w => w.ASNNo == noticeDetail.ASNNo); |
| | | if (notice == null) |
| | | { |
| | | resultModel.Message = "该任务对应的入库单不存在!"; |
| | | return resultModel; |
| | | } |
| | | if (notice.Status == "3" || notice.Status == "4") |
| | | { |
| | | resultModel.Message = "该任务对应的入库单已执行完成!"; |
| | | return resultModel; |
| | | } |
| | | 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<BllArrivalNoticeDetail>().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(); |
| | | } |
| | | |
| | | #region 质检请验,去掉MES |
| | | //var qualityRequest = Db.Queryable<BllQualityInspectionRequest>().First(m => m.IsDel == "0" && m.SkuNo == noticeDetail.SkuNo && m.LotNo == noticeDetail.LotNo && m.SupplierLot == noticeDetail.SupplierLot); |
| | | //if (qualityRequest == null) |
| | | //{ |
| | | // //质检请验单信息 |
| | | // string qcNo = new Common().GetMaxNo("QC"); |
| | | // qualityRequest = new BllQualityInspectionRequest(); |
| | | // qualityRequest.QcNo = qcNo; |
| | | // qualityRequest.Status = "0"; |
| | | // qualityRequest.SkuNo = noticeDetail.SkuNo; |
| | | // qualityRequest.SkuName = noticeDetail.SkuName; |
| | | // qualityRequest.LotNo = noticeDetail.LotNo; |
| | | // qualityRequest.SupplierLot = noticeDetail.SupplierLot; |
| | | // qualityRequest.Qty = noticeDetail.Qty; |
| | | // qualityRequest.SamplingQty = 0; |
| | | // qualityRequest.ASNNo = noticeDetail.ASNNo; |
| | | // qualityRequest.CreateUser = 0; |
| | | // qualityRequest.CreateTime = comTime; |
| | | |
| | | // // 记录任务日志 |
| | | // var taskNo = new Common().GetMaxNo("TK"); |
| | | // var exTask = new LogTask() |
| | | // { |
| | | // TaskNo = taskNo, |
| | | // Sender = "WMS", |
| | | // Receiver = "Limes", |
| | | // IsSuccess = 0,//是否下发成功 0失败 1成功 |
| | | // StartLocat = "",//起始位置 |
| | | // PalletNo = "",//托盘码 |
| | | // IsSend = 1,//是否可再次下发 |
| | | // IsCancel = 1,//是否可取消 |
| | | // IsFinish = 1,//是否可完成 |
| | | // Status = "0",//任务状态0:等待执行1正在执行2执行完成 |
| | | // OrderType = "5",//0 入库单 1 出库单 2 盘点单 3 移库单 4 取样出库单 5 其他 |
| | | // EndLocat = "",//目标位置 |
| | | // Type = "3",//任务类型 0 入库任务 1 出库任务 2 移库任务 |
| | | // Msg = "请验任务" |
| | | // }; |
| | | // // 插入任务日志 |
| | | // Db.Insertable(exTask).ExecuteCommand(); |
| | | |
| | | // // 调用Limes接口发起请验 |
| | | // var sendModel = new SendLimesModel() |
| | | // { |
| | | // QcNo = qualityRequest.QcNo, |
| | | // SkuNo = qualityRequest.SkuNo, |
| | | // Qty = qualityRequest.Qty.ToString(), |
| | | // LotNo = qualityRequest.LotNo, |
| | | // SupplierLot = qualityRequest.SupplierLot, |
| | | // RequestUser = "", // 请验人 |
| | | // }; |
| | | // var jsonData = JsonConvert.SerializeObject(sendModel); |
| | | // string response = ""; |
| | | // try |
| | | // { |
| | | // var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss") |
| | | // //response = HttpHelper.DoPost(url, jsonData, "上传Limes系统发起请验", "Limes"); |
| | | // var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss") |
| | | |
| | | // ////解析返回数据 |
| | | // //var limesModel = JsonConvert.DeserializeObject<LimesModel>(response); |
| | | // List<string> list1 = new List<string>(); |
| | | // list1.Add(taskNo); |
| | | // //if (limesModel.Success == 0) |
| | | // //{ |
| | | // //更改任务的发送返回时间// |
| | | // new TaskServer().EditTaskIssueOk(list1, time1, time2); |
| | | |
| | | // // 更新请验单信息 |
| | | // qualityRequest.Status = "1"; |
| | | // qualityRequest.SamplingQty = 10;//decimal.Parse(limesModel.SamplingQty); |
| | | // qualityRequest.RequestUser = 0; |
| | | // qualityRequest.RequestTime = DateTime.Now; |
| | | // qualityRequest.UpdateTime = DateTime.Now; |
| | | // qualityRequest.UpdateUser = 0; |
| | | // //添加质检请验单 |
| | | // Db.Insertable(qualityRequest).ExecuteCommand(); |
| | | // //} |
| | | // //if (limesModel.Success == -1) |
| | | // //{ |
| | | // // new TaskServer().EditTaskIssueNo(list1, time1, time2,limesModel.Message); |
| | | // // throw new Exception(limesModel.Message); |
| | | // //} |
| | | // } |
| | | // catch (Exception ex) |
| | | // { |
| | | // throw new Exception(ex.Message); |
| | | // } |
| | | //} |
| | | #endregion |
| | | |
| | | break; |
| | | #endregion |
| | | |
| | | #region 出库完成 |
| | | case "1": |
| | | |
| | | //起始储位信息 |
| | | var startLocatInfo = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == taskInfo.StartLocat && w.IsDel == "0"); |
| | | if (startLocatInfo == null) |
| | | { |
| | | resultModel.Message = "起始储位信息不存在!"; |
| | | return resultModel; |
| | | } |
| | | //库存明细 |
| | | var sd2 = Db.Queryable<DataStockDetail>().First(w => w.PalletNo == taskInfo.PalletNo); |
| | | if (sd2 == null) |
| | | { |
| | | resultModel.Message = "库存信息不存在!"; |
| | | return resultModel; |
| | | } |
| | | sd2.Qty = 0; |
| | | sd2.LockQty = 0; |
| | | sd2.FrozenQty = 0; |
| | | sd2.InspectQty = 0; |
| | | sd2.ASNNo = ""; |
| | | sd2.ASNDetailNo = null; |
| | | sd2.WareHouseNo = "";//所属仓库 |
| | | sd2.RoadwayNo = "";//所属巷道 |
| | | sd2.AreaNo = "";//所属区域 |
| | | sd2.LocatNo = "";//储位地址 |
| | | sd2.CompleteTime = comTime; |
| | | //修改库存明细 |
| | | Db.Updateable(sd2).ExecuteCommand(); |
| | | |
| | | startLocatInfo.Status = "0";//空储位 |
| | | //修改起始储位状态 |
| | | Db.Updateable(startLocatInfo).ExecuteCommand(); |
| | | //出库单明细信息 |
| | | var exNoticeDetail = Db.Queryable<BllExportNoticeDetail>().First(w => w.Id == taskInfo.NoticeDetailNo); |
| | | if (exNoticeDetail != null) |
| | | { |
| | | //出库单信息 |
| | | var exNotice = Db.Queryable<BllExportNotice>().First(w => w.SONo == exNoticeDetail.SONo); |
| | | if (exNotice == null) |
| | | { |
| | | resultModel.Message = "该任务对应的出库单不存在!"; |
| | | return resultModel; |
| | | } |
| | | if (exNotice.Status == "4" || exNotice.Status == "5") |
| | | { |
| | | resultModel.Message = "该任务对应的出库单已执行完成!"; |
| | | return resultModel; |
| | | } |
| | | exNotice.UpdateUser = 0; |
| | | exNotice.UpdateTime = comTime; |
| | | if (exNotice.Status == "0" || exNotice.Status == "1" || exNotice.Status == "2") |
| | | { |
| | | exNotice.Status = "3";//更改为正在执行 |
| | | } |
| | | var num = Db.Queryable<BllExportNoticeDetail>().Count(m => m.IsDel == "0" && m.SONo == exNoticeDetail.SONo && m.CompleteQty < m.Qty); |
| | | if (num <= 0) |
| | | { |
| | | exNotice.Status = "4"; //更改为执行完成 |
| | | } |
| | | //修改出库单信息 |
| | | Db.Updateable(exNotice).ExecuteCommand(); |
| | | |
| | | //修改出库单明细拣货数量 |
| | | exNoticeDetail.CompleteQty += sd2.Qty; |
| | | Db.Updateable(exNoticeDetail).ExecuteCommand(); |
| | | } |
| | | break; |
| | | #endregion |
| | | |
| | | #region 移库完成 |
| | | case "3": |
| | | //库存明细 |
| | | var sd3 = Db.Queryable<DataStockDetail>().First(w => w.PalletNo == taskInfo.PalletNo); |
| | | if (sd3 == null) |
| | | { |
| | | resultModel.Message = "库存信息不存在!"; |
| | | return resultModel; |
| | | } |
| | | if (taskInfo.Type == "0")//入库任务 |
| | | { |
| | | //目标储位信息 |
| | | var endLocatInfo2 = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == taskInfo.EndLocat && w.IsDel == "0"); |
| | | if (endLocatInfo2 == null) |
| | | { |
| | | resultModel.Message = "目标储位信息不存在!"; |
| | | return resultModel; |
| | | } |
| | | endLocatInfo2.Status = "1";//有物品 |
| | | //修改目标储位状态 |
| | | Db.Updateable(endLocatInfo2).ExecuteCommand(); |
| | | |
| | | sd3.WareHouseNo = endLocatInfo2.WareHouseNo;//所属仓库 |
| | | sd3.RoadwayNo = endLocatInfo2.RoadwayNo;//所属巷道 |
| | | sd3.AreaNo = endLocatInfo2.AreaNo;//所属区域 |
| | | sd3.LocatNo = endLocatInfo2.LocatNo;//储位地址 |
| | | if (endLocatInfo2.AreaNo.Contains("01"))//净桶区 |
| | | { |
| | | sd3.PalletStatus = "0"; |
| | | } |
| | | else if (endLocatInfo2.AreaNo.Contains("02"))//预混区 |
| | | { |
| | | sd3.PalletStatus = "1"; |
| | | } |
| | | else if (endLocatInfo2.AreaNo.Contains("03"))//半成品区 |
| | | { |
| | | sd3.PalletStatus = "2"; |
| | | } |
| | | else if (endLocatInfo2.AreaNo.Contains("04"))//脏桶区 |
| | | { |
| | | sd3.PalletStatus = "3"; |
| | | sd3.LotNo = "";//批次 |
| | | sd3.SkuNo = ""; |
| | | sd3.SkuName = ""; |
| | | sd3.InspectStatus = "0";//待检验 |
| | | } |
| | | } |
| | | else if (taskInfo.Type == "1")//出库任务 |
| | | { |
| | | //起始储位信息 |
| | | var startLocatInfo2 = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == taskInfo.StartLocat && w.IsDel == "0"); |
| | | if (startLocatInfo2 == null) |
| | | { |
| | | resultModel.Message = "起始储位信息不存在!"; |
| | | return resultModel; |
| | | } |
| | | startLocatInfo2.Status = "0";//空储位 |
| | | //修改起始储位状态 |
| | | Db.Updateable(startLocatInfo2).ExecuteCommand(); |
| | | |
| | | sd3.WareHouseNo = "";//所属仓库 |
| | | sd3.RoadwayNo = "";//所属巷道 |
| | | sd3.AreaNo = "";//所属区域 |
| | | sd3.LocatNo = "";//储位地址 |
| | | } |
| | | else if (taskInfo.Type == "2")//移库任务 |
| | | { |
| | | //起始储位信息 |
| | | var startLocatInfo2 = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == taskInfo.StartLocat && w.IsDel == "0"); |
| | | if (startLocatInfo2 == null) |
| | | { |
| | | resultModel.Message = "起始储位信息不存在!"; |
| | | return resultModel; |
| | | } |
| | | startLocatInfo2.Status = "0";//空储位 |
| | | //修改起始储位状态 |
| | | Db.Updateable(startLocatInfo2).ExecuteCommand(); |
| | | |
| | | //目标储位信息 |
| | | var endLocatInfo2 = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == taskInfo.EndLocat && w.IsDel == "0"); |
| | | if (endLocatInfo2 == null) |
| | | { |
| | | resultModel.Message = "目标储位信息不存在!"; |
| | | return resultModel; |
| | | } |
| | | endLocatInfo2.Status = "1";//有物品 |
| | | //修改目标储位状态 |
| | | Db.Updateable(endLocatInfo2).ExecuteCommand(); |
| | | |
| | | sd3.WareHouseNo = endLocatInfo2.WareHouseNo;//所属仓库 |
| | | sd3.RoadwayNo = endLocatInfo2.RoadwayNo;//所属巷道 |
| | | sd3.AreaNo = endLocatInfo2.AreaNo;//所属区域 |
| | | sd3.LocatNo = endLocatInfo2.LocatNo;//储位地址 |
| | | sd3.Status = "0"; |
| | | if (endLocatInfo2.AreaNo.Contains("01"))//洁净区 |
| | | { |
| | | sd3.PalletStatus = "0"; |
| | | sd3.Status = "0"; |
| | | } |
| | | else if (endLocatInfo2.AreaNo.Contains("02"))//预混区 |
| | | { |
| | | sd3.PalletStatus = "1"; |
| | | } |
| | | else if (endLocatInfo2.AreaNo.Contains("03"))//半成品区 |
| | | { |
| | | sd3.PalletStatus = "2"; |
| | | } |
| | | else if (endLocatInfo2.AreaNo.Contains("04"))//脏桶区 |
| | | { |
| | | sd3.PalletStatus = "3"; |
| | | sd3.LotNo = "";//批次 |
| | | sd3.SkuNo = ""; |
| | | sd3.SkuName = ""; |
| | | sd3.InspectStatus = "0";//待检验 |
| | | } |
| | | } |
| | | //修改库存明细 |
| | | Db.Updateable(sd3).ExecuteCommand(); |
| | | |
| | | #region 去掉MES |
| | | //回传桶状态给MES |
| | | //BackPalletStatus(taskInfo.PalletNo, sd3.PalletStatus); |
| | | #endregion |
| | | |
| | | break; |
| | | #endregion |
| | | } |
| | | taskInfo.Status = "2";//执行完成 |
| | | //修改任务状态 |
| | | Db.Updateable(taskInfo).ExecuteCommand(); |
| | | |
| | | //提交事务 |
| | | Db.CommitTran(); |
| | | |
| | | resultModel.Success = 0; |
| | | resultModel.Message = "成功"; |
| | | return resultModel; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | //回滚事务 |
| | | Db.RollbackTran(); |
| | | throw ex; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 回传桶状态给MES |
| | | /// </summary> |
| | | /// <param name="PalletNo">桶号</param> |
| | | /// <param name="Status">0:净桶 1:预混 2:半成品 3:脏桶</param> |
| | | /// <param name="url"></param> |
| | | public void BackPalletStatus(string PalletNo, string Status,string url="") |
| | | { |
| | | try |
| | | { |
| | | var obj = new |
| | | { |
| | | PalletNo = PalletNo, |
| | | Status = Status |
| | | }; |
| | | string jsonReq = JsonConvert.SerializeObject(obj); |
| | | var response = HttpHelper.DoPost(url, jsonReq, "回传MES桶状态", "MES").ToString(); |
| | | var result = JsonConvert.DeserializeObject<ReMes>(response);//解析返回数据 |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | throw ex; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 下发出库单 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | public SoResInfo CreateSoWork(SoInfo model) |
| | | { |
| | | try |
| | | { |
| | | if (string.IsNullOrEmpty(model.OrderCode)) |
| | | { |
| | | throw new Exception("上游系统单号不可为空!"); |
| | | } |
| | | if (model.SoDetails.Count <= 0) |
| | | { |
| | | throw new Exception("出库单明细不可为空!"); |
| | | } |
| | | //返回信息 |
| | | SoResInfo result = new SoResInfo(); |
| | | |
| | | var skuNos = model.SoDetails.Select(a => a.SkuNo).Distinct().ToList(); |
| | | //获取库存明细 |
| | | var stockDetailList = Db.Queryable<DataStockDetail>().Where(s => skuNos.Contains(s.SkuNo) && (s.Qty - s.FrozenQty - s.LockQty) > 0 && s.InspectStatus == "1").ToList(); |
| | | var billNo = ""; |
| | | var bl = true; |
| | | do |
| | | { |
| | | //获取自增单据号 |
| | | billNo = new Common().GetMaxNo("SO"); |
| | | var no = billNo; |
| | | bl = Db.Queryable<BllExportNotice>().Any(m => m.SONo == no); |
| | | } while (bl); |
| | | |
| | | List<SoDetailInfo> soDetailList = new List<SoDetailInfo>(); |
| | | //开启事务 |
| | | Db.BeginTran(); |
| | | |
| | | var list = new List<BllExportNoticeDetail>(); |
| | | //添加出库单 |
| | | foreach (var d in model.SoDetails) |
| | | { |
| | | if (d.Qty < 1) |
| | | { |
| | | throw new Exception("出库数量必须大于0"); |
| | | } |
| | | if (string.IsNullOrWhiteSpace(d.LotNo)) |
| | | { |
| | | throw new Exception("批次不可为空!"); |
| | | } |
| | | //库存明细 |
| | | List<DataStockDetail> stockDetails = stockDetailList.Where(s => s.SkuNo == d.SkuNo && s.LotNo == d.LotNo).OrderByDescending(o => o.CompleteTime).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 noticeDetail = new BllExportNoticeDetail() |
| | | { |
| | | SONo = billNo, |
| | | SkuNo = d.SkuNo, |
| | | SkuName = d.SkuName, |
| | | Standard = "", |
| | | LotNo = d.LotNo, |
| | | LotText = "", |
| | | Qty = d.Qty, |
| | | AllotQty = 0, |
| | | FactQty = 0, |
| | | CompleteQty = 0, |
| | | PackagNo = "", |
| | | Price = 0, |
| | | Money = 0, |
| | | IsBale = "", |
| | | IsBelt = "", |
| | | SupplierLot = "", |
| | | IsWave = "0", |
| | | WaveNo = "", |
| | | IsIssueLotNo = "1", |
| | | |
| | | OrderDetailCode = d.OrderDetailCode, |
| | | |
| | | CreateUser = 0, |
| | | }; |
| | | list.Add(noticeDetail); |
| | | //锁定库存数量 |
| | | decimal lockQty = 0; |
| | | foreach (var item in stockDetails) |
| | | { |
| | | if (lockQty >= d.Qty) |
| | | { |
| | | break; |
| | | } |
| | | if (item.Qty - item.LockQty - item.FrozenQty <= d.Qty - lockQty) |
| | | { |
| | | item.LockQty += item.Qty - item.LockQty - item.FrozenQty; |
| | | lockQty += (decimal)(item.Qty - item.LockQty - item.FrozenQty); |
| | | } |
| | | else |
| | | { |
| | | item.LockQty += d.Qty - lockQty; |
| | | lockQty += d.Qty - lockQty; |
| | | } |
| | | Db.Updateable(item).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); |
| | | } |
| | | //出库单信息 |
| | | var notice = new BllExportNotice() |
| | | { |
| | | SONo = billNo, |
| | | OrderCode = model.OrderCode, |
| | | Type = model.SoType, |
| | | Status = "0", |
| | | Origin = "WMS", |
| | | CustomerNo = model.Customer, |
| | | CustomerName = "", |
| | | LogisticsId = null, |
| | | IsWave = "0", |
| | | WaveNo = "", |
| | | IsDespatch = "0", |
| | | |
| | | CreateUser = 0, |
| | | }; |
| | | |
| | | var n = Db.Insertable<BllExportNotice>(notice).ExecuteCommand(); |
| | | var m = Db.Insertable<BllExportNoticeDetail>(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); |
| | | } |
| | | } |
| | | } |
| | | } |