| | |
| | | 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 NoticeServer() : base(Db) |
| | | { |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 下发入库单 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | public ErpModel CreateAsn(AsnInfo model) |
| | | { |
| | | try |
| | |
| | | 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 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<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 = "成功"; |
| | | return resultModel; |
| | | } |
| | | switch (taskInfo.OrderType) |
| | | { |
| | | //入库完成 |
| | | case "0": |
| | | //入库单明细信息 |
| | | var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().First(w => w.Id == taskInfo.ASNDetailNo); |
| | | if (noticeDetail == null) |
| | | { |
| | | resultModel.Message = "该任务对应的入库单明细不存在!"; |
| | | return resultModel; |
| | | } |
| | | //入库单信息 |
| | | 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; |
| | | } |
| | | //目标储位信息 |
| | | var locatInfo = Db.Queryable<SysStorageLocat>().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<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(); |
| | | |
| | | 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<DataStockDetail>().Where(s => skuNos.Contains(s.SkuNo) && (s.Qty - s.FrozenQty - s.LockQty) > 0 && s.InspectStatus == "1").ToList(); |
| | | //获取库存 |
| | | var stockList = Db.Queryable<DataStock>().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<SysCustomer>().First(m => m.IsDel == "0" && m.CustomerNo == model.Customer); |
| | | if (customer == null) |
| | | { |
| | | throw new Exception("客户信息不存在!"); |
| | | } |
| | | CustomerName = customer.CustomerName; |
| | | } |
| | | //承运商信息 |
| | | var logistics = Db.Queryable<SysLogisticsInfo>().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<BllExportNotice>().Any(m => m.SONo == no); |
| | | } while (bl); |
| | | |
| | | List<SoDetailInfo> soDetailList = new List<SoDetailInfo>(); |
| | | //开启事务 |
| | | Db.BeginTran(); |
| | | try |
| | | { |
| | | var list = new List<BllExportNoticeDetail>(); |
| | | //添加出库单 |
| | | 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<DataStockDetail> 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<int, decimal> dic = new Dictionary<int, decimal>(); |
| | | 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<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); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Db.RollbackTran(); |
| | | throw new Exception(ex.Message); |
| | | } |
| | | }*/ |
| | | } |
| | | } |