You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
339 lines
13 KiB
C#
339 lines
13 KiB
C#
using Aucma.Scada.Model.domain;
|
|
using Aucma.Scada.Model.dto;
|
|
using HighWayIot.Common;
|
|
using HighWayIot.Log4net;
|
|
using SqlSugar;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Linq.Expressions;
|
|
using System.Security.Cryptography;
|
|
|
|
namespace HighWayIot.Repository.service.Impl
|
|
{
|
|
public class BaseSpaceInfoServiceImpl : IBaseSpaceInfoService
|
|
{
|
|
private Repository<BaseSpaceInfo> _mesRepository = new Repository<BaseSpaceInfo>("mes");
|
|
|
|
private LogHelper logHelper = LogHelper.Instance;
|
|
|
|
private JsonChange jsonChange = JsonChange.Instance;
|
|
|
|
/// <summary>
|
|
/// 未使用 入库通过物料类型获取指定货道,如果没有对应类型的货道返回空白类型的货道
|
|
/// </summary>
|
|
/// <param name="store"></param>
|
|
/// <param name="materialType"></param>
|
|
/// <returns></returns>
|
|
public BaseSpaceInfo InStoreGetSpaceInfoByMaterialType(string store, string materialType)
|
|
{
|
|
BaseSpaceInfo spaceInfo = null;
|
|
List<BaseSpaceInfo> spaceInfos;
|
|
try
|
|
{
|
|
Expression<Func<BaseSpaceInfo, bool>> exp = s1 => true;
|
|
exp = exp.And(x => x.storeCode == store && x.materialType == materialType && x.spaceStatus == 1 && x.spaceCapacity > (x.spaceStock + x.onRouteAmount)); //相同型号、启用状态、库存未满的货道信息
|
|
|
|
spaceInfos = _mesRepository.GetList(exp);
|
|
|
|
if (spaceInfos.Count == 0) //没有指定该类型物料的货道信息,需获取空白货道信息进行分配
|
|
{
|
|
spaceInfos = GetEmptySpaceInfo(store);
|
|
}
|
|
logHelper.Info($"根据仓库{store};物料:{materialType};获取到的货道信息:{jsonChange.ModeToJson(spaceInfos)}");
|
|
spaceInfo = inStoreFilter(spaceInfos);
|
|
if(spaceInfo != null)
|
|
{
|
|
logHelper.Info($"仓库{store};物料:{materialType};匹配的入库货道信息:{jsonChange.ModeToJson(spaceInfo)}");
|
|
|
|
spaceInfo.materialType = materialType;
|
|
}
|
|
else
|
|
{
|
|
logHelper.Info($"仓库{store};物料:{materialType};未匹配到可用货道");
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logHelper.Error("入库通过物料类型获取货道信息异常", ex);
|
|
}
|
|
return spaceInfo;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 入库过滤逻辑,获取库存未满库存最多的货道
|
|
/// </summary>
|
|
/// <param name="spaceInfos"></param>
|
|
private BaseSpaceInfo inStoreFilter(List<BaseSpaceInfo> spaceInfos)
|
|
{
|
|
BaseSpaceInfo spaceInfo = null;
|
|
if (spaceInfos.Count > 0)
|
|
{
|
|
//获取库存未满库存最多的货道
|
|
spaceInfo = spaceInfos.Where(x => x.spaceCapacity != x.spaceStock).OrderByDescending(x => x.spaceStock).First();
|
|
}
|
|
else
|
|
{
|
|
logHelper.Info("入库过滤未获取到匹配的货道信息");
|
|
}
|
|
|
|
return spaceInfo;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取空货道:未分配物料型号的空白货道
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public List<BaseSpaceInfo> GetEmptySpaceInfo(string store)
|
|
{
|
|
List<BaseSpaceInfo> spaceInfos = null;
|
|
try
|
|
{
|
|
Expression<Func<BaseSpaceInfo, bool>> exp = s1 => true;
|
|
exp = exp.And(x => x.spaceStatus == 1 && x.materialType == null && x.storeCode == store && x.spaceCapacity != x.spaceStock);
|
|
spaceInfos = _mesRepository.GetList(exp);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logHelper.Error("获取空货道异常", ex);
|
|
}
|
|
return spaceInfos;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 出库通过物料类型获取指定货道
|
|
/// </summary>
|
|
/// <param name="store"></param>
|
|
/// <param name="materialType"></param>
|
|
/// <returns></returns>
|
|
public List<BaseSpaceInfo> OutStoreGetSpaceInfoByMaterialCode(string store, string materialType)
|
|
{
|
|
List<BaseSpaceInfo> spaceInfos = null;
|
|
try
|
|
{
|
|
Expression<Func<BaseSpaceInfo, bool>> exp = s1 => true;
|
|
exp = exp.And(x => x.storeCode == store && x.materialType == materialType && x.spaceStatus == 1); //相同型号、启用状态、库存不为空的货道信息
|
|
|
|
spaceInfos = _mesRepository.GetList(exp);
|
|
|
|
logHelper.Info($"根据仓库{store};物料:{materialType};获取到的货道信息:{jsonChange.ModeToJson(spaceInfos)}");
|
|
//spaceInfo = outStoreFilter(spaceInfos);
|
|
//logHelper.Info($"仓库{store};物料:{materialType};匹配的入库货道信息:{jsonChange.ModeToJson(spaceInfo)}");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logHelper.Error("出库通过物料类型获取货道信息异常", ex);
|
|
}
|
|
return spaceInfos;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 出库过滤逻辑
|
|
/// </summary>
|
|
/// <param name="spaceInfos"></param>
|
|
private BaseSpaceInfo outStoreFilter(List<BaseSpaceInfo> spaceInfos)
|
|
{
|
|
BaseSpaceInfo spaceInfo = null;
|
|
if (spaceInfos.Count > 0)
|
|
{
|
|
//获取库存最少的货道(优先清空货道)
|
|
spaceInfo = spaceInfos.Where(x => x.spaceStock > 0).OrderBy(x => x.spaceStock).First();
|
|
}
|
|
else
|
|
{
|
|
logHelper.Info("出库过滤未获取到匹配的货道信息");
|
|
}
|
|
|
|
return spaceInfo;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 通过货道编号获取货道信息
|
|
/// </summary>
|
|
/// <param name="store"></param>
|
|
/// <param name="spaceCode"></param>
|
|
/// <returns></returns>
|
|
public BaseSpaceInfo GetSpaceInfoBySpaceCode(string store, string spaceCode)
|
|
{
|
|
BaseSpaceInfo spaceInfo = null;
|
|
try
|
|
{
|
|
spaceInfo = _mesRepository.GetFirst(x => x.storeCode == store && x.spaceCode == spaceCode);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logHelper.Error("通过货道编号获取货道信息异常", ex);
|
|
}
|
|
return spaceInfo;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 通过仓库编号获取货道信息,可以传两个仓库编号,实时读plc更新库存使用
|
|
/// </summary>
|
|
/// <param name="storeCode1"></param>
|
|
/// <param name="storeCode2"></param>
|
|
/// <returns></returns>
|
|
public List<BaseSpaceInfo> GetSpaceInfosByStoreCode(string storeCode1, string storeCode2)
|
|
{
|
|
List<BaseSpaceInfo> spaceInfos = null;
|
|
try
|
|
{
|
|
spaceInfos = _mesRepository.GetList(x => x.storeCode == storeCode1 || x.storeCode == storeCode2).ToList();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logHelper.Error("获取货道信息异常", ex);
|
|
}
|
|
return spaceInfos;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 通过仓库编号获取货道信息
|
|
/// </summary>
|
|
/// <param name="storeCode"></param>
|
|
/// <returns></returns>
|
|
public List<BaseSpaceInfo> GetSpaceInfosByStoreCode(string storeCode)
|
|
{
|
|
List<BaseSpaceInfo> spaceInfos = null;
|
|
try
|
|
{
|
|
spaceInfos = _mesRepository.GetList(x => x.storeCode == storeCode).ToList();
|
|
|
|
//spaceInfos = _mesRepository.Context.Queryable<BaseSpaceInfo>()
|
|
// .LeftJoin<BaseBomInfo>((s, b) => s.materialType == b.materialCode)
|
|
// .Where((s, b) => s.storeCode == storeCode)
|
|
// .Select((s, b) => new BaseSpaceInfo()
|
|
// {
|
|
// objId = s.objId,
|
|
// spaceCode = s.spaceCode,
|
|
// spaceName = s.spaceName,
|
|
// spaceCapacity = s.spaceCapacity,
|
|
// spaceStock = s.spaceStock,
|
|
// spaceStatus = s.spaceStatus,
|
|
// spaceType = s.spaceType,
|
|
// isFlag = s.isFlag,
|
|
// materialType = b.materialName,
|
|
// onRouteAmount = s.onRouteAmount,
|
|
// inStoreFlag = s.inStoreFlag,
|
|
// outRouteAmount = s.outRouteAmount,
|
|
// outStoreFlag = s.outStoreFlag,
|
|
// unusualFlag = s.unusualFlag,
|
|
// }).ToList();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logHelper.Error("获取货道信息异常", ex);
|
|
}
|
|
return spaceInfos;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 通过两个仓库编号获取库存大于0货道信息
|
|
/// </summary>
|
|
/// <param name="storeCode1"></param>
|
|
/// <param name="storeCode2"></param>
|
|
/// <returns></returns>
|
|
public List<BaseSpaceInfo> GetSpaceInfosByTwoStoreCode(string storeCode1, string storeCode2)
|
|
{
|
|
List<BaseSpaceInfo> spaceInfos = null;
|
|
try
|
|
{
|
|
spaceInfos = _mesRepository.GetList(x => (x.storeCode == storeCode1 || x.storeCode == storeCode2) && x.spaceStock>0).ToList();
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logHelper.Error("获取货道信息异常", ex);
|
|
}
|
|
return spaceInfos;
|
|
}
|
|
/// <summary>
|
|
/// 更新货道信息
|
|
/// </summary>
|
|
/// <param name="spaceInfo"></param>
|
|
/// <returns></returns>
|
|
public bool UpdateSpaceInfo(BaseSpaceInfo spaceInfo)
|
|
{
|
|
bool result = false;
|
|
try
|
|
{
|
|
result = _mesRepository.Update(spaceInfo);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logHelper.Error("更新货道信息异常", ex);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="shellStoreCode"></param>
|
|
/// <param name="linerStoreCode"></param>
|
|
/// <returns></returns>
|
|
public List<dynamic> GetMaterialStock(string shellStoreCode, string linerStoreCode)
|
|
{
|
|
List<dynamic> result = null;
|
|
|
|
try
|
|
{
|
|
var _db = _mesRepository.Context;
|
|
|
|
List<dynamic> query = _db.Queryable<dynamic>().AS("GET_STORE_MATERIALSTOCK").Where("STORE_CODE in (@shellStore,@linerStore) and SPACE_STOCK>0", new { shellStore = shellStoreCode, linerStore = linerStoreCode }).ToList();
|
|
|
|
if(query.Count > 0)
|
|
{
|
|
result = query.GroupBy(s => s.PARENT_NAME)
|
|
.Select(g => (dynamic)new MaterialStockDto
|
|
{
|
|
parentMaterialName = g.Key,
|
|
shellStock = g.Where(x => x.STORE_CODE == shellStoreCode).Select(x => x.SPACE_STOCK).FirstOrDefault(),
|
|
linerStock = g.Where(x => x.STORE_CODE == linerStoreCode).Select(x => x.SPACE_STOCK).FirstOrDefault()
|
|
}).ToList();
|
|
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logHelper.Error("获取物料库存异常", ex);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public List<BaseSpaceInfo> GetBaseSpaceInfosByMaterialType(string storeCode, string materialType)
|
|
{
|
|
List<BaseSpaceInfo> spaceInfos = null;
|
|
try
|
|
{
|
|
Expression<Func<BaseSpaceInfo, bool>> exp = s1 => true;
|
|
exp = exp.And(x => x.storeCode == storeCode && x.materialType == materialType && x.spaceStatus == 1); //相同型号、启用状态的货道信息
|
|
|
|
spaceInfos = _mesRepository.GetList(exp);
|
|
|
|
if (spaceInfos==null ||spaceInfos.Count == 0) //没有指定该类型物料的货道信息,需获取空白货道信息进行分配
|
|
{
|
|
spaceInfos = GetEmptySpaceInfo(storeCode);
|
|
}
|
|
// 如果是空板,没有空板货道且所有货道都有货,分配空白货道不成功,那么找启用状态的货道信息
|
|
if (materialType == "1111111111" && spaceInfos.Count==0)
|
|
{
|
|
Expression<Func<BaseSpaceInfo, bool>> exp1 = s1 => true;
|
|
exp = exp.And(x => x.storeCode == storeCode && x.spaceStatus == 1); //启用状态的货道信息
|
|
spaceInfos = _mesRepository.GetList(exp);
|
|
}
|
|
logHelper.Info($"根据仓库{storeCode};物料:{materialType};获取到的货道信息:{jsonChange.ModeToJson(spaceInfos)}");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logHelper.Error("获取货道信息异常", ex);
|
|
}
|
|
return spaceInfos;
|
|
}
|
|
}
|
|
} |