xiazhengtongxue
2025-12-24 f5e302847933cb5c09bca3bc5731556ae52d3a4a
播种墙(一期)
已添加5个文件
已修改4个文件
429 ■■■■■ 文件已修改
项目代码/WCSServices/WIDESEAWCS_Common/APIEnum/APIEnum.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_DTO/CloseDigit5DTO.cs 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_DTO/ConnectDTO.cs 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_DTO/PTLCallBackDTO.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Server/Controllers/PTLAPIController.cs 191 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_Server/libs/RYB_PTL_API.dll 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCSServices/WIDESEAWCS_TaskInfoService/WIDESEAWCS_TaskInfoService.csproj 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Common/APIEnum/APIEnum.cs
@@ -59,5 +59,16 @@
        /// </summary>
        [Description("二期播种墙下发")]
        PickOrderInfoRequest,
        connect,
        /// <summary>
        /// ä¸€æœŸæ’­ç§å¢™ç»“束作业
        /// </summary>
        [Description("一期播种墙结束作业")]
        disconnect,
        /// <summary>
        /// ä¸€æœŸæ’­ç§å¢™ä¸‹å‘
        /// </summary>
        [Description("一期播种墙下发")]
        Phase1PickOrderInfoRequest,
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_DTO/CloseDigit5DTO.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_DTO
{
    public class CloseDigit5DTO
    {
        /// <summary>
        /// æŽ§åˆ¶å™¨IP地址
        /// </summary>
        public string sIP { get; set; }
        /// <summary>
        /// æ’­ç§å¢™æ ‡ç­¾ID
        /// </summary>
        public string sTagID { get; set; }
        /// <summary>
        /// æ•°é‡
        /// </summary>
        public int iNum { get; set; }
        /// <summary>
        /// äº®ï¼Œ1 ä»£è¡¨é™æ€æ˜¾ç¤ºï¼Œ2~7 ä»£è¡¨æ ‡ç­¾é—ªçƒæ˜¾ç¤ºï¼Œä¼ å…¥å€¼è¶Šå¤§ï¼Œé—ªçƒè¶Šå¿«
        /// </summary>
        public int iMode { get; set; }
        /// <summary>
        ///  1:红色,2:绿色,3:蓝色,4:黄色,5:粉,6:青,7:白
        /// </summary>
        public int iColorIndex { get; set; }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_DTO/ConnectDTO.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_DTO
{
    public class ConnectDTO
    {
        /// <summary>
        /// æŽ§åˆ¶å™¨IP地址
        /// </summary>
        public string sIp { get; set; }
        /// <summary>
        /// ç«¯å£å·é»˜è®¤å€¼6020
        /// </summary>
        public int iPort { get; set; } = 6020;
        /// <summary>
        /// å¯é€‰çš„超时参数
        /// </summary>
        public int? iTimeOut { get; set; }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_DTO/PTLCallBackDTO.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_DTO
{
    public class PTLCallBackDTO
    {
        /// <summary>
        /// æŽ§åˆ¶å™¨IP地址
        /// </summary>
        public string sIp { get; set; }
        /// <summary>
        /// æ ‡ç­¾çš„ID值
        /// </summary>
        public string sTagID { get; set; }
        /// <summary>
        /// æ˜¾ç¤ºçš„æ•°é‡å€¼ï¼ˆæ‹ç­æ—¶ä¼ å…¥çš„æ•°é‡ï¼‰
        /// </summary>
        public string sValue { get; set; }
        /// <summary>
        /// æ¨¡å¼+颜色代码(例如 "15" è¡¨ç¤ºæ¨¡å¼1颜色5)
        /// ç‰¹æ®Šå€¼è¯´æ˜Žï¼š
        /// 90 - æ ‡ç­¾è‡ªæ£€æˆåŠŸ
        /// 85 - æŽ§åˆ¶å™¨æŽ‰çº¿
        /// 87 - æŽ§åˆ¶å™¨é‡æ–°è¿žæŽ¥æˆåŠŸ
        /// </summary>
        public string sKeyCode { get; set; }
        /// <summary>
        /// è´§ä½ä»£ç ï¼ˆå¯é€‰ï¼‰
        /// </summary>
        public string sLocator { get; set; }
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Server/Controllers/PTLAPIController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,191 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using RYB_PTL_API;
using System.Security.Policy;
using WIDESEAWCS_DTO;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_QuartzJob.Repository;
namespace WIDESEAWCS_Server.Controllers
{
    [Route("PTL")]
    [ApiController]
    public class PTLAPIController : ControllerBase
    {
        private readonly ITaskService _taskService;
        //private bool _eventSubscribed = false;
        public PTLAPIController(ITaskService taskService)
        {
            _taskService = taskService;
            //SubscribeEvent();
        }
        /// <summary>
        /// è®¢é˜…PTL事件
        /// </summary>
        //private void SubscribeEvent()
        //{
        //    if (!_eventSubscribed)
        //    {
        //        RYB_PTL.UserResultAvailable += RYB_PTL_UserResultAvailable;
        //        _eventSubscribed = true;
        //    }
        //}
        ///// <summary>
        ///// å–消订阅PTL事件
        ///// </summary>
        //private void UnsubscribeEvent()
        //{
        //    if (_eventSubscribed)
        //    {
        //        RYB_PTL.UserResultAvailable -= RYB_PTL_UserResultAvailable;
        //        _eventSubscribed = false;
        //    }
        //}
        ///// <summary>
        ///// PTL回调事件处理
        ///// </summary>
        //private void RYB_PTL_UserResultAvailable(RYB_PTL.RtnValueStruct rs)
        //{
        //    try
        //    {
        //        var content = new EPLightContent();
        //        var pTLCallBackDTO = new PTLCallBackDTO
        //        {
        //            sIp = rs.Ip,
        //            sTagID = rs.Tagid,
        //            sValue = rs.Number,
        //            sKeyCode = rs.KeyCode,
        //            sLocator = rs.Locator
        //        };
        //        var taskBackLight = new TaskBackLight()
        //        {
        //            TagNo = "B1",
        //            TagCode = pTLCallBackDTO.sLocator,
        //        };
        //        // è°ƒç”¨æœåŠ¡å¤„ç†
        //        _taskService.WMSLightBack(new List<TaskBackLight> { taskBackLight });
        //    }
        //    catch (Exception ex)
        //    {
        //        // è®°å½•日志或处理异常
        //        Console.WriteLine($"处理PTL回调时出错: {ex.Message}");
        //    }
        //}
        /// <summary>
        /// æ’­ç§å¢™ä¸‹å‘(一期)
        /// </summary>
        [HttpPost, Route("RYB_PTL_CloseDigit5"), AllowAnonymous]
        public EPLightContent RYB_PTL_CloseDigit5([FromBody] CloseDigit5DTO request)
        {
            var content = new EPLightContent();
            try
            {
                bool isConnected = RYB_PTL.RYB_PTL_DspDigit5(
                    request.sIP,
                    request.sTagID,
                    request.iNum,
                    request.iMode,
                    request.iColorIndex);
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// å›žè°ƒä¸Šä¼ 
        /// </summary>
        /// <returns></returns>
        [HttpPost, Route("RYB_PTL_UserResultAvailable"), AllowAnonymous]
        public EPLightContent? RYB_PTL_UserResultAvailable([FromBody] List<PTLCallBackDTO> pTLCallBackDTOs)
        {
            EPLightContent content = new EPLightContent();
            try
            {
                if (pTLCallBackDTOs == null)
                {
                    return content.Error("传入不能为空");
                }
                List<TaskBackLight> taskBackLights = pTLCallBackDTOs.Select(x => new TaskBackLight()
                {
                    TagNo = "B1",
                    TagCode = x.sLocator,
                }).ToList();
                content = _taskService.WMSLightBack(taskBackLights);
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// æ’­ç§å¢™åˆå§‹åŒ–(一期)
        /// </summary>
        /// <returns></returns>
        [HttpPost, Route("RYB_PTL_Connect"), AllowAnonymous]
        public EPLightContent RYB_PTL_Connect([FromBody] ConnectDTO request)
        {
            EPLightContent content = new EPLightContent();
            try
            {
                bool isConnected;
                if (request.iTimeOut.HasValue)
                {
                    isConnected = RYB_PTL.RYB_PTL_Connect(request.sIp, request.iPort, request.iTimeOut.Value);
                }
                else
                {
                    isConnected = RYB_PTL.RYB_PTL_Connect(request.sIp, request.iPort);
                }
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// æ’­ç§å¢™ç»“束作业(一期)
        /// </summary>
        /// <returns></returns>
        [HttpPost, Route("RYB_PTL_Disconnect"), AllowAnonymous]
        public EPLightContent RYB_PTL_Disconnect()
        {
            EPLightContent content = new EPLightContent();
            try
            {
                bool isDisconnected = RYB_PTL.RYB_PTL_Disconnect();
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        ///// <summary>
        ///// èµ„源释放
        ///// </summary>
        //public void Dispose()
        //{
        //    UnsubscribeEvent();
        //}
    }
}
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj
@@ -90,4 +90,10 @@
      <Folder Include="Log\" />
    </ItemGroup>
    <ItemGroup>
      <Reference Include="RYB_PTL_API">
        <HintPath>libs\RYB_PTL_API.dll</HintPath>
      </Reference>
    </ItemGroup>
</Project>
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Server/libs/RYB_PTL_API.dll
Binary files differ
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -20,12 +20,14 @@
using NPOI.SS.Formula.Functions;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using RYB_PTL_API;
using SqlSugar;
using System.Diagnostics.CodeAnalysis;
using System.DirectoryServices.Protocols;
using System.Linq;
using System.Net.Http.Headers;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_DTO.Agv;
using WIDESEA_External.Model;
@@ -295,6 +297,96 @@
            return content;
        }
        /// <summary>
        /// ä¸€æœŸæ’­ç§å¢™ä¸‹å‘
        /// </summary>
        /// <returns></returns>
        public EPLightContent Phase1PickOrderInfoRequest(List<EPLightSendDTO> lightSendDTOs)
        {
            EPLightContent content = new EPLightContent();
            try
            {
                string? url = _apiInfoRepository.QueryFirst(x => x.ApiCode == APIEnum.Phase1PickOrderInfoRequest.ToString())?.ApiAddress;
                if (string.IsNullOrEmpty(url))
                {
                    return content.Error("未找到播种墙下发接口,请检查接口配置");
                }
                bool allSuccess = true;
                StringBuilder errorMessages = new StringBuilder();
                foreach (EPLightSendDTO lightSendDTO in lightSendDTOs)
                {
                    try
                    {
                        bool operationResult;
                        // å¤„理灯光类型转换
                        if (!int.TryParse(lightSendDTO.LIGHTTYPE, out int lightType))
                        {
                            allSuccess = false;
                            errorMessages.AppendLine($"位置 {lightSendDTO.LOCATION} é”™è¯¯: æ— æ•ˆçš„灯光类型 '{lightSendDTO.LIGHTTYPE}'");
                            continue;
                        }
                        // å¤„理关闭灯光请求
                        if (lightType == 2)
                        {
                            operationResult = RYB_PTL.RYB_PTL_CloseDigit5(url, lightSendDTO.LOCATION);
                            // TODO: å…³é—­ç¯å…‰å›žè°ƒå¤„理
                            List<EPLightBackDTO> lightBackDTOs = new List<EPLightBackDTO>();
                            List<TaskBackLight> taskBackLights = lightBackDTOs.Select(x => new TaskBackLight()
                            {
                                TagNo = "B1",
                                TagCode = x.LOCATION,
                            }).ToList();
                            content = WMSLightBack(taskBackLights);
                        }
                        // å¤„理显示灯光请求
                        else
                        {
                            // å¤„理灯光颜色转换
                            if (!int.TryParse(lightSendDTO.LIGHTCOLOR, out int lightColor))
                            {
                                allSuccess = false;
                                errorMessages.AppendLine($"位置 {lightSendDTO.LOCATION} é”™è¯¯: æ— æ•ˆçš„灯光颜色 '{lightSendDTO.LIGHTCOLOR}'");
                                continue;
                            }
                            operationResult = RYB_PTL.RYB_PTL_DspDigit5(
                                url,
                                lightSendDTO.LOCATION,
                                lightSendDTO.QUANTITY,
                                lightType,
                                lightColor);
                        }
                        if (!operationResult)
                        {
                            allSuccess = false;
                            errorMessages.AppendLine($"位置 {lightSendDTO.LOCATION} æ“ä½œå¤±è´¥");
                        }
                    }
                    catch (Exception ex)
                    {
                        allSuccess = false;
                        errorMessages.AppendLine($"位置 {lightSendDTO.LOCATION} å¤„理异常: {ex.Message}");
                    }
                }
                return allSuccess
                    ? content.OK("所有播种墙下发操作成功")
                    : content.Error(errorMessages.ToString());
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// æ’­ç§å¢™äº®ç¯
        /// </summary>
        /// <returns></returns>
@@ -303,7 +395,32 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (taskSendLight.TagNo=="B2")
                if (taskSendLight.TagNo == "B1")
                {
                    List<EPLightSendDTO> lightSendDTOs = new List<EPLightSendDTO>()
                    {
                        new EPLightSendDTO
                        {
                            DOCNO = taskSendLight.DocNo,
                            TASKNO= taskSendLight.TaskNo,
                            LOCATION=taskSendLight.TagCode,
                            QUANTITY=taskSendLight.TagQunity,
                            LIGHTCOLOR=taskSendLight.Color switch
                            {
                                "Blue" => "1",
                                "Green" => "2",
                                "Red" => "4",
                                _ => throw new Exception($"未找到颜色定义")
                            },
                            ORDERTYPE="1",
                            LIGHTTYPE=taskSendLight.Mode.ToString(),
                        }
                    };
                    EPLightContent pLightContent = Phase1PickOrderInfoRequest(lightSendDTOs);
                    if (pLightContent.Result != "0") throw new Exception($"{pLightContent.Msg}");
                    content.OK();
                }
                else if (taskSendLight.TagNo == "B2")
                {
                    List<EPLightSendDTO> lightSendDTOs = new List<EPLightSendDTO>()
                    {
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_TaskInfoService/WIDESEAWCS_TaskInfoService.csproj
@@ -24,4 +24,10 @@
      <AdditionalDesignTimeBuildInput Remove="FakesAssemblies\**" />
    </ItemGroup>
    <ItemGroup>
      <Reference Include="RYB_PTL_API">
        <HintPath>..\WIDESEAWCS_Server\libs\RYB_PTL_API.dll</HintPath>
      </Reference>
    </ItemGroup>
</Project>