bug处理
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Tnb.WarehouseMgr.Entities.Consts
|
||||
{
|
||||
public class MechanicalArmConsts
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public const string 上升降机请求送空托1 = "上升降机请求送空托1";
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public const string 上升降机请求送空托2 = "上升降机请求送空托2";
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public const string 上升降机空托1送到 = "上升降机空托1送到";
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public const string 上升降机空托2送到 = "上升降机空托2送到";
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public const string 上升降机请求取满托1 = "上升降机请求取满托1";
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public const string 上升降机请求取满托2 = "上升降机请求取满托2";
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public const string 上升降机满托1移走 = "上升降机满托1移走";
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public const string 上升降机满托2移走 = "上升降机满托2移走";
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public const string 上升降机满托1数量 = "上升降机满托1数量";
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public const string 上升降机满托2数量 = "上升降机满托2数量";
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public const string 上升降机当前码垛位 = "上升降机当前码垛位";
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public const string 下升降机当前码垛位 = "下升降机当前码垛位";
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
using JNPF.Common.Contracts;
|
||||
using JNPF.Common.Security;
|
||||
using SqlSugar;
|
||||
|
||||
namespace Tnb.WarehouseMgr.Entities;
|
||||
|
||||
/// <summary>
|
||||
/// 机械臂主表
|
||||
/// </summary>
|
||||
[SugarTable("wms_mechanicalArm_d")]
|
||||
public partial class WmsMechanicalArmD : BaseEntity<string>
|
||||
{
|
||||
public WmsMechanicalArmD()
|
||||
{
|
||||
id = SnowflakeIdHelper.NextId();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
using JNPF.Common.Contracts;
|
||||
using JNPF.Common.Security;
|
||||
using SqlSugar;
|
||||
|
||||
namespace Tnb.WarehouseMgr.Entities;
|
||||
|
||||
/// <summary>
|
||||
/// 机械臂主表
|
||||
/// </summary>
|
||||
[SugarTable("wms_mechanicalArm_h")]
|
||||
public partial class WmsMechanicalArmH : BaseEntity<string>
|
||||
{
|
||||
public WmsMechanicalArmH()
|
||||
{
|
||||
id = SnowflakeIdHelper.NextId();
|
||||
}
|
||||
}
|
||||
119
WarehouseMgr/Tnb.WarehouseMgr/DevServBase`1.cs
Normal file
119
WarehouseMgr/Tnb.WarehouseMgr/DevServBase`1.cs
Normal file
@@ -0,0 +1,119 @@
|
||||
using System.Text;
|
||||
using JNPF;
|
||||
using JNPF.Common.Extension;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using SqlSugar;
|
||||
using Tnb.WarehouseMgr.Entities;
|
||||
using Tnb.WarehouseMgr.Entities.Dto.Queries;
|
||||
using Tnb.WarehouseMgr.Entities.Entity;
|
||||
|
||||
namespace Tnb.WarehouseMgr
|
||||
{
|
||||
public class DevServBase<TService> : BaseWareHouseService
|
||||
{
|
||||
protected static Dictionary<string, object> s_elevatorMap = new();
|
||||
|
||||
private static readonly Lazy<Task> initializationTask;
|
||||
private static SqlSugarScope context;
|
||||
private readonly ISqlSugarClient _db;
|
||||
public static Dictionary<string, int> s_eleUseStatusDic = new();
|
||||
public static Dictionary<string, int> s_loadedStatusDic = new();
|
||||
|
||||
static DevServBase()
|
||||
{
|
||||
//initializationTask = new Lazy<Task>(InitializeAsync);
|
||||
_ = Task.Run(() => InitializeAsync());
|
||||
}
|
||||
|
||||
public DevServBase(ISqlSugarClient db)
|
||||
{
|
||||
_db = db;
|
||||
}
|
||||
|
||||
|
||||
private static async Task InitializeAsync()
|
||||
{
|
||||
|
||||
ConnectionStringsOptions connectionOpts = App.GetConfig<ConnectionStringsOptions>("ConnectionStrings", true);
|
||||
ConnectionConfig cfg = new()
|
||||
{
|
||||
ConfigId = connectionOpts.ConfigId,
|
||||
ConnectionString = connectionOpts.ConnectString,
|
||||
DbType = DbType.PostgreSQL,
|
||||
IsAutoCloseConnection = true,
|
||||
};
|
||||
context = new(cfg);
|
||||
|
||||
s_elevatorMap = await context.Queryable<WmsElevatorH>().ToDictionaryAsync(x => x.elevator_id, x => x.elevator_code);
|
||||
|
||||
}
|
||||
//public static Task InitializationTask => initializationTask.Value;
|
||||
|
||||
/// <summary>
|
||||
/// 获取电梯根据任务单号
|
||||
/// </summary>
|
||||
/// <param name="input">
|
||||
/// taskCode:子任务编号
|
||||
/// endlocation_id:目标库位ID
|
||||
/// </param>
|
||||
/// <returns></returns>
|
||||
|
||||
protected async Task<WmsElevatorH> FindElevatorFromPars(ElevagorInfoQuery input)
|
||||
{
|
||||
var whereExpable = Expressionable.Create<WmsElevatorH, WmsElevatorD, WmsDistaskH>()
|
||||
.And((a, b, c) => a.enabled == 1);
|
||||
if (!input.taskCode.IsNullOrEmpty())
|
||||
{
|
||||
whereExpable.AndIF(!SqlFunc.IsNullOrEmpty(input.taskCode), (a, b, c) => c.bill_code == input.taskCode);
|
||||
}
|
||||
if (!input.endlocation_id.IsNullOrEmpty())
|
||||
{
|
||||
whereExpable.AndIF(!SqlFunc.IsNullOrEmpty(input.endlocation_id), (a, b, c) => b.location_id == input.endlocation_id);
|
||||
}
|
||||
if (!input.startlocation_id.IsNullOrEmpty())
|
||||
{
|
||||
whereExpable.AndIF(!SqlFunc.IsNullOrEmpty(input.startlocation_id), (a, b, c) => b.location_id == input.startlocation_id);
|
||||
}
|
||||
var ele = await _db.CopyNew().Queryable<WmsElevatorH>().InnerJoin<WmsElevatorD>((a, b) => a.id == b.bill_id)
|
||||
.InnerJoin<WmsDistaskH>((a, b, c) => b.location_code == c.endlocation_code || b.location_code == c.startlocation_code)
|
||||
.Where(whereExpable.ToExpression())
|
||||
.WhereIF(!SqlFunc.IsNullOrEmpty(input.sourceName) && SqlFunc.StartsWith("DT-R", input.sourceName), (a, b, c) => c.startpoint_code == input.sourceName)
|
||||
.WhereIF(!SqlFunc.IsNullOrEmpty(input.sourceName) && SqlFunc.StartsWith("DT-C", input.sourceName), (a, b, c) => c.endpoint_code == input.sourceName)
|
||||
.Select((a, b, c) => new WmsElevatorH
|
||||
{
|
||||
bill_code = c.bill_code,
|
||||
device_id = a.elevator_id,
|
||||
end_floor = c.end_floor
|
||||
}, true)
|
||||
.FirstAsync();
|
||||
|
||||
return ele;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static class CustomLoggerExtenstions
|
||||
{
|
||||
public static void Debug(this ILogger logger, string message, params object[] parameters)
|
||||
{
|
||||
logger.Debug(message, parameters);
|
||||
}
|
||||
|
||||
public static void Information(this ILogger logger, string message, params object[] parameters)
|
||||
{
|
||||
logger.LogInformation(message, parameters);
|
||||
}
|
||||
|
||||
public static void Error(this ILogger logger, string message, Exception ex, params object[] parameters)
|
||||
{
|
||||
logger.LogError(ex, message, parameters);
|
||||
}
|
||||
|
||||
public static void Error(this ILogger logger, string message, params object[] parameters)
|
||||
{
|
||||
logger.LogError(message, parameters);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,6 @@
|
||||
using JNPF;
|
||||
using Aliyun.OSS;
|
||||
using Aop.Api.Domain;
|
||||
using JNPF;
|
||||
using JNPF.Common.Core.Manager;
|
||||
using JNPF.Common.Enums;
|
||||
using JNPF.Common.Extension;
|
||||
@@ -34,7 +36,7 @@ namespace Tnb.WarehouseMgr
|
||||
/// Wms设备接口提供程序服务类
|
||||
/// </summary>
|
||||
|
||||
public class DeviceProviderService : ServiceLoggerBase<DeviceProviderService>
|
||||
public class DeviceProviderService : DevServBase<DeviceProviderService>
|
||||
{
|
||||
private readonly ISqlSugarClient _db;
|
||||
private readonly IWareHouseService _wareHouseService;
|
||||
@@ -45,7 +47,6 @@ namespace Tnb.WarehouseMgr
|
||||
private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build<ElevatorControlConfiguration>();
|
||||
private readonly ILoggerFactory _loggerFactory;
|
||||
public static Dictionary<string, int> s_eleUseStatusDic = new();
|
||||
public static Dictionary<string, int> s_loadedStatusDic = new();
|
||||
|
||||
|
||||
|
||||
@@ -54,7 +55,7 @@ namespace Tnb.WarehouseMgr
|
||||
IEventPublisher eventPublisher,
|
||||
IUserManager userManger,
|
||||
IElevatorControlService elevatorControlService
|
||||
) //: base(repository.AsSugarClient())
|
||||
) : base(repository.AsSugarClient())
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_wareHouseService = wareHouseService;
|
||||
@@ -92,7 +93,7 @@ namespace Tnb.WarehouseMgr
|
||||
public async Task<Tnb.WarehouseMgr.Entities.Dto.Outputs.Result> LoadConfirm(ConfirmInput input)
|
||||
{
|
||||
|
||||
Logger.Information("取货确认..................");
|
||||
Logger.Information("【LoadConfirm】接收到WCS取货确认信号.................. ");
|
||||
|
||||
var dis = _db.Queryable<WmsDistaskH>().Where(P => P.bill_code == input.taskCode).First();
|
||||
if (dis.area_code == "ZSCJ001")
|
||||
@@ -101,12 +102,12 @@ namespace Tnb.WarehouseMgr
|
||||
if (flag)
|
||||
{
|
||||
await _wareHouseService.SsxControl(dis, "LOAD");
|
||||
Logger.Information(dis.startlocation_code+"取货确认..................成功");
|
||||
Logger.Information("【LoadConfirm】 " + dis.startlocation_code + "取货确认..................成功");
|
||||
return await ToApiResult(HttpStatusCode.OK, "成功");
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.Information(dis.startlocation_code + "取货确认..................失败");
|
||||
Logger.Information("【LoadConfirm】 " + dis.startlocation_code + "取货确认..................失败");
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, "失败");
|
||||
}
|
||||
}
|
||||
@@ -126,14 +127,14 @@ namespace Tnb.WarehouseMgr
|
||||
device_id = a.elevator_id,
|
||||
}, true)
|
||||
.FirstAsync();*/
|
||||
Logger.Information($"当前取货,子任务编号:{input.taskCode}");
|
||||
Logger.Information($"【LoadConfirm】 当前取货,子任务编号:{input.taskCode}");
|
||||
|
||||
ElevagorInfoQuery q = new() { taskCode = input.taskCode, sourceName = input.sourceName };
|
||||
WmsElevatorH elevator = await FindElevatorFromPars(q);
|
||||
if (elevator.IsNull())
|
||||
{
|
||||
Logger.Error("未找到匹配的电梯任务", new Exception($"根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务"));
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, $"根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务");
|
||||
Logger.Error("【LoadConfirm】 未找到匹配的电梯任务", new Exception($"【LoadConfirm】 根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务"));
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, $"【LoadConfirm】 根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务");
|
||||
}
|
||||
try
|
||||
{
|
||||
@@ -141,11 +142,11 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
//s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.空闲;
|
||||
string devName = elevatorCode?.ToString();
|
||||
Logger.Information($"获取设备:{devName},状态");
|
||||
Logger.Information($"【LoadConfirm】 获取设备:{devName},状态");
|
||||
var tags = _eleCtlCfg.tags;
|
||||
await Task.Delay(1000);
|
||||
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None);
|
||||
Logger.Information($"电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>()},运行状态:{runStatus.ToEnum<EnumRunStatus>()},Agv状态:{agvStatus.ToEnum<EnumAgvStatus>()},当前楼层:{floorNo}");
|
||||
Logger.Information($"【LoadConfirm】 电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>()},运行状态:{runStatus.ToEnum<EnumRunStatus>()},Agv状态:{agvStatus.ToEnum<EnumAgvStatus>()},当前楼层:{floorNo}");
|
||||
{
|
||||
var curFloor = await GetRealFloor(elevator.end_floor);
|
||||
/* Logger.Information($"目标楼层:{curFloor},电梯当前楼层:{floorNo}");
|
||||
@@ -153,13 +154,13 @@ namespace Tnb.WarehouseMgr
|
||||
var loadedStatus = s_eleUseStatusDic[elevator.device_id] == 1 ? "完成" : "未完成";
|
||||
Logger.Information($"{devName.Match(@"\d+")}#梯,取货-> {loadedStatus}");
|
||||
*/
|
||||
if (s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲 &&curFloor != floorNo)
|
||||
if (s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲 && curFloor != floorNo)
|
||||
{
|
||||
_ = await _elevatorControlService.CallLift(devName, curFloor, CancellationToken.None);
|
||||
}
|
||||
if (curFloor != floorNo)
|
||||
{
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!");
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, "【LoadConfirm】 电梯还未开门,请重试!");
|
||||
}
|
||||
if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus.开门到位保持 && runStatus.ToEnum<EnumRunStatus>() == EnumRunStatus.停梯 && floorNo == curFloor) //判断电梯楼层与当前放货在同一楼层在允许放货
|
||||
{
|
||||
@@ -199,6 +200,7 @@ namespace Tnb.WarehouseMgr
|
||||
|
||||
protected async Task<WmsElevatorH> FindElevatorFromPars(ElevagorInfoQuery input)
|
||||
{
|
||||
Logger.Information($"【FindElevatorFromPars】 根据任务单号获取电梯参数: {JsonConvert.SerializeObject(input)}");
|
||||
var whereExpable = Expressionable.Create<WmsElevatorH, WmsElevatorD, WmsDistaskH>()
|
||||
.And((a, b, c) => a.enabled == 1);
|
||||
if (!input.taskCode.IsNullOrEmpty())
|
||||
@@ -213,7 +215,8 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
whereExpable.AndIF(!SqlFunc.IsNullOrEmpty(input.startlocation_id), (a, b, c) => b.location_id == input.startlocation_id);
|
||||
}
|
||||
var ele = await _db.CopyNew().Queryable<WmsElevatorH>().InnerJoin<WmsElevatorD>((a, b) => a.id == b.bill_id)
|
||||
|
||||
ISugarQueryable<WmsElevatorH> queryable = _db.CopyNew().Queryable<WmsElevatorH>().InnerJoin<WmsElevatorD>((a, b) => a.id == b.bill_id)
|
||||
.InnerJoin<WmsDistaskH>((a, b, c) => b.location_code == c.endlocation_code || b.location_code == c.startlocation_code)
|
||||
.Where(whereExpable.ToExpression())
|
||||
.WhereIF(!SqlFunc.IsNullOrEmpty(input.sourceName) && SqlFunc.StartsWith("DT-R", input.sourceName), (a, b, c) => c.startpoint_code == input.sourceName)
|
||||
@@ -223,9 +226,13 @@ namespace Tnb.WarehouseMgr
|
||||
bill_code = c.bill_code,
|
||||
device_id = a.elevator_id,
|
||||
end_floor = c.end_floor
|
||||
}, true)
|
||||
}, true);
|
||||
Logger.Information($"【FindElevatorFromPars】 根据任务单号获取电梯sql {queryable.ToSqlString()}");
|
||||
var ele = await queryable
|
||||
.FirstAsync();
|
||||
|
||||
|
||||
|
||||
return ele;
|
||||
|
||||
}
|
||||
@@ -238,8 +245,8 @@ namespace Tnb.WarehouseMgr
|
||||
[HttpPost, NonUnify, AllowAnonymous]
|
||||
public async Task<Tnb.WarehouseMgr.Entities.Dto.Outputs.Result> UnloadConfirm(ConfirmInput input)//
|
||||
{
|
||||
Logger.Information("放货确认..................");
|
||||
Logger.Information($"当前放货,任务编号:{input.taskCode}");
|
||||
Logger.Information("【UnloadConfirm】 接收到WCS放货确认信号..................");
|
||||
Logger.Information($"【UnloadConfirm】 当前放货,任务编号:{input.taskCode}");
|
||||
var dis = _db.Queryable<WmsDistaskH>().Where(P => P.bill_code == input.taskCode).First();
|
||||
if (dis.area_code == "ZSCJ001")
|
||||
{
|
||||
@@ -277,49 +284,48 @@ namespace Tnb.WarehouseMgr
|
||||
WmsElevatorH elevator = await FindElevatorFromPars(q);
|
||||
if (elevator.IsNull())
|
||||
{
|
||||
Logger.Error($"根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务");
|
||||
Logger.Error($"【UnloadConfirm】 根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务");
|
||||
}
|
||||
if (s_elevatorMap.TryGetValue(elevator.device_id, out object? elevatorCode))
|
||||
{
|
||||
|
||||
string devName = elevatorCode?.ToString();
|
||||
|
||||
Logger.Information($"当前放货设备ID:{elevator.device_id}");
|
||||
Logger.Information($"【UnloadConfirm】 当前放货设备ID:{elevator.device_id}");
|
||||
var loadedStatus = s_eleUseStatusDic[elevator.device_id] == 1 ? "占用" : "空闲";
|
||||
Logger.Information($"{devName.Match(@"\d+")}#梯,状态-> {loadedStatus}");
|
||||
Logger.Information($"获取设备:{devName},状态");
|
||||
Logger.Information($"【UnloadConfirm】 {devName.Match(@"\d+")}#梯,状态-> {loadedStatus}");
|
||||
Logger.Information($"【UnloadConfirm】 获取设备:{devName},状态");
|
||||
//await Task.Delay(3000);
|
||||
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, _eleCtlCfg.tags, CancellationToken.None);//elevator.elevator_code
|
||||
Logger.Information($"电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>()},运行状态:{runStatus},门状态:{doorStatus},Agv状态:{agvStatus},当前楼层:{floorNo}");
|
||||
Logger.Information($"【UnloadConfirm】 电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>()},运行状态:{runStatus},门状态:{doorStatus},Agv状态:{agvStatus},当前楼层:{floorNo}");
|
||||
//判断Agv电梯是否进入状态
|
||||
if (agvStatus != (int)EnumAgvStatus.AGV运行状态)
|
||||
{
|
||||
await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1);
|
||||
dynamic res = await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1);
|
||||
Logger.Information($"【UnloadConfirm】 发送AGVControl 切换电梯{devName}控制模式结果 {JsonConvert.SerializeObject(res)}");
|
||||
}
|
||||
|
||||
var curFloor = await GetRealFloor(elevator.end_floor);
|
||||
|
||||
|
||||
|
||||
Logger.Information($"【UnloadConfirm】 电梯状态 {s_eleUseStatusDic[elevator.device_id]} 当前楼层:{curFloor},电梯所在楼层:{floorNo}");
|
||||
if (s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲 && curFloor != floorNo)
|
||||
{
|
||||
_ = await _elevatorControlService.CallLift(devName, curFloor, CancellationToken.None);
|
||||
}
|
||||
if (curFloor != floorNo)
|
||||
{
|
||||
Logger.Information($"【UnloadConfirm】 电梯还未开门,请重试!curFloor != floorNo");
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!");
|
||||
}
|
||||
|
||||
Logger.Information($"当前楼层:{curFloor},电梯所在楼层:{floorNo}");
|
||||
|
||||
|
||||
|
||||
if (doorStatus == (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.占用)
|
||||
{
|
||||
Logger.Information($"【UnloadConfirm】 电梯当前在s_eleUseStatusDic中的状态为占用!");
|
||||
await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!");
|
||||
}
|
||||
//电梯到达目标楼层后,判断当前电梯门状态是否为开门到位保持状态
|
||||
if (doorStatus != (int)EnumDoorStatus.开门到位保持 && curFloor == floorNo) //判断目标楼层与电梯所在楼层在同一层才可开门放货
|
||||
if (doorStatus != (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲 && curFloor == floorNo) //判断目标楼层与电梯所在楼层在同一层才可开门放货
|
||||
{
|
||||
_ = await _elevatorControlService.SendOpenCloseCmd(devName, 3); //发送电梯前门开门指令
|
||||
}
|
||||
@@ -327,21 +333,23 @@ namespace Tnb.WarehouseMgr
|
||||
if (sysStatus == (int)EnumSysStatus.正常状态 && runStatus == (int)EnumRunStatus.停梯
|
||||
&& doorStatus == (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲)
|
||||
{
|
||||
Logger.Information($"【UnloadConfirm】 成功");
|
||||
s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.占用;
|
||||
return await ToApiResult(HttpStatusCode.OK, "成功");
|
||||
}
|
||||
Logger.Information($"【UnloadConfirm】 电梯还未开门,请重试!sysStatus: {sysStatus} runStatus:{runStatus} doorStatus: {doorStatus} s_eleUseStatusDic[elevator.device_id]: {s_eleUseStatusDic[elevator.device_id]}");
|
||||
}
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!");
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Error("放货确认失败", ex);
|
||||
Logger.Error("【UnloadConfirm】 放货确认失败", ex);
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 任务链状态上报
|
||||
/// </summary>
|
||||
@@ -352,7 +360,7 @@ namespace Tnb.WarehouseMgr
|
||||
|
||||
try
|
||||
{
|
||||
Logger.Information($"任务链上报->任务链编号:{input.taskChainCode},状态:{input.status},设备ID:{input.deviceID}");
|
||||
Logger.Information($"【TaskChainCallBack】 接收到WCS信号 任务链上报->任务链编号:{input.taskChainCode},状态:{input.status},设备ID:{input.deviceID}");
|
||||
switch (input.status)
|
||||
{
|
||||
case "CREATED": break;
|
||||
@@ -366,7 +374,7 @@ namespace Tnb.WarehouseMgr
|
||||
List<EqpEquipment> eps = await _db.Queryable<EqpEquipment>().Where(it => it.code.Contains(input.deviceID)).ToListAsync();
|
||||
if (disTasks == null || disTasks.Count < 1)
|
||||
{
|
||||
Logger.Error($"根据任务链编号:{input.taskChainCode} ,未获取到任何任务");
|
||||
Logger.Error($"【TaskChainCallBack】 根据任务链编号:{input.taskChainCode} ,未获取到任何任务");
|
||||
}
|
||||
if (disTasks?.Count > 0)
|
||||
{
|
||||
@@ -410,8 +418,8 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Error("任务链状态上报", ex);
|
||||
Logger.Error($"任务链状态上报错误堆栈{Environment.NewLine}{ex.StackTrace}");
|
||||
Logger.Error("【TaskChainCallBack】 任务链状态上报", ex);
|
||||
Logger.Error($"【TaskChainCallBack】 任务链状态上报错误堆栈{Environment.NewLine}{ex.StackTrace}");
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, "请重试!");
|
||||
throw;
|
||||
}
|
||||
@@ -429,7 +437,7 @@ namespace Tnb.WarehouseMgr
|
||||
public async Task<Tnb.WarehouseMgr.Entities.Dto.Outputs.Result> TaskCallback(TaskCallBackInput input)
|
||||
{
|
||||
|
||||
Logger.Information($"任务状态上报->接收参数:{JsonConvert.SerializeObject(input)}");
|
||||
Logger.Information($"【TaskCallback】 接收到WCS信号 任务状态上报->接收参数:{JsonConvert.SerializeObject(input)}");
|
||||
try
|
||||
{
|
||||
var disTask = await _db.Queryable<WmsDistaskH>().FirstAsync(it => it.bill_code == input.taskCode);
|
||||
@@ -441,34 +449,44 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
disTaskIds = disTasks.Select(x => x.id).ToList()
|
||||
};
|
||||
Logger.Information($"设备取返回输入参数:{JsonConvert.SerializeObject(taskExecuteAfterUpInput)}");
|
||||
Logger.Information($"【TaskCallback】 设备取返回输入参数:{JsonConvert.SerializeObject(taskExecuteAfterUpInput)}");
|
||||
await _wareHouseService.TaskExecuteAfter(taskExecuteAfterUpInput);
|
||||
Logger.Information($"Agv取货完成,任务编号:{string.Join(",", disTasks.Select(x => x.bill_code))}");
|
||||
Logger.Information($"【TaskCallback】 Agv取货完成,任务编号:{string.Join(",", disTasks.Select(x => x.bill_code))}");
|
||||
|
||||
//根据Agv传递的参数获取,对应的电梯
|
||||
|
||||
if(!input.sourceName.IsNullOrWhiteSpace() && input.sourceName.Contains("DT-R", StringComparison.OrdinalIgnoreCase))
|
||||
|
||||
if (!input.sourceName.IsNullOrWhiteSpace() && (input.sourceName.Contains("DT-R", StringComparison.OrdinalIgnoreCase)))
|
||||
{
|
||||
Logger.Information($"【TaskCallback】 开始根据任务单查找电梯 {input.sourceName}");
|
||||
ElevagorInfoQuery q = new() { taskCode = input.taskCode };
|
||||
if (!input.sourceName.IsNullOrEmpty())
|
||||
{
|
||||
q = new() { taskCode = input.taskCode, sourceName = input.sourceName };
|
||||
}
|
||||
WmsElevatorH elevator = await FindElevatorFromPars(q);
|
||||
Logger.Information($"【TaskCallback】 根据任务单查找电梯结果 {JsonConvert.SerializeObject(elevator)}");
|
||||
if (!elevator?.device_id.IsNullOrEmpty() ?? false)
|
||||
{
|
||||
s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.空闲;
|
||||
// 根据disTask StartLocationId 起始库位关联电梯获取设备ID location_code.Continas("")
|
||||
var devName = s_elevatorMap[elevator.device_id]?.ToString();
|
||||
Logger.Information($"{devName.Match(@"\d+")}#梯,设备名称:{devName},开始进入关门流程");
|
||||
Logger.Information($"【TaskCallback】 {devName.Match(@"\d+")}#梯,设备名称:{devName},开始进入关门流程");
|
||||
int doorStatus = await _elevatorControlService.GetTagAsync(devName, ElevatorConsts.DoorStatus);
|
||||
Logger.Information($"设备:{devName},门状态:{doorStatus.ToEnum<EnumDoorStatus>().ToString()}");
|
||||
Logger.Information($"【TaskCallback】 设备:{devName},门状态:{doorStatus.ToEnum<EnumDoorStatus>().ToString()}");
|
||||
if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus.关门到位保持
|
||||
)//&& !disTask.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase)
|
||||
{
|
||||
_ = await _elevatorControlService.SendOpenCloseCmd(devName, 4); //向电梯发送前门关门指令
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.Information($"【TaskCallback】 没找到电梯,不能解锁电梯状态 {JsonConvert.SerializeObject(elevator)}");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.Information($"【TaskCallback】sourceName不符合条件 {input.sourceName}");
|
||||
}
|
||||
|
||||
|
||||
@@ -503,8 +521,8 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Error("任务状态上报出现错误", ex);
|
||||
Logger.Error("任务状态上报错误堆栈信息", ex.StackTrace);
|
||||
Logger.Error("【TaskCallback】 任务状态上报出现错误", ex);
|
||||
Logger.Error("【TaskCallback】 任务状态上报错误堆栈信息", ex.StackTrace);
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, "请重试!");
|
||||
throw;
|
||||
}
|
||||
@@ -526,13 +544,15 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
try
|
||||
{
|
||||
Logger.Information($"【ElevatorConfirm】 接收到WCS申请进出电梯信号 接收参数:{JsonConvert.SerializeObject(input)}");
|
||||
List<WmsElevatorH> eles = await _db.Queryable<WmsElevatorH>().LeftJoin<WmsElevatorD>((a, b) => a.id == b.bill_id)
|
||||
.LeftJoin<WmsDistaskH>((a, b, c) => b.location_id == c.startlocation_id)
|
||||
.Where((a, b, c) => c.startlocation_code == input.sourceName && c.bill_code == input.taskCode)
|
||||
.ToListAsync();
|
||||
}
|
||||
catch (Exception)
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Error("【ElevatorConfirm】 申请进出电梯信号错误", ex);
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, "请重试!");
|
||||
throw;
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using Tnb.Common.Extension;
|
||||
using Tnb.Common.Utils;
|
||||
@@ -200,11 +201,15 @@ namespace Tnb.WarehouseMgr
|
||||
var eleStatusMap = await RedisHelper.HGetAllAsync(devName);
|
||||
try
|
||||
{
|
||||
_ = await HttpClientHelper.GetAsync(_elevatorCtlCfg.WriteTagUrl, pars: dicCommand);
|
||||
Logger.Information($"【SendOpenCloseCmd】 向系统发送开关门指令 {_elevatorCtlCfg.WriteTagUrl} {JsonConvert.SerializeObject(dicCommand)}");
|
||||
var res = await HttpClientHelper.GetAsync(_elevatorCtlCfg.WriteTagUrl, pars: dicCommand);
|
||||
Logger.Information($"【SendOpenCloseCmd】 向系统发送开关门指令 结果:{res}");
|
||||
flag = true;
|
||||
//flag = await RedisHelper.HSetAsync(devName, ElevatorConsts.DoorExecute, value);
|
||||
}
|
||||
catch (Exception)
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Information($"【SendOpenCloseCmd】 向系统发送开关门指令发生异常 {ex}");
|
||||
return false;
|
||||
}
|
||||
return flag;
|
||||
@@ -243,6 +248,7 @@ namespace Tnb.WarehouseMgr
|
||||
["TagName"] = tagName,
|
||||
["Value"] = value.ToString()
|
||||
};
|
||||
Logger.Information($"【WriteTagAsync】 呼梯指令开始发送 {_elevatorCtlCfg.WriteTagUrl} {JsonConvert.SerializeObject(dicCommand)}");
|
||||
return await HttpClientHelper.GetAsync(_elevatorCtlCfg.WriteTagUrl, pars: dicCommand);
|
||||
|
||||
//return await RedisHelper.HSetAsync(devName, tagName, value);
|
||||
@@ -448,7 +454,7 @@ namespace Tnb.WarehouseMgr
|
||||
bool isSuccefuly = false;
|
||||
var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" };
|
||||
(int sysStatus, int runStatus, _, int doorStatus, int agvStatus) = await GetElevatorStatus(devName, tags, CancellationToken.None);
|
||||
Logger.Information($"开始呼梯,当前{devName.Match(@"\d+")}#梯,sysStatus:{sysStatus.ToEnum<EnumSysStatus>().ToString()},runStatus:{runStatus.ToEnum<EnumRunStatus>().ToString()},doorStatus:{doorStatus.ToEnum<EnumDoorStatus>().ToString()},agvStatus:{agvStatus.ToEnum<EnumAgvStatus>().ToString()}");
|
||||
Logger.Information($"【CallLift】 开始呼梯(FloorExecute)到{floor}(此楼层编号经实际楼层转换),当前{devName.Match(@"\d+")}#梯,sysStatus:{sysStatus.ToEnum<EnumSysStatus>().ToString()},runStatus:{runStatus.ToEnum<EnumRunStatus>().ToString()},doorStatus:{doorStatus.ToEnum<EnumDoorStatus>().ToString()},agvStatus:{agvStatus.ToEnum<EnumAgvStatus>().ToString()}");
|
||||
//判断当前楼层是否是放货楼层,如不是则呼叫电梯到当前楼层
|
||||
if (sysStatus.ToEnum<EnumSysStatus>() == EnumSysStatus.正常状态 && runStatus.ToEnum<EnumRunStatus>() == EnumRunStatus.停梯 &&
|
||||
agvStatus.ToEnum<EnumAgvStatus>() == EnumAgvStatus.AGV运行状态)
|
||||
@@ -458,6 +464,7 @@ namespace Tnb.WarehouseMgr
|
||||
_ = await SendOpenCloseCmd(devName, (int)EnumAgvControl.前门关门);
|
||||
}
|
||||
dynamic result = await WriteTagAsync(devName, ElevatorConsts.FloorExecute, floor); //呼叫电梯到指定楼层
|
||||
Logger.Information($"【CallLift】 呼梯结果:{JsonConvert.SerializeObject(result)}");
|
||||
if (!string.IsNullOrEmpty(result))
|
||||
{
|
||||
JObject jo = JObject.Parse(result);
|
||||
|
||||
@@ -1,84 +0,0 @@
|
||||
using System.Text;
|
||||
using JNPF;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using SqlSugar;
|
||||
using Tnb.WarehouseMgr.Entities;
|
||||
|
||||
namespace Tnb.WarehouseMgr
|
||||
{
|
||||
public class ServiceLoggerBase<TService> : BaseWareHouseService
|
||||
{
|
||||
protected static Dictionary<string, object> s_elevatorMap = new();
|
||||
private static readonly Lazy<Task> initializationTask;
|
||||
|
||||
|
||||
static ServiceLoggerBase()
|
||||
{
|
||||
initializationTask = new Lazy<Task>(InitializeAsync);
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static async Task InitializeAsync()
|
||||
{
|
||||
|
||||
ConnectionStringsOptions connectionOpts = App.GetConfig<ConnectionStringsOptions>("ConnectionStrings", true);
|
||||
ConnectionConfig cfg = new()
|
||||
{
|
||||
ConfigId = connectionOpts.ConfigId,
|
||||
ConnectionString = connectionOpts.ConnectString,
|
||||
DbType = DbType.PostgreSQL,
|
||||
IsAutoCloseConnection = true,
|
||||
};
|
||||
SqlSugarScope context = new(cfg);
|
||||
|
||||
s_elevatorMap = await context.Queryable<WmsElevatorH>().ToDictionaryAsync(x => x.elevator_id, x => x.elevator_code);
|
||||
|
||||
}
|
||||
public static Task InitializationTask => initializationTask.Value;
|
||||
|
||||
|
||||
|
||||
//protected ILogger Logger => LoggerFactory.Create(builder => builder.AddFile($"{AppContext.BaseDirectory}/logs/{this.GetType().Name}{DateTime.Now:yyyyMMdd}.log", cfgOpts =>
|
||||
//{
|
||||
|
||||
// //cfgOpts.DateFormat = "yyyy-MM-dd HH:mm:ss.fff";
|
||||
// cfgOpts.MessageFormat = (logMsg) =>
|
||||
// {
|
||||
// Span<char> span = logMsg.LogLevel.ToString().ToCharArray();
|
||||
// StringBuilder sb = new();
|
||||
// _ = sb.Append($"{span[..4]} ");
|
||||
// _ = 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();
|
||||
// };
|
||||
|
||||
//})).CreateLogger(this.GetType());
|
||||
}
|
||||
|
||||
public static class CustomLoggerExtenstions
|
||||
{
|
||||
public static void Debug(this ILogger logger, string message, params object[] parameters)
|
||||
{
|
||||
logger.Debug(message, parameters);
|
||||
}
|
||||
|
||||
public static void Information(this ILogger logger, string message, params object[] parameters)
|
||||
{
|
||||
logger.LogInformation(message, parameters);
|
||||
}
|
||||
|
||||
public static void Error(this ILogger logger, string message, Exception ex, params object[] parameters)
|
||||
{
|
||||
logger.LogError(ex, message, parameters);
|
||||
}
|
||||
|
||||
public static void Error(this ILogger logger, string message, params object[] parameters)
|
||||
{
|
||||
logger.LogError(message, parameters);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,6 @@
|
||||
<ProjectReference Include="..\..\EquipMgr\Tnb.EquipMgr.Entities\Tnb.EquipMgr.Entities.csproj" />
|
||||
<ProjectReference Include="..\..\message\Tnb.Message.Interfaces\Tnb.Message.Interfaces.csproj" />
|
||||
<ProjectReference Include="..\..\ProductionMgr\Tnb.ProductionMgr.Interfaces\Tnb.ProductionMgr.Interfaces.csproj" />
|
||||
<!--<ProjectReference Include="..\..\ProductionMgr\Tnb.ProductionMgr.Interfaces\Tnb.ProductionMgr.Interfaces.csproj" />-->
|
||||
<ProjectReference Include="..\..\QcMgr\Tnb.QcMgr.Interfaces\Tnb.QcMgr.Interfaces.csproj" />
|
||||
<ProjectReference Include="..\..\visualdev\Tnb.VisualDev.Engine\Tnb.VisualDev.Engine.csproj" />
|
||||
<ProjectReference Include="..\Tnb.WarehouseMgr.Interfaces\Tnb.WarehouseMgr.Interfaces.csproj" />
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
using System.Dynamic;
|
||||
using System.Linq.Expressions;
|
||||
using System.Security.Policy;
|
||||
using System.Threading.Tasks;
|
||||
using Aop.Api.Domain;
|
||||
using JNPF;
|
||||
using JNPF.Common.Contracts;
|
||||
@@ -18,6 +19,7 @@ using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||
using Microsoft.CodeAnalysis;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using NetTaste;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
@@ -28,6 +30,7 @@ using Tnb.BasicData.Entities;
|
||||
using Tnb.Common.Extension;
|
||||
using Tnb.Common.Redis;
|
||||
using Tnb.Common.Utils;
|
||||
using Tnb.ProductionMgr.Entities;
|
||||
using Tnb.WarehouseMgr.Entities;
|
||||
using Tnb.WarehouseMgr.Entities.Configs;
|
||||
using Tnb.WarehouseMgr.Entities.Consts;
|
||||
@@ -43,7 +46,7 @@ namespace Tnb.WarehouseMgr
|
||||
/// <summary>
|
||||
/// 库房业务类(出入库)
|
||||
/// </summary>
|
||||
public class WareHouseService : ServiceLoggerBase<WareHouseService>, IWareHouseService
|
||||
public class WareHouseService : DevServBase<WareHouseService>, IWareHouseService
|
||||
{
|
||||
private readonly ISqlSugarClient _db;
|
||||
private readonly IDictionaryDataService _dictionaryDataService;
|
||||
@@ -63,7 +66,7 @@ namespace Tnb.WarehouseMgr
|
||||
public WareHouseService(ISqlSugarRepository<WmsInstockH> repository, IDictionaryDataService dictionaryDataService, RedisData redisData,
|
||||
IBillRullService billRullService, IUserManager userManager, ICacheManager cacheManager, IElevatorControlService elevatorControlService
|
||||
//IConfiguration configuration
|
||||
)// : base(repository.AsSugarClient())
|
||||
) : base(repository.AsSugarClient())
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_dictionaryDataService = dictionaryDataService;
|
||||
@@ -73,7 +76,9 @@ namespace Tnb.WarehouseMgr
|
||||
_elevatorControlService = elevatorControlService;
|
||||
_redisData = redisData;
|
||||
//_configuration = configuration;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据载具Id带出库位、仓库信息
|
||||
/// </summary>
|
||||
@@ -238,6 +243,7 @@ namespace Tnb.WarehouseMgr
|
||||
.ToListAsync();
|
||||
return input.Size > 0 ? items.Take(input.Size).ToList() : items;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 判断CTU是否可以放货
|
||||
/// </summary>
|
||||
@@ -246,20 +252,20 @@ namespace Tnb.WarehouseMgr
|
||||
[AllowAnonymous]
|
||||
public async Task CheckPut(CheckPutInput input)
|
||||
{
|
||||
Logger.Information("联合请求CheckPut接口传入参数为:" + JsonConvert.SerializeObject(input));
|
||||
Logger.Information("联核请求CheckPut接口传入参数为:" + JsonConvert.SerializeObject(input));
|
||||
|
||||
Dictionary<string, string[]> putdic = new Dictionary<string, string[]>();
|
||||
|
||||
|
||||
putdic.Add("SSX-011-006", new string[] { "YTCS", "AllowEmptyIn_CS06" });
|
||||
putdic.Add("SSX-021-007", new string[] { "东面提升机输送线", "出库输送线7允许入箱" });
|
||||
putdic.Add("SSX-121-009", new string[] { "东面提升机输送线", "上升降机9允许入箱" });
|
||||
putdic.Add("SSX-121-010", new string[] { "东面提升机输送线", "上升降机10允许入箱" });
|
||||
putdic.Add("SSX-021-003", new string[] { "YTCS", "AllowCtuEmptyIn_CS03" });
|
||||
putdic.Add("SSX-021-001", new string[] { "YTCS", "AllowCtuEmptyIn_CS01" });
|
||||
putdic.Add("ZSSSXCTU02", new string[] { "YTCS", "AllowCtuFullOut_CS04", });
|
||||
putdic.Add("ZSSSXCTU02", new string[] { "YTCS", "AllowCtuFullOut_CS04", });
|
||||
putdic.Add("ZSSSXCTU01", new string[] { "YTCS", "AllowCtuFullOut_CS02", });
|
||||
var strs = new string[] { };
|
||||
|
||||
|
||||
if (!putdic.ContainsKey(input.targetName))
|
||||
throw new AppFriendlyException("点位" + input.targetName + "不存在", 500);
|
||||
strs = putdic.Where(p => p.Key == input.targetName).First().Value;
|
||||
@@ -270,12 +276,12 @@ namespace Tnb.WarehouseMgr
|
||||
throw new AppFriendlyException("点位" + input.targetName + "不存在", 500);
|
||||
}
|
||||
string data = await _redisData.GetHash(strs[0], strs[1]);
|
||||
Logger.Information("联合请求CheckPut接口查询X2Server数据:" + data);
|
||||
Logger.Information("联核请求CheckPut接口查询X2Server数据:" + data);
|
||||
JObject? res = JsonConvert.DeserializeObject<JObject>(data);
|
||||
bool result = res != null && res["Value"] != null ? res.Value<bool>("Value") : false;
|
||||
if (!result)
|
||||
throw new AppFriendlyException("点位" + input.targetName + "不可放", 500);
|
||||
Logger.Information("联合请求CheckPut接口结果:CTU可放货" + data);
|
||||
Logger.Information("联核请求CheckPut接口结果:CTU可放货" + data);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -285,6 +291,7 @@ namespace Tnb.WarehouseMgr
|
||||
|
||||
public async Task<bool> Check(string code, string action)
|
||||
{
|
||||
Logger.Information($"【Check】 判断CTU是否可以取货 {code} {action}");
|
||||
Dictionary<string, string[]> putdic = new Dictionary<string, string[]>();
|
||||
Dictionary<string, string[]> getdic = new Dictionary<string, string[]>();
|
||||
putdic.Add("ZSSSXCTU02", new string[] { "YTCS", "AllowCtuFullOut_CS04", });
|
||||
@@ -313,12 +320,15 @@ namespace Tnb.WarehouseMgr
|
||||
if (action == "LOAD")//取货
|
||||
{
|
||||
if (!getdic.ContainsKey(code))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
strs = getdic.Where(p => p.Key == code).First().Value;
|
||||
|
||||
bool flag = _redisData.HashExist(strs[0], strs[1]).Result;
|
||||
if (!flag)
|
||||
{
|
||||
Logger.Information($"【Check】 判断CTU是否可以取货 {code} {action} flag:{flag} ");
|
||||
return false;
|
||||
}
|
||||
string data = _redisData.GetHash(strs[0], strs[1]).Result;
|
||||
@@ -337,6 +347,7 @@ namespace Tnb.WarehouseMgr
|
||||
bool flag = _redisData.HashExist(strs[0], strs[1]).Result;
|
||||
if (!flag)
|
||||
{
|
||||
Logger.Information($"【Check】 判断CTU是否可以取货 {code} {action} flag:{flag} ");
|
||||
return false;
|
||||
}
|
||||
string data = _redisData.GetHash(strs[0], strs[1]).Result;
|
||||
@@ -377,7 +388,7 @@ namespace Tnb.WarehouseMgr
|
||||
putdic.Add("SSX-021-001", new string[] { "YTCS", "CtuEmptyIn_CS01Done", "true" });
|
||||
putdic.Add("ZSSSXCTU02", new string[] { "YTCS", "右输送线下层允许入箱4", "true" });
|
||||
putdic.Add("ZSSSXCTU01", new string[] { "YTCS", "左输送线下层允许入箱2", "true" });
|
||||
putdic.Add("SSX-121-009", new string[] { "东面提升机输送线", "上升降机9入箱完毕", "true" });
|
||||
putdic.Add("SSX-121-009", new string[] { "东面提升机输送线", "上升降机9入箱完毕", "true" });
|
||||
putdic.Add("SSX-121-010", new string[] { "东面提升机输送线", "上升降机10入箱完毕", "true" });
|
||||
putdic.Add("YCLCKBGW", new string[] { "CP8", "PutDoneEmptyBox", "true" });
|
||||
putdic.Add("ZS-C01-1", new string[] { "hxjC", "A2AGV允许出空箱", "true" });
|
||||
@@ -441,7 +452,9 @@ namespace Tnb.WarehouseMgr
|
||||
try
|
||||
{
|
||||
//获取所有未下发的预任务申请
|
||||
List<WmsPretaskH> preTasks = await db.Queryable<WmsPretaskH>().InnerJoin<WmsCarryH>((a, b) => a.startlocation_id == b.location_id && a.carry_id == b.id)
|
||||
Logger.Information("【GenTaskExecute】 开始获取未下发的预任务...");
|
||||
|
||||
ISugarQueryable<WmsPretaskH> sugarQueryable = db.Queryable<WmsPretaskH>().InnerJoin<WmsCarryH>((a, b) => a.startlocation_id == b.location_id && a.carry_id == b.id)
|
||||
.InnerJoin<WmsAreaH>((a, b, c) => a.area_id == c.id)
|
||||
.InnerJoin<BasLocation>((a, b, c, d) => a.endlocation_id == d.id && d.is_use == "0")
|
||||
.Where(a => a.status == WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID && !string.IsNullOrWhiteSpace(a.startlocation_id))
|
||||
@@ -450,10 +463,13 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
move_num = c.move_num,
|
||||
third_eqp_type = c.third_eqp_type,
|
||||
}, true)
|
||||
.ToListAsync();
|
||||
}, true);
|
||||
|
||||
Logger.Information("【GenTaskExecute】 执行SQL: " + sugarQueryable.ToSqlString());
|
||||
|
||||
List<WmsPretaskH> preTasks = await sugarQueryable.ToListAsync();
|
||||
|
||||
|
||||
|
||||
|
||||
//List<WmsPretaskH> executedPreTasks = await db.Queryable<WmsPretaskH>().Where(it => it.status != WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID && it.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID).ToListAsync();
|
||||
|
||||
@@ -461,25 +477,31 @@ namespace Tnb.WarehouseMgr
|
||||
.Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) &&
|
||||
!it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase))
|
||||
.ToList();
|
||||
|
||||
|
||||
|
||||
var elePreTasks = preTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList();
|
||||
var normalPreTasks = preTasks.Where(it =>it.area_code!="B"&& !agvElevatorTasks.Concat(elePreTasks).Select(x => x.endlocation_code).Contains(it.endlocation_code)).ToList();
|
||||
var normalPreTasks = preTasks.Where(it => it.area_code != "B" && !agvElevatorTasks.Concat(elePreTasks).Select(x => x.endlocation_code).Contains(it.endlocation_code)).ToList();
|
||||
|
||||
/* 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()!;
|
||||
*/
|
||||
|
||||
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()!;
|
||||
*/
|
||||
|
||||
//如果电梯任务,预Agv任务存在相同目标库位,删除Agv任务保证电梯任务先行
|
||||
var equalEndLocPreTasks = elePreTasks.Select(x => x.endlocation_code).Intersect(agvElevatorTasks.Select(x => x.endlocation_code));
|
||||
if (equalEndLocPreTasks.Any())
|
||||
{
|
||||
Logger.Information("【GenTaskExecute】 执行:如果电梯任务,预Agv任务存在相同目标库位,删除Agv任务保证电梯任务先行 ");
|
||||
agvElevatorTasks = agvElevatorTasks.Where(x => !equalEndLocPreTasks.Contains(x.endlocation_code)).ToList();
|
||||
}
|
||||
preTasks = normalPreTasks.Concat(agvElevatorTasks).Concat(elePreTasks).ToList();
|
||||
|
||||
//一楼中储仓CTU
|
||||
|
||||
|
||||
List<string> ids = preTasks.Select(x => x.id).Distinct().ToList();
|
||||
List<WmsPretaskCode>? preTaskCodes = await db.Queryable<WmsPretaskCode>().Where(it => ids.Contains(it.bill_id)).ToListAsync();
|
||||
if (preTasks.Count > 0)
|
||||
@@ -571,25 +593,29 @@ namespace Tnb.WarehouseMgr
|
||||
await db.Ado.BeginTranAsync();
|
||||
|
||||
int row = await db.Insertable(disTasks).ExecuteCommandAsync();
|
||||
Logger.Information("【GenTaskExecute】 插入任务执行表数据: " + JsonConvert.SerializeObject(disTasks));
|
||||
if (preTaskCodes?.Count > 0)
|
||||
{
|
||||
row = await db.Insertable(distaskCodes).ExecuteCommandAsync();
|
||||
Logger.Information("【GenTaskExecute】 插入任务执行条码表数据: " + JsonConvert.SerializeObject(disTasks));
|
||||
}
|
||||
if (row > 0)
|
||||
{
|
||||
List<string> preTaskIds = preTasks.Select(x => x.id).ToList();
|
||||
List<string> preTaskBill_codes = preTasks.Select(x => x.bill_code).ToList();
|
||||
row = await db.Updateable<WmsPretaskH>().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_YXF_ID }).Where(it => preTaskIds.Contains(it.id)).ExecuteCommandAsync();
|
||||
Logger.Information("【GenTaskExecute】 更改这些预任务执行状态为 已下发: " + JsonConvert.SerializeObject(preTaskBill_codes));
|
||||
}
|
||||
|
||||
await db.Ado.CommitTranAsync();
|
||||
|
||||
Logger.Information("预任务执行完成");
|
||||
Logger.Information($"_eleCtlCfg.Environment={_eleCtlCfg.Environment}");
|
||||
Logger.Information("【GenTaskExecute】 预任务执行完成");
|
||||
Logger.Information($"【GenTaskExecute】_eleCtlCfg.Environment={_eleCtlCfg.Environment}");
|
||||
if (string.Equals(_eleCtlCfg.Environment, ElevatorConsts.EnvironmentName, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
//呼梯操作
|
||||
//获取目标库位为电梯库位的任务
|
||||
Logger.Information("操作设备");
|
||||
Logger.Information("【GenTaskExecute】操作设备");
|
||||
|
||||
var agvDTTasks = disTasks.Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) &&
|
||||
!it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList();
|
||||
@@ -597,27 +623,29 @@ namespace Tnb.WarehouseMgr
|
||||
foreach (var task in agvDTTasks)
|
||||
{
|
||||
ElevagorInfoQuery q = new() { endlocation_id = task.endlocation_id };
|
||||
Logger.Information($"【GenTaskExecute】呼梯时 根据任务单号获取电梯参数 {JsonConvert.SerializeObject(q)}");
|
||||
var e = await FindElevatorFromPars(q);
|
||||
Logger.Information($"【GenTaskExecute】呼梯时 根据任务单号获取电梯结果 {JsonConvert.SerializeObject(e)}");
|
||||
if (e != null)
|
||||
{
|
||||
task.device_id = e.device_id;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
List<(string endlocation_code, string device_id, string id, int start_floor)> endLocCodes = agvDTTasks
|
||||
.Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).ToList();
|
||||
var callLiftCnt = endLocCodes?.Count ?? 0;
|
||||
Logger.Information($"呼梯任务数:{callLiftCnt}");
|
||||
Logger.Information($"【GenTaskExecute】呼梯任务数:{callLiftCnt}");
|
||||
if (endLocCodes?.Count > 0)
|
||||
{
|
||||
if (endLocCodes.Select(x => x.device_id).All(x => !x.IsNullOrWhiteSpace()))
|
||||
{
|
||||
Logger.Information("呼梯操作");
|
||||
Logger.Information("【GenTaskExecute】呼梯操作");
|
||||
_ = CallingLanding(endLocCodes);
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.Error("呼梯失败,没有设备ID");
|
||||
Logger.Error("【GenTaskExecute】呼梯失败,没有设备ID");
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -625,11 +653,20 @@ namespace Tnb.WarehouseMgr
|
||||
//执行电梯任务
|
||||
List<WmsDistaskH>? elevatorTasks = disTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList();
|
||||
|
||||
Logger.Information($"【GenTaskExecute】当前电梯任务数:{elevatorTasks?.Count ?? 0}");
|
||||
if (elevatorTasks?.Count > 0)
|
||||
{
|
||||
Logger.Information($"当前电梯任务数:{elevatorTasks?.Count ?? 0}");
|
||||
foreach (WmsDistaskH? elevatorTask in elevatorTasks)
|
||||
{
|
||||
ElevagorInfoQuery q = new() { endlocation_id = elevatorTask.endlocation_id };
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -637,7 +674,7 @@ namespace Tnb.WarehouseMgr
|
||||
|
||||
if (agvTasks?.Count > 0)
|
||||
{
|
||||
Logger.Information($"Agv任务数量:{agvTasks.Count},taskCodes:{string.Join(",", agvTasks.Select(x => x.bill_code).Distinct())}");
|
||||
Logger.Information($"【GenTaskExecute】Agv任务数量:{agvTasks.Count},taskCodes:{string.Join(",", agvTasks.Select(x => x.bill_code).Distinct())}");
|
||||
_ = AgvDispatch(agvTasks, agvCts.Token);
|
||||
}
|
||||
}
|
||||
@@ -677,6 +714,9 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
var whereExpable = Expressionable.Create<WmsElevatorH, WmsElevatorD, WmsDistaskH>()
|
||||
.And((a, b, c) => a.enabled == 1);
|
||||
|
||||
Logger.Information($"【FindElevatorFromPars】 {JsonConvert.SerializeObject(input)}");
|
||||
|
||||
if (!input.taskCode.IsNullOrEmpty())
|
||||
{
|
||||
whereExpable.AndIF(!SqlFunc.IsNullOrEmpty(input.taskCode), (a, b, c) => c.bill_code == input.taskCode);
|
||||
@@ -689,7 +729,8 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
whereExpable.AndIF(!SqlFunc.IsNullOrEmpty(input.startlocation_id), (a, b, c) => b.location_id == input.startlocation_id);
|
||||
}
|
||||
var ele = await _db.CopyNew().Queryable<WmsElevatorH>().InnerJoin<WmsElevatorD>((a, b) => a.id == b.bill_id)
|
||||
|
||||
ISugarQueryable<WmsElevatorH> queryable = _db.CopyNew().Queryable<WmsElevatorH>().InnerJoin<WmsElevatorD>((a, b) => a.id == b.bill_id)
|
||||
.InnerJoin<WmsDistaskH>((a, b, c) => b.location_code == c.endlocation_code || b.location_code == c.startlocation_code)
|
||||
.Where(whereExpable.ToExpression())
|
||||
.WhereIF(!SqlFunc.IsNullOrEmpty(input.sourceName) && SqlFunc.StartsWith("DT-R", input.sourceName), (a, b, c) => c.startpoint_code == input.sourceName)
|
||||
@@ -699,8 +740,11 @@ namespace Tnb.WarehouseMgr
|
||||
bill_code = c.bill_code,
|
||||
device_id = a.elevator_id,
|
||||
end_floor = c.end_floor
|
||||
}, true)
|
||||
.FirstAsync();
|
||||
}, true);
|
||||
|
||||
var ele = await queryable.FirstAsync();
|
||||
|
||||
Logger.Information($"【FindElevatorFromPars】 " + queryable.ToSqlString());
|
||||
|
||||
return ele;
|
||||
|
||||
@@ -731,13 +775,25 @@ namespace Tnb.WarehouseMgr
|
||||
third_eqp_type = b.third_eqp_type,
|
||||
}, true).ToListAsync();
|
||||
List<WmsPretaskCode> TaskCodes = await db.Queryable<WmsPretaskCode>().Where(it => CTUTasks.Select(p => p.id).ToList().Contains(it.bill_id)).ToListAsync();
|
||||
|
||||
Logger.Information($@"【CTUTaskExecute】 获取任务TaskCodes: {JsonConvert.SerializeObject(TaskCodes)}");
|
||||
|
||||
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)}");
|
||||
|
||||
var OriginDistaskHs = await db.Queryable<WmsDistaskH>()
|
||||
.InnerJoin<WmsAreaH>((a, b) => a.area_id == b.id)
|
||||
.Where((a, b) => b.code == "B" && a.status == WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID)
|
||||
.OrderBy(a => a.bill_code)
|
||||
.ToListAsync();
|
||||
|
||||
|
||||
Logger.Information($@"【CTUTaskExecute】 OriginDistaskHs: {JsonConvert.SerializeObject(OriginDistaskHs)}");
|
||||
|
||||
|
||||
List<WmsDistaskH> DistaskHs = new List<WmsDistaskH>();
|
||||
List<WmsDistaskH> UpDistaskHs = new List<WmsDistaskH>();
|
||||
List<WmsDistaskCode> DistaskCodes = new List<WmsDistaskCode>();
|
||||
@@ -763,46 +819,45 @@ namespace Tnb.WarehouseMgr
|
||||
}*/
|
||||
|
||||
WmsDistaskH distaskH = item.Adapt<WmsDistaskH>();
|
||||
distaskH.id = SnowflakeIdHelper.NextId();
|
||||
distaskH.status = WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID;
|
||||
distaskH.is_chain = 1;
|
||||
distaskH.create_time = DateTime.Now;
|
||||
var billcode = GetBillCode(OriginDistaskHs, DistaskHs, distaskH);
|
||||
distaskH.groups = billcode.Substring(0, billcode.Length - 2);
|
||||
distaskH.bill_code = billcode;
|
||||
var num = int.Parse(distaskH.bill_code.Substring(billcode.Length - 1, 1));
|
||||
if (num == item.move_num)
|
||||
distaskH.id = SnowflakeIdHelper.NextId();
|
||||
distaskH.status = WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID;
|
||||
distaskH.is_chain = 1;
|
||||
distaskH.create_time = DateTime.Now;
|
||||
var billcode = GetBillCode(OriginDistaskHs, DistaskHs, distaskH);
|
||||
distaskH.groups = billcode.Substring(0, billcode.Length - 2);
|
||||
distaskH.bill_code = billcode;
|
||||
var num = int.Parse(distaskH.bill_code.Substring(billcode.Length - 1, 1));
|
||||
Logger.Information($@"【CTUTaskExecute】 比对billcode:{num}和单次搬运数量move_num:{item.move_num},如果一致 会添加到inCtuExec");
|
||||
if (num == item.move_num)
|
||||
{
|
||||
distaskH.status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID;
|
||||
inCtuExec.Add(distaskH);
|
||||
if (OriginDistaskHs.Where(p => p.groups == distaskH.groups).Any())
|
||||
{
|
||||
distaskH.status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID;
|
||||
inCtuExec.Add(distaskH);
|
||||
if (OriginDistaskHs.Where(p => p.groups == distaskH.groups).Any())
|
||||
{
|
||||
OriginDistaskHs.Where(p => p.groups == distaskH.groups).ToList().ForEach(p => p.status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID);
|
||||
OriginDistaskHs.Where(p => p.groups == distaskH.groups).ToList().ForEach(p => p.status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID);
|
||||
|
||||
UpDistaskHs.AddRange(OriginDistaskHs.Where(p => p.groups == distaskH.groups).ToList());
|
||||
inCtuExec.AddRange(OriginDistaskHs.Where(p => p.groups == distaskH.groups).ToList());
|
||||
}
|
||||
if (DistaskHs.Where(p => p.groups == distaskH.groups).Any())
|
||||
{
|
||||
DistaskHs.Where(p => p.groups == distaskH.groups).ToList().ForEach(p => p.status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID);
|
||||
inCtuExec.AddRange(DistaskHs.Where(p => p.groups == distaskH.groups).ToList());
|
||||
}
|
||||
UpDistaskHs.AddRange(OriginDistaskHs.Where(p => p.groups == distaskH.groups).ToList());
|
||||
inCtuExec.AddRange(OriginDistaskHs.Where(p => p.groups == distaskH.groups).ToList());
|
||||
}
|
||||
if (DistaskHs.Where(p => p.groups == distaskH.groups).Any())
|
||||
{
|
||||
DistaskHs.Where(p => p.groups == distaskH.groups).ToList().ForEach(p => p.status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID);
|
||||
inCtuExec.AddRange(DistaskHs.Where(p => p.groups == distaskH.groups).ToList());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Logger.Information($"开始执行CTU入库任务: {JsonConvert.SerializeObject(distaskH)}");
|
||||
|
||||
List<WmsPretaskCode> preTaskCodes = TaskCodes.FindAll(x => x.bill_id == distaskH.pretask_id);
|
||||
List<WmsDistaskCode> disTaskCodes = preTaskCodes.Adapt<List<WmsDistaskCode>>();
|
||||
disTaskCodes.ForEach(x =>
|
||||
{
|
||||
x.id = SnowflakeIdHelper.NextId();
|
||||
x.bill_id = distaskH.id;
|
||||
x.create_time = DateTime.Now;
|
||||
});
|
||||
DistaskHs.Add(distaskH);
|
||||
DistaskCodes.AddRange(disTaskCodes);
|
||||
|
||||
List<WmsDistaskCode> disTaskCodes = preTaskCodes.Adapt<List<WmsDistaskCode>>();
|
||||
disTaskCodes.ForEach(x =>
|
||||
{
|
||||
x.id = SnowflakeIdHelper.NextId();
|
||||
x.bill_id = distaskH.id;
|
||||
x.create_time = DateTime.Now;
|
||||
});
|
||||
DistaskHs.Add(distaskH);
|
||||
DistaskCodes.AddRange(disTaskCodes);
|
||||
|
||||
}
|
||||
foreach (var item in OutTasks)
|
||||
{
|
||||
@@ -815,6 +870,8 @@ namespace Tnb.WarehouseMgr
|
||||
distaskH.groups = billcode.Substring(0, billcode.Length - 2);
|
||||
distaskH.bill_code = billcode;
|
||||
var num = int.Parse(distaskH.bill_code.Substring(billcode.Length - 1, 1));
|
||||
|
||||
Logger.Information($@"【CTUTaskExecute】 比对billcode:{num}和单次搬运数量move_num:{item.move_num},如果一致 会添加到outCtuExec");
|
||||
if (num == item.move_num)
|
||||
{
|
||||
distaskH.status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID;
|
||||
@@ -833,7 +890,6 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
}
|
||||
|
||||
Logger.Information($"开始执行CTU出库任务: {JsonConvert.SerializeObject(distaskH)}");
|
||||
List<WmsPretaskCode> preTaskCodes = TaskCodes.FindAll(x => x.bill_id == distaskH.pretask_id);
|
||||
List<WmsDistaskCode> disTaskCodes = preTaskCodes.Adapt<List<WmsDistaskCode>>();
|
||||
disTaskCodes.ForEach(x =>
|
||||
@@ -866,31 +922,37 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
await db.Ado.CommitTranAsync();
|
||||
//判断
|
||||
Logger.Information($"【CTUTaskExecute】 判断单据状态(status)是否为26126851525157 {JsonConvert.SerializeObject(DistaskHs)}");
|
||||
if (DistaskHs.Where(p => p.status == WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID).Any())
|
||||
{
|
||||
var time =int.Parse( db.Queryable<BasFactoryConfig>().Where(P => P.key == "getinterval").First().value);
|
||||
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)}");
|
||||
if (inCtuExec.Count > 0)
|
||||
{
|
||||
Logger.Information($"开始执行CTU入库任务: {JsonConvert.SerializeObject(inCtuExec)}");
|
||||
//呼叫ctu入库
|
||||
// await db.Updateable<WmsDistaskH>().SetColumns(it => new WmsDistaskH { status = WmsWareHouseConst.TASK_BILL_STATUS_RUNING_ID }).Where(it => inCtuExec.Select(p => p.id).ToList().Contains(it.id)).ExecuteCommandAsync();
|
||||
// await db.Updateable<WmsPretaskH>().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_START_ID }).Where(it => inCtuExec.Select(x => x.pretask_id).ToList().Contains(it.id)).ExecuteCommandAsync();
|
||||
CancellationTokenSource Ctu = new();
|
||||
|
||||
await CallingCTU(inCtuExec, Ctu.Token, 1);
|
||||
Ctu.Dispose();
|
||||
}
|
||||
Logger.Information($@"【CTUTaskExecute】 可执行的CTU任务outCtuExec: {JsonConvert.SerializeObject(outCtuExec)}");
|
||||
if (outCtuExec.Count > 0)
|
||||
{
|
||||
Logger.Information($"开始执行CTU出库任务: {JsonConvert.SerializeObject(outCtuExec)}");
|
||||
//呼叫ctu出库
|
||||
// await db.Updateable<WmsDistaskH>().SetColumns(it => new WmsDistaskH { status = WmsWareHouseConst.TASK_BILL_STATUS_RUNING_ID }).Where(it => outCtuExec.Select(p => p.id).ToList().Contains(it.id)).ExecuteCommandAsync();
|
||||
// await db.Updateable<WmsPretaskH>().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_START_ID }).Where(it => outCtuExec.Select(x => x.pretask_id).ToList().Contains(it.id)).ExecuteCommandAsync();
|
||||
// await db.Updateable<WmsDistaskH>().SetColumns(it => new WmsDistaskH { status = WmsWareHouseConst.TASK_BILL_STATUS_RUNING_ID }).Where(it => outCtuExec.Select(p => p.id).ToList().Contains(it.id)).ExecuteCommandAsync();
|
||||
// await db.Updateable<WmsPretaskH>().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_START_ID }).Where(it => outCtuExec.Select(x => x.pretask_id).ToList().Contains(it.id)).ExecuteCommandAsync();
|
||||
CancellationTokenSource Ctu = new();
|
||||
await CallingCTU(outCtuExec, Ctu.Token, 0);
|
||||
Ctu.Dispose();
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
catch (Exception ex)
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -955,7 +1017,7 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
var execlist = list.Where(p => p.groups == item.groups).ToList();
|
||||
await db.Updateable<WmsDistaskH>().SetColumns(it => new WmsDistaskH { status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID }).Where(it => execlist.Select(p => p.id).ToList().Contains(it.id)).ExecuteCommandAsync();
|
||||
// await db.Updateable<WmsPretaskH>().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_START_ID }).Where(it => execlist.Select(x => x.pretask_id).ToList().Contains(it.id)).ExecuteCommandAsync();
|
||||
// await db.Updateable<WmsPretaskH>().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_START_ID }).Where(it => execlist.Select(x => x.pretask_id).ToList().Contains(it.id)).ExecuteCommandAsync();
|
||||
CancellationTokenSource Ctu = new();
|
||||
int type = execlist.First().task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID ? 1 : 0;
|
||||
await CallingCTU(execlist, Ctu.Token, type);
|
||||
@@ -970,9 +1032,9 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
timer?.Dispose();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
private async Task CallingCTU(List<WmsDistaskH> distaskHs, CancellationToken token,int type)
|
||||
private async Task CallingCTU(List<WmsDistaskH> distaskHs, CancellationToken token, int type)
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -995,12 +1057,14 @@ 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入库")}");
|
||||
dynamic respBody = await HttpClientHelper.PostStreamAsync(url, reqBody, token);
|
||||
Logger.Information($"CTU任务下发:{respBody}");
|
||||
Logger.Information($"【CallingCTU】 CTU任务下发 接收到联核/task-chain/create接口信息:{respBody}");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Information($"【CallingCTU】 CTU任务下发 请求联核/task-chain/create接口失败 异常信息:{ex}");
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
@@ -1011,26 +1075,26 @@ namespace Tnb.WarehouseMgr
|
||||
/// <returns></returns>
|
||||
private async Task CallingLanding(List<(string endlocation_code, string device_id, string id, int floorNO)> endLocCodes)
|
||||
{
|
||||
Logger.Information($" 开始呼梯操作.............");
|
||||
Logger.Information($"【CallingLanding】 开始呼梯操作.............");
|
||||
try
|
||||
{
|
||||
foreach ((_, string devId, string disTaskId, int floorNO) in endLocCodes)
|
||||
{
|
||||
Logger.Information($"devId:{devId}");
|
||||
Logger.Information($"【CallingLanding】 devId:{devId}");
|
||||
if (!s_elevatorMap.TryGetValue(devId, out object? elevatorCode))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
string? devName = elevatorCode.ToString();
|
||||
Logger.Information($"电梯编号:{devName}");
|
||||
Logger.Information($"当前:{devName.Match(@"\d+")}#梯");
|
||||
Logger.Information($"【CallingLanding】 电梯编号:{devName}");
|
||||
Logger.Information($"【CallingLanding】 当前:{devName.Match(@"\d+")}#梯");
|
||||
|
||||
await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1);
|
||||
(int sysStatus, int runStatus, int curFloorNo, int doorStatus, int agvStatus) eleStatusMulti = (-1, -1, -1, -1, -1);
|
||||
Logger.Information("【CallingLanding】 获取电梯AGV运行状态");
|
||||
if (!_elevatorAgvCtlStatusMap.TryGetValue(devId, out int agvCtlStatus) || agvCtlStatus != (int)EnumAgvStatus.AGV运行状态)
|
||||
{
|
||||
Logger.Information("获取电梯AGV运行状态");
|
||||
var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" };
|
||||
do
|
||||
{
|
||||
@@ -1040,18 +1104,22 @@ namespace Tnb.WarehouseMgr
|
||||
Logger.Information($"{devName.Match(@"\d+")}#, 当前Agv状态:{eleStatusMulti.agvStatus.ToEnum<EnumAgvStatus>()}");
|
||||
_elevatorAgvCtlStatusMap[devId] = eleStatusMulti.agvStatus;
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.Information("【CallingLanding】 AGV运行状态:" + agvCtlStatus);
|
||||
}
|
||||
|
||||
Logger.Information($"任务开始目标楼层为:{floorNO}");
|
||||
Logger.Information($"【CallingLanding】 任务开始目标楼层为:{floorNO}");
|
||||
|
||||
int floorN = await GetRealFloor(floorNO);
|
||||
//如果电梯在当前楼层则不呼梯
|
||||
if (floorN == eleStatusMulti.curFloorNo)
|
||||
{
|
||||
Logger.Information($"{devName.Match(@"\d+")}#,在当前楼层,无需呼梯");
|
||||
Logger.Information($"【CallingLanding】 {devName.Match(@"\d+")}#,在当前楼层,无需呼梯");
|
||||
continue;
|
||||
}
|
||||
|
||||
Logger.Information($"实际目标楼层为:{floorN}");
|
||||
Logger.Information($"【CallingLanding】 实际目标楼层为:{floorN}");
|
||||
|
||||
WmsElevatorUnexecute elevatorQueueItem = new()
|
||||
{
|
||||
@@ -1064,8 +1132,10 @@ namespace Tnb.WarehouseMgr
|
||||
create_time = DateTime.Now
|
||||
};
|
||||
List<WmsElevatorUnexecute> elevatorQueue = await _db.Queryable<WmsElevatorUnexecute>().Where(it => it.distask_id == disTaskId && it.task_status == "执行中").ToListAsync();
|
||||
|
||||
if ((elevatorQueue.IsNull() || elevatorQueue.Count < 1) && floorN != eleStatusMulti.curFloorNo)
|
||||
{
|
||||
Logger.Information($"【CallingLanding】 判断当前电梯{devName.Match(@"\d+")}#梯 无任务在做执行呼梯");
|
||||
|
||||
elevatorQueueItem.task_status = "执行中";
|
||||
bool callLiftRes = await _elevatorControlService.CallLift(devName, floorN, CancellationToken.None);
|
||||
@@ -1073,17 +1143,21 @@ namespace Tnb.WarehouseMgr
|
||||
string callLiftResult = callLiftRes ? successful : fail;
|
||||
Logger.Information($"{devName.Match(@"\d+")}#, 呼梯结果:{callLiftResult}");
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
Logger.Information("【CallingLanding】 当前有任务在做,不会呼梯");
|
||||
}
|
||||
|
||||
//如果当前电梯有任务在做,将当前呼梯任务放入待执行队列
|
||||
_ = await _db.Insertable(elevatorQueueItem).ExecuteCommandAsync();
|
||||
|
||||
Logger.Information("呼梯任务执行完成");
|
||||
Logger.Information("【CallingLanding】 呼梯任务执行完成");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Error("呼梯操作错误", ex);
|
||||
Logger.Error($"呼梯操作错误堆栈跟踪:{Environment.NewLine}{ex.StackTrace}");
|
||||
Logger.Error("【CallingLanding】 呼梯操作错误", ex);
|
||||
Logger.Error($"【CallingLanding】 呼梯操作错误堆栈跟踪:{Environment.NewLine}{ex.StackTrace}");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
@@ -1101,6 +1175,7 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
if (!s_elevatorMap.TryGetValue(disTask.device_id, out object? elevatorCode))
|
||||
{
|
||||
Logger.Information($"开始执行电梯任务,没有取到设备{disTask.device_id}的 elevatorCode! s_elevatorMap: {JsonConvert.SerializeObject(s_elevatorMap)}");
|
||||
return;
|
||||
}
|
||||
string devName = s_elevatorMap[disTask.device_id]?.ToString() ?? _eleCtlCfg.DevName3;
|
||||
@@ -1186,7 +1261,7 @@ namespace Tnb.WarehouseMgr
|
||||
/// <returns></returns>
|
||||
private async Task AgvDispatch(List<WmsDistaskH> disTasks, CancellationToken token)
|
||||
{
|
||||
Logger.Information("Agv任务执行....");
|
||||
Logger.Information("【AgvDispatch】 Agv任务执行....");
|
||||
List<string> kiva = new List<string>();
|
||||
kiva.Add("ZSSSXCTU02");
|
||||
kiva.Add("ZSSSXCTU01");
|
||||
@@ -1196,7 +1271,7 @@ namespace Tnb.WarehouseMgr
|
||||
AgvRequestConfig requestCfg = App.Configuration.Build<AgvRequestConfig>();
|
||||
string url = requestCfg.AgvRequestUrls.CreateTaskChainUrl;
|
||||
|
||||
Logger.Information($"Agv任务执行的disTasks:{JsonConvert.SerializeObject(disTasks)}");
|
||||
Logger.Information($"【AgvDispatch】 Agv任务执行的disTasks:{JsonConvert.SerializeObject(disTasks)}");
|
||||
|
||||
var taskChainCodeDic = disTasks.Where(t => !t.groups.IsNullOrWhiteSpace()).GroupBy(g => g.groups!)
|
||||
.ToDictionary(x => x.Key, x => x.Select(it => new
|
||||
@@ -1206,9 +1281,8 @@ namespace Tnb.WarehouseMgr
|
||||
targetName = it.endpoint_code,
|
||||
containerCode = it.carry_code,
|
||||
}));
|
||||
Logger.Information($"请求地址:{url}");
|
||||
|
||||
Logger.Information($"Agv任务执行的taskChainCodeDic:{JsonConvert.SerializeObject(taskChainCodeDic)}");
|
||||
Logger.Information($"【AgvDispatch】 Agv任务执行的taskChainCodeDic:{JsonConvert.SerializeObject(taskChainCodeDic)}");
|
||||
|
||||
foreach ((string k, object v) in taskChainCodeDic)
|
||||
{
|
||||
@@ -1225,19 +1299,20 @@ namespace Tnb.WarehouseMgr
|
||||
reqBody.taskChainPriority = 0;
|
||||
reqBody.taskList = v;
|
||||
reqBody.floor = dis.end_floor;
|
||||
Logger.Information($"请求参数:{JsonConvert.SerializeObject(reqBody)}");
|
||||
Logger.Information($"【AgvDispatch】 Agv任务执行 开始请求联核/task-chain/create接口 请求地址:{url} 请求参数:{reqBody} ");
|
||||
dynamic respBody = await HttpClientHelper.PostStreamAsync(url, reqBody, token);
|
||||
Logger.Information($"调用Agv接口响应结果:{respBody}");
|
||||
Logger.Information($"【AgvDispatch】 Agv任务执行 接收到联核/task-chain/create接口信息:{respBody}");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Error("agv调度失败异常", ex);
|
||||
Logger.Information($"【AgvDispatch】 agv任务执行 请求联核/task-chain/create接口失败 异常信息:{ex}");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 任务执行
|
||||
/// </summary>
|
||||
@@ -1332,9 +1407,7 @@ namespace Tnb.WarehouseMgr
|
||||
_ = await _db.Updateable<WmsPretaskH>().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID }).Where(it => preTaskIds.Contains(it.id)).ExecuteCommandAsync();
|
||||
|
||||
//更新电梯任务数量
|
||||
var eles = await _db.Queryable<WmsElevatorH>().Where(it => disTasks.Select(x => x.area_code).Contains(it.area_code)).ToListAsync();
|
||||
if (eles?.Count > 0)
|
||||
await _db.Updateable(eles).ReSetValue(it => it.task_nums--).ExecuteCommandAsync();
|
||||
_ = await _db.Updateable<WmsElevatorH>().SetColumns(it => new WmsElevatorH { task_nums = it.task_nums - 1}).Where(it => disTasks.Select(x => x.area_code).Contains(it.area_code)).ExecuteCommandAsync();
|
||||
|
||||
//更新载具,锁定状态为未锁定,更新载具的库位当前任务的目标库位
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ namespace Tnb.WarehouseMgr
|
||||
/// 盘点任务
|
||||
/// </summary>
|
||||
[OverideVisualDev(ModuleConsts.MODULE_WMSCHECKTASK_ID)]
|
||||
public class WmsCheckTaskService : ServiceLoggerBase<WmsCheckTaskService>
|
||||
public class WmsCheckTaskService : BaseWareHouseService
|
||||
{
|
||||
private readonly ISqlSugarClient _db;
|
||||
private readonly IWareHouseService _warehouseService;
|
||||
|
||||
@@ -6,11 +6,11 @@ using Tnb.WarehouseMgr.Entities.Consts;
|
||||
namespace Tnb.WarehouseMgr
|
||||
{
|
||||
[OverideVisualDev(ModuleConsts.MODULE_WMSDISTASK_ID)]
|
||||
public class WmsDistaskService : BaseWareHouseService
|
||||
public class WmsDistaskService : TaskManagerDelBase<WmsDistaskH>
|
||||
{
|
||||
private readonly ISqlSugarClient _db;
|
||||
|
||||
public WmsDistaskService(ISqlSugarRepository<WmsDistaskH> repository)
|
||||
public WmsDistaskService(ISqlSugarRepository<WmsDistaskH> repository):base(repository.AsSugarClient())
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
OverideFuncs.DeleteAsync = Delete;
|
||||
|
||||
@@ -35,7 +35,7 @@ namespace Tnb.WarehouseMgr
|
||||
/// </summary>
|
||||
[OverideVisualDev(ModuleConsts.MODULE_WMSOUTSTOCK_ID)]
|
||||
[ServiceModule(BizTypeId)]
|
||||
public class WmsOutStockService : ServiceLoggerBase<WmsOutStockService>, IWmsOutStockService
|
||||
public class WmsOutStockService : DevServBase<WmsOutStockService>, IWmsOutStockService
|
||||
{
|
||||
private const string BizTypeId = "26191522660645";
|
||||
private readonly ISqlSugarClient _db;
|
||||
@@ -59,7 +59,7 @@ namespace Tnb.WarehouseMgr
|
||||
IBillRullService billRullService,
|
||||
IWmsCarryMoveInStockService wmsCarryMoveInStockService,
|
||||
IWmsCarryService wareCarryService,
|
||||
IEventPublisher eventPublisher)
|
||||
IEventPublisher eventPublisher) : base(repository.AsSugarClient())
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_dictionaryDataService = dictionaryDataService;
|
||||
@@ -72,7 +72,6 @@ namespace Tnb.WarehouseMgr
|
||||
_wareCarryService = wareCarryService;
|
||||
|
||||
OverideFuncs.CreateAsync = OutStockApplyFor;
|
||||
_ = InitializationTask;
|
||||
}
|
||||
|
||||
public async Task<dynamic> OutStockApplyFor(VisualDevModelDataCrInput input)
|
||||
@@ -115,7 +114,7 @@ namespace Tnb.WarehouseMgr
|
||||
List<string?> freeLocIds = fLocIds.Except(minTaskNumLocs.Select(x => x.endlocation_id)).ToList();
|
||||
if (freeLocIds?.Count > 0)
|
||||
{
|
||||
int rIdx = Random.Shared.Next(0, freeLocIds.Count);
|
||||
int rIdx = Random.Shared.Next(0, freeLocIds.Count);
|
||||
loc = await _db.Queryable<BasLocation>().SingleAsync(it => it.id == freeLocIds[rIdx]);
|
||||
}
|
||||
else
|
||||
@@ -712,6 +711,7 @@ namespace Tnb.WarehouseMgr
|
||||
List<WmsPointH> points = new List<WmsPointH>();
|
||||
if (sPoint.area_code != ePoint.area_code)
|
||||
{
|
||||
points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
|
||||
if (points.Count <= 2)
|
||||
{
|
||||
throw new AppFriendlyException("该路径不存在", 500);
|
||||
@@ -739,6 +739,11 @@ namespace Tnb.WarehouseMgr
|
||||
startlocation_code = sPoint?.location_code ?? string.Empty,
|
||||
endlocation_id = ePoint?.location_id ?? string.Empty,
|
||||
endlocation_code = ePoint?.location_code ?? string.Empty,
|
||||
startpoint_id = sPoint.id,
|
||||
startpoint_code = sPoint.point_code,
|
||||
endpoint_id = ePoint.id,
|
||||
endpoint_code = ePoint.point_code,
|
||||
|
||||
start_floor = sPoint?.floor.ToString(),
|
||||
end_floor = ePoint?.floor.ToString(),
|
||||
bill_code = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult(),
|
||||
|
||||
@@ -8,6 +8,8 @@ using JNPF.Systems.Interfaces.System;
|
||||
using JNPF.VisualDev;
|
||||
using Mapster;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Newtonsoft.Json;
|
||||
using SqlSugar;
|
||||
using Tnb.BasicData.Entities;
|
||||
using Tnb.ProductionMgr.Interfaces;
|
||||
@@ -348,6 +350,7 @@ namespace Tnb.WarehouseMgr
|
||||
|
||||
public async Task<dynamic> ScanInStockByRedis(VisualDevModelDataCrInput input)
|
||||
{
|
||||
Logger.LogInformation($"【ScanInStockByRedis】执行入库 {JsonConvert.SerializeObject(input)}");
|
||||
try
|
||||
{
|
||||
await _db.Ado.BeginTranAsync();
|
||||
@@ -470,10 +473,13 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
|
||||
_ = await _db.Insertable(instock).ExecuteCommandAsync();
|
||||
Logger.LogInformation($"【ScanInStockByRedis】插入WmsInstockH {JsonConvert.SerializeObject(instock)}");
|
||||
_ = await _db.Insertable(instockDs).ExecuteCommandAsync();
|
||||
Logger.LogInformation($"【ScanInStockByRedis】插入WmsInstockD {JsonConvert.SerializeObject(instockDs)}");
|
||||
if (instockCode != null)
|
||||
{
|
||||
_ = await _db.Insertable(instockCode).ExecuteCommandAsync();
|
||||
Logger.LogInformation($"【ScanInStockByRedis】插入WmsInstockCode {JsonConvert.SerializeObject(instockCode)}");
|
||||
}
|
||||
|
||||
InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = "1", Size = 1 };
|
||||
@@ -492,13 +498,15 @@ namespace Tnb.WarehouseMgr
|
||||
ePoint = await _db.Queryable<WmsPointH>().FirstAsync(it => it.location_id == endLocations[0].id);
|
||||
}
|
||||
sPoint = await _db.Queryable<WmsPointH>().FirstAsync(it => it.location_id == loc.id);
|
||||
|
||||
|
||||
Logger.LogInformation($"【ScanInStockByRedis】sPoint:{JsonConvert.SerializeObject(sPoint)} ePoint:{JsonConvert.SerializeObject(ePoint)}");
|
||||
if (sPoint != null && ePoint != null)
|
||||
{
|
||||
List<WmsPointH> points = new List<WmsPointH>();
|
||||
if (sPoint.area_code != ePoint.area_code)
|
||||
{
|
||||
points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
|
||||
Logger.LogInformation($"【ScanInStockByRedis】 路径点数量为:{points.Count}");
|
||||
if (points.Count <= 2)
|
||||
{
|
||||
throw new AppFriendlyException("该路径不存在", 500);
|
||||
|
||||
Reference in New Issue
Block a user