using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using WCS.Data;
using WCS.Data.Models;
using WCS.Data.Utils;
using WCS.PLC;
using WCS.PLC.Model.Equipment;
namespace WCS.Workflow
{
    public class WCSWorkflow
    {
        /// 
        /// 查询重复使用的数据
        /// 
        public static void RefreshData()
        {
            var result = TryCachHelper.TryExecute((db) =>
            {
                Current.TaskSet = db.Queryable().ToList().Where(v => Current.WareNameList.Contains(v.TASK_WHID)).ToList();
                Current.AgvTaskSet = db.Queryable().ToList().Where(v => Current.WareNameList.Contains(v.Task_Whid)).ToList();
                Current.AgvCachePostionSet = db.Queryable().ToList();
                Current.WCS_TASKTIMEPOINTSet = db.Queryable().ToList();
                Current.SysSets = db.Queryable().ToList();
                Current.WCS_SrmOutInInfoSet = db.Queryable().ToList().Where(v => Current.PlcSet.Any(t => t.PLC_NAME == v.SRMOUTIN_CONVPLCNAME)).ToList();
                Current.WCS_CacheInfoSet = SugarBase.DB.Queryable().ToList();
                Current.WCS_RGVOutInInfoSet = SugarBase.DB.Queryable().ToList().Where(v => Current.PlcSet.Any(t => t.PLC_NAME == v.PLCNAME)).ToList();
            });
        }
        /// 
        /// 查询最新1000条日志信息
        /// 
        public static void RefreshLogData()
        {
            TryCachHelper.TryExecute((db) =>
            {
                BaseCurrent.Wcs_LogSet = db.Queryable().OrderBy(v => v.LOG_ID, SqlSugar.OrderByType.Desc).ToPageList(0, 1000);
                //Current.SysSets = db.Queryable().ToList();
            });
        }
        private static int _UpdateTaskCurAddress = 0;
        public static void UpdateTaskCurAddress()
        {
            if (Interlocked.Exchange(ref _UpdateTaskCurAddress, 1) == 0)
            {
                TryCachHelper.TryExecute((db) =>
                {
                    foreach (var plc in Current.PlcSet)
                    {
                        if (plc.PLC_ISENABLE == false) continue;
                        foreach (var equipment in plc.WCS_EquipmentInfoSet)
                        {
                            if (equipment.Equ_Type == EquipmentType.conveyor.ToString())
                            {
                                var cs = equipment.EquSignal_Conv;
                                if (cs != null && cs.DB521_Tasknum > 0)
                                {
                                    var task = db.Queryable().First(v => v.TASK_NO == cs.DB521_Tasknum);
                                    if (task != null && task.TASK_POSIDCUR != equipment.Equ_No && task.TASK_WKSTATUS != 13)
                                    {
                                        db.Updateable(it => new WCS_TASK() { TASK_POSIDCUR = equipment.Equ_No, TASK_EDITDATETIME = DateTime.Now })
                                        .Where(it => it.TASK_NO == task.TASK_NO)
                                        .ExecuteCommand();
                                    }
                                }
                            }
                            else if (equipment.Equ_Type == EquipmentType.rgv.ToString())
                            {
                                var rs = equipment.EquSignal_Rgv;
                                if (rs == null) continue;
                                if (rs.DB521_TaskID_1 > 0 && rs.DB521_PH_Status_1)
                                {
                                    var rgvoutininfoSet = Current.WCS_RGVOutInInfoSet.Where(v => v.RGVOUTIN_RGVNO == equipment.Equ_No).ToList();
                                    bool isExitConvTask = false;
                                    foreach (var item in rgvoutininfoSet)
                                    {
                                        var conv = ConveyorHelper.GetConveyorSignal(item.PLCNAME, item.RGVOUTIN_CONVNO);
                                        if (conv.DB521_Tasknum == rs.DB521_TaskID_1)
                                        {
                                            isExitConvTask = true;
                                            break;
                                        }
                                    }
                                    if (isExitConvTask == false)
                                    {
                                        var task = db.Queryable().First(v => v.TASK_NO == rs.DB521_TaskID_1);
                                        if (task != null && task.TASK_POSIDCUR != equipment.Equ_No && (task.TASK_WKSTATUS == 7 || task.TASK_WKSTATUS == 3 || task.TASK_WKSTATUS == 4))
                                        {
                                            db.Updateable(it => new WCS_TASK() { TASK_POSIDCUR = equipment.Equ_No, TASK_EDITDATETIME = DateTime.Now })
                                              .Where(it => it.TASK_NO == task.TASK_NO)
                                              .ExecuteCommand();
                                        }
                                    }
                                }
                                if (rs.DB521_TaskID_2 > 0 && rs.DB521_PH_Status_2)
                                {
                                    var rgvoutininfoSet = Current.WCS_RGVOutInInfoSet.Where(v => v.RGVOUTIN_RGVNO == equipment.Equ_No).ToList();
                                    bool isExitConvTask = false;
                                    foreach (var item in rgvoutininfoSet)
                                    {
                                        var conv = ConveyorHelper.GetConveyorSignal(item.PLCNAME, item.RGVOUTIN_CONVNO);
                                        if (conv.DB521_Tasknum == rs.DB521_TaskID_2)
                                        {
                                            isExitConvTask = true;
                                            break;
                                        }
                                    }
                                    if (isExitConvTask == false)
                                    {
                                        var task = db.Queryable().First(v => v.TASK_NO == rs.DB521_TaskID_2);
                                        if (task != null && task.TASK_POSIDCUR != equipment.Equ_No && (task.TASK_WKSTATUS == 7 || task.TASK_WKSTATUS == 3 || task.TASK_WKSTATUS == 4))
                                        {
                                            db.Updateable(it => new WCS_TASK() { TASK_POSIDCUR = equipment.Equ_No, TASK_EDITDATETIME = DateTime.Now })
                                              .Where(it => it.TASK_NO == task.TASK_NO)
                                              .ExecuteCommand();
                                        }
                                    }
                                }
                            }
                        }
                    }
                });
                Interlocked.Exchange(ref _UpdateTaskCurAddress, 0);
            }
        }
        private static int _updateExceptionTask = 0;
        public static void UpdateExceptionTask()
        {
            if (Interlocked.Exchange(ref _updateExceptionTask, 1) == 0)
            {
                try
                {
                    int milliseconds = 1000 * 60 * 10;//延时10分钟
                    Thread.Sleep(milliseconds);
                    var task = SugarBase.DB.Queryable().First(v => v.TASK_COMTYPE == 6 && v.TASK_WKSTATUS > 1 && v.TASK_WKSTATUS < 99);
                    var dt = SugarBase.DB.GetDate();
                    if (task != null && task.TASK_EDITDATETIME.AddHours(8) < dt)//8小时未完成,自动完成
                    {
                        SugarBase.DB.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITDATETIME = dt })
                                 .Where(it => it.TASK_NO == task.TASK_NO)
                                 .ExecuteCommand();
                    }
                }
                catch (Exception ex)
                {
                    LogMessageHelper.RecordLogMessage(ex);
                }
                finally
                {
                    Interlocked.Exchange(ref _updateExceptionTask, 0);
                }
            }
        }
        #region AGV相关
        #endregion;
    }
}