二楼下升降机机械手边调度逻辑
This commit is contained in:
@@ -35,6 +35,7 @@ using Tnb.ProductionMgr.Interfaces;
|
||||
using Tnb.WarehouseMgr.Entities;
|
||||
using Tnb.WarehouseMgr.Entities.Configs;
|
||||
using Tnb.WarehouseMgr.Entities.Consts;
|
||||
using Tnb.WarehouseMgr.Entities.Dto.Inputs;
|
||||
using Tnb.WarehouseMgr.Entities.Enums;
|
||||
using Tnb.WarehouseMgr.Interfaces;
|
||||
|
||||
@@ -64,9 +65,11 @@ namespace Tnb.ProductionMgr
|
||||
private readonly IUserManager _userManager;
|
||||
private readonly IBillRullService _billRullService;
|
||||
private readonly IWareHouseService _wareHouseService;
|
||||
private readonly IWmsCarryBindService _wmsCarryBindService;
|
||||
|
||||
private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build<ElevatorControlConfiguration>();
|
||||
public RedisBackGround(RedisData redisData, IPrdInstockService prdInstockService, ISqlSugarRepository<RedisReadConfig> repository, IWmsPDAScanInStockService wmsPDAScanInStock
|
||||
, IUserManager userManager, IBillRullService billRullService, IWareHouseService wareHouseService)
|
||||
, IUserManager userManager, IBillRullService billRullService, IWareHouseService wareHouseService, IWmsCarryBindService wmsCarryBindService)
|
||||
{
|
||||
_redisData = redisData;
|
||||
_prdInstockService = prdInstockService;
|
||||
@@ -75,6 +78,7 @@ namespace Tnb.ProductionMgr
|
||||
_userManager = userManager;
|
||||
_billRullService = billRullService;
|
||||
_wareHouseService = wareHouseService;
|
||||
_wmsCarryBindService = wmsCarryBindService;
|
||||
}
|
||||
//获取redis数据
|
||||
private void GetRedisData(object state)
|
||||
@@ -621,6 +625,13 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
||||
target = targetConfigs.First();
|
||||
LoggerFloor2UpDownMachine.LogInformation($@"【上升降机】当前条码目标料架区为 {JsonConvert.SerializeObject(target)}");
|
||||
|
||||
// 料架信息
|
||||
WmsCarryH rack = db.Queryable<WmsCarryH>().Where(r => r.id == target.rackid).ToList()[0];
|
||||
|
||||
// 料箱信息
|
||||
WmsCarryH LX = db.Queryable<WmsCarryH>().Where(r => r.carry_code == barcode).ToList()[0];
|
||||
|
||||
|
||||
// 判断《上升降机空托1/2送到》是否为true
|
||||
string tag_上升降机空托送到 = $@"上升降机空托{target.stackingposition}送到";
|
||||
|
||||
@@ -646,6 +657,16 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
||||
remainbindracknum = r.remainbindracknum - 1
|
||||
}).Where(r => r.id == WmsEmptyOutstockH.id).ExecuteCommandAsync();
|
||||
LoggerFloor2UpDownMachine.LogInformation($@"【上升降机】回写出库单的剩余可绑定料架数量");
|
||||
|
||||
// 绑定料箱到料架
|
||||
CarryBindFloor2UpDownMachineInput carryBindFloor2UpDownMachineInput = new() { };
|
||||
carryBindFloor2UpDownMachineInput.carry_id = target.rackid;
|
||||
carryBindFloor2UpDownMachineInput.carry_code= target.rackcode;
|
||||
carryBindFloor2UpDownMachineInput.membercarry_id = LX.id;
|
||||
carryBindFloor2UpDownMachineInput.membercarry_code = LX.carry_code;
|
||||
carryBindFloor2UpDownMachineInput.carrystd_id = rack.carrystd_id;
|
||||
|
||||
await _wmsCarryBindService.CarryBindFloor2UpDownMachine(carryBindFloor2UpDownMachineInput);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -665,17 +686,109 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
||||
}
|
||||
}
|
||||
|
||||
// 下升降机
|
||||
private void Floor2DownMachinecode(object args)
|
||||
|
||||
|
||||
private async void Floor2DownMachinecode(object args)
|
||||
{
|
||||
// 补充料架
|
||||
using (var db = _repository.AsSugarClient().CopyNew())
|
||||
{
|
||||
|
||||
// 扫码分配拆垛位
|
||||
// 读取上升降机的左右料架区配置
|
||||
string[] configs = new string[2] { "二楼下升降机机械臂左", "二楼下升降机机械臂右" };
|
||||
|
||||
// 左右料架区配置
|
||||
List<WmsMechanicalArmH> WmsMechanicalArmHs = db.Queryable<WmsMechanicalArmH>()
|
||||
.Where(r => configs.Contains(r.name) && r.mechanicalconfirm == 1 && r.stackingcount < r.maxnum).ToList();
|
||||
|
||||
// 是否可以放货
|
||||
if (WmsMechanicalArmHs.Count == 0)
|
||||
{
|
||||
LoggerFloor2UpDownMachine.LogWarning($@"【下升降机】目前没有可以取货的料架区");
|
||||
return;
|
||||
}
|
||||
|
||||
WmsMechanicalArmH target;
|
||||
target = WmsMechanicalArmHs.First();
|
||||
|
||||
|
||||
// 待拆垛列表
|
||||
List<WmsCarrybindH> WmsCarrybindHs = db.Queryable<WmsMechanicalArmH>()
|
||||
.InnerJoin<WmsCarrybindH>((a, b) => a.rackid == b.carry_id)
|
||||
.Where(a => configs.Contains(a.name) && a.mechanicalconfirm == 1 && a.id == target.id).Select((a, b) => b).OrderBy(a => a.id).ToList();
|
||||
|
||||
// 料架拆垛完成
|
||||
if (WmsCarrybindHs.Count() == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
string barcode = WmsCarrybindHs[0].membercarry_code;
|
||||
|
||||
// 如果条码已被绑定
|
||||
if (WmsMechanicalArmHs.Where(r => !string.IsNullOrEmpty(r.barcodes) && r.barcodes.Contains(barcode)).Count() > 0)
|
||||
{
|
||||
LoggerFloor2UpDownMachine.LogWarning($@"【下升降机】条码{barcode}已被绑定");
|
||||
return;
|
||||
}
|
||||
LoggerFloor2UpDownMachine.LogInformation($@"【下升降机】扫描到有效条码 {barcode}");
|
||||
|
||||
await db.Ado.BeginTranAsync();
|
||||
try
|
||||
{
|
||||
LoggerFloor2UpDownMachine.LogInformation($@"【下升降机】当前条码目标料架区为 {JsonConvert.SerializeObject(target)}");
|
||||
|
||||
// 料架信息
|
||||
WmsCarryH rack = db.Queryable<WmsCarryH>().Where(r => r.id == target.rackid).ToList()[0];
|
||||
|
||||
// 料箱信息
|
||||
WmsCarryH LX = db.Queryable<WmsCarryH>().Where(r => r.carry_code == barcode).ToList()[0];
|
||||
|
||||
|
||||
// 判断《下升降机满托1/2送到》是否为true
|
||||
string tag_下升降机满托送到 = $@"下升降机满托{target.stackingposition}送到";
|
||||
|
||||
bool 下升降机满托送到 = (bool)Floor2UpDownMachinecode_GetTag<bool>(tag_下升降机满托送到);
|
||||
|
||||
LoggerFloor2UpDownMachine.LogInformation($@"【下降机】取值 {tag_下升降机满托送到} 结果为 {下升降机满托送到}");
|
||||
if (下升降机满托送到)
|
||||
{
|
||||
// 开始拆垛
|
||||
bool result = await Floor2UpDownMachinecode_SetTag(MechanicalArmConsts.下升降机当前码垛位, target.stackingposition.ToString());
|
||||
LoggerFloor2UpDownMachine.LogInformation($@"【下升降机】拆垛结果 {result}");
|
||||
// 回写料箱条码、码垛计数
|
||||
await db.Updateable<WmsMechanicalArmH>().SetColumns(r => new WmsMechanicalArmH
|
||||
{
|
||||
barcodes = $"{target.barcodes},{barcode}".Trim(','),
|
||||
stackingcount = r.stackingcount + 1
|
||||
}).Where(r => r.id == target.id).ExecuteCommandAsync();
|
||||
LoggerFloor2UpDownMachine.LogInformation($@"【下升降机】回写料箱条码、拆垛计数");
|
||||
|
||||
// 解除绑定料箱到料架
|
||||
CarryBindFloor2UpDownMachineInput carryBindFloor2UpDownMachineInput = new() { };
|
||||
carryBindFloor2UpDownMachineInput.carry_id = target.rackid;
|
||||
carryBindFloor2UpDownMachineInput.carry_code = target.rackcode;
|
||||
carryBindFloor2UpDownMachineInput.membercarry_id = LX.id;
|
||||
carryBindFloor2UpDownMachineInput.membercarry_code = LX.carry_code;
|
||||
carryBindFloor2UpDownMachineInput.carrystd_id = rack.carrystd_id;
|
||||
|
||||
await _wmsCarryBindService.CarryUnbindFloor2UpDownMachine(carryBindFloor2UpDownMachineInput);
|
||||
}
|
||||
else
|
||||
{
|
||||
LoggerFloor2UpDownMachine.LogError($@"【下升降机】料架未送到 料架区{target.stackingposition}");
|
||||
}
|
||||
|
||||
|
||||
await db.Ado.CommitTranAsync();
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LoggerFloor2UpDownMachine.LogError(ex.ToString());
|
||||
LoggerFloor2UpDownMachine.LogError(ex.StackTrace);
|
||||
await db.Ado.RollbackTranAsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检查机械臂料架区信号(上升降机空托1送到)
|
||||
/// </summary>
|
||||
@@ -712,6 +825,46 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 检查机械臂料架区信号(上升降机满托1送到)
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> 检查机械臂料架区信号_下升降机满托1送到()
|
||||
{
|
||||
using (var db = _repository.AsSugarClient().CopyNew())
|
||||
{
|
||||
string[] configs_upMachine = new string[2] { "二楼下升降机机械臂左", "二楼下升降机机械臂右" };
|
||||
|
||||
// 找到AGV已到货,没有机械臂确认的数据
|
||||
ISugarQueryable<WmsMechanicalArmH> WmsMechanicalArmHsuagar = db.Queryable<WmsMechanicalArmH>()
|
||||
.Where(r => r.agvconfirm == 1 && r.mechanicalconfirm == 0 && configs_upMachine.Contains(r.name));
|
||||
|
||||
foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHsuagar.ToList())
|
||||
{
|
||||
bool 上升降机请求送空托 = (bool)Floor2UpDownMachinecode_GetTag<bool>($"下升降机请求送满托{wmsMechanicalArmH.stackingposition}");
|
||||
|
||||
string data = _redisData.GetHash("东面提升机输送线", $"下升降机满托{wmsMechanicalArmH.stackingposition}送到").Result;
|
||||
JObject? res = JsonConvert.DeserializeObject<JObject>(data);
|
||||
bool result = res != null && res["Value"] != null ? res.Value<bool>("Value") : false;
|
||||
LoggerFloor2RackDelivery.LogInformation($"【送满托到上升降区】 下升降机满托{wmsMechanicalArmH.stackingposition}送到 结果为{result}");
|
||||
if (result)
|
||||
{
|
||||
int LXCount = db.Queryable<WmsCarrybindH>().Where(r => r.carry_id == wmsMechanicalArmH.rackid).Count();
|
||||
|
||||
// 绑定料架
|
||||
await db.Updateable<WmsMechanicalArmH>().SetColumns(r => new WmsMechanicalArmH
|
||||
{
|
||||
mechanicalconfirm = 1,
|
||||
maxnum = LXCount
|
||||
}).Where(r => r.id == wmsMechanicalArmH.id).ExecuteCommandAsync();
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 送空托到上升降区
|
||||
/// </summary>
|
||||
@@ -736,94 +889,209 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
||||
}
|
||||
|
||||
// 料架区
|
||||
WmsMechanicalArmH wmsMechanicalArmH = WmsMechanicalArmHs[0];
|
||||
|
||||
bool 上升降机请求送空托 = (bool)Floor2UpDownMachinecode_GetTag<bool>($"上升降机请求送空托{wmsMechanicalArmH.stackingposition}");
|
||||
if (!上升降机请求送空托)
|
||||
foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHs)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogWarning($"【送空托到上升降区】 料架区 {wmsMechanicalArmH.name}{wmsMechanicalArmH.stackingposition} 上升降机请求送空托{wmsMechanicalArmH.stackingposition}信号不为true");
|
||||
return false;
|
||||
|
||||
bool 上升降机请求送空托 = (bool)Floor2UpDownMachinecode_GetTag<bool>($"上升降机请求送空托{wmsMechanicalArmH.stackingposition}");
|
||||
if (!上升降机请求送空托)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogWarning($"【送空托到上升降区】 料架区 {wmsMechanicalArmH.name}{wmsMechanicalArmH.stackingposition} 上升降机请求送空托{wmsMechanicalArmH.stackingposition}信号不为true");
|
||||
return false;
|
||||
}
|
||||
|
||||
LoggerFloor2RackDelivery.LogInformation($"【送空托到上升降区】 即将补充料架区{wmsMechanicalArmH.name}");
|
||||
|
||||
|
||||
// 找到占用且未锁定的库位上的空料架
|
||||
ISugarQueryable<BasLocation> rackStartLocations =
|
||||
_repository.AsSugarClient().Queryable<BasLocation>()
|
||||
.InnerJoin<WmsCarryH>((a, b) => a.id == b.location_id)
|
||||
.LeftJoin<WmsCarrybindH>((a, b, c) => b.id == c.carry_id)
|
||||
.Where((a, b, c) => a.wh_id == "33780009364245" && a.is_use == "1" && a.is_lock == 0 && string.IsNullOrEmpty(c.id)
|
||||
&& b.carrystd_id == WmsWareHouseConst.CARRY_LJSTD_ID).OrderBy(a => a.id).Take(1);
|
||||
|
||||
if (rackStartLocations.Count() == 0)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogWarning($"【送空托到上升降区】 暂存仓中没有可用的空料架 {rackStartLocations.ToSqlString()}");
|
||||
return false;
|
||||
}
|
||||
|
||||
BasLocation startLocation = rackStartLocations.First();
|
||||
|
||||
List<WmsPointH> startPoints = _repository.AsSugarClient().Queryable<WmsPointH>().Where(r => r.location_id == startLocation.id).ToList();
|
||||
|
||||
if (startPoints.Count == 0)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 起始库位{startLocation.location_code}未在点位表维护对应的点位");
|
||||
return false;
|
||||
}
|
||||
|
||||
List<WmsPointH> endPoints = _repository.AsSugarClient().Queryable<WmsPointH>().Where(r => r.id == wmsMechanicalArmH.point_id).ToList();
|
||||
|
||||
if (endPoints.Count == 0)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 终点{wmsMechanicalArmH.point_id} {wmsMechanicalArmH.point_code}未在点位表维护对应的点位");
|
||||
return false;
|
||||
}
|
||||
|
||||
List<WmsCarryH> wmsCarryHs = _repository.AsSugarClient().Queryable<WmsCarryH>().Where(r => r.location_id == startLocation.id).ToList();
|
||||
if (wmsCarryHs.Count == 0)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 起点{startLocation.id} {startLocation.location_code}上找不到料架");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (wmsCarryHs.Count > 1)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 起点{startLocation.id} {startLocation.location_code}上存在多个料架");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 空料架
|
||||
WmsCarryH targetCarry = wmsCarryHs[0];
|
||||
|
||||
WmsPointH startPoint = startPoints.First();
|
||||
WmsPointH endPoint = endPoints.First();
|
||||
|
||||
await _repository.AsSugarClient().Updateable<BasLocation>().SetColumns(r => new BasLocation
|
||||
{
|
||||
is_lock = 1
|
||||
}).Where(r => r.id == startLocation.id).ExecuteCommandAsync();
|
||||
await _repository.AsSugarClient().Updateable<WmsPointH>().SetColumns(r => new WmsPointH
|
||||
{
|
||||
is_lock = 1
|
||||
}).Where(r => r.id == endPoint.id).ExecuteCommandAsync();
|
||||
|
||||
|
||||
LoggerFloor2RackDelivery.LogInformation($"【送空托到上升降区】 开始生成预任务 起点{startPoint.point_code} 终点{endPoint.point_code} 料架 {targetCarry.carry_code}");
|
||||
List<WmsPointH> points = new List<WmsPointH>();
|
||||
points.Add(startPoint);
|
||||
points.Add(endPoint);
|
||||
|
||||
Tuple<bool, WmsPretaskH> result = await Floor2UpDownMachinecode_createPretask(points, targetCarry.id, targetCarry.carry_code);
|
||||
if (!result.Item1)
|
||||
{
|
||||
throw new Exception("【送空托到上升降区】 未成功生成预任务");
|
||||
}
|
||||
}
|
||||
|
||||
LoggerFloor2RackDelivery.LogInformation($"【送空托到上升降区】 即将补充料架区{wmsMechanicalArmH.name}");
|
||||
|
||||
|
||||
// 找到占用且未锁定的库位上的空料架
|
||||
ISugarQueryable<BasLocation> rackStartLocations =
|
||||
_repository.AsSugarClient().Queryable<BasLocation>()
|
||||
.InnerJoin<WmsCarryH>((a, b) => a.id == b.location_id)
|
||||
.LeftJoin<WmsCarrybindCode>((a, b, c) => b.id == c.carrybind_id)
|
||||
.Where((a, b, c) => a.wh_id == "33780009364245" && a.is_use == "1" && a.is_lock == 0 && string.IsNullOrEmpty(c.id)
|
||||
&& b.carrystd_id == WmsWareHouseConst.CARRY_LJSTD_ID).OrderBy(a => a.id).Take(1);
|
||||
|
||||
if (rackStartLocations.Count() == 0)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogWarning($"【送空托到上升降区】 暂存仓中没有可用的空料架 {rackStartLocations.ToSqlString()}");
|
||||
return false;
|
||||
}
|
||||
|
||||
BasLocation startLocation = rackStartLocations.First();
|
||||
|
||||
List<WmsPointH> startPoints = _repository.AsSugarClient().Queryable<WmsPointH>().Where(r => r.location_id == startLocation.id).ToList();
|
||||
|
||||
if (startPoints.Count == 0)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 起始库位{startLocation.location_code}未在点位表维护对应的点位");
|
||||
return false;
|
||||
}
|
||||
|
||||
List<WmsPointH> endPoints = _repository.AsSugarClient().Queryable<WmsPointH>().Where(r => r.id == wmsMechanicalArmH.point_id).ToList();
|
||||
|
||||
if (endPoints.Count == 0)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 终点{wmsMechanicalArmH.point_id} {wmsMechanicalArmH.point_code}未在点位表维护对应的点位");
|
||||
return false;
|
||||
}
|
||||
|
||||
List<WmsCarryH> wmsCarryHs = _repository.AsSugarClient().Queryable<WmsCarryH>().Where(r => r.location_id == startLocation.id).ToList();
|
||||
if (wmsCarryHs.Count == 0)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 起点{startLocation.id} {startLocation.location_code}上找不到料架");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (wmsCarryHs.Count > 1)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 起点{startLocation.id} {startLocation.location_code}上存在多个料架");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 空料架
|
||||
WmsCarryH targetCarry = wmsCarryHs[0];
|
||||
|
||||
WmsPointH startPoint = startPoints.First();
|
||||
WmsPointH endPoint = endPoints.First();
|
||||
|
||||
await _repository.AsSugarClient().Updateable<BasLocation>().SetColumns(r => new BasLocation
|
||||
{
|
||||
is_lock = 1
|
||||
}).Where(r => r.id == startLocation.id).ExecuteCommandAsync();
|
||||
await _repository.AsSugarClient().Updateable<WmsPointH>().SetColumns(r => new WmsPointH
|
||||
{
|
||||
is_lock = 1
|
||||
}).Where(r => r.id == endPoint.id).ExecuteCommandAsync();
|
||||
|
||||
|
||||
LoggerFloor2RackDelivery.LogInformation($"【送空托到上升降区】 开始生成预任务 起点{startPoint.point_code} 终点{endPoint.point_code} 料架 {targetCarry.carry_code}");
|
||||
List<WmsPointH> points = new List<WmsPointH>();
|
||||
points.Add(startPoint);
|
||||
points.Add(endPoint);
|
||||
|
||||
bool isOk = await Floor2UpDownMachinecode_createPretask(points, targetCarry.id, targetCarry.carry_code);
|
||||
if (!isOk)
|
||||
{
|
||||
throw new Exception("【送空托到上升降区】 未成功生成预任务");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 送满托到下升降区
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> 送满托到下升降区()
|
||||
{
|
||||
using (var db = _repository.AsSugarClient().CopyNew())
|
||||
{
|
||||
string[] configs_upMachine = new string[2] { "二楼下升降机机械臂左", "二楼下升降机机械臂右" };
|
||||
|
||||
// 找到没有绑定料架的且点位未锁定的料架区
|
||||
ISugarQueryable<WmsMechanicalArmH> WmsMechanicalArmHsuagar = _repository.AsSugarClient().Queryable<WmsMechanicalArmH>().
|
||||
InnerJoin<WmsPointH>((a, b) => a.point_id == b.id)
|
||||
.Where((a, b) => string.IsNullOrEmpty(a.rackcode) && b.is_lock == 0 && configs_upMachine.Contains(a.name));
|
||||
|
||||
List<WmsMechanicalArmH> WmsMechanicalArmHs = WmsMechanicalArmHsuagar.ToList();
|
||||
|
||||
if (WmsMechanicalArmHs.Count() == 0)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogWarning($"【送满托到下升降区】 无需补充料架区 {WmsMechanicalArmHsuagar.ToSqlString()}");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 料架区
|
||||
foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHs)
|
||||
{
|
||||
|
||||
bool 下升降机请求送满托 = (bool)Floor2UpDownMachinecode_GetTag<bool>($"下升降机请求送满托{wmsMechanicalArmH.stackingposition}");
|
||||
if (!下升降机请求送满托)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogWarning($"【送满托到下升降区】 料架区 {wmsMechanicalArmH.name}{wmsMechanicalArmH.stackingposition} 下升降机请求送满托{wmsMechanicalArmH.stackingposition}信号不为true");
|
||||
return false;
|
||||
}
|
||||
|
||||
LoggerFloor2RackDelivery.LogInformation($"【送满托到下升降区】 即将补充料架区{wmsMechanicalArmH.name}");
|
||||
|
||||
|
||||
// 找到占用且未锁定的库位上的满料架
|
||||
ISugarQueryable<BasLocation> rackStartLocations =
|
||||
_repository.AsSugarClient().Queryable<BasLocation>()
|
||||
.InnerJoin<WmsCarryH>((a, b) => a.id == b.location_id)
|
||||
.LeftJoin<WmsCarrybindH>((a, b, c) => b.id == c.carry_id)
|
||||
.Where((a, b, c) => a.wh_id == "33780009364245" && a.is_use == "1" && a.is_lock == 0 && !string.IsNullOrEmpty(c.id)
|
||||
&& b.carrystd_id == WmsWareHouseConst.CARRY_LJSTD_ID).OrderBy(a => a.id).Take(1);
|
||||
|
||||
if (rackStartLocations.Count() == 0)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogWarning($"【送满托到下升降区】 暂存仓中没有可用的满料架 {rackStartLocations.ToSqlString()}");
|
||||
return false;
|
||||
}
|
||||
|
||||
BasLocation startLocation = rackStartLocations.First();
|
||||
|
||||
List<WmsPointH> startPoints = _repository.AsSugarClient().Queryable<WmsPointH>().Where(r => r.location_id == startLocation.id).ToList();
|
||||
|
||||
if (startPoints.Count == 0)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogError($"【送满托到下升降区】 起始库位{startLocation.location_code}未在点位表维护对应的点位");
|
||||
return false;
|
||||
}
|
||||
|
||||
List<WmsPointH> endPoints = _repository.AsSugarClient().Queryable<WmsPointH>().Where(r => r.id == wmsMechanicalArmH.point_id).ToList();
|
||||
|
||||
if (endPoints.Count == 0)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogError($"【送满托到下升降区】 终点{wmsMechanicalArmH.point_id} {wmsMechanicalArmH.point_code}未在点位表维护对应的点位");
|
||||
return false;
|
||||
}
|
||||
|
||||
List<WmsCarryH> wmsCarryHs = _repository.AsSugarClient().Queryable<WmsCarryH>().Where(r => r.location_id == startLocation.id).ToList();
|
||||
if (wmsCarryHs.Count == 0)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogError($"【送满托到下升降区】 起点{startLocation.id} {startLocation.location_code}上找不到料架");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (wmsCarryHs.Count > 1)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogError($"【送满托到下升降区】 起点{startLocation.id} {startLocation.location_code}上存在多个料架");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 满料架
|
||||
WmsCarryH targetCarry = wmsCarryHs[0];
|
||||
|
||||
WmsPointH startPoint = startPoints.First();
|
||||
WmsPointH endPoint = endPoints.First();
|
||||
|
||||
await _repository.AsSugarClient().Updateable<BasLocation>().SetColumns(r => new BasLocation
|
||||
{
|
||||
is_lock = 1
|
||||
}).Where(r => r.id == startLocation.id).ExecuteCommandAsync();
|
||||
await _repository.AsSugarClient().Updateable<WmsPointH>().SetColumns(r => new WmsPointH
|
||||
{
|
||||
is_lock = 1
|
||||
}).Where(r => r.id == endPoint.id).ExecuteCommandAsync();
|
||||
|
||||
|
||||
LoggerFloor2RackDelivery.LogInformation($"【送满托到下升降区】 开始生成预任务 起点{startPoint.point_code} 终点{endPoint.point_code} 料架 {targetCarry.carry_code}");
|
||||
List<WmsPointH> points = new List<WmsPointH>();
|
||||
points.Add(startPoint);
|
||||
points.Add(endPoint);
|
||||
|
||||
Tuple<bool, WmsPretaskH> result = await Floor2UpDownMachinecode_createPretask(points, targetCarry.id, targetCarry.carry_code);
|
||||
if (!result.Item1)
|
||||
{
|
||||
throw new Exception("【送满托到下升降区】 未成功生成预任务");
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 移走上升降区未生成预任务且满托的料架
|
||||
/// </summary>
|
||||
@@ -839,6 +1107,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
||||
|
||||
foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHs)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogInformation($"【移走上升降区满托的料架】 开始执行预任务生成 {wmsMechanicalArmH.point_code} {wmsMechanicalArmH.outbill} {wmsMechanicalArmH.barcodes}");
|
||||
try
|
||||
{
|
||||
// 判断是否 上升降机请求取满托
|
||||
@@ -887,14 +1156,24 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
||||
LoggerFloor2RackDelivery.LogError($"【移走上升降区满托的料架】 终点库位{endLocation.location_code}未在点位表维护对应的点位");
|
||||
return false;
|
||||
}
|
||||
|
||||
WmsPointH endPoint = endPoints.First();
|
||||
points.Add(endPoint);
|
||||
|
||||
// 锁住终点库位
|
||||
await db.Updateable<BasLocation>(r => new BasLocation
|
||||
{
|
||||
is_lock = 1
|
||||
}).Where(r => r.id == endLocation.id).ExecuteCommandAsync();
|
||||
await db.Updateable<WmsPointH>(r => new WmsPointH
|
||||
{
|
||||
is_lock = 1
|
||||
}).Where(r => r.id == endPoint.id).ExecuteCommandAsync();
|
||||
|
||||
LoggerFloor2RackDelivery.LogInformation($"开始执行预任务生成: 料架区为{wmsMechanicalArmH.name}{wmsMechanicalArmH.stackingposition} 料架为{wmsMechanicalArmH.rackcode}");
|
||||
LoggerFloor2RackDelivery.LogInformation($"【移走上升降区满托的料架】 开始执行预任务生成: 料架区为{wmsMechanicalArmH.name}{wmsMechanicalArmH.stackingposition} 料架为{wmsMechanicalArmH.rackcode}");
|
||||
|
||||
bool isOk = await Floor2UpDownMachinecode_createPretask(points, wmsMechanicalArmH.rackid, wmsMechanicalArmH.rackcode);
|
||||
if (!isOk)
|
||||
Tuple<bool, WmsPretaskH> result = await Floor2UpDownMachinecode_createPretask(points, wmsMechanicalArmH.rackid, wmsMechanicalArmH.rackcode);
|
||||
if (!result.Item1)
|
||||
{
|
||||
throw new Exception("未成功生成预任务");
|
||||
}
|
||||
@@ -909,6 +1188,104 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 移走下升降区未生成预任务且空托的料架
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<bool> 移走下升降区未生成预任务且空托的料架()
|
||||
{
|
||||
using (var db = _repository.AsSugarClient().CopyNew())
|
||||
{
|
||||
string[] configs_upMachine = new string[2] { "二楼下升降机机械臂左", "二楼下升降机机械臂右" };
|
||||
// 读取下升降机的左右料架区配置
|
||||
|
||||
List<WmsMechanicalArmH> WmsMechanicalArmHs = _repository.AsSugarClient().Queryable<WmsMechanicalArmH>().Where(r => r.stackingcount == r.maxnum && r.maxnum != 0 && !string.IsNullOrEmpty(r.rackcode) && r.iscreatepretask == 0 && configs_upMachine.Contains(r.name)).ToList();
|
||||
|
||||
foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHs)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogInformation($"【移走下升降区空托的料架】 开始执行预任务生成 {wmsMechanicalArmH.point_code} {wmsMechanicalArmH.outbill} {wmsMechanicalArmH.barcodes}");
|
||||
try
|
||||
{
|
||||
// 判断是否 上升降机请求取满托
|
||||
bool 下升降机请求取空托 = (bool)Floor2UpDownMachinecode_GetTag<bool>($"下升降机请求取空托{wmsMechanicalArmH.stackingposition}");
|
||||
if (!下升降机请求取空托)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogError($"【移走下升降区空托的料架】下升降机请求取空托{wmsMechanicalArmH.stackingposition}");
|
||||
return false;
|
||||
}
|
||||
|
||||
await _repository.AsSugarClient().Updateable<WmsMechanicalArmH>().SetColumns(r => new WmsMechanicalArmH
|
||||
{
|
||||
iscreatepretask = 1
|
||||
}).Where(r => r.id == wmsMechanicalArmH.id).ExecuteCommandAsync();
|
||||
|
||||
List<WmsPointH> points = new List<WmsPointH>();
|
||||
|
||||
List<WmsPointH> startPoints = _repository.AsSugarClient().Queryable<WmsPointH>().Where(r => r.id == wmsMechanicalArmH.point_id).ToList();
|
||||
|
||||
if (startPoints.Count == 0)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogError($"【移走下升降区空托的料架】 起点{wmsMechanicalArmH.point_id} {wmsMechanicalArmH.point_code}未在点位表维护对应的点位");
|
||||
return false;
|
||||
}
|
||||
|
||||
WmsPointH startPoint = startPoints.First();
|
||||
points.Add(startPoint);
|
||||
|
||||
// 找到未占用且未锁定的库位
|
||||
ISugarQueryable<BasLocation> rackEndLocations =
|
||||
_repository.AsSugarClient().Queryable<BasLocation>()
|
||||
.Where(r => r.wh_id == "33780009364245" && r.is_use == "0" && r.is_lock == 0).OrderBy(a => a.id).Take(1);
|
||||
|
||||
if (rackEndLocations.Count() == 0)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogWarning($"【移走下升降区空托的料架】 暂存仓中没有可用的空库位 {rackEndLocations.ToSqlString()}");
|
||||
return false;
|
||||
}
|
||||
|
||||
BasLocation endLocation = rackEndLocations.First();
|
||||
|
||||
List<WmsPointH> endPoints = _repository.AsSugarClient().Queryable<WmsPointH>().Where(r => r.location_id == endLocation.id).ToList();
|
||||
|
||||
if (endPoints.Count == 0)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogError($"【移走下升降区空托的料架】 终点库位{endLocation.location_code}未在点位表维护对应的点位");
|
||||
return false;
|
||||
}
|
||||
|
||||
WmsPointH endPoint = endPoints.First();
|
||||
points.Add(endPoint);
|
||||
|
||||
// 锁住终点库位
|
||||
await db.Updateable<BasLocation>(r => new BasLocation
|
||||
{
|
||||
is_lock = 1
|
||||
}).Where(r => r.id == endLocation.id).ExecuteCommandAsync();
|
||||
await db.Updateable<WmsPointH>(r => new WmsPointH
|
||||
{
|
||||
is_lock = 1
|
||||
}).Where(r => r.id == endPoint.id).ExecuteCommandAsync();
|
||||
|
||||
LoggerFloor2RackDelivery.LogInformation($"【移走下升降区空托的料架】 开始执行预任务生成: 料架区为{wmsMechanicalArmH.name}{wmsMechanicalArmH.stackingposition} 料架为{wmsMechanicalArmH.rackcode}");
|
||||
|
||||
Tuple<bool, WmsPretaskH> result = await Floor2UpDownMachinecode_createPretask(points, wmsMechanicalArmH.rackid, wmsMechanicalArmH.rackcode);
|
||||
if (!result.Item1)
|
||||
{
|
||||
throw new Exception("未成功生成预任务");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogError(ex.ToString());
|
||||
LoggerFloor2RackDelivery.LogError(ex.StackTrace);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 料架配送
|
||||
private async void Floor2RackDelivery(object args)
|
||||
{
|
||||
@@ -916,16 +1293,24 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
||||
await s_taskExecuteRackDelivery.WaitAsync();
|
||||
try
|
||||
{
|
||||
|
||||
// 检查机械臂料架区信号(上升降机空托1送到)
|
||||
await 检查机械臂料架区信号_上升降机空托1送到();
|
||||
|
||||
// 检查机械臂料架区信号(下升降机满托1送到)
|
||||
await 检查机械臂料架区信号_下升降机满托1送到();
|
||||
|
||||
// 送空托到上升降区
|
||||
await 送空托到上升降区();
|
||||
|
||||
// 送满托到下升降区
|
||||
await 送满托到下升降区();
|
||||
|
||||
// 移走上升降区未生成预任务且满托的料架
|
||||
await 移走上升降区未生成预任务且满托的料架();
|
||||
|
||||
// 移走下升降区未生成预任务且空托的料架
|
||||
await 移走下升降区未生成预任务且空托的料架();
|
||||
|
||||
_ = _wareHouseService.GenTaskExecute();
|
||||
|
||||
}
|
||||
@@ -940,15 +1325,17 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
||||
|
||||
|
||||
// 上下升降机生成预任务(补充料架、上升降机取货到料架、上升降机满托运走,下升降机拿货到输送线、下升降机空托运走)
|
||||
private async Task<bool> Floor2UpDownMachinecode_createPretask(List<WmsPointH> points, string carry_id, string carry_code)
|
||||
private async Task<Tuple<bool, WmsPretaskH>> Floor2UpDownMachinecode_createPretask(List<WmsPointH> points, string carry_id, string carry_code)
|
||||
{
|
||||
//根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序)
|
||||
WmsPretaskH preTask = null;
|
||||
string bill_code = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult();
|
||||
List<WmsPretaskH> preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>
|
||||
{
|
||||
WmsPointH? sPoint = it.FirstOrDefault();
|
||||
WmsPointH? ePoint = it.LastOrDefault();
|
||||
|
||||
WmsPretaskH preTask = new()
|
||||
preTask = new()
|
||||
{
|
||||
org_id = "",
|
||||
startlocation_id = sPoint?.location_id!,
|
||||
@@ -961,7 +1348,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
||||
startpoint_code = sPoint?.point_code!,
|
||||
endpoint_id = ePoint?.id!,
|
||||
endpoint_code = ePoint?.point_code!,
|
||||
bill_code = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult(),
|
||||
bill_code = bill_code,
|
||||
status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID,
|
||||
biz_type = "",
|
||||
task_type = "",
|
||||
@@ -984,9 +1371,9 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
||||
if (result)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogInformation($"成功生成预任务:{preTasks.First().bill_code}");
|
||||
return true;
|
||||
return new Tuple<bool, WmsPretaskH>(true, preTask);
|
||||
}
|
||||
return false;
|
||||
return new Tuple<bool, WmsPretaskH>(false, null);
|
||||
}
|
||||
|
||||
private object Floor2UpDownMachinecode_GetTag<T>(string tag)
|
||||
@@ -1069,7 +1456,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
||||
reqBody.taskChainPriority = 0;
|
||||
reqBody.taskList = v;
|
||||
reqBody.floor = dis.end_floor;
|
||||
LoggerFloor2UpDownMachine.LogInformation($"【AgvDispatch】 Agv任务执行 开始请求联核/task-chain/create接口 请求地址:{url} 请求参数:{reqBody} ");
|
||||
LoggerFloor2UpDownMachine.LogInformation($"【AgvDispatch】 Agv任务执行 开始请求联核/task-chain/create接口 请求地址:{url} 请求参数:{JsonConvert.SerializeObject(reqBody)} ");
|
||||
dynamic respBody = await HttpClientHelper.PostStreamAsync(url, reqBody, token);
|
||||
LoggerFloor2UpDownMachine.LogInformation($"【AgvDispatch】 Agv任务执行 接收到联核/task-chain/create接口信息:{respBody}");
|
||||
}
|
||||
@@ -1086,15 +1473,15 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
||||
|
||||
public Task StartAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
Readtimer = new Timer(GetRedisData, null, TimeSpan.Zero, TimeSpan.FromSeconds(300));
|
||||
CheckGettimer = new Timer(CheckGet, null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
|
||||
Scantimer = new Timer(ScanInStock, null, TimeSpan.Zero, TimeSpan.FromSeconds(60));
|
||||
SSXcodetimer = new Timer(SSXcode, null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
|
||||
//Readtimer = new Timer(GetRedisData, null, TimeSpan.Zero, TimeSpan.FromSeconds(300));
|
||||
//CheckGettimer = new Timer(CheckGet, null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
|
||||
//Scantimer = new Timer(ScanInStock, null, TimeSpan.Zero, TimeSpan.FromSeconds(60));
|
||||
//SSXcodetimer = new Timer(SSXcode, null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
|
||||
|
||||
// 二楼上升降机
|
||||
Floor2UpMachinecodetimer = new Timer(Floor2UpMachinecode, null, TimeSpan.Zero, TimeSpan.FromSeconds(20));
|
||||
Floor2UpMachinecodetimer = new Timer(Floor2UpMachinecode, null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
|
||||
// 二楼下升降机
|
||||
//Floor2DownMachinecodetimer = new Timer(Floor2DownMachinecode, null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
|
||||
Floor2DownMachinecodetimer = new Timer(Floor2DownMachinecode, null, TimeSpan.Zero, TimeSpan.FromSeconds(60));
|
||||
// 二楼料架配送
|
||||
Floor2RackDeliverytimer = new Timer(Floor2RackDelivery, null, TimeSpan.Zero, TimeSpan.FromSeconds(60));
|
||||
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Tnb.WarehouseMgr.Entities.Dto.Inputs
|
||||
{
|
||||
public class CarryBindFloor2UpDownMachineInput
|
||||
{
|
||||
public string? carry_id { get; set; }
|
||||
public string? carry_code { get; set; }
|
||||
public string? carrystd_id { get; set; }
|
||||
public string? membercarry_id { get; set; }
|
||||
public string? membercarry_code { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,6 @@ namespace Tnb.WarehouseMgr.Entities.Dto.Inputs
|
||||
public string? codeqty { get; set; }
|
||||
public int is_out { get; set; }
|
||||
public string? unit_id { get; set; }
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ public partial class WmsCarrybindH : BaseEntity<string>
|
||||
/// <summary>
|
||||
/// 载具名称
|
||||
/// </summary>
|
||||
public string carry_name { get; set; } = string.Empty;
|
||||
//public string carry_name { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// dataType
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using JNPF.Common.Dtos.VisualDev;
|
||||
using Tnb.WarehouseMgr.Entities.Dto.Inputs;
|
||||
|
||||
namespace Tnb.WarehouseMgr.Interfaces
|
||||
{
|
||||
@@ -8,5 +9,8 @@ namespace Tnb.WarehouseMgr.Interfaces
|
||||
public interface IWmsCarryBindService
|
||||
{
|
||||
Task<dynamic> CarryBind(VisualDevModelDataCrInput input);
|
||||
|
||||
Task<dynamic> CarryBindFloor2UpDownMachine(CarryBindFloor2UpDownMachineInput input);
|
||||
Task<dynamic> CarryUnbindFloor2UpDownMachine(CarryBindFloor2UpDownMachineInput input);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -440,6 +440,12 @@ namespace Tnb.WarehouseMgr
|
||||
/// <returns></returns>
|
||||
public async Task<bool> Floor2MechanicalComplete(WmsDistaskH disTask, string action)
|
||||
{
|
||||
List<string> rackAreaPoints = new List<string>();
|
||||
// 二楼料架区点位
|
||||
rackAreaPoints.Add("AS01");
|
||||
rackAreaPoints.Add("AS02");
|
||||
rackAreaPoints.Add("AX01");
|
||||
rackAreaPoints.Add("AX02");
|
||||
if (disTask.area_code == "E")
|
||||
{
|
||||
Logger.Information($"【二楼机械臂Floor2MechanicalComplete】收到到货完成信号 传入参数: {disTask.bill_code} {action}");
|
||||
@@ -447,53 +453,80 @@ namespace Tnb.WarehouseMgr
|
||||
|
||||
if (action == "UNLOAD")
|
||||
{
|
||||
ISugarQueryable<WmsMechanicalArmH> WmsMechanicalArmHs = db.Queryable<WmsMechanicalArmH>().Where(r => r.point_code == disTask.endpoint_code);
|
||||
if (WmsMechanicalArmHs.Count() == 0)
|
||||
// 去料架区放货
|
||||
if (rackAreaPoints.Contains(disTask.endlocation_code))
|
||||
{
|
||||
Logger.Information($"【二楼机械臂Floor2MechanicalComplete】 任务执行终点{disTask.endpoint_code} 与料架区的点位不匹配");
|
||||
return false;
|
||||
}
|
||||
WmsMechanicalArmH target = WmsMechanicalArmHs.First();
|
||||
ISugarQueryable<WmsMechanicalArmH> WmsMechanicalArmHs = db.Queryable<WmsMechanicalArmH>().Where(r => r.point_code == disTask.endpoint_code);
|
||||
if (WmsMechanicalArmHs.Count() == 0)
|
||||
{
|
||||
Logger.Information($"【二楼机械臂Floor2MechanicalComplete】 任务执行终点{disTask.endpoint_code} 与料架区的点位不匹配");
|
||||
return false;
|
||||
}
|
||||
WmsMechanicalArmH target = WmsMechanicalArmHs.First();
|
||||
|
||||
// 回写料架和AGV确认
|
||||
await db.Updateable<WmsMechanicalArmH>().SetColumns(r => new WmsMechanicalArmH
|
||||
// 回写料架和AGV确认
|
||||
await db.Updateable<WmsMechanicalArmH>().SetColumns(r => new WmsMechanicalArmH
|
||||
{
|
||||
agvconfirm = 1,
|
||||
rackid = disTask.carry_id,
|
||||
rackcode = disTask.carry_code
|
||||
}).Where(r => r.id == target.id).ExecuteCommandAsync();
|
||||
Logger.Information($"【二楼机械臂Floor2MechanicalComplete】{disTask.bill_code} AGV已到货");
|
||||
}
|
||||
else // 去暂存仓放货
|
||||
{
|
||||
agvconfirm = 1,
|
||||
rackid = disTask.carry_id,
|
||||
rackcode = disTask.carry_code
|
||||
}).Where(r => r.id == target.id).ExecuteCommandAsync();
|
||||
Logger.Information($"【二楼机械臂Floor2MechanicalComplete】{disTask.bill_code} AGV已到货");
|
||||
// 回写料架料箱绑定表的库位
|
||||
ISugarQueryable<WmsCarrybindH> wmsCarryHs = db.Queryable<WmsCarrybindH>().Where(r => r.carry_code == disTask.carry_code);
|
||||
var wmsCarryHList = wmsCarryHs.ToList();
|
||||
wmsCarryHList.ForEach(r =>
|
||||
{
|
||||
r.location_id = disTask.endlocation_id;
|
||||
r.location_code = disTask.endlocation_code;
|
||||
r.source_id = disTask.id;
|
||||
r.source_code = disTask.bill_code;
|
||||
});
|
||||
await db.Updateable(wmsCarryHList).ExecuteCommandAsync();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ISugarQueryable<WmsMechanicalArmH> WmsMechanicalArmHs = db.Queryable<WmsMechanicalArmH>().Where(r => r.point_code == disTask.startpoint_code);
|
||||
if (WmsMechanicalArmHs.Count() == 0)
|
||||
// 去暂存仓取货
|
||||
if (rackAreaPoints.Contains(disTask.endlocation_code))
|
||||
{
|
||||
Logger.Information($"【二楼机械臂Floor2MechanicalComplete】 任务执行起点{disTask.endpoint_code} 与料架区的点位不匹配");
|
||||
return false;
|
||||
|
||||
Logger.Information($"【二楼机械臂Floor2MechanicalComplete】{disTask.bill_code} AGV在暂存仓取货完成");
|
||||
}
|
||||
WmsMechanicalArmH target = WmsMechanicalArmHs.First();
|
||||
|
||||
//回写出库单状态
|
||||
await db.Updateable<WmsEmptyOutstockH>().SetColumns(r=>new WmsEmptyOutstockH
|
||||
else // 去料架区取货
|
||||
{
|
||||
bindrackcomplete = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID
|
||||
}).Where(r => r.bill_code == target.outbill).ExecuteCommandAsync();
|
||||
ISugarQueryable<WmsMechanicalArmH> WmsMechanicalArmHs = db.Queryable<WmsMechanicalArmH>().Where(r => r.point_code == disTask.startpoint_code);
|
||||
if (WmsMechanicalArmHs.Count() == 0)
|
||||
{
|
||||
Logger.Information($"【二楼机械臂Floor2MechanicalComplete】 任务执行起点{disTask.endpoint_code} 与料架区的点位不匹配");
|
||||
return false;
|
||||
}
|
||||
WmsMechanicalArmH target = WmsMechanicalArmHs.First();
|
||||
|
||||
// 重置料架区
|
||||
await db.Updateable<WmsMechanicalArmH>().SetColumns(r => new WmsMechanicalArmH
|
||||
{
|
||||
stackingcount = 0,
|
||||
barcodes = "",
|
||||
outbill = "",
|
||||
maxnum = 0,
|
||||
iscreatepretask = 0,
|
||||
rackcode = "",
|
||||
rackid = "",
|
||||
agvconfirm = 0,
|
||||
mechanicalconfirm = 0
|
||||
}).Where(r => r.id == target.id).ExecuteCommandAsync();
|
||||
Logger.Information($"【二楼机械臂Floor2MechanicalComplete】{disTask.bill_code} AGV已到货");
|
||||
//回写出库单状态
|
||||
await db.Updateable<WmsEmptyOutstockH>().SetColumns(r => new WmsEmptyOutstockH
|
||||
{
|
||||
bindrackcomplete = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID
|
||||
}).Where(r => r.bill_code == target.outbill).ExecuteCommandAsync();
|
||||
|
||||
// 重置料架区
|
||||
await db.Updateable<WmsMechanicalArmH>().SetColumns(r => new WmsMechanicalArmH
|
||||
{
|
||||
stackingcount = 0,
|
||||
barcodes = "",
|
||||
outbill = "",
|
||||
maxnum = 0,
|
||||
iscreatepretask = 0,
|
||||
rackcode = "",
|
||||
rackid = "",
|
||||
agvconfirm = 0,
|
||||
mechanicalconfirm = 0
|
||||
}).Where(r => r.id == target.id).ExecuteCommandAsync();
|
||||
Logger.Information($"【二楼机械臂Floor2MechanicalComplete】{disTask.bill_code} AGV在料架区取货完成");
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
@@ -547,9 +580,9 @@ namespace Tnb.WarehouseMgr
|
||||
var normalPreTasks = preTasks.Where(it => it.area_code != "B" && !agvElevatorTasks.Concat(elePreTasks).Select(x => x.endlocation_code).Contains(it.endlocation_code)).ToList();
|
||||
|
||||
|
||||
Logger.Information("【GenTaskExecute】 电梯预任务elePreTasks:" + JsonConvert.SerializeObject(elePreTasks));
|
||||
Logger.Information("【GenTaskExecute】 AGV/CTU/KIVA预任务normalPreTasks:" + JsonConvert.SerializeObject(normalPreTasks));
|
||||
Logger.Information("【GenTaskExecute】 AGV电梯预任务agvElevatorTasks:" + JsonConvert.SerializeObject(agvElevatorTasks));
|
||||
//Logger.Information("【GenTaskExecute】 电梯预任务elePreTasks:" + JsonConvert.SerializeObject(elePreTasks));
|
||||
//Logger.Information("【GenTaskExecute】 AGV/CTU/KIVA预任务normalPreTasks:" + JsonConvert.SerializeObject(normalPreTasks));
|
||||
//Logger.Information("【GenTaskExecute】 AGV电梯预任务agvElevatorTasks:" + JsonConvert.SerializeObject(agvElevatorTasks));
|
||||
|
||||
/* IEnumerable<WmsPretaskH?> firstEleGrp = agvElevatorTasks.GroupBy(g => g.endlocation_code).Select(t => t.OrderBy(o => o.bill_code).FirstOrDefault());
|
||||
agvElevatorTasks = firstEleGrp?.ToList() ?? Enumerable.Empty<WmsPretaskH>().ToList()!;
|
||||
@@ -845,8 +878,8 @@ namespace Tnb.WarehouseMgr
|
||||
var InTasks = CTUTasks.Where(a => a.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID).ToList();
|
||||
var OutTasks = CTUTasks.Where(a => a.task_type == WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID).ToList();
|
||||
|
||||
Logger.Information($@"【CTUTaskExecute】 获取任务InTasks: {JsonConvert.SerializeObject(InTasks)}");
|
||||
Logger.Information($@"【CTUTaskExecute】 获取任务OutTasks: {JsonConvert.SerializeObject(OutTasks)}");
|
||||
//Logger.Information($@"【CTUTaskExecute】 获取任务InTasks: {JsonConvert.SerializeObject(InTasks)}");
|
||||
//Logger.Information($@"【CTUTaskExecute】 获取任务OutTasks: {JsonConvert.SerializeObject(OutTasks)}");
|
||||
|
||||
var OriginDistaskHs = await db.Queryable<WmsDistaskH>()
|
||||
.InnerJoin<WmsAreaH>((a, b) => a.area_id == b.id)
|
||||
@@ -855,7 +888,7 @@ namespace Tnb.WarehouseMgr
|
||||
.ToListAsync();
|
||||
|
||||
|
||||
Logger.Information($@"【CTUTaskExecute】 OriginDistaskHs: {JsonConvert.SerializeObject(OriginDistaskHs)}");
|
||||
//Logger.Information($@"【CTUTaskExecute】 OriginDistaskHs: {JsonConvert.SerializeObject(OriginDistaskHs)}");
|
||||
|
||||
|
||||
List<WmsDistaskH> DistaskHs = new List<WmsDistaskH>();
|
||||
@@ -992,7 +1025,7 @@ namespace Tnb.WarehouseMgr
|
||||
var time = int.Parse(db.Queryable<BasFactoryConfig>().Where(P => P.key == "getinterval").First().value);
|
||||
timer = new Timer(TimerExec, null, TimeSpan.FromMinutes(time), TimeSpan.FromMinutes(time));
|
||||
}
|
||||
Logger.Information($@"【CTUTaskExecute】 可执行的CTU任务inCtuExec: {JsonConvert.SerializeObject(inCtuExec)}");
|
||||
//Logger.Information($@"【CTUTaskExecute】 可执行的CTU任务inCtuExec: {JsonConvert.SerializeObject(inCtuExec)}");
|
||||
if (inCtuExec.Count > 0)
|
||||
{
|
||||
Logger.Information($"开始执行CTU入库任务: {JsonConvert.SerializeObject(inCtuExec)}");
|
||||
@@ -1004,7 +1037,7 @@ namespace Tnb.WarehouseMgr
|
||||
await CallingCTU(inCtuExec, Ctu.Token, 1);
|
||||
Ctu.Dispose();
|
||||
}
|
||||
Logger.Information($@"【CTUTaskExecute】 可执行的CTU任务outCtuExec: {JsonConvert.SerializeObject(outCtuExec)}");
|
||||
//Logger.Information($@"【CTUTaskExecute】 可执行的CTU任务outCtuExec: {JsonConvert.SerializeObject(outCtuExec)}");
|
||||
if (outCtuExec.Count > 0)
|
||||
{
|
||||
Logger.Information($"开始执行CTU出库任务: {JsonConvert.SerializeObject(outCtuExec)}");
|
||||
@@ -1121,7 +1154,7 @@ namespace Tnb.WarehouseMgr
|
||||
reqBody.taskChainPriority = 0;
|
||||
reqBody.taskList = v;
|
||||
reqBody.inOut = type;
|
||||
Logger.Information($"【CallingCTU】 CTU任务下发 开始请求联核/task-chain/create接口 请求地址:{url} 请求参数:{reqBody} type:{(type == 0 ? "CTU出库" : "CTU入库")}");
|
||||
Logger.Information($"【CallingCTU】 CTU任务下发 开始请求联核/task-chain/create接口 请求地址:{url} 请求参数:{JsonConvert.SerializeObject(reqBody)} type:{(type == 0 ? "CTU出库" : "CTU入库")}");
|
||||
dynamic respBody = await HttpClientHelper.PostStreamAsync(url, reqBody, token);
|
||||
Logger.Information($"【CallingCTU】 CTU任务下发 接收到联核/task-chain/create接口信息:{respBody}");
|
||||
}
|
||||
@@ -1327,6 +1360,7 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
Logger.Information("【AgvDispatch】 Agv任务执行....");
|
||||
List<string> kiva = new List<string>();
|
||||
// 一楼中储仓
|
||||
kiva.Add("ZSSSXCTU02");
|
||||
kiva.Add("ZSSSXCTU01");
|
||||
//调用AGV创建任务链接口
|
||||
@@ -1363,7 +1397,7 @@ namespace Tnb.WarehouseMgr
|
||||
reqBody.taskChainPriority = 0;
|
||||
reqBody.taskList = v;
|
||||
reqBody.floor = dis.end_floor;
|
||||
Logger.Information($"【AgvDispatch】 Agv任务执行 开始请求联核/task-chain/create接口 请求地址:{url} 请求参数:{reqBody} ");
|
||||
Logger.Information($"【AgvDispatch】 Agv任务执行 开始请求联核/task-chain/create接口 请求地址:{url} 请求参数:{JsonConvert.SerializeObject(reqBody)} ");
|
||||
dynamic respBody = await HttpClientHelper.PostStreamAsync(url, reqBody, token);
|
||||
Logger.Information($"【AgvDispatch】 Agv任务执行 接收到联核/task-chain/create接口信息:{respBody}");
|
||||
}
|
||||
|
||||
@@ -128,7 +128,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
await _db.Ado.CommitTranAsync();
|
||||
}
|
||||
catch (Exception)
|
||||
catch (Exception ex)
|
||||
{
|
||||
await _db.Ado.RollbackTranAsync();
|
||||
throw;
|
||||
@@ -170,8 +170,104 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 二楼机械手
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="ArgumentNullException"></exception>
|
||||
/// <exception cref="AppFriendlyException"></exception>
|
||||
[NonAction]
|
||||
public async Task<dynamic> CarryBindFloor2UpDownMachine(CarryBindFloor2UpDownMachineInput input)
|
||||
{
|
||||
bool isOk = false;
|
||||
try
|
||||
{
|
||||
if (input == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(input));
|
||||
}
|
||||
|
||||
WmsCarryH? carry = await _db.Queryable<WmsCarryH>().SingleAsync(it => it.id == input.carry_id);
|
||||
WmsCarryH? subCarry = await _db.Queryable<WmsCarryH>().SingleAsync(it => it.id == input.membercarry_id);
|
||||
if (carry != null && subCarry != null)
|
||||
{
|
||||
WmsCarrybindH wmsCarrybindH = new()
|
||||
{
|
||||
carry_id = input.carry_id,
|
||||
carry_code = input.carry_code,
|
||||
membercarry_id = input.membercarry_id,
|
||||
membercarry_code = input.membercarry_code,
|
||||
loc = 1,
|
||||
type = 0,
|
||||
create_time = DateTime.Now
|
||||
};
|
||||
int row = await _db.Insertable(wmsCarrybindH).ExecuteCommandAsync();
|
||||
isOk = row > 0;
|
||||
if (!isOk)
|
||||
{
|
||||
throw Oops.Oh(ErrorCode.COM1001);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (carry == null || subCarry == null)
|
||||
{
|
||||
throw new AppFriendlyException("没有可用的主载具", 500);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
}
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 二楼机械手解绑定
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="ArgumentNullException"></exception>
|
||||
/// <exception cref="AppFriendlyException"></exception>
|
||||
[NonAction]
|
||||
public async Task<dynamic> CarryUnbindFloor2UpDownMachine(CarryBindFloor2UpDownMachineInput input)
|
||||
{
|
||||
bool isOk = false;
|
||||
try
|
||||
{
|
||||
if (input == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(input));
|
||||
}
|
||||
|
||||
WmsCarryH? carry = await _db.Queryable<WmsCarryH>().SingleAsync(it => it.id == input.carry_id);
|
||||
WmsCarryH? subCarry = await _db.Queryable<WmsCarryH>().SingleAsync(it => it.id == input.membercarry_id);
|
||||
if (carry != null && subCarry != null)
|
||||
{
|
||||
int row = await _db.Deleteable<WmsCarrybindH>().Where(r => r.carry_id == input.carry_id && r.membercarry_id == input.membercarry_id).ExecuteCommandAsync();
|
||||
isOk = row > 0;
|
||||
|
||||
if (!isOk)
|
||||
{
|
||||
throw Oops.Oh(ErrorCode.COM1001);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (carry == null || subCarry == null)
|
||||
{
|
||||
throw new AppFriendlyException("没有可用的主载具", 500);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
}
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
|
||||
/* public override async Task ModifyAsync(WareHouseUpInput input)
|
||||
{
|
||||
if (input == null) throw new ArgumentNullException(nameof(input));
|
||||
|
||||
Reference in New Issue
Block a user