wangxinhui
2025-11-30 f2b85c65234e0dcdd3fcce4dafbe16933b7f1b48
出入库流程代码更新
已添加8个文件
已重命名2个文件
已删除1个文件
已修改34个文件
2196 ■■■■ 文件已修改
项目代码/WCSServices/WIDESEAWCS_BasicInfoRepository/LocationInfoRepository.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_BasicInfoService/LocationInfoService.cs 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Common/APIEnum/APIEnum.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Common/StationOccupiedEnum.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Common/StationTypeEnum.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Common/TaskEnum/SequenceEnum.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Common/TaskEnum/TaskStatusEnum.cs 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Common/WareHouseEnum/WarehouseEnum.cs 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_DTO/Agv/AgvResponseContent.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_DTO/Agv/AgvTaskFlowDTO.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_DTO/Agv/AgvTaskSendDTO.cs 117 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_DTO/Agv/AgvUpdateDTO.cs 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_DTO/BasicInfo/InitializationLocationDTO.cs 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_DTO/RequestAGVArriveDTO.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_DTO/TaskInfo/ContainerDTO.cs 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_DTO/TaskInfo/WMSTaskDTO.cs 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_DTO/WIDESEAWCS_DTO.csproj 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_DTO/WMSResponseContent.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_IBasicInfoRepository/ILocationInfoRepository.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_IBasicInfoService/ILocationInfoService.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_ITaskInfoRepository/ITaskRepository.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs 72 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Model/Models/BasicInfo/Dt_LocationInfo.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Model/Models/BasicInfo/Dt_StationManger.cs 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Model/Models/BasicInfo/Dt_Warehouse.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs 84 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Server/Controllers/BasicInfo/LocationInfoController.cs 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Server/Controllers/Task/TaskController.cs 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Server/Filter/CustomProfile.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_TaskInfoRepository/TaskRepository.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs 456 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_TaskInfoService/TaskService_Operate.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Tasks/AGV/AGVExtend.cs 258 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Tasks/AGV/AGVJob.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Tasks/二期线体/ConveyorLineDBName.cs 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Tasks/二期线体/ConveyorLineJob2.cs 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Tasks/码垛/MDJob_CP.cs 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/AGV通信文档/WMS输送线对接协议251126.xls 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/AGV通信文档/点位信息.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/AGV通信文档/输送拣选和站台编号.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/一期对接相关资料/哈尔滨一期输送线对接协议modbusTcp协议V1.1.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
项目资料/接口汇总文件/WMS接口对接文档_V1.1.3.docx 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_BasicInfoRepository/LocationInfoRepository.cs
@@ -57,5 +57,14 @@
        {
            return QueryData(x => x.LocationCode, x => x.WarehouseId == warehouseId && x.LocationStatus == LocationStatusEnum.InStock.ObjToInt() && x.EnableStatus == EnableStatusEnum.Normal.ObjToInt()).Distinct().ToList();
        }
        /// <summary>
        /// èŽ·å–æ–™ç®±å¯¹åº”å‡ºåº“è´§ä½
        /// </summary>
        /// <returns></returns>
        public List<Dt_LocationInfo> GetCanOut(List<string> strings)
        {
            return QueryData(x => strings.Contains(x.PalletCode)).ToList();
        }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_BasicInfoService/LocationInfoService.cs
