using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QMFrameWork.Data;
using QMAPP.FJC.Entity.Stocktaking;
using QMAPP.FJC.DAL.Stocktaking;
using QMAPP.FJC.BLL.Dict;
using QMAPP.BLL;
using QMAPP.Entity;
using System.Data;
using QMAPP.FJC.Web.Models.Stocktaking;
using QMAPP.FJC.Entity;
using QMFrameWork.Log;
using QMAPP.FJC.Entity.Operation;
using QMAPP.FJC.DAL.Operation;
using QMAPP.MD.DAL;
using QMAPP.FJC.DAL.ProduceManage;
using QMAPP.FJC.BLL.Operation;
using QMAPP.FJC.Entity.ProductIn;
using System.Threading.Tasks;

namespace QMAPP.FJC.BLL.Stocktaking
{
    /// <summary>
    /// 模块编号:M14-1
    /// 作    用:库存盘点
    /// 作    者:崔法宝
    /// 编写日期:2015年06月04日
    ///</summary>
    public class StocktakingBLL : BaseBLL
    {


        #region 获取列表
        /// <summary>
        /// 获取列表
        /// </summary>
        /// <param name="condition">条件</param>
        /// <param name="page">数据页</param>
        /// <returns>数据页</returns>
        public DataResult<DataPage> GetList(Countingplaninfo condition, DataPage page)
        {
            DataResult<DataPage> result = new DataResult<DataPage>();
            try
            {
                result.IsSuccess = true;
                page = new StocktakingDAL().GetList(condition, page);
                List<Countingplaninfo> list = page.Result as List<Countingplaninfo>;
                //处理字典信息
                DictManageBLL dictPLANSTATE = new DictManageBLL(DictKind.STOCK_PLAN_STATE);
                DictManageBLL dictCOUNTTYPE = new DictManageBLL(DictKind.COUNTTYPE);
                foreach (var info in list)
                {
                    info.COUNTTYPE = dictCOUNTTYPE.GetDictValue(info.COUNTTYPE);
                    info.PLAN_STATE = dictPLANSTATE.GetDictValue(info.PLAN_STATE);
                }
                result.Result = page;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return result;
        }


        /// <summary>
        /// 获取列表(同时手持也用此方法)
        /// </summary>
        /// <param name="condition">条件</param>
        /// <returns>全部集合</returns>
        public List<Countingplaninfo> GetAllList(Countingplaninfo condition)
        {
            try
            {
                //获取物料信息列表
                List<Countingplaninfo> list = new StocktakingDAL().GetAllList(condition);
                return list;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion

        #region 获取设备信息,填充Grid
        /// <summary>
        /// 获取设备信息,填充Grid
        /// </summary>
        /// <param name="condition"></param>
        /// <returns></returns>
        public List<QMAPP.MD.Entity.Material> GetMachineInfo(QMAPP.MD.Entity.Material condition)
        {
            QMAPP.MD.Entity.Material material = new QMAPP.MD.Entity.Material();
            List<QMAPP.MD.Entity.Material> materialList = new List<MD.Entity.Material>();
            //根据设备iD获取本体信息
            material.PID = condition.PID;
            material.MaterialCodes = condition.MaterialCodes;
            try
            {
                 materialList = new MaterialDAL().GetMaterialInfoList(material);

                //foreach (QMAPP.MD.Entity.Material m in materialList)
                //{
                //    material.MATERIAL_CODE = m.MATERIAL_CODE;
                //    material.MATERIAL_TYPE_CODE = m.MATERIAL_TYPE_CODE;
                //    material.CreateDate = (DateTime.Now.ToString("yyyy-MM-dd"));
                //}
                 for (var i = 0; i < materialList.Count(); i++)
                 {
                     materialList[i].CreateDate = (DateTime.Now.ToString("yyyy-MM-dd"));
                 }
            }
            catch (Exception ex)
            {
                LogManager.LogHelper.Error(new LogInfo()
                {
                    ErrorInfo = ex,
                    Tag = ex.StackTrace,
                    Info = "逻辑层-获取本体信息!"
                });
                throw ex;
            }
            return materialList;
        }
        #endregion

        #region 插入信息(T_PP_COUNTINGPLAN)
        /// <summary>
        /// 插入信息(T_PP_COUNTINGPLAN)
        /// </summary>
        /// <param name="">信息</param>
        /// <returns>插入行数</returns>
        public int Insert(Countingplaninfo model)
        {
            model.PLAN_STATE = "0";
            model.REGISTNUMBER = 0;
            model.ACTUALNUMBER = 0;
            model.CREATEUSER = this.LoginUser.UserID;
            model.CREATEDATE = DateTime.Now;
            model.UPDATEUSER = model.CREATEUSER;
            model.UPDATEDATE = model.CREATEDATE;
            try
            {
                int result = new StocktakingDAL().Insert(model);

                return result;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region 插入信息 T_PP_COUNTINGDETAIL表
        /// <summary>
        /// 插入信息
        /// </summary>
        /// <param name="">信息</param>
        /// <returns>插入行数</returns>
        public DataResult<int> InsertStocktakingDeail(Countingplaninfo model, List<QMAPP.MD.Entity.Material> materiallist)
        {
            List<CountingdetailInfo> List = new List<CountingdetailInfo>();
            DataResult<int> result = new DataResult<int>();
            StocktakingDAL cmdDAL = new StocktakingDAL();
            cmdDAL.BaseSession = AppDataFactory.CreateMainSession();

            foreach (QMAPP.MD.Entity.Material ma in materiallist)
            {
                CountingdetailInfo detailmodel = new CountingdetailInfo();

                detailmodel.PID = Guid.NewGuid().ToString();
                detailmodel.PLANID = model.PID;
                detailmodel.MATERIAL_CODE = ma.MATERIAL_CODE;
                detailmodel.MATERIAL_TYPE_CODE = ma.MATERIAL_TYPE_CODE;
                detailmodel.CREATEUSER = this.LoginUser.UserID;
                detailmodel.CREATEDATE = DateTime.Now;
                detailmodel.UPDATEUSER = detailmodel.CREATEUSER;
                detailmodel.UPDATEDATE = detailmodel.CREATEDATE;

                List.Add(detailmodel);
            }
            try
            {
                //if (ExistsMateriel(model))
                //{
                //    result.IsSuccess = false;
                //    result.Msg = Resource.MaterielCodeIsHave;
                //    return result;
                //}
                if(model.EDITFLAG==null)
                {
                   result.Result = cmdDAL.InsertStocktakingPlan(List);
                }else
                {
                    
                }
            }
            catch (Exception ex)
            {
                LogManager.LogHelper.Error(new LogInfo()
                {
                    ErrorInfo = ex,
                    Tag = ex.StackTrace,
                    Info = "逻辑矩阵逻辑层-插入信息!"
                });
                result.IsSuccess = false;
                result.Msg = Resource.SystemException;
                throw ex;
            }
            result.IsSuccess = true;
            return result;
        }
        #endregion

        #region 修改更新信息(单表(T_PP_COUNTINGPLAN))
        /// <summary>
        /// 修改信息(单表)
        /// </summary>
        /// <param name="">信息</param>
        /// <returns>修改行数</returns>
        public DataResult<int> Update(Countingplaninfo model)
        {
            object count = null;
            DataResult<int> result = new DataResult<int>();
            try
            {
                using (IDataSession session = AppDataFactory.CreateMainSession())
                {
                    count = new StocktakingDAL().Update(model);
                    result.Result = Convert.ToInt32(count);
                    result.IsSuccess = true;
                    return result;
                }
            }
            catch (Exception ex)
            {
                result.IsSuccess = false;
                throw ex;
            }
        }
        #endregion

        #region 获取信息
        /// <summary>
        /// 获取信息
        /// </summary>
        /// <param name="">条件</param>
        /// <returns>信息</returns>
        public DataResult<Countingplaninfo> Get(Countingplaninfo model)
        {
            DataResult<Countingplaninfo> result = new DataResult<Countingplaninfo>();
            try
            {
                result.Result = new StocktakingDAL().Get(model);
            }
            catch (Exception ex)
            {
                result.IsSuccess = false;
                result.Msg = Resource.SystemException;
                throw ex;
            }
            result.IsSuccess = true;
            return result;
        }
        #endregion

        #region 获取列表
        /// <summary>
        /// 获取列表
        /// </summary>
        /// <param name="condition">条件</param>
        /// <param name="page">数据页</param>
        /// <returns>数据页</returns>
        public DataResult<DataPage> GetMaterialGridList(CountingdetailInfo condition, DataPage page)
        {

            DataResult<DataPage> result = new DataResult<DataPage>();
            try
            {
                //获取信息列表
                DataPage dataPage = new StocktakingDAL().GetMaterialGridList(condition, page);

                result.Result = dataPage;
            }
            catch (Exception ex)
            {
                LogManager.LogHelper.Error(new LogInfo()
                {
                    ErrorInfo = ex,
                    Tag = ex.StackTrace,
                    Info = "设备信息逻辑层-获取列表!"
                });
                result.IsSuccess = false;
                result.Msg = Resource.SystemException;
                throw ex;
            }
            result.IsSuccess = true;
            return result;
        }
        #endregion

        #region 编辑时删除
        /// <summary>
        /// 编辑时删除
        /// </summary>
        /// <param name=""></param>
        /// <returns>删除个数</returns>
        public DataResult<int> EditDelete(CountingdetailInfo model)
        {
            DataResult<int> result = new DataResult<int>();
            if (string.IsNullOrEmpty(model.EDITFLAG))
            {
                string[] list = model.MaterialCodes.Split(";".ToCharArray());
                try
                {
                    foreach (string str in list)
                    {
                        result.Result += this.EditDeleteUserWithMachine(new CountingdetailInfo { MATERIAL_CODE = str, PLANID = model.PLANID });
                    }
                }
                catch (Exception ex)
                {
                    result.IsSuccess = false;
                    result.Msg = Resource.SystemException;
                    throw ex;
                }
            }
            else
            {
                try
                {
                    result.Result += this.EditDeleteUserWithMachine(new CountingdetailInfo { PLANID = model.PLANID });
                }
                catch (Exception ex)
                {
                    result.IsSuccess = false;
                    result.Msg = Resource.SystemException;
                    throw ex;
                }
            }
            result.IsSuccess = true;
            return result;
        }

        /// <summary>
        /// 删除信息
        /// </summary>
        /// <param name="">信息</param>
        /// <returns>删除个数</returns>
        public int EditDeleteUserWithMachine(CountingdetailInfo model)
        {
            int count = 0;
            try
            {
                count = new StocktakingDAL().EditDeleteUserWithMachine(model);
                return count;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region 编辑时保存
        /// <summary>
        /// 编辑时保存
        /// </summary>
        /// <param name=""></param>
        /// <returns></returns>
        public DataResult<int> EditInsertStocktakingDeail(Countingplaninfo model, List<QMAPP.MD.Entity.Material> materiallist)
        {
            int count = 0;
            StocktakingDAL cmdDAL = new StocktakingDAL();
            cmdDAL.BaseSession = AppDataFactory.CreateMainSession();
            DataResult<int> result = new DataResult<int>();
            try
            {
                //存在的物料信息(更新)
                List<CountingdetailInfo> updateCountingdetail = new List<CountingdetailInfo>();
                //新加的物料信息(增加)
                List<CountingdetailInfo> addCountingdetail = new List<CountingdetailInfo>();

                foreach (QMAPP.MD.Entity.Material ma in materiallist)
                {
                    count = cmdDAL.GetDetailInfo(new CountingdetailInfo() { PLANID = model.PID, MATERIAL_CODE = ma.MATERIAL_CODE });
                    CountingdetailInfo detailInfo = new CountingdetailInfo();

                    //如果T_PP_COUNTINGDETAIL表存在数据,则更新
                    if (count != 0)
                    {
                        detailInfo.PLANID = model.PID;
                        detailInfo.MATERIAL_CODE = ma.MATERIAL_CODE;

                        updateCountingdetail.Add(detailInfo);
                    }
                    else
                    {
                        detailInfo.PID = Guid.NewGuid().ToString();
                        detailInfo.PLANID = model.PID;
                        detailInfo.MATERIAL_CODE = ma.MATERIAL_CODE;
                        detailInfo.MATERIAL_TYPE_CODE = ma.MATERIAL_TYPE_CODE;
                        detailInfo.CREATEUSER = this.LoginUser.UserID;
                        detailInfo.CREATEDATE = DateTime.Now;
                        detailInfo.UPDATEUSER = detailInfo.CREATEUSER;
                        detailInfo.UPDATEDATE = detailInfo.CREATEDATE;

                        addCountingdetail.Add(detailInfo);
                    }

                    //插入
                    if (addCountingdetail.Count > 0)
                    {
                        result.Result = cmdDAL.InsertStocktakingPlan(addCountingdetail);
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            result.Result = count;
            result.Msg = "成功!";
            result.IsSuccess = true;
            return result;
        }
        #endregion

        #region 删除父表数据根据ID T_PP_COUNTINGPLAN
        /// <summary>
        /// 删除父表数据根据ID
        /// </summary>
        /// <param name="">信息</param>
        /// <returns>插入行数</returns>
        public DataResult<int> Delete(string PID)
        {
            object count = null;
            DataResult<int> result = new DataResult<int>();
            try
            {


                using (IDataSession session = AppDataFactory.CreateMainSession())
                {
                    count = new StocktakingDAL().Delete(PID);
                    result.Result = Convert.ToInt32(count);
                    result.IsSuccess = true;
                    return result;
                }
            }
            catch (Exception ex)
            {
                result.IsSuccess = false;
                throw ex;
            }
        }
        #endregion

        #region 删除子表的数据根据PLANID T_PP_COUNTINGDETAIL
        /// <summary>
        /// 删除子表的数据根据PLANID
        /// </summary>
        /// <param name="">信息</param>
        /// <returns>插入行数</returns>
        public DataResult<int> SubDelete(string PLANID)
        {
            object count = null;
            DataResult<int> result = new DataResult<int>();
            try
            {
                using (IDataSession session = AppDataFactory.CreateMainSession())
                {
                    count = new StocktakingDAL().SubDelete(PLANID);
                    result.Result = Convert.ToInt32(count);
                    result.IsSuccess = true;
                    return result;
                }
            }
            catch (Exception ex)
            {
                result.IsSuccess = false;
                throw ex;
            }
        }
        #endregion

        #region 获取每日最新的计划单号
        /// <summary>
        /// 获取每日最新的计划单号
        /// </summary>
        /// <param name="">信息</param>
        /// <returns>计划单号</returns>
        public object GetPlanNoByDate(string NowDate)
        {
            try
            {
                return new StocktakingDAL().GetPlanNoByDate(NowDate);
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }
        #endregion

        #region 获取盘点明细查询
        /// <summary>
        ///  获取盘点明细查询
        /// </summary>
        /// <param name="condition">条件</param>
        /// <param name="page">数据页</param>
        /// <returns>数据页</returns>
        public DataResult<DataPage> GetPanDetail(string PID, DataPage page)
        {
            DataResult<DataPage> result = new DataResult<DataPage>();
            try
            {
                result.IsSuccess = true;
                page = new StocktakingDAL().GetPanDetail(PID, page);
                List<CountSheetInfo> list = page.Result as List<CountSheetInfo>;
                result.Result = page;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return result;
        }
        #endregion

        #region 盘点比对
        /// <summary>
        /// 盘点比对
        /// </summary>
        /// <param name="PID"></param>
        /// <returns></returns>
        public DataResult<int> detailCompareResult(string PID, string CREATEUSER)
        {
            StocktakingDAL dal = new StocktakingDAL();
            DataResult<int> result = new DataResult<int>();

            try
            {
                Countingplaninfo plan = dal.Get(new Countingplaninfo() { PID = PID });

                //获取手持终端的盘点信息
                List<CountResultInfo> sheetList = dal.GetCountSheetInfoList(new CountSheetInfo() { PLANID = PID });
                List<string> sheetStrList = sheetList.Select(o => o.PRODUCTCODE).ToList<string>();


                if (sheetList.Count == 0)
                {
                    result.IsSuccess = false;
                    result.Msg = "未盘点实物,不能进行对比!";
                    return result;
                }

                List<CountResultInfo> resultList = new List<CountResultInfo>();

                //按条码进行盘点
                if (plan.COUNTTYPE == EnumGeter.COUNTTYPE.CHECKBYCODE.GetHashCode().ToString())
                {
                    //获取符合条件的产品信息
                    List<CountResultInfo> proListIn = dal.GetListIn(new Countingplaninfo() { PID = sheetList[0].PLANID });
                    List<string> proStrListIn = proListIn.Select(o => o.PRODUCTCODE).ToList<string>();

                    plan.ACTUALNUMBER = sheetList.Count;
                    plan.REGISTNUMBER = proListIn.Count;
                    plan.PLAN_STATE = "1";

                    //系统有,实物没有,实物亏

                    List<string> strList1 = proStrListIn.Except(sheetStrList).ToList<string>();
                    List<CountResultInfo> list1 = proListIn.Where(o => strList1.Contains(o.PRODUCTCODE)).ToList<CountResultInfo>();

                    //实物有,系统没有,实物赢

                    List<string> strList2 = sheetStrList.Except(proStrListIn).ToList<string>();
                    List<CountResultInfo> list2 = sheetList.Where(o => strList2.Contains(o.PRODUCTCODE)).ToList<CountResultInfo>();

                    //要修改的产品信息
                    List<Product> proList = new List<Product>();
                    //入库数据
                    List<QMAPP.FJC.Entity.ProductIn.ProductIn> proInList = new List<QMAPP.FJC.Entity.ProductIn.ProductIn>();
                    //出库库数据
                    List<ProductOut> proOutList = new List<ProductOut>();

                    foreach (var cr in list1)
                    {
                        cr.PID = Guid.NewGuid().ToString();
                        cr.COMPARERESULT = EnumGeter.COMPARERESULT.LOSS.GetHashCode().ToString();
                        cr.CREATEUSER = this.LoginUser.UserID.ToString();
                        cr.CREATEDATE = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    }

                    foreach (var cr in list2)
                    {
                        cr.PID = Guid.NewGuid().ToString();
                        cr.COMPARERESULT = EnumGeter.COMPARERESULT.GAIN.GetHashCode().ToString();
                        cr.CREATEUSER = this.LoginUser.UserID.ToString();
                        cr.CREATEDATE = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    }
                    resultList = list1.Concat(list2).ToList<CountResultInfo>();
                }
                else
                {
                    #region 数量盘点

                    DataTable dt = dal.GetResult(new Countingplaninfo() { PID = sheetList[0].PLANID });

                    int actualNumber = 0;
                    int registNumber = 0;
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        CountResultInfo cr = new CountResultInfo();
                        cr.PID = Guid.NewGuid().ToString();
                        cr.PLANID = plan.PID;
                        cr.CREATEUSER = this.LoginUser.UserID.ToString();
                        cr.CREATEDATE = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                        cr.MATERIAL_CODE = dt.Rows[i]["MATERIAL_CODE"].ToString();
                        cr.MATERIAL_TYPE_CODE = dt.Rows[i]["MATERIAL_TYPE_CODE"].ToString();
                        cr.QTY = (Convert.ToInt32(dt.Rows[i]["QC"]) > 0) ? Convert.ToInt32(dt.Rows[i]["QC"]).ToString() : Convert.ToInt32(dt.Rows[i]["CQ"]).ToString();
                        cr.COMPARERESULT = (Convert.ToInt32(dt.Rows[i]["QC"]) > 0) ?
                            EnumGeter.COMPARERESULT.GAIN.GetHashCode().ToString()
                            : EnumGeter.COMPARERESULT.LOSS.GetHashCode().ToString();
          
                        actualNumber += Convert.ToInt32(dt.Rows[i]["QTY"]);
                        registNumber += Convert.ToInt32(dt.Rows[i]["CAPACITY"]);

                        resultList.Add(cr);
                    }

                    plan.ACTUALNUMBER = actualNumber;
                    plan.REGISTNUMBER = registNumber;
                    plan.PLAN_STATE = "1";

                    #endregion 
                }

                using (IDataSession session = AppDataFactory.CreateMainSession())
                {
                    session.OpenTs();

                    dal.UpdatePlan(plan);

                    dal.BaseSession = session;

                    dal.DeletResultInfo(PID);

                    foreach (var re in resultList)
                    {
                        session.Insert<CountResultInfo>(re);
                    }
                    session.CommitTs();

                    result.Result = resultList.Count;
                }

                result.IsSuccess = true;
                return result;
            }
            catch (Exception ex)
            {
                result.IsSuccess = false;
                throw ex;
            }
        }
        #endregion

        #region 获取盘点对比结果查询
        /// <summary>
        /// 获取盘点对比结果查询
        /// </summary>
        /// <param name="condition">条件</param>
        /// <param name="page">数据页</param>
        /// <returns>数据页</returns>
        public DataResult<DataPage> GetPanResultDetail(string PID, DataPage page)
        {
            DataResult<DataPage> result = new DataResult<DataPage>();
            try
            {
                result.IsSuccess = true;
                page = new StocktakingDAL().GetPanResultDetail(PID, page);
                List<CountResultInfo> list = page.Result as List<CountResultInfo>;
                result.Result = page;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return result;
        }
        #endregion

        #region 手持插入表T_PP_COUNTSHEET
        /// <summary>
        /// 手持插入表
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public DataResult<CountSheetInfo> InsertCountSheet(CountSheetInfo model)
        {
            DataResult<CountSheetInfo> result = new DataResult<CountSheetInfo>();
            result.Result = model;
            try
            {
                StocktakingDAL stdal = new StocktakingDAL();
                //有产品条码,查询产品条码信息
                if (!string.IsNullOrEmpty(model.PRODUCTCODE))
                {
                    if (System.Text.RegularExpressions.Regex.IsMatch(model.PRODUCTCODE, "^DP\\w+(-\\w+)?-DF[LR][FR]\\w+$"))//扫描输入为门板计划标签
                    {
                        //从计划标签中截取产品码
                        model.PRODUCTCODE = model.PRODUCTCODE.Substring(model.PRODUCTCODE.LastIndexOf('-') + 1);
                        return result;
                    }
                    //此产查验品条码是否存在于T_AW_PRODUCT表
                    Product product = new ProductDAL().GetProductByAssembleCode(model.PRODUCTCODE);
                    if (product == null)
                    {
                        result.IsSuccess = false;
                        result.Msg = "产品信息不存在!";
                        return result;
                    }
                    else
                        model.PRODUCTCODE = product.PRODUCTCODE;
                    model.MAINCODE = product.MAINCODE;
                    model.MATERIAL_CODE = product.MATERIAL_CODE;
                    //model.MATERIALNAME = product.MACHINENAME;
                    //model.PRODUCTCODE = product.PRODUCTCODE;
                    //model.QTY = product.CAPACITY - product.USINGCOUNT;
                    model.MATERIAL_TYPE_CODE = product.MATERIAL_TYPE;
                    model.QTY = 1;

                    //查验此产品条码是否已经盘点
                    CountSheetInfo information = new StocktakingDAL().GetStocktaking(new CountSheetInfo { PRODUCTCODE = model.PRODUCTCODE, PLAN_NO = model.PLAN_NO });
                    if (information != null)
                    {
                        result.IsSuccess = false;
                        result.Msg = "此产品已盘点,无需重复扫描!";
                        return result;
                    }
                }
                Countingplaninfo palnid = new StocktakingDAL().GetPlanId(new Countingplaninfo { PLAN_NO = model.PLAN_NO });
                if (palnid == null)
                {
                    result.IsSuccess = false;
                    result.Msg = "盘点计划已失效或删除!";
                    return result;
                }
                model.PLANID = palnid.PID;
                //无产品条码,查验物料信息
                if (model.MATERIAL_CODE == "")
                {
                    result.IsSuccess = false;
                    result.Msg = "物料信息不能为空!";
                    return result;
                }
                MD.Entity.Material material = stdal.IsPlanMaterial(model.PLANID, model.MATERIAL_CODE);
                if (material == null)
                {
                    result.IsSuccess = false;
                    result.Msg = "此产品物料不在当前盘点计划内!";
                    return result;
                }
                model.MATERIALNAME = material.MATERIAL_NAME;
                model.MATERIAL_TYPE_CODE = material.MATERIAL_TYPE_CODE;

                //基本信息
                model.PID = Guid.NewGuid().ToString();
                //model.CREATEUSER = base.LoginUser.UserID;
                model.CREATEDATE = DateTime.Now;
                model.COUNT_DATE = model.CREATEDATE;
                //model.UPDATEUSER = base.LoginUser.UserID;
                model.UPDATEDATE = model.CREATEDATE;
                StocktakingDAL cmdDAL = new StocktakingDAL();
                var ret = new StocktakingDAL().InsertCountSheet(model);
                result.IsSuccess = true;
                result.Msg = Resource.MsgSuccess;
                model.MATERIALNAME = material.MATERIAL_SHORT;
            }
            catch (Exception ex)
            {
                LogManager.LogHelper.Error(new LogInfo()
                {
                    ErrorInfo = ex,
                    Tag = ex.StackTrace,
                    Info = "盘点计划-插入信息"
                });
                result.IsSuccess = false;
                result.Msg = Resource.SystemException;
            }
            return result;
        }
        #endregion

        #region 手持获取物料信息
        /// <summary>
        /// 手持获取物料信息
        /// </summary>
        /// <param name="PLANID"></param>
        /// <returns></returns>
        public List<Entity.MD.Material> GetMaterialOfPlan(string PLANID)
        {
            return new StocktakingDAL().GetMaterialOfPlan(PLANID);
        }
        #endregion

        #region 获取导出的数据
        /// <summary>
        /// 获取导出的数据
        /// </summary>
        /// <param name="user">查询条件</param>
        /// <returns>数据</returns>
        public DataTable GetExportData(string PID)
        {
            try
            {
                return new StocktakingDAL().GetExportData(PID);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region 盘点完成

        /// <summary>
        /// 
        /// </summary>
        /// <param name="PID"></param>
        /// <returns></returns>
        public DataResult<int> CompleteCompare(string PID)
        {
            DataResult<int> result = new DataResult<int>();

            StocktakingDAL dal = new StocktakingDAL();
            Countingplaninfo plan = dal.Get(new Countingplaninfo() { PID = PID });
            plan.PLAN_STATE = "2";

            List<CountingdetailInfo> detailList = dal.GetCountDetailList(new CountingdetailInfo() { PLANID = plan.PID});

            ProductDAL productDal = new ProductDAL();
            ScrapRecordDAL scarpDal = new ScrapRecordDAL();

            //获取所有的比对结果
            List<CountResultInfo> resultInfoList = new List<CountResultInfo>();
            resultInfoList = dal.GetResultInfoList(PID);

            Dictionary<string, int> dict = new Dictionary<string, int>();

            //遍历盘点计划下所有的零件号信息
            foreach (var d in detailList)
            {
                #region 统计差额数量
                //如果盘点对比结果中没有差异,直接跳过
                if (resultInfoList.Count(o => o.MATERIAL_CODE == d.MATERIAL_CODE) == 0)
                {
                    continue;
                }

                int gainQTY = 0;
                int lossQTY = 0;

                gainQTY = resultInfoList.Where(
                    o => o.COMPARERESULT == EnumGeter.COMPARERESULT.GAIN.GetHashCode().ToString() && o.MATERIAL_CODE == d.MATERIAL_CODE)
                    .Sum(o => Convert.ToInt32(o.QTY));

                lossQTY = resultInfoList.Where(
                    o => o.COMPARERESULT == EnumGeter.COMPARERESULT.LOSS.GetHashCode().ToString() && o.MATERIAL_CODE == d.MATERIAL_CODE)
                    .Sum(o => Convert.ToInt32(o.QTY));

                CountResultInfo info = resultInfoList.First(o => o.MATERIAL_CODE == d.MATERIAL_CODE);

                dict.Add(d.MATERIAL_CODE, gainQTY - lossQTY);

                #endregion
            }

            using (IDataSession session = AppDataFactory.CreateMainSession())
            {
                session.OpenTs();

                #region 更新差额数量

                foreach (var v in dict.Keys)
                {
                    string upsql = string.Format("update T_PP_COUNTRESULTVALUE set CHECKRESULT={0} where MATERIAL_CODE='{1}'", dict[v], v);
                    int i = session.ExecuteSql(upsql, new List<DataParameter>().ToArray());
                    if (i == 0)
                    {
                        string insertSql = string.Format("insert into T_PP_COUNTRESULTVALUE values(NEWID(),'{0}',{1},'{2}')", v, dict[v], System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                        i = session.ExecuteSql(insertSql, new List<DataParameter>().ToArray());
                    }
                }
                #endregion 

                //更新计划
                session.Update<Countingplaninfo>(plan);

                session.CommitTs();
            }

            if (plan.COUNTTYPE == EnumGeter.COUNTTYPE.CHECKBYCODE.GetHashCode().ToString())
            {
                Task task = new Task(() =>
                {
                    StocktakingDAL deal = new StocktakingDAL();
                    deal.ProductInOutDeal(plan);
                });

                task.Start();
            }

            result.IsSuccess = true;
            result.Result = 1;
            return result;

        }

        #endregion 

    }
}