using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;
using System.Data;
using System.Collections;
using System.Linq;

using SiaSun.LMS.Model;
using SiaSun.LMS.Common;
using System.Reflection;

namespace SiaSun.LMS.Implement
{
    [ServiceBehavior(IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple, MaxItemsInObjectGraph = int.MaxValue)]
    public partial class S_ManageService : S_BaseService, SiaSun.LMS.Interface.I_ManageService
    {
        private static readonly object lockObj = new object();
        public S_ManageService()
        {
        }

        public bool ManageCreate(string sManageType, string sMethodName, object[] lsObj, out string sResult)
        {
            sResult = string.Empty;
            return false;
        }

        #region MANAGE_TYPE

        public IList<SiaSun.LMS.Model.MANAGE_TYPE_PARAM> ManageTypeParamGetList(int MANAGE_TYPE_ID)
        {
            return this._P_MANAGE_TYPE_PARAM.GetList(MANAGE_TYPE_ID);
        }

        #endregion

        #region MANAGE

        /// <summary>任务-调用
        /// 任务-调用
        /// </summary>
        /// <param name="sManageType">任务类型</param>
        /// <param name="sMethod">方法</param>
        /// <param name="lsObj">参数</param>
        /// <param name="sResult">返回结果</param>
        /// <returns></returns>
        public bool InvokeManageService(string sManageType, string sMethodName, object[] lsObj, out string sResult)
        {
            bool bResult = true;

            sResult = string.Empty;

            string sClassFullName = string.Format("SiaSun.LMS.Implement.Manage.{0}", sManageType);

            List<object> oPara = lsObj.ToList<object>();

            oPara.Add(sResult);

            Type t = this.GetType();

            Assembly complierAssembly = t.Assembly;

            object complierInstance = complierAssembly.CreateInstance(sClassFullName);

            Type type = complierInstance.GetType();

            object[] obj = oPara.ToArray();

            object oResult = null;

            //创建反射的所有公用方法
            MethodInfo[] lsMethodInfo = type.GetMethods();

            bool bFind = false;

            foreach (MethodInfo methodInfo in lsMethodInfo)
            {
                if (methodInfo.Name.Equals(sMethodName) && oPara.Count.Equals(methodInfo.GetParameters().Length))
                {
                    oResult = methodInfo.Invoke(complierInstance, obj);

                    bFind = true;

                    break;
                }
            }

            if (!bFind)
            {
                bResult = false;

                sResult = string.Format("未找到{0}类型的{1}方法", sClassFullName, sMethodName);
            }
            else
            {
                bResult = Convert.ToBoolean(oResult);

                sResult = obj[oPara.Count - 1].ToString();
            }

            //bResult = new SiaSun.LMS.Implement.Manage.ManageBase().Invoke(sClassFullName, sMethod, lsObj.ToList<object>(), out sResult);

            return bResult;
        }

        #endregion

        #region CONTROL

        /// <summary>作业-动作
        /// 作业-动作
        /// </summary>
        /// <param name="WAREHOUSE">库房编码</param>
        /// <param name="sResult"></param>
        /// <returns></returns>
        public void ControlTranslate(string WAREHOUSE)
        {
            string sResult = string.Empty;

            IList<SiaSun.LMS.Model.FLOW_PARA> lsFLOW_PARA = this._S_FlowService.FlowGetParameters("FLOW_MANAGE");

            string[] aFLOW_PARA = new string[lsFLOW_PARA.Count];

            SiaSun.LMS.Model.MANAGE_ACTION_EXCUTE mt = new SiaSun.LMS.Model.MANAGE_ACTION_EXCUTE();

            DataTable dt = this.GetList(string.Format("SELECT * FROM V_FLOW_CONTROL_ACTION ", WAREHOUSE));

            foreach (DataRow dr in dt.Rows)
            {
                int i = 0;

                foreach (SiaSun.LMS.Model.FLOW_PARA mFLOW_PARA in lsFLOW_PARA)
                {
                    aFLOW_PARA[i] = dr[mFLOW_PARA.FLOW_PARA_CODE].ToString();

                    i++;
                }

                mt.MANAGE_ID = Convert.ToInt32(dr["MANAGE_ID"]);

                mt.ACTION_EVENT = dr["FLOW_ACTION_EVENT"].ToString();

                mt.ACTION_EVENT = string.Format(mt.ACTION_EVENT, aFLOW_PARA);

                bool bResult = new SiaSun.LMS.Implement.S_FlowService().ManageEventExecute(mt, out sResult);

                SiaSun.LMS.Model.IO_CONTROL mIO_CONTROL = this._P_IO_CONTROL.GetModel(Convert.ToInt32(dr["CONTROL_ID"]));

                if (!bResult)
                {
                    if (sResult.Contains("牺牲"))
                    {
                        this._log.Error(string.Format("处理任务异常: {0}", sResult));

                        continue;
                    }

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

                    mMANAGE_MAIN.MANAGE_STATUS = Enum.MANAGE_STATUS.Error.ToString();

                    mMANAGE_MAIN.MANAGE_REMARK = sResult + string.Format("【控制任务状态-{0}】", mIO_CONTROL.CONTROL_STATUS.ToString());

                    this._P_MANAGE_MAIN.Update(mMANAGE_MAIN);
                }

                if (bResult)
                {
                    if (null != mIO_CONTROL)
                    {
                        mIO_CONTROL.PRE_CONTROL_STATUS = Convert.ToString(dr["CONTROL_STATUS"]);

                        this._P_IO_CONTROL.Update(mIO_CONTROL);
                    }
                }


            }
        }

