解决冲突代码
This commit is contained in:
@@ -10,5 +10,11 @@ namespace Tnb.WarehouseMgr.Entities.Dto.Inputs
|
|||||||
public class CheckPutInput
|
public class CheckPutInput
|
||||||
{
|
{
|
||||||
public string point_code { get; set; }
|
public string point_code { get; set; }
|
||||||
|
public int type { get; set; }
|
||||||
|
}
|
||||||
|
public enum exectype
|
||||||
|
{
|
||||||
|
放 = 0,
|
||||||
|
取 = 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,5 @@ namespace Tnb.WarehouseMgr.Entities.Dto.Queries
|
|||||||
{
|
{
|
||||||
public string taskCode { get; set; }
|
public string taskCode { get; set; }
|
||||||
public string endlocation_id { get; set; }
|
public string endlocation_id { get; set; }
|
||||||
public string startlocation_id { get; set; }
|
|
||||||
public string sourceName { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,8 +45,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
private readonly IElevatorControlService _elevatorControlService;
|
private readonly IElevatorControlService _elevatorControlService;
|
||||||
private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build<ElevatorControlConfiguration>();
|
private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build<ElevatorControlConfiguration>();
|
||||||
private readonly ILoggerFactory _loggerFactory;
|
private readonly ILoggerFactory _loggerFactory;
|
||||||
private static bool unLoadComplete = true; //是否放货完成
|
public static Dictionary<string, int> s_eleUseStatusDic = new();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -118,7 +117,6 @@ namespace Tnb.WarehouseMgr
|
|||||||
Logger.Error("未找到匹配的电梯任务", new Exception($"根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务"));
|
Logger.Error("未找到匹配的电梯任务", new Exception($"根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务"));
|
||||||
return await ToApiResult(HttpStatusCode.InternalServerError, $"根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务");
|
return await ToApiResult(HttpStatusCode.InternalServerError, $"根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务");
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (s_elevatorMap.TryGetValue(elevator.device_id, out object? elevatorCode))
|
if (s_elevatorMap.TryGetValue(elevator.device_id, out object? elevatorCode))
|
||||||
@@ -127,6 +125,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
string devName = elevatorCode?.ToString();
|
string devName = elevatorCode?.ToString();
|
||||||
Logger.Information($"获取设备:{devName},状态");
|
Logger.Information($"获取设备:{devName},状态");
|
||||||
var tags = _eleCtlCfg.tags;
|
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);
|
(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($"电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>()},运行状态:{runStatus.ToEnum<EnumRunStatus>()},Agv状态:{agvStatus.ToEnum<EnumAgvStatus>()},当前楼层:{floorNo}");
|
||||||
{
|
{
|
||||||
@@ -243,11 +242,10 @@ namespace Tnb.WarehouseMgr
|
|||||||
|
|
||||||
if (doorStatus == (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.占用)
|
if (doorStatus == (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.占用)
|
||||||
{
|
{
|
||||||
Logger.Information($"{devName.Match(@"\d+")}#梯,任务未完成");
|
await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!");
|
||||||
return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!");
|
|
||||||
}
|
}
|
||||||
//电梯到达目标楼层后,判断当前电梯门状态是否为开门到位保持状态
|
//电梯到达目标楼层后,判断当前电梯门状态是否为开门到位保持状态
|
||||||
if (s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲 && doorStatus != (int)EnumDoorStatus.开门到位保持 && curFloor == floorNo) //判断目标楼层与电梯所在楼层在同一层才可开门放货
|
if (doorStatus != (int)EnumDoorStatus.开门到位保持 && curFloor == floorNo) //判断目标楼层与电梯所在楼层在同一层才可开门放货
|
||||||
{
|
{
|
||||||
_ = await _elevatorControlService.SendOpenCloseCmd(devName, 3); //发送电梯前门开门指令
|
_ = await _elevatorControlService.SendOpenCloseCmd(devName, 3); //发送电梯前门开门指令
|
||||||
}
|
}
|
||||||
@@ -256,7 +254,6 @@ namespace Tnb.WarehouseMgr
|
|||||||
&& doorStatus == (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲)
|
&& doorStatus == (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲)
|
||||||
{
|
{
|
||||||
s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.占用;
|
s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.占用;
|
||||||
Logger.Information($"当前电梯状态:{s_eleUseStatusDic[elevator.device_id].ToEnum<EnumElevatorUseStatus>().ToString()}");
|
|
||||||
return await ToApiResult(HttpStatusCode.OK, "成功");
|
return await ToApiResult(HttpStatusCode.OK, "成功");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -365,7 +362,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
List<WmsDistaskH> disTasks = new() { disTask };
|
List<WmsDistaskH> disTasks = new() { disTask };
|
||||||
if (input.action == "LOAD")
|
if (input.action == "LOAD")
|
||||||
{
|
{
|
||||||
unLoadComplete = true;
|
|
||||||
TaskExecuteAfterUpInput taskExecuteAfterUpInput = new()
|
TaskExecuteAfterUpInput taskExecuteAfterUpInput = new()
|
||||||
{
|
{
|
||||||
disTaskIds = disTasks.Select(x => x.id).ToList()
|
disTaskIds = disTasks.Select(x => x.id).ToList()
|
||||||
|
|||||||
@@ -197,9 +197,11 @@ namespace Tnb.WarehouseMgr
|
|||||||
["TagName"] = "DoorExecute",
|
["TagName"] = "DoorExecute",
|
||||||
["Value"] = value.ToString()
|
["Value"] = value.ToString()
|
||||||
};
|
};
|
||||||
|
var eleStatusMap = await RedisHelper.HGetAllAsync(devName);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_ = await HttpClientHelper.GetAsync(_elevatorCtlCfg.WriteTagUrl, pars: dicCommand);
|
_ = await HttpClientHelper.GetAsync(_elevatorCtlCfg.WriteTagUrl, pars: dicCommand);
|
||||||
|
//flag = await RedisHelper.HSetAsync(devName, ElevatorConsts.DoorExecute, value);
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
@@ -486,7 +488,6 @@ namespace Tnb.WarehouseMgr
|
|||||||
}
|
}
|
||||||
var tasks = ParallelWriteTagAsync(input);
|
var tasks = ParallelWriteTagAsync(input);
|
||||||
var writeRes = await Task.WhenAll(tasks);
|
var writeRes = await Task.WhenAll(tasks);
|
||||||
|
|
||||||
var timedTaskSvc = _backgudSvc as TimedTaskBackgroundService;
|
var timedTaskSvc = _backgudSvc as TimedTaskBackgroundService;
|
||||||
if (timedTaskSvc != null)
|
if (timedTaskSvc != null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Dynamic;
|
using System.Dynamic;
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
using Aliyun.OSS;
|
using System.Security.Policy;
|
||||||
|
using Aop.Api.Domain;
|
||||||
using JNPF;
|
using JNPF;
|
||||||
using JNPF.Common.Contracts;
|
using JNPF.Common.Contracts;
|
||||||
using JNPF.Common.Core.Manager;
|
using JNPF.Common.Core.Manager;
|
||||||
@@ -16,14 +17,17 @@ using Microsoft.AspNetCore.Mvc;
|
|||||||
using Microsoft.AspNetCore.Mvc.Rendering;
|
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||||
using Microsoft.CodeAnalysis;
|
using Microsoft.CodeAnalysis;
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
|
using NetTaste;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using NPOI.OpenXmlFormats.Dml;
|
using NPOI.OpenXmlFormats.Dml;
|
||||||
|
using Org.BouncyCastle.Crypto;
|
||||||
using SqlSugar;
|
using SqlSugar;
|
||||||
using Tnb.BasicData.Entities;
|
using Tnb.BasicData.Entities;
|
||||||
using Tnb.Common.Extension;
|
using Tnb.Common.Extension;
|
||||||
using Tnb.Common.Redis;
|
using Tnb.Common.Redis;
|
||||||
using Tnb.Common.Utils;
|
using Tnb.Common.Utils;
|
||||||
|
using Tnb.ProductionMgr.Entities;
|
||||||
using Tnb.WarehouseMgr.Entities;
|
using Tnb.WarehouseMgr.Entities;
|
||||||
using Tnb.WarehouseMgr.Entities.Configs;
|
using Tnb.WarehouseMgr.Entities.Configs;
|
||||||
using Tnb.WarehouseMgr.Entities.Consts;
|
using Tnb.WarehouseMgr.Entities.Consts;
|
||||||
@@ -51,10 +55,11 @@ namespace Tnb.WarehouseMgr
|
|||||||
private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build<ElevatorControlConfiguration>();
|
private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build<ElevatorControlConfiguration>();
|
||||||
private static Dictionary<string, object> locMap = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
|
private static Dictionary<string, object> locMap = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
|
||||||
private readonly IConfiguration _configuration;
|
private readonly IConfiguration _configuration;
|
||||||
|
private readonly RedisData _redisData;
|
||||||
public Func<string, int, Task> AddUnExecuteTask { get; set; }
|
public Func<string, int, Task> AddUnExecuteTask { get; set; }
|
||||||
|
|
||||||
|
|
||||||
public WareHouseService(ISqlSugarRepository<WmsInstockH> repository, IDictionaryDataService dictionaryDataService,
|
public WareHouseService(ISqlSugarRepository<WmsInstockH> repository, IDictionaryDataService dictionaryDataService, RedisData redisData,
|
||||||
IBillRullService billRullService, IUserManager userManager, ICacheManager cacheManager, IElevatorControlService elevatorControlService
|
IBillRullService billRullService, IUserManager userManager, ICacheManager cacheManager, IElevatorControlService elevatorControlService
|
||||||
//IConfiguration configuration
|
//IConfiguration configuration
|
||||||
) : base(repository.AsSugarClient())
|
) : base(repository.AsSugarClient())
|
||||||
@@ -65,6 +70,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
_userManager = userManager;
|
_userManager = userManager;
|
||||||
_cacheManager = cacheManager;
|
_cacheManager = cacheManager;
|
||||||
_elevatorControlService = elevatorControlService;
|
_elevatorControlService = elevatorControlService;
|
||||||
|
_redisData = redisData;
|
||||||
//_configuration = configuration;
|
//_configuration = configuration;
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -234,15 +240,28 @@ namespace Tnb.WarehouseMgr
|
|||||||
/// 判断CTU是否可以放货
|
/// 判断CTU是否可以放货
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
/*[HttpPost]
|
[HttpPost]
|
||||||
public async Task CheckPut(CheckPutInput input)
|
public async Task CheckPut(CheckPutInput input)
|
||||||
{
|
{
|
||||||
Dictionary<string, string[]> dic = new Dictionary<string, string[]>();
|
Dictionary<string, string[]> putdic = new Dictionary<string, string[]>();
|
||||||
dic.Add("5号输送线点位", new string[] { "TY4C-ZHUSU1", "weighDone_5" });
|
putdic.Add("SSX-021-005", new string[] { "CS05", "ConveyorAllowPutEmptyBox" });
|
||||||
dic.Add("6号输送线点位", new string[] { "TY4C-ZHUSU1", "weighDone_6" });
|
putdic.Add("SSX-021-006", new string[] { "CS06", "ConveyorAllowPutEmptyBox" });
|
||||||
if (!dic.ContainsKey(input.point_code))
|
Dictionary<string, string[]> getdic = new Dictionary<string, string[]>();
|
||||||
throw new AppFriendlyException("点位" + input.point_code + "不存在", 500);
|
getdic.Add("SSX-021-005", new string[] { "CS05", "FullBoxAllowGet" });
|
||||||
var strs = dic.Where(p => p.Key == input.point_code).First().Value;
|
getdic.Add("SSX-021-006", new string[] { "CS06", "FullBoxAllowGet" });
|
||||||
|
var strs = new string[] { };
|
||||||
|
if (input.type == (int)exectype.放)
|
||||||
|
{
|
||||||
|
if (!putdic.ContainsKey(input.point_code))
|
||||||
|
throw new AppFriendlyException("点位" + input.point_code + "不存在", 500);
|
||||||
|
strs = putdic.Where(p => p.Key == input.point_code).First().Value;
|
||||||
|
}
|
||||||
|
else if (input.type == (int)exectype.取)
|
||||||
|
{
|
||||||
|
if (!getdic.ContainsKey(input.point_code))
|
||||||
|
throw new AppFriendlyException("点位" + input.point_code + "不存在", 500);
|
||||||
|
strs = getdic.Where(p => p.Key == input.point_code).First().Value;
|
||||||
|
}
|
||||||
bool flag = await _redisData.HashExist(strs[0], strs[1]);
|
bool flag = await _redisData.HashExist(strs[0], strs[1]);
|
||||||
if (!flag)
|
if (!flag)
|
||||||
{
|
{
|
||||||
@@ -253,7 +272,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
bool result = res != null && res["Value"] != null ? res.Value<bool>("Value") : false;
|
bool result = res != null && res["Value"] != null ? res.Value<bool>("Value") : false;
|
||||||
if (!result)
|
if (!result)
|
||||||
throw new AppFriendlyException("点位" + input.point_code + "不可放", 500);
|
throw new AppFriendlyException("点位" + input.point_code + "不可放", 500);
|
||||||
}*/
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 生成任务执行
|
/// 生成任务执行
|
||||||
@@ -315,7 +334,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
|
|
||||||
//it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)
|
//it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)
|
||||||
var elePreTasks = preTasks.Where(it => 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 => !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());
|
/* 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()!;
|
agvElevatorTasks = firstEleGrp?.ToList() ?? Enumerable.Empty<WmsPretaskH>().ToList()!;
|
||||||
@@ -329,7 +348,8 @@ namespace Tnb.WarehouseMgr
|
|||||||
}
|
}
|
||||||
preTasks = normalPreTasks.Concat(agvElevatorTasks).Concat(elePreTasks).ToList();
|
preTasks = normalPreTasks.Concat(agvElevatorTasks).Concat(elePreTasks).ToList();
|
||||||
|
|
||||||
|
//一楼中储仓CTU
|
||||||
|
CTUTaskExecute();
|
||||||
List<string> ids = preTasks.Select(x => x.id).Distinct().ToList();
|
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();
|
List<WmsPretaskCode>? preTaskCodes = await db.Queryable<WmsPretaskCode>().Where(it => ids.Contains(it.bill_id)).ToListAsync();
|
||||||
if (preTasks.Count > 0)
|
if (preTasks.Count > 0)
|
||||||
@@ -444,9 +464,25 @@ namespace Tnb.WarehouseMgr
|
|||||||
var agvDTTasks = disTasks.Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) &&
|
var agvDTTasks = disTasks.Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) &&
|
||||||
!it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList();
|
!it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList();
|
||||||
|
|
||||||
await SetEleDevId(agvDTTasks);
|
foreach (var task in agvDTTasks)
|
||||||
|
{
|
||||||
|
ElevagorInfoQuery q = new() { endlocation_id = task.endlocation_id };
|
||||||
|
var e = await FindElevatorFromPars(q);
|
||||||
|
if (e != null)
|
||||||
|
{
|
||||||
|
task.device_id = e.device_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*foreach (var at in agvDTTasks)
|
||||||
|
{
|
||||||
|
var ele = elevatorList.Find(x => x.location_code == at.endlocation_code);
|
||||||
|
Logger.Information($"ele.elevator_id:{ele?.elevator_id},elevator_code:{ele?.elevator_code}");
|
||||||
|
if (ele != null)
|
||||||
|
{
|
||||||
|
at.device_id = ele.elevator_id;
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
List<(string endlocation_code, string device_id, string id, int start_floor)> endLocCodes = agvDTTasks
|
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();
|
.Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).ToList();
|
||||||
@@ -456,7 +492,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
{
|
{
|
||||||
if (endLocCodes.Select(x => x.device_id).All(x => !x.IsNullOrWhiteSpace()))
|
if (endLocCodes.Select(x => x.device_id).All(x => !x.IsNullOrWhiteSpace()))
|
||||||
{
|
{
|
||||||
Logger.Information($"呼梯操作");
|
Logger.Information("呼梯操作");
|
||||||
_ = CallingLanding(endLocCodes);
|
_ = CallingLanding(endLocCodes);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -472,7 +508,6 @@ namespace Tnb.WarehouseMgr
|
|||||||
if (elevatorTasks?.Count > 0)
|
if (elevatorTasks?.Count > 0)
|
||||||
{
|
{
|
||||||
Logger.Information($"当前电梯任务数:{elevatorTasks?.Count ?? 0}");
|
Logger.Information($"当前电梯任务数:{elevatorTasks?.Count ?? 0}");
|
||||||
await SetEleDevId(elevatorTasks);
|
|
||||||
foreach (WmsDistaskH? elevatorTask in elevatorTasks)
|
foreach (WmsDistaskH? elevatorTask in elevatorTasks)
|
||||||
{
|
{
|
||||||
_ = ExecuteTargetFloorTask(elevatorTask);
|
_ = ExecuteTargetFloorTask(elevatorTask);
|
||||||
@@ -488,18 +523,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async Task SetEleDevId(List<WmsDistaskH> distaskList)
|
|
||||||
{
|
|
||||||
foreach (var task in distaskList)
|
|
||||||
{
|
|
||||||
ElevagorInfoQuery q = new() { endlocation_id = task.endlocation_id };
|
|
||||||
var e = await FindElevatorFromPars(q);
|
|
||||||
if (e != null)
|
|
||||||
{
|
|
||||||
task.device_id = e.device_id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch (Exception ex) when (ex is HttpRequestException hReqEx)
|
catch (Exception ex) when (ex is HttpRequestException hReqEx)
|
||||||
{
|
{
|
||||||
@@ -518,30 +542,275 @@ namespace Tnb.WarehouseMgr
|
|||||||
agvCts.Dispose();
|
agvCts.Dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#region CTU
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 生成CTU任务执行
|
/// 生成CTU任务执行
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private async Task CTUTaskExecute(SqlSugarClient db)
|
private async Task CTUTaskExecute()
|
||||||
{
|
{
|
||||||
List<WmsPretaskH> preTasks = await db.Queryable<WmsPretaskH>()
|
try
|
||||||
.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)
|
var db = _db.CopyNew();
|
||||||
.InnerJoin<BasLocation>((a, b, c, d) => a.endlocation_id == d.id && d.is_use == "0")
|
List<WmsPretaskH> CTUTasks = await db.Queryable<WmsPretaskH>()
|
||||||
.Where(a => a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID && !string.IsNullOrWhiteSpace(a.startlocation_id))
|
.InnerJoin<WmsAreaH>((a, b) => a.area_id == b.id)
|
||||||
.OrderBy(a => new { priority = SqlFunc.Desc(a.priority), a.bill_code })
|
.Where(a => a.status == WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID)
|
||||||
.Select((a, b, c, d) => new WmsPretaskH
|
.Where((a, b) => b.code == "B")//一楼中储仓
|
||||||
{
|
.OrderBy(a => a.create_id)
|
||||||
move_num = c.move_num,
|
.Select((a, b) => new WmsPretaskH
|
||||||
third_eqp_type = c.third_eqp_type,
|
{
|
||||||
}, true)
|
move_num = b.move_num,
|
||||||
.ToListAsync();
|
third_eqp_type = b.third_eqp_type,
|
||||||
List<WmsPretaskH> CTUTasks = preTasks
|
}, true).ToListAsync();
|
||||||
.Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) &&
|
List<WmsPretaskCode> TaskCodes = await db.Queryable<WmsPretaskCode>().Where(it => CTUTasks.Select(p => p.id).ToList().Contains(it.bill_id)).ToListAsync();
|
||||||
!it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase))
|
var InTasks = CTUTasks.Where(a => a.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID).ToList();
|
||||||
.ToList();
|
var OutTasks = CTUTasks.Where(a => a.task_type == WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID).ToList();
|
||||||
}
|
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();
|
||||||
|
List<WmsDistaskH> DistaskHs = new List<WmsDistaskH>();
|
||||||
|
List<WmsDistaskH> UpDistaskHs = new List<WmsDistaskH>();
|
||||||
|
List<WmsDistaskCode> DistaskCodes = new List<WmsDistaskCode>();
|
||||||
|
var inCtuExec = new List<WmsDistaskH>();
|
||||||
|
var outCtuExec = new List<WmsDistaskH>();
|
||||||
|
foreach (var item in InTasks)
|
||||||
|
{
|
||||||
|
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.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);
|
||||||
|
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
foreach (var item in OutTasks)
|
||||||
|
{
|
||||||
|
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.status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID;
|
||||||
|
outCtuExec.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);
|
||||||
|
|
||||||
|
UpDistaskHs.AddRange(OriginDistaskHs.Where(p => p.groups == distaskH.groups).ToList());
|
||||||
|
outCtuExec.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);
|
||||||
|
outCtuExec.AddRange(DistaskHs.Where(p => p.groups == distaskH.groups).ToList());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
await db.Ado.BeginTranAsync();
|
||||||
|
int row = 0;
|
||||||
|
if (UpDistaskHs.Count > 0)
|
||||||
|
{
|
||||||
|
await db.Updateable<WmsDistaskH>().SetColumns(it => new WmsDistaskH { status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID }).Where(it => UpDistaskHs.Select(p => p.id).ToList().Contains(it.id)).ExecuteCommandAsync();
|
||||||
|
}
|
||||||
|
if (DistaskHs.Count > 0)
|
||||||
|
{
|
||||||
|
row = await db.Insertable(DistaskHs).ExecuteCommandAsync();
|
||||||
|
}
|
||||||
|
if (DistaskCodes.Count > 0)
|
||||||
|
{
|
||||||
|
await db.Insertable(DistaskCodes).ExecuteCommandAsync();
|
||||||
|
}
|
||||||
|
if (row > 0)
|
||||||
|
{
|
||||||
|
List<string> preTaskIds = DistaskHs.Select(x => x.pretask_id).ToList();
|
||||||
|
await db.Updateable<WmsPretaskH>().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_YXF_ID }).Where(it => preTaskIds.Contains(it.id)).ExecuteCommandAsync();
|
||||||
|
}
|
||||||
|
await db.Ado.CommitTranAsync();
|
||||||
|
//判断
|
||||||
|
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);
|
||||||
|
timer = new Timer(TimerExec, null, TimeSpan.FromMinutes(time), TimeSpan.FromMinutes(time));
|
||||||
|
}
|
||||||
|
if (inCtuExec.Count > 0)
|
||||||
|
{
|
||||||
|
//呼叫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();
|
||||||
|
}
|
||||||
|
if (outCtuExec.Count > 0)
|
||||||
|
{
|
||||||
|
//呼叫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();
|
||||||
|
CancellationTokenSource Ctu = new();
|
||||||
|
await CallingCTU(outCtuExec, Ctu.Token, 0);
|
||||||
|
Ctu.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(Exception ex)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//判断生成bill_code
|
||||||
|
private string GetBillCode(List<WmsDistaskH> OriginDistaskH, List<WmsDistaskH> NewdistaskHs, WmsDistaskH distaskH)
|
||||||
|
{
|
||||||
|
string BillCode = string.Empty;
|
||||||
|
//入库
|
||||||
|
if (distaskH.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID)
|
||||||
|
{
|
||||||
|
var orgdistaskHs = OriginDistaskH.Where(p => p.status == WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID && p.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID && p.startpoint_id == distaskH.startpoint_id).ToList();
|
||||||
|
var newdistaskHs = NewdistaskHs.Where(p => p.status == WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID && p.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID && p.startpoint_id == distaskH.startpoint_id).ToList();
|
||||||
|
if ((orgdistaskHs.Count + newdistaskHs.Count) == 0)
|
||||||
|
{
|
||||||
|
var groups = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_TASK_EXECUTE_ENCODE).Result;
|
||||||
|
BillCode = $"{groups}-1";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var groups = orgdistaskHs.Count > 0 ? orgdistaskHs.First().groups : newdistaskHs.First().groups;
|
||||||
|
BillCode = $"{groups}-" + (orgdistaskHs.Count + newdistaskHs.Count + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (distaskH.task_type == WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID)
|
||||||
|
{
|
||||||
|
var orgdistaskHs = OriginDistaskH.Where(p => p.status == WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID && p.task_type == WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID && p.endpoint_id == distaskH.endpoint_id).ToList();
|
||||||
|
var newdistaskHs = NewdistaskHs = OriginDistaskH.Where(p => p.status == WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID && p.task_type == WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID && p.endpoint_id == distaskH.endpoint_id).ToList();
|
||||||
|
if ((orgdistaskHs.Count + newdistaskHs.Count) == 0)
|
||||||
|
{
|
||||||
|
var groups = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_TASK_EXECUTE_ENCODE).Result;
|
||||||
|
BillCode = $"{groups}-1";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var groups = orgdistaskHs.Count > 0 ? orgdistaskHs.First().groups : newdistaskHs.First().groups;
|
||||||
|
BillCode = $"{groups}-" + (orgdistaskHs.Count + newdistaskHs.Count + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return BillCode;
|
||||||
|
}
|
||||||
|
private Timer? timer;
|
||||||
|
private async void TimerExec(object e)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
SqlSugarClient db = _db.CopyNew();
|
||||||
|
var list = 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)
|
||||||
|
.ToList();
|
||||||
|
var data = list.GroupBy(p => p.groups).Select(p => new
|
||||||
|
{
|
||||||
|
groups = p.Key,
|
||||||
|
time = p.Max(a => a.create_time)
|
||||||
|
|
||||||
|
}).ToList();
|
||||||
|
var date = DateTime.Now;
|
||||||
|
var time = int.Parse(db.Queryable<BasFactoryConfig>().Where(P => P.key == "getinterval").First().value);
|
||||||
|
foreach (var item in data)
|
||||||
|
{
|
||||||
|
if (date.Subtract(item.time).Minutes >= time)
|
||||||
|
{
|
||||||
|
var execlist = list.Where(p => p.groups == item.groups).ToList();
|
||||||
|
await db.Updateable<WmsDistaskH>().SetColumns(it => new WmsDistaskH { status = WmsWareHouseConst.TASK_BILL_STATUS_RUNING_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();
|
||||||
|
CancellationTokenSource Ctu = new();
|
||||||
|
int type = execlist.First().task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID ? 1 : 0;
|
||||||
|
await CallingCTU(execlist, Ctu.Token, type);
|
||||||
|
Ctu.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
timer?.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
private async Task CallingCTU(List<WmsDistaskH> distaskHs, CancellationToken token,int type)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
AgvRequestConfig requestCfg = App.Configuration.Build<AgvRequestConfig>();
|
||||||
|
string url = requestCfg.AgvRequestUrls.CreateTaskChainUrl;
|
||||||
|
var taskChainCodeDic = distaskHs.Where(t => !t.groups.IsNullOrWhiteSpace()).GroupBy(g => g.groups!)
|
||||||
|
.ToDictionary(x => x.Key, x => x.Select(it => new
|
||||||
|
{
|
||||||
|
taskCode = it.bill_code,
|
||||||
|
sourceName = it.startpoint_code,
|
||||||
|
targetName = it.endpoint_code,
|
||||||
|
containerCode = it.carry_code,
|
||||||
|
}));
|
||||||
|
foreach ((string k, object v) in taskChainCodeDic)
|
||||||
|
{
|
||||||
|
dynamic reqBody = new ExpandoObject();
|
||||||
|
reqBody.taskChainCode = k;
|
||||||
|
reqBody.type = (int)EnumTaskChainType.CTU;
|
||||||
|
reqBody.sequential = false;
|
||||||
|
reqBody.taskChainPriority = 0;
|
||||||
|
reqBody.taskList = v;
|
||||||
|
reqBody.inOut = type;
|
||||||
|
dynamic respBody = await HttpClientHelper.PostStreamAsync(url, reqBody, token);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 呼梯操作
|
/// 呼梯操作
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -634,16 +903,16 @@ namespace Tnb.WarehouseMgr
|
|||||||
private async Task ExecuteTargetFloorTask(WmsDistaskH disTask)
|
private async Task ExecuteTargetFloorTask(WmsDistaskH disTask)
|
||||||
{
|
{
|
||||||
//收到放货确认通知,向电梯发送到3楼的指令
|
//收到放货确认通知,向电梯发送到3楼的指令
|
||||||
Logger.Information($"开始执行电梯任务,任务ID:{disTask.id},设备ID:{disTask.device_id}");
|
Logger.Information($"开始执行电梯任务,任务ID:{disTask.id}");
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (!s_elevatorMap.TryGetValue(disTask.device_id, out object? elevatorCode))
|
if (!s_elevatorMap.TryGetValue(disTask.device_id, out object? elevatorCode))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
string devName = elevatorCode?.ToString();
|
string devName = s_elevatorMap[disTask.device_id]?.ToString() ?? _eleCtlCfg.DevName3;
|
||||||
|
|
||||||
Logger.Information($"当前设备{devName},{devName.Match(@"\d+")}#梯");
|
Logger.Information($"当前:{devName.Match(@"\d+")}#梯");
|
||||||
|
|
||||||
var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" };
|
var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" };
|
||||||
(int sysStatus, int runStatus, int curFloorNo, int doorStatus, int agvStatus) eleStatusMulti = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None);
|
(int sysStatus, int runStatus, int curFloorNo, int doorStatus, int agvStatus) eleStatusMulti = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None);
|
||||||
@@ -651,9 +920,8 @@ namespace Tnb.WarehouseMgr
|
|||||||
{
|
{
|
||||||
_ = await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1);
|
_ = await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1);
|
||||||
}
|
}
|
||||||
Logger.Information($"电梯当前状态->系统状态:{eleStatusMulti.sysStatus.ToEnum<EnumSysStatus>()},运行状态:{eleStatusMulti.runStatus.ToEnum<EnumRunStatus>().ToString()},门状态:{eleStatusMulti.doorStatus.ToEnum<EnumDoorStatus>().ToString()},Agv状态:{eleStatusMulti.agvStatus.ToEnum<EnumAgvStatus>().ToString()},当前楼层:{eleStatusMulti.curFloorNo}");
|
|
||||||
|
|
||||||
if (!_elevatorAgvCtlStatusMap.TryGetValue(disTask.device_id, out int agvCtlStatus) || agvCtlStatus != (int)EnumAgvStatus.AGV运行状态)
|
if (!_elevatorAgvCtlStatusMap.TryGetValue(disTask.id, out int agvCtlStatus) || agvCtlStatus != (int)EnumAgvStatus.AGV运行状态)
|
||||||
{
|
{
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
@@ -661,7 +929,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
await Task.Delay(1000);
|
await Task.Delay(1000);
|
||||||
} while (eleStatusMulti.agvStatus != (int)EnumAgvStatus.AGV运行状态);
|
} while (eleStatusMulti.agvStatus != (int)EnumAgvStatus.AGV运行状态);
|
||||||
Logger.Information($"{devName.Match(@"\d+")}#, 当前Agv状态:{eleStatusMulti.agvStatus.ToEnum<EnumAgvStatus>()}");
|
Logger.Information($"{devName.Match(@"\d+")}#, 当前Agv状态:{eleStatusMulti.agvStatus.ToEnum<EnumAgvStatus>()}");
|
||||||
_elevatorAgvCtlStatusMap[disTask.device_id] = eleStatusMulti.agvStatus;
|
_elevatorAgvCtlStatusMap[disTask.id] = eleStatusMulti.agvStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
int doorStatus = -1;
|
int doorStatus = -1;
|
||||||
@@ -670,7 +938,6 @@ namespace Tnb.WarehouseMgr
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
doorStatus = await _elevatorControlService.GetTagAsync(devName, ElevatorConsts.DoorStatus);
|
doorStatus = await _elevatorControlService.GetTagAsync(devName, ElevatorConsts.DoorStatus);
|
||||||
Logger.Information($"关门结果:{closeDoorRes}");
|
|
||||||
await Task.Delay(1000);
|
await Task.Delay(1000);
|
||||||
} while (doorStatus != 4);
|
} while (doorStatus != 4);
|
||||||
Logger.Information($"当前门状态:{doorStatus}");
|
Logger.Information($"当前门状态:{doorStatus}");
|
||||||
@@ -854,13 +1121,9 @@ 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();
|
_ = await _db.Updateable<WmsPretaskH>().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID }).Where(it => preTaskIds.Contains(it.id)).ExecuteCommandAsync();
|
||||||
|
|
||||||
//更新电梯任务数量
|
//更新电梯任务数量
|
||||||
var areaCodes = disTasks.Select(x => x.area_code).ToList();
|
var eles = await _db.Queryable<WmsElevatorH>().Where(it => disTasks.Select(x => x.area_code).Contains(it.area_code)).ToListAsync();
|
||||||
var eles = await _db.Queryable<WmsElevatorH>().Where(it => areaCodes.Contains(it.area_code)).ToListAsync();
|
|
||||||
if (eles?.Count > 0)
|
if (eles?.Count > 0)
|
||||||
{
|
await _db.Updateable(eles).ReSetValue(it => it.task_nums--).ExecuteCommandAsync();
|
||||||
eles.ForEach(x => x.task_nums--);
|
|
||||||
await _db.Updateable(eles).UpdateColumns(it=>it.task_nums).ExecuteCommandAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
//更新载具,锁定状态为未锁定,更新载具的库位当前任务的目标库位
|
//更新载具,锁定状态为未锁定,更新载具的库位当前任务的目标库位
|
||||||
|
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = input.data[nameof(InStockStrategyQuery.warehouse_id)].ToString()!, Size = 1 };
|
InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = input.data[nameof(InStockStrategyQuery.warehouse_id)].ToString()!, Size = 1 };
|
||||||
//test
|
//test
|
||||||
BasLocation llll = await _db.Queryable<BasLocation>().FirstAsync(it => it.location_code == _configuration["TestLocation"]);
|
BasLocation llll = await _db.Queryable<BasLocation>().FirstAsync(it => it.location_code == _configuration["TestLocation"]);
|
||||||
List<BasLocation> endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput); //new() { llll };
|
List<BasLocation> endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput);
|
||||||
WmsPointH? sPoint = null;
|
WmsPointH? sPoint = null;
|
||||||
WmsPointH? ePoint = null;
|
WmsPointH? ePoint = null;
|
||||||
if (input.data.ContainsKey(nameof(WmsPointH.location_id)))
|
if (input.data.ContainsKey(nameof(WmsPointH.location_id)))
|
||||||
@@ -106,94 +106,104 @@ namespace Tnb.WarehouseMgr
|
|||||||
if (sPoint != null && ePoint != null)
|
if (sPoint != null && ePoint != null)
|
||||||
{
|
{
|
||||||
Logger.Information($"sPoint.id={sPoint.id},ePoint.id={ePoint.id}");
|
Logger.Information($"sPoint.id={sPoint.id},ePoint.id={ePoint.id}");
|
||||||
List<WmsPointH> points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
|
List<WmsPointH> points = new List<WmsPointH>();
|
||||||
if (points.Count <= 2)
|
//中储仓不算路径
|
||||||
|
if (input.data[nameof(InStockStrategyQuery.warehouse_id)].ToString() != "2")
|
||||||
{
|
{
|
||||||
throw new AppFriendlyException("该路径不存在", 500);
|
points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id);
|
||||||
|
if (points.Count <= 2)
|
||||||
|
{
|
||||||
|
throw new AppFriendlyException("该路径不存在", 500);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序)
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
List<WmsPretaskH> preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>
|
points.Add(sPoint);
|
||||||
{
|
points.Add(ePoint);
|
||||||
WmsPointH? sPoint = it.FirstOrDefault();
|
|
||||||
WmsPointH? ePoint = it.LastOrDefault();
|
|
||||||
|
|
||||||
WmsPretaskH preTask = new()
|
|
||||||
{
|
|
||||||
org_id = _userManager.User.OrganizeId,
|
|
||||||
startlocation_id = sPoint?.location_id!,
|
|
||||||
startlocation_code = sPoint?.location_code!,
|
|
||||||
endlocation_id = ePoint?.location_id!,
|
|
||||||
endlocation_code = ePoint?.location_code!,
|
|
||||||
start_floor = sPoint?.floor.ToString(),
|
|
||||||
end_floor = ePoint?.floor.ToString(),
|
|
||||||
startpoint_id = sPoint?.id!,
|
|
||||||
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(),
|
|
||||||
status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID,
|
|
||||||
biz_type = WmsWareHouseConst.BIZTYPE_WMSEMPTYINSTOCK_ID,
|
|
||||||
task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID,
|
|
||||||
carry_id = input.data[nameof(preTask.carry_id)]?.ToString()!,
|
|
||||||
carry_code = input.data[nameof(preTask.carry_code)]?.ToString()!,
|
|
||||||
area_id = sPoint?.area_id!,
|
|
||||||
area_code = it.Key,
|
|
||||||
require_id = input.data["ReturnIdentity"].ToString(),
|
|
||||||
require_code = input.data[nameof(preTask.bill_code)]?.ToString()!,
|
|
||||||
create_id = _userManager.UserId,
|
|
||||||
create_time = DateTime.Now,
|
|
||||||
};
|
|
||||||
|
|
||||||
return preTask;
|
|
||||||
}).ToList();
|
|
||||||
|
|
||||||
bool isOk = await _wareHouseService.GenPreTask(preTasks, null!);
|
|
||||||
if (isOk)
|
|
||||||
{
|
|
||||||
|
|
||||||
GenPreTaskUpInput preTaskUpInput = new()
|
|
||||||
{
|
|
||||||
RquireId = input.data["ReturnIdentity"].ToString()!,
|
|
||||||
CarryId = input.data[nameof(WmsCarryD.carry_id)]?.ToString()!,
|
|
||||||
CarryStartLocationId = points.FirstOrDefault()!.location_id!,
|
|
||||||
CarryStartLocationCode = points.FirstOrDefault()!.location_code!,
|
|
||||||
LocationIds = points.Select(x => x.location_id).ToList()!,
|
|
||||||
PreTaskRecords = preTasks.Adapt<List<WmsHandleH>>()
|
|
||||||
};
|
|
||||||
preTaskUpInput.PreTaskRecords.ForEach(x => x.id = SnowflakeIdHelper.NextId());
|
|
||||||
|
|
||||||
WmsHandleH handleH = new()
|
|
||||||
{
|
|
||||||
org_id = _userManager.User.OrganizeId,
|
|
||||||
startlocation_id = input.data[nameof(WmsPointH.location_id)]?.ToString()!,
|
|
||||||
endlocation_id = endLocations![0].id,
|
|
||||||
bill_code = input.data[nameof(WmsHandleH.bill_code)]?.ToString()!,
|
|
||||||
biz_type = input.data[nameof(WmsHandleH.biz_type)]?.ToString()!,
|
|
||||||
carry_id = input.data[nameof(WmsHandleH.carry_id)]?.ToString()!,
|
|
||||||
carry_code = input.data[nameof(WmsHandleH.carry_code)]?.ToString()!,
|
|
||||||
require_id = input.data["ReturnIdentity"].ToString(),
|
|
||||||
require_code = input.data[nameof(WmsHandleH.bill_code)]?.ToString()!,
|
|
||||||
create_id = _userManager.UserId,
|
|
||||||
create_time = DateTime.Now
|
|
||||||
};
|
|
||||||
preTaskUpInput.PreTaskRecord = handleH;
|
|
||||||
//根据空载具入库Id,回更单据状态
|
|
||||||
_ = await _db.Updateable<WmsEmptyInstock>().SetColumns(it => new WmsEmptyInstock { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == preTaskUpInput.RquireId).ExecuteCommandAsync();
|
|
||||||
|
|
||||||
|
|
||||||
await _wareHouseService.GenInStockTaskHandleAfter(preTaskUpInput,
|
|
||||||
it => new WmsCarryH { is_lock = 1, location_id = preTaskUpInput.CarryStartLocationId, location_code = preTaskUpInput.CarryStartLocationCode },
|
|
||||||
it => new BasLocation { is_lock = 1 });
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new AppFriendlyException("预任务生成失败,路径或者设备相关配置错误", 500);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序)
|
||||||
|
|
||||||
|
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()
|
||||||
|
{
|
||||||
|
org_id = _userManager.User.OrganizeId,
|
||||||
|
startlocation_id = sPoint?.location_id!,
|
||||||
|
startlocation_code = sPoint?.location_code!,
|
||||||
|
endlocation_id = ePoint?.location_id!,
|
||||||
|
endlocation_code = ePoint?.location_code!,
|
||||||
|
start_floor = sPoint?.floor.ToString(),
|
||||||
|
end_floor = ePoint?.floor.ToString(),
|
||||||
|
startpoint_id = sPoint?.id!,
|
||||||
|
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(),
|
||||||
|
status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID,
|
||||||
|
biz_type = WmsWareHouseConst.BIZTYPE_WMSEMPTYINSTOCK_ID,
|
||||||
|
task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID,
|
||||||
|
carry_id = input.data[nameof(preTask.carry_id)]?.ToString()!,
|
||||||
|
carry_code = input.data[nameof(preTask.carry_code)]?.ToString()!,
|
||||||
|
area_id = sPoint?.area_id!,
|
||||||
|
area_code = it.Key,
|
||||||
|
require_id = input.data["ReturnIdentity"].ToString(),
|
||||||
|
require_code = input.data[nameof(preTask.bill_code)]?.ToString()!,
|
||||||
|
create_id = _userManager.UserId,
|
||||||
|
create_time = DateTime.Now,
|
||||||
|
};
|
||||||
|
|
||||||
|
return preTask;
|
||||||
|
}).ToList();
|
||||||
|
|
||||||
|
bool isOk = await _wareHouseService.GenPreTask(preTasks, null!);
|
||||||
|
if (isOk)
|
||||||
|
{
|
||||||
|
|
||||||
|
GenPreTaskUpInput preTaskUpInput = new()
|
||||||
|
{
|
||||||
|
RquireId = input.data["ReturnIdentity"].ToString()!,
|
||||||
|
CarryId = input.data[nameof(WmsCarryD.carry_id)]?.ToString()!,
|
||||||
|
CarryStartLocationId = points.FirstOrDefault()!.location_id!,
|
||||||
|
CarryStartLocationCode = points.FirstOrDefault()!.location_code!,
|
||||||
|
LocationIds = points.Select(x => x.location_id).ToList()!,
|
||||||
|
PreTaskRecords = preTasks.Adapt<List<WmsHandleH>>()
|
||||||
|
};
|
||||||
|
preTaskUpInput.PreTaskRecords.ForEach(x => x.id = SnowflakeIdHelper.NextId());
|
||||||
|
|
||||||
|
WmsHandleH handleH = new()
|
||||||
|
{
|
||||||
|
org_id = _userManager.User.OrganizeId,
|
||||||
|
startlocation_id = input.data[nameof(WmsPointH.location_id)]?.ToString()!,
|
||||||
|
endlocation_id = endLocations![0].id,
|
||||||
|
bill_code = input.data[nameof(WmsHandleH.bill_code)]?.ToString()!,
|
||||||
|
biz_type = input.data[nameof(WmsHandleH.biz_type)]?.ToString()!,
|
||||||
|
carry_id = input.data[nameof(WmsHandleH.carry_id)]?.ToString()!,
|
||||||
|
carry_code = input.data[nameof(WmsHandleH.carry_code)]?.ToString()!,
|
||||||
|
require_id = input.data["ReturnIdentity"].ToString(),
|
||||||
|
require_code = input.data[nameof(WmsHandleH.bill_code)]?.ToString()!,
|
||||||
|
create_id = _userManager.UserId,
|
||||||
|
create_time = DateTime.Now
|
||||||
|
};
|
||||||
|
preTaskUpInput.PreTaskRecord = handleH;
|
||||||
|
//根据空载具入库Id,回更单据状态
|
||||||
|
_ = await _db.Updateable<WmsEmptyInstock>().SetColumns(it => new WmsEmptyInstock { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == preTaskUpInput.RquireId).ExecuteCommandAsync();
|
||||||
|
|
||||||
|
|
||||||
|
await _wareHouseService.GenInStockTaskHandleAfter(preTaskUpInput,
|
||||||
|
it => new WmsCarryH { is_lock = 1, location_id = preTaskUpInput.CarryStartLocationId, location_code = preTaskUpInput.CarryStartLocationCode },
|
||||||
|
it => new BasLocation { is_lock = 1 });
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new AppFriendlyException("预任务生成失败,路径或者设备相关配置错误", 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user