using Model.InterFaceModel; using Model.ModelDto.BllQualityDto; using Model.ModelVm; using Model.ModelVm.BllQualityVm; using Newtonsoft.Json; using SqlSugar; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using Utility.Tools; using WMS.BLL.LogServer; using WMS.DAL; using WMS.Entity.BllAsnEntity; using WMS.Entity.BllQualityEntity; using WMS.Entity.Context; using WMS.Entity.DataEntity; using WMS.Entity.LogEntity; using WMS.Entity.SysEntity; using WMS.IBLL.IBllQualityServer; namespace WMS.BLL.BllQualityServer { public class InspectionRequestServer : DbHelper, IInspectionRequest { #region 构造函数 private static readonly SqlSugarScope Db = DataContext.Db; public InspectionRequestServer() : base(Db) { } #endregion #region 事件方法 public List GetInspectionRequest(BllQualityInspectionRequestVm model,out int count) { try { Expression> item = Expressionable.Create() .AndIF(!string.IsNullOrWhiteSpace(model.QcNo), it => it.QcNo.Contains(model.QcNo)) .AndIF(!string.IsNullOrWhiteSpace(model.ASNNo), it => it.ASNNo.Contains(model.ASNNo)) .AndIF(!string.IsNullOrWhiteSpace(model.SkuNo), it => it.SkuNo.Contains(model.SkuNo)) .AndIF(!string.IsNullOrWhiteSpace(model.SkuName), it => it.SkuName.Contains(model.SkuName)) .AndIF(!string.IsNullOrWhiteSpace(model.Status), it => it.Status == model.Status) .AndIF(!string.IsNullOrWhiteSpace(model.LotNo), it => it.LotNo.Contains(model.LotNo)) .AndIF(!string.IsNullOrWhiteSpace(model.SupplierLot), it => it.SupplierLot.Contains(model.SupplierLot)) .AndIF(!string.IsNullOrWhiteSpace(model.StartTime), it => it.CreateTime >= Convert.ToDateTime(model.StartTime)) .AndIF(!string.IsNullOrWhiteSpace(model.EndTime), it => it.CreateTime <= Convert.ToDateTime(model.EndTime).AddDays(1)) .ToExpression(); var rowCount = 0; var data = GetAllWhereAsync(item) .LeftJoin((a, b) => a.RequestUser == b.Id) // 请验人 .LeftJoin((a, b, c) => a.CreateUser == c.Id) // 创建人 .LeftJoin((a, b, c, d) => a.UpdateUser == d.Id) // 更新人 .Select((a, b, c, d) => new BllQualityInspectionRequestDto() { Id = a.Id, QcNo=a.QcNo, ASNNo = a.ASNNo, Status = a.Status, SkuNo = a.SkuNo, SkuName = a.SkuName, LotNo = a.LotNo, SupplierLot = a.SupplierLot, Qty = a.Qty, SamplingQty = a.SamplingQty, RequestTime = a.RequestTime, RequestUser = b.RealName, UDF1 = a.UDF1, UDF2 = a.UDF2, UDF3 = a.UDF3, UDF4 = a.UDF4, UDF5 = a.UDF5, CreateUserName = c.RealName, UpdateUserName = d.RealName, CreateTime = a.CreateTime, UpdateTime = a.UpdateTime, }) .OrderByDescending(a => a.CreateTime) .ToOffsetPage(model.Page, model.Limit, ref rowCount); count = rowCount; return data; } catch (Exception e) { throw new Exception(e.Message); } } public List GetSamplingDetails(BllSamplingDetailsVm model, out int count) { try { Expression> item = Expressionable.Create() .AndIF(!string.IsNullOrWhiteSpace(model.QcNo), it => it.QcNo.Contains(model.QcNo)) .AndIF(!string.IsNullOrWhiteSpace(model.ASNNo), it => it.ASNNo.Contains(model.ASNNo)) .AndIF(!string.IsNullOrWhiteSpace(model.SkuNo), it => it.SkuNo.Contains(model.SkuNo)) .AndIF(!string.IsNullOrWhiteSpace(model.SkuName), it => it.SkuName.Contains(model.SkuName)) .AndIF(!string.IsNullOrWhiteSpace(model.LotNo), it => it.LotNo.Contains(model.LotNo)) .AndIF(!string.IsNullOrWhiteSpace(model.SupplierLot), it => it.SupplierLot.Contains(model.SupplierLot)) .AndIF(!string.IsNullOrWhiteSpace(model.StartTime), it => it.CreateTime >= Convert.ToDateTime(model.StartTime)) .AndIF(!string.IsNullOrWhiteSpace(model.EndTime), it => it.CreateTime <= Convert.ToDateTime(model.EndTime).AddDays(1)) .And(m=>m.IsDel =="0") .ToExpression(); var rowCount = 0; var data = Db.Queryable().Where(item) .LeftJoin((a, b) => a.QcNo == b.QcNo) // 请验人 .LeftJoin((a, b, c) => a.CreateUser == c.Id) // 创建人 .LeftJoin((a, b, c, d) => a.UpdateUser == d.Id) // 更新人 .Select((a, b, c, d) => new BllSamplingDetailsDto() { QcNo = a.QcNo, ASNNo = a.ASNNo, Status = b.Status, PalletNo=a.PalletNo, BoxNo=a.BoxNo, BoxNo2=a.BoxNo2, BoxNo3=a.BoxNo3, SkuNo = a.SkuNo, SkuName = a.SkuName, Standard=a.Standard, LotNo = a.LotNo, SupplierLot = a.SupplierLot, CompleteQty = a.CompleteQty, UDF1 = a.UDF1, UDF2 = a.UDF2, UDF3 = a.UDF3, UDF4 = a.UDF4, UDF5 = a.UDF5, CreateUserName = c.RealName, UpdateUserName = d.RealName, CreateTime = a.CreateTime, UpdateTime = a.UpdateTime.ToString(), }) .OrderByDescending(a => a.CreateTime) .ToOffsetPage(model.Page, model.Limit, ref rowCount); count = rowCount; return data; } catch (Exception e) { throw new Exception(e.Message); } } public bool ClossInspectionRequest(IdVm model, int userId,string url) { try { var data = Db.Queryable() .Where(m => m.QcNo == model.Code && m.IsDel == "0" && (m.Status == "1"||m.Status=="2")).ToList().FirstOrDefault(); if (data == null) { throw new Exception("操作失败!请验单状态变更."); } DateTime time = DateTime.Now; // 根据入库单号查询采购计划单 采购计划明细单 入库单 入库单明细等表信息 Expression> item = Expressionable.Create() .AndIF(!string.IsNullOrWhiteSpace(model.Code), it => it.QcNo.Contains(model.Code)) .ToExpression(); var QcNoModel = GetAllWhereAsync(item) .LeftJoin((a, b) => a.ASNNo == b.ASNNo) // 入库总单 .LeftJoin((a, b, c) => a.SkuNo == c.SkuNo && a.ASNNo == c.ASNNo) // 入库明细单 .LeftJoin((a, b, c, d) => b.OrderCode == d.OrderCode) // 采购计划单 .LeftJoin((a, b, c, d, e) => c.OrderDetailCode == e.OrderDetailCode) // 采购计划单明细 .LeftJoin((a, b, c, d, e, f) => a.QcNo == f.QcNo) .Select((a, b, c, d, e, f) => new SendQcNoModel() { OrderNo = d.OrderCode + "-" + e.OrderDetailCode, QcNo = a.QcNo, SkuNo = a.SkuNo, LotNo = a.LotNo, SupplierLot = a.SupplierLot, CompleteTime = time.ToString("yyyy-MM-dd"), CompleteQty = SqlFunc.AggregateSum(f.CompleteQty).ToString() }); // 取样消耗量回传给浪潮ERP系统 var taskNo = new Common().GetMaxNo("TK"); var exTask = new LogTask() { TaskNo = taskNo, Sender = "WMS", Receiver = "ERP", IsSuccess = 0, //是否下发成功 0失败 1成功 StartLocat = "", //起始位置 PalletNo = "", //托盘码 IsSend = 1, //是否可再次下发 IsCancel = 1, //是否可取消 IsFinish = 1, //是否可完成 Status = "0", //任务状态0:等待执行1正在执行2执行完成 OrderType = "5", //0 入库单 1 出库单 2 盘点单 3 移库单 4 取样出库单 5 其他 EndLocat = "", //目标位置 Type = "3", //任务类型 0 入库任务 1 出库任务 2 移库任务 Msg = "取样消耗回传" }; // 插入任务日志 Db.Insertable(exTask).ExecuteCommand(); List list1 = new List(); list1.Add(taskNo); //更改任务的发送返回时间// var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss") var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss") new TaskServer().EditTaskIssueOk(list1, time1, time2); // 更新请验单信息 data.Status = "2"; data.UpdateTime = time; data.UpdateUser = userId; Db.Updateable(data).ExecuteCommand(); // 调用ERP接口回传取样消耗 //var jsonData = JsonConvert.SerializeObject(QcNoModel); //string response = ""; //try //{ // var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss") // response = HttpHelper.DoPost(url, jsonData, "上传ERP取样消耗量过账", "ERP"); // var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss") // ////解析返回数据 // var limesModel = JsonConvert.DeserializeObject(response); // List list1 = new List(); // list1.Add(taskNo); // if (limesModel.Success == 0) // { // //更改任务的发送返回时间// // new TaskServer().EditTaskIssueOk(list1, time1, time2); // // 更新请验单信息 // data.Status = "2"; // data.UpdateTime = time; // data.UpdateUser = userId; // Db.Updateable(data).ExecuteCommand(); // } // if (limesModel.Success == -1) // { // new TaskServer().EditTaskIssueNo(list1, time1, time2, limesModel.Message); // throw new Exception(limesModel.Message); // } //} //catch (Exception ex) //{ // throw new Exception(ex.Message); //} //添加操作日志记录 var k = new OperationCrServer().AddLogOperationCr("质量管理", "质检请验", model.Code, "关单", $"关闭了{model.Code}请验单!", userId); return true; } catch (Exception e) { throw new Exception(e.Message); } } public bool DelInspectionRequest(IdVm model, int userId) { try { var data = Db.Queryable() .Where(m => m.QcNo == model.Code && m.IsDel == "0" && m.Status == "0" ).ToList().FirstOrDefault(); if (data == null) { throw new Exception("操作失败!请验单状态变更."); } data.IsDel = "1"; data.UpdateTime = DateTime.Now; data.UpdateUser = userId; Db.Updateable(data).ExecuteCommand(); //添加操作日志记录 var k = new OperationCrServer().AddLogOperationCr("质量管理", "质检请验", model.Code, "删除", $"删除了{model.Code}请验单!", userId); return true; } catch (Exception e) { throw new Exception(e.Message); } } public bool DelSamplingDetails(IdVm model, int userId) { try { throw new Exception("此方法弃用"); } catch (Exception e) { throw new Exception(e.Message); } } /// /// 质检请验出库功能 /// /// model.Id:请验单主键;model.Code:出库口 /// 操作用户 /// Wcs地址 /// public bool OutWhInspectionRequest(IdVm model, int userId,string url) { try { var com = new Common(); // 判断请验单状态 var data = Db.Queryable() .First(m => m.Id == model.Id && m.IsDel == "0" && m.Status == "1"); if (data == null) { throw new Exception("操作失败!请验单状态变更."); } // 判断消耗量是否合法 if (data.SamplingQty <= 0) { throw new Exception("取样量小于等于0."); } // 获取仓库类型为立库的仓库编号 var WareHouseNos = Db.Queryable().Where(m => m.IsDel == "0" && m.Type == "1").Select(z=>z.WareHouseNo).ToList(); // 根据物料、批次、获取立体库库内托盘 、 var pallets = Db.Queryable() .Where(m => m.SkuNo == data.SkuNo && m.LotNo == data.LotNo && m.Qty > 0 && m.IsDel == "0" && WareHouseNos.Contains(m.WareHouseNo)).OrderByDescending(z=> new {z.InspectMark, z.Qty }).OrderBy(z=>z.LocatNo).ToList(); decimal? numberQty = data.SamplingQty; var outWhs = new List(); foreach (var pallet in pallets) { if (numberQty <= 0) { break; } numberQty = numberQty - pallet.Qty; // 判断当前托盘所在储位的深度 var Locats = Db.Queryable() .Where(m => m.LocatNo == pallet.LocatNo && m.WareHouseNo == pallet.WareHouseNo && m.IsDel == "0").ToList().FirstOrDefault(); if (Locats.Depth == "02") { // 获取外侧储位地址 string locatNo = Locats.LocatNo.Substring(0, 6) + "01"; var Locatwc = Db.Queryable() .Where(m => m.LocatNo == locatNo && m.WareHouseNo == pallet.WareHouseNo && m.IsDel == "0").ToList().FirstOrDefault(); if (Locatwc.Status == "1") { // 外侧有货物 var Locatwcsku = Db.Queryable() .Where(m => m.LocatNo == locatNo && m.IsDel == "0" && m.WareHouseNo== Locatwc.WareHouseNo).ToList().FirstOrDefault(); // 获取移库地址 var newSlot = com.MoveAddress(locatNo, Locatwc.RoadwayNo, Locatwcsku.SkuNo); var taskNo1 = new Common().GetMaxNo("TK"); var exTask1 = new LogTask(); //出库任务 exTask1.TaskNo = taskNo1; exTask1.Sender = "WMS"; exTask1.Receiver = "WCS"; exTask1.IsSuccess = 0; //是否下发成功 0失败 1成功 exTask1.StartLocat = locatNo; //起始位置 exTask1.PalletNo = Locatwcsku.PalletNo; //托盘码 exTask1.IsSend = 1;//是否可再次下发 exTask1.IsCancel = 1;//是否可取消 exTask1.IsFinish = 1;//是否可完成 exTask1.Status = "0";//任务状态0:等待执行1正在执行2执行完成 exTask1.OrderType = "4"; //0 入库单 1 出库单 2 盘点单 3 移库单 4 取样出库单 OutCommandDto taskModel = new OutCommandDto(); taskModel.TaskNo = com.GetMaxNo("TK"); // 任务号 taskModel.StartRoadway = Locatwc.RoadwayNo; taskModel.PalletNo = Locatwcsku.PalletNo; // 托盘号 taskModel.StartLocate = locatNo; // 起始位置 taskModel.Order = 1; if (newSlot == "") { exTask1.EndLocat = model.Code; //目标位置 exTask1.Type = "1"; //任务类型 0 入库任务 1 出库任务 2 移库任务 exTask1.Msg = Locats.LocatNo +"托盘出库创建的"+locatNo + "托盘的出库任务"; // 没有多余的空储位 taskModel.EndLocate = model.Code; // 出库口 taskModel.EndRoadway = ""; // 目标巷道 taskModel.TaskType = "1";// 任务类型 (出库) taskModel.OutMode = model.Code; //目标地址 // 更新储位地址 Locatwc.Status = "3"; Db.Updateable(Locatwc).ExecuteCommand(); } else { // 获取移库巷道号 var Locatyk = Db.Queryable() .Where(m => m.LocatNo == newSlot && m.WareHouseNo == pallet.WareHouseNo && m.IsDel == "0").ToList().FirstOrDefault(); exTask1.EndLocat = newSlot; //目标位置 exTask1.Type = "2"; //任务类型 0 入库任务 1 出库任务 2 移库任务 exTask1.Msg = Locats.LocatNo + "托盘出库创建的" + locatNo + "托盘的移库任务"; taskModel.EndLocate = newSlot; // 目标地址 taskModel.EndRoadway = Locatyk.RoadwayNo; // 目标巷道 taskModel.TaskType = "2"; // 任务类型 (移库) taskModel.OutMode = newSlot; // 更新储位地址 Locatwc.Status = "5"; // 移出中 Locatyk.Status = "4"; // 移入中 Db.Updateable(Locatyk).ExecuteCommand(); } Db.Updateable(Locatwc).ExecuteCommand(); // 插入任务日志 Db.Insertable(exTask1).ExecuteCommand(); outWhs.Add(taskModel); } if (Locatwc.Status == "2" || Locatwc.Status == "4") { numberQty = numberQty + pallet.Qty; continue; } } var taskNo2 = new Common().GetMaxNo("TK"); var exTask2 = new LogTask(); //出库任务 exTask2.TaskNo = taskNo2; exTask2.Sender = "WMS"; exTask2.Receiver = "WCS"; exTask2.IsSuccess = 0; //是否下发成功 0失败 1成功 exTask2.StartLocat = pallet.LocatNo; //起始位置 exTask2.PalletNo = pallet.PalletNo; //托盘码 exTask2.IsSend = 1;//是否可再次下发 exTask2.IsCancel = 1;//是否可取消 exTask2.IsFinish = 1;//是否可完成 exTask2.Status = "0";//任务状态0:等待执行1正在执行2执行完成 exTask2.OrderType = "4"; //0 入库单 1 出库单 2 盘点单 3 移库单 4 取样出库单 exTask2.EndLocat = model.Code; //目标位置 exTask2.Type = "1"; //任务类型 0 入库任务 1 出库任务 2 移库任务 exTask2.Msg = pallet.LocatNo + "托盘出库任务"; // 插入任务日志 Db.Insertable(exTask2).ExecuteCommand(); OutCommandDto taskModel1 = new OutCommandDto(); taskModel1.StartRoadway = pallet.RoadwayNo; taskModel1.PalletNo = pallet.PalletNo; // 托盘号 taskModel1.StartLocate = pallet.LocatNo; // 起始位置 taskModel1.Order = 1; taskModel1.EndLocate = model.Code; // 目标地址 taskModel1.EndRoadway = ""; // 目标巷道 taskModel1.TaskNo = com.GetMaxNo("TK"); // 任务号 taskModel1.TaskType = "1";// 任务类型 (出库) taskModel1.OutMode = model.Code; // 更新储位状态 Locats.Status = "3"; Db.Updateable(Locats).ExecuteCommand(); outWhs.Add(taskModel1); // 向WCS下发出库任务 if (outWhs.Count > 0) { // 正式运行程序放开 var list2 = outWhs.Select(m => m.TaskNo).ToList(); var jsonData = JsonConvert.SerializeObject(outWhs); //string response = ""; try { //var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss") //response = HttpHelper.DoPost(url, jsonData, "下发给WCS出库命令", "WCS"); //var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss") ////解析返回数据 //var wcsModel = JsonConvert.DeserializeObject(response); //if (wcsModel.StatusCode == 0) //{ // //更改任务的发送返回时间// //new TaskServer().EditTaskIssueOk(list2, time1, time2); //} //if (wcsModel.StatusCode == -1) //{ // new TaskServer().EditTaskIssueNo(list2, time1, time2, wcsModel.Msg); // throw new Exception(wcsModel.Msg); //} } catch (Exception ex) { throw new Exception(ex.Message); } } } //添加操作日志记录 var k = new OperationCrServer() .AddLogOperationCr("质量管理", "质检请验", data.QcNo, "出库", $"点击了出库操作;请验单:{data.QcNo}!", userId); data.Status = "2"; Db.Updateable(data).ExecuteCommand(); return true; } catch (Exception e) { throw new Exception(e.Message); } } #endregion } }