| | |
| | | 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; |
| | |
| | | } |
| | | |
| | | //获取入库单明细剩余打印数量 |
| | | public string GetAsnDetailQtyList(int id) |
| | | public LabelPrintInfoDto GetAsnDetailQtyList(int id) |
| | | { |
| | | try |
| | | { |
| | |
| | | { |
| | | 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) |
| | | { |
| | |
| | | { |
| | | qty = 0; |
| | | } |
| | | return qty.ToString(); |
| | | data.Qty = qty.ToString(); |
| | | return data; |
| | | } |
| | | catch (Exception e) |
| | | { |
| | |
| | | }; |
| | | |
| | | List<BllArrivalNoticeDetail> details = new List<BllArrivalNoticeDetail>(); |
| | | var skuList = Db.Queryable<SysMaterials>().Where(m => m.IsDel == "0").ToList(); |
| | | |
| | | foreach (ArrivalNoticeDetailVm detailModel in model.AsnDetail) |
| | | { |
| | | if (string.IsNullOrEmpty(detailModel.SkuNo)) |
| | |
| | | strMessage = "-1:数量必须大于0;"; |
| | | continue; |
| | | } |
| | | |
| | | |
| | | if ( model.Type == "5" || model.Type == "6" || model.Type == "7") |
| | | { |
| | | if (!string.IsNullOrWhiteSpace(detailModel.LotNo)) |
| | |
| | | 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; |
| | | } |
| | | |
| | | // 判断是否已存在当前明细 |
| | |
| | | { |
| | | detailModel.Price = 0; |
| | | } |
| | | var sku = skuList.FirstOrDefault(m => m.SkuNo == detailModel.SkuNo); |
| | | if (sku == null) |
| | | { |
| | | throw new Exception("未查询出物料信息!"); |
| | | } |
| | | string lot1 = detailModel.Lot1; |
| | | string lot2 = detailModel.Lot2; |
| | | if (sku.IsInspect == "0")//是否免检,0:否 1:是 |
| | | { |
| | | //不免检物料 生产日期、有效期不能为空 |
| | | DateTime lot12; |
| | | DateTime lot22; |
| | | if (!DateTime.TryParse(detailModel.Lot1, out lot12)) |
| | | { |
| | | throw new Exception("不免检物料生产日期转换失败"); |
| | | } |
| | | if (!DateTime.TryParse(detailModel.Lot2, out lot22)) |
| | | { |
| | | throw new Exception("不免检物料过期日期转换失败"); |
| | | } |
| | | lot1 = lot12.ToString(); |
| | | lot2 = lot22.ToString(); |
| | | } |
| | | if (string.IsNullOrWhiteSpace(detailModel.PackagNo)) |
| | | { |
| | | throw new Exception("包装不能为空"); |
| | | } |
| | | // 计算出总金额 |
| | | detailModel.Money = detailModel.Price * detailModel.Qty; |
| | | BllArrivalNoticeDetail detail = new BllArrivalNoticeDetail() |
| | |
| | | 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, |
| | |
| | | Status = "0", |
| | | IsSampling = "0", |
| | | InspectStatus = "0", |
| | | Lot1 = lot1, //生产日期 |
| | | Lot2 = lot2, // 过期日期 |
| | | BoxCodeStr = detailModel.BoxCodeStr, |
| | | UDF1 = detailModel.UDF1, |
| | | UDF2 = detailModel.UDF2, |
| | | UDF3 = detailModel.UDF3, |
| | |
| | | } |
| | | } |
| | | |
| | | //编辑入库单据 |
| | | /// <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) |
| | | 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, |
| | |
| | | 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 |
| | |
| | | throw ex; |
| | | } |
| | | } |
| | | |
| | | //删除入库单 |
| | | public string DelArrivalNotice(ArrivalNoticeVm model) |
| | | { |
| | |
| | | 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(); |
| | |
| | | /// </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 = "不存在当前物料信息!"; |
| | |
| | | |
| | | 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); |
| | | } |
| | |
| | | { |
| | | 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"; |