        #endregion
        public bool RecordCreate(int MANAGE_ID, string sManageStatus, out string sResult)
        {
            bool bResult = true;

            sResult = string.Empty;

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

            if (null == mMANAGE_MAIN)
            {
                bResult = false;

                sResult = string.Format("任务号{0}不存在", MANAGE_ID);

                return bResult;
            }

            SiaSun.LMS.Model.RECORD_MAIN mRECORD_MAIN = new Model.RECORD_MAIN();  

            SiaSun.LMS.Model.RECORD_LIST mRECORD_LIST = null;

            SiaSun.LMS.Model.RECORD_DETAIL mRECORD_DETAIL = null;

            SiaSun.LMS.Model.PLAN_LIST mPLAN_LIST = null;

            SiaSun.LMS.Model.PLAN_MAIN mPLAN_MAIN = this._P_PLAN_MAIN.GetModel(mMANAGE_MAIN.PLAN_ID);

             SiaSun.LMS.Model.WH_CELL mSTART_WH_CELL = this._P_WH_CELL.GetModel(mMANAGE_MAIN.START_CELL_ID);

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

            try
            {
                if (mPLAN_MAIN != null)
                {
                    mRECORD_MAIN.PLAN_CODE = mPLAN_MAIN.PLAN_CODE;

                    mRECORD_MAIN.PLAN_TYPE_CODE = mPLAN_MAIN.PLAN_TYPE_CODE;
                }

                mRECORD_MAIN.MANAGE_TYPE_CODE = mMANAGE_MAIN.MANAGE_TYPE_CODE;

                mRECORD_MAIN.STOCK_BARCODE = mMANAGE_MAIN.STOCK_BARCODE;

                if (mSTART_WH_CELL != null)
                    mRECORD_MAIN.START_POSITION = mSTART_WH_CELL.CELL_CODE;

                if (mEND_WH_CELL != null)
                    mRECORD_MAIN.END_POSITION = mEND_WH_CELL.CELL_CODE;

                mRECORD_MAIN.RECORD_OPERATOR = mMANAGE_MAIN.MANAGE_OPERATOR;

                mRECORD_MAIN.MANAGE_BEGIN_TIME = mMANAGE_MAIN.MANAGE_BEGIN_TIME;

                mRECORD_MAIN.MANAGE_END_TIME = mMANAGE_MAIN.MANAGE_END_TIME;

                mRECORD_MAIN.RECORD_REMARK = mMANAGE_MAIN.MANAGE_REMARK;
                mRECORD_MAIN.MANAGE_STATUS = sManageStatus;

                this._P_RECORD_MAIN.Add(mRECORD_MAIN);

                foreach (SiaSun.LMS.Model.MANAGE_LIST mMANAGE_LIST in this._P_MANAGE_LIST.GetListManageID(MANAGE_ID))
                {
                    mRECORD_LIST = new Model.RECORD_LIST();

                    mRECORD_LIST.RECORD_ID = mRECORD_MAIN.RECORD_ID;

                    mRECORD_LIST.PLAN_LIST_ID = mMANAGE_LIST.PLAN_LIST_ID;

                    mRECORD_LIST.RECORD_LIST_QUANTITY = mMANAGE_LIST.MANAGE_LIST_QUANTITY;

                    mRECORD_LIST.GOODS_ID = mMANAGE_LIST.GOODS_ID;

                    mRECORD_LIST.RECORD_LIST_REMARK = mMANAGE_LIST.MANAGE_LIST_REMARK;

                    bResult = this._S_GoodsService.GoodsPropertySetValue(mMANAGE_LIST.GOODS_ID, mRECORD_LIST, mMANAGE_LIST, out sResult);

                    if (!bResult)
                    {
                        return bResult;
                    }

                    mRECORD_LIST.BOX_BARCODE = mMANAGE_LIST.BOX_BARCODE;

                    mRECORD_LIST.GOODS_PROPERTY1 = mMANAGE_LIST.GOODS_PROPERTY1;
                    mRECORD_LIST.GOODS_PROPERTY2 = mMANAGE_LIST.GOODS_PROPERTY2;
                    mRECORD_LIST.GOODS_PROPERTY3 = mMANAGE_LIST.GOODS_PROPERTY3;
                    mRECORD_LIST.GOODS_PROPERTY4 = mMANAGE_LIST.GOODS_PROPERTY4;
                    mRECORD_LIST.GOODS_PROPERTY5 = mMANAGE_LIST.GOODS_PROPERTY5;
                    mRECORD_LIST.GOODS_PROPERTY6 = mMANAGE_LIST.GOODS_PROPERTY6;
                    mRECORD_LIST.GOODS_PROPERTY7 = mMANAGE_LIST.GOODS_PROPERTY7;
                    mRECORD_LIST.GOODS_PROPERTY8 = mMANAGE_LIST.GOODS_PROPERTY8;
                    mRECORD_LIST.GOODS_PROPERTY9 = mMANAGE_LIST.GOODS_PROPERTY9;

                    this._P_RECORD_LIST.Add(mRECORD_LIST);

                    //是否为空 是否有明细

                    if (mPLAN_MAIN != null)
                    {
                        mPLAN_LIST = this._P_PLAN_LIST.GetModel(mMANAGE_LIST.PLAN_LIST_ID);

                        if (mPLAN_LIST != null)
                        {
                            mPLAN_LIST.PLAN_LIST_FINISHED_QUANTITY += mMANAGE_LIST.MANAGE_LIST_QUANTITY;

                            this._P_PLAN_LIST.Update(mPLAN_LIST);
                        }
                        #region//判断计划是否可以完成
                        DataTable update_plan = this.GetList(string.Format(@"select * from plan_list where plan_id = {0}", mPLAN_MAIN.PLAN_ID));
                        int j = 0;
                        for (int i = 0; i < update_plan.Rows.Count; i++)
                        {
                            if (Convert.ToInt32(update_plan.Rows[i]["PLAN_LIST_FINISHED_QUANTITY"]) >= Convert.ToInt32(update_plan.Rows[i]["PLAN_LIST_QUANTITY"]))
                            {
                                j++;
                            }
                        }
                        if (j == update_plan.Rows.Count)
                        {
                            mPLAN_MAIN.PLAN_STATUS = "Complete";
                            mPLAN_MAIN.PLAN_END_TIME = SiaSun.LMS.Common.StringUtil.GetDateTime();
                            this._P_PLAN_MAIN.Update(mPLAN_MAIN);
                        }
                        #endregion
                       
                    }

                    IList<SiaSun.LMS.Model.MANAGE_DETAIL> lsMANAGE_DETAIL = this._P_MANAGE_DETAIL.GetListManageListID(mMANAGE_LIST.MANAGE_LIST_ID);

                    foreach (SiaSun.LMS.Model.MANAGE_DETAIL mMANAGE_DETAIL in lsMANAGE_DETAIL)
                    {
                        mRECORD_DETAIL = new Model.RECORD_DETAIL();

                        mRECORD_DETAIL.RECORD_LIST_ID = mRECORD_LIST.RECORD_LIST_ID;

                        mRECORD_DETAIL.BOX_BARCODE = mMANAGE_DETAIL.BOX_BARCODE;

                        mRECORD_DETAIL.GOODS_BARCODE = mMANAGE_DETAIL.GOODS_BARCODE;

                        mRECORD_DETAIL.RECORD_DETAIL_REMARK = mMANAGE_DETAIL.MANAGE_DETAIL_REMARK;

                        this._P_RECORD_DETAIL.Add(mRECORD_DETAIL);
                       
                    }
                }

                this._P_IO_CONTROL.DeleteManageID(MANAGE_ID);

                this._P_MANAGE_DETAIL.DeleteManageID(MANAGE_ID);

                this._P_MANAGE_LIST.DeleteManageID(MANAGE_ID);

                this._P_MANAGE_MAIN.Delete(MANAGE_ID);
            }
            catch (Exception ex)
            {
                bResult = false;

                sResult = ex.Message;
            }

            return bResult;
        }