@@ -9,18 +9,26 @@
using System.Threading.Tasks;
using WIDESEA_Core;
using WIDESEA_Core.Enums;
using WIDESEA_DTO.Basic;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.WareHouseEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_Core.Utilities;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_IBasicInfoService;
using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_BasicInfoService
{
    public class LocationCache
    {
        public string LocationCode { get; set; }
        public DateTime DateTime { get; set; }
    }
    public partial class LocationInfoService : ServiceBase<Dt_LocationInfo, ILocationInfoRepository>, ILocationInfoService
    {
        private readonly IUnitOfWorkManage _unitOfWorkManage;
@@ -84,13 +92,101 @@
        {
            return LocationDisableStatus(new int[] { key });
        }
        private readonly static object _locker = new object();
        private static List<LocationCache> locationCaches = new List<LocationCache>();
        /// <summary>
        /// åˆ†é…è´§ä½
        /// </summary>
        public Dt_LocationInfo? AssignLocation(string roadwayNo, int palletType, int warehouseId)
        public Dt_LocationInfo? AssignLocation()
        {
            return new Dt_LocationInfo();
            lock (_locker)
            {
                List<LocationCache> removeItems = locationCaches.Where(x => (DateTime.Now - x.DateTime).TotalMinutes > 5).ToList();//查询添加静态变量超过5分钟的货位
                int count = removeItems.Count;
                for (int i = 0; i < count; i++)
                {
                    locationCaches.Remove(removeItems[i]);//移除查询添加静态变量超过5分钟的货位
                }
                List<string> lockLocations = locationCaches.Select(x => x.LocationCode).ToList();
                Dictionary<string, OrderByType> orderBy = new Dictionary<string, OrderByType>()
                {
                    { nameof(Dt_LocationInfo.Row),OrderByType.Asc },
                    { nameof(Dt_LocationInfo.Layer),OrderByType.Asc },
                    { nameof(Dt_LocationInfo.Columns),OrderByType.Desc },
                };
                Dt_LocationInfo locationInfo = BaseDal.QueryFirst(x => x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus != EnableStatusEnum.Disable.ObjToInt() && !lockLocations.Contains(x.LocationCode), orderBy);//查询空货位信息并排除5分钟内分配的货位,根据层、列、深度、行排序
                if (locationInfo!=null)
                {
                    LocationCache locationCache = new LocationCache()
                    {
                        LocationCode = locationInfo.LocationCode,
                        DateTime = DateTime.Now,
                    };
                    locationCaches.Add(locationCache);
                }
                return locationInfo;
            }
        }
        /// <summary>
        /// åˆå§‹åŒ–货位
        /// </summary>
        /// <param name="initializationLocationDTO"></param>
        /// <returns></returns>
        public WebResponseContent InitializationLocation(InitializationLocationDTO initializationLocationDTO)
        {
            try
            {
                List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
                for (int i = 0; i < initializationLocationDTO.MaxRow; i++)
                {
                    for (int j = 0; j < initializationLocationDTO.MaxColumn; j++)
                    {
                        for (int k = 0; k < initializationLocationDTO.MaxLayer; k++)
                        {
                            Dt_LocationInfo locationInfo = new Dt_LocationInfo()
                            {
                                WarehouseId = 0,
                                Columns = j + 1,
                                EnableStatus = EnableStatusEnum.Normal.ObjToInt(),
                                Layer = k + 1,
                                LocationStatus = LocationStatusEnum.Free.ObjToInt(),
                                RoadwayNo = $"{initializationLocationDTO.Roadway}",
                                Row = i + 1,
                            };
                            locationInfo.LocationCode = $"{locationInfo.RoadwayNo}-{locationInfo.Row.ToString().PadLeft(3, '0')}-{locationInfo.Columns.ToString().PadLeft(3, '0')}-{locationInfo.Layer.ToString().PadLeft(3, '0')}";
                            locationInfo.LocationName = $"{locationInfo.RoadwayNo}巷道{locationInfo.Row.ToString().PadLeft(3, '0')}行{locationInfo.Columns.ToString().PadLeft(3, '0')}列{locationInfo.Layer.ToString().PadLeft(3, '0')}层";
                            int point = 0;
                            if (locationInfo.Row%2==0)
                            {
                                point = locationInfo.Row / 2;
                            }
                            else
                            {
                                if (locationInfo.Row==1)
                                {
                                    point = 1;
                                }
                                else
                                {
                                    point = (locationInfo.Row / 2)+1;
                                }
                            }
                            locationInfo.AgvPoint = $"{point.ToString().PadLeft(2, '0')}-{locationInfo.Columns.ToString().PadLeft(2, '0')}";
                            locationInfos.Add(locationInfo);
                        }
                    }
                }
                BaseDal.AddData(locationInfos);
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Common/APIEnum/APIEnum.cs
@@ -14,5 +14,20 @@
        /// </summary>
        [Description("AGV发送任务接口")]
        AgvSendTask,
        /// <summary>
        /// AGV任务放行接口
        /// </summary>
        [Description("AGV任务放行接口")]
        AgvTaskFlow,
        /// <summary>
        /// WMS入库反馈完成
        /// </summary>
        [Description("WMS入库反馈完成")]
        WMSInBoundBack,
        /// <summary>
        /// WMS料箱到达拣选位上报
        /// </summary>
        [Description("WMS料箱到达拣选位上报")]
        WMSPickArrivedUp,
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Common/StationOccupiedEnum.cs
@@ -8,7 +8,6 @@
{
    public enum StationOccupiedEnum
    {
        None,
        Sure
    }
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Common/StationTypeEnum.cs
@@ -25,15 +25,5 @@
        /// å‡ºå…¥åº“站台
        /// </summary>
        StationType_InboundAndOutbound = 3,
        /// <summary>
        /// å‡ºå…¥åº“口
        /// </summary>
        StationType_InStartAndOutEnd = 33,
        /// <summary>
        /// å ç›˜å«æ–™ç«™å°
        /// </summary>
        StationType_StackingPlates = 91,
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Common/TaskEnum/SequenceEnum.cs
ÎļþÃû´Ó ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_DTO/StackerCarneTaskDTO.cs ÐÞ¸Ä
@@ -4,10 +4,10 @@
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_DTO
namespace WIDESEAWCS_Common.TaskEnum
{
    public class StackerCarneTaskDTO
    public enum SequenceEnum
    {
        SeqTaskNum
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Common/TaskEnum/TaskStatusEnum.cs
@@ -19,6 +19,12 @@
        New = 100,
        /// <summary>
        /// è¾“送线执行中
        /// </summary>
        [Description("输送线执行中")]
        CL_Executing = 210,
        /// <summary>
        /// AGV待执行
        /// </summary>
        [Description("AGV待执行")]
@@ -35,12 +41,6 @@
        /// </summary>
        [Description("AGV取货完成")]
        AGV_TakeFinish = 320,
        /// <summary>
        /// AGV完成
        /// </summary>
        [Description("AGV完成")]
        AGV_Finish = 330,
        /// <summary>
        /// ä»»åŠ¡å®Œæˆ
@@ -65,6 +65,48 @@
        /// </summary>
        [Description("任务异常")]
        Exception = 990,
    }
    /// <summary>
    ///作业当前状态<br/>
    ///开始移动:MOVE_BEGIN<br/>
    ///料 ç®± å– æ–™ å®Œ æˆ:PICKER_RECEIVE<br/>
    ///料 ç®± ä¸‹ æ–™ å®Œ æˆ:PICKER_SEND<br/>
    ///等待放行:WAITFEEDBACK<br/>
    ///任务完成:COMPLETED<br/>
    ///任务取消完成:CANCELED<br/>
    ///告警:WARNING<br/>
    /// </summary>
    public enum AGVStatusEnum
    {
        /// <summary>
        /// å¼€å§‹ç§»åЍ
        /// </summary>
        [Description("开始移动")]
        MOVE_BEGIN,
        /// <summary>
        /// æ–™ ç®± å– æ–™ å®Œ æˆ
        /// </summary>
        [Description("料 ç®± å– æ–™ å®Œ æˆ")]
        PICKER_RECEIVE,
        /// <summary>
        /// æ–™ ç®± ä¸‹ æ–™ å®Œ æˆ
        /// </summary>
        [Description("料 ç®± ä¸‹ æ–™ å®Œ æˆ")]
        PICKER_SEND,
        /// <summary>
        /// ä»»åŠ¡å®Œæˆ
        /// </summary>
        [Description("任务完成")]
        COMPLETED,
        /// <summary>
        /// ä»»åŠ¡å–æ¶ˆå®Œæˆ
        /// </summary>
        [Description("任务取消完成")]
        CANCELED,
        /// <summary>
        /// å‘Šè­¦
        /// </summary>
        [Description("告警")]
        WARNING,
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Common/TaskEnum/TaskTypeEnum.cs
@@ -10,161 +10,22 @@
    public enum TaskTypeEnum
    {
        /// <summary>
        /// é¢†æ–™å‡ºåº“
        /// å‡ºåº“
        /// </summary>
        [Description("领料出库")]
        [Description("出库")]
        Outbound = 100,
        /// <summary>
        /// ç›˜ç‚¹å‡ºåº“
        /// å…¥åº“
        /// </summary>
        [Description("盘点出库")]
        OutInventory = 110,
        [Description("入库")]
        Inbound = 500,
        /// <summary>
        /// åˆ†æ‹£å‡ºåº“
        /// </summary>
        [Description("分拣出库")]
        OutPick = 120,
        /// <summary>
        /// æˆå“ç©ºæ‰˜å‡ºåº“
        /// </summary>
        [Description("成品空托出库")]
        OutEmpty = 130,
        /// <summary>
        /// æˆå“å‡ºåº“
        /// </summary>
        [Description("成品出库")]
        OutProduct = 230,
        /// <summary>
        /// åŽŸæ–™è€åŽ‚å‡ºåº“
        /// </summary>
        [Description("原料老厂出库")]
        OldYLOutbound = 300,
        /// <summary>
        /// åŽŸæ–™å°åˆ·å‡ºåº“
        /// </summary>
        [Description("原料印刷出库")]
        PrintYLOutbound = 310,
        /// <summary>
        /// åŽŸæ–™çº¸è¢‹åˆ¶è¢‹ä¾›æ–™
        /// </summary>
        [Description("原料纸袋制袋供料")]
        PaperYLOutZDGL = 330,
        /// <summary>
        /// è¾…料无纺布出库
        /// </summary>
        [Description("辅料无纺布出库")]
        OutWFB = 350,
        /// <summary>
        /// äºŒæ¥¼çº¸ç®±ä¾›æ–™
        /// </summary>
        [Description("二楼纸箱供料")]
        OutCarton = 360,
        /// <summary>
        /// æ— çººå¸ƒæ·‹è†œå‡ºåº“
        /// </summary>
        [Description("无纺布淋膜出库")]
        OutWFBLM = 370,
        /// <summary>
        /// çº¸å¼ æ·‹è†œå‡ºåº“
        /// </summary>
        [Description("纸张淋膜出库")]
        OutPaperLM = 380,
        /// <summary>
        /// å†²åˆ‡åŒºå‡ºåº“
        /// </summary>
        [Description("冲切区出库")]
        OutChongQie = 390,
        /// <summary>
        /// æ¨¡åˆ‡åŒºå‡ºåº“
        /// </summary>
        [Description("模切区出库")]
        OutMoQie = 400,
        /// <summary>
        /// åˆ†åˆ‡åŒºå‡ºåº“
        /// </summary>
        [Description("分切区出库")]
        OutFenQie = 410,
        /// <summary>
        /// æ— çººå¸ƒåˆ¶è¢‹ä¾›æ–™
        /// </summary>
        [Description("无纺袋制袋供料")]
        OutWFBGL = 420,
        /// <summary>
        /// é‡‡è´­å…¥åº“
        /// </summary>
        [Description("采购入库")]
        Inbound = 510,
        /// <summary>
        /// ç›˜ç‚¹å…¥åº“
        /// </summary>
        [Description("盘点入库")]
        InInventory = 520,
        /// <summary>
        /// åˆ†æ‹£å…¥åº“
        /// </summary>
        [Description("分拣入库")]
        InPick = 530,
        /// <summary>
        /// æˆå“å…¥åº“
        /// </summary>
        [Description("成品入库")]
        InProduct = 610,
        /// <summary>
        /// æˆå“ç©ºæ‰˜å›žåº“
        /// </summary>
        [Description("成品空托回库")]
        EmptyProductBack = 630,
        /// <summary>
        /// åŽŸæ–™å°åˆ·åŠæˆå“å…¥åº“
        /// </summary>
        [Description("原料印刷半成品入库")]
        PrintYLInbound = 710,
        /// <summary>
        /// åŽŸæ–™å°åˆ·ä½™æ–™é€€åº“
        /// </summary>
        [Description("原料印刷余料退库")]
        PrintYLBackInbound = 720,
        /// <summary>
        /// åŽŸæ–™å°åˆ·ä½™æ–™é€€åº“
        /// </summary>
        [Description("原料纸袋余料退库")]
        PaperYLBackInbound = 730,
        /// <summary>
        /// åŽŸæ–™è€åŽ‚é€€åº“
        /// </summary>
        [Description("原料老厂退库")]
        PaperOldYLBackInbound = 740,
        /// <summary>
        /// å··é“内移库
        /// </summary>
        [Description("巷道内移库")]
        Relocation = 900
        ///// <summary>
        ///// å··é“内移库
        ///// </summary>
        //[Description("巷道内移库")]
        //Relocation = 900
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Common/WareHouseEnum/WarehouseEnum.cs
@@ -9,68 +9,8 @@
{
    /// <summary>
    /// ä»“库
    /// HA57 = æ·®å®‰äºŒåŽ‚ - æ¿æ–™ä»“<br/>
    /// HA58 = æ·®å®‰äºŒåŽ‚ - PP仓<br/>
    /// HA60 = æ·®å®‰äºŒåŽ‚ - è¾…料仓<br/>
    /// HA64 = æ·®å®‰äºŒåŽ‚ - æµ‹è¯•架仓<br/>
    /// HA71 = æ·®å®‰äºŒåŽ‚ - æˆå“ä»“<br/>
    /// HA72 = æ·®å®‰äºŒåŽ‚ - å°¾æ•°ä»“<br/>
    /// HA73 = æ·®å®‰äºŒåŽ‚ - ç ”发仓<br/>
    /// HA101 = æ·®å®‰äºŒåŽ‚ - æˆå“ä»“平库<br/>
    /// HA152 = æ·®å®‰äºŒåŽ‚ - å¹²è†œä»“<br/>
    /// HA153 = æ·®å®‰äºŒåŽ‚ - æ²¹å¢¨ä»“<br/>
    /// </summary>
    public enum WarehouseEnum
    {
        /// <summary>
        /// æ¿æ–™ä»“
        /// </summary>
        [Description("板料仓")]
        HA57,
        /// <summary>
        /// PP仓
        /// </summary>
        [Description("PP仓")]
        HA58,
        /// <summary>
        /// è¾…料仓
        /// </summary>
        [Description("辅料仓")]
        HA60,
        /// <summary>
        /// æµ‹è¯•架仓
        /// </summary>
        [Description("测试架仓")]
        HA64,
        /// <summary>
        /// æˆå“ä»“
        /// </summary>
        [Description("成品仓")]
        HA71,
        /// <summary>
        /// å°¾æ•°ä»“
        /// </summary>
        [Description("尾数仓")]
        HA72,
        /// <summary>
        /// ç ”发仓
        /// </summary>
        [Description("研发仓")]
        HA73,
        /// <summary>
        /// æˆå“ä»“平库
        /// </summary>
        [Description("成品仓平库")]
        HA101,
        /// <summary>
        /// å¹²è†œä»“
        /// </summary>
        [Description("干膜仓")]
        HA152,
        /// <summary>
        /// æ²¹å¢¨ä»“
        /// </summary>
        [Description("油墨仓")]
        HA153
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_DTO/Agv/AgvResponseContent.cs
@@ -6,23 +6,26 @@
namespace WIDESEA_DTO.Agv
{
    /// <summary>
    /// AGV返回参数
    /// </summary>
    public class AgvResponseContent
    {
        /// <summary>
        /// è¿”回码
        ///
        /// </summary>
        public object Data { get; set; }
        /// <summary>
        /// è¿”回代码
        /// </summary>
        public string Code { get; set; }
        /// <summary>
        /// è¿”回消息
        /// è¿”回信息
        /// </summary>
        public string Message { get; set; }
        /// <summary>
        /// è¯·æ±‚编号
        /// è¿”回结果
        /// </summary>
        public string ReqCode { get; set; }
        /// <summary>
        /// è‡ªå®šä¹‰è¿”回(返回任务单号)
        /// </summary>
        public string Data { get; set; }
        public bool Success { get; set; }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_DTO/Agv/AgvTaskFlowDTO.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_DTO.Agv
{
    public class AgvTaskFlowDTO
    {
        /// <summary>
        /// è¯·æ±‚ID
        /// </summary>
        public string RequestId { get; set; }
        /// <summary>
        /// æ‰§è¡Œä»»åŠ¡çš„æ–™ç®±å·
        /// </summary>
        public string ContainerCode { get; set; }
        /// <summary>
        /// å½“前执行任务号
        /// </summary>
        public string MissionCode { get; set; }
        /// <summary>
        /// å½“前执行作业的节点
        /// </summary>
        public string Position { get; set; }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_DTO/Agv/AgvTaskSendDTO.cs
@@ -6,44 +6,121 @@
namespace WIDESEAWCS_DTO.Agv
{
    public class MissionDataItem
    {
        /// <summary>
        /// æ¬è¿æ–™ç®±åºå·ä»Ž1开始
        /// </summary>
        public int Sequence { get; set; } = 1;
        /// <summary>
        /// æ–™ç®±å·
        /// </summary>
        public string BinCode { get; set; }
        /// <summary>
        /// æ–™ç®±æ‰€åœ¨çš„起始点位
        /// </summary>
        public string StartPosition { get; set; }
        /// <summary>
        /// æ–™ç®±æ‰€åœ¨çš„起始槽位
        /// </summary>
        public string StartSlotCode { get; set; }
        /// <summary>
        /// å–料箱时之前是否需要确认
        /// </summary>
        public bool TakeActionConfirm { get; set; }
        /// <summary>
        /// å–料箱后是否需要通知
        /// </summary>
        public bool TakeActionInform { get; set; }
        /// <summary>
        /// æ–™ç®±æ‰€åœ¨çš„目标点位
        /// </summary>
        public string EndPosition { get; set; }
        /// <summary>
        /// æ–™ç®±æ‰€åœ¨çš„目标槽位
        /// </summary>
        public string EndSlotCode { get; set; }
        /// <summary>
        /// æ”¾æ–™ç®±æ—¶ä¹‹å‰æ˜¯å¦éœ€è¦ç¡®è®¤
        /// </summary>
        public bool PutActionConfirm { get; set; }
        /// <summary>
        /// æ”¾æ–™ç®±åŽæ˜¯å¦éœ€è¦é€šçŸ¥
        /// </summary>
        public bool PutActionInform { get; set; }
    }
    /// <summary>
    /// AGV任务发送
    /// </summary>
    public class AgvTaskSendDTO
    {
        /// <summary>
        /// å¤–接系统标识
        /// åº“存组织ID
        /// </summary>
        public string SysToken { get; set; }
        public string OrgId { get; set; } = "HF";
        /// <summary>
        /// ä»»åŠ¡æ¨¡ç‰ˆ
        /// è¯·æ±‚ id
        /// </summary>
        public string TaskCode { get; set; } = "DUIGAO1";
        public string RequestId { get; set; }
        /// <summary>
        /// æŽ¥æ”¶ä»»åŠ¡
        /// ä»»åŠ¡ç¼–ç 
        /// </summary>
        public string ReceiveTaskID { get; set; }
        public string MissionCode { get; set; }
        /// <summary>
        /// â»‹è¾†ç¼–码
        /// ä»»åŠ¡ç±»åž‹ï¼šPICKER_MOVE
        /// </summary>
        public string AgvCode { get; set; }
        public string MissionType { get; set; } = "PICKER_MOVE";
        /// <summary>
        /// åœ°å›¾ç¼–码
        /// ä»»åŠ¡çœ‹æ¿å±•ç¤ºä»»åŠ¡ç±»åž‹
        /// </summary>
        public string MapCode { get; set; } = "01";
        public string ViewBoardType { get; set; }
        /// <summary>
        /// è½¦è¾†é›†ç¾¤
        /// æœºå™¨äººå…·ä½“型号
        /// </summary>
        public string AgvGroupCode { get; set; }
        public List<string> RobotModels { get; set; }
        /// <summary>
        /// ä»»åŠ¡ä¼˜å…ˆ
        /// æœºå™¨äººç¼–号
        /// </summary>
        public List<string> RobotIds { get; set; }
        /// <summary>
        /// æœºå™¨äººåŠŸèƒ½ç±»åž‹PICKER
        /// </summary>
        public string RobotType { get; set; } = "PICKER";
        /// <summary>
        /// ä½œä¸šä¼˜å…ˆçº§
        /// </summary>
        public int Priority { get; set; }
        /// <summary>
        /// ç«™ç‚¹å‚æ•°
        /// å®¹å™¨æ¨¡åž‹ç¼–码
        /// </summary>
        public List<PointDetail> Variables { get; set; }
    }
    public class PointDetail
    {
        public string Code { get; set; }
        public string? Value { get; set; }
        public string ContainerModelCode { get; set; }
        /// <summary>
        /// å®¹å™¨ç¼–号
        /// </summary>
        public string ContainerCode { get; set; }
        /// <summary>
        /// ä½œä¸šæµç¨‹æ¨¡æ¿ç¼–号
        /// </summary>
        public string TemplateCode { get; set; }
        /// <summary>
        ///
        /// </summary>
        public bool LockRobotAfterFinish { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string UnlockRobotId { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string UnlockMissionCode { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string IdleNode { get; set; }
        /// <summary>
        ///
        /// </summary>
        public List<MissionDataItem> MissionData { get; set; }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_DTO/Agv/AgvUpdateDTO.cs
@@ -9,22 +9,43 @@
    public class AgvUpdateDTO
    {
        /// <summary>
        /// ä»»åŠ¡å•å·
        /// ä»»åŠ¡ç¼–å·
        /// </summary>
        public string ReceiveTaskID { get; set; }
        public string MissionCode { get; set; }
        /// <summary>
        /// è°ƒåº¦ç³»ç»Ÿå•号
        /// ä½œä¸šç±»åž‹
        /// </summary>
        public string MakeTaskID { get; set; }
        public string ViewBoardType { get; set; }
        /// <summary>
        /// ä»»åŠ¡çŠ¶æ€
        /// å½“前所在槽位
        /// </summary>
        public string TaskState { get; set; }
        public string SlotCode { get; set; }
        /// <summary>
        /// å–放货完成状态<br/>
        /// 1取货完成<br/>
        /// 2放货完成<br/>
        /// æ‰§è¡Œå½“前任务的机器人 id
        /// </summary>
        public string GoodsState { get; set; }
        public string RobotId { get; set; }
        /// <summary>
        /// å®¹å™¨ç¼–号
        /// </summary>
        public string ContainerCode { get; set; }
        /// <summary>
        /// å®¹å™¨å½“前位置
        /// </summary>
        public string CurrentPosition { get; set; }
        /// <summary>
        ///作业当前状态<br/>
        ///开始移动:MOVE_BEGIN<br/>
        ///料 ç®± å– æ–™ å®Œ æˆ:PICKER_RECEIVE<br/>
        ///料 ç®± ä¸‹ æ–™ å®Œ æˆ:PICKER_SEND<br/>
        ///等待放行:WAITFEEDBACK<br/>
        ///任务完成:COMPLETED<br/>
        ///任务取消完成:CANCELED<br/>
        ///告警:WARNING<br/>
        /// </summary>
        public string MissionStatus { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string Message { get; set; }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_DTO/BasicInfo/InitializationLocationDTO.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_DTO.Basic
{
    public class InitializationLocationDTO
    {
        /// <summary>
        /// å··é“号
        /// </summary>
        public string Roadway { get; set; }
        /// <summary>
        /// è¡Œ
        /// </summary>
        public int MaxRow { get; set; }
        /// <summary>
        /// åˆ—
        /// </summary>
        public int MaxColumn { get; set; }
        /// <summary>
        /// å±‚
        /// </summary>
        public int MaxLayer { get; set; }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_DTO/RequestAGVArriveDTO.cs
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_DTO/TaskInfo/ContainerDTO.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_DTO.TaskInfo
{
    /// <summary>
    /// æ–™ç®±åˆ°è¾¾
    /// </summary>
    public class ContainerArriveDTO
    {
        /// <summary>
        /// æ‹£é€‰å·¥ä½ç¼–号
        /// </summary>
        public string SlotCode { get; set; }
        /// <summary>
        /// æ–™ç®±å·
        /// </summary>
        public string ContainerCode { get; set; }
    }
    /// <summary>
    /// æ–™ç®±æµåЍ
    /// </summary>
    public class ContainerFlowDTO
    {
        /// <summary>
        /// æ‹£é€‰å·¥ä½ç¼–号
        /// </summary>
        public string SlotCode { get; set; }
        /// <summary>
        /// æ–™ç®±å·
        /// </summary>
        public string ContainerCode { get; set; }
        /// <summary>
        /// æµåŠ¨åŽ»å‘<br/>
        /// 100库内<br/>
        /// 200取出<br/>
        /// </summary>
        public string Direction { get; set; }
    }
    /// <summary>
    /// æ–™ç®±å…¥åº“完成上报
    /// </summary>
    public class ContainerInFinishDTO
    {
        /// <summary>
        /// ä»»åŠ¡å·
        /// </summary>
        public string TaskCode { get; set; }
        /// <summary>
        /// æ–™ç®±å·
        /// </summary>
        public string ContainerCode { get; set; }
        /// <summary>
        /// èµ·å§‹ç«™å°
        /// </summary>
        public string FromStationCode { get; set; }
        /// <summary>
        /// ç›®æ ‡è´§ä½
        /// </summary>
        public string ToLocationCode { get; set; }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_DTO/TaskInfo/WMSTaskDTO.cs
@@ -6,80 +6,62 @@
namespace WIDESEAWCS_DTO.TaskInfo
{
    public class WMSTaskDTO
    {
        /// <summary>
        /// WMS任务主键
    /// ä»»åŠ¡æ˜Žç»†
        /// </summary>
        public int Id { get; set; }
    public class TasksItem
    {
        /// <summary>
        /// ä»»åŠ¡å·
        /// </summary>
        public int TaskNum { get; set; }
        public string TaskCode { get; set; }
        /// <summary>
        /// æ‰˜ç›˜å·
        /// ä»»åŠ¡ä¼˜å…ˆçº§
        /// </summary>
        public string PalletCode { get; set; }
        public int TaskPriority { get; set; }
        /// <summary>
        /// Rfid信息
        /// æ–™ç®±å·
        /// </summary>
        public string RfidCode { get; set; }
        public string ContainerCode { get; set; }
        /// <summary>
        /// å··é“号
        /// æ–™ç®±ç±»åž‹
        /// </summary>
        public string RoadWay { get; set; }
        public string ContainerType { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string StorageTag { get; set; }
        /// <summary>
        /// èµ·å§‹åº“位
        /// </summary>
        public string FromLocationCode { get; set; }
        /// <summary>
        /// å‡ºåº“的目标操作台编号
        /// </summary>
        public string ToStationCode { get; set; }
        /// <summary>
        ///
        /// </summary>
        public string ToLocationCode { get; set; }
    }
    public class WMSTaskDTO
    {
        /// <summary>
        /// ä»»åŠ¡ç±»åž‹
        /// </summary>
        public int TaskType { get; set; }
        public string TaskType { get; set; }
        /// <summary>
        /// ä»»åŠ¡çŠ¶æ€
        /// ä»»åŠ¡åˆ†ç»„
        /// </summary>
        public int TaskStatus { get; set; }
        public string TaskGroupCode { get; set; }
        /// <summary>
        /// èµ·ç‚¹
        ///
        /// </summary>
        public string SourceAddress { get; set; }
        public string GroupPriority { get; set; }
        /// <summary>
        /// ç»ˆç‚¹
        /// ä»»åŠ¡æ˜Žç»†
        /// </summary>
        public string TargetAddress { get; set; }
        /// <summary>
        /// ä¼˜å…ˆçº§
        /// </summary>
        public int Grade { get; set; }
        public int WarehouseId { get; set; }
        /// <summary>
        /// ä»»åŠ¡ç»„
        /// </summary>
        public string GroupId { get; set; }
        /// <summary>
        /// ä»»åŠ¡ç‰©æ–™é•¿åº¦
        /// </summary>
        public int TaskLength { get; set; }
        public string AGVArea { get; set; }
        public int PalletType { get; set; }
        /// <summary>
        /// MES计划Id
        /// </summary>
        public int DispatchPlanId { get; set; }
        /// <summary>
        /// åŠ å·¥ä¸­å¿ƒ
        /// </summary>
        public string WorkCentreCode { get; set; }
        public List<TasksItem> Tasks { get; set; }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_DTO/WIDESEAWCS_DTO.csproj
@@ -10,8 +10,4 @@
      <ProjectReference Include="..\WIDESEAWCS_Model\WIDESEAWCS_Model.csproj" />
    </ItemGroup>
    <ItemGroup>
      <Folder Include="BasicInfo\" />
    </ItemGroup>
</Project>
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_DTO/WMSResponseContent.cs
ÎļþÃû´Ó ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_DTO/MESResponse.cs ÐÞ¸Ä
@@ -7,14 +7,14 @@
namespace WIDESEA_External.Model
{
    /// <summary>
    /// MES返回
    /// WMS返回
    /// </summary>
    public class MESResponse
    public class WMSResponseContent
    {
        /// <summary>
        /// æˆåŠŸç»“æžœ
        /// </summary>
        public bool Result { get; set; }
        public string Code { get; set; }
        /// <summary>
        /// è¿”回信息
        /// </summary>
@@ -22,6 +22,6 @@
        /// <summary>
        /// è¿”回对象
        /// </summary>
        public bool Obj { get; set; }
        public object Data { get; set; }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_IBasicInfoRepository/ILocationInfoRepository.cs
@@ -36,5 +36,10 @@
        /// <param name="warehouseId"></param>
        /// <returns></returns>
        List<string> GetCanOutLocationCodes(int warehouseId);
        /// <summary>
        /// èŽ·å–æ–™ç®±å¯¹åº”å‡ºåº“è´§ä½
        /// </summary>
        /// <returns></returns>
        List<Dt_LocationInfo> GetCanOut(List<string> strings);
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_IBasicInfoService/ILocationInfoService.cs
@@ -4,6 +4,7 @@
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core;
using WIDESEA_DTO.Basic;
using WIDESEAWCS_Common;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseServices;
@@ -51,6 +52,13 @@
        /// <param name="roadwayNo">巷道号</param>
        /// <param name="palletType">托盘类型</param>
        /// <returns></returns>
        Dt_LocationInfo? AssignLocation(string roadwayNo, int palletType, int warehouseId);
        Dt_LocationInfo? AssignLocation();
        /// <summary>
        /// åˆå§‹åŒ–货位
        /// </summary>
        /// <param name="initializationLocationDTO"></param>
        /// <returns></returns>
        WebResponseContent InitializationLocation(InitializationLocationDTO initializationLocationDTO);
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_ITaskInfoRepository/ITaskRepository.cs
@@ -27,6 +27,6 @@
{
    public interface ITaskRepository : IRepository<Dt_Task>
    {
        int GetTaskNum(string sequenceName);
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_ITaskInfoService/ITaskService.cs
@@ -57,56 +57,7 @@
        /// </summary>
        /// <param name="taskDTOs">WMS任务对象集合</param>
        /// <returns>返回处理结果</returns>
        WebResponseContent ReceiveWMSTask([NotNull] List<WMSTaskDTO> taskDTOs);
        /// <summary>
        /// æ ¹æ®æ‰˜ç›˜å·ã€èµ·å§‹åœ°å€å‘WMS请求任务
        /// </summary>
        /// <param name="palletCode">托盘号</param>
        /// <param name="sourceAddress">起始地址</param>
        /// <returns></returns>
        WebResponseContent RequestWMSTask(string palletCode, string sourceAddress, string materielBoxCode = "");
        /// <summary>
        /// è¯·æ±‚原料入库
        /// </summary>
        /// <param name="palletCode">托盘</param>
        /// <param name="sourceAddress">起点</param>
        /// <returns></returns>
        WebResponseContent RequestYLWMSTaskSimple(string palletCode, string sourceAddress, int taskNum = 0);
        /// <summary>
        /// è¯·æ±‚入库巷道
        /// </summary>
        /// <returns></returns>
        WebResponseContent AssignCPRoadwayNo();
        // <summary>
        /// è¯·æ±‚原料入库巷道
        /// </summary>
        /// <returns></returns>
        WebResponseContent AssignYLRoadwayNo(string palletCode);
        /// <summary>
        /// è¯·æ±‚入库任务
        /// </summary>
        /// <param name="palletCode">托盘号</param>
        /// <param name="sourceAddress">起始地址</param>
        /// /// <param name="roadWay">巷道</param>
        /// <returns></returns>
        WebResponseContent RequestWMSTaskSimple(string palletCode, string sourceAddress, string roadWay="", int taskType = 630,int taskNum=0,string targetAddress="");
        /// <summary>
        /// å‘WMS申请分配货位
        /// </summary>
        /// <param name="taskNum">任务号</param>
        /// <param name="roadwayNo">巷道号</param>
        /// <returns></returns>
        string? RequestAssignLocation(int taskNum, string roadwayNo);
        /// <summary>
        /// å‘WMS申请出库AGV终点
        /// </summary>
        /// <param name="taskNum">任务号</param>
        /// <returns></returns>
        string? RequestTargetAddress(int taskNum);
        WebResponseContent ReceiveWMSTask([NotNull] WMSTaskDTO taskDTO);
        /// <summary>
        /// æ›´æ–°ä»»åŠ¡å¼‚å¸¸ä¿¡æ¯æ˜¾ç¤º
@@ -151,21 +102,28 @@
        /// <param name="targetAddress">修改后的目标地址</param>
        /// <param name="currentAddress">修改后的当前地址</param>
        /// <param name="nextAddress">修改后的下一地址</param>
        void UpdateTask(Dt_Task task, TaskStatusEnum taskStatus, string deviceCode = "", string sourceAddress = "", string targetAddress = "", string currentAddress = "", string nextAddress = "", string roadwayNo = "", int heightType = 0);
        void UpdateTask(Dt_Task task, TaskStatusEnum taskStatus, string deviceCode = "", string sourceAddress = "", string targetAddress = "", string currentAddress = "", string nextAddress = "", string roadwayNo = "");
        /// <summary>
        /// æŽ¥å—WMS手动完成任务
        /// </summary>
        /// <param name="taskNum"></param>
        /// <returns></returns>
        public WebResponseContent RecWMSTaskCompleted(int taskNum);
        WebResponseContent RecWMSTaskCompleted(int taskNum);
        /// <summary>
        /// æ ¹æ®æ‰˜ç›˜å·ã€å½“前地址查询AGV完成的任务
        /// WMS料箱到达拣选位上报
        /// </summary>
        /// <param name="Barcode">托盘号</param>
        /// <param name="currentAddress">当前地址</param>
        /// <returns></returns>
        Dt_Task QueryBarCodeAGVFinishTask(int TaskNum, string currentAddress);
        WebResponseContent WMSPickUp(string stationCode, string pickCode);
        /// <summary>
        /// AGV任务放行
        /// </summary>
        /// <returns></returns>
        WebResponseContent AgvTaskFlow(string code);
        /// <summary>
        /// ä»»åŠ¡å®Œæˆ
        /// </summary>
        /// <returns></returns>
        WebResponseContent TaskCompleted(int taskNum);
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Model/Models/BasicInfo/Dt_LocationInfo.cs
@@ -21,10 +21,16 @@
        public int Id { get; set; }
        /// <summary>
        /// ä»“库编号
        /// åº“区编号
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "仓库编号")]
        [SugarColumn(IsNullable = false, ColumnDescription = "库区编号")]
        public int WarehouseId { get; set; }
        /// <summary>
        /// æ–™ç®±ç¼–号
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "料箱编号")]
        public string PalletCode { get; set; }
        /// <summary>
        /// è´§ä½ç¼–号
@@ -63,10 +69,10 @@
        public int Layer {  get; set; }
        /// <summary>
        /// è´§ä½ç±»åž‹
        /// AGV取货点
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "货位类型")]
        public int LocationType {  get; set; }
        [SugarColumn(IsNullable = true, ColumnDescription = "AGV取货点")]
        public string AgvPoint { get; set; }
        /// <summary>
        /// è´§ä½çŠ¶æ€
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Model/Models/BasicInfo/Dt_StationManger.cs
@@ -33,16 +33,22 @@
        /// ç«™å°ç±»åž‹ <br/>
        /// 1:只入 <br/>
        /// 2:只出 <br/>
        /// 3:可入可出
        /// 3:可入可出<br/>
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "站台类型")]
        public int StationType {  get; set; }
        /// <summary>
        /// å¯¹åº”堆垛机排-列-层
        /// å–放位置
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "对应堆垛机排-列-层")]
        public string StackerCraneStationCode { get; set; }
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "取放位置")]
        public string CraneStationCode { get; set; }
        /// <summary>
        /// å…³è”拣选工位
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "关联拣选工位")]
        public string PickStationCode { get; set; }
        /// <summary>
        /// ç«™å°è®¾å¤‡ç¼–号
@@ -51,41 +57,18 @@
        public string StationDeviceCode { get; set; }
        /// <summary>
        /// å †åž›æœºç¼–号
        /// å…³è”设备
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "堆垛机编号")]
        public string StackerCraneCode { get; set; }
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "关联设备")]
        public string CraneCode { get; set; }
        /// <summary>
        /// AGV站台编号
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "AGV站台编号")]
        public string? AGVStationCode { get; set; }
        /// <summary>
        /// AGV站台取放高度
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "AGV站台取放高度")]
        public decimal AGVStationHeight { get; set; }
        /// <summary>
        /// AGV前置点
        /// </summary>
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "AGV前置点")]
        public string? AGVFrontCode { get; set; }
        /// <summary>
        /// ç«™å°æ˜¯å¦å¯ç”¨ <br/>
        /// 0:可用 <br/>
        /// 1:占用 <br/>
        /// 1:禁用 <br/>
        /// </summary>
        [SugarColumn(IsNullable = false, ColumnDescription = "站台是否可用")]
        public int IsOccupied { get; set; }
        /// <summary>
        /// ç«™å°æ˜¯å¦å¯ç”¨ <br/>
        /// 0:可用 <br/>
        /// 1:占用 <br/>
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "站台是否可用")]
        public int IsManual { get; set; }
        public int Enable { get; set; }
        /// <summary>
        /// å¤‡æ³¨
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Model/Models/BasicInfo/Dt_Warehouse.cs
@@ -9,9 +9,9 @@
namespace WIDESEAWCS_Model.Models
{
    /// <summary>
    /// ä»“库信息
    /// åº“区信息
    /// </summary>
    [SugarTable(nameof(Dt_Warehouse), "仓库信息")]
    [SugarTable(nameof(Dt_Warehouse), "库区信息")]
    public class Dt_Warehouse : BaseEntity
    {
        /// <summary>
@@ -21,31 +21,25 @@
        public int WarehouseId { get; set; }
        /// <summary>
        /// ä»“库编号
        /// åº“区编号
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 20, ColumnDescription = "仓库编号")]
        public string WarehouseCode { get; set; }
        /// <summary>
        /// ä»“库名称
        /// åº“区名称
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 20, ColumnDescription = "仓库名称")]
        public string WarehouseName { get; set; }
        /// <summary>
        /// ä»“库类型
        /// </summary>
        [SugarColumn(IsNullable = false, Length = 20, ColumnDescription = "仓库类型")]
        public string WarehouseType { get; set; }
        /// <summary>
        /// ä»“库状态
        /// åº“区状态
        /// </summary>
        [SugarColumn(IsNullable = false, DefaultValue = "0", ColumnDescription = "仓库状态")]
        public int WarehouseStatus { get; set; }
        /// <summary>
        /// ä»“库描述
        /// åº“区描述
        /// </summary>
        [SugarColumn(IsNullable = true, ColumnDescription = "仓库描述")]
        public string WarehouseDes { get; set; }
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs
@@ -22,6 +22,7 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core.Attributes;
using WIDESEAWCS_Core.DB.Models;
@@ -43,40 +44,24 @@
        /// </summary>
        [ImporterHeader(Name = "任务号")]
        [ExporterHeader(DisplayName = "任务号")]
        [SugarColumn(IsNullable = false, ColumnDescription = "任务号")]
        [SugarColumn(IsNullable = false, ColumnDescription = "任务号"), Sequence(nameof(SequenceEnum.SeqTaskNum), 100000000)]
        public int TaskNum { get; set; }
        /// <summary>
        /// ä»“库主键
        /// åº“区主键
        /// </summary>
        [ImporterHeader(Name = "仓库主键")]
        [ExporterHeader(DisplayName = "仓库主键")]
        [SugarColumn(IsNullable = false, ColumnDescription = "仓库主键")]
        [ImporterHeader(Name = "库区主键")]
        [ExporterHeader(DisplayName = "库区主键")]
        [SugarColumn(IsNullable = false, ColumnDescription = "库区主键")]
        public int WarehouseId {  get; set; }
        /// <summary>
        /// AGV任务号
        /// æ–™ç®±ç¼–号
        /// </summary>
        [ImporterHeader(Name = "AGV任务号")]
        [ExporterHeader(DisplayName = "AGV任务号")]
        [SugarColumn(IsNullable = true,Length =50, ColumnDescription = "AGV任务号")]
        public string AgvTaskNum { get; set; }
        /// <summary>
        /// æ‰˜ç›˜ç¼–号
        /// </summary>
        [ImporterHeader(Name = "托盘编号")]
        [ExporterHeader(DisplayName = "托盘编号")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "托盘编号")]
        [ImporterHeader(Name = "料箱编号")]
        [ExporterHeader(DisplayName = "料箱编号")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "料箱编号")]
        public string PalletCode { get; set; }
        /// <summary>
        /// RFID信息
        /// </summary>
        [ImporterHeader(Name = "RFID信息")]
        [ExporterHeader(DisplayName = "RFID信息")]
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "RFID信息")]
        public string RfidCode { get; set; }
        /// <summary>
        /// æ‰˜ç›˜ç±»åž‹
@@ -97,7 +82,6 @@
        [ExporterHeader(DisplayName = "巷道号")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "巷道号")]
        public string Roadway { get; set; }
        /// <summary>
        /// ä»»åŠ¡ç±»åž‹
        /// </summary>
