using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Text; using System.Threading.Tasks; using SqlSugar; using WMS.Core._02Entity; using WMS.Core.APPBLL; using WMS.Info; using WMS.Info.Enum; using WMS.Info.Models; using WMS.Util; namespace WMS.Core { /// /// 托盘操作类 /// public class TrayBLL : AppCoreBLL { /// /// 扫码托盘码 /// /// /// public ResInfo ScanTrayNo(TrayNoRequest reqData) { try { if (string.IsNullOrWhiteSpace(reqData?.TrayNo)) throw SysExCore.ThrowFailException("参数不能为空"); //根据位置码盘点判断成品或原料 var location = GetPointInfo(reqData.LocationNo); if (location == null) throw SysExCore.ThrowFailException("请扫描正确的货位码!"); List workOrders = new List(); //switch ((EPointType)location.F_type) //{ // case EPointType.AGVM: // //todo:根据托盘号调用飞旭接口获取组盘信息 // break; // case EPointType.AGVP: // workOrders = GetList(reqData.TrayNo); // break; // default: // throw SysExCore.ThrowFailException("请扫描正确的货位码!"); //} //workOrders.Add(new FX_sod_det //{ // sod_part = "三星", // sod_line = 1, // sod_nbr = "fx001", // sod_qty_ord = 100, // sod_qty_ship = 50 //}); return SysExCore.GetResSucc(data: workOrders); } catch (Exception ex) { throw ex; } } /// /// 根据托盘创建任务 /// /// /// public ResInfo TrayTaskCreate(TrayCallRequest reqData) { using (var ctx = SysDbCore.GetDbCtx()) { ctx.BeginTran(); try { foreach (var item in reqData.LstInventoryNo.Distinct()) { var invEntity = ctx.Queryable().First(i => i.F_trayNo == item); if (invEntity == null) throw SysExCore.ThrowFailException("获取库存数据异常"); var invLocation = ctx.Queryable().First(l => l.F_trayNo == invEntity.F_trayNo && l.F_status == (int)EWareCellState.Stored); if (invLocation == null) throw SysExCore.ThrowFailException($"获取托盘:{invEntity.F_trayNo}货位数据异常"); if (invLocation.F_status == (int)EWareCellState.In && invLocation.F_status == (int)EWareCellState.Out) throw SysExCore.ThrowFailException($"托盘:{invEntity.F_trayNo}货位正在执行任务无法下架"); var task = new WMS_TASK { F_addTime = DateTime.Now, F_addUserNo = LoginUser.UserNo, F_editTime = DateTime.Now, F_isBonded = invLocation.F_isBonded, F_posidTo = reqData.LocationNo, F_priority = (int)EPriority.NotUrgent, F_taskStatus = (int)ETaskStatus.NotIssued, F_taskType = (int)ETaskComType.OutStock, F_boxNo = invEntity.F_boxNo, F_trayNo = invEntity.F_trayNo, F_pickPort = reqData.LocationNo, F_posidFrom = invLocation.F_no, F_posidcur = invLocation.F_no, F_EquipmentType = (int)EEquipmentType.RGV, F_orderType = (int)EStockOutOrderType.StockOutOrderTypeHalfTray, F_memo = "呼叫半托" }; var taskReturn = ctx.Insertable(task).ExecuteReturnEntity(); var upd = ctx.Updateable().SetColumns(it => new BASE_LOCATION() { F_status = (int)EWareCellState.Out, F_editTime = DateTime.Now, F_editUserNo = LoginUser.UserNo, }).Where(w => w.F_no == invLocation.F_no).ExecuteCommand(); if (upd <= 0) throw SysExCore.ThrowFailException("更新货位状态失败,请重试。"); } ctx.CommitTran(); return SysExCore.GetResSucc("任务生成成功"); } catch (Exception e) { ctx.RollbackTran(); throw; } } } /// /// 托盘下架 /// /// /// public ResInfo TrayTaskStockOutCreate(TrayCallRequest reqData) { using (var ctx = SysDbCore.GetDbCtx()) { ctx.BeginTran(); try { var point = ctx.Queryable().First(a=>a.F_no==reqData.LocationNo); if(point==null) throw SysExCore.ThrowFailException("点位信息无效。"); if(!(point.F_type==(int)EPointType.CPCKJXK || point.F_type==(int)EPointType.YLCKJXK)) throw SysExCore.ThrowFailException("托盘下架只能从拣选口出。"); foreach (var item in reqData.LstInventoryNo.Distinct()) { //生成出库任务 BILL_STOCKOUT order = new BILL_STOCKOUT() { F_addTime = DateTime.Now, F_addUserNo = LoginUser.UserNo, F_no = SerialNumberProvider.Instance.OrderNumber("wms", "CK"), F_orderStatus = (int)EOrderState.New, F_totalOrderLines = reqData.LstInventoryNo.Count, F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo }; List lstStockOutLines = new List(); List lstStockOutLineDetails = new List(); var invLst = ctx.Queryable().Where(i => i.F_trayNo == item).ToList(); if (invLst == null) throw SysExCore.ThrowFailException("获取库存数据异常"); var invLocation = ctx.Queryable().First(l => l.F_trayNo == item && l.F_status == (int)EWareCellState.Stored); if (invLocation == null) throw SysExCore.ThrowFailException($"获取托盘:{item}货位数据异常"); if (invLocation.F_status == (int)EWareCellState.In && invLocation.F_status == (int)EWareCellState.Out) throw SysExCore.ThrowFailException($"托盘:{item}货位正在执行任务无法下架"); foreach (var invEntity in invLst) { lstStockOutLines.Add(new BILL_STOCKOUTLINE { //F_actualQty = invEntity.F_quantity, F_addTime = DateTime.Now, F_addUserNo = LoginUser.UserNo, F_editTime = DateTime.Now, F_batchNo = invEntity.F_batchNo, F_matType = invEntity.F_matType, F_planQty = invEntity.F_quantity, F_matNo = invEntity.F_matNo, F_orderLineNo = reqData.LstInventoryNo.IndexOf(item) + 1, F_matName = invEntity.F_matName, F_pNo = order.F_no, F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo }); lstStockOutLineDetails.Add(new BILL_STOCKOUTLINEDETAIL { F_addTime = DateTime.Now, F_addUserNo = LoginUser.UserNo, F_locationNo = invLocation.F_no, F_boxNo = invEntity.F_boxNo, F_matName = invEntity.F_matName, F_matNo = invEntity.F_matNo, F_matType = invEntity.F_matType, F_quantity = invEntity.F_quantity, F_pNo = order.F_no, F_projectNo = invEntity.F_projectNo, F_uid = invEntity.F_uid, F_trayNo = item }); } var task = new WMS_TASK { F_addTime = DateTime.Now, F_addUserNo = LoginUser.UserNo, F_editTime = DateTime.Now, F_isBonded = invLocation.F_isBonded, F_posidTo = reqData.LocationNo, F_posidNext = reqData.LocationNo, F_priority = (int)EPriority.NotUrgent, F_taskStatus = (int)ETaskStatus.NotIssued, F_taskType = (int)ETaskComType.OutStock, F_trayNo = item, F_pickPort = reqData.LocationNo, F_posidFrom = invLocation.F_no, F_posidcur = invLocation.F_no, F_orderNo = order.F_no, F_EquipmentType = (int)EEquipmentType.RGV, }; if (invLst.First().F_matType == (int)EMatType.Mat) { order.F_orderType = (int)EStockOutOrderType.StockOutOrderTypeMaterial; task.F_orderType = (int)ETaskOrderType.StockOutOrderTypeMaterial; } else if (invLst.First().F_matType == (int)EMatType.Product) { order.F_orderType = (int)EStockOutOrderType.StockOutOrderTypeMaterial; task.F_orderType = (int)ETaskOrderType.StockOutOrderTypeMaterial; } else { order.F_orderType = (int)EStockOutOrderType.StockOutOrderTypeTray; task.F_orderType = (int)ETaskOrderType.StockOutOrderTypeEmptyTrayGroup; } var taskReturn = ctx.Insertable(task).ExecuteReturnEntity(); var upd = ctx.Updateable().SetColumns(it => new BASE_LOCATION() { F_status = (int)EWareCellState.Out, F_editTime = DateTime.Now, F_editUserNo = LoginUser.UserNo, }).Where(w => w.F_no == invLocation.F_no).ExecuteCommand(); if (upd <= 0) throw SysExCore.ThrowFailException("更新货位状态失败,请重试。"); ctx.Insertable(order).ExecuteCommand(); ctx.Insertable(lstStockOutLines).ExecuteCommand(); ctx.Insertable(lstStockOutLineDetails).ExecuteCommand(); } ctx.CommitTran(); return SysExCore.GetResSucc("任务生成成功"); } catch (Exception e) { ctx.RollbackTran(); throw; } } } /// /// 半托查询 /// /// /// public ResInfo HalfQuery(HalfTrayQueryRequest reqData) { using (var ctx = SysDbCore.GetDbCtx()) { var invs = ctx.Queryable((inv, loc) => new object[] { JoinType.Inner, inv.F_trayNo == loc.F_trayNo }) .Where((inv, loc) => loc.F_height > loc.F_matHeight && loc.F_status == (int)EWareCellState.Stored); if (reqData.Type == (int)EMatType.Mat) { invs = invs.Where(inv => inv.F_matType == (int)EMatType.Mat); if (!string.IsNullOrWhiteSpace(reqData.KeyWord)) invs = invs.Where(inv => inv.F_uid == reqData.KeyWord); } if (reqData.Type == (int)EMatType.Product) { invs = invs.Where(inv => inv.F_matType == (int)EMatType.Product); if (!string.IsNullOrWhiteSpace(reqData.KeyWord)) invs = invs.Where(inv => inv.F_matNo == reqData.KeyWord); } if (reqData.IsBonded) invs.Where((inv, loc) => loc.F_isBonded == reqData.IsBonded); if (FuncStr.NullToInt(reqData.SpaceNum.TrimEnd('%')) > 0) invs = invs.Where((inv, loc) => (loc.F_matHeight * 100) / loc.F_height >= FuncStr.NullToInt(reqData.SpaceNum.TrimEnd('%'))); var invsReturn = invs.Select("inv.f_no,inv.F_trayNo,inv.F_matNo,inv.F_UID,cast(cast(IIF((F_matHeight*100)/F_height=0,100,(F_matHeight*100)/F_height) as int) as nvarchar(50))+'%' spaceNum"); List list = null; int count = 0; list = invsReturn.OrderBy("inv.F_matNo asc").ToPageList(reqData.pagination.page, reqData.pagination.rows, ref count); reqData.pagination.records = count; return SysExCore.GetResSucc("查询成功", data: new { list = list, pageInfo = reqData.pagination }); } } /// /// 托盘查询 /// /// /// public ResInfo Query(TrayQueryRequest reqData) { using (var ctx = SysDbCore.GetDbCtx()) { var invs = ctx.Queryable((inv, loc) => new object[] { JoinType.Inner, inv.F_trayNo == loc.F_trayNo }) .Where((inv, loc) => loc.F_height > loc.F_matHeight && loc.F_status == (int)EWareCellState.Stored); if (!string.IsNullOrWhiteSpace(reqData.KeyWord)) invs = invs.Where(inv => inv.F_matNo == reqData.KeyWord); if (FuncStr.NullToInt(reqData.SpaceNum.TrimEnd('%')) > 0) invs = invs.Where((inv, loc) => (loc.F_matHeight * 100) / loc.F_height >= FuncStr.NullToInt(reqData.SpaceNum.TrimEnd('%'))); var invsReturn = invs.Select("inv.f_no,inv.F_trayNo,inv.F_matNo,inv.F_UID,cast(cast(IIF((F_matHeight*100)/F_height=0,100,(F_matHeight*100)/F_height) as int) as nvarchar(50))+'%' spaceNum"); List list = null; int count = 0; list = invsReturn.OrderBy("inv.F_matNo asc").ToPageList(reqData.pagination.page, reqData.pagination.rows, ref count); reqData.pagination.records = count; return SysExCore.GetResSucc("查询成功", data: new { list = list, pageInfo = reqData.pagination }); } } } }