        /// <summary> 根据出库起始货位创建任务列表
        /// 
        /// </summary>
        /// <param name="START_CELL_ID"></param>
        /// <param name="listMANAGE_LIST"></param>
        /// <param name="sResult"></param>
        /// <returns></returns>
        public bool MANAGE_LIST_CREATE(int START_CELL_ID, out List<Model.MANAGE_LIST> listMANAGE_LIST, out string sResult)
        {
            bool bResult = true;
            sResult = string.Empty;
            listMANAGE_LIST = new List<MANAGE_LIST>();

            try
            {
                this._P_Base_House.BeginTransaction();

                //获取库存主表
                Model.STORAGE_MAIN mSTORAGE_MAIN = this._P_STORAGE_MAIN.GetModelCellID(START_CELL_ID);
                if (mSTORAGE_MAIN == null)
                {
                    bResult = false;
                    sResult = string.Format("未找到货位【{0}】的库存主表!", START_CELL_ID);
                    return bResult;
                }

                //获取库存列表
                List<Model.STORAGE_LIST> listSTORAGE_LIST = this._P_STORAGE_LIST.GetListStorageID(mSTORAGE_MAIN.STORAGE_ID).ToList();
                if (listSTORAGE_LIST == null || listSTORAGE_LIST.Count == 0)
                {
                    bResult = false;
                    sResult = string.Format("未找到库存主表【{0}】的库存列表!", mSTORAGE_MAIN.STORAGE_ID);
                    return bResult;
                }

                //创建任务列表
                foreach (Model.STORAGE_LIST mSTORAGE_LIST in listSTORAGE_LIST)
                {
                    Model.MANAGE_LIST mMANAGE_LIST = new MANAGE_LIST();
                    mMANAGE_LIST.STORAGE_LIST_ID = mSTORAGE_LIST.STORAGE_LIST_ID;
                    mMANAGE_LIST.GOODS_ID = mSTORAGE_LIST.GOODS_ID;
                    mMANAGE_LIST.MANAGE_LIST_QUANTITY = mSTORAGE_LIST.STORAGE_LIST_QUANTITY;
                    mMANAGE_LIST.MANAGE_LIST_REMARK = mSTORAGE_LIST.STORAGE_LIST_REMARK;
                    mMANAGE_LIST.BOX_BARCODE = mSTORAGE_LIST.BOX_BARCODE;
                    mMANAGE_LIST.GOODS_PROPERTY1 = mSTORAGE_LIST.GOODS_PROPERTY1;
                    mMANAGE_LIST.GOODS_PROPERTY2 = mSTORAGE_LIST.GOODS_PROPERTY2;
                    mMANAGE_LIST.GOODS_PROPERTY3 = mSTORAGE_LIST.GOODS_PROPERTY3;
                    mMANAGE_LIST.GOODS_PROPERTY4 = mSTORAGE_LIST.GOODS_PROPERTY4;
                    mMANAGE_LIST.GOODS_PROPERTY5 = mSTORAGE_LIST.GOODS_PROPERTY5;
                    mMANAGE_LIST.GOODS_PROPERTY6 = mSTORAGE_LIST.GOODS_PROPERTY6;
                    mMANAGE_LIST.GOODS_PROPERTY7 = mSTORAGE_LIST.GOODS_PROPERTY7;
                    mMANAGE_LIST.GOODS_PROPERTY8 = mSTORAGE_LIST.GOODS_PROPERTY8;
                    mMANAGE_LIST.GOODS_PROPERTY9 = mSTORAGE_LIST.GOODS_PROPERTY9;
                    //mMANAGE_LIST.GOODS_PROPERTY10 = mSTORAGE_LIST.GOODS_PROPERTY10;
                    //mMANAGE_LIST.GOODS_PROPERTY11 = mSTORAGE_LIST.GOODS_PROPERTY11;
                    //mMANAGE_LIST.GOODS_PROPERTY12 = mSTORAGE_LIST.GOODS_PROPERTY12;
                    //mMANAGE_LIST.GOODS_PROPERTY13 = mSTORAGE_LIST.GOODS_PROPERTY13;
                    //mMANAGE_LIST.GOODS_PROPERTY14 = mSTORAGE_LIST.GOODS_PROPERTY14;
                    //mMANAGE_LIST.GOODS_PROPERTY15 = mSTORAGE_LIST.GOODS_PROPERTY15;
                    listMANAGE_LIST.Add(mMANAGE_LIST);
                }

            }
            catch (Exception ex)
            {
                bResult = false;
                sResult = ex.Message;
            }
            finally
            {
                if (bResult)
                {
                    this._P_Base_House.CommitTransaction();
                }
                else
                {
                    this._P_Base_House.RollBackTransaction();
                }
            }
            return bResult;
        }

