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;
}
}
}