IPC-610
2024-11-27 c9cd6646fdd1296a7feeb4384ebfe06ab90a52d7
Wms/WMS.BLL/BllAsnServer/ArrivalNoticeServer.cs
@@ -17,6 +17,11 @@
using WMS.Entity.Context;
using WMS.Entity.SysEntity;
using WMS.IBLL.IBllAsnServer;
using WMS.BLL.SysServer;
using System.Threading.Tasks;
using System.Security.Policy;
using WMS.Entity.DataEntity;
using WMS.Entity.BllQualityEntity;
namespace WMS.BLL.BllAsnServer
{
@@ -112,7 +117,7 @@
                sqlString += "LEFT JOIN SysMaterials AS tb5 on tb1.SkuNo = tb5.SkuNo ";
                sqlString += "LEFT JOIN SysUnit AS tb6 on tb5.UnitNo = tb6.UnitNo ";
                sqlString += "LEFT JOIN SysPackag AS tb7 on tb1.PackagNo = tb7.PackagNo ";
                sqlString += $"WHERE tb1.ASNNo = '{model.ASNNo}' AND tb1.IsDel = '0' order by tb1.SkuNo desc ";
                sqlString += $"WHERE tb1.ASNNo = '{model.ASNNo}' AND tb1.IsDel = '0' AND tb5.IsDel = '0' order by tb1.SkuNo desc ";
                sqlString += $"offset {((model.Page - 1) * model.Limit)} rows fetch next {rowCount} rows only;";
                var modelList = Db.Ado.SqlQuery<ArrivalNoticeDetailDto>(sqlString);
@@ -124,39 +129,105 @@
                throw ex;
            }
        }
        //获取入库单明细剩余打印数量
        public LabelPrintInfoDto GetAsnDetailQtyList(int id)
        {
            try
            {
                var detail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.IsDel == "0" && m.Id == id);
                if (detail == null)
                {
                    throw new Exception("未查询到入库单明细");
                }
                var data = new LabelPrintInfoDto();
                var notice = Db.Queryable<BllArrivalNotice>().Where(m => m.IsDel == "0" && m.ASNNo == detail.ASNNo).First();
                if (notice != null && notice.Type == "4") //判断是否是余料退回单
                {
                    var noticeStr = Db.Queryable<BllArrivalNotice>().Where(m => m.Type == "1").Select(m => m.ASNNo).ToList();
                    var detailOld = Db.Queryable<BllArrivalNoticeDetail>().Where(m => m.IsDel == "0" && noticeStr.Contains(m.ASNNo) && m.SkuNo == detail.SkuNo && m.LotNo == detail.LotNo).OrderByDescending(m => m.CreateTime).First();
                    if (detailOld != null)
                    {
                        var boxInfo = Db.Queryable<BllBoxInfo>().First(m => m.IsDel == "0" && m.ASNNo == detailOld.ASNNo);
                        if (boxInfo!= null)
                        {
                            data.ProductionTime = boxInfo.ProductionTime!= null ? ((DateTime)boxInfo.ProductionTime).ToString("yyyy-MM-dd"):"";
                            data.ExpirationTime = boxInfo.ExpirationTime != null ? ((DateTime)boxInfo.ExpirationTime).ToString("yyyy-MM-dd") : "";
                            data.StoreTime = boxInfo.StoreTime != null ? ((DateTime)boxInfo.StoreTime).ToString("yyyy-MM-dd") : "";
                        }
                    }
                }
                var labelQty = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.ASNDetailNo == id).Sum(m => m.Qty);
                var qty = detail.Qty - labelQty;
                data.Qty = qty.ToString();
                return data;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        //获取物料信息(添加入库单明细使用)
        public List<MaterialsDto> GetMaterialsList(GetMaterialsVm model)
        {
            try
            {
                string skuType = string.Empty;
                switch(model.Type)//0:原料 1:包材 2:成品 3:耗材 4:半成品
                int IsPack = 0; //0:不管 1:贴 2:不贴
                /**
                 * 成品贴       0
                 * 采购可贴可不贴   1
                 * 中间品不贴   2
                 * 退货贴      3
                 * 余料退回可贴可不贴   4
                 * 其它可贴可不贴   5
                 * 代储不贴      6
                 * 寄存不贴      7
                 */
                switch (model.Type)//0:原料 1:包材 2:成品 3:耗材 4:半成品
                {
                    case "0"://成品入库
                        skuType = "(2)";
                        IsPack = 1; //贴
                        break;
                    case "1"://采购入库
                        skuType = "(0,1,3)";
                        break;
                    case "2"://中间品入库
                        skuType = "(4)";
                        IsPack = 2; //不贴
                        break;
                    case "3"://退货入库
                        skuType = "(2)";
                        IsPack = 1; //贴
                        break;
                    case "4"://车间余料退回入库
                        skuType = "(0,1,3)";
                        break;
                    case "5"://其它入库
                        skuType = "(2)";
                        skuType = "(0,1,3)";
                        break;
                    case "6"://代储入库
                        skuType = "(2)";
                        skuType = "(0,1,2,3,4)";
                        IsPack = 2; //不贴
                        break;
                    case "7"://寄存入库
                        //skuType = "(3)";
                        IsPack = 2; //不贴
                        break;
                    default: //其它
                        //skuType = "(0,1,2,3,4)";
                        break;
                }
                Expression<Func<SysMaterials, bool>> item = Expressionable.Create<SysMaterials>()
                    .AndIF(true, it => skuType.Contains(it.Type))
                    .AndIF(model.Type != "7", it => skuType.Contains(it.Type) && it.SkuNo != "100088")
                    .AndIF(model.Type == "7", it => it.SkuNo == "100088")
                    .AndIF(IsPack == 1, it => it.PackagNo != "")
                    .AndIF(IsPack == 2, it => it.PackagNo == "")
                    .AndIF(true, it => it.IsDel == "0")
                    .And(it => it.SkuNo != "100099")
                    .AndIF(!string.IsNullOrWhiteSpace(model.SkuNo),
@@ -171,6 +242,8 @@
                    .Includes(x => x.UnitInfo)
                    .Includes(x => x.PackagInfo)
                    .ToList();
                return data.Select(m => new MaterialsDto()
                {
@@ -203,11 +276,15 @@
        }
        //添加入库单据
        public string AddArrivalNotice(ArrivalNoticeVm model)
        public string AddArrivalNotice(ArrivalNoticeVm model, string url)
        {
            string strMessage = "";
            string sqlString = string.Empty;
            string sqlDetailStr = string.Empty;
            //0:成品入库 1:采购入库 2:中间品入库 3:退货入库 4:车间余料入库 5:其它入库 6:代储入库 7:寄存入库
            var TypeLot = "2, 5, 6, 7"; //批次可为空单据类型
            var addOder = new List<ResponseOrderTaskModel>();
            try
            {
                if (model.Origin == "录入")
@@ -225,6 +302,15 @@
                        throw new Exception("单据类型不可为空!");
                    }
                }
                //判断是否为采购入库单据或车间余料退回入库
                // 0:成品入库 1:采购入库 2:中间品入库 3:退货入库 4:车间余料退回入库 5:其它入库 6:代储入库 7:寄存入库
                //if (model.Type == "1" || model.Type == "4")
                //{
                //    if (!string.IsNullOrWhiteSpace(model.LotNo))
                //    {
                //        throw new Exception("采购入库或余料退回不可输入批次,不可编辑!");
                //    }
                //}
                sqlString += "Insert into BllArrivalNotice (ASNNo,Type,Origin,CustomerNo,";
                sqlString += "CustomerName,LotNo,LotText,SupplierLot,CreateUser) values ( ";
@@ -251,16 +337,51 @@
                    }
                    if (string.IsNullOrEmpty(detailModel.LotNo))
                    {
                        strMessage = "-1:批次号不可为空;";
                        //判断是否为不限制批次单据
                        if (!TypeLot.Contains(model.Type))
                        {
                            strMessage = "-1:进厂编号不可为空;";
                            continue;
                        }
                    }
                    if (model.Type != "7")
                    {
                        if (!TypeLot.Contains(model.Type))
                        {
                            if (detailModel.LotNo.Length != 12 && detailModel.LotNo.Length != 11 && detailModel.LotNo.Length != 10)
                            {
                                strMessage = "-1:进厂编号位数长度有误;";
                                continue;
                            }
                        }
                    }
                    if (model.Type == "1" && string.IsNullOrWhiteSpace(detailModel.SupplierLot)) //采购到货单原厂批号(供货批次)不能为空
                    {
                        strMessage = "-1:原厂批号不可为空;";
                        continue;
                    }
                    if (model.Type == "2")   // 2:中间品入库
                    {
                        if (string.IsNullOrWhiteSpace(detailModel.Lot1))
                        {
                            throw new Exception("生产日期不可为空!");
                        }
                        if (string.IsNullOrWhiteSpace(detailModel.Lot2))
                        {
                            throw new Exception("过期日期不可为空!");
                        }
                    }
                    // 判断是否已存在当前明细
                    string sqlCount = $"SELECT COUNT(ID) FROM BllArrivalNoticeDetail where ASNNo = '{model.ASNNo}' ";
                    sqlCount += $"and SkuNo ='{detailModel.SkuNo}' and LotNo = '{detailModel.LotNo}' and id != '{detailModel.Id}' and isdel = '0';";
                    var com = new Common().GetRowCount(sqlCount);
                    if (com > 0)
                    {
                        strMessage = "-1:物料和批次号重复;";
                        strMessage = "-1:物料和进厂编号重复;";
                        continue;
                    }
                    if (detailModel.Price == null)
@@ -270,10 +391,25 @@
                    // 计算出总金额
                    detailModel.Money = detailModel.Price * detailModel.Qty;
                    sqlDetailStr += "Insert into BllArrivalNoticeDetail (ASNNo,SkuNo,SkuName,Standard,";
                    sqlDetailStr += "LotNo,LotText,Qty,PackagNo,Price,Money,IsBale,IsBelt,SupplierLot,Status,UDF1,UDF2,UDF3,UDF4,UDF5,CreateUser) values ( ";
                    sqlDetailStr += "LotNo,LotText,Qty,PackagNo,Price,Money,IsBale,IsBelt,SupplierLot,Status,Lot1,Lot2,UDF1,UDF2,UDF3,UDF4,UDF5,CreateUser) values ( ";
                    sqlDetailStr += $"'{model.ASNNo}','{detailModel.SkuNo}','{detailModel.SkuName}','{detailModel.Standard}', ";
                    sqlDetailStr += $"'{detailModel.LotNo}','{detailModel.LotText}','{detailModel.Qty}','{detailModel.PackagNo}','{detailModel.Price}', ";
                    sqlDetailStr += $"{detailModel.Money},'{detailModel.IsBale}','{detailModel.IsBelt}','{detailModel.SupplierLot}','0','{detailModel.UDF1}','{detailModel.UDF2}','{detailModel.UDF3}','{detailModel.UDF4}','{detailModel.UDF5}','{model.CreateUser}');";
                    sqlDetailStr += $"'{detailModel.Money}','{detailModel.IsBale}','{detailModel.IsBelt}','{detailModel.SupplierLot}','0','{detailModel.Lot1}','{detailModel.Lot2}', ";
                    sqlDetailStr += $"'{detailModel.UDF1}','{detailModel.UDF2}','{detailModel.UDF3}','{detailModel.UDF4}','{detailModel.UDF5}','{model.CreateUser}');";
                    if (model.Type == "0")//成品入库单下发WCS信息
                    {
                        addOder.Add(new ResponseOrderTaskModel()
                        {
                            OrderNo = model.ASNNo,
                            LotNo = detailModel.LotNo,
                            SkuNo = detailModel.SkuNo,
                            SkuName = detailModel.SkuName,
                            BoxType = detailModel.Standard,
                            Qty = (int)detailModel.Qty,
                            TaskType = 0
                        });
                    }
                }
                if (sqlDetailStr == string.Empty)
@@ -292,6 +428,35 @@
                if (rowCount > 0 && rowDetailCount > 0)
                {
                    new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", model.ASNNo, "添加", $"添加了单据号为{model.ASNNo}的单据信息", Convert.ToInt32(model.CreateUser));
                    if (addOder.Count > 0)
                    {
                        // 正式运行程序放开
                        var jsonData = JsonConvert.SerializeObject(addOder);
                        string response = "";
                        try
                        {
                            var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                            //给WCS下发入库单信息
                            response = HttpHelper.DoPost(url, jsonData, "下发给WCS出库命令", "WCS");
                            //解析返回数据
                            var wcsModel = JsonConvert.DeserializeObject<WcsModel>(response);
                            if (wcsModel.StatusCode == 0)
                            {
                            }
                            if (wcsModel.StatusCode == -1)
                            {
                                throw new Exception($"下发WCS失败:{wcsModel.Msg}");
                            }
                        }
                        catch (Exception ex)
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                    return strMessage;
                }
                else
@@ -302,6 +467,7 @@
            }
            catch (Exception ex)
            {
                Db.Ado.RollbackTran();
                throw new Exception(ex.Message);
            }
        }
@@ -314,6 +480,18 @@
            string sqlDetailStr = string.Empty;
            try
            {
                //判断是否为采购入库单据或车间余料退回入库
                // 0:成品入库 1:采购入库 2:中间品入库 3:退货入库 4:车间余料退回入库 5:其它入库 6:代储入库 7:寄存入库
                int isType = 0;
                if (model.Type == "1" || model.Type == "4")
                {
                    isType = 1;
                    if (!string.IsNullOrWhiteSpace(model.LotNo))
                    {
                        strMessage = "-1:采购入库或余料退回不可输入批次,不可编辑;";
                        return strMessage;
                    }
                }
                if (model.Origin != "录入")
                {
                    strMessage = "-1:上游系统下发的单据,不可编辑;";
@@ -330,7 +508,7 @@
                sqlString = "UPDATE BllArrivalNotice SET ";
                sqlString += $"CustomerNo = '{model.CustomerNo}',CustomerName = '{model.CustomerName}',";
                sqlString += $"LotNo = '{model.LotNo}',LotText = '{model.LotText}',";
                sqlString += $"LotNo = '{model.LotNo}',LotText = '{model.LotText}',";
                sqlString += $"UpdateTime = GETDATE(),UpdateUser = '{model.CreateUser}' ";
                sqlString += $"WHERE ASNNo = '{model.ASNNo}'";
@@ -368,11 +546,24 @@
                        strMessage = "-1:数量必须大于0;";
                        continue;
                    }
                    if (string.IsNullOrEmpty(detailModel.LotNo))
                    if (string.IsNullOrEmpty(detailModel.LotNo) && isType != 1)
                    {
                        strMessage = "-1:批次号不可为空;";
                        continue;
                    }
                    if (model.Type == "2")   // 2:中间品入库
                    {
                        if (string.IsNullOrWhiteSpace(detailModel.Lot1))
                        {
                            throw new Exception("生产日期不可为空!");
                        }
                        if (string.IsNullOrWhiteSpace(detailModel.Lot2))
                        {
                            throw new Exception("过期日期不可为空!");
                        }
                    }
                    // 判断是否已存在当前明细
                    string sqlCount = $"SELECT COUNT(ID) FROM BllArrivalNoticeDetail where ASNNo = '{model.ASNNo}' ";
                    sqlCount += $"and SkuNo ='{detailModel.SkuNo}' and LotNo = '{detailModel.LotNo}' and id != '{detailModel.Id}' and isdel = '0';";
@@ -392,10 +583,12 @@
                        // 计算出总金额
                        detailModel.Money = detailModel.Price * detailModel.Qty;
                        sqlDetailStr += "Insert into BllArrivalNoticeDetail (ASNNo,SkuNo,SkuName,Standard,";
                        sqlDetailStr += "LotNo,LotText,Qty,PackagNo,Price,Money,IsBale,IsBelt,SupplierLot,Status,UDF1,UDF2,UDF3,UDF4,UDF5,CreateUser) values ( ";
                        sqlDetailStr += "LotNo,LotText,Qty,PackagNo,Price,Money,IsBale,IsBelt,SupplierLot,Status,Lot1,Lot2,UDF1,UDF2,UDF3,UDF4,UDF5,CreateUser) values ( ";
                        sqlDetailStr += $"'{model.ASNNo}','{detailModel.SkuNo}','{detailModel.SkuName}','{detailModel.Standard}', ";
                        sqlDetailStr += $"'{detailModel.LotNo}','{detailModel.LotText}','{detailModel.Qty}','{detailModel.PackagNo}','{detailModel.Price}', ";
                        sqlDetailStr += $"{detailModel.Money},'{detailModel.IsBale}','{detailModel.IsBelt}','{detailModel.SupplierLot}','0','{detailModel.UDF1}','{detailModel.UDF2}','{detailModel.UDF3}','{detailModel.UDF4}','{detailModel.UDF5}','{model.CreateUser}');";
                        sqlDetailStr += $"'{detailModel.Money},'{detailModel.IsBale}','{detailModel.IsBelt}','{detailModel.SupplierLot}','0','{detailModel.Lot1}','{detailModel.Lot2}', ";
                        sqlDetailStr += $"'{detailModel.UDF1}','{detailModel.UDF2}','{detailModel.UDF3}','{detailModel.UDF4}','{detailModel.UDF5}','{model.CreateUser}');";
                    }
                    else
                    {
@@ -408,6 +601,8 @@
                                         && it.SupplierLot == detailModel.SupplierLot
                                         && it.IsBale == detailModel.IsBale
                                         && it.IsBelt == detailModel.IsBelt
                                         && it.Lot1 == detailModel.Lot1                                 // 生产日期
                                         && it.Lot2 == detailModel.Lot2                                 // 过期日期
                                         && it.UDF1 == detailModel.UDF1
                                         && it.UDF2 == detailModel.UDF2
                                         && it.UDF3 == detailModel.UDF3
@@ -423,6 +618,7 @@
                        sqlDetailStr += $"Qty = '{detailModel.Qty}',LotNo = '{detailModel.LotNo}',Money='{detailModel.Money}', ";
                        sqlDetailStr += $"LotText = '{detailModel.LotText}',SupplierLot = '{detailModel.SupplierLot}', ";
                        sqlDetailStr += $"IsBale = '{detailModel.IsBale}',IsBelt = '{detailModel.IsBelt}', ";
                        sqlDetailStr += $" Lot1= '{detailModel.Lot1}',Lot2 = '{detailModel.Lot2}', ";
                        sqlDetailStr += $"UDF1 = '{detailModel.UDF1}',UDF2 = '{detailModel.UDF2}',UDF3 = '{detailModel.UDF3}',UDF4 = '{detailModel.UDF4}',UDF5 = '{detailModel.UDF5}',";
                        sqlDetailStr += $"UpdateTime = GETDATE(),UpdateUser = '{model.CreateUser}' ";
                        sqlDetailStr += $"WHERE Id = {detailModel.Id};";
@@ -473,6 +669,7 @@
                }
                // 删除总单
                sqlString = $"UPDATE BllArrivalNotice SET IsDel = '1',";
                sqlString += $"UpdateTime = GETDATE(),UpdateUser = '{model.CreateUser}' ";
@@ -482,10 +679,30 @@
                sqlString += $"UPDATE BllArrivalNoticeDetail SET IsDel = '1',";
                sqlString += $"UpdateTime = GETDATE(),UpdateUser = '{model.CreateUser}' ";
                sqlString += $"WHERE ASNNo = '{model.ASNNo}';";
                //判断是否为采购入库单据或车间余料退回入库
                // 0:成品入库 1:采购入库 2:中间品入库 3:退货入库 4:车间余料退回入库 5:其它入库 6:代储入库 7:寄存入库
                int notdel = 0;
                if (model.Type == "1" || model.Type == "4")
                {
                    //获取单据生成对应标签
                    var list = Db.Queryable<BllBoxInfo>().Where(a => a.IsDel == "0" && a.Status == "0" && a.BindNo == null);
                    //验证对应箱支信息是否存在
                    if (list == null)
                    {
                        return "-1:已有箱码已绑定托盘或已入库,不可删除!";
                    }
                    // 删除对应箱支信息
                    sqlString += $"UPDATE BllBoxInfo SET IsDel = '1',";
                    sqlString += $"UpdateTime = GETDATE(),UpdateUser = '{model.CreateUser}' ";
                    sqlString += $"WHERE ASNNo = '{model.ASNNo}';";
                    notdel = 1;
                }
                Db.Ado.BeginTran();
                int rowCount = Db.Ado.ExecuteCommand(sqlString);
                if (rowCount < 2)
                if (rowCount < 2 + notdel)
                {
                    Db.RollbackTran();
                    return "-1:删除失败!";
@@ -496,6 +713,7 @@
            }
            catch (Exception ex)
            {
                Db.RollbackTran();
                throw ex;
            }
        }
