using System; using System.Collections.Generic; using System.Linq; using HH.WMS.Entitys.Algorithm; using System.Text; using System.Threading.Tasks; using HH.MData; using MongoDB.Driver; using MongoDB.Bson; using System.Text.RegularExpressions; using MongoDB.Driver.Builders; using HH.WMS.Common; using System.Data; using System.Data.Common; using MongoDB.Driver.Builders; using MongoDB.Driver; using HH.WMS.Entitys.Basic; using HH.WMS.DAL.Basic; namespace HH.WMS.DAL.Algorithm { /// /// 用户读取mongodb中的逻辑分区和库区 /// public class TN_WMS_AREADAL : BaseDAL { #region 获得当前物料所在逻辑分区关联仓库/库区/货位信息 /// /// 获得当前物料所在逻辑分区关联仓库/库区/货位信息 /// /// /// 1:存储类别 2:物料编码 /// public List GetPartitionItem(string filedValue, int logicType) { //定义查询条件 var query = new QueryDocument(); var b = new BsonDocument(); //物料分类 switch (logicType) { case 1://存储类别 b.Add("CN_N_LOGIC_TYPE", 1); b.Add("CN_S_NAME", new Regex(filedValue.ToString(), RegexOptions.IgnoreCase)); break; case 2://物料编码 b.Add("CN_N_LOGIC_TYPE", 2); b.Add("CN_S_NAME", new Regex(filedValue.ToString(), RegexOptions.IgnoreCase)); break; } query.Add(b); //定义排序 按照优先级正序排列 SortByDocument sort = new SortByDocument { { "CN_S_PRIORITY", 1 } }; //根据查询条件获得所有逻辑分区物料关联信息 List listLogic_item = MongoDBSingleton.Instance.Find(query, sort, "TN_AB_B_PARTITION_ITEM_R"); return listLogic_item; } #endregion #region 根据逻辑分区编码和库区编码获得关联关系 /// /// 根据逻辑分区编码获得所在仓库/库区/货位 /// /// 逻辑分区编码 /// 库区编码 /// /// [Hanhe(DBS)] created 2018-5-9 public List GetLogicListByLogicAndArea(List logicCodes, string areaCode) { List listLogic = new List(); var locations = logicCodes.ConvertAll(x => x); IMongoQuery query; if (!string.IsNullOrEmpty(areaCode)) { query = Query.And(Query.In("CN_S_AREA_CODE", locations), Query.EQ("CN_S_STOCK_AREA", areaCode)); } else { //查询条件 query = Query.In("CN_S_AREA_CODE", locations); } //定义排序 按优先级正序排列 SortByDocument sort = new SortByDocument { { "CN_S_PRIORITY", 1 } }; listLogic = MongoDBSingleton.Instance.Find(query, sort, "TN_AB_B_AREA_LOCATION_R"); return listLogic; } #endregion #region 根据逻辑分区编码和库区编码获得货位 /// /// 根据逻辑分区编码获得所在仓库/库区/货位 /// /// 逻辑分区编码 /// 库区编码 /// /// [Hanhe(DBS)] created 2018-5-9 public List GetLogicListByLogicAndArea(string logicCodes, string areaCode) { List listLogic = new List(); IMongoQuery query; query = Query.And(Query.EQ("CN_S_AREA_CODE", logicCodes), Query.EQ("CN_S_STOCK_AREA", areaCode)); //定义排序 按优先级正序排列 SortByDocument sort = new SortByDocument { { "CN_S_PRIORITY", 1 } }; listLogic = MongoDBSingleton.Instance.Find(query, sort, "TN_AB_B_AREA_LOCATION_R"); return listLogic; } #endregion #region 返回指定逻辑分区、库区下的所有货位 /// /// 返回指定逻辑分区、库区下的所有货位 /// /// 逻辑分区 /// 库区 /// /// [Hanhe(DBS)] created 2018-5-9 public List GetLocation(List logicCodes, string areaCode) { List listLogic = new List(); var arrLogic = logicCodes.ConvertAll(x => x); IMongoQuery query; if (!string.IsNullOrEmpty(areaCode)) { query = Query.And(Query.In("CN_S_AREA_CODE", arrLogic), Query.EQ("CN_S_STOCK_AREA", areaCode)); } else { //查询条件 query = Query.In("CN_S_AREA_CODE", arrLogic); } //定义排序 按优先级正序排列 SortByDocument sort = new SortByDocument { { "CN_S_PRIORITY", 1 } }; listLogic = MongoDBSingleton.Instance.Find(query, sort, "TN_AB_B_AREA_LOCATION_R"); if (listLogic == null) { //未找到合适逻辑分区下的货位 return new List(); } var arrLocation = listLogic.ConvertAll(x => x.CN_S_LOCATION_CODE); if (!string.IsNullOrEmpty(areaCode)) query = Query.And(Query.In("CN_S_LOCATION_CODE", arrLocation), Query.EQ("CN_S_AREA_CODE", areaCode)); else query = Query.And(Query.In("CN_S_LOCATION_CODE", arrLocation)); sort = new SortByDocument { { "CN_S_ROW", 1 }, { "CN_S_COL", 1 }, { "CN_S_FLOOR", 1 } }; List locationList = MongoDBSingleton.Instance.Find(query, sort, "TN_AB_STOCK_LOCATION"); List logicAreaLocation = new List(); foreach (AutoBomAreaLocation_REntity x in listLogic) { var v = locationList.Find(y => y.CN_S_LOCATION_CODE.Equals(x.CN_S_LOCATION_CODE)); if (v != null) { logicAreaLocation.Add(new LogicAreaLocationEntity { CN_S_LOCATION_CODE = x.CN_S_LOCATION_CODE, CN_S_AREA_CODE = x.CN_S_AREA_CODE, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_ROW = v.CN_S_ROW, CN_S_COL = v.CN_S_COL, CN_S_FLOOR = v.CN_S_FLOOR, CN_S_STOCK_AREA = x.CN_S_STOCK_AREA }); } } return logicAreaLocation; } #endregion #region 根据货位查询库位和逻辑分区的关联 /// /// 根据货位查询库位和逻辑分区的关联 /// /// /// public List GetLogicAreaLocation(List list) { //定义排序 按优先级正序排列 SortByDocument sort = new SortByDocument { { "CN_S_PRIORITY", 1 } }; var locations = list.ConvertAll(x => x); var query = Query.And(Query.In("CN_S_LOCATION_CODE", locations)); return MongoDBSingleton.Instance.Find(query, sort, "TN_AB_B_AREA_LOCATION_R"); } #endregion #region 根据库区获得所在仓库/库区/货位 /// /// 根据库区获得所在仓库/库区/货位 /// /// 库区编码 /// public List GetLogicListByAreaCode(string areaCode) { List listLogic = new List(); //定义排序 按优先级正序排列 SortByDocument sort = new SortByDocument { { "CN_S_PRIORITY", 1 } }; //条件 库区 var query = Query.EQ("CN_S_STOCK_AREA", areaCode); //根据库区编码到逻辑分区仓库/库区/货位关联中查找数据 listLogic = MongoDBSingleton.Instance.Find(query, sort, "TN_AB_B_AREA_LOCATION_R"); //如果根据库区没有取到逻辑分区 则根据库区所在仓库取逻辑分区 if (listLogic == null || listLogic.Count == 0) { //根据库区取仓库 string stockCode = GetStockCodeByAreaCode(areaCode); if (!string.IsNullOrEmpty(stockCode)) { query = Query.EQ("CN_S_STOCK_CODE", stockCode); listLogic = MongoDBSingleton.Instance.Find(query, sort, "TN_AB_B_AREA_LOCATION_R"); } } //如果根据库区和仓库都没有取到逻辑分区 则根据库区下的货位取逻辑分区 if (listLogic == null || listLogic.Count == 0) { TN_WMS_LOCATIONDAL lcoationDal = new TN_WMS_LOCATIONDAL(); List lstLocation = lcoationDal.GetLocationByAreaCode(areaCode); if (lstLocation != null && lstLocation.Count > 0) { var locations = lstLocation.ConvertAll(x => x.CN_S_LOCATION_CODE); query = Query.In("CN_S_LOCATION_CODE", locations); listLogic = MongoDBSingleton.Instance.Find(query, sort, "TN_AB_B_AREA_LOCATION_R"); } } return listLogic; } public List GetLogicListByLogicCode(List lstLog, string CN_N_TYPE) { List listLogic = new List(); //定义排序 按优先级正序排列 SortByDocument sort = new SortByDocument { { "CN_S_PRIORITY", 1 } }; TN_WMS_LOCATIONDAL lcoationDal = new TN_WMS_LOCATIONDAL(); var logicCodes = lstLog.ConvertAll(x => x); var query = Query.And(Query.In("CN_S_STOCK_AREA", logicCodes), Query.EQ("CN_N_TYPE", int.Parse(CN_N_TYPE))); // var query = Query.And(Query.In("CN_S_STOCK_AREA", logicCodes)); listLogic = MongoDBSingleton.Instance.Find(query, sort, "TN_AB_B_AREA_LOCATION_R"); return listLogic; } public List GetLogicListByLogicCode(string logicCode) { List listLogic = new List(); //定义排序 按优先级正序排列 SortByDocument sort = new SortByDocument { { "CN_S_PRIORITY", 1 } }; TN_WMS_LOCATIONDAL lcoationDal = new TN_WMS_LOCATIONDAL(); var query = Query.EQ("CN_S_AREA_CODE", logicCode); listLogic = MongoDBSingleton.Instance.Find(query, sort, "TN_AB_B_AREA_LOCATION_R"); return listLogic; } /// /// 根据库区和物料查询安全库存 /// /// /// /// public List GetItemAreaSafetyByAreaCode(List lstArea, string itemCode) { List listSafety = new List(); TN_WMS_LOCATIONDAL lcoationDal = new TN_WMS_LOCATIONDAL(); SortByDocument sort = new SortByDocument { { "CN_S_AREA_CODE", 1 } }; var areaCodeS = lstArea.ConvertAll(x => x); IMongoQuery query; query = Query.And(Query.EQ("CN_S_ITEM_CODE", itemCode), Query.In("CN_S_AREA_CODE", areaCodeS)); listSafety = MongoDBSingleton.Instance.Find(query, sort, "TN_AB_B_ITEM_SAFETY"); return listSafety; } #endregion #region 根据库区编码获得仓库编号 /// /// 根据库区编码获得仓库编号 /// /// /// public string GetStockCodeByAreaCode(string areaCode) { string stockCode = string.Empty; var query = Query.EQ("CN_S_AREA_CODE", areaCode); AutoBomStockAreaEntity entity = MongoDBSingleton.Instance.FindOne(query, "TN_AB_B_STOCK_AREA"); if (entity != null) { stockCode = entity.CN_S_STOCK_CODE; } return stockCode; } #endregion #region 根据库区编码获得库区类型(立库/平库/流离式) /// /// 根据库区编码获得仓库编号 /// /// /// public string GetAreaTypeByCode(string areaCode) { string areaType = string.Empty; var query = Query.EQ("CN_S_AREA_CODE", areaCode); AutoBomStockAreaEntity entity = MongoDBSingleton.Instance.FindOne(query, "TN_AB_B_STOCK_AREA"); if (entity != null) { areaType = entity.CN_S_STRUCTURE; } return areaType; } #endregion #region 根据库区编码获得库区类型(立库/平库/流离式) /// /// 根据库区编码获得是否为作业区 /// /// /// public string GetCNNTypeByCode(string areaCode) { string areaType = string.Empty; var query = Query.EQ("CN_S_AREA_CODE", areaCode); AutoBomStockAreaEntity entity = MongoDBSingleton.Instance.FindOne(query, "TN_AB_B_STOCK_AREA"); if (entity != null) { areaType = entity.CN_N_TYPE.ToString(); } return areaType; } /// /// 根据库区编码获得是否为作业区(批量) /// /// /// public List SortAreaByCNNType(List lstArea) { string areaType = string.Empty; List lstResult = new List(); var AreaCodes = lstArea.ConvertAll(x => x); var query = Query.In("CN_S_AREA_CODE", AreaCodes); //定义排序 按优先级正序排列 SortByDocument sort = new SortByDocument { { "CN_N_TYPE", 1 } }; lstResult = MongoDBSingleton.Instance.Find(query, sort, "TN_AB_B_STOCK_AREA"); return lstResult.Select(o => o.CN_S_AREA_CODE).ToList(); } #endregion #region 根据库区编码获得库区类型(立库/平库/流离式) /// /// 根据库区编码获得是否为作业区 /// /// /// public string GetAreaClassByCode(string areaCode) { string areaClass = string.Empty; var query = Query.EQ("CN_S_AREA_CODE", areaCode); AutoBomStockAreaEntity entity = MongoDBSingleton.Instance.FindOne(query, "TN_AB_B_STOCK_AREA"); if (entity != null) { areaClass = entity.CN_S_AREA_CLASS.ToString(); } return areaClass; } public List GetAreaCodeByClass(string areaClass) { string areaCode = string.Empty; var query = Query.EQ("CN_S_AREA_CLASS", areaClass); List lstArea = MongoDBSingleton.Instance.Find(query, "TN_AB_B_STOCK_AREA"); return lstArea; } #endregion #region 根据库区编码获得是否管控数量(立库/平库/流离式) /// /// 根据库区编码获得是否管控数量 /// /// /// public string GetIsControlQtyByCode(string areaCode) { string areaType = string.Empty; try { var query = Query.EQ("CN_S_AREA_CODE", areaCode); AutoBomStockAreaEntity entity = MongoDBSingleton.Instance.FindOne(query, "TN_AB_B_STOCK_AREA"); if (entity != null) { areaType = entity.CN_C_IS_CONTROL_QTY; } } catch (Exception ex) { Log.AlgorInfo("In—InAssign", "GetIsControlQtyByCode:" + ex.Message + ex.StackTrace); } return areaType; } #endregion #region 根据逻辑分区编码和库区编码获得货位 /// /// 根据逻辑分区编码获得所在仓库/库区/货位 /// /// 逻辑分区编码 /// 库区编码 /// /// [Hanhe(DBS)] created 2018-5-9 public List GetLocationByLogicArea(string logicCodes, string areaCode) { List listLogic = new List(); IMongoQuery query; query = Query.And(Query.EQ("CN_S_AREA_CODE", logicCodes), Query.EQ("CN_S_STOCK_AREA", areaCode)); //定义排序 按优先级正序排列 SortByDocument sort = new SortByDocument { { "CN_S_PRIORITY", 1 } }; listLogic = MongoDBSingleton.Instance.Find(query, sort, "TN_AB_B_AREA_LOCATION_R"); return listLogic; } public List GetLocationByLogicAreaJX(string logicCodes, string areaCode) { List listLogic = new List(); IMongoQuery query; query = Query.EQ("CN_S_STOCK_AREA", areaCode); //定义排序 按优先级正序排列 SortByDocument sort = new SortByDocument { { "CN_S_PRIORITY", 1 } }; listLogic = MongoDBSingleton.Instance.Find(query, sort, "TN_AB_B_AREA_LOCATION_R"); return listLogic; } #endregion #region 根据库区编码获得货位 /// /// 根据逻辑分区编码获得所在仓库/库区/货位 /// /// 逻辑分区编码 /// 库区编码 /// /// [Hanhe(DBS)] created 2018-5-9 public List GetLogicLocationByArea(string areaCode) { List listLogic = new List(); IMongoQuery query; query = Query.EQ("CN_S_STOCK_AREA", areaCode); //定义排序 按优先级正序排列 SortByDocument sort = new SortByDocument { { "CN_S_PRIORITY", 1 } }; listLogic = MongoDBSingleton.Instance.Find(query, sort, "TN_AB_B_AREA_LOCATION_R"); return listLogic; } #endregion #region 根据库区编码货物库区实体 /// /// 根据库区编码货物库区实体 /// /// /// public AutoBomStockAreaEntity GetModel(string areaCode) { var query = Query.EQ("CN_S_AREA_CODE", areaCode); AutoBomStockAreaEntity entity = MongoDBSingleton.Instance.FindOne(query, "TN_AB_B_STOCK_AREA"); return entity; } /// /// 根据库区编码货物库区实体 /// /// /// public List GetStockAreaList(List areaCodelist) { List entityList = new List(); var areaCode = areaCodelist.ConvertAll(x => x); var query = Query.In("CN_S_AREA_CODE", areaCode); entityList = MongoDBSingleton.Instance.Find(query, "TN_AB_B_STOCK_AREA"); return entityList; } #endregion #region 根据分区唯一码获取信息 /// ///根据分区唯一码获取信息 /// /// 分区唯一码 /// /// [HanHe(LT)] CREATED 2018/6/21 public List GetAreaLocationByGuid(string CN_S_AREA_GUID) { IMongoQuery query = Query.EQ("CN_S_AREA_GUID", CN_S_AREA_GUID); List entity = MongoDBSingleton.Instance.Find(query, "TN_AB_B_AREA_LOCATION_R"); return entity; } #endregion public List GetSHLocationArea(string areaClass) { List listLogic = new List(); var query = Query.EQ("CN_S_AREA_CLASS", areaClass); listLogic = MongoDBSingleton.Instance.Find(query, "TN_AB_B_STOCK_AREA"); return listLogic; } public List GetSHLocation(List arrAreaCode) { List locationList = new List(); var arrLogic = arrAreaCode.ConvertAll(x => x); var query = Query.In("CN_S_AREA_CODE", arrLogic); locationList = MongoDBSingleton.Instance.Find(query, "TN_AB_STOCK_LOCATION"); return locationList; } public List GetitemListByLocation(string locationCode) { IMongoQuery query; List listLogic_item = new List(); if (!string.IsNullOrEmpty(locationCode)) { List itemList = new List(); query = Query.And(Query.EQ("CN_S_LOCATION_CODE", locationCode)); //定义排序 按优先级正序排列 SortByDocument sort = new SortByDocument { { "CN_S_PRIORITY", 1 } }; List listLogic = new List(); listLogic = MongoDBSingleton.Instance.Find(query, sort, "TN_AB_B_AREA_LOCATION_R"); if (listLogic != null) { foreach (AutoBomAreaLocation_REntity x in listLogic) { IMongoQuery queryPir; queryPir = Query.EQ("CN_S_AREA_CODE", x.CN_S_AREA_CODE); List item = MongoDBSingleton.Instance.Find(queryPir, sort, "TN_AB_B_PARTITION_ITEM_R"); if (item.Any()) { listLogic_item.AddRange(item); } } } } return listLogic_item; } } }