using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using DBFactory;
using CommLayerFactory;
using ICommLayer;
using CommonLib;
using System.Text.RegularExpressions;
namespace WcfControlMonitorLib
{
    /// <summary>
    /// Creator:Richard.liu
    /// 通用函数类库
    /// </summary>
    public class CCommonFunction
    {
        //object lockob = new object();
        string _DisassembleTaskError;
        public string DisassembleTaskError
        {
            get { return _DisassembleTaskError; }
            set { _DisassembleTaskError = value; }
        }
        DBOperator dboM = CStaticClass.dboM;
        DBOperator dbo = CStaticClass.dbo;
        static CGetState cgs = new CGetState();//20161231
        Model.MDevice devinfo;
        StringBuilder sql = new StringBuilder();
        public static event CDataSourceChangeEventHandler DataChange;
        public static void OnDataChange(object sender,CDataChangeEventArgs e)
        {
            if (DataChange != null)
            {
                DataChange(sender, e);
            }
        }
        public static event RefreshMonitorEventHandler RefreshMonitor;
        public static void OnRefreshMonitor(object sender, RefreshMonitorEventArgs e)
        {
            if (RefreshMonitor != null)
            {
                RefreshMonitor(e);
            }
        }
        public CCommonFunction()
        {

        }
        #region 拆分设备指令
       
        /// <summary>
        /// 获得绑定在主设备的探物光电设备索引
        /// </summary>
        /// <param name="devinx">主设备索引</param>
        /// <returns></returns>
        public string GetBindingDeviceIndex(int devinx)
        {
            //20101118
            devinfo = Model.CGetInfo.GetDeviceInfo(devinx);
            if (devinfo.BindingDevice == null) return "";
            return devinfo.BindingDevice;
        }
        /// <summary>
        /// 获得输送机设备的出库口探物光电的设备索引值
        /// </summary>
        /// <param name="devinx">设备索引</param>
        /// <returns></returns>
        public string  GetBindingDeviceIndexOut(int devinx)
        {
            //20101118
            devinfo = Model.CGetInfo.GetDeviceInfo(devinx);
            if (devinfo.BindingDeviceOut == null) return "";
            return devinfo.BindingDeviceOut;
        }
        /// <summary>
        /// 发送设备的送出指令时,需要检测的光电开关设备索引
        /// </summary>
        /// <param name="devinx">输送设备索引</param>
        /// <returns></returns>
        public  string  GetSendOutDetect(int devinx)
        {
            //20101118
            devinfo = Model.CGetInfo.GetDeviceInfo(devinx);
            if (devinfo.SendOutDetect==null) return "";
            return devinfo.SendOutDetect;

        }
        public string GetBeDetectedDevices(int devinx)
        {
            devinfo= Model.CGetInfo.GetDeviceInfo(devinx);
            return devinfo.BeDetected;
            //string sql = "SELECT F_BeDetected FROM T_Base_Device WHERE (F_DeviceIndex = " + devinx + ") and F_BeDetected is not null";
            //DataView db = dbo.ExceSQL(sql).Tables[0].DefaultView;
            //if (db.Count > 0)
            //{
            //    return db[0]["F_BeDetected"].ToString();
            //}
            //else
            //    return "";
        }
        /// <summary>
        /// //获得指定调度任务的设备指令索引
        /// </summary>
        /// <param name="managerTaskIndex"></param>
        /// <param name="managerTaskKindIndex"></param>
        /// <returns>设备指令索引值1--10000</returns>
        public int GetMonitorIndex(int managerTaskIndex, int managerTaskKindIndex)
        {//20110104

            DataView dvMt = new DataView();
            try
            {
                int maxIdx = 0;
                sql.Remove(0, sql.Length);
                sql.Append("SELECT F_MonitorIndex FROM T_Base_Monitor_Task_Index");
                //20100108
                dvMt = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;

                if (dvMt.Count > 0 && dvMt[0]["F_MonitorIndex"] != DBNull.Value)
                {

                    maxIdx = (Convert.ToInt32(dvMt[0]["F_MonitorIndex"]) + 1);

                    if (maxIdx >= 29999)//预留999个给接近上限的拆分任务(29000)//20120328
                    {
                        maxIdx = 1;

                    }

                }
                else//现在没有该管理的设备指令记录
                {
                    maxIdx = 1;
                }

                //判断调度任务表是否有重复值
                if (IFExitMonitorIndex(maxIdx) == true)
                {
                    UpdateMonitorIndex(maxIdx);
                    maxIdx = GetMonitorIndex(managerTaskIndex, managerTaskKindIndex);

                }

                UpdateMonitorIndex(maxIdx);
                return maxIdx;
            }
            catch (Exception ex)
            {
                _DisassembleTaskError = "获得指定调度任务的设备指令索引失败!" + ex.Message;
                throw ex;
                //return 0;
            }
            finally
            {//20100108
                dvMt.Dispose();
            }

        }
        public void UpdateMonitorIndex(int MonitorIndex)
        {
            //20101124
            sql.Remove(0, sql.Length);
            sql.Append("update T_Base_Monitor_Task_Index set F_MonitorIndex=").Append( MonitorIndex);
            dbo.ExceSQL(sql.ToString());
        }
       
        

        public string GetStackCoordinateFromLaneGate(int device)
        {
            DataView dv =new DataView();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT F_ZXY FROM T_Base_Lane_Gate WHERE (F_LaneGateDeviceIndex = ").Append(device).Append(")");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return dv[0][0].ToString();
                }
                else
                {
                    return "-";
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        /// <summary>
        /// 20110510判断设备是否是路径起始设备
        /// </summary>
        /// <param name="deviceidx"></param>
        /// <returns></returns>
        public bool IfRouteStartDevice(int deviceidx)
        {
            object ob = dbo.GetSingle(string.Format("SELECT F_RouteID FROM T_Base_Route WHERE (F_StartDevice = {0})",deviceidx));
            if (ob != null)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// 使用正则表达式验证字符串
        /// </summary>
        /// <param name="strCode">待验证字符串</param>
        /// <returns>合法返回true,否则返回false</returns>
        public  bool GetCodeCheck(string strCode)
        {
            Match mCode = Regex.Match(strCode, CStaticClass.StockCodeCheck);
            if (mCode.Success)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        

       
        
       
        
        
        /// <summary>
        /// 获得搬运路径类型
        /// </summary>
        /// <param name="FCONTROLTASKTYPE">调度任务下发的搬运任务类型</param>
        /// <returns></returns>
        public string GetIOType(string FCONTROLTASKTYPE)
        {
            //20100108
            DataSet ds = new DataSet(); 
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT FCODE, FINTERCODE FROM T_ITEMTASKTYPE where FCODE='" ).Append( FCONTROLTASKTYPE ).Append( "'");
                ds = dbo.ExceSQL(sql.ToString());
                if (ds.Tables[0].DefaultView.Count > 0)
                {
                    return ds.Tables[0].DefaultView[0]["FINTERCODE"].ToString();
                }
                else
                    return "";
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                ds.Dispose();
            }
        }
        
        /// <summary>
        /// 查看用户指定的任务优先级原则:0,按照调度任务优先级;1,入库优先,携带符合执行条件的出库任务;
        /// 2,出库优先,携带符合执行条件的入库任务;3,单纯入库优先,执行完所有入库任务后再执行出库任务;
        /// 4,单纯出库优先,执行完所有出库任务后再执行入库任务。
        /// </summary>
        /// <returns>优先级索引值0--4</returns>
        public int SelectTaskPriPrecept()
        {
            //20100108
            DataView dv = new DataView();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT F_PRINo , F_PRIName , F_IfChecked FROM T_Base_PRI WHERE (F_IfChecked = '1')");
                
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["F_PRINo"]);
                }
                else
                {
                    return 0;//默认值0:按照调度任务优先级
                }
            }
            catch (Exception ex)
            {//20100108
                throw ex;
            }
            finally
            {//20100108

                dv.Dispose();

            }
        }