@@ -572,6 +790,11 @@
                //{
                //    throw new Exception("参数异常,请检查状态是否为执行完成");
                //}
                var palletBind = Db.Queryable<BllPalletBind>().Where(m => m.IsDel == "0" && m.ASNNo == notice.ASNNo && m.Status != "2").ToList();
                if (palletBind != null && palletBind.Count > 0)
                {
                    throw new Exception("存在未入库完成托盘信息,不允许关单");
                }
                var sqlString = "";
@@ -603,7 +826,7 @@
            }
        }
        //入库单撤销申请
        public void CancelOrder(int id,string reason,int userId)
        public void CancelOrder(int id, string reason, int userId)
        {
            try
            {
@@ -612,29 +835,29 @@
                {
                    throw new Exception("未查询到入库单据信息");
                }
                if (notice.Status!="1" && notice.Status != "2")
                if (notice.Status != "1" && notice.Status != "2")
                {
                    throw new Exception("入库单据状态不是正在执行或执行完成,不能撤销");
                }
                var bind = Db.Queryable<BllPalletBind>().Where(m => m.IsDel == "0" && m.ASNNo == notice.ASNNo).ToList();
                if (bind.Count==0)
                if (bind.Count == 0)
                {
                    throw new Exception("未查询到入库单据的托盘绑定信息");
                }
                if (bind.Count(m=>m.Status== "1")>0)
                if (bind.Count(m => m.Status == "1") > 0)
                {
                    throw new Exception("当前入库单据的托盘绑定信息有正在执行的,请稍后完成后再撤销");
                }
                var auditLog = Db.Queryable<BllAuditLog>().Where(m => m.IsDel == "0" && m.Status == "0");
                var boxInfo = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.ASNNo == notice.ASNNo);
                if (auditLog.Count(m=>m.OrderNo == notice.ASNNo)>0)
                if (auditLog.Count(m => m.OrderNo == notice.ASNNo) > 0)
                {
                    throw new Exception("当前入库单据已有撤销审核,请等待审核完成");
                }
                var startStatusName = "";
                var endStatusName = "";
@@ -649,7 +872,7 @@
                        endStatusName = "正在执行";
                        break;
                    default:
                        throw new Exception("单据状态错误");
                        throw new Exception("单据状态错误");
                }
                var palletStr = "";