@@ -105,7 +89,6 @@
        [ExporterHeader(DisplayName = "任务类型")]
        [SugarColumn(IsNullable = false, ColumnDescription = "任务类型")]
        public int TaskType { get; set; }
        /// <summary>
        /// ä»»åŠ¡çŠ¶æ€
        /// </summary>
@@ -113,7 +96,6 @@
        [ExporterHeader(DisplayName = "任务状态")]
        [SugarColumn(IsNullable = false, ColumnDescription = "任务状态")]
        public int TaskState { get; set; }
        /// <summary>
        /// èµ·å§‹åœ°å€
        /// </summary>
@@ -121,7 +103,6 @@
        [ExporterHeader(DisplayName = "起始地址")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "起始地址")]
        public string SourceAddress { get; set; }
        /// <summary>
        /// ç›®æ ‡åœ°å€
        /// </summary>
@@ -129,7 +110,6 @@
        [ExporterHeader(DisplayName = "目标地址")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "目标地址")]
        public string TargetAddress { get; set; }
        /// <summary>
        /// å½“前位置
        /// </summary>
@@ -137,7 +117,6 @@
        [ExporterHeader(DisplayName = "当前位置")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "当前位置")]
        public string CurrentAddress { get; set; }
        /// <summary>
        /// ä¸‹ä¸€åœ°å€
        /// </summary>