        #region 安卓pda
        //配盘
        public bool ManageInAndroid(out string sResult, MANAGE_MAIN mm, MANAGE_LIST[] lManageList)
        {
            bool bResult = true;
            sResult = string.Empty;
            bResult = new ManageIn().ManageCreate(mm, lManageList.ToList(), true, true, true, false, out sResult);
            return bResult;
        }
        //解绑
        public bool ManageOutAndroid(out string sResult, MANAGE_MAIN mm, MANAGE_LIST[] lManageList)
        {
            bool bResult = true;
            sResult = string.Empty;
            bResult = new ManageOut().ManageCreateWorkingArea(mm, lManageList.ToList(), true, false, true, out sResult);
            return bResult;
        }
        //上架
        public bool ManageUpAndroid(out string sResult, MANAGE_MAIN mm, MANAGE_LIST[] lManageList)
        {
            bool bResult = true;
            sResult = string.Empty;
            bResult = new ManageUp().ManageCreate(mm, true, true, false, out sResult);
            return bResult;
        }
        //呼叫子托盘
        public bool CallManageOutAndroid(int EndId, string GoodsCode, string User, out string sResult)
        {
            bool bResult = true;
            sResult = string.Empty;
            Model.WH_CELL wH_CELL = this._P_WH_CELL.GetModel(EndId);
            Model.SYS_USER sYS_USER = new SYS_USER();
            sYS_USER.USER_NAME = "Pad" + User;
            sYS_USER.USER_CODE = "Pad" + User;
            DataTable dtManageZTP = this.GetList(string.Format("select stock_barcode from IO_CONTROL where end_device_code='{0}'", wH_CELL.CELL_CODE));
            if (dtManageZTP.Rows.Count > 0)
            {
                bResult = false;
                sResult = string.Format("呼叫空子托盘垛出库失败:已经存在到站台{0}的任务", wH_CELL.CELL_CODE) + sResult;
                AddLog(sResult);
                return bResult;
            }
            bResult = this.Invoke("ManageOut", "ManageCreate_Stock_Out_Auot", new object[] { sYS_USER, "ManageOut", GoodsCode, wH_CELL.CELL_CODE, true }, out sResult);
            if (bResult)
            {
                sResult = string.Format("呼叫空子托盘垛出库成功:站台{0}", wH_CELL.CELL_CODE) + sResult;
                AddLog(sResult);
            }
            else
            {
                bResult = false;
            }

            return bResult;
        }
        //立库出库
        public bool LiKuOutAndroid(out string sResult, MANAGE_MAIN mm, MANAGE_LIST[] lManageList)
        {
            bool bResult = true;
            sResult = string.Empty;
            bResult = new ManageOut().ManageCreate(mm, lManageList.ToList(), true, true, false, out sResult);
            if (bResult)
            {
                sResult = string.Format("出库成功") + sResult;
                AddLog(sResult);
            }
            else
            {
                bResult = false;
            }

            return bResult;
        }