@@ -657,27 +880,46 @@
                var msgL = "";
                foreach (var item in bind)
                {
                    if (auditLog.Count(m=>m.OrderNo ==item.ASNNo && m.PalletNo.Contains(item.PalletNo)) >0)
                    if (auditLog.Count(m => m.OrderNo == item.ASNNo && m.PalletNo.Contains(item.PalletNo)) > 0)
                    {
                        continue;
                    }
                    if (!palletStr.Contains(item.PalletNo))
                    {
                        palletStr += item.PalletNo+";";
                        palletStr += item.PalletNo + ";";
                    }
                    var info = boxInfo.First(m => m.BindNo == item.Id);
                    if (!msgS.Contains(info.SkuNo))
                    //获取托盘绑定对应单据
                    var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().First(a => a.IsDel == "0" && a.Id == item.ASNDetailNo);
                    if (info != null)
                    {
                        msgS += info.SkuNo + ";";
                        if (!msgS.Contains(info.SkuNo))
                        {
                            msgS += info.SkuNo + ";";
                        }
                        if (!msgL.Contains(info.LotNo))
                        {
                            msgL += info.LotNo + ";";
                        }
                    }
                    else
                    {
                        if (!msgS.Contains(noticeDetail.SkuNo))
                        {
                            msgS += noticeDetail.SkuNo + ";";
                        }
                        if (!msgL.Contains(noticeDetail.LotNo))
                        {
                            msgL += noticeDetail.LotNo + ";";
                        }
                    }
                    if (!msgL.Contains(info.LotNo))
                    {
                        msgL += info.LotNo + ";";
                    }
                }
                var time = DateTime.Now;
                var log = new BllAuditLog()
