wxw
2024-12-19 78279bd340545f8c07d1ff08764bd859ba404c83
Wms/WMS.BLL/BllTransServer/NoticeServer.cs
@@ -1,15 +1,22 @@
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
{
@@ -24,7 +31,7 @@
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public ErpModel CreateAsn(AsnInfo model)
        public ErpModel CreateAsnWork(AsnInfo model)
        {
            try
            {
@@ -50,7 +57,7 @@
                    Origin = string.IsNullOrEmpty(model.Origin) ? "MES" : model.Origin,
                    CustomerNo = model.Customer,
                    CustomerName = "",
                    OrderCode = model.OrderCode,
                    OrderCode = model.OrderCode
                };
                // 入库明细表信息
@@ -115,13 +122,14 @@
                throw ex;
            }
        }
        /// <summary>
        /// 任务完成
        /// </summary>
        /// <param name="TaskNo"></param>
        /// <param name="Status"></param>
        /// <returns></returns>
        public ErpModel FinishTask(string TaskNo,string Status)
        public ErpModel RCSFinishTask(string TaskNo,string Status)
        {
            try
            {
@@ -157,31 +165,17 @@
                    resultModel.Success = 0;
                    resultModel.Message = "成功";
                    //提交事务
                    Db.CommitTran();
                    return resultModel;
                }
                switch (taskInfo.OrderType)
                {
                    //入库完成
                    #region 入库完成
                    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)
@@ -189,78 +183,370 @@
                            resultModel.Message = "目标储位信息不存在!";
                            return resultModel;
                        }
                        //库存明细
                        var sd1 = new DataStockDetail()
                        var sd1 = Db.Queryable<DataStockDetail>().First(w => w.PalletNo == taskInfo.PalletNo);
                        if (sd1 == null)
                        {
                            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;
                            resultModel.Message = $"该桶对应的库存信息不存在,桶号:{taskInfo.PalletNo}!";
                            return resultModel;
                        }
                        noticeDetail.UpdateUser = 0;
                        noticeDetail.UpdateTime = comTime;
                        //更新入库单明细
                        Db.Updateable(noticeDetail).ExecuteCommand();
                        notice.UpdateUser = 0;
                        notice.UpdateTime = comTime;
                        if (notice.Status == "0")
                        else
                        {
                            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();
                            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";//执行完成
                //修改任务状态
@@ -280,17 +566,44 @@
                throw ex;
            }
        }
        /*public SoResInfo ErpAddExportNotice(SoInfo model)
        /// <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
            {
                if (string.IsNullOrEmpty(model.SoType))
                var obj = new
                {
                    throw new Exception("单据类型不可为空!");
                }
                    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("系统单号不可为空!");
                    throw new Exception("上游系统单号不可为空!");
                }
                if (model.SoDetails.Count <= 0)
                {
@@ -299,29 +612,9 @@
                //返回信息
                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 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
@@ -335,268 +628,126 @@
                List<SoDetailInfo> soDetailList = new List<SoDetailInfo>();
                //开启事务
                Db.BeginTran();
                try
                var list = new List<BllExportNoticeDetail>();
                //添加出库单
                foreach (var d in model.SoDetails)
                {
                    var list = new List<BllExportNoticeDetail>();
                    //添加出库单
                    foreach (var d in model.SoDetails)
                    if (d.Qty < 1)
                    {
                        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);
                            }
                        }
                        throw new Exception("出库数量必须大于0");
                    }
                    var notice = new BllExportNotice()
                    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,
                        OrderCode = model.OrderCode,
                        Type = model.SoType,
                        Status = "0",
                        Origin = "WMS",
                        CustomerNo = model.Customer,
                        CustomerName = CustomerName,
                        LogisticsId = logisticsId,
                        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 = "",
                        IsDespatch = "0",
                        IsIssueLotNo = "1",
                        OrderDetailCode = d.OrderDetailCode,
                        CreateUser = 0,
                    };
                    var n = Db.Insertable<BllExportNotice>(notice).ExecuteCommand();
                    var m = Db.Insertable<BllExportNoticeDetail>(list).ExecuteCommand();
                    if (n <= 0 || m <= 0)
                    list.Add(noticeDetail);
                    //锁定库存数量
                    decimal lockQty = 0;
                    foreach (var item in stockDetails)
                    {
                        Db.RollbackTran();
                        throw new Exception("操作失败");
                        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();
                    }
                    Db.CommitTran();
                    //回传上游系统锁定数量信息
                    result.Success = "0";
                    result.Message = "操作成功";
                    result.SoDetails = soDetailList;
                    return result;
                    SoDetailInfo soDetail = new SoDetailInfo();
                    soDetail.OrderDetailCode = d.OrderDetailCode;
                    soDetail.LockQty = d.Qty;
                    soDetail.LotNo = d.LotNo;
                    soDetailList.Add(soDetail);
                }
                catch (Exception ex)
                //出库单信息
                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(ex.Message);
                    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);
            }
        }*/
        }
    }
}