SendWmsTaskAction.cs 19.8 KB
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;
        }
    }
}