@@ -145,7 +124,6 @@
        [ExporterHeader(DisplayName = "下一地址")]
        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "下一地址")]
        public string NextAddress { get; set; }
        /// <summary>
        /// å¼‚常信息
        /// </summary>
@@ -153,7 +131,6 @@
        [ExporterHeader(DisplayName = "异常信息")]
        [SugarColumn(IsNullable = true, Length = 500, ColumnDescription = "异常信息")]
        public string? ExceptionMessage { get; set; }
        /// <summary>
        /// ä¼˜å…ˆçº§
        /// </summary>
@@ -163,19 +140,13 @@
        public int Grade { get; set; }
        /// <summary>
        /// WMS任务主键
        /// WMS任务
        /// </summary>
        [ImporterHeader(Name = "WMS任务主键")]
        [ExporterHeader(DisplayName = "WMS任务主键")]
        [SugarColumn(IsNullable = false, ColumnDescription = "WMS任务主键")]
        public int WMSId { get; set; }
        /// <summary>
        /// é«˜åº¦ç±»åž‹
        /// </summary>
        [ImporterHeader(Name = "高度类型")]
        [ExporterHeader(DisplayName = "高度类型")]
        [SugarColumn(IsNullable = false, ColumnDescription = "高度类型")]
        public int HeightType { get; set; }
        [ImporterHeader(Name = "WMS任务号")]
        [ExporterHeader(DisplayName = "WMS任务号")]
        [SugarColumn(IsNullable = false, ColumnDescription = "WMS任务号")]
        public string WMSId { get; set; }
        /// <summary>
        /// ä»»åŠ¡ä¸‹å‘æ—¶é—´
        /// </summary>
@@ -192,34 +163,11 @@
        [SugarColumn(IsNullable = true, ColumnDescription = "任务组")]
        public string GroupId { get; set; }
        /// <summary>
        /// ä»»åŠ¡ç‰©æ–™é•¿åº¦
        /// </summary>
        [ImporterHeader(Name = "任务物料长度")]
        [ExporterHeader(DisplayName = "任务物料长度")]
        [SugarColumn(IsNullable = true, ColumnDescription = "任务物料长度")]
        public int TaskLength { get; set; }
        /// <summary>
        /// å¤‡æ³¨
        /// </summary>
        [ImporterHeader(Name = "备注")]
        [ExporterHeader(DisplayName = "备注")]
        [SugarColumn(IsNullable = true, Length = 255, ColumnDescription = "备注")]
        public string Remark { get; set; }
        /// <summary>
        /// åŠ å·¥ä¸­å¿ƒç¼–ç 
        /// </summary>
        [ImporterHeader(Name = "加工中心编码")]
        [ExporterHeader(DisplayName = "加工中心编码")]
        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "加工中心编码")]
        public string WorkCentreCode { get; set; }
        /// <summary>
        /// ç‰©æ–™ç¼–号
        /// </summary>
        [ImporterHeader(Name = "MES计划Id")]
        [ExporterHeader(DisplayName = "MES计划Id")]
        [SugarColumn(IsNullable = true, ColumnDescription = "MES计划Id")]
        public int DispatchPlanId { get; set; }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs
@@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Authorization;
using Autofac.Core;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Text;
@@ -43,7 +44,38 @@
            _taskRepository = taskRepository;
            _routerRepository = routerRepository;
        }
        /// <summary>
        /// AGV任务更新
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("Callback"), AllowAnonymous]
        public WebResponseContent? Callback([FromBody]AgvUpdateDTO agvUpdateDTO)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                var task = _taskRepository.QueryFirst(x => agvUpdateDTO.ContainerCode==x.PalletCode) ?? throw new Exception($"未找到料箱【{agvUpdateDTO.ContainerCode}】任务");
                switch (agvUpdateDTO.MissionStatus)
                {
                    case nameof(AGVStatusEnum.PICKER_RECEIVE):
                        _taskService.UpdateTask(task, TaskStatusEnum.AGV_TakeFinish);
                        break;
                    case nameof(AGVStatusEnum.PICKER_SEND):
                        //WebResponseContent responseContent = _taskService.AgvTaskFlow(task.PalletCode);
                        //if (!responseContent.Status) throw new Exception($"{responseContent.Message}");
                        _taskService.TaskCompleted(task.TaskNum);
                        break;
                    default:
                        break;
                }
                content.OK();
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Server/Controllers/BasicInfo/LocationInfoController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
using HslCommunication.WebSocket;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using WIDESEA_Core;
using WIDESEA_DTO.Basic;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseController;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_IBasicInfoService;
using WIDESEAWCS_Model.Models;
namespace WIDESEA_WMSServer.Controllers.Basic
{
    /// <summary>
    /// è´§ä½
    /// </summary>
    [Route("api/LocationInfo")]
    [ApiController]
    public class LocationInfoController : ApiBaseController<ILocationInfoService, Dt_LocationInfo>
    {
        private readonly ILocationInfoRepository _repository;
        public LocationInfoController(ILocationInfoService service, ILocationInfoRepository repository) : base(service)
        {
            _repository = repository;
        }
        /// <summary>
        /// è´§ä½åˆ†é…
        /// </summary>
        /// <param name="roadwayNo"></param>
        /// <param name="palletType"></param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("AssignLocation"), AllowAnonymous]
        public Dt_LocationInfo? AssignLocation()
        {
            return Service.AssignLocation();
        }
        /// <summary>
        /// åˆå§‹åŒ–货位
        /// </summary>
        /// <returns></returns>
        [HttpPost, Route("InitializationLocation"), AllowAnonymous]
        public WebResponseContent InitializationLocation([FromBody] InitializationLocationDTO initializationLocationDTO)
        {
            return Service.InitializationLocation(initializationLocationDTO);
        }
        /// <summary>
        /// å¯ç”¨è´§ä½
        /// </summary>
        /// <param name="keys"></param>
        /// <returns></returns>
        [HttpPost, Route("LocationEnableStatus")]
        public WebResponseContent LocationEnableStatus([FromBody] int[] keys)
        {
            return Service.LocationEnableStatus(keys); ;
        }
        /// <summary>
        /// ç¦ç”¨è´§ä½
        /// </summary>
        /// <param name="keys"></param>
        /// <returns></returns>
        [HttpPost, Route("LocationDisableStatus")]
        public WebResponseContent LocationDisableStatus([FromBody] int[] keys)
        {
            return Service.LocationDisableStatus(keys); ;
        }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Server/Controllers/Task/TaskController.cs
@@ -22,28 +22,21 @@
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
        private readonly IRouterExtension _routerExtension;
        //private readonly WebSocketServer _webSocketServer;
        private readonly IStationMangerRepository _stationMangerRepository;
        public TaskController(ITaskService service, IHttpContextAccessor httpContextAccessor, IRouterExtension routerExtension/*, WebSocketServer webSocketServer*/, IStationMangerRepository stationMangerRepository) : base(service)
        public TaskController(ITaskService service, IHttpContextAccessor httpContextAccessor, IRouterExtension routerExtension, IStationMangerRepository stationMangerRepository) : base(service)
        {
            _httpContextAccessor = httpContextAccessor;
            _routerExtension = routerExtension;
            _stationMangerRepository=stationMangerRepository;
            //_webSocketServer = webSocketServer;
        }
        [HttpPost, Route("ReceiveTask"), AllowAnonymous]
        public WebResponseContent ReceiveWMSTask([FromBody] List<WMSTaskDTO> taskDTOs)
        public WebResponseContent ReceiveWMSTask([FromBody] WMSTaskDTO taskDTO)
        {
            return Service.ReceiveWMSTask(taskDTOs);
            return Service.ReceiveWMSTask(taskDTO);
        }
        [HttpPost, HttpGet, Route("RequestAssignLocation"), AllowAnonymous]
        public string? RequestAssignLocation(int taskNum, string roadwayNo)
        {
            return Service.RequestAssignLocation(taskNum, roadwayNo);
        }
        [HttpPost, HttpGet, Route("UpdateTaskExceptionMessage")]
        public WebResponseContent UpdateTaskExceptionMessage(int taskNum, string message)
@@ -62,16 +55,39 @@
        {
            return Service.RollbackTaskStatusToLast(taskNum);
        }
        /// <summary>
        /// å®¹å™¨æµåŠ¨æŽ¥å£
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("ContainerFlow"), AllowAnonymous]
        public WebResponseContent ContainerFlow([FromBody] ContainerFlowDTO containerFlowDTO)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x=>x.PickStationCode==containerFlowDTO.SlotCode) ?? throw new Exception($"{containerFlowDTO.SlotCode}拣选位置不存在");
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManger.StationDeviceCode);
                if (device == null)
                {
                    return WebResponseContent.Instance.Error($"未找到对应设备{stationManger.StationDeviceCode}");
                }
                CommonConveyorLine commonConveyorLine = (CommonConveyorLine)device;
                string PickBarCode = commonConveyorLine.GetValue<ConveyorLineDBName, string>(ConveyorLineDBName.R_PickBarCode, stationManger.StationCode).Replace("\0", "");
                if (containerFlowDTO.ContainerCode!= PickBarCode) throw new Exception($"传入料箱码{containerFlowDTO.ContainerCode},输送料箱码{PickBarCode}数据错误");
                commonConveyorLine.SetValue(ConveyorLineDBName.W_PickToHode,(short)containerFlowDTO.Direction.ObjToInt(), stationManger.StationCode);
                content.OK();
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        [HttpPost, HttpGet, Route("GetRouteEndPoint"), AllowAnonymous]
        public WebResponseContent GetRouteEndPoint(string startPoint, int routeType)
        {
            return WebResponseContent.Instance.OK(data: _routerExtension.GetEndPoint(startPoint, routeType));
        }
        [HttpPost, HttpGet, Route("AssignCPRoadwayNo"), AllowAnonymous]
        public WebResponseContent AssignCPRoadwayNo()
        {
            return Service.AssignCPRoadwayNo();
        }
        /// <summary>
        /// WMS任务完成同步
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Server/Filter/CustomProfile.cs
@@ -21,7 +21,7 @@
        {
            CreateMap<Sys_Menu, MenuDTO>();
            CreateMap<Dt_DeviceInfo,DeviceInfoDTO>();
            CreateMap<WMSTaskDTO, Dt_Task>().ForMember(a => a.WMSId, b => b.MapFrom(b => b.Id));
            CreateMap<TasksItem, Dt_Task>().ForMember(a => a.WMSId, b => b.MapFrom(b => b.TaskCode)).ForMember(a => a.PalletCode, b => b.MapFrom(b => b.ContainerCode)).ForMember(a => a.Grade, b => b.MapFrom(b => b.TaskPriority));
        }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_TaskInfoRepository/TaskRepository.cs
@@ -21,6 +21,7 @@
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_Model.Models;
@@ -31,5 +32,13 @@
        public TaskRepository(IUnitOfWorkManage unitOfWorkManage) : base(unitOfWorkManage)
        {
        }
        static object lock_taskNum = new object();
        public int GetTaskNum(string sequenceName)
        {
            lock (lock_taskNum)
            {
                return Db.Ado.GetScalar($"SELECT NEXT VALUE FOR {sequenceName}").ObjToInt();
            }
        }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs
@@ -1,4 +1,6 @@
using Autofac.Core;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -15,19 +17,24 @@
{
    public partial class TaskService
    {
        // åˆ›å»ºä¸€ä¸ªä½¿ç”¨å°é©¼å³°å‘½åæ³•的序列化设置
        JsonSerializerSettings settings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        };
        public WebResponseContent AgvSendTask(AgvTaskSendDTO taskModel, APIEnum SendTask = APIEnum.AgvSendTask)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string? apiAddress = apiInfos.FirstOrDefault(x => x.ApiCode == SendTask.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(apiAddress))
                    return WebResponseContent.Instance.Error($"未找到发送AGV任务接口,请检查接口配置");
                string response = HttpHelper.Post(apiAddress, taskModel.Serialize());
                AgvResponseContent agvContent = response.DeserializeObject<AgvResponseContent>();
                if (agvContent.Code == "0")
                string? apiAddress = _apiInfoRepository.QueryFirst(x => x.ApiCode == SendTask.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(apiAddress)) throw new Exception($"未找到发送AGV任务接口,请检查接口配置");
                string request = JsonConvert.SerializeObject(taskModel, settings);
                string response = HttpHelper.Post(apiAddress, request);
                AgvResponseContent agvContent = response.DeserializeObject<AgvResponseContent>() ?? throw new Exception("AGV任务发送未返回结果");
                if (agvContent.Success)
                {
                    content.OK(data: agvContent.Data);
                    content.OK();
                }
                else
                {
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -16,19 +16,25 @@
#endregion << ç‰ˆ æœ¬ æ³¨ é‡Š >>
using AutoMapper;
using Newtonsoft.Json;
using NPOI.SS.Formula.Functions;
using SqlSugar;
using System.Diagnostics.CodeAnalysis;
using System.DirectoryServices.Protocols;
using System.Net.Http.Headers;
using System.Security.Policy;
using WIDESEA_DTO.Agv;
using WIDESEA_External.Model;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.APIEnum;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_Core.Enums;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_Core.LogHelper;
using WIDESEAWCS_DTO;
using WIDESEAWCS_DTO.Agv;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_ITaskInfoRepository;
@@ -44,6 +50,7 @@
    public partial class TaskService : ServiceBase<Dt_Task, ITaskRepository>, ITaskService
    {
        private readonly IMapper _mapper;
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        private readonly ICacheService _cacheService;
        private readonly IRouterService _routerService;
        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
@@ -51,7 +58,7 @@
        private readonly IStationMangerRepository _stationMangerRepository;
        private readonly IRouterRepository _routerRepository;
        private readonly IApiInfoRepository _apiInfoRepository;
        private List<Dt_ApiInfo> apiInfos;
        private readonly ILocationInfoRepository _locationInfoRepository;
        private Dictionary<string, OrderByType> _taskOrderBy = new()
            {
@@ -60,7 +67,6 @@
                {nameof(Dt_Task.CreateDate),OrderByType.Asc},
            };
        private List<Dt_Warehouse>? Warehouses = new List<Dt_Warehouse>();
        public Dictionary<string, OrderByType> TaskOrderBy { get { return _taskOrderBy; } set { _taskOrderBy = value; } }
@@ -70,7 +76,7 @@
        public List<int> TaskRelocationTypes => typeof(TaskTypeEnum).GetEnumIndexList().Where(x => x >= 900 && x < 1000).ToList();
        public TaskService(ITaskRepository BaseDal, IMapper mapper, ICacheService cacheService, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository, IApiInfoRepository apiInfoRepository) : base(BaseDal)
        public TaskService(ITaskRepository BaseDal, IMapper mapper, ICacheService cacheService, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository, IApiInfoRepository apiInfoRepository,ILocationInfoRepository locationInfoRepository,IUnitOfWorkManage unitOfWorkManage) : base(BaseDal)
        {
            _mapper = mapper;
            _cacheService = cacheService;
@@ -80,278 +86,73 @@
            _stationMangerRepository = stationMangerRepository;
            _routerRepository = routerRepository;
            _apiInfoRepository = apiInfoRepository;
            string? cacheStr = _cacheService.Get(nameof(Dt_Warehouse));
            if (!string.IsNullOrEmpty(cacheStr))
            {
                Warehouses = JsonConvert.DeserializeObject<List<Dt_Warehouse>>(cacheStr);
            _locationInfoRepository = locationInfoRepository;
            _unitOfWorkManage = unitOfWorkManage;
            }
            string? apiInfoStr = _cacheService.Get("apiInfos");
            if (!string.IsNullOrEmpty(apiInfoStr))
            {
                List<Dt_ApiInfo>? infos = JsonConvert.DeserializeObject<List<Dt_ApiInfo>>(apiInfoStr);
                if (infos == null || infos.Count == 0)
                {
                    apiInfos = new List<Dt_ApiInfo>();
                }
                else
                {
                    apiInfos = infos;
                }
            }
        }
        static object lock_taskReceive = new object();
        /// <summary>
        /// æŽ¥æ”¶WMS任务信息
        /// </summary>
        /// <param name="taskDTOs">WMS任务对象集合</param>
        /// <returns>返回处理结果</returns>
        public WebResponseContent ReceiveWMSTask([NotNull] List<WMSTaskDTO> taskDTOs)
        public WebResponseContent ReceiveWMSTask([NotNull] WMSTaskDTO taskDTO)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                bool flag = false;
                lock (lock_taskReceive)
                {
                List<Dt_Task> tasks = new List<Dt_Task>();
                foreach (var item in taskDTOs)
                    List<Dt_LocationInfo> locationInfos = _locationInfoRepository.GetCanOut(taskDTO.Tasks.Select(x=>x.ContainerCode).ToList());
                    TasksItem? tasksItem = taskDTO.Tasks.FirstOrDefault(x => !locationInfos.Select(t => t.PalletCode).Contains(x.ContainerCode));
                    if (tasksItem != null) throw new Exception($"任务{tasksItem.TaskCode}料箱号{tasksItem.ContainerCode}不存在");
                    Dt_LocationInfo? noOutLocation = locationInfos.FirstOrDefault(x=>x.LocationStatus != LocationStatusEnum.InStock.ObjToInt() || x.EnableStatus != EnableStatusEnum.Normal.ObjToInt());
                    if (noOutLocation != null) throw new Exception($"料箱{noOutLocation.PalletCode}货位{noOutLocation.LocationCode}状态不可出库");
                    List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData();
                    //下发任务组
                    string taskGroup= taskDTO.TaskGroupCode.IsNullOrEmpty() ? Guid.NewGuid().ToString().Replace("-","") : taskDTO.TaskGroupCode;
                    foreach (var item in taskDTO.Tasks)
                {
                    if (BaseDal.QueryFirst(x => x.TaskNum == item.TaskNum) != null)
                    {
                        flag = true;
                        continue;
                    }
                        if (item.ToStationCode.IsNullOrEmpty()) throw new Exception($"任务{item.TaskCode}出库目标操作台不能为空");
                        //获取操作台
                        Dt_StationManger? stationManger = stationMangers.FirstOrDefault(x => x.PickStationCode == item.ToStationCode);
                        if (stationManger == null) throw new Exception($"任务{item.TaskCode}出库目标操作台{item.ToStationCode}不存在");
                    Dt_Task task = _mapper.Map<Dt_Task>(item);
                    task.Creater = "WMS";
                    task.TaskState = (int)TaskStatusEnum.New;
                    task.CurrentAddress = item.SourceAddress;
                    Dt_Router? router;
                        Dt_LocationInfo locationInfo = locationInfos.FirstOrDefault(x=>x.PalletCode==item.ContainerCode);
                        task.SourceAddress = locationInfo.LocationCode;
                        task.CurrentAddress = locationInfo.LocationCode;
                        task.NextAddress = stationManger.PickStationCode;
                        task.TargetAddress = stationManger.PickStationCode;
                        task.GroupId = taskGroup;
                        task.TaskType = TaskTypeEnum.Outbound.ObjToInt();
                        task.Roadway = locationInfo.RoadwayNo;
                        task.DeviceCode = "AGV";
                        task.TaskState = TaskStatusEnum.AGV_Execute.ObjToInt();
                        tasks.Add(task);
                }
                    locationInfos.ForEach(x =>
                    {
                        x.LocationStatus=LocationStatusEnum.Lock.ObjToInt();
                    });
                    //添加任务更新货位数据
                    _unitOfWorkManage.BeginTran();
                BaseDal.AddData(tasks);
                    _locationInfoRepository.UpdateData(locationInfos);
                    _unitOfWorkManage.CommitTran();
                _taskExecuteDetailService.AddTaskExecuteDetail(tasks.Select(x => x.TaskNum).ToList(), "接收WMS任务");
                content = (flag || tasks.Count > 0) ? WebResponseContent.Instance.OK("成功") : WebResponseContent.Instance.Error("失败");
                    content = tasks.Count > 0 ? content.OK("成功") : content.Error("失败");
                }
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error($"任务接收错误,错误信息:{ex.Message}");
                content.Error($"任务接收错误,错误信息:{ex.Message}");
            }
            return content;
        }
        /// <summary>
        /// æ ¹æ®æ‰˜ç›˜å·ã€èµ·å§‹åœ°å€å‘WMS请求任务
        /// </summary>
        /// <param name="palletCode">托盘号</param>
        /// <param name="sourceAddress">起始地址</param>
        /// <returns></returns>
        public WebResponseContent RequestWMSTask(string palletCode, string sourceAddress, string materielBoxCode = "")
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == sourceAddress);
                if (stationManger == null)
                {
                    return WebResponseContent.Instance.Error($"未找到站台信息");
                }
                string address = AppSettings.Get("WMSApiAddress");
                if (string.IsNullOrEmpty(address))
                {
                    return WebResponseContent.Instance.Error($"未找到WMSApi地址");
                }
                string responseStr = "";
                if (!string.IsNullOrEmpty(materielBoxCode))
                {
                    responseStr = HttpHelper.Get($"{address}/api/Task/DeviceRequestInboundTask?stationCode={sourceAddress}&roadwayNo={stationManger.StackerCraneCode}&palletCode={palletCode}&materielBoxCode={materielBoxCode}");
                }
                else
                {
                    responseStr = HttpHelper.Get($"{address}/api/Task/DeviceRequestInboundTask?stationCode={sourceAddress}&roadwayNo={stationManger.StackerCraneCode}&palletCode={palletCode}");
                }
                WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
                if (responseContent != null && responseContent.Status && responseContent.Data != null)
                {
                    WMSTaskDTO? taskDTO = JsonConvert.DeserializeObject<WMSTaskDTO>(responseContent.Data.ToString());
                    if (taskDTO != null)
                    {
                        content = ReceiveWMSTask(new List<WMSTaskDTO> { taskDTO });
                    }
                }
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
            }
            return content;
        }
        // <summary>
        /// è¯·æ±‚入库任务
        /// </summary>
        /// <param name="palletCode">托盘号</param>
        /// <param name="sourceAddress">起始地址</param>
        /// /// <param name="roadWay">巷道</param>
        /// <returns></returns>
        public WebResponseContent RequestYLWMSTaskSimple(string palletCode, string sourceAddress,int taskNum=0)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string address = AppSettings.Get("WMSApiAddress");
                if (string.IsNullOrEmpty(address))
                {
                    return WebResponseContent.Instance.Error($"未找到WMSApi地址");
                }
                string responseStr = HttpHelper.Get($"{address}/api/Task/RequestYLWMSTaskSimple?stationCode={sourceAddress}&palletCode={palletCode}&taskNum{taskNum}");
                WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
                if (responseContent != null && responseContent.Status && responseContent.Data != null)
                {
                    WMSTaskDTO? taskDTO = JsonConvert.DeserializeObject<WMSTaskDTO>(responseContent.Data.ToString());
                    if (taskDTO != null)
                    {
                        content = ReceiveWMSTask(new List<WMSTaskDTO> { taskDTO });
                    }
                }
                else
                {
                    content = responseContent ?? content.Error("结果错误");
                }
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
            }
            return content;
        }
        // <summary>
        /// è¯·æ±‚入库巷道
        /// </summary>
        /// <returns></returns>
        public WebResponseContent AssignCPRoadwayNo()
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string address = AppSettings.Get("WMSApiAddress");
                if (string.IsNullOrEmpty(address))
                {
                    return WebResponseContent.Instance.Error($"未找到WMSApi地址");
                }
                string responseStr = HttpHelper.Get($"{address}/api/Task/AssignCPRoadwayNo");
                if (!responseStr.IsNullOrEmpty())
                {
                    content.OK("成功", responseStr);
                }
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
            }
            return content;
        }
        // <summary>
        /// è¯·æ±‚原料入库巷道
        /// </summary>
        /// <returns></returns>
        public WebResponseContent AssignYLRoadwayNo(string palletCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string address = AppSettings.Get("WMSApiAddress");
                if (string.IsNullOrEmpty(address))
                {
                    return WebResponseContent.Instance.Error($"未找到WMSApi地址");
                }
                string responseStr = HttpHelper.Get($"{address}/api/Task/AssignYLRoadwayNo?palletCode={palletCode}");
                WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
                if (responseContent != null && responseContent.Status && responseContent.Data != null)
                {
                    content = responseContent;
                }
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
            }
            return content;
        }
        // <summary>
        /// è¯·æ±‚入库任务
        /// </summary>
        /// <param name="palletCode">托盘号</param>
        /// <param name="sourceAddress">起始地址</param>
        /// /// <param name="roadWay">巷道</param>
        /// <returns></returns>
        public WebResponseContent RequestWMSTaskSimple(string palletCode, string sourceAddress,string roadWay="", int taskType=630, int taskNum = 0, string targetAddress = "")
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //string address = AppSettings.Get("WMSApiAddress");
                //if (string.IsNullOrEmpty(address))
                //{
                //    return WebResponseContent.Instance.Error($"未找到WMSApi地址");
                //}
                //string responseStr = HttpHelper.Get($"{address}/api/Task/DeviceRequestInboundTaskSimple?stationCode={sourceAddress}&palletCode={palletCode}");
                //WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
                //if (responseContent != null && responseContent.Status && responseContent.Data != null)
                //{
                //    WMSTaskDTO? taskDTO = JsonConvert.DeserializeObject<WMSTaskDTO>(responseContent.Data.ToString());
                //    if (taskDTO != null)
                //    {
                WMSTaskDTO? taskDTO = new WMSTaskDTO()
                {
                    TaskNum = taskNum ==0 ? DateTime.Now.ToString("mmss").ObjToInt(): taskNum,
                    PalletCode= palletCode,
                    RoadWay= roadWay,
                    TaskType= taskType,
                    PalletType=1,
                    TaskStatus= TaskStatusEnum.New.ObjToInt(),
                    SourceAddress= sourceAddress,
                    TargetAddress= targetAddress,
                    WarehouseId=2,
                    Grade=0,
                };
                content = ReceiveWMSTask(new List<WMSTaskDTO> { taskDTO });
                //    }
                //}
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
            }
            return content;
        }
        public WebResponseContent MESBoxCodeNotice(string boxCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string address = AppSettings.Get("WMSApiAddress");
                if (string.IsNullOrEmpty(address))
                {
                    return WebResponseContent.Instance.Error($"未找到WMSApi地址");
                }
                string responseStr = HttpHelper.Get($"{address}/api/Mes/MESBoxCodeNotice?boxCode={boxCode}");
                return content.OK(responseStr);
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
            }
            return content;
        }
        public static string Post(string serviceAddress, string requestJson = "", string contentType = "application/json", Dictionary<string, string>? headers = null)
        {
            string result = string.Empty;
@@ -388,47 +189,6 @@
            {
                Logger.Add(serviceAddress, requestJson == null ? "" : requestJson, result, beginDate);
            }
        }
        /// <summary>
        /// å‘WMS申请分配货位
        /// </summary>
        /// <param name="taskNum">任务号</param>
        /// <param name="roadwayNo">巷道号</param>
        /// <returns></returns>
        public string? RequestAssignLocation(int taskNum, string roadwayNo)
        {
            string address = AppSettings.Get("WMSApiAddress");
            if (string.IsNullOrEmpty(address)) throw new Exception("未找到WMSApi地址");
            string responseStr = HttpHelper.Get($"{address}/api/Task/AssignInboundTaskLocation?taskNum={taskNum}&roadwayNo={roadwayNo}");
            WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
            if (responseContent != null && responseContent.Status && responseContent.Data != null)
            {
                return responseContent.Data.ToString();
            }
            return "";
        }
        /// <summary>
        /// å‘WMS申请出库AGV终点
        /// </summary>
        /// <param name="taskNum">任务号</param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public string? RequestTargetAddress(int taskNum)
        {
            string address = AppSettings.Get("WMSApiAddress");
            if (string.IsNullOrEmpty(address)) throw new Exception("未找到WMSApi地址");
            string responseStr = HttpHelper.Get($"{address}/api/Task/AssignOutTargetAddress?taskNum={taskNum}");
            WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
            if (responseContent != null && responseContent.Status && responseContent.Data != null)
            {
                return responseContent.Data.ToString();
            }
            return "";
        }
        /// <summary>
@@ -565,10 +325,118 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        public Dt_Task QueryBarCodeAGVFinishTask(int TaskNum, string currentAddress)
        /// <summary>
        /// AGV任务放行
        /// </summary>
        /// <returns></returns>
        public WebResponseContent AgvTaskFlow(string code)
        {
            return BaseDal.QueryFirst(x => TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskStatusEnum.AGV_Finish && x.CurrentAddress == currentAddress && x.TaskNum == TaskNum, TaskOrderBy);
            WebResponseContent content=new WebResponseContent();
            try
            {
                string? url = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.AgvTaskFlow.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(url)) throw new Exception($"{code},未找到AGV任务放行接口,请检查接口配置");
                AgvTaskFlowDTO agvTaskFlowDTO = new AgvTaskFlowDTO()
                {
                    RequestId = Guid.NewGuid().ToString().Replace("-", ""),
                    ContainerCode = code
                };
                string request = JsonConvert.SerializeObject(agvTaskFlowDTO, settings);
                string response = HttpHelper.Post(url, request);
                AgvResponseContent agvResponse = JsonConvert.DeserializeObject<AgvResponseContent>(response) ?? throw new Exception($"{code},未接收到AGV任务放行返回值");
                if (!agvResponse.Success) throw new Exception($"料箱{code},AGV任务放行错误,信息:{agvResponse.Message}");
                content.OK();
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// WMS料箱到达拣选位上报
        /// </summary>
        /// <returns></returns>
        public WebResponseContent WMSPickUp(string stationCode,string pickCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string? url = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMSPickArrivedUp.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(url)) throw new Exception($"未找到WMS料箱到达拣选位上报接口,请检查接口配置");
                ContainerArriveDTO containerArriveDTO = new ContainerArriveDTO()
                {
                    SlotCode = stationCode,
                    ContainerCode = pickCode
                };
                string request = JsonConvert.SerializeObject(containerArriveDTO, settings);
                string response = HttpHelper.Post(url, request);
                WMSResponseContent wMSResponse = JsonConvert.DeserializeObject<WMSResponseContent>(response) ?? throw new Exception($"{pickCode},未接收到WMS料箱到达拣选位上报返回值");
                if (wMSResponse.Code != "0") throw new Exception($"料箱{pickCode}WMS料箱到达拣选位上报错误,信息:{wMSResponse.Msg}");
                content.OK();
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// ä»»åŠ¡å®Œæˆ
        /// </summary>
        /// <param name="taskNum"></param>
        /// <returns></returns>
        public WebResponseContent TaskCompleted(int taskNum)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)//出库任务逻辑
                {
                    Dt_LocationInfo locationInfo = _locationInfoRepository.QueryFirst(x=>x.PalletCode==task.PalletCode);
                    if (locationInfo.LocationStatus != LocationStatusEnum.Lock.ObjToInt())
                    {
                        return content.Error($"{locationInfo.LocationCode}货位状态不正确");
                    }
                    task.TaskState = TaskStatusEnum.Finish.ObjToInt();
                    locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
                    locationInfo.PalletCode = "";
                    _unitOfWorkManage.BeginTran();
                    _locationInfoRepository.UpdateData(locationInfo);
                    BaseDal.DeleteAndMoveIntoHty(task, App.User?.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
                    _unitOfWorkManage.CommitTran();
                }
                else if(task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)//入库任务逻辑
                {
                    string? url = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.WMSInBoundBack.ToString())?.ApiAddress;
                    if (string.IsNullOrEmpty(url))
                    {
                        _taskExecuteDetailService.AddTaskExecuteDetail(taskNum, $"未找到WMS入库上报接口,请检查接口配置");
                        UpdateTaskExceptionMessage(taskNum, $"未找到WMS入库上报接口,请检查接口配置");
                        return content.Error($"{taskNum},未找到WMS入库上报接口,请检查接口配置");
                    }
                    ContainerInFinishDTO containerInFinishDTO = new ContainerInFinishDTO()
                    {
                        TaskCode= task.TaskNum.ToString(),
                        ContainerCode = task.PalletCode,
                        FromStationCode = task.SourceAddress,
                        ToLocationCode = task.TargetAddress
                    };
                    string request = JsonConvert.SerializeObject(containerInFinishDTO, settings);
                    //调用接口
                    string response = HttpHelper.Post(url, request);
                    WMSResponseContent wMSResponse = JsonConvert.DeserializeObject<WMSResponseContent>(response) ??throw new Exception($"{taskNum},未接收到WMS入库上报返回值");
                    if (wMSResponse.Code!="0") throw new Exception($"入库任务{task.TaskNum}WMS入库上报错误,信息:{wMSResponse.Msg}");
                }
                content.OK("任务完成");
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
        }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_TaskInfoService/TaskService_Operate.cs
