wxw
昨天 4e506fb732bc1c0c23d5996ffb8d81eb7e9b4b65
Wms/WMS.BLL/BllAsnServer/ArrivalNoticeServer.cs
@@ -1,14 +1,17 @@
using Model.InterFaceModel;
using Model.ModelDto;
using Model.ModelDto.BllAsnDto;
using Model.ModelDto.SysDto;
using Model.ModelVm;
using Model.ModelVm.SysVm;
using Newtonsoft.Json;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Utility.Tools;
using WMS.BLL.LogServer;
using WMS.DAL;
using WMS.Entity.BllAsnEntity;
@@ -138,7 +141,7 @@
        }
        //获取入库单明细剩余打印数量
        public string GetAsnDetailQtyList(int id)
        public LabelPrintInfoDto GetAsnDetailQtyList(int id)
        {
            try
            {
@@ -147,7 +150,11 @@
                {
                    throw new Exception("未查询到入库单明细");
                }
                var data = new LabelPrintInfoDto();
                data.ProductionTime = string.IsNullOrEmpty(detail.Lot1) ? "" : Convert.ToDateTime(detail.Lot1).ToString("yyyy-MM-dd");
                data.ExpirationTime = string.IsNullOrEmpty(detail.Lot2) ? "" : Convert.ToDateTime(detail.Lot2).ToString("yyyy-MM-dd");
                data.SupplierLot = detail.SupplierLot;
                var labelQty = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.ASNDetailNo == id).Sum(m => m.Qty + (m.SamplingQty == null? 0: m.SamplingQty));
                if (labelQty == null)
                {
@@ -158,7 +165,8 @@
                {
                    qty = 0;
                }
                return qty.ToString();
                data.Qty = qty.ToString();
                return data;
            }
            catch (Exception e)
            {
@@ -353,12 +361,29 @@
                                detailModel.LotNo = maxLotNo;
                            }
                        }
                        if (model.Type == "0" || model.Type == "1" || model.Type == "2" || model.Type == "3" || model.Type == "4" && model.Type == "8")
                        //if (model.Type == "0" || model.Type == "1" || model.Type == "2" || model.Type == "3" || model.Type == "4" && model.Type == "8")
                        //{
                        //    if (string.IsNullOrWhiteSpace(detailModel.LotNo))
                        //    {
                        //        throw new Exception("当前单据类型批次不可为空!");
                        //    }
                        //}
                        detailModel.BoxCodeStr = detailModel.LotNo;
                        if (string.IsNullOrWhiteSpace(detailModel.LotNo))
                        {
                            if (string.IsNullOrWhiteSpace(detailModel.LotNo))
                            string toDayTime = DateTime.Now.ToString("yyyyMM");
                            var maxBoxCodeStr = Db.Queryable<BllArrivalNoticeDetail>()
                                .Where(m => m.IsDel == "0" && m.BoxCodeStr.Contains("BK")
                                && m.CreateTime.ToString("yyyyMM") == DateTime.Now.ToString("yyyyMM")).Max(m => m.BoxCodeStr);
                            if(string.IsNullOrWhiteSpace(maxBoxCodeStr))
                            {
                                throw new Exception("当前单据类型批次不可为空!");
                                maxBoxCodeStr = "BK" + toDayTime.Substring(2, 4) + "0001";
                            }
                            else
                            {
                                maxBoxCodeStr = "BK" + (int.Parse(maxBoxCodeStr.Replace("BK", "")) + 1).ToString();
                            }
                            detailModel.BoxCodeStr = maxBoxCodeStr;
                        }
                        // 判断是否已存在当前明细
