CPEmptyAction.cs 15.3 KB
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using Infrastructure;
using Quartz;
using WebApp;
using WebRepository;

namespace WebMvc
{
    /// <summary>
    /// 任务预警
    /// </summary>
    [PersistJobDataAfterExecution]
    [DisallowConcurrentExecution]
    public class CPEmptyAction
    {
        private string ConnString { set; get; }
        IJobExecutionContext Context { set; get; }

        public CPEmptyAction(string _ConnString, IJobExecutionContext _Context)
        {
            ConnString = _ConnString;
            Context = _Context;
        }

        public void Execute(JobContainer jobContainer)
        {
            UnitWork _unitWork = new UnitWork(AppSettingsJson.JobContext(ConnString));
            try
            {
                List<TaskDetail> ptaskDetails = new List<TaskDetail>();
                ptaskDetails = _unitWork.Find<TaskDetail>(n => n.TaskType == TaskType.容器出库 && (n.Station == "BufferStationE01" || n.Station == "BufferStationE02")  && n.ContainerCode == null && n.Status == TaskStatus.新建任务).OrderBy(n => n.CreateTime).ToList();
                List<Inventory> inventorys = _unitWork.Find<Inventory>(n => n.ContainerCode == "woodPallet" && n.Qty > 0 && (n.LocationCode == "BufferStationE01" || n.LocationCode == "BufferStationE02")).ToList();

                foreach (Inventory inv in inventorys)
                {
                    if (!_unitWork.IsExist<TaskDetail>(n => n.Status > TaskStatus.新建任务 && n.Status < TaskStatus.已经完成 && (n.DestinationLocation == inv.LocationCode || n.SourceLocation == inv.LocationCode)))
                    {
                        TaskDetail taskDetail = ptaskDetails.Where<TaskDetail>(n => n.MaterialCode == inv.MaterialCode).FirstOrDefault();
                        if (taskDetail != null)
                        {
                            TaskDetail Detail = new TaskDetail();
                            Detail.TaskNo = taskDetail.TaskNo;
                            Detail.OrderCode = taskDetail.TaskNo;
                            Detail.TaskType = TaskType.站台到站台;
                            Detail.Roadway = _unitWork.Find<Location>(n => n.Code == inv.LocationCode).Select(a => a.Roadway).FirstOrDefault();
                            Detail.ContainerCode = "woodPallet";
                            Detail.SourceLocation = taskDetail.Station;
                            Detail.Station = taskDetail.DestinationLocation;
                            Detail.DestinationLocation = taskDetail.DestinationLocation;
                            Detail.Status = TaskStatus.待下发任务;
                            inv.Qty -= 1;
                            if (inv.Qty == 0)
                            {
                                _unitWork.Delete(inv);
                            }
                            else
                            {
                                _unitWork.Update(inv);
                            }
                            Detail.OderQty = 0;
                            Detail.ContainerQty = 0;
                            Detail.HadQty = 0;
                            Detail.Priority = 0;
                            Detail.CreateTime = DateTime.Now;
                            _unitWork.Add(Detail);

                            taskDetail.Status = TaskStatus.已经完成;
                            _unitWork.Update(taskDetail);
                        }
                        else
                        {
                            break;
                        }
                    }
                }

                string type = "";
                foreach (TaskDetail ptaskDetail in ptaskDetails)
                {
                    if (!_unitWork.IsExist<TaskDetail>(n => n.Status > TaskStatus.新建任务 && n.Status < TaskStatus.已经完成 && (n.DestinationLocation == ptaskDetail.Station || n.SourceLocation == ptaskDetail.Station)))
                    {
                        Inventory Inv = _unitWork.Find<Inventory>(n => n.LocationCode == ptaskDetail.Station).FirstOrDefault();
                        if (Inv != null)
                        {
                            if (ptaskDetail.MaterialCode == "1" || ptaskDetail.MaterialCode == "2" || ptaskDetail.MaterialCode == "3")
                            {
                                type = ContainerType.木栈板母板_1;
                            }
                            else
                            {
                                type = ContainerType.木栈板母板_2;
                            }
                            var container = (from con in _unitWork.Find<Container>(n => n.Type == type && n.Status == ContainerStatus. && n.IsLock == 0)
                                             join loc in _unitWork.Find<Location>(n => n.Roadway == 5 && n.Status == LocationStatus.空容器)
                                             on con.LocationCode equals loc.Code
                                             select con).FirstOrDefault();
                            if (container != null)
                            {
                                int ptdcount = _unitWork.Find<TaskDetail>(n => (n.Status >= TaskStatus.新建任务 && n.Status < TaskStatus.已经完成) && n.ContainerCode == container.Code).Count();
                                if (ptdcount < 1 && container.IsLock == ContainerLock.未锁)
                                {
                                    Task task = new Task();
                                    var ctaskNo = _unitWork.GetTaskNo(TaskNo.容器出库);
                                    task.TaskNo = ctaskNo;
                                    task.OrderCode = ctaskNo;
                                    task.BusinessType = BusinessType.出库_其他出库单;
                                    task.FirstStatus = TaskStatus.待下发任务;
                                    task.LastStatus = TaskStatus.待下发任务;
                                    task.CreateTime = DateTime.Now;
                                    _unitWork.Add(task);

                                    for (int i = 1; i < 3; i++)
                                    {
                                        TaskDetail Detail = new TaskDetail();
                                        Detail.TaskNo = ctaskNo;
                                        Detail.OrderCode = ctaskNo;
                                        if (i == 1)
                                        {
                                            Detail.TaskType = TaskType.空容器出库;
                                            Detail.Roadway = _unitWork.Find<StationRoadway>(n => n.StationCode == Inv.LocationCode).Select(a => a.RoadWay).FirstOrDefault();
                                            if (Detail.Roadway == null)
                                            {
                                                ptaskDetail.Error = "inventory id:" + Inv.Id + "LocationCode异常" + DateTime.Now.ToString("HH:mm:ss");
                                                _unitWork.Update(ptaskDetail);
                                                break;
                                            }
                                            Detail.ContainerCode = container.Code;
                                            Detail.SourceLocation = container.LocationCode;
                                            Detail.DestinationLocation = ptaskDetail.Station;
                                            Detail.Station = ptaskDetail.Station;
                                            Detail.Status = TaskStatus.待下发任务;
                                        }
                                        else if (i == 2)
                                        {
                                            Detail.TaskType = TaskType.容器回库;
                                            Detail.Roadway = _unitWork.Find<Location>(n => n.Code == Inv.LocationCode).Select(a => a.Roadway).FirstOrDefault();
                                            Detail.ContainerCode = container.Code;
                                            Detail.SourceLocation = ptaskDetail.Station;
                                            Detail.Station = ptaskDetail.Station;
                                            Detail.Status = TaskStatus.新建任务;

                                            Inv.ContainerCode = container.Code;
                                            _unitWork.Update(Inv);
                                        }

                                        Detail.OderQty = 0;
                                        Detail.ContainerQty = 0;
                                        Detail.HadQty = 0;
                                        Detail.Priority = 0;
                                        Detail.CreateTime = DateTime.Now;
                                        _unitWork.Add(Detail);
                                    }
                                }
                                break;
                            }
                            else
                            {
                                ptaskDetail.Error = "库内无该类型空母板" + DateTime.Now.ToString("HH:mm:ss");
                                _unitWork.Update(ptaskDetail);
                            }
                        }
                        else
                        {
                            Inventory inventory = (from inv in _unitWork.Find<Inventory>(n => n.MaterialCode == ptaskDetail.MaterialCode && n.TaskStatus == InventoryTaskType.无任务)
                                         join container in _unitWork.Find<Container>(n => n.IsLock == 0)
                                         on inv.ContainerCode equals container.Code
                                         select inv).FirstOrDefault();
                            if (inventory != null)
                            {
                                int ptdcount = _unitWork.Find<TaskDetail>(n => (n.Status >= TaskStatus.新建任务 && n.Status < TaskStatus.已经完成) && n.ContainerCode == inventory.ContainerCode).Count();
                                if (ptdcount < 1 && inventory.TaskStatus == InventoryTaskType.无任务)
                                {
                                    for (int i = 1; i < 4; i++)
                                    {
                                        TaskDetail Detail = new TaskDetail();
                                        Detail.TaskNo = ptaskDetail.TaskNo;
                                        Detail.OrderCode = ptaskDetail.TaskNo;
                                        if (i == 1)
                                        {
                                            Detail.TaskType = TaskType.容器出库;
                                            Detail.Roadway = _unitWork.Find<Location>(n => n.Code == inventory.LocationCode).Select(a => a.Roadway).FirstOrDefault();
                                            if (Detail.Roadway == null)
                                            {
                                                ptaskDetail.Error = "inventory id:" + inventory.Id + "LocationCode异常" + DateTime.Now.ToString("HH:mm:ss");
                                                _unitWork.Update(ptaskDetail);
                                                break;
                                            }
                                            Detail.ContainerCode = inventory.ContainerCode;
                                            Detail.SourceLocation = inventory.LocationCode;
                                            Detail.DestinationLocation = ptaskDetail.Station;
                                            Detail.Station = ptaskDetail.Station;
                                            Detail.Status = TaskStatus.待下发任务;
                                        }
                                        else if (i == 2)
                                        {
                                            Detail.TaskType = TaskType.空容器入库;
                                            Detail.Roadway = _unitWork.Find<Location>(n => n.Code == inventory.LocationCode).Select(a => a.Roadway).FirstOrDefault();
                                            Detail.ContainerCode = inventory.ContainerCode;
                                            Detail.SourceLocation = ptaskDetail.Station;
                                            Detail.Station = ptaskDetail.Station;
                                            Detail.Status = TaskStatus.新建任务;
                                        }
                                        else if (i == 3)
                                        {
                                            Detail.TaskType = TaskType.站台到站台;
                                            Detail.Roadway = _unitWork.Find<Location>(n => n.Code == inventory.LocationCode).Select(a => a.Roadway).FirstOrDefault();
                                            Detail.ContainerCode = "woodPallet";
                                            Detail.SourceLocation = ptaskDetail.Station;
                                            Detail.Station = ptaskDetail.DestinationLocation;
                                            Detail.DestinationLocation = ptaskDetail.DestinationLocation;
                                            Detail.Status = TaskStatus.新建任务;
                                            inventory.Qty -= 1;
                                            if (inventory.Qty == 0)
                                            {
                                                _unitWork.Delete(inventory);
                                            }
                                            else
                                            {
                                                _unitWork.Update(inventory);
                                            }
                                        }

                                        Detail.OderQty = 0;
                                        Detail.ContainerQty = 0;
                                        Detail.HadQty = 0;
                                        Detail.Priority = 0;
                                        Detail.CreateTime = DateTime.Now;
                                        _unitWork.Add(Detail);

                                        inventory.TaskStatus = InventoryTaskType.任务锁定中;
                                        _unitWork.Update(inventory);

                                        ptaskDetail.Status = TaskStatus.已经完成;
                                        _unitWork.Update(ptaskDetail);
                                    }
                                }
                            }
                            else
                            {
                                ptaskDetail.Error = "库内无该类型空木栈板" + DateTime.Now.ToString("HH:mm:ss");
                                _unitWork.Update(ptaskDetail);
                            }
                        }
                    }
                    else
                    {
                        ptaskDetail.Error = "该站台有出入库任务" + DateTime.Now.ToString("HH:mm:ss");
                        _unitWork.Update(ptaskDetail);
                    }

                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}