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 { /// /// 模块编号:M14-1 /// 作 用:库存盘点 /// 作 者:崔法宝 /// 编写日期:2015年06月04日 /// public class StocktakingBLL : BaseBLL { #region 获取列表 /// /// 获取列表 /// /// 条件 /// 数据页 /// 数据页 public DataResult GetList(Countingplaninfo condition, DataPage page) { DataResult result = new DataResult(); try { result.IsSuccess = true; page = new StocktakingDAL().GetList(condition, page); List list = page.Result as List; //处理字典信息 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; } /// /// 获取列表(同时手持也用此方法) /// /// 条件 /// 全部集合 public List GetAllList(Countingplaninfo condition) { try { //获取物料信息列表 List list = new StocktakingDAL().GetAllList(condition); return list; } catch (Exception ex) { throw ex; } } #endregion #region 获取设备信息,填充Grid /// /// 获取设备信息,填充Grid /// /// /// public List GetMachineInfo(QMAPP.MD.Entity.Material condition) { QMAPP.MD.Entity.Material material = new QMAPP.MD.Entity.Material(); List materialList = new List(); //根据设备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) /// /// 插入信息(T_PP_COUNTINGPLAN) /// /// 信息 /// 插入行数 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表 /// /// 插入信息 /// /// 信息 /// 插入行数 public DataResult InsertStocktakingDeail(Countingplaninfo model, List materiallist) { List List = new List(); DataResult result = new DataResult(); 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)) /// /// 修改信息(单表) /// /// 信息 /// 修改行数 public DataResult Update(Countingplaninfo model) { object count = null; DataResult result = new DataResult(); 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 获取信息 /// /// 获取信息 /// /// 条件 /// 信息 public DataResult Get(Countingplaninfo model) { DataResult result = new DataResult(); 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 获取列表 /// /// 获取列表 /// /// 条件 /// 数据页 /// 数据页 public DataResult GetMaterialGridList(CountingdetailInfo condition, DataPage page) { DataResult result = new DataResult(); 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 编辑时删除 /// /// 编辑时删除 /// /// /// 删除个数 public DataResult EditDelete(CountingdetailInfo model) { DataResult result = new DataResult(); 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; } /// /// 删除信息 /// /// 信息 /// 删除个数 public int EditDeleteUserWithMachine(CountingdetailInfo model) { int count = 0; try { count = new StocktakingDAL().EditDeleteUserWithMachine(model); return count; } catch (Exception ex) { throw ex; } } #endregion #region 编辑时保存 /// /// 编辑时保存 /// /// /// public DataResult EditInsertStocktakingDeail(Countingplaninfo model, List materiallist) { int count = 0; StocktakingDAL cmdDAL = new StocktakingDAL(); cmdDAL.BaseSession = AppDataFactory.CreateMainSession(); DataResult result = new DataResult(); try { //存在的物料信息(更新) List updateCountingdetail = new List(); //新加的物料信息(增加) List addCountingdetail = new List(); 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 /// /// 删除父表数据根据ID /// /// 信息 /// 插入行数 public DataResult Delete(string PID) { object count = null; DataResult result = new DataResult(); 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 /// /// 删除子表的数据根据PLANID /// /// 信息 /// 插入行数 public DataResult SubDelete(string PLANID) { object count = null; DataResult result = new DataResult(); 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 获取每日最新的计划单号 /// /// 获取每日最新的计划单号 /// /// 信息 /// 计划单号 public object GetPlanNoByDate(string NowDate) { try { return new StocktakingDAL().GetPlanNoByDate(NowDate); } catch (Exception ex) { throw ex; } } #endregion #region 获取盘点明细查询 /// /// 获取盘点明细查询 /// /// 条件 /// 数据页 /// 数据页 public DataResult GetPanDetail(string PID, DataPage page) { DataResult result = new DataResult(); try { result.IsSuccess = true; page = new StocktakingDAL().GetPanDetail(PID, page); List list = page.Result as List; result.Result = page; } catch (Exception ex) { throw ex; } return result; } #endregion #region 盘点比对 /// /// 盘点比对 /// /// /// public DataResult detailCompareResult(string PID, string CREATEUSER) { StocktakingDAL dal = new StocktakingDAL(); DataResult result = new DataResult(); try { Countingplaninfo plan = dal.Get(new Countingplaninfo() { PID = PID }); //获取手持终端的盘点信息 List sheetList = dal.GetCountSheetInfoList(new CountSheetInfo() { PLANID = PID }); List sheetStrList = sheetList.Select(o => o.PRODUCTCODE).ToList(); if (sheetList.Count == 0) { result.IsSuccess = false; result.Msg = "未盘点实物,不能进行对比!"; return result; } List resultList = new List(); //按条码进行盘点 if (plan.COUNTTYPE == EnumGeter.COUNTTYPE.CHECKBYCODE.GetHashCode().ToString()) { //获取符合条件的产品信息 List proListIn = dal.GetListIn(new Countingplaninfo() { PID = sheetList[0].PLANID }); List proStrListIn = proListIn.Select(o => o.PRODUCTCODE).ToList(); plan.ACTUALNUMBER = sheetList.Count; plan.REGISTNUMBER = proListIn.Count; plan.PLAN_STATE = "1"; //系统有,实物没有,实物亏 List strList1 = proStrListIn.Except(sheetStrList).ToList(); List list1 = proListIn.Where(o => strList1.Contains(o.PRODUCTCODE)).ToList(); //实物有,系统没有,实物赢 List strList2 = sheetStrList.Except(proStrListIn).ToList(); List list2 = sheetList.Where(o => strList2.Contains(o.PRODUCTCODE)).ToList(); //要修改的产品信息 List proList = new List(); //入库数据 List proInList = new List(); //出库库数据 List proOutList = new List(); 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(); } 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(re); } session.CommitTs(); result.Result = resultList.Count; } result.IsSuccess = true; return result; } catch (Exception ex) { result.IsSuccess = false; throw ex; } } #endregion #region 获取盘点对比结果查询 /// /// 获取盘点对比结果查询 /// /// 条件 /// 数据页 /// 数据页 public DataResult GetPanResultDetail(string PID, DataPage page) { DataResult result = new DataResult(); try { result.IsSuccess = true; page = new StocktakingDAL().GetPanResultDetail(PID, page); List list = page.Result as List; result.Result = page; } catch (Exception ex) { throw ex; } return result; } #endregion #region 手持插入表T_PP_COUNTSHEET /// /// 手持插入表 /// /// /// public DataResult InsertCountSheet(CountSheetInfo model) { DataResult result = new DataResult(); 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 手持获取物料信息 /// /// 手持获取物料信息 /// /// /// public List GetMaterialOfPlan(string PLANID) { return new StocktakingDAL().GetMaterialOfPlan(PLANID); } #endregion #region 获取导出的数据 /// /// 获取导出的数据 /// /// 查询条件 /// 数据 public DataTable GetExportData(string PID) { try { return new StocktakingDAL().GetExportData(PID); } catch (Exception ex) { throw ex; } } #endregion #region 盘点完成 /// /// /// /// /// public DataResult CompleteCompare(string PID) { DataResult result = new DataResult(); StocktakingDAL dal = new StocktakingDAL(); Countingplaninfo plan = dal.Get(new Countingplaninfo() { PID = PID }); plan.PLAN_STATE = "2"; List detailList = dal.GetCountDetailList(new CountingdetailInfo() { PLANID = plan.PID}); ProductDAL productDal = new ProductDAL(); ScrapRecordDAL scarpDal = new ScrapRecordDAL(); //获取所有的比对结果 List resultInfoList = new List(); resultInfoList = dal.GetResultInfoList(PID); Dictionary dict = new Dictionary(); //遍历盘点计划下所有的零件号信息 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().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().ToArray()); } } #endregion //更新计划 session.Update(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 } }