using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
using System.ServiceModel;
using System.Linq;
using SiaSun.LMS.Model;
using System.Net;

namespace SiaSun.LMS.Implement
{
    [ServiceBehavior(IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple, MaxItemsInObjectGraph = int.MaxValue)]
    public partial class S_CellService : SiaSun.LMS.Implement.S_BaseService, SiaSun.LMS.Interface.I_CellService
    {
        public S_CellService()
        {
        }

        /// <summary>获得库房
        /// 获得库房
        /// </summary>
        /// <param name="WAREHOUSE_CODE">库房编码</param>
        /// <returns>返回值</returns>
        public DataTable WAREHOUSE_GetList(int USER_ID, string WAREHOUSE_TYPE)
        {
            DataTable dt = this.GetList(string.Format(@"SELECT WAREHOUSE_ID,WAREHOUSE_NAME FROM WH_WAREHOUSE 
                                                        WHERE {0} {1}",
                                                        USER_ID == 0 ? "1=1" : string.Format(@"(WAREHOUSE_ID IN(SELECT RELATION_ID2 
                                                        FROM V_SYS_RELATION WHERE RELATION_CODE='SYS_USER-WH_WAREHOUSE'
                                                        AND RELATION_ID1= {0}))", USER_ID),
                                                        WAREHOUSE_TYPE == string.Empty ? string.Empty : string.Format("AND WAREHOUSE_TYPE = '{0}'", WAREHOUSE_TYPE)));

            return dt;
        }

        /// <summary>获得库区
        /// 获得库区
        /// </summary>
        /// <param name="WAREHOUSE_ID">库房编号</param>
        /// <param name="AREA_TYPE">库区类型</param>
        /// <returns>返回值</returns>
        public DataTable AREA_GetList(int WAREHOUSE_ID, string AREA_TYPE)
        {
            string sSQL = "SELECT AREA_ID,AREA_CODE,AREA_NAME,AREA_TYPE FROM WH_AREA WHERE 1=1 {0} {1}";

            DataTable dt = this.GetList(string.Format(sSQL,
                (0 != WAREHOUSE_ID) ? string.Empty : string.Format(" AND WAREHOUSE_ID = {0}", WAREHOUSE_ID.ToString()),
                string.IsNullOrEmpty(AREA_TYPE) ? string.Empty : string.Format(" AND AREA_TYPE = '{0}'", AREA_TYPE)));

            return dt;
        }

        /// <summary>获得排
        /// 获得排没有area_id区分
        /// </summary>
        /// <param name="WAREHOUSE_ID">库房编号</param>
        /// <param name="AREA_ID">库区编号</param>
        /// <param name="LOGIC_ID">存储区编号</param>
        /// <param name="CELL_TYPE">货位类型</param>
        /// <param name="CELL_INOUT">出入库方向</param>
        /// <returns></returns>
        public DataTable CELL_Z_GetList(int WAREHOUSE_ID)
        {
            string sSQL = "SELECT * FROM V_WH_CELL_Z WHERE 1=1 {0} ORDER BY CELL_Z";

            DataTable dt = this.GetList(string.Format(sSQL,
                (0 == WAREHOUSE_ID) ? string.Empty : string.Format(" AND WAREHOUSE_ID = {0}", WAREHOUSE_ID.ToString())
                ));

            return dt;
        }

        /// <summary>获得排
        /// 获得排有area_id区分
        /// </summary>
        /// <param name="WAREHOUSE_ID">库房编号</param>
        /// <param name="AREA_ID">库区编号</param>
        /// <param name="LOGIC_ID">存储区编号</param>
        /// <param name="CELL_TYPE">货位类型</param>
        /// <param name="CELL_INOUT">出入库方向</param>
        /// <returns></returns>
        public DataTable CELL_Z_GetList_AREA(int WAREHOUSE_ID, int AREA_ID)
        {
            string sSQL = "SELECT * FROM V_WH_CELL_Z WHERE 1=1 {0} {1} ORDER BY CELL_Z";

            DataTable dt = this.GetList(string.Format(sSQL,
                (0 == WAREHOUSE_ID) ? string.Empty : string.Format(" AND WAREHOUSE_ID = {0}", WAREHOUSE_ID.ToString()),
                (0 == AREA_ID) ? string.Empty : string.Format(" AND AREA_ID = {0}", AREA_ID.ToString())
                ));

            return dt;
        }

        public IList<SiaSun.LMS.Model.WH_CELL> CELL_GetList_Z(int WAREHOUSE_ID, string CELL_Z)
        {
            return this._P_WH_CELL.CELL_GetList_Z(WAREHOUSE_ID, CELL_Z);
        }



        public bool CellInit()
        {
            bool bResult = true;

            try
            {
                IList<SiaSun.LMS.Model.WH_DESCRIPTION> lsWH_DESCRIPTION = this._P_WH_DESCRIPTION.GetList();

                foreach (SiaSun.LMS.Model.WH_DESCRIPTION mWH_DESCRIPTION in lsWH_DESCRIPTION)
                {
                    if (mWH_DESCRIPTION.CELL_TYPE == SiaSun.LMS.Enum.CELL_TYPE.Cell.ToString())
                        bResult = this.CellCreate(mWH_DESCRIPTION.WAREHOUSE_ID,
                                                  mWH_DESCRIPTION.AREA_ID,
                                                  mWH_DESCRIPTION.LOGIC_ID,
                                                  mWH_DESCRIPTION.START_Z,
                                                  mWH_DESCRIPTION.END_Z,
                                                  mWH_DESCRIPTION.START_X,
                                                  mWH_DESCRIPTION.END_X,
                                                  mWH_DESCRIPTION.START_Y,
                                                  mWH_DESCRIPTION.END_Y,
                                                  mWH_DESCRIPTION.DEVICE_CODE,
                                                  mWH_DESCRIPTION.LANE_WAY,
                                                  mWH_DESCRIPTION.SHELF_TYPE,
                                                  mWH_DESCRIPTION.SHELF_NEIGHBOUR,
                                                  mWH_DESCRIPTION.CELL_MODEL,
                                                  mWH_DESCRIPTION.CELL_LOGICAL_NAME,
                                                  mWH_DESCRIPTION.CELL_INOUT,
                                                  mWH_DESCRIPTION.CELL_TYPE,
                                                  mWH_DESCRIPTION.CELL_STORAGE_TYPE,
                                                  mWH_DESCRIPTION.CELL_FORK_TYPE,
                                                  mWH_DESCRIPTION.CELL_WIDTH,
                                                  mWH_DESCRIPTION.CELL_HEIGHT,
                                                  Convert.ToInt32(mWH_DESCRIPTION.CELL_FORK_COUNT)

                                                  );

                    else
                        bResult = this.CellCreate(mWH_DESCRIPTION.WAREHOUSE_ID,
                                                  mWH_DESCRIPTION.AREA_ID,
                                         mWH_DESCRIPTION.LOGIC_ID,
                                         mWH_DESCRIPTION.DEVICE_CODE,
                                         mWH_DESCRIPTION.DEVICE_NAME,
                                         mWH_DESCRIPTION.LANE_WAY,
                                         mWH_DESCRIPTION.SHELF_TYPE,
                                         mWH_DESCRIPTION.SHELF_NEIGHBOUR,
                                         mWH_DESCRIPTION.CELL_MODEL,
                                         mWH_DESCRIPTION.CELL_LOGICAL_NAME,
                                         mWH_DESCRIPTION.CELL_INOUT,
                                         mWH_DESCRIPTION.CELL_TYPE,
                                         mWH_DESCRIPTION.CELL_STORAGE_TYPE,
                                         mWH_DESCRIPTION.CELL_FORK_TYPE,
                                         mWH_DESCRIPTION.CELL_WIDTH,
                                         mWH_DESCRIPTION.CELL_HEIGHT

                                         );


                }
            }
            catch (Exception ex)
            {
                bResult = false;

            }


            return bResult;
        }



