Administrator
2024-06-19 5d9e0037e2690c79aae441d4b187167c9c8b4841
编写入库任务完成接口
2个文件已修改
499 ■■■■■ 已修改文件
Wms/WMS.BLL/BllTransServer/NoticeServer.cs 494 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.Entity/LogEntity/LogTask.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllTransServer/NoticeServer.cs
@@ -6,6 +6,9 @@
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
@@ -16,7 +19,11 @@
        public NoticeServer() : base(Db)
        {
        }
        /// <summary>
        /// 下发入库单
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public ErpModel CreateAsn(AsnInfo model)
        {
            try
@@ -78,7 +85,7 @@
                        SkuName = asnDetailModel.SkuName,
                        LotNo = asnDetailModel.LotNo,
                        LotText = "",
                        Qty = (decimal)asnDetailModel.Qty,
                        Qty = (decimal)asnDetailModel.Qty,//这里是桶数量
                        FactQty = 0,
                        CompleteQty = 0,
                        SupplierLot = asnDetailModel.SupplierLot,
@@ -108,5 +115,488 @@
                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);
            }
        }*/
    }
}
Wms/WMS.Entity/LogEntity/LogTask.cs
@@ -20,6 +20,11 @@
        public string TaskNo {get;set;}
        /// <summary>
        /// 入库明细号
        /// </summary>
        public int ASNDetailNo { get; set; }
        /// <summary>
        /// Desc:发送方
        /// Default:
        /// Nullable:True