|  |  |  | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | try | 
|---|
|  |  |  | { | 
|---|
|  |  |  | if (model.Origin == "录入") | 
|---|
|  |  |  | if (model.Origin == "录入" || model.Origin == "导入") | 
|---|
|  |  |  | { | 
|---|
|  |  |  | model.ASNNo = new Common().GetMaxNo("ASN"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | throw new Exception("单据类型不可为空!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | lock (AsnLock) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | 
|---|
|  |  |  | { | 
|---|
|  |  |  | throw new Exception("不免检物料过期日期转换失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | lot1 = lot12.ToString(); | 
|---|
|  |  |  | lot2 = lot22.ToString(); | 
|---|
|  |  |  | lot1 = lot12.ToString("yyyy-MM-dd"); | 
|---|
|  |  |  | lot2 = lot22.ToString("yyyy-MM-dd"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (string.IsNullOrWhiteSpace(detailModel.PackagNo)) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | throw new Exception("包装不能为空"); | 
|---|
|  |  |  | detailModel.PackagNo = sku.PackagNo; | 
|---|
|  |  |  | if (string.IsNullOrWhiteSpace(detailModel.PackagNo)) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | throw new Exception("包装不能为空"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 计算出总金额 | 
|---|
|  |  |  | detailModel.Money = detailModel.Price * detailModel.Qty; | 
|---|
|  |  |  | 
|---|
|  |  |  | ASNNo = model.ASNNo, | 
|---|
|  |  |  | SkuNo = detailModel.SkuNo, | 
|---|
|  |  |  | SkuName = detailModel.SkuName, | 
|---|
|  |  |  | Standard = detailModel.Standard, | 
|---|
|  |  |  | Standard = sku.Standard, | 
|---|
|  |  |  | LotNo = detailModel.LotNo == null ? "" : detailModel.LotNo.Trim(), | 
|---|
|  |  |  | LotText = detailModel.LotText, | 
|---|
|  |  |  | Qty = (decimal)detailModel.Qty, | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //编辑入库单据 | 
|---|
|  |  |  | //导入入库单据 | 
|---|
|  |  |  | public string ImportArrivalNotice(ArrivalNoticeVms models) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | string strMessage = ""; | 
|---|
|  |  |  | try | 
|---|
|  |  |  | { | 
|---|
|  |  |  | if (models.ListArrivalNotice.Count <= 0) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | strMessage = "-1:文件内无数据请核实!"; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | var num = 0; | 
|---|
|  |  |  | int CreateUser = Convert.ToInt32(models.CreateUser); | 
|---|
|  |  |  | List<string> noticeList = new List<string>(); | 
|---|
|  |  |  | foreach (ArrivalNoticeVm model in models.ListArrivalNotice) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | try | 
|---|
|  |  |  | { | 
|---|
|  |  |  | model.CreateUser = models.CreateUser; | 
|---|
|  |  |  | model.Origin = "导入"; | 
|---|
|  |  |  | var msg = AddArrivalNotice(model); | 
|---|
|  |  |  | strMessage += msg; | 
|---|
|  |  |  | if (msg == "") | 
|---|
|  |  |  | { | 
|---|
|  |  |  | num += 1; | 
|---|
|  |  |  | var hasBoxItem = noticeList.Exists(x => x == model.ASNNo); | 
|---|
|  |  |  | if (!hasBoxItem) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | noticeList.Add(model.ASNNo); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | catch(Exception ex) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | throw new Exception($"物料编码:{model.AsnDetail[0].SkuNo},物料名称:{model.AsnDetail[0].SkuName},导入失败:"+ex.Message); | 
|---|
|  |  |  | // ignored | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (num > 0) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", $"共导入了{noticeList.Count}条单据", "导入", $"共导入了{noticeList.Count}条单据", CreateUser); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (strMessage.Contains("-1") && num > 0) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | return "部分导入成功" + strMessage; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (num > 0) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | return "导入成功" + strMessage; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return strMessage; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | catch (Exception ex) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | throw new Exception(ex.Message); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /// <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; | 
|---|
|  |  |  | 
|---|
|  |  |  | 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) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | 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("当前单据类型批次不可为空!"); | 
|---|
|  |  |  | //    } | 
|---|
|  |  |  | //} | 
|---|
|  |  |  | return "-1:数量必须大于0;"; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (TypeLot.Contains(model.Type)) | 
|---|
|  |  |  | // 关键逻辑:获取物料的受控状态 | 
|---|
|  |  |  | // 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)) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | if (string.IsNullOrWhiteSpace(detailModel.Lot1)) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | throw new Exception("生产日期不可为空!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 处理非标准格式(如"1"/"0") | 
|---|
|  |  |  | isControlled = material.IsControlled == "1" || | 
|---|
|  |  |  | string.Equals(material.IsControlled, "是", StringComparison.OrdinalIgnoreCase); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 3. 根据受控状态验证日期 | 
|---|
|  |  |  | if (isControlled) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | // 受控状态:生产日期必填 | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | if (string.IsNullOrWhiteSpace(maxBoxCodeStr)) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | maxBoxCodeStr = "BK" + toDayTime.Substring(2, 4) + "0001"; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | else | 
|---|
|  |  |  | { | 
|---|
|  |  |  | maxBoxCodeStr = "BK" + (int.Parse(maxBoxCodeStr.Replace("BK", "")) + 1).ToString(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | detailModel.BoxCodeStr = maxBoxCodeStr; | 
|---|
|  |  |  | .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 == null ? "" : 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, | 
|---|
|  |  |  | 
|---|
|  |  |  | 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.BoxCodeStr == detailModel.BoxCodeStr | 
|---|
|  |  |  | && 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 == null ? "" : detailModel.LotNo.Trim(); | 
|---|
|  |  |  | 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.BoxCodeStr = detailModel.BoxCodeStr; | 
|---|
|  |  |  | 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 | 
|---|
|  |  |  | 
|---|
|  |  |  | throw ex; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //删除入库单 | 
|---|
|  |  |  | public string DelArrivalNotice(ArrivalNoticeVm model) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | 
|---|
|  |  |  | return "-1:入库单状态已变更,不可删除!"; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (asnModel.Origin != "录入" && asnModel.Origin != "采购单") | 
|---|
|  |  |  | { | 
|---|
|  |  |  | return "-1:上游系统下发的单据,不可删除;"; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //if (asnModel.Origin != "录入" && asnModel.Origin != "采购单") | 
|---|
|  |  |  | //{ | 
|---|
|  |  |  | //    return "-1:上游系统下发的单据,不可删除;"; | 
|---|
|  |  |  | //} | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 删除总单 | 
|---|
|  |  |  | var editDateTime = DateTime.Now; | 
|---|
|  |  |  | 
|---|
|  |  |  | 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(); | 
|---|
|  |  |  | 
|---|
|  |  |  | resultModel.Message = "入库单明细不可为空!"; | 
|---|
|  |  |  | return resultModel; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | var asnModel = Db.Queryable<BllArrivalNotice>().First(w => w.IsDel == "0" && w.OrderCode == model.orderNo); | 
|---|
|  |  |  | if (asnModel != null) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | resultModel.Message = $"{model.orderNo}该单号已存在入库单!"; | 
|---|
|  |  |  | return resultModel; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 入库总表信息 | 
|---|
|  |  |  | string asnNo = new Common().GetMaxNo("ASN"); | 
|---|
|  |  |  | var asnModel = new BllArrivalNotice() | 
|---|
|  |  |  | asnModel = new BllArrivalNotice() | 
|---|
|  |  |  | { | 
|---|
|  |  |  | ASNNo = asnNo, | 
|---|
|  |  |  | Status = "0",//等待执行 | 
|---|
|  |  |  | 
|---|
|  |  |  | resultModel.Message = "应收物料数量应大于0!"; | 
|---|
|  |  |  | return resultModel; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (string.IsNullOrEmpty(asnDetailModel.lotNo.ToString())) | 
|---|
|  |  |  | if (string.IsNullOrEmpty(asnDetailModel.lotNo) && asnModel.Type != "1") | 
|---|
|  |  |  | { | 
|---|
|  |  |  | resultModel.Message = "批次号不可为空!"; | 
|---|
|  |  |  | resultModel.Message = "非采购入库,批次号不可为空!"; | 
|---|
|  |  |  | return resultModel; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | var detailModel = new BllArrivalNoticeDetail() | 
|---|
|  |  |  | { | 
|---|
|  |  |  | OrderDetailCode = asnDetailModel.lineNo, | 
|---|
|  |  |  | ASNNo = asnNo, | 
|---|
|  |  |  | SkuNo = asnDetailModel.skuNo.ToString(), | 
|---|
|  |  |  | SkuName = skuModel.SkuName, | 
|---|
|  |  |  | Standard = skuModel.Standard, | 
|---|
|  |  |  | LotNo = asnDetailModel.lotNo.ToString(), | 
|---|
|  |  |  | LotNo = asnDetailModel.lotNo, | 
|---|
|  |  |  | LotText = "", | 
|---|
|  |  |  | Qty = Convert.ToDecimal(asnDetailModel.expectedQty), | 
|---|
|  |  |  | FactQty = 0, | 
|---|
|  |  |  | CompleteQty = 0, | 
|---|
|  |  |  | PackagNo = skuModel.PackagNo, | 
|---|
|  |  |  | SupplierLot = asnDetailModel.supplyBatch,//生产日期 | 
|---|
|  |  |  | Lot1 = asnDetailModel.productionDate,//过期日期 | 
|---|
|  |  |  | Lot2 = asnDetailModel.expireDate, | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | { | 
|---|
|  |  |  | 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"; | 
|---|