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

namespace SiaSun.LMS.Implement
{
    public class PlanBase:S_BaseService
    {
        public PlanBase()
        {
        }

        /// <summary>
        ///  计划创建 
        /// </summary>
        /// <param name="mPLAN_MAIN">计划模型</param>
        /// <param name="lsPLAN_LIST">计划列表</param>
        /// <param name="sResult">返回结果</param>
        /// <returns></returns>
        public bool PlanCreate(SiaSun.LMS.Model.PLAN_MAIN mPLAN_MAIN,
                               DataTable dtPLAN_LIST,
                               out int PLAN_ID,
                               out string sResult)
        {
            bool bResult = true;

            sResult = string.Empty;

            PLAN_ID = 0;

            try
            {
                this._P_Base_House.BeginTransaction();

                if (null != this._P_PLAN_MAIN.GetModel(mPLAN_MAIN.PLAN_ID))
                {
                    if (mPLAN_MAIN.PLAN_STATUS.Equals(SiaSun.LMS.Enum.PLAN_STATUS.Complete.ToString()))
                    {
                        bResult = false;

                        sResult = string.Format("{0}单号已经完成 不能编辑!", mPLAN_MAIN.PLAN_CODE);

                        this._P_Base_House.RollBackTransaction();

                        return bResult;
                    }

                    this._P_PLAN_MAIN.Update(mPLAN_MAIN);
                }
                else
                {
                    if (null != this._P_PLAN_MAIN.GetModelPlanCode(mPLAN_MAIN.PLAN_CODE))
                    {
                        bResult = false;

                        sResult = string.Format("{0}单号已经存在!", mPLAN_MAIN.PLAN_CODE);

                        this._P_Base_House.RollBackTransaction();

                        return bResult;
                    }

                    this._P_PLAN_MAIN.Add(mPLAN_MAIN);
                }


                    foreach (DataRow drPLAN_LIST in dtPLAN_LIST.Rows)
                    {

                        if (drPLAN_LIST.RowState != DataRowState.Deleted)
                        {
                            drPLAN_LIST["PLAN_ID"] = mPLAN_MAIN.PLAN_ID;
                        }
                    }

                    this.Save(dtPLAN_LIST, "PLAN_LIST");


                this._P_Base_House.CommitTransaction();
            }
            catch (Exception ex)
            {
                bResult = false;

                sResult = ex.Message;

                this._P_Base_House.RollBackTransaction();
            }

            PLAN_ID = mPLAN_MAIN.PLAN_ID;

            return bResult;
        }

        /// <summary>创建
        /// 创建
        /// </summary>
        /// <param name="mPLAN_MAIN">计划模型</param>
        /// <param name="lsPLAN_LIST">计划列表</param>
        /// <param name="sResult">返回结果</param>
        /// <returns></returns>
        public bool PlanCreate(SiaSun.LMS.Model.PLAN_MAIN mPLAN_MAIN,
                               IList<SiaSun.LMS.Model.PLAN_LIST> lsPLAN_LIST,
                               out int PLAN_ID,
                               out string sResult)
        {
            bool bResult = true;

            sResult = string.Empty;

            PLAN_ID = 0;

            try
            {
                this._P_Base_House.BeginTransaction();

                if (null != this._P_PLAN_MAIN.GetModel(mPLAN_MAIN.PLAN_ID))
                {
                    if (mPLAN_MAIN.PLAN_STATUS.Equals(SiaSun.LMS.Enum.PLAN_STATUS.Complete.ToString()))
                    {
                        bResult = false;

                        sResult = string.Format("{0}单号已经完成 不能编辑!", mPLAN_MAIN.PLAN_CODE);

                        return bResult;
                    }

                    this._P_PLAN_MAIN.Update(mPLAN_MAIN);
                }
                else
                {
                    if (null != this._P_PLAN_MAIN.GetModelPlanCode(mPLAN_MAIN.PLAN_CODE))
                    {
                        bResult = false;

                        sResult = string.Format("{0}单号已经存在!", mPLAN_MAIN.PLAN_CODE);

                        return bResult;
                    }

                    this._P_PLAN_MAIN.Add(mPLAN_MAIN);
                }

                foreach (SiaSun.LMS.Model.PLAN_LIST mPLAN_LIST in lsPLAN_LIST)
                {
                    bResult = this._S_GoodsService.GoodsPropertyCheck(mPLAN_LIST.GOODS_ID, mPLAN_LIST, out sResult);

                    if (!bResult)
                    {
                        sResult = string.Format("属性校验错误: {0}", sResult);

                        return bResult;
                    }

                    if (mPLAN_LIST.PLAN_ID.Equals(0))
                    {
                        mPLAN_LIST.PLAN_ID = mPLAN_MAIN.PLAN_ID;
                        this._P_PLAN_LIST.Add(mPLAN_LIST);
                    }
                    else
                    {
                        this._P_PLAN_LIST.Update(mPLAN_LIST);
                    }
                }

            }
            catch (Exception ex)
            {
                bResult = false;

                sResult = ex.Message;

                this._P_Base_House.RollBackTransaction();
            }
            finally
            {
                if (bResult)
                {
                    this._P_Base_House.CommitTransaction();
                }
                else
                {
                    this._P_Base_House.RollBackTransaction();
                }
            }

            PLAN_ID = mPLAN_MAIN.PLAN_ID;

            return bResult;
        }