        public bool ManageOutAuto(int plan_id, bool bTrans, bool bAutoSendControl,
                                      bool bComplete,out string sResult)
        {
            sResult = string.Empty;
            bool bResult = true;
            lock (lockObj)
            {
                this._P_Base_House.BeginTransaction(bTrans);
                try
                {
                    PLAN_MAIN pLAN_MAIN = this._P_PLAN_MAIN.GetModel(plan_id);
                    if (pLAN_MAIN == null)
                    {
                        sResult = string.Format(@"未找到计划id{0}的主表", plan_id);
                        bResult = false;
                        return bResult;
                    }
                    IList<IO_CONTROL> iO_CONTROLs = this._P_IO_CONTROL.GetModel_BY_END_DEVICE_CODE(pLAN_MAIN.PLAN_TO_DEPT);
                    if (iO_CONTROLs.Count > 1)
                    {
                        sResult = string.Format(@"计划id{0}状态不是执行中", plan_id);
                        bResult = false;
                        return bResult;
                    }

                    if (!pLAN_MAIN.PLAN_STATUS.Equals("Executing"))
                    {
                        sResult = string.Format(@"计划id{0}状态不是执行中", plan_id);
                        bResult = false;
                        return bResult;
                    }
                    
                    List<Model.PLAN_LIST> pLAN_LISTs = (List<Model.PLAN_LIST>)_P_PLAN_LIST.GetListPlanID(pLAN_MAIN.PLAN_ID);
                    if (pLAN_LISTs == null || pLAN_LISTs.Count < 1)
                    {
                        sResult = string.Format(@"未找到计划id{0}的子表", plan_id);
                        bResult = false;
                        return bResult;
                    }
                    //需要判断目标站台是否有货,如果有货且有一个任务,不出库
                    //GOODS_PROPERTY1:批次
                    string strGoods_property = string.Empty;
                    //筛选条件
                    strGoods_property = string.Format(@" goods_id = {0} and {1} ", pLAN_LISTs[0].GOODS_ID,string.IsNullOrEmpty(pLAN_LISTs[0].GOODS_PROPERTY1)?  " 1=1 " : string.Format(@"goods_property1 = '{0}'", pLAN_LISTs[0].GOODS_PROPERTY1));
                    //如果出库小料,单伸货位
                    if (pLAN_LISTs[0].GOODS_ID == 32782)
                    {
                        DataTable dt_storage_list = this.GetList(string.Format(@"select * from v_storage_list where {0} and 
                                                                                  CELL_STATUS='Full' and RUN_STATUS='Enable'
                                                                                  and device_code in(select start_device from io_control_route where end_device = '{1}' and control_route_status = 1)
                                                                                  order by entry_time", strGoods_property, pLAN_MAIN.PLAN_TO_DEPT));
                        if (dt_storage_list == null || dt_storage_list.Rows.Count < 1)
                        {
                            sResult = "无库存";
                            bResult = false;
                            return bResult;
                        }
                        //下达任务
                        Model.WH_CELL wH_CELL = this._P_WH_CELL.GetModel(pLAN_MAIN.PLAN_TO_DEPT);
                        Model.MANAGE_MAIN mANAGE_MAIN = new Model.MANAGE_MAIN();
                        Model.STORAGE_MAIN sTORAGE_MAIN = _P_STORAGE_MAIN.GetModelStockBarcode(dt_storage_list.Rows[0]["STOCK_BARCODE"].ToString());
                        IList<Model.STORAGE_LIST> sTORAGE_LISTs = _P_STORAGE_LIST.GetListStorageID(sTORAGE_MAIN.STORAGE_ID);
                        List<Model.MANAGE_LIST> mANAGE_LISTs = new List<Model.MANAGE_LIST>();
                        mANAGE_MAIN.STOCK_BARCODE = sTORAGE_MAIN.STOCK_BARCODE;
                        mANAGE_MAIN.START_CELL_ID = sTORAGE_MAIN.CELL_ID;
                        mANAGE_MAIN.END_CELL_ID = wH_CELL.CELL_ID;
                        mANAGE_MAIN.MANAGE_TYPE_CODE = "ManagePlanOut";
                        mANAGE_MAIN.PLAN_ID = plan_id;
                        mANAGE_MAIN.MANAGE_OPERATOR = pLAN_MAIN.PLAN_CREATER;
                        mANAGE_MAIN.MANAGE_BEGIN_TIME = SiaSun.LMS.Common.StringUtil.GetDateTime();
                        mANAGE_MAIN.MANAGE_STATUS = SiaSun.LMS.Enum.MANAGE_STATUS.WaitingSend.ToString();
                        foreach (Model.STORAGE_LIST storage_list in sTORAGE_LISTs)
                        {
                            Model.MANAGE_LIST mANAGE_LIST = new Model.MANAGE_LIST();
                            mANAGE_LIST.GOODS_ID = storage_list.GOODS_ID;
                            mANAGE_LIST.MANAGE_LIST_QUANTITY = 1;
                            mANAGE_LIST.STORAGE_LIST_ID = storage_list.STORAGE_LIST_ID;
                            mANAGE_LIST.PLAN_LIST_ID = pLAN_LISTs[0].PLAN_LIST_ID;
                            mANAGE_LIST.GOODS_PROPERTY1 = storage_list.GOODS_PROPERTY1;
                            mANAGE_LIST.GOODS_PROPERTY2 = storage_list.GOODS_PROPERTY2;
                            mANAGE_LIST.GOODS_PROPERTY3 = storage_list.GOODS_PROPERTY3;
                            mANAGE_LIST.GOODS_PROPERTY4 = storage_list.GOODS_PROPERTY4;
                            mANAGE_LIST.GOODS_PROPERTY5 = storage_list.GOODS_PROPERTY5;
                            mANAGE_LIST.GOODS_PROPERTY6 = storage_list.GOODS_PROPERTY6;
                            mANAGE_LIST.GOODS_PROPERTY7 = storage_list.GOODS_PROPERTY7;
                            mANAGE_LIST.GOODS_PROPERTY8 = storage_list.GOODS_PROPERTY8;
                            mANAGE_LIST.GOODS_PROPERTY9 = storage_list.GOODS_PROPERTY9;
                            mANAGE_LISTs.Add(mANAGE_LIST);
                        }
                        bResult = new ManageOut().ManageCreate(mANAGE_MAIN, pLAN_LISTs, mANAGE_LISTs, false, bAutoSendControl, bComplete, out sResult);
                        return bResult;
                    }
                    //出库原料,双伸货位
                    else
                    {
                        #region 先找远端有货无任务且近端有货有任务的远端货位
                        DataTable DT_STORAGE_FAR_FULL_ENABLE = this.GetList(string.Format(@"select * from V_STORAGE_LIST where cell_id in(
                                                                                    SELECT CELL_ID_FAR
                                                                                    FROM V_WH_CELL_DOUBLE_TO_NORMAL
                                                                                    where CELL_STATUS='Full' and RUN_STATUS='Enable' and 
                                                                                    CELL_STATUS_NEAR = 'Full' and RUN_STATUS_NEAR = 'Selected')
                                                                                    and {0} and device_code in(select start_device from io_control_route where end_device = '{1}' and control_route_status = 1)", strGoods_property, pLAN_MAIN.PLAN_TO_DEPT));
                        if (DT_STORAGE_FAR_FULL_ENABLE == null || DT_STORAGE_FAR_FULL_ENABLE.Rows.Count < 1)
                        {

                            #region 再找远端有货无任务且近端无货无任务的远端货位
                            DataTable DT_STORAGE_FAR_FULL_ENABLE_NEAR_NOHAVE_ENABLE = this.GetList(string.Format(@"select * from V_STORAGE_LIST where cell_id in(
                                                                                    SELECT CELL_ID_FAR
                                                                                    FROM V_WH_CELL_DOUBLE_TO_NORMAL
                                                                                    where CELL_STATUS_NEAR='Nohave' and RUN_STATUS_NEAR='Enable'
                                                                                    and CELL_STATUS = 'Full' and RUN_STATUS = 'Enable') and {0} 
                                            and device_code in(select start_device from io_control_route where end_device = '{1}' and control_route_status = 1)", strGoods_property, pLAN_MAIN.PLAN_TO_DEPT));
                            if (DT_STORAGE_FAR_FULL_ENABLE_NEAR_NOHAVE_ENABLE == null || DT_STORAGE_FAR_FULL_ENABLE_NEAR_NOHAVE_ENABLE.Rows.Count < 1)
                            {
                                #region 再其次找近端有货无任务的近端货位
                                DataTable DT_STORAGE_NEAR_FULL_ENABLE = this.GetList(string.Format(@"select * from V_STORAGE_LIST where cell_id in(
                                                                                    SELECT CELL_ID_NEAR
                                                                                    FROM V_WH_CELL_DOUBLE_TO_NORMAL
                                                                                    where CELL_STATUS_NEAR='Full' and RUN_STATUS_NEAR='Enable') and {0}
                                                                    and device_code in(select start_device from io_control_route where end_device = '{1}' and control_route_status = 1)", strGoods_property, pLAN_MAIN.PLAN_TO_DEPT));
                                if (DT_STORAGE_NEAR_FULL_ENABLE == null || DT_STORAGE_NEAR_FULL_ENABLE.Rows.Count < 1)
                                {
                                    //最后找远端货位有货无任务的远端货位
                                    DataTable DT_STORAGE_FAR_FULL_ENABLE_NEAR_ANY = this.GetList(string.Format(@"select * from V_STORAGE_LIST where cell_id in(
                                                                                    SELECT CELL_ID_FAR
                                                                                    FROM V_WH_CELL_DOUBLE_TO_NORMAL
                                                                                    where CELL_STATUS = 'Full' and RUN_STATUS = 'Enable') and {0}
                                                                    and device_code in(select start_device from io_control_route where end_device = '{1}' and control_route_status = 1)", strGoods_property, pLAN_MAIN.PLAN_TO_DEPT));
                                    if (DT_STORAGE_FAR_FULL_ENABLE_NEAR_ANY == null || DT_STORAGE_FAR_FULL_ENABLE_NEAR_ANY.Rows.Count < 1)
                                    {
                                        sResult = string.Format(@"无库存");
                                        bResult = false;
                                        return bResult;
                                    }
                                    else
                                    {
                                        //下达任务
                                        Model.WH_CELL wH_CELL = this._P_WH_CELL.GetModel(pLAN_MAIN.PLAN_TO_DEPT);
                                        Model.MANAGE_MAIN mANAGE_MAIN = new Model.MANAGE_MAIN();
                                        Model.STORAGE_MAIN sTORAGE_MAIN = _P_STORAGE_MAIN.GetModelStockBarcode(DT_STORAGE_FAR_FULL_ENABLE_NEAR_ANY.Rows[0]["STOCK_BARCODE"].ToString());
                                        IList<Model.STORAGE_LIST> sTORAGE_LISTs = _P_STORAGE_LIST.GetListStorageID(sTORAGE_MAIN.STORAGE_ID);
                                        List<Model.MANAGE_LIST> mANAGE_LISTs = new List<Model.MANAGE_LIST>();
                                        mANAGE_MAIN.STOCK_BARCODE = sTORAGE_MAIN.STOCK_BARCODE;
                                        mANAGE_MAIN.START_CELL_ID = sTORAGE_MAIN.CELL_ID;
                                        mANAGE_MAIN.END_CELL_ID = wH_CELL.CELL_ID;
                                        mANAGE_MAIN.MANAGE_TYPE_CODE = "ManagePlanOut";
                                        mANAGE_MAIN.PLAN_ID = plan_id;
                                        mANAGE_MAIN.MANAGE_OPERATOR = pLAN_MAIN.PLAN_CREATER;
                                        mANAGE_MAIN.MANAGE_BEGIN_TIME = SiaSun.LMS.Common.StringUtil.GetDateTime();
                                        mANAGE_MAIN.MANAGE_STATUS = SiaSun.LMS.Enum.MANAGE_STATUS.WaitingSend.ToString();
                                        foreach (Model.STORAGE_LIST storage_list in sTORAGE_LISTs)
                                        {
                                            Model.MANAGE_LIST mANAGE_LIST = new Model.MANAGE_LIST();
                                            mANAGE_LIST.GOODS_ID = storage_list.GOODS_ID;
                                            mANAGE_LIST.MANAGE_LIST_QUANTITY = 1;
                                            mANAGE_LIST.STORAGE_LIST_ID = storage_list.STORAGE_LIST_ID;
                                            mANAGE_LIST.PLAN_LIST_ID = pLAN_LISTs[0].PLAN_LIST_ID;
                                            mANAGE_LIST.GOODS_PROPERTY1 = storage_list.GOODS_PROPERTY1;
                                            mANAGE_LIST.GOODS_PROPERTY2 = storage_list.GOODS_PROPERTY2;
                                            mANAGE_LIST.GOODS_PROPERTY3 = storage_list.GOODS_PROPERTY3;
                                            mANAGE_LIST.GOODS_PROPERTY4 = storage_list.GOODS_PROPERTY4;
                                            mANAGE_LIST.GOODS_PROPERTY5 = storage_list.GOODS_PROPERTY5;
                                            mANAGE_LIST.GOODS_PROPERTY6 = storage_list.GOODS_PROPERTY6;
                                            mANAGE_LIST.GOODS_PROPERTY7 = storage_list.GOODS_PROPERTY7;
                                            mANAGE_LIST.GOODS_PROPERTY8 = storage_list.GOODS_PROPERTY8;
                                            mANAGE_LIST.GOODS_PROPERTY9 = storage_list.GOODS_PROPERTY9;
                                            mANAGE_LISTs.Add(mANAGE_LIST);
                                        }
                                        bResult = new ManageOut().ManageCreate(mANAGE_MAIN, pLAN_LISTs, mANAGE_LISTs, false, bAutoSendControl, bComplete, out sResult);
                                        return bResult;
                                    }
                                }
                                else
                                {
                                    //下达任务
                                    Model.WH_CELL wH_CELL = this._P_WH_CELL.GetModel(pLAN_MAIN.PLAN_TO_DEPT);
                                    Model.MANAGE_MAIN mANAGE_MAIN = new Model.MANAGE_MAIN();
                                    Model.STORAGE_MAIN sTORAGE_MAIN = _P_STORAGE_MAIN.GetModelStockBarcode(DT_STORAGE_NEAR_FULL_ENABLE.Rows[0]["STOCK_BARCODE"].ToString());
                                    IList<Model.STORAGE_LIST> sTORAGE_LISTs = _P_STORAGE_LIST.GetListStorageID(sTORAGE_MAIN.STORAGE_ID);
                                    List<Model.MANAGE_LIST> mANAGE_LISTs = new List<Model.MANAGE_LIST>();
                                    mANAGE_MAIN.STOCK_BARCODE = sTORAGE_MAIN.STOCK_BARCODE;
                                    mANAGE_MAIN.START_CELL_ID = sTORAGE_MAIN.CELL_ID;
                                    mANAGE_MAIN.END_CELL_ID = wH_CELL.CELL_ID;
                                    mANAGE_MAIN.MANAGE_TYPE_CODE = "ManagePlanOut";
                                    mANAGE_MAIN.PLAN_ID = plan_id;
                                    mANAGE_MAIN.MANAGE_OPERATOR = pLAN_MAIN.PLAN_CREATER;
                                    mANAGE_MAIN.MANAGE_BEGIN_TIME = SiaSun.LMS.Common.StringUtil.GetDateTime();
                                    mANAGE_MAIN.MANAGE_STATUS = SiaSun.LMS.Enum.MANAGE_STATUS.WaitingSend.ToString();
                                    foreach (Model.STORAGE_LIST storage_list in sTORAGE_LISTs)
                                    {
                                        Model.MANAGE_LIST mANAGE_LIST = new Model.MANAGE_LIST();
                                        mANAGE_LIST.GOODS_ID = storage_list.GOODS_ID;
                                        mANAGE_LIST.MANAGE_LIST_QUANTITY = 1;
                                        mANAGE_LIST.PLAN_LIST_ID = pLAN_LISTs[0].PLAN_LIST_ID;
                                        mANAGE_LIST.STORAGE_LIST_ID = storage_list.STORAGE_LIST_ID;
                                        mANAGE_LIST.GOODS_PROPERTY1 = storage_list.GOODS_PROPERTY1;
                                        mANAGE_LIST.GOODS_PROPERTY2 = storage_list.GOODS_PROPERTY2;
                                        mANAGE_LIST.GOODS_PROPERTY3 = storage_list.GOODS_PROPERTY3;
                                        mANAGE_LIST.GOODS_PROPERTY4 = storage_list.GOODS_PROPERTY4;
                                        mANAGE_LIST.GOODS_PROPERTY5 = storage_list.GOODS_PROPERTY5;
                                        mANAGE_LIST.GOODS_PROPERTY6 = storage_list.GOODS_PROPERTY6;
                                        mANAGE_LIST.GOODS_PROPERTY7 = storage_list.GOODS_PROPERTY7;
                                        mANAGE_LIST.GOODS_PROPERTY8 = storage_list.GOODS_PROPERTY8;
                                        mANAGE_LIST.GOODS_PROPERTY9 = storage_list.GOODS_PROPERTY9;
                                        mANAGE_LISTs.Add(mANAGE_LIST);
                                    }
                                    bResult = new ManageOut().ManageCreate(mANAGE_MAIN, pLAN_LISTs, mANAGE_LISTs, false, bAutoSendControl, bComplete, out sResult);
                                    return bResult;
                                }
                                #endregion
                            }
                            else
                            {
                                //下达任务
                                Model.WH_CELL wH_CELL = this._P_WH_CELL.GetModel(pLAN_MAIN.PLAN_TO_DEPT);
                                Model.MANAGE_MAIN mANAGE_MAIN = new Model.MANAGE_MAIN();
                                Model.STORAGE_MAIN sTORAGE_MAIN = _P_STORAGE_MAIN.GetModelStockBarcode(DT_STORAGE_FAR_FULL_ENABLE_NEAR_NOHAVE_ENABLE.Rows[0]["STOCK_BARCODE"].ToString());
                                IList<Model.STORAGE_LIST> sTORAGE_LISTs = _P_STORAGE_LIST.GetListStorageID(sTORAGE_MAIN.STORAGE_ID);
                                List<Model.MANAGE_LIST> mANAGE_LISTs = new List<Model.MANAGE_LIST>();
                                mANAGE_MAIN.STOCK_BARCODE = sTORAGE_MAIN.STOCK_BARCODE;
                                mANAGE_MAIN.START_CELL_ID = sTORAGE_MAIN.CELL_ID;
                                mANAGE_MAIN.END_CELL_ID = wH_CELL.CELL_ID;
                                mANAGE_MAIN.MANAGE_TYPE_CODE = "ManagePlanOut";
                                mANAGE_MAIN.PLAN_ID = plan_id;
                                mANAGE_MAIN.MANAGE_OPERATOR = pLAN_MAIN.PLAN_CREATER;
                                mANAGE_MAIN.MANAGE_BEGIN_TIME = SiaSun.LMS.Common.StringUtil.GetDateTime();
                                mANAGE_MAIN.MANAGE_STATUS = SiaSun.LMS.Enum.MANAGE_STATUS.WaitingSend.ToString();
                                foreach (Model.STORAGE_LIST storage_list in sTORAGE_LISTs)
                                {
                                    Model.MANAGE_LIST mANAGE_LIST = new Model.MANAGE_LIST();
                                    mANAGE_LIST.GOODS_ID = storage_list.GOODS_ID;
                                    mANAGE_LIST.MANAGE_LIST_QUANTITY = 1;
                                    mANAGE_LIST.STORAGE_LIST_ID = storage_list.STORAGE_LIST_ID;
                                    mANAGE_LIST.PLAN_LIST_ID = pLAN_LISTs[0].PLAN_LIST_ID;
                                    mANAGE_LIST.GOODS_PROPERTY1 = storage_list.GOODS_PROPERTY1;
                                    mANAGE_LIST.GOODS_PROPERTY2 = storage_list.GOODS_PROPERTY2;
                                    mANAGE_LIST.GOODS_PROPERTY3 = storage_list.GOODS_PROPERTY3;
                                    mANAGE_LIST.GOODS_PROPERTY4 = storage_list.GOODS_PROPERTY4;
                                    mANAGE_LIST.GOODS_PROPERTY5 = storage_list.GOODS_PROPERTY5;
                                    mANAGE_LIST.GOODS_PROPERTY6 = storage_list.GOODS_PROPERTY6;
                                    mANAGE_LIST.GOODS_PROPERTY7 = storage_list.GOODS_PROPERTY7;
                                    mANAGE_LIST.GOODS_PROPERTY8 = storage_list.GOODS_PROPERTY8;
                                    mANAGE_LIST.GOODS_PROPERTY9 = storage_list.GOODS_PROPERTY9;
                                    mANAGE_LISTs.Add(mANAGE_LIST);
                                }
                                bResult = new ManageOut().ManageCreate(mANAGE_MAIN, pLAN_LISTs, mANAGE_LISTs, false, bAutoSendControl, bComplete, out sResult);
                                return bResult;
                            }
                            #endregion
                        }
                        else
                        {
                            //下达任务
                            Model.WH_CELL wH_CELL = this._P_WH_CELL.GetModel(pLAN_MAIN.PLAN_TO_DEPT);
                            Model.MANAGE_MAIN mANAGE_MAIN = new Model.MANAGE_MAIN();
                            Model.STORAGE_MAIN sTORAGE_MAIN = _P_STORAGE_MAIN.GetModelStockBarcode(DT_STORAGE_FAR_FULL_ENABLE.Rows[0]["STOCK_BARCODE"].ToString());
                            IList<Model.STORAGE_LIST> sTORAGE_LISTs = _P_STORAGE_LIST.GetListStorageID(sTORAGE_MAIN.STORAGE_ID);
                            List<Model.MANAGE_LIST> mANAGE_LISTs = new List<Model.MANAGE_LIST>();
                            mANAGE_MAIN.STOCK_BARCODE = sTORAGE_MAIN.STOCK_BARCODE;
                            mANAGE_MAIN.START_CELL_ID = sTORAGE_MAIN.CELL_ID;
                            mANAGE_MAIN.END_CELL_ID = wH_CELL.CELL_ID;
                            mANAGE_MAIN.MANAGE_TYPE_CODE = "ManagePlanOut";
                            mANAGE_MAIN.PLAN_ID = plan_id;
                            mANAGE_MAIN.MANAGE_OPERATOR = pLAN_MAIN.PLAN_CREATER;
                            mANAGE_MAIN.MANAGE_BEGIN_TIME = SiaSun.LMS.Common.StringUtil.GetDateTime();
                            mANAGE_MAIN.MANAGE_STATUS = SiaSun.LMS.Enum.MANAGE_STATUS.WaitingSend.ToString();
                            foreach (Model.STORAGE_LIST storage_list in sTORAGE_LISTs)
                            {
                                Model.MANAGE_LIST mANAGE_LIST = new Model.MANAGE_LIST();
                                mANAGE_LIST.GOODS_ID = storage_list.GOODS_ID;
                                mANAGE_LIST.MANAGE_LIST_QUANTITY = 1;
                                mANAGE_LIST.PLAN_LIST_ID = pLAN_LISTs[0].PLAN_LIST_ID;
                                mANAGE_LIST.GOODS_PROPERTY1 = storage_list.GOODS_PROPERTY1;
                                mANAGE_LIST.GOODS_PROPERTY2 = storage_list.GOODS_PROPERTY2;
                                mANAGE_LIST.GOODS_PROPERTY3 = storage_list.GOODS_PROPERTY3;
                                mANAGE_LIST.GOODS_PROPERTY4 = storage_list.GOODS_PROPERTY4;
                                mANAGE_LIST.GOODS_PROPERTY5 = storage_list.GOODS_PROPERTY5;
                                mANAGE_LIST.GOODS_PROPERTY6 = storage_list.GOODS_PROPERTY6;
                                mANAGE_LIST.GOODS_PROPERTY7 = storage_list.GOODS_PROPERTY7;
                                mANAGE_LIST.GOODS_PROPERTY8 = storage_list.GOODS_PROPERTY8;
                                mANAGE_LIST.GOODS_PROPERTY9 = storage_list.GOODS_PROPERTY9;
                                mANAGE_LISTs.Add(mANAGE_LIST);
                            }
                            bResult = new ManageOut().ManageCreate(mANAGE_MAIN, pLAN_LISTs, mANAGE_LISTs, false, bAutoSendControl, bComplete, out sResult);
                            return bResult;
                        }
                        #endregion
                    }


                }
                catch (Exception ex)
                {
                    sResult = ex.ToString();
                    bResult = false;
                    return bResult;
                }
                finally
                {
                    if (bResult)
                    {
                        this._P_Base_House.CommitTransaction(bTrans);
                    }
                    else
                    {
                        this._P_Base_House.RollBackTransaction(bTrans);
                    }
                }
            }
        }

        public string GetGoodsProperty05(string sDeviceCode)
        {
            DataTable dtApply = this.GetList(
                $"select top 1 isnull(CONTROL_APPLY_PARA03,'0') CONTROL_APPLY_PARA03 from IO_CONTROL_APPLY_HIS" +
                $" where DEVICE_CODE='{sDeviceCode}'" +
                $" and CREATE_TIME>'{DateTime.Now.AddHours(-1).ToString("yyyy-MM-dd HH:mm:ss")}' order by CONTROL_APPLY_ID desc");
            if (dtApply.Rows.Count > 0)
            {
                return dtApply.Rows[0]["CONTROL_APPLY_PARA03"].ToString().TrimStart('-');
            }
            return string.Empty;
        }
        #endregion
    }
}