@@ -384,18 +409,18 @@
                        }
                        string lot1 = detailModel.Lot1;
                        string lot2 = detailModel.Lot2;
                        if (sku.IsPasteCode == "0")
                        if (sku.IsInspect == "0")//是否免检,0:否 1:是
                        {
                            //不贴标物料 生产日期、有效期不能为空
                            //不免检物料 生产日期、有效期不能为空
                            DateTime lot12;
                            DateTime lot22;
                            if (!DateTime.TryParse(detailModel.Lot1, out lot12))
                            {
                                throw new Exception("非贴标物料生产日期转换失败");
                                throw new Exception("不免检物料生产日期转换失败");
                            }
                            if (!DateTime.TryParse(detailModel.Lot2, out lot22))
                            {
                                throw new Exception("非贴标物料过期日期转换失败");
                                throw new Exception("不免检物料过期日期转换失败");
                            }
                            lot1 = lot12.ToString();
                            lot2 = lot22.ToString();
@@ -412,7 +437,7 @@
                            SkuNo = detailModel.SkuNo,
                            SkuName = detailModel.SkuName,
                            Standard = detailModel.Standard,
                            LotNo = detailModel.LotNo.Trim(),
                            LotNo = detailModel.LotNo == null ? "" : detailModel.LotNo.Trim(),
                            LotText = detailModel.LotText,
                            Qty = (decimal)detailModel.Qty,
                            PackagNo = detailModel.PackagNo,
@@ -428,6 +453,7 @@
                            InspectStatus = "0",
                            Lot1 = lot1, //生产日期
                            Lot2 = lot2, // 过期日期
                            BoxCodeStr = detailModel.BoxCodeStr,
                            UDF1 = detailModel.UDF1,
                            UDF2 = detailModel.UDF2,
                            UDF3 = detailModel.UDF3,
@@ -474,38 +500,35 @@
            }
        }
        //编辑入库单据
        /// <summary>
        /// 编辑入库单据
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public string EditArrivalNotice(ArrivalNoticeVm model)
        {
            string strMessage = "";
            string sqlString = string.Empty;
            string sqlDetailStr = string.Empty;
            try
            {
                lock (AsnLock)
                {
                    //判断是否为采购入库单据或车间余料退回入库
                    // 判断单据类型及批次规则说明
                    // 0:成品入库 1:采购入库 2:中间品入库 3:退货入库 4:车间余料退回入库 5:其它入库 6:代储入库 7:寄存入库 8 生产退料入库
                    //0、2、3、4 批次不能为空
                    //1、添加必须为空、编辑不可为空,不能更改
                    //5、6 批次可为空可不为空
                    //7 必须为空
                    var TypeLot = " 5, 6, 7"; //批次为生成批次单据类型
                    var TypeLot = " 5, 6, 7"; // 批次为生成批次单据类型
                    // 验证单据存在性和状态
                    var asnInfo = Db.Queryable<BllArrivalNotice>().First(m => m.ASNNo == model.ASNNo && m.IsDel == "0");
                    if (asnInfo == null)
                    if (asnInfo == null)
                    {
                        strMessage = "-1:单号不存在,或已删除!;";
                        return strMessage;
                        return "-1:单号不存在,或已删除!;";
                    }
                    if (asnInfo.Status != "0")
                    {
                        strMessage = "-1:单据状态变更,不可编辑;";
                        return strMessage;
                        return "-1:单据状态变更,不可编辑;";
                    }
                    var dateTime = DateTime.Now;
                    // 编辑总单
                    // 更新主单据信息
                    asnInfo.CustomerNo = model.CustomerNo;
                    asnInfo.CustomerName = model.CustomerName;
                    asnInfo.LotNo = model.LotNo;
@@ -514,130 +537,131 @@
                    asnInfo.UpdateUser = model.CreateUser;
                    var detailModels = model.AsnDetail;
                    sqlDetailStr += $"SELECT * FROM BllArrivalNoticeDetail WHERE ASNNo = '{model.ASNNo}' and isDel = '0';";
                    //var dbDetailModels = DataContext.Db.Ado.SqlQuery<BllArrivalNoticeDetail>(sqlDetailStr);
                    var dbDetailModels = Db.Queryable<BllArrivalNoticeDetail>().Where(m => m.ASNNo == model.ASNNo && m.IsDel == "0").ToList();
                    var dbDetailModels = Db.Queryable<BllArrivalNoticeDetail>()
                        .Where(m => m.ASNNo == model.ASNNo && m.IsDel == "0").ToList();
                    sqlDetailStr = string.Empty;
                    // 处理已删除的明细
                    foreach (BllArrivalNoticeDetail dbDetailModel in dbDetailModels)
                    foreach (var dbDetail in dbDetailModels)
                    {
                        if (detailModels.Count(it => it.Id == dbDetailModel.Id) == 0)
                        if (!detailModels.Any(it => it.Id == dbDetail.Id))
                        {
                            dbDetailModel.IsDel = "1";
                            dbDetailModel.UpdateTime = dateTime;
                            dbDetailModel.UpdateUser = model.CreateUser;
                            dbDetail.IsDel = "1";
                            dbDetail.UpdateTime = dateTime;
                            dbDetail.UpdateUser = model.CreateUser;
                        }
                    }
                    // 处理修改和添加的明细
                    // 处理修改和新增的明细
                    string toDayTime = dateTime.ToString("yyyymmdd");
                    List<BllArrivalNoticeDetail> addDetails = new List<BllArrivalNoticeDetail>();
                    List<BllArrivalNoticeDetail> editDetails = new List<BllArrivalNoticeDetail>();
                    var maxLotNo = "";
                    foreach (ArrivalNoticeDetailVm detailModel in detailModels)
                    foreach (var detailModel in detailModels)
                    {
                        // 基础验证
                        if (string.IsNullOrEmpty(detailModel.SkuNo))
                        {
                            strMessage = "-1:物料编码不可为空;";
                            return strMessage;
                        }
                            return "-1:物料编码不可为空;";
                        if (string.IsNullOrEmpty(detailModel.SkuName))
                        {
                            strMessage = "-1:物料名称不可为空;";
                            return strMessage;
                        }
                            return "-1:物料名称不可为空;";
                        if (detailModel.Qty == null || detailModel.Qty <= 0)
                            return "-1:数量必须大于0;";
                        // 关键逻辑:获取物料的受控状态
                        // 1. 根据物料编码查询物料信息 FirstOrDefault
                        var material = Db.Queryable<SysMaterials>()
                            .First(m => m.SkuNo == detailModel.SkuNo && m.IsDel == "0");
                        if (material == null)
                            return $"-1:物料编码{detailModel.SkuNo}不存在或已删除;";
                        // 2. 将字符串类型的IsControlled转换为bool(根据实际取值规则调整)
                        // 比如:"1"表示受控,"0"表示不受控;或"True"/"False";或"是"/"否"
                        bool isControlled;
                        if (!bool.TryParse(material.IsControlled, out isControlled))
                        {
                            strMessage = "-1:数量必须大于0;";
                            return strMessage;
                        }
                        if (model.Type == "0" || model.Type == "2" || model.Type == "3" || model.Type == "4")
                        {
                            if (string.IsNullOrWhiteSpace(detailModel.LotNo))
                            {
                                throw new Exception("当前单据类型批次不可为空!");
                            }
                            // 处理非标准格式(如"1"/"0")
                            isControlled = material.IsControlled == "1" ||
                                           string.Equals(material.IsControlled, "是", StringComparison.OrdinalIgnoreCase);
                        }
                        if (TypeLot.Contains(model.Type))
                        // 3. 根据受控状态验证日期
                        if (isControlled)
                        {
                            if (string.IsNullOrWhiteSpace(detailModel.Lot1))
                            {
                                throw new Exception("生产日期不可为空!");
                            }
                            // 受控状态:生产日期必填
                            if (string.IsNullOrWhiteSpace(detailModel.Lot1))
                                return $"-1:物料{detailModel.SkuNo}为受控物料,生产日期不可为空;";
                            // 受控状态:过期日期必填
                            if (string.IsNullOrWhiteSpace(detailModel.Lot2))
                            {
                                return $"-1:物料{detailModel.SkuNo}为受控物料,过期日期不可为空;";
                            // 验证日期格式有效性
                            if (!DateTime.TryParse(detailModel.Lot1, out DateTime productionDate))
                                return $"-1:物料{detailModel.SkuNo}的生产日期格式错误,请使用有效日期格式;";
                            if (!DateTime.TryParse(detailModel.Lot2, out DateTime expiryDate))
                                return $"-1:物料{detailModel.SkuNo}的过期日期格式错误,请使用有效日期格式;";
                            // 验证过期日期不能早于生产日期
                            if (expiryDate <= productionDate)
                                return $"-1:物料{detailModel.SkuNo}的过期日期不能早于生产日期;";
                        }
                        // 不受控状态:日期非必填,无需验证
                        // 原有批次相关验证(保留)
                        if (TypeLot.Contains(model.Type))
                        {
                            if (string.IsNullOrWhiteSpace(detailModel.Lot1))
                                throw new Exception("生产日期不可为空!");
                            if (string.IsNullOrWhiteSpace(detailModel.Lot2))
                                throw new Exception("过期日期不可为空!");
                            }
                        }
                        // 判断是否已存在当前明细
                        var com =  dbDetailModels.Where(m => m.SkuNo == detailModel.SkuNo
                        && m.LotNo == detailModel.LotNo && m.Id != detailModel.Id && m.IsDel == "0").Count();
                        if (com > 0)
                        // 验证物料和批次号是否重复
                        if (dbDetailModels.Any(m => m.SkuNo == detailModel.SkuNo
                                                  && m.LotNo == detailModel.LotNo
                                                  && m.Id != detailModel.Id
                                                  && m.IsDel == "0"))
                        {
                            strMessage = "-1:物料和批次号重复;";
                            return strMessage;
                            return "-1:物料和批次号重复;";
                        }
                        if (detailModel.Price == null)
                        {
                            detailModel.Price = 0;
                        }
                        //生成自有批次
                        // 处理价格默认值
                        detailModel.Price ??= 0;
                        // 生成箱码(自有批次逻辑)
                        if (detailModel.Id == 0 || detailModel.Id == null || string.IsNullOrWhiteSpace(detailModel.LotNo))
                        {
                            var notice = Db.Queryable<BllArrivalNotice>().Where(m => m.IsDel == "0" && TypeLot.Contains(m.Type)).Select(m => m.ASNNo).ToList();
                            if (string.IsNullOrWhiteSpace(maxLotNo))
                            {
                                maxLotNo = Db.Queryable<BllArrivalNoticeDetail>().Where(m => m.IsDel == "0" && !string.IsNullOrWhiteSpace(m.LotNo) && notice.Contains(m.ASNNo)).Max(m => m.LotNo);
                            }
                            if (string.IsNullOrWhiteSpace(maxLotNo))
                            {
                                maxLotNo = toDayTime.Substring(2, 6) + "0001";
                            }
                            else
                            {
                                var lotStr = maxLotNo.Substring(0, 6);
                                var timeStr = toDayTime.Substring(2, 6);
                                if (lotStr == timeStr)
                                {
                                    maxLotNo = toDayTime.Substring(2, 6) + (int.Parse(maxLotNo.Substring(6, 4)) + 1).ToString().PadLeft(4, '0');
                                }
                                else
                                {
                                    maxLotNo = timeStr + "0001";
                                }
                            }
                            detailModel.LotNo = maxLotNo;
                            var maxBoxCodeStr = Db.Queryable<BllArrivalNoticeDetail>()
                                .Where(m => m.IsDel == "0" && m.BoxCodeStr.Contains("BK")
                                          && m.CreateTime.ToString("yyyyMM") == DateTime.Now.ToString("yyyyMM"))
                                .Max(m => m.BoxCodeStr);
                            detailModel.BoxCodeStr = string.IsNullOrWhiteSpace(maxBoxCodeStr)
                                ? "BK" + toDayTime.Substring(2, 4) + "0001"
                                : "BK" + (int.Parse(maxBoxCodeStr.Replace("BK", "")) + 1).ToString();
                        }
                        // 处理新增明细
                        if (detailModel.Id == 0 || detailModel.Id == null)
                        {
                            //if (model.Type == "1")
                            //{
                            //    strMessage = "-1:采购入库不可更改明细,只可编辑数量;";
                            //    return strMessage;
                            //}
                            // 计算出总金额
                            detailModel.Money = detailModel.Price * detailModel.Qty;
                            BllArrivalNoticeDetail addModel = new BllArrivalNoticeDetail()
                            addDetails.Add(new BllArrivalNoticeDetail
                            {
                                ASNNo = model.ASNNo,
                                SkuNo = detailModel.SkuNo,
                                SkuName = detailModel.SkuName,
                                Standard = detailModel.Standard,
                                LotNo = detailModel.LotNo.Trim(),
                                LotNo = detailModel.LotNo?.Trim() ?? "",
                                LotText = detailModel.LotText,
                                Qty = (decimal)detailModel.Qty,
                                PackagNo = detailModel.PackagNo,
                                Price = detailModel.Price,
                                Money = detailModel.Money,
                                FactQty = 0,                        // 已组数量
                                CompleteQty = 0,                    // 完成数量
                                FactQty = 0,
                                CompleteQty = 0,
                                IsBale = detailModel.IsBale,
                                IsBelt = detailModel.IsBelt,
                                SupplierLot = detailModel.SupplierLot,
@@ -646,92 +670,87 @@
                                InspectStatus = "0",
                                Lot1 = detailModel.Lot1,
                                Lot2 = detailModel.Lot2,
                                BoxCodeStr = detailModel.BoxCodeStr,
                                UDF1 = detailModel.UDF1,
                                UDF2 = detailModel.UDF2,
                                UDF3 = detailModel.UDF3,
                                UDF4 = detailModel.UDF4,
                                UDF5 = detailModel.UDF5,
                                CreateUser=(int)model.CreateUser
                            };
                            addDetails.Add(addModel);
                                CreateUser = (int)model.CreateUser
                            });
                        }
                        // 处理编辑明细
                        else
                        {
                            //判断是否更改
                            int rowNum = dbDetailModels
                                .Count(it => it.Id == detailModel.Id
                                             && it.Qty == detailModel.Qty
                                             && it.LotNo == detailModel.LotNo
                                             && it.LotText == detailModel.LotText
                                             && 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
                                             && it.UDF4 == detailModel.UDF4
                                             && it.UDF5 == detailModel.UDF5);
                            if (rowNum > 0)
                            // 检查是否有实际修改
                            var existingDetail = dbDetailModels.First(m => m.Id == detailModel.Id);
                            if (existingDetail.Qty == detailModel.Qty
                                && existingDetail.LotNo == detailModel.LotNo
                                && existingDetail.LotText == detailModel.LotText
                                && existingDetail.SupplierLot == detailModel.SupplierLot
                                && existingDetail.IsBale == detailModel.IsBale
                                && existingDetail.IsBelt == detailModel.IsBelt
                                && existingDetail.Lot1 == detailModel.Lot1
                                && existingDetail.Lot2 == detailModel.Lot2
                                && existingDetail.BoxCodeStr == detailModel.BoxCodeStr
                                && existingDetail.UDF1 == detailModel.UDF1
                                && existingDetail.UDF2 == detailModel.UDF2
                                && existingDetail.UDF3 == detailModel.UDF3
                                && existingDetail.UDF4 == detailModel.UDF4
                                && existingDetail.UDF5 == detailModel.UDF5)
                            {
                                continue;
                            }
                            var dbDetail = dbDetailModels.First(m => m.Id == detailModel.Id);
                            if (TypeLot.Contains(model.Type))
                            // 批次不可更改验证
                            if (TypeLot.Contains(model.Type)
                                && !string.IsNullOrWhiteSpace(existingDetail.LotNo)
                                && existingDetail.LotNo != detailModel.LotNo)
                            {
                                if (!string.IsNullOrWhiteSpace(dbDetail.LotNo))
                                {
                                    if (dbDetail.LotNo != detailModel.LotNo)
                                    {
                                        strMessage = "-1:当前单据类型不可更改批次;";
                                        continue;
                                    }
                                }
                                return "-1:当前单据类型不可更改批次;";
                            }
                            // 计算出总金额
                            detailModel.Money = detailModel.Price * detailModel.Qty;
                            dbDetail.Qty = (decimal)detailModel.Qty;
                            dbDetail.LotNo = detailModel.LotNo;
                            dbDetail.Money = detailModel.Money;
                            dbDetail.LotText = detailModel.LotText;
                            dbDetail.SupplierLot = detailModel.SupplierLot;
                            dbDetail.IsBale = detailModel.IsBale;
                            dbDetail.Lot1 = detailModel.Lot1;
                            dbDetail.Lot2 = detailModel.Lot2;
                            dbDetail.UDF1 = detailModel.UDF1;
                            dbDetail.UDF2 = detailModel.UDF2;
                            dbDetail.UDF3 = detailModel.UDF3;
                            dbDetail.UDF4 = detailModel.UDF4;
                            dbDetail.UDF5 = detailModel.UDF5;
                            dbDetail.UpdateTime = dateTime;
                            dbDetail.UpdateUser = model.CreateUser;
                            // 更新明细信息
                            existingDetail.Qty = (decimal)detailModel.Qty;
                            existingDetail.LotNo = detailModel.LotNo?.Trim() ?? "";
                            existingDetail.Money = detailModel.Price * detailModel.Qty;
                            existingDetail.LotText = detailModel.LotText;
                            existingDetail.SupplierLot = detailModel.SupplierLot;
                            existingDetail.IsBale = detailModel.IsBale;
                            existingDetail.Lot1 = detailModel.Lot1;
                            existingDetail.Lot2 = detailModel.Lot2;
                            existingDetail.BoxCodeStr = detailModel.BoxCodeStr;
                            existingDetail.UDF1 = detailModel.UDF1;
                            existingDetail.UDF2 = detailModel.UDF2;
                            existingDetail.UDF3 = detailModel.UDF3;
                            existingDetail.UDF4 = detailModel.UDF4;
                            existingDetail.UDF5 = detailModel.UDF5;
                            existingDetail.UpdateTime = dateTime;
                            existingDetail.UpdateUser = model.CreateUser;
                            editDetails.Add(dbDetail);
                            editDetails.Add(existingDetail);
                        }
                    }
                    // 事务处理
                    Db.Ado.BeginTran();
                    Db.Updateable(dbDetailModels).ExecuteCommand();
                    int rowCount = Db.Updateable(asnInfo).ExecuteCommand();
                    var rowDetailCount = 1;
                    if (addDetails.Count > 0)
                    {
                        rowDetailCount = Db.Insertable(addDetails).ExecuteCommand();
                    }
                    if (editDetails.Count > 0)
                    {
                        rowDetailCount += Db.Updateable(editDetails).ExecuteCommand();
                    }
                    int rowDetailCount = 1;
                    Db.Ado.CommitTran();
                    if (addDetails.Any())
                        rowDetailCount = Db.Insertable(addDetails).ExecuteCommand();
                    if (editDetails.Any())
                        rowDetailCount += Db.Updateable(editDetails).ExecuteCommand();
                    if (rowCount > 0 && rowDetailCount > 0)
                    {
                        new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", model.ASNNo, "编辑", $"编辑了单据号为{model.ASNNo}的单据信息", Convert.ToInt32(model.CreateUser));
                        Db.Ado.CommitTran();
                        new OperationASNServer().AddLogOperationAsn(
                            "入库作业", "入库单据", model.ASNNo, "编辑",
                            $"编辑了单据号为{model.ASNNo}的单据信息", Convert.ToInt32(model.CreateUser));
                        return strMessage;
                    }
                    else
@@ -746,6 +765,7 @@
                throw ex;
            }
        }
        //删除入库单
        public string DelArrivalNotice(ArrivalNoticeVm model)
        {
@@ -941,108 +961,108 @@
                    return "-1:关单失败!";
                }
                #region 采购计划,若是采购订单根据采购计划单自动生成入库单信息
                if (notice.Type == "1" && !string.IsNullOrEmpty(notice.OrderCode))
                {
                    // 获取采购总单信息
                    var planOrd = Db.Queryable<BllProcurePlanNotice>().First(it => it.OrderCode == notice.OrderCode && it.IsDel == "0");
                    //入库单明细
                    var noticeDetailList = Db.Queryable<BllArrivalNoticeDetail>()
                        .Where(m => m.IsDel == "0" && m.ASNNo == notice.ASNNo).ToList();
                    foreach (var item in noticeDetailList)
                    {
                        //采购单明细
                        var planDetail = Db.Queryable<BllProcurePlanNoticeDetail>()
                            .First(it => it.ParentId == planOrd.Id && it.SkuNo == item.SkuNo && it.IsDel == "0");
                        planDetail.CompleteQty += item.CompleteQty;
                        if (planDetail.CompleteQty >= planDetail.Qty)
                        {
                            planDetail.Status = "2";
                            planDetail.CompleteTime = comTime;
                        }
                        else
                        {
                            planDetail.Status = "1";
                        }
                        Db.Updateable(planDetail).ExecuteCommand();
                    }
                    // 维护采购总单信息
                    var planDetailNum = Db.Queryable<BllProcurePlanNoticeDetail>().Count(m => m.IsDel == "0" && m.ParentId == planOrd.Id && m.Status != "2");
                    if (planDetailNum == 0)
                    {
                        planOrd.Status = "2";
                        planOrd.CompleteTime = comTime;
                        Db.Updateable(planOrd).ExecuteCommand();
                    }
                    else
                    {
                        if (planOrd.Status == "0")
                        {
                            planOrd.Status = "1";
                            Db.Updateable(planOrd).ExecuteCommand();
                        }
                    }
                    //采购单明细
                    var planDetailList = Db.Queryable<BllProcurePlanNoticeDetail>()
                        .Where(it => it.ParentId == planOrd.Id && it.IsDel == "0" && it.CompleteQty < it.Qty).ToList();
                    foreach (var item in planDetailList)
                    {
                        //判断有无正在执行的
                        var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().First(it => it.OrderDetailCode == item.OrderDetailCode && it.IsDel == "0" && it.Status == "0");
                        if (noticeDetail != null)
                        {
                            continue;
                        }
                        // 获取物料详细信息
                        var skuModel = Db.Queryable<SysMaterials>().First(it => it.SkuNo == item.SkuNo && it.IsDel == "0");
                        if (skuModel == null)
                        {
                            continue;
                        }
                        // 验证包装信息是否存在
                        var packagModel = Db.Queryable<SysPackag>().First(it => it.PackagNo == item.PackagNo && it.IsDel == "0");
                        if (packagModel == null)
                        {
                            continue;
                        }
                        // 入库总表信息
                        string asnNo = new Common().GetMaxNo("ASN");
                        var asnModel1 = new BllArrivalNotice()
                        {
                            ASNNo = asnNo,
                            Status = "0",//执行状态,0:等待执行
                            Type = "1",//单据类型,1:采购入库
                            Origin = "采购单",
                            CustomerNo = item.CustomerNo,
                            CustomerName = item.CustomerName,
                            OrderCode = planOrd.OrderCode,
                            CreateUser = 0
                        };
                        // 插入入库总表信息
                        Db.Insertable(asnModel1).ExecuteCommand();
                        //入库单明细
                        var arrDetailModel = new BllArrivalNoticeDetail()
                        {
                            ASNNo = asnNo,
                            SkuNo = skuModel.SkuNo,
                            SkuName = skuModel.SkuName,
                            Standard = skuModel.Standard,
                            LotNo = "",
                            LotText = "",
                            Qty = 0,
                            FactQty = 0,
                            CompleteQty = 0,
                            PackagNo = packagModel.PackagNo,
                            SupplierLot = "",
                            Status = "0",
                            IsSampling = "0",
                            InspectStatus = "0",
                            OrderDetailCode = item.OrderDetailCode,
                            CreateUser = 0
                        };
                        // 插入入库总表信息
                        Db.Insertable(arrDetailModel).ExecuteCommand();
                    }
                }
                //if (notice.Type == "1" && !string.IsNullOrEmpty(notice.OrderCode))
                //{
                //    // 获取采购总单信息
                //    var planOrd = Db.Queryable<BllProcurePlanNotice>().First(it => it.OrderCode == notice.OrderCode && it.IsDel == "0");
                //    //入库单明细
                //    var noticeDetailList = Db.Queryable<BllArrivalNoticeDetail>()
                //        .Where(m => m.IsDel == "0" && m.ASNNo == notice.ASNNo).ToList();
                //    foreach (var item in noticeDetailList)
                //    {
                //        //采购单明细
                //        var planDetail = Db.Queryable<BllProcurePlanNoticeDetail>()
                //            .First(it => it.ParentId == planOrd.Id && it.SkuNo == item.SkuNo && it.IsDel == "0");
                //        planDetail.CompleteQty += item.CompleteQty;
                //        if (planDetail.CompleteQty >= planDetail.Qty)
                //        {
                //            planDetail.Status = "2";
                //            planDetail.CompleteTime = comTime;
                //        }
                //        else
                //        {
                //            planDetail.Status = "1";
                //        }
                //        Db.Updateable(planDetail).ExecuteCommand();
                //    }
                //    // 维护采购总单信息
                //    var planDetailNum = Db.Queryable<BllProcurePlanNoticeDetail>().Count(m => m.IsDel == "0" && m.ParentId == planOrd.Id && m.Status != "2");
                //    if (planDetailNum == 0)
                //    {
                //        planOrd.Status = "2";
                //        planOrd.CompleteTime = comTime;
                //        Db.Updateable(planOrd).ExecuteCommand();
                //    }
                //    else
                //    {
                //        if (planOrd.Status == "0")
                //        {
                //            planOrd.Status = "1";
                //            Db.Updateable(planOrd).ExecuteCommand();
                //        }
                //    }
                //    //采购单明细
                //    var planDetailList = Db.Queryable<BllProcurePlanNoticeDetail>()
                //        .Where(it => it.ParentId == planOrd.Id && it.IsDel == "0" && it.CompleteQty < it.Qty).ToList();
                //    foreach (var item in planDetailList)
                //    {
                //        //判断有无正在执行的
                //        var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().First(it => it.OrderDetailCode == item.OrderDetailCode && it.IsDel == "0" && it.Status == "0");
                //        if (noticeDetail != null)
                //        {
                //            continue;
                //        }
                //        // 获取物料详细信息
                //        var skuModel = Db.Queryable<SysMaterials>().First(it => it.SkuNo == item.SkuNo && it.IsDel == "0");
                //        if (skuModel == null)
                //        {
                //            continue;
                //        }
                //        // 验证包装信息是否存在
                //        var packagModel = Db.Queryable<SysPackag>().First(it => it.PackagNo == item.PackagNo && it.IsDel == "0");
                //        if (packagModel == null)
                //        {
                //            continue;
                //        }
                //        // 入库总表信息
                //        string asnNo = new Common().GetMaxNo("ASN");
                //        var asnModel1 = new BllArrivalNotice()
                //        {
                //            ASNNo = asnNo,
                //            Status = "0",//执行状态,0:等待执行
                //            Type = "1",//单据类型,1:采购入库
                //            Origin = "采购单",
                //            CustomerNo = item.CustomerNo,
                //            CustomerName = item.CustomerName,
                //            OrderCode = planOrd.OrderCode,
                //            CreateUser = 0
                //        };
                //        // 插入入库总表信息
                //        Db.Insertable(asnModel1).ExecuteCommand();
                //        //入库单明细
                //        var arrDetailModel = new BllArrivalNoticeDetail()
                //        {
                //            ASNNo = asnNo,
                //            SkuNo = skuModel.SkuNo,
                //            SkuName = skuModel.SkuName,
                //            Standard = skuModel.Standard,
                //            LotNo = "",
                //            LotText = "",
                //            Qty = 0,
                //            FactQty = 0,
                //            CompleteQty = 0,
                //            PackagNo = packagModel.PackagNo,
                //            SupplierLot = "",
                //            Status = "0",
                //            IsSampling = "0",
                //            InspectStatus = "0",
                //            OrderDetailCode = item.OrderDetailCode,
                //            CreateUser = 0
                //        };
                //        // 插入入库总表信息
                //        Db.Insertable(arrDetailModel).ExecuteCommand();
                //    }
                //}
                #endregion
                Db.Ado.CommitTran();