        public bool PlanImport(SiaSun.LMS.Model.PLAN_MAIN mPLAN_MAIN,
                              IList<SiaSun.LMS.Model.PLAN_LIST> lsPLAN_LIST,
                              out int PLAN_ID,
                              out string sResult)
        {
            bool bResult = true;

            sResult = string.Empty;

            PLAN_ID = 0;

            //try
            //{
            //    this._P_Base_House.BeginTransaction();

            //    if (null != this._P_PLAN_MAIN.GetModel(mPLAN_MAIN.PLAN_ID))
            //    {
            //        if (mPLAN_MAIN.PLAN_STATUS.Equals(SiaSun.LMS.Enum.PLAN_STATUS.Complete.ToString()))
            //        {
            //            bResult = false;

            //            sResult = string.Format("{0}单号已经完成 不能编辑!", mPLAN_MAIN.PLAN_CODE);

            //            return bResult;
            //        }

            //        this._P_PLAN_MAIN.Update(mPLAN_MAIN);
            //    }
            //    else
            //    {
            //        if (null != this._P_PLAN_MAIN.GetModel(mPLAN_MAIN.PLAN_CODE))
            //        {
            //            bResult = false;

            //            sResult = string.Format("{0}单号已经存在!", mPLAN_MAIN.PLAN_CODE);

            //            return bResult;
            //        }

            //        this._P_PLAN_MAIN.Add(mPLAN_MAIN);

            //        mPLAN_RELATE.PLAN_ID = mPLAN_MAIN.PLAN_ID;

            //        this._P_PLAN_RELATE.Add(mPLAN_RELATE);
            //    }

            //    foreach (SiaSun.LMS.Model.PLAN_LIST mPLAN_LIST in lsPLAN_LIST)
            //    {
            //        bResult = this._S_Goods.GoodsPropertyCheck(mPLAN_LIST.GOODS_ID, mPLAN_LIST, out sResult);

            //        if (!bResult)
            //        {
            //            sResult = string.Format("属性校验错误: {0}", sResult);

            //            return bResult;
            //        }

            //        if (mPLAN_LIST.PLAN_ID.Equals(0))
            //        {
            //            mPLAN_LIST.PLAN_ID = mPLAN_MAIN.PLAN_ID;
            //            this._P_PLAN_LIST.Add(mPLAN_LIST);
            //        }
            //        else
            //        {
            //            this._P_PLAN_LIST.Update(mPLAN_LIST);
            //        }
            //    }

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

            //    sResult = ex.Message;
            //}
            //finally
            //{
            //    if (bResult)
            //    {
            //        this._P_Base_House.CommitTransaction();
            //    }
            //    else
            //    {
            //        this._P_Base_House.RollBackTransaction();
            //    }
            //}

            //PLAN_ID = mPLAN_MAIN.PLAN_ID;

            return bResult;
        }


