wanshenmean
2026-03-27 e8de46acfd30dab344ef529a76c04bce6410ecf1
feat(MES): 新增陕西顷刻能源科技MES系统对接服务

- WIDESEA_DTO/MES/: 新增5个接口请求DTO和统一响应DTO
- BindContainerRequest: 托盘电芯绑定
- UnBindContainerRequest: 托盘电芯解绑
- ContainerNgReportRequest: 托盘NG电芯上报
- InboundInContainerRequest: 托盘进站
- OutboundInContainerRequest: 托盘出站
- MesResponse: 统一响应(含IsSuccess快捷属性)
- WIDESEA_IBasicService/IMesService.cs: 新增MES服务接口
- WIDESEA_BasicService/MesService.cs: 实现IMesService接口
- 使用HttpClientHelper调用MES WebAPI
- Authorization固定从appsettings.json读取
- BaseUrl可配置
- WIDESEA_BasicService/WIDESEA_BasicService.csproj: 添加WIDESEA_Core引用
- appsettings.json: 新增MES配置节点(BaseUrl和Authorization)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
已添加4个文件
已修改2个文件
385 ■■■■■ 文件已修改
Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/MesService.cs 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/WIDESEA_BasicService.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/MesRequestDto.cs 243 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/MesResponseDto.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/WIDESEA_IBasicService/IMesService.cs 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/MesService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,77 @@
using Newtonsoft.Json;
using System.Collections.Generic;
using WIDESEA_Core;
using WIDESEA_Core.Helper;
using WIDESEA_IBasicService;
using WIDESEA_DTO.MES;
namespace WIDESEA_BasicService
{
    /// <summary>
    /// MES服务实现 - é™•西顷刻能源科技MES系统对接
    /// </summary>
    public class MesService : IMesService
    {
        private readonly HttpClientHelper _httpClient;
        private readonly string _baseUrl;
        private readonly string _authorization;
        private const string BindContainerPath = "/EquipmentService/api/v1/BindContainer";
        private const string UnBindContainerPath = "/EquipmentService/api/v1/UnBindContainer";
        private const string ContainerNgReportPath = "/EquipmentService/api/v1/ContainerNgReport";
        private const string InboundInContainerPath = "/EquipmentService/api/v1/InboundInContainer";
        private const string OutboundInContainerPath = "/EquipmentService/api/v1/OutboundInContainer";
        public MesService(HttpClientHelper httpClient)
        {
            _httpClient = httpClient;
            _baseUrl = AppSettings.Get("MES:BaseUrl").TrimEnd('/');
            _authorization = AppSettings.Get("MES:Authorization");
        }
        private HttpRequestConfig BuildConfig()
        {
            return new HttpRequestConfig
            {
                Headers = new Dictionary<string, string>
                {
                    { "Authorization", _authorization }
                },
                TimeoutMs = 30000,
                MaxRetryCount = 0,
                EnableLogging = true
            };
        }
        private HttpResponseResult<MesResponse> Post<T>(string url, T request)
        {
            string json = JsonConvert.SerializeObject(request);
            return _httpClient.Post<MesResponse>(url, json, "application/json", BuildConfig());
        }
        public HttpResponseResult<MesResponse> BindContainer(BindContainerRequest request)
        {
            return Post(_baseUrl + BindContainerPath, request);
        }
        public HttpResponseResult<MesResponse> UnBindContainer(UnBindContainerRequest request)
        {
            return Post(_baseUrl + UnBindContainerPath, request);
        }
        public HttpResponseResult<MesResponse> ContainerNgReport(ContainerNgReportRequest request)
        {
            return Post(_baseUrl + ContainerNgReportPath, request);
        }
        public HttpResponseResult<MesResponse> InboundInContainer(InboundInContainerRequest request)
        {
            return Post(_baseUrl + InboundInContainerPath, request);
        }
        public HttpResponseResult<MesResponse> OutboundInContainer(OutboundInContainerRequest request)
        {
            return Post(_baseUrl + OutboundInContainerPath, request);
        }
    }
}
Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/WIDESEA_BasicService.csproj
@@ -9,6 +9,7 @@
  <ItemGroup>
    <ProjectReference Include="..\WIDESEA_IBasicService\WIDESEA_IBasicService.csproj" />
    <ProjectReference Include="..\WIDESEA_IRecordService\WIDESEA_IRecordService.csproj" />
    <ProjectReference Include="..\WIDESEA_Core\WIDESEA_Core.csproj" />
  </ItemGroup>
</Project>
Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/MesRequestDto.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,243 @@
using System;
using System.Collections.Generic;
namespace WIDESEA_DTO.MES
{
    #region æ‰˜ç›˜ç”µèŠ¯ç»‘å®š
    /// <summary>
    /// æ‰˜ç›˜ç”µèŠ¯ç»‘å®š - è¯·æ±‚
    /// </summary>
    public class BindContainerRequest
    {
        /// <summary>
        /// è®¾å¤‡ç¼–码
        /// </summary>
        public string EquipmentCode { get; set; }
        /// <summary>
        /// èµ„源编码
        /// </summary>
        public string ResourceCode { get; set; }
        /// <summary>
        /// è°ƒç”¨æœ¬åœ°æ—¶é—´
        /// </summary>
        public DateTime LocalTime { get; set; }
        /// <summary>
        /// æ‰˜ç›˜ç 
        /// </summary>
        public string ContainerCode { get; set; }
        /// <summary>
        /// ç»‘定的电芯条码列表
        /// </summary>
        public List<ContainerSfcItem> ContainerSfcList { get; set; }
        /// <summary>
        /// æ“ä½œç±»åž‹ï¼š0-默认 1-进站 2-出站 3-进出站
        /// </summary>
        public int OperationType { get; set; }
    }
    /// <summary>
    /// æ‰˜ç›˜ç”µèН项
    /// </summary>
    public class ContainerSfcItem
    {
        /// <summary>
        /// ç”µèŠ¯ç 
        /// </summary>
        public string Sfc { get; set; }
        /// <summary>
        /// ä½ç½®ä¿¡æ¯
        /// </summary>
        public string Location { get; set; }
    }
    #endregion
    #region æ‰˜ç›˜ç”µèŠ¯è§£ç»‘
    /// <summary>
    /// æ‰˜ç›˜ç”µèŠ¯è§£ç»‘ - è¯·æ±‚
    /// </summary>
    public class UnBindContainerRequest
    {
        /// <summary>
        /// è®¾å¤‡ç¼–码
        /// </summary>
        public string EquipmentCode { get; set; }
        /// <summary>
        /// èµ„源编码
        /// </summary>
        public string ResourceCode { get; set; }
        /// <summary>
        /// è°ƒç”¨æœ¬åœ°æ—¶é—´
        /// </summary>
        public DateTime LocalTime { get; set; }
        /// <summary>
        /// æ‰˜ç›˜ç 
        /// </summary>
        public string ContainCode { get; set; }
        /// <summary>
        /// ç”µèŠ¯æ¡ç ç»„
        /// </summary>
        public List<string> SfcList { get; set; }
    }
    #endregion
    #region æ‰˜ç›˜NG电芯上报
    /// <summary>
    /// æ‰˜ç›˜NG电芯上报 - è¯·æ±‚
    /// </summary>
    public class ContainerNgReportRequest
    {
        /// <summary>
        /// è®¾å¤‡ç¼–码
        /// </summary>
        public string EquipmentCode { get; set; }
        /// <summary>
        /// èµ„源编码
        /// </summary>
        public string ResourceCode { get; set; }
        /// <summary>
        /// è°ƒç”¨æœ¬åœ°æ—¶é—´
        /// </summary>
        public DateTime LocalTime { get; set; }
        /// <summary>
        /// æ‰˜ç›˜ç 
        /// </summary>
        public string ContainerCode { get; set; }
        /// <summary>
        /// NG电芯条码列表
        /// </summary>
        public List<NgSfcItem> NgSfcList { get; set; }
    }
    /// <summary>
    /// NG电芯项
    /// </summary>
    public class NgSfcItem
    {
        /// <summary>
        /// äº§å“æ¡ç 
        /// </summary>
        public string Sfc { get; set; }
        /// <summary>
        /// NG代码
        /// </summary>
        public string NgCode { get; set; }
        /// <summary>
        /// NG设备
        /// </summary>
        public string NgEquipmentCode { get; set; }
        /// <summary>
        /// NG资源
        /// </summary>
        public string NgResourceCode { get; set; }
    }
    #endregion
    #region æ‰˜ç›˜è¿›ç«™
    /// <summary>
    /// æ‰˜ç›˜è¿›ç«™ - è¯·æ±‚
    /// </summary>
    public class InboundInContainerRequest
    {
        /// <summary>
        /// è®¾å¤‡ç¼–码
        /// </summary>
        public string EquipmentCode { get; set; }
        /// <summary>
        /// èµ„源编码
        /// </summary>
        public string ResourceCode { get; set; }
        /// <summary>
        /// è°ƒç”¨æœ¬åœ°æ—¶é—´
        /// </summary>
        public DateTime LocalTime { get; set; }
        /// <summary>
        /// æ‰˜ç›˜ç 
        /// </summary>
        public string ContainerCode { get; set; }
    }
    #endregion
    #region æ‰˜ç›˜å‡ºç«™
    /// <summary>
    /// æ‰˜ç›˜å‡ºç«™ - è¯·æ±‚
    /// </summary>
    public class OutboundInContainerRequest
    {
        /// <summary>
        /// è®¾å¤‡ç¼–码
        /// </summary>
        public string EquipmentCode { get; set; }
        /// <summary>
        /// èµ„源编码
        /// </summary>
        public string ResourceCode { get; set; }
        /// <summary>
        /// è°ƒç”¨æœ¬åœ°æ—¶é—´
        /// </summary>
        public DateTime LocalTime { get; set; }
        /// <summary>
        /// æ‰˜ç›˜ç 
        /// </summary>
        public string ContainerCode { get; set; }
        /// <summary>
        /// äº§å“å‚数列表
        /// </summary>
        public List<ParamItem> ParamList { get; set; }
    }
    /// <summary>
    /// å‚数项
    /// </summary>
    public class ParamItem
    {
        /// <summary>
        /// å‚数编码
        /// </summary>
        public string ParamCode { get; set; }
        /// <summary>
        /// å‚数值
        /// </summary>
        public string ParamValue { get; set; }
        /// <summary>
        /// é‡‡é›†å‚数的时间
        /// </summary>
        public DateTime CollectionTime { get; set; }
    }
    #endregion
}
Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/MesResponseDto.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
namespace WIDESEA_DTO.MES
{
    /// <summary>
    /// MES接口统一响应
    /// </summary>
    public class MesResponse
    {
        /// <summary>
        /// æ‰§è¡Œä»£ç ï¼š0-成功,其他-失败
        /// </summary>
        public int Code { get; set; }
        /// <summary>
        /// è¿”回信息
        /// </summary>
        public string Msg { get; set; }
        /// <summary>
        /// æ˜¯å¦æˆåŠŸ
        /// </summary>
        public bool IsSuccess => Code == 0;
    }
}
Code/WMS/WIDESEA_WMSServer/WIDESEA_IBasicService/IMesService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
using System.Net.Http;
using WIDESEA_Core;
using WIDESEA_DTO.MES;
namespace WIDESEA_IBasicService
{
    /// <summary>
    /// MES服务接口 - é™•西顷刻能源科技MES系统对接
    /// </summary>
    public interface IMesService : IDependency
    {
        /// <summary>
        /// æ‰˜ç›˜ç”µèŠ¯ç»‘å®š
        /// </summary>
        HttpResponseResult<MesResponse> BindContainer(BindContainerRequest request);
        /// <summary>
        /// æ‰˜ç›˜ç”µèŠ¯è§£ç»‘
        /// </summary>
        HttpResponseResult<MesResponse> UnBindContainer(UnBindContainerRequest request);
        /// <summary>
        /// æ‰˜ç›˜NG电芯上报
        /// </summary>
        HttpResponseResult<MesResponse> ContainerNgReport(ContainerNgReportRequest request);
        /// <summary>
        /// æ‰˜ç›˜è¿›ç«™
        /// </summary>
        HttpResponseResult<MesResponse> InboundInContainer(InboundInContainerRequest request);
        /// <summary>
        /// æ‰˜ç›˜å‡ºç«™
        /// </summary>
        HttpResponseResult<MesResponse> OutboundInContainer(OutboundInContainerRequest request);
    }
}
Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
@@ -68,5 +68,9 @@
      "GW": [ "11001", "11010", "11068" ],
      "CW": [ "10080" ]
    }
  },
  "MES": {
    "BaseUrl": "http://localhost:5000",
    "Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjMwMTcyNzM5Mzk5NzYxOTIwIiwibmFtZSI6IlBBQ0voo4XphY3lt6XkvY0wMSIsIkZhY3RvcnlJZCI6IjEyMzQ1NiIsIlNpdGVJZCI6IjEyMzQ1NiIsIkNvZGUiOiJYWExQQUNLMDRBRTAzMiIsIm5iZiI6MTcwNDE4NzY5MCwiZXhwIjoyMTQ1NjkxNjkwLCJpc3MiOiJodHRwczovL3d3dy5oeW1zb24uY29tIiwiYXVkIjoiaHR0cHM6Ly93d3cuaHltc29uLmNvbSJ9.An1BE7UgfcSP--LtTOmmmWVE2RQFPDahLkDg1xy5KqY"
  }
}