        public int GetLaneWayFromLaneInfo(int stackIndex)
        {
            DataView dv = new DataView();
            try
            {

                //20101124
                sql.Remove(0, sql.Length);
                devinfo = Model.CGetInfo.GetDeviceInfo(stackIndex);
                if (devinfo.VirtualStack > 0) stackIndex = devinfo.VirtualStack;
                
                sql.Append("SELECT F_LaneDeviceIndex FROM T_Base_LaneInfo WHERE (F_StackIndex = ").Append(stackIndex).Append(")");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0][0]);
                }
                else
                {
                    return -1;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }

       
        
        
        /// <summary>
        /// 判断调度任务号在队列中是否存在,true已经存在;false不存在
        /// </summary>
        /// <param name="Monitorindex"></param>
        /// <returns></returns>
        public bool IFExitMonitorIndex(int Monitorindex)
        {
            //20100108
            DataView dv = new DataView();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_MonitorIndex = " ).Append( Monitorindex ).Append( ")");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception ex)
            {//20100108
                throw ex;
            }
            finally
            {//20100108
                dv.Dispose();
            }
        }
        public bool IFExitTempManageIndex(int fid)
        {
            //20100108
            DataView dv = new DataView();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT fid FROM T_Manage_Task WHERE (F_ManageTaskKindIndex=2 and fid = " ).Append( fid ).Append( ")");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
            if (dv.Count > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        catch (Exception ex)
        {//20100108
            throw ex;
        }
        finally
        {//20100108
            dv.Dispose();
        }
        }
       
       
       
        
        #endregion
        #region 控制设备(发送命令)

        /// <summary>
        /// 根据前面得到的F_MonitorIndex值获得被锁定的设备索引
        /// </summary>
        /// <returns>以“;”隔开的设备索引组字符串</returns>
        public string GetLockedDeviceIndex(int MonitorIndex)
        {
            //20100108
            DataSet ds = new DataSet();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("select F_RunningLock from T_Monitor_Task where F_MonitorIndex=" ).Append( MonitorIndex);
                
                ds = dbo.ExceSQL(sql.ToString());
                if (ds.Tables[0].DefaultView.Count > 0)
                {
                    return ds.Tables[0].DefaultView[0]["F_RunningLock"].ToString();
                }
                else
                    return "";
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {//20100108
                ds.Dispose();
            }
        }

        /// <summary>
        /// 根据前面得到的MonitorIndex值取得"关联设备索引-命令"
        /// </summary>
        /// <returns>关联设备索引-命令,null表示没有</returns>
        public string GetAssociateDevice(int MonitorIndex)
        {
            //20100108
            DataView dv = new DataView();
            DataView dvv = new DataView();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("select F_Associate from T_Monitor_Task where (F_Associate IS NOT NULL) and F_MonitorIndex=" ).Append( MonitorIndex);
                
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    //20101124
                    sql.Remove(0, sql.Length);
                    sql.Append("select F_DeviceIndex,F_DeviceCommandIndex from T_Monitor_Task where F_MonitorIndex=").Append( dv[0]["F_Associate"]);
                    
                    dvv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                    if (dvv.Count > 0)
                    {
                        return dvv[0]["F_DeviceIndex"].ToString() + "-" + dvv[0]["F_DeviceCommandIndex"].ToString();
                    }
                    else
                    {
                        return null;
                    }
                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
                dvv.Dispose();
            }
        }
        /// <summary>
        /// 根据前面得到的MonitorIndex值取得"关联调度任务"
        /// </summary>
        /// <returns>关联调度任务索引,0表示没有</returns>
        public int GetAssociateMonitor(int MonitorIndex)
        {
            //20100108
            DataView dv = new DataView();
            DataView dvv = new DataView();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("select F_Associate from T_Monitor_Task where (F_Associate IS NOT NULL) and F_MonitorIndex=" ).Append( MonitorIndex);
                
                //20100108
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    //20101124
                    sql.Remove(0, sql.Length);
                    sql.Append("select F_MonitorIndex from T_Monitor_Task where F_MonitorIndex=" ).Append( dv[0]["F_Associate"]);

                    
                    //20100108
                    dvv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                    if (dvv.Count > 0)
                    {
                        return Convert.ToInt32(dvv[0]["F_MonitorIndex"].ToString());
                    }
                    else
                    {
                        return 0;
                    }
                }
                else
                {
                    return 0;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                //20100108
                dv.Dispose();
                dvv.Dispose();
            }
        }

        /// <summary>
        /// 根据前面得到的关联调度任务值取得"调度任务索引"
        /// </summary>
        /// <returns>调度任务索引,0表示没有</returns>
        public int GetMonitorFromAssociate(int AssociateMonitor)
        {
            //20100108
            DataView dv = new DataView();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("select F_MonitorIndex from T_Monitor_Task where  F_Associate=" ).Append( AssociateMonitor);
               
                //20100108
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["F_MonitorIndex"]);

                }
                else
                {
                    return 0;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
       
       
        /// <summary>
        /// 在设备指令信息中获得堆垛机的
        /// 取货点Z坐标(站在堆垛机上,面向操作面板:左侧-1,右侧-2)
        /// 取货点X坐标(沿轨道方向)
        /// 取货点Y坐标(沿高度方向)
        /// 送货点Z坐标(站在堆垛机上,面向操作面板:左侧-1,右侧-2)
        /// 送货点X坐标(沿轨道方向)
        /// 送货点Y坐标(沿高度方向)
        /// </summary>
        /// <param name="TaskIdx">设备指令索引</param>
        /// <returns>0--5六个数组分别依次代表6个坐标</returns>
        public int[] GetCoordinatesFromMonitorTask(int TaskIdx)
        {
            //20100108
            DataView dv = new DataView();
            int[] gc;
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("select F_NumParam1,F_NumParam2,F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6 from T_Monitor_Task where F_MonitorIndex=" ).Append( TaskIdx);
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                gc = new int[6];

                
                //F_NumParam1--z,x--2,y--3;F_NumParam4--z,5--x,6--y
                if (dv.Count > 0)
                {
                    gc[0] = Convert.ToInt32(dv[0]["F_NumParam1"]);
                    gc[1] = Convert.ToInt32(dv[0]["F_NumParam2"]);
                    gc[2] = Convert.ToInt32(dv[0]["F_NumParam3"]);
                    gc[3] = Convert.ToInt32(dv[0]["F_NumParam4"]);
                    gc[4] = Convert.ToInt32(dv[0]["F_NumParam5"]);
                    gc[5] = Convert.ToInt32(dv[0]["F_NumParam6"]);
                    return gc;
                }
                return null;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
                gc = null;
            }
        }
        /// <summary>
        /// [0]互斥堆垛机的安全距离,[1]互斥堆垛机的最小安全距离,[2]堆垛机可停靠的最小坐标值
        /// </summary>
        /// <param name="VirtualStackIndex">虚拟堆垛机编号</param>
        /// <returns></returns>
        public int[] GetMutexSafeDistanceFromStackInfo(int VirtualStackIndex)
        {
            //20100108
            DataView dv = new DataView();
            int[] gc;
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("select F_MutexZeroX,F_MutexSafeDistance,F_MutexMiniSafeDistance from T_Base_StackInfo where F_StackIndex=").Append(VirtualStackIndex);
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                gc = new int[3];   
                if (dv.Count > 0)
                {
                    gc[0] = Convert.ToInt32(dv[0]["F_MutexSafeDistance"]);
                    gc[1] = Convert.ToInt32(dv[0]["F_MutexMiniSafeDistance"]);
                    gc[2] = Convert.ToInt32(dv[0]["F_MutexZeroX"]);
                    
                    return gc;
                }
                return null;
            }
            catch (Exception ex)
            {
                return null;
                //throw ex;
            }
            finally
            {
                dv.Dispose();
                gc = null;
            }
        }
        /// <summary>
        /// 获得设备类型索引
        /// </summary>
        /// <param name="devIdx">设备索引</param>
        /// <returns>设备类型索引</returns>
        public int GetDeviceKindIdx(int devIdx)
        {
            try
            {
                devinfo = Model.CGetInfo.GetDeviceInfo(devIdx);
                if (devinfo == null) return -1;
                return devinfo.DeviceKind;
                //string strSql = "SELECT F_DeviceIndex, F_DeviceKindIndex FROM T_Base_Device WHERE F_DeviceIndex=" + devIdx;
                //DataSet ds = dbo.ExceSQL(strSql);
                //DataView dv = ds.Tables[0].DefaultView;
                //if (dv.Count > 0)
                //{
                //    return Convert.ToInt32(dv[0]["F_DeviceKindIndex"]);
                //}
                //else
                //    return 0;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        
        /// <summary>
        /// 在调度队列中找到设备命令
        /// </summary>
        /// <param name="MonitorIndex">调度所引</param>
        /// <returns></returns>
        public int GetDeviceOrderFromMonitor(int MonitorIndex)
        {
            //20100108
            DataView dv = new DataView();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("select F_DeviceCommandIndex from T_Monitor_Task where (F_DeviceCommandIndex IS NOT NULL) and F_MonitorIndex=" ).Append( MonitorIndex);
                
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["F_DeviceCommandIndex"]);
                }
                else
                {
                    return -1;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }

        public int GetDeviceindexFromMonitor(int MonitorIndex)
        {
            //20100108
            DataView dv = new DataView();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("select F_DeviceIndex from T_Monitor_Task where (F_DeviceIndex IS NOT NULL) and F_MonitorIndex=").Append(MonitorIndex);

                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["F_DeviceIndex"]);
                }
                else
                {
                    return -1;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        public int GetDeviceArrowFromMonitor(int MonitorIndex)
        {
            //20100108
            DataView dv = new DataView();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("select F_NumParam4 from T_Monitor_Task where (F_NumParam4 IS NOT NULL) and F_MonitorIndex=").Append(MonitorIndex);

                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["F_NumParam4"]);
                }
                else
                {
                    return -1;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        public int GetDeviceStartFromMonitor(int MonitorIndex)
        {
            //20100108
            DataView dv = new DataView();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("select F_NumParam1 from T_Monitor_Task where (F_NumParam1 IS NOT NULL) and F_MonitorIndex=").Append(MonitorIndex);

                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["F_NumParam1"]);
                }
                else
                {
                    return -1;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        /// <summary>
        /// 成功发送命令后的处理信息
        /// </summary>
        /// <param name="taskKindIndex">调度任务类型</param>
        /// <param name="Managefid">调度任务索引</param>
        /// <param name="MonirotIdx">设备指令索引</param>
        /// <param name="deviceidx">设备索引</param>
        /// <param name="detailidx">详细路径步骤索引</param>
        public void SendOrderSuccess(int taskKindIndex, int Managefid, int MonirotIdx, int deviceidx, int detailidx,int ifsync)
        {
            string AssociateDevice = "";//关联设备
            string LockedDeviceIndex = "";//被锁定的设备索引组,以“;”分隔
            char[] sep = new char[1];
            string[] split;
            DataView dvs = new DataView();
            try
            {
                int devKind = GetDeviceKindIdx(deviceidx);
                int order = GetDeviceOrderFromMonitor(MonirotIdx);
                if (order <= 0) return;
                //string dtime = DateTime.Now.ToString("u");//DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")
                //dtime = dtime.Substring(0, dtime.Length - 1);
                string dtime= DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");//获取到毫秒的时间值20170923
                //8:更改作业记录的状态F_Status为1,更改设备为占用状态(T_Base_device的F_LockedState=设备指令单)
                //20101124
                sql.Remove(0, sql.Length);
                //sql.Append("update T_Monitor_Task set F_ErrorCode='',F_StartTime='").Append(dtime).Append("',F_Status=1,F_SendCount=F_SendCount+1 where F_Status=0 and F_MonitorIndex=").Append(MonirotIdx);
                sql.Append("update T_Monitor_Task set F_ErrorCode='',F_StartTime='").Append(dtime).Append("',F_IfSync=").Append(ifsync).Append(",F_Status=1,F_SendCount=F_SendCount+1 where F_Status=0 and F_MonitorIndex=").Append(MonirotIdx);
                dbo.ExceSQL(sql.ToString());
                //if (taskKindIndex != 4)//20100610
                {
                    //RGV、堆垛机需要锁定设备//20111226
                    if (devKind == 1 || devKind == 4)
                    {
                        //20101124
                        sql.Remove(0, sql.Length);
                        sql.Append("update T_Base_device set F_LockedState=").Append(MonirotIdx).Append(
                            " where   F_DeviceIndex=").Append(deviceidx);
                        dbo.ExceSQL(sql.ToString());
                    }
                    else
                    {
                        
                            //20101124
                            sql.Remove(0, sql.Length);
                            sql.Append("SELECT F_AgvNo FROM T_Monitor_Task WHERE (F_AgvNo IS NOT NULL) AND (F_MonitorIndex = " ).Append( MonirotIdx ).Append( ")");
                            dvs = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                            if ((dvs.Count > 0) && (devKind == 6))
                            {
                                //20101124
                                sql.Remove(0, sql.Length);
                                sql.Append("update T_Base_device set F_LockedState=" ).Append( MonirotIdx).Append(
                                   " where   F_DeviceIndex=" ).Append( dvs[0][0]);
                                dbo.ExceSQL(sql.ToString());
                            }
                            //add for CATL JC2  记录更新上次分配得站台  实现均分原则 每次任务发送成功更新  第一个站台发1 第二个站台发2  后续站台工位平均分配 CATL
                            #region CATL更新均分站台标识 
                            //DataView dvDISTributionS = dbo.ExceSQL("SELECT F_NUMPARAM4 FROM T_MONITOR_TASK where F_MONITORINDEX =" + MonirotIdx).Tables[0].DefaultView;
                            //if (dvDISTributionS.Count > 0)
                            //{
                            //    DataView dvupdateDis = dbo.ExceSQL("SELECT F_DISTRIBUTION,F_DOUBLESTATION1,F_DOUBLESTATION2 FROM T_BASE_FOLLOW_STATION where F_DOUBLESTATION1 =" + dvDISTributionS[0]["F_NUMPARAM4"].ToString() + " or F_DOUBLESTATION2 = " + dvDISTributionS[0]["F_NUMPARAM4"].ToString()).Tables[0].DefaultView;
                            //    if (dvupdateDis.Count > 0)
                            //    {
                            //        if (Convert.ToInt32(dvDISTributionS[0]["F_NUMPARAM4"]) == Convert.ToInt32(dvupdateDis[0]["F_DOUBLESTATION1"]))
                            //        {
                            //            sql.Remove(0, sql.Length);
                            //            sql.Append("update T_BASE_FOLLOW_STATION set F_DISTRIBUTION=1").Append(
                            //                " where   F_DOUBLESTATION1=").Append(Convert.ToInt32(dvDISTributionS[0]["F_NUMPARAM4"]));
                            //            dbo.ExceSQL(sql.ToString());
                            //        }
                            //        else
                            //        {
                            //            sql.Remove(0, sql.Length);
                            //            sql.Append("update T_BASE_FOLLOW_STATION set F_DISTRIBUTION=2").Append(
                            //                " where   F_DOUBLESTATION2=").Append(Convert.ToInt32(dvDISTributionS[0]["F_NUMPARAM4"]));
                            //            dbo.ExceSQL(sql.ToString());
                            //        }
                            //    }
                            //}
                            #endregion
                        
                    }
                    
                }
                if (devKind == 1)
                {
                    //修改T_Manage_Task的FLANEWAY,FSTACK
                    
                    //20101124
                    sql.Remove(0, sql.Length);
                    sql.Append("SELECT F_LaneDeviceIndex,F_StackIndex  FROM T_Base_LaneInfo where F_StackIndex=").Append( deviceidx);
                    dvs = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                    int laneway = 0;
                    if (dvs.Count > 0)
                    {
                        laneway = Convert.ToInt32(dvs[0]["F_LaneDeviceIndex"]);

                    }
                    //20101124
                    sql.Remove(0, sql.Length);
                    sql.Append("update T_Manage_Task set FLANEWAY=" ).Append( laneway).Append( ",FSTACK=" ).Append( deviceidx ).Append( " where F_ManageTaskKindIndex=" ).Append( taskKindIndex ).Append( " and FID=" ).Append( Managefid);
                    dbo.ExceSQL(sql.ToString());

                }
                if (taskKindIndex != 4)
                {
                    //如果是RGV、堆垛机的将取(运行)命令需要增加调度任务预约锁F_ManTaskReserve   && (order == 7))  && ((order == 2) || (order == 4))
                    if ((devKind == 4) || (devKind == 1))//20120110
                    {////RGV运到到输送机//堆垛机将取
                        sql.Remove(0, sql.Length);
                        sql.Append("UPDATE T_Base_Device SET F_ManTaskReserve = (" ).Append( taskKindIndex.ToString()).Append(Managefid.ToString() ).Append( ") WHERE (F_DeviceIndex = " ).Append( deviceidx ).Append( ")");
                        dbo.ExceSQL(sql.ToString());
                        SetStackSendConveyorManReserve(MonirotIdx, deviceidx);  
                    }
                }
                //9:给调度任务表回写调度任务IO_Control的正在执行状态FSTATUS=1;T_Manage_Task的正在执行状态FSTATUS=1
                sql.Remove(0, sql.Length);
                sql.Append("update T_Manage_Task set FSTATUS='1' where F_ManageTaskKindIndex=" ).Append( taskKindIndex ).Append( " and FID=" ).Append( Managefid);
                dbo.ExceSQL(sql.ToString());
                
                //10:调度任务表里的F_RunningLock所有对应设备索引加锁,但是F_AssociateDeviceIndex关联设备不加锁
                AssociateDevice = GetAssociateDevice(MonirotIdx);
                if (AssociateDevice == "") AssociateDevice = null;
                if (AssociateDevice != null)
                {
                    sep[0] = '-';
                    split = AssociateDevice.Split(sep);
                    AssociateDevice = split[0];
                }

                sep[0] = ';';
                LockedDeviceIndex = GetLockedDeviceIndex(MonirotIdx);
                if (LockedDeviceIndex != "")
                {
                    split = LockedDeviceIndex.Split(sep);
                    for (int m = split.GetLowerBound(0); m <= split.GetUpperBound(0); m++)
                    {
                        sql.Remove(0, sql.Length);
                        sql.Append("update T_Base_device set F_LockedState=" ).Append( MonirotIdx ).Append(
                            " where F_LockedState<>-1 and F_DeviceIndex=").Append(Convert.ToInt32(split[m])).Append("and F_DeviceIndex<>").Append(Convert.ToInt32(AssociateDevice));
                        dbo.ExceSQL(sql.ToString());//20141201 增加条件F_LockedState<>-1 张磊发现接货输送机设备被停用时,可能会被堆垛机放货完成把F_LockedState改为0
                    }
                }
                //if (deviceidx == 21001 || deviceidx == 21002 || deviceidx == 11000 || deviceidx == 11001 || deviceidx == 11025 || deviceidx == 13001)//机器人拆垛任务,内筒线入口,箱体线入口
                //{
                //    cgs.ActionComplete(deviceidx, MonirotIdx, 0);
                //    //Model.CGeneralFunction.ActionComplete(deviceidx, MonirotIdx, 0);
                //}
                CDataChangeEventArgs cea = new CDataChangeEventArgs(null, null);
                OnDataChange("CcommonFuntion.SendOrderSuccess", cea);
            }
            catch (Exception ex)
            {
                RefreshMonitorEventArgs rme = new RefreshMonitorEventArgs("tsStatus", "CcommonFuntion.SendOrderSuccess是发生错误:" + ex.Message);
                OnRefreshMonitor("CcommonFuntion.SendOrderSuccess", rme);
            }
            finally
            {
                sep =null;
                split=null;
                dvs.Dispose() ;
            }
            
            
        }

        /// <summary>
        /// 成功发送命令后的处理信息
        /// </summary>
        /// <param name="taskKindIndex">调度任务类型</param>
        /// <param name="Managefid">调度任务索引</param>
        /// <param name="MonirotIdx">设备指令索引</param>
        /// <param name="deviceidx">设备索引</param>
        /// <param name="detailidx">详细路径步骤索引</param>
        public void SendOrderSuccess(int taskKindIndex, int Managefid, int MonirotIdx, int deviceidx, int detailidx)
        {
            string AssociateDevice = "";//关联设备
            string LockedDeviceIndex = "";//被锁定的设备索引组,以“;”分隔
            char[] sep = new char[1];
            string[] split;
            DataView dvs = new DataView();
            try
            {
                int devKind = GetDeviceKindIdx(deviceidx);
                int order = GetDeviceOrderFromMonitor(MonirotIdx);
                if (order <= 0) return;
                #region add for TJBS 中转站台加锁
                if (devKind==1 && order ==4)
                {
                    DataView dvsDS = new DataView();
                    sql.Remove(0, sql.Length);
                    sql.Append("SELECT F_NumParam1,F_NumParam2,F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6 FROM T_Monitor_Task WHERE  F_MonitorIndex = ").Append(MonirotIdx).Append(" and  F_DeviceIndex = ").Append(deviceidx);
                    dvsDS = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                    if (dvsDS.Count >0)
                    {
                        if ((Convert.ToInt32(dvsDS[0]["F_NumParam1"]) != 2 || Convert.ToInt32(dvsDS[0]["F_NumParam2"]) != 53 ||Convert.ToInt32(dvsDS[0]["F_NumParam3"]) != 1) && (Convert.ToInt32(dvsDS[0]["F_NumParam4"]) == 2 && Convert.ToInt32(dvsDS[0]["F_NumParam5"]) == 53 && Convert.ToInt32(dvsDS[0]["F_NumParam6"]) == 1))
                        {
                            sql.Remove(0, sql.Length);
                            sql.Append("update T_Base_Device set F_SLocked = ").Append(MonirotIdx).Append(" where F_DeviceIndex = 12223");
                            dbo.ExceSQL(sql.ToString());
                        }
                    }
                    //sql.Remove(0, sql.Length);
                    //sql.Append("update T_Base_Device set F_SLocked =  ").Append(Managefid);
                    //dbo.ExceSQL(sql.ToString());
                }
                #endregion
                //8:更改作业记录的状态F_Status为1,更改设备为占用状态(T_Base_device的F_LockedState=设备指令单)
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("update T_Monitor_Task set F_ErrorCode='',F_StartTime='").Append(DateTime.Now.ToString("u")).Append("',F_Status=1,F_SendCount=F_SendCount+1 where F_Status=0 and F_MonitorIndex=").Append(MonirotIdx);
                dbo.ExceSQL(sql.ToString());
                if (taskKindIndex != 4)//20100610
                {
                    //AGV,积放或者长输送机链组,条码扫描不需要锁定设备//20111226
                    if (devKind == 1 || devKind == 4)
                    {
                        //20101124
                        sql.Remove(0, sql.Length);
                        sql.Append("update T_Base_device set F_LockedState=").Append(MonirotIdx).Append(
                            " where   F_DeviceIndex=").Append(deviceidx);
                        dbo.ExceSQL(sql.ToString());
                    }
                    else
                    {

                        //20101124
                        sql.Remove(0, sql.Length);
                        sql.Append("SELECT F_AgvNo FROM T_Monitor_Task WHERE (F_AgvNo IS NOT NULL) AND (F_MonitorIndex = ").Append(MonirotIdx).Append(")");
                        dvs = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                        if ((dvs.Count > 0) && (devKind == 6))
                        {
                            //20101124
                            sql.Remove(0, sql.Length);
                            sql.Append("update T_Base_device set F_LockedState=").Append(MonirotIdx).Append(
                               " where   F_DeviceIndex=").Append(dvs[0][0]);
                            dbo.ExceSQL(sql.ToString());
                        }

                    }

                }
                if (devKind == 1)
                {
                    //修改T_Manage_Task的FLANEWAY,FSTACK

                    //20101124
                    sql.Remove(0, sql.Length);
                    sql.Append("SELECT F_LaneDeviceIndex,F_StackIndex  FROM T_Base_LaneInfo where F_StackIndex=").Append(deviceidx);
                    dvs = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                    int laneway = 0;
                    if (dvs.Count > 0)
                    {
                        laneway = Convert.ToInt32(dvs[0]["F_LaneDeviceIndex"]);

                    }
                    sql.Remove(0, sql.Length);
                    sql.Append("update T_Manage_Task set FLANEWAY=").Append(laneway).Append(",FSTACK=").Append(deviceidx).Append(" where F_ManageTaskKindIndex=").Append(taskKindIndex).Append(" and FID=").Append(Managefid);
                    dbo.ExceSQL(sql.ToString());

                }
                if (taskKindIndex != 4)
                {
                    //如果是RGV、堆垛机的将取(运行)命令需要增加调度任务预约锁F_ManTaskReserve   && (order == 7))  && ((order == 2) || (order == 4))
                    if ((devKind == 4) || (devKind == 1))
                    {////RGV运到到输送机//堆垛机将取
                        //20101124
                        sql.Remove(0, sql.Length);
                        sql.Append("UPDATE T_Base_Device SET F_ManTaskReserve = (").Append(taskKindIndex.ToString()).Append(Managefid.ToString()).Append(") WHERE (F_DeviceIndex = ").Append(deviceidx).Append(")");
                        dbo.ExceSQL(sql.ToString());
                        SetStackSendConveyorManReserve(MonirotIdx, deviceidx);

                    }
                }
                //9:给调度任务表回写调度任务IO_Control的正在执行状态FSTATUS=1;T_Manage_Task的正在执行状态FSTATUS=1
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("update T_Manage_Task set FSTATUS='1' where F_ManageTaskKindIndex=").Append(taskKindIndex).Append(" and FID=").Append(Managefid);
                dbo.ExceSQL(sql.ToString());

                //10:调度任务表里的F_RunningLock所有对应设备索引加锁,但是F_AssociateDeviceIndex关联设备不加锁
                AssociateDevice = GetAssociateDevice(MonirotIdx);
                if (AssociateDevice == "") AssociateDevice = null;
                if (AssociateDevice != null)
                {
                    sep[0] = '-';
                    split = AssociateDevice.Split(sep);
                    AssociateDevice = split[0];
                }

                sep[0] = ';';
                LockedDeviceIndex = GetLockedDeviceIndex(MonirotIdx);
                if (LockedDeviceIndex != "")
                {
                    split = LockedDeviceIndex.Split(sep);
                    for (int m = split.GetLowerBound(0); m <= split.GetUpperBound(0); m++)
                    {
                        //20101124
                        sql.Remove(0, sql.Length);
                        sql.Append("update T_Base_device set F_LockedState=").Append(MonirotIdx).Append(
                            " where F_LockedState<>-1 and F_DeviceIndex=").Append(Convert.ToInt32(split[m])).Append("and F_DeviceIndex<>").Append(Convert.ToInt32(AssociateDevice));
                        dbo.ExceSQL(sql.ToString());//20141201 增加条件F_LockedState<>-1 张磊发现接货输送机设备被停用时,可能会被堆垛机放货完成把F_LockedState改为0
                    }
                }
                CDataChangeEventArgs cea = new CDataChangeEventArgs(null, null);
                OnDataChange("CcommonFuntion.SendOrderSuccess", cea);
            }
            catch (Exception ex)
            {
                RefreshMonitorEventArgs rme = new RefreshMonitorEventArgs("tsStatus", "CcommonFuntion.SendOrderSuccess是发生错误:" + ex.Message);
                OnRefreshMonitor("CcommonFuntion.SendOrderSuccess", rme);
            }
            finally
            {
                sep = null;
                split = null;
                dvs.Dispose();
            }


        }
        public int GetManageTaskIndexfromMonitor(int monitorIdx)
        {
            //20100108
            DataView dv = new DataView();
            try
            {
                //20100108
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT F_ManageTaskIndex FROM T_Monitor_Task WHERE (F_MonitorIndex = " ).Append( monitorIdx ).Append( ")");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["F_ManageTaskIndex"]);
                }
                else
                {
                    return -1;
                }
            }
            catch (Exception ex)
            {//20100108
                throw ex;
            }
            finally
            {//20100108
                dv.Dispose();
            }
        }

        //山东辛化修改 提前检测 山东辛化 山东辛化  山东辛化
        public void UpdateAheadDetectOk(int F_ManageTaskIndex, int F_DeviceIndex, int FENDDEVICE, int F_UseAwayFork)
        {
            //20200316
            DataView dv = new DataView();
            try
            {
                //查出现在拆分出来的送货站台
                sql.Clear();
                sql.Append("SELECT F_GetPostion  FROM T_Base_Relpositon where F_NumParam5 in ").Append("SELECT F_NumParam5  FROM T_Monitor_Task WHERE F_DeviceIndex = 11004 and F_ManageTASKKINDINDEX=2 and F_ManageTaskIndex= ").Append(F_ManageTaskIndex).Append(" and F_DeviceCommandIndex=").Append(5);
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                int F_GetPostion = Convert.ToInt32( dv[0]["F_GetPostion"]);
                int yuanliao; int lie;
                if(F_UseAwayFork == 2)
                {
                    yuanliao = 22019;
                    lie = 1;
                }else
	            {
                    yuanliao = 22020;
                    lie = 2;
	            }
                object[] ob = new object[7] { F_GetPostion, yuanliao, F_DeviceIndex, F_ManageTaskIndex ,2,4,5};
                object[] oc = new object[5] { yuanliao, F_ManageTaskIndex ,2,2,3};
                object[] od = new object[6] { lie, F_DeviceIndex, F_ManageTaskIndex, 2, 4,5 };
                //根据终点位置判断提前检测
                if (FENDDEVICE == 18005)
                {
                    //堆垛机取货送货任务提前检测修改   WHERE F_DeviceIndex=10001 and (F_ManageTaskIndex ={3}) AND (F_ManageTASKKINDINDEX ={4}) and( F_DeviceCommandIndex= 2 )";
                    dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_AheadDetect = REPLACE(F_AheadDetect, '{0}', '{1}') WHERE F_DeviceIndex={2} and (F_ManageTaskIndex ={3}) AND (F_ManageTASKKINDINDEX ={4}) and( F_DeviceCommandIndex= {5} or F_DeviceCommandIndex= {6} )", ob));
                   //修改堆垛机送货的终点位置
                    dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_NumParam5 = {0} WHERE F_DeviceIndex={1} and (F_ManageTaskIndex ={2}) AND (F_ManageTASKKINDINDEX ={3}) and( F_DeviceCommandIndex= {4} or F_DeviceCommandIndex= {5} )", od));
                    //AGV取货提前检测
                    dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_AheadDetect = REPLACE(F_AheadDetect, '{0}', '{1}') WHERE F_DeviceIndex=10001 and (F_ManageTaskIndex ={3}) AND (F_ManageTASKKINDINDEX ={4}) and( F_DeviceCommandIndex= 2 )", ob));
                    //AGV取货的起点位置更改
                    dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_NumParam2 ={0} WHERE F_DeviceIndex=10001 and (F_ManageTaskIndex ={1}) AND (F_ManageTASKKINDINDEX ={2}) and( F_DeviceCommandIndex={3} or F_DeviceCommandIndex= {4})", oc));
                    //AGV取货的起点位置的预约锁更改
                    dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_RunningLock = REPLACE(F_RunningLock, '{0}', '{1}') WHERE F_DeviceIndex=10001 and (F_ManageTaskIndex ={3}) AND (F_ManageTASKKINDINDEX ={4}) and( F_DeviceCommandIndex= 2 )", ob));
                }
                else
                {//这种修改多一种情况是大任务的终点位置不是AGV通道了 所以终点位置需要修改

                    //堆垛机取货送货任务提前检测修改   WHERE F_DeviceIndex=10001 and (F_ManageTaskIndex ={3}) AND (F_ManageTASKKINDINDEX ={4}) and( F_DeviceCommandIndex= 2 )";
                    dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_AheadDetect = REPLACE(F_AheadDetect, '{0}', '{1}') WHERE F_DeviceIndex={2} and (F_ManageTaskIndex ={3}) AND (F_ManageTASKKINDINDEX ={4}) and( F_DeviceCommandIndex= {5} or F_DeviceCommandIndex= {6} )", ob));
                    //修改堆垛机送货的终点位置
                    dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_NumParam5 = {0} WHERE F_DeviceIndex={1} and (F_ManageTaskIndex ={2}) AND (F_ManageTASKKINDINDEX ={3}) and( F_DeviceCommandIndex= {4} or F_DeviceCommandIndex= {5} )", od));
                    //修改大任务的终点位置 未测试 and FLOGIC_AREA = {0} //修改manage 表的逻辑区域
                    dbo.ExceSQL(string.Format("UPDATE T_Manage_Task SET FENDDEVICE = {0},FLOGIC_AREA = {0}  WHERE (FID ={1}) AND (F_ManageTaskKindIndex ={2}) ", oc));   
                }
            }
            catch (Exception ex)
            {//20100108
                throw ex;
            }
            finally
            {//20100108
                dv.Dispose();
            }
        }
        /// <summary>
        /// 返回关联任务号对应的关联任务ID F_GOODMatchID
        /// </summary>
        /// <param name="monitorIdx"></param>  是当前的管理任务号
        /// <returns></returns>
        /// 
        public int GetGoodMatchIDFid(int monitorIdx,int matchID)
        {
            //20100108
            DataView dv = new DataView();
            try
            {
                if (matchID != -1)
                {
                    sql.Remove(0, sql.Length);
                    sql.Append("SELECT FID FROM T_Manage_Task WHERE (F_RELATIVECONTORLID = ").Append(matchID).Append(" and FID <>").Append(monitorIdx).Append(")");
                    dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                    if (dv.Count > 0)
                    {
                        return Convert.ToInt32(dv[0]["FID"]);
                    }
                    else
                    {
                        return -1;
                    }
                }
                else
                {
                    return -1;
                }
                
            }
            catch (Exception ex)
            {//20100108
                throw ex;
            }
            finally
            {//20100108
                dv.Dispose();
            }
        }

        /// <summary>
        /// 返回当前任务号的第一条小任务号
        /// </summary>
        /// <param name="monitorIdx"></param>  是当前的管理任务号
        /// <returns></returns>
        /// 
        // oracle add for CATL YB2
        public int GetFirstMomitorIndex(int fidd, int matchID)
        {
            
            DataView dv = new DataView();
            try
            {
                
                    // 针对CATL YB 系列项目 双叉堆垛机出库双顶升站台,送出任务双终点的控制任务发送 提前检测
                    sql.Remove(0, sql.Length);
                    sql.Append("SELECT t.F_MONITORINDEX FROM T_MONITOR_TASK t,T_BASE_LANE_GATE s WHERE (F_MANAGETASKINDEX = ").Append(fidd).Append(")").Append(" and t.F_DEVICECOMMANDINDEX = 6").Append(" and t.F_DEVICEINDEX = s.F_LANEGATEDEVICEINDEX").Append("order by t.F_MONITORINDEX");
                    dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                    if (dv.Count > 0)
                    {
                        return Convert.ToInt32(dv[0]["F_MONITORINDEX"]);
                    }
                    else
                    {
                        return -1;
                    }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        /// <summary>
        /// 返回关联任务ID RELATIVECONTORLID
        /// </summary>
        /// <param name="monitorIdx"></param>  是当前的管理任务号
        /// <returns></returns>
        /// 
        public int GetRELATIVECONTORLID(int monitorIdx)
        {
            //shk
            DataView dv = new DataView();
            try
            {
                
                sql.Remove(0, sql.Length);
                sql.Append("SELECT F_RELATIVECONTORLID FROM T_Manage_Task WHERE FID = ").Append(monitorIdx);
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (Convert.ToInt32(dv[0]["F_RELATIVECONTORLID"]) != -1)
                {
                    return Convert.ToInt32(dv[0]["F_RELATIVECONTORLID"]);
                }
                else
                {
                    return 1;
                } 
             

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




        /// <summary>
        /// 返回关联任务ID F_RELATIVECONTORLID  shk sdxh 山东辛化
        /// </summary>
        /// <param name="monitorIdx"></param>  是当前的管理任务号
        /// <returns></returns>
        /// 
        public int GetGoodMatchID(int monitorIdx)
        {
            //20100108
            DataView dv = new DataView();
            try
            {
                sql.Remove(0, sql.Length);
                sql.Append("SELECT F_RELATIVECONTORLID FROM T_Manage_Task WHERE (FID = ").Append(monitorIdx).Append(")").Append(" and F_RELATIVECONTORLID <> ").Append(-1);
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["F_RELATIVECONTORLID"]);
                }
                else
                {
                    return -1;
                }
            }
            catch (Exception ex)
            {//20200317
                throw ex;
            }
            finally
            {//20200317
                dv.Dispose();
            }
        }
        // add for CATL  YB2
        public int GetManageTaskStatus(int fid, int TaskIndex)
        {
            
            DataView dv = new DataView();
            try
            {
                sql.Remove(0, sql.Length);
                //sql.Append("SELECT FSTATUS FROM T_Manage_Task WHERE (FID = ").Append(fid).Append(")");
                sql.Append("SELECT F_Status FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(fid).Append(") AND (F_MonitorIndex = ").Append(TaskIndex).Append(")");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["F_Status"]);
                }
                else
                {
                    return -1;
                }
            }
            catch (Exception ex)
            {//20100108
                throw ex;
            }
            finally
            {//20100108
                dv.Dispose();
            }
        }
        public int GetManageTaskKindIndexFromMonitor(int monitorIdx)
        {//20100108
            DataView dv = new DataView();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT F_ManageTaskKindIndex FROM T_Monitor_Task WHERE (F_MonitorIndex = " ).Append( monitorIdx ).Append( ")");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["F_ManageTaskKindIndex"]);
                }
                else
                {
                    return -1;
                }
            }
            catch (Exception ex)
            {//20100108
                throw ex;
            }
            finally
            {//20100108
                dv.Dispose();
        
            }

        
        }
        public int GetManageIDFromManageTask(int taskKindIndex, int Managefid)
        {
            //20100108
            DataView dv = new DataView();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT FMANAGEID FROM T_Manage_Task WHERE (FID = " ).Append( Managefid ).Append( ") AND (F_ManageTaskKindIndex = " ).Append( taskKindIndex ).Append( ")");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    if (dv[0]["FMANAGEID"] == DBNull.Value) return -1;
                    return Convert.ToInt32(dv[0]["FMANAGEID"]);
                }
                else
                {
                    return -1;
                }
            }
            catch (Exception ex)
            {//20100108
                throw ex;
            }
            finally
            {//20100108
                dv.Dispose();

            }
        }
        public int GetFCONTROLTASKTYPEFromManageTask(int taskKindIndex, int Managefid)
        {
            //20100108
            DataView dv = new DataView();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT FCONTROLTASKTYPE FROM T_Manage_Task WHERE (FID = ").Append( Managefid ).Append( ") AND (F_ManageTaskKindIndex = " ).Append( taskKindIndex ).Append( ")");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    if (dv[0]["FCONTROLTASKTYPE"] == DBNull.Value) return -1;
                    return Convert.ToInt32(dv[0]["FCONTROLTASKTYPE"]);
                }
                else
                {
                    return -1;
                }
            }
            catch (Exception ex)
            {//20100108
                throw ex;
            }
            finally
            {//20100108
                dv.Dispose();

            }
        }
        public string GetControlBatchFromManageTask(int taskKindIndex, int Managefid)
        {
            //20100108
            DataView dv = new DataView();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT FCONTORL_BATCH FROM T_Manage_Task WHERE (FID = ").Append(Managefid).Append(") AND (F_ManageTaskKindIndex = ").Append(taskKindIndex).Append(")");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    if (dv[0]["FCONTORL_BATCH"] == DBNull.Value) return "";
                    return dv[0]["FCONTORL_BATCH"].ToString();
                }
                else
                {
                    return "";
                }
            }
            catch (Exception ex)
            {//20100108
                throw ex;
            }
            finally
            {//20100108
                dv.Dispose();

            }
        }
        public int GetRELATIVECONTORLIDFromManageTask(int taskKindIndex, int Managefid)
        {
            //20100108
            DataView dv = new DataView();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT F_RELATIVECONTORLID FROM T_Manage_Task WHERE (FID = ").Append(Managefid).Append(") AND (F_ManageTaskKindIndex = ").Append(taskKindIndex).Append(")");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    if (dv[0]["F_RELATIVECONTORLID"] == DBNull.Value) return -1;
                    return Convert.ToInt32(dv[0]["F_RELATIVECONTORLID"]);
                }
                else
                {
                    return -1;
                }
            }
            catch (Exception ex)
            {//20100108
                throw ex;
            }
            finally
            {//20100108
                dv.Dispose();

            }
        }
        
        /// <summary>
        /// 是否需要优化调度
        /// </summary>
        /// <param name="DeviceIdx"></param>
        /// <returns></returns>
        public bool NeedOptimize(int DeviceIdx)
        {
            //20100108
            DataView dv = new DataView();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT F_DeviceIndex, F_NeedOptimize FROM T_Base_Device where F_DeviceIndex=" ).Append( DeviceIdx ).Append( " and  F_NeedOptimize='1'");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return true;
                }
                else
                    return false;
            }
            catch (Exception ex)
            {//20100108
                throw ex;
            }
            finally
            {//20100108
                dv.Dispose();

            }
        }
        /// <summary>
        /// 根据设备指令索引MonitorIndex检索出需要向T_Monitor_Task_Child插入的纪录,并且完成插入工作
        /// </summary>
        /// <param name="MonitorIndex"></param>
        public void InsertMonitorOptimizeChildTask(int MonitorIndex)
        {
            try
            {//20100108
                //起始x坐标,列-沿轨道方向
                // 起始y坐标,层-高度方向
                // 起始z坐标,排-面向堆垛机操作面板,1-左侧,2-右侧
                //F_NumParam1--z,x--2,y--3;F_NumParam4--z,5--x,6--y
               
                int[] childInfo = GetMonitorChildIndex(MonitorIndex);
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("INSERT INTO T_Monitor_Task_Child(F_Child_Index, F_TargetX, F_TargetY, F_TargetZ, F_OriginX, F_OriginY, F_OriginZ, F_Order,F_DeviceKindIndex,F_DummyDeviceIndex,F_MonitorIndex, F_Status)" );
                sql.Append("VALUES (" ).Append( childInfo[0] ).Append( "," ).Append( childInfo[2] ).Append( "," ).Append( childInfo[3] ).Append( "," ).Append(childInfo[1] ).Append( "," ).Append( childInfo[5] ).Append( "," ).Append( childInfo[6] ).Append( "," ).Append( childInfo[4] ).Append( "," ).Append( childInfo[7] ).Append( "," ).Append( childInfo[8] ).Append( "," ).Append( childInfo[9] ).Append( "," ).Append( MonitorIndex ).Append(",0,)");
                
                dbo.ExceSQL(sql.ToString());
            }
            catch (Exception ex)
            {//20100108
                throw ex;
            }
        }
        
        /// <summary>
        /// //获得需要优化调度设备指令的子任务索引
        ///conInfo[9]=设备索引 ;
        ///conInfo[8]=设备种类索引 ;
        ///conInfo[7]=命令 ;
        ///conInfo[1] = ["F_NumParam1"];
        ///conInfo[2] = ["F_NumParam2"];
        ///conInfo[3] = ["F_NumParam3"];
        ///conInfo[4] = ["F_NumParam4"];
        ///conInfo[5] = ["F_NumParam5"];
        ///conInfo[6] = ["F_NumParam6"];
        /// </summary>
        /// <param name="monitorTaskIndex"></param>
        /// <returns>子任务索引值1--65535</returns>
        public int[] GetMonitorChildIndex(int monitorTaskIndex)
        {
            //20100108
            DataView dvMt = new DataView();
            int[] conInfo = new int[10];
            DataView dv = new DataView();

            try
            {
                int devKindIndex;

                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT T_Base_Device.F_DeviceIndex,T_Base_Device.F_DeviceKindIndex,T_Monitor_Task.F_DeviceCommandIndex," ).Append(
                    "F_NumParam1,F_NumParam2,F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6 FROM T_Monitor_Task" ).Append(
                    " WHERE (T_Monitor_Task.F_MonitorIndex = " ).Append( monitorTaskIndex ).Append( ") and " ).Append(
                    " (T_Monitor_Task.F_DeviceIndex = T_Base_Device.F_DeviceIndex)");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    devKindIndex = Convert.ToInt32(dv[0]["F_DeviceKindIndex"]);
                    conInfo[9] = Convert.ToInt32(dv[0]["F_DeviceIndex"]);
                    conInfo[8] = devKindIndex;
                    conInfo[7] = Convert.ToInt32(dv[0]["F_DeviceCommandIndex"]);
                    conInfo[1] = Convert.ToInt32(dv[0]["F_NumParam1"]);
                    conInfo[2] = Convert.ToInt32(dv[0]["F_NumParam2"]);
                    conInfo[3] = Convert.ToInt32(dv[0]["F_NumParam3"]);
                    conInfo[4] = Convert.ToInt32(dv[0]["F_NumParam4"]);
                    conInfo[5] = Convert.ToInt32(dv[0]["F_NumParam5"]);
                    conInfo[6] = Convert.ToInt32(dv[0]["F_NumParam6"]);
                }
                else
                {

                    return null;
                }
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT F_Child_Index FROM T_Monitor_Task_Child_Index");
                
                dvMt = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dvMt.Count > 0 && dvMt[0]["F_Child_Index"] != DBNull.Value)
                {
                    int maxIdx;
                    maxIdx = (Convert.ToInt32(dvMt[0]["F_Child_Index"]) + 1);
                    if (maxIdx >= 64000)
                    {
                        UpdateMonitorChildIndex(Convert.ToInt32(devKindIndex.ToString() + "0" + "1"));
                        conInfo[0] = Convert.ToInt32(devKindIndex.ToString() + "0" + "1");
                        return conInfo;
                    }
                    else
                    {
                        UpdateMonitorChildIndex(maxIdx);
                        conInfo[0] = maxIdx;
                        return conInfo;
                    }
                }
                else//现在没有该设备指令子任务记录
                {
                    UpdateMonitorIndex(Convert.ToInt32(devKindIndex.ToString() + "0" + "1"));
                    conInfo[0] = Convert.ToInt32(devKindIndex.ToString() + "0" + "1");
                    return conInfo;
                }
            }
            catch (Exception ex)
            {
                _DisassembleTaskError = "获得指定调度任务的设备指令索引失败!" + ex.Message;
                throw ex;
                //return 0;
            }
            finally
            {//20100108
                dv.Dispose();
                dvMt.Dispose();
                conInfo = null;
            }

        }
        public void UpdateMonitorChildIndex(int MonitorChildIndex)
        {
            //20101124
            sql.Remove(0, sql.Length);
            sql.Append("update T_Monitor_Task_Child_Index set F_Child_Index=" ).Append( MonitorChildIndex);
            dbo.ExceSQL(sql.ToString());
        }
        /// <summary>
        /// 增加对表T_Monitor_Task_Child的监控,产生不同设备优选算法,完成优化调度
        /// 优化原则:调度路径和最小者(空闲设备的当前位置与起始位置的“路径模差”的绝对值 
        /// 加上 起始位置与终点位置的“路径模差”的绝对值
        /// 路径模差:此路径上总共有n个站点,如果(n1-n2)的绝对值大于或等于(n/2),则
        /// 路径模差=Math.Abs(n1-n2)-n;否则,路径模差=Math.Abs(n1-n2)
        /// </summary>
        public void OptimizeControlDevice()
        {
            
        }

        /// <summary>
        /// 获得设备指令任务的关联对等设备索引:堆垛机的取货指令任务的取货站台的双叉对等关联站台
        /// 返回值“”表示无关联站台;“0”表示自关联站台;其它值表示关联站台设备索引
        /// </summary>
        /// <param name="MonitorTask">设备指令索引</param>
        /// <param name="DeviceIndex">设备索引</param>
        /// <returns></returns>
        public string GetCorrel_DeviceIndex(int MonitorTask)
        {
            DataView dv = new DataView();
            try
            {
                int[] zxy = GetCoordinatesFromMonitorTask(MonitorTask);
                string zxystr = string.Empty;
                if (zxy != null)
                {
                    zxystr = (zxy[0].ToString().Length == 1 ? "0" + zxy[0].ToString() : zxy[0].ToString()) + "-" +
                        ((zxy[1].ToString().Length == 1) ? ("0" + zxy[1].ToString()) : (zxy[1].ToString())) + "-" +
                        ((zxy[2].ToString().Length == 1) ? ("0" + zxy[2].ToString()) : (zxy[2].ToString()));
                    //20101124
                    sql.Remove(0, sql.Length);
                    sql.Append("SELECT F_LaneGateDeviceIndex,F_CorrelDeviceIndex FROM T_Base_Lane_Gate where (T_Base_Lane_Gate.F_ZXY = '").Append(zxystr).Append("')");
                    dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                    if (dv.Count > 0)
                    {

                        if (dv[0]["F_LaneGateDeviceIndex"].ToString() == dv[0]["F_CorrelDeviceIndex"].ToString())
                        {
                            return "0";
                        }
                        else
                        {
                            return dv[0]["F_CorrelDeviceIndex"].ToString();
                        }
                    }
                }
                return "";
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        /// <summary>
        /// 根据设备指令索引获得设备巷道出入口信息:【0】设备索引【1】顶升高位检测【2】顶升低位检测
        /// 【3】有物检测【4】运行监测【5】近巷道有物检测【6】远巷道有物检测【7】是否使用远货叉【8】关联设备索引【9】货位编码
        /// </summary>
        /// <param name="MonitorTask"></param>
        /// <returns></returns>
        public string[] GetDeviceLaneGateInfoFromStackCoor(int stackdeviceindex,int MonitorTask)
        {
            DataView dvl = new DataView();
            try
            {
                int laneway = 0;
                dvl = dbo.ExceSQL(string.Format("SELECT F_LaneDeviceIndex FROM T_Base_LaneInfo WHERE (F_StackIndex = {0})", stackdeviceindex)).Tables[0].DefaultView;
                if (dvl.Count > 0)
                {
                    laneway = Convert.ToInt32(dvl[0][0]);
                }
                else
                {
                    return null;
                }
                string[] rr = new string[10];

                int[] zxy = GetCoordinatesFromMonitorTask(MonitorTask);
                string zxystr = "";
                if (zxy != null)
                {
                    zxystr = (zxy[0].ToString().Length == 1 ? "0" + zxy[0].ToString() : zxy[0].ToString()) + "-" +
                        ((zxy[1].ToString().Length == 1) ? ("0" + zxy[1].ToString()) : (zxy[1].ToString())) + "-" +
                        ((zxy[2].ToString().Length == 1) ? ("0" + zxy[2].ToString()) : (zxy[2].ToString()));
                    //20101124
                    sql.Remove(0, sql.Length);
                    sql.Append("SELECT * FROM T_Base_Lane_Gate where (F_LaneIndex=").Append(laneway).Append(" and T_Base_Lane_Gate.F_ZXY = '").Append(zxystr).Append("')");
                    DataView dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                    if (dv.Count > 0)
                    {
                        rr[0] = dv[0]["F_LaneGateDeviceIndex"].ToString();
                        rr[1] = dv[0]["F_HighDetect"].ToString();
                        rr[2] = dv[0]["F_LowDetect"].ToString();
                        rr[3] = dv[0]["F_HavingDetect"].ToString();
                        rr[4] = dv[0]["F_RunDetect"].ToString();
                        rr[5] = dv[0]["F_NearDetect"].ToString();
                        rr[6] = dv[0]["F_FarDetect"].ToString();
                        rr[7] = dv[0]["F_UseAwayFork"].ToString();
                        rr[8] = dv[0]["F_CorrelDeviceIndex"].ToString();
                        rr[9] = dv[0]["F_ZXY"].ToString();
                        return rr;
                    }

                }
                return null;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dvl.Dispose();
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="ManageIdx"></param>
        /// <returns></returns>
        public int GetManageSelectFlagfromManage(int ManageIdx)
        {
            DataView dv = new DataView();
            try
            {
                //20100108
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT  manageSelect_Flag  FROM T_Manage_Task WHERE (FID = ").Append(ManageIdx).Append(")");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["manageSelect_Flag"]);
                }
                else
                {
                    return 0;
                }
            }
            catch (Exception ex)
            {//20100108
                throw ex;
            }
            finally
            {//20100108
                dv.Dispose();
            }
        }

        /// <summary>
        /// 根据堆垛机和设备索引获得设备巷道出入口信息:【0】设备索引【1】顶升高位检测【2】顶升低位检测
        /// 【3】有物检测【4】运行监测【5】近巷道有物检测【6】远巷道有物检测【7】是否使用远货叉【8】关联设备索引【9】货位编码
        /// </summary>
        /// <param name="stack"></param>
        /// <param name="device"></param>
        /// <returns></returns>
        public string[] GetLanewayDeviceInfoFromStackDev(int stack, int device)
        {
            DataView dvl = new DataView(); DataView dv = new DataView();
            try
            {
                //Oracle 数据库更新程序
                string[] rr = new string[11];
                int laneway = 0;
                dvl = dbo.ExceSQL(string.Format("SELECT F_LaneDeviceIndex FROM T_Base_LaneInfo WHERE (F_StackIndex = {0})", stack)).Tables[0].DefaultView;
                if (dvl.Count > 0)
                {
                    laneway = Convert.ToInt32(dvl[0][0]);
                }
                else
                {
                    return null;
                }
                sql.Remove(0, sql.Length);
                sql.Append("SELECT * FROM T_Base_Lane_Gate where F_CorrelDeviceIndex is not null and (F_LaneIndex=").Append(laneway).Append(" and T_Base_Lane_Gate.F_LaneGateDeviceIndex = ").Append(device).Append(")");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    rr[0] = dv[0]["F_LaneGateDeviceIndex"].ToString();
                    rr[1] = dv[0]["F_HighDetect"].ToString();
                    rr[2] = dv[0]["F_LowDetect"].ToString();
                    rr[3] = dv[0]["F_HavingDetect"].ToString();
                    rr[4] = dv[0]["F_RunDetect"].ToString();
                    rr[5] = dv[0]["F_NearDetect"].ToString();
                    rr[6] = dv[0]["F_FarDetect"].ToString();
                    rr[7] = dv[0]["F_UseAwayFork"].ToString();
                    rr[8] = dv[0]["F_CorrelDeviceIndex"].ToString();
                    rr[9] = dv[0]["F_zxy"].ToString();
                    rr[10] = dv[0]["F_ExchangeStation"].ToString();//20181006
                    return rr;
                }
                else

                    return null;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
                dvl.Dispose();
            }
        }
        //电气对接允许不允许信号 20200420 南宁电力新加  沒改完 沒改完允许信号 T_Base_AllowSianal
        //在数据库表中配允许不予许信号
        public string[] GetLanewayDeviceInfoFromSignal(int keyDevice, int device)
        {
            DataView dvl = new DataView(); DataView dv = new DataView();
            try
            {
                string[] rr = new string[4];
                sql.Remove(0, sql.Length);
                sql.Append("SELECT * FROM T_Base_AllowSianal where F_DeviceIndex = ").Append(device).Append(" and F_KeyDevice =").Append(keyDevice);
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    rr[0] = dv[0]["F_SSXDDeviceIndex"].ToString();
                    rr[1] = dv[0]["F_DDJSDeviceIndex"].ToString();
                    rr[2] = dv[0]["F_CSCSDeviceIndex"].ToString();
                    rr[3] = dv[0]["F_SSXCDeviceIndex"].ToString();
                    return rr;
                }
                else

                    return null;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
                dvl.Dispose();
            }
        }
        /// <summary>
        /// [0]:出库终点组,[1]:1叉lanegate ,[2]:1叉lanegate的下一个输送机,[3]:2叉lanegate ,[4]:2叉lanegate的下一个输送机,[5]:1叉终点 ,[6]:2叉终点
        /// </summary>
        /// <param name="enddevice"></param>
        /// <returns></returns>
        public string[] GetEndGroupFromTaskCount(int enddevice)
        {
            DataView dv = new DataView();
            try
            {

                string[] rr = new string[7];//20181006

                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT * FROM T_Base_TaskCount  where F_DeviceIndex = ").Append(enddevice).Append("");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    rr[0] = dv[0]["F_EndGroup"].ToString();
                    rr[1] = dv[0]["F_GateDevice1"].ToString();
                    rr[2] = dv[0]["F_NextDevice1"].ToString();
                    rr[3] = dv[0]["F_GateDevice2"].ToString();
                    rr[4] = dv[0]["F_NextDevice2"].ToString();
                    rr[5] = dv[0]["F_EndDevice1"].ToString();
                    rr[6] = dv[0]["F_EndDevice2"].ToString();

                    return rr;
                }
                else
                { return null;}

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

            }
        }
        /// <summary>
        /// 获得设备索引的关联对等设备索引:堆垛机的取货指令任务的取货站台的双叉对等关联站台或者顶升
        /// 返回值“”表示无关联站台;“0”表示自关联站台;其它值表示关联站台设备索引
        /// </summary>
        /// <param name="DeviceIndex"></param>
        /// <returns></returns>
        public string  GetCorrel_DeviceIndex(int DeviceIndex, bool ownCorrel)
        {
            DataView dv = new DataView();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT F_LaneGateDeviceIndex,F_CorrelDeviceIndex FROM T_Base_Lane_Gate where F_LaneGateDeviceIndex = ").Append(DeviceIndex);
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {

                    if (dv[0]["F_LaneGateDeviceIndex"].ToString() == dv[0]["F_CorrelDeviceIndex"].ToString())
                    {
                        return "0";
                    }
                    else
                    {
                        return dv[0]["F_CorrelDeviceIndex"].ToString();
                    }
                }

                return "";
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        /// <summary>
        /// 根据设备索引获得关联设备信息集合《关联设备索引,信息数组》,信息数组:【0】设备索引【1】顶升高位检测【2】顶升低位检测
        /// 【3】有物检测【4】运行监测【5】近巷道有物检测【6】远巷道有物检测【7】是否使用远货叉【8】关联设备索引
        /// </summary>
        /// <param name="DeviceIndex">设备索引</param>
        /// <param name="ownCorrel">是否自关联</param>
        /// <returns></returns>
        public Dictionary<int, string[]> GetCorrel_DeviceInfo(int DeviceIndex, bool ownCorrel)
        {
            Dictionary<int, string[]> Dicrr = new Dictionary<int,string[]>();
            string[] rr = new string[9];
            DataView dv = new DataView();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT * FROM T_Base_Lane_Gate  where  F_CorrelDeviceIndex like '%").Append(DeviceIndex).Append("%'");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                for (int i = 0; i < dv.Count;i++ )
                {
                    rr[0] = dv[i]["F_LaneGateDeviceIndex"].ToString();
                    rr[1] = dv[i]["F_HighDetect"].ToString();
                    rr[2] = dv[i]["F_LowDetect"].ToString();
                    rr[3] = dv[i]["F_HavingDetect"].ToString();
                    rr[4] = dv[i]["F_RunDetect"].ToString();
                    rr[5] = dv[i]["F_NearDetect"].ToString();
                    rr[6] = dv[i]["F_FarDetect"].ToString();
                    rr[7] = dv[i]["F_UseAwayFork"].ToString();
                    rr[8] = dv[i]["F_CorrelDeviceIndex"].ToString();
                    if (ownCorrel == true)
                    {
                        if (dv[i]["F_LaneGateDeviceIndex"].ToString() == DeviceIndex.ToString())
                        {
                            Dicrr.Add(Convert.ToInt32(dv[i]["F_LaneGateDeviceIndex"]), rr);
                            return Dicrr;
                        }
                        else
                        {
                            return null;
                        }
                    }
                    else
                    {
                        Dicrr.Add(Convert.ToInt32(dv[i]["F_LaneGateDeviceIndex"]), rr);

                    }
                }
                return Dicrr;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        /// <summary>
        /// 根据设备索引获得自关联设备信息:【0】设备索引【1】顶升高位检测【2】顶升低位检测
        /// 【3】有物检测【4】运行监测【5】近巷道有物检测【6】远巷道有物检测【7】是否使用远货叉【8】关联设备索引 qdsr  GGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
        /// <param name="DeviceIndex">设备索引</param>
        /// <returns></returns>
        public string[] GetOwnCorrel_DeviceInfo(int DeviceIndex)
        {
            
            string[] rr = new string[9];
            DataView dv = new DataView();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT * FROM T_Base_Lane_Gate  where F_LaneGateDeviceIndex=").Append(DeviceIndex).Append(" and  F_CorrelDeviceIndex =  '").Append(DeviceIndex).Append("'");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if(dv.Count>0){
                    rr[0] = dv[0]["F_LaneGateDeviceIndex"].ToString();
                    rr[1] = dv[0]["F_HighDetect"].ToString();
                    rr[2] = dv[0]["F_LowDetect"].ToString();
                    rr[3] = dv[0]["F_HavingDetect"].ToString();
                    rr[4] = dv[0]["F_RunDetect"].ToString();
                    rr[5] = dv[0]["F_NearDetect"].ToString();
                    rr[6] = dv[0]["F_FarDetect"].ToString();
                    rr[7] = dv[0]["F_UseAwayFork"].ToString();
                    rr[8] = dv[0]["F_CorrelDeviceIndex"].ToString();
                    
                    return rr;
                    
                }
                return null;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        public int GetOldDevcieFromStackCorr(int mankind, int fid, int taskindex)
        {
            if (CStaticClass.DBFactory == "OracleDBFactory")
            {//调度系统oracle的特殊语句 oracle YB2
                sql = new StringBuilder(string.Format("SELECT F_ManageTASKKINDINDEX,F_ManageTaskIndex,F_MonitorIndex, F_DeviceIndex,F_NumParam1,F_NumParam2,F_NumParam3 FROM T_Monitor_Task WHERE rownum=1 and F_ManageTASKKINDINDEX={0} and F_ManageTaskIndex={1} and (F_MonitorIndex > {2}) ORDER BY F_MonitorIndex", mankind, fid, taskindex));
            }
            else
            {
                sql = new StringBuilder(string.Format("SELECT TOP 1 F_ManageTASKKINDINDEX,F_ManageTaskIndex,F_MonitorIndex, F_DeviceIndex,F_NumParam1,F_NumParam2,F_NumParam3 FROM T_Monitor_Task WHERE F_ManageTASKKINDINDEX={0} and F_ManageTaskIndex={1} and (F_MonitorIndex > {2}) ORDER BY F_MonitorIndex", mankind, fid, taskindex));
            }
            DataView dvr = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;//20151120调度系统oracle的特殊语句
            if (dvr.Count > 0)
            {
                int laneway =GetLaneWayNoFromStack( Convert.ToInt32(dvr[0]["F_DeviceIndex"]));

                int[] zxy = GetCoordinatesFromMonitorTask(taskindex);
                StringBuilder zxystr = new StringBuilder();
                if (zxy != null)
                {
                    zxystr.Append((zxy[0].ToString().Length == 1 ? "0" + zxy[0].ToString() : zxy[0].ToString())).Append("-").Append(
                        ((zxy[1].ToString().Length == 1) ? ("0" + zxy[1].ToString()) : (zxy[1].ToString()))).Append("-").Append(
                        ((zxy[2].ToString().Length == 1) ? ("0" + zxy[2].ToString()) : (zxy[2].ToString())));
                }
                DataView dv = dbo.ExceSQL(string.Format("SELECT F_LaneGateDeviceIndex FROM T_Base_Lane_Gate WHERE (F_LaneIndex = {0}) AND (F_ZXY = '{1}')",laneway,zxystr.ToString())).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["F_LaneGateDeviceIndex"]);
                }
                else
                {
                    return -1;
                }
            }
            else
            {
                return -1;
            }
        }
        public int GetLaneWayNoFromStack(int stackNo)
        {
            devinfo = Model.CGetInfo.GetDeviceInfo(stackNo);
            if (devinfo.VirtualStack >0)
            {
                stackNo = devinfo.VirtualStack;
            }
            sql.Clear();
            sql.Append("SELECT F_LaneDeviceIndex FROM T_Base_LaneInfo where f_stackindex=").Append(stackNo);
            DataView dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
            if (dv.Count > 0)
            {
                return Convert.ToInt32(dv[0]["F_LaneDeviceIndex"]);
            }
            else
            {
                return -1;
            }
        }
        /// <summary>
        /// 是否为多叉堆垛机的取货站台
        /// </summary>
        /// <param name="device"></param>
        /// <returns></returns>
        public bool IfMutiForkStackGetDevice(int device)
        {
            DataView dv = dbo.ExceSQL(string.Format("SELECT F_LaneGateDeviceIndex FROM T_Base_Lane_Gate WHERE (F_CorrelDeviceIndex LIKE '%{0}%') AND (F_UseAwayFork > '0')",device)).Tables[0].DefaultView;
            if (dv.Count > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// 根据设备指令索引反馈堆垛机的送货坐标是否为极限货位
        /// </summary>
        /// <param name="TaskIdx"></param>
        /// <returns></returns>
        public bool IfLimitCellCode(int TaskIdx)
        {
            int[] zxy = GetCoordinatesFromMonitorTask(TaskIdx);
            if (zxy != null)
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT F_LaneDeviceIndex FROM T_Base_LaneInfo WHERE (F_ForwardLimitX = " ).Append( zxy[4] ).Append( ") OR (F_BackLimitX =  " ).Append( zxy[4] ).Append( ")");
                object ob = dbo.GetSingle(sql.ToString());
                if (ob != null)
                {
                    return true;
                }

            }
            return false;
        }
#endregion
        #region 读取设备状态
        /// <summary>
        /// 20110608获取超时运行的调度设备指令
        /// </summary>
        /// <param name="monitorIndex"></param>
        /// <returns></returns>
        public int GetMonitorTaskIndexFromRunTimeoutDevice(int deviceindex)
        {
            try
            {
                sql.Remove(0, sql.Length);
                sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE DATEDIFF(minute,CONVERT(datetime,SUBSTRING(F_StartTime, 1, 19)),getdate())>").Append(int.Parse(CStaticClass.TransportTimeout)).Append(" and F_StartTime<>'-' and F_Status>0 and F_DeviceIndex = ").Append(deviceindex);
                object ob = dbo.GetSingle(sql.ToString());
                if (ob != null)
                {
                    return int.Parse(ob.ToString());
                }
                else
                {
                    return -1;
                }
            }
            catch
            {
                return -1;
            }
        }
        public int GetMonitorTaskIndexFromSendedDevice(int deviceindex)
        {
            try
            {
                sql.Remove(0, sql.Length);
                sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE F_Status=1 and F_DeviceIndex = ").Append(deviceindex);
                object ob = dbo.GetSingle(sql.ToString());
                if (ob != null)
                {
                    return int.Parse(ob.ToString());
                }
                else
                {
                    return -1;
                }
            }
            catch
            {
                return -1;
            }
        }
        /// <summary>
        /// 20110309获得调度任务的条码
        /// </summary>
        /// <param name="taskindex">设备指令索引</param>
        /// <returns></returns>
        public string GetBarCodeFromMonitor(int taskindex)
        {
            object  ob = dbo.GetSingle(string.Format( "SELECT F_TxtParam FROM T_Monitor_Task WHERE (F_MonitorIndex = {0})",taskindex));
            if (ob != null)
            {
                return ob.ToString();
            }
            else
            {
                return "-";
            }
        }
        //20160501 以下
        public int GetMobileRunTimeSpan(int TaskIdx)
        {
            DateTime dt, dt0 = DateTime.Now;
            int dat = 0;
            if (DateTime.TryParse(GetStartTimeFromMonitor(TaskIdx), out dt) == true)
            {
                TimeSpan ts1 = new TimeSpan(dt0.Ticks);
                TimeSpan ts2 = new TimeSpan(dt.Ticks);
                dat = (int)ts1.Subtract(ts2).Duration().TotalSeconds;

            }
            return dat;

        }
        public int GetErrorTimeSpan(int deviceindex)
        {
            DateTime dt, dt0 = DateTime.Now;
            int dat = 0;
            if (DateTime.TryParse(GetTimeFromDevice(deviceindex, "F_ErrorStartTime"), out dt) == true)
            {
                TimeSpan ts1 = new TimeSpan(dt0.Ticks);
                TimeSpan ts2 = new TimeSpan(dt.Ticks);
                dat = (int)ts1.Subtract(ts2).Duration().TotalSeconds;

            }
            return dat;

        }
        public int GetAlarmTimeSpan(int deviceindex)
        {
            DateTime dt, dt0 = DateTime.Now;
            int dat = 0;
            if (DateTime.TryParse(GetTimeFromDevice(deviceindex, "F_AlarmStartTime"), out dt) == true)
            {
                TimeSpan ts1 = new TimeSpan(dt0.Ticks);
                TimeSpan ts2 = new TimeSpan(dt.Ticks);
                dat = (int)ts1.Subtract(ts2).Duration().TotalSeconds;

            }
            return dat;

        }
        public int GetConveyorRunTimeSpan(int deviceindex)
        {
            DateTime dt, dt0 = DateTime.Now;
            int dat = 0;
            if (DateTime.TryParse(GetTimeFromDevice(deviceindex, "F_ConveyorRunStartTime"), out dt) == true)
            {
                TimeSpan ts1 = new TimeSpan(dt0.Ticks);
                TimeSpan ts2 = new TimeSpan(dt.Ticks);
                dat = (int)ts1.Subtract(ts2).Duration().TotalSeconds;

            }
            return dat;

        }
        public int GetScheduledRepairTimeSpan(int deviceindex)
        {
            DateTime dt, dt0 = DateTime.Now;
            int dat = 0;
            if (DateTime.TryParse(GetTimeFromDevice(deviceindex, "F_ScheduledRepairStartTime"), out dt) == true)
            {
                TimeSpan ts1 = new TimeSpan(dt0.Ticks);
                TimeSpan ts2 = new TimeSpan(dt.Ticks);
                dat = (int)ts1.Subtract(ts2).Duration().TotalSeconds;

            }
            return dat;

        }
        public string GetTimeFromDevice(int deviceIndex, string timeKind)
        {
            DataView dv = dbo.ExceSQL(string.Format("SELECT {1} FROM  T_Base_Device where F_DeviceIndex ={0} and {1} <>'-'", deviceIndex, timeKind)).Tables[0].DefaultView;
            if (dv.Count > 0)
            {
                return dv[0][0].ToString().Substring(0, 19);
            }
            else
            {
                return "-";
            }
        }
        /// <summary>
        /// 获取设备指令队列的开始执行时间
        /// </summary>
        /// <param name="taskindex">设备指令索引</param>
        /// <returns></returns>
        public string GetStartTimeFromMonitor(int taskindex)
        {
            object ob = dbo.GetSingle(string.Format("SELECT F_StartTime FROM T_Monitor_Task WHERE (F_MonitorIndex = {0}) and  F_IfSync != 1", taskindex));
            if (ob != null)
            {
                if (ob.ToString() != "-")
                {
                    return ob.ToString().Substring(0, 19);
                }
                else
                {
                    return ob.ToString();
                }
            }
            else
            {
                return "-";
            }
        }
        //20160501 以上
        public int GetExceptionNOFromManageTask(int FID,int ManTaskKind)
        {
            //20100108
            DataTable dt = new DataTable();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT FID, F_ManageTaskKindIndex, FExceptionNO FROM T_Manage_Task WHERE (FID = " ).Append( FID ).Append( ") AND (F_ManageTaskKindIndex = " ).Append( ManTaskKind ).Append( ") ");
                //20100108
                dt = dbo.ExceSQL(sql.ToString()).Tables[0];
                if (dt.Rows.Count > 0)
                {
                    if (dt.Rows[0]["FExceptionNO"] == DBNull.Value)
                    {
                        return -1;
                    }
                    else
                    {

                        return Convert.ToInt32(dt.Rows[0]["FExceptionNO"]);
                    }
                }
                else
                {
                    return -1;
                }
            }
            catch (Exception ex)
            {
                _DisassembleTaskError = "获得指定调度任务的异常代码:" + ex.Message;
                throw ex;
                //return 0;
            }
            finally
            {//20100108
                dt.Dispose();
                
            }
        }
        public string GetBarCodeFromManageTask(int FID, int ManTaskKind)
        {
            //20100108
            DataTable dt = new DataTable();
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT FPALLETBARCODE FROM T_Manage_Task WHERE (FID = ").Append(FID).Append(") AND (F_ManageTaskKindIndex = ").Append(ManTaskKind).Append(") ");
                //20100108
                dt = dbo.ExceSQL(sql.ToString()).Tables[0];
                if (dt.Rows.Count > 0)
                {
                    if (dt.Rows[0]["FPALLETBARCODE"] == DBNull.Value)
                    {
                        return "-";
                    }
                    else
                    {

                        return dt.Rows[0]["FPALLETBARCODE"].ToString();
                    }
                }
                else
                {
                    return "-";
                }
            }
            catch (Exception ex)
            {
                _DisassembleTaskError = "获得指定调度任务的条码:" + ex.Message;
                throw ex;
               
            }
            finally
            {//20100108
                dt.Dispose();

            }
        }
        #endregion
        #region 获得调度任务
        /// <summary>
        /// 获取调度生成的调度任务的索引
        /// </summary>
        /// <returns></returns>
        public int GetTempManageIdx()
        {
            //20100108
            DataSet ds = new DataSet();
            try
            {
                int maxIdx = 10001;

                ds = dbo.ExceSQL("SELECT F_ManageTaskIndex FROM T_BASE_MANAGE_TASK_INDEX_TEMP_task");
                if (ds.Tables[0].DefaultView.Count > 0)
                {
                    if ((Convert.ToInt32(ds.Tables[0].DefaultView[0]["F_ManageTaskIndex"]) + 1) >= 19998)
                    {
                        maxIdx = 10001;
                    }
                    else
                    {
                        maxIdx = (Convert.ToInt32(ds.Tables[0].DefaultView[0]["F_ManageTaskIndex"]) + 1);
                    }
                }
                else
                {
                    maxIdx = 10001;
                }
                //判断临时调度任务表是否有重复值
                if (IFExitTempManageIndex(maxIdx) == true)
                {
                    RecordMaxTempManageTaskFID(maxIdx);
                    maxIdx = GetTempManageIdx();
                    return maxIdx;
                }

                RecordMaxTempManageTaskFID(maxIdx);
                return maxIdx;
            }
            catch (Exception ex)
            {//20100108
                _DisassembleTaskError = "获得指定调度任务的临时任务索引失败," + ex.Message;
                throw ex;
                //return 0;
            }
            finally
            {//20100108
                ds.Dispose();
            }

        }
        /// <summary>
        /// 获得库房索引
        /// </summary>
        /// <returns></returns>
        public string  GetWarehouseIndex()
        {
            //20100108
            DataView dv = new DataView();
            try
            {
                //20100108
                dv = dbo.ExceSQL("select F_WarehouseIndex from T_Warehouse").Tables[0].DefaultView;
                if (dv.Count > 0)
                {

                    return dv[0]["F_WarehouseIndex"].ToString();

                }
                else
                {
                    return "1";
                }
            }
            catch (Exception ex)
            {//20100108
                _DisassembleTaskError = "获得指定库房索引失败," + ex.Message;
                throw ex;
                //return 0;
            }
            finally
            {//20100108
                dv.Dispose();
            }

        }
        public string GetWarehouseIndex(int laneway, string cellcode)
        {
            object ob = dbo.GetSingle(string.Format("SELECT FWAREHOUSE FROM ST_CELL WHERE (FLaneWay = {0}) AND (FCELLCODE = '{1}')",laneway,cellcode));
            if (ob != null)
            {
                return ob.ToString();
            }
            else
            {
                return "-";
            }
        }
        /// <summary>
        /// 记录调度生成的调度任务的索引的最大值
        /// </summary>
        /// <param name="fid">调度生成的调度任务的索引</param>
        public void RecordMaxTempManageTaskFID(int fid)
        {//20100108
            DataView dv = new DataView();
            try
            {//20100108
                dv = dbo.ExceSQL("select F_ManageTaskIndex from T_BASE_MANAGE_TASK_INDEX_TEMP_task").Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    //if (fid == 19998)
                    //{
                    //    dbo.ExceSQL("UPDATE T_Base_Manage_Task_Index_Temp_Task SET F_ManageTaskIndex =10001");
                    //    return;
                    //}
                    //if (fid > Convert.ToInt32(dv[0]["F_ManageTaskIndex"]))
                    //{
                    //20101124
                    sql.Remove(0, sql.Length);
                    sql.Append("UPDATE T_BASE_MANAGE_TASK_INDEX_TEMP_task SET F_ManageTaskIndex =").Append(fid);
                    dbo.ExceSQL(sql.ToString());
                    return;
                    //}
                }
                else
                {
                    //20101124
                    sql.Remove(0, sql.Length);
                    sql.Append("INSERT INTO T_BASE_MANAGE_TASK_INDEX_TEMP_task (F_ManageTaskIndex)VALUES (").Append(fid).Append(")");
                    dbo.ExceSQL(sql.ToString());
                    return;
                }
            }
            catch (Exception ex)
            {//20100108
                _DisassembleTaskError = "获得记录调度任务最大任务索引失败," + ex.Message;
                throw ex;
                //return 0;
            }
            finally
            {//20100108
                dv.Dispose();
            }
        }
        /// <summary>
        /// 判断这个货位在ST_CELL是否存在
        /// </summary>
        /// <param name="FWAREHOUSE"></param>
        /// <param name="FLaneWay"></param>
        /// <param name="FCELLCODE"></param>
        /// <returns></returns>
        public bool QueryCellIfExit(string FWAREHOUSE, int FLaneWay, string FCELLCODE)
        {
            
            
            char[] cc = new char[1] { '-' };
            string[] fcc = FCELLCODE.Split(cc);
            if (fcc.GetUpperBound(0) < 2) return false;
            int[] fcci = new int[fcc.GetUpperBound(0) + 1];
            //20100108
            DataView dv = new DataView();
            try
            {
                for (int i = fcc.GetLowerBound(0); i <= fcc.GetUpperBound(0); i++)
                {
                    fcci[i] = Convert.ToInt32(fcc[i]);
                }
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT FWAREHOUSE, FCELLCODE, FCELLSTATUS ").Append(
                        " FROM ST_CELL Where FWAREHOUSE='" ).Append( FWAREHOUSE ).Append( "'  and FLaneWay=" ).Append( FLaneWay ).Append( "  and F_Z=" ).Append(
                        fcci[0] ).Append( " and F_X=" ).Append( fcci[1]).Append( " and F_Y=" ).Append( fcci[2] );
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }

            }
            catch (Exception ex)
            {//20100108
                _DisassembleTaskError = "查询货位是否存在失败," + ex.Message;
                throw ex;
                //return 0;
            }
            finally
            {//20100108
                dv.Dispose();
                cc =null ;
                fcc =null ;
                fcci = null;
            }
        }

        /// <summary>
        /// 查询货位状态是否满足入库或者出库条件
        /// </summary>
        /// <param name="FWAREHOUSE">库房编号</param>
        /// <param name="FCELLCODE">货位编号</param>
        /// <param name="IOType">"1":入库(放货);"2":出库(取货)</param>
        /// <returns></returns>
        public bool QueryCellStatusIfAccord(string FWAREHOUSE,int FLaneWay, string FCELLCODE, string IOType)
        {

            char[] cc = new char[1] { '-' };
            string[] fcc = FCELLCODE.Split(cc);
            if (fcc.GetUpperBound(0) < 2) return false;
            int[] fcci = new int[fcc.GetUpperBound(0) + 1];
            //20100108
            DataView dv = new DataView();
            try
            {
                for (int i = fcc.GetLowerBound(0); i <= fcc.GetUpperBound(0); i++)
                {
                    fcci[i] = Convert.ToInt32(fcc[i]);
                }
                if (IOType == "1")//入库(放货)
                {
                    //20101124
                    sql.Remove(0, sql.Length);
                    sql.Append("SELECT FWAREHOUSE, FCELLCODE, FCELLSTATUS " +
                        " FROM ST_CELL Where FWAREHOUSE='" ).Append( FWAREHOUSE ).Append( "'  and FLaneWay=" ).Append( FLaneWay ).Append( "  and F_Z=" ).Append(
                        fcci[0] ).Append( " and F_X=").Append( fcci[1] ).Append( " and F_Y=" ).Append( fcci[2] ).Append( "  and FCELLSTATUS='0'");
                    dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                    if (dv.Count > 0)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                else//if (IOType == "2")//出库(取货)
                {
                    //20101124
                    sql.Remove(0, sql.Length);
                    sql.Append("SELECT FWAREHOUSE, FCELLCODE, FCELLSTATUS " ).Append(
                        " FROM ST_CELL Where FWAREHOUSE='" ).Append( FWAREHOUSE ).Append( "'  and FLaneWay=" ).Append( FLaneWay ).Append( "  and F_Z='" ).Append(
                        fcci[0] ).Append( "' and F_X='" ).Append( fcci[1] ).Append( "' and F_Y='" ).Append( fcci[2] ).Append( "'  and FCELLSTATUS='1'");
                    dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                    if (dv.Count > 0)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
            catch (Exception ex)
            {//20100108
                _DisassembleTaskError = "查询货位状态失败," + ex.Message;
                throw ex;
                //return 0;
            }
            finally
            {//20100108
                dv.Dispose();
                cc = null;
                fcc = null;
                fcci = null;
            }
        }
        /// <summary>
        /// 设置货位状态
        /// </summary>
        /// <param name="FWAREHOUSE"></param>
        /// <param name="FCELLCODE"></param>
        /// <param name="FCELLSTATUS"></param>
        public void SetCellStatus(string FWAREHOUSE, int FLaneWay, string FCELLCODE, string FCELLSTATUS)
        {
            char[] cc = new char[1] { '-' };
            string[] fcc = FCELLCODE.Split(cc);
            int[] fcci = new int[fcc.GetUpperBound(0) + 1];
            try
            {//20100108
                for (int i = fcc.GetLowerBound(0); i <= fcc.GetUpperBound(0); i++)
                {
                    fcci[i] = Convert.ToInt32(fcc[i]);
                }
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("UPDATE ST_CELL SET  FCELLSTATUS ='" ).Append( FCELLSTATUS ).Append( "' where  FWAREHOUSE='" ).Append( FWAREHOUSE ).Append( "'  and FLaneWay=" ).Append( FLaneWay ).Append( "  and F_Z='" ).Append(
                        fcci[0] ).Append( "' and F_X='" ).Append( fcci[1] ).Append( "' and F_Y='" ).Append( fcci[2] ).Append( "' ");
                dbo.ExceSQL(sql.ToString());
            }
            catch (Exception ex)
            {//20100108
                throw ex;
            }
            finally
            {//20100108
                cc = null;
                fcc = null;
                fcci = null;
            }
        }
        /// <summary>
        /// 查询运行状态是否符合条件
        /// </summary>
        /// <param name="FWAREHOUSE"></param>
        /// <param name="FCELLCODE"></param>
        /// <returns></returns>
        public bool QueryRunStatusIfAccord(string FWAREHOUSE, int FLaneWay, string FCELLCODE)
        {
            char[] cc = new char[1] { '-' };
            string[] fcc = FCELLCODE.Split(cc);
            int[] fcci = new int[fcc.GetUpperBound(0) + 1];
            DataView dv = new DataView(); ;//20100108
            try
            {//20100108
                for (int i = fcc.GetLowerBound(0); i <= fcc.GetUpperBound(0); i++)
                {
                    fcci[i] = Convert.ToInt32(fcc[i]);
                }
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT FWAREHOUSE, FCELLCODE, FCELLSTATUS ").Append(
                        " FROM ST_CELL Where FWAREHOUSE='" ).Append( FWAREHOUSE ).Append( "' and FLaneWay=" ).Append( FLaneWay ).Append( "  and F_Z='" ).Append(
                        fcci[0]).Append( "' and F_X='" ).Append( fcci[1] ).Append( "' and F_Y='" ).Append( fcci[2] ).Append( "' and FRUNSTATUS='0'");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception ex)
            {//20100108
                throw ex;
            }
            finally
            {//20100108
                cc = null;
                fcc = null;
                fcci = null;
                dv.Dispose();
            }
        }
        /// <summary>
        /// 设置货位运行状态
        /// </summary>
        /// <param name="FWAREHOUSE"></param>
        /// <param name="FCELLCODE"></param>
        /// <param name="FRUNSTATUS"></param>
        public void SetRunStatus(string FWAREHOUSE, int FLaneWay, string FCELLCODE, string FRUNSTATUS)
        {
            char[] cc = new char[1] { '-' };
            string[] fcc = FCELLCODE.Split(cc);
            int[] fcci = new int[fcc.GetUpperBound(0) + 1];
            try
            {//20100108
                for (int i = fcc.GetLowerBound(0); i <= fcc.GetUpperBound(0); i++)
                {
                    fcci[i] = Convert.ToInt32(fcc[i]);
                }
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("UPDATE ST_CELL SET  FRUNSTATUS  ='" ).Append( FRUNSTATUS ).Append( "' where  FWAREHOUSE='" ).Append( FWAREHOUSE ).Append( "' and FLaneWay=" ).Append( FLaneWay).Append( " and F_Z='" ).Append(
                        fcci[0] ).Append( "' and F_X='" ).Append( fcci[1] ).Append( "' and F_Y='" ).Append( fcci[2] ).Append( "'");
                dbo.ExceSQL(sql.ToString());
            }
             
            catch (Exception ex)
            {//20100108
                throw ex;
            }
            finally
            {//20100108
                cc = null;
                fcc = null;
                fcci = null;
            }
        }

        public int GetSerialNumberFromRouteDevice(int RouteIDSub, int DeviceIndex)
        {
            DataView dv = new DataView();//20100108
            try
            {
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT F_SerialNumber FROM T_Base_Route_Device WHERE (F_RouteIDSub = " ).Append( RouteIDSub ).Append( ") AND (F_DeviceIndex = " ).Append( DeviceIndex ).Append( ")");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return (int)dv[0]["F_SerialNumber"];
                }
                else
                {
                    return -1;
                }
            }
            catch (Exception ex)
            {//20100108
                throw ex;
            }
            finally
            {//20100108
                dv.Dispose();
            }
        }
        #endregion
        public string[] GetLanewayDeviceInfoFromDev(int device)
        {
            DataView dvl = new DataView(); DataView dv = new DataView();
            try
            {
                //int laneway = 0;
                //dvl = dbo.ExceSQL(string.Format("SELECT F_LaneDeviceIndex FROM T_Base_LaneInfo WHERE (F_StackIndex = {0})", stack)).Tables[0].DefaultView;
                //if (dvl.Count > 0)
                //{
                //    laneway = Convert.ToInt32(dvl[0][0]);
                //}
                //else
                //{
                //    return null;
                //}
                string[] rr = new string[10];

                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT * FROM T_Base_Lane_Gate where F_CorrelDeviceIndex<>'' and (T_Base_Lane_Gate.F_LaneGateDeviceIndex = ").Append(device).Append(")");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    rr[0] = dv[0]["F_LaneGateDeviceIndex"].ToString();
                    rr[1] = dv[0]["F_HighDetect"].ToString();
                    rr[2] = dv[0]["F_LowDetect"].ToString();
                    rr[3] = dv[0]["F_HavingDetect"].ToString();
                    rr[4] = dv[0]["F_RunDetect"].ToString();
                    rr[5] = dv[0]["F_NearDetect"].ToString();
                    rr[6] = dv[0]["F_FarDetect"].ToString();
                    rr[7] = dv[0]["F_UseAwayFork"].ToString();
                    rr[8] = dv[0]["F_CorrelDeviceIndex"].ToString();
                    rr[9] = dv[0]["F_zxy"].ToString();
                    return rr;
                }
                else

                    return null;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
                dvl.Dispose();
            }
        }


        public int GetManTaskReserve(int deviceIndex)
        {//20111020
            object ob = dbo.GetSingle(string.Format("SELECT F_ManTaskReserve FROM T_Base_Device WHERE (F_DeviceIndex = {0})",deviceIndex));
            if (ob != null)
            {
                return Convert.ToInt32(ob);
            }
            else
            {
                return 0;
            }
        }
        public int GetDeviceLockedState(int deviceIndex)
        {//20111020
            object ob = dbo.GetSingle(string.Format("SELECT F_LockedState FROM T_Base_Device WHERE (F_DeviceIndex = {0})", deviceIndex));
            if (ob != null)
            {
                return Convert.ToInt32(ob);
            }
            else
            {
                return 0;
            }
        }
        public int GetStackMutexDevice(int deviceIndex)
        {//20111020
            object ob = dbo.GetSingle(string.Format("SELECT F_Mutex FROM T_Base_StackInfo WHERE (F_StackIndex = {0})", deviceIndex));
            if (ob != null)
            {
                return Convert.ToInt32(ob);
            }
            else
            {
                return -1;
            }
        }

        /// <summary>
        /// 查找可能阻碍该任务的堆垛机编号
        /// </summary>
        /// <param name="deviceIndex">任务堆垛机</param>
        /// <param name="devicexcoorbarcode">任务堆垛机的坐标值</param>
        /// <param name="sequence">堆垛机的序列号</param>
        /// <param name="taskxcoorbarcode">任务对应位置的坐标值</param>
        /// <returns></returns>
        public int GetStackMutexDevice(int deviceIndex, int devicexcoorbarcode, int sequence, int taskxcoorbarcode,int vstack)
        {//20111020
            DataView dv = new DataView();
            try
            {
                string sql = string.Empty;
                //sql = string.Format();
               //int mutexindex=0;
                int mutexsequence=0;
                if (taskxcoorbarcode > devicexcoorbarcode)//任务坐标大于堆垛机坐标
                {
                    mutexsequence = sequence + 1;

                }
                else
                {
                    mutexsequence = sequence - 1;

                }
                sql = string.Format("SELECT F_StackIndex FROM T_Base_StackInfo WHERE (F_sequence = {0}) and  F_VirtualStack={1}", mutexsequence,vstack);

                dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["F_StackIndex"]);
                }
                else
                {
                    return -1;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        public int GetRouteIDsub(int device)
        {//20111020
            DataView dv = new DataView();
            try
            {
                dv = dbo.ExceSQL("SELECT F_RouteIDSub, F_DeviceIndex, F_RouteID FROM T_Base_Route_Device where F_DeviceIndex=" + device + "").Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["F_RouteIDSub"]);
                }
                else
                {
                    return -1;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        public void GetS7ConnectionRelativeAddressDataLenth(int deviceIndex,out string s7conn,out int relAddr,out int datalength)
        {
            DataView dv = new DataView();
            try
            {

                //lock (lockob)
                {
                    relAddr = 0; datalength = 0; s7conn = string.Empty;
                    s7conn = dbo.GetSingle(string.Format("select F_S7Connection   FROM T_Base_Device WHERE F_DeviceIndex={0}", deviceIndex)).ToString();
                    int db228 = Convert.ToInt32(dbo.GetSingle(string.Format("SELECT DISTINCT F_DBW2Address FROM T_Base_Device WHERE (F_DeviceKindIndex = 28 AND F_S7Connection = '{0}')", s7conn)));
                    dv = dbo.ExceSQL(string.Format("SELECT (F_DBW2Address -{0}) AS relAddr, F_DBWGetLength FROM T_Base_Device WHERE F_DeviceIndex={1}", db228, deviceIndex)).Tables[0].DefaultView;
                    if (dv.Count > 0)
                    {
                        relAddr = Convert.ToInt32(dv[0]["relAddr"]);
                        datalength = Convert.ToInt32(dv[0]["F_DBWGetLength"]);

                    }

                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
            
        }
        public void GetSplitByteRelativeAddress(int deviceIndex,string s7conn,  out int relAddr)
        {
            DataView dv = new DataView();
            try
            {
                //lock (lockob)
                {
                    relAddr = -1;
                    object ob = dbo.GetSingle(string.Format("(SELECT DISTINCT F_DBW2Address FROM T_Base_Device WHERE (F_DeviceKindIndex = 28 AND F_S7Connection = '{0}'))", s7conn));
                    dv = dbo.ExceSQL(string.Format("SELECT (F_SplitByte -{0}) AS relAddr FROM T_Base_Device WHERE F_SplitByte is not NULL and F_DeviceIndex={1}", Convert.ToInt32(ob), deviceIndex)).Tables[0].DefaultView;
                    if (dv.Count > 0)
                    {
                        relAddr = Convert.ToInt32(dv[0]["relAddr"]);

                    }
                    else
                    {
                        relAddr = -1;
                    }

                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
            
        }
        /// <summary>
        /// 201112105判断是否可以获得可用的路径子路经,并且实现改道
        /// </summary>
        /// <param name="manageTaskIdx">调度任务索引</param>
        /// <param name="manageKindIdx">任务类型索引</param>
        /// <param name="curLocation">当前设备索引</param>
        /// <returns></returns>
        public bool GetUseableRouteIDSubAndModifyRoute(int manageTaskIdx, int manageKindIdx, int curLocation)
        {
            DataView dvmi = new DataView();
            DataView DMAN = new DataView();
            DataView dvnew = new DataView();
            DataView dvc = new DataView();
            try
            {

                //20091005

                #region 调度任务存在
                //20091128
                sql.Remove(0, sql.Length);
                sql.Append("SELECT * FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX =").Append(1).Append(") order by F_MonitorIndex asc");
                dvmi = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dvmi.Count > 0)
                {//已经开始执行的需要更改调度任务
                    //判断申请修改路径的第一个调度任务:
                    int monitorIndex = (int)dvmi[0]["F_MonitorIndex"];
                    int associateMonitor = -1;
                    if (dvmi[0]["F_Associate"] != DBNull.Value)
                    {
                        associateMonitor = Convert.ToInt32(dvmi[0]["F_Associate"]);
                    }
                    int devindex = Convert.ToInt32(dvmi[0]["F_DeviceIndex"]);
                    int devKind = GetDeviceKindIdx(Convert.ToInt32(dvmi[0]["F_DeviceIndex"]));
                    int devCommand = Convert.ToInt32(dvmi[0]["F_DeviceCommandIndex"]);
                    int routeID = Convert.ToInt32(dvmi[0]["F_RouteID"]);
                    int NumParam1 = Convert.ToInt32(dvmi[0]["F_NumParam1"]);
                    int NumParam4 = Convert.ToInt32(dvmi[0]["F_NumParam4"]);
                    string AheadDetect = dvmi[0]["F_AheadDetect"].ToString();

                    //20091128
                    sql.Remove(0, sql.Length);
                    sql.Append("select * from T_Manage_Task WHERE (FID = ").Append(manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX =").Append(manageKindIdx).Append(")");
                    DMAN = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                    if (DMAN.Count > 0)
                    {


                        //20091005
                        int routeidNew = CDisassembleTask.MinRouteID(Convert.ToInt32(DMAN[0]["FSTARTDEVICE"]), Convert.ToInt32(DMAN[0]["FENDDEVICE"]), curLocation);

                        if (routeidNew == -1)
                        {
                            //20091005
                            return false;
                        }
                        //20091005
                        //删除原来的申请修改路径任务,拆分新的任务并且只保留现有设备开始的任务
                        sql.Remove(0, sql.Length);
                        sql.Append("DELETE FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX =").Append(manageKindIdx).Append(")");
                        dbo.ExceSQL(sql.ToString());
                        //20090910
                        if (CDisassembleTask.CreateMonitor(manageKindIdx, manageTaskIdx, routeidNew, DMAN[0], 3) <= 0)
                        {
                            //重新生成申请修改路径的申请任务
                            sql.Remove(0, sql.Length);
                            sql.Append("INSERT INTO T_Monitor_Task ").Append(
                                        "(F_ManageTaskIndex, F_ManageTASKKINDINDEX, F_MonitorIndex,F_MonitorTaskLevel,").Append(
                                        " F_DeviceIndex, F_DeviceCommandIndex, F_RouteID, F_Status,F_NumParam1, F_NumParam4,").Append(
                                        " F_AheadDetect,F_TxtParam)").Append(
                                    "VALUES (").Append(manageTaskIdx).Append(",").Append(manageKindIdx).Append(",").Append(monitorIndex).Append(",1,").Append(devindex).Append(",").Append(devCommand).Append(",").Append(routeID).Append(",3,").Append(NumParam1).Append(",").Append(NumParam4
                                        ).Append(",'").Append(AheadDetect).Append("','").Append(DMAN[0]["FPALLETBARCODE"]).Append("')");
                            dbo.ExceSQL(sql.ToString());
                            return false;
                        }

                        if (devKind == 4)
                        {
                            if (devCommand == 7)
                            {
                                int RGVsn = GetSerialNumberFromRouteDevice(routeID, devindex);
                                int Consn = GetSerialNumberFromRouteDevice(routeID, NumParam1);

                                #region RGV运动到接货点
                                if (RGVsn > Consn)
                                {
                                    //删除RGV运动到接货点之前的任务
                                    //20091128
                                    sql.Remove(0, sql.Length);
                                    sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(
                                        manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) AND (F_DeviceIndex = ").Append(
                                        devindex).Append(") AND (F_DeviceCommandIndex = 7) AND (F_RouteID = ").Append(routeidNew).Append(
                                        ")  AND (F_NumParam1 = ").Append(NumParam1).Append(")");
                                    dvnew = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                    if (dvnew.Count > 0)
                                    {
                                        sql.Remove(0, sql.Length);
                                        sql.Append("delete from T_Monitor_Task where F_MonitorIndex<").Append(dvnew[0]["F_MonitorIndex"]).Append(" and (F_ManageTaskIndex = ").Append(
                                        manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) ");
                                        dbo.ExceSQL(sql.ToString());
                                        sql.Remove(0, sql.Length);
                                        sql.Append("update  T_Monitor_Task set F_Status =0 where (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) ");
                                        dbo.ExceSQL(sql.ToString());
                                    }

                                }
                                #endregion

                                #region RGV运动到送货点
                                if (RGVsn < Consn)
                                {
                                    //删除RGV运动到送货点之前的任务
                                    //DataView dvnew = dbo.ExceSQL("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = " +
                                    //    manageTaskIdx + ") AND (F_ManageTASKKINDINDEX = 1) AND (F_DeviceIndex = " +
                                    //    devindex + ") AND (F_DeviceCommandIndex = 7) AND (F_RouteID = " + routeidNew +
                                    //    ") AND (F_Status = 3)  AND (F_NumParam1 <> " + NumParam1 + ")").Tables[0].DefaultView;
                                    int RGVsn1 = GetSerialNumberFromRouteDevice(routeidNew, devindex);
                                    //找到接货输送机设备索引
                                    List<int> nextcon = CDisassembleTask.GetNextDevice(routeidNew, RGVsn1);
                                    int condev = nextcon[0];
                                    //删除RGV运动到送货点之前的任务
                                    //20091128
                                    sql.Remove(0, sql.Length);
                                    sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(
                                        manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) AND (F_DeviceIndex = ").Append(
                                        devindex).Append(") AND (F_DeviceCommandIndex = 7) AND (F_RouteID = ").Append(routeidNew).Append(
                                        ")  AND (F_NumParam1 = ").Append(condev).Append(")");
                                    dvnew = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                    if (dvnew.Count > 0)
                                    {
                                        sql.Remove(0, sql.Length);
                                        sql.Append("delete from T_Monitor_Task where F_MonitorIndex<").Append(dvnew[0]["F_MonitorIndex"]).Append(" and (F_ManageTaskIndex = ").Append(
                                        manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                                        dbo.ExceSQL(sql.ToString());
                                        sql.Remove(0, sql.Length);
                                        sql.Append("update  T_Monitor_Task set F_Status =0 where (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                                        dbo.ExceSQL(sql.ToString());
                                    }
                                }
                                #endregion
                            }

                            #region RGV送货

                            if ((devCommand == 3) || (devCommand == 5))
                            {
                                int RGVsn = GetSerialNumberFromRouteDevice(routeidNew, devindex);
                                //找到接货输送机设备索引
                                List<int> nextcon = CDisassembleTask.GetNextDevice(routeidNew, RGVsn);
                                int condev = nextcon[0];
                                //删除RGV运动到送货点之前的任务
                                //20091128
                                sql.Remove(0, sql.Length);
                                sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) AND (F_DeviceIndex = ").Append(
                                    devindex).Append(") AND (F_DeviceCommandIndex = 7) AND (F_RouteID = ").Append(routeidNew).Append(
                                    ")  AND (F_NumParam1 = ").Append(condev).Append(")");
                                dvnew = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                if (dvnew.Count > 0)
                                {
                                    sql.Remove(0, sql.Length);
                                    sql.Append("delete from T_Monitor_Task where F_MonitorIndex<").Append(dvnew[0]["F_MonitorIndex"]).Append(" and (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) ");
                                    dbo.ExceSQL(sql.ToString());
                                    sql.Remove(0, sql.Length);
                                    sql.Append("update  T_Monitor_Task set F_Status =0 where (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                                    dbo.ExceSQL(sql.ToString());
                                }

                            }
                            #endregion

                            #region RGV接货
                            if ((devCommand == 2) || (devCommand == 4))
                            {
                                int RGVsn = GetSerialNumberFromRouteDevice(routeidNew, devindex);
                                //找到送货输送机设备索引
                                List<int> priorcon = CDisassembleTask.GetPriorDevice(routeidNew, RGVsn);
                                int condev = priorcon[0];
                                //删除RGV运动到接货点之前的任务
                                //20091128
                                sql.Remove(0, sql.Length);
                                sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) AND (F_DeviceIndex = ").Append(
                                    devindex).Append(") AND (F_DeviceCommandIndex = 7) AND (F_RouteID = ").Append(routeidNew).Append(
                                    ")  AND (F_NumParam1 = ").Append(condev).Append(")");
                                dvnew = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                if (dvnew.Count > 0)
                                {
                                    sql.Remove(0, sql.Length);
                                    sql.Append("delete from T_Monitor_Task where F_MonitorIndex<").Append(dvnew[0]["F_MonitorIndex"]).Append(" and (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");

                                    dbo.ExceSQL(sql.ToString());
                                    sql.Remove(0, sql.Length);
                                    sql.Append("update  T_Monitor_Task set F_Status =0 where (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                                    dbo.ExceSQL(sql.ToString());
                                }

                            }
                            #endregion
                        }
                        if (devKind == 2)
                        {
                            #region 输送机送货
                            if (devCommand == 3)
                            {
                                int consn = GetSerialNumberFromRouteDevice(routeidNew, devindex);
                                //找到接货RGV设备索引
                                List<int> nextrgv = CDisassembleTask.GetNextDevice(routeidNew, consn);
                                int rgvdev = nextrgv[0];

                                //删除RGV运动到接货点之前的任务
                                //20091128
                                sql.Remove(0, sql.Length);
                                sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) AND (F_DeviceIndex = ").Append(
                                    rgvdev).Append(") AND (F_DeviceCommandIndex = 7) AND (F_RouteID = ").Append(routeidNew).Append(
                                    ")  AND (F_NumParam1 = ").Append(devindex).Append(")");
                                dvnew = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                if (dvnew.Count > 0)
                                {
                                    sql.Remove(0, sql.Length);
                                    sql.Append("delete from T_Monitor_Task where F_MonitorIndex<").Append(dvnew[0]["F_MonitorIndex"]).Append(" and (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                                    dbo.ExceSQL(sql.ToString());
                                    sql.Remove(0, sql.Length);
                                    sql.Append("update  T_Monitor_Task set F_Status =0 where (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                                    dbo.ExceSQL(sql.ToString());
                                }

                            }
                            #endregion

                            #region 输送机的接货

                            if (devCommand == 4)
                            {
                                int consn = GetSerialNumberFromRouteDevice(routeID, devindex);
                                //找到送货RGV设备索引
                                List<int> priorrgv = CDisassembleTask.GetPriorDevice(routeID, consn);
                                int rgvdev = priorrgv[0];
                                int rgvsn = GetSerialNumberFromRouteDevice(routeidNew, rgvdev);
                                List<int> nextdev = CDisassembleTask.GetNextDevice(routeidNew, rgvdev);
                                int condev = nextdev[0];
                                //删除RGV运动到送货点之前的任务
                                //20091128
                                sql.Remove(0, sql.Length);
                                sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) AND (F_DeviceIndex = ").Append(
                                    rgvdev).Append(") AND (F_DeviceCommandIndex = 7) AND (F_RouteID = ").Append(routeidNew).Append(
                                    ") AND (F_NumParam1 = ").Append(condev).Append(")");
                                dvnew = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                if (dvnew.Count > 0)
                                {
                                    sql.Remove(0, sql.Length);
                                    sql.Append("delete from T_Monitor_Task where F_MonitorIndex<").Append(dvnew[0]["F_MonitorIndex"]).Append(" and (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                                    dbo.ExceSQL(sql.ToString());
                                    sql.Remove(0, sql.Length);
                                    sql.Append("update  T_Monitor_Task set F_Status =0 where (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                                    dbo.ExceSQL(sql.ToString());
                                }

                            }

                            #endregion


                            #region 输送机的送出
                            if (devCommand == 6)
                            {
                                //20091128
                                sql.Remove(0, sql.Length);
                                sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) AND (F_DeviceIndex = ").Append(
                                    devindex).Append(") AND (F_DeviceCommandIndex = 6) AND (F_RouteID = ").Append(routeidNew).Append(
                                    ")");
                                dvnew = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                if (dvnew.Count > 0)
                                {
                                    sql.Remove(0, sql.Length);
                                    sql.Append("delete from T_Monitor_Task where F_MonitorIndex<").Append(dvnew[0]["F_MonitorIndex"]).Append(" and (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) ");
                                    dbo.ExceSQL(sql.ToString());
                                    int CurrentLocation = 0;
                                    sql.Remove(0, sql.Length);
                                    sql.Append("SELECT FCurrentLocation FROM T_Manage_Task where FID=").Append(manageTaskIdx).Append(" and F_ManageTaskKindIndex=1");
                                    dvc = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                    if (dvc.Count > 0)
                                    {
                                        CurrentLocation = Convert.ToInt32(dvc[0]["FCurrentLocation"]);
                                    }
                                    //20091128
                                   
                                    if (CurrentLocation == 0) return false;
                                    sql.Remove(0, sql.Length);
                                    sql.Append("update T_Monitor_Task set F_DeviceIndex=").Append(CurrentLocation).Append(" where F_MonitorIndex=").Append(dvnew[0]["F_MonitorIndex"]);
                                    dbo.ExceSQL(sql.ToString());
                                    //20090910已经搬运到CurrentLocation(F_NumParam4=CurrentLocation) 删除送出任务
                                    sql.Remove(0, sql.Length);
                                    sql.Append("delete from T_Monitor_Task where  F_DeviceIndex=").Append(CurrentLocation).Append(" and F_NumParam4=").Append(CurrentLocation);
                                    dbo.ExceSQL(sql.ToString());

                                    sql.Remove(0, sql.Length);
                                    sql.Append("update  T_Monitor_Task set F_Status =0 where  (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                                    dbo.ExceSQL(sql.ToString());


                                }
                            }
                            #endregion

                        }
                        #region 堆垛机的送货重
                        if (devKind == 1)
                        {//堆垛机的送货重,只保留堆垛机的送货任务

                            //20091128
                            sql.Remove(0, sql.Length);
                            sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) AND (F_DeviceIndex = ").Append(
                                    devindex).Append(") AND (F_DeviceCommandIndex = ").Append(devCommand).Append(") AND (F_RouteID = ").Append(routeidNew).Append(
                                    ")");
                            dvnew = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                            if (dvnew.Count > 0)
                            {
                                sql.Remove(0, sql.Length);
                                sql.Append("delete from T_Monitor_Task where F_MonitorIndex<").Append(dvnew[0]["F_MonitorIndex"]).Append(" and (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                                dbo.ExceSQL(sql.ToString());
                                sql.Remove(0, sql.Length);
                                sql.Append("update T_Base_Device set F_LockedState=0 where F_DeviceIndex=").Append(devindex);
                                dbo.ExceSQL(sql.ToString());
                                sql.Remove(0, sql.Length);
                                sql.Append("update  T_Monitor_Task set F_Status =0 where (F_ManageTaskIndex = ").Append(
                                manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) ");
                                dbo.ExceSQL(sql.ToString());
                            }

                        }
                        #endregion

                        #region 条码扫描改道
                        if (devKind == 7)
                        {
                            //sql.Remove(0, sql.Length);
                            //sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(
                            //    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) AND (F_DeviceIndex = ").Append(
                            //    devindex).Append(") AND (F_DeviceCommandIndex = 1) AND (F_RouteID = ").Append(routeidNew).Append(
                            //    ")");
                            //dvnew = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                            //if (dvnew.Count > 0)
                            //{
                            //    sql.Remove(0, sql.Length);
                            //    sql.Append("delete from T_Monitor_Task where F_MonitorIndex<=").Append(dvnew[0]["F_MonitorIndex"]).Append(" and (F_ManageTaskIndex = ").Append(
                            //    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) ");
                            //    dbo.ExceSQL(sql.ToString());

                            //    sql.Remove(0, sql.Length);
                            //    sql.Append("update  T_Monitor_Task set F_Status =0 where  (F_ManageTaskIndex = ").Append(
                            //    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                            //    dbo.ExceSQL(sql.ToString());
                            //}
                            sql.Remove(0, sql.Length);
                            sql.Append("update  T_Monitor_Task set F_Status =0 where  (F_ManageTaskIndex = ").Append(
                            manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                            dbo.ExceSQL(sql.ToString());
                        }
                        #region 高端

                        if (devKind == 13)
                        {

                            sql.Remove(0, sql.Length);
                            sql.Append("update  T_Monitor_Task set F_Status =0 where  (F_ManageTaskIndex = ").Append(
                            manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                            dbo.ExceSQL(sql.ToString());
                        }
                        #endregion


                        #endregion

                    }//20090910
                    CDataChangeEventArgs cea = new CDataChangeEventArgs(null, null);
                    OnDataChange("CControl.GetUseableRouteIDSubAndModifyRoute", cea);
                    return true;
                }//20091005
                #endregion
                else
                {//调度任务不存在
                    return false;
                }

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dvc.Dispose();
                dvmi.Dispose();
                dvnew.Dispose();
                DMAN.Dispose();
            }
        }

        public int GetUCodeFromDeviceGD(int GdDevice)
        {
            DataView dv =new DataView();
            try
            {
                dv = dbo.ExceSQL(string.Format("select F_UCODE  from T_Base_UArea where F_InputBarcodeConfirm={0}", GdDevice)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0][0]);
                }
                else
                {
                    dv = dbo.ExceSQL(string.Format("select F_UCODE from T_Base_UArea where F_OutputUDevice={0}", GdDevice)).Tables[0].DefaultView;
                    if (dv.Count > 0)
                    {
                        return Convert.ToInt32(dv[0][0]);
                    }
                    else
                    {
                        return 0;
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }

        }
        public bool IfHaveEarlyTask(int taskindex,int device)
        {
            sql.Clear();
            sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE F_DeviceIndex=").Append(device).Append(" and (F_StartTime < (SELECT F_StartTime FROM T_Monitor_Task WHERE F_MonitorIndex = ").Append(taskindex).Append("))");
            if (dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView.Count > 0)
            {
                return true;
            }
            else
            {
                return false;
            }

        }
        void SetStackSendConveyorManReserve(int taskindex, int StackIndex)
        {//20120110
            DataView dvl = new DataView(); DataView dv = new DataView();
            try
            {
                //20120820
                devinfo = Model.CGetInfo.GetDeviceInfo(StackIndex);
                if (devinfo.VirtualStack > 0) StackIndex = devinfo.VirtualStack;

                int fid = GetManageTaskIndexfromMonitor(taskindex);
                int Mankind = GetManageTaskKindIndexFromMonitor(taskindex);
                int[] zxy = GetCoordinatesFromMonitorTask(taskindex);
                StringBuilder zxystr = new StringBuilder();
                if (zxy != null)
                {
                    zxystr.Append((zxy[3].ToString().Length == 1 ? "0" + zxy[3].ToString() : zxy[3].ToString())).Append("-").Append(
                        ((zxy[4].ToString().Length == 1) ? ("0" + zxy[4].ToString()) : (zxy[4].ToString()))).Append("-").Append(
                        ((zxy[5].ToString().Length == 1) ? ("0" + zxy[5].ToString()) : (zxy[5].ToString())));
                }
                int laneway = 0;
                dvl = dbo.ExceSQL(string.Format("SELECT F_LaneDeviceIndex FROM  T_Base_LaneInfo WHERE (F_StackIndex = {0})", StackIndex)).Tables[0].DefaultView;
                if (dvl.Count > 0)
                {
                    laneway = Convert.ToInt32(dvl[0]["F_LaneDeviceIndex"]);
                }
                else
                    return;
                sql.Remove(0, sql.Length);
                sql.Append("SELECT F_LaneGateDeviceIndex FROM T_Base_Lane_Gate,T_Base_Device WHERE (T_Base_Lane_Gate.F_LaneGateDeviceIndex = T_Base_Device.F_DeviceIndex) and (F_ZXY = '").Append(zxystr).Append("') and F_LaneIndex=").Append(laneway);
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;

                if ((dv.Count > 0))// && (StackIndex == devinfo.VirtualStack)
                {
                    sql.Remove(0, sql.Length);
                    sql.Append("UPDATE T_Base_Device SET F_ManTaskReserve = (").Append(Mankind.ToString()).Append(fid.ToString()).Append(") WHERE (F_DeviceIndex = ").Append(dv[0][0].ToString()).Append(")");
                    dbo.ExceSQL(sql.ToString());

                }
            }
            catch (Exception ex)
            {
                throw ex;

            }
            finally
            {
                dv.Dispose();
                dvl.Dispose();
                
            }
        }

        public int GetEndDeviceFromManage(int mti, int fid)
        {
            DataView dv = new DataView();
            try
            {
                dv = dbo.ExceSQL(string.Format("SELECT FENDDEVICE FROM  T_Manage_Task where FID={0} and F_ManageTaskKindIndex={1}", fid, mti)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0][0]);
                }
                else
                {
                    return -1;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }

        //控制拆分的任務的數量  add for CATL YB2
        public bool GetTaskCountsCanDisassembleToEndDevice(int TaskIndex,int EndDevice)
        {
            //查找到该终点的任务,包括所有已经拆分的任务,已经拆分的任务数量+1后,要小于等于限定数量,这样才能进行任务关联
            //注意 TaskIndex是马上要拆分的任务,应该考虑
            DataView dv = new DataView();
            try
            {
                // 查出 已经拆分的出库任务 终点是当前终点的  任务的任务号和任务类型
                string sqlstr = string.Format("SELECT FID,F_ManageTaskKindIndex FROM T_Manage_Task WHERE (FIntoStepOK = '1') AND (FCONTROLTASKTYPE = 2)AND (FENDDEVICE ={0}) ", EndDevice);

                dv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView;
                int outcount=dv.Count;//已经拆分的任务数量
                //查找执行数量大于0的终点设备,0表示不限制
                sqlstr = string.Format("select F_DeviceIndex,F_MAXCOUNT,F_EXECOUNT from T_Base_TaskCount where F_DeviceIndex={0} and F_EXECOUNT>0", EndDevice);

                dv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView;
                int MaxCount=0;
                if (dv.Count > 0)//查找到
                {
                    MaxCount = Convert.ToInt32(dv[0]["F_EXECOUNT"]);

                    if (outcount + 1 >= MaxCount)//此时不能进行出库双叉关联
                    {
                        return false;
                    }
                    else
                    {
                        return true;
                    }
                }
                else
                {
                    return true;
                }


                
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        public int GetNextMonitorTaskIndex(int taskindex)
        {
            DataView dv = new DataView();
            try
            {
                int mti = GetManageTaskKindIndexFromMonitor(taskindex);
                int fid = GetManageTaskIndexfromMonitor(taskindex);
                sql.Clear();
                sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE  F_ManageTaskIndex=").Append(fid).Append(" and F_ManageTASKKINDINDEX=").Append(mti).Append(" and F_MonitorIndex>").Append(taskindex).Append(" order by F_MonitorIndex asc");

                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["F_MonitorIndex"]);
                }
                else
                {
                    return 0;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        public int GetPriorMonitorTaskIndex(int taskindex)
        {
            DataView dv = new DataView();
            try
            {
                int mti = GetManageTaskKindIndexFromMonitor(taskindex);
                int fid = GetManageTaskIndexfromMonitor(taskindex);
                sql.Clear();
                sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE  F_ManageTaskIndex=").Append(fid).Append(" and F_ManageTASKKINDINDEX=").Append(mti).Append(" and F_MonitorIndex<").Append(taskindex).Append(" order by F_MonitorIndex asc");

                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["F_MonitorIndex"]);
                }
                else
                {
                    return 0;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        public bool IfChangeForkCell(int stackno, string cell)
        {
            DataView dv = new DataView();
            try
            {
                dv = dbo.ExceSQL(string.Format("SELECT F_LaneDeviceIndex  FROM T_Base_LaneInfo where F_StackIndex={0} and F_ChangeForkCell='{1}'", stackno, cell)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// 返回需要倒库更换货叉的倒库货位,“-”代表不需要更换货叉,T_Base_Lane_Gate里的倒库货位的虚拟设备是为了置【逻辑有物】
        /// </summary>
        /// <param name="task"></param>
        /// <returns></returns>
        public string IfLimitCellChangeFork(int task, int stackindex)
        {//20110412
            bool Ifchange = false;
            int[] zxy = GetCoordinatesFromMonitorTask(task);
            int xCoor = zxy[4];
            StringBuilder zxystr = new StringBuilder();
            DataView dv = new DataView();
            try
            {
                devinfo = Model.CGetInfo.GetDeviceInfo(stackindex);
                int DeviceIndex = 0;
                if (devinfo.VirtualStack > 0)
                {
                    DeviceIndex = devinfo.VirtualStack;
                }
                else
                {
                    DeviceIndex = stackindex;
                }
                zxystr.Append((zxy[3].ToString().Length == 1 ? "0" + zxy[3].ToString() : zxy[3].ToString())).Append("-").Append(
                        ((zxy[4].ToString().Length == 1) ? ("0" + zxy[4].ToString()) : (zxy[4].ToString()))).Append("-").Append(
                        ((zxy[5].ToString().Length == 1) ? ("0" + zxy[5].ToString()) : (zxy[5].ToString())));
                object ob = dbo.GetSingle(string.Format("SELECT FLaneWay FROM ST_CELL WHERE fstack={1} and (FCELLCODE = '{0}')", zxystr.ToString(), stackindex));
                int laneway = -1;
                if (ob != null)
                {
                    laneway = Convert.ToInt32(ob);
                }

                string TaskUseAwayFork = Model.CGeneralFunction.GetUseAwayFork(task);//1,2,3;0没分配货叉

                int tempStartX = Model.CGeneralFunction.GetXCoorFromMonitor(task, DeviceIndex, 4);
                int tempEndX = Model.CGeneralFunction.GetXCoorFromMonitor(task, DeviceIndex, 5);
                int zeroXcoor = 0, UseAwayFork = 0;
                sql.Clear();
                sql.Append("SELECT F_ForwardLimitX,F_BackLimitX FROM T_Base_LaneInfo WHERE  F_StackIndex = ").Append(DeviceIndex).Append(" and F_ForwardLimitX>0 and F_BackLimitX>0");
                DataView dvl = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if ((devinfo.IfCorrelDoubleFork == "1") && (dvl.Count > 0))
                {
                    
                    //堆垛机的原点属性
                    char[] sp = new char[1] { ',' };
                    string[] yd = devinfo.StackZeroColLayer.Split(sp);
                    if (yd.GetLength(0) > 0)
                    {
                        zeroXcoor = Convert.ToInt32(yd[0]);
                    }
                    else
                    {
                        _DisassembleTaskError = "IfLimitCellChangeFork发生错误:堆垛机的原点坐标没有填写!";
                        return "-";
                    }
                    if (zeroXcoor < Convert.ToInt32(dvl[0]["F_ForwardLimitX"]))
                    {//如果原点列坐标小于ForwardLimitX,检查ForwardLimitX至ForwardLimitX+(n-2);
                        if (((tempStartX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"])) >= 0) && (((tempStartX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"])) <= (devinfo.ForkAmount - 2))))
                        {
                            UseAwayFork = (tempStartX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) + 1);
                        }
                        else if (((tempEndX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"])) >= 0) && (((tempEndX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"])) <= (devinfo.ForkAmount - 2))))
                        {
                            UseAwayFork = (tempEndX - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) + 1);
                        }
                        if ((Convert.ToInt32(TaskUseAwayFork) > UseAwayFork) && (UseAwayFork!=0))
                        {
                            Ifchange = true ;
                        }
                        
                    }
                    else if (zeroXcoor > Convert.ToInt32(dvl[0]["F_ForwardLimitX"]))
                    {//如果原点列坐标大于ForwardLimitX,检查ForwardLimitX至ForwardLimitX-(n-2).
                        if ((Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - tempStartX >= 0) && ((Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - tempStartX <= (devinfo.ForkAmount - 2))))
                        {
                            UseAwayFork = (Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - tempStartX + 1);
                        }
                        else if ((Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - tempEndX >= 0) && ((Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - tempEndX <= (devinfo.ForkAmount - 2))))
                        {
                            UseAwayFork = (Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - tempEndX + 1);
                        }
                        if ((Convert.ToInt32(TaskUseAwayFork) < UseAwayFork) && (UseAwayFork != 0))
                        {
                            Ifchange = true;
                        }
                    }
                    UseAwayFork = 0;
                    if (zeroXcoor < Convert.ToInt32(dvl[0]["F_BackLimitX"]))
                    {//如果原点列坐标小于F_BackLimitX,检查F_BackLimitX至F_BackLimitX-(n-2);
                        if (((Convert.ToInt32(dvl[0]["F_BackLimitX"]) - tempStartX) >= 0) && (((Convert.ToInt32(dvl[0]["F_BackLimitX"]) - tempStartX) <= (devinfo.ForkAmount - 2))))
                        {
                            UseAwayFork = (devinfo.ForkAmount - (Convert.ToInt32(dvl[0]["F_BackLimitX"]) - tempStartX));
                        }
                        else if (((Convert.ToInt32(dvl[0]["F_BackLimitX"]) - tempEndX) >= 0) && (((Convert.ToInt32(dvl[0]["F_BackLimitX"]) - tempEndX) <= (devinfo.ForkAmount - 2))))
                        {
                            UseAwayFork = (devinfo.ForkAmount - (Convert.ToInt32(dvl[0]["F_BackLimitX"]) - tempEndX));
                        }
                        if ((Convert.ToInt32(TaskUseAwayFork) < UseAwayFork) && (UseAwayFork != 0))
                        {
                            Ifchange = true;
                        }
                    }
                    else if (zeroXcoor > Convert.ToInt32(dvl[0]["F_BackLimitX"]))
                    {//如果原点列坐标大于F_BackLimitX,检查F_BackLimitX至F_BackLimitX+(n-2).
                        if (((tempStartX - Convert.ToInt32(dvl[0]["F_BackLimitX"])) >= 0) && (((tempStartX - Convert.ToInt32(dvl[0]["F_BackLimitX"])) <= (devinfo.ForkAmount - 2))))
                        {
                            UseAwayFork = (devinfo.ForkAmount - (tempStartX - Convert.ToInt32(dvl[0]["F_BackLimitX"])));
                        }
                        else if (((tempEndX - Convert.ToInt32(dvl[0]["F_BackLimitX"])) >= 0) && (((tempEndX - Convert.ToInt32(dvl[0]["F_BackLimitX"])) <= (devinfo.ForkAmount - 2))))
                        {
                            UseAwayFork = (devinfo.ForkAmount - (tempEndX - Convert.ToInt32(dvl[0]["F_BackLimitX"])));
                        }
                        if ((Convert.ToInt32(TaskUseAwayFork) >UseAwayFork) && (UseAwayFork != 0))
                        {
                            Ifchange = true;
                        }
                    }

                }
                
                if (Ifchange == true)
                {
                    string changeforkcell = GetChangeForkCell(laneway);
                    if (changeforkcell == "")
                    {
                        return "-";

                    }
                    else
                    {
                        return changeforkcell;
                    }
                }
                else
                {
                    return "-";
                }
                
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }

        public bool  IfNeedExchangeTask(int minMidx,int[] zxy,string [] exchangearea)
        {
            DataView dv = new DataView();


            try
            {

               if (zxy != null)
               {
                   string getcell = string.Format("{0:D2}-{1:D2}-{2:D2}", zxy[0], zxy[1], zxy[2]);// get pallete z-x-y
                   string sendcell = string.Format("{0:D2}-{1:D2}-{2:D2}", zxy[3], zxy[4], zxy[5]);

                   //送货位置langgate需要中转

                   //
                    //exchangearea = GetExchangeStationAndEndAreaFromLaneGate(sendcell);
                    if (exchangearea != null)//送货位置是拆零区
                    {
                        string ExchangeStation = Convert.ToString(exchangearea[2]);//交换站台组
                        int getgate = GetLaneGateDeviceIndexFromLaneGate(getcell);//取货位置的设备编号



                        if (!ExchangeStation.Contains(getgate.ToString()))//取货位置是中转站台
                        {
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    }
                    else
                    {
                        return false;
                    }
               }
               else
               {
                   return false;
               }



            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public bool IfExchange( int  VirtualStack,int minMidx,string endGroup, int UseAwayFork, int[] zxy, string[] exchangearea,bool forceexchange, out string changecell)//需要中转的任务,判断是否能够中转
        {//20110412
            DataView dv = new DataView();
             changecell = "-";
            try
            {

                if (zxy != null && exchangearea != null)//送货位置是拆零区
                {
                    string getcell = string.Format("{0:D2}-{1:D2}-{2:D2}", zxy[0], zxy[1], zxy[2]);// get pallete z-x-y
                    string sendcell = string.Format("{0:D2}-{1:D2}-{2:D2}", zxy[3], zxy[4], zxy[5]);

                    int sendgate = Convert.ToInt32(exchangearea[0]);//送货位置的设备编号
                    int lane = Convert.ToInt32(exchangearea[1]);

                    string ExchangeStation = Convert.ToString(exchangearea[2]);//交换站台组
                    string EndAreaDevice = Convert.ToString(exchangearea[3]);// 
                    string EndAreaFreeDevice = Convert.ToString(exchangearea[4]);// 

                    string stationmessage, areamessage;

                    bool areafree = GetIfAreaFree(minMidx, VirtualStack, EndAreaDevice, EndAreaFreeDevice, out areamessage);//1个空位
                    bool stationfree = GetIfAreaFree(minMidx, VirtualStack, ExchangeStation, EndAreaFreeDevice, out stationmessage);//2个空位

                    //在无中转站台取送货任务,无拆零区任务折指令(堆垛机,输送机),且中转站台和拆零区无货的情况下,才能直接执行到拆零区的送货任务
                    //中转
                    string[] ends = endGroup.Split(';');
                    int count = ends.Length;//>2表示终点是出库区

                    bool exchange = false;

                    int getlanegete = GetLaneGateDeviceIndexFromLaneGate(getcell);
                    string sql = string.Format("SELECT F_StackIndex, F_ChangeStackCell,F_LaneNo  FROM  T_Base_StackInfo where F_ChangeStackCell like '%{0}%' ", getlanegete);//取货位置是否是中转站台
                    dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
                    if (dv.Count == 0)//取货位不是倒换堆垛机的站台
                    {
                        if (count >= 2)
                        {
                            exchange = true;
                        }

                    }

                    // if (areafree && stationfree&&  !exchange )//不需要倒库
                    if (count < 2)
                    {
                        if (areafree && stationfree)//不需要倒库
                        {
                            if (!forceexchange)

                            {
                                changecell = sendcell;//返回原送货地址
                                return false;
                            }
                            else//双叉且目标一致的,其中必有一个要强制中转
                            {
                                changecell = GetFreeStation(ExchangeStation, UseAwayFork, out stationmessage);//获得新的目标

                                return true;
                            }
                        }
                        else
                        {
                            changecell = GetFreeStation(ExchangeStation, UseAwayFork, out stationmessage);//获得新的目标

                            return true;
                        }
                    }
                    else
                    {
                        if (areafree)//不需要倒库
                        {
                            changecell = sendcell;//返回原送货地址
                            return false;
                        }
                        else
                        {
                            changecell = GetFreeStation(ExchangeStation, UseAwayFork, out stationmessage);//获得新的目标

                            return true;
                        }
                    }
                }
                else
                {
                    return true;
                }


            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        /// <summary>
        /// 多叉堆垛机换叉货位组,找到空闲的货位
        /// </summary>
        /// <param name="laneway"></param>
        /// <returns></returns>
        public string GetChangeForkCell(int laneway)
        {
            int fids = 0; string cell = ""; int minfids = int.MaxValue;
            DataView dv = new DataView();
            try
            {
                dv = dbo.ExceSQL(string.Format("SELECT F_LaneDeviceIndex, F_ChangeForkCell  FROM  T_Base_LaneInfo where F_LaneDeviceIndex={0}", laneway)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    char[] cc = new char[1] { ';' };
                    string[] sp = dv[0]["F_ChangeForkCell"].ToString().Split(cc);
                    string ChangeForkCell = string.Empty;
                    int lanedev = 0;
                    for (int i = 0; i < sp.GetLength(0); i++)
                    {//T_Monitor_Task表新增 F_ChangeStackCell (和F_ChangeForkCell公用一个字段) "18001,01-30-02"
                        int.TryParse(sp[i], out lanedev);
                        if (lanedev > 0)
                        {//T_Base_LaneInfo表的 F_ChangeStackCell 和F_ChangeForkCell字段可以填写倒叉货位对应虚拟站台的设备索引
                            sp[i] = GetChangeCellFromLaneGate(laneway, lanedev);
                        }
                        ChangeForkCell = dv[0]["F_LaneDeviceIndex"].ToString() + "," + sp[i];
                        fids=Convert.ToInt32( dbo.GetSingle(string.Format("SELECT count(distinct F_ManageTaskIndex) as fids  FROM T_Monitor_Task where F_ChangeStackCell='{0}'", ChangeForkCell)));
                        if (fids < minfids)
                        {
                            minfids = fids;
                            cell = sp[i];
                        }
                           
                    }
                }

                return cell;


            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        public string GetChangeCellFromLaneGate(int laneway, int dev)
        {
            DataView dv = new DataView();
            try
            {
                dv = dbo.ExceSQL(string.Format("SELECT F_ZXY FROM T_Base_Lane_Gate where F_LaneGateDeviceIndex={0} and F_LaneIndex={1}",dev,laneway)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return dv[0]["F_ZXY"].ToString();
                }
                else
                {
                    return "";
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }

        }
        public int  GetChangeCellStationFromLaneGate(int laneway, string changecell)
        {
            DataView dv = new DataView();
            try
            {
                dv = dbo.ExceSQL(string.Format("SELECT F_LaneGateDeviceIndex FROM T_Base_Lane_Gate where F_ZXY='{0}' and F_LaneIndex={1}", changecell , laneway)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32( dv[0]["F_LaneGateDeviceIndex"]);
                }
                else
                {
                    return -1;//别返回-1,这个- liKe货位里面的-
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }

        }
        /// <summary>
        /// 以极限列为准分配货叉1,2,3.....
        /// </summary>
        /// <param name="limitx"></param>
        /// <param name="laneway"></param>
        /// <returns></returns>
        public string  GetLimitXForkNo(int limitx,int laneway)
        {
            char[] cc = new char[1]; string[] lc;
            string UseAwayFork = "0";
            DataView dvl = new DataView();
            StringBuilder sbs = new StringBuilder();
            object obj = new object();
            try
            {
                #region 以极限列为准分配货叉
                sbs.Clear();
                sbs.Append("SELECT F_StackIndex FROM T_Base_StackInfo WHERE (F_LaneNo LIKE '%").Append(laneway).Append("%')");
                obj = dbo.GetSingle(sbs.ToString());
                if (obj != null)
                {
                    devinfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(obj));
                    if (devinfo != null)
                    {
                        sbs.Remove(0, sbs.Length);
                        sbs.Append("SELECT F_ForwardLimitX,F_BackLimitX FROM T_Base_LaneInfo WHERE  F_LaneDeviceIndex = ").Append(laneway).Append(" and F_ForwardLimitX>0 and F_BackLimitX>0");
                        dvl = dbo.ExceSQL(sbs.ToString()).Tables[0].DefaultView;
                        if ((devinfo.IfCorrelDoubleFork == "1") && (dvl.Count > 0))
                        {
                            //堆垛机的原点属性
                            cc = new char[1] { ',' };
                            lc = devinfo.StackZeroColLayer.Split(cc);
                            if (Convert.ToInt32(lc[0]) < Convert.ToInt32(dvl[0]["F_ForwardLimitX"]))
                            {//如果原点列坐标小于ForwardLimitX,检查ForwardLimitX至ForwardLimitX+(n-2);
                                if ((limitx - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) >= 0) && ((limitx - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) <= (devinfo.ForkAmount - 2))))
                                {
                                    UseAwayFork = (limitx - Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) + 1).ToString();
                                }
                            }
                            else if (Convert.ToInt32(lc[0]) > Convert.ToInt32(dvl[0]["F_ForwardLimitX"]))
                            {//如果原点列坐标大于ForwardLimitX,检查ForwardLimitX至ForwardLimitX-(n-2).
                                if ((Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - limitx >= 0) && ((Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - limitx <= (devinfo.ForkAmount - 2))))
                                {
                                    UseAwayFork = (Convert.ToInt32(dvl[0]["F_ForwardLimitX"]) - limitx + 1).ToString();
                                }
                            }

                            if (Convert.ToInt32(lc[0]) < Convert.ToInt32(dvl[0]["F_BackLimitX"]))
                            {//如果原点列坐标小于F_BackLimitX,检查F_BackLimitX至F_BackLimitX-(n-2);
                                if ((Convert.ToInt32(dvl[0]["F_BackLimitX"]) - limitx >= 0) && ((Convert.ToInt32(dvl[0]["F_BackLimitX"]) - limitx <= (devinfo.ForkAmount - 2))))
                                {
                                    UseAwayFork = (devinfo.ForkAmount - (Convert.ToInt32(dvl[0]["F_BackLimitX"]) - limitx)).ToString();
                                }
                            }
                            else if (Convert.ToInt32(lc[0]) > Convert.ToInt32(dvl[0]["F_BackLimitX"]))
                            {//如果原点列坐标大于F_BackLimitX,检查F_BackLimitX至F_BackLimitX+(n-2).
                                if ((limitx - Convert.ToInt32(dvl[0]["F_BackLimitX"]) >= 0) && ((limitx - Convert.ToInt32(dvl[0]["F_BackLimitX"]) <= (devinfo.ForkAmount - 2))))
                                {
                                    UseAwayFork = (devinfo.ForkAmount - (limitx - Convert.ToInt32(dvl[0]["F_BackLimitX"]))).ToString();
                                }
                            }


                        }
                    }
                }
                return UseAwayFork;
                #endregion
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally 
            {

            }
        }
        /// <summary>
        /// 需要换叉的极限货位,把终点坐标改为倒库货位坐标,T_Base_Lane_Gate里的倒库货位的虚拟设备是为了置【逻辑有物】
        /// </summary>
        /// <param name="taskindex">设备任务索引</param>
        /// <param name="ChangeForkCell">可更改货叉的倒库货位编码</param>
        public void ChangeEndCellCode(int taskindex, string ChangeForkCell, int StackIndex)
        {//20120110
            int laneway = 0;
            DataView dvl = new DataView();
            DataView dv = new DataView();
            char[] cc = new char[1] { '-' };
            string[] endCell = ChangeForkCell.Split(cc);
            int fid = GetManageTaskIndexfromMonitor(taskindex);
            int Mankind =GetManageTaskKindIndexFromMonitor(taskindex);
            //dbo.TransBegin();
            try
            {
                dvl = dbo.ExceSQL(string.Format("SELECT F_LaneDeviceIndex FROM  T_Base_LaneInfo WHERE (F_StackIndex = {0})", StackIndex)).Tables[0].DefaultView;
                if (dvl.Count > 0)
                {
                    laneway = Convert.ToInt32(dvl[0]["F_LaneDeviceIndex"]);
                }
                else
                {
                    return;
                }
                sql.Remove(0, sql.Length);
                sql.Append("SELECT F_LaneGateDeviceIndex FROM T_Base_Lane_Gate,T_Base_Device WHERE (T_Base_Lane_Gate.F_LaneGateDeviceIndex = T_Base_Device.F_DeviceIndex) and (F_ZXY = '").Append(ChangeForkCell).Append("') and F_LaneIndex=").Append(laneway);
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    sql.Remove(0, sql.Length);
                    sql.Append("update T_Monitor_Task set F_AheadDetect=F_AheadDetect+'").Append(";N").Append(dv[0]["F_LaneGateDeviceIndex"].ToString()).Append(";R").Append(dv[0]["F_LaneGateDeviceIndex"].ToString())
                        .Append("', F_NumParam4=").Append(endCell[0]).Append(",F_NumParam5=").Append(endCell[1]).Append(",F_ChangeStackCell='").Append(laneway.ToString() + "," + ChangeForkCell
                        ).Append("',F_NumParam6=").Append(endCell[2]).Append(" where F_ManageTaskIndex=").Append(fid).Append(" and F_ManageTASKKINDINDEX=").Append(Mankind).Append(" and F_DeviceIndex=").Append(StackIndex);
                    dbo.ExecuteSql(sql.ToString());
                    sql.Remove(0, sql.Length);
                    sql.Append("update T_Manage_Task set FExceptionNO=").Append(Model.CGeneralFunction.TASKCHANGEFORK).Append(" where FID=").Append(fid).Append(" and F_ManageTaskKindIndex=").Append(Mankind);
                    dbo.ExecuteSql(sql.ToString());

                    //该任务倒换货叉时,判读关联任务是否需要倒换货叉
                    Dictionary<int, string[]> corrinfo = Model.CGeneralFunction.GetDoubleForkMonitorInfo(taskindex, StackIndex);
                    bool changeflag = false;
                    if (corrinfo != null) //存在关联任务
                    {
                        foreach (int CorrTaskindex in corrinfo.Keys)
                        {
                            if (CorrTaskindex != taskindex)
                            {
                                string ChangeForkCell1 = IfLimitCellChangeFork(CorrTaskindex, StackIndex);

                                if (ChangeForkCell1 != "-") //关联任务需要倒换货叉
                                {
                                    changeflag = true;

                                }
                            }
                        }
                        //解除关联
                        //此处判读是否解除关联关系,如果双叉任务都需要倒换货叉时才解除关联,堆垛机一次取送一个托盘。如果只有单叉需要倒换货叉,不解除关联关系,一次取两个托盘。
                        if(changeflag)
                        {
                        dbo.ExecuteSql(string.Format("UPDATE T_Manage_Task SET F_RELATIVECONTORLID = - 1 WHERE (F_ManageTaskKindIndex = {0}) AND (FID = {1})", Mankind, fid));
                        }
                    }


                }
                //dbo.TransCommit();
            }
            catch (Exception ex)
            {
                throw ex;
                //dbo.TransRollback();
            }
            finally
            {
                dv.Dispose();
                dvl.Dispose();
            }
        }
        public string GetManageTaskStackFork(int manKind,int fid)
        {
            DataView dv = dbo.ExceSQL(string.Format("SELECT FUseAwayFork FROM T_Manage_Task WHERE (FID = {0}) AND (F_ManageTaskKindIndex = {1})",fid,manKind)).Tables[0].DefaultView;
            if (dv.Count > 0)
            {
                return dv[0]["FUseAwayFork"].ToString();
            }
            else
            {
                return "0";
            }
        }
        public string GetAvailableCellCode(int StartDeviceIndex, string laneway)
        {
            string strCellCode = string.Empty;
            DataView dvTask = new DataView();
            DataView dvCell = new DataView();
            string sqlstr = string.Empty;
            string sqlshort = "1=1";
            int iShortOfEmptyCell = 0;
            int iBusyLevel = 0;

            //DataView dvRoute = dbo.ExceSQL("SELECT * FROM T_Base_Route WHERE   (F_EndDevice in (" + laneway + "))  AND (F_Status = 1) AND (F_StartDevice = " + StartDeviceIndex + ")").Tables[0].DefaultView;
            //不判断路径状态了

            DataView dvRoute = dbo.ExceSQL("SELECT * FROM T_Base_Route WHERE   (F_EndDevice  in (" + laneway + "))   AND (F_StartDevice = " + StartDeviceIndex + ")").Tables[0].DefaultView;
            if ((dvRoute != null) && (dvRoute.Count > 0))//可到达的路径
            {
                do
                {
                    for (int i = 0; i < dvRoute.Count; i++)
                    {


                        dvTask = dbo.ExceSQL("SELECT * FROM T_Manage_Task WHERE (FENDDEVICE = " + Convert.ToInt32(dvRoute[i]["F_EndDevice"]).ToString() + ")").Tables[0].DefaultView;
                        if (dvTask != null && dvTask.Count > iBusyLevel)//此路径已有任务
                        {
                            continue;
                        }
                        else
                        {

                            if (StartDeviceIndex == 22134 || StartDeviceIndex == 12106)
                            {

                                dvCell = dbo.ExceSQL("SELECT top 1 * FROM ST_CELL WHERE (FLaneWay = " + Convert.ToInt32(dvRoute[i]["F_EndDevice"]).ToString() + ") AND (FCELLSTATUS = 0) AND(FRunStatus = 0) AND(F_Z =4) AND(F_Y =1)   And (F_X>=51)And (F_X<=100) ORDER BY F_Z,F_X,F_Y ").Tables[0].DefaultView;

                            }
                            else
                                if (StartDeviceIndex == 12017)//一楼入库为空托盘,存放在一层
                                {

                                    int enddevice = Convert.ToInt32(dvRoute[i]["F_EndDevice"]);

                                    sqlstr = string.Format("SELECT top 1 * FROM ST_CELL WHERE (FLaneWay = {0}) AND (FCELLSTATUS = 0) AND(FRunStatus = 0) And (F_Y =1)  And (F_X>3)And (F_X<=30) and  {1}  ORDER BY F_Z,F_X desc,F_Y asc", enddevice, sqlshort);
                                    dvCell = dbo.ExceSQL(sqlstr).Tables[0].DefaultView;
                                }
                                else//托盘库
                                  //if(StartDeviceIndex == 22012)//二楼入库为实托盘,存放在二层
                                {
                                    int enddevice = Convert.ToInt32(dvRoute[i]["F_EndDevice"]);

                                    sqlstr = string.Format("SELECT top 1 * FROM ST_CELL WHERE (FLaneWay = {0}) AND (FCELLSTATUS = 0) AND(FRunStatus = 0)  And F_X>2  AND (FUCONVEYOR = 0)  and  {1}  ORDER BY F_Z,F_X desc,F_Y asc", enddevice, sqlshort);
                                    dvCell = dbo.ExceSQL(sqlstr).Tables[0].DefaultView;
                                }
                            if (dvCell != null && dvCell.Count > 0)
                            {
                                strCellCode = dvCell[0]["fcellcode"].ToString().Trim();

                                //将货位置为选中状态
                                dbo.ExceSQL("update ST_CELL set FRunStatus = 1,FUCONVEYOR=1  where FLaneWay= " + Convert.ToInt32(dvRoute[i]["F_EndDevice"]) + "  and   fcellcode = '" + strCellCode + "'");

                                break;
                            }
                            else
                            {
                                iShortOfEmptyCell++;
                                continue;
                            }
                        }
                    }

                    if (strCellCode == string.Empty)//有可用路径且没有分配到货位
                    {
                        if (iShortOfEmptyCell == dvRoute.Count)//No empty Cell
                        {
                            //System.Windows.Forms.MessageBox.Show("No empty Cell!!!");
                            strCellCode = "-";
                            break;
                        }
                    }

                    iBusyLevel++;
                } while (strCellCode == string.Empty);

            }
            return strCellCode;
        }
        public string GetNextCell(int StartDeviceIndex, int lane, int boxtype)
        {
            char[] cc = new char[1] { '-' };

            string sqlstr = string.Empty;
            string sqlshort = "1=1";
            string sqlstr2 = string.Empty;
            string sqlshort2 = "1=1";
            //string cell = WcfControlMonitorLib.CStaticClass.TestCell[lane];//上次存储的货位编码
            string newcell = "-";
            //string[] sp = cell.Split(cc);
            //if (sp.Length > 2)
            //{
                //DataView dv = dbo.ExceSQL("SELECT * FROM ST_CELL WHERE (FLaneWay=" + lane + " and F_Z=" +
                //                sp[0] + " and F_X=" + sp[1] + " and F_Y=" + sp[2] + ")").Tables[0].DefaultView;
                //if (dv.Count > 0)
                //{
                    //LT1 管理发送的是列值的最小值
                    //第五、六排 3,4,5|6,7,8|...|78,79,80|81,82
                    //第七排2,3,4|5,6,7|...|77,78,79|80,81
                    //第八排 3,4,5,|11,12,13|...|23,24,25|31,32,33| //LT1只能存放在LT2货位列值大的一侧,LT2可以存放4个GB
                    //第八排 34,35,36|37,38,39|...|73,74,75|76,77

                    //LT2
                    //第八排 2,3,4,5|10,11,12,13|...|30,31,32,33|

                    //if (lane < 15801)//14801,14802
                    //{
                    //    //只存储GB
                    //    //不受限制的分配货位

                    //}
                    //else//15801,15802
                    //{
                    //    if (lane == 15801)
                    //    {
                    //        //判断GB /LT1
                    //        //GB
                    //        if (boxtype == 1)
                    //        {
                    //            //不受限制
                    //        }
                    //        else
                    //            if (boxtype == 2)//LT1
                    //            {
                    //                sqlshort = "( F_X>=3  And  F_X<81  And F_X%3=0 ) ";

                    //            }
                    //    }
                    //    else//15802
                    //    {
                    //        //判断GB,LT1,LT2
                    //        if (boxtype == 1)
                    //        {
                    //            //不受限制
                    //        }
                    //        else//LT1
                    //            if (boxtype == 2)
                    //            {

                    //                sqlshort = "((F_Z=7 And F_X>=2 And F_X<80 And F_X%3=2 )or (F_Z=8 And F_X>=3 And F_X<34 And F_X%8=3 ) or (F_Z=8 And F_X>=34 And F_X<76 And F_X%3=1 )) ";
                    //            }
                    //            else//LT2
                    //                if (boxtype == 3)
                    //                {
                    //                    sqlshort = "(F_Z=8 And F_X>=2 And F_X<34 And F_X%4=2 ) ";
                    //                }


                    //    }

                    //}

                    //FUCONVEYOR
                    if(StartDeviceIndex>=12007&&StartDeviceIndex<=12013)
                    {
                         sqlstr = string.Format("SELECT  * FROM ST_CELL WHERE (FLaneWay = {0}) AND (FCELLSTATUS = 0) AND(FRunStatus = 0) AND (FUCONVEYOR = 0) and ( F_X>2) and  {1}  ORDER BY F_Y asc,F_Z,F_X asc", lane, sqlshort);
                    }
                    else
                    if (StartDeviceIndex == 12114)
                    {
                        sqlstr = string.Format("SELECT  * FROM ST_CELL WHERE (FLaneWay = {0}) AND (FCELLSTATUS = 0) AND(FRunStatus = 0) AND (FUCONVEYOR = 0) and ( F_X>4)and( F_X<61) and ( F_Y<=13) and  {1}  ORDER BY F_Y desc,F_Z,F_X desc", lane, sqlshort);
                    }
                    else

                        if (StartDeviceIndex == 12106 || StartDeviceIndex == 22134)
                        {
                            sqlstr = string.Format("SELECT  * FROM ST_CELL WHERE (FLaneWay = {0}) AND (FCELLSTATUS = 0) AND(FRunStatus = 0) AND (FUCONVEYOR = 0) and  ( F_X>60)and( F_X<121) and ( F_Y<=13)  {1}  ORDER BY F_Y desc,F_Z,F_X", lane, sqlshort);

                        }
                        else
                        {
                            sqlstr = string.Format("SELECT  * FROM ST_CELL WHERE (FLaneWay = {0}) AND (FCELLSTATUS = 0) AND(FRunStatus = 0) AND (FUCONVEYOR = 0) and ( F_X>2) and  {1}  ORDER BY F_Y asc,F_Z,F_X asc", lane, sqlshort);

                        }

                                //DataView dv0 = dbo.ExceSQL("SELECT * FROM ST_CELL WHERE  (FCELLSTATUS = 0) and (FLaneWay=" + lane + ") and (FID>" + dv[0]["FID"] + ") order by fid asc").Tables[0].DefaultView;

                    DataView dv0 = dbo.ExceSQL(sqlstr).Tables[0].DefaultView;
                    if (dv0.Count > 0)
                    {
                        //判断该货物的后面货位的状态
                        int Z, X, Y;
                        for (int i = 0; i < dv0.Count; i++)
                        {
                            Z = Convert.ToInt32(dv0[i]["F_Z"]);
                            X = Convert.ToInt32(dv0[i]["F_X"]);
                            Y = Convert.ToInt32(dv0[i]["F_Y"]);
                            if (boxtype > 1)
                            {

                                sqlshort2 = string.Format("(F_X={2} or F_X={3} ) ", Z, Y, X + 1, X + 2);//LT1

                                if (boxtype == 3)//LT2
                                {
                                    sqlshort2 = string.Format("(F_X={2} or F_X={3} or F_X={4} ) ", Z, Y, X + 1, X + 2, X + 3);//LT1
                                }

                                sqlstr2 = string.Format("SELECT  * FROM ST_CELL WHERE (FLaneWay = {0}) AND (FCELLSTATUS = 0) AND(FRunStatus = 0)  and   (F_Z={1}) and   (F_Y={2}) and  {3}   ORDER BY F_Y asc,F_Z,F_X asc", lane, Z, Y, sqlshort2);


                                DataView dv00 = dbo.ExceSQL(sqlstr2).Tables[0].DefaultView;
                                if (dv0.Count > 0)
                                {
                                    newcell = Convert.ToString(dv0[i]["FCELLCODE"]);
                                    break;

                                }
                                else
                                {
                                    continue;
                                }

                            }
                            else//GB直接返回
                            {
                                newcell = Convert.ToString(dv0[i]["FCELLCODE"]);
                                break;
                            }

                        }
                        //将货位置为选中状态
                        dbo.ExceSQL("update ST_CELL set FRunStatus = 1,FUCONVEYOR = 1  where FLaneWay= " + lane + "  and   fcellcode = '" + newcell + "'");
                        //if (newcell != "0")
                        //{
                        //    WcfControlMonitorLib.CStaticClass.TestCell[lane] = newcell;
                        //}

                        return newcell;
                    }
                    else
                    {

                        return "-";

                    }

            //}
            //else
            //{
            //    return "0";
            //}
        }
        public string GetNextCell(string StartCell, int lane)
        {
            char[] cc = new char[1] { '-' };
            string[] sp = StartCell.Split(cc);

            int oldx =Convert.ToInt32(sp[1]) ;//原来的列值
            string sqlstr = string.Empty;
            string sqlshort = "1=1";

            string newcell = "-";
          
            //FUCONVEYOR

            sqlstr = string.Format("SELECT   MAX(ABS(F_X - {0})) AS A, F_X,F_Y,F_Z, FCELLCODE FROM ST_CELL WHERE (FLaneWay = {1}) AND (FCELLSTATUS = 0) AND(FRunStatus = 0) AND (FUCONVEYOR = 0) and ( F_X>2)and ( F_X<40) GROUP BY F_X, FCELLCODE, F_Y, F_Z ORDER BY A desc, F_Y asc,F_Z,F_X asc", oldx, lane);
       
            DataView dv0 = dbo.ExceSQL(sqlstr).Tables[0].DefaultView;
            if (dv0.Count > 0)
            {

                newcell = Convert.ToString(dv0[0]["FCELLCODE"]);
                //将原来的货位置为选中状态
                dbo.ExceSQL("update ST_CELL set FRunStatus = 1 where FLaneWay= " + lane +
                            "  and   fcellcode = '" + StartCell + "'");
                //将选中的货位置为选中状态
                dbo.ExceSQL("update ST_CELL set FRunStatus = 1,FUCONVEYOR = 1  where FLaneWay= " + lane +
                            "  and   fcellcode = '" + newcell + "'");

                return newcell;
            }
            else
            {
                
                return "-";
            }

        }
        public string GetTestInLaneway()
        {
            string lanes = "";
            //获取开启入库测试的巷道
            foreach (int laneindex in CStaticClass.StopTest.Keys)
            {
                if (laneindex > 0 && CStaticClass.StopTest[laneindex] == false)
                {
                    if (CStaticClass.StopIn.ContainsKey(laneindex) == true && CStaticClass.StopIn[laneindex] == false)//没有停止入库测试
                    {
                        lanes = string.Format("{0},{1}", lanes, laneindex);
                    }
                }
            }
            lanes = lanes.TrimStart(',');
            return lanes;
        }

        public int GetLanewayFromCellCode(string strCellCode, int warehouse)
        {
            int iLaneway = -1;

            if (strCellCode != string.Empty)
            {
                DataView dv = dbo.ExceSQL("SELECT FLaneWay FROM ST_CELL WHERE (FWAREHOUSE = " + warehouse + ") and (FCELLCODE = '" + strCellCode + "')").Tables[0].DefaultView;
                if (dv != null && dv.Count > 0)
                {
                    iLaneway = Convert.ToInt32(dv[0]["FLaneWay"].ToString());
                }
            }

            return iLaneway;
        }
        //获得调度任务的逻辑区域
        public int GetLogicAreaFromManageTask(int taskKindIndex, int Managefid)//20130107
        {
            //20100108
            string sql;
            try
            {
                //20100108
                sql = string.Format("SELECT FLOGIC_AREA FROM T_Manage_Task WHERE (FID = {0}) AND (F_ManageTaskKindIndex ={1})", Managefid, taskKindIndex);
                object ob = dbo.GetSingle(sql);
                if (ob != null && ob.ToString() != "")
                {
                    return Convert.ToInt32(ob);
                }
                else
                {

                    return -1;
                }


            }
            catch (Exception ex)
            {//20100108
                throw ex;
            }
            finally
            {//20100108
                sql = null;
            }
        }
        public int GetLaneGate(int enddevice, int laneindex)
        {
            string sql = string.Format("SELECT  F_LaneGateDeviceIndex  FROM T_Base_Lane_Gate WHERE (F_ParentDeviceIndex = {0}) And (F_LaneIndex = {1}) ", enddevice, laneindex);

            object ob = dbo.GetSingle(sql);

            if (ob != null)
            {
                return Convert.ToInt32(ob);
            }
            else
            {

                return 0;
            }
        }
        /// <summary>
        /// 20161224 是否存终点是该设备的设备指令 
        /// </summary>
        /// <param name="enddevice">目标设备索引</param>
        /// <param name="Monitorindex">设备指令</param>
        /// <returns></returns>
        public int GetEndTransDeviceWithTaskIndex(int enddevice, int Monitorindex)
        {
            string sql = string.Format("SELECT  F_NumParam4  FROM T_Monitor_Task WHERE (F_MonitorIndex = {0}) And  (F_NumParam4 = {1})", Monitorindex, enddevice);
            //object ob = dbo.GetSingle("SELECT  F_NumParam4  FROM T_Monitor_Task WHERE (F_MonitorIndex = " + Monitorindex + ") And (F_DeviceIndex = " + startdevice + ") And (F_NumParam4 = "+enddevice+")");
            object ob = dbo.GetSingle(sql);

            if (ob != null)
            {
                return Convert.ToInt32(ob);
            }
            else
            {

                return 0;
            }
        }
        /// <summary>
        /// 20161224 是否存在终点设备是该设备,且条码相同的设备指令 
        /// </summary>
        /// <param name="enddevice">目标设备索引</param>
        /// <param name="Monitorindex">设备指令</param>
        /// <returns></returns>
        public int GetEndTransDeviceWithBarCode(int enddevice, string  barcode)
        {
            string sql = string.Format("SELECT  F_MonitorIndex  FROM T_Monitor_Task WHERE (F_TxtParam like '%{0}%') And  (F_NumParam4 = {1})", barcode, enddevice);
            //object ob = dbo.GetSingle("SELECT  F_NumParam4  FROM T_Monitor_Task WHERE (F_MonitorIndex = " + Monitorindex + ") And (F_DeviceIndex = " + startdevice + ") And (F_NumParam4 = "+enddevice+")");
            object ob = dbo.GetSingle(sql);

            if (ob != null)
            {
                return Convert.ToInt32(ob);
            }
            else
            {

                return 0;
            }
        }

        public bool GetTransDeviceIfFull(string Devices)
        {
            try
            {
                char[] cc = new char[1] { ';' };
                string[] sp;
                sp = Devices.Split(cc);
                int count = sp.Length;//设备数量
                int goodscount = 0;//货物数量
                for (int i = 0; i < count;i++ )
                {
                    int deviceindex = Convert.ToInt32(sp[i]);
                    devinfo = Model.CGetInfo.GetDeviceInfo(deviceindex);
                    if(devinfo!=null)
                    {
                        goodscount += devinfo.SplitByte_0;
                        goodscount += devinfo.SplitByte_1;

                    }

                }

                    if (goodscount >= count)
                    {

                        return true;
                    }
                    else
                    {
                        return false;
                    }

            }
            catch(Exception  ex )
            {
                return  false;
            }


        }
        //获取输送机上的货物数量 add for CATL FD
        public int GetTransDeviceGoodsCounts(string Devices)
        {  
            int goodscount = 0;//货物数量
            if(Devices=="")
            { return goodscount; }
            try
            {
                char[] cc = new char[1] { ';' };
                string[] sp;
                sp = Devices.Split(cc);
                int count = sp.Length;//设备数量
             
                for (int i = 0; i < count; i++)
                {
                    int deviceindex = Convert.ToInt32(sp[i]);
                    devinfo = Model.CGetInfo.GetDeviceInfo(deviceindex);
                    if (devinfo != null)
                    {
                        // add for CATL YB2  开关点只有.0
                        goodscount += devinfo.SplitByte_0;
                        //goodscount += devinfo.SplitByte_1;
                        //goodscount += devinfo.SplitByte_2;
                        if (devinfo.SplitByte_0 == 0) // && devinfo.SplitByte_1 == 0 && devinfo.SplitByte_2 == 0
                        {
                            if (devinfo.RunState != 0)
                            {
                                goodscount += 1;
                            }

                        }

                    }

                }
                return goodscount;



            }
            catch (Exception ex)
            {
                return goodscount;
            }


        }
        // add for CATL FD  后序拉线替换提前检测
        public int UpdateAhead(int deviceindex, int deviceorder, int FID, int TaskIdx)
        {

            DataView dv = new DataView();
            try
            {
                DataView dvPremonitor1 = dbo.ExceSQL("SELECT F_CHANGEFD  FROM T_Monitor_Task where F_CHANGEFD =1 and F_MONITORINDEX=" + TaskIdx).Tables[0].DefaultView;
                if (dvPremonitor1.Count >0)
                {
                    sql.Clear();
                    sql.Append("select f_aheaddetect1 from  T_BASE_AHEADDETECT where f_deviceindex = ").Append(deviceindex).Append(" and f_commondindex=").Append(deviceorder);
                    dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                    if (dv.Count > 0)
                    {
                        string strAhead = Convert.ToString(dv[0]["f_aheaddetect1"]);

                        object[] ob = new object[4] { strAhead, FID, TaskIdx, 0 };
                        // 替换小任务终点位置
                        dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_AHEADDETECT = '{0}' WHERE F_MANAGETASKINDEX={1} and (F_MONITORINDEX ={2}) and (F_STATUS = {3})", ob));
                        return 1;
                    }
                }
                else
                {
                    sql.Clear();
                    sql.Append("select f_aheaddetect from  T_BASE_AHEADDETECT where f_deviceindex = ").Append(deviceindex).Append(" and f_commondindex=").Append(deviceorder);
                    dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                    if (dv.Count > 0)
                    {
                        string strAhead = Convert.ToString(dv[0]["f_aheaddetect"]);

                        object[] ob = new object[4] { strAhead, FID, TaskIdx, 0 };
                        // 替换小任务终点位置
                        dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_AHEADDETECT = '{0}' WHERE F_MANAGETASKINDEX={1} and (F_MONITORINDEX ={2}) and (F_STATUS = {3})", ob));
                        return 1;
                    }
                }
            

                return 1;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        public int UpdatePreMAncahe(int FID, int TaskIdx, int StartDevice, int EndDevice, string monitor)
        {

            DataView dv = new DataView();
            try
            {
                if (monitor == "")
                {
                    return 0;
                }
                sql.Clear();
                sql.Append("select F_NUMPARAM4 from  T_MONITOR_TASK where F_MANAGETASKINDEX = ").Append(FID).Append(" and F_MONITORINDEX = ").Append(TaskIdx);
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    int temCahe = Convert.ToInt32(dv[0]["F_NUMPARAM4"]);
                    object[] ob1 = new object[4] { temCahe, EndDevice, FID, TaskIdx };
                    // 替换提前检测
                    dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_AheadDetect = REPLACE(F_AheadDetect, '{0}', '{1}') WHERE F_ManageTaskIndex ={2} and (F_MONITORINDEX ={3})", ob1));
                    object[] ob = new object[4] { EndDevice, FID, TaskIdx, 0 };
                    // 替换小任务终点位置
                    dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_NUMPARAM4 = {0} WHERE F_MANAGETASKINDEX={1} and (F_MONITORINDEX ={2}) and (F_STATUS = {3})", ob));
                    // 删除修改后的两条小任务中的另一条
                    dbo.ExceSQL("DELETE FROM T_Monitor_Task  WHERE (F_MANAGETASKINDEX = " + FID + ") AND (F_MONITORINDEX = " + Convert.ToInt32(monitor) + ")");
                    // 中间替换的设备解锁 逻辑有货清除
                    sql.Remove(0, sql.Length);
                    sql.Append("update T_Base_Device set F_LockedState=0,F_MANTASKRESERVE = 0,F_HaveGoods=0  where F_DEVICEINDEX=").Append(temCahe);
                    dbo.ExceSQL(sql.ToString());
                    return 1;
                }

                return 1;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        // add for CATL YB2  修改替换 带缓存位的 缓存区域的 任务为一个
        public int UpdatePreMAncahe1(int FID, int TaskIdx, int StartDevice, int EndDevice)
        {

            DataView dv = new DataView();
            try
            {
               
                sql.Clear();
                sql.Append("select F_NUMPARAM4 from  T_MONITOR_TASK where F_MANAGETASKINDEX = ").Append(FID).Append(" and F_MONITORINDEX = ").Append(TaskIdx);
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    int temCahe = Convert.ToInt32(dv[0]["F_NUMPARAM4"]);
                    //object[] ob1 = new object[4] { temCahe, EndDevice, FID, TaskIdx };
                    //// 替换提前检测
                    //dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_AheadDetect = REPLACE(F_AheadDetect, '{0}', '{1}') WHERE F_ManageTaskIndex ={2} and (F_MONITORINDEX ={3})", ob1));
                    object[] ob = new object[4] { EndDevice, FID, TaskIdx, 0 };
                    // 替换小任务终点位置
                    dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_NUMPARAM4 = {0} WHERE F_MANAGETASKINDEX={1} and (F_MONITORINDEX ={2}) and (F_STATUS = {3})", ob));
                   // 删除修改后的两条小任务中的另一条
                   // dbo.ExceSQL("DELETE FROM T_Monitor_Task  WHERE (F_MANAGETASKINDEX = " + FID + ") AND (F_MONITORINDEX = " + Convert.ToInt32(monitor) + ")");
                    // 中间替换的设备解锁 逻辑有货清除
                    sql.Remove(0, sql.Length);
                    sql.Append("update T_Base_Device set F_LockedState=0,F_MANTASKRESERVE = 0,F_HaveGoods=0  where F_DEVICEINDEX=").Append(temCahe);
                    dbo.ExceSQL(sql.ToString());
                    return 1;
                }

                return 1;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        // 获取到达终点站台正在执行的任务数 add for CATL YB2
        public int GetTaskCounts(string Devices,int FID)
        {
            DataView dv = new DataView();
            int goodscount = 0;//货物数量
            if (Devices == "" )
            {
                return goodscount;
            }
            try
            {
                dv = dbo.ExceSQL(string.Format("SELECT FID FROM T_MANAGE_TASK where FENDDEVICE='{0}'and FID <> {1} and FSTATUS <> 0 ", Devices, FID)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    goodscount =dv.Count;
                }
                return goodscount;
            }
            catch (Exception ex)
            {
                return goodscount;
            }


        }
        //add for CATL YB2
        public int GetLaneGateDeviceIndexFromLaneGate(string cell)
        {
            DataView dv = new DataView();
            try
            {
                dv = dbo.ExceSQL(string.Format("SELECT F_LaneGateDeviceIndex FROM T_Base_Lane_Gate where F_ZXY='{0}' ", cell)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["F_LaneGateDeviceIndex"]);
                }
                else
                {
                    return 0;//别返回-1,这个- liKe货位里面的-
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }

        }
        public string GetF_TxtParamfromMonitor(int monitorIdx)
        {
            //20100108
            DataView dv = new DataView();
            try
            {
                //20100108
                //20101124
                sql.Remove(0, sql.Length);
                sql.Append("SELECT F_TxtParam FROM T_Monitor_Task WHERE (F_MonitorIndex = ").Append(monitorIdx).Append(")");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToString(dv[0]["F_TxtParam"]);
                }
                else
                {
                    return "-1";
                }
            }
            catch (Exception ex)
            {//20100108
                throw ex;
            }
            finally
            {//20100108
                dv.Dispose();
            }
        }
        public string GetWorkStackNoFromCell(string cellcode,int stack)
        {
            string stackno = string.Empty;
            string sql = string.Empty;
            DataView dv = new DataView();

            try
            {
                devinfo = Model.CGetInfo.GetDeviceInfo(stack);
                if (devinfo != null)
                {
                   if(devinfo.VirtualStack>0)
                    {
                        stack = devinfo.VirtualStack;
                    }

                }
                sql = string.Format("SELECT FWorkStack FROM ST_CELL where FCELLCODE='{0}' and FStack={1}", cellcode, stack);
                dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    stackno = Convert.ToString(dv[0]["FWorkStack"]);
                }
                else
                {
                    sql = string.Format("SELECT F_WorkStack FROM T_Base_Lane_Gate where F_ZXY='{0}'", cellcode);
                    dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
                    if (dv.Count > 0)
                    {
                        stackno = Convert.ToString(dv[0]["F_WorkStack"]);
                    }
                }
                return stackno;


            }
            catch (Exception ex)
            {
              //  CControlError = "分配堆垛机号GetWorkStackNo:" + ex.StackTrace + ex.Message;
                return stackno;
            }
            finally
            {
                dv.Dispose();
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="cellcode">最终货位</param>
        /// <param name="StackIndex">当前选的堆垛机</param>
        /// <returns></returns>
        public string GetIfStackCanWorkFromCellAndLaneGate(string cellcode, int StackIndex, int lanegateindex)
        {
  
            string sql = string.Empty;
            DataView dv = new DataView();
            string newcell = cellcode;//如果该堆垛机能到达货位,则返回最终货位,如果堆垛机不能达到货位,则返回新的倒库货位
            string workstack = string.Empty;
            string changegate = string.Empty;
            char[] cc = new char[1] { ';' };
            string[] stack ;
            int lanegate=0;
            int laneno = 0;
            try
            {

                workstack=GetWorkStackNoFromCell(cellcode, StackIndex);//查找能执行该货位任务的堆垛机
                if (workstack.Contains(StackIndex.ToString()))//该堆垛机能够到达
                {
                    return newcell;
                }
                stack = workstack.Split(cc);//获得能到达该货位的堆垛机
                int stackcount=stack.Length;
                sql = string.Format("SELECT F_StackIndex, F_ChangeStackCell,F_LaneNo  FROM  T_Base_StackInfo where F_StackIndex={0} ", StackIndex);
                dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    changegate = dv[0]["F_ChangeStackCell"].ToString();
                }

                 string[]  gate = changegate.Split(cc);//获得倒库货位的组合
                 int gatecount = gate.Length;
                 for (int k=0; k < stackcount;k++ )
                {
                    if (stack[k] != StackIndex.ToString())
                     {
                      
                 
                        for(int i=0;i<gatecount;i++)
                        {

                            if (gate[i] != lanegateindex.ToString())
                            {
                                string cell=string.Empty;
                                sql = string.Format("SELECT F_StackIndex, F_ChangeStackCell,F_LaneNo  FROM  T_Base_StackInfo where F_StackIndex={0} and F_ChangeStackCell like '%{1}%' ", stack[k],gate[i]);
                                dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
                                if (dv.Count > 0)
                                {
                                    lanegate = Convert.ToInt32(gate[i]);
                                    laneno=Convert.ToInt32(dv[0]["F_LaneNo"]);
                                    break;
                                }
                            }


                        }

                     }
                    if (lanegate>0)
                     {
                         newcell = GetChangeCellFromLaneGate(laneno, Convert.ToInt32(lanegate));
                       
                     }
                }

                 return newcell;

               

             }
            
            catch (Exception ex)
            {
                //CControlError = "分配堆垛机号GetWorkStackNo:" + ex.StackTrace + ex.Message;
                return newcell;
            }
            finally
            {
                dv.Dispose();
            }
        }

        public bool GetIfAreaFree(int taskindex, int VirtualStack, string AreaDevices,string EndAreaFreeDevice, out string message)
        {

            string sql = string.Empty;
            DataView dv = new DataView();
            DataView dv1 = new DataView();
            char[] cc = new char[1] { ',' };
            string[] zxy;

            string lanegates = string.Empty;//lanegate in  all device
            try
            {

                #region EndAreaFreeDevice==""
                if (EndAreaFreeDevice != "")
                {
                    if (AreaDevices == "")
                    {
                        AreaDevices = "0";
                    }
                    string[] devices = EndAreaFreeDevice.Split(cc);//ALL Device
                    int counts = devices.Length;

                    sql = string.Format("SELECT F_LaneGateDeviceIndex,F_ZXY,F_LaneIndex   FROM  T_Base_Lane_Gate where F_LaneGateDeviceIndex  in({0}) ", AreaDevices);
                    dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
                    //check gate task
                    int taskcount = 0;
                    int freedevicecount = 0;
                    for (int i = 0; i < dv.Count; i++)
                    {
                        string cell = dv[i]["F_ZXY"].ToString();
                        string gate = dv[i]["F_LaneGateDeviceIndex"].ToString();
                        int lane = Convert.ToInt32(dv[i]["F_LaneIndex"]);
                        zxy = cell.Split('-');

                        sql = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task,T_Base_StackInfo    WHERE F_Status >0 and F_DeviceIndex =F_StackIndex and F_LaneNo ={0} and   (F_DeviceCommandIndex =4 OR F_DeviceCommandIndex =5)  and (F_NumParam4 = {1}) AND (F_NumParam5 = {2}) AND (F_NumParam6 = {3})", lane, zxy[0], zxy[1], zxy[2]);

                        dv1 = dbo.ExceSQL(sql).Tables[0].DefaultView;
                        int count = dv1.Count;

                        taskcount += count;



                    }

                    for (int i = 0; i < devices.Length; i++)
                    {
                        //check if havegoods,  no alarm
                        if (devices[i] != "")
                        {
                            int deviceindex = Convert.ToInt32(devices[i]);
                            devinfo = Model.CGetInfo.GetDeviceInfo(deviceindex);
                            if (devinfo != null)
                            {

                                if (devinfo.SplitByte_0 == 0 && (devinfo.RunState == 0 || devinfo.RunState == 5))
                                {
                                    freedevicecount++;
                                }
                            }
                        }
                    }

                    int freecount = freedevicecount - taskcount;
                    if (freecount > 0)
                    {
                        message = string.Empty;
                        return true;
                    }
                    else
                    {
                        message = string.Format("在{0}中空位不足", EndAreaFreeDevice);
                        return false;

                    }
                }
                #endregion

                #region MyRegion
                else
                {
                    if (AreaDevices == "")
                    {
                        AreaDevices = "0";
                    }
                    string[] devices = AreaDevices.Split(cc);//ALL Device
                    int counts = devices.Length;

                    sql = string.Format("SELECT F_LaneGateDeviceIndex,F_ZXY,F_LaneIndex   FROM  T_Base_Lane_Gate where F_LaneGateDeviceIndex  in({0}) ", AreaDevices);
                    dv = dbo.ExceSQL(sql).Tables[0].DefaultView;

                    //check gate task
                    for (int i = 0; i < dv.Count; i++)
                    {
                        string cell = dv[i]["F_ZXY"].ToString();
                        string gate = dv[i]["F_LaneGateDeviceIndex"].ToString();
                        int lane = Convert.ToInt32(dv[i]["F_LaneIndex"]);
                        zxy = cell.Split('-');

                        sql = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task,T_Base_StackInfo    WHERE F_Status >0 and F_DeviceIndex =F_StackIndex and F_LaneNo ={0} and   (F_DeviceCommandIndex =4 OR F_DeviceCommandIndex =5)  and (F_NumParam4 = {1}) AND (F_NumParam5 = {2}) AND (F_NumParam6 = {3})", lane, zxy[0], zxy[1], zxy[2]);
                        //sql = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task,T_Base_StackInfo    WHERE  F_DeviceIndex !={4} and F_MonitorIndex!={5}   and F_DeviceIndex =F_StackIndex and F_LaneNo ={0} and   (F_DeviceCommandIndex =4 OR F_DeviceCommandIndex =5)  and (F_NumParam4 = {1}) AND (F_NumParam5 = {2}) AND (F_NumParam6 = {3})", lane, zxy[0], zxy[1], zxy[2], VirtualStack,taskindex);

                        dv1 = dbo.ExceSQL(sql).Tables[0].DefaultView;
                        if (dv1.Count > 0)
                        {
                            message = string.Format("存在到{0}的任务", gate);
                            return false;
                        }

                    }

                    for (int i = 0; i < devices.Length; i++)
                    {
                        //check if havegoods,  no alarm
                        if (devices[i] != "")
                        {
                            int deviceindex = Convert.ToInt32(devices[i]);
                            devinfo = Model.CGetInfo.GetDeviceInfo(deviceindex);
                            if (devinfo != null)
                            {
                                if (devinfo.RunState != 0 && devinfo.RunState != 5)
                                {
                                    message = string.Format("{0}不空闲", deviceindex);
                                    return false;
                                }
                                if (devinfo.SplitByte_0 == 1)
                                {
                                    message = string.Format("{0}有货", deviceindex);
                                    return false;
                                }
                            }
                        }
                    }
                    //logict havegoods 
                    sql = string.Format("SELECT F_DeviceIndex,F_HaveGoods FROM T_Base_Device where F_HaveGoods=1 and  F_DeviceIndex  in({0}) ", AreaDevices);
                    dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
                    if (dv.Count > 0)
                    {
                        message = string.Format("在{0}中有设备逻辑有物", AreaDevices);
                        return false;
                    }



                    //check area task

                    if (counts > 1)
                    {
                        sql = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE  F_Status >0 and (F_NumParam4 in({0}) OR   F_NumParam1  in({1}))", AreaDevices, AreaDevices);
                        dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
                        if (dv.Count > 0)
                        {
                            message = string.Format("在{0}中有设备存在任务", AreaDevices);
                            return false;
                        }
                    }

                    message = string.Empty;
                    return true;
                }

                #endregion







            }

            catch (Exception ex)
            {
                message = "GetIfAreaFree:" + ex.StackTrace + ex.Message;
                return false;
            }
            finally
            {
                dv.Dispose();
                dv1.Dispose();
            }
        }
        public bool GetIfAreaFree(int taskindex, int VirtualStack, string AreaDevices, out string message)
        {

            string sql = string.Empty;
            DataView dv = new DataView();
            DataView dv1 = new DataView();
            char[] cc = new char[1] { ',' };
            string[] zxy;

            string lanegates = string.Empty;//lanegate in  all device
            try
            {
                if(AreaDevices=="")
                {
                    AreaDevices = "0";
                }
                string[] devices = AreaDevices.Split(cc);//ALL Device
                int counts = devices.Length;

                sql = string.Format("SELECT F_LaneGateDeviceIndex,F_ZXY,F_LaneIndex   FROM  T_Base_Lane_Gate where F_LaneGateDeviceIndex  in({0}) ", AreaDevices);
                dv = dbo.ExceSQL(sql).Tables[0].DefaultView;

                //check gate task
                    for(int i=0;i<dv.Count;i++)
                    {
                      string cell = dv[i]["F_ZXY"].ToString();
                      string gate= dv[i]["F_LaneGateDeviceIndex"].ToString();
                     int lane = Convert.ToInt32(dv[i]["F_LaneIndex"]);
                      zxy = cell.Split('-');

                    sql = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task,T_Base_StackInfo    WHERE F_Status >0 and F_DeviceIndex =F_StackIndex and F_LaneNo ={0} and   (F_DeviceCommandIndex =4 OR F_DeviceCommandIndex =5)  and (F_NumParam4 = {1}) AND (F_NumParam5 = {2}) AND (F_NumParam6 = {3})", lane, zxy[0], zxy[1], zxy[2]);
                    //sql = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task,T_Base_StackInfo    WHERE  F_DeviceIndex !={4} and F_MonitorIndex!={5}   and F_DeviceIndex =F_StackIndex and F_LaneNo ={0} and   (F_DeviceCommandIndex =4 OR F_DeviceCommandIndex =5)  and (F_NumParam4 = {1}) AND (F_NumParam5 = {2}) AND (F_NumParam6 = {3})", lane, zxy[0], zxy[1], zxy[2], VirtualStack,taskindex);

                    dv1 = dbo.ExceSQL(sql).Tables[0].DefaultView;
                      if(dv1.Count>0)
                       {
                        message = string.Format("存在到{0}的任务", gate);
                        return false;
                       }

                    }
              
                for (int i=0;i< devices.Length;i++)
                {
                    //check if havegoods,  no alarm
                    if(devices[i]!="")
                    { 
                       int deviceindex = Convert.ToInt32(devices[i]);
                       devinfo = Model.CGetInfo.GetDeviceInfo(deviceindex);
                       if (devinfo != null)
                        {
                            if(devinfo.RunState!=0&& devinfo.RunState != 5 && devinfo.RunState != 1)
                            {
                                message = string.Format("{0}不空闲", deviceindex);
                                return false;
                            }
                            if (devinfo.SplitByte_0==1)
                            {
                                message = string.Format("{0}有货", deviceindex);
                                return false;
                            }
                        }
                     }
                }
                //logict havegoods 
                sql = string.Format("SELECT F_DeviceIndex,F_HaveGoods FROM T_Base_Device where F_HaveGoods=1 and  F_DeviceIndex  in({0}) ", AreaDevices);
                dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
                if(dv.Count>0)
                {
                    message = string.Format("在{0}中有设备逻辑有物", AreaDevices);
                    return false;
                }



                //check area task

                if (counts > 1)
                {
                    sql = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE  F_Status >0 and (F_NumParam4 in({0}) OR   F_NumParam1  in({1}))", AreaDevices, AreaDevices);
                    dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
                    if (dv.Count > 0)
                    {
                        message = string.Format("在{0}中有设备存在任务", AreaDevices);
                        return false;
                    }
                }

                message = string.Empty;
                return true;



            }

            catch (Exception ex)
            {
                message = "GetIfAreaFree:" + ex.StackTrace + ex.Message;
                return false;
            }
            finally
            {
                dv.Dispose();
                dv1.Dispose();
            }
        }
        public string GetDoubleFreeStation(string AreaDevices, int UseAwayFork,int UseAwayFork2,out string stationcell2, out string message)
        {

            string sql = string.Empty;
            DataView dv = new DataView();
            DataView dv1 = new DataView();

            string[] zxy;
            string stationcell = "-";
           string  tempstationcell2 = "-";
            stationcell2= "-";
            string lanegroup = string.Empty;

            try
            {

                if (UseAwayFork == 0)
                {
                    sql = string.Format("SELECT F_LaneGateDeviceIndex,F_ZXY,F_LaneIndex,F_LaneGroup   FROM  T_Base_Lane_Gate where F_LaneGateDeviceIndex  in({0}) ", AreaDevices);

                }
                else
                {
                    sql = string.Format("SELECT F_LaneGateDeviceIndex,F_ZXY,F_LaneIndex,F_LaneGroup   FROM  T_Base_Lane_Gate where F_LaneGateDeviceIndex  in({0})  and  F_UseFork={1} ", AreaDevices, UseAwayFork);

                }

                dv = dbo.ExceSQL(sql).Tables[0].DefaultView;

                //check gate task
                for (int i = 0; i < dv.Count; i++)
                {
                    string cell = dv[i]["F_ZXY"].ToString();
                    int gate = Convert.ToInt32(dv[i]["F_LaneGateDeviceIndex"]);
                    int lane = Convert.ToInt32(dv[i]["F_LaneIndex"]);

                    zxy = cell.Split('-');

                    sql = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task,T_Base_StackInfo    WHERE  F_DeviceIndex =F_StackIndex and F_LaneNo ={0} and   (F_DeviceCommandIndex =4 OR F_DeviceCommandIndex =5)  and (F_NumParam4 = {1}) AND (F_NumParam5 = {2}) AND (F_NumParam6 = {3})", lane, zxy[0], zxy[1], zxy[2]);
                    dv1 = dbo.ExceSQL(sql).Tables[0].DefaultView;
                    if (dv1.Count > 0)
                    {
                        message = string.Format("存在到{0}的任务", gate);
                        continue;
                    }
                    devinfo = Model.CGetInfo.GetDeviceInfo(gate);
                    if (devinfo != null)
                    {
                        if (devinfo.SplitByte_0 == 1)
                        {
                            message = string.Format("{0}有货", gate);
                            continue;
                        }
                    }

                    //logict havegoods 
                    sql = string.Format("SELECT F_DeviceIndex,F_HaveGoods FROM T_Base_Device where F_HaveGoods=1 and  F_DeviceIndex  in({0}) ", gate);
                    dv1 = dbo.ExceSQL(sql).Tables[0].DefaultView;
                    if (dv1.Count > 0)
                    {
                        message = string.Format("{0}逻辑有货", gate);
                        continue;
                    }

                    lanegroup = Convert.ToString(dv[i]["F_LaneGroup"]);
                    lanegroup = lanegroup.Replace(';', ',');
                    tempstationcell2 = GetFreeStation(lanegroup, UseAwayFork2, out message);
                    if (tempstationcell2!= "-")
                    {
                        stationcell2 = tempstationcell2;
                        stationcell = cell;
                        break;
                    }
                    else
                    {
                        continue;
                    }
                }


                message = string.Empty;
                return stationcell;



            }

            catch (Exception ex)
            {
                message = "GetFreeStation:" + ex.StackTrace + ex.Message;
                return "-";
            }
            finally
            {
                dv.Dispose();
                dv1.Dispose();
            }
        }
        public  string  GetFreeStation(string AreaDevices, int UseAwayFork, out string message)
        {

            string sql = string.Empty;
            DataView dv = new DataView();
            DataView dv1 = new DataView();

            string[] zxy;
            string stationcell="-";
          
            try
            {
            
                if (UseAwayFork == 0)
                {
                    sql = string.Format("SELECT F_LaneGateDeviceIndex,F_ZXY,F_LaneIndex   FROM  T_Base_Lane_Gate where F_LaneGateDeviceIndex  in({0}) ", AreaDevices);

                }
                else
                {
                    sql = string.Format("SELECT F_LaneGateDeviceIndex,F_ZXY,F_LaneIndex   FROM  T_Base_Lane_Gate where F_LaneGateDeviceIndex  in({0})  and  F_UseFork={1} ", AreaDevices,UseAwayFork);

                }

                dv = dbo.ExceSQL(sql).Tables[0].DefaultView;

                //check gate task
                for (int i = 0; i < dv.Count; i++)
                {
                    string cell = dv[i]["F_ZXY"].ToString();
                    int gate =Convert.ToInt32(dv[i]["F_LaneGateDeviceIndex"]);
                    int lane = Convert.ToInt32(dv[i]["F_LaneIndex"]);
                    zxy = cell.Split('-');

                    sql = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task,T_Base_StackInfo    WHERE  F_DeviceIndex =F_StackIndex and F_LaneNo ={0} and   (F_DeviceCommandIndex =4 OR F_DeviceCommandIndex =5)  and (F_NumParam4 = {1}) AND (F_NumParam5 = {2}) AND (F_NumParam6 = {3})", lane, zxy[0], zxy[1], zxy[2]);
                    dv1 = dbo.ExceSQL(sql).Tables[0].DefaultView;
                    if (dv1.Count > 0)
                    {
                        message = string.Format("存在到{0}的任务", gate);
                        continue;
                    }
                    devinfo = Model.CGetInfo.GetDeviceInfo(gate);
                    if (devinfo != null)
                    {
                        if (devinfo.SplitByte_0 == 1)
                        {
                            message = string.Format("{0}有货", gate);
                            continue;
                        }
                    }

                    //logict havegoods 
                    sql = string.Format("SELECT F_DeviceIndex,F_HaveGoods FROM T_Base_Device where F_HaveGoods=1 and  F_DeviceIndex  in({0}) ", gate);
                    dv1 = dbo.ExceSQL(sql).Tables[0].DefaultView;
                    if (dv1.Count > 0)
                    {
                        message = string.Format("{0}逻辑有货", gate);
                        continue;
                    }

                    stationcell = cell;
                    break;
                }


                message = string.Empty;
                return stationcell;



            }

            catch (Exception ex)
            {
                message = "GetFreeStation:" + ex.StackTrace + ex.Message;
                return "-";
            }
            finally
            {
                dv.Dispose();
                dv1.Dispose();
            }
        }

        /// <summary>
        ///  [0]  F_LaneGateDeviceIndex  ,[1] =  F_LaneIndex ,[2] = F_ExchangeStation  ,[3] = F_EndAreaDevice
        /// </summary>
        /// <param name="cell"></param>
        /// <returns></returns>
        public string[] GetExchangeStationAndEndAreaFromLaneGate(string cell)
        {
            DataView dv = new DataView();
            string sqlstr;
            try
            {

                string[] rr = new string[5];//20181006

                //20101124

                sqlstr = string.Format("SELECT F_LaneGateDeviceIndex,F_LaneIndex,F_ExchangeStation,F_EndAreaDevice,F_EndAreaFreeDevice  FROM T_Base_Lane_Gate WHERE  F_ExchangeStation is not null and F_ZXY  ='{0}'", cell);
                dv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView;

                dv = dbo.ExceSQL(sqlstr.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    rr[0] = Convert.ToString( dv[0]["F_LaneGateDeviceIndex"]);
                    rr[1] = Convert.ToString( dv[0]["F_LaneIndex"]);
                    rr[2] = Convert.ToString( dv[0]["F_ExchangeStation"]);
                    rr[3] = Convert.ToString( dv[0]["F_EndAreaDevice"]);
                    rr[4] = Convert.ToString(dv[0]["F_EndAreaFreeDevice"]);

                    return rr;
                }
                else
                { return null; }


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

            }
        }
        public int GetLaneCountsStackIn(int deviceIndex)
        {//20111020
            DataView dv = new DataView();
            try
            {
                string sql = string.Empty;


                sql = string.Format("SELECT F_LaneDeviceIndex  FROM  T_Base_LaneInfo  WHERE  F_StackIndex = {0} ", deviceIndex);

                dv = dbo.ExceSQL(sql).Tables[0].DefaultView;

                return dv.Count;
        

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        public int GetLaneByTask(int Taskindex,int order )
        {//20111020
            DataView dv = new DataView();
            int Lane=0;
            try
            {
                string sql = string.Empty;

                string Zname = "F_NumParam1";
                if (order == 3 || order == 5)
                {
                    Zname = "F_NumParam4";
                }

                sql = string.Format("SELECT {0}  FROM T_Monitor_Task   WHERE  F_MonitorIndex = {1} ",Zname, Taskindex);

                dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
                int TaskZ=0;
                if(dv.Count>0)
                {
                  TaskZ=  Convert.ToInt32(dv[0][0]);
                //判读所在巷道
                  //双伸
                  //int temp1 = TaskZ % 4;
                  //int temp2 = TaskZ / 4;
                  //单伸堆垛机
                  int temp1 = TaskZ % 2;
                  int temp2 = TaskZ / 2;
                  if (temp1==0)
                  {
                      Lane = temp2;
                  }
                  else
                  {
                      Lane = temp2 + 1;
                  }

                }
                return Lane;


            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        public bool IfExistTaskInLane(int Lane)
        {//20111020
            DataView dv = new DataView();
     
            try
            {
                string sql = string.Empty;

                int minZ = 0;
                int MaxZ = 0;
                //双伸
                //minZ = (Lane - 1) * 4 + 1;
                //MaxZ = Lane * 4;
                minZ = (Lane - 1) * 2 + 1;
                MaxZ = Lane * 2;

                sql = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_NumParam1 >={0} and  F_NumParam1<={1}) ", minZ, MaxZ);

                dv = dbo.ExceSQL(sql).Tables[0].DefaultView;

                if (dv.Count > 0)
                {
                    return true;

                }
                else
                {
                    return false;
                }


            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        //双伸转换排
        public int  IfExistFarCellTask(int Managetaskkind, int Managetaskindex)
        {//20111020
            DataView dv = new DataView();

            try
            {
                string sql = string.Empty;
                string cell=string.Empty;
                string[] zxy;
              

                sql = string.Format("SELECT FSTARTCELL FROM  T_Manage_Task  WHERE (F_ManageTaskKindIndex  ={0}  and  FID ={1}) ", Managetaskkind, Managetaskindex);

                dv = dbo.ExceSQL(sql).Tables[0].DefaultView;

                if (dv.Count > 0)
                {

                    cell = Convert.ToString(dv[0][0]);
                    zxy = cell.Split('-');
                    string farcell=string.Empty;;
                    if (zxy.Length > 2)//起点货位是有效货位
                    {

                        int Z = Convert.ToInt32(zxy[0]);
                        int temp = Z % 2;
                        int newZ;
                        if (temp == 2 || temp == 3)//是近货位,生成远货位的坐标
                        {

                            if (temp == 2)//左侧近货位:2,6,10,14
                            {
                                newZ = Z - 1;
                            }
                            else
                            {
                                newZ = Z + 1;
                            }

                            farcell = string.Format("{0:D2}-{1:D2}-{2:D2}", newZ, zxy[1], zxy[2]);//获得外位坐标

                            //是否有起点是远货位的任务

                        }
                        sql = string.Format("SELECT FID FROM T_Manage_Task WHERE  (FSTARTCELL = '{0}') ", farcell);

                        dv = dbo.ExceSQL(sql).Tables[0].DefaultView;
                        if (dv.Count > 0)
                        {
                            //return Convert.ToInt32(dv[0][0]);
                            return 0;
                        }
                        else
                        {
                            return 0;
                        }
                        //
                    }
                    else
                    {
                        return 0;
                    }
                }
                else
                {
                    return 0;
                }


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

        //202410 HSCP - 判断出入库是否存在任务
        /// <summary>
        /// 判断是否有起点的入库任务
        /// </summary>
        /// <param name="Instart">入库起点设备</param>
        /// <returns>有1,无0 </returns>
        public bool HaveInTaskFromStart(int InStart)
        {
            DataView dv = new DataView();
            try
            {
                dv = dbo.ExceSQL("select F_CheckStation from T_Base_Station_Model where F_Station_Code = " + InStart).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    InStart = Convert.ToInt32(dv[0]["F_CheckStation"]);
                }

                dv = dbo.ExceSQL("select fid  from T_Manage_Task where FSTARTDEVICE = " + InStart).Tables[0].DefaultView;
                if (dv.Count > 0)
                {

                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception ex)
            {//20100108
                throw ex;
            }
            finally
            {//20100108
                dv.Dispose();

            }
        }

        /// <summary>
        /// 判断是否有起点的入库任务
        /// </summary>
        /// <param name="OutEnd">出库终点设备</param>
        /// <returns>有1,无0 </returns>
        public bool HaveOutTaskToEnd(int OutEnd)
        {
            DataView dv = new DataView();
            try
            {

                dv = dbo.ExceSQL("select F_CheckStation from T_Base_Station_Model where F_Station_Code = " + OutEnd).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    OutEnd = Convert.ToInt32(dv[0]["F_CheckStation"]);
                }


                dv = dbo.ExceSQL("select fid  from T_Manage_Task where FENDDEVICE = " + OutEnd).Tables[0].DefaultView;
                if (dv.Count > 0)
                {

                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();

            }
        }


    }
}