@@ -1217,77 +1237,71 @@
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public ErpModel CreateAsn(AsnInfo model)
        public ErpModel CreateAsn(SendAsnVm model,string userName)
        {
            try
            {
                var resultModel = new ErpModel() { Success = -1, Message = "" };
                if (string.IsNullOrEmpty(model.AsnType))
                if (string.IsNullOrEmpty(model.billType.ToString()))
                {
                    resultModel.Message = "单据类型不可为空!";
                    return resultModel;
                }
                if (string.IsNullOrEmpty(model.Customer))
                {
                    resultModel.Message = "客户不可为空!";
                    return resultModel;
                }
                if (string.IsNullOrEmpty(model.OrderCode))
                if (string.IsNullOrEmpty(model.orderNo.ToString()))
                {
                    resultModel.Message = "上游系统单号不可为空!";
                    return resultModel;
                }
                if (model.AsnDetails.Count <= 0)
                if (model.orderDCmdList.Count <= 0)
                {
                    resultModel.Message = "入库单明细不可为空!";
                    return resultModel;
                }
                // 根据客户编号获取客户名称
                var CustomerModel = Db.Queryable<SysCustomer>().First(it => it.CustomerNo == model.Customer && it.IsDel == "0");
                if (CustomerModel == null)
                var asnModel = Db.Queryable<BllArrivalNotice>().First(w => w.IsDel == "0" && w.OrderCode == model.orderNo);
                if (asnModel != null)
                {
                    resultModel.Message = "客户编号不存在!";
                    resultModel.Message = $"{model.orderNo}该单号已存在入库单!";
                    return resultModel;
                }
                // 入库总表信息
                string asnNo = new Common().GetMaxNo("ASN");
                var asnModel = new BllArrivalNotice()
                asnModel = new BllArrivalNotice()
                {
                    ASNNo = asnNo,
                    Status = "0",//等待执行
                    Type = model.AsnType,
                    Origin = string.IsNullOrEmpty(model.Origin) ? "ERP" : model.Origin,
                    CustomerNo = model.Customer,
                    CustomerName = CustomerModel.CustomerName,
                    OrderCode = model.OrderCode,
                    UserName = model.Username
                    Type = model.billType.ToString(),
                    Origin = "SAP",
                    CustomerNo = model.vendorNo,
                    CustomerName = model.vendorName,
                    OrderCode = model.orderNo.ToString(),
                    UserName = userName
                };
                // 入库明细表信息
                List<BllArrivalNoticeDetail> detailModels = new List<BllArrivalNoticeDetail>();
                foreach (AsnDetail asnDetailModel in model.AsnDetails)
                foreach (var asnDetailModel in model.orderDCmdList)
                {
                    if (string.IsNullOrEmpty(asnDetailModel.SkuNo))
                    if (string.IsNullOrEmpty(asnDetailModel.skuNo.ToString()))
                    {
                        resultModel.Message = "物料编码不可为空!";
                        return resultModel;
                    }
                    if (asnDetailModel.Qty <= 0)
                    if (Convert.ToDecimal(asnDetailModel.expectedQty) <= 0)
                    {
                        resultModel.Message = "数量应为正整数!";
                        resultModel.Message = "应收物料数量应大于0!";
                        return resultModel;
                    }
                    if (string.IsNullOrEmpty(asnDetailModel.LotNo))
                    if (string.IsNullOrEmpty(asnDetailModel.lotNo) && asnModel.Type != "1")
                    {
                        resultModel.Message = "批次号不可为空!";
                        resultModel.Message = "非采购入库,批次号不可为空!";
                        return resultModel;
                    }
                    // 获取物料详细信息
                    var skuModel = Db.Queryable<SysMaterials>().First(it => it.SkuNo == asnDetailModel.SkuNo && it.IsDel == "0");
                    var skuModel = Db.Queryable<SysMaterials>().First(it => it.SkuNo == asnDetailModel.skuNo.ToString() && it.IsDel == "0");
                    if (skuModel == null)
                    {
                        resultModel.Message = "不存在当前物料信息!";
@@ -1298,22 +1312,42 @@
                    var detailModel = new BllArrivalNoticeDetail()
                    {
                        OrderDetailCode = asnDetailModel.lineNo,
                        ASNNo = asnNo,
                        SkuNo = asnDetailModel.SkuNo,
                        SkuNo = asnDetailModel.skuNo.ToString(),
                        SkuName = skuModel.SkuName,
                        Standard = skuModel.Standard,
                        LotNo = asnDetailModel.LotNo,
                        LotNo = asnDetailModel.lotNo,
                        LotText = "",
                        Qty = (decimal)asnDetailModel.Qty,
                        FactQty=0,
                        CompleteQty=0,
                        Qty = Convert.ToDecimal(asnDetailModel.expectedQty),
                        FactQty = 0,
                        CompleteQty = 0,
                        PackagNo = skuModel.PackagNo,
                        SupplierLot = asnDetailModel.SupplierLot,
                        SupplierLot = asnDetailModel.supplyBatch,
                        Lot1 = asnDetailModel.productionDate,//生产日期
                        Lot2 = asnDetailModel.expireDate,//过期日期
                        Status = "0",
                        IsSampling = "0",
                        InspectStatus = "0",
                        CreateUser = 0
                    };
                    detailModel.BoxCodeStr = detailModel.LotNo;
                    if (string.IsNullOrWhiteSpace(detailModel.LotNo))
                    {
                        string toDayTime = DateTime.Now.ToString("yyyyMM");
                        var maxBoxCodeStr = Db.Queryable<BllArrivalNoticeDetail>()
                            .Where(m => m.IsDel == "0" && m.BoxCodeStr.Contains("BK")
                            && m.CreateTime.ToString("yyyyMM") == DateTime.Now.ToString("yyyyMM")).Max(m => m.BoxCodeStr);
                        if (string.IsNullOrWhiteSpace(maxBoxCodeStr))
                        {
                            maxBoxCodeStr = "BK" + toDayTime.Substring(2, 4) + "0001";
                        }
                        else
                        {
                            maxBoxCodeStr = "BK" + (int.Parse(maxBoxCodeStr.Replace("BK", "")) + 1).ToString();
                        }
                        detailModel.BoxCodeStr = maxBoxCodeStr;
                    }
                    detailModels.Add(detailModel);
                }
@@ -1361,36 +1395,47 @@
                {
                    throw new Exception("复核失败,复核人员和关闭订单人员不能相同!");
                }
                var list = new List<AsnDetail>();
                var list = new List<BackAsnDetail>();
                foreach (var d in detail)
                {
                    var item = new AsnDetail()
                    var mater = Db.Queryable<SysMaterials>().First(w => w.IsDel == "0" && w.SkuNo == d.SkuNo);
                    if (mater == null)
                    {
                        SkuNo = d.SkuNo,
                        LotNo = d.LotNo,
                        Qty = d.CompleteQty,
                        PackagNo = d.PackagNo,
                        SupplierLot = d.SupplierLot
                        throw new Exception($"复核失败,物料编码:{d.SkuNo}的物料信息不存在");
                    }
                    var item = new BackAsnDetail()
                    {
                        POSNR=d.OrderDetailCode,
                        MATNR = d.SkuNo,
                        MAKTX=d.SkuName,
                        LFIMG = d.CompleteQty.ToString(),
                        MEINS= mater.UnitNo,
                        CHARG = d.LotNo,
                        HSDAT = d.Lot1,
                        VFDAT = d.Lot2
                    };
                    list.Add(item);
                }
                var soInfo = new AsnInfo()
                var soInfo = new BackAsnVm()
                {
                    OrderCode = notice.OrderCode,
                    AsnDetails = list
                    ZUUID = Guid.NewGuid().ToString(),
                    VBELN = notice.OrderCode,
                    LFART = notice.Type,
                    WADAT_IST = Convert.ToDateTime(notice.CompleteTime).ToString("yyyy-MM-dd"),
                    ITEM = list
                };
                #region 通过接口发送至erp 
                //系统对接后放开
                /*var jsonData = JsonConvert.SerializeObject(soInfo);
                var jsonData = JsonConvert.SerializeObject(soInfo);
                var response = HttpHelper.DoPost(url, jsonData, "入库单完成上传", "ERP");
                var response = HttpHelper.DoPost(url, jsonData, "入库单完成上传", "SAP");
                var obj = JsonConvert.DeserializeObject<ErpModel>(response);//解析返回数据
                if (obj.Success != 0)
                {
                    throw new Exception("上传失败" + obj.Message);
                }*/
                }
                #endregion
                notice.Status = "4";