diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipMaintainRecordQueryOutput.cs b/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipMaintainRecordQueryOutput.cs index 12b4ded0..ada9dbb8 100644 --- a/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipMaintainRecordQueryOutput.cs +++ b/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipMaintainRecordQueryOutput.cs @@ -4,6 +4,8 @@ namespace Tnb.EquipMgr.Entities.Dto { public string? id { get; set; } public string? attachment { get; set; } + + public string? fhattachment { get; set; } public string? create_time { get; set; } public string? equip_id { get; set; } public string? equip_id_id { get; set; } diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipSpotInsRecordQueryOutput.cs b/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipSpotInsRecordQueryOutput.cs index ba40ffb9..3664bb2c 100644 --- a/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipSpotInsRecordQueryOutput.cs +++ b/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipSpotInsRecordQueryOutput.cs @@ -4,6 +4,8 @@ namespace Tnb.EquipMgr.Entities.Dto { public string? id { get; set; } public string? attachment { get; set; } + + public string? fhattachment { get; set; } public string? create_time { get; set; } public string? equip_id { get; set; } public string? repeat_remark { get; set; } diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Dto/MaintainRecordRepeatInput.cs b/EquipMgr/Tnb.EquipMgr.Entities/Dto/MaintainRecordRepeatInput.cs index ff09b958..1f07e4c0 100644 --- a/EquipMgr/Tnb.EquipMgr.Entities/Dto/MaintainRecordRepeatInput.cs +++ b/EquipMgr/Tnb.EquipMgr.Entities/Dto/MaintainRecordRepeatInput.cs @@ -7,6 +7,7 @@ namespace Tnb.EquipMgr.Entities.Dto public string repeat_result { get; set; } = string.Empty; public string? repeat_remark { get; set; } + public string? attachment { get; set; } public List>? details { get; set; } } diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Dto/MoldStartWxInput.cs b/EquipMgr/Tnb.EquipMgr.Entities/Dto/MoldStartWxInput.cs new file mode 100644 index 00000000..2a861c76 --- /dev/null +++ b/EquipMgr/Tnb.EquipMgr.Entities/Dto/MoldStartWxInput.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tnb.EquipMgr.Entities +{ + public class MoldStartWxInput + { + public string? id { get; set; } + } +} diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Dto/PadRepairListOutput.cs b/EquipMgr/Tnb.EquipMgr.Entities/Dto/PadRepairListOutput.cs index 228f6286..d865e4e5 100644 --- a/EquipMgr/Tnb.EquipMgr.Entities/Dto/PadRepairListOutput.cs +++ b/EquipMgr/Tnb.EquipMgr.Entities/Dto/PadRepairListOutput.cs @@ -20,5 +20,6 @@ namespace Tnb.EquipMgr.Entities.Dto public string repairer_id { get; set; } public string repairer_id_id { get; set; } public string status { get; set; } + public string attachment { get; set; } } } \ No newline at end of file diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Dto/SpotInsRecordRepeatInput.cs b/EquipMgr/Tnb.EquipMgr.Entities/Dto/SpotInsRecordRepeatInput.cs index 35cc5b6d..35074944 100644 --- a/EquipMgr/Tnb.EquipMgr.Entities/Dto/SpotInsRecordRepeatInput.cs +++ b/EquipMgr/Tnb.EquipMgr.Entities/Dto/SpotInsRecordRepeatInput.cs @@ -7,5 +7,7 @@ namespace Tnb.EquipMgr.Entities.Dto public string? repeat_result { get; set; } public string? repeat_remark { get; set; } + + public string? attachment { get; set; } } } \ No newline at end of file diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpMaintainRecordH.cs b/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpMaintainRecordH.cs index d6643199..d0d33f2e 100644 --- a/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpMaintainRecordH.cs +++ b/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpMaintainRecordH.cs @@ -164,5 +164,10 @@ public partial class EqpMaintainRecordH : BaseEntity /// public string? org_id { get; set; } + /// + /// 复核附件 + /// + public string? fhattachment { get; set; } + } diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpSpotInsRecordH.cs b/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpSpotInsRecordH.cs index 38b993c6..5807603b 100644 --- a/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpSpotInsRecordH.cs +++ b/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpSpotInsRecordH.cs @@ -159,4 +159,10 @@ public partial class EqpSpotInsRecordH : BaseEntity /// public string? repeat_result { get; set; } + + /// + /// 复核附件 + /// + public string? fhattachment { get; set; } + } diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Entity/ToolMoldMaintainTask.cs b/EquipMgr/Tnb.EquipMgr.Entities/Entity/ToolMoldMaintainTask.cs index b077342b..e843dc6d 100644 --- a/EquipMgr/Tnb.EquipMgr.Entities/Entity/ToolMoldMaintainTask.cs +++ b/EquipMgr/Tnb.EquipMgr.Entities/Entity/ToolMoldMaintainTask.cs @@ -53,4 +53,12 @@ public partial class ToolMoldMaintainTask : BaseEntity /// public string status { get; set; } + public string? name { get; set; } + public string? attachment { get; set; } + public string? describe { get; set; } + + public int is_finish { get; set; } + public string? wxattachment { get; set; } + public string? wxdescribe { get; set; } + } diff --git a/EquipMgr/Tnb.EquipMgr/EqpRepairApplyService.cs b/EquipMgr/Tnb.EquipMgr/EqpRepairApplyService.cs index 0617edca..9d92a6e5 100644 --- a/EquipMgr/Tnb.EquipMgr/EqpRepairApplyService.cs +++ b/EquipMgr/Tnb.EquipMgr/EqpRepairApplyService.cs @@ -397,7 +397,8 @@ namespace Tnb.EquipMgr repairer_id = c.RealName, repairer_id_id = c.Id, remark = a.remark, - status = f.FullName + status = f.FullName, + attachment=a.attachment }).ToPagedListAsync(input?.currentPage ?? 1, input?.pageSize ?? 50); return PageResult.SqlSugarPageResult(result); diff --git a/EquipMgr/Tnb.EquipMgr/EquMaintainRecordService.cs b/EquipMgr/Tnb.EquipMgr/EquMaintainRecordService.cs index c7c003da..b1e45c66 100644 --- a/EquipMgr/Tnb.EquipMgr/EquMaintainRecordService.cs +++ b/EquipMgr/Tnb.EquipMgr/EquMaintainRecordService.cs @@ -214,6 +214,7 @@ namespace Tnb.EquipMgr { _ = await _repository.UpdateAsync(x => new EqpMaintainRecordH() { + fhattachment=input.attachment, repeat_result = input.repeat_result, repeat_remark = input.repeat_remark, repeat_user_id = _userManager.UserId, @@ -244,6 +245,7 @@ namespace Tnb.EquipMgr { id = a.id, attachment = a.attachment, + fhattachment= a.fhattachment, create_time = a.create_time == null ? null : a.create_time.Value.ToString(DbTimeFormat.MM), equip_id = b.code, equip_id_id = a.equip_id, diff --git a/EquipMgr/Tnb.EquipMgr/EquSpotInsRecordService.cs b/EquipMgr/Tnb.EquipMgr/EquSpotInsRecordService.cs index 111e86a7..cc558030 100644 --- a/EquipMgr/Tnb.EquipMgr/EquSpotInsRecordService.cs +++ b/EquipMgr/Tnb.EquipMgr/EquSpotInsRecordService.cs @@ -183,6 +183,7 @@ namespace Tnb.EquipMgr repeat_result = input.repeat_result, repeat_remark = input.repeat_remark, repeat_user_id = _userManager.UserId, + fhattachment=input.attachment, repeat_time = DateTime.Now, status = SpotInsRecordExecutionStatus.COMPLETED }, x => x.id == input.id); @@ -204,6 +205,7 @@ namespace Tnb.EquipMgr { id = a.id, attachment = a.attachment, + fhattachment=a.fhattachment, create_time = a.create_time == null ? null : a.create_time.Value.ToString(DbTimeFormat.MM), equip_id = a.equip_id, repeat_remark = a.repeat_remark, diff --git a/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainTaskService.cs b/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainTaskService.cs index 4979f99f..fcbe2d65 100644 --- a/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainTaskService.cs +++ b/EquipMgr/Tnb.EquipMgr/ToolMoldMaintainTaskService.cs @@ -1,4 +1,5 @@ -using JNPF.Common.Enums; +using JNPF.Common.Core.Manager; +using JNPF.Common.Enums; using JNPF.Common.Extension; using JNPF.DependencyInjection; using JNPF.DynamicApiController; @@ -29,16 +30,19 @@ namespace Tnb.EquipMgr private readonly IRunService _runService; private readonly IVisualDevService _visualDevService; private static Dictionary _dicMold = new(); + private readonly IUserManager _userManager; public ToolMoldMaintainTaskService( ISqlSugarRepository repository, IRunService runService, - IVisualDevService visualDevService + IVisualDevService visualDevService, + IUserManager userManager ) { _db = repository.AsSugarClient(); _runService = runService; _visualDevService = visualDevService; OverideFuncs.GetListAsync = GetList; + _userManager = userManager; //OverideFuncs.CreateAsync = Create; } public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc(); @@ -100,5 +104,23 @@ namespace Tnb.EquipMgr throw Oops.Oh(ErrorCode.COM1001); } } + + + /// + /// 开始维修 + /// + /// 输入参数 + /// + [HttpPost] + public async Task StartWx(MoldStartWxInput input) + { + DateTime? StartTime = DateTime.Now; + int row = await _db.Updateable().SetColumns(it => new ToolMoldMaintainTask { status = "WXZ", modify_strat_time = StartTime, modify_id = _userManager.UserId }) + .Where(it => input.id == it.id).ExecuteCommandAsync(); + if (row < 1) + { + throw Oops.Oh(ErrorCode.COM1001); + } + } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CloseElevatorInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CloseElevatorInput.cs new file mode 100644 index 00000000..a26991ce --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CloseElevatorInput.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tnb.WarehouseMgr.Entities.Dto.Inputs +{ + public class CloseElevatorInput + { + public IEnumerable devNames { get; set; } + public int value { get; set; } + public string flag{ get; set; } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsDistaskH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsDistaskH.cs index b6ef7fb4..62c5936b 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsDistaskH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsDistaskH.cs @@ -32,7 +32,7 @@ public partial class WmsDistaskH : BaseEntity /// /// 起始楼层 /// - public string? start_floor { get; set; } + public int start_floor { get; set; } /// /// 目标库位ID @@ -42,7 +42,7 @@ public partial class WmsDistaskH : BaseEntity /// /// 目标楼层 /// - public string? end_floor { get; set; } + public int end_floor { get; set; } /// /// 起始点位ID diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IElevatorControlService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IElevatorControlService.cs index f42aacde..71d1b0b1 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IElevatorControlService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IElevatorControlService.cs @@ -1,4 +1,6 @@ -namespace Tnb.WarehouseMgr.Interfaces +using Tnb.WarehouseMgr.Entities.Dto.Inputs; + +namespace Tnb.WarehouseMgr.Interfaces { /// /// 电梯控制服务接口 @@ -31,10 +33,10 @@ /// 标签集合 /// 取消标志 /// 获取到的状态值 - Task<(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus)> GetElevatorStatus(string devName,IEnumerable tags, CancellationToken token); + Task<(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus)> GetElevatorStatus(string devName, IEnumerable tags, CancellationToken token); - Task> GetELevatorStatusMap(string devName,IEnumerable tags, CancellationToken token); + Task> GetELevatorStatusMap(string devName, IEnumerable tags, CancellationToken token); /// /// 检查Agv状态 /// @@ -61,5 +63,7 @@ /// Task CallLift(string devName, int floor, CancellationToken cancellationToken); + Task CloseElevatorControl(CloseElevatorInput input); + } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs index a51c8936..838ce1cb 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs @@ -182,6 +182,10 @@ namespace Tnb.WarehouseMgr { realFloor = 3; } + else if(floor == 1) + { + realFloor = 1; + } return Task.FromResult(realFloor); } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs index d1e943df..15b8b86f 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs @@ -200,10 +200,8 @@ namespace Tnb.WarehouseMgr } } - return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!"); - } catch (Exception ex) { @@ -223,53 +221,40 @@ namespace Tnb.WarehouseMgr try { Logger.Information($"任务链上报->任务链编号:{input.taskChainCode},状态:{input.status},设备ID:{input.deviceID}"); - /*switch (input.status) + switch (input.status) { case "CREATED": break; case "ALLOCATED": break; case "PROCESSING": - //if (await _cacheManager.GetAsync($"{input.taskChainCode}") == "任务链状态上报,上报状态PROCESSING") break; if (input.taskChainCode.Trim().IsNullOrEmpty()) { - break; + return await ToApiResult(HttpStatusCode.InternalServerError, "请重试!"); } - List disTasks = await _db.Queryable().Where(it => it.bill_code.Contains(input.taskChainCode)).ToListAsync(); List eps = await _db.Queryable().Where(it => it.code.Contains(input.deviceID)).ToListAsync(); - TaskExecuteUpInput taskExecuteUpInput = new() + if (disTasks == null || disTasks.Count < 1) { - disTaskIds = disTasks.Select(x => x.id).ToList(), - EqpIds = eps.Select(x => x.id).ToList(), - }; - await _wareHouseService.TaskExecute(taskExecuteUpInput); break; + Logger.Error($"根据任务链编号:{input.taskChainCode} ,未获取到任何任务"); + } + if (disTasks?.Count > 0) + { + TaskExecuteUpInput taskExecuteUpInput = new() + { + disTaskIds = disTasks?.Select(x => x.id).ToList() ?? Enumerable.Empty().ToList(), + EqpIds = eps?.Select(x => x.id).ToList() ?? Enumerable.Empty().ToList(), + }; + await _wareHouseService.TaskExecute(taskExecuteUpInput); + } + break; case "CANCELLED": break; case "SUCCEED": break; case "FAILURE": break; case "FINISHED": break; default: break; - }*/ - - - if (input.taskChainCode.Trim().IsNullOrEmpty()) - { - return await ToApiResult(HttpStatusCode.InternalServerError, "请重试!"); } - List disTasks = await _db.Queryable().Where(it => it.bill_code.Contains(input.taskChainCode)).ToListAsync(); - List eps = await _db.Queryable().Where(it => it.code.Contains(input.deviceID)).ToListAsync(); - if (disTasks == null || disTasks.Count < 1) - { - Logger.Error($"根据任务链编号:{input.taskChainCode} ,未获取到任何任务"); - } - if (disTasks?.Count > 0) - { - TaskExecuteUpInput taskExecuteUpInput = new() - { - disTaskIds = disTasks?.Select(x => x.id).ToList() ?? Enumerable.Empty().ToList(), - EqpIds = eps?.Select(x => x.id).ToList() ?? Enumerable.Empty().ToList(), - }; - await _wareHouseService.TaskExecute(taskExecuteUpInput); - } + + /*ConnectionConfigOptions opts = App.GetOptions(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs b/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs index 9aefd605..2b42bb0c 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs @@ -4,12 +4,14 @@ using DingTalk.Api.Request; using JNPF; using JNPF.Common.Extension; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Newtonsoft.Json.Linq; using Tnb.Common.Extension; using Tnb.Common.Utils; using Tnb.WarehouseMgr.Entities.Configs; using Tnb.WarehouseMgr.Entities.Consts; +using Tnb.WarehouseMgr.Entities.Dto.Inputs; using Tnb.WarehouseMgr.Entities.Enums; using Tnb.WarehouseMgr.Interfaces; @@ -24,11 +26,14 @@ namespace Tnb.WarehouseMgr private readonly BackgroundService _agvHeartbeatMonitor; private static readonly Dictionary> _fetchStartedStausValue = new(); private readonly bool isFrontDoorBit = false; //是否到前门位 + private readonly IServiceProvider _sp; + private readonly BackgroundService _backgudSvc; - public ElevatorControlService() + public ElevatorControlService(IServiceProvider sp, BackgroundService bgSvc) { _elevatorCtlCfg = App.Configuration.Build(); - //_agvHeartbeatMonitor = agvHeartbeatMonitorService; + _sp = sp; + _backgudSvc = bgSvc; } /// @@ -402,5 +407,39 @@ namespace Tnb.WarehouseMgr } return isSuccefuly; } + + private List> ParallelWriteTagAsync(CloseElevatorInput input) + { + var tasks = new List>(input.devNames.Count()); + foreach (var devName in input.devNames) + { + tasks.Add(WriteTagAsync(devName, ElevatorConsts.AGVControl, input.value)); + } + return tasks; + } + + public async Task CloseElevatorControl(CloseElevatorInput input) + { + if (input.devNames == null || !input.devNames.Any()) + { + throw new ArgumentNullException(nameof(input.devNames)); + } + var tasks = ParallelWriteTagAsync(input); + await Task.WhenAll(tasks); + var timedTaskSvc = _backgudSvc as TimedTaskBackgroundService; + if (timedTaskSvc != null) + { + if (input.flag.Equals("close", StringComparison.OrdinalIgnoreCase)) + { + _ = timedTaskSvc.CloseAgvHeartbeat(input.devNames); + } + else + { + _ = timedTaskSvc.OpenAgvHeartbeat(input.devNames); + } + } + } + + } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/Print/PPLBUtility.cs b/WarehouseMgr/Tnb.WarehouseMgr/Print/PPLBUtility.cs index 1bc85611..5a78ace9 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/Print/PPLBUtility.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/Print/PPLBUtility.cs @@ -6,7 +6,8 @@ namespace Tnb.WarehouseMgr.Print { private const uint IMAGE_BITMAP = 0; private const uint LR_LOADFROMFILE = 16; - private static readonly string dllPath = Path.Combine(AppContext.BaseDirectory, @"Library\x64", "Library\\x64\\Winpplb.dll"); + private static readonly string winPPLBDllPath = Path.Combine(AppContext.BaseDirectory, @"Library\x64", "Library\\x64\\Winpplb.dll"); + private static readonly string winPortDllPath = Path.Combine(AppContext.BaseDirectory, @"Library\x64", "Library\\x64\\WinPort.dll"); [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] private static extern IntPtr LoadImage(IntPtr hinst, string lpszName, uint uType, @@ -490,7 +491,7 @@ namespace Tnb.WarehouseMgr.Print /// 注:经测试,type=1E 手机不能识别;type=1 手机可识别; /// 这个 B_Prn_Barcode 函数可以列印出一个指定类型的条码 功能。 /// - [DllImport("Library\\x64\\Winpplb.dll")] + [DllImport($"Library\\x64\\Winpplb.dll")] public static extern int B_Prn_Barcode(int x, int y, int ori, string type, int narrow, int width, int height, char human, string data); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs b/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs index b1717e98..cc9cdacc 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs @@ -1,4 +1,5 @@ using System.Collections.Concurrent; +using Aop.Api.Domain; using JNPF; using JNPF.Common.Extension; using JNPF.Common.Security; @@ -26,24 +27,24 @@ namespace Tnb.WarehouseMgr private IEventPublisher _eventPublisher = default!; private readonly ElevatorControlConfiguration _elevatorControlConfiguration = App.Configuration.Build(); private readonly IServiceProvider _serviceProvider; + private readonly IHostApplicationLifetime _lifeTime; + private static List s_heartbeatDevNames = new(); //private static Dictionary> _timedFuncMap = new(StringComparer.OrdinalIgnoreCase); - public TimedTaskBackgroundService(IServiceProvider serviceProvider) + public TimedTaskBackgroundService() { - _serviceProvider = serviceProvider; } protected override Task ExecuteAsync(CancellationToken stoppingToken) { IsStarted = true; - + s_heartbeatDevNames = _elevatorControlConfiguration.HeartbeatDevNames; Task timedTask = Task.Run(() => { _eventPublisher = App.GetRequiredService(); - //电梯Agv心跳检测 _ = TimedTask(async token => { - foreach (var devName in _elevatorControlConfiguration.HeartbeatDevNames) + foreach (var devName in s_heartbeatDevNames) { Dictionary parameter = new() { @@ -56,7 +57,7 @@ namespace Tnb.WarehouseMgr await Console.Out.WriteLineAsync($"{devName.Match(@"\d+")}#梯, 心跳检测结果:{result}"); } }, stoppingToken, 30); - + }); return timedTask; } @@ -144,6 +145,18 @@ namespace Tnb.WarehouseMgr return delayTask; } + public Task CloseAgvHeartbeat(IEnumerable devNames) + { + s_heartbeatDevNames.RemoveAll(x => devNames.Contains(x)); + return Task.CompletedTask; + } + + public Task OpenAgvHeartbeat(IEnumerable devNames) + { + s_heartbeatDevNames.AddRange(devNames); + return Task.CompletedTask; + } + } /// /// 自定义任务调度器,保证长任务在单独的线程中运行 diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index e90b85b1..3742747a 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -161,7 +161,7 @@ namespace Tnb.WarehouseMgr List items = new(); try { - WmsInstockPolicies policy = await _db.Queryable().Where(it => it.status == 1).FirstAsync(); + WmsInstockPolicies policy = await _db.CopyNew().Queryable().Where(it => it.status == 1).FirstAsync(); if (policy == null) { throw new AppFriendlyException("没有可用的策略", 500); @@ -173,7 +173,7 @@ namespace Tnb.WarehouseMgr .And(it => it.is_type == ((int)EnumLocationType.存储库位).ToString()) .And(it => it.is_use == ((int)EnumCarryStatus.空闲).ToString()) .ToExpression(); - items = await _db.Queryable().Where(whereExp).OrderBy(policy.policy).ToListAsync(); + items = await _db.CopyNew().Queryable().Where(whereExp).OrderBy(policy.policy).ToListAsync(); } catch (Exception) { @@ -238,6 +238,7 @@ namespace Tnb.WarehouseMgr { //获取电梯数据 List elevatorList = await db.Queryable().InnerJoin((a, b) => a.id == b.bill_id) + .Where((a, b) => a.enabled == 1) .Select((a, b) => new WmsElevatorH { @@ -249,6 +250,7 @@ namespace Tnb.WarehouseMgr floor = b.floor }, true).ToListAsync(); + Logger.Information($"可用电梯信息:{elevatorList.Select(e => e.elevator_code)}"); //获取所有未下发的预任务申请 @@ -416,14 +418,14 @@ namespace Tnb.WarehouseMgr foreach (var at in agvDTTasks) { var ele = elevatorList.Find(x => x.location_code == at.endlocation_code); - Logger.Information($"ele.elevator_id={ele?.elevator_id}"); + 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, string? 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(); if (endLocCodes?.Count > 0) { @@ -475,13 +477,13 @@ namespace Tnb.WarehouseMgr /// /// /// - private async Task CallingLanding(List<(string endlocation_code, string device_id, string id, string floorNO)> endLocCodes) + private async Task CallingLanding(List<(string endlocation_code, string device_id, string id, int floorNO)> endLocCodes) { Logger.Information($" 开始呼梯操作............."); Logger.Information($"电梯信息:{JsonConvert.SerializeObject(s_elevatorMap)}"); try { - foreach ((_, string devId, string disTaskId, string floorNO) in endLocCodes) + foreach ((_, string devId, string disTaskId, int floorNO) in endLocCodes) { Logger.Information($"devId:{devId}"); if (!s_elevatorMap.TryGetValue(devId, out object? elevatorCode)) @@ -597,7 +599,7 @@ namespace Tnb.WarehouseMgr } while (doorStatus != 4); Logger.Information($"当前门状态:{doorStatus}"); - int floor = await GetRealFloor(disTask.end_floor.ParseToInt()); + int floor = await GetRealFloor(disTask.end_floor); Logger.Information($"目标楼层:{floor}"); @@ -608,7 +610,7 @@ namespace Tnb.WarehouseMgr do { - tuple = await _elevatorControlService.GetElevatorStatus(devName,tags, CancellationToken.None); + tuple = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None); await Task.Delay(1000); } while (tuple.sysStatus != 3 && tuple.runStatus != 0); @@ -986,27 +988,38 @@ namespace Tnb.WarehouseMgr { List roads = await _db.Queryable().Where(it => it.status == 1).ToListAsync(); List points = await LocPathCalcAlgorithms(pStartId, pEndId, roads); + Logger.Information($"points:{string.Join(",", points.Select(p => p.point_code))}"); try { - if (points.FindAll(x => x.location_code != null && x.location_code.Contains("dt", StringComparison.OrdinalIgnoreCase))?.Count > 0) + if (points?.FindAll(x => x.location_code != null && x.location_code.Contains("dt", StringComparison.OrdinalIgnoreCase))?.Count > 0) { + Logger.Information("包含电梯Agv任务"); //查询当前电梯点 - List curEleDs = await _db.Queryable().Where(it => points.Select(x => x.id).Contains(it.point_id)).ToListAsync(); + List curEleDs = await _db.Queryable().InnerJoin((a, b) => a.bill_id == b.id).Where((a, b) => points.Select(x => x.id).Contains(a.point_id)).ToListAsync(); + Logger.Information($"curEleDs==null :{curEleDs == null},curEleDs:{string.Join(",", curEleDs.Select(x => x.bill_id))}"); //如果有电梯点,则会进行电梯的均匀分配 if (curEleDs?.Count > 0) { //当前电梯 - WmsElevatorH curEle = await _db.Queryable().SingleAsync(it => it.id == curEleDs.First().bill_id && it.enabled == 1); + WmsElevatorH curEle = await _db.Queryable().SingleAsync(it => it.id == curEleDs.First().bill_id); + Logger.Information($"curEle==null :{curEle == null}"); + //同电梯组电梯 List sGpEle = await _db.Queryable().Where(it => it.elevator_group == curEle.elevator_group && it.id != curEle.id && it.enabled == 1).ToListAsync(); - - if (curEle == null && sGpEle?.Count > 0) + if (curEle.enabled == 0 && (sGpEle == null || sGpEle.Count < 1)) { throw new AppFriendlyException("电梯被禁用或未配置", 500); } - + if ((sGpEle == null || sGpEle.Count < 1) && curEle.enabled == 1) + { + return points; + } + if (sGpEle?.Count > 0 && curEle.enabled == 0) + { + return points; + } //判断电梯组中各电梯任务数 - if (curEle == null || sGpEle.FindAll(x => Math.Abs(x.task_nums - curEle.task_nums) % 2 == 1)?.Count > 0) + if (sGpEle.FindAll(x => Math.Abs(x.task_nums - curEle.task_nums) % 2 == 1)?.Count > 0) { List sGpDs = await _db.Queryable().Where(it => it.bill_id == sGpEle.First().id).ToListAsync(); if (sGpDs?.Count > 0) diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsDistaskService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsDistaskService.cs index 0127a490..a594fa26 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsDistaskService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsDistaskService.cs @@ -31,6 +31,7 @@ namespace Tnb.WarehouseMgr preTask.status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID; _ = await _db.Updateable(preTask).UpdateColumns(it => it.status).ExecuteCommandAsync(); } + _ = await _db.Deleteable().Where(it => it.distask_id == id).ExecuteCommandAsync(); _ = await _db.Deleteable(disTask).ExecuteCommandAsync(); } diff --git a/apihost/Tnb.API.Entry/Startup.cs b/apihost/Tnb.API.Entry/Startup.cs index 049b470c..bc4afbe2 100644 --- a/apihost/Tnb.API.Entry/Startup.cs +++ b/apihost/Tnb.API.Entry/Startup.cs @@ -20,6 +20,7 @@ namespace JNPF.API.Entry; public class Startup : AppStartup { + //private TimedTaskBackgroundService timedTaskSvc = new(); public void ConfigureServices(IServiceCollection services) { // 注册和配置Mvc和api服务 @@ -48,7 +49,7 @@ public class Startup : AppStartup services.AddMemoryCache(); // 使用本地缓存必须添加 services.AddConfigurableOptions(); - services.AddSingleton( typeof(ISingleton), typeof(RedisData)); + services.AddSingleton(typeof(ISingleton), typeof(RedisData)); // 微信 services.AddSenparcGlobalServices(App.Configuration) // Senparc.CO2NET 全局注册 .AddSenparcWeixinServices(App.Configuration); // Senparc.Weixin 注册(如果使用Senparc.Weixin SDK则添加) @@ -56,15 +57,18 @@ public class Startup : AppStartup services.AddOverideVisualDev(); //定时任务 - services.AddHostedService(); - //services.AddHostedService(); + services.AddHostedService(); + services.AddSingleton(sp => new TimedTaskBackgroundService()); + //var bgSvc = App.GetRequiredService(); + //bgSvc.StartAsync(CancellationToken.None); + //services.AddHostedService(); } - public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider, IOptions senparcSetting, IOptions senparcWeixinSetting) + public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider, IOptions senparcSetting, IOptions senparcWeixinSetting, IHostApplicationLifetime lifeTime) { // 添加状态码拦截中间件 app.UseUnifyResultStatusCodes(); @@ -113,5 +117,10 @@ public class Startup : AppStartup bool isStartTimeJob = App.GetConfig("IsStartTimeJob"); if (isStartTimeJob) serviceProvider.GetRequiredService().StartTimerJob(); + + + + + } } \ No newline at end of file