        /// <summary>取消
        /// 取消
        /// </summary>
        /// <param name="PLAN_ID">计划编号</param>
        /// <param name="sResult">返回结果</param>
        /// <returns></returns>
        public bool PlanCancel(int PLAN_ID,
                               out string sResult)
        {
            bool bResult = true;

            sResult = string.Empty;

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

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

                    sResult = string.Format("未找到计划{0}", PLAN_ID.ToString());

                    return bResult;
                }

                IList<SiaSun.LMS.Model.MANAGE_MAIN> lsMANAGE_MAIN = this._P_MANAGE_MAIN.GetListPlanID(PLAN_ID);

                if (lsMANAGE_MAIN.Count > 0)
                {
                    bResult = false;

                    sResult = string.Format("此计划存在任务。不能删除");

                    return bResult;
                }

                IList<SiaSun.LMS.Model.RECORD_MAIN> lsRECORD_MAIN = this._P_RECORD_MAIN.GetListPlanCode(mPLAN_MAIN.PLAN_CODE);

                if (lsRECORD_MAIN.Count > 0)
                {
                    bResult = false;

                    sResult = string.Format("此计划已经存在出入库记录。不能删除");

                    return bResult;
                }


                this._P_Base_House.BeginTransaction();

                this._P_PLAN_LIST.DeletePlanID(PLAN_ID);

                this._P_PLAN_MAIN.Delete(PLAN_ID);

                this._P_Base_House.CommitTransaction();
            }
            catch (Exception ex)
            {
                bResult = false;

                sResult = ex.Message;

                this._P_Base_House.RollBackTransaction();
            }