@@ -695,7 +937,7 @@
                    IsDel = "0",
                    CreateUser = userId,
                    CreateTime = time
                };
                };
                Db.Insertable(log).ExecuteCommand();
                new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", notice.ASNNo, "添加", $"添加了单据号为{notice.ASNNo}的单据撤销申请", userId);
            }
@@ -729,7 +971,7 @@
                {
                    //添加操作日志
                    new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", notice.ASNNo, "编辑", $"编辑了单据号为{notice.ASNNo}的备注信息", userId);
                }
                }
            }
            catch (Exception ex)
            {
@@ -745,11 +987,11 @@
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public ErpModel CreateAsn(AsnInfo model)
        public HttpReturnModel HttpCreateAsn(AsnInfo model)
        {
            try
            {
                var resultModel = new ErpModel() { Success = -1, Message = "" };
                var resultModel = new HttpReturnModel() { Success = "-1", Message = "" };
                if (string.IsNullOrEmpty(model.AsnType))
                {
                    resultModel.Message = "单据类型不可为空!";
@@ -785,7 +1027,7 @@
                {
                    ASNNo = asnNo,
                    Type = model.AsnType,
                    Origin = model.Origin,
                    Origin = string.IsNullOrEmpty(model.Origin) ? "ERP" : model.Origin,
                    CustomerNo = model.Customer,
                    CustomerName = CustomerModel.CustomerName,
                    OrderCode = model.OrderCode,
@@ -848,7 +1090,7 @@
                Db.Insertable(detailModels).ExecuteCommand();
                Db.CommitTran();
                resultModel.Success = 0;
                resultModel.Success = "0";
                resultModel.Message = "成功";
                return resultModel;
            }
@@ -860,23 +1102,52 @@
        }
        //订单回传上游系统
        public bool FinishAsn(int id, string url, int userId)
        public bool FinishAsn(int id, string erpUrl, string mesUrl,string mesTokenUrl,string userNo,string pwd, int userId)
        {
            try
            {
                var loginPwd = Md5Tools.CalcMd5(pwd);
                var date = Db.Queryable<SysUserInfor>().First(m =>m.IsDel=="0" && m.UserName == userNo && m.PassWord == loginPwd);
                if (date == null) //账号密码是否正确
                {
                   throw new Exception("账号密码不正确或没有此账号");
                }
                if (date.Status != "0") //当前账号是否正常启用
                {
                    throw new Exception("当前账号非启用状态");
                }
                var notice = Db.Queryable<BllArrivalNotice>().First(m => m.Id == id && m.IsDel == "0");
                if (notice == null)
                {
                    throw new Exception("未查询到单据信息");
                }
                if (notice.Status != "3")
                {
                    throw new Exception("复核失败,单据非关闭状态");
                }
                var detail = Db.Queryable<BllArrivalNoticeDetail>().Where(m => m.ASNNo == notice.ASNNo && m.IsDel == "0").ToList();
                if (detail.Count == 0)
                {
                    throw new Exception("未查询到单据明细信息");
                }
                if (userId == notice.UpdateUser)
                if (date.Id == notice.UpdateUser)
                {
                    throw new Exception("复核失败,复核人员和关闭订单人员不能相同!");
                }
                //单据类型是 成品入库或采购入库 判断入库物料是否合格
                if (notice.Type == "0" || notice.Type == "1")
                {
                    foreach (var item in detail)
                    {
                        var instStatus = Db.Queryable<BllQualityInspect>().Count(m => m.IsDel == "0" && m.SkuNo == item.SkuNo && m.LotNo == item.LotNo && m.IsQualified == "1");
                        if (instStatus == 0)
                        {
                            throw new Exception($"{item.SkuNo}、{item.LotNo}质量状态不是合格的,不能回传!");
                        }
                    }
                }
                var list = new List<AsnDetail>();
                foreach (var d in detail)
@@ -891,32 +1162,85 @@
                    };
                    list.Add(item);
                }
                var soInfo = new AsnInfo()
                var asnInfo = new AsnInfo()
                {
                    OrderCode = notice.OrderCode,
                    AsnDetails = list
                };
                #region 通过接口发送至erp
                #region 通过接口发送至erp 或 mes
                //系统对接后放开
                /*var jsonData = JsonConvert.SerializeObject(soInfo);
                var jsonData = JsonConvert.SerializeObject(asnInfo);
                var mesList = new List<string>() { "0", "4" };  //0 成品入库 4余料退回入库
                var erpList = new List<string>() { "1", "2", "3" }; //1 采购入库  2中间品入库  3 退货入库
                var response = HttpHelper.DoPost(url, jsonData, "入库单完成上传", "ERP");
                var obj = JsonConvert.DeserializeObject<ErpModel>(response);//解析返回数据
                if (obj.Success != 0)
                if (mesList.Contains(notice.Type)) // mes
                {
                    throw new Exception("上传失败" + obj.Message);
                }*/
                    //获取令牌
                    var token = new Token().GetMesToken(mesTokenUrl);
                    Dictionary<string, string> mesDic = new Dictionary<string, string>()
                    {
                        {"Authorization",token }
                    };
                    var mesData = new FinishAsnModel()
                    {
                        no = asnInfo.OrderCode,
                        qty = asnInfo.AsnDetails.Sum(m=>m.Qty)
                    };
                    jsonData = JsonConvert.SerializeObject(mesData);
                    //调用接口
                    var response = HttpHelper.DoPost(mesUrl, jsonData, "入库单完成上传", "MES", mesDic);
                    var obj = JsonConvert.DeserializeObject<MesModel>(response);//解析返回数据
                    if (obj.status != "0")
                    {
                        throw new Exception("上传失败" + obj.message);
                    }
                }
                else if (erpList.Contains(notice.Type)) //erp
                {
                    var response = HttpHelper.DoPost(erpUrl, jsonData, "入库单完成上传", "ERP");
                    var obj = JsonConvert.DeserializeObject<ErpModel>(response);//解析返回数据
                    if (obj.Success != 0)
                    {
                        throw new Exception("上传失败" + obj.Message);
                    }
                }
                #endregion
                notice.Status = "4";
                notice.CheckTime = DateTime.Now;
                notice.CheckUser = userId;
                notice.CheckUser = date.Id;
                Db.Updateable(notice).ExecuteCommand();
                new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", notice.ASNNo, "复核", $"复核了单据号为{notice.ASNNo}的单据信息", userId);
                new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", notice.ASNNo, "复核", $"{date.RealName}复核了单据号为{notice.ASNNo}的单据信息", userId);
                return true;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        public void UpLocate(string wareNo,string locatNo)
        {
            try
            {
                if (string.IsNullOrWhiteSpace(wareNo) || string.IsNullOrWhiteSpace(locatNo))
                {
                    throw new Exception("仓库或储位不能为空");
                }
                var locate = Db.Queryable<SysStorageLocat>().First(m=>m.IsDel == "0" && m.LocatNo == locatNo && m.WareHouseNo == wareNo);
                if (locate == null)
                {
                    throw new Exception("未查询到储位信息");
                }
                locate.Status = "0";//储位状态变更空储位
                Db.Updateable(locate).ExecuteCommand();
            }
            catch (Exception e)
            {
@@ -926,5 +1250,5 @@
        #endregion
    }
}