Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/WIDESEAWCS_Core.csproj
@@ -57,10 +57,11 @@ <PackageReference Include="Mapster.DependencyInjection" Version="1.0.1" /> <PackageReference Include="Magicodes.IE.EPPlus" Version="2.7.5.1" /> <PackageReference Include="Magicodes.IE.Excel" Version="2.7.5.1" /> <PackageReference Include="Masuit.Tools.Core" Version="2026.1.3" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.29" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" /> <PackageReference Include="MiniProfiler.AspNetCore.Mvc" Version="4.3.8" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.4" /> <PackageReference Include="OfficeOpenXml.Core.ExcelPackage" Version="1.0.0" /> <PackageReference Include="Serilog" Version="4.3.1" /> <PackageReference Include="Serilog.AspNetCore" Version="6.0.0" /> Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_RedisService/WIDESEAWCS_RedisService.csproj
@@ -8,8 +8,8 @@ <ItemGroup> <PackageReference Include="StackExchange.Redis" Version="2.7.33" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="6.0.1" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.4" /> <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="10.0.5" /> <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="6.0.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="6.0.0" /> </ItemGroup> Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs
@@ -167,6 +167,7 @@ continue; } #region 检测是否需要空托盘 // ========== 检查特定位置是否有托盘 ========== // 从配置中读取需要检查托盘的位置列表 @@ -206,6 +207,8 @@ } } #endregion // ========== 检查 PLC_STB 标志 ========== // 只有当 PLC_STB 为 1 时才处理任务 if (command.PLC_STB != 1) Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Inbound.cs
@@ -4,6 +4,7 @@ using WIDESEA_Common.TaskEnum; using WIDESEA_Common.WareHouseEnum; using WIDESEA_Core; using WIDESEA_DTO.MES; using WIDESEA_DTO.Task; using WIDESEA_Model.Models; @@ -150,18 +151,18 @@ if (!updateLocationResult || !updateStockResult) return WebResponseContent.Instance.Error("任务完成失败"); // 调用MES托盘进站 //var inboundRequest = new InboundInContainerRequest //{ // EquipmentCode = "STK-GROUP-001", // ResourceCode = "STK-GROUP-001", // LocalTime = DateTime.Now, // ContainerCode = taskDto.PalletCode //}; //var inboundResult = _mesService.InboundInContainer(inboundRequest); //if (inboundResult == null || inboundResult.Data == null || !inboundResult.Data.IsSuccess) //{ // return content.Error($"任务完成失败:MES进站失败: {inboundResult?.Data?.Msg ?? inboundResult?.ErrorMessage ?? "未知错误"}"); //} var inboundRequest = new InboundInContainerRequest { EquipmentCode = "STK-GROUP-001", ResourceCode = "STK-GROUP-001", LocalTime = DateTime.Now, ContainerCode = taskDto.PalletCode }; var inboundResult = _mesService.InboundInContainer(inboundRequest); if (inboundResult == null || inboundResult.Data == null || !inboundResult.Data.IsSuccess) { return content.Error($"任务完成失败:MES进站失败: {inboundResult?.Data?.Msg ?? inboundResult?.ErrorMessage ?? "未知错误"}"); } return await CompleteTaskAsync(task, "入库完成"); }); } Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs
@@ -82,28 +82,22 @@ return response.Error($"当前库存状态不允许进站操作,当前状态:{stockInfo.StockStatus}"); } // 4. 获取系统配置 - 直接从数据库查询 var configs = _sysDictionaryService.GetVueDictionary(new[] { "MES_EquipmentCode", "MES_ResourceCode" }); string equipmentCode = GetConfigValue(configs, "MES_EquipmentCode", "WCS_001"); string resourceCode = GetConfigValue(configs, "MES_ResourceCode", "RESOURCE_001"); // 5. 构造MES请求 // 4. 构造MES请求 var mesRequest = new InboundInContainerRequest { EquipmentCode = equipmentCode, ResourceCode = resourceCode, EquipmentCode = "STK-GROUP-001", ResourceCode = "STK-GROUP-001", LocalTime = DateTime.Now, ContainerCode = dto.PalletCode }; string requestJson = System.Text.Json.JsonSerializer.Serialize(mesRequest); // 6. 调用MES接口(同步方法) // 5. 调用MES接口(同步方法) var mesResult = _mesService.InboundInContainer(mesRequest); stopwatch.Stop(); // 7. 记录日志 // 6. 记录日志 await _mesLogService.LogAsync(new MesApiLogDto { ApiType = "InboundInContainer", @@ -115,7 +109,7 @@ Creator = App.User.UserName }); // 8. 返回结果 // 7. 返回结果 if (mesResult.IsSuccess) { return response.OK("托盘进站成功"); @@ -182,17 +176,11 @@ return response.Error($"当前库存状态不允许出站操作,当前状态:{stockInfo.StockStatus}"); } // 4. 获取系统配置 var configs = _sysDictionaryService.GetVueDictionary(new[] { "MES_EquipmentCode", "MES_ResourceCode" }); string equipmentCode = GetConfigValue(configs, "MES_EquipmentCode", "WCS_001"); string resourceCode = GetConfigValue(configs, "MES_ResourceCode", "RESOURCE_001"); // 5. 构造MES请求 // 4. 构造MES请求 var mesRequest = new OutboundInContainerRequest { EquipmentCode = equipmentCode, ResourceCode = resourceCode, EquipmentCode = "STK-GROUP-001", ResourceCode = "STK-GROUP-001", LocalTime = DateTime.Now, ContainerCode = dto.PalletCode, ParamList = dto.ParamList?.Select(p => new ParamItem @@ -205,11 +193,11 @@ string requestJson = System.Text.Json.JsonSerializer.Serialize(mesRequest); // 6. 调用MES接口(同步方法) // 5. 调用MES接口(同步方法) var mesResult = _mesService.OutboundInContainer(mesRequest); stopwatch.Stop(); // 7. 记录日志 // 6. 记录日志 await _mesLogService.LogAsync(new MesApiLogDto { ApiType = "OutboundInContainer", @@ -221,7 +209,7 @@ Creator = App.User.UserName }); // 8. 返回结果 // 7. 返回结果 if (mesResult.IsSuccess) { return response.OK("托盘出站成功"); Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoDetailController.cs
@@ -22,16 +22,19 @@ private readonly IMesLogService _mesLogService; private readonly IMesService _mesService; private readonly ISys_DictionaryService _sysDictionaryService; private readonly IStockInfoService _stockInfoService; public StockInfoDetailController( IStockInfoDetailService service, IMesLogService mesLogService, IMesService mesService, ISys_DictionaryService sysDictionaryService) : base(service) ISys_DictionaryService sysDictionaryService, IStockInfoService stockInfoService) : base(service) { _mesLogService = mesLogService; _mesService = mesService; _sysDictionaryService = sysDictionaryService; _stockInfoService = stockInfoService; } /// <summary> @@ -48,36 +51,26 @@ try { // 1. 参数验证 if (string.IsNullOrWhiteSpace(dto.PalletCode)) { return response.Error("托盘编号不能为空"); } if (dto.SfcList == null || !dto.SfcList.Any()) { return response.Error("电芯码列表不能为空"); } // 2. 验证电芯状态(非'已锁定'状态允许绑定) var stockDetails = await Service.Repository.QueryDataAsync(x => dto.SfcList.Contains(x.SerialNumber)); if (stockDetails != null && stockDetails.Any(d => d.Status == 99)) var stockDetail = await Service.Repository.QueryFirstAsync(x => dto.SfcList.Contains(x.SerialNumber)); if (stockDetail != null && stockDetail.Status == 99) { return response.Error("当前库存明细包含已锁定状态,不允许执行绑定操作"); } // 3. 获取系统配置 var configs = _sysDictionaryService.GetVueDictionary(new[] { "MES_EquipmentCode", "MES_ResourceCode" }); string equipmentCode = GetConfigValue(configs, "MES_EquipmentCode", "WCS_001"); string resourceCode = GetConfigValue(configs, "MES_ResourceCode", "RESOURCE_001"); var stockInfo = await _stockInfoService.Repository.QueryFirstAsync(x => stockDetail.StockId == x.Id); // 3. 构造MES请求 - 将电芯列表转换为ContainerSfcItem格式 var mesRequest = new BindContainerRequest { EquipmentCode = equipmentCode, ResourceCode = resourceCode, EquipmentCode = "STK-GROUP-001", ResourceCode = "STK-GROUP-001", LocalTime = DateTime.Now, ContainerCode = dto.PalletCode, ContainerCode = stockInfo.PalletCode, ContainerSfcList = dto.SfcList.Select(sfc => new ContainerSfcItem { Sfc = sfc, @@ -146,36 +139,26 @@ try { // 1. 参数验证 if (string.IsNullOrWhiteSpace(dto.PalletCode)) { return response.Error("托盘编号不能为空"); } if (dto.SfcList == null || !dto.SfcList.Any()) { return response.Error("电芯码列表不能为空"); } // 2. 验证电芯状态(非'已锁定'状态允许解绑) var stockDetails = await Service.Repository.QueryDataAsync(x => dto.SfcList.Contains(x.SerialNumber)); if (stockDetails != null && stockDetails.Any(d => d.Status == 99)) var stockDetail = await Service.Repository.QueryFirstAsync(x => dto.SfcList.Contains(x.SerialNumber)); if (stockDetail != null && stockDetail.Status == 99) { return response.Error("当前库存明细包含已锁定状态,不允许执行解绑操作"); } // 3. 获取系统配置 var configs = _sysDictionaryService.GetVueDictionary(new[] { "MES_EquipmentCode", "MES_ResourceCode" }); string equipmentCode = GetConfigValue(configs, "MES_EquipmentCode", "WCS_001"); string resourceCode = GetConfigValue(configs, "MES_ResourceCode", "RESOURCE_001"); var stockInfo = await _stockInfoService.Repository.QueryFirstAsync(x => stockDetail.StockId == x.Id); // 3. 构造MES请求 var mesRequest = new UnBindContainerRequest { EquipmentCode = equipmentCode, ResourceCode = resourceCode, EquipmentCode = "STK-GROUP-001", ResourceCode = "STK-GROUP-001", LocalTime = DateTime.Now, ContainCode = dto.PalletCode, ContainCode = stockInfo.PalletCode, SfcList = dto.SfcList }; @@ -251,25 +234,20 @@ // 2. 验证电芯状态(非'已锁定'状态允许NG上报) var sfcList = dto.NgSfcList.Select(x => x.Sfc).ToList(); var stockDetails = await Service.Repository.QueryDataAsync(x => sfcList.Contains(x.SerialNumber)); if (stockDetails != null && stockDetails.Any(d => d.Status == 99)) var stockDetail = await Service.Repository.QueryFirstAsync(x => sfcList.Contains(x.SerialNumber)); if (stockDetail != null && stockDetail.Status == 99) { return response.Error("当前库存明细包含已锁定状态,不允许执行NG上报操作"); } // 3. 获取系统配置 var configs = _sysDictionaryService.GetVueDictionary(new[] { "MES_EquipmentCode", "MES_ResourceCode" }); string equipmentCode = GetConfigValue(configs, "MES_EquipmentCode", "WCS_001"); string resourceCode = GetConfigValue(configs, "MES_ResourceCode", "RESOURCE_001"); var stockInfo = await _stockInfoService.Repository.QueryFirstAsync(x => stockDetail.StockId == x.Id); // 3. 构造MES请求 - 将DTO格式转换为MES请求格式 var mesRequest = new ContainerNgReportRequest { EquipmentCode = equipmentCode, ResourceCode = resourceCode, EquipmentCode = "STK-GROUP-001", ResourceCode = "RESOURCE-001", LocalTime = DateTime.Now, ContainerCode = dto.PalletCode, ContainerCode = stockInfo.PalletCode, NgSfcList = dto.NgSfcList.Select(ng => new NgSfcItem { Sfc = ng.Sfc,