using Model.InterFaceModel; using Model.ModelDto; using Model.ModelDto.SysDto; using Model.ModelVm; using Model.ModelVm.SysVm; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using Model.ModelVm.BllAsnVm; using Newtonsoft.Json; using Utility.Tools; using WMS.BLL.LogServer; using WMS.DAL; using WMS.Entity.BllAsnEntity; using WMS.Entity.Context; using WMS.Entity.SysEntity; using WMS.IBLL.IBllAsnServer; using WMS.BLL.SysServer; using System.Threading.Tasks; using System.Security.Policy; using WMS.Entity.DataEntity; using WMS.Entity.BllQualityEntity; using Microsoft.VisualBasic; namespace WMS.BLL.BllAsnServer { public class ArrivalNoticeServer : DbHelper, IArrivalNoticeServer { #region 依赖注入 private static readonly SqlSugarScope Db = DataContext.Db; public ArrivalNoticeServer() : base(Db) { } #endregion #region 事件方法 public List GetArrivalNoticeList(ArrivalNoticeVm model, out int count) { string sqlString = string.Empty; string sqlCount = string.Empty; string sqlPub = string.Empty; try { sqlCount += "SELECT DISTINCT COUNT(tb1.ID) FROM BllArrivalNotice AS tb1 "; sqlString += "SELECT DISTINCT tb1.*,tb3.RealName as CreateUserName,tb4.RealName as UpdateUserName,tb5.RealName as CheckUserName FROM BllArrivalNotice AS tb1 "; sqlPub += "LEFT JOIN BllArrivalNoticeDetail AS tb2 ON tb1.ASNNo = tb2.ASNNo "; sqlPub += "LEFT JOIN SysUserInfor AS tb3 ON tb1.CreateUser = tb3.Id "; sqlPub += "LEFT JOIN SysUserInfor AS tb4 ON tb1.UpdateUser = tb4.Id "; sqlPub += "LEFT JOIN SysUserInfor AS tb5 ON tb1.CheckUser = tb5.Id "; sqlPub += $"WHERE tb1.ASNNo LIKE '%{model.ASNNo}%' AND tb2.LotNo LIKE '%{model.LotNo}%' "; sqlPub += $"AND tb2.SkuNo LIKE '%{model.SkuNo}%' AND tb2.SkuName LIKE '%{model.SkuName}%' "; sqlPub += $"AND tb1.CustomerName LIKE '%{model.CustomerName}%' "; if (!string.IsNullOrEmpty(model.Status)) { sqlPub += $"AND tb1.Status = '{model.Status}' "; } if (!string.IsNullOrEmpty(model.Type)) { sqlPub += $"AND tb1.Type = '{model.Type}' "; } if (!string.IsNullOrEmpty(model.StartTime)) { sqlPub += $"AND tb1.CreateTime >= '{model.StartTime}' "; } if (!string.IsNullOrEmpty(model.EndTime)) { sqlPub += $"AND tb1.CreateTime <= '{model.EndTime}' "; } sqlCount += sqlPub + "AND tb1.IsDel = '0' "; sqlPub += "AND tb1.IsDel = '0' order by tb1.ASNNo desc "; if (model.Page == 0) { model.Page = 1; } sqlString += sqlPub + $" offset {((model.Page - 1) * model.Limit)} rows fetch next {model.Limit} rows only;"; var com = new Common(); count = com.GetRowCount(sqlCount); var modelList = Db.Ado.SqlQuery(sqlString); return modelList; } catch (Exception ex) { throw ex; } } public List GetArrivalNoticeDetailList(ArrivalNoticeDetailVm model, out int count) { string sqlString = string.Empty; string sqlCount = string.Empty; int rowCount = 1; try { if (model.Page == 0) { model.Page = 1; } sqlCount += $"SELECT COUNT(ID) FROM BllArrivalNoticeDetail where ASNNo = '{model.ASNNo}' and isdel = '0';"; var com = new Common(); count = com.GetRowCount(sqlCount); if (count != 0) { rowCount = count; } sqlString += "SELECT DISTINCT tb1.*,tb2.Type as AsnType,tb2.Status as AsnStatus,tb3.RealName as CreateUserName, "; sqlString += "tb4.RealName as UpdateUserName,isnull(tb6.UnitName,tb5.UnitNo) as UnitName,tb7.PackagName "; sqlString += "FROM BllArrivalNoticeDetail AS tb1 "; sqlString += "LEFT JOIN BllArrivalNotice AS tb2 ON tb1.ASNNo = tb2.ASNNo "; sqlString += "LEFT JOIN SysUserInfor AS tb3 ON tb1.CreateUser = tb3.Id "; sqlString += "LEFT JOIN SysUserInfor AS tb4 ON tb1.UpdateUser = tb4.Id "; sqlString += "LEFT JOIN SysMaterials AS tb5 on tb1.SkuNo = tb5.SkuNo "; sqlString += "LEFT JOIN SysUnit AS tb6 on tb5.UnitNo = tb6.UnitNo "; sqlString += "LEFT JOIN SysPackag AS tb7 on tb1.PackagNo = tb7.PackagNo "; sqlString += $"WHERE tb1.ASNNo = '{model.ASNNo}' AND tb1.IsDel = '0' AND tb5.IsDel = '0' order by tb1.SkuNo desc "; sqlString += $"offset {((model.Page - 1) * model.Limit)} rows fetch next {rowCount} rows only;"; var modelList = Db.Ado.SqlQuery(sqlString); return modelList; } catch (Exception ex) { throw ex; } } //获取入库单明细剩余打印数量 public LabelPrintInfoDto GetAsnDetailQtyList(int id) { try { var detail = Db.Queryable().First(m => m.IsDel == "0" && m.Id == id); if (detail == null) { throw new Exception("未查询到入库单明细"); } var data = new LabelPrintInfoDto(); var notice = Db.Queryable().Where(m => m.IsDel == "0" && m.ASNNo == detail.ASNNo).First(); if (notice != null && notice.Type == "4") //判断是否是余料退回单 { var noticeStr = Db.Queryable().Where(m => m.Type == "1").Select(m => m.ASNNo).ToList(); var detailOld = Db.Queryable().Where(m => m.IsDel == "0" && noticeStr.Contains(m.ASNNo) && m.SkuNo == detail.SkuNo && m.LotNo == detail.LotNo).OrderByDescending(m => m.CreateTime).First(); if (detailOld != null) { var boxInfo = Db.Queryable().First(m => m.IsDel == "0" && m.ASNNo == detailOld.ASNNo); if (boxInfo!= null) { data.ProductionTime = boxInfo.ProductionTime!= null ? ((DateTime)boxInfo.ProductionTime).ToString("yyyy-MM-dd"):""; data.ExpirationTime = boxInfo.ExpirationTime != null ? ((DateTime)boxInfo.ExpirationTime).ToString("yyyy-MM-dd") : ""; data.StoreTime = boxInfo.StoreTime != null ? ((DateTime)boxInfo.StoreTime).ToString("yyyy-MM-dd") : ""; } } } var labelQty = Db.Queryable().Where(m => m.IsDel == "0" && m.ASNDetailNo == id).Sum(m => m.Qty); var qty = detail.Qty - labelQty; data.Qty = qty.ToString(); data.SupplierLot = detail.SupplierLot; return data; } catch (Exception e) { throw new Exception(e.Message); } } //获取物料信息(添加入库单明细使用) public List GetMaterialsList(GetMaterialsVm model) { try { string skuType = string.Empty; int IsPack = 0; //0:不管 1:贴 2:不贴 /** * 成品贴 0 * 采购可贴可不贴 1 * 中间品不贴 2 * 退货贴 3 * 余料退回可贴可不贴 4 * 其它可贴可不贴 5 * 代储不贴 6 * 寄存不贴 7 */ switch (model.Type)//0:原料 1:包材 2:成品 3:耗材 4:半成品 { case "0"://成品入库 skuType = "(2)"; IsPack = 1; //贴 break; case "1"://采购入库 skuType = "(0,1,3)"; break; case "2"://中间品入库 skuType = "(4)"; IsPack = 2; //不贴 break; case "3"://退货入库 skuType = "(2)"; IsPack = 1; //贴 break; case "4"://车间余料退回入库 skuType = "(0,1,3)"; break; case "5"://其它入库 skuType = "(0,1,3)"; break; case "6"://代储入库 skuType = "(0,1,2,3,4)"; //IsPack = 2; //不贴 break; case "7"://寄存入库 //skuType = "(3)"; IsPack = 2; //不贴 break; default: //其它 //skuType = "(0,1,2,3,4)"; break; } Expression> item = Expressionable.Create() .AndIF(model.Type != "7", it => skuType.Contains(it.Type) && it.SkuNo != "100088") .AndIF(model.Type == "7", it => it.SkuNo == "100088") .AndIF(IsPack == 1, it => it.PackagNo != "") .AndIF(IsPack == 2, it => it.PackagNo == "") .AndIF(true, it => it.IsDel == "0") .And(it => it.SkuNo != "100099") .AndIF(!string.IsNullOrWhiteSpace(model.SkuNo), (it => it.SkuNo.Contains(model.SkuNo.Trim()) || it.SkuName.Contains(model.SkuNo.Trim()) || it.Standard.Contains(model.SkuNo.Trim()))) .ToExpression();//注意 这一句 不能少 var data = DataContext.Db.Queryable().Where(item) .Includes(x => x.TypeInfo) .Includes(x => x.EnvironmentInfo) .Includes(x => x.UnitInfo) .Includes(x => x.PackagInfo) .ToList(); return data.Select(m => new MaterialsDto() { //Id = m.Id, SkuNo = m.SkuNo, SkuName = m.SkuName, Standard = m.Standard, AuditStatusNo = m.AuditStatusNo, Type = m.Type, TypeName = m.TypeInfo == null ? "" : m.TypeInfo.DictName, IsControlled = m.IsControlled, IsInspect = m.IsInspect, Origin = m.Origin, UnitNo = m.UnitNo, UnitName = m.UnitInfo == null ? "" : m.UnitInfo.UnitName, PackagNo = m.PackagNo, PackagName = m.PackagInfo == null ? "" : m.PackagInfo.PackagName, Environment = m.Environment, EnvironmentName = m.EnvironmentInfo == null ? "" : m.EnvironmentInfo.DictName, Weight = m.Weight, Warranty = m.Warranty, Price = m.Price, Demo = m.Demo, }).ToList(); } catch (Exception e) { throw e; } } //添加入库单据 public string AddArrivalNotice(ArrivalNoticeVm model, string url) { string strMessage = ""; string sqlString = string.Empty; string sqlDetailStr = string.Empty; //0:成品入库 1:采购入库 2:中间品入库 3:退货入库 4:车间余料入库 5:其它入库 6:代储入库 7:寄存入库 var TypeLot = "2, 5, 6, 7"; //批次可为空单据类型 var addOder = new List(); try { if (model.Origin == "录入") { model.ASNNo = new Common().GetMaxNo("ASN"); } else { if (string.IsNullOrEmpty(model.ASNNo)) { throw new Exception("单据号不可为空!"); } if (string.IsNullOrEmpty(model.Type)) { throw new Exception("单据类型不可为空!"); } } //判断是否为采购入库单据或车间余料退回入库 // 0:成品入库 1:采购入库 2:中间品入库 3:退货入库 4:车间余料退回入库 5:其它入库 6:代储入库 7:寄存入库 //if (model.Type == "1" || model.Type == "4") //{ // if (!string.IsNullOrWhiteSpace(model.LotNo)) // { // throw new Exception("采购入库或余料退回不可输入批次,不可编辑!"); // } //} sqlString += "Insert into BllArrivalNotice (ASNNo,Type,Origin,CustomerNo,"; sqlString += "CustomerName,LotNo,LotText,SupplierLot,CreateUser) values ( "; sqlString += $"'{model.ASNNo}','{model.Type}','{model.Origin}','{model.CustomerNo}', "; sqlString += $"'{model.CustomerName}','{model.LotNo}','{model.LotText}','{model.SupplierLot}','{model.CreateUser}');"; var detailModels = model.AsnDetail; foreach (ArrivalNoticeDetailVm detailModel in detailModels) { if (string.IsNullOrEmpty(detailModel.SkuNo)) { strMessage = "-1:物料编码不可为空;"; continue; } if (string.IsNullOrEmpty(detailModel.SkuName)) { strMessage = "-1:物料名称不可为空;"; continue; } if (detailModel.Qty == null || detailModel.Qty <= 0) { strMessage = "-1:数量必须大于0;"; continue; } if (string.IsNullOrEmpty(detailModel.LotNo)) { //判断是否为不限制批次单据 if (!TypeLot.Contains(model.Type)) { strMessage = "-1:进厂编号不可为空;"; continue; } } if (!string.IsNullOrEmpty(detailModel.IsBale)) { detailModel.IsBale = detailModel.IsBale == "是" ? "1" : "0"; if (detailModel.IsBale != "1" && detailModel.IsBale != "0") { //判断是否裹包 strMessage = "-1:裹包字段只能录入“是”或“否”;"; continue; } } //if (model.Type != "7") //{ // if (!TypeLot.Contains(model.Type)) // { // if (detailModel.LotNo.Length != 12 && detailModel.LotNo.Length != 11 && detailModel.LotNo.Length != 10) // { // strMessage = "-1:进厂编号位数长度有误;"; // continue; // } // } //} if (model.Type == "1" && string.IsNullOrWhiteSpace(detailModel.SupplierLot)) //采购到货单原厂批号(供货批次)不能为空 { strMessage = "-1:原厂批号不可为空;"; continue; } if (model.Type == "2") // 2:中间品入库 { if (string.IsNullOrWhiteSpace(detailModel.Lot1)) { throw new Exception("生产日期不可为空!"); } if (string.IsNullOrWhiteSpace(detailModel.Lot2)) { throw new Exception("过期日期不可为空!"); } } // 判断是否已存在当前明细 string sqlCount = $"SELECT COUNT(ID) FROM BllArrivalNoticeDetail where ASNNo = '{model.ASNNo}' "; sqlCount += $"and SkuNo ='{detailModel.SkuNo}' and LotNo = '{detailModel.LotNo}' and id != '{detailModel.Id}' and isdel = '0';"; var com = new Common().GetRowCount(sqlCount); if (com > 0) { strMessage = "-1:物料和进厂编号重复;"; continue; } if (detailModel.Price == null) { detailModel.Price = 0; } // 计算出总金额 detailModel.Money = detailModel.Price * detailModel.Qty; sqlDetailStr += "Insert into BllArrivalNoticeDetail (ASNNo,SkuNo,SkuName,Standard,"; sqlDetailStr += "LotNo,LotText,Qty,PackagNo,Price,Money,IsBale,IsBelt,SupplierLot,Status,Lot1,Lot2,UDF1,UDF2,UDF3,UDF4,UDF5,CreateUser) values ( "; sqlDetailStr += $"'{model.ASNNo}','{detailModel.SkuNo}','{detailModel.SkuName}','{detailModel.Standard}', "; sqlDetailStr += $"'{detailModel.LotNo}','{detailModel.LotText}','{detailModel.Qty}','{detailModel.PackagNo}','{detailModel.Price}', "; sqlDetailStr += $"'{detailModel.Money}','{detailModel.IsBale}','{detailModel.IsBelt}','{detailModel.SupplierLot}','0','{detailModel.Lot1}','{detailModel.Lot2}', "; sqlDetailStr += $"'{detailModel.UDF1}','{detailModel.UDF2}','{detailModel.UDF3}','{detailModel.UDF4}','{detailModel.UDF5}','{model.CreateUser}');"; if (model.Type == "0")//成品入库单下发WCS信息 { //计算出总箱数 var packmodel = Db.Queryable().First(w=>w.PackagNo == detailModel.SkuNo); int xqty = 0; if (packmodel.L1Name == "箱") { xqty = (int)detailModel.Qty; } if (packmodel.L2Name == "箱") { xqty = (int)(detailModel.Qty / packmodel.L2Num); } if (packmodel.L3Name == "箱") { xqty = (int)(detailModel.Qty/ packmodel.L2Num / packmodel.L3Num); } addOder.Add(new ResponseOrderTaskModel() { OrderNo = model.ASNNo, LotNo = detailModel.LotNo, SkuNo = detailModel.SkuNo, SkuName = detailModel.SkuName, BoxType = detailModel.Standard, Qty = xqty, TaskType = 0 }); } } if (sqlDetailStr == string.Empty) { return strMessage; } Db.Ado.BeginTran(); int rowCount = Db.Ado.ExecuteCommand(sqlString); var rowDetailCount = 1; if (sqlDetailStr.Length > 0) { rowDetailCount = Db.Ado.ExecuteCommand(sqlDetailStr); } Db.Ado.CommitTran(); if (rowCount > 0 && rowDetailCount > 0 && model.Type == "0") { new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", model.ASNNo, "添加", $"添加了单据号为{model.ASNNo}的单据信息", Convert.ToInt32(model.CreateUser)); if (addOder.Count > 0) { // 正式运行程序放开 var jsonData = JsonConvert.SerializeObject(addOder); string response = ""; try { var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss") //给WCS下发入库单信息 response = HttpHelper.DoPost(url, jsonData, "下发给WCS入库命令", "WCS"); //解析返回数据 var wcsModel = JsonConvert.DeserializeObject(response); if (wcsModel.StatusCode == 0) { } if (wcsModel.StatusCode == -1) { throw new Exception($"下发WCS失败:{wcsModel.Msg}"); } } catch (Exception ex) { throw new Exception(ex.Message); } } return strMessage; } else { Db.Ado.RollbackTran(); return "-2:添加失败数据回滚!"; } } catch (Exception ex) { Db.Ado.RollbackTran(); throw new Exception(ex.Message); } } //编辑入库单据 public string EditArrivalNotice(ArrivalNoticeVm model) { string strMessage = ""; string sqlString = string.Empty; string sqlDetailStr = string.Empty; try { //判断是否为采购入库单据或车间余料退回入库 // 0:成品入库 1:采购入库 2:中间品入库 3:退货入库 4:车间余料退回入库 5:其它入库 6:代储入库 7:寄存入库 int isType = 0; if (model.Type == "1" || model.Type == "4") { isType = 1; if (!string.IsNullOrWhiteSpace(model.LotNo)) { strMessage = "-1:采购入库或余料退回不可输入批次,不可编辑;"; return strMessage; } } if (model.Origin != "录入") { strMessage = "-1:上游系统下发的单据,不可编辑;"; return strMessage; } sqlString += $"select * from BllArrivalNotice where ASNNo = '{model.ASNNo}' and isDel = '0';"; var asnInfo = Db.Ado.SqlQuery(sqlString).FirstOrDefault(); if (asnInfo.Status != "0") { strMessage = "-1:单据状态变更,不可编辑;"; return strMessage; } sqlString = "UPDATE BllArrivalNotice SET "; sqlString += $"CustomerNo = '{model.CustomerNo}',CustomerName = '{model.CustomerName}',"; sqlString += $"LotNo = '{model.LotNo}',LotText = '{model.LotText}',"; sqlString += $"UpdateTime = GETDATE(),UpdateUser = '{model.CreateUser}' "; sqlString += $"WHERE ASNNo = '{model.ASNNo}'"; var detailModels = model.AsnDetail; sqlDetailStr += $"SELECT * FROM BllArrivalNoticeDetail WHERE ASNNo = '{model.ASNNo}' and isDel = '0';"; var dbDetailModels = DataContext.Db.Ado.SqlQuery(sqlDetailStr); sqlDetailStr = string.Empty; // 处理已删除的明细 foreach (BllArrivalNoticeDetail dbDetailModel in dbDetailModels) { if (detailModels.Count(it => it.Id == dbDetailModel.Id) == 0) { sqlDetailStr += $"UPDATE BllArrivalNoticeDetail SET IsDel = '1',"; sqlDetailStr += $"UpdateTime = GETDATE(),UpdateUser = '{model.CreateUser}' "; sqlDetailStr += $"WHERE Id = {dbDetailModel.Id};"; } } // 处理修改和添加的明细 foreach (ArrivalNoticeDetailVm detailModel in detailModels) { if (string.IsNullOrEmpty(detailModel.SkuNo)) { strMessage = "-1:物料编码不可为空;"; continue; } if (string.IsNullOrEmpty(detailModel.SkuName)) { strMessage = "-1:物料名称不可为空;"; continue; } if (detailModel.Qty == null || detailModel.Qty <= 0) { strMessage = "-1:数量必须大于0;"; continue; } if (string.IsNullOrEmpty(detailModel.LotNo) && isType != 1) { strMessage = "-1:批次号不可为空;"; continue; } if (!string.IsNullOrEmpty(detailModel.IsBale)) { detailModel.IsBale = detailModel.IsBale == "是" ? "1" : "0"; if (detailModel.IsBale != "1" && detailModel.IsBale != "0") { //判断是否裹包 strMessage = "-1:裹包字段只能录入“是”或“否”;"; continue; } } if (model.Type == "2") // 2:中间品入库 { if (string.IsNullOrWhiteSpace(detailModel.Lot1)) { throw new Exception("生产日期不可为空!"); } if (string.IsNullOrWhiteSpace(detailModel.Lot2)) { throw new Exception("过期日期不可为空!"); } } // 判断是否已存在当前明细 string sqlCount = $"SELECT COUNT(ID) FROM BllArrivalNoticeDetail where ASNNo = '{model.ASNNo}' "; sqlCount += $"and SkuNo ='{detailModel.SkuNo}' and LotNo = '{detailModel.LotNo}' and id != '{detailModel.Id}' and isdel = '0';"; var com = new Common().GetRowCount(sqlCount); if (com > 0) { strMessage = "-1:物料和批次号重复;"; continue; } if (detailModel.Price == null) { detailModel.Price = 0; } if (detailModel.Id == 0 || detailModel.Id == null) { // 计算出总金额 detailModel.Money = detailModel.Price * detailModel.Qty; sqlDetailStr += "Insert into BllArrivalNoticeDetail (ASNNo,SkuNo,SkuName,Standard,"; sqlDetailStr += "LotNo,LotText,Qty,PackagNo,Price,Money,IsBale,IsBelt,SupplierLot,Status,Lot1,Lot2,UDF1,UDF2,UDF3,UDF4,UDF5,CreateUser) values ( "; sqlDetailStr += $"'{model.ASNNo}','{detailModel.SkuNo}','{detailModel.SkuName}','{detailModel.Standard}', "; sqlDetailStr += $"'{detailModel.LotNo}','{detailModel.LotText}','{detailModel.Qty}','{detailModel.PackagNo}','{detailModel.Price}', "; sqlDetailStr += $"'{detailModel.Money},'{detailModel.IsBale}','{detailModel.IsBelt}','{detailModel.SupplierLot}','0','{detailModel.Lot1}','{detailModel.Lot2}', "; sqlDetailStr += $"'{detailModel.UDF1}','{detailModel.UDF2}','{detailModel.UDF3}','{detailModel.UDF4}','{detailModel.UDF5}','{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) { continue; } // 计算出总金额 detailModel.Money = detailModel.Price * detailModel.Qty; sqlDetailStr += $"UPDATE BllArrivalNoticeDetail SET "; sqlDetailStr += $"Qty = '{detailModel.Qty}',LotNo = '{detailModel.LotNo}',Money='{detailModel.Money}', "; sqlDetailStr += $"LotText = '{detailModel.LotText}',SupplierLot = '{detailModel.SupplierLot}', "; sqlDetailStr += $"IsBale = '{detailModel.IsBale}',IsBelt = '{detailModel.IsBelt}', "; sqlDetailStr += $" Lot1= '{detailModel.Lot1}',Lot2 = '{detailModel.Lot2}', "; sqlDetailStr += $"UDF1 = '{detailModel.UDF1}',UDF2 = '{detailModel.UDF2}',UDF3 = '{detailModel.UDF3}',UDF4 = '{detailModel.UDF4}',UDF5 = '{detailModel.UDF5}',"; sqlDetailStr += $"UpdateTime = GETDATE(),UpdateUser = '{model.CreateUser}' "; sqlDetailStr += $"WHERE Id = {detailModel.Id};"; } } Db.Ado.BeginTran(); int rowCount = Db.Ado.ExecuteCommand(sqlString); var rowDetailCount = 1; if (sqlDetailStr.Length > 0) { rowDetailCount = Db.Ado.ExecuteCommand(sqlDetailStr); } Db.Ado.CommitTran(); if (rowCount > 0 && rowDetailCount > 0) { new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", model.ASNNo, "编辑", $"编辑了单据号为{model.ASNNo}的单据信息", Convert.ToInt32(model.CreateUser)); return strMessage; } else { Db.Ado.RollbackTran(); return "-2:添加失败数据回滚!"; } } catch (Exception ex) { throw ex; } } //删除入库单 public string DelArrivalNotice(ArrivalNoticeVm model) { try { var sqlString = $"SELECT * FROM BllArrivalNotice WHERE ASNNo = '{model.ASNNo}' AND IsDel = 0 AND Status = '0';"; var asnModel = Db.Ado.SqlQuery(sqlString).FirstOrDefault(); if (asnModel == null) { return "-1:入库单状态已变更,不可删除!"; } if (asnModel.Origin != "录入") { return "-1:上游系统下发的单据,不可删除;"; } // 删除总单 sqlString = $"UPDATE BllArrivalNotice SET IsDel = '1',"; sqlString += $"UpdateTime = GETDATE(),UpdateUser = '{model.CreateUser}' "; sqlString += $"WHERE ASNNo = '{model.ASNNo}';"; // 删除明细单 sqlString += $"UPDATE BllArrivalNoticeDetail SET IsDel = '1',"; sqlString += $"UpdateTime = GETDATE(),UpdateUser = '{model.CreateUser}' "; sqlString += $"WHERE ASNNo = '{model.ASNNo}';"; //判断是否为采购入库单据或车间余料退回入库 // 0:成品入库 1:采购入库 2:中间品入库 3:退货入库 4:车间余料退回入库 5:其它入库 6:代储入库 7:寄存入库 int notdel = 0; if (model.Type == "1" || model.Type == "4") { //获取单据生成对应标签 var list = Db.Queryable().Where(a => a.IsDel == "0" && a.Status == "0" && a.BindNo == null); //验证对应箱支信息是否存在 if (list == null) { return "-1:已有箱码已绑定托盘或已入库,不可删除!"; } // 删除对应箱支信息 sqlString += $"UPDATE BllBoxInfo SET IsDel = '1',"; sqlString += $"UpdateTime = GETDATE(),UpdateUser = '{model.CreateUser}' "; sqlString += $"WHERE ASNNo = '{model.ASNNo}';"; notdel = 1; } Db.Ado.BeginTran(); int rowCount = Db.Ado.ExecuteCommand(sqlString); if (rowCount < 2 + notdel) { Db.RollbackTran(); return "-1:删除失败!"; } Db.Ado.CommitTran(); new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", model.ASNNo, "删除", $"删除了单据号为{model.ASNNo}的单据信息", Convert.ToInt32(model.CreateUser)); return ""; } catch (Exception ex) { Db.RollbackTran(); throw ex; } } //删除入库单明细 public string DelArrivalNoticeDetail(ArrivalNoticeDetailVm model) { string sqlString = string.Empty; try { sqlString = $"SELECT * FROM BllArrivalNotice WHERE ASNNo = '{model.ASNNo}' AND IsDel = 0 AND Status = '0';"; var asnModel = Db.Ado.SqlQuery(sqlString).FirstOrDefault(); if (asnModel == null) { return "-1:入库单状态已变更,不可删除!"; } if (asnModel.Origin != "录入") { return "-1:上游系统下发的单据,不可删除;"; } sqlString = $"SELECT * FROM BllArrivalNoticeDetail WHERE ASNNo = '{model.ASNNo}' and Id <> {model.Id};"; var detailModel = Db.Ado.SqlQuery(sqlString); if (detailModel.Count <= 0) { sqlString = $"UPDATE BllArrivalNotice SET IsDel = '1',"; sqlString += $"UpdateTime = GETDATE(),UpdateUser = '{model.CreateUser}' "; sqlString += $"WHERE ASNNo = '{model.ASNNo}';"; } else { sqlString = $"UPDATE BllArrivalNotice SET "; sqlString += $"UpdateTime = GETDATE(),UpdateUser = '{model.CreateUser}' "; sqlString += $"WHERE ASNNo = '{model.ASNNo}';"; } sqlString += $"UPDATE BllArrivalNoticeDetail SET IsDel = '1',"; sqlString += $"UpdateTime = GETDATE(),UpdateUser = '{model.CreateUser}' "; sqlString += $"WHERE Id = '{model.Id}';"; Db.Ado.BeginTran(); int rowCount = Db.Ado.ExecuteCommand(sqlString); if (rowCount < 2) { Db.RollbackTran(); return "-1:删除失败!"; } Db.Ado.CommitTran(); var detail = Db.Queryable().First(m => m.Id == model.Id); new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", model.ASNNo, "删除", $"删除了单据号为{model.ASNNo}、物料为{detail.SkuNo}、批次号为{detail.LotNo}的单据信息", Convert.ToInt32(model.CreateUser)); return ""; } catch (Exception ex) { Db.RollbackTran(); throw new Exception(ex.Message); } } //关闭入库单 public string CloseArrivalNotice(int id, int userId) { try { var notice = Db.Queryable().Where(m => m.IsDel == "0" && m.Id == id).ToList().FirstOrDefault(); if (notice == null) { throw new Exception("未查询到入库单据信息"); } //if (notice.Status != "2") //{ // throw new Exception("参数异常,请检查状态是否为执行完成"); //} var palletBind = Db.Queryable().Where(m => m.IsDel == "0" && m.ASNNo == notice.ASNNo && m.Status != "2").ToList(); if (palletBind != null && palletBind.Count > 0) { throw new Exception("存在未入库完成托盘信息,不允许关单"); } var sqlString = ""; // 总单关单 sqlString = $"UPDATE BllArrivalNotice SET Status = '3',"; sqlString += $"CompleteTime = GETDATE(),UpdateTime = GETDATE(),UpdateUser = '{userId}' "; sqlString += $"WHERE Id = '{id}';"; // 将未完成的明细改为已完成 sqlString += $"UPDATE BllArrivalNoticeDetail SET Status = '2',"; sqlString += $"CompleteTime = GETDATE(),UpdateTime = GETDATE(),UpdateUser = '{userId}' "; sqlString += $"WHERE Id = '{id}' and Status <> '2';"; Db.Ado.BeginTran(); int rowCount = Db.Ado.ExecuteCommand(sqlString); if (rowCount <= 0) { Db.RollbackTran(); return "-1:关单失败!"; } Db.Ado.CommitTran(); new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", notice.ASNNo, "关单", $"关闭了单据号为{notice.ASNNo}的单据信息", userId); return ""; } catch (Exception ex) { Db.RollbackTran(); throw ex; } } //入库单撤销申请 public void CancelOrder(int id, string reason, int userId) { try { var notice = Db.Queryable().First(m => m.IsDel == "0" && m.Id == id); if (notice == null) { throw new Exception("未查询到入库单据信息"); } if (notice.Status != "1" && notice.Status != "2") { throw new Exception("入库单据状态不是正在执行或执行完成,不能撤销"); } var bind = Db.Queryable().Where(m => m.IsDel == "0" && m.ASNNo == notice.ASNNo).ToList(); if (bind.Count == 0) { throw new Exception("未查询到入库单据的托盘绑定信息"); } if (bind.Count(m => m.Status == "1") > 0) { throw new Exception("当前入库单据的托盘绑定信息有正在执行的,请稍后完成后再撤销"); } var auditLog = Db.Queryable().Where(m => m.IsDel == "0" && m.Status == "0"); var boxInfo = Db.Queryable().Where(m => m.IsDel == "0" && m.ASNNo == notice.ASNNo); if (auditLog.Count(m => m.OrderNo == notice.ASNNo) > 0) { throw new Exception("当前入库单据已有撤销审核,请等待审核完成"); } var startStatusName = ""; var endStatusName = ""; switch (notice.Status) { case "1": startStatusName = "正在执行"; endStatusName = "等待执行"; break; case "2": startStatusName = "执行完成"; endStatusName = "正在执行"; break; default: throw new Exception("单据状态错误"); } var palletStr = ""; var msgS = ""; var msgL = ""; foreach (var item in bind) { if (auditLog.Count(m => m.OrderNo == item.ASNNo && m.PalletNo.Contains(item.PalletNo)) > 0) { continue; } if (!palletStr.Contains(item.PalletNo)) { palletStr += item.PalletNo + ";"; } var info = boxInfo.First(m => m.BindNo == item.Id); //获取托盘绑定对应单据 var noticeDetail = Db.Queryable().First(a => a.IsDel == "0" && a.Id == item.ASNDetailNo); if (info != null) { if (!msgS.Contains(info.SkuNo)) { msgS += info.SkuNo + ";"; } if (!msgL.Contains(info.LotNo)) { msgL += info.LotNo + ";"; } } else { if (!msgS.Contains(noticeDetail.SkuNo)) { msgS += noticeDetail.SkuNo + ";"; } if (!msgL.Contains(noticeDetail.LotNo)) { msgL += noticeDetail.LotNo + ";"; } } } var time = DateTime.Now; var log = new BllAuditLog() { OrderNo = notice.ASNNo, PalletNo = palletStr, Msg = $"物料:{msgS} 批次:{msgL}", Reason = reason, Status = "0", Opinion = "", StartStatus = startStatusName, EndStatus = endStatusName, FunctionCode = "001", IsDel = "0", CreateUser = userId, CreateTime = time }; Db.Insertable(log).ExecuteCommand(); new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", notice.ASNNo, "添加", $"添加了单据号为{notice.ASNNo}的单据撤销申请", userId); } catch (Exception e) { throw new Exception(e.Message); } } /// /// 维护入库单备注信息 /// /// /// /// public void EditNoticeDemo(int id, string demo, int userId) { try { var notice = Db.Queryable().First(m => m.IsDel == "0" && m.Id == id); if (notice == null) { throw new Exception("未查询到入库单据信息"); } notice.Demo = demo + "".Trim(); notice.UpdateUser = userId; notice.UpdateTime = DateTime.Now; int i = Db.Updateable(notice).ExecuteCommand(); if (i > 0) { //添加操作日志 new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", notice.ASNNo, "编辑", $"编辑了单据号为{notice.ASNNo}的备注信息", userId); } } catch (Exception ex) { throw new Exception(ex.Message); } } #endregion #region 接口方法 /// /// 创建入库单据(上游系统) /// /// /// public HttpReturnModel HttpCreateAsn(AsnInfo model, string url) { try { var addOder = new List(); var resultModel = new HttpReturnModel() { Success = "-1", Message = "" }; if (string.IsNullOrEmpty(model.AsnType)) { resultModel.Message = "单据类型不可为空!"; return resultModel; } //if (string.IsNullOrEmpty(model.Customer)) //{ // resultModel.Message = "客户不可为空!"; // return resultModel; //} if (string.IsNullOrEmpty(model.OrderCode)) { resultModel.Message = "上游系统单号不可为空!"; return resultModel; } if (model.AsnDetails.Count <= 0) { resultModel.Message = "入库单明细不可为空!"; return resultModel; } // 根据客户编号获取客户名称 var custname = ""; var CustomerModel = Db.Queryable().First(it => it.CustomerNo == model.Customer && it.IsDel == "0"); if (CustomerModel != null) { custname = CustomerModel.CustomerName; //CustomerModel.CustomerName = ""; //resultModel.Message = "客户编号不存在!"; //return resultModel; } // 入库总表信息 string asnNo = new Common().GetMaxNo("ASN"); var asnModel = new BllArrivalNotice() { ASNNo = asnNo, Type = model.AsnType, Origin = string.IsNullOrEmpty(model.Origin) ? "ERP" : model.Origin, CustomerNo = model.Customer, CustomerName = custname, OrderCode = model.OrderCode, Status = "0", }; // 入库明细表信息 List detailModels = new List(); foreach (AsnDetail asnDetailModel in model.AsnDetails) { if (string.IsNullOrEmpty(asnDetailModel.SkuNo)) { resultModel.Message = "物料编码不可为空!"; return resultModel; } if (asnDetailModel.Qty <= 0) { resultModel.Message = "数量应为正整数!"; return resultModel; } if (string.IsNullOrEmpty(asnDetailModel.LotNo)) { resultModel.Message = "批次号不可为空!"; return resultModel; } // 获取物料详细信息 var skuModel = Db.Queryable().First(it => it.SkuNo == asnDetailModel.SkuNo && it.IsDel == "0"); if (skuModel == null) { resultModel.Message = "不存在当前物料信息!"; return resultModel; } // 验证包装信息是否存在 var detailModel = new BllArrivalNoticeDetail() { ASNNo = asnNo, SkuNo = asnDetailModel.SkuNo, SkuName = skuModel.SkuName, Standard = skuModel.Standard, LotNo = asnDetailModel.LotNo, LotText = "", Qty = (decimal)asnDetailModel.Qty, FactQty = 0, CompleteQty = 0, Price = 0, Money = 0, IsBale = "", IsBelt = "", PackagNo = skuModel.PackagNo, SupplierLot = asnDetailModel.SupplierLot, Status = "0", CreateUser = 0 }; detailModels.Add(detailModel); if (model.AsnType == "0")//成品入库单下发WCS信息 { //计算出总箱数 var packmodel = Db.Queryable().First(w => w.PackagNo == detailModel.SkuNo); int xqty = 0; if (packmodel.L1Name == "箱") { xqty = (int)detailModel.Qty; } if (packmodel.L2Name == "箱") { xqty = (int)(detailModel.Qty / packmodel.L2Num); } if (packmodel.L3Name == "箱") { xqty = (int)(detailModel.Qty / packmodel.L2Num / packmodel.L3Num); } addOder.Add(new ResponseOrderTaskModel() { OrderNo = asnNo, LotNo = asnDetailModel.LotNo, SkuNo = asnDetailModel.SkuNo, SkuName = skuModel.SkuName, BoxType = skuModel.Standard, Qty = (int)asnDetailModel.Qty, TaskType = 0 }); } } Db.BeginTran(); // 插入入库单总表 Db.Insertable(asnModel).ExecuteCommand(); // 插入入库单明细表 Db.Insertable(detailModels).ExecuteCommand(); Db.CommitTran(); if (addOder.Count > 0 && model.AsnType == "0") { // 正式运行程序放开 var jsonData = JsonConvert.SerializeObject(addOder); string response = ""; try { var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss") //给WCS下发入库单信息 response = HttpHelper.DoPost(url, jsonData, "下发给WCS入库命令", "WCS"); //解析返回数据 var wcsModel = JsonConvert.DeserializeObject(response); if (wcsModel.StatusCode == 0) { } if (wcsModel.StatusCode == -1) { throw new Exception($"下发WCS失败:{wcsModel.Msg}"); } } catch (Exception ex) { throw new Exception(ex.Message); } } resultModel.Success = "0"; resultModel.Message = "成功"; return resultModel; } catch (Exception ex) { Db.RollbackTran(); throw ex; } } //订单回传上游系统 public bool FinishAsn(int id, string erpUrl, string mesUrl,string mesTokenUrl,string userNo,string pwd, int userId) { try { var loginPwd = Md5Tools.CalcMd5(pwd); var date = Db.Queryable().First(m =>m.IsDel=="0" && m.UserName == userNo && m.PassWord == loginPwd); if (date == null) //账号密码是否正确 { throw new Exception("账号密码不正确或没有此账号"); } if (date.Status != "0") //当前账号是否正常启用 { throw new Exception("当前账号非启用状态"); } var notice = Db.Queryable().First(m => m.Id == id && m.IsDel == "0"); if (notice == null) { throw new Exception("未查询到单据信息"); } if (notice.Status != "3") { throw new Exception("复核失败,单据非关闭状态"); } var detail = Db.Queryable().Where(m => m.ASNNo == notice.ASNNo && m.IsDel == "0").ToList(); if (detail.Count == 0) { throw new Exception("未查询到单据明细信息"); } if (date.Id == notice.UpdateUser) { throw new Exception("复核失败,复核人员和关闭订单人员不能相同!"); } if (date.Id == notice.CreateUser) { throw new Exception("复核失败,复核人员和创建订单人员不能相同!"); } //单据类型是 成品入库或采购入库 判断入库物料是否合格 if (notice.Type == "0" || notice.Type == "1") { foreach (var item in detail) { var instStatus = Db.Queryable().Count(m => m.IsDel == "0" && m.SkuNo == item.SkuNo && m.LotNo == item.LotNo && m.IsQualified == "1"); if (instStatus == 0) { throw new Exception($"{item.SkuNo}、{item.LotNo}质量状态不是合格的,不能回传!"); } } } var list = new List(); foreach (var d in detail) { var item = new AsnDetail() { SkuNo = d.SkuNo, LotNo = d.LotNo, Qty = d.CompleteQty, PackagNo = d.PackagNo, SupplierLot = d.SupplierLot }; list.Add(item); } var asnInfo = new AsnInfo() { OrderCode = notice.OrderCode, AsnDetails = list }; #region 通过接口发送至erp 或 mes ////系统对接后放开 var jsonData = JsonConvert.SerializeObject(asnInfo); var mesList = new List() { "0", "4" }; //0 成品入库 4余料退回入库 var erpList = new List() { "1", "2", "3" }; //1 采购入库 2中间品入库 3 退货入库 if (mesList.Contains(notice.Type)) // mes { //获取令牌 //var token = new Token().GetMesToken(mesTokenUrl); //测试不使用TOKEN,正式运行时放开 var token = ""; Dictionary mesDic = new Dictionary() { {"Authorization",token } }; var mesData = new FinishAsnModel() { no = asnInfo.OrderCode, qty = asnInfo.AsnDetails.Sum(m => m.Qty) }; jsonData = JsonConvert.SerializeObject(mesData); //调用接口 var response = HttpHelper.DoPost(mesUrl, jsonData, "入库单完成上传", "MES", mesDic); var obj = JsonConvert.DeserializeObject(response);//解析返回数据 if (obj.status != "success") { throw new Exception("上传失败" + obj.message); } } else if (erpList.Contains(notice.Type)) //erp { var response = HttpHelper.DoPost(erpUrl, jsonData, "入库单完成上传", "ERP"); var obj = JsonConvert.DeserializeObject(response);//解析返回数据 if (obj.Success != 0) { throw new Exception("上传失败" + obj.Message); } } #endregion notice.Status = "4"; notice.CheckTime = DateTime.Now; notice.CheckUser = date.Id; Db.Updateable(notice).ExecuteCommand(); new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", notice.ASNNo, "复核", $"{date.RealName}复核了单据号为{notice.ASNNo}的单据信息", userId); return true; } catch (Exception e) { throw new Exception(e.Message); } } public void UpLocate(string wareNo,string locatNo) { try { if (string.IsNullOrWhiteSpace(wareNo) || string.IsNullOrWhiteSpace(locatNo)) { throw new Exception("仓库或储位不能为空"); } var locate = Db.Queryable().First(m=>m.IsDel == "0" && m.LocatNo == locatNo && m.WareHouseNo == wareNo); if (locate == null) { throw new Exception("未查询到储位信息"); } locate.Status = "0";//储位状态变更空储位 Db.Updateable(locate).ExecuteCommand(); } catch (Exception e) { throw new Exception(e.Message); } } #endregion } }