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 & & x . inStoreFlag = = 1 ) ;
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 & & x . outStoreFlag = = 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 & & x . inStoreFlag = = 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 ;
}
}
}