@@ -24,7 +24,7 @@
        /// <param name="targetAddress">修改后的目标地址</param>
        /// <param name="currentAddress">修改后的当前地址</param>
        /// <param name="nextAddress">修改后的下一地址</param>
        public void UpdateTask(Dt_Task task, TaskStatusEnum taskStatus, string deviceCode = "", string sourceAddress = "", string targetAddress = "", string currentAddress = "", string nextAddress = "", string roadwayNo = "", int heightType = 0)
        public void UpdateTask(Dt_Task task, TaskStatusEnum taskStatus, string deviceCode = "", string sourceAddress = "", string targetAddress = "", string currentAddress = "", string nextAddress = "", string roadwayNo = "")
        {
            StringBuilder stringBuilder = new StringBuilder(App.User?.UserId == 0 ? $"系统自动流程" : "人工手动流程");
            if (task.DeviceCode != deviceCode && !string.IsNullOrEmpty(deviceCode))
@@ -56,10 +56,6 @@
            {
                stringBuilder.Append($",巷道号由{task.Roadway}变更为{roadwayNo}");
                task.Roadway = roadwayNo;
            }
            if (heightType!=0)
            {
                task.HeightType= heightType;
            }
            if (task.TaskState != taskStatus.ObjToInt())
            {
@@ -96,14 +92,7 @@
                task.TaskState = taskStatus.ObjToInt();
            }
            BaseDal.UpdateData(task);
            //同步到WMS
            string address = AppSettings.Get("WMSApiAddress");
            if (!string.IsNullOrEmpty(address))
            {
                HttpHelper.Post($"{address}/api/Task/UpdateTaskInfo", task.Serialize());
            }
            _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskNum, stringBuilder.ToString());
        }
    }
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Tasks/AGV/AGVExtend.cs
@@ -22,191 +22,137 @@
        {
            try
            {
                var newTasks = _taskService.Db.Queryable<Dt_Task>().Where(x => (x.TaskState == TaskStatusEnum.AGV_Execute.ObjToInt()|| x.TaskState == TaskStatusEnum.New.ObjToInt()) && x.DeviceCode=="AGV").ToList().OrderBy(x => x.Grade).ThenBy(x => x.CreateDate).ToList();
                if (newTasks.Count>0)
                var newTasksOut = _taskService.Db.Queryable<Dt_Task>().Where(x => (x.TaskState == TaskStatusEnum.AGV_Execute.ObjToInt()) && x.TaskType==TaskTypeEnum.Outbound.ObjToInt() && x.DeviceCode == "AGV").ToList().OrderBy(x => x.Grade).ThenBy(x => x.CreateDate).ToList();
                var newTasksIn = _taskService.Db.Queryable<Dt_Task>().Where(x => (x.TaskState == TaskStatusEnum.AGV_Execute.ObjToInt()) && x.TaskType == TaskTypeEnum.Inbound.ObjToInt() && x.DeviceCode == "AGV").ToList().OrderBy(x => x.Grade).ThenBy(x => x.CreateDate).ToList();
                #region å‡ºåº“任务下发
                if (newTasksOut.Count>0)
                {
                    foreach (var task in newTasks)
                    List<string> GroupIds = newTasksOut.GroupBy(x => x.GroupId).Select(x => x.Key).ToList();
                    foreach (var GroupId in GroupIds)
                    {
                        var tasks = newTasksOut.Where(x => x.GroupId == GroupId).ToList();
                        try
                        {
                            Guid guid = Guid.NewGuid();
                            AgvTaskSendDTO agvTaskSend = new AgvTaskSendDTO()
                            {
                                SysToken=guid.ToString().Replace("-",""),
                                ReceiveTaskID=task.TaskNum.ToString(),
                                MapCode="01",
                                Variables=new List<PointDetail>()
                                MissionData = new List<MissionDataItem>()
                            };
                            if (task.NextAddress== "一楼月台码头")
                            foreach (var task in tasks)
                            {
                                string? address =_taskService.RequestTargetAddress(task.TaskNum);
                                if (address.IsNullOrEmpty())
                                //获取目标点货位
                                Dt_LocationInfo locationInfoStart = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.CurrentAddress);
                                //获取拣选出库站台
                                Dt_StationManger stationMangerEnd = _stationMangerRepository.QueryFirst(x => x.PickStationCode == task.NextAddress);
                                if (locationInfoStart == null || stationMangerEnd == null) throw new Exception($"未找到任务号${task.TaskNum}起始点{task.CurrentAddress}或目标点{task.NextAddress}位置信息");
                                agvTaskSend.RequestId = GroupId;
                                agvTaskSend.MissionCode = GroupId;
                                if (task.Grade == 0)
                                {
                                    task.ExceptionMessage = "未找到AGV站点";
                                    continue;
                                }
                                task.NextAddress = address;
                            }
                            Dt_StationManger stationMangerStart = _stationMangerRepository.QueryFirst(x=>x.StationCode==task.CurrentAddress);
                            Dt_StationManger stationMangerEnd = _stationMangerRepository.QueryFirst(x => x.StationCode == task.NextAddress);
                            //添加任务路径及高度
                            if (stationMangerStart !=null && stationMangerEnd != null)
                            {
                                PointDetail pointDetail1 = new PointDetail()
                                {
                                    Code= "GoodPoint",
                                    Value=stationMangerStart.AGVStationCode
                                };
                                //判断是否有前置点
                                if (!string.IsNullOrEmpty(stationMangerStart.AGVFrontCode))
                                {
                                    PointDetail pointDetail2 = new PointDetail()
                                    {
                                        Code = "CostPoint",
                                        Value = stationMangerStart.AGVFrontCode
                                    };
                                    agvTaskSend.Variables.Add(pointDetail2);
                                }
                                PointDetail pointDetail3 = new PointDetail()
                                {
                                    Code = "PointB",
                                    Value = stationMangerEnd.AGVStationCode
                                };
                                //判断是否有前置点
                                if (!string.IsNullOrEmpty(stationMangerEnd.AGVFrontCode))
                                {
                                    PointDetail pointDetail4 = new PointDetail()
                                    {
                                        Code = "PointA",
                                        Value = stationMangerEnd.AGVFrontCode
                                    };
                                    agvTaskSend.Variables.Add(pointDetail4);
                                }
                                PointDetail pointDetail5 = new PointDetail()
                                {
                                    Code = "QUQTH",
                                    Value = stationMangerStart.AGVStationHeight.ToString()
                                };
                                PointDetail pointDetail6 = new PointDetail()
                                {
                                    Code = "FHMH",
                                    Value = stationMangerEnd.AGVStationHeight.ToString()
                                };
                                agvTaskSend.Variables.Add(pointDetail1);
                                agvTaskSend.Variables.Add(pointDetail3);
                                agvTaskSend.Variables.Add(pointDetail5);
                                agvTaskSend.Variables.Add(pointDetail6);
                                    agvTaskSend.Priority = 99;
                            }
                            else
                            {
                                throw new Exception("未找到AGV站点");
                                    agvTaskSend.Priority = 99 - task.Grade;
                            }
                            //取放任务模版
                            if (stationMangerStart.StationCode.Contains("PNT") && !stationMangerEnd.StationCode.Contains("PNT") && stationMangerEnd.IsManual==0)//请求放
                                //料箱子搬运任务
                                MissionDataItem missionDataItem = new MissionDataItem()
                            {
                                agvTaskSend.TaskCode = "DUIGAO1";
                                if (stationMangerStart.StationType == 998 || stationMangerEnd.StationType == 998)//潜伏顶升车
                                {
                                    agvTaskSend.TaskCode = "DUOLUN1";
                                }
                            }
                            else if (!stationMangerStart.StationCode.Contains("PNT") && stationMangerEnd.StationCode.Contains("PNT") && stationMangerStart.IsManual == 0)//请求取
                            {
                                agvTaskSend.TaskCode = "DUIGAO2";
                                if (stationMangerStart.StationType==998 || stationMangerEnd.StationType == 998)//潜伏顶升车
                                {
                                    agvTaskSend.TaskCode = "DUOLUN2";
                                }
                            }
                            else if (!stationMangerStart.StationCode.Contains("PNT") && !stationMangerEnd.StationCode.Contains("PNT") && stationMangerStart.IsManual == 0 && stationMangerStart.IsManual == 0)//请求取放
                            {
                                agvTaskSend.TaskCode = "DUIGAO3";
                                if (stationMangerStart.StationType == 998 || stationMangerEnd.StationType == 998)//潜伏顶升车
                                {
                                    agvTaskSend.TaskCode = "DUOLUN3";
                                }
                            }
                            else//无请求
                            {
                                agvTaskSend.TaskCode = "DUIGAO4";
                                if (stationMangerStart.StationType == 998 || stationMangerEnd.StationType == 998)//潜伏顶升车
                                {
                                    agvTaskSend.TaskCode = "DUOLUN4";
                                }
                            }
                            if (stationMangerStart.StationType == 998 || stationMangerEnd.StationType == 998)//潜伏顶升车
                            {
                                agvTaskSend.Variables.FirstOrDefault(x => x.Code == "FHMH").Value = "0";
                                agvTaskSend.Variables.FirstOrDefault(x => x.Code == "GoodPoint").Value = "";
                                //判断人工手动
                                PointDetail complete = new();
                                if (stationMangerStart.IsManual==1 && stationMangerEnd.IsManual==0)
                                {
                                    complete = new()
                                    {
                                        Code = "Complete",
                                        Value = "1"
                                    Sequence = task.TaskNum,
                                    BinCode = task.PalletCode,
                                    StartPosition = locationInfoStart.AgvPoint,
                                    StartSlotCode = locationInfoStart.LocationCode,
                                    EndPosition = stationMangerEnd.StationCode,
                                    EndSlotCode = stationMangerEnd.CraneStationCode,
                                    TakeActionConfirm = false,
                                    TakeActionInform = false,
                                    PutActionConfirm = true,
                                    PutActionInform = true,
                                    };
                                }
                                else if (stationMangerStart.IsManual == 0 && stationMangerEnd.IsManual == 1)
                                {
                                    complete = new()
                                    {
                                        Code = "Complete",
                                        Value = "2"
                                    };
                                }
                                else if (stationMangerStart.IsManual == 1 && stationMangerEnd.IsManual == 1)
                                {
                                    complete = new()
                                    {
                                        Code = "Complete",
                                        Value = "3"
                                    };
                                }
                                else
                                {
                                    complete = new()
                                    {
                                        Code = "Complete",
                                        Value = "0"
                                    };
                                }
                                //下发任务AGV任务集群
                                agvTaskSend.AgvGroupCode = "QianF";
                                PointDetail pointDetail2 = new PointDetail()
                                {
                                    Code = "CostPoint",
                                    Value = stationMangerStart.AGVStationCode
                                };
                                agvTaskSend.Variables.Add(pointDetail2);
                                agvTaskSend.Variables.Add(complete);
                            }
                            if (task.TaskType==TaskTypeEnum.OutCarton.ObjToInt())
                            {
                                agvTaskSend.AgvGroupCode = "GAOc";
                                agvTaskSend.MissionData.Add(missionDataItem);
                            }
                            //发送AGV任务
                            WebResponseContent content = _taskService.AgvSendTask(agvTaskSend, APIEnum.AgvSendTask);
                            if (!content.Status)
                                throw new Exception(content.Message);
                            task.Dispatchertime = DateTime.Now;
                            _taskService.UpdateTask(task, TaskStatusEnum.AGV_Executing);
                            tasks.ForEach(x =>
                            {
                                x.Dispatchertime = DateTime.Now;
                                x.TaskState = TaskStatusEnum.AGV_Executing.ObjToInt();
                            });
                            _taskService.UpdateData(tasks);
                            Thread.Sleep(500);
                        }
                        catch (Exception ex)
                        {
                            tasks.ForEach(x =>
                            {
                                x.TaskState = TaskStatusEnum.Exception.ObjToInt();
                                x.ExceptionMessage = ex.Message;
                            });
                            _taskService.UpdateData(tasks);
                        }
                    }
                }
                #endregion
                #region å…¥åº“任务下发
                if (newTasksIn.Count > 0)
                {
                    foreach (var task in newTasksIn)
                    {
                        try
                        {
                            AgvTaskSendDTO agvTaskSend = new AgvTaskSendDTO()
                            {
                                MissionData = new List<MissionDataItem>()
                            };
                            //获取目标点货位
                            Dt_LocationInfo locationInfoEnd = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.NextAddress);
                            //获取线体入库站台
                            Dt_StationManger stationMangerStart = _stationMangerRepository.QueryFirst(x => x.PickStationCode == task.CurrentAddress);
                            if (locationInfoEnd == null || stationMangerStart == null) throw new Exception($"未找到任务号${task.TaskNum}起始点{task.CurrentAddress}或目标点{task.NextAddress}位置信息");
                            agvTaskSend.RequestId = Guid.NewGuid().ToString().Replace("-", "");
                            agvTaskSend.MissionCode = task.TaskNum.ToString();
                            if (task.Grade == 0)
                            {
                                agvTaskSend.Priority = 99;
                            }
                            else
                            {
                                agvTaskSend.Priority = 99 - task.Grade;
                            }
                            //料箱子搬运任务
                            MissionDataItem missionDataItem = new MissionDataItem()
                            {
                                Sequence = task.TaskNum,
                                BinCode = task.PalletCode,
                                StartPosition = stationMangerStart.StationCode,
                                StartSlotCode = stationMangerStart.CraneStationCode,
                                EndPosition = locationInfoEnd.AgvPoint,
                                EndSlotCode = locationInfoEnd.LocationCode,
                                TakeActionConfirm = false,
                                TakeActionInform = false,
                                PutActionConfirm = true,
                                PutActionInform = true,
                            };
                            agvTaskSend.MissionData.Add(missionDataItem);
                            //发送AGV任务
                            WebResponseContent content = _taskService.AgvSendTask(agvTaskSend, APIEnum.AgvSendTask);
                            if (!content.Status)
                                throw new Exception(content.Message);
                            task.Dispatchertime = DateTime.Now; task.TaskState = TaskStatusEnum.AGV_Executing.ObjToInt();
                            _taskService.UpdateData(task);
                            Thread.Sleep(500);
                        }
                        catch (Exception ex)
                        {
                            task.TaskState = TaskStatusEnum.Exception.ObjToInt();
                            task.ExceptionMessage = ex.Message;
                            _taskService.UpdateData(task);
                        }
                    }
                    //更新任务
                    if (newTasks.Count > 0)
                    {
                        _taskService.UpdateData(newTasks);
                    }
                }
                #endregion
            }
            catch (Exception ex)
            {
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Tasks/AGV/AGVJob.cs
@@ -19,14 +19,16 @@
        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
        private readonly IRouterService _routerService;
        private readonly IStationMangerRepository _stationMangerRepository;
        private readonly ILocationInfoRepository _locationInfoRepository;
        private readonly IMapper _mapper;
        public AGVJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IStationMangerRepository stationMangerRepository, IMapper mapper)
        public AGVJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IStationMangerRepository stationMangerRepository, ILocationInfoRepository locationInfoRepository, IMapper mapper)
        {
            _taskService = taskService;
            _taskExecuteDetailService = taskExecuteDetailService;
            _routerService = routerService;
            _stationMangerRepository = stationMangerRepository;
            _locationInfoRepository = locationInfoRepository;
            _mapper = mapper;
        }
        public Task Execute(IJobExecutionContext context)
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Tasks/¶þÆÚÏßÌå/ConveyorLineDBName.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_Tasks
{
    public enum ConveyorLineDBName
    {
        /// <summary>
        /// å…¥åº“申请(读)
        /// </summary>
        R_InRequest,
        /// <summary>
        /// å…¥åº“确认(写)
        /// </summary>
        W_InResponse,
        /// <summary>
        /// å…¥åº“重量(读)
        /// </summary>
        R_InWeight,
        /// <summary>
        /// å…¥åº“条码(读)
        /// </summary>
        R_InBarCode,
        /// <summary>
        /// æ‹£é€‰ç”³è¯·(读)
        /// </summary>
        R_PickRequest,
        /// <summary>
        /// æ‹£é€‰æ¡ç (读)
        /// </summary>
        R_PickBarCode,
        /// <summary>
        /// æ‹£é€‰å޻向(写)
        /// </summary>
        W_PickToHode,
        /// <summary>
        /// æ‹£é€‰ç¡®è®¤(写)
        /// </summary>
        W_PickResponse,
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Tasks/¶þÆÚÏßÌå/ConveyorLineJob2.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
using Autofac.Core;
using AutoMapper;
using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Common;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_QuartzJob.Service;
namespace WIDESEAWCS_Tasks
{
    [DisallowConcurrentExecution]
    public partial class ConveyorLineJob2 : JobBase, IJob
    {
        public readonly ITaskService _taskService;
        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
        private readonly IRouterService _routerService;
        private readonly IStationMangerRepository _stationMangerRepository;
        private readonly ILocationInfoRepository _locationInfoRepository;
        private readonly IMapper _mapper;
        public ConveyorLineJob2(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IStationMangerRepository stationMangerRepository, ILocationInfoRepository locationInfoRepository, IMapper mapper)
        {
            _taskService = taskService;
            _taskExecuteDetailService = taskExecuteDetailService;
            _routerService = routerService;
            _stationMangerRepository = stationMangerRepository;
            _locationInfoRepository = locationInfoRepository;
            _mapper = mapper;
        }
        public Task Execute(IJobExecutionContext context)
        {
            try
            {
                CommonConveyorLine conveyorLine = (CommonConveyorLine)context.JobDetail.JobDataMap.Get("JobParams");
                if (conveyorLine != null)
                {
                    #region ç«™å°æ–¹å¼
                    List<Dt_StationManger> stationManagers = _stationMangerRepository.QueryData(x => x.StationDeviceCode == conveyorLine.DeviceCode);
                    foreach (var station in stationManagers)
                    {
                        if (station.StationType==StationTypeEnum.StationType_OnlyOutbound.ObjToInt()) //拣选申请
                        {
                            bool PickRequest = conveyorLine.GetValue<ConveyorLineDBName, bool>(ConveyorLineDBName.R_PickRequest, station.StationCode);
                            if (PickRequest)
                            {
                                string PickBarCode = conveyorLine.GetValue<ConveyorLineDBName, string>(ConveyorLineDBName.R_PickBarCode, station.StationCode).Replace("\0", "");
                                //上报WMS料箱到达
                                if (PickBarCode.IsNotEmptyOrNull())
                                {
                                    WebResponseContent content = _taskService.WMSPickUp(station.PickStationCode, PickBarCode);
                                    if (content.Status)
                                    {
                                        //写入拣选确认
                                    }
                                }
                                else
                                {
                                    WriteError(nameof(conveyorLine.DeviceCode), $"{station.StationCode}拣选申请为{PickRequest}条码为空值");
                                }
                            }
                        }
                        else
                        {
                        }
                    }
                    #endregion ç«™å°æ–¹å¼
                }
            }
            catch (Exception ex)
            {
                WriteError(nameof(ConveyorLineJob2), ex.Message);
            }
            return Task.CompletedTask;
        }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Tasks/Âë¶â/MDJob_CP.cs
@@ -61,46 +61,46 @@
            if (flag && value != null)
            {
                OtherDevice device = (OtherDevice)value;
                List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData(x => x.StackerCraneCode == device.DeviceCode && x.StationType == StationTypeEnum.StationType_InStartAndOutEnd.ObjToInt() && x.IsOccupied == 0);
                List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData(x => x.CraneCode == device.DeviceCode);
                foreach (var item in stationMangers)
                {
                    //获取协议
                    DeviceProDTO? deviceProRead = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.StackerCraneCode && x.DeviceProParamType == nameof(R_MDDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
                    DeviceProDTO? deviceProWrite = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.StackerCraneCode && x.DeviceProParamType == nameof(W_MDDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
                    DeviceProDTO? deviceProRead = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.CraneCode && x.DeviceProParamType == nameof(R_MDDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
                    DeviceProDTO? deviceProWrite = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.CraneCode && x.DeviceProParamType == nameof(W_MDDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
                    if (deviceProRead != null && deviceProWrite != null)
                    {
                        short Allow = device.GetValue<R_MDDB, short>(R_MDDB.R_MDAllow, item.StackerCraneCode);
                        short Allow = device.GetValue<R_MDDB, short>(R_MDDB.R_MDAllow, item.CraneCode);
                        #region è¯»å–工位状态
                        short R_MDStatus1 = device.GetValue<R_MDDB, short>(R_MDDB.R_MDStatus1, item.StackerCraneCode);
                        short R_MDStatus2 = device.GetValue<R_MDDB, short>(R_MDDB.R_MDStatus2, item.StackerCraneCode);
                        short R_MDStatus3 = device.GetValue<R_MDDB, short>(R_MDDB.R_MDStatus3, item.StackerCraneCode);
                        short R_MDStatus4 = device.GetValue<R_MDDB, short>(R_MDDB.R_MDStatus4, item.StackerCraneCode);
                        short R_MDStatus1 = device.GetValue<R_MDDB, short>(R_MDDB.R_MDStatus1, item.CraneCode);
                        short R_MDStatus2 = device.GetValue<R_MDDB, short>(R_MDDB.R_MDStatus2, item.CraneCode);
                        short R_MDStatus3 = device.GetValue<R_MDDB, short>(R_MDDB.R_MDStatus3, item.CraneCode);
                        short R_MDStatus4 = device.GetValue<R_MDDB, short>(R_MDDB.R_MDStatus4, item.CraneCode);
                        short ReceiveDoneState = device.GetValue<W_MDDB, short>(W_MDDB.W_MDReceiveDone, item.StackerCraneCode);
                        short ReceiveDoneState = device.GetValue<W_MDDB, short>(W_MDDB.W_MDReceiveDone, item.CraneCode);
                        #endregion
                        //码垛状态
                        short PackState = device.GetValue<R_MDDB, short>(GetPackStateEnum(item.StackerCraneStationCode), item.StackerCraneCode);
                        short PackState = device.GetValue<R_MDDB, short>(GetPackStateEnum(item.CraneStationCode), item.CraneCode);
                        //码垛数量
                        short PackNum = device.GetValue<R_MDDB, short>(GetPackNumEnum(item.StackerCraneStationCode), item.StackerCraneCode);
                        short PackNum = device.GetValue<R_MDDB, short>(GetPackNumEnum(item.CraneStationCode), item.CraneCode);
                        if (R_MDStatus1 == 1 || R_MDStatus2 == 1 || R_MDStatus3 == 1 || R_MDStatus4 == 1)
                        {
                            Thread.Sleep(200);
                            if (ReceiveDoneState != 0)
                            {
                                device.Communicator.Write<short>(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == W_MDDB.W_MDReceiveDone.ToString()).DeviceProDataBlock, 0);
                                WriteInfo(item.StackerCraneCode, $"{item.StackerCraneCode}清除下发标识信号");
                                WriteInfo(item.CraneCode, $"{item.CraneCode}清除下发标识信号");
                            }
                            continue;
                        }
                        if (PackState == 2)
                        {
                            Thread.Sleep(200);
                            device.Communicator.Write<float>(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == GetPackSendEnum(item.StackerCraneStationCode).ToString()).DeviceProDataBlock, 0);
                            device.Communicator.Write<float>(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == GetPackSendEnum(item.CraneStationCode).ToString()).DeviceProDataBlock, 0);
                            WriteInfo(item.StationName, $"{item.StationName}清除工位结托信号");
                            continue;
                        }
                        device.Communicator.Write<short>(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == GetPackSendEnum(item.StackerCraneStationCode).ToString()).DeviceProDataBlock, 2);
                        device.Communicator.Write<short>(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == GetPackSendEnum(item.CraneStationCode).ToString()).DeviceProDataBlock, 2);
                        WriteInfo(item.StationName, $"{item.StationName}写入工位结托信号");
                        //获取当前任务
                        Dt_Task task = _taskRepository.QueryData(x => x.NextAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) && x.DeviceCode == device.DeviceCode).OrderBy(x => x.TaskNum).FirstOrDefault();
@@ -108,9 +108,9 @@
                        if (task != null)
                        {
                            //写入工位号
                            device.Communicator.Write<short>(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == W_MDDB.W_MDSendID.ToString()).DeviceProDataBlock, Convert.ToInt16(item.StackerCraneStationCode));
                            device.Communicator.Write<short>(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == W_MDDB.W_MDSendID.ToString()).DeviceProDataBlock, Convert.ToInt16(item.CraneStationCode));
                            //写入工位允许码垛
                            device.Communicator.Write<short>(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == GetPackSendEnum(item.StackerCraneStationCode).ToString()).DeviceProDataBlock, 1);
                            device.Communicator.Write<short>(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == GetPackSendEnum(item.CraneStationCode).ToString()).DeviceProDataBlock, 1);
                            #region èŽ·å–å†™å…¥ç åž›X、Y、Z坐标
ÏîÄ¿×ÊÁÏ/AGVͨÐÅÎĵµ/WMSÊäËÍÏß¶Ô½ÓЭÒé251126.xls
Binary files differ
ÏîÄ¿×ÊÁÏ/AGVͨÐÅÎĵµ/µãλÐÅÏ¢.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/AGVͨÐÅÎĵµ/ÊäËͼðÑ¡ºÍվ̨±àºÅ.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/Ò»ÆÚ¶Ô½ÓÏà¹Ø×ÊÁÏ/¹þ¶û±õÒ»ÆÚÊäËÍÏß¶Ô½ÓЭÒémodbusTcpЭÒéV1.1.xlsx
Binary files differ
ÏîÄ¿×ÊÁÏ/½Ó¿Ú»ã×ÜÎļþ/WMS½Ó¿Ú¶Ô½ÓÎĵµ_V1.1.3.docx
Binary files differ