        /// <summary>获得-新建
        /// 获得-新建
        /// </summary>
        /// <param name="AREA_ID"></param>
        /// <param name="z_begin"></param>
        /// <param name="z_end"></param>
        /// <param name="x_begin"></param>
        /// <param name="x_end"></param>
        /// <param name="y_begin"></param>
        /// <param name="y_end"></param>
        /// <param name="WAREHOUSE_CODE"></param>
        /// <param name="AREA_TYPE"></param>
        /// <param name="LANE_WAY"></param>
        /// <param name="CELL_MODEL"></param>
        /// <param name="SHELF_TYPE"></param>
        /// <param name="SHELF_NEIGHBOUR"></param>
        /// <param name="CELL_LOGICAL_NAME"></param>
        /// <param name="CELL_STATUS"></param>
        /// <param name="RUN_STATUS"></param>
        /// <param name="CELL_TYPE"></param>
        /// <param name="DEVICE_CODE"></param>
        /// <returns></returns>
        public bool CellCreate(int WAREHOUSE_ID,
                                int AREA_ID,
                                int LOGIC_ID,
                                int z_begin,
                                int z_end,
                                int x_begin,
                                int x_end,
                                int y_begin,
                                int y_end,
                                string DEVICE_CODE,
                                string LANE_WAY,
                                string SHELF_TYPE,
                                string SHELF_NEIGHBOUR,
                                string CELL_MODEL,
                                string CELL_LOGICAL_NAME,
                                string CELL_INOUT,
                                string CELL_TYPE,
                                string CELL_STORAGE_TYPE,
                                string CELL_FORK_TYPE,
                                int CELL_WIDTH,
                                int CELL_HEIGHT,
                                int CELL_FORK_COUNT
                                )
        {
            bool bResult = true;

            SiaSun.LMS.Model.WH_CELL mST_CELL = new SiaSun.LMS.Model.WH_CELL();

            for (int z = z_begin; z <= z_end; z++)
            {
                for (int x = x_begin; x <= x_end; x++)
                {
                    for (int y = y_begin; y <= y_end; y++)
                    {
                        mST_CELL.WAREHOUSE_ID = WAREHOUSE_ID;
                        mST_CELL.AREA_ID = AREA_ID;
                        mST_CELL.LOGIC_ID = LOGIC_ID;
                        mST_CELL.CELL_CODE = z.ToString().PadLeft(2, '0') + "-" + x.ToString().PadLeft(2, '0') + "-" + y.ToString().PadLeft(2, '0');
                        mST_CELL.CELL_NAME = z.ToString().PadLeft(2, '0') + "-" + x.ToString().PadLeft(2, '0') + "-" + y.ToString().PadLeft(2, '0');
                        mST_CELL.LANE_WAY = LANE_WAY;
                        mST_CELL.DEVICE_CODE = DEVICE_CODE;
                        mST_CELL.SHELF_TYPE = SHELF_TYPE;
                        mST_CELL.SHELF_NEIGHBOUR = SHELF_NEIGHBOUR;
                        mST_CELL.CELL_MODEL = CELL_MODEL;
                        mST_CELL.CELL_LOGICAL_NAME = CELL_LOGICAL_NAME;
                        mST_CELL.CELL_INOUT = CELL_INOUT;
                        mST_CELL.CELL_TYPE = CELL_TYPE;
                        mST_CELL.CELL_STORAGE_TYPE = CELL_STORAGE_TYPE;
                        mST_CELL.CELL_FORK_TYPE = CELL_FORK_TYPE;
                        mST_CELL.CELL_Z = z;
                        mST_CELL.CELL_X = x;
                        mST_CELL.CELL_Y = y;
                        mST_CELL.CELL_STATUS = SiaSun.LMS.Enum.CELL_STATUS.Nohave.ToString();
                        mST_CELL.RUN_STATUS = SiaSun.LMS.Enum.RUN_STATUS.Enable.ToString();
                        mST_CELL.CELL_FLAG = "1";
                        mST_CELL.CELL_WIDTH = CELL_WIDTH;
                        mST_CELL.CELL_HEIGHT = CELL_HEIGHT;

                        mST_CELL.CELL_GROUP = z.ToString().PadLeft(2, '0') + "-" + (x % CELL_FORK_COUNT == 0 ? (x / CELL_FORK_COUNT) : (x / CELL_FORK_COUNT) + 1).ToString().PadLeft(2, '0') + "-" + y.ToString().PadLeft(2, '0');
                        if (SHELF_TYPE == "Double")
                        {
                            mST_CELL.LOCK_DEVICE_CODE = SHELF_NEIGHBOUR.ToString().PadLeft(2, '0') + "-" + x.ToString().PadLeft(2, '0') + "-" + y.ToString().PadLeft(2, '0');
                        }
                        //lyc
                        this._P_WH_CELL.Add(mST_CELL);

                        //SiaSun.LMS.Model.WH_CELL temp_st_cell = this._P_WH_CELL.GetModel(AREA_ID, mST_CELL.CELL_CODE);

                        //if (null == temp_st_cell)
                        //{
                        //    this._P_WH_CELL.Add(mST_CELL);
                        //}
                        //else
                        //{
                        //    mST_CELL.CELL_ID = temp_st_cell.CELL_ID;

                        //    mST_CELL.CELL_STATUS = temp_st_cell.CELL_STATUS;

                        //    mST_CELL.RUN_STATUS = temp_st_cell.RUN_STATUS;

                        //    this._P_WH_CELL.Update(mST_CELL);
                        //}
                    }
                }
            }

            return bResult;
        }

        /// <summary>获得-新建
        /// 获得-新建
        /// </summary>
        /// <param name="AREA_ID"></param>
        /// <param name="CELL_CODE"></param>
        /// <param name="CELL_NAME"></param>
        /// <param name="WAREHOUSE_CODE"></param>
        /// <param name="AREA_TYPE"></param>
        /// <param name="LANE_WAY"></param>
        /// <param name="CELL_MODEL"></param>
        /// <param name="SHELF_TYPE"></param>
        /// <param name="SHELF_NEIGHBOUR"></param>
        /// <param name="CELL_LOGICAL_NAME"></param>
        /// <param name="CELL_STATUS"></param>
        /// <param name="RUN_STATUS"></param>
        /// <param name="CELL_TYPE"></param>
        /// <param name="DEVICE_CODE"></param>
        /// <returns></returns>
        public bool CellCreate(int WAREHOUSE_ID, int AREA_ID,
                                int LOGIC_ID,
                                string DEVICE_CODE,
                                string DEVICE_NAME,
                                string LANE_WAY,
                                string SHELF_TYPE,
                                string SHELF_NEIGHBOUR,
                                string CELL_MODEL,
                                string CELL_LOGICAL_NAME,
                                string CELL_INOUT,
                                string CELL_TYPE,
                                string CELL_STORAGE_TYPE,
                                string CELL_FORK_TYPE,
                                int CELL_WIDTH,
                                int CELL_HEIGHT
                               )
        {
            bool bResult = true;

            SiaSun.LMS.Model.WH_CELL mST_CELL = new SiaSun.LMS.Model.WH_CELL();

            mST_CELL.AREA_ID = AREA_ID;
            mST_CELL.WAREHOUSE_ID = WAREHOUSE_ID;
            mST_CELL.LOGIC_ID = LOGIC_ID;
            mST_CELL.CELL_CODE = DEVICE_CODE;
            mST_CELL.CELL_NAME = DEVICE_NAME;
            mST_CELL.LANE_WAY = LANE_WAY;
            mST_CELL.DEVICE_CODE = DEVICE_CODE;
            mST_CELL.SHELF_TYPE = SHELF_TYPE;
            mST_CELL.SHELF_NEIGHBOUR = SHELF_NEIGHBOUR;
            mST_CELL.CELL_MODEL = CELL_MODEL;
            mST_CELL.CELL_LOGICAL_NAME = CELL_LOGICAL_NAME;
            mST_CELL.CELL_INOUT = CELL_INOUT;
            mST_CELL.CELL_TYPE = CELL_TYPE;
            mST_CELL.CELL_STORAGE_TYPE = CELL_STORAGE_TYPE;
            mST_CELL.CELL_FORK_TYPE = CELL_FORK_TYPE;
            mST_CELL.CELL_Z = 0;
            mST_CELL.CELL_X = 0;
            mST_CELL.CELL_Y = 0;
            mST_CELL.CELL_STATUS = SiaSun.LMS.Enum.CELL_STATUS.Nohave.ToString();
            mST_CELL.RUN_STATUS = SiaSun.LMS.Enum.RUN_STATUS.Enable.ToString();
            mST_CELL.CELL_FLAG = "1";
            mST_CELL.CELL_HEIGHT = CELL_HEIGHT;
            mST_CELL.CELL_WIDTH = CELL_WIDTH;


            SiaSun.LMS.Model.WH_CELL temp_st_cell = this._P_WH_CELL.GetModel(AREA_ID, mST_CELL.CELL_CODE);

            if (null == temp_st_cell)
            {
                this._P_WH_CELL.Add(mST_CELL);
            }
            else
            {
                mST_CELL.CELL_ID = temp_st_cell.CELL_ID;

                mST_CELL.CELL_STATUS = temp_st_cell.CELL_STATUS;

                mST_CELL.RUN_STATUS = temp_st_cell.RUN_STATUS;

                this._P_WH_CELL.Update(mST_CELL);
            }

            return bResult;
        }

