using System; using System.Collections.Generic; using System.Data; using Infrastructure; using Quartz; using WebApp; using WebRepository; using System.Linq; namespace WebMvc { /// <summary> /// 任务预警 /// </summary> [PersistJobDataAfterExecution] [DisallowConcurrentExecution] public class SendWmsTaskAction { private string ConnString { set; get; } IJobExecutionContext Context { set; get; } public SendWmsTaskAction(string _ConnString, IJobExecutionContext _Context) { ConnString = _ConnString; Context = _Context; } public void Execute(JobContainer jobContainer) { UnitWork _unitWork = new UnitWork(AppSettingsJson.JobContext(ConnString)); string str = ""; try { List<ShipmentDetail> shipmentDetails = _unitWork.Find<ShipmentDetail>(n => n.Status == ShipmentHeaderStatus.新建).OrderBy(n => n.CreateTime).ToList(); foreach (ShipmentDetail shipmentDetail in shipmentDetails) { ShipmentHeader shipmentHeader = _unitWork.Find<ShipmentHeader>(n => n.Code == shipmentDetail.ShipmentCode).FirstOrDefault(); str = AddTaskInfo(shipmentDetail, shipmentHeader); if (str == "") { if (_unitWork.IsExist<ShipmentDetail>(n => n.Qty == n.QtyDivided && n.SourceCode == shipmentDetail.SourceCode && n.MaterialCode == shipmentDetail.MaterialCode && n.ShipmentCode == shipmentDetail.ShipmentCode)) { shipmentDetail.Status = ShipmentHeaderStatus.分配完成; _unitWork.Update(shipmentDetail); } else { InventoryAlert inventoryAlert = _unitWork.Find<InventoryAlert>(n => n.ShipmentCode == shipmentDetail.ShipmentCode && n.MaterialCode == shipmentDetail.MaterialCode).FirstOrDefault(); if (inventoryAlert == null) { inventoryAlert = new InventoryAlert { ShipmentCode = shipmentDetail.ShipmentCode, MaterialCode = shipmentDetail.MaterialCode, HadQty = shipmentDetail.QtyDivided, CreateTime = DateTime.Now }; _unitWork.Add(inventoryAlert); } else { inventoryAlert.HadQty = shipmentDetail.QtyDivided; inventoryAlert.UpdateTime = DateTime.Now; _unitWork.Update(inventoryAlert); } } } else { shipmentDetail.Error = str; _unitWork.Update(shipmentDetail); } } } catch (Exception ex) { throw ex; } } //根据出库单明细数据创建Task主子任务 public string AddTaskInfo(ShipmentDetail shipmentDetail, ShipmentHeader shipmentHeader) { string strError = ""; try { UnitWork _unitWork = new UnitWork(AppSettingsJson.JobContext(ConnString)); Task task = _unitWork.Find<Task>(n => n.OrderCode == shipmentDetail.ShipmentCode).FirstOrDefault(); var tno = ""; if (task != null) { tno = task.TaskNo; } else { tno = _unitWork.GetTaskNo(TaskNo.出库自动分配); task = new Task { OrderCode = shipmentDetail.ShipmentCode, TaskNo = tno, SourceCode = shipmentDetail.SourceCode, FirstStatus = TaskStatus.待下发任务, LastStatus = TaskStatus.待下发任务, CreateTime = DateTime.Now }; } //根据出库子表数据创建任务主表数据 List<Inventory> inventorys = (from inv in _unitWork.Find<Inventory>(n => n.MaterialCode == shipmentDetail.MaterialCode && n.Status == InventoryTaskType.无任务) join con in _unitWork.Find<Container>(n => n.IsLock != ContainerLock.盘点锁) on inv.ContainerCode equals con.Code select inv).OrderBy(n => n.OldBatch).ToList(); if (inventorys.Count > 0) { //任务所需要出库的数量 var sqty = shipmentDetail.Qty - shipmentDetail.QtyDivided; foreach (Inventory inventory in inventorys) { decimal hadqty = 0; decimal invQty = (decimal)inventory.Qty; if (_unitWork.IsExist<TaskDetail>(n => n.Station != shipmentHeader.Station && n.TaskType != TaskType.容器出库 && n.ContainerCode == inventory.ContainerCode)) { continue; } else { hadqty = (decimal)_unitWork.Find<TaskDetail>(n => n.ContainerCode == inventory.ContainerCode && n.Status > TaskStatus.新建任务 && n.Status < TaskStatus.已经完成 && (n.TaskType == TaskType.整盘出库 || n.TaskType == TaskType.分拣出库)).Sum(n => n.HadQty); } if (hadqty != 0) { invQty -= hadqty; if (invQty == 0) { continue; } } //库存数量大于要出库的数量(创建容器分拣出库任务子表和容器出库任务主子表) StationRoadway stationRoadway = _unitWork.Find<StationRoadway>(n => n.StationCode == shipmentHeader.Station).FirstOrDefault(); var Roadway = 0; if (stationRoadway != null) { Roadway = (int)stationRoadway.RoadWay; } if (invQty >= sqty) { //根据出库子表数据创建分拣出库类型任务子表表数据 TaskDetail detail = new TaskDetail { TaskNo = tno, TaskType = TaskType.分拣出库, SourceCode = shipmentDetail.SourceCode, ContainerCode = inventory.ContainerCode, OrderCode = shipmentDetail.ShipmentCode, Batch = inventory.OldBatch, MaterialCode = inventory.MaterialCode, Lot = inventory.Lot, SourceLocation = inventory.LocationCode, DestinationLocation = shipmentHeader.Station, Roadway = Roadway, Station = shipmentHeader.Station, Status = TaskStatus.待下发任务, Priority = shipmentHeader.Priority, HadQty = sqty, OderQty = shipmentDetail.Qty, ContainerQty = invQty, CreateTime = DateTime.Now, CreateBy = shipmentHeader.CreateBy }; if (!_unitWork.IsExist<TaskDetail>(n => n.ContainerCode == inventory.ContainerCode && n.Status > TaskStatus.新建任务 && n.Status < TaskStatus.已经完成 && n.TaskType == TaskType.容器出库)) { // 创建容器出库类型任务主表数据 var taskNo = _unitWork.GetTaskNo(TaskNo.容器出库); Task taskOut = new Task { OrderCode = shipmentDetail.ShipmentCode, TaskNo = taskNo, BusinessType = BusinessType.出库_其他出库单, SourceCode = shipmentDetail.SourceCode, FirstStatus = TaskStatus.待下发任务, LastStatus = TaskStatus.待下发任务, CreateTime = DateTime.Now }; _unitWork.Add(taskOut); //创建容器出库类型任务子表数据 TaskDetail taskDetail = new TaskDetail { TaskNo = taskNo, TaskType = TaskType.容器出库, SourceCode = shipmentDetail.SourceCode, ContainerCode = inventory.ContainerCode, OrderCode = shipmentDetail.ShipmentCode, Batch = inventory.OldBatch, MaterialCode = inventory.MaterialCode, Lot = inventory.Lot, ContainerQty = 0, HadQty = 0, OderQty = 0, SourceLocation = inventory.LocationCode, DestinationLocation = shipmentHeader.Station, Roadway = Roadway, Station = shipmentHeader.Station, Status = TaskStatus.待下发任务, Priority = shipmentHeader.Priority, CreateTime = DateTime.Now, CreateBy = shipmentHeader.CreateBy }; _unitWork.Add(taskDetail); } else { detail.Status = TaskStatus.下达任务; List<TaskDetail> list = new List<TaskDetail>(); list = _unitWork.Find<TaskDetail>(n => n.TaskNo == task.TaskNo).ToList(); if (list.Count > 0) { foreach (TaskDetail td in list) { td.Status = TaskStatus.下达任务; if (!_unitWork.IsExist<TaskDetail>(n => n.TaskNo == td.TaskNo && n.Status > detail.Status)) { task = _unitWork.Find<Task>(n => n.TaskNo == td.TaskNo).FirstOrDefault(); if (task != null) { task.FirstStatus = td.Status; } _unitWork.Update(task); } if (!_unitWork.IsExist<TaskDetail>(n => n.TaskNo == td.TaskNo && n.Status < detail.Status)) { task = _unitWork.Find<Task>(n => n.TaskNo == td.TaskNo).FirstOrDefault(); if (task != null) { task.LastStatus = td.Status; } _unitWork.Update(task); } _unitWork.Update(td); } } } shipmentDetail.QtyDivided += invQty; break; } //库存数量小于要出库的数量 else { //出库主表任务明细 //创建整盘出库类型任务子表数据 TaskDetail detail = new TaskDetail { TaskNo = tno, TaskType = TaskType.整盘出库, SourceCode = shipmentDetail.SourceCode, ContainerCode = inventory.ContainerCode, OrderCode = shipmentDetail.ShipmentCode, Batch = inventory.OldBatch, MaterialCode = inventory.MaterialCode, Lot = inventory.Lot, SourceLocation = inventory.LocationCode, DestinationLocation = shipmentHeader.Station, Roadway = Roadway, Station = shipmentHeader.Station, Status = TaskStatus.待下发任务, Priority = shipmentHeader.Priority, HadQty = invQty, OderQty = shipmentDetail.Qty, ContainerQty = invQty, CreateTime = DateTime.Now, CreateBy = shipmentHeader.CreateBy }; //剩余没有出库的数量 sqty = sqty - invQty; //查询当前容器是否已经创建 if (!_unitWork.IsExist<TaskDetail>(n => n.ContainerCode == inventory.ContainerCode && n.Status > TaskStatus.新建任务 && n.Status < TaskStatus.已经完成 && n.TaskType == TaskType.容器出库)) { // 创建容器出库类型任务主表数据 var taskNo = _unitWork.GetTaskNo(TaskNo.容器出库); task = new Task { OrderCode = shipmentDetail.ShipmentCode, TaskNo = taskNo, BusinessType = BusinessType.出库_其他出库单, SourceCode = shipmentDetail.SourceCode, FirstStatus = TaskStatus.待下发任务, LastStatus = TaskStatus.待下发任务, CreateTime = DateTime.Now }; //创建容器出库类型任务子表数据 TaskDetail taskDetail = new TaskDetail { TaskNo = taskNo, TaskType = TaskType.容器出库, SourceCode = shipmentDetail.SourceCode, ContainerCode = inventory.ContainerCode, OrderCode = shipmentDetail.ShipmentCode, Batch = inventory.OldBatch, MaterialCode = inventory.MaterialCode, Lot = inventory.Lot, ContainerQty = 0, HadQty = 0, OderQty = 0, SourceLocation = inventory.LocationCode, DestinationLocation = shipmentHeader.Station, Roadway = Roadway, Station = shipmentHeader.Station, Status = TaskStatus.待下发任务, Priority = shipmentHeader.Priority, CreateTime = DateTime.Now, CreateBy = shipmentHeader.CreateBy }; _unitWork.Add(task); _unitWork.Add(taskDetail); } else { detail.Status = TaskStatus.下达任务; List<TaskDetail> list = new List<TaskDetail>(); list = _unitWork.Find<TaskDetail>(n => n.TaskNo == task.TaskNo).ToList(); if (list.Count > 0) { foreach (TaskDetail td in list) { td.Status = TaskStatus.下达任务; if (!_unitWork.IsExist<TaskDetail>(n => n.TaskNo == td.TaskNo && n.Status > detail.Status)) { task = _unitWork.Find<Task>(n => n.TaskNo == td.TaskNo).FirstOrDefault(); if (task != null) { task.FirstStatus = td.Status; } _unitWork.Update(task); } if (!_unitWork.IsExist<TaskDetail>(n => n.TaskNo == td.TaskNo && n.Status < detail.Status)) { task = _unitWork.Find<Task>(n => n.TaskNo == td.TaskNo).FirstOrDefault(); if (task != null) { task.LastStatus = td.Status; } _unitWork.Update(task); } _unitWork.Update(td); } } } } shipmentDetail.QtyDivided += invQty; } shipmentDetail.QtyCompleted = shipmentDetail.QtyDivided; _unitWork.Update(shipmentDetail); } else { strError = "库内未找到该物料!"; } } catch (Exception ex) { strError = ex.Message; return strError; } return strError; } } }