using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WCS.Data;
using WCS.Data.Models;
using WCS.PLC;
using WCS.PLC.Model.Equipment;
namespace WCS.Workflow
{
    public class SRM_Tray : Base_Srm
    {
        private string Conv_1508 = "1508";
        private string Conv_1509 = "1509";
        //private string Conv_1445 = "1445";
        //private string Conv_1447 = "1447";
        //private string Conv_1449 = "1449";
        /// 
        /// 涂布车间出口集合
        /// 
        private List CoatingWorkshopList = new List();
        /// 
        /// 原膜卷出口集合(二楼)
        /// 
        private List OriginalFilmRollOutList = new List();
        /// 
        /// 一楼发货口集合
        /// 
        private List SendGoodsConvList = new List();
        #region Constructor
        public SRM_Tray() : base()
        {
            CoatingWorkshopList.Add("1097");//4#涂布车间
            CoatingWorkshopList.Add("1104");//5#涂布车间
            CoatingWorkshopList.Add("1107");//6#涂布车间
            CoatingWorkshopList.Add("1112");//7#涂布车间
            CoatingWorkshopList.Add("1072");//空原膜托盘二坐标位置
            OriginalFilmRollOutList.Add("Pvc_4_A");
            OriginalFilmRollOutList.Add("Pvc_4_B");
            OriginalFilmRollOutList.Add("Pvc_4_C");
            OriginalFilmRollOutList.Add("Pvc_5_D");
            OriginalFilmRollOutList.Add("Pvc_5_E");
            OriginalFilmRollOutList.Add("Pvc_5_F");
            OriginalFilmRollOutList.Add("Pvc_6_G");
            OriginalFilmRollOutList.Add("Pvc_6_H");
            OriginalFilmRollOutList.Add("Pvc_6_J");
            OriginalFilmRollOutList.Add("Pvc_7_AA");
            OriginalFilmRollOutList.Add("Pvc_7_AB");
            OriginalFilmRollOutList.Add("Pvc_7_AK");
            OriginalFilmRollOutList.Add("1036");
            OriginalFilmRollOutList.Add("1035");
            SendGoodsConvList.Add("1445");
            SendGoodsConvList.Add("1447");
            SendGoodsConvList.Add("1449");
        }
        #endregion;
        protected override WCS_EQUIPMENTROUTE QueryOutEquRouteItem(WCS_TASK task, List routeSet)
        {
            WCS_EQUIPMENTROUTE routeItem = null;
            if (task.TASK_POSIDTO == "Out_Area_A")
            {
                if (task.FromRow == 1 || task.FromRow == 2)
                {
                    routeItem = routeSet.FirstOrDefault(v => v.ROUTE_SONPOS == "1455");
                }
                else
                {
                    routeItem = routeSet.FirstOrDefault(v => v.ROUTE_SONPOS == "1454");
                }
            }
            else if (task.TASK_POSIDTO == "1454")
            {
                routeItem = routeSet.FirstOrDefault(v => v.ROUTE_SONPOS == "1454");
            }
            else if (task.TASK_POSIDTO == "1455")
            {
                routeItem = routeSet.FirstOrDefault(v => v.ROUTE_SONPOS == "1455");
            }
            else if (task.TASK_FromTunnelNum == "1")
            {
                routeItem = routeSet.FirstOrDefault(v => v.ROUTE_SONPOS == "1036");
            }
            else if (task.TASK_FromTunnelNum == "2")
            {
                routeItem = routeSet.FirstOrDefault(v => v.ROUTE_SONPOS == "1035");
            }
            else
            {
                routeItem = base.QueryOutEquRouteItem(task, routeSet);
            }
            return routeItem;
        }
        protected override bool CheckAreaOutAddress(WCS_TASK task, WCS_EQUIPMENTROUTE route)
        {
            bool result = true;
            if (task.TASK_POSIDTO == "Out_Area_A")
            {
                if (task.FromRow == 1 || task.FromRow == 2)
                {
                    if (route.ROUTE_SONPOS == "1454")
                    {
                        result = false;
                        //var cv = ConveyorHelper.GetConveyorSignal("conveyor01", "1455");
                        //if (cv.DB521_Request == false && cv.DB521_Tasknum == 0 && cv.CvDB51_PH_Status == false)
                        //{
                        //    result = false;
                        //}
                    }
                }
                else
                {
                    if (route.ROUTE_SONPOS == "1455")
                    {
                        var cv = ConveyorHelper.GetConveyorSignal("conveyor01", "1454");
                        if (cv.DB521_Request == false && cv.DB521_Tasknum == 0 && cv.CvDB51_PH_Status == false)
                        {
                            result = false;
                        }
                    }
                }
            }
            if (route.ROUTE_SONPOS == "1036")
            {
                if (task.TASK_FromTunnelNum != "1")
                {
                    result = false;
                }
            }
            else if (route.ROUTE_SONPOS == "1035")
            {
                if (task.TASK_FromTunnelNum != "2")
                {
                    result = false;
                }
            }
            return result;
        }
        protected override WCS_TASK QueryInConvTask(WCS_SrmOutInInfo outininfo, WCS_TASK tasks)
        {
            return base.QueryInConvTask(outininfo, tasks);  
        }
        protected override WCS_TASK QueryOutTask(SqlSugarClient db, List taskSet)
        {
            WCS_TASK taskitem = null;
            List taskList = new List();
            if (PlcName == "srm01")
            {
                var lastTask = SugarBase.DB.Queryable().Where(v => v.TASK_SRMNO == PlcName && v.TASK_WKSTATUS <= 1 && v.TASK_COMTYPE == 2 && (OriginalFilmRollOutList.Contains(v.TASK_POSIDTO))).OrderBy(v => v.TASK_ADDDATETIME).First();
                //var lastTask = taskSet.OrderBy(v => v.TASK_ADDDATETIME).FirstOrDefault();
                if (lastTask != null)
                {
                    if (lastTask.TASK_ADDDATETIME.AddMinutes(60) < db.GetDate())//1小时未动作
                    {
                        //查询到2条任务
                        var temptasks = SugarBase.DB.Queryable().Where(v => v.TASK_ITEM8 == lastTask.TASK_ITEM8 && v.TASK_WKSTATUS <= 1 && v.TASK_COMTYPE == 2 && v.TASK_SRMNO == PlcName).ToList();
                        //查询当前巷道任务
                        var curTunnelSet = temptasks.Where(v => taskSet.Any(t => t.TASK_NO == v.TASK_NO));
                        if (curTunnelSet.Count() > 0)
                        {
                            taskList.AddRange(curTunnelSet);
                        }
                        //查询非当前巷道任务
                        var noCurTunnelSet = temptasks.Where(v => !taskSet.Any(t => t.TASK_NO == v.TASK_NO));
                        if (noCurTunnelSet.Count() > 0)
                        {
                            taskList.AddRange(noCurTunnelSet);
                        }
                        //taskList.AddRange(temptasks);
                    }
                }
                var taskgroup_1 = taskSet.Where(v => v.TASK_FromTunnelNum == "1").OrderBy(v => v.TASK_ADDDATETIME)
                                       .GroupBy(v => v.TASK_ITEM8)
                                       .Select(g => new { agvId = g.Key, count = g.Count() }).OrderByDescending(v => v.count);
                var taskgroup_2 = taskSet.Where(v => v.TASK_FromTunnelNum == "2").OrderBy(v => v.TASK_ADDDATETIME)
                                  .GroupBy(v => v.TASK_ITEM8)
                                  .Select(g => new { agvId = g.Key, count = g.Count() }).OrderByDescending(v => v.count);
                if (EquSignal.DB521_ToRowPos == 1 || EquSignal.DB521_ToRowPos == 2)
                {
                    //添加1巷道分组排序任务
                    foreach (var item in taskgroup_1)
                    {
                        if (!taskList.Any(v => v.TASK_ITEM8 == item.agvId))
                        {
                            taskList.AddRange(taskSet.Where(v => v.TASK_ITEM8 == item.agvId));
                        }
                    }
                    //添加2巷道分组排序任务
                    foreach (var item in taskgroup_2)
                    {
                        if (!taskList.Any(v => v.TASK_ITEM8 == item.agvId))
                        {
                            taskList.AddRange(taskSet.Where(v => v.TASK_ITEM8 == item.agvId));
                        }
                    }
                }
                else
                {
                    //添加2巷道分组排序任务
                    foreach (var item in taskgroup_2)
                    {
                        if (!taskList.Any(v => v.TASK_ITEM8 == item.agvId))
                        {
                            taskList.AddRange(taskSet.Where(v => v.TASK_ITEM8 == item.agvId));
                        }
                    }
                    //添加1巷道分组排序任务
                    foreach (var item in taskgroup_1)
                    {
                        if (!taskList.Any(v => v.TASK_ITEM8 == item.agvId))
                        {
                            taskList.AddRange(taskSet.Where(v => v.TASK_ITEM8 == item.agvId));
                        }
                    }
                }
            }
            else
            {
                taskList = taskSet;
            }
            foreach (var task in taskList)
            {
                if (task.TASK_POSIDTO == Conv_1508)
                {
                    if (!SugarBase.DB.Queryable().Any(v => v.TASK_POSIDTO == Conv_1508 && (v.TASK_WKSTATUS == 2 || v.TASK_WKSTATUS == 7 || v.TASK_WKSTATUS == 9)))
                    {
                        taskitem = task;
                        break;
                    }
                }
                else if (task.TASK_POSIDTO == Conv_1509)
                {
                    if (!SugarBase.DB.Queryable().Any(v => v.TASK_POSIDTO == Conv_1509 && (v.TASK_WKSTATUS == 2 || v.TASK_WKSTATUS == 7 || v.TASK_WKSTATUS == 9)))
                    {
                        taskitem = task;
                        break;
                    }
                }
                if (CoatingWorkshopList.Contains(task.TASK_POSIDTO) && (PlcName == "srm05" || PlcName == "srm04"))
                {
                    //string taryType = string.IsNullOrWhiteSpace(task.TASK_ITEM2) ? string.Empty : task.TASK_ITEM2.Trim();
                    //string isEmpty = string.IsNullOrWhiteSpace(task.TASK_ITEM3) ? string.Empty : task.TASK_ITEM3.Trim();
                    if (task.TASK_POSIDTO == "1072")
                    {
                        //检查缓存数量
                        var count = SugarBase.DB.Queryable().Where(v => v.TASK_WKSTATUS > 1 && v.TASK_POSIDTO == "1072").Count();
                        if (count < 3)
                        {
                            taskitem = task;
                            break;
                        }
                    }
                    else
                    {
                        //检查缓存数量
                        var count = SugarBase.DB.Queryable().Where(v => v.TASK_WKSTATUS == 2 && (v.TASK_POSIDNEXT == "1085")).Count();
                        if (count < 10)
                        {
                            taskitem = task;
                            break;
                        }
                    }
                }
                else if (SendGoodsConvList.Contains(task.TASK_POSIDTO))
                {
                    int taskcount = QueryOutConvTaskCount(task.TASK_POSIDTO);
                    if (taskcount < 2)
                    {
                        taskitem = task;
                        break;
                    }
                }
                else if (OriginalFilmRollOutList.Contains(task.TASK_POSIDTO) && PlcName == "srm01")
                {
                    if (SugarBase.DB.Queryable().Any(v => v.TASK_POSIDNEXT == "1035" || v.TASK_POSIDNEXT == "1036"))
                    {
                        break;
                    }
                    var originalTrayTasks = SugarBase.DB.Queryable().Where(v => v.TASK_WKSTATUS == 2 && v.TASK_POSIDNEXT == "1072").ToList();
                    //检查是否已组盘一个卷,未组盘第二卷
                    var originalTrayTask = originalTrayTasks.FirstOrDefault(v => string.IsNullOrWhiteSpace(v.TASK_ITEM6));
                    if (originalTrayTask != null)//已组盘第一个
                    {
                        if (task.TASK_ITEM1.Trim() == originalTrayTask.TASK_ITEM1.Trim())
                        {
                            taskitem = task;
                            break;
                        }
                        if (SugarBase.DB.Queryable().Any(v => v.TASK_WKSTATUS == 2 && (v.TASK_POSIDNEXT == "1036" || v.TASK_POSIDNEXT == "1035" || v.TASK_POSIDNEXT == "1070") && v.TASK_ITEM1 == originalTrayTask.TASK_ITEM1))
                        {
                            if (CheckOutTask(task))
                            {
                                taskitem = task;
                                break;
                            }
                        }
                        //if (task.TASK_ITEM1.Trim() == originalTrayTask.TASK_ITEM1.Trim() ||
                        //    SugarBase.DB.Queryable().Any(v => v.TASK_WKSTATUS == 2 && (v.TASK_POSIDNEXT == "1036" || v.TASK_POSIDNEXT == "1035" || v.TASK_POSIDNEXT == "1070") && v.TASK_ITEM1 == originalTrayTask.TASK_ITEM1))
                        //{
                        //    taskitem = task;
                        //    break;
                        //}
                    }
                    else
                    {
                        //查询已出库的原膜卷任务
                        var originalTask = SugarBase.DB.Queryable().Single(v => v.TASK_POSIDNEXT == "1036" || v.TASK_POSIDNEXT == "1035" || v.TASK_POSIDNEXT == "1070");
                        if (originalTask == null)//二楼没有出库待组盘的原膜卷
                        {
                            if (CheckOutTask(task))
                            {
                                taskitem = task;
                                break;
                            }
                        }
                        else if (originalTask.TASK_ITEM1.Trim() == task.TASK_ITEM1.Trim())
                        {
                            //二楼已经出库一个待组盘的原膜卷
                            taskitem = task;
                            break;
                        }
                        else if (SugarBase.DB.Queryable().Count(v => v.TASK_WKSTATUS <= 1 && v.TASK_SRMNO == "srm01" && v.TASK_ITEM1 == originalTask.TASK_ITEM1) == 0)//二楼出库的原膜卷是单卷
                        {
                            if (CheckOutTask(task))
                            {
                                taskitem = task;
                                break;
                            }
                        }
                        ////查询已出库的原膜卷任务
                        //var originalTask = SugarBase.DB.Queryable().Single(v => v.TASK_POSIDNEXT == "1036" || v.TASK_POSIDNEXT == "1035" || v.TASK_POSIDNEXT == "1070");
                        //if (originalTask == null || //二楼没有出库待组盘的原膜卷
                        //   originalTask.TASK_ITEM1.Trim() == task.TASK_ITEM1.Trim() || //二楼已经出库一个待组盘的原膜卷
                        //   SugarBase.DB.Queryable().Count(v => v.TASK_WKSTATUS <= 1 && v.TASK_SRMNO == "srm01" && v.TASK_ITEM1 == originalTask.TASK_ITEM1) == 0)//二楼出库的原膜卷是单卷
                        //{
                        //    taskitem = task;
                        //    break;
                        //}
                    }
                }
                else if (task.TASK_POSIDTO.Contains("Pvc_18"))
                {
                    int count = SugarBase.DB.Queryable().Count(v => v.TASK_WKSTATUS > 1 && v.TASK_POSIDTO.Contains("Pvc_18"));
                    if (count < 9)
                    {
                        taskitem = task;
                        break;
                    }
                }
                else
                {
                    taskitem = task;
                    break;
                }
            }
            return taskitem;
        }
        private int QueryOutConvTaskCount(string conv)
        {
            int taskcount = 0;
            var cv = ConveyorHelper.GetConveyorSignal("conveyor01", conv);
            if (cv.DB521_Tasknum > 0) taskcount++;
            int count = SugarBase.DB.Queryable().Count(v => v.TASK_POSIDTO == conv && v.TASK_POSIDCUR != conv && v.TASK_WKSTATUS > 1 && v.TASK_WKSTATUS < 99);
            taskcount = taskcount + count;
            return taskcount;
        }
        private bool CheckOutTask(WCS_TASK task)
        {
            string srm01 = "srm01";
            bool isOk = false;
            string tunnelNum = string.Empty;
            var inTask = SugarBase.DB.Queryable().First(v => v.TASK_SRMNO == srm01 && v.TASK_COMTYPE == 1 && v.TASK_WKSTATUS == 2);
            if (inTask == null)
            {
                if (EquSignal.DB521_ToRowPos == 1 || EquSignal.DB521_ToRowPos == 2)
                {
                    tunnelNum = "1";
                }
                else
                {
                    tunnelNum = "2";
                }
            }
            else
            {
                tunnelNum = inTask.TASK_EndTunnelNum;
            }
            if (tunnelNum == "1")
            {
                if (task.TASK_FromTunnelNum == "1")
                {
                    isOk = true;
                }
                else
                {
                    //没有1号巷道的未执行出库任务
                    if (!SugarBase.DB.Queryable().Any(v => v.TASK_SRMNO == srm01 &&
                                                                     v.TASK_COMTYPE == 2 &&
                                                                     v.TASK_WKSTATUS <= 1 &&
                                                                     v.TASK_FromTunnelNum == "1" &&
                                                                     v.TASK_POSIDTO == "1036"))
                    {
                        isOk = true;
                    }
                }
            }
            else
            {
                if (task.TASK_FromTunnelNum == "2")
                {
                    isOk = true;
                }
                else
                {
                    //没有2号巷道的未执行出库任务
                    if (!SugarBase.DB.Queryable().Any(v => v.TASK_SRMNO == srm01 &&
                                                                     v.TASK_COMTYPE == 2 &&
                                                                     v.TASK_WKSTATUS <= 1 &&
                                                                     v.TASK_FromTunnelNum == "2" &&
                                                                     v.TASK_POSIDTO == "1035"))
                    {
                        isOk = true;
                    }
                }
            }
            return isOk;
        }
    }
}