已添加12个文件
已删除1个文件
已修改21个文件
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | namespace WIDESEAWCS_Common.Constants |
| | | { |
| | | /// <summary> |
| | | /// 设å¤å°åå
Œ
±å¸¸é |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// å®ä¹è®¾å¤éä¿¡ä¸ä½¿ç¨çå
Œ
±å¸¸éï¼å¦å°åæ ¼å¼ãä¿¡å·å¼çã |
| | | /// </remarks> |
| | | public class DeviceAddressConst |
| | | { |
| | | /// <summary> |
| | | /// 交äºä¿¡å·å¤ä½å¼ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// 设å¤å®æä»»å¡åï¼åå
¥æ¤å¼å°äº¤äºä¿¡å·å¯åå¨ä»¥å¤ä½ã |
| | | /// ç¨äºè¾é线ç设å¤çä»»å¡å®æç¡®è®¤ã |
| | | /// </remarks> |
| | | public const int InteractiveSignalReset = 0; |
| | | |
| | | /// <summary> |
| | | /// å°åå符串åé符 |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// å°åæ ¼å¼ä¸º "è¡-å-å±"ï¼ä¾å¦ "1-2-3" 表示第1è¡ã第2åã第3å±ã |
| | | /// </remarks> |
| | | public const char AddressSeparator = '-'; |
| | | |
| | | /// <summary> |
| | | /// å°åå符串åé符ï¼å符串形å¼ï¼ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// ç¨äºå符串 Split æä½ã |
| | | /// </remarks> |
| | | public const string AddressSeparatorString = "-"; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | namespace WIDESEAWCS_Common.Constants |
| | | { |
| | | /// <summary> |
| | | /// å åæºå½ä»¤ç±»åæä¸¾ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// æ ¹æ®å··éç±»åçä¸åï¼å åæºå¯è½ä½¿ç¨ä¸åçå½ä»¤æ ¼å¼ã |
| | | /// </remarks> |
| | | public enum StackerCraneCommandTypeEnum |
| | | { |
| | | /// <summary> |
| | | /// æ åå½ä»¤æ ¼å¼ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// ç¨äº GWãCW å¼å¤´å··éçå åæºã |
| | | /// </remarks> |
| | | Standard, |
| | | |
| | | /// <summary> |
| | | /// æåå½ä»¤æ ¼å¼ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// ç¨äº HC å¼å¤´å··éçå åæºã |
| | | /// å
嫿¡ç åæ®µï¼ç¨äºçµæ± 追溯ã |
| | | /// </remarks> |
| | | Formation |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | namespace WIDESEAWCS_Common.Constants |
| | | { |
| | | /// <summary> |
| | | /// å åæºç¸å
³å¸¸é |
| | | /// </summary> |
| | | public class StackerCraneConst |
| | | { |
| | | /// <summary> |
| | | /// 空æçä»»å¡ç±»å |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// å½ä»»å¡ç±»å为空æçåºåº/å
¥åºæ¶ï¼ä½¿ç¨æ¤ç¹æ®ç±»åå¼ä»£æ¿åä»»å¡ç±»åã |
| | | /// ç¨äºä¸ç«å°è·¯ç±é
ç½®å¹é
ã |
| | | /// </remarks> |
| | | public const int EmptyPalletTaskType = 100; |
| | | |
| | | /// <summary> |
| | | /// ç«è¦ç¶ææ£å¸¸ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// ç«è¦ä¿¡å·ä¸º 0 表示æ£å¸¸ï¼æ ç«ç¾æ¥è¦ã |
| | | /// </remarks> |
| | | public const short FireAlarmNormal = 0; |
| | | |
| | | /// <summary> |
| | | /// å¿è·³åå§å¼ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// å åæºå½ä»¤ä¸çå¿è·³å段åå§å¼ã |
| | | /// </remarks> |
| | | public const short HeartBeatInitial = 0; |
| | | |
| | | /// <summary> |
| | | /// ä½ä¸ç±»å - å
¥åº |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// æ è¯ä»»å¡ä¸ºå
¥åºä½ä¸ç±»åã |
| | | /// </remarks> |
| | | public const short WorkTypeInbound = 1; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using System.Collections.Generic; |
| | | |
| | | namespace WIDESEAWCS_Common.Constants |
| | | { |
| | | /// <summary> |
| | | /// å åæºå··éåç¼å¸¸é |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// å®ä¹å··éç¼ç çåç¼ä¸å½ä»¤ç±»åçæ å°å
³ç³»ã |
| | | /// </remarks> |
| | | public class StackerCraneRoadwayConst |
| | | { |
| | | /// <summary> |
| | | /// æåå åæºå··éåç¼ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// 以 HC å¼å¤´çå··éä½¿ç¨æåå åæºå½ä»¤æ ¼å¼ã |
| | | /// </remarks> |
| | | public const string FormationPrefix = "HC"; |
| | | |
| | | /// <summary> |
| | | /// æ åå åæºå··éåç¼ï¼GWï¼ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// 以 GW å¼å¤´çå··éä½¿ç¨æ åå åæºå½ä»¤æ ¼å¼ã |
| | | /// </remarks> |
| | | public const string StandardPrefixGW = "GW"; |
| | | |
| | | /// <summary> |
| | | /// æ åå åæºå··éåç¼ï¼CWï¼ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// 以 CW å¼å¤´çå··éä½¿ç¨æ åå åæºå½ä»¤æ ¼å¼ã |
| | | /// </remarks> |
| | | public const string StandardPrefixCW = "CW"; |
| | | |
| | | /// <summary> |
| | | /// å··éåç¼å°å½ä»¤ç±»åçé»è®¤æ å° |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// Key: å··éç¼ç åç¼ |
| | | /// Value: å½ä»¤ç±»ååç§° |
| | | /// </remarks> |
| | | public static readonly Dictionary<string, StackerCraneCommandTypeEnum> DefaultRoadwayCommandMapping = new() |
| | | { |
| | | { FormationPrefix, StackerCraneCommandTypeEnum.Formation }, |
| | | { StandardPrefixGW, StackerCraneCommandTypeEnum.Standard }, |
| | | { StandardPrefixCW, StackerCraneCommandTypeEnum.Standard } |
| | | }; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | namespace WIDESEAWCS_Common.Constants |
| | | { |
| | | /// <summary> |
| | | /// å åæºä½ä¸æä»¤æä¸¾ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// æ§å¶å åæºçå¨ä½æä»¤ï¼éè¿ PLC å¯åå¨ä¸å åæºéä¿¡ã |
| | | /// </remarks> |
| | | public enum StackerCraneWorkActionEnum |
| | | { |
| | | /// <summary> |
| | | /// å¼å§æ§è¡ä»»å¡ |
| | | /// </summary> |
| | | StartTask = 1, |
| | | |
| | | /// <summary> |
| | | /// ä»»å¡å®æ/忢 |
| | | /// </summary> |
| | | TaskComplete = 2, |
| | | |
| | | /// <summary> |
| | | /// æ¶é²ä»»å¡å¼å§ |
| | | /// </summary> |
| | | FireAlarmStart = 3 |
| | | } |
| | | } |
| | |
| | | { |
| | | return DeviceStatus.Idle; |
| | | } |
| | | else if (StackerCraneWorkStatusValue == StackerCraneWorkStatus.Putting || StackerCraneWorkStatusValue == StackerCraneWorkStatus.PickUp || StackerCraneWorkStatusValue == StackerCraneWorkStatus.PickUpCompleted || StackerCraneWorkStatusValue == StackerCraneWorkStatus.PutCompleted) |
| | | else if (StackerCraneWorkStatusValue == StackerCraneWorkStatus.Putting || StackerCraneWorkStatusValue == StackerCraneWorkStatus.PickUp || StackerCraneWorkStatusValue == StackerCraneWorkStatus.PutMove || StackerCraneWorkStatusValue == StackerCraneWorkStatus.PutCompleted) |
| | | { |
| | | return DeviceStatus.Working; |
| | | } |
| | |
| | | { |
| | | return deviceProtocolDetail.ProtocolDetailType; |
| | | } |
| | | return StackerCraneStatus.Unkonw.ToString(); |
| | | return StackerCraneStatus.Unknown.ToString(); |
| | | } |
| | | } |
| | | return StackerCraneStatus.Unkonw.ToString(); |
| | | return StackerCraneStatus.Unknown.ToString(); |
| | | } |
| | | |
| | | private void CheckConnect() |
| | |
| | | public enum StackerCraneStatus |
| | | { |
| | | /// <summary> |
| | | /// æ£å¸¸ |
| | | /// 空é²&èæº |
| | | /// </summary> |
| | | [Description("æ£å¸¸")] |
| | | Normal, |
| | | [Description("空é²&èæº")] |
| | | Normal = 1, |
| | | |
| | | /// <summary> |
| | | /// æ
é |
| | |
| | | /// æªç¥ |
| | | /// </summary> |
| | | [Description("æªç¥")] |
| | | Unkonw |
| | | Unknown |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | /// ç»´ä¿®/ç»´æ¤/ä¿å
» |
| | | /// </summary> |
| | | [Description("ç»´ä¿®")] |
| | | Maintenance, |
| | | Maintenance = 2, |
| | | |
| | | /// <summary> |
| | | /// æå¨ |
| | |
| | | /// æªç¥ |
| | | /// </summary> |
| | | [Description("æªç¥")] |
| | | Unkonw |
| | | Unknown |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | /// å¾
æº |
| | | /// </summary> |
| | | [Description("å¾
æº")] |
| | | Standby, |
| | | Standby = 1, |
| | | |
| | | /// <summary> |
| | | /// æ¥æ¶ä»»å¡ |
| | | /// </summary> |
| | | [Description("æ¥æ¶ä»»å¡")] |
| | | AcceptTask, |
| | | |
| | | /// <summary> |
| | | /// åè´§ç§»å¨ä¸ |
| | | /// </summary> |
| | | [Description("åè´§ç§»å¨ä¸")] |
| | | PickMove, |
| | | |
| | | /// <summary> |
| | | /// åè´§ä¸ |
| | |
| | | PickUp, |
| | | |
| | | /// <summary> |
| | | /// åè´§å®æ |
| | | /// æ¾è´§ç§»å¨ä¸ |
| | | /// </summary> |
| | | [Description("åè´§å®æ")] |
| | | PickUpCompleted, |
| | | [Description("æ¾è´§ç§»å¨ä¸")] |
| | | PutMove, |
| | | |
| | | /// <summary> |
| | | /// æ¾è´§ä¸ |
| | |
| | | /// æªç¥ |
| | | /// </summary> |
| | | [Description("æªç¥")] |
| | | Unkonw |
| | | Unknown |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | { |
| | | if (!Communicator.IsConnected) |
| | | { |
| | | return StackerCraneStatus.Unkonw.ToString(); |
| | | return StackerCraneStatus.Unknown.ToString(); |
| | | } |
| | | |
| | | List<DeviceProDTO> devicePros = _deviceProDTOs.Where(x => x.DeviceProParamType == protocolParamType).ToList(); |
| | |
| | | } |
| | | } |
| | | |
| | | return StackerCraneStatus.Unkonw.ToString(); |
| | | return StackerCraneStatus.Unknown.ToString(); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | { |
| | | if (!Communicator.IsConnected) |
| | | { |
| | | return StackerCraneStatus.Unkonw.ToString(); |
| | | return StackerCraneStatus.Unknown.ToString(); |
| | | } |
| | | |
| | | List<DeviceProDTO> devicePros = _deviceProDTOs.Where(x => x.DeviceProParamType == protocolParamType).ToList(); |
| | |
| | | } |
| | | } |
| | | |
| | | return StackerCraneStatus.Unkonw.ToString(); |
| | | return StackerCraneStatus.Unknown.ToString(); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | |  |
| | | Microsoft Visual Studio Solution File, Format Version 12.00 |
| | | # Visual Studio Version 18 |
| | | VisualStudioVersion = 18.2.11415.280 d18.0 |
| | | VisualStudioVersion = 18.2.11415.280 |
| | | MinimumVisualStudioVersion = 10.0.40219.1 |
| | | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEAWCS_Server", "WIDESEAWCS_Server\WIDESEAWCS_Server.csproj", "{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}" |
| | | EndProject |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | { |
| | | "version": "3.0", |
| | | "defaultProvider": "cdnjs", |
| | | "libraries": [] |
| | | } |
| | |
| | | return content.Error($"éç¥WMSç³»ç»å åæºå
¥åºå®æå¤±è´¥,ä»»å¡å·:ã{task.TaskNum}ã,æçå·:ã{task.PalletCode}ã,é误信æ¯:ã{result.Data?.Message}ã"); |
| | | } |
| | | |
| | | return content.Error($"éç¥WMSç³»ç»å åæºå
¥åºå®ææå,ä»»å¡å·:ã{task.TaskNum}ã,æçå·:ã{task.PalletCode}ã"); |
| | | return content.OK($"éç¥WMSç³»ç»å åæºå
¥åºå®ææå,ä»»å¡å·:ã{task.TaskNum}ã,æçå·:ã{task.PalletCode}ã"); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | using MapsterMapper; |
| | | using OfficeOpenXml.FormulaParsing.Excel.Functions.Text; |
| | | using Quartz; |
| | | using WIDESEAWCS_Common.Constants; |
| | | using WIDESEAWCS_Communicator; |
| | | using WIDESEAWCS_Core; |
| | | using WIDESEAWCS_Core.Helper; |
| | |
| | | Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.TaskNum, childDeviceCode); |
| | | if (task != null) |
| | | { |
| | | conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal, 0, childDeviceCode); |
| | | conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal, DeviceAddressConst.InteractiveSignalReset, childDeviceCode); |
| | | WebResponseContent content = _taskService.UpdateTaskStatusToNext(task); |
| | | Console.Out.WriteLine(content.Serialize()); |
| | | } |
| | |
| | | Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.TaskNum, childDeviceCode); |
| | | if (task != null) |
| | | { |
| | | conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal, 0, childDeviceCode); |
| | | conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal, DeviceAddressConst.InteractiveSignalReset, childDeviceCode); |
| | | WebResponseContent content = _taskService.UpdateTaskStatusToNext(task); |
| | | Console.Out.WriteLine(content.Serialize()); |
| | | } |
| | |
| | | using Newtonsoft.Json; |
| | | using Quartz; |
| | | using SqlSugar; |
| | | using System.Text; |
| | | using System.Text.Json; |
| | | using WIDESEA_Core; |
| | | using WIDESEAWCS_Common.TaskEnum; |
| | | using WIDESEAWCS_Core; |
| | |
| | | private readonly ILogger<CommonConveyorLineNewJob> _logger; |
| | | |
| | | /// <summary> |
| | | /// ç®æ å°åå°è®¾å¤ç±»åçæ å° |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// </remarks> |
| | | private static List<string> AddressToDeviceType = new List<string> { "11020", "11028" }; |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | /// <param name="taskService">任塿å¡</param> |
| | |
| | | // MaxDegreeOfParallelism = Math.Min(childDeviceCodes.Count, Environment.ProcessorCount * 2), |
| | | //}; |
| | | |
| | | _logger.LogDebug("Executeï¼å¼å§å¹¶è¡å¤çè¾é线 {DeviceCode}ï¼åè®¾å¤æ°é: {Count}", conveyorLine.DeviceCode, childDeviceCodes.Count); |
| | | QuartzLogger.Debug($"å¼å§å¹¶è¡å¤çè¾é线ï¼åè®¾å¤æ°é: {childDeviceCodes.Count}", conveyorLine.DeviceCode); |
| | | //_logger.LogDebug("Executeï¼å¼å§å¹¶è¡å¤çè¾é线 {DeviceCode}ï¼åè®¾å¤æ°é: {Count}", conveyorLine.DeviceCode, childDeviceCodes.Count); |
| | | //QuartzLogger.Debug($"å¼å§å¹¶è¡å¤çè¾é线ï¼åè®¾å¤æ°é: {childDeviceCodes.Count}", conveyorLine.DeviceCode); |
| | | |
| | | // å¹¶è¡å¤çæ¯ä¸ªåè®¾å¤ |
| | | //Parallel.For(0, childDeviceCodes.Count, parallelOptions, i => |
| | |
| | | continue; |
| | | } |
| | | |
| | | // 妿 WCS_ACK 为 1ï¼å
æ¸
é¤ï¼è¡¨ç¤ºå¤çè¿ä¸ä¸æ¬¡è¯·æ±ï¼ |
| | | if (command.WCS_ACK == 1) |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, 0, childDeviceCode); |
| | | |
| | | // ========== æ£æ¥ç¹å®ä½ç½®æ¯å¦ææç ========== |
| | | // ä»é
ç½®ä¸è¯»åéè¦æ£æ¥æççä½ç½®å表 |
| | |
| | | // åªæå½ PLC_STB 为 1 æ¶æå¤çä»»å¡ |
| | | if (command.PLC_STB != 1) |
| | | { |
| | | return Task.CompletedTask; |
| | | // 妿 WCS_ACK 为 1ï¼å
æ¸
é¤ï¼è¡¨ç¤ºå¤çè¿ä¸ä¸æ¬¡è¯·æ±ï¼ |
| | | if (command.WCS_ACK == 1) |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)0, childDeviceCode); |
| | | continue; |
| | | } |
| | | |
| | | // ========== å¤çæ æçæ¡ç çæ
åµ ========== |
| | |
| | | _logger.LogDebug("Executeï¼åè®¾å¤ {ChildDeviceCode} æ æçæ¡ç ï¼è¯·æ±åºåºä»»å¡", childDeviceCode); |
| | | QuartzLogger.Debug($"åè®¾å¤ {childDeviceCode} æ æçæ¡ç ï¼è¯·æ±åºåºä»»å¡", conveyorLine.DeviceCode); |
| | | _conveyorLineDispatch.RequestOutbound(conveyorLine, command, childDeviceCode); |
| | | return Task.CompletedTask; |
| | | continue; |
| | | } |
| | | |
| | | // ========== å¤çå·²æä»»å¡å·çæ
åµ ========== |
| | |
| | | { |
| | | case InExecuting: |
| | | // å
¥åºæ§è¡ä¸ï¼è°ç¨ä¸ä¸å°åå¤ç |
| | | _conveyorLineDispatch.RequestInNextAddress(conveyorLine, command, childDeviceCode); |
| | | |
| | | if (AddressToDeviceType.Contains(childDeviceCode)) |
| | | // å°è¾¾ç®æ å°åï¼è°ç¨å
¥åºå®æ |
| | | _conveyorLineDispatch.ConveyorLineInFinish(conveyorLine, command, childDeviceCode); |
| | | else |
| | | // æªå°è¾¾ç®æ å°åï¼è°ç¨å
¥åºä¸ä¸å°åå¤ç |
| | | _conveyorLineDispatch.RequestInNextAddress(conveyorLine, command, childDeviceCode); |
| | | break; |
| | | |
| | | case OutExecuting: |
| | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | _ = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress); |
| | | |
| | | // 设置 WCS_STB æ å¿ï¼è¡¨ç¤º WCS å·²å¤ç |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_STB, 1, childDeviceCode); |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | Dt_Task? task = _taskFilter.QueryExecutingTask(command.TaskNo, childDeviceCode); |
| | | if (task != null) |
| | | { |
| | | // åå¤ ACK 确认 |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, 1, childDeviceCode); |
| | | |
| | | // æ´æ°ä»»å¡ç¶æå°ä¸ä¸é¶æ®µï¼é常æ¯å®æï¼ |
| | | WebResponseContent content = _taskService.UpdateTaskStatusToNext(task); |
| | | if (_taskService.UpdateTaskStatusToNext(task).Status) |
| | | { |
| | | |
| | | } |
| | | |
| | | // åå¤ ACK 确认 |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode); |
| | | |
| | | _logger.LogInformation("ConveyorLineInFinishï¼å
¥åºå®æï¼ä»»å¡å·: {TaskNum}ï¼å设å¤: {ChildDeviceCode}", task.TaskNum, childDeviceCode); |
| | | QuartzLogger.Info($"å
¥åºå®æï¼ä»»å¡å·: {task.TaskNum}", conveyorLine.DeviceCode); |
| | |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.Target, task.NextAddress, childDeviceCode); |
| | | |
| | | // åå¤ ACK 确认 |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, 1, childDeviceCode); |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode); |
| | | |
| | | // æ´æ°ä»»å¡ç¶æ |
| | | _taskService.UpdateTaskStatusToNext(task); |
| | |
| | | _ = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress); |
| | | |
| | | // åå¤ ACK 确认 |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, 1, childDeviceCode); |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | WebResponseContent content = _taskService.UpdateTaskStatusToNext(task); |
| | | |
| | | // åå¤ ACK 确认 |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, 1, childDeviceCode); |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode); |
| | | |
| | | _logger.LogInformation("ConveyorLineOutFinishï¼åºåºå®æï¼ä»»å¡å·: {TaskNum}ï¼å设å¤: {ChildDeviceCode}", task.TaskNum, childDeviceCode); |
| | | QuartzLogger.Info($"åºåºå®æï¼ä»»å¡å·: {task.TaskNum}", conveyorLine.DeviceCode); |
| | |
| | | // 设置è¾é线çä»»å¡å· |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, taskInfo.TaskNum, sourceAddress); |
| | | |
| | | // 触åè¾é线å¼å§æ§è¡ï¼åå
¥ WCS_STB = 1ï¼ |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_STB, 1, sourceAddress); |
| | | // 触åè¾é线å¼å§æ§è¡ï¼åå
¥ WCS_ACK = 1ï¼ |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, sourceAddress); |
| | | |
| | | // æ´æ°ä»»å¡ç¶æå°ä¸ä¸é¶æ®µ |
| | | if (_taskService.UpdateTaskStatusToNext(taskInfo).Status) |
| | |
| | | using Microsoft.Extensions.Logging; |
| | | using Quartz; |
| | | using System; |
| | | using System.Diagnostics.CodeAnalysis; |
| | | using System.IO; |
| | | using System.Threading.Tasks; |
| | | using WIDESEAWCS_Common.TaskEnum; |
| | | using WIDESEA_Core; |
| | | using WIDESEAWCS_Core; |
| | | using WIDESEAWCS_Core.LogHelper; |
| | | using WIDESEAWCS_ITaskInfoRepository; |
| | | using WIDESEAWCS_ITaskInfoService; |
| | | using WIDESEAWCS_Model.Models; |
| | | using WIDESEAWCS_QuartzJob; |
| | | using WIDESEAWCS_QuartzJob.StackerCrane; |
| | | using WIDESEAWCS_Tasks.StackerCraneJob; |
| | | using WIDESEA_Core; |
| | | using WIDESEAWCS_Core.LogHelper; |
| | | using WIDESEAWCS_QuartzJob.Service; |
| | | using WIDESEAWCS_QuartzJob.StackerCrane; |
| | | using WIDESEAWCS_QuartzJob.StackerCrane.Enum; |
| | | using WIDESEAWCS_Common.Constants; |
| | | using WIDESEAWCS_Tasks.StackerCraneJob; |
| | | |
| | | namespace WIDESEAWCS_Tasks |
| | | { |
| | |
| | | { |
| | | // ä» JobDataMap è·åå åæºè®¾å¤åæ° |
| | | bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value); |
| | | if (!flag || value is not IStackerCrane commonStackerCrane) |
| | | if (!flag || value is not CommonStackerCrane commonStackerCrane) |
| | | { |
| | | // åæ°æ æï¼ç´æ¥è¿å |
| | | _logger.LogWarning("Executeï¼åæ°æ æ"); |
| | |
| | | |
| | | // ========== æ£æ¥å åæºä»»å¡å®æç¶æ ========== |
| | | commonStackerCrane.CheckStackerCraneTaskCompleted(); |
| | | _logger.LogDebug("Executeï¼æ£æ¥ä»»å¡å®æç¶æï¼è®¾å¤: {DeviceCode}", _deviceCode); |
| | | QuartzLogger.Debug($"æ£æ¥ä»»å¡å®æç¶æï¼è®¾å¤: {_deviceCode}", _deviceCode); |
| | | //_logger.LogDebug("Executeï¼æ£æ¥ä»»å¡å®æç¶æï¼è®¾å¤: {DeviceCode}", _deviceCode); |
| | | //QuartzLogger.Debug($"æ£æ¥ä»»å¡å®æç¶æï¼è®¾å¤: {_deviceCode}", _deviceCode); |
| | | |
| | | // ========== æ£æ¥æ¯å¦å¯ä»¥åéæ°ä»»å¡ ========== |
| | | if (!commonStackerCrane.IsCanSendTask(commonStackerCrane.Communicator, commonStackerCrane.DeviceProDTOs, commonStackerCrane.DeviceProtocolDetailDTOs)) |
| | | //if (!commonStackerCrane.IsCanSendTask(commonStackerCrane.Communicator, commonStackerCrane.DeviceProDTOs, commonStackerCrane.DeviceProtocolDetailDTOs)) |
| | | if (commonStackerCrane.StackerCraneStatusValue != StackerCraneStatus.Normal) |
| | | { |
| | | // å åæºä¸å¯ç¨ï¼å¦æ£å¨æ§è¡ä¸ä¸ä»»å¡ï¼ï¼ç´æ¥è¿å |
| | | _logger.LogDebug("Executeï¼å åæºä¸å¯ç¨ï¼è®¾å¤: {DeviceCode}", _deviceCode); |
| | |
| | | if (task == null) |
| | | { |
| | | // 没æå¯ç¨ä»»å¡ |
| | | _logger.LogDebug("Executeï¼æ²¡æå¯ç¨ä»»å¡ï¼è®¾å¤: {DeviceCode}", _deviceCode); |
| | | QuartzLogger.Debug($"没æå¯ç¨ä»»å¡ï¼è®¾å¤: {_deviceCode}", _deviceCode); |
| | | //_logger.LogDebug("Executeï¼æ²¡æå¯ç¨ä»»å¡ï¼è®¾å¤: {DeviceCode}", _deviceCode); |
| | | //QuartzLogger.Debug($"没æå¯ç¨ä»»å¡ï¼è®¾å¤: {_deviceCode}", _deviceCode); |
| | | return Task.CompletedTask; |
| | | } |
| | | |
| | | _logger.LogInformation("Executeï¼éæ©ä»»å¡ï¼è®¾å¤: {DeviceCode}ï¼ä»»å¡å·: {TaskNum}", _deviceCode, task.TaskNum); |
| | | QuartzLogger.Info($"鿩任å¡ï¼ä»»å¡å·: {task.TaskNum}", _deviceCode); |
| | | //_logger.LogInformation("Executeï¼éæ©ä»»å¡ï¼è®¾å¤: {DeviceCode}ï¼ä»»å¡å·: {TaskNum}", _deviceCode, task.TaskNum); |
| | | //QuartzLogger.Info($"鿩任å¡ï¼ä»»å¡å·: {task.TaskNum}", _deviceCode); |
| | | |
| | | // ========== æå»ºå½ä»¤ ========== |
| | | // å½ä»¤æå»ºä¸æ²å°ä¸ç¨æå»ºå¨ |
| | |
| | | bool sendFlag = SendStackerCraneCommand(commonStackerCrane, stackerCraneTaskCommand); |
| | | if (sendFlag) |
| | | { |
| | | Task.Delay(1000).Wait(); |
| | | commonStackerCrane.SetValue(StackerCraneDBName.WorkAction, (short)StackerCraneWorkActionEnum.StartTask); |
| | | // åéæåï¼æ´æ°ç¶æ |
| | | commonStackerCrane.LastTaskType = task.TaskType; |
| | | _taskService.UpdateTaskStatusToNext(task.TaskNum); |
| | |
| | | QuartzLogger.Info($"ä»»å¡å®æï¼ä»»å¡å·: {e.TaskNum}", stackerCrane.DeviceCode); |
| | | |
| | | // æ´æ°ä»»å¡ç¶æä¸ºå®æ |
| | | _taskService.StackCraneTaskCompleted(e.TaskNum); |
| | | |
| | | // æ¸
é¤å åæºçä½ä¸æä»¤ï¼è®¾ç½®ä¸º 2ï¼è¡¨ç¤ºç©ºé²ï¼ |
| | | stackerCrane.SetValue(StackerCraneDBName.WorkAction, 2); |
| | | if (_taskService.StackCraneTaskCompleted(e.TaskNum).Status) |
| | | { |
| | | // æ¸
é¤å åæºçä½ä¸æä»¤ï¼è®¾ç½®ä¸ºç©ºé²ï¼ |
| | | stackerCrane.SetValue(StackerCraneDBName.WorkAction, (short)StackerCraneWorkActionEnum.TaskComplete); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | }; |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | using Microsoft.Extensions.Logging; |
| | | using System; |
| | | using System.Diagnostics.CodeAnalysis; |
| | | using WIDESEAWCS_Common.Constants; |
| | | using WIDESEAWCS_Common.TaskEnum; |
| | | using WIDESEAWCS_Core.LogHelper; |
| | | using WIDESEAWCS_ITaskInfoService; |
| | |
| | | /// <returns>å åæºå½ä»¤å¯¹è±¡ï¼è½¬æ¢å¤±è´¥è¿å null</returns> |
| | | public object? ConvertToStackerCraneTaskCommand([NotNull] Dt_Task task) |
| | | { |
| | | return BuildCommand(task, CreateStandardCommand(task)); |
| | | // æ ¹æ®å··éè·åå½ä»¤ç±»å |
| | | string commandType = GetCommandType(task.Roadway); |
| | | //string commandType = GetCommandType(task.Roadway); |
| | | |
| | | _logger.LogInformation("ConvertToStackerCraneTaskCommandï¼æå»ºå½ä»¤ï¼ä»»å¡å·: {TaskNum}ï¼å··é: {Roadway}ï¼å½ä»¤ç±»å: {CommandType}", task.TaskNum, task.Roadway, commandType); |
| | | QuartzLogger.Info($"æå»ºå½ä»¤ï¼ä»»å¡å·: {task.TaskNum}ï¼å··é: {task.Roadway}ï¼å½ä»¤ç±»å: {commandType}", task.Roadway); |
| | | //_logger.LogInformation("ConvertToStackerCraneTaskCommandï¼æå»ºå½ä»¤ï¼ä»»å¡å·: {TaskNum}ï¼å··é: {Roadway}ï¼å½ä»¤ç±»å: {CommandType}", task.TaskNum, task.Roadway, commandType); |
| | | //QuartzLogger.Info($"æå»ºå½ä»¤ï¼ä»»å¡å·: {task.TaskNum}ï¼å··é: {task.Roadway}ï¼å½ä»¤ç±»å: {commandType}", task.Roadway); |
| | | |
| | | // æ ¹æ®å½ä»¤ç±»åè°ç¨ç¸åºçæå»ºæ¹æ³ |
| | | return commandType switch |
| | | { |
| | | "Formation" => BuildCommand(task, CreateFormationCommand(task)), // æåå½ä»¤ |
| | | _ => BuildCommand(task, CreateStandardCommand(task)) // æ åå½ä»¤ |
| | | }; |
| | | //// æ ¹æ®å½ä»¤ç±»åè°ç¨ç¸åºçæå»ºæ¹æ³ |
| | | //return commandType switch |
| | | //{ |
| | | // "Formation" => BuildCommand(task, CreateFormationCommand(task)), // æåå½ä»¤ |
| | | // _ => BuildCommand(task, CreateStandardCommand(task)) // æ åå½ä»¤ |
| | | //}; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | return new StackerCraneTaskCommand |
| | | { |
| | | TaskNum = task.TaskNum, // ä»»å¡å· |
| | | WorkType = 1, // ä½ä¸ç±»å |
| | | WorkAction = 1 // ä½ä¸æä»¤ï¼å¼å§æ§è¡ |
| | | WorkType = StackerCraneConst.WorkTypeInbound, // ä½ä¸ç±»åï¼å
¥åº |
| | | //WorkAction = StackerCraneWorkActionEnum.StartTask // ä½ä¸æä»¤ï¼å¼å§æ§è¡ |
| | | }; |
| | | } |
| | | |
| | |
| | | { |
| | | Barcode = task.PalletCode, // æçæ¡ç |
| | | TaskNum = task.TaskNum, // ä»»å¡å· |
| | | WorkType = 1, // ä½ä¸ç±»å |
| | | WorkAction = 1, // ä½ä¸æä»¤ï¼å¼å§æ§è¡ |
| | | FireAlarm = 0, // ç«è¦ï¼æ£å¸¸ |
| | | HeartBeat = 0, // å¿è·³ |
| | | WorkType = StackerCraneConst.WorkTypeInbound, // ä½ä¸ç±»åï¼å
¥åº |
| | | WorkAction = (short)StackerCraneWorkActionEnum.StartTask, // ä½ä¸æä»¤ï¼å¼å§æ§è¡ |
| | | FireAlarm = StackerCraneConst.FireAlarmNormal, // ç«è¦ï¼æ£å¸¸ |
| | | HeartBeat = StackerCraneConst.HeartBeatInitial, // å¿è·³ |
| | | FieldName = string.Empty // ä¿çåæ®µ |
| | | }; |
| | | } |
| | |
| | | _logger.LogInformation("BuildInboundCommandï¼æå»ºå
¥åºå½ä»¤ï¼ä»»å¡å·: {TaskNum}", task.TaskNum); |
| | | QuartzLogger.Info($"BuildInboundCommandï¼æå»ºå
¥åºå½ä»¤ï¼ä»»å¡å·: {task.TaskNum}", task.Roadway); |
| | | |
| | | // ç¡®å®ä»»å¡ç±»åï¼ç©ºæçç¨ç¹æ®ç±»å 100ï¼ |
| | | // ç¡®å®ä»»å¡ç±»åï¼ç©ºæçç¨ç¹æ®ç±»åï¼ |
| | | int taskType = 0; |
| | | if (task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty) |
| | | { |
| | | taskType = 100; |
| | | taskType = StackerCraneConst.EmptyPalletTaskType; |
| | | } |
| | | else |
| | | taskType = task.TaskType; |
| | |
| | | int taskType = 0; |
| | | if (task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty) |
| | | { |
| | | taskType = 100; |
| | | taskType = StackerCraneConst.EmptyPalletTaskType; |
| | | } |
| | | else |
| | | taskType = task.TaskType; |
| | |
| | | /// ä½ä¸æä»¤ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// æ§å¶å åæºçå¨ä½ï¼ |
| | | /// æ§å¶å åæºçå¨ä½ãåè§ <see cref="Constants.StackerCraneWorkActionEnum"/>ï¼ |
| | | /// - 1: å¼å§æ§è¡ä»»å¡ |
| | | /// - 2: ä»»å¡å®æ/忢 |
| | | /// - 3: æ¶é²ä»»å¡å¼å§ |
| | | /// </remarks> |
| | | WorkAction, |
| | | |
| | |
| | | /// æ§å¶å åæºçå¨ä½ï¼ |
| | | /// - 1: å¼å§æ§è¡ä»»å¡ |
| | | /// - 2: ä»»å¡å®æ/忢 |
| | | /// - 3: æ¶é²ä»»å¡å¼å§ |
| | | /// </remarks> |
| | | public short WorkAction { get; set; } |
| | | |
| | |
| | | using Newtonsoft.Json; |
| | | using System.Diagnostics.CodeAnalysis; |
| | | using WIDESEA_Core; |
| | | using WIDESEAWCS_Common.Constants; |
| | | using WIDESEAWCS_Common.HttpEnum; |
| | | using WIDESEAWCS_Common.TaskEnum; |
| | | using WIDESEAWCS_Core; |
| | |
| | | Dt_Task? candidateTask; |
| | | var deviceCode = commonStackerCrane.DeviceCode; |
| | | |
| | | _logger.LogInformation("SelectTaskï¼å¼å§éæ©ä»»å¡ï¼è®¾å¤: {DeviceCode}ï¼ä¸ä¸ä»»å¡ç±»å: {LastTaskType}", deviceCode, commonStackerCrane.LastTaskType); |
| | | QuartzLogger.Info($"å¼å§éæ©ä»»å¡ï¼è®¾å¤: {deviceCode}ï¼ä¸ä¸ä»»å¡ç±»å: {commonStackerCrane.LastTaskType}", deviceCode); |
| | | //_logger.LogInformation("SelectTaskï¼å¼å§éæ©ä»»å¡ï¼è®¾å¤: {DeviceCode}ï¼ä¸ä¸ä»»å¡ç±»å: {LastTaskType}", deviceCode, commonStackerCrane.LastTaskType); |
| | | //QuartzLogger.Info($"å¼å§éæ©ä»»å¡ï¼è®¾å¤: {deviceCode}ï¼ä¸ä¸ä»»å¡ç±»å: {commonStackerCrane.LastTaskType}", deviceCode); |
| | | |
| | | // æ ¹æ®ä¸ä¸ä»»å¡ç±»åå³å®æ¥è¯¢çç¥ |
| | | if (commonStackerCrane.LastTaskType == null) |
| | |
| | | if (task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty) |
| | | { |
| | | // 空æçåºåº |
| | | taskType = 100; |
| | | taskType = StackerCraneConst.EmptyPalletTaskType; |
| | | } |
| | | else |
| | | taskType = task.TaskType; |
| | |
| | | _logger.LogInformation("IsOutTaskStationAvailableï¼ç«å° {ChildPosi}ï¼æ¯å¦è¢«å ç¨: {IsOccupied}ï¼ä»»å¡å·: {TaskNum}", router.ChildPosi, isOccupied, task.TaskNum); |
| | | QuartzLogger.Info($"IsOutTaskStationAvailableï¼ç«å° {router.ChildPosi}ï¼æ¯å¦è¢«å ç¨: {isOccupied}", task.Roadway); |
| | | |
| | | return !isOccupied; |
| | | return isOccupied; |
| | | } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | { |
| | | "version": "0.2.0", |
| | | "configurations": [ |
| | | { |
| | | // ä½¿ç¨ IntelliSense æ¾åº C# è°è¯åå¨åªäºå±æ§ |
| | | // å°æ¬åç¨äºç°æå±æ§ç说æ |
| | | // æå
³è¯¦ç»ä¿¡æ¯ï¼è¯·è®¿é® https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.mdã |
| | | "name": ".NET Core Launch (web)", |
| | | "type": "coreclr", |
| | | "request": "launch", |
| | | "preLaunchTask": "build", |
| | | // å¦æå·²æ´æ¹ç®æ æ¡æ¶ï¼è¯·ç¡®ä¿æ´æ°ç¨åºè·¯å¾ã |
| | | "program": "${workspaceFolder}/WIDESEA_WMSServer/bin/Debug/net8.0/WIDESEA_WMSServer.dll", |
| | | "args": [], |
| | | "cwd": "${workspaceFolder}/WIDESEA_WMSServer", |
| | | "stopAtEntry": false, |
| | | // å¯ç¨å¨å¯å¨ ASP.NET Core æ¶å¯å¨ Web æµè§å¨ãæå
³è¯¦ç»ä¿¡æ¯: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser |
| | | "serverReadyAction": { |
| | | "action": "openExternally", |
| | | "pattern": "\\bNow listening on:\\s+(https?://\\S+)" |
| | | }, |
| | | "env": { |
| | | "ASPNETCORE_ENVIRONMENT": "Development" |
| | | }, |
| | | "sourceFileMap": { |
| | | "/Views": "${workspaceFolder}/Views" |
| | | } |
| | | }, |
| | | { |
| | | "name": ".NET Core Attach", |
| | | "type": "coreclr", |
| | | "request": "attach" |
| | | } |
| | | ] |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | { |
| | | "version": "2.0.0", |
| | | "tasks": [ |
| | | { |
| | | "label": "build", |
| | | "command": "dotnet", |
| | | "type": "process", |
| | | "args": [ |
| | | "build", |
| | | "${workspaceFolder}/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj", |
| | | "/property:GenerateFullPaths=true", |
| | | "/consoleloggerparameters:NoSummary;ForceNoAlign" |
| | | ], |
| | | "problemMatcher": "$msCompile" |
| | | }, |
| | | { |
| | | "label": "publish", |
| | | "command": "dotnet", |
| | | "type": "process", |
| | | "args": [ |
| | | "publish", |
| | | "${workspaceFolder}/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj", |
| | | "/property:GenerateFullPaths=true", |
| | | "/consoleloggerparameters:NoSummary;ForceNoAlign" |
| | | ], |
| | | "problemMatcher": "$msCompile" |
| | | }, |
| | | { |
| | | "label": "watch", |
| | | "command": "dotnet", |
| | | "type": "process", |
| | | "args": [ |
| | | "watch", |
| | | "run", |
| | | "--project", |
| | | "${workspaceFolder}/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj" |
| | | ], |
| | | "problemMatcher": "$msCompile" |
| | | } |
| | | ] |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | namespace WIDESEA_Common.Constants |
| | | { |
| | | /// <summary> |
| | | /// åºåRemarkè·¯ç±æ 记常é |
| | | /// </summary> |
| | | public static class StockRemarkConstants |
| | | { |
| | | /// <summary> |
| | | /// 髿¸©1å·è·¯ç±æ è®° |
| | | /// </summary> |
| | | public const string GW1 = "GW_1"; |
| | | |
| | | /// <summary> |
| | | /// 髿¸©2å·è·¯ç±æ è®° |
| | | /// </summary> |
| | | public const string GW2 = "GW_2"; |
| | | |
| | | /// <summary> |
| | | /// 常温1å·è·¯ç±æ è®° |
| | | /// </summary> |
| | | public const string CW1 = "CW_1"; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åºåºæ¶æå¸¸éï¼å°æ¶ï¼ |
| | | /// </summary> |
| | | public static class OutboundTimeConstants |
| | | { |
| | | /// <summary> |
| | | /// GW_1馿¾å
¥åºæ¶æï¼16å°æ¶ï¼ |
| | | /// </summary> |
| | | public const int OUTBOUND_HOURS_GW1_FIRST = 16; |
| | | |
| | | /// <summary> |
| | | /// GW_1äºæ¾å
¥åºæ¶æï¼24å°æ¶ï¼ |
| | | /// </summary> |
| | | public const int OUTBOUND_HOURS_GW1_SECOND = 24; |
| | | |
| | | /// <summary> |
| | | /// CW_1åºåºæ¶æï¼12å°æ¶ï¼ |
| | | /// </summary> |
| | | public const int OUTBOUND_HOURS_CW1 = 12; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | namespace WIDESEA_Common.Constants |
| | | { |
| | | /// <summary> |
| | | /// åºåä¸MESç¸å
³å¸¸é |
| | | /// </summary> |
| | | public static class StockConstants |
| | | { |
| | | /// <summary> |
| | | /// é»è®¤ç©æç¼ç |
| | | /// </summary> |
| | | public const string MATERIAL_CODE = "çµè¯"; |
| | | |
| | | /// <summary> |
| | | /// é»è®¤ç©æåç§° |
| | | /// </summary> |
| | | public const string MATERIAL_NAME = "çµè¯"; |
| | | |
| | | /// <summary> |
| | | /// é»è®¤åä½ |
| | | /// </summary> |
| | | public const string UNIT = "PCS"; |
| | | |
| | | /// <summary> |
| | | /// é»è®¤å建è
|
| | | /// </summary> |
| | | public const string SYSTEM_USER = "system"; |
| | | |
| | | /// <summary> |
| | | /// AGVå建è
|
| | | /// </summary> |
| | | public const string AGV_USER = "AGV"; |
| | | |
| | | /// <summary> |
| | | /// èªå¨ä»»å¡å建è
|
| | | /// </summary> |
| | | public const string SYSTEM_AUTO_USER = "system_auto"; |
| | | |
| | | /// <summary> |
| | | /// é»è®¤è®¢åå· |
| | | /// </summary> |
| | | public const string DEFAULT_ORDER_NO = "111"; |
| | | |
| | | /// <summary> |
| | | /// MES设å¤ç¼ç |
| | | /// </summary> |
| | | public const string MES_EQUIPMENT_CODE = "STK-GROUP-001"; |
| | | |
| | | /// <summary> |
| | | /// MESèµæºç¼ç |
| | | /// </summary> |
| | | public const string MES_RESOURCE_CODE = "STK-GROUP-001"; |
| | | |
| | | /// <summary> |
| | | /// ç»çæä½ç±»åï¼0代表ç»çï¼ |
| | | /// </summary> |
| | | public const int MES_BIND_OPERATION_TYPE = 0; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | namespace WIDESEA_Common.Constants |
| | | { |
| | | /// <summary> |
| | | /// ä»»å¡å°å常é |
| | | /// </summary> |
| | | public static class TaskAddressConstants |
| | | { |
| | | /// <summary> |
| | | /// é»è®¤/ä¸è½¬å°å |
| | | /// </summary> |
| | | public const string DEFAULT_ADDRESS = "10080"; |
| | | |
| | | /// <summary> |
| | | /// 髿¸©1å·åºåºå°åå表ï¼è½®è¯¢ï¼ |
| | | /// </summary> |
| | | public static readonly string[] GW1_ADDRESSES = { "11001", "11010" }; |
| | | |
| | | /// <summary> |
| | | /// 髿¸©2å·åºåºå°å |
| | | /// </summary> |
| | | public const string GW2_ADDRESS = "CWSC1"; |
| | | |
| | | /// <summary> |
| | | /// 常温1å·åºåºå°å |
| | | /// </summary> |
| | | public const string CW1_ADDRESS = "22001"; |
| | | |
| | | /// <summary> |
| | | /// å容åºåºåºå°å |
| | | /// </summary> |
| | | public const string GRADING_OUTBOUND_ADDRESS = "10081"; |
| | | } |
| | | } |
| | |
| | | using SqlSugar; |
| | | using WIDESEA_Common.Constants; |
| | | using WIDESEA_Common.StockEnum; |
| | | using WIDESEA_Core; |
| | | using WIDESEA_DTO.MES; |
| | |
| | | var now = DateTime.Now; |
| | | var details = stock.Details.Select(item => new Dt_StockInfoDetail |
| | | { |
| | | MaterielCode = "çµè¯", |
| | | MaterielName = "çµè¯", |
| | | MaterielCode = StockConstants.MATERIAL_CODE, |
| | | MaterielName = StockConstants.MATERIAL_NAME, |
| | | StockQuantity = item.Quantity, |
| | | Unit = "PCS", |
| | | Creater = "system", |
| | | OrderNo = "111", |
| | | Unit = StockConstants.UNIT, |
| | | Creater = StockConstants.SYSTEM_USER, |
| | | OrderNo = StockConstants.DEFAULT_ORDER_NO, |
| | | ProductionDate = now.ToString(), |
| | | EffectiveDate = now.AddYears(1).ToString(), |
| | | SerialNumber = item.CellBarcode, |
| | |
| | | var bindRequest = new BindContainerRequest |
| | | { |
| | | ContainerCode = stock?.TargetPalletNo, |
| | | EquipmentCode = "STK-GROUP-001", |
| | | ResourceCode = "STK-GROUP-001", |
| | | EquipmentCode = StockConstants.MES_EQUIPMENT_CODE, |
| | | ResourceCode = StockConstants.MES_RESOURCE_CODE, |
| | | LocalTime = now, |
| | | OperationType = 0, // 0代表ç»ç |
| | | OperationType = StockConstants.MES_BIND_OPERATION_TYPE, |
| | | ContainerSfcList = details.Select(d => new ContainerSfcItem |
| | | { |
| | | Sfc = d.SerialNumber, |
| | |
| | | PalletCode = stock.TargetPalletNo, |
| | | WarehouseId = stock.Roadway == "注液ç»çæºæ¢°æ" ? (await _warehouseService.Db.Queryable<Dt_Warehouse>().FirstAsync(w => w.WarehouseCode == "GW1")).WarehouseId : 0, |
| | | StockStatus = StockStatusEmun.ç»çæå.GetHashCode(), |
| | | Creater = "system", |
| | | Creater = StockConstants.SYSTEM_USER, |
| | | Details = details |
| | | }; |
| | | result = StockInfoService.Repository.AddData(entity, x => x.Details); |
| | |
| | | PalletCode = stock.TargetPalletNo, |
| | | WarehouseId = sourceStock.WarehouseId, |
| | | StockStatus = StockStatusEmun.ç»çæå.GetHashCode(), |
| | | Creater = "system", |
| | | Creater = StockConstants.SYSTEM_USER, |
| | | }; |
| | | |
| | | var newId = StockInfoService.Repository.AddData(newStock); |
| | |
| | | // è°ç¨MESè§£ç»æºæççµè¯ |
| | | var unbindRequest = new UnBindContainerRequest |
| | | { |
| | | EquipmentCode = "STK-GROUP-001", |
| | | ResourceCode = "STK-GROUP-001", |
| | | EquipmentCode = StockConstants.MES_EQUIPMENT_CODE, |
| | | ResourceCode = StockConstants.MES_RESOURCE_CODE, |
| | | LocalTime = DateTime.Now, |
| | | ContainCode = stock.SourcePalletNo, |
| | | SfcList = detailEntities.Select(d => d.SerialNumber).ToList() |
| | |
| | | var bindRequest = new BindContainerRequest |
| | | { |
| | | ContainerCode = stock.TargetPalletNo, |
| | | EquipmentCode = "STK-GROUP-001", |
| | | ResourceCode = "STK-GROUP-001", |
| | | EquipmentCode = StockConstants.MES_EQUIPMENT_CODE, |
| | | ResourceCode = StockConstants.MES_RESOURCE_CODE, |
| | | LocalTime = DateTime.Now, |
| | | OperationType = 0, |
| | | OperationType = StockConstants.MES_BIND_OPERATION_TYPE, |
| | | ContainerSfcList = detailEntities.Select(d => new ContainerSfcItem |
| | | { |
| | | Sfc = d.SerialNumber, |
| | |
| | | // è°ç¨MESè§£ç»çµè¯ |
| | | var unbindRequest = new UnBindContainerRequest |
| | | { |
| | | EquipmentCode = "STK-GROUP-001", |
| | | ResourceCode = "STK-GROUP-001", |
| | | EquipmentCode = StockConstants.MES_EQUIPMENT_CODE, |
| | | ResourceCode = StockConstants.MES_RESOURCE_CODE, |
| | | LocalTime = DateTime.Now, |
| | | ContainCode = stock.SourcePalletNo, |
| | | SfcList = detailEntities.Select(d => d.SerialNumber).ToList() |
| | |
| | | using SqlSugar; |
| | | using System.DirectoryServices.Protocols; |
| | | using System.Text.Json; |
| | | using WIDESEA_Common.Constants; |
| | | using WIDESEA_Common.LocationEnum; |
| | | using WIDESEA_Common.StockEnum; |
| | | using WIDESEA_Common.TaskEnum; |
| | |
| | | private string DetermineTargetAddress(string roadway, Dictionary<string, List<string>> addressMap) |
| | | { |
| | | if (string.IsNullOrWhiteSpace(roadway)) |
| | | return "10080"; |
| | | return TaskAddressConstants.DEFAULT_ADDRESS; |
| | | |
| | | string? matchedPrefix = null; |
| | | foreach (var kvp in addressMap) |
| | |
| | | } |
| | | |
| | | if (matchedPrefix == null) |
| | | return "10080"; |
| | | return TaskAddressConstants.DEFAULT_ADDRESS; |
| | | |
| | | if (!addressMap.TryGetValue(matchedPrefix, out var addresses) || addresses == null || addresses.Count == 0) |
| | | return "10080"; |
| | | return TaskAddressConstants.DEFAULT_ADDRESS; |
| | | |
| | | if (addresses.Count == 1) |
| | | return addresses[0]; |
| | | |
| | | return _roundRobinService.GetNextAddress(matchedPrefix, addresses); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®åºå Remark ç¡®å®ç®æ å°åï¼GW_1â[11001,11010]轮询ï¼GW_2âCWSC1ï¼CW_1â22001ï¼ã |
| | | /// </summary> |
| | | private string DetermineTargetAddressByRemark(string remark, string roadway, Dictionary<string, List<string>> addressMap) |
| | | { |
| | | // æ ¹æ® Remark ç¡®å®ç®æ å°å |
| | | if (!string.IsNullOrWhiteSpace(remark)) |
| | | { |
| | | return remark switch |
| | | { |
| | | StockRemarkConstants.GW1 => _roundRobinService.GetNextAddress(StockRemarkConstants.GW1, TaskAddressConstants.GW1_ADDRESSES.ToList()), |
| | | StockRemarkConstants.GW2 => TaskAddressConstants.GW2_ADDRESS, |
| | | StockRemarkConstants.CW1 => TaskAddressConstants.CW1_ADDRESS, |
| | | _ => DetermineTargetAddress(roadway, addressMap) |
| | | }; |
| | | } |
| | | |
| | | // Remark 为空æ¶ï¼åéå°å··éé
ç½® |
| | | return DetermineTargetAddress(roadway, addressMap); |
| | | } |
| | | } |
| | | } |
| | |
| | | using SqlSugar; |
| | | using System.DirectoryServices.Protocols; |
| | | using System.Text.Json; |
| | | using WIDESEA_Common.Constants; |
| | | using WIDESEA_Common.LocationEnum; |
| | | using WIDESEA_Common.StockEnum; |
| | | using WIDESEA_Common.TaskEnum; |
| | |
| | | PalletType = stock.PalletType, |
| | | SourceAddress = stock.LocationCode, |
| | | CurrentAddress = stock.LocationCode, |
| | | NextAddress = "10080", |
| | | TargetAddress = "10081", |
| | | NextAddress = TaskAddressConstants.DEFAULT_ADDRESS, |
| | | TargetAddress = TaskAddressConstants.GRADING_OUTBOUND_ADDRESS, |
| | | Roadway = stock.LocationDetails.RoadwayNo, |
| | | TaskType = TaskTypeEnum.Outbound.GetHashCode(), |
| | | TaskStatus = TaskStatusEnum.New.GetHashCode(), |
| | |
| | | using SqlSugar; |
| | | using System.DirectoryServices.Protocols; |
| | | using System.Text.Json; |
| | | using WIDESEA_Common.Constants; |
| | | using WIDESEA_Common.LocationEnum; |
| | | using WIDESEA_Common.StockEnum; |
| | | using WIDESEA_Common.TaskEnum; |
| | |
| | | WebResponseContent content = new WebResponseContent(); |
| | | stockInfo.LocationCode = location.LocationCode; |
| | | stockInfo.LocationId = location.Id; |
| | | stockInfo.OutboundDate = task.Roadway switch |
| | | |
| | | var now = DateTime.Now; |
| | | if (task.Roadway.Contains("GW")) |
| | | { |
| | | var r when r.Contains("GW") => DateTime.Now.AddHours(2), |
| | | var r when r.Contains("CW") => DateTime.Now.AddHours(1), |
| | | _ => DateTime.Now |
| | | }; |
| | | if (stockInfo.Remark.IsNullOrEmpty()) |
| | | { |
| | | stockInfo.OutboundDate = now.AddHours(OutboundTimeConstants.OUTBOUND_HOURS_GW1_FIRST); |
| | | stockInfo.Remark = StockRemarkConstants.GW1; |
| | | } |
| | | else if (stockInfo.Remark == StockRemarkConstants.GW1) |
| | | { |
| | | stockInfo.OutboundDate = now.AddHours(OutboundTimeConstants.OUTBOUND_HOURS_GW1_SECOND); |
| | | stockInfo.Remark = StockRemarkConstants.GW2; |
| | | } |
| | | else |
| | | { |
| | | stockInfo.OutboundDate = now.AddHours(OutboundTimeConstants.OUTBOUND_HOURS_GW1_FIRST); |
| | | } |
| | | } |
| | | else if (task.Roadway.Contains("CW")) |
| | | { |
| | | if (stockInfo.Remark == StockRemarkConstants.GW2) |
| | | { |
| | | stockInfo.OutboundDate = now.AddHours(OutboundTimeConstants.OUTBOUND_HOURS_CW1); |
| | | stockInfo.Remark = StockRemarkConstants.CW1; |
| | | } |
| | | else |
| | | { |
| | | stockInfo.OutboundDate = now.AddHours(OutboundTimeConstants.OUTBOUND_HOURS_CW1); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | stockInfo.OutboundDate = now; |
| | | } |
| | | |
| | | stockInfo.StockStatus = StockStatusEmun.å
¥åºå®æ.GetHashCode(); |
| | | |
| | | location.LocationStatus = LocationStatusEnum.InStock.GetHashCode(); |
| | |
| | | if (!updateLocationResult || !updateStockResult) |
| | | return WebResponseContent.Instance.Error("ä»»å¡å®æå¤±è´¥"); |
| | | // è°ç¨MESæçè¿ç« |
| | | var inboundRequest = new InboundInContainerRequest |
| | | { |
| | | EquipmentCode = "STK-GROUP-001", |
| | | ResourceCode = "STK-GROUP-001", |
| | | LocalTime = DateTime.Now, |
| | | ContainerCode = taskDto.PalletCode |
| | | }; |
| | | var inboundResult = _mesService.InboundInContainer(inboundRequest); |
| | | if (inboundResult == null || inboundResult.Data == null || !inboundResult.Data.IsSuccess) |
| | | { |
| | | return content.Error($"ä»»å¡å®æå¤±è´¥ï¼MESè¿ç«å¤±è´¥: {inboundResult?.Data?.Msg ?? inboundResult?.ErrorMessage ?? "æªç¥é误"}"); |
| | | } |
| | | //var inboundRequest = new InboundInContainerRequest |
| | | //{ |
| | | // EquipmentCode = "STK-GROUP-001", |
| | | // ResourceCode = "STK-GROUP-001", |
| | | // LocalTime = DateTime.Now, |
| | | // ContainerCode = taskDto.PalletCode |
| | | //}; |
| | | //var inboundResult = _mesService.InboundInContainer(inboundRequest); |
| | | //if (inboundResult == null || inboundResult.Data == null || !inboundResult.Data.IsSuccess) |
| | | //{ |
| | | // return content.Error($"ä»»å¡å®æå¤±è´¥ï¼MESè¿ç«å¤±è´¥: {inboundResult?.Data?.Msg ?? inboundResult?.ErrorMessage ?? "æªç¥é误"}"); |
| | | //} |
| | | return await CompleteTaskAsync(task, "å
¥åºå®æ"); |
| | | }); |
| | | } |
| | |
| | | return WebResponseContent.Instance.Error("ä»»å¡å®æå¤±è´¥"); |
| | | |
| | | // è°ç¨MESæçåºç« |
| | | var outboundRequest = new OutboundInContainerRequest |
| | | { |
| | | EquipmentCode = "STK-GROUP-001", |
| | | ResourceCode = "STK-GROUP-001", |
| | | LocalTime = DateTime.Now, |
| | | ContainerCode = taskDto.PalletCode, |
| | | ParamList = new List<ParamItem>() |
| | | }; |
| | | var outboundResult = _mesService.OutboundInContainer(outboundRequest); |
| | | if (outboundResult == null || outboundResult.Data == null || !outboundResult.Data.IsSuccess) |
| | | { |
| | | return content.Error($"ä»»å¡å®æå¤±è´¥ï¼MESåºç«å¤±è´¥: {outboundResult?.Data?.Msg ?? outboundResult?.ErrorMessage ?? "æªç¥é误"}"); |
| | | } |
| | | //var outboundRequest = new OutboundInContainerRequest |
| | | //{ |
| | | // EquipmentCode = "STK-GROUP-001", |
| | | // ResourceCode = "STK-GROUP-001", |
| | | // LocalTime = DateTime.Now, |
| | | // ContainerCode = taskDto.PalletCode, |
| | | // ParamList = new List<ParamItem>() |
| | | //}; |
| | | //var outboundResult = _mesService.OutboundInContainer(outboundRequest); |
| | | //if (outboundResult == null || outboundResult.Data == null || !outboundResult.Data.IsSuccess) |
| | | //{ |
| | | // return content.Error($"ä»»å¡å®æå¤±è´¥ï¼MESåºç«å¤±è´¥: {outboundResult?.Data?.Msg ?? outboundResult?.ErrorMessage ?? "æªç¥é误"}"); |
| | | //} |
| | | |
| | | return await CompleteTaskAsync(task, "åºåºå®æ"); |
| | | }); |
| | |
| | | var taskList = new List<Dt_Task>(); |
| | | foreach (var stock in stocksToProcess) |
| | | { |
| | | // æ ¹æ®å··éç¡®å®ç®æ å°å |
| | | var targetAddress = DetermineTargetAddress( |
| | | // æ ¹æ®å··éç¡®å®ç®æ å°åï¼ä¼å
æ ¹æ® Remark ç¡®å®ï¼Remark ä¸ºç©ºåæ ¹æ®å··éé
ç½®ï¼ |
| | | var targetAddress = DetermineTargetAddressByRemark( |
| | | stock.Remark ?? "", |
| | | stock.LocationDetails?.RoadwayNo ?? "", |
| | | targetAddressMap); |
| | | |
| | |
| | | if (stockInfo.LocationId > 0 || !string.IsNullOrWhiteSpace(stockInfo.LocationCode)) |
| | | return WebResponseContent.Instance.Error($"æç[{stockPalletCode}]åºåå·²ç»å®è´§ä½ï¼ä¸è½åå»ºæºæ¢°æ{taskName}ä»»å¡"); |
| | | } |
| | | var section = App.Configuration.GetSection("RobotTaskAddressRules").GetSection(targetLineNo).GetChildren().Select(c => c.Value).ToArray(); |
| | | var section = App.Configuration.GetSection("RobotTaskAddressRules").GetSection(targetLineNo).GetChildren().Select(c => c.Value).ToArray(); |
| | | |
| | | var task = new Dt_Task |
| | | { |
| | |
| | | "DBSeedEnable": false, |
| | | "PDAVersion": "4", |
| | | "WebSocketPort": 9296, |
| | | "AutoOutboundTask": { |
| | | "Enable": false, /// æ¯å¦å¯ç¨èªå¨åºåºä»»å¡ |
| | | "AutoOutboundTask": { |
| | | "Enable": true, /// æ¯å¦å¯ç¨èªå¨åºåºä»»å¡ |
| | | "CheckIntervalSeconds": 300, /// æ£æ¥é´éï¼ç§ï¼ |
| | | "TargetAddresses": { /// æå··éåç¼é
ç½®ç®æ å°åï¼æ¯æå¤åºåºå£ï¼ |
| | | "GW": [ "11001", "11010", "11068" ], |