        /// <summary>获得入库货位
        /// 获得入库货位
        /// </summary>
        /// <param name="WAREHOUSE_ID">库房编号</param>
        /// <param name="AREA_ID">库区编号</param>
        /// <param name="LOGIC_ID">存储区编号</param>
        /// <param name="START_CELL_ID">起始货位</param>
        /// <param name="CELL_STATUS">货位状态</param>
        /// <param name="RUN_STATUS">运行状态</param>
        /// <param name="CELL_MODEL">货位尺寸</param>
        /// <param name="STOCK_BARCODE">托盘条码</param>
        /// <param name="END_CELL_ID">终止货位</param>
        /// <param name="sResult">返回结果</param>
        /// <returns></returns>
        public bool CellInAllocate(string START_DEVICE_CODE, string CELL_MODEL, int MANAGE_ID, out int END_CELL_ID, out string sResult)
        {
            sResult = string.Empty;
            bool bResult = true;
            int DEVICE_CODE = 0;
            int index = 0;
            int index_n = 0;
            string PnOrder = string.Empty;
            string ordered = string.Empty;
            string strLaneway = string.Empty;
           
            SiaSun.LMS.Model.MANAGE_MAIN mMANAGE_MAIN = this._P_MANAGE_MAIN.GetModel(MANAGE_ID);
           
            IList<Model.MANAGE_LIST> lsManageList = this._P_MANAGE_LIST.GetListManageID(MANAGE_ID);
            if (lsManageList == null)
            {
                sResult = string.Format("入库没有list明细");
                END_CELL_ID = 0;
                return false;
            }
            else
            {
                PnOrder = string.IsNullOrEmpty(lsManageList[0].GOODS_PROPERTY2) ? " and 1=1 " : string.Format(@" and goods_property2='{0}'", lsManageList[0].GOODS_PROPERTY2);
            }
            //设备状态可用并且有可用货位的巷道
            strLaneway = string.Format(@"SELECT DEVICE_CODE
                                        FROM (SELECT DISTINCT DEVICE_CODE AS DEVICE_CODE
				                        FROM WH_CELL
				                        INNER JOIN IO_CONTROL_ROUTE ON DEVICE_CODE =
										IO_CONTROL_ROUTE.END_DEVICE
				                        WHERE CELL_TYPE = 'Cell'
					                    AND START_DEVICE = {0}      
					                    AND CONTROL_ROUTE_TYPE = 1
					                    AND CONTROL_ROUTE_STATUS = 1
                                        AND RUN_STATUS ='Enable'
					                    ) T ORDER BY DEVICE_CODE desc", START_DEVICE_CODE);

            //获得所有可用巷道
            DataTable dt_laneway = this.GetList(strLaneway);

            if (dt_laneway.Rows.Count == 0)
            {
                sResult = string.Format("入库未找到可用路径,请检查设备状态");
                END_CELL_ID = 0;
                return false;
            }

            if (dt_laneway.Rows.Count == 1)
            {
                DataTable dt_cellnear = this.GetList(string.Format(@"SELECT CELL_ID
			                                                           FROM WH_CELL
		                                                               WHERE DEVICE_CODE = {0} 
                                                                       AND CELL_STATUS = 'Nohave'
					                                                   AND RUN_STATUS = 'Enable'
                                                                       AND CELL_FORK_TYPE = 'Near'
					                                                   AND CELL_TYPE ='Cell'",
                                                                       Convert.ToInt32(dt_laneway.Rows[0]["DEVICE_CODE"])));

                if (dt_cellnear.Rows.Count < 3)
                {
                    bResult = false;
                    sResult = "当前双申巷道近端空货位不足,请查看!";
                    END_CELL_ID = 0;
                    return bResult;
                }
                DEVICE_CODE = Convert.ToInt32(dt_laneway.Rows[0]["DEVICE_CODE"]);
            }

            #region 货物平均分配 可用巷道>=2时
            if (dt_laneway.Rows.Count >= 2)
            {
                #region 排除掉没有可用货位的巷道
                DataTable dt_laneway1 = dt_laneway.Clone();
                dt_laneway1.Clear();
                foreach (DataRow item in dt_laneway.Rows)
                {
                    string x500 = string.Empty;
                    if (lsManageList[0].MANAGE_LIST_QUANTITY > 500)
                    {
                        x500 = "AND CELL_X_NEAR>1";
                    }
                    DataTable dt_cellnear1 = this.GetList(string.Format(@"SELECT 1
                        FROM V_WH_CELL_DOUBLE_TO_NORMAL
                        WHERE DEVICE_CODE = {0}
                        AND CELL_STATUS_NEAR = 'Nohave'
                        AND RUN_STATUS_NEAR = 'Enable'
                        AND RUN_STATUS = 'Enable'
                        {1}", item["DEVICE_CODE"], x500));
                    // AND CELL_TYPE = 'Cell'
                    if (dt_cellnear1.Rows.Count > 2)
                    {
                        dt_laneway1.Rows.Add(item.ItemArray);
                    }
                }
                if (dt_laneway1.Rows.Count < 1)
                {
                    sResult = string.Format("未找到可用货位");
                    END_CELL_ID = 0;
                    return false;
                }
                else
                {
                    dt_laneway = dt_laneway1;
                }
                #endregion
                //获得库存少的巷道
                IList<MANAGE_LIST> lsMANAGE_LIST = this._P_MANAGE_LIST.GetListManageID(mMANAGE_MAIN.MANAGE_ID);
                DataTable dt_nohave = null;
                DataTable dt_manage_num = null;
                DataTable lane_way = null;
                int manage_num = Convert.ToInt32(SiaSun.LMS.Common.StringUtil.GetConfig("ManageCountLimit").ToString());
                int[] su = new int[dt_laneway.Rows.Count];
                int[] sm = new int[dt_laneway.Rows.Count];
                for (int i = 0; i < dt_laneway.Rows.Count; i++)
                {
                    //当前巷道的库存数
                    //AND RUN_STATUS = 'Enable'
                    dt_nohave = this.GetList(string.Format(@"SELECT CELL_ID FROM WH_CELL
                                                                 WHERE CELL_TYPE ='Cell' AND CELL_STATUS='Nohave'
                                                                  AND DEVICE_CODE = '{0}'",
                                                                 Convert.ToInt32(dt_laneway.Rows[i]["DEVICE_CODE"])
                                                                 ));

                    lane_way = this.GetList(string.Format(@"SELECT TOP 1 * FROM WH_CELL WHERE device_code = {0} AND CELL_TYPE ='Cell'",
                                                                                   Convert.ToInt32(dt_laneway.Rows[i]["DEVICE_CODE"])));
                    //当前巷道的任务数
                    dt_manage_num = this.GetList(string.Format(@"SELECT * FROM V_MANAGE WHERE LANE_WAY = {0} AND MANAGE_STATUS = 'Executing'
                                                                     AND MANAGE_TYPE_CLASS in ('ManageIn','StockInMin','StockIn','ManageUp')",
                                                                     lane_way.Rows[0]["LANE_WAY"]));

                    su[i] = dt_nohave.Rows.Count;//记库存数
                    sm[i] = dt_manage_num.Rows.Count;//记任务数
                }

                int iMinIndex = 0;
                for (int i = 1; i < dt_laneway.Rows.Count; ++i)
                {
                    if (sm[i] < sm[iMinIndex])
                    {
                        iMinIndex = i;
                    }
                    else if (sm[i] == sm[iMinIndex] && su[i] > su[iMinIndex])
                    {
                        iMinIndex = i;
                    }
                }
                DEVICE_CODE = Convert.ToInt32(dt_laneway.Rows[iMinIndex]["DEVICE_CODE"]);
                //index = SiaSun.LMS.Common.StringUtil.CheckMin(su);
                //index_n = SiaSun.LMS.Common.StringUtil.CheckMin(sm);

                //if (sm[index] >= manage_num)
                //{
                //    DEVICE_CODE = Convert.ToInt32(dt_laneway.Rows[index_n]["DEVICE_CODE"]);
                //}
                //else
                //{
                //    DEVICE_CODE = Convert.ToInt32(dt_laneway.Rows[index]["DEVICE_CODE"]);
                //}

                ////优先入库双伸巷道的空货位数
                //DataTable dt_cellnear = this.GetList(string.Format(@"SELECT CELL_ID
			             //                                              FROM WH_CELL
		              //                                                 WHERE DEVICE_CODE = {0} 
                //                                                       AND CELL_STATUS = 'Nohave'
					           //                                        AND RUN_STATUS = 'Enable'
                //                                                       AND CELL_FORK_TYPE = 'Near'
					           //                                        AND CELL_TYPE ='Cell'", DEVICE_CODE));
                //if (dt_cellnear.Rows.Count == 2)
                //{
                //    bResult = false;
                //    sResult = "当前双申巷道近端空货位货位不足,请查看!";
                //    END_CELL_ID = 0;
                //    return bResult;
                //}
            }
            #endregion

            string strSQL = string.Empty;
            DataTable dtCELL = null;
            //GOODS_MAIN gm = this._P_GOODS_MAIN.GetModel(lsManageList[0].GOODS_ID);
            //if (gm == null)
            //{
            //    bResult = false;
            //    sResult = string.Format("未找到物料ID {0}", lsManageList[0].GOODS_ID);
            //    END_CELL_ID = 0;
            //    return bResult;
            //}
            #region//母托盘入库
            if (mMANAGE_MAIN.MANAGE_TYPE_CODE == "StockIn")
            {
                ///条件1:
                ///Double有货无任务,且Double物料与上架物料一致时,选择Normal空货位
                strSQL = string.Format(@"SELECT top 1 * FROM V_WH_CELL_DOUBLE_TO_NORMAL WHERE RUN_STATUS = 'Enable' 
                                             AND CELL_STATUS = 'Pallet' AND RUN_STATUS_NEAR = 'Enable' AND DEVICE_CODE = {0}
                                             AND CELL_STATUS_NEAR ='Nohave' ORDER BY CELL_X,CELL_Y", DEVICE_CODE);

                dtCELL = this.GetList(strSQL);
                if (dtCELL.Rows.Count != 0)
                {
                    END_CELL_ID = Convert.ToInt32(dtCELL.Rows[0]["CELL_ID_NEAR"].ToString());
                    SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);
                    mEND_WH_CELL.RUN_STATUS = Enum.RUN_STATUS.Selected.ToString();
                    this._P_WH_CELL.Update(mEND_WH_CELL);
                    return true;
                }
                ///条件2:
                ///Double无货有任务,且Double任务物料与上架物料一致时,选择Normal空货位
                //strSQL = string.Format(@"SELECT top 1 * FROM V_WH_CELL_DOUBLE_TO_NORMAL WHERE RUN_STATUS = 'Selected' AND CELL_STATUS = 'Nohave'
                //                             AND RUN_STATUS_NEAR = 'Enable' AND CELL_STATUS_NEAR ='Nohave' AND DEVICE_CODE = {0}
                //                             ORDER BY CELL_Y,CELL_X", DEVICE_CODE);

                //dtCELL = this.GetList(strSQL);
                //if (dtCELL.Rows.Count != 0)
                //{
                //    END_CELL_ID = Convert.ToInt32(dtCELL.Rows[0]["CELL_ID_NEAR"].ToString());
                //    SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);
                //    mEND_WH_CELL.RUN_STATUS = Enum.RUN_STATUS.Selected.ToString();
                //    this._P_WH_CELL.Update(mEND_WH_CELL);
                //    return true;
                //}
                ///条件2:Double 无货无任务禁用状态
                strSQL = string.Format(@"SELECT top 1 * FROM V_WH_CELL_DOUBLE_TO_NORMAL WHERE RUN_STATUS IN ('Disable') 
                                             and device_code = '{0}' and CELL_STATUS ='Nohave' AND RUN_STATUS_NEAR = 'Enable' 
                                             AND CELL_STATUS_NEAR ='Nohave' ORDER BY CELL_X,CELL_Y", DEVICE_CODE);

                dtCELL = this.GetList(strSQL);
                if (dtCELL.Rows.Count > 0)
                {
                    END_CELL_ID = Convert.ToInt32(dtCELL.Rows[0]["CELL_ID_NEAR"].ToString());
                    SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);
                    mEND_WH_CELL.RUN_STATUS = Enum.RUN_STATUS.Selected.ToString();
                    this._P_WH_CELL.Update(mEND_WH_CELL);
                    return true;
                }
                ///条件3:
                ///Double无任务,货位状态空容器-运行状态为可用/禁用,选择Normal空货位
                strSQL = string.Format(@"SELECT top 1 * FROM V_WH_CELL_DOUBLE_TO_NORMAL WHERE RUN_STATUS IN ('Disable','Enable') 
                                             AND CELL_STATUS IN ('Pallet') AND RUN_STATUS_NEAR = 'Enable'
                                             AND DEVICE_CODE = {0} AND CELL_STATUS_NEAR ='Nohave'
                                             ORDER BY CELL_X,CELL_Y", DEVICE_CODE);

                dtCELL = this.GetList(strSQL);
                if (dtCELL.Rows.Count != 0)
                {
                    END_CELL_ID = Convert.ToInt32(dtCELL.Rows[0]["CELL_ID_NEAR"].ToString());
                    SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);
                    mEND_WH_CELL.RUN_STATUS = Enum.RUN_STATUS.Selected.ToString();
                    this._P_WH_CELL.Update(mEND_WH_CELL);
                    return true;
                }
                ///条件4:
                ///Double和Normal全部空货位,选择Double空货位
                strSQL = string.Format(@"SELECT top 1 * FROM V_WH_CELL_DOUBLE_TO_NORMAL WHERE RUN_STATUS = 'Enable' AND CELL_STATUS = 'Nohave'   
                                             AND RUN_STATUS_NEAR = 'Enable' AND CELL_STATUS_NEAR ='Nohave' AND DEVICE_CODE = {0}
                                             ORDER BY CELL_X,CELL_Y", DEVICE_CODE);

                dtCELL = this.GetList(strSQL);
                if (dtCELL.Rows.Count != 0)
                {
                    END_CELL_ID = Convert.ToInt32(dtCELL.Rows[0]["CELL_ID_FAR"].ToString());
                    SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);
                    mEND_WH_CELL.RUN_STATUS = Enum.RUN_STATUS.Selected.ToString();
                    this._P_WH_CELL.Update(mEND_WH_CELL);
                    return true;
                }

                strSQL = string.Format(@"SELECT top 1 * FROM V_WH_CELL_DOUBLE_TO_NORMAL WHERE RUN_STATUS IN ('Disable','Enable') 
                                             AND CELL_STATUS not IN ('Nohave') AND RUN_STATUS_NEAR = 'Enable'
                                             AND DEVICE_CODE = {0} AND CELL_STATUS_NEAR ='Nohave'
                                             ORDER BY CELL_X,CELL_Y", DEVICE_CODE);

                dtCELL = this.GetList(strSQL);
                if (dtCELL.Rows.Count == 0)
                {
                    bResult = false;
                    sResult = "当前双申巷道空货位货位不足,请查看!";
                    END_CELL_ID = 0;
                    return bResult;
                }
                else
                {
                    END_CELL_ID = Convert.ToInt32(dtCELL.Rows[0]["CELL_ID_NEAR"].ToString());
                    SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);
                    mEND_WH_CELL.RUN_STATUS = Enum.RUN_STATUS.Selected.ToString();
                    this._P_WH_CELL.Update(mEND_WH_CELL);
                    return true;
                }

            }
            #endregion
            #region 货物入库
            else
            {
                //分配的巷道为双申巷道
                ///条件1:
                ///Double有货无任务,且Double物料与上架物料批次一致时,选择Normal空货位
                ///
                string x500 = string.Empty;
                if (lsManageList[0].MANAGE_LIST_QUANTITY > 500)
                {
                    x500 = "AND CELL_X>1";
                }
                    strSQL = string.Format(@"SELECT top 1 * FROM V_WH_CELL_DOUBLE_TO_NORMAL WHERE RUN_STATUS = 'Enable'
                        AND DEVICE_CODE='{0}'
                        AND CELL_STATUS = 'Full' 
                        AND RUN_STATUS_NEAR = 'Enable' 
                        AND CELL_STATUS_NEAR ='Nohave'
                        {1}
                        AND GOODS_ID = {2}
                        {3}
                        ORDER BY CELL_Y,CELL_X",
                        DEVICE_CODE, PnOrder, lsManageList[0].GOODS_ID, x500);
                    dtCELL = this.GetList(strSQL);
                    if (dtCELL.Rows.Count > 0)
                    {
                        END_CELL_ID = Convert.ToInt32(dtCELL.Rows[0]["CELL_ID_NEAR"].ToString());
                        SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);
                        mEND_WH_CELL.RUN_STATUS = Enum.RUN_STATUS.Selected.ToString();
                        this._P_WH_CELL.Update(mEND_WH_CELL);
                        return true;
                    }

                ///条件2:Double 无货禁用状态
                ///
                strSQL = string.Format(@"SELECT top 1 * FROM V_WH_CELL_DOUBLE_TO_NORMAL WHERE RUN_STATUS = 'Disable' 
                    AND DEVICE_CODE = '{0}'
                    AND CELL_STATUS ='Nohave' 
                    AND RUN_STATUS_NEAR = 'Enable' 
                    AND CELL_STATUS_NEAR ='Nohave' 
                    {1}
                    ORDER BY CELL_Y,CELL_X",
                    DEVICE_CODE, x500);
                dtCELL = this.GetList(strSQL);
                if (dtCELL.Rows.Count > 0)
                {
                    END_CELL_ID = Convert.ToInt32(dtCELL.Rows[0]["CELL_ID_NEAR"].ToString());
                    SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);
                    mEND_WH_CELL.RUN_STATUS = Enum.RUN_STATUS.Selected.ToString();
                    this._P_WH_CELL.Update(mEND_WH_CELL);
                    return true;
                }

                ///条件4:
                /// Double和Normal全部空货位,选择Double空货位
                /// (RUN_STATUS_NEAR = 'Enable' or RUN_STATUS_NEAR = 'Disable')
                strSQL = string.Format(@"SELECT top 1 * FROM V_WH_CELL_DOUBLE_TO_NORMAL WHERE RUN_STATUS = 'Enable' 
                    AND CELL_STATUS = 'Nohave' 
                    AND DEVICE_CODE = {0}
                    AND RUN_STATUS_NEAR = 'Enable'
                    AND CELL_STATUS_NEAR ='Nohave'
                    {1}
                    ORDER BY CELL_Y,CELL_X",
                    DEVICE_CODE, x500);
                dtCELL = this.GetList(strSQL);
                if (dtCELL.Rows.Count > 0)
                {
                    END_CELL_ID = Convert.ToInt32(dtCELL.Rows[0]["CELL_ID_FAR"].ToString());
                    SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);
                    mEND_WH_CELL.RUN_STATUS = Enum.RUN_STATUS.Selected.ToString();
                    this._P_WH_CELL.Update(mEND_WH_CELL);
                    return true;
                }

                ///条件5:
                ///Double有货无任务,选择Normal空货位
                ///
                strSQL = string.Format(@"SELECT top 1 * FROM V_WH_CELL_DOUBLE_TO_NORMAL WHERE RUN_STATUS = 'Enable' 
                    AND DEVICE_CODE='{0}'
                    AND CELL_STATUS = 'Full' 
                    AND RUN_STATUS_NEAR = 'Enable' 
                    AND CELL_STATUS_NEAR ='Nohave'
                    {1}
                    ORDER BY CELL_Y,CELL_X",
                    DEVICE_CODE, x500);

                dtCELL = this.GetList(strSQL);
                if (dtCELL.Rows.Count > 0)
                {
                    END_CELL_ID = Convert.ToInt32(dtCELL.Rows[0]["CELL_ID_NEAR"].ToString());
                    SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);
                    mEND_WH_CELL.RUN_STATUS = Enum.RUN_STATUS.Selected.ToString();
                    this._P_WH_CELL.Update(mEND_WH_CELL);
                    return true;
                }


                ///条件6:
                ///Double全部为实货位,运行状态为禁用,Double物料与上架物料的批次不同,选择Normal空货位
                ///
                strSQL = string.Format(@"SELECT top 1 * FROM V_WH_CELL_DOUBLE_TO_NORMAL WHERE RUN_STATUS in ('Enable','Disable') 
                    AND CELL_STATUS in ('Full','Forbiden') 
                    AND DEVICE_CODE = {0}
                    AND RUN_STATUS_NEAR = 'Enable' 
                    AND CELL_STATUS_NEAR ='Nohave'
                    {1}
                    ORDER BY CELL_Y,CELL_X",
                    DEVICE_CODE, x500);
                dtCELL = this.GetList(strSQL);
                if (dtCELL.Rows.Count == 0)
                {
                    bResult = false;
                    END_CELL_ID = 0;
                    sResult = "无法找到入库货位";
                    return bResult;
                }
                else
                {
                    END_CELL_ID = Convert.ToInt32(dtCELL.Rows[0]["CELL_ID_NEAR"].ToString());
                    SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);
                    mEND_WH_CELL.RUN_STATUS = Enum.RUN_STATUS.Selected.ToString();
                    this._P_WH_CELL.Update(mEND_WH_CELL);
                    return true;
                }
            }
            #endregion
        }

        //public bool CellMoveAllocate(string START_DEVICE_CODE, string CELL_MODEL, int MANAGE_ID, out int END_CELL_ID, out string sResult)
        //{
        //    sResult = string.Empty;
        //    bool bResult = true;
        //    int DEVICE_CODE = 0;
        //    int index = 0;
        //    int index_n = 0;
        //    string PnOrder = string.Empty;
        //    string ordered = string.Empty;
        //    string strLaneway = string.Empty;

        //    SiaSun.LMS.Model.MANAGE_MAIN mMANAGE_MAIN = this._P_MANAGE_MAIN.GetModel(MANAGE_ID);

        //    IList<Model.MANAGE_LIST> lsManageList = this._P_MANAGE_LIST.GetListManageID(MANAGE_ID);
        //    if (lsManageList == null)
        //    {
        //        sResult = string.Format("入库没有list明细");
        //        END_CELL_ID = 0;
        //        return false;
        //    }
        //    else
        //    {
        //        PnOrder = string.IsNullOrEmpty(lsManageList[0].GOODS_PROPERTY2) ? " and 1=1 " : string.Format(@" and goods_property2='{0}'", lsManageList[0].GOODS_PROPERTY2);
        //    }
        //    //设备状态可用并且有可用货位的巷道
        //    strLaneway = string.Format(@"SELECT DEVICE_CODE
        //                                FROM (SELECT DISTINCT DEVICE_CODE AS DEVICE_CODE
				    //                    FROM WH_CELL
				    //                    INNER JOIN IO_CONTROL_ROUTE ON DEVICE_CODE =
								//		IO_CONTROL_ROUTE.END_DEVICE
				    //                    WHERE CELL_TYPE = 'Cell'
					   //                 AND START_DEVICE = {0}      
					   //                 AND CONTROL_ROUTE_TYPE = 3
					   //                 AND CONTROL_ROUTE_STATUS = 1
        //                                AND RUN_STATUS ='Enable'
					   //                 ) T ORDER BY DEVICE_CODE desc", START_DEVICE_CODE);

        //    //获得所有可用巷道
        //    DataTable dt_laneway = this.GetList(strLaneway);

        //    if (dt_laneway.Rows.Count == 0)
        //    {
        //        sResult = string.Format("入库未找到可用路径,请检查设备状态");
        //        END_CELL_ID = 0;
        //        return false;
        //    }

        //    if (dt_laneway.Rows.Count == 1)
        //    {
        //        DataTable dt_cellnear = this.GetList(string.Format(@"SELECT CELL_ID
			     //                                                      FROM WH_CELL
		      //                                                         WHERE DEVICE_CODE = {0} 
        //                                                               AND CELL_STATUS = 'Nohave'
					   //                                                AND RUN_STATUS = 'Enable'
        //                                                               AND CELL_FORK_TYPE = 'Near'
					   //                                                AND CELL_TYPE ='Cell'",
        //                                                               Convert.ToInt32(dt_laneway.Rows[0]["DEVICE_CODE"])));

        //        if (dt_cellnear.Rows.Count == 2)
        //        {
        //            bResult = false;
        //            sResult = "当前双申巷道近端空货位不足,请查看!";
        //            END_CELL_ID = 0;
        //            return bResult;
        //        }
        //        DEVICE_CODE = Convert.ToInt32(dt_laneway.Rows[0]["DEVICE_CODE"]);
        //    }

        //    #region 货物平均分配 可用巷道>=2时
        //    if (dt_laneway.Rows.Count >= 2)
        //    {
        //        #region 排除掉没有可用货位的巷道
        //        DataTable dt_laneway1 = dt_laneway.Clone();
        //        dt_laneway1.Clear();
        //        foreach (DataRow item in dt_laneway.Rows)
        //        {
        //            DataTable dt_cellnear1 = this.GetList(string.Format(@"SELECT CELL_ID
        //                                                      FROM WH_CELL
        //                                                         WHERE DEVICE_CODE = {0} 
        //                                                               AND CELL_STATUS = 'Nohave'
        //                                                AND RUN_STATUS = 'Enable'
        //                                                               AND CELL_FORK_TYPE = 'Near'
        //                                                AND CELL_TYPE ='Cell'", item["DEVICE_CODE"]));
        //            if (dt_cellnear1.Rows.Count >= 2)
        //            {
        //                dt_laneway1.Rows.Add(item.ItemArray);
        //            }
        //        }
        //        if (dt_laneway1.Rows.Count < 1)
        //        {
        //            sResult = string.Format("未找到可用货位");
        //            END_CELL_ID = 0;
        //            return false;
        //        }
        //        else
        //        {
        //            dt_laneway = dt_laneway1;
        //        }
        //        #endregion
        //        //获得库存少的巷道
        //        IList<MANAGE_LIST> lsMANAGE_LIST = this._P_MANAGE_LIST.GetListManageID(mMANAGE_MAIN.MANAGE_ID);
        //        DataTable dt_storage = null;
        //        DataTable dt_manage_num = null;
        //        DataTable lane_way = null;
        //        int manage_num = Convert.ToInt32(SiaSun.LMS.Common.StringUtil.GetConfig("ManageCountLimit").ToString());
        //        int[] su = new int[dt_laneway.Rows.Count];
        //        int[] sm = new int[dt_laneway.Rows.Count];
        //        for (int i = 0; i < dt_laneway.Rows.Count; i++)
        //        {
        //            //当前巷道的库存数
        //            //AND RUN_STATUS = 'Enable'
        //            dt_storage = this.GetList(string.Format(@"SELECT CELL_ID FROM WH_CELL
        //                                                         WHERE CELL_TYPE ='Cell' AND CELL_STATUS NOT LIKE '%No%'
        //                                                          AND DEVICE_CODE = '{0}'",
        //                                                         Convert.ToInt32(dt_laneway.Rows[i]["DEVICE_CODE"])
        //                                                         ));

        //            lane_way = this.GetList(string.Format(@"SELECT TOP 1 * FROM WH_CELL WHERE device_code = {0} AND CELL_TYPE ='Cell'",
        //                                                                           Convert.ToInt32(dt_laneway.Rows[i]["DEVICE_CODE"])));
        //            //当前巷道的任务数
        //            dt_manage_num = this.GetList(string.Format(@"SELECT * FROM V_MANAGE WHERE LANE_WAY = {0} AND MANAGE_STATUS = 'Executing'
        //                                                             AND MANAGE_TYPE_CLASS in ('ManageIn','StockInMin','StockIn','ManageUp')",
        //                                                             lane_way.Rows[0]["LANE_WAY"]));

        //            su[i] = dt_storage.Rows.Count;//记库存数
        //            sm[i] = dt_manage_num.Rows.Count;//记任务数
        //        }

        //        index = SiaSun.LMS.Common.StringUtil.CheckMin(su);
        //        index_n = SiaSun.LMS.Common.StringUtil.CheckMin(sm);

        //        if (sm[index] >= manage_num)
        //        {
        //            DEVICE_CODE = Convert.ToInt32(dt_laneway.Rows[index_n]["DEVICE_CODE"]);
        //        }
        //        else
        //        {
        //            DEVICE_CODE = Convert.ToInt32(dt_laneway.Rows[index]["DEVICE_CODE"]);
        //        }

        //        //优先入库双伸巷道的空货位数
        //        DataTable dt_cellnear = this.GetList(string.Format(@"SELECT CELL_ID
			     //                                                      FROM WH_CELL
		      //                                                         WHERE DEVICE_CODE = {0} 
        //                                                               AND CELL_STATUS = 'Nohave'
					   //                                                AND RUN_STATUS = 'Enable'
        //                                                               AND CELL_FORK_TYPE = 'Near'
					   //                                                AND CELL_TYPE ='Cell'", DEVICE_CODE));
        //        if (dt_cellnear.Rows.Count == 2)
        //        {
        //            bResult = false;
        //            sResult = "当前双申巷道近端空货位货位不足,请查看!";
        //            END_CELL_ID = 0;
        //            return bResult;
        //        }
        //    }
        //    #endregion

        //    string strSQL = string.Empty;
        //    DataTable dtCELL = null;
        //    //GOODS_MAIN gm = this._P_GOODS_MAIN.GetModel(lsManageList[0].GOODS_ID);
        //    //if (gm == null)
        //    //{
        //    //    bResult = false;
        //    //    sResult = string.Format("未找到物料ID {0}", lsManageList[0].GOODS_ID);
        //    //    END_CELL_ID = 0;
        //    //    return bResult;
        //    //}
        //    #region//母托盘入库
        //    if (mMANAGE_MAIN.MANAGE_TYPE_CODE == "StockIn")
        //    {
        //        ///条件1:
        //        ///Double有货无任务,且Double物料与上架物料一致时,选择Normal空货位
        //        strSQL = string.Format(@"SELECT top 1 * FROM V_WH_CELL_DOUBLE_TO_NORMAL WHERE RUN_STATUS = 'Enable' 
        //                                     AND CELL_STATUS = 'Pallet' AND RUN_STATUS_NEAR = 'Enable' AND DEVICE_CODE = {0}
        //                                     AND CELL_STATUS_NEAR ='Nohave' ORDER BY CELL_Y,CELL_X", DEVICE_CODE);

        //        dtCELL = this.GetList(strSQL);
        //        if (dtCELL.Rows.Count != 0)
        //        {
        //            END_CELL_ID = Convert.ToInt32(dtCELL.Rows[0]["CELL_ID_NEAR"].ToString());
        //            SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);
        //            mEND_WH_CELL.RUN_STATUS = Enum.RUN_STATUS.Selected.ToString();
        //            this._P_WH_CELL.Update(mEND_WH_CELL);
        //            return true;
        //        }
        //        ///条件2:
        //        ///Double无货有任务,且Double任务物料与上架物料一致时,选择Normal空货位
        //        //strSQL = string.Format(@"SELECT top 1 * FROM V_WH_CELL_DOUBLE_TO_NORMAL WHERE RUN_STATUS = 'Selected' AND CELL_STATUS = 'Nohave'
        //        //                             AND RUN_STATUS_NEAR = 'Enable' AND CELL_STATUS_NEAR ='Nohave' AND DEVICE_CODE = {0}
        //        //                             ORDER BY CELL_Y,CELL_X", DEVICE_CODE);

        //        //dtCELL = this.GetList(strSQL);
        //        //if (dtCELL.Rows.Count != 0)
        //        //{
        //        //    END_CELL_ID = Convert.ToInt32(dtCELL.Rows[0]["CELL_ID_NEAR"].ToString());
        //        //    SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);
        //        //    mEND_WH_CELL.RUN_STATUS = Enum.RUN_STATUS.Selected.ToString();
        //        //    this._P_WH_CELL.Update(mEND_WH_CELL);
        //        //    return true;
        //        //}
        //        ///条件2:Double 无货无任务禁用状态
        //        strSQL = string.Format(@"SELECT top 1 * FROM V_WH_CELL_DOUBLE_TO_NORMAL WHERE RUN_STATUS IN ('Disable') 
        //                                     and device_code = '{0}' and CELL_STATUS ='Nohave' AND RUN_STATUS_NEAR = 'Enable' 
        //                                     AND CELL_STATUS_NEAR ='Nohave' ORDER BY CELL_Y,CELL_X", DEVICE_CODE);

        //        dtCELL = this.GetList(strSQL);
        //        if (dtCELL.Rows.Count > 0)
        //        {
        //            END_CELL_ID = Convert.ToInt32(dtCELL.Rows[0]["CELL_ID_NEAR"].ToString());
        //            SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);
        //            mEND_WH_CELL.RUN_STATUS = Enum.RUN_STATUS.Selected.ToString();
        //            this._P_WH_CELL.Update(mEND_WH_CELL);
        //            return true;
        //        }
        //        ///条件3:
        //        ///Double无任务,货位状态空容器-运行状态为可用/禁用,选择Normal空货位
        //        strSQL = string.Format(@"SELECT top 1 * FROM V_WH_CELL_DOUBLE_TO_NORMAL WHERE RUN_STATUS IN ('Disable','Enable') 
        //                                     AND CELL_STATUS IN ('Pallet') AND RUN_STATUS_NEAR = 'Enable'
        //                                     AND DEVICE_CODE = {0} AND CELL_STATUS_NEAR ='Nohave'
        //                                     ORDER BY CELL_Y,CELL_X", DEVICE_CODE);

        //        dtCELL = this.GetList(strSQL);
        //        if (dtCELL.Rows.Count != 0)
        //        {
        //            END_CELL_ID = Convert.ToInt32(dtCELL.Rows[0]["CELL_ID_NEAR"].ToString());
        //            SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);
        //            mEND_WH_CELL.RUN_STATUS = Enum.RUN_STATUS.Selected.ToString();
        //            this._P_WH_CELL.Update(mEND_WH_CELL);
        //            return true;
        //        }
        //        ///条件4:
        //        ///Double和Normal全部空货位,选择Double空货位
        //        strSQL = string.Format(@"SELECT top 1 * FROM V_WH_CELL_DOUBLE_TO_NORMAL WHERE RUN_STATUS = 'Enable' AND CELL_STATUS = 'Nohave'   
        //                                     AND RUN_STATUS_NEAR = 'Enable' AND CELL_STATUS_NEAR ='Nohave' AND DEVICE_CODE = {0}
        //                                     ORDER BY CELL_Y,CELL_X", DEVICE_CODE);

        //        dtCELL = this.GetList(strSQL);
        //        if (dtCELL.Rows.Count == 0)
        //        {
        //            bResult = false;
        //            sResult = "当前双申巷道空货位货位不足,请查看!";
        //            END_CELL_ID = 0;
        //            return bResult;
        //        }
        //        else
        //        {
        //            END_CELL_ID = Convert.ToInt32(dtCELL.Rows[0]["CELL_ID_FAR"].ToString());
        //            SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);
        //            mEND_WH_CELL.RUN_STATUS = Enum.RUN_STATUS.Selected.ToString();
        //            this._P_WH_CELL.Update(mEND_WH_CELL);
        //            return true;
        //        }

        //    }
        //    #endregion
        //    #region 货物入库
        //    else
        //    {
        //        //分配的巷道为双申巷道
        //        ///条件1:
        //        ///Double有货无任务,且Double物料与上架物料批次一致时,选择Normal空货位
        //        ///

        //        strSQL = string.Format(@"SELECT top 1 * FROM V_WH_CELL_DOUBLE_TO_NORMAL WHERE RUN_STATUS = 'Enable'
        //                                                                            AND DEVICE_CODE='{0}'
        //                                                                            AND CELL_STATUS = 'Full' 
        //                                                                            AND RUN_STATUS_NEAR = 'Enable' 
        //                                                                            AND CELL_STATUS_NEAR ='Nohave'
        //                                                                            {1}
        //                                                                            AND GOODS_ID = {2}
        //                                                                            AND CELL_X>1
        //                                                                            ORDER BY CELL_Y,CELL_X",
        //                                                                    DEVICE_CODE, PnOrder, lsManageList[0].GOODS_ID);
        //        dtCELL = this.GetList(strSQL);
        //        if (dtCELL.Rows.Count > 0)
        //        {
        //            END_CELL_ID = Convert.ToInt32(dtCELL.Rows[0]["CELL_ID_NEAR"].ToString());
        //            SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);
        //            mEND_WH_CELL.RUN_STATUS = Enum.RUN_STATUS.Selected.ToString();
        //            this._P_WH_CELL.Update(mEND_WH_CELL);
        //            return true;
        //        }

        //        ///条件2:Double 无货禁用状态
        //        ///
        //        strSQL = string.Format(@"SELECT top 1 * FROM V_WH_CELL_DOUBLE_TO_NORMAL WHERE RUN_STATUS = 'Disable' 
        //                                                                                  AND DEVICE_CODE = '{0}'
        //                                                                                  AND CELL_STATUS ='Nohave' 
        //                                                                                  AND RUN_STATUS_NEAR = 'Enable' 
        //                                                                                  AND CELL_STATUS_NEAR ='Nohave' 
        //                                                                                  AND CELL_X>1
        //                                                                                  ORDER BY CELL_Y,CELL_X",
        //                                                                           DEVICE_CODE);
        //        dtCELL = this.GetList(strSQL);
        //        if (dtCELL.Rows.Count > 0)
        //        {
        //            END_CELL_ID = Convert.ToInt32(dtCELL.Rows[0]["CELL_ID_NEAR"].ToString());
        //            SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);
        //            mEND_WH_CELL.RUN_STATUS = Enum.RUN_STATUS.Selected.ToString();
        //            this._P_WH_CELL.Update(mEND_WH_CELL);
        //            return true;
        //        }

        //        ///条件4:
        //        /// Double和Normal全部空货位,选择Double空货位
        //        /// (RUN_STATUS_NEAR = 'Enable' or RUN_STATUS_NEAR = 'Disable')
        //        strSQL = string.Format(@"SELECT top 1 * FROM V_WH_CELL_DOUBLE_TO_NORMAL WHERE RUN_STATUS = 'Enable' 
        //                                                                                   AND CELL_STATUS = 'Nohave' 
        //                                                                                   AND DEVICE_CODE = {0}
        //                                                                                   AND RUN_STATUS_NEAR = 'Enable'
        //                                                                                   AND CELL_STATUS_NEAR ='Nohave'
        //                                                                                  AND CELL_X>1
        //                                                                                   ORDER BY CELL_Y,CELL_X",
        //                                                                              DEVICE_CODE);
        //        dtCELL = this.GetList(strSQL);
        //        if (dtCELL.Rows.Count > 0)
        //        {
        //            END_CELL_ID = Convert.ToInt32(dtCELL.Rows[0]["CELL_ID_FAR"].ToString());
        //            SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);
        //            mEND_WH_CELL.RUN_STATUS = Enum.RUN_STATUS.Selected.ToString();
        //            this._P_WH_CELL.Update(mEND_WH_CELL);
        //            return true;
        //        }

        //        ///条件5:
        //        ///Double有货无任务,选择Normal空货位
        //        ///
        //        strSQL = string.Format(@"SELECT top 1 * FROM V_WH_CELL_DOUBLE_TO_NORMAL WHERE RUN_STATUS = 'Enable' 
        //                                                                            AND DEVICE_CODE='{0}'
        //                                                                            AND CELL_STATUS = 'Full' 
        //                                                                            AND RUN_STATUS_NEAR = 'Enable' 
        //                                                                            AND CELL_STATUS_NEAR ='Nohave'
        //                                                                                  AND CELL_X>1
        //                                                                            ORDER BY CELL_Y,CELL_X",
        //                                                                       DEVICE_CODE);

        //        dtCELL = this.GetList(strSQL);
        //        if (dtCELL.Rows.Count > 0)
        //        {
        //            END_CELL_ID = Convert.ToInt32(dtCELL.Rows[0]["CELL_ID_NEAR"].ToString());
        //            SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);
        //            mEND_WH_CELL.RUN_STATUS = Enum.RUN_STATUS.Selected.ToString();
        //            this._P_WH_CELL.Update(mEND_WH_CELL);
        //            return true;
        //        }


        //        ///条件6:
        //        ///Double全部为实货位,运行状态为禁用,Double物料与上架物料的批次不同,选择Normal空货位
        //        ///
        //        strSQL = string.Format(@"SELECT top 1 * FROM V_WH_CELL_DOUBLE_TO_NORMAL WHERE RUN_STATUS in ('Enable','Disable') 
        //                                                                                AND CELL_STATUS in ('Full','Forbiden') 
        //                                                                                AND DEVICE_CODE = {0}
        //                                                                                AND RUN_STATUS_NEAR = 'Enable' 
        //                                                                                AND CELL_STATUS_NEAR ='Nohave'
        //                                                                                  AND CELL_X>1
        //                                                                                ORDER BY CELL_Y,CELL_X",
        //                                                                           DEVICE_CODE);
        //        dtCELL = this.GetList(strSQL);
        //        if (dtCELL.Rows.Count == 0)
        //        {
        //            bResult = false;
        //            END_CELL_ID = 0;
        //            sResult = "无法找到入库货位";
        //            return bResult;
        //        }
        //        else
        //        {
        //            END_CELL_ID = Convert.ToInt32(dtCELL.Rows[0]["CELL_ID_NEAR"].ToString());
        //            SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);
        //            mEND_WH_CELL.RUN_STATUS = Enum.RUN_STATUS.Selected.ToString();
        //            this._P_WH_CELL.Update(mEND_WH_CELL);
        //            return true;
        //        }
        //    }
        //    #endregion
        //}

        /// <summary>
        /// 根据起始位置分配终止位置,适合终止位置为固定授货台
        /// </summary>成品库获得出库站台
        /// <param name="START_DEVICE_CODE"></param>
        /// <param name="END_CELL_ID"></param>
        /// <param name="sResult"></param>
        /// <returns></returns>
        public bool CellOutAllocate(string START_DEVICE_CODE, out int END_CELL_ID, out string sResult)
        {
            bool bResult = false;

            sResult = string.Empty;
            int index = 0;
            string strSQL = string.Empty;

            DataTable dt = null;

            END_CELL_ID = 0;

            //出库-》站台
            strSQL = string.Format(@"SELECT CELL_ID,CELL_CODE FROM WH_CELL
                                            WHERE CELL_TYPE ='Station' 
                                            AND CELL_INOUT = 'Out'
                                            AND CELL_CODE IN (SELECT END_DEVICE FROM IO_CONTROL_ROUTE 
                                            WHERE START_DEVICE = (SELECT DEVICE_CODE FROM WH_CELL WHERE CELL_CODE = '{0}') 
                                            AND CONTROL_ROUTE_STATUS =1)",
                                            START_DEVICE_CODE);

            dt = this.GetList(strSQL);

            bResult = dt.Rows.Count > 0;

            if (bResult)
            {
                //两个以上(包含两个)可用站台
                if (dt.Rows.Count > 1)
                {
                    DataTable dt_manage = null;
                    int[] su = new int[dt.Rows.Count];
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        dt_manage = this.GetList(string.Format(@"SELECT MANAGE_ID FROM MANAGE_MAIN
                                                                WHERE END_CELL_ID = {0}",
                                                                Convert.ToInt32(dt.Rows[i]["CELL_ID"])));
                        su[i] = dt_manage.Rows.Count;
                    }

                    index = SiaSun.LMS.Common.StringUtil.CheckMin(su);

                    END_CELL_ID = Convert.ToInt32(dt.Rows[index]["CELL_ID"]);
                }
                else
                {
                    END_CELL_ID = Convert.ToInt32(dt.Rows[0]["CELL_ID"]);
                }
            }
            else
            {
                sResult = string.Format("未找到出库货位");
                return false;
            }

            if (END_CELL_ID == 0)
                return false;
            else
                return true;
        }

        /// <summary>获得出库货位
        /// 四川电力 根据巷道 物料及物料属性 获得出库货位
        /// </summary>
        /// <param name="IO_TASK_NO"></param>
        /// <param name="LANE_WAY"></param>
        /// <param name="END_CELL_ID"></param>
        /// <param name="GOODS_ID"></param>
        /// <param name="GOODS_PROPERTY"></param>
        /// <param name="STORAGE_LIST_TYPE"></param>
        /// <param name="MANAGE_LIST_QUANTITY"></param>
        /// <param name="START_CELL_ID"></param>
        /// <param name="STOCK_BARCODE"></param>
        /// <param name="STORAGE_LIST_QUANTITY"></param>
        /// <param name="sResult"></param>
        /// <returns></returns>
        public bool CellOutAllocate(int LANE_WAY,
                               int END_CELL_ID,
                               int GOODS_ID,
                               string GOODS_PROPERTY,
                               decimal MANAGE_LIST_QUANTITY,
                               out int START_CELL_ID,
                               out string STOCK_BARCODE,
                               out decimal STORAGE_LIST_QUANTITY,
                               out string sResult)
        {
            bool bResult = false;

            sResult = string.Empty;

            START_CELL_ID = 0;

            STORAGE_LIST_QUANTITY = 0;

            STOCK_BARCODE = string.Empty;

            SiaSun.LMS.Model.WH_CELL mWH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);

            bResult = null != mWH_CELL;

            if (!bResult)
            {
                sResult = "未找到出库站台";

                return bResult;
            }

            string sSQL = string.Format(@"SELECT  STORAGE_MAIN.CELL_ID ,STOCK_BARCODE ,
                         isnull(SUM(STORAGE_LIST_QUANTITY),0) AS MANAGE_LIST_QUANTITY
                         FROM  STORAGE_LIST 
                         INNER JOIN STORAGE_MAIN ON (STORAGE_LIST.STORAGE_ID = STORAGE_MAIN.STORAGE_ID )
                         INNER JOIN WH_CELL ON (STORAGE_MAIN.CELL_ID = WH_CELL.CELL_ID) 
                         WHERE GOODS_ID = {2} 
                               {0}
                               {1}
                               {3}
                           AND LANE_WAY = {4}
                           AND CELL_TYPE = 'Cell'

                       GROUP BY STOCK_BARCODE,
                                
                               STORAGE_MAIN.CELL_ID,
                                CELL_Y,
                                CELL_X
                      
                      ORDER BY 
                               max(substring(ENTRY_TIME,0,11)),
                               ABS({5}-isnull(SUM(STORAGE_LIST_QUANTITY),0)),
                               MANAGE_LIST_QUANTITY DESC,
                               CELL_Y,
                               CELL_X",
                /*0*/string.Format(" AND CELL_STATUS = '{0}'", SiaSun.LMS.Enum.CELL_STATUS.Pallet.ToString()),
                /*1*/string.Format(" AND RUN_STATUS = '{0}'", SiaSun.LMS.Enum.RUN_STATUS.Enable.ToString()),
                /*2*/GOODS_ID,
                /*3*/ GOODS_PROPERTY,
                /*4*/LANE_WAY,
                /*5*/MANAGE_LIST_QUANTITY);
            ///*6自动检定必须是24*/(GOODS_ID.Equals(1) && mWH_CELL.CELL_CODE.Equals("22004")) ? " HAVING ISNULL(SUM(STORAGE_LIST_QUANTITY),0) = 24" : string.Empty);
            //,
            ///*7任务号*/ string.IsNullOrEmpty(IO_TASK_NO)? 
            //string.Format(" and ( IO_TASK_NO = '' or IO_TASK_NO is null)"):
            //string.Format(" and ( IO_TASK_NO = '{0}' or IO_TASK_NO = '' or IO_TASK_NO is null)", IO_TASK_NO)

            DataTable dt = this.GetList(sSQL);

            bResult = dt.Rows.Count > 0;

            if (bResult)
            {
                START_CELL_ID = Convert.ToInt32(dt.Rows[0]["CELL_ID"]);

                STOCK_BARCODE = Convert.ToString(dt.Rows[0]["STOCK_BARCODE"]);

                STORAGE_LIST_QUANTITY = Convert.ToDecimal(dt.Rows[0]["MANAGE_LIST_QUANTITY"]);
            }
            else
            {
                START_CELL_ID = 0;

                sResult = string.Format("未找到出库货位");
            }

            return bResult;
        }



        /// <summary>
        /// 四川电力    根据物料及物料属性获得出库巷道
        /// </summary>
        /// <param name="START_WAREHOUSE_ID"></param>
        /// <param name="START_AREA_ID"></param>
        /// <param name="START_LOGIC_ID"></param>
        /// <param name="END_CELL_ID"></param>
        /// <param name="GOODS_ID"></param>
        /// <param name="GOODS_PROPERTY"></param>
        /// <param name="STORAGE_LIST_TYPE"></param>
        /// <param name="dtLANEWAY"></param>
        /// <param name="sResult"></param>
        /// <returns></returns>
        public bool LaneWayGetList(int END_CELL_ID,
                                   int GOODS_ID,
                                   string GOODS_PROPERTY_CONDITION,
                                   out DataTable dtLANEWAY,
                                   out string sResult)
        {
            bool bResult = true;

            dtLANEWAY = null;

            sResult = string.Empty;

            SiaSun.LMS.Model.WH_CELL mWH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);

            bResult = null != mWH_CELL;

            if (!bResult)
            {
                sResult = "未找到出库站台";

                return bResult;
            }

            string sSQL = string.Format(@"SELECT DEVICE_CODE,
                    LANE_WAY ,
                   SUM(STORAGE_LIST_QUANTITY) AS STORAGE_BALANCE,
                   dbo.OUTTASKBALANCE(DEVICE_CODE) AS OUT_TASK_BALANCE
                    FROM V_STORAGE_LIST
                    WHERE GOODS_ID = {2}
                    {3}
                    AND CELL_TYPE = 'Cell'
                    AND DEVICE_CODE IN (SELECT START_DEVICE FROM IO_CONTROL_ROUTE WHERE END_DEVICE='{4}' AND CONTROL_ROUTE_STATUS = 1 AND CONTROL_ROUTE_TYPE = 2)
                     {0}
                     {1}                    
                    GROUP BY LANE_WAY,DEVICE_CODE",
                /*0*/string.Format(" AND ( CELL_STATUS = '{0}' or CELL_STATUS = '{1}') ", SiaSun.LMS.Enum.CELL_STATUS.Full.ToString(), SiaSun.LMS.Enum.CELL_STATUS.Pallet.ToString()),
                /*1*/string.Format(" AND RUN_STATUS = '{0}'", SiaSun.LMS.Enum.RUN_STATUS.Enable.ToString()),
                /*2*/GOODS_ID,
                /*3*/GOODS_PROPERTY_CONDITION,
                /*4*/mWH_CELL.DEVICE_CODE
                      );

            dtLANEWAY = this.GetList(sSQL);

            bResult = dtLANEWAY.Rows.Count > 0;

            if (!bResult)
            {
                sResult = string.Format("未找到出库巷道");

                return bResult;
            }

            return bResult;
        }



        /// <summary>
        /// 根据配盘方案 获得出库巷道
        /// </summary>
        /// <param name="END_CELL_ID"></param>
        /// <param name="GOODS_ID"></param>
        /// <param name="GOODS_PROPERTY_CONDITION"></param>
        /// <param name="dtLANEWAY"></param>
        /// <param name="sResult"></param>
        /// <returns></returns>
        public bool LaneWayGetList(int END_CELL_ID,
                                   int TEMPLATE_ID,
                                   out DataTable dtLANEWAY,
                                   out string sResult)
        {
            bool bResult = true;

            dtLANEWAY = null;

            sResult = string.Empty;

            SiaSun.LMS.Model.WH_CELL mWH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);

            bResult = null != mWH_CELL;

            if (!bResult)
            {
                sResult = "未找到出库站台";

                return bResult;
            }

            string sSQL = string.Format(@"SELECT DEVICE_CODE,
                    LANE_WAY ,
                   SUM(STORAGE_LIST_QUANTITY) AS STORAGE_BALANCE,
                   dbo.OUTTASKBALANCE(DEVICE_CODE) AS OUT_TASK_BALANCE
                    FROM V_STORAGE_LIST
                    WHERE TEMPATE_ID = {0}
                    AND CELL_TYPE = 'Cell'
                    AND DEVICE_CODE IN (SELECT START_DEVICE FROM IO_CONTROL_ROUTE WHERE END_DEVICE='{3}' AND CONTROL_ROUTE_STATUS = 1)
                     {1}
                     {2}                    
                    GROUP BY LANE_WAY,DEVICE_CODE",
                /*0*/ TEMPLATE_ID,
                /*1*/string.Format(" AND ( CELL_STATUS = '{0}' or CELL_STATUS = '{1}') ", SiaSun.LMS.Enum.CELL_STATUS.Full.ToString(), SiaSun.LMS.Enum.CELL_STATUS.Pallet.ToString()),
                /*2*/string.Format(" AND RUN_STATUS = '{0}'", SiaSun.LMS.Enum.RUN_STATUS.Enable.ToString()),
                /*3*/mWH_CELL.DEVICE_CODE
                      );

            dtLANEWAY = this.GetList(sSQL);

            bResult = dtLANEWAY.Rows.Count > 0;

            if (!bResult)
            {
                sResult = string.Format("未找到出库巷道");

                return bResult;
            }

            return bResult;
        }

        /// <summary>
        ///  计划出库根据物料及物料属性获得出库巷道
        /// </summary>
        /// <param name="START_WAREHOUSE_ID"></param>
        /// <param name="START_AREA_ID"></param>
        /// <param name="START_LOGIC_ID"></param>
        /// <param name="END_CELL_ID"></param>
        /// <param name="GOODS_ID"></param>
        /// <param name="GOODS_PROPERTY"></param>
        /// <param name="STORAGE_LIST_TYPE"></param>
        /// <param name="dtLANEWAY"></param>
        /// <param name="sResult"></param>
        /// <returns></returns>
        public bool LaneWayGetListPlan(int END_CELL_ID,
                                   int GOODS_ID,
                                   string GOODS_PROPERTY_CONDITION,
                                   out DataTable dtLANEWAY,
                                   out string sResult)
        {
            bool bResult = true;

            dtLANEWAY = null;

            string sSQL = string.Empty;

            sResult = string.Empty;

            SiaSun.LMS.Model.WH_CELL mWH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID);

            bResult = null != mWH_CELL;

            if (!bResult)
            {
                sResult = "未找到出库站台";

                return bResult;
            }

            if (GOODS_ID == -1 || GOODS_ID == 102)//托盘和货笼
            {
                sSQL = string.Format(@"SELECT DEVICE_CODE,
                    LANE_WAY ,
                   SUM(STORAGE_LIST_QUANTITY) AS STORAGE_BALANCE,
                   SUM(DEVICE_CODE) AS OUT_TASK_BALANCE
                    FROM V_STORAGE_LIST
                    WHERE GOODS_ID = {2}
                    {3}
                    AND CELL_TYPE = 'Cell'
                    AND DEVICE_CODE IN (SELECT START_DEVICE FROM IO_CONTROL_ROUTE WHERE END_DEVICE='{4}' AND CONTROL_ROUTE_STATUS = 1)
                     {0}
                     {1}                    
                    GROUP BY LANE_WAY,DEVICE_CODE",
                    /*0*/string.Format(" AND ( CELL_STATUS = '{0}' or CELL_STATUS = '{1}') ", SiaSun.LMS.Enum.CELL_STATUS.Full.ToString(), SiaSun.LMS.Enum.CELL_STATUS.Pallet.ToString()),
                    /*1*/string.Format(" AND RUN_STATUS = '{0}'", SiaSun.LMS.Enum.RUN_STATUS.Enable.ToString()),
                    /*2*/GOODS_ID,
                    /*3*/GOODS_PROPERTY_CONDITION,
                    /*4*/mWH_CELL.DEVICE_CODE
                     );
            }
            else if (GOODS_ID == 3)//成品
            {
                sSQL = string.Format(@"SELECT DEVICE_CODE,
                    LANE_WAY ,
                   SUM(STORAGE_LIST_QUANTITY) AS STORAGE_BALANCE,
                   SUM(DEVICE_CODE) AS OUT_TASK_BALANCE
                    FROM V_STORAGE_LIST
                    WHERE GOODS_ID = {2} AND 
                    GOODS_PROPERTY1='{3}'
                    AND CELL_TYPE = 'Cell'
                    AND DEVICE_CODE IN (SELECT START_DEVICE FROM IO_CONTROL_ROUTE WHERE END_DEVICE='{4}' AND CONTROL_ROUTE_STATUS = 1)
                     {0}
                     {1}                    
                    GROUP BY LANE_WAY,DEVICE_CODE",
                    /*0*/string.Format(" AND ( CELL_STATUS = '{0}' or CELL_STATUS = '{1}') ", SiaSun.LMS.Enum.CELL_STATUS.Full.ToString(), SiaSun.LMS.Enum.CELL_STATUS.Pallet.ToString()),
                    /*1*/string.Format(" AND RUN_STATUS = '{0}'", SiaSun.LMS.Enum.RUN_STATUS.Enable.ToString()),
                    /*2*/GOODS_ID,
                    /*3*/GOODS_PROPERTY_CONDITION,
                    /*4*/mWH_CELL.DEVICE_CODE
                     );
            }
            else
            {
                sSQL = string.Format(@"SELECT DEVICE_CODE,
                    LANE_WAY ,
                   SUM(STORAGE_LIST_QUANTITY) AS STORAGE_BALANCE,
                   SUM(DEVICE_CODE) AS OUT_TASK_BALANCE
                    FROM V_STORAGE_LIST
                    WHERE GOODS_ID = {2}
                    {3}
                    AND CELL_TYPE = 'Cell'
                    AND DEVICE_CODE IN (SELECT START_DEVICE FROM IO_CONTROL_ROUTE WHERE END_DEVICE='{4}' AND CONTROL_ROUTE_STATUS = 1)
                     {0}
                     {1}                    
                    GROUP BY LANE_WAY,DEVICE_CODE",
                    /*0*/string.Format(" AND ( CELL_STATUS = '{0}' or CELL_STATUS = '{1}') ", SiaSun.LMS.Enum.CELL_STATUS.Full.ToString(), SiaSun.LMS.Enum.CELL_STATUS.Pallet.ToString()),
                    /*1*/string.Format(" AND RUN_STATUS = '{0}'", SiaSun.LMS.Enum.RUN_STATUS.Enable.ToString()),
                    /*2*/GOODS_ID,
                    /*3*/GOODS_PROPERTY_CONDITION,
                    /*4*/mWH_CELL.DEVICE_CODE
                     );
            }

            dtLANEWAY = this.GetList(sSQL);

            bResult = dtLANEWAY.Rows.Count > 0;

            if (!bResult)
            {
                sResult = string.Format("未找到出库巷道");

                return bResult;
            }

            return bResult;
        }

        /// <summary>货位-更改状态
        /// 货位-更改状态
        /// </summary>
        /// <param name="CELL_ID">货位编号</param>
        /// <param name="CELL_TYPE">货位类型</param>
        /// <param name="CELL_STATUS">存储状态</param>
        /// <param name="RUN_STATUS">运行状态</param>
        /// <param name="sResult">返回值</param>
        /// <returns></returns>
        public bool CellUpdateStatus(int CELL_ID, string CELL_STATUS, string RUN_STATUS, out string sResult)
        {
            bool bResult = true;
            sResult = string.Empty;
            if (0 == CELL_ID)
            {
                return bResult;
            }

            SiaSun.LMS.Model.WH_CELL mWH_CELL = this._P_WH_CELL.GetModel(CELL_ID);
            if (null == mWH_CELL)
            {
                bResult = false;
                sResult = string.Format("未找到货位{0}", CELL_ID.ToString());
                return bResult;
            }

            if (mWH_CELL.CELL_TYPE == Enum.CELL_TYPE.Cell.ToString() ||
                mWH_CELL.CELL_STORAGE_TYPE == Enum.CELL_STORAGE_TYPE.Single.ToString())
            {
                try
                {
                    if (!string.IsNullOrEmpty(CELL_STATUS))
                    {
                        mWH_CELL.CELL_STATUS = CELL_STATUS;
                    }
                    if (!string.IsNullOrEmpty(RUN_STATUS))
                    {
                        mWH_CELL.RUN_STATUS = RUN_STATUS;
                    }
                    this._P_WH_CELL.Update(mWH_CELL);
                }
                catch (Exception ex)
                {
                    bResult = false;
                    sResult = ex.Message;
                }
            }
            return bResult;
        }
    }
}