wanshenmean
6 天以前 5171d3f59b89389bf75293afd210cfa6de4ccff7
feat: 添加堆垛机相关常量类并重构代码使用常量

refactor: 使用常量替换代码中的魔法值

docs: 更新注释以引用新的常量类

fix: 修正堆垛机作业指令枚举的使用

style: 统一代码格式和命名规范
已添加8个文件
已修改10个文件
429 ■■■■ 文件已修改
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/Constants/DeviceAddressConst.cs 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/Constants/StackerCraneCommandTypeEnum.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/Constants/StackerCraneConst.cs 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/Constants/StackerCraneRoadwayConst.cs 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/Constants/StackerCraneWorkActionEnum.cs 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneCommandBuilder.cs 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneDBName.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/Constants/OutboundTimeConstants.cs 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/Constants/StockConstants.cs 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/Constants/TaskAddressConstants.cs 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_GradingMachine.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_WCS.cs 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/Constants/DeviceAddressConst.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
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 = "-";
    }
}
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/Constants/StackerCraneCommandTypeEnum.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
namespace WIDESEAWCS_Common.Constants
{
    /// <summary>
    /// å †åž›æœºå‘½ä»¤ç±»åž‹æžšä¸¾
    /// </summary>
    /// <remarks>
    /// æ ¹æ®å··é“类型的不同,堆垛机可能使用不同的命令格式。
    /// </remarks>
    public enum StackerCraneCommandTypeEnum
    {
        /// <summary>
        /// æ ‡å‡†å‘½ä»¤æ ¼å¼
        /// </summary>
        /// <remarks>
        /// ç”¨äºŽ GW、CW å¼€å¤´å··é“的堆垛机。
        /// </remarks>
        Standard,
        /// <summary>
        /// æˆåž‹å‘½ä»¤æ ¼å¼
        /// </summary>
        /// <remarks>
        /// ç”¨äºŽ HC å¼€å¤´å··é“的堆垛机。
        /// åŒ…含条码字段,用于电池追溯。
        /// </remarks>
        Formation
    }
}
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/Constants/StackerCraneConst.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
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;
    }
}
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/Constants/StackerCraneRoadwayConst.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
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 }
        };
    }
}
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/Constants/StackerCraneWorkActionEnum.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
namespace WIDESEAWCS_Common.Constants
{
    /// <summary>
    /// å †åž›æœºä½œä¸šæŒ‡ä»¤æžšä¸¾
    /// </summary>
    /// <remarks>
    /// æŽ§åˆ¶å †åž›æœºçš„动作指令,通过 PLC å¯„存器与堆垛机通信。
    /// </remarks>
    public enum StackerCraneWorkActionEnum
    {
        /// <summary>
        /// å¼€å§‹æ‰§è¡Œä»»åŠ¡
        /// </summary>
        StartTask = 1,
        /// <summary>
        /// ä»»åŠ¡å®Œæˆ/停止
        /// </summary>
        TaskComplete = 2,
        /// <summary>
        /// æ¶ˆé˜²ä»»åС开始
        /// </summary>
        FireAlarmStart = 3
    }
}
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs
@@ -24,6 +24,7 @@
using MapsterMapper;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
using Quartz;
using WIDESEAWCS_Common.Constants;
using WIDESEAWCS_Communicator;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Helper;
@@ -144,7 +145,7 @@
            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());
            }
@@ -201,7 +202,7 @@
            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());
            }
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs
@@ -211,7 +211,7 @@
                            {
                                // å¦‚æžœ WCS_ACK ä¸º 1,先清除(表示处理过上一次请求)
                                if (command.WCS_ACK == 1)
                                    conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, 0, childDeviceCode);
                                    conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)0, childDeviceCode);
                                continue;
                            }
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs
@@ -10,6 +10,7 @@
using WIDESEAWCS_QuartzJob.Service;
using WIDESEAWCS_QuartzJob.StackerCrane;
using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
using WIDESEAWCS_Common.Constants;
using WIDESEAWCS_Tasks.StackerCraneJob;
namespace WIDESEAWCS_Tasks
@@ -234,7 +235,7 @@
                if (sendFlag)
                {
                    Task.Delay(1000).Wait();
                    commonStackerCrane.SetValue(StackerCraneDBName.WorkAction, (short)1);
                    commonStackerCrane.SetValue(StackerCraneDBName.WorkAction, (short)StackerCraneWorkActionEnum.StartTask);
                    // å‘送成功,更新状态
                    commonStackerCrane.LastTaskType = task.TaskType;
                    _taskService.UpdateTaskStatusToNext(task.TaskNum);
@@ -282,8 +283,8 @@
                // æ›´æ–°ä»»åŠ¡çŠ¶æ€ä¸ºå®Œæˆ
                if (_taskService.StackCraneTaskCompleted(e.TaskNum).Status)
                {
                    // æ¸…除堆垛机的作业指令(设置为 2,表示空闲)
                    stackerCrane.SetValue(StackerCraneDBName.WorkAction, 2);
                    // æ¸…除堆垛机的作业指令(设置为空闲)
                    stackerCrane.SetValue(StackerCraneDBName.WorkAction, (short)StackerCraneWorkActionEnum.TaskComplete);
                }
            }
        }
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneCommandBuilder.cs
@@ -1,6 +1,7 @@
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;
@@ -128,8 +129,8 @@
            return new StackerCraneTaskCommand
            {
                TaskNum = task.TaskNum,   // ä»»åŠ¡å·
                WorkType = 1,             // ä½œä¸šç±»åž‹
                //WorkAction = 1            // ä½œä¸šæŒ‡ä»¤ï¼šå¼€å§‹æ‰§è¡Œ
                WorkType = StackerCraneConst.WorkTypeInbound,  // ä½œä¸šç±»åž‹ï¼šå…¥åº“
                //WorkAction = StackerCraneWorkActionEnum.StartTask  // ä½œä¸šæŒ‡ä»¤ï¼šå¼€å§‹æ‰§è¡Œ
            };
        }
@@ -148,10 +149,10 @@
            {
                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     // ä¿ç•™å­—段
            };
        }
@@ -202,11 +203,11 @@
            _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;
@@ -270,7 +271,7 @@
            int taskType = 0;
            if (task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty)
            {
                taskType = 100;
                taskType = StackerCraneConst.EmptyPalletTaskType;
            }
            else
                taskType = task.TaskType;
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneDBName.cs
@@ -92,7 +92,7 @@
        /// ä½œä¸šæŒ‡ä»¤
        /// </summary>
        /// <remarks>
        /// æŽ§åˆ¶å †åž›æœºçš„动作:
        /// æŽ§åˆ¶å †åž›æœºçš„动作。参见 <see cref="Constants.StackerCraneWorkActionEnum"/>:
        /// - 1: å¼€å§‹æ‰§è¡Œä»»åŠ¡
        /// - 2: ä»»åŠ¡å®Œæˆ/停止
        /// - 3: æ¶ˆé˜²ä»»åС开始
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
@@ -2,6 +2,7 @@
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;
@@ -288,7 +289,7 @@
            if (task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty)
            {
                // ç©ºæ‰˜ç›˜å‡ºåº“
                taskType = 100;
                taskType = StackerCraneConst.EmptyPalletTaskType;
            }
            else
                taskType = task.TaskType;
Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/Constants/OutboundTimeConstants.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
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;
    }
}
Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/Constants/StockConstants.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
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;
    }
}
Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/Constants/TaskAddressConstants.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
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";
    }
}
Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs
@@ -1,4 +1,5 @@
using SqlSugar;
using WIDESEA_Common.Constants;
using WIDESEA_Common.StockEnum;
using WIDESEA_Core;
using WIDESEA_DTO.MES;
@@ -123,12 +124,12 @@
                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,
@@ -139,10 +140,10 @@
                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,
@@ -166,7 +167,7 @@
                        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);
@@ -215,7 +216,7 @@
                            PalletCode = stock.TargetPalletNo,
                            WarehouseId = sourceStock.WarehouseId,
                            StockStatus = StockStatusEmun.组盘暂存.GetHashCode(),
                            Creater = "system",
                            Creater = StockConstants.SYSTEM_USER,
                        };
                        var newId = StockInfoService.Repository.AddData(newStock);
@@ -241,8 +242,8 @@
                    // è°ƒç”¨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()
@@ -261,10 +262,10 @@
                    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,
@@ -324,8 +325,8 @@
                    // è°ƒç”¨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()
Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -4,6 +4,7 @@
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;
@@ -146,7 +147,7 @@
        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)
@@ -159,10 +160,10 @@
            }
            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];
@@ -180,9 +181,9 @@
            {
                return remark switch
                {
                    "GW_1" => _roundRobinService.GetNextAddress("GW_1", new List<string> { "11001", "11010" }),
                    "GW_2" => "CWSC1",
                    "CW_1" => "22001",
                    StockRemarkConstants.GW1 => _roundRobinService.GetNextAddress(StockRemarkConstants.GW1, TaskAddressConstants.GW1_ADDRESSES.ToList()),
                    StockRemarkConstants.GW2 => TaskAddressConstants.GW2_ADDRESS,
                    StockRemarkConstants.CW1 => TaskAddressConstants.CW1_ADDRESS,
                    _ => DetermineTargetAddress(roadway, addressMap)
                };
            }
Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_GradingMachine.cs
@@ -4,6 +4,7 @@
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;
@@ -137,8 +138,8 @@
                        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(),
Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_WCS.cs
@@ -4,6 +4,7 @@
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;
@@ -199,29 +200,29 @@
                    {
                        if (stockInfo.Remark.IsNullOrEmpty())
                        {
                            stockInfo.OutboundDate = now.AddHours(16);
                            stockInfo.Remark = "GW_1";
                            stockInfo.OutboundDate = now.AddHours(OutboundTimeConstants.OUTBOUND_HOURS_GW1_FIRST);
                            stockInfo.Remark = StockRemarkConstants.GW1;
                        }
                        else if (stockInfo.Remark == "GW_1")
                        else if (stockInfo.Remark == StockRemarkConstants.GW1)
                        {
                            stockInfo.OutboundDate = now.AddHours(24);
                            stockInfo.Remark = "GW_2";
                            stockInfo.OutboundDate = now.AddHours(OutboundTimeConstants.OUTBOUND_HOURS_GW1_SECOND);
                            stockInfo.Remark = StockRemarkConstants.GW2;
                        }
                        else
                        {
                            stockInfo.OutboundDate = now.AddHours(16);
                            stockInfo.OutboundDate = now.AddHours(OutboundTimeConstants.OUTBOUND_HOURS_GW1_FIRST);
                        }
                    }
                    else if (task.Roadway.Contains("CW"))
                    {
                        if (stockInfo.Remark == "GW_2")
                        if (stockInfo.Remark == StockRemarkConstants.GW2)
                        {
                            stockInfo.OutboundDate = now.AddHours(12);
                            stockInfo.Remark = "CW_1";
                            stockInfo.OutboundDate = now.AddHours(OutboundTimeConstants.OUTBOUND_HOURS_CW1);
                            stockInfo.Remark = StockRemarkConstants.CW1;
                        }
                        else
                        {
                            stockInfo.OutboundDate = now.AddHours(12);
                            stockInfo.OutboundDate = now.AddHours(OutboundTimeConstants.OUTBOUND_HOURS_CW1);
                        }
                    }
                    else