using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Threading;
using Microsoft.VisualBasic;
using DBFactory;
using ICommLayer;

namespace AGVDataTable
{
    /// <summary>
    /// 20200430中间表接口
    /// 发送设备命令类
    /// 
    /// </summary>
    public class CSendDeviceOrder: ISendDeviceOrder
    {
        string _commLayerError;

        public string CommLayerError
        {
            get { return _commLayerError; }
            set { _commLayerError = value; }
        }
        DBOperator dbo = CommonClassLib.AppSettings.dbo;//20130510
        public CSendDeviceOrder()
        {
            dbo.Open();
        }
        //~CSendDeviceOrder()
        //{
        //    dbo.Close();
        //}
        /// <summary>
        /// 发送AGV车命令
        /// </summary>
        /// <param name="MessageIndex">消息编号</param>
        /// <param name="TaskIndex">任务编号</param>
        /// <param name="Order">AGV命令字</param>
        ///1-取送货
        ///2.3... 待扩展
        /// <param name="DeviceIndex">设备编号</param>
        /// <param name="StartX">AGV取货站台(或区域)</param>
        /// <param name="StartY">0</param>
        /// <param name="StartZ">0</param>
        /// <param name="EndX">AGV送货站台(或区域)</param>
        /// <param name="EndY"></param>
        /// <param name="EndZ">0</param>
        /// <returns>发送命令是否成功</returns>
        public bool SendDeviceOrder(int MessageIndex, int TaskIndex, int Order, int DeviceIndex, int StartX, int StartY, int StartZ, int EndX, int EndY, int EndZ)
        {
            //return true;
            StringBuilder sql = new StringBuilder();
            StringBuilder sss = new StringBuilder();
            DataView dv = new DataView();
            sql.Remove(0, sql.Length);
            sql.Append("SELECT * FROM T_Monitor_Task WHERE F_MonitorIndex = ").Append(TaskIndex).Append(" AND F_Status = 0");
            dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
            if (dv.Count == 0)
            {
                _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:不存在"+ TaskIndex +" 对应的空闲指令!";
                return false;
            }
            try
            {
                int fid = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(TaskIndex);
                sql.Remove(0, sql.Length);
                sql.Append("SELECT * FROM AGV_TASK WHERE FID = ").Append(fid).Append(" AND AGV_TASK_ID = ")
                    .Append(TaskIndex);
                if (dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView.Count > 0)
                {
                    _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:中间表已存在该指令:"+ TaskIndex;
                    return false;
                }
                StringBuilder dtime = new StringBuilder(DateTime.Now.ToString("u"));
                dtime.Remove(dtime.Length - 1, 1);
                int TaskLevel = Convert.ToInt32(dv[0]["F_MonitorTaskLevel"]);
                
                string PalletBarcode = dv[0]["F_TxtParam"].ToString();
               
                sql.Clear();
                sql.Append("select * from T_Manage_Task where FID = ").Append(fid);
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count == 0)
	            {
		            _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:找不到对应的管理任务!";
                    return false;

	            }

                int TaskType = Convert.ToInt32(dv[0]["FCONTROLTASKTYPE"]);
               
                int COMPOSITE_TAG = 0;
               
                string START_DEVICE_CODE2 = "";
                string END_DEVICE_CODE2 = "";
               

              

                string command = string.Format(
                    "INSERT INTO AGV_TASK(AGV_TASK_ID, AGV_TASK_TYPE, AGV_TASK_LEVEL, PALLET_BARCODE, START_DEVICE_CODE, FINISH_DEVICE_CODE, COMPOSITE_TAG, AGV_TASK_BEGINTIME,FID,START_DEVICE_CODE2,FINISH_DEVICE_CODE2)" +
                                        " VALUES({0}, {1}, {2}, '{3}', '{4}', '{5}', '{6}', '{7}',{8}, '{9}', '{10}')",
                    TaskIndex, TaskType, TaskLevel, PalletBarcode, StartX, EndX, COMPOSITE_TAG, dtime.ToString(), fid, START_DEVICE_CODE2, END_DEVICE_CODE2);
                dbo.ExecuteSql(command);
                sss.Remove(0, sss.Length);
                sss.Append("条码:").Append(PalletBarcode).Append("**写标志1").Append("**任务号" + TaskIndex.ToString())
                    .Append("**起始站台" + StartX.ToString()).Append("**终止站台" + EndX.ToString()).Append("**托盘条码" + PalletBarcode);

              

                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送AGV命令","", sss.ToString());
                return true;
            }
            catch (Exception ex)
            {
                _commLayerError = "OPCClient.CSendDeviceOrder.SendDeviceOrder发生错误:" + ex.Message;
                return false;
            }

        }
        /// <summary>
        /// 发送堆垛机以外的其它设备命令
        /// </summary>
        /// <param name="MessageIndex">消息编号</param>
        /// <param name="TaskIndex">任务编号</param>
        /// <param name="Order">命令字</param>
        /// 穿梭车命令字: 
        ///1-复位 
        ///2-左接货
        ///3-左送货
        ///4-右接货
        ///5-右送货
        ///6-停止
        ///7-运动到1#位置
        ///8-运动到2#位置
        ///     …
        ///输送机、台车命令字:
        ///1-入库(朝向库)
        ///        2-出库(背向库)
        ///        3-送货
        ///        4-停止
        /// <param name="DeviceIndex">设备编号</param>
        /// <returns>发送其它设备命令是否成功</returns>
        public bool SendDeviceOrder(int MessageIndex, int TaskIndex, int Order, int DeviceIndex, int ArrowDeviceIndex)
        {
            return true;
        }
        public bool SendDeviceOrder(int MessageIndex, int TaskIndex, int Order, int DeviceIndex, int StartX, int StartY, int StartZ, int EndX, int EndY, int EndZ, string DoubleFork)
        {
            return true;

        }
        public bool SendDeviceOrder(int DeviceIndex, string TobaccoCode, bool HaveFirstProjectCode, bool IfSmallTobacco, int Count)
        {
            return true;
        }
        public bool WriteDBData(StringBuilder[] ItemNames, StringBuilder[] ItemValues)
        {
            return true;
        }
        public bool WriteDBData(StringBuilder[] ItemNames, StringBuilder[] ItemValues, string PLCconnectionID)
        {
            return true;
        }

        /// <summary>
        /// LHDF
        /// </summary>
        /// <param name="deviceindex"></param>
        /// <param name="type"></param>
        private void GetAGVGatePalletType(int deviceindex, out int type)
        {

            StringBuilder sql = new StringBuilder();
            sql.Clear();
            sql.Append(string.Format("SELECT  F_TYPE FROM T_Base_AGV_Gate where F_AGVGateDeviceIndex={0}", deviceindex));
            DataView dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
            if (dv.Count > 0)
            {
                type = Convert.ToInt32(dv[0][0].ToString());
            }
            else
            {
                type = 0;

            }

        }
        int GetGoodsHigh(int taskindex)
        {
            DataView dv = dbo.ExceSQL(string.Format("SELECT CELL_MODEL FROM T_Manage_Task WHERE (F_ManageTaskKindIndex = {0}) AND (FID = {1})", Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(taskindex), Model.CGeneralFunction.GetManageTaskIndexfromMonitor(taskindex))).Tables[0].DefaultView;
            if (dv.Count > 0)
            {
                #region
                //int gh = 1;
                ////P工装板,B标准,G高货位,D大货位
                //switch (dv[0][0].ToString().ToUpper())
                //{
                //    case "P":
                //        gh = 3;
                //        break;
                //    case "B":
                //        gh = 2;
                //        break;
                //    case "G":
                //        gh = 1;
                //        break;
                //    //case "D":
                //    //    gh = 4;
                //    //    break;
                //    default:
                //        gh = 1;
                //        break;
                //}
                #endregion

                int gh = 0;
                //1小2大
                switch (dv[0][0].ToString().ToUpper())
                {
                    case "1":
                        gh = 1;
                        break;
                    case "2":
                        gh = 2;
                        break;

                    default:
                        gh = 0;
                        break;
                }
                return gh;
            }
            else
            {
                return 0;
            }
        }
       
        /// <summary>
        /// 根据设备命令,PALLET_SIZE,STACK_TYPE\STACK_QTY
        /// </summary>
        /// <param name="TaskIndx"></param>
        /// <returns></returns>
        private int GetManageInfo(int TaskIndx, string Field)
        {
            DataView dv = new DataView();
            try
            {
                StringBuilder sql = new StringBuilder();
                sql.Clear();
                sql.Append(string.Format("select {0} from T_Manage_Task where FID in(select F_ManageTaskIndex from T_Monitor_Task where F_MonitorIndex = {1})", Field, TaskIndx));
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0 && dv[0][Field].ToString().Trim()!= "")//dv[0][Field]!= DBNull.Value,int.Parse(dv[0][Field].ToString().Trim())> 0
                {
                    return Convert.ToInt32(dv[0][Field]);
                }
                return -1;
            }
            catch (Exception ex)
            {

                throw ex;
            }
            finally
            {
                dv.Dispose();
            }

        }
    }
}