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

namespace SiaSun.LMS.Implement
{
    public class ManageDown : ManageBase
    {
        /// <summary>
        /// 双深货位 生成【实盘下架】任务
        /// 客户端一次调用,传递多个明细
        /// 按照DOUBLE与NORMAL的对应关系逐一下架
        /// 锁定不能下架,可移库
        /// 调用界面 ManageDown.xaml
        /// </summary>
        /// <param name="lsSTORAGE_MAIN">下架库存集合</param>
        /// <param name="END_AREA_ID">下架目标作业区,不可空</param>
        /// <param name="END_CELL_ID">下架站台,0由系统分配</param>
        /// <param name="bAutoSendControl"></param>
        /// <param name="bTrans"></param>
        /// <param name="Opertator"></param>
        /// <param name="sResult"></param>
        /// <returns></returns>
        public bool ManageCreate(List<SiaSun.LMS.Model.STORAGE_MAIN> lsSTORAGE_MAIN,
                       //int END_AREA_ID,
                       int END_CELL_ID,
                       bool bAutoSendControl,
                       string Opertator,
                       out string sResult)
        {
            bool bResult = true;

            sResult = string.Empty;

            try
            {
                this._P_Base_House.BeginTransaction(true);

                //按CELL_ID分组,逐一下架
                foreach (IGrouping<int, Model.STORAGE_MAIN> lsCELL_MAIN in lsSTORAGE_MAIN.GroupBy(r => r.CELL_ID))
                {
                    int START_CELL_ID = lsCELL_MAIN.Key;

                    #region 校验起始货位

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

                    if (null == mSTART_WH_CELL)
                    {
                        bResult = false;
                        sResult = string.Format("起始位置索引[{0}]不存在", lsCELL_MAIN.Key);
                        return bResult;
                    }

                    if (!mSTART_WH_CELL.CELL_TYPE.Equals(SiaSun.LMS.Enum.CELL_TYPE.Cell.ToString()))
                    {
                        bResult = false;
                        sResult = string.Format("起始位置[{0}]类型不合法", mSTART_WH_CELL.CELL_CODE);
                        return bResult;
                    }

                    SiaSun.LMS.Model.WH_AREA mSTART_WH_AREA = this._P_WH_AREA.GetModel(mSTART_WH_CELL.AREA_ID);

                    if (mSTART_WH_AREA.AREA_TYPE == SiaSun.LMS.Enum.AREA_TYPE.XuNiKu.ToString())
                    {
                        bResult = false;
                        sResult = string.Format("起始位置[{0}]库区类型[{1}]不合法", mSTART_WH_CELL.CELL_CODE, mSTART_WH_AREA.AREA_TYPE);
                        return bResult;
                    }

                    #endregion

                    #region 下架货位为双深时,关联的Normal是否进行移库处理,需要移库时,首先判断是否为待下架的托盘,是,则跳过。否,则移库。

                    ////下达监控任务的下架,才会考虑关联Normal的移库
                    //if (bAutoSendControl)
                    //{
                    //    int NormalCell = 0;
                    //    string NormalStock = string.Empty;
                    //    bool bMove = new ManageMove().CheckNormalMove(START_CELL_ID, out NormalCell, out NormalStock, out sResult);
                    //    //需要移库
                    //    if (bMove)
                    //    {
                    //        //判断NORMAL是否为本次待下架的托盘,Normal在本次下架中,则不需要移库
                    //        if (!lsSTORAGE_MAIN.Select(r => r.CELL_ID).Contains(NormalCell))
                    //        {
                    //            //未包含在待下架集合中,则创建移库任务
                    //            bResult = new ManageMove().ManageCreate(NormalStock, NormalCell, 0, bAutoSendControl, false, "SYS", out sResult);
                    //            if (!bResult)
                    //            {
                    //                sResult = string.Format("系统NORMAL移库报错 {0}", sResult);
                    //                return bResult;
                    //            }
                    //        }
                    //    }
                    //    else
                    //    {
                    //        string NormalCellCode = string.Empty;
                    //        bResult = new ManageMove().CheckDoubleEnableDown(mSTART_WH_CELL.CELL_ID, out NormalCellCode, out sResult);
                    //        if (!bResult)
                    //        {
                    //            sResult = string.Format("双深货位[{0}]不允许下架 由于其关联的普通货位[{1}] 空且已选中(即存在任务),请稍后再试", mSTART_WH_CELL.CELL_CODE, NormalCellCode);
                    //            return bResult;
                    //        }
                    //    }
                    //}

                    #endregion


                    #region 校验货位库存

                    SiaSun.LMS.Model.STORAGE_MAIN mSTORAGE_MAIN = this._P_STORAGE_MAIN.GetModelCellID(START_CELL_ID);
                    if (mSTORAGE_MAIN == null)
                    {
                        bResult = false;
                        sResult = string.Format("货位[{0}]未找到库存,请刷新列表后重试", mSTART_WH_CELL.CELL_CODE);
                        return bResult;
                    }

                    IList<SiaSun.LMS.Model.STORAGE_LIST> lsSTORAGE_LIST = this._P_STORAGE_LIST.GetListStorageID(mSTORAGE_MAIN.STORAGE_ID);
                    if (lsSTORAGE_LIST.Count == 0)
                    {
                        bResult = false;
                        sResult = string.Format("货位[{0}]未找到库存,请刷新列表后重试", mSTART_WH_CELL.CELL_CODE);
                        return bResult;
                    }

                    if (lsSTORAGE_LIST[0].GOODS_ID < 0)
                    {
                        bResult = false;

                        sResult = string.Format("容器[{0}]库存为容器,请刷新列表后重试", mSTORAGE_MAIN.STOCK_BARCODE);

                        return bResult;
                    }

                    #endregion

                    #region 校验任务

                    SiaSun.LMS.Model.MANAGE_MAIN mMANAGE_MAIN = this._P_MANAGE_MAIN.GetModelStockBarcode(mSTORAGE_MAIN.STOCK_BARCODE);

                    if (mMANAGE_MAIN != null)
                    {
                        bResult = false;
                        sResult = string.Format("容器[{0}]已经存在任务[{1}]", mSTORAGE_MAIN.STOCK_BARCODE, mMANAGE_MAIN.MANAGE_ID);
                        return bResult;
                    }

                    #endregion

                    #region 库存锁定时不允许创建下架任务
                    //foreach (Model.STORAGE_LIST tempSTORAGE_LIST in lsSTORAGE_LIST)
                    //{
                    //    IList<Model.STORAGE_LOCK> lsSTORAGE_LOCK = this._P_STORAGE_LOCK.GetList_STORAGE_LIST_ID(tempSTORAGE_LIST.STORAGE_LIST_ID);
                    //    if (lsSTORAGE_LOCK.Count > 0)
                    //    {
                    //        bResult = false;
                    //        sResult = string.Format("库存已被计划单锁定,请解锁后再进行下架");
                    //        return bResult;
                    //    }
                    //}
                    #endregion

                    #region 校验终止站台

                    if (END_CELL_ID != 0)
                    {
                        #region 校验终止位置

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

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

                            sResult = string.Format(" 终止位置索引[{0}]不存在", END_CELL_ID);

                            return bResult;
                        }

                        if (!mEND_WH_CELL.CELL_TYPE.Equals(SiaSun.LMS.Enum.CELL_TYPE.Station.ToString()))
                        {
                            bResult = false;

                            sResult = string.Format(" 终止位置[{0}]类型不合法", mEND_WH_CELL.CELL_NAME);

                            return bResult;
                        }

                        if (mEND_WH_CELL.CELL_INOUT.ToString().Equals(SiaSun.LMS.Enum.CELL_INOUT.In.ToString()))
                        {
                            bResult = false;

                            sResult = string.Format(" 终止位置[{0}]入出类型[{1}]不合法", mEND_WH_CELL.CELL_NAME, mEND_WH_CELL.CELL_INOUT);

                            return bResult;
                        }

                        #endregion
                    }
                    else
                    {
                        #region 根据起始位置,作业区,获得终止站台

                        #region 下架目标库区

                        //Model.WH_AREA mEND_WH_AREA = this._P_WH_AREA.GetModel(END_AREA_ID);
                        //if (mEND_WH_AREA == null)
                        //{
                        //    bResult = false;
                        //    sResult = string.Format("下架目标作业区索引[{0}]不存在", END_AREA_ID);
                        //    return bResult;
                        //}

                        #endregion

                        //bResult = this._S_CellService.GetOutStation(false, START_CELL_ID, out END_CELL_ID, out sResult);
                        bResult = this._S_CellService.GetOutStation(START_CELL_ID, out END_CELL_ID, out sResult);
                        if (!bResult)
                        {
                            return bResult;
                        }

                        #endregion
                    }

                    #endregion

                    #region 下达任务

                    #region MANAGE_MAIN

                    mMANAGE_MAIN = new SiaSun.LMS.Model.MANAGE_MAIN();

                    mMANAGE_MAIN.MANAGE_STATUS = SiaSun.LMS.Enum.MANAGE_STATUS.Waiting.ToString();

                    mMANAGE_MAIN.MANAGE_TYPE_CODE = SiaSun.LMS.Enum.MANAGE_TYPE.ManageDown.ToString();

                    mMANAGE_MAIN.PLAN_ID = 0;

                    mMANAGE_MAIN.PLAN_TYPE_CODE = string.Empty;

                    mMANAGE_MAIN.CELL_MODEL = mSTORAGE_MAIN.CELL_MODEL;

                    mMANAGE_MAIN.START_CELL_ID = START_CELL_ID;

                    mMANAGE_MAIN.END_CELL_ID = END_CELL_ID;

                    mMANAGE_MAIN.MANAGE_OPERATOR = Opertator;

                    mMANAGE_MAIN.STOCK_BARCODE = mSTORAGE_MAIN.STOCK_BARCODE;

                    mMANAGE_MAIN.FULL_FLAG = mSTORAGE_MAIN.FULL_FLAG;

                    mMANAGE_MAIN.MANAGE_REMARK = mSTORAGE_MAIN.STORAGE_REMARK;

                    #endregion

                    #region MANAGE_LIST

                    List<SiaSun.LMS.Model.MANAGE_LIST> lsMANAGE_LIST = new List<SiaSun.LMS.Model.MANAGE_LIST>();

                    foreach (SiaSun.LMS.Model.STORAGE_LIST mSTORAGE_LIST in lsSTORAGE_LIST)
                    {
                        SiaSun.LMS.Model.MANAGE_LIST mMANAGE_LIST = new Model.MANAGE_LIST();

                        mMANAGE_LIST.GOODS_ID = mSTORAGE_LIST.GOODS_ID;

                        mMANAGE_LIST.PLAN_LIST_ID = 0;

                        mMANAGE_LIST.STORAGE_LIST_ID = mSTORAGE_LIST.STORAGE_LIST_ID;

                        mMANAGE_LIST.MANAGE_LIST_QUANTITY = mSTORAGE_LIST.STORAGE_LIST_QUANTITY;

                        mMANAGE_LIST.MANAGE_LIST_REMARK = mSTORAGE_LIST.STORAGE_LIST_REMARK;

                        bResult = this._S_GoodsService.GoodsPropertySetValue(mSTORAGE_LIST.GOODS_ID, mMANAGE_LIST, mSTORAGE_LIST, out sResult);
                        if (!bResult)
                        {
                            return bResult;
                        }

                        lsMANAGE_LIST.Add(mMANAGE_LIST);
                    }

                    #endregion

                    bResult = base.ManageCreate(mMANAGE_MAIN, lsMANAGE_LIST, bAutoSendControl, false, out sResult);

                    //直接报完成
                    if ((!bAutoSendControl) && bResult)
                    {
                        bResult = this.ManageComplete(mMANAGE_MAIN.MANAGE_ID, false, out sResult);
                    }

                    #endregion
                }
            }

            catch (Exception ex)
            {
                bResult = false;

                sResult = ex.Message;

                this._log.Fatal(string.Format("调用方法{0}发生异常。", MethodBase.GetCurrentMethod().Name), ex);
            }
            finally
            {
                if (bResult)
                {
                    this._P_Base_House.CommitTransaction(true);
                }
                else
                {
                    this._P_Base_House.RollBackTransaction(true);
                }
            }

            return bResult;
        }


        /// <summary>
        /// 生成【实盘下架】任务
        /// 客户端循环调用,生成多个下架任务
        /// 【双深】客户端不适用
        /// 调用界面 ManageDown.XAML
        /// </summary>
        /// <param name="STORAGE_ID"></param>
        /// <param name="STOCK_BARCODE"></param>
        /// <param name="END_CELL_ID"></param>
        /// <param name="END_AREA_ID">作业区:未选择终止站台时,根据作业区自动选择下架站台</param>
        /// <param name="bAutoSendControl"></param>
        /// <param name="bTrans"></param>
        /// <param name="Opertator"></param>
        /// <param name="sResult"></param>
        /// <returns></returns>
        public bool ManageCreate(int STORAGE_ID,
                               string STOCK_BARCODE,
                               int END_CELL_ID,
                               int END_AREA_ID,
                               bool bAutoSendControl,
                               bool bTrans,
                               string Opertator,
                               out string sResult)
        {
            bool bResult = true;

            sResult = string.Empty;

            int START_CELL_ID = 0;

            try
            {
                #region 校验

                #region 校验库存

                SiaSun.LMS.Model.STORAGE_MAIN mSTORAGE_MAIN = this._P_STORAGE_MAIN.GetModel(STORAGE_ID);

                if (mSTORAGE_MAIN == null)
                {
                    mSTORAGE_MAIN = this._P_STORAGE_MAIN.GetModelStockBarcode(STOCK_BARCODE);
                    if (mSTORAGE_MAIN == null)
                    {
                        bResult = false;

                        sResult = string.Format("容器[{0}]不存在库存", STOCK_BARCODE);

                        return bResult;
                    }
                }

                IList<SiaSun.LMS.Model.STORAGE_LIST> lsSTORAGE_LIST = this._P_STORAGE_LIST.GetListStorageID(mSTORAGE_MAIN.STORAGE_ID);

                if (lsSTORAGE_LIST.Count == 0)
                {
                    bResult = false;

                    sResult = string.Format("容器[{0}]不存在库存", STOCK_BARCODE);

                    return bResult;
                }

                if (lsSTORAGE_LIST[0].GOODS_ID < 0)
                {
                    bResult = false;

                    sResult = string.Format("容器[{0}]库存为容器,请刷新列表后再下达任务", STOCK_BARCODE);

                    return bResult;
                }

                #region 库存锁定时不允许创建下架任务
                //foreach (Model.STORAGE_LIST tempSTORAGE_LIST in lsSTORAGE_LIST)
                //{
                //    IList<Model.STORAGE_LOCK> lsSTORAGE_LOCK = this._P_STORAGE_LOCK.GetList_STORAGE_LIST_ID(tempSTORAGE_LIST.STORAGE_LIST_ID);
                //    if (lsSTORAGE_LOCK.Count > 0)
                //    {
                //        bResult = false;
                //        sResult = string.Format("库存已被计划单锁定,请解锁后再进行下架");
                //        return bResult;
                //    }
                //}
                #endregion

                #endregion

                #region 校验任务

                SiaSun.LMS.Model.MANAGE_MAIN mMANAGE_MAIN = this._P_MANAGE_MAIN.GetModelStockBarcode(mSTORAGE_MAIN.STOCK_BARCODE);

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

                    sResult = string.Format("容器[{0}]已经存在任务[{1}]", mSTORAGE_MAIN.STOCK_BARCODE, mMANAGE_MAIN.MANAGE_ID);

                    return bResult;
                }

                #endregion

                #region 校验起始货位

                SiaSun.LMS.Model.WH_CELL mSTART_WH_CELL = this._P_WH_CELL.GetModel(mSTORAGE_MAIN.CELL_ID);

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

                    sResult = string.Format("起始位置索引[{0}]不存在", mSTORAGE_MAIN.CELL_ID);

                    return bResult;
                }

                if (!mSTART_WH_CELL.CELL_TYPE.Equals(SiaSun.LMS.Enum.CELL_TYPE.Cell.ToString()))
                {
                    bResult = false;

                    sResult = string.Format("起始位置[{0}]类型不合法", mSTART_WH_CELL.CELL_CODE);

                    return bResult;
                }

                SiaSun.LMS.Model.WH_AREA mSTART_WH_AREA = this._P_WH_AREA.GetModel(mSTART_WH_CELL.AREA_ID);

                if (mSTART_WH_AREA.AREA_TYPE == SiaSun.LMS.Enum.AREA_TYPE.XuNiKu.ToString())
                {
                    bResult = false;

                    sResult = string.Format("起始位置[{0}]库区类型[{1}]不合法", mSTART_WH_CELL.CELL_CODE, mSTART_WH_AREA.AREA_TYPE);

                    return bResult;
                }

                START_CELL_ID = mSTORAGE_MAIN.CELL_ID;

                #endregion

                #region 校验终止站台

                if (END_CELL_ID != 0)
                {
                    #region 校验终止位置

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

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

                        sResult = string.Format(" 终止位置索引[{0}]不存在", END_CELL_ID);

                        return bResult;
                    }

                    if (!mEND_WH_CELL.CELL_TYPE.Equals(SiaSun.LMS.Enum.CELL_TYPE.Station.ToString()))
                    {
                        bResult = false;

                        sResult = string.Format(" 终止位置[{0}]类型不合法", mEND_WH_CELL.CELL_NAME);

                        return bResult;
                    }

                    if (mEND_WH_CELL.CELL_INOUT.ToString().Equals(SiaSun.LMS.Enum.CELL_INOUT.In.ToString()))
                    {
                        bResult = false;

                        sResult = string.Format(" 终止位置[{0}]入出类型[{1}]不合法", mEND_WH_CELL.CELL_NAME, mEND_WH_CELL.CELL_INOUT);

                        return bResult;
                    }

                    #endregion
                }
                else
                {
                    #region 根据起始位置,作业区,获得终止站台

                    #region 下架目标库区

                    Model.WH_AREA mEND_WH_AREA = this._P_WH_AREA.GetModel(END_AREA_ID);
                    if (mEND_WH_AREA == null)
                    {
                        bResult = false;
                        sResult = string.Format("下架目标作业区索引[{0}]不存在", END_AREA_ID);
                        return bResult;
                    }

                    #endregion

                    bResult = this._S_CellService.GetOutEndStation(false, START_CELL_ID, END_AREA_ID, out END_CELL_ID, out sResult);

                    if (!bResult)
                    {
                        return bResult;
                    }

                    #endregion
                }

                #endregion

                #endregion

                #region 下架货位为双深时,关联的Normal是否进行移库处理 add by JJH 2019-03-23
                //if (bAutoSendControl)//下达监控任务时才校验是否移库
                //{
                //    int NormalCell = 0;
                //    string NormalStock = string.Empty;
                //    bool bMove = new ManageMove().CheckNormalMove(mSTORAGE_MAIN.CELL_ID, out NormalCell, out NormalStock, out sResult);
                //    if (bMove)
                //    {
                //        bResult = new ManageMove().ManageCreate(NormalStock, NormalCell, 0, bAutoSendControl, bTrans, "SYS", out sResult);
                //        if (!bResult)
                //        {
                //            sResult = string.Format("系统NORMAL移库报错 {0}", sResult);
                //            return bResult;
                //        }
                //    }
                //}
                #endregion

                #region 下达任务

                #region MANAGE_MAIN

                mMANAGE_MAIN = new SiaSun.LMS.Model.MANAGE_MAIN();

                mMANAGE_MAIN.MANAGE_STATUS = SiaSun.LMS.Enum.MANAGE_STATUS.Waiting.ToString();

                mMANAGE_MAIN.MANAGE_TYPE_CODE = SiaSun.LMS.Enum.MANAGE_TYPE.ManageDown.ToString();

                mMANAGE_MAIN.PLAN_ID = 0;

                mMANAGE_MAIN.PLAN_TYPE_CODE = string.Empty;

                mMANAGE_MAIN.CELL_MODEL = mSTORAGE_MAIN.CELL_MODEL;

                mMANAGE_MAIN.START_CELL_ID = START_CELL_ID;

                mMANAGE_MAIN.END_CELL_ID = END_CELL_ID;

                mMANAGE_MAIN.MANAGE_OPERATOR = Opertator;

                mMANAGE_MAIN.STOCK_BARCODE = mSTORAGE_MAIN.STOCK_BARCODE;

                mMANAGE_MAIN.FULL_FLAG = mSTORAGE_MAIN.FULL_FLAG;

                mMANAGE_MAIN.MANAGE_REMARK = mSTORAGE_MAIN.STORAGE_REMARK;

                #endregion

                #region MANAGE_LIST

                List<SiaSun.LMS.Model.MANAGE_LIST> lsMANAGE_LIST = new List<SiaSun.LMS.Model.MANAGE_LIST>();

                foreach (SiaSun.LMS.Model.STORAGE_LIST mSTORAGE_LIST in lsSTORAGE_LIST)
                {
                    SiaSun.LMS.Model.MANAGE_LIST mMANAGE_LIST = new Model.MANAGE_LIST();

                    mMANAGE_LIST.GOODS_ID = mSTORAGE_LIST.GOODS_ID;

                    mMANAGE_LIST.PLAN_LIST_ID = 0;

                    mMANAGE_LIST.STORAGE_LIST_ID = mSTORAGE_LIST.STORAGE_LIST_ID;

                    mMANAGE_LIST.MANAGE_LIST_QUANTITY = mSTORAGE_LIST.STORAGE_LIST_QUANTITY;

                    mMANAGE_LIST.MANAGE_LIST_REMARK = mSTORAGE_LIST.STORAGE_LIST_REMARK;

                    bResult = this._S_GoodsService.GoodsPropertySetValue(mSTORAGE_LIST.GOODS_ID, mMANAGE_LIST, mSTORAGE_LIST, out sResult);
                    if (!bResult)
                    {
                        return bResult;
                    }

                    lsMANAGE_LIST.Add(mMANAGE_LIST);
                }

                #endregion

                bResult = base.ManageCreate(mMANAGE_MAIN, lsMANAGE_LIST, bAutoSendControl, bTrans, out sResult);

                //直接报完成
                if ((!bAutoSendControl) && bResult)
                {
                    bResult = this.ManageComplete(mMANAGE_MAIN.MANAGE_ID, bTrans, out sResult);
                }

                #endregion
            }

            catch (Exception ex)
            {
                bResult = false;

                sResult = ex.Message;

                this._log.Fatal(string.Format("调用方法{0}发生异常。", MethodBase.GetCurrentMethod().Name), ex);
            }

            return bResult;
        }

        /// <summary>
        /// 生成【实盘下架任务】
        /// 调用界面 ManageDownOut.XAML
        /// </summary>
        /// <param name="STORAGE_ID"></param>
        /// <param name="STOCK_BARCODE"></param>
        /// <param name="END_CELL_ID"></param>
        /// <param name="bAutoSendControl"></param>
        /// <param name="bTrans"></param>
        /// <param name="Opertator"></param>
        /// <param name="sResult"></param>
        /// <returns></returns>
        public bool ManageCreate(int STORAGE_ID,
                               string STOCK_BARCODE,
                               int END_CELL_ID,
                               bool bAutoSendControl,
                               bool bTrans,
                               string Opertator,
                               out string sResult)
        {
            bool bResult = true;

            sResult = string.Empty;

            int START_CELL_ID = 0;

            try
            {
                #region 校验

                #region 校验库存

                SiaSun.LMS.Model.STORAGE_MAIN mSTORAGE_MAIN = this._P_STORAGE_MAIN.GetModel(STORAGE_ID);

                if (mSTORAGE_MAIN == null)
                {
                    mSTORAGE_MAIN = this._P_STORAGE_MAIN.GetModelStockBarcode(STOCK_BARCODE);
                    if (mSTORAGE_MAIN == null)
                    {
                        bResult = false;

                        sResult = string.Format("容器[{0}]不存在库存", STOCK_BARCODE);

                        return bResult;
                    }
                }

                IList<SiaSun.LMS.Model.STORAGE_LIST> lsSTORAGE_LIST = this._P_STORAGE_LIST.GetListStorageID(mSTORAGE_MAIN.STORAGE_ID);

                if (lsSTORAGE_LIST.Count == 0)
                {
                    bResult = false;

                    sResult = string.Format("容器[{0}]不存在库存", STOCK_BARCODE);

                    return bResult;
                }

                #endregion

                #region 校验任务

                SiaSun.LMS.Model.MANAGE_MAIN mMANAGE_MAIN = this._P_MANAGE_MAIN.GetModelStockBarcode(mSTORAGE_MAIN.STOCK_BARCODE);

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

                    sResult = string.Format("容器[{0}]已经存在任务[{1}]", mSTORAGE_MAIN.STOCK_BARCODE, mMANAGE_MAIN.MANAGE_ID);

                    return bResult;
                }

                #endregion

                #region 校验起始货位

                SiaSun.LMS.Model.WH_CELL mSTART_WH_CELL = this._P_WH_CELL.GetModel(mSTORAGE_MAIN.CELL_ID);

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

                    sResult = string.Format("起始位置索引[{0}]不存在", mSTORAGE_MAIN.CELL_ID);

                    return bResult;
                }

                if (!mSTART_WH_CELL.CELL_TYPE.Equals(SiaSun.LMS.Enum.CELL_TYPE.Cell.ToString()))
                {
                    bResult = false;

                    sResult = string.Format("起始位置[{0}]类型不合法", mSTART_WH_CELL.CELL_CODE);

                    return bResult;
                }

                SiaSun.LMS.Model.WH_AREA mSTART_WH_AREA = this._P_WH_AREA.GetModel(mSTART_WH_CELL.AREA_ID);

                if (mSTART_WH_AREA.AREA_TYPE == SiaSun.LMS.Enum.AREA_TYPE.XuNiKu.ToString())
                {
                    bResult = false;

                    sResult = string.Format("起始位置[{0}]库区类型[{1}]不合法", mSTART_WH_CELL.CELL_CODE, mSTART_WH_AREA.AREA_TYPE);

                    return bResult;
                }

                START_CELL_ID = mSTORAGE_MAIN.CELL_ID;

                #endregion

                #region 校验终止站台

                if (END_CELL_ID != 0)
                {
                    #region 校验终止位置

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

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

                        sResult = string.Format(" 终止位置索引[{0}]不存在", END_CELL_ID);

                        return bResult;
                    }

                    if (!mEND_WH_CELL.CELL_TYPE.Equals(SiaSun.LMS.Enum.CELL_TYPE.Station.ToString()))
                    {
                        bResult = false;

                        sResult = string.Format(" 终止位置[{0}]类型不合法", mEND_WH_CELL.CELL_NAME);

                        return bResult;
                    }

                    if (mEND_WH_CELL.CELL_INOUT.ToString().Equals(SiaSun.LMS.Enum.CELL_INOUT.In.ToString()))
                    {
                        bResult = false;

                        sResult = string.Format(" 终止位置[{0}]入出类型[{1}]不合法", mEND_WH_CELL.CELL_NAME, mEND_WH_CELL.CELL_INOUT);

                        return bResult;
                    }

                    #endregion
                }
                else
                {
                    #region 根据起始位置,获得终止站台

                    bResult = this._S_CellService.GetOutStation(START_CELL_ID, out END_CELL_ID, out sResult);

                    if (!bResult)
                    {
                        return bResult;
                    }

                    #endregion
                }

                #endregion

                #endregion

                #region 下达任务

                #region MANAGE_MAIN

                mMANAGE_MAIN = new SiaSun.LMS.Model.MANAGE_MAIN();

                mMANAGE_MAIN.MANAGE_STATUS = SiaSun.LMS.Enum.MANAGE_STATUS.Waiting.ToString();

                mMANAGE_MAIN.MANAGE_TYPE_CODE = SiaSun.LMS.Enum.MANAGE_TYPE.ManageDown.ToString();

                mMANAGE_MAIN.PLAN_ID = 0;

                mMANAGE_MAIN.PLAN_TYPE_CODE = string.Empty;

                mMANAGE_MAIN.CELL_MODEL = mSTORAGE_MAIN.CELL_MODEL;

                mMANAGE_MAIN.START_CELL_ID = START_CELL_ID;

                mMANAGE_MAIN.END_CELL_ID = END_CELL_ID;

                mMANAGE_MAIN.MANAGE_OPERATOR = Opertator;

                mMANAGE_MAIN.STOCK_BARCODE = mSTORAGE_MAIN.STOCK_BARCODE;

                mMANAGE_MAIN.FULL_FLAG = mSTORAGE_MAIN.FULL_FLAG;

                mMANAGE_MAIN.MANAGE_REMARK = mSTORAGE_MAIN.STORAGE_REMARK;

                #endregion

                #region MANAGE_LIST

                List<SiaSun.LMS.Model.MANAGE_LIST> lsMANAGE_LIST = new List<SiaSun.LMS.Model.MANAGE_LIST>();

                foreach (SiaSun.LMS.Model.STORAGE_LIST mSTORAGE_LIST in lsSTORAGE_LIST)
                {
                    SiaSun.LMS.Model.MANAGE_LIST mMANAGE_LIST = new Model.MANAGE_LIST();

                    mMANAGE_LIST.GOODS_ID = mSTORAGE_LIST.GOODS_ID;

                    mMANAGE_LIST.PLAN_LIST_ID = 0;

                    mMANAGE_LIST.STORAGE_LIST_ID = mSTORAGE_LIST.STORAGE_LIST_ID;

                    mMANAGE_LIST.MANAGE_LIST_QUANTITY = mSTORAGE_LIST.STORAGE_LIST_QUANTITY;

                    mMANAGE_LIST.MANAGE_LIST_REMARK = mSTORAGE_LIST.STORAGE_LIST_REMARK;

                    bResult = this._S_GoodsService.GoodsPropertySetValue(mSTORAGE_LIST.GOODS_ID, mMANAGE_LIST, mSTORAGE_LIST, out sResult);
                    if (!bResult)
                    {
                        return bResult;
                    }

                    lsMANAGE_LIST.Add(mMANAGE_LIST);
                }

                #endregion

                bResult = base.ManageCreate(mMANAGE_MAIN, lsMANAGE_LIST, bAutoSendControl, bTrans, out sResult);

                //直接报完成
                if ((!bAutoSendControl) && bResult)
                {
                    bResult = this.ManageComplete(mMANAGE_MAIN.MANAGE_ID, bTrans, out sResult);
                }

                #endregion
            }

            catch (Exception ex)
            {
                bResult = false;

                sResult = ex.Message;

                this._log.Fatal(string.Format("调用方法{0}发生异常。", MethodBase.GetCurrentMethod().Name), ex);
            }

            return bResult;
        }


        /// <summary>
        /// 生成【实盘下架任务】
        /// </summary>
        /// <param name="mMANAGE_MAIN"></param>
        /// <param name="lsMANAGE_LIST"></param>
        /// <param name="bTrans"></param>
        /// <param name="bAutoSendControl"></param>
        /// <param name="sResult"></param>
        /// <returns></returns>
        public new bool ManageCreate(SiaSun.LMS.Model.MANAGE_MAIN mMANAGE_MAIN,
                         List<SiaSun.LMS.Model.MANAGE_LIST> lsMANAGE_LIST,
                         bool bTrans,
                         bool bAutoSendControl,
                         out string sResult)
        {
            bool bResult = true;

            sResult = string.Empty;

            try
            {
                #region 校验

                #region 校验容器条码

                if (string.IsNullOrEmpty(mMANAGE_MAIN.STOCK_BARCODE))
                {
                    bResult = false;

                    sResult = string.Format("容器条码不能为空");

                    return bResult;
                }

                SiaSun.LMS.Model.MANAGE_MAIN mMANAGE_MAIN_OLD = this._P_MANAGE_MAIN.GetModelStockBarcode(mMANAGE_MAIN.STOCK_BARCODE);

                if (mMANAGE_MAIN_OLD != null)
                {
                    bResult = false;

                    sResult = string.Format("容器[{0}]已经存在任务[{1}]", mMANAGE_MAIN_OLD.STOCK_BARCODE, mMANAGE_MAIN_OLD.MANAGE_ID);

                    return bResult;
                }

                #endregion

                #region 校验库存

                Model.STORAGE_MAIN mSTORAGE_MAIN = this._P_STORAGE_MAIN.GetModelStockBarcode(mMANAGE_MAIN.STOCK_BARCODE);

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

                    sResult = string.Format("容器条码[{0}]不存在库存", mMANAGE_MAIN.STOCK_BARCODE);

                    return bResult;
                }

                IList<SiaSun.LMS.Model.STORAGE_LIST> lsSTORAGE_LIST = this._P_STORAGE_LIST.GetListStorageID(mSTORAGE_MAIN.STORAGE_ID);

                if (lsSTORAGE_LIST.Count == 0)
                {
                    bResult = false;

                    sResult = string.Format("容器条码[{0}]不存在库存", mMANAGE_MAIN.STOCK_BARCODE);

                    return bResult;
                }


                #endregion

                #region 起始位置

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

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

                    sResult = string.Format("起始位置索引[{0}]不存在", mSTORAGE_MAIN.CELL_ID);

                    return bResult;
                }

                if (!mSTART_WH_CELL.CELL_TYPE.Equals(SiaSun.LMS.Enum.CELL_TYPE.Cell.ToString()))
                {
                    bResult = false;

                    sResult = string.Format("起始位置[{0}]类型不合法", mSTART_WH_CELL.CELL_CODE);

                    return bResult;
                }

                SiaSun.LMS.Model.WH_AREA mSTART_WH_AREA = this._P_WH_AREA.GetModel(mSTART_WH_CELL.AREA_ID);

                if (mSTART_WH_AREA.AREA_TYPE == SiaSun.LMS.Enum.AREA_TYPE.XuNiKu.ToString())
                {
                    bResult = false;

                    sResult = string.Format("起始位置[{0}]库区类型[{1}]不合法", mSTART_WH_CELL.CELL_CODE, mSTART_WH_AREA.AREA_TYPE);

                    return bResult;
                }

                #endregion

                #region 终止位置

                if (mMANAGE_MAIN.END_CELL_ID != 0)
                {
                    #region 校验终止位置

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

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

                        sResult = string.Format(" 终止位置索引[{0}]不存在", mMANAGE_MAIN.END_CELL_ID);

                        return bResult;
                    }

                    if (!mEND_WH_CELL.CELL_TYPE.Equals(SiaSun.LMS.Enum.CELL_TYPE.Station.ToString()))
                    {
                        bResult = false;

                        sResult = string.Format(" 终止位置[{0}]类型不合法", mEND_WH_CELL.CELL_NAME);

                        return bResult;
                    }

                    if (mEND_WH_CELL.CELL_INOUT.ToString().Equals(SiaSun.LMS.Enum.CELL_INOUT.In.ToString()))
                    {
                        bResult = false;

                        sResult = string.Format(" 终止位置[{0}]入出类型[{1}]不合法", mEND_WH_CELL.CELL_NAME, mEND_WH_CELL.CELL_INOUT);

                        return bResult;
                    }

                    #endregion
                }
                else
                {
                    #region 根据起始位置,获得终止站台

                    int END_CELL_ID = 0;

                    bResult = this._S_CellService.GetOutStation(mMANAGE_MAIN.START_CELL_ID, out END_CELL_ID, out sResult);

                    if (!bResult)
                    {
                        return bResult;
                    }

                    mMANAGE_MAIN.END_CELL_ID = END_CELL_ID;

                    #endregion
                }

                #endregion

                #endregion

                #region 下达任务

                bResult = base.ManageCreate(mMANAGE_MAIN, lsMANAGE_LIST, bAutoSendControl, bTrans, out sResult);

                //直接报完成
                if ((!bAutoSendControl) && bResult)
                {
                    bResult = this.ManageComplete(mMANAGE_MAIN.MANAGE_ID, bTrans, out sResult);
                }

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

                sResult = ex.Message;

                this._log.Fatal(string.Format("调用方法{0}发生异常。", MethodBase.GetCurrentMethod().Name), ex);
            }

            return bResult;
        }




        /// <summary>完成
        /// 完成
        /// </summary>
        /// <param name="MANAGE_ID"></param>
        /// <param name="bTrans">是否独立事务</param>
        /// <param name="sResult"></param>
        /// <returns></returns>
        public new bool ManageComplete(int MANAGE_ID, bool bTrans, out string sResult)
        {
            bool bResult = true;

            sResult = string.Empty;

            try
            {
                this._P_Base_House.BeginTransaction(bTrans);

                #region 校验

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

                bResult = null != mMANAGE_MAIN;

                if (!bResult)
                {
                    sResult = string.Format("管理任务索引[{0}]不存在", MANAGE_ID.ToString());

                    return bResult;
                }

                SiaSun.LMS.Model.IO_CONTROL mIO_CONTROL = this._P_IO_CONTROL.GetModelManageID(MANAGE_ID);
                if ((null != mIO_CONTROL) && (!mIO_CONTROL.CONTROL_STATUS.Equals(999)))
                {
                    bResult = false;

                    sResult = string.Format("控制任务索引[{0}]的控制任务未完成", mIO_CONTROL.CONTROL_ID);

                    return bResult;
                }

                SiaSun.LMS.Model.WH_CELL mSTART_WH_CELL = this._P_WH_CELL.GetModel(mMANAGE_MAIN.START_CELL_ID);
                if (null == mSTART_WH_CELL)
                {
                    bResult = false;

                    sResult = string.Format("起始位置索引[{0}]不存在", mMANAGE_MAIN.START_CELL_ID);

                    return bResult;
                }

                SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(mMANAGE_MAIN.END_CELL_ID);
                if (null == mEND_WH_CELL)
                {
                    bResult = false;

                    sResult = string.Format("终止位置索引[{0}]不存在", mMANAGE_MAIN.END_CELL_ID);

                    return bResult;
                }

                #endregion

                #region 更新库存-立库移至暂存区

                bResult = this._S_StorageService.StorageMove(MANAGE_ID, out sResult);
                if (!bResult)
                {
                    return bResult;
                }

                #endregion

                #region 更新货位状态

                if (!this._P_WH_AREA.GetModel(mSTART_WH_CELL.AREA_ID).AREA_TYPE.Equals(SiaSun.LMS.Enum.AREA_TYPE.XuNiKu.ToString()))
                {
                    string CELL_STATUS = SiaSun.LMS.Enum.CELL_STATUS.Nohave.ToString();

                    bResult = this._S_CellService.CellUpdateStatus(mMANAGE_MAIN.START_CELL_ID, CELL_STATUS, SiaSun.LMS.Enum.RUN_STATUS.Enable.ToString(), out sResult);
                    if (!bResult)
                    {
                        return bResult;
                    }
                }

                if (!this._P_WH_AREA.GetModel(mEND_WH_CELL.AREA_ID).AREA_TYPE.Equals(SiaSun.LMS.Enum.AREA_TYPE.XuNiKu.ToString()))
                {
                    //string CELL_STATUS = mMANAGE_MAIN.FULL_FLAG == "1" ? SiaSun.LMS.Enum.CELL_STATUS.Full.ToString() : SiaSun.LMS.Enum.CELL_STATUS.Have.ToString();
                     string CELL_STATUS = SiaSun.LMS.Enum.CELL_STATUS.Full.ToString();
                    bResult = this._S_CellService.CellUpdateStatus(mMANAGE_MAIN.END_CELL_ID, CELL_STATUS, SiaSun.LMS.Enum.RUN_STATUS.Enable.ToString(), out sResult);
                    if (!bResult)
                    {
                        return bResult;
                    }
                }

                #endregion

                #region 调用基类-更新管理任务;更新计划;生成入出库记录

                bResult = this._S_ManageService.ManageComplete(MANAGE_ID, false, out sResult);

                if (!bResult)
                {
                    return bResult;
                }

                #endregion

                #region 删除任务信息

                this._P_IO_CONTROL.DeleteManageID(mMANAGE_MAIN.MANAGE_ID);

                this._P_MANAGE_DETAIL.DeleteManageID(mMANAGE_MAIN.MANAGE_ID);

                this._P_MANAGE_LIST.DeleteManageID(mMANAGE_MAIN.MANAGE_ID);

                this._P_MANAGE_MAIN.Delete(mMANAGE_MAIN.MANAGE_ID);

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

                sResult = ex.Message;

                this._log.Fatal(string.Format("调用方法{0}发生异常。", MethodBase.GetCurrentMethod().Name), ex);
            }
            finally
            {
                if (bResult)
                {
                    this._P_Base_House.CommitTransaction(bTrans);
                }
                else
                {
                    this._P_Base_House.RollBackTransaction(bTrans);
                }
            }

            return bResult;
        }


    }
}