feat: 添加机械手选择功能并优化MES请求处理
refactor: 重构堆垛机任务选择器的日志记录方式
fix: 修复HTTP头设置使用Add方法的问题
feat(WMS): 在绑定/解绑请求中添加设备名称字段
perf: 更新Swashbuckle.AspNetCore至8.0.0版本
style: 移除QuartzLogger中的控制台输出
feat: 在MES请求中添加HTTP配置信息
fix: 修复容器NG报告接口的返回值处理
feat: 添加合并JSON对象的工具方法
docs: 更新IMesUploadHelper接口定义
test: 添加QuartzLogHelper的新测试方法
| | |
| | | "total_spawned": 135, |
| | | "total_completed": 157, |
| | | "total_failed": 0, |
| | | "last_updated": "2026-04-20T17:02:18.739Z" |
| | | "last_updated": "2026-04-21T06:46:41.255Z" |
| | | } |
| | |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | using Microsoft.AspNetCore.Authorization; |
| | | using Microsoft.AspNetCore.Http; |
| | | using Microsoft.AspNetCore.Mvc.Filters; |
| | | using Microsoft.Extensions.Hosting; |
| | | using WIDESEAWCS_Core.Authorization; |
| | |
| | | int ExpMinutes = AppSettings.Get("ExpMinutes").ObjToInt(); |
| | | if ((expDate.GetValueOrDefault() - DateTime.Now).TotalMinutes < ExpMinutes / 3 && context.HttpContext.Request.Path != replaceTokenPath) |
| | | { |
| | | context.HttpContext.Response.Headers.Add("wideseawcs_exp", "1"); |
| | | context.HttpContext.Response.Headers.Append("wideseawcs_exp", "1"); |
| | | } |
| | | } |
| | | } |
| | |
| | | string fileName = GetLogFileName(entry.Source); |
| | | string filePath = Path.Combine(_logFolder, fileName); |
| | | string content = entry.ToFormattedString() + Environment.NewLine; |
| | | ConsoleHelper.WriteInfoLine(content); |
| | | //ConsoleHelper.WriteInfoLine(content); |
| | | File.AppendAllText(filePath, content); |
| | | } |
| | | } |
| | |
| | | public async Task InvokeAsync(HttpContext context) |
| | | { |
| | | |
| | | context.Response.Headers.Add("Access-Control-Expose-Headers", "wideseawcs_exp"); |
| | | context.Response.Headers.Append("Access-Control-Expose-Headers", "wideseawcs_exp"); |
| | | await _next(context); |
| | | } |
| | | } |
| | |
| | | </ItemGroup> |
| | | |
| | | <ItemGroup> |
| | | <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" /> |
| | | <PackageReference Include="Swashbuckle.AspNetCore" Version="8.0.0" /> |
| | | </ItemGroup> |
| | | |
| | | <ItemGroup> |
| | |
| | | logger.Debug(loggerMessage, args); |
| | | QuartzLogger.Debug(quartzMessage, deviceCode); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è®°å½è°è¯æ¥å¿ |
| | | /// </summary> |
| | | /// <param name="logger">ILogger å®ä¾</param> |
| | | /// <param name="loggerMessage">ILogger çç»æåæ¥å¿æ¨¡æ¿ï¼æ¯æå ä½ç¬¦ï¼</param> |
| | | /// <param name="quartzMessage">QuartzLogger çæ¥å¿æ¶æ¯</param> |
| | | /// <param name="deviceCode">设å¤ç¼ç </param> |
| | | /// <param name="args">ILogger ç»æåæ¥å¿çåæ°</param> |
| | | public static void LogDebug(ILogger logger, string loggerMessage, string deviceCode) |
| | | { |
| | | logger.Debug(loggerMessage); |
| | | QuartzLogger.Debug(loggerMessage, deviceCode); |
| | | } |
| | | } |
| | |
| | | return Task.CompletedTask; |
| | | } |
| | | |
| | | |
| | | |
| | | // ========== æå»ºå½ä»¤ ========== |
| | | // å½ä»¤æå»ºä¸æ²å°ä¸ç¨æå»ºå¨ |
| | | object? stackerCraneTaskCommand = _commandBuilder.ConvertToStackerCraneTaskCommand(task); |
| | |
| | | Dt_Task? candidateTask; |
| | | var deviceCode = commonStackerCrane.DeviceCode; |
| | | |
| | | //_logger.LogInformation("SelectTaskï¼å¼å§éæ©ä»»å¡ï¼è®¾å¤: {DeviceCode}ï¼ä¸ä¸ä»»å¡ç±»å: {LastTaskType}", deviceCode, commonStackerCrane.LastTaskType); |
| | | //QuartzLogger.Info($"å¼å§éæ©ä»»å¡ï¼è®¾å¤: {deviceCode}ï¼ä¸ä¸ä»»å¡ç±»å: {commonStackerCrane.LastTaskType}", deviceCode); |
| | | QuartzLogHelper.LogDebug(_logger, $"å¼å§éæ©ä»»å¡ï¼è®¾å¤: {deviceCode}ï¼ä¸ä¸ä»»å¡ç±»å: {commonStackerCrane.LastTaskType}",commonStackerCrane.DeviceName); |
| | | |
| | | // æ ¹æ®ä¸ä¸ä»»å¡ç±»åå³å®æ¥è¯¢çç¥ |
| | | if (commonStackerCrane.LastTaskType == null || commonStackerCrane.LastTaskType == TaskRelocationTypeEnum.Relocation.GetHashCode()) |
| | | { |
| | | // 没æä¸ä¸ä»»å¡ç±»åï¼æ¥è¯¢æ®éä»»å¡ |
| | | candidateTask = _taskService.QueryStackerCraneTask(deviceCode); |
| | | //QuartzLogHelper.LogDebug(_logger, "SelectTaskï¼æ¥è¯¢æ®éä»»å¡ï¼è®¾å¤: {DeviceCode}ï¼ç»æ: {TaskNum}", $"æ¥è¯¢æ®éä»»å¡ï¼è®¾å¤: {deviceCode}ï¼ç»æ: {candidateTask?.TaskNum}", deviceCode, deviceCode, candidateTask?.TaskNum); |
| | | QuartzLogHelper.LogDebug(_logger, $"æ¥è¯¢æ®éä»»å¡ï¼è®¾å¤: {deviceCode}ï¼ç»æ: {candidateTask?.TaskNum}", commonStackerCrane.DeviceName); |
| | | } |
| | | else if (commonStackerCrane.LastTaskType.GetValueOrDefault().GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) |
| | | { |
| | |
| | | candidateTask = _taskService.QueryStackerCraneInTask(deviceCode); |
| | | // å¦ææ²¡æå
¥åºä»»å¡ï¼åæ¥ä¸ä¸åºåºä»»å¡ |
| | | candidateTask ??= _taskService.QueryStackerCraneOutTask(deviceCode); |
| | | //QuartzLogHelper.LogDebug(_logger, "SelectTaskï¼åºåºåä¼å
æ¥å
¥åºï¼è®¾å¤: {DeviceCode}ï¼ç»æ: {TaskNum}", $"åºåºåä¼å
æ¥å
¥åºï¼è®¾å¤: {deviceCode}ï¼ç»æ: {candidateTask?.TaskNum}", deviceCode, deviceCode, candidateTask?.TaskNum); |
| | | QuartzLogHelper.LogDebug(_logger, $"åºåºåä¼å
æ¥å
¥åºï¼è®¾å¤: {deviceCode}ï¼ç»æ: {candidateTask?.TaskNum}", commonStackerCrane.DeviceName); |
| | | } |
| | | else |
| | | { |
| | | // ä¸ä¸ä»»å¡æ¯å
¥åºï¼éåºåºï¼ï¼ä¼å
æ¥åºåºä»»å¡ |
| | | candidateTask = _taskService.QueryStackerCraneOutTask(deviceCode); |
| | | //QuartzLogHelper.LogDebug(_logger, "SelectTaskï¼å
¥åºåä¼å
æ¥åºåºï¼è®¾å¤: {DeviceCode}ï¼ç»æ: {TaskNum}", $"å
¥åºåä¼å
æ¥åºåºï¼è®¾å¤: {deviceCode}ï¼ç»æ: {candidateTask?.TaskNum}", deviceCode, deviceCode, candidateTask?.TaskNum); |
| | | QuartzLogHelper.LogDebug(_logger, $"å
¥åºåä¼å
æ¥åºåºï¼è®¾å¤: {deviceCode}ï¼ç»æ: {candidateTask?.TaskNum}", commonStackerCrane.DeviceName); |
| | | } |
| | | |
| | | // å¦ææ²¡æåéä»»å¡ï¼è¿å null |
| | | if (candidateTask == null) |
| | | { |
| | | //QuartzLogHelper.LogDebug(_logger, "SelectTaskï¼æ²¡æåéä»»å¡ï¼è®¾å¤: {DeviceCode}", $"没æåéä»»å¡ï¼è®¾å¤: {deviceCode}", deviceCode, deviceCode); |
| | | QuartzLogHelper.LogDebug(_logger, $"没æåéä»»å¡ï¼è®¾å¤: {deviceCode}", commonStackerCrane.DeviceName); |
| | | return null; |
| | | } |
| | | |
| | | // 妿䏿¯åºåºä»»å¡ï¼ç´æ¥è¿å |
| | | if (candidateTask.TaskType.GetTaskTypeGroup() != TaskTypeGroup.OutbondGroup) |
| | | { |
| | | QuartzLogHelper.LogInfo(_logger, "SelectTaskï¼éä¸éåºåºä»»å¡ï¼è®¾å¤: {DeviceCode}ï¼ä»»å¡å·: {TaskNum}ï¼ä»»å¡ç±»å: {TaskType}", $"éä¸éåºåºä»»å¡ï¼ä»»å¡å·: {candidateTask.TaskNum}ï¼ä»»å¡ç±»å: {candidateTask.TaskType}", deviceCode, deviceCode, candidateTask.TaskNum, candidateTask.TaskType); |
| | | QuartzLogHelper.LogDebug(_logger, $"éä¸éåºåºä»»å¡ï¼ä»»å¡å·: {candidateTask.TaskNum}ï¼ä»»å¡ç±»å: {candidateTask.TaskType}", commonStackerCrane.DeviceName); |
| | | return candidateTask; |
| | | } |
| | | |
| | |
| | | Dt_Task? selectedTask = TrySelectOutboundTask(candidateTask); |
| | | if (selectedTask != null) |
| | | { |
| | | QuartzLogHelper.LogInfo(_logger, "SelectTaskï¼éä¸åºåºä»»å¡ï¼è®¾å¤: {DeviceCode}ï¼ä»»å¡å·: {TaskNum}", $"éä¸åºåºä»»å¡ï¼ä»»å¡å·: {selectedTask.TaskNum}", deviceCode, deviceCode, selectedTask.TaskNum); |
| | | QuartzLogHelper.LogDebug(_logger, $"éä¸åºåºä»»å¡ï¼ä»»å¡å·: {selectedTask.TaskNum}", commonStackerCrane.DeviceName); |
| | | return selectedTask; |
| | | } |
| | | |
| | |
| | | selectedTask = TrySelectOutboundTask(alternativeTask); |
| | | if (selectedTask != null) |
| | | { |
| | | QuartzLogHelper.LogInfo(_logger, "SelectTaskï¼éä¸å¤éåºåºä»»å¡ï¼è®¾å¤: {DeviceCode}ï¼ä»»å¡å·: {TaskNum}", $"éä¸å¤éåºåºä»»å¡ï¼ä»»å¡å·: {selectedTask.TaskNum}", deviceCode, deviceCode, selectedTask.TaskNum); |
| | | QuartzLogHelper.LogDebug(_logger, $"éä¸å¤éåºåºä»»å¡ï¼ä»»å¡å·: {selectedTask.TaskNum}", commonStackerCrane.DeviceName); |
| | | return selectedTask; |
| | | } |
| | | } |
| | | |
| | | // 没æå¯ç¨åºåºä»»å¡ï¼å°è¯è¿åå
¥åºä»»å¡ |
| | | var inboundTask = _taskService.QueryStackerCraneInTask(deviceCode); |
| | | QuartzLogHelper.LogInfo(_logger, "SelectTaskï¼è¿åå
¥åºä»»å¡ï¼è®¾å¤: {DeviceCode}ï¼ä»»å¡å·: {TaskNum}", $"è¿åå
¥åºä»»å¡ï¼ä»»å¡å·: {inboundTask?.TaskNum}", deviceCode, deviceCode, inboundTask?.TaskNum); |
| | | QuartzLogHelper.LogDebug(_logger, $"è¿åå
¥åºä»»å¡ï¼ä»»å¡å·: {inboundTask?.TaskNum}", commonStackerCrane.DeviceName); |
| | | return inboundTask; |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div> |
| | | <vol-box |
| | | v-model="showDetialBox" |
| | | :lazy="true" |
| | | width="400px" |
| | | :padding="15" |
| | | title="éæ©æºæ¢°æ" |
| | | > |
| | | <div> |
| | | <el-form> |
| | | <el-form-item required label="æºæ¢°æï¼"> |
| | | <el-select v-model="selectedRobot" placeholder="è¯·éæ©æºæ¢°æ" style="width: 100%"> |
| | | <el-option |
| | | v-for="item in robotList" |
| | | :key="item.robotCode" |
| | | :label="item.robotName" |
| | | :value="item.robotCode" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | <template #footer> |
| | | <el-button type="primary" size="small" @click="submit">确认</el-button> |
| | | <el-button type="danger" size="small" @click="close">å
³é</el-button> |
| | | </template> |
| | | </vol-box> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import VolBox from "@/components/basic/VolBox.vue"; |
| | | export default { |
| | | components: { VolBox }, |
| | | data() { |
| | | return { |
| | | showDetialBox: false, |
| | | robotList: [ |
| | | { robotCode: '注液ç»çæºæ¢°æ', robotName: '注液ç»çæºæ¢°æ' }, |
| | | { robotCode: '髿¸©æ¢çæºæ¢°æ', robotName: '髿¸©æ¢çæºæ¢°æ' }, |
| | | { robotCode: 'åææ¢çæºæ¢°æ', robotName: 'åææ¢çæºæ¢°æ' }, |
| | | { robotCode: 'æçæºæ¢°æ', robotName: 'æçæºæ¢°æ' }, |
| | | { robotCode: 'æåç»çæºæ¢°æ', robotName: 'æåç»çæºæ¢°æ' } |
| | | ], |
| | | selectedRobot: '', |
| | | currentRow: null, |
| | | actionType: null // 'bind' or 'unbind' |
| | | }; |
| | | }, |
| | | methods: { |
| | | open(action, row) { |
| | | this.actionType = action; |
| | | this.currentRow = row; |
| | | this.selectedRobot = ''; |
| | | this.showDetialBox = true; |
| | | }, |
| | | close() { |
| | | this.showDetialBox = false; |
| | | }, |
| | | async submit() { |
| | | if (!this.selectedRobot) { |
| | | return this.$message.error("è¯·éæ©æºæ¢°æ"); |
| | | } |
| | | |
| | | this.showDetialBox = false; |
| | | |
| | | try { |
| | | if (this.actionType === 'bind') { |
| | | // ç»ç确认 |
| | | await this.$confirm( |
| | | `确认æ§è¡æçç»çæä½ï¼\næçç¼å·ï¼${this.currentRow.palletCode}\næºæ¢°æï¼${this.selectedRobot}`, |
| | | "ç»ç确认", |
| | | { |
| | | confirmButtonText: "确认", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | } |
| | | ); |
| | | |
| | | const result = await this.http.post("/api/StockInfoDetail/BindContainer", { |
| | | palletCode: this.currentRow.palletCode, |
| | | robotCode: this.selectedRobot |
| | | }, "æ£å¨è°ç¨MESæ¥å£..."); |
| | | |
| | | if (result.status) { |
| | | this.$Message.success(result.message || "æçç»çæå"); |
| | | this.$parent.$refs.table.load(); |
| | | } else { |
| | | this.$error(result.message || "æçç»ç失败"); |
| | | } |
| | | } else if (this.actionType === 'unbind') { |
| | | // æç确认 |
| | | await this.$confirm( |
| | | `确认æ§è¡æçæçæä½ï¼\næçç¼å·ï¼${this.currentRow.palletCode}\næºæ¢°æï¼${this.selectedRobot}`, |
| | | "æç确认", |
| | | { |
| | | confirmButtonText: "确认", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | } |
| | | ); |
| | | |
| | | const result = await this.http.post("/api/StockInfoDetail/UnbindContainer", { |
| | | palletCode: this.currentRow.palletCode, |
| | | robotCode: this.selectedRobot |
| | | }, "æ£å¨è°ç¨MESæ¥å£..."); |
| | | |
| | | if (result.status) { |
| | | this.$Message.success(result.message || "æçæçæå"); |
| | | this.$parent.$refs.table.load(); |
| | | } else { |
| | | this.$error(result.message || "æçæç失败"); |
| | | } |
| | | } |
| | | } catch (error) { |
| | | if (error !== "cancel") { |
| | | this.$error(error.message || "ç½ç»é误ï¼è¯·ç¨åéè¯"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | |
| | | //æ¤jsæä»¶æ¯ç¨æ¥èªå®ä¹æ©å±ä¸å¡ä»£ç ï¼å¯ä»¥æ©å±ä¸äºèªå®ä¹é¡µé¢æè
éæ°é
ç½®çæç代ç |
| | | import RobotSelect from './extend/RobotSelect.vue'; |
| | | |
| | | let extension = { |
| | | components: { |
| | | //æ¥è¯¢ç颿©å±ç»ä»¶ |
| | | gridHeader: '', |
| | | gridBody: '', |
| | | gridBody: RobotSelect, |
| | | gridFooter: '', |
| | | //æ°å»ºãç¼è¾å¼¹åºæ¡æ©å±ç»ä»¶ |
| | | modelHeader: '', |
| | |
| | | }, |
| | | |
| | | // æçç»çæä½ |
| | | async handleBind(row) { |
| | | try { |
| | | await this.$confirm(`确认æ§è¡æçç»çæä½ï¼\næçç¼å·ï¼${row.palletCode}`, "ç»ç确认", { |
| | | confirmButtonText: "确认", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }); |
| | | |
| | | const result = await this.http.post("/api/StockInfoDetail/BindContainer", { |
| | | palletCode: row.palletCode |
| | | }, "æ£å¨è°ç¨MESæ¥å£..."); |
| | | |
| | | if (result.status) { |
| | | this.$Message.success(result.message || "æçç»çæå"); |
| | | this.$refs.table.load(); |
| | | } else { |
| | | this.$error(result.message || "æçç»ç失败"); |
| | | } |
| | | } catch (error) { |
| | | if (error !== "cancel") { |
| | | this.$error(error.message || "ç½ç»é误ï¼è¯·ç¨åéè¯"); |
| | | } |
| | | } |
| | | handleBind(row) { |
| | | this.$refs.gridBody.open('bind', row); |
| | | }, |
| | | |
| | | // æçè¿ç«æä½ |
| | |
| | | }, |
| | | |
| | | // æçæçæä½ |
| | | async handleUnbind(row) { |
| | | try { |
| | | await this.$confirm(`确认æ§è¡æçæçæä½ï¼\næçç¼å·ï¼${row.palletCode}`, "æç确认", { |
| | | confirmButtonText: "确认", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }); |
| | | |
| | | const result = await this.http.post("/api/StockInfoDetail/UnbindContainer", { |
| | | palletCode: row.palletCode, |
| | | }, "æ£å¨è°ç¨MESæ¥å£..."); |
| | | |
| | | if (result.status) { |
| | | this.$Message.success(result.message || "æçæçæå"); |
| | | this.$refs.table.load(); |
| | | } else { |
| | | this.$error(result.message || "æçæç失败"); |
| | | } |
| | | } catch (error) { |
| | | if (error !== "cancel") { |
| | | this.$error(error.message || "ç½ç»é误ï¼è¯·ç¨åéè¯"); |
| | | } |
| | | } |
| | | handleUnbind(row) { |
| | | this.$refs.gridBody.open('unbind', row); |
| | | }, |
| | | |
| | | onInited() { |
| | |
| | | }; |
| | | } |
| | | |
| | | private HttpRequestConfig BuildConfig(string token) |
| | | public HttpRequestConfig BuildConfig(string token) |
| | | { |
| | | return new HttpRequestConfig |
| | | { |
| | |
| | | public List<string> SfcList { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 设å¤åç§° |
| | | /// </summary> |
| | | public string DeviceName { get; set; } |
| | | |
| | | /// <summary> |
| | | /// ä½ç½®ä¿¡æ¯ |
| | | /// </summary> |
| | | public string Location { get; set; } |
| | |
| | | public string PalletCode { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 设å¤åç§° |
| | | /// </summary> |
| | | public string DeviceName { get; set; } |
| | | |
| | | /// <summary> |
| | | /// çµè¯ç å表 |
| | | /// </summary> |
| | | public List<string> SfcList { get; set; } |
| | |
| | | /// æçåºç«ï¼æ¯æå¨æTokenï¼ |
| | | /// </summary> |
| | | HttpResponseResult<MesResponse> OutboundInContainer(OutboundInContainerRequest request, string token); |
| | | |
| | | /// <summary> |
| | | /// 请æ±å¤´é
ç½® |
| | | /// </summary> |
| | | /// <param name="token"> 请æ±Token</param> |
| | | /// <returns></returns> |
| | | HttpRequestConfig BuildConfig(string token); |
| | | } |
| | | } |
| | |
| | | MesUploadStatusEnum successStatus, |
| | | string apiType, |
| | | string requestJson, |
| | | Func<(bool isSuccess, string responseJson, string errorMessage)> mesCall, |
| | | Func<(bool isSuccess, string responseJson, string errorMessage, string httpRequest)> mesCall, |
| | | string creator = "System"); |
| | | } |
| | | } |
| | |
| | | using Newtonsoft.Json.Linq; |
| | | using System.Diagnostics; |
| | | using WIDESEA_Common.StockEnum; |
| | | using WIDESEA_Core; |
| | | using WIDESEA_DTO.MES; |
| | | using WIDESEA_IStockService; |
| | | using WIDESEA_IBasicService; |
| | | using WIDESEA_IStockService; |
| | | |
| | | namespace WIDESEA_StockService |
| | | { |
| | |
| | | MesUploadStatusEnum successStatus, |
| | | string apiType, |
| | | string requestJson, |
| | | Func<(bool isSuccess, string responseJson, string errorMessage)> mesCall, |
| | | Func<(bool isSuccess, string responseJson, string errorMessage, string httpRequest)> mesCall, |
| | | string creator = "System") |
| | | { |
| | | _ = Task.Run(async () => |
| | |
| | | var stopwatch = Stopwatch.StartNew(); |
| | | try |
| | | { |
| | | var (isSuccess, responseJson, errorMessage) = mesCall(); |
| | | var (isSuccess, responseJson, errorMessage, httpRequest) = mesCall(); |
| | | stopwatch.Stop(); |
| | | |
| | | // 奿°=æåï¼å¶æ°=失败 |
| | | int status = isSuccess ? (int)successStatus : (int)successStatus + 1; |
| | | await _stockInfoService.UpdateMesUploadStatusAsync(palletCode, status); |
| | | |
| | | requestJson = MergeJsonObjects(requestJson, httpRequest); |
| | | |
| | | await LogAsync(palletCode, apiType, requestJson, responseJson, |
| | | stopwatch.ElapsedMilliseconds, isSuccess, errorMessage, creator); |
| | |
| | | // æ¥å¿è®°å½å¤±è´¥ä¸å½±å主æµç¨ |
| | | } |
| | | } |
| | | |
| | | public static string MergeJsonObjects(string json1, string json2) |
| | | { |
| | | var obj1 = JObject.Parse(json1); |
| | | var obj2 = JObject.Parse(json2); |
| | | obj1.Merge(obj2, new JsonMergeSettings |
| | | { |
| | | MergeArrayHandling = MergeArrayHandling.Union // æ°ç»åå¹¶æ¹å¼ï¼å¯æéä¿®æ¹ |
| | | }); |
| | | return obj1.ToString(); |
| | | } |
| | | } |
| | | } |
| | |
| | | return ( |
| | | result?.Data?.IsSuccess ?? false, |
| | | System.Text.Json.JsonSerializer.Serialize(result), |
| | | result?.Data?.Msg ?? result?.ErrorMessage ?? "æªç¥é误" |
| | | result?.Data?.Msg ?? result?.ErrorMessage ?? "æªç¥é误", |
| | | _mesService.BuildConfig(token ?? string.Empty).ToJson() |
| | | ); |
| | | }); |
| | | |
| | |
| | | return ( |
| | | result?.Data?.IsSuccess ?? false, |
| | | System.Text.Json.JsonSerializer.Serialize(result), |
| | | result?.Data?.Msg ?? result?.ErrorMessage ?? "æªç¥é误" |
| | | result?.Data?.Msg ?? result?.ErrorMessage ?? "æªç¥é误", |
| | | _mesService.BuildConfig(token ?? string.Empty).ToJson() |
| | | ); |
| | | }); |
| | | |
| | |
| | | return ( |
| | | result?.Data?.IsSuccess ?? false, |
| | | JsonConvert.SerializeObject(result), |
| | | result?.Data?.Msg ?? result?.ErrorMessage ?? "æªç¥é误" |
| | | result?.Data?.Msg ?? result?.ErrorMessage ?? "æªç¥é误", |
| | | _mesService.BuildConfig(token ?? string.Empty).ToJson() |
| | | ); |
| | | }); |
| | | |
| | |
| | | return ( |
| | | result?.Data?.IsSuccess ?? false, |
| | | Newtonsoft.Json.JsonConvert.SerializeObject(result), |
| | | result?.Data?.Msg ?? result?.ErrorMessage ?? "æªç¥é误" |
| | | result?.Data?.Msg ?? result?.ErrorMessage ?? "æªç¥é误", |
| | | _mesService.BuildConfig(token ?? string.Empty).ToJson() |
| | | ); |
| | | }); |
| | | |
| | |
| | | using WIDESEA_Model.Models; |
| | | using WIDESEA_Common.Constants; |
| | | using WIDESEA_Common.StockEnum; |
| | | using WIDESEA_Core.Helper; |
| | | |
| | | namespace WIDESEA_WMSServer.Controllers.Stock |
| | | { |
| | |
| | | return ( |
| | | result.Data?.IsSuccess ?? false, |
| | | System.Text.Json.JsonSerializer.Serialize(result), |
| | | result?.Data?.Msg ?? result?.ErrorMessage ?? "æªç¥é误" |
| | | result?.Data?.Msg ?? result?.ErrorMessage ?? "æªç¥é误", |
| | | _mesService.BuildConfig(token ?? string.Empty).ToJson() |
| | | ); |
| | | }, |
| | | App.User.UserName); |
| | |
| | | return ( |
| | | result?.Data?.IsSuccess ?? false, |
| | | System.Text.Json.JsonSerializer.Serialize(result), |
| | | result?.Data?.Msg ?? result?.ErrorMessage ?? "æªç¥é误" |
| | | result?.Data?.Msg ?? result?.ErrorMessage ?? "æªç¥é误", |
| | | _mesService.BuildConfig(token ?? string.Empty).ToJson() |
| | | ); |
| | | }, |
| | | App.User.UserName); |
| | |
| | | using WIDESEA_Common.StockEnum; |
| | | using WIDESEA_Core; |
| | | using WIDESEA_Core.BaseController; |
| | | using WIDESEA_Core.Helper; |
| | | using WIDESEA_DTO.MES; |
| | | using WIDESEA_IBasicService; |
| | | using WIDESEA_IStockService; |
| | |
| | | var stockInfo = await _stockInfoService.Repository.QueryDataNavFirstAsync(x => x.PalletCode == dto.PalletCode); |
| | | |
| | | // 3. 卿è·åMESåè¯ |
| | | var mesConfig = _mesDeviceConfigService.GetByDeviceName("ç»çæºæ¢°æ"); |
| | | var mesConfig = _mesDeviceConfigService.GetByDeviceName(dto.DeviceName); |
| | | string equipmentCode = mesConfig?.EquipmentCode ?? StockConstants.MES_EQUIPMENT_CODE; |
| | | string resourceCode = mesConfig?.ResourceCode ?? StockConstants.MES_RESOURCE_CODE; |
| | | string token = mesConfig?.Token; |
| | |
| | | return ( |
| | | result?.Data?.IsSuccess ?? false, |
| | | System.Text.Json.JsonSerializer.Serialize(result), |
| | | result?.Data?.Msg ?? result?.ErrorMessage ?? "æªç¥é误" |
| | | result?.Data?.Msg ?? result?.ErrorMessage ?? "æªç¥é误", |
| | | _mesService.BuildConfig(token ?? string.Empty).ToJson() |
| | | ); |
| | | }, |
| | | App.User.UserName); |
| | |
| | | var stockInfo = await _stockInfoService.Repository.QueryDataNavFirstAsync(x => dto.PalletCode == x.PalletCode); |
| | | |
| | | // 3. 卿è·åMESåè¯ |
| | | var mesConfig = _mesDeviceConfigService.GetByDeviceName("ç»çæºæ¢°æ"); |
| | | var mesConfig = _mesDeviceConfigService.GetByDeviceName(dto.DeviceName); |
| | | string equipmentCode = mesConfig?.EquipmentCode ?? StockConstants.MES_EQUIPMENT_CODE; |
| | | string resourceCode = mesConfig?.ResourceCode ?? StockConstants.MES_RESOURCE_CODE; |
| | | string token = mesConfig?.Token; |
| | |
| | | return ( |
| | | result?.Data?.IsSuccess ?? false, |
| | | System.Text.Json.JsonSerializer.Serialize(result), |
| | | result?.Data?.Msg ?? result?.ErrorMessage ?? "æªç¥é误" |
| | | result?.Data?.Msg ?? result?.ErrorMessage ?? "æªç¥é误", |
| | | _mesService.BuildConfig(token ?? string.Empty).ToJson() |
| | | ); |
| | | }, |
| | | App.User.UserName); |
| | |
| | | { |
| | | var result = _mesService.ContainerNgReport(mesRequest); |
| | | return ( |
| | | result?.IsSuccess ?? false, |
| | | result?.Data?.IsSuccess ?? false, |
| | | System.Text.Json.JsonSerializer.Serialize(result), |
| | | result?.ErrorMessage ?? "æªç¥é误" |
| | | result?.Data?.Msg ?? result?.ErrorMessage ?? "æªç¥é误", |
| | | _mesService.BuildConfig(mesConfig?.Token ?? string.Empty).ToJson() |
| | | ); |
| | | }, |
| | | App.User.UserName); |