二楼空托到码垛线,库存报表变更

This commit is contained in:
2024-07-22 10:59:20 +08:00
parent 9c8d50022c
commit 401d921f49
6 changed files with 334 additions and 41 deletions

View File

@@ -90,6 +90,9 @@ namespace Tnb.ProductionMgr
private static Timer? PackOutstockServicetimer; private static Timer? PackOutstockServicetimer;
// 检查到电梯任务异常断开后处理 // 检查到电梯任务异常断开后处理
private Thread? ElevatorTaskExceptionHandleThread; private Thread? ElevatorTaskExceptionHandleThread;
// 二楼空托盘自动补充到线边
private static Timer? F2KTPsupplementtimer;
public SemaphoreSlim s_taskCheckGet = new(1); public SemaphoreSlim s_taskCheckGet = new(1);
public SemaphoreSlim s_taskScan = new(1); public SemaphoreSlim s_taskScan = new(1);
@@ -106,6 +109,7 @@ namespace Tnb.ProductionMgr
public SemaphoreSlim s_taskFloor4DMJ2MJXService = new(1); public SemaphoreSlim s_taskFloor4DMJ2MJXService = new(1);
public SemaphoreSlim s_taskFloor4MJX2MJCService = new(1); public SemaphoreSlim s_taskFloor4MJX2MJCService = new(1);
public SemaphoreSlim s_taskFloor4DMC2CPKService = new(1); public SemaphoreSlim s_taskFloor4DMC2CPKService = new(1);
public SemaphoreSlim s_taskF2KTPsupplement = new(1);
private StackExRedisHelper _redisData; private StackExRedisHelper _redisData;
private readonly IPrdInstockService _prdInstockService; private readonly IPrdInstockService _prdInstockService;
@@ -127,7 +131,8 @@ namespace Tnb.ProductionMgr
private ISqlSugarClient db_Floor4MJX2MJC; private ISqlSugarClient db_Floor4MJX2MJC;
private ISqlSugarClient db_Floor4DMC2CPK; private ISqlSugarClient db_Floor4DMC2CPK;
private ISqlSugarClient db_ElevatorTaskExceptionHandle; private ISqlSugarClient db_ElevatorTaskExceptionHandle;
private ISqlSugarClient db_F2KTPsupplement;
private readonly IWmsPDAScanInStockService _wmsPDAScanInStock; private readonly IWmsPDAScanInStockService _wmsPDAScanInStock;
private readonly IUserManager _userManager; private readonly IUserManager _userManager;
@@ -183,6 +188,7 @@ namespace Tnb.ProductionMgr
db_Floor4MJX2MJC = repository.CopyNew(); db_Floor4MJX2MJC = repository.CopyNew();
db_Floor4DMC2CPK = repository.CopyNew(); db_Floor4DMC2CPK = repository.CopyNew();
db_ElevatorTaskExceptionHandle = repository.CopyNew(); db_ElevatorTaskExceptionHandle = repository.CopyNew();
db_F2KTPsupplement = repository.CopyNew();
} }
#endregion #endregion
@@ -1922,13 +1928,11 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌仓到灭菌线"); Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌仓到灭菌线");
LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌仓到灭菌线"); LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌仓到灭菌线");
if (true)
{
return;
}
Dictionary<string, string[]> putdic = new Dictionary<string, string[]>(); Dictionary<string, string[]> putdic = new Dictionary<string, string[]>();
putdic.Add("SLD1", new string[] { "设备名", "信号" }); putdic.Add("MJQ-FAN01", new string[] { "4楼上料输送西区", "上料工位1请求送盘" });
putdic.Add("MJQ-FAN02", new string[] { "4楼上料输送西区", "上料工位2请求送盘" });
putdic.Add("MJQ-FAN03", new string[] { "4楼上料输送西区", "上料工位3请求送盘" });
putdic.Add("MJQ-FAN04", new string[] { "4楼上料输送西区", "上料工位4请求送盘" });
//Dictionary<BasLocation, string[]> putdic = new Dictionary<BasLocation, string[]>(); //Dictionary<BasLocation, string[]> putdic = new Dictionary<BasLocation, string[]>();
//List<BasLocation> endLocations = db_Floor4DMJ2MJX.Queryable<BasLocation>().Where(r => r.wh_id == WmsWareHouseConst.WAREHOUSE_DMJC_ID //List<BasLocation> endLocations = db_Floor4DMJ2MJX.Queryable<BasLocation>().Where(r => r.wh_id == WmsWareHouseConst.WAREHOUSE_DMJC_ID
@@ -1958,7 +1962,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
if (items.Count < 1) if (items.Count < 1)
{ {
LoggerFloor4DMJ2MJX.LogWarning($"【四楼待灭菌仓到灭菌线】 没有可以出库的载具"); LoggerFloor4DMJ2MJX.LogWarning($"【四楼待灭菌仓到灭菌线】 没有可以出库的载具");
break; break;
} }
BasLocation endlocation = await db_Floor4DMJ2MJX.Queryable<BasLocation>().Where(r => r.location_code == key).FirstAsync(); BasLocation endlocation = await db_Floor4DMJ2MJX.Queryable<BasLocation>().Where(r => r.location_code == key).FirstAsync();
@@ -2027,13 +2031,9 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌线到灭菌仓"); Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌线到灭菌仓");
LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌线到灭菌仓"); LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌线到灭菌仓");
if (true)
{
return;
}
Dictionary<string, string[]> getdic = new Dictionary<string, string[]>(); Dictionary<string, string[]> getdic = new Dictionary<string, string[]>();
getdic.Add("SLD1", new string[] { "设备名", "信号", "条码信号" }); getdic.Add("MJQ-QU02", new string[] { "4下上料输送西区", "下料工位2请求取盘", "下料工位2条码" });
getdic.Add("MJQ-QU01", new string[] { "4下上料输送西区", "下料工位1请求取盘", "下料工位1条码" });
//List<BasLocation> startLocations = db_Floor4MJX2MJC.Queryable<BasLocation>().Where(r => r.wh_id == WmsWareHouseConst.WAREHOUSE_MJC_ID //List<BasLocation> startLocations = db_Floor4MJX2MJC.Queryable<BasLocation>().Where(r => r.wh_id == WmsWareHouseConst.WAREHOUSE_MJC_ID
//&& r.is_type == ((int)EnumLocationType.分拣库位).ToString() && r.is_lock == 0).ToList(); //&& r.is_type == ((int)EnumLocationType.分拣库位).ToString() && r.is_lock == 0).ToList();
@@ -2051,7 +2051,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
bool result = await GetBoolTag(strs[0], strs[1]); bool result = await GetBoolTag(strs[0], strs[1]);
if (result) if (result)
{ {
LoggerFloor4MJX2MJC.LogInformation($"【四楼待灭菌线到灭菌仓】 料点 {key} {strs[1]}采集到 {result}"); LoggerFloor4MJX2MJC.LogInformation($"【四楼待灭菌线到灭菌仓】 料点 {key} {strs[1]}采集到 {result}");
InStockStrategyQuery inStockStrategyInput = new() InStockStrategyQuery inStockStrategyInput = new()
{ {
@@ -2070,7 +2070,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
BasLocation startlocation = await db_Floor4DMJ2MJX.Queryable<BasLocation>().Where(r => r.location_code == key).FirstAsync(); BasLocation startlocation = await db_Floor4DMJ2MJX.Queryable<BasLocation>().Where(r => r.location_code == key).FirstAsync();
BasLocation endlocation = items[0]; BasLocation endlocation = items[0];
string carry_code = ""; string carry_code = await GetStringTag(strs[0], strs[2]);
LoggerFloor4MJX2MJC.LogInformation($"【四楼待灭菌线到灭菌仓】 下料点 {key} {strs[2]}采集到 {carry_code}");
WmsCarryH wmsCarryH = await db_Floor4MJX2MJC.Queryable<WmsCarryH>().Where(r => r.carry_code == carry_code).FirstAsync(); WmsCarryH wmsCarryH = await db_Floor4MJX2MJC.Queryable<WmsCarryH>().Where(r => r.carry_code == carry_code).FirstAsync();
//锁定起点库位 //锁定起点库位
@@ -2160,7 +2161,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
if (wmsFloor4StewingConfig == null) if (wmsFloor4StewingConfig == null)
{ {
LoggerFloor4MJX2MJC.LogWarning($"【四楼灭菌仓到成品库】 未在静置仓配置中配置 静置时间(小时)"); LoggerFloor4DMC2CPK.LogWarning($"【四楼灭菌仓到成品库】 未在静置仓配置中配置 静置时间(小时)");
return; return;
} }
int hours = 168; int hours = 168;
@@ -2187,7 +2188,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
await db_Floor4DMC2CPK.Ado.BeginTranAsync(); await db_Floor4DMC2CPK.Ado.BeginTranAsync();
BasLocation startlocation = await db_Floor4DMJ2MJX.Queryable<BasLocation>().Where(r => r.id == wmsCarryH.location_id).FirstAsync(); BasLocation startlocation = await db_Floor4DMC2CPK.Queryable<BasLocation>().Where(r => r.id == wmsCarryH.location_id).FirstAsync();
InStockStrategyQuery inStockStrategyInput = new() InStockStrategyQuery inStockStrategyInput = new()
{ {
@@ -2253,6 +2254,107 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
} }
} }
/// <summary>
/// 二楼空托盘自动补充到线边
/// </summary>
/// <param name="args"></param>
private async void F2KTPsupplement(object? args)
{
if (s_taskF2KTPsupplement.CurrentCount == 0)
return;
await s_taskF2KTPsupplement.WaitAsync();
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
try
{
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行二楼空托盘自动补充到线边");
LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行二楼空托盘自动补充到线边");
Dictionary<string, string[]> putdic = new Dictionary<string, string[]>();
putdic.Add("ZZ-01-01", new string[] { "外包装箱码垛线", "WBZX_x1_AGV_fan" });
putdic.Add("ZZ-02-01", new string[] { "外包装箱码垛线", "WBZX_x2_AGV_fan" });
foreach (var key in putdic.Keys)
{
await db_F2KTPsupplement.Ado.BeginTranAsync();
var strs = putdic.Where(p => p.Key == key).First().Value;
bool result = await GetBoolTag(strs[0], strs[1]);
if (result)
{
LoggerF2KTPsupplement.LogInformation($"【二楼空托盘自动补充到线边】 上料点 {key} {strs[1]}采集到 {result}");
OutStockStrategyQuery outStockStrategyInput = new()
{
warehouse_id = WmsWareHouseConst.WAREHOUSE_F2KTQ_ID,
Size = 1
};
List<WmsCarryH> items = await _wareHouseService.OutStockStrategy(outStockStrategyInput);
if (items.Count < 1)
{
LoggerF2KTPsupplement.LogWarning($"【二楼空托盘自动补充到线边】 没有可以出库的空载具");
break;
}
BasLocation endlocation = await db_F2KTPsupplement.Queryable<BasLocation>().Where(r => r.location_code == key).FirstAsync();
if (endlocation.is_use == "1")
{
LoggerF2KTPsupplement.LogWarning($"【二楼空托盘自动补充到线边】 终点库位{endlocation.location_code}已占用");
continue;
}
if (endlocation.is_lock == 1)
{
LoggerF2KTPsupplement.LogWarning($"【二楼空托盘自动补充到线边】 终点库位{endlocation.location_code}已锁定");
continue;
}
WmsCarryH wmsCarryH = items[0];
//锁定起点库位
await db_F2KTPsupplement.Updateable<BasLocation>().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == wmsCarryH.location_id).ExecuteCommandAsync();
//锁定终点库位
await db_F2KTPsupplement.Updateable<BasLocation>().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == endlocation.id).ExecuteCommandAsync();
bool result_createPretask = await createPretask(wmsCarryH.location_id, endlocation.id, wmsCarryH.id, wmsCarryH.carry_code, LoggerF2KTPsupplement, db_F2KTPsupplement);
if (!result_createPretask)
{
LoggerF2KTPsupplement.LogWarning($"【二楼空托盘自动补充到线边】 {wmsCarryH.location_code} 到 {endlocation.location_code} 预任务生成失败");
throw new Exception($"【二楼空托盘自动补充到线边】 {wmsCarryH.location_code} 到 {endlocation.location_code} 预任务生成失败");
}
LoggerF2KTPsupplement.LogInformation($"【二楼空托盘自动补充到线边】 {wmsCarryH.location_code} 到 {endlocation.location_code} 预任务生成成功");
}
await db_F2KTPsupplement.Ado.CommitTranAsync();
}
_ = _wareHouseService.GenTaskExecute();
}
catch (ObjectDisposedException ex)
{
LoggerF2KTPsupplement.LogError($"【二楼空托盘自动补充到线边】 数据库连接异常:{ex.Message}");
LoggerF2KTPsupplement.LogError($"【二楼空托盘自动补充到线边】 数据库连接异常:{ex.StackTrace}");
if (ex.Source == "Npgsql")
db_F2KTPsupplement = _repository.AsSugarClient().CopyNew();
}
catch (Exception ex)
{
Console.WriteLine("【二楼空托盘自动补充到线边】" + ex.Message);
LoggerF2KTPsupplement.LogError($"【二楼空托盘自动补充到线边】 {ex.Message}");
LoggerF2KTPsupplement.LogError($"【二楼空托盘自动补充到线边】 {ex.StackTrace}");
// 数据库连接断开时会报错
try { await db_F2KTPsupplement.Ado.RollbackTranAsync(); } catch { };
}
finally
{
s_taskF2KTPsupplement.Release();
if (!db_F2KTPsupplement.Ado.Transaction.IsNull())
try { await db_F2KTPsupplement.Ado.CommitTranAsync(); } catch { };
_wareHouseService.GenTaskExecute();
stopwatch.Stop();
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 结束二楼空托盘自动补充到线边 {stopwatch.ElapsedMilliseconds} ms");
LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 结束二楼空托盘自动补充到线边 {stopwatch.ElapsedMilliseconds} ms");
}
}
#endregion #endregion
public Task StartAsync(CancellationToken cancellationToken) public Task StartAsync(CancellationToken cancellationToken)
@@ -2287,10 +2389,11 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
ElevatorTaskExceptionHandleThread = new Thread(ElevatorTaskExceptionHandle); ElevatorTaskExceptionHandleThread = new Thread(ElevatorTaskExceptionHandle);
ElevatorTaskExceptionHandleThread.Start(); ElevatorTaskExceptionHandleThread.Start();
//Floor4DMJ2MJXtimer = new Timer(Floor4DMJ2MJX, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); Floor4DMJ2MJXtimer = new Timer(Floor4DMJ2MJX, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
//Floor4MJX2MJCtimer = new Timer(Floor4MJX2MJC, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); Floor4MJX2MJCtimer = new Timer(Floor4MJX2MJC, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
//Floor4DMC2CPKtimer = new Timer(Floor4DMC2CPK, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); Floor4DMC2CPKtimer = new Timer(Floor4DMC2CPK, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
F2KTPsupplementtimer = new Timer(F2KTPsupplement, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
return Task.CompletedTask; return Task.CompletedTask;
} }
@@ -2321,6 +2424,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
Floor4MJX2MJCtimer?.Dispose(); Floor4MJX2MJCtimer?.Dispose();
Floor4DMC2CPKtimer?.Dispose(); Floor4DMC2CPKtimer?.Dispose();
ElevatorTaskExceptionHandleThread.Abort(); ElevatorTaskExceptionHandleThread.Abort();
F2KTPsupplementtimer?.Dispose();
} }
#region #region
@@ -2710,6 +2815,40 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
return _LoggerFloor4DMC2CPK; return _LoggerFloor4DMC2CPK;
} }
} }
protected string _LoggerF2KTPsupplementFileName = "";
protected ILogger _LoggerF2KTPsupplement;
protected ILogger LoggerF2KTPsupplement
{
get
{
string newFileName = $"{AppContext.BaseDirectory}/logs/custom二楼空托盘补充{DateTime.Now:yyyyMMdd}.log";
if (_LoggerF2KTPsupplementFileName != newFileName)
{
ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder.AddFile(newFileName, cfgOpts =>
{
//cfgOpts.DateFormat = "yyyy-MM-dd HH:mm:ss.fff";
cfgOpts.MessageFormat = (logMsg) =>
{
var logLevel = s_logLevelMap[logMsg.LogLevel];
var sb = new StringBuilder();
_ = sb.Append($"[{logLevel}] ");
_ = sb.Append($"{logMsg.LogName} ");
_ = sb.Append($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} ");
_ = sb.Append($"#{logMsg.EventId.Id} ");
_ = sb.Append(logMsg.Message + " ");
_ = sb.Append(logMsg.Exception?.ToString());
return sb.ToString();
};
}));
_LoggerF2KTPsupplement = loggerFactory.CreateLogger(this.GetType());
_LoggerF2KTPsupplementFileName = newFileName;
}
return _LoggerF2KTPsupplement;
}
}
#endregion #endregion
} }
} }

View File

@@ -472,8 +472,20 @@
/// <summary> /// <summary>
/// 一楼中储仓入库工位 /// 一楼中储仓入库工位
/// </summary> /// </summary>
public const string ZZCSSX021007 = "32609215284757";
/// <summary>
/// 一楼中储仓入库工位
/// </summary>
public const string ZZCSSX011008 = "32609223625237"; public const string ZZCSSX011008 = "32609223625237";
/// <summary> /// <summary>
/// 一楼中储仓入库工位
/// </summary>
public const string ZZCSSX121009 = "32609229889045";
/// <summary>
/// 一楼中储仓入库工位
/// </summary>
public const string ZZCSSX121010 = "32609238573589";
/// <summary>
/// 料箱id /// 料箱id
/// </summary> /// </summary>
public const string LIAOXIANGID = "26037262680357"; public const string LIAOXIANGID = "26037262680357";

View File

@@ -49,6 +49,10 @@
/// ///
/// </summary> /// </summary>
public string? material_code { get; set; } public string? material_code { get; set; }
/// <summary>
///
/// </summary>
public string[] endlocations { get; set; }
} }
} }

View File

@@ -586,7 +586,7 @@ namespace Tnb.WarehouseMgr
List<Tuple<WmsCarryH, decimal, BasLocation>>? carrys = new List<Tuple<WmsCarryH, decimal, BasLocation>>(); List<Tuple<WmsCarryH, decimal, BasLocation>>? carrys = new List<Tuple<WmsCarryH, decimal, BasLocation>>();
// 6个下发一条任务链 // 6个下发一条任务链
int move_num = 6; int move_num = 6;
int endlocation_index = 0; int endlocation_index = 0;
BasLocation endlocation_ssx = null; BasLocation endlocation_ssx = null;
@@ -602,7 +602,7 @@ namespace Tnb.WarehouseMgr
// 每6个重新获取一次终点 // 每6个重新获取一次终点
if (i % move_num == 0) if (i % move_num == 0)
if (i % move_num == 0) {
endlocation_ssx = await _db.Queryable<BasLocation>().Where(r => input.endlocations.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync(); endlocation_ssx = await _db.Queryable<BasLocation>().Where(r => input.endlocations.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync();
} }

View File

@@ -38,13 +38,13 @@ namespace Tnb.WarehouseMgr
public async Task<dynamic> CarryStock(CarryStockInput input) public async Task<dynamic> CarryStock(CarryStockInput input)
{ {
var warehouse_id = ""; var warehouse_id = "";
var carry_id = ""; var carry_code = "";
var material_id = ""; var material_code = "";
if (!input.queryJson.IsNullOrWhiteSpace()) if (!input.queryJson.IsNullOrWhiteSpace())
{ {
warehouse_id = JObject.Parse(input.queryJson).Value<string>(nameof(WmsCarryCode.warehouse_id)); warehouse_id = JObject.Parse(input.queryJson).Value<string>(nameof(WmsCarryCode.warehouse_id));
carry_id = JObject.Parse(input.queryJson).Value<string>(nameof(WmsCarryCode.carry_id)); carry_code = JObject.Parse(input.queryJson).Value<string>(nameof(WmsCarryCode.carry_code));
material_id = JObject.Parse(input.queryJson).Value<string>(nameof(WmsCarryCode.material_id)); material_code = JObject.Parse(input.queryJson).Value<string>(nameof(WmsCarryCode.material_code));
} }
@@ -58,8 +58,8 @@ namespace Tnb.WarehouseMgr
.Where((a, b, c, d, e) => a.is_type == ((int)EnumLocationType.).ToString() && a.is_use == "1" .Where((a, b, c, d, e) => a.is_type == ((int)EnumLocationType.).ToString() && a.is_use == "1"
&& ((!string.IsNullOrEmpty(b.carry_code) && b.carry_status != "0" && b.carry_status != "6") || string.IsNullOrEmpty(b.carry_code))) && ((!string.IsNullOrEmpty(b.carry_code) && b.carry_status != "0" && b.carry_status != "6") || string.IsNullOrEmpty(b.carry_code)))
.WhereIF(!string.IsNullOrEmpty(warehouse_id), (a, b, c, d) => c.id == warehouse_id) .WhereIF(!string.IsNullOrEmpty(warehouse_id), (a, b, c, d) => c.id == warehouse_id)
.WhereIF(!string.IsNullOrEmpty(carry_id), (a, b, c, d) => b.id == carry_id) .WhereIF(!string.IsNullOrEmpty(carry_code), (a, b, c, d) => b.carry_code.Contains(carry_code))
.WhereIF(!string.IsNullOrEmpty(material_id), (a, b, c, d, e, f) => f.id == material_id) .WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e, f) => f.code.Contains(material_code))
.OrderByDescending((a, b, c, d, e, f) => b.carry_code) .OrderByDescending((a, b, c, d, e, f) => b.carry_code)
.Select((a, b, c, d, e, f) => new WmsCarryStockReport .Select((a, b, c, d, e, f) => new WmsCarryStockReport
{ {
@@ -97,8 +97,8 @@ namespace Tnb.WarehouseMgr
.InnerJoin<WmsCarryH>((a, b, c, d, e, f, g, h) => h.id == e.membercarry_id) .InnerJoin<WmsCarryH>((a, b, c, d, e, f, g, h) => h.id == e.membercarry_id)
.Where((a, b, c, d, e) => a.is_type == ((int)EnumLocationType.).ToString() && a.is_use == "1" && b.carry_status != "0" && b.carry_status != "6") .Where((a, b, c, d, e) => a.is_type == ((int)EnumLocationType.).ToString() && a.is_use == "1" && b.carry_status != "0" && b.carry_status != "6")
.WhereIF(!string.IsNullOrEmpty(warehouse_id), (a, b, c, d) => c.id == warehouse_id) .WhereIF(!string.IsNullOrEmpty(warehouse_id), (a, b, c, d) => c.id == warehouse_id)
.WhereIF(!string.IsNullOrEmpty(carry_id), (a, b, c, d, e) => b.id == carry_id || e.membercarry_id == carry_id) .WhereIF(!string.IsNullOrEmpty(carry_code), (a, b, c, d, e, f, g, h) => b.carry_code.Contains(carry_code)|| h.carry_code.Contains(carry_code))
.WhereIF(!string.IsNullOrEmpty(material_id), (a, b, c, d, e, f, g) => g.id == material_id) .WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e, f, g) => g.code.Contains(material_code))
.Select((a, b, c, d, e, f, g, h) => new WmsCarryStockReport .Select((a, b, c, d, e, f, g, h) => new WmsCarryStockReport
{ {
warehouse_name = c.whname, warehouse_name = c.whname,

View File

@@ -67,6 +67,8 @@ namespace Tnb.WarehouseMgr
public static SemaphoreSlim s_taskDistributeToZCC = new(1); public static SemaphoreSlim s_taskDistributeToZCC = new(1);
public static SemaphoreSlim s_taskDistributeYCL2ZCC = new(1); public static SemaphoreSlim s_taskDistributeYCL2ZCC = new(1);
public static SemaphoreSlim s_taskDistributeZCCToYCL = new(1);
public WmsMaterialTransferService( public WmsMaterialTransferService(
ISqlSugarRepository<WmsCarryH> repository, ISqlSugarRepository<WmsCarryH> repository,
@@ -291,7 +293,6 @@ namespace Tnb.WarehouseMgr
} }
} }
/// <summary> /// <summary>
/// 按托下发(到集中供料或外协) /// 按托下发(到集中供料或外协)
/// </summary> /// </summary>
@@ -439,7 +440,7 @@ namespace Tnb.WarehouseMgr
/// <param name="input"></param> /// <param name="input"></param>
/// <returns></returns> /// <returns></returns>
[HttpPost, NonUnify, AllowAnonymous] [HttpPost, NonUnify, AllowAnonymous]
public async Task<Entities.Dto.Outputs.Result> DistributeYCL2ZCC(MaterialTransferDistributeYCL2ZCCInput input) public async Task<Entities.Dto.Outputs.Result> DistributeYCLToZCC(MaterialTransferDistributeYCL2ZCCInput input)
{ {
try try
{ {
@@ -936,6 +937,8 @@ namespace Tnb.WarehouseMgr
throw Oops.Oh(ErrorCode.COM1001); throw Oops.Oh(ErrorCode.COM1001);
} }
await _db.Ado.CommitTranAsync();
if (input.area_code == "E") if (input.area_code == "E")
await sign(input); await sign(input);
@@ -945,6 +948,7 @@ namespace Tnb.WarehouseMgr
} }
// 其它出库 // 其它出库
else
{ {
WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable<WmsMaterialTransfer>().SingleAsync(x => x.id == wmsMaterialTransferd.bill_id); WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable<WmsMaterialTransfer>().SingleAsync(x => x.id == wmsMaterialTransferd.bill_id);
List<WmsMaterialTransferD> dList = await _db.Queryable<WmsMaterialTransferD>().Where(x => x.bill_id == wmsMaterialTransferd.bill_id).OrderBy(x => x.id).ToListAsync(); List<WmsMaterialTransferD> dList = await _db.Queryable<WmsMaterialTransferD>().Where(x => x.bill_id == wmsMaterialTransferd.bill_id).OrderBy(x => x.id).ToListAsync();
@@ -1027,16 +1031,12 @@ namespace Tnb.WarehouseMgr
await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync(); await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync();
} }
await _db.Ado.CommitTranAsync();
} }
catch(Exception ex) catch(Exception ex)
{ {
Logger.LogError("【WmsMaterialTransferService ModifyAsync】" + ex.Message); Logger.LogError("【WmsMaterialTransferService ModifyAsync】" + ex.Message);
Logger.LogError("【WmsMaterialTransferService ModifyAsync】" + ex.StackTrace); Logger.LogError("【WmsMaterialTransferService ModifyAsync】" + ex.StackTrace);
await _db.Ado.RollbackTranAsync(); //await _db.Ado.RollbackTranAsync();
} }
} }
@@ -1100,11 +1100,11 @@ namespace Tnb.WarehouseMgr
material_id = wmsMaterialTransferD.material_id, material_id = wmsMaterialTransferD.material_id,
code_batch = wmsMaterialTransferD.code_batch, code_batch = wmsMaterialTransferD.code_batch,
needOut = needOut, needOut = needOut,
material_code = wmsMaterialTransferD.material_code material_code = wmsMaterialTransferD.material_code,
endlocations = new string[2] { WmsWareHouseConst.ZZCSSX121009, WmsWareHouseConst.ZZCSSX121010 }
}; };
List<Tuple<WmsCarryH, decimal, BasLocation>>? carrys = await _wareHouseService.OutStockStrategyZCC2Floor2(OutStockStrategyInput);
List<Tuple<WmsCarryH, decimal, BasLocation>>? carrys = await _wareHouseService.OutStockStrategyZCC2Floor2(OutStockStrategyInput);
foreach (var item in carrys) foreach (var item in carrys)
{ {
@@ -1183,6 +1183,144 @@ namespace Tnb.WarehouseMgr
return await ToApiResult(HttpStatusCode.OK, "成功"); return await ToApiResult(HttpStatusCode.OK, "成功");
} }
/// <summary>
/// 中储仓退料到原材料仓
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="AppFriendlyException"></exception>
[HttpPost, NonUnify, AllowAnonymous]
public async Task<Entities.Dto.Outputs.Result> DistributeZCCToYCL(MaterialTransferDistributeToZCCInput input)
{
s_taskDistributeZCCToYCL.Wait();
try
{
WmsMaterialTransfer wmsMaterialTransfer = _db.Queryable<WmsMaterialTransfer>().Where(r => r.id == input.source_id).First();
if (wmsMaterialTransfer == null)
{
Logger.LogWarning($"不存在id为{input.source_id}的转库单!");
throw new AppFriendlyException($"不存在id为{input.source_id}的转库单!", 500);
}
if (wmsMaterialTransfer.status != WmsWareHouseConst.BILLSTATUS_ADD_ID)
{
Logger.LogWarning($@"当前转库单状态为{wmsMaterialTransfer.status},不能下发中储仓退料到原材料仓任务!");
throw new AppFriendlyException($@"当前转库单状态为{wmsMaterialTransfer.status},不能下发中储仓退料到原材料仓任务!", 500);
}
List<WmsMaterialTransferD> wmsMaterialTransferds = _db.Queryable<WmsMaterialTransferD>().Where(r => r.bill_id == input.source_id).ToList();
var wmsMaterialTransferdsDistinct = wmsMaterialTransferds.Select(r => new
{
material_id = r.material_id,
code_batch = r.code_batch,
}).Distinct();
if (wmsMaterialTransferdsDistinct.Count() < wmsMaterialTransferds.Count)
{
Logger.LogWarning($@"转库单{wmsMaterialTransfer.bill_code}表体存在物料和批号重复的明细!");
throw new AppFriendlyException($@"转库单{wmsMaterialTransfer.bill_code}表体存在物料和批号重复的明细!", 500);
}
// 转库单载具子表
List<WmsMaterialTransferCarry> wmsMaterialTransferCarrys = new List<WmsMaterialTransferCarry>();
foreach (WmsMaterialTransferD wmsMaterialTransferD in wmsMaterialTransferds)
{
// 需要转库数量
decimal? needOut = wmsMaterialTransferD.qty;
//出库取起点,获取所有符合输入的载具规格的载具
OutStockStrategyZCC2Floor2Query OutStockStrategyInput = new()
{
warehouse_id = "2",
material_id = wmsMaterialTransferD.material_id,
code_batch = wmsMaterialTransferD.code_batch,
needOut = needOut,
material_code = wmsMaterialTransferD.material_code,
endlocations = new string[] {WmsWareHouseConst.ZZCSSX021007 }
};
List<Tuple<WmsCarryH, decimal, BasLocation>>? carrys = await _wareHouseService.OutStockStrategyZCC2Floor2(OutStockStrategyInput);
foreach (var item in carrys)
{
WmsCarryH wmsCarryH = item.Item1;
decimal codeqty = item.Item2;
BasLocation endlocation_ssx = item.Item3;
// 转库单载具子表
WmsMaterialTransferCarry wmsMaterialTransferCarry = new WmsMaterialTransferCarry();
wmsMaterialTransferCarry.bill_id = input.source_id;
wmsMaterialTransferCarry.carry_id = wmsCarryH.id;
wmsMaterialTransferCarry.carry_code = wmsCarryH.carry_code;
wmsMaterialTransferCarry.create_id = input.create_id;
wmsMaterialTransferCarry.create_time = DateTime.Now;
wmsMaterialTransferCarry.endlocation_id = endlocation_ssx.id;
wmsMaterialTransferCarry.endlocation_code = endlocation_ssx.location_code;
wmsMaterialTransferCarry.startlocation_id = wmsCarryH.location_id;
wmsMaterialTransferCarry.startlocation_code = wmsCarryH.location_code;
wmsMaterialTransferCarry.mat_bill_id = wmsMaterialTransferD.id;
wmsMaterialTransferCarry.qty = codeqty;
wmsMaterialTransferCarrys.Add(wmsMaterialTransferCarry);
}
}
await _db.Ado.BeginTranAsync();
await _db.Updateable<WmsMaterialTransfer>().SetColumns(r => new WmsMaterialTransfer
{
status = WmsWareHouseConst.BILLSTATUS_ON_ID,
carry_count = wmsMaterialTransferCarrys.Count,
remainbindracknum = wmsMaterialTransferCarrys.Count
}).Where(r => r.id == input.source_id).ExecuteCommandAsync();
Logger.LogInformation($"【DistributeZCCToYCL】更新转库单{wmsMaterialTransfer.bill_code}主表的数据");
await _db.Insertable(wmsMaterialTransferCarrys).ExecuteCommandAsync();
Logger.LogInformation($"【DistributeZCCToYCL】插入转库单{wmsMaterialTransfer.bill_code}载具表的数据");
foreach (WmsMaterialTransferCarry wmsMaterialTransferCarry in wmsMaterialTransferCarrys)
{
CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput();
commonCreatePretaskInput.startlocation_id = wmsMaterialTransferCarry.startlocation_id;
commonCreatePretaskInput.endlocation_id = wmsMaterialTransferCarry.endlocation_id;
commonCreatePretaskInput.carry_id = wmsMaterialTransferCarry.carry_id;
commonCreatePretaskInput.carry_code = wmsMaterialTransferCarry.carry_code;
commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID;
commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID;
commonCreatePretaskInput.source_id = wmsMaterialTransferCarry.mat_bill_id;
commonCreatePretaskInput.isExcuteMission = false;
var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput);
if (res.code != JNPF.Common.Enums.HttpStatusCode.OK)
{
Logger.LogInformation($"【DistributeZCCToYCL生成预任务失败 载具 {wmsMaterialTransferCarry.carry_code}");
throw new AppFriendlyException($"生成预任务失败 载具 {wmsMaterialTransferCarry.carry_code}", 500);
}
await _db.Updateable<WmsMaterialTransferD>().SetColumns(r => r.yxfqty == r.yxfqty + wmsMaterialTransferCarry.qty).Where(r => r.id == wmsMaterialTransferCarry.mat_bill_id).ExecuteCommandAsync();
}
Logger.LogInformation($"转库单{wmsMaterialTransfer.bill_code}预任务{wmsMaterialTransferCarrys.Count}条全部生成成功");
await _db.Ado.CommitTranAsync();
}
catch (Exception ex)
{
await _db.Ado.RollbackTranAsync();
Logger.LogError("【DistributeZCCToYCL】" + ex.Message);
Logger.LogError("【DistributeZCCToYCL】" + ex.StackTrace);
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
}
finally
{
s_taskDistributeZCCToYCL.Release();
InvokeGenPretaskExcute();
}
return await ToApiResult(HttpStatusCode.OK, "成功");
}
/// <summary> /// <summary>
/// 从暂存仓呼叫料架到产线 /// 从暂存仓呼叫料架到产线
/// </summary> /// </summary>