            return bResult;
        }

        /// <summary>检验计划是否可以完成
        /// 检验计划是否可以完成
        /// </summary>
        /// <param name="PLAN_ID">计划编号</param>
        /// <param name="sResult">返回结果</param>
        /// <returns></returns>
        public bool PlanCheckComplete(int PLAN_ID, 
                                      out string sResult)
        {
            bool bResult = true;

            sResult = string.Empty;

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

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

                sResult = string.Format("未找到计划{0}", PLAN_ID.ToString());

                return bResult;
            }

            IList<SiaSun.LMS.Model.PLAN_LIST> lsPLAN_LIST = this._P_PLAN_LIST.GetListNoComplete(PLAN_ID);


            if (lsPLAN_LIST.Count <= 0)
            {
                bResult = false;

                return bResult;
            }


            return bResult;
        }

        /// <summary>完成
        /// 完成
        /// </summary>
        /// <param name="PLAN_ID">计划编号</param>
        /// <param name="sResult">返回结果</param>
        /// <returns></returns>
        public bool PlanComplete(int PLAN_ID, 
                                 out string sResult)
        {
            return this.PlanComplete(PLAN_ID, true, out sResult);
        }

        /// <summary>完成-支持事务
        /// 完成-支持事务
        /// </summary>
        /// <param name="PLAN_ID">计划编号</param>
        /// <param name="sResult">返回结果</param>
        /// <returns></returns>
        public bool PlanComplete(int PLAN_ID, 
                                 bool bTrans, 
                                 out string sResult)
        {
            bool bResult = true;

            sResult = string.Empty;

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

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

                sResult = string.Format("未找到计划{0}", PLAN_ID.ToString());

                return bResult;
            }

            try
            {
                this._P_Base_House.BeginTransaction(bTrans);

                mPLAN_MAIN.PLAN_END_TIME = SiaSun.LMS.Common.StringUtil.GetDateTime();

                mPLAN_MAIN.PLAN_STATUS = SiaSun.LMS.Enum.PLAN_STATUS.Complete.ToString();

                this._P_PLAN_MAIN.Update(mPLAN_MAIN);

            }
            catch (Exception ex)
            {
                bResult = false;

                sResult = ex.Message;
            }
            finally
            {
                if (bResult)
                {
                    this._P_Base_House.CommitTransaction(bTrans);
                }
                else
                {
                    this._P_Base_House.RollBackTransaction(bTrans);
                }
            }

            return bResult;
        }

        /// <summary>
        /// 计划执行
        /// </summary>
        /// <param name="PLAN_ID">计划编号</param>
        /// <param name="sResult">返回结果</param>
        /// <returns></returns>
        public bool PlanExecute(int PLAN_ID,
                                out string sResult)
        {
            bool bResult = true;

            sResult = string.Empty;

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

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

                sResult = string.Format("未找到计划{0}", PLAN_ID);

                return bResult;
            }
            try
            {
                this._P_Base_House.BeginTransaction();

                if( string.IsNullOrEmpty(mPLAN_MAIN.PLAN_BEGIN_TIME))
                    mPLAN_MAIN.PLAN_BEGIN_TIME = SiaSun.LMS.Common.StringUtil.GetDateTime();

                mPLAN_MAIN.PLAN_STATUS = SiaSun.LMS.Enum.PLAN_STATUS.Executing.ToString();

                this._P_PLAN_MAIN.Update(mPLAN_MAIN);


                this._P_Base_House.CommitTransaction();
            }
            catch (Exception ex)
            {
                bResult = false;

                sResult = ex.Message;

                this._P_Base_House.RollBackTransaction();
            }

            return bResult;
        }

        /// <summary>计划执行默认动作
        /// 计划执行默认动作
        /// </summary>
        /// <param name="PLAN_ID">计划编号</param>
        /// <param name="sResult">返回结果</param>
        /// <returns></returns>
        public bool PlanExcuteDefault(int PLAN_ID, out string sResult)
        {
            bool bResult = true;

            sResult = string.Empty;

            string ACTION_EVENT = string.Empty;

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

            DataTable dtPlan = this.GetList(string.Format("SELECT * FROM V_PLAN WHERE PLAN_ID = {0}", PLAN_ID));

            DataTable dtACTION = this._S_FlowService.PlanGetAction(PLAN_ID.ToString(), "1");

            if (dtACTION.Rows.Count.Equals(0))
            {
                return bResult;
            }

            foreach (DataRow drPlan in dtPlan.Rows)
            {
                foreach (DataRow drACTION in dtACTION.Rows)
                {
                    IList<SiaSun.LMS.Model.FLOW_PARA> lsFLOW_PARA = this._S_FlowService.FlowGetParameters("FLOW_PLAN");

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

                    int i = 0;

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

                        i++;
                    }

                    SiaSun.LMS.Model.PLAN_ACTION_EXCUTE mPLAN_ACTION_EXCUTE = new SiaSun.LMS.Model.PLAN_ACTION_EXCUTE();

                    mPLAN_ACTION_EXCUTE.PLAN_ID = Convert.ToInt32(drPlan["PLAN_ID"]);

                    mPLAN_ACTION_EXCUTE.ACTION_EVENT = string.Format(drACTION["FLOW_ACTION_EVENT"].ToString(), aFLOW_PARA);

                    bResult = this._S_FlowService.EventExecute(mPLAN_ACTION_EXCUTE.ACTION_EVENT, out sResult);
                }
            }

            if (bResult)
            {
                mPLAN_MAIN.PLAN_BEGIN_TIME = SiaSun.LMS.Common.StringUtil.GetDateTime();

                bResult = this.PlanExcuteDefault(PLAN_ID, out sResult);
            }

            return bResult;
        }

        /// <summary>
        /// 计划暂停
        /// </summary>
        /// <param name="PLAN_ID">计划编号</param>
        /// <param name="sResult">返回结果</param>
        /// <returns></returns>
        public bool PlanPause(int PLAN_ID, out string sResult)
        {
            bool bResult = true;

            sResult = string.Empty;

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

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

                sResult = string.Format("未找到计划{0}", PLAN_ID);

                return bResult;
            }

            try
            {
                this._P_Base_House.BeginTransaction();

                mPLAN_MAIN.PLAN_STATUS = SiaSun.LMS.Enum.PLAN_STATUS.Waiting.ToString();

                this._P_PLAN_MAIN.Update(mPLAN_MAIN);

                this._P_Base_House.CommitTransaction();
            }
            catch (Exception ex)
            {
                bResult = false;

                sResult = ex.Message;

                this._P_Base_House.RollBackTransaction();
            }

            return bResult;
        }

       
    }
}