From 2a4d6e8ff51ba28be3a0cd808a544023d346bba7 Mon Sep 17 00:00:00 2001
From: majian <780924089@qq.com>
Date: Thu, 1 Aug 2024 10:47:24 +0800
Subject: [PATCH 1/3] =?UTF-8?q?=E8=B0=83=E6=8B=A8=E5=87=BA=E5=BA=93?=
=?UTF-8?q?=E5=8D=95=E5=90=8C=E6=AD=A5=E8=B0=83=E6=95=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Dto/ErpInputs/TransferOutstockInput.cs | 12 +++++++++++-
.../Entity/WmsRawmatTransferinstockH.cs | 10 ++++++++++
WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs | 4 +++-
3 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/TransferOutstockInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/TransferOutstockInput.cs
index 51b84b39..4eea13b3 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/TransferOutstockInput.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/TransferOutstockInput.cs
@@ -11,7 +11,7 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs
///
/// 单号
///
- public string? outsource_order { get; set; }
+ public string? transfer_order { get; set; }
///
/// 联系人
@@ -23,6 +23,16 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs
///
public string? tel { get; set; }
+ ///
+ /// 部门编码
+ ///
+ public string? dept_code { get; set; }
+
+ ///
+ /// 业务员编码
+ ///
+ public string? biller { get; set; }
+
///
/// 出库组织编号
///
diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferinstockH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferinstockH.cs
index f53d0e64..c5c735cd 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferinstockH.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferinstockH.cs
@@ -109,4 +109,14 @@ public partial class WmsRawmatTransferinstockH : BaseEntity
///
public string? erp_bill_code { get; set; }
+ ///
+ /// 部门编码
+ ///
+ public string? dept_code { get; set; }
+
+ ///
+ /// 业务员编码
+ ///
+ public string? biller { get; set; }
+
}
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs b/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs
index fc3fe93a..029d0687 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs
@@ -849,13 +849,15 @@ namespace Tnb.WarehouseMgr
Code = await _billRuleService.GetBillNumber("WmsRawMatTransferInstock");
wmsRawmatTransferinstockH.bill_code = Code;
- wmsRawmatTransferinstockH.erp_bill_code = input.outsource_order;
+ wmsRawmatTransferinstockH.erp_bill_code = input.transfer_order;
wmsRawmatTransferinstockH.contact_person = input.contact_person;
wmsRawmatTransferinstockH.tel = input.tel;
wmsRawmatTransferinstockH.outstockorg_code = input.outstockorg_code;
wmsRawmatTransferinstockH.erp_pk = input.erp_pk;
wmsRawmatTransferinstockH.create_id = WmsWareHouseConst.ErpUserId;
wmsRawmatTransferinstockH.create_time = DateTime.Now;
+ wmsRawmatTransferinstockH.dept_code = input.dept_code;
+ wmsRawmatTransferinstockH.biller = input.biller;
await db.Insertable(wmsRawmatTransferinstockH).ExecuteCommandAsync();
From 5693ef6ed2cd3efdfacb7c41940b92c1fed4cb52 Mon Sep 17 00:00:00 2001
From: majian <780924089@qq.com>
Date: Thu, 1 Aug 2024 13:57:29 +0800
Subject: [PATCH 2/3] =?UTF-8?q?=E5=8E=9F=E6=9D=90=E6=96=99=E4=BB=93?=
=?UTF-8?q?=E3=80=81=E4=B8=AD=E5=82=A8=E4=BB=93=E5=87=BA=E5=85=A5=E5=BA=93?=
=?UTF-8?q?=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Tnb.WarehouseMgr/BaseWareHouseService.cs | 3 ++
.../Tnb.WarehouseMgr/DeviceProviderService.cs | 9 +-----
.../Tnb.WarehouseMgr/WareHouseService.cs | 15 ++++++++++
.../WmsEmptyInstockService.cs | 8 +++++
.../WmsEmptyOutstockService .cs | 9 +++++-
.../WmsMaterialTransferService.cs | 12 ++++----
.../WmsPDAEmptyInstockService.cs | 9 +++++-
.../WmsPDAEmptyOutstockService .cs | 8 +++++
.../Tnb.WarehouseMgr/WmsPrdInstockHService.cs | 29 ++++++++++++++++++-
9 files changed, 85 insertions(+), 17 deletions(-)
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs
index 977a1e94..4a97c259 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs
@@ -52,6 +52,9 @@ namespace Tnb.WarehouseMgr
public static SemaphoreSlim _s_taskExecuteSemaphore_YCLOutstock = new(1);
+ public static SemaphoreSlim _s_taskExecuteSemaphore_F1ZCCInstock = new(1);
+ public static SemaphoreSlim _s_taskExecuteSemaphore_F1ZCCOutstock = new(1);
+
protected static Dictionary _s_eleUseStatusDic;
protected IEventPublisher? EventPublisher { set; get; }
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs
index 44a4019e..7e580996 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs
@@ -698,14 +698,7 @@ namespace Tnb.WarehouseMgr
{
var disTask = await _db.Queryable().FirstAsync(it => it.bill_code == input.taskCode);
- /* 20240627 记录异常情况: WCS给我们发取货完成信号之后,如果我们返回了异常 WCS会一直重试20次,但是AGV已经取货走了,并成功送到库位,此时会给我们反馈放货信号,
- * 但是由于取货信号一直返回异常,WCS还是会一直重试,会出现我们收到到货信号后又会收到取货信号的异常情况,这里加个任务执行状态判断,用于避免这种情况
- */
- //if (disTask.status == WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID)
- //{
- // return await ToApiResult(HttpStatusCode.OK, "此任务");
- //}
-
+
Logger.Information($"【TaskCallback】 【接收】{input.taskCode} WCS信号 任务状态上报->接收参数:{JsonConvert.SerializeObject(input)}");
try
{
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs
index d36b6cb1..e844aa43 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs
@@ -98,6 +98,17 @@ namespace Tnb.WarehouseMgr
get { return _s_taskExecuteSemaphore_YCLOutstock; }
}
+ public SemaphoreSlim s_taskExecuteSemaphore_F1ZCCInstock
+ {
+ get { return _s_taskExecuteSemaphore_F1ZCCInstock; }
+ }
+
+ public SemaphoreSlim s_taskExecuteSemaphore_F1ZCCOutstock
+ {
+ get { return _s_taskExecuteSemaphore_F1ZCCOutstock; }
+ }
+
+
public WareHouseService(ISqlSugarRepository repository, IDictionaryDataService dictionaryDataService, StackExRedisHelper redisData,
IBillRullService billRullService, IUserManager userManager, ICacheManager cacheManager, IElevatorControlService elevatorControlService,
IWmsCarryBindService wmsCarryBindService,
@@ -3226,6 +3237,9 @@ namespace Tnb.WarehouseMgr
BasLocation startLocation = null;
int index = 0;
+
+ await _s_taskExecuteSemaphore_F1ZCCInstock.WaitAsync();
+
await _db.Ado.BeginTranAsync();
foreach (WmsCarryD wmsCarryD in wmsCarryCodes)
{
@@ -3316,6 +3330,7 @@ namespace Tnb.WarehouseMgr
}
finally
{
+ _s_taskExecuteSemaphore_F1ZCCInstock.Release();
s_floor2CreatePretask.Release();
}
}
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyInstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyInstockService.cs
index 39295b61..c1c8d476 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyInstockService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyInstockService.cs
@@ -68,6 +68,10 @@ namespace Tnb.WarehouseMgr
}
public async Task WmsEmptyIn(VisualDevModelDataCrInput input)
{
+ if (input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString() == WmsWareHouseConst.WAREHOUSE_ZC_ID)
+ {
+ await _s_taskExecuteSemaphore_F1ZCCInstock.WaitAsync();
+ }
try
{
await _db.Ado.BeginTranAsync();
@@ -217,6 +221,10 @@ namespace Tnb.WarehouseMgr
}
finally
{
+ if (input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString() == WmsWareHouseConst.WAREHOUSE_ZC_ID)
+ {
+ _s_taskExecuteSemaphore_F1ZCCInstock.Release();
+ }
//向队列写入消息
await InvokeGenPretaskExcute();
}
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs
index 0dc25481..aface6f8 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs
@@ -65,7 +65,10 @@ namespace Tnb.WarehouseMgr
public async Task WmsEmptyOut(VisualDevModelDataCrInput input)
{
-
+ if (input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString() == WmsWareHouseConst.WAREHOUSE_ZC_ID)
+ {
+ await _s_taskExecuteSemaphore_F1ZCCOutstock.WaitAsync();
+ }
try
{
await _db.Ado.BeginTranAsync();
@@ -257,6 +260,10 @@ namespace Tnb.WarehouseMgr
}
finally
{
+ if (input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString() == WmsWareHouseConst.WAREHOUSE_ZC_ID)
+ {
+ _s_taskExecuteSemaphore_F1ZCCOutstock.Release();
+ }
await InvokeGenPretaskExcute();
}
return Task.FromResult(true);
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs
index 94f7b913..101b9668 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs
@@ -468,7 +468,7 @@ namespace Tnb.WarehouseMgr
}
});
- await s_taskDistributeYCL2ZCC.WaitAsync();
+ await _s_taskExecuteSemaphore_F1ZCCInstock.WaitAsync();
WmsMaterialTransferD wmsMaterialTransferD = await _db.Queryable().FirstAsync(it => it.id == input.source_id);
WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable().FirstAsync(it => it.id == wmsMaterialTransferD.bill_id);
@@ -561,7 +561,7 @@ namespace Tnb.WarehouseMgr
}
finally
{
- _ = s_taskDistributeYCL2ZCC.Release();
+ _s_taskExecuteSemaphore_F1ZCCInstock.Release();
InvokeGenPretaskExcute();
}
@@ -1111,7 +1111,7 @@ namespace Tnb.WarehouseMgr
[HttpPost, NonUnify, AllowAnonymous]
public async Task DistributeToZCC(MaterialTransferDistributeToZCCInput input)
{
- s_taskDistributeToZCC.Wait();
+ await _s_taskExecuteSemaphore_F1ZCCOutstock.WaitAsync();
try
{
@@ -1239,7 +1239,7 @@ namespace Tnb.WarehouseMgr
}
finally
{
- s_taskDistributeToZCC.Release();
+ _s_taskExecuteSemaphore_F1ZCCOutstock.Release();
InvokeGenPretaskExcute();
}
return await ToApiResult(HttpStatusCode.OK, "成功");
@@ -1254,7 +1254,7 @@ namespace Tnb.WarehouseMgr
[HttpPost, NonUnify, AllowAnonymous]
public async Task DistributeZCCToYCL(MaterialTransferDistributeToZCCInput input)
{
- s_taskDistributeZCCToYCL.Wait();
+ await _s_taskExecuteSemaphore_F1ZCCOutstock.WaitAsync();
try
{
@@ -1375,7 +1375,7 @@ namespace Tnb.WarehouseMgr
}
finally
{
- s_taskDistributeZCCToYCL.Release();
+ _s_taskExecuteSemaphore_F1ZCCOutstock.Release(); ;
InvokeGenPretaskExcute();
}
return await ToApiResult(HttpStatusCode.OK, "成功");
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAEmptyInstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAEmptyInstockService.cs
index 387af090..1b46ef5e 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAEmptyInstockService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAEmptyInstockService.cs
@@ -57,7 +57,10 @@ namespace Tnb.WarehouseMgr
private async Task PDAWmsEmptyIn(VisualDevModelDataCrInput input)
{
-
+ if (input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString() == WmsWareHouseConst.WAREHOUSE_ZC_ID)
+ {
+ await _s_taskExecuteSemaphore_F1ZCCInstock.WaitAsync();
+ }
try
{
await _db.Ado.BeginTranAsync();
@@ -178,6 +181,10 @@ namespace Tnb.WarehouseMgr
}
finally
{
+ if (input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString() == WmsWareHouseConst.WAREHOUSE_ZC_ID)
+ {
+ _s_taskExecuteSemaphore_F1ZCCInstock.Release();
+ }
await InvokeGenPretaskExcute();
}
return Task.FromResult(true);
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAEmptyOutstockService .cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAEmptyOutstockService .cs
index 8a95534d..1c580d87 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAEmptyOutstockService .cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAEmptyOutstockService .cs
@@ -59,6 +59,10 @@ namespace Tnb.WarehouseMgr
private async Task PDAWmsEmptyOut(VisualDevModelDataCrInput input)
{
+ if (input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString() == WmsWareHouseConst.WAREHOUSE_ZC_ID)
+ {
+ await _s_taskExecuteSemaphore_F1ZCCOutstock.WaitAsync();
+ }
try
{
Logger.Information("开始PDA空载具出库");
@@ -231,6 +235,10 @@ namespace Tnb.WarehouseMgr
}
finally
{
+ if (input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString() == WmsWareHouseConst.WAREHOUSE_ZC_ID)
+ {
+ _s_taskExecuteSemaphore_F1ZCCOutstock.Release();
+ }
await InvokeGenPretaskExcute();
}
return Task.FromResult(true);
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs
index 4868a0e2..43ac200e 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs
@@ -60,6 +60,8 @@ namespace Tnb.WarehouseMgr
var db = _db;
if (dbConn != null)
db = dbConn;
+
+ string type = "";
try
{
await db.Ado.BeginTranAsync();
@@ -67,7 +69,6 @@ namespace Tnb.WarehouseMgr
WmsPrdInstockH prdInstockH = db.Queryable().Where(r => r.prd_bill_code == input.prd_bill_code).First();
string prd_instock_code_id = "";
- string type = "";
// 新建主表
if (prdInstockH == null)
{
@@ -142,6 +143,19 @@ namespace Tnb.WarehouseMgr
await db.Insertable(WmsPrdInstockCodes).ExecuteCommandAsync();
+ if (type == "25019163616533")
+ {
+ await _s_taskExecuteSemaphore_F1ZCCInstock.WaitAsync();
+ }
+ else if (type == "25019172714005")
+ {
+ await _s_taskExecuteSemaphore_F1ZCCInstock.WaitAsync();
+ }
+ else if (type == "25019191681045")
+ {
+
+ }
+
foreach (WmsPrdInstockD wmsPrdInstockD in WmsPrdInstockDs)
{
//入库取终点
@@ -275,6 +289,19 @@ namespace Tnb.WarehouseMgr
}
finally
{
+ if (type == "25019163616533")
+ {
+ _s_taskExecuteSemaphore_F1ZCCInstock.Release();
+ }
+ else if (type == "25019172714005")
+ {
+ _s_taskExecuteSemaphore_F1ZCCInstock.Release();
+ }
+ else if (type == "25019191681045")
+ {
+
+ }
+
_wareHouseService.GenTaskExecute();
}
From b5e7495dfeb74b4beff7fc5a7f43567d6c7999a1 Mon Sep 17 00:00:00 2001
From: majian <780924089@qq.com>
Date: Thu, 1 Aug 2024 16:32:50 +0800
Subject: [PATCH 3/3] =?UTF-8?q?=E5=85=81=E8=AE=B8=E7=94=B5=E6=A2=AF?=
=?UTF-8?q?=E6=94=BE=E4=B8=A4=E6=89=98=E8=B4=A7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Tnb.ProductionMgr/RedisBackGround.cs | 73 ++++++++++---
.../Enums/EnumTaskChainType.cs | 2 +-
.../IWareHouseService.cs | 2 +-
.../Tnb.WarehouseMgr/BaseWareHouseService.cs | 50 ++++++---
.../Tnb.WarehouseMgr/DeviceProviderService.cs | 24 +++--
.../Tnb.WarehouseMgr/WareHouseService.cs | 100 ++++++++++++++----
6 files changed, 198 insertions(+), 53 deletions(-)
diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs
index b1a35715..17cc6c79 100644
--- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs
+++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs
@@ -1866,21 +1866,70 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
{
try
{
- List wmsDistaskHs = db_ElevatorTaskExceptionHandle.Queryable()
+ List elevatorTasks = db_ElevatorTaskExceptionHandle.Queryable()
.Where(r => r.startlocation_code.Contains("DT") && r.endlocation_code.Contains("DT") && r.act_start_date == null && r.act_end_date == null).ToList();
- LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】检查到需要恢复的电梯任务{wmsDistaskHs.Count}条 {string.Join(',', wmsDistaskHs.Select(x => x.bill_code))}");
- foreach (WmsDistaskH wmsDistaskH in wmsDistaskHs)
- {
- ElevagorInfoQuery q = new() { endlocation_id = wmsDistaskH.endlocation_id, taskCode = wmsDistaskH.bill_code };
+ LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】检查到需要恢复的电梯任务{elevatorTasks.Count}条 {string.Join(',', elevatorTasks.Select(x => x.bill_code))}");
- LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】执行电梯任务时 根据任务单号获取电梯参数 {JsonConvert.SerializeObject(q)}");
- var e = await _wareHouseService.FindElevatorFromPars(q);
- LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】执行电梯任务时 根据任务单号获取电梯结果 {JsonConvert.SerializeObject(e)}");
- if (e == null)
- continue;
- wmsDistaskH.device_id = e.device_id;
- await _wareHouseService.ExecuteTargetFloorTask(wmsDistaskH);
+
+ if (elevatorTasks?.Count > 0)
+ {
+ List> elevatorTaskGroup = elevatorTasks.GroupBy(r => $"{r.endlocation_code} {r.end_floor}").ToList();
+ foreach (IGrouping group in elevatorTaskGroup)
+ {
+ List wmsDistaskHs = group.ToList();
+ ElevagorInfoQuery q = new() { endlocation_id = wmsDistaskHs[0].endlocation_id, taskCode = wmsDistaskHs[0].bill_code };
+ LoggerElevatorTask.Information($"【GenTaskExecute】执行电梯任务时 根据任务单号获取电梯参数 {JsonConvert.SerializeObject(q)}");
+ var e = await _wareHouseService.FindElevatorFromPars(q);
+ LoggerElevatorTask.Information($"【GenTaskExecute】执行电梯任务时 根据任务单号获取电梯结果 {JsonConvert.SerializeObject(e)}");
+
+ // 三、四号梯发货带两托货
+ string[] doubleCarryRunElevators =
+ {
+ "Elevator3","Elevator4"
+ };
+ if (doubleCarryRunElevators.Contains(e.elevator_code) && wmsDistaskHs[0].end_floor == 1)
+ {
+ // 电梯内放置两托货呼叫电梯下
+ if (group.Count() == 2)
+ {
+ if (e != null)
+ {
+ wmsDistaskHs[0].device_id = e.device_id;
+ wmsDistaskHs[1].device_id = e.device_id;
+ }
+ await _wareHouseService.ExecuteTargetFloorTask(wmsDistaskHs);
+ }
+ // 一托货
+ else if (group.Count() == 1)
+ {
+ // 如果当前电梯没有执行中的任务 则呼叫电梯下
+
+ if (db_ElevatorTaskExceptionHandle.Queryable().Where(r => r.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID
+ && r.status != WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID && r.endlocation_id == wmsDistaskHs[0].startlocation_id).Count() == 0)
+ {
+ if (e != null)
+ {
+ wmsDistaskHs[0].device_id = e.device_id;
+ }
+ await _wareHouseService.ExecuteTargetFloorTask(wmsDistaskHs);
+ }
+ }
+ else
+ {
+ LoggerElevatorTask.LogError($"电梯 {e.elevator_code} 待执行的电梯任务数异常 目前是{group.Count()} 超过了两托");
+ }
+ }
+ else
+ {
+ if (e != null)
+ {
+ wmsDistaskHs[0].device_id = e.device_id;
+ }
+ await _wareHouseService.ExecuteTargetFloorTask(wmsDistaskHs);
+ }
+
+ }
}
}
catch (Exception ex)
diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumTaskChainType.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumTaskChainType.cs
index 5a4b020b..edf8e70c 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumTaskChainType.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumTaskChainType.cs
@@ -9,6 +9,6 @@
KIVA = 2,
AGV = 3,
电梯 = 4,
- 输送线 = 5,
+ 电梯载两托货 = 5,
}
}
diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs
index e7c7ecf5..180542c7 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs
@@ -183,7 +183,7 @@ namespace Tnb.WarehouseMgr.Interfaces
///
///
///
- Task ExecuteTargetFloorTask(WmsDistaskH disTask);
+ Task ExecuteTargetFloorTask(List disTasks);
Task FindElevatorFromPars(ElevagorInfoQuery input);
}
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs
index 4a97c259..917e7118 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs
@@ -192,25 +192,49 @@ namespace Tnb.WarehouseMgr
///
///
[NonAction]
- protected Task GetRealFloor(int floor)
+ protected Task GetRealFloor(string elevator_code, int floor)
{
int realFloor = 0;
- if (floor == 4)
+
+ if (elevator_code == "Elevator1")
{
- realFloor = 5;
+ if (floor == 4)
+ {
+ realFloor = 6;
+ }
+ else if (floor == 3)
+ {
+ realFloor = 5;
+ }
+ else if (floor == 2)
+ {
+ realFloor = 4;
+ }
+ else if (floor == 1)
+ {
+ realFloor = 1;
+ }
}
- else if (floor == 3)
+ else
{
- realFloor = 4;
- }
- else if (floor == 2)
- {
- realFloor = 3;
- }
- else if(floor == 1)
- {
- realFloor = 1;
+ if (floor == 4)
+ {
+ realFloor = 5;
+ }
+ else if (floor == 3)
+ {
+ realFloor = 4;
+ }
+ else if (floor == 2)
+ {
+ realFloor = 3;
+ }
+ else if (floor == 1)
+ {
+ realFloor = 1;
+ }
}
+
return Task.FromResult(realFloor);
}
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs
index 7e580996..c35a16f6 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs
@@ -172,7 +172,7 @@ namespace Tnb.WarehouseMgr
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None);
Logger.Information($"【LoadConfirm】 电梯当前状态->系统状态:{sysStatus.ToEnum()},运行状态:{runStatus.ToEnum()},门状态:{doorStatus},Agv状态:{agvStatus.ToEnum()},当前楼层:{floorNo},电梯占用状态{s_eleUseStatusDic[elevator.device_id]}");
{
- var curFloor = await GetRealFloor(elevator.end_floor);
+ var curFloor = await GetRealFloor(elevator.elevator_code, elevator.end_floor);
/* Logger.Information($"目标楼层:{curFloor},电梯当前楼层:{floorNo}");
Logger.Information($"当前取货设备ID:{elevator.device_id}");
var loadedStatus = s_eleUseStatusDic[elevator.device_id] == 1 ? "完成" : "未完成";
@@ -368,7 +368,7 @@ namespace Tnb.WarehouseMgr
Logger.Information($"【UnloadConfirm】 发送AGVControl 切换电梯{devName}控制模式结果 {JsonConvert.SerializeObject(res)}");
}
- var curFloor = await GetRealFloor(elevator.end_floor);
+ var curFloor = await GetRealFloor(elevator.elevator_code, elevator.end_floor);
Logger.Information($"【UnloadConfirm】 电梯状态 {s_eleUseStatusDic[elevator.device_id]} 当前楼层:{curFloor},电梯所在楼层:{floorNo}");
@@ -397,7 +397,11 @@ namespace Tnb.WarehouseMgr
if (sysStatus == (int)EnumSysStatus.正常状态 && runStatus == (int)EnumRunStatus.停梯
&& doorStatus == (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲)
{
- await _db.Updateable().SetColumns(r => r.is_use == (int)EnumElevatorUseStatus.占用).Where(r => r.elevator_id == elevator.device_id).ExecuteCommandAsync();
+ await _db.Updateable().SetColumns(r => new WmsElevatorH
+ {
+ is_use = (int)EnumElevatorUseStatus.占用,
+ use_tasks = $"','{ r.use_tasks }".Trim(',')
+ }).Where(r => r.elevator_id == elevator.device_id).ExecuteCommandAsync();
s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.占用;
Logger.Information($"【UnloadConfirm】 {devName}放货成功 状态变更为占用 {s_eleUseStatusDic.GetHashCode()} {s_eleUseStatusDic[elevator.device_id]}");
return await ToApiResult(HttpStatusCode.OK, "成功");
@@ -728,7 +732,11 @@ namespace Tnb.WarehouseMgr
Logger.Information($"【TaskCallback】 根据任务单查找电梯结果 {JsonConvert.SerializeObject(elevator)}");
if (!elevator?.device_id.IsNullOrEmpty() ?? false)
{
- await _db.Updateable().SetColumns(r => r.is_use == (int)EnumElevatorUseStatus.空闲).Where(r => r.elevator_id == elevator.device_id).ExecuteCommandAsync();
+ await _db.Updateable().SetColumns(r => new WmsElevatorH
+ {
+ is_use = (int)EnumElevatorUseStatus.空闲,
+ use_tasks = ""
+ }).Where(r => r.elevator_id == elevator.device_id).ExecuteCommandAsync();
s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.空闲;
// 根据disTask StartLocationId 起始库位关联电梯获取设备ID location_code.Continas("")
var devName = s_elevatorMap[elevator.device_id]?.ToString();
@@ -804,7 +812,7 @@ namespace Tnb.WarehouseMgr
[HttpPost]
- public async Task WmsElevatorUnlock(WmsElevatorUnlockInput input)
+ public async Task WmsElevatorUnlock(WmsElevatorUnlockInput input)
{
try
{
@@ -815,7 +823,11 @@ namespace Tnb.WarehouseMgr
throw new Exception($"未找到电梯{input.elevator_code}的配置");
}
Logger.Information($"【WmsElevatorUnlock】操作电梯{input.elevator_code}手动解锁");
- await _db.Updateable().SetColumns(r => r.is_use == (int)EnumElevatorUseStatus.空闲)
+ await _db.Updateable().SetColumns(r => new WmsElevatorH
+ {
+ is_use = (int)EnumElevatorUseStatus.空闲,
+ use_tasks = ""
+ })
.Where(it => it.elevator_id == wmsElevatorH.elevator_id).ExecuteCommandAsync();
s_eleUseStatusDic[wmsElevatorH.elevator_id] = (int)EnumElevatorUseStatus.空闲;
}
diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs
index e844aa43..56d97b43 100644
--- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs
+++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs
@@ -56,6 +56,7 @@ using Tnb.WarehouseMgr.Interfaces;
using static NPOI.HSSF.Util.HSSFColor;
using Tnb.BasicData;
using System.Reflection;
+using NPOI.SS.Format;
namespace Tnb.WarehouseMgr
{
@@ -1025,6 +1026,7 @@ namespace Tnb.WarehouseMgr
Logger.Information($"SsxControlLOAD:{JsonConvert.SerializeObject(dicCommand)}");
var str = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand);
Logger.Information($"SsxControlLOAD:{str}");
+ Logger.Information($"SsxControlUNLOAD - 控制后查询:{_redisData.GetHash(strarr[0], strarr[1]).Result}");
}
}
else if (action == "UNLOAD")//放货
@@ -1042,6 +1044,7 @@ namespace Tnb.WarehouseMgr
Logger.Information($"SsxControlUNLOAD:{JsonConvert.SerializeObject(dicCommand)}");
var str = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand);
Logger.Information($"SsxControlUNLOAD:{str}");
+ Logger.Information($"SsxControlUNLOAD - 控制后查询:{_redisData.GetHash(strarr[0], strarr[1]).Result}");
}
}
@@ -1546,7 +1549,7 @@ namespace Tnb.WarehouseMgr
var tags = _eleCtlCfg.tags;
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(e.elevator_code, tags, CancellationToken.None);
Logger.Information($"【GenTaskExecute】 电梯当前状态->系统状态:{sysStatus.ToEnum()},运行状态:{runStatus.ToEnum()},Agv状态:{agvStatus.ToEnum()},当前楼层:{floorNo},电梯占用状态{s_eleUseStatusDic[e.device_id]}");
- var curFloor = await GetRealFloor(e.end_floor);
+ var curFloor = await GetRealFloor(e.elevator_code, e.end_floor);
if (e != null && s_eleUseStatusDic[e.device_id] == (int)EnumElevatorUseStatus.空闲 && curFloor != floorNo)
{
@@ -1580,18 +1583,60 @@ namespace Tnb.WarehouseMgr
Logger.Information($"【GenTaskExecute】当前电梯任务数:{elevatorTasks?.Count ?? 0}");
if (elevatorTasks?.Count > 0)
{
- foreach (WmsDistaskH? elevatorTask in elevatorTasks)
+ List> elevatorTaskGroup = elevatorTasks.GroupBy(r => $"{r.endlocation_code} {r.end_floor}").ToList();
+ foreach (IGrouping group in elevatorTaskGroup)
{
- ElevagorInfoQuery q = new() { endlocation_id = elevatorTask.endlocation_id, taskCode = elevatorTask.bill_code};
+ List wmsDistaskHs = group.ToList();
+ ElevagorInfoQuery q = new() { endlocation_id = wmsDistaskHs[0].endlocation_id, taskCode = wmsDistaskHs[0].bill_code };
Logger.Information($"【GenTaskExecute】执行电梯任务时 根据任务单号获取电梯参数 {JsonConvert.SerializeObject(q)}");
var e = await FindElevatorFromPars(q);
Logger.Information($"【GenTaskExecute】执行电梯任务时 根据任务单号获取电梯结果 {JsonConvert.SerializeObject(e)}");
- if (e != null)
- {
- elevatorTask.device_id = e.device_id;
- }
- _ = ExecuteTargetFloorTask(elevatorTask);
+ // 三、四号梯发货带两托货
+ string[] doubleCarryRunElevators = new string[2]
+ {
+ "Elevator3","Elevator4"
+ };
+ if (doubleCarryRunElevators.Contains(e.elevator_code) && wmsDistaskHs[0].end_floor == 1)
+ {
+ // 电梯内放置两托货呼叫电梯下
+ if (group.Count() == 2)
+ {
+ if (e != null)
+ {
+ wmsDistaskHs[0].device_id = e.device_id;
+ wmsDistaskHs[1].device_id = e.device_id;
+ }
+ _ = ExecuteTargetFloorTask(wmsDistaskHs);
+ }
+ // 一托货
+ else if (group.Count() == 1)
+ {
+ // 如果当前电梯没有执行中的任务 则呼叫电梯下
+
+ if (_db.Queryable().Where(r => r.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID
+ && r.status != WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID && r.endlocation_id == wmsDistaskHs[0].startlocation_id).Count() == 0)
+ {
+ if (e != null)
+ {
+ wmsDistaskHs[0].device_id = e.device_id;
+ }
+ _ = ExecuteTargetFloorTask(wmsDistaskHs);
+ }
+ }
+ else
+ {
+ Logger.LogError($"电梯 {e.elevator_code} 待执行的电梯任务数异常 目前是{group.Count()} 超过了两托");
+ }
+ }
+ else
+ {
+ if (e != null)
+ {
+ wmsDistaskHs[0].device_id = e.device_id;
+ }
+ _ = ExecuteTargetFloorTask(wmsDistaskHs);
+ }
}
}
List agvTasks = disTasks.Where(it => !it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList();
@@ -2045,7 +2090,7 @@ namespace Tnb.WarehouseMgr
Logger.Information($"【CallingLanding】 任务开始目标楼层为:{floorNO}");
- int floorN = await GetRealFloor(floorNO);
+ int floorN = await GetRealFloor(devName, floorNO);
//如果电梯在当前楼层则不呼梯
if (floorN == eleStatusMulti.curFloorNo)
{
@@ -2103,10 +2148,12 @@ namespace Tnb.WarehouseMgr
///
///
///
- public async Task ExecuteTargetFloorTask(WmsDistaskH disTask)
+ public async Task ExecuteTargetFloorTask(List disTasks)
{
//收到放货确认通知,向电梯发送到3楼的指令
- Logger.Information($"开始执行电梯任务,任务ID:{disTask.id}");
+ Logger.Information($"开始执行电梯任务,任务:{string.Join(",", disTasks.Select(r => r.bill_code))}");
+
+ var disTask = disTasks[0];
try
{
if (!s_elevatorMap.TryGetValue(disTask.device_id, out object? elevatorCode))
@@ -2147,7 +2194,7 @@ namespace Tnb.WarehouseMgr
} while (doorStatus != 4);
Logger.Information($"当前门状态:{doorStatus}");
- int floor = await GetRealFloor(disTask.end_floor);
+ int floor = await GetRealFloor(devName, disTask.end_floor);
//电梯任务手动执行任务状态上报
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) tuple = (-1, -1, -1, -1, -1);
@@ -2169,8 +2216,7 @@ namespace Tnb.WarehouseMgr
if (tuple.sysStatus.ToEnum() == EnumSysStatus.正常状态 && tuple.runStatus.ToEnum() == EnumRunStatus.停梯)
{
Logger.Information($"disTask.require_id={disTask.require_id}");
- List disTaskIds = new() { disTask.id };
- var upInput = new { disTaskIds = disTask.id };
+ List disTaskIds = new() { disTasks[0].id, disTasks[1].id };
TaskExecuteAfterUpInput teaUpInput = new()
{
disTaskIds = disTaskIds,
@@ -2211,6 +2257,13 @@ namespace Tnb.WarehouseMgr
//floor2.Add("AS02");
//floor2.Add("AX01");
//floor2.Add("AX02");
+
+ // 三、四号梯发货带两托货
+ string[] doubleCarryRunElevators =
+ {
+ "29815764588053","29815767573013"
+ };
+
//调用AGV创建任务链接口
try
{
@@ -2233,24 +2286,31 @@ namespace Tnb.WarehouseMgr
foreach ((string k, object v) in taskChainCodeDic)
{
- var typeflag = false;
var dis = disTasks.Where(p => p.groups == k).First();
+
+ dynamic reqBody = new ExpandoObject();
+ reqBody.taskChainCode = k;
+ reqBody.type = (int)EnumTaskChainType.AGV;
+
+
if (kiva.Contains(dis.startlocation_code) || kiva.Contains(dis.endlocation_code)
//|| floor2.Contains(dis.startlocation_code) || floor2.Contains(dis.endlocation_code)
)
{
- typeflag = true;
+ reqBody.type = (int)EnumTaskChainType.KIVA;
}
// 如果管理区是E(二楼暂存仓和二楼缓存仓) 统一发KIVA
if (dis.area_code == "E")
{
- typeflag = true;
+ reqBody.type = (int)EnumTaskChainType.KIVA;
}
- dynamic reqBody = new ExpandoObject();
- reqBody.taskChainCode = k;
- reqBody.type = typeflag ? (int)EnumTaskChainType.KIVA : (int)EnumTaskChainType.AGV;
+ // 三四号电梯出货
+ if (doubleCarryRunElevators.Contains(dis.device_id) && dis.end_floor == 1)
+ {
+ reqBody.type = (int)EnumTaskChainType.电梯载两托货;
+ }
// 原材料仓使用优先级
if (dis.area_code == "A")