| | |
| | | { |
| | | "tool_name": "Read", |
| | | "tool_input_preview": "{\"file_path\":\"D:\\\\Git\\\\ShanMeiXinNengYuan\\\\Code\\\\WCS\\\\WIDESEAWCS_Server\\\\WIDESEA_DTO\\\\Stock\\\\StockDTO.cs\"}", |
| | | "tool_input_preview": "{\"file_path\":\"D:\\\\Git\\\\ShanMeiXinNengYuan\\\\Code\\\\WMS\\\\WIDESEA_WMSServer\\\\WIDESEA_TaskInfoService\\\\WCS\\\\TaskService.cs\"}", |
| | | "error": "File does not exist. Note: your current working directory is D:\\Git\\ShanMeiXinNengYuan\\Code.", |
| | | "timestamp": "2026-04-16T15:04:27.059Z", |
| | | "retry_count": 2 |
| | | "timestamp": "2026-04-18T07:45:29.125Z", |
| | | "retry_count": 1 |
| | | } |
| | |
| | | { |
| | | "updatedAt": "2026-04-16T13:59:54.835Z", |
| | | "updatedAt": "2026-04-18T08:52:24.581Z", |
| | | "missions": [ |
| | | { |
| | | "id": "session:9007b9ea-1eb6-4d24-8fe7-2c3a949eac88:none", |
| | |
| | | "sourceKey": "session-stop:a93149b10e8b430e7" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "id": "session:f36717d7-c4c4-4816-8723-6f7d562203f6:none", |
| | | "source": "session", |
| | | "name": "none", |
| | | "objective": "Session mission", |
| | | "createdAt": "2026-04-18T06:36:59.451Z", |
| | | "updatedAt": "2026-04-18T07:46:50.058Z", |
| | | "status": "done", |
| | | "workerCount": 8, |
| | | "taskCounts": { |
| | | "total": 8, |
| | | "pending": 0, |
| | | "blocked": 0, |
| | | "inProgress": 0, |
| | | "completed": 8, |
| | | "failed": 0 |
| | | }, |
| | | "agents": [ |
| | | { |
| | | "name": "Explore:a1ab626", |
| | | "role": "Explore", |
| | | "ownership": "a1ab62633715919c8", |
| | | "status": "done", |
| | | "currentStep": null, |
| | | "latestUpdate": "completed", |
| | | "completedSummary": null, |
| | | "updatedAt": "2026-04-18T06:39:31.702Z" |
| | | }, |
| | | { |
| | | "name": "general-purpose:ae116cb", |
| | | "role": "general-purpose", |
| | | "ownership": "ae116cb86a435866d", |
| | | "status": "done", |
| | | "currentStep": null, |
| | | "latestUpdate": "completed", |
| | | "completedSummary": null, |
| | | "updatedAt": "2026-04-18T06:50:41.503Z" |
| | | }, |
| | | { |
| | | "name": "general-purpose:a4e061e", |
| | | "role": "general-purpose", |
| | | "ownership": "a4e061e4a6d17c682", |
| | | "status": "done", |
| | | "currentStep": null, |
| | | "latestUpdate": "completed", |
| | | "completedSummary": null, |
| | | "updatedAt": "2026-04-18T06:52:02.047Z" |
| | | }, |
| | | { |
| | | "name": "general-purpose:afdf6ef", |
| | | "role": "general-purpose", |
| | | "ownership": "afdf6efad435c036a", |
| | | "status": "done", |
| | | "currentStep": null, |
| | | "latestUpdate": "completed", |
| | | "completedSummary": null, |
| | | "updatedAt": "2026-04-18T06:50:50.428Z" |
| | | }, |
| | | { |
| | | "name": "general-purpose:ab1f8d2", |
| | | "role": "general-purpose", |
| | | "ownership": "ab1f8d2625bd8a667", |
| | | "status": "done", |
| | | "currentStep": null, |
| | | "latestUpdate": "completed", |
| | | "completedSummary": null, |
| | | "updatedAt": "2026-04-18T06:54:35.702Z" |
| | | }, |
| | | { |
| | | "name": "general-purpose:a99f2fa", |
| | | "role": "general-purpose", |
| | | "ownership": "a99f2fa258ad9b5a1", |
| | | "status": "done", |
| | | "currentStep": null, |
| | | "latestUpdate": "completed", |
| | | "completedSummary": null, |
| | | "updatedAt": "2026-04-18T06:50:30.602Z" |
| | | }, |
| | | { |
| | | "name": "general-purpose:aa71986", |
| | | "role": "general-purpose", |
| | | "ownership": "aa71986c72a8dd1f4", |
| | | "status": "done", |
| | | "currentStep": null, |
| | | "latestUpdate": "completed", |
| | | "completedSummary": null, |
| | | "updatedAt": "2026-04-18T07:46:50.058Z" |
| | | }, |
| | | { |
| | | "name": "general-purpose:aadbd70", |
| | | "role": "general-purpose", |
| | | "ownership": "aadbd702e8fdf756c", |
| | | "status": "done", |
| | | "currentStep": null, |
| | | "latestUpdate": "completed", |
| | | "completedSummary": null, |
| | | "updatedAt": "2026-04-18T07:46:15.279Z" |
| | | } |
| | | ], |
| | | "timeline": [ |
| | | { |
| | | "id": "session-stop:ab1f8d2625bd8a667:2026-04-18T06:54:35.702Z", |
| | | "at": "2026-04-18T06:54:35.702Z", |
| | | "kind": "completion", |
| | | "agent": "general-purpose:ab1f8d2", |
| | | "detail": "completed", |
| | | "sourceKey": "session-stop:ab1f8d2625bd8a667" |
| | | }, |
| | | { |
| | | "id": "session-start:aa71986c72a8dd1f4:2026-04-18T07:45:17.089Z", |
| | | "at": "2026-04-18T07:45:17.089Z", |
| | | "kind": "update", |
| | | "agent": "general-purpose:aa71986", |
| | | "detail": "started general-purpose:aa71986", |
| | | "sourceKey": "session-start:aa71986c72a8dd1f4" |
| | | }, |
| | | { |
| | | "id": "session-start:aadbd702e8fdf756c:2026-04-18T07:45:17.153Z", |
| | | "at": "2026-04-18T07:45:17.153Z", |
| | | "kind": "update", |
| | | "agent": "general-purpose:aadbd70", |
| | | "detail": "started general-purpose:aadbd70", |
| | | "sourceKey": "session-start:aadbd702e8fdf756c" |
| | | }, |
| | | { |
| | | "id": "session-stop:aadbd702e8fdf756c:2026-04-18T07:46:15.279Z", |
| | | "at": "2026-04-18T07:46:15.279Z", |
| | | "kind": "completion", |
| | | "agent": "general-purpose:aadbd70", |
| | | "detail": "completed", |
| | | "sourceKey": "session-stop:aadbd702e8fdf756c" |
| | | }, |
| | | { |
| | | "id": "session-stop:aa71986c72a8dd1f4:2026-04-18T07:46:50.058Z", |
| | | "at": "2026-04-18T07:46:50.058Z", |
| | | "kind": "completion", |
| | | "agent": "general-purpose:aa71986", |
| | | "detail": "completed", |
| | | "sourceKey": "session-stop:aa71986c72a8dd1f4" |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "id": "session:78e67b30-83ce-4757-a175-68c3442c4534:none", |
| | | "source": "session", |
| | | "name": "none", |
| | | "objective": "Session mission", |
| | | "createdAt": "2026-04-18T08:34:11.529Z", |
| | | "updatedAt": "2026-04-18T08:52:24.581Z", |
| | | "status": "done", |
| | | "workerCount": 1, |
| | | "taskCounts": { |
| | | "total": 1, |
| | | "pending": 0, |
| | | "blocked": 0, |
| | | "inProgress": 0, |
| | | "completed": 1, |
| | | "failed": 0 |
| | | }, |
| | | "agents": [ |
| | | { |
| | | "name": "general-purpose:a6a0c97", |
| | | "role": "general-purpose", |
| | | "ownership": "a6a0c97facebc27a6", |
| | | "status": "done", |
| | | "currentStep": null, |
| | | "latestUpdate": "completed", |
| | | "completedSummary": null, |
| | | "updatedAt": "2026-04-18T08:52:24.581Z" |
| | | } |
| | | ], |
| | | "timeline": [ |
| | | { |
| | | "id": "session-start:a6a0c97facebc27a6:2026-04-18T08:34:11.529Z", |
| | | "at": "2026-04-18T08:34:11.529Z", |
| | | "kind": "update", |
| | | "agent": "general-purpose:a6a0c97", |
| | | "detail": "started general-purpose:a6a0c97", |
| | | "sourceKey": "session-start:a6a0c97facebc27a6" |
| | | }, |
| | | { |
| | | "id": "session-stop:acc34e8d2cd052b69:2026-04-18T08:42:23.674Z", |
| | | "at": "2026-04-18T08:42:23.674Z", |
| | | "kind": "completion", |
| | | "agent": "general-purpose:a6a0c97", |
| | | "detail": "completed", |
| | | "sourceKey": "session-stop:acc34e8d2cd052b69" |
| | | }, |
| | | { |
| | | "id": "session-stop:a6a0c97facebc27a6:2026-04-18T08:52:24.581Z", |
| | | "at": "2026-04-18T08:52:24.581Z", |
| | | "kind": "completion", |
| | | "agent": "general-purpose:a6a0c97", |
| | | "detail": "completed", |
| | | "sourceKey": "session-stop:a6a0c97facebc27a6" |
| | | } |
| | | ] |
| | | } |
| | | ] |
| | | } |
| | |
| | | "status": "completed", |
| | | "completed_at": "2026-04-16T13:59:54.835Z", |
| | | "duration_ms": 111569 |
| | | }, |
| | | { |
| | | "agent_id": "a1ab62633715919c8", |
| | | "agent_type": "Explore", |
| | | "started_at": "2026-04-18T06:36:59.451Z", |
| | | "parent_mode": "none", |
| | | "status": "completed", |
| | | "completed_at": "2026-04-18T06:39:31.702Z", |
| | | "duration_ms": 152251 |
| | | }, |
| | | { |
| | | "agent_id": "ae116cb86a435866d", |
| | | "agent_type": "general-purpose", |
| | | "started_at": "2026-04-18T06:49:33.031Z", |
| | | "parent_mode": "none", |
| | | "status": "completed", |
| | | "completed_at": "2026-04-18T06:50:41.503Z", |
| | | "duration_ms": 68472 |
| | | }, |
| | | { |
| | | "agent_id": "a4e061e4a6d17c682", |
| | | "agent_type": "general-purpose", |
| | | "started_at": "2026-04-18T06:49:33.090Z", |
| | | "parent_mode": "none", |
| | | "status": "completed", |
| | | "completed_at": "2026-04-18T06:52:02.047Z", |
| | | "duration_ms": 148957 |
| | | }, |
| | | { |
| | | "agent_id": "afdf6efad435c036a", |
| | | "agent_type": "general-purpose", |
| | | "started_at": "2026-04-18T06:49:33.151Z", |
| | | "parent_mode": "none", |
| | | "status": "completed", |
| | | "completed_at": "2026-04-18T06:50:50.428Z", |
| | | "duration_ms": 77277 |
| | | }, |
| | | { |
| | | "agent_id": "ab1f8d2625bd8a667", |
| | | "agent_type": "general-purpose", |
| | | "started_at": "2026-04-18T06:49:33.209Z", |
| | | "parent_mode": "none", |
| | | "status": "completed", |
| | | "completed_at": "2026-04-18T06:54:35.702Z", |
| | | "duration_ms": 302493 |
| | | }, |
| | | { |
| | | "agent_id": "a99f2fa258ad9b5a1", |
| | | "agent_type": "general-purpose", |
| | | "started_at": "2026-04-18T06:49:33.266Z", |
| | | "parent_mode": "none", |
| | | "status": "completed", |
| | | "completed_at": "2026-04-18T06:50:30.602Z", |
| | | "duration_ms": 57336 |
| | | }, |
| | | { |
| | | "agent_id": "aa71986c72a8dd1f4", |
| | | "agent_type": "general-purpose", |
| | | "started_at": "2026-04-18T07:45:17.089Z", |
| | | "parent_mode": "none", |
| | | "status": "completed", |
| | | "completed_at": "2026-04-18T07:46:50.058Z", |
| | | "duration_ms": 92969 |
| | | }, |
| | | { |
| | | "agent_id": "aadbd702e8fdf756c", |
| | | "agent_type": "general-purpose", |
| | | "started_at": "2026-04-18T07:45:17.153Z", |
| | | "parent_mode": "none", |
| | | "status": "completed", |
| | | "completed_at": "2026-04-18T07:46:15.279Z", |
| | | "duration_ms": 58126 |
| | | }, |
| | | { |
| | | "agent_id": "a6a0c97facebc27a6", |
| | | "agent_type": "general-purpose", |
| | | "started_at": "2026-04-18T08:34:11.529Z", |
| | | "parent_mode": "none", |
| | | "status": "completed", |
| | | "completed_at": "2026-04-18T08:52:24.581Z", |
| | | "duration_ms": 1093052 |
| | | } |
| | | ], |
| | | "total_spawned": 77, |
| | | "total_completed": 74, |
| | | "total_spawned": 83, |
| | | "total_completed": 83, |
| | | "total_failed": 0, |
| | | "last_updated": "2026-04-16T13:59:54.939Z" |
| | | "last_updated": "2026-04-18T14:04:59.113Z" |
| | | } |
| | |
| | | |
| | | public Task StartAsync(CancellationToken cancellationToken) |
| | | { |
| | | const string cacheKey = $"{RedisPrefix.Code}"; |
| | | |
| | | _cache.RemoveByPrefix($"{cacheKey}"); |
| | | |
| | | |
| | | |
| | | const string cacheKeyPrefix = $"{RedisPrefix.Code}:{RedisName.API}:"; |
| | | int warmedCount = 0; |
| | | |
| | | |
| | | |
| | | foreach ((string configKey, string routePath) in ApiRouteMappings) |
| | | { |
| | |
| | | warmedCount++; |
| | | } |
| | | |
| | | _logger.LogInformation("��API·�ɻ���Ԥ����ɡ�����={Count}", warmedCount); |
| | | _logger.LogInformation("APIè·¯ç±ç¼åé¢ç宿ï¼å
±å è½½={Count}ä¸ªè·¯ç±æ å°", warmedCount); |
| | | return Task.CompletedTask; |
| | | } |
| | | |
| | |
| | | "110681": "Split" |
| | | }, |
| | | "AddressRoadwayMap": { // 对åºè®¾å¤å°åæ å° |
| | | "11001": "æ¢çæºæ¢°æ", |
| | | "11010": "æ¢çæºæ¢°æ", |
| | | "11068": "注液ç»çæºæ¢°æ", |
| | | "10010": "æ¢çæºæ¢°æ", |
| | | "10030": "æ¢çæºæ¢°æ" |
| | | "11001": "HCSC1", |
| | | "11010": "HCSC1", |
| | | "11068": "GWSC1", |
| | | "10010": "GWSC1", |
| | | "10030": "GWSC1" |
| | | }, |
| | | "AddressSourceLineNoMap": { // 对åºè¾é线ç¼å·å°åæ å° |
| | | "11001": "10010", |
| | |
| | | |
| | | if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish && task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty) |
| | | { |
| | | WebResponseContent content = _robotTaskService.GetWMSRobotTask(task); |
| | | if (!content.Status) |
| | | { |
| | | return content; |
| | | } |
| | | return OutboundFinishTaskTray(task); |
| | | return _robotTaskService.GetWMSRobotTask(task); |
| | | //if (!content.Status) |
| | | //{ |
| | | // return content; |
| | | //} |
| | | //return OutboundFinishTaskTray(task); |
| | | } |
| | | |
| | | if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutExecuting) |
| | |
| | | // MaxDegreeOfParallelism = Math.Min(childDeviceCodes.Count, Environment.ProcessorCount * 2), |
| | | //}; |
| | | |
| | | //_logger.LogDebug("Executeï¼å¼å§å¹¶è¡å¤çè¾é线 {DeviceCode}ï¼åè®¾å¤æ°é: {Count}", conveyorLine.DeviceCode, childDeviceCodes.Count); |
| | | //QuartzLogger.Debug($"å¼å§å¹¶è¡å¤çè¾é线ï¼åè®¾å¤æ°é: {childDeviceCodes.Count}", conveyorLine.DeviceCode); |
| | | |
| | | // å¹¶è¡å¤çæ¯ä¸ªåè®¾å¤ |
| | | //Parallel.For(0, childDeviceCodes.Count, parallelOptions, i => |
| | | foreach (var childDeviceCode in childDeviceCodes) |
| | |
| | | using Masuit.Tools; |
| | | using WIDESEAWCS_Communicator; |
| | | using WIDESEAWCS_QuartzJob; |
| | | |
| | | namespace WIDESEAWCS_Tasks |
| | |
| | | var device = Storage.Devices.Where(d => d.DeviceName == "Aåº_䏿³¨è¾é线").FirstOrDefault(); |
| | | if (!device.IsNullOrEmpty() && device != null && device.Communicator.IsConnected) |
| | | { |
| | | var trayBarcode = device.Communicator.Read<string>(prefix); |
| | | var trayBarcode = device.Communicator.Read<string>(prefix).Trim().Replace("\u0018", "").Replace("\u0006", ""); |
| | | if(trayBarcode == "NoRead") |
| | | { |
| | | trayBarcode = ""; |
| | | } |
| | | return trayBarcode; |
| | | } |
| | | return ""; |
| | |
| | | /// <remarks> |
| | | /// é¶æ®µå®ä¹ï¼ |
| | | /// 0: æªå¼å§ |
| | | /// 1: 忣叏çµè¯ï¼æµåBï¼ / ååçµè¯ï¼æµåAï¼ |
| | | /// 2: æ¾æ£å¸¸çµè¯ï¼æµåBï¼ / æ¾åçµè¯ï¼æµåAï¼ |
| | | /// 3: ååçµè¯ï¼æµåB Phase2ï¼ |
| | | /// 4: æ¾åçµè¯å°5å·ä½ï¼æµåB Phase2ï¼ |
| | | /// 1: 忣叏çµè¯ï¼ä¸¤æµåç¸åï¼ |
| | | /// 2: æ¾æ£å¸¸çµè¯å°ç®æ æçï¼ä¸¤æµåç¸åï¼ |
| | | /// 3: æµåAï¼æ£å¸¸åå®â空æçååºâååçµè¯ä»5å·ä½ / æµåBï¼æ£å¸¸åå®âååçµè¯ä»æºå°å |
| | | /// 4: æµåAï¼æ¾åçµè¯å°ç®æ æç / æµåBï¼æ¾åçµè¯å°5å·ä½ |
| | | /// 5: æµåAï¼åæ¾å®âallputfinishedå
¥åºHCSC1 / æµåBï¼ååå®â空æçååºHCSC1+ç»çå
¥åºGWSC1 |
| | | /// </remarks> |
| | | public int ChangePalletPhase { get; set; } |
| | | |
| | |
| | | /// æå¸¦çº¿ä¸çµè¯æ«ç æ¯å¦NGã |
| | | /// </remarks> |
| | | public bool IsScanNG { get; set; } = false; |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// æ¯å¦çµè¯å°ä½ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// æå¸¦çº¿ä¸çµè¯æ¯å¦å°ä½ã |
| | | /// </remarks> |
| | | public bool BatteryArrived { get; set; } = false; |
| | | } |
| | | } |
| | |
| | | /// <param name="task">è¦ä¸åçä»»å¡å¯¹è±¡</param> |
| | | /// <param name="state">æºå¨äººå½åç¶æ</param> |
| | | /// <param name="isScanNG">æ¯å¦æ«ç NG</param> |
| | | public async Task SendSocketRobotPickAsync(Dt_RobotTask task, RobotSocketState state, bool isScanNG) |
| | | public async Task SendSocketRobotPickAsync(Dt_RobotTask task, RobotSocketState state, bool isScanNG = false) |
| | | { |
| | | // æå»ºåè´§æä»¤ï¼æ ¼å¼ï¼Pickbattery,{æºå°å} |
| | | string taskString = $"Pickbattery,{task.RobotSourceAddress}"; |
| | |
| | | { |
| | | _logger.LogError("ä¸åæ¹æ¬¡åè´§æä»¤å¤±è´¥ï¼æä»¤: {TaskString}ï¼è®¾å¤: {DeviceName}", taskString, state.RobotCrane?.DeviceName); |
| | | QuartzLogger.Error($"ä¸åæ¹æ¬¡åè´§æä»¤å¤±è´¥ï¼æä»¤: {taskString}", state.RobotCrane?.DeviceName); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ä¸ååçµè¯åè´§æä»¤ï¼å¸¦æ¹æ¬¡æ ¼å¼åæ»æ°ï¼ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// åé顺åºï¼ |
| | | /// 1. PickTotalNum,{N} -- çå®çµè¯æ»æ° |
| | | /// 2. Pickbattery,5,{start}-{end} -- æ¹æ¬¡åè´§æä»¤ï¼åºå®ä»5å·ä½åï¼ |
| | | /// |
| | | /// ä¸åæååæ´æ°ä»»å¡ç¶æä¸º"æºå¨äººæ§è¡ä¸"ã |
| | | /// </remarks> |
| | | /// <param name="task">è¦ä¸åçä»»å¡å¯¹è±¡</param> |
| | | /// <param name="state">æºå¨äººå½åç¶æ</param> |
| | | /// <param name="batchStart">æ¹æ¬¡èµ·å§ç¼å·</param> |
| | | /// <param name="batchEnd">æ¹æ¬¡ç»æç¼å·</param> |
| | | public async Task SendFakeBatteryPickWithBatchAsync(Dt_RobotTask task, RobotSocketState state, int batchStart, int batchEnd) |
| | | { |
| | | // å
åéæ»æ°æä»¤ |
| | | string totalNumCmd = $"PickTotalNum,{task.RobotTaskTotalNum}"; |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, totalNumCmd); |
| | | |
| | | // ååéæ¹æ¬¡åè´§æä»¤ï¼åçµè¯åºå®ä»5å·ä½åï¼ |
| | | string range = batchEnd == 0 ? $"{batchStart}-0" : $"{batchStart}-{batchEnd}"; |
| | | string taskString = $"Pickbattery,5,{range}"; |
| | | |
| | | bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString); |
| | | |
| | | if (result) |
| | | { |
| | | _logger.LogInformation("ä¸ååçµè¯æ¹æ¬¡åè´§æä»¤æåï¼æä»¤: {TaskString}ï¼æ¹æ¬¡: {Range}ï¼è®¾å¤: {DeviceName}", |
| | | taskString, range, state.RobotCrane?.DeviceName); |
| | | QuartzLogger.Info($"ä¸ååçµè¯æ¹æ¬¡åè´§æä»¤æåï¼æä»¤: {taskString}ï¼æ¹æ¬¡: {range}", state.RobotCrane?.DeviceName); |
| | | |
| | | task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode(); |
| | | state.CurrentTask = task; |
| | | |
| | | if (_stateManager.TryUpdateStateSafely(state.IPAddress, state)) |
| | | { |
| | | await _robotTaskService.UpdateRobotTaskAsync(task); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | _logger.LogError("ä¸ååçµè¯æ¹æ¬¡åè´§æä»¤å¤±è´¥ï¼æä»¤: {TaskString}ï¼è®¾å¤: {DeviceName}", taskString, state.RobotCrane?.DeviceName); |
| | | QuartzLogger.Error($"ä¸ååçµè¯æ¹æ¬¡åè´§æä»¤å¤±è´¥ï¼æä»¤: {taskString}", state.RobotCrane?.DeviceName); |
| | | } |
| | | } |
| | | |
| | |
| | | Channel = x, |
| | | |
| | | // çµæ± æ¡ç ï¼å¦æç¶æä¸ææ¡ç å表ï¼å对åºä½ç½®çæ¡ç ï¼å¦å为空 |
| | | CellBarcode = state.CellBarcode?.Count > 0 ? state.CellBarcode[x - 1] : "" |
| | | //CellBarcode = state.CellBarcode?.Count > 0 ? state.CellBarcode[x - 1] : "" |
| | | CellBarcode = state.CellBarcode[idx].ToString() |
| | | }) |
| | | .ToList() |
| | | }; |
| | |
| | | /// 彿çä»»å¡å
¨é¨å宿¶è°ç¨ï¼ä¸æ¬¡æ§ä¸ä¼ æ´ä¸ªæççè§£ç»æ°æ®å° MESã |
| | | /// </remarks> |
| | | /// <param name="palletCode">æºæçå·</param> |
| | | /// <param name="deviceName">设å¤åç§°ï¼ç¨äºä¼ éå° WMS</param> |
| | | /// <returns>HTTP ååºç»æ</returns> |
| | | public HttpResponseResult<WebResponseContent> PostSplitPalletConfirmAsync(string palletCode) |
| | | public HttpResponseResult<WebResponseContent> PostSplitPalletConfirmAsync(string palletCode, string deviceName) |
| | | { |
| | | var request = new { PalletCode = palletCode }; |
| | | var request = new { PalletCode = palletCode, DeviceName = deviceName }; |
| | | return _httpClientHelper.Post<WebResponseContent>(nameof(ConfigKey.SplitPalletConfirm), request.ToJson()); |
| | | } |
| | | |
| | |
| | | /// å½ç»çä»»å¡å
¨é¨æ¾å®æ¶è°ç¨ï¼ä¸æ¬¡æ§ä¸ä¼ æ´ä¸ªæççç»å®æ°æ®å° MESã |
| | | /// </remarks> |
| | | /// <param name="palletCode">ç®æ æçå·</param> |
| | | /// <param name="deviceName">设å¤åç§°ï¼ç¨äºä¼ éå° WMS</param> |
| | | /// <returns>HTTP ååºç»æ</returns> |
| | | public HttpResponseResult<WebResponseContent> PostGroupPalletConfirmAsync(string palletCode) |
| | | public HttpResponseResult<WebResponseContent> PostGroupPalletConfirmAsync(string palletCode, string deviceName) |
| | | { |
| | | var request = new { PalletCode = palletCode }; |
| | | var request = new { PalletCode = palletCode, DeviceName = deviceName }; |
| | | return _httpClientHelper.Post<WebResponseContent>(nameof(ConfigKey.GroupPalletConfirm), request.ToJson()); |
| | | } |
| | | } |
| | |
| | | using System.Net.Sockets; |
| | | using WIDESEAWCS_Common.HttpEnum; |
| | | using WIDESEAWCS_Common.TaskEnum; |
| | | using WIDESEAWCS_DTO.TaskInfo; |
| | | using WIDESEAWCS_ITaskInfoService; |
| | | using WIDESEAWCS_Model.Models; |
| | | using WIDESEAWCS_Tasks.Workflow.Abstractions; |
| | |
| | | // æ¢çä»»å¡ï¼æ ¹æ®é¶æ®µåºåå¤ç |
| | | if (state.ChangePalletPhase == 2) |
| | | { |
| | | if (isFlowA) |
| | | { |
| | | // æµåA Phase2ï¼æ¾åçµè¯å°ç®æ æçï¼ä¸è°ç¨ APIï¼ä¸éå¢è®¡æ° |
| | | // ä»
æ´æ°ç¶æ |
| | | } |
| | | else |
| | | { |
| | | // æµåB Phase2ï¼æ¾æ£å¸¸çµè¯ï¼éå¢è®¡æ° |
| | | state.RobotTaskTotalNum += positions.Length; |
| | | if (task != null) |
| | | task.RobotTaskTotalNum -= positions.Length; |
| | | // Phase 2ï¼æ¾æ£å¸¸çµè¯å°ç®æ æç宿ï¼éå¢è®¡æ° |
| | | state.RobotTaskTotalNum += positions.Length; |
| | | if (task != null) |
| | | task.RobotTaskTotalNum -= positions.Length; |
| | | |
| | | // æå»ºåºå DTO å¹¶è°ç¨ ChangePalletAsync API |
| | | var stockDTO = RobotTaskProcessor.BuildStockDTO(state, positions); |
| | | var result = _taskProcessor.PostGroupPalletAsync(nameof(ConfigKey.ChangePalletAsync), stockDTO); |
| | | putSuccess = result.Data.Status && result.IsSuccess; |
| | | } |
| | | // 两æµååè°ç¨æ¢ç API |
| | | var stockDTO = RobotTaskProcessor.BuildStockDTO(state, positions); |
| | | var result = _taskProcessor.PostGroupPalletAsync(nameof(ConfigKey.ChangePalletAsync), stockDTO); |
| | | putSuccess = result.Data.Status && result.IsSuccess; |
| | | |
| | | // åå Phase 1ï¼ç»§ç»åæ£å¸¸çµè¯ |
| | | state.ChangePalletPhase = 1; |
| | | } |
| | | else if (state.ChangePalletPhase == 4) |
| | | { |
| | | // æµåB Phase4ï¼æ¾åçµè¯å°5å·ä½ï¼ä¸è°ç¨ APIï¼ä¸éå¢è®¡æ°ï¼éæ¾ç¹ä½ |
| | | _fakeBatteryPositionService.MarkAsAvailable(positions.ToList()); |
| | | if (isFlowA) |
| | | { |
| | | // æµåAï¼æ¾åçµè¯å°ç®æ æçï¼ä»
éå¢è®¡æ°ï¼ä¸è°ç¨ API |
| | | state.RobotTaskTotalNum += positions.Length; |
| | | if (task != null) |
| | | task.RobotTaskTotalNum -= positions.Length; |
| | | } |
| | | else |
| | | { |
| | | // æµåBï¼æ¾åçµè¯å°5å·ä½ï¼éæ¾ç¹ä½ |
| | | _fakeBatteryPositionService.MarkAsAvailable(positions.ToList()); |
| | | } |
| | | |
| | | // åå Phase 3ï¼ç»§ç»ååçµè¯ |
| | | state.ChangePalletPhase = 3; |
| | | } |
| | | else |
| | | { |
| | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | state.CurrentAction = "Putting"; |
| | | return true; |
| | | |
| | | // æ¯å¦çµè¯å°ä½ |
| | | case "batteryarrived": |
| | | state.BatteryArrived = true; |
| | | return true; |
| | | |
| | | // ==================== å
¨é¨å®æå½ä»¤ ==================== |
| | | |
| | | // å
¨é¨åè´§å®æ |
| | |
| | | // 夿任å¡ç±»å |
| | | var robotTaskType = (RobotTaskTypeEnum)currentTask.RobotTaskType; |
| | | |
| | | // æ¢çä»»å¡ï¼ä»
彿æé¶æ®µå®ææ¶æå¤çå
¥åº |
| | | // æ¢çä»»å¡ï¼æ ¹æ®é¶æ®µåºåå¤ç |
| | | if (robotTaskType == RobotTaskTypeEnum.ChangePallet) |
| | | { |
| | | if (state.ChangePalletPhase == 0) |
| | | // è°ç¨æ¹éæç确认æ¥å£ |
| | | var sourcePallet = state.CurrentTask.RobotSourceAddressPalletCode; |
| | | var confirmResult = _taskProcessor.PostSplitPalletConfirmAsync(sourcePallet, state.RobotCrane?.DeviceName); |
| | | if (!confirmResult.IsSuccess) |
| | | { |
| | | // è°ç¨æ¹éæç确认æ¥å£ï¼æ¢çåå®é¶æ®µï¼ |
| | | var sourcePallet = state.CurrentTask.RobotSourceAddressPalletCode; |
| | | var confirmResult = _taskProcessor.PostSplitPalletConfirmAsync(sourcePallet); |
| | | if (!confirmResult.IsSuccess) |
| | | { |
| | | QuartzLogger.Error($"æ¹éæç确认失败: {confirmResult.ErrorMessage}", state.RobotCrane?.DeviceName ?? "Unknown"); |
| | | } |
| | | |
| | | // ææé¶æ®µå®æï¼å¤çå
¥åº |
| | | if (await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: true)) |
| | | { |
| | | // å
¥åºæåï¼å é¤ä»»å¡è®°å½ |
| | | _taskProcessor.DeleteTask(currentTask.RobotTaskId); |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Swap,diskFinished"); |
| | | QuartzLogger.Info($"åéæ¶æ¯ï¼ãSwap,diskFinishedã", state.RobotCrane.DeviceName); |
| | | |
| | | // éç½®æ¹æ¬¡ç¶æ |
| | | state.ChangePalletPhase = 0; |
| | | state.CurrentBatchIndex = 1; |
| | | state.IsInFakeBatteryMode = false; |
| | | return true; |
| | | } |
| | | QuartzLogger.Error($"æ¹éæç确认失败: {confirmResult.ErrorMessage}", state.RobotCrane?.DeviceName ?? "Unknown"); |
| | | return false; |
| | | } |
| | | // ä¸é´é¶æ®µä¸å¤çï¼ä»
æ´æ°ç¶æ |
| | | |
| | | if (state.ChangePalletPhase == 5) |
| | | { |
| | | // FlowB æç»é¶æ®µï¼åçµè¯åå®ï¼æºç©ºæçååº HCSC1 |
| | | if (!await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: true)) |
| | | { |
| | | return false; |
| | | } |
| | | |
| | | if (_taskProcessor.DeleteTask(currentTask.RobotTaskId) != true) |
| | | { |
| | | QuartzLogger.Error($"allpickfinishedï¼å é¤ä»»å¡è®°å½å¤±è´¥ï¼ä»»å¡å·: {currentTask.RobotTaskNum}", state.RobotCrane?.DeviceName ?? "Unknown"); |
| | | return false; |
| | | } |
| | | |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Swap,diskFinished"); |
| | | QuartzLogger.Info($"åéæ¶æ¯ï¼ãSwap,diskFinishedã", state.RobotCrane.DeviceName); |
| | | |
| | | state.CurrentTask = null; |
| | | state.RobotTaskTotalNum = 0; |
| | | state.CellBarcode = new List<string>(); |
| | | state.ChangePalletPhase = 0; |
| | | state.CurrentBatchIndex = 1; |
| | | state.IsInFakeBatteryMode = false; |
| | | return true; |
| | | } |
| | | else if (state.ChangePalletPhase != 0) |
| | | { |
| | | // FlowA ä¸é´é¶æ®µï¼æ£å¸¸çµè¯åå®ï¼æºç©ºæçååº GWSC1 |
| | | // ä¸å é¤ä»»å¡ï¼ä¸éç½®ç¶æï¼ç»§ç» Phase 3-4 åçµè¯æµç¨ |
| | | if (!await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: true)) |
| | | { |
| | | return false; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | // Phase == 0: éæ¹æ¬¡æ¨¡å¼ï¼ç®æ æ»æ°==48ï¼ |
| | | if (!await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: true)) |
| | | { |
| | | return false; |
| | | } |
| | | |
| | | if (_taskProcessor.DeleteTask(currentTask.RobotTaskId) != true) |
| | | { |
| | | QuartzLogger.Error($"allpickfinishedï¼å é¤ä»»å¡è®°å½å¤±è´¥ï¼ä»»å¡å·: {currentTask.RobotTaskNum}", state.RobotCrane?.DeviceName ?? "Unknown"); |
| | | return false; |
| | | } |
| | | |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Swap,diskFinished"); |
| | | QuartzLogger.Info($"åéæ¶æ¯ï¼ãSwap,diskFinishedã", state.RobotCrane.DeviceName); |
| | | |
| | | state.ChangePalletPhase = 0; |
| | | state.CurrentBatchIndex = 1; |
| | | state.IsInFakeBatteryMode = false; |
| | | return true; |
| | | } |
| | | |
| | |
| | | { |
| | | // è°ç¨æ¹éæç确认æ¥å£ |
| | | var sourcePallet = state.CurrentTask.RobotSourceAddressPalletCode; |
| | | var confirmResult = _taskProcessor.PostSplitPalletConfirmAsync(sourcePallet); |
| | | var confirmResult = _taskProcessor.PostSplitPalletConfirmAsync(sourcePallet, state.RobotCrane?.DeviceName); |
| | | if (!confirmResult.IsSuccess) |
| | | { |
| | | QuartzLogger.Error($"æ¹éæç确认失败: {confirmResult.ErrorMessage}", state.RobotCrane?.DeviceName ?? "Unknown"); |
| | | return false; |
| | | } |
| | | |
| | | if (await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: true)) |
| | | if (!await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: true)) |
| | | { |
| | | // å
¥åºæåï¼å é¤ä»»å¡è®°å½ |
| | | _taskProcessor.DeleteTask(currentTask.RobotTaskId); |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Swap,diskFinished"); |
| | | QuartzLogger.Info($"åéæ¶æ¯ï¼ãSwap,diskFinishedã", state.RobotCrane.DeviceName); |
| | | return true; |
| | | return false; |
| | | } |
| | | |
| | | // å
¥åºæåï¼å é¤ä»»å¡è®°å½ |
| | | if (_taskProcessor.DeleteTask(currentTask.RobotTaskId) != true) |
| | | { |
| | | QuartzLogger.Error($"allpickfinishedï¼å é¤ä»»å¡è®°å½å¤±è´¥ï¼ä»»å¡å·: {currentTask.RobotTaskNum}", state.RobotCrane?.DeviceName ?? "Unknown"); |
| | | return false; |
| | | } |
| | | |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Swap,diskFinished"); |
| | | QuartzLogger.Info($"åéæ¶æ¯ï¼ãSwap,diskFinishedã", state.RobotCrane.DeviceName); |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | |
| | | // 夿任å¡ç±»å |
| | | var robotTaskType = (RobotTaskTypeEnum)currentTask.RobotTaskType; |
| | | |
| | | // æ¢çä»»å¡ï¼ä»
彿æé¶æ®µå®ææ¶æå¤çå
¥åº |
| | | // æ¢çä»»å¡ï¼æ ¹æ®é¶æ®µåºåå¤ç |
| | | if (robotTaskType == RobotTaskTypeEnum.ChangePallet) |
| | | { |
| | | if (state.ChangePalletPhase == 0) |
| | | // è°ç¨æ¹éç»ç确认æ¥å£ |
| | | var targetPallet = state.CurrentTask.RobotTargetAddressPalletCode; |
| | | var confirmResult = _taskProcessor.PostGroupPalletConfirmAsync(targetPallet, state.RobotCrane?.DeviceName); |
| | | if (!confirmResult.IsSuccess) |
| | | { |
| | | // è°ç¨æ¹éç»ç确认æ¥å£ï¼æ¢çæ¾å®é¶æ®µï¼ |
| | | var targetPallet = state.CurrentTask.RobotTargetAddressPalletCode; |
| | | var confirmResult = _taskProcessor.PostGroupPalletConfirmAsync(targetPallet); |
| | | if (!confirmResult.IsSuccess) |
| | | { |
| | | QuartzLogger.Error($"æ¹éç»ç确认失败: {confirmResult.ErrorMessage}", state.RobotCrane?.DeviceName ?? "Unknown"); |
| | | } |
| | | |
| | | // ææé¶æ®µå®æï¼å¤çå
¥åº |
| | | if (await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: false)) |
| | | { |
| | | // å
¥åºæåï¼å é¤ä»»å¡è®°å½ |
| | | _taskProcessor.DeleteTask(currentTask.RobotTaskId); |
| | | |
| | | // æ¸
çç¶æï¼ä¸ºä¸ä¸ä¸ªä»»å¡ååå¤ |
| | | state.CurrentTask = null; // æ¸
é¤å½åä»»å¡ |
| | | state.RobotTaskTotalNum = 0; // é置任å¡è®¡æ° |
| | | state.CellBarcode = new List<string>(); // æ¸
空æ¡ç å表 |
| | | |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Group,diskFinished"); |
| | | QuartzLogger.Info($"åéæ¶æ¯ï¼ãGroup,diskFinishedã", state.RobotCrane.DeviceName); |
| | | |
| | | // éç½®æ¹æ¬¡ç¶æ |
| | | state.ChangePalletPhase = 0; |
| | | state.CurrentBatchIndex = 1; |
| | | state.IsInFakeBatteryMode = false; |
| | | return true; |
| | | } |
| | | QuartzLogger.Error($"æ¹éç»ç确认失败: {confirmResult.ErrorMessage}", state.RobotCrane?.DeviceName ?? "Unknown"); |
| | | return false; |
| | | } |
| | | // ä¸é´é¶æ®µä¸å¤çï¼ä»
æ´æ°ç¶æ |
| | | |
| | | if (state.ChangePalletPhase == 5) |
| | | { |
| | | // FlowA æç»é¶æ®µï¼åçµè¯æ¾å®ï¼ç®æ æç满48å
¥åº HCSC1 |
| | | if (!await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: false)) |
| | | { |
| | | return false; |
| | | } |
| | | |
| | | if (_taskProcessor.DeleteTask(currentTask.RobotTaskId) != true) |
| | | { |
| | | QuartzLogger.Error($"allputfinishedï¼å é¤ä»»å¡è®°å½å¤±è´¥ï¼ä»»å¡å·: {currentTask.RobotTaskNum}", state.RobotCrane?.DeviceName ?? "Unknown"); |
| | | return false; |
| | | } |
| | | |
| | | state.CurrentTask = null; |
| | | state.RobotTaskTotalNum = 0; |
| | | state.CellBarcode = new List<string>(); |
| | | |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Swap,diskFinished"); |
| | | QuartzLogger.Info($"åéæ¶æ¯ï¼ãSwap,diskFinishedã", state.RobotCrane.DeviceName); |
| | | |
| | | state.ChangePalletPhase = 0; |
| | | state.CurrentBatchIndex = 1; |
| | | state.IsInFakeBatteryMode = false; |
| | | return true; |
| | | } |
| | | else if (state.ChangePalletPhase != 0) |
| | | { |
| | | // FlowB ä¸é´é¶æ®µï¼æ£å¸¸çµè¯æ¾å®ï¼æè´§æçç»çå
¥åº GWSC1 |
| | | // ä¸å é¤ä»»å¡ï¼ä¸éç½®ç¶æï¼ç»§ç» Phase 3-4 åçµè¯æµç¨ |
| | | if (!await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: false)) |
| | | { |
| | | return false; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | // Phase == 0: éæ¹æ¬¡æ¨¡å¼ï¼ç®æ æ»æ°==48ï¼ |
| | | if (!await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: false)) |
| | | { |
| | | return false; |
| | | } |
| | | |
| | | if (_taskProcessor.DeleteTask(currentTask.RobotTaskId) != true) |
| | | { |
| | | QuartzLogger.Error($"allputfinishedï¼å é¤ä»»å¡è®°å½å¤±è´¥ï¼ä»»å¡å·: {currentTask.RobotTaskNum}", state.RobotCrane?.DeviceName ?? "Unknown"); |
| | | return false; |
| | | } |
| | | |
| | | state.CurrentTask = null; |
| | | state.RobotTaskTotalNum = 0; |
| | | state.CellBarcode = new List<string>(); |
| | | |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Swap,diskFinished"); |
| | | QuartzLogger.Info($"åéæ¶æ¯ï¼ãSwap,diskFinishedã", state.RobotCrane.DeviceName); |
| | | |
| | | state.ChangePalletPhase = 0; |
| | | state.CurrentBatchIndex = 1; |
| | | state.IsInFakeBatteryMode = false; |
| | | return true; |
| | | } |
| | | |
| | |
| | | { |
| | | // è°ç¨æ¹éç»ç确认æ¥å£ |
| | | var targetPallet = state.CurrentTask.RobotTargetAddressPalletCode; |
| | | var confirmResult = _taskProcessor.PostGroupPalletConfirmAsync(targetPallet); |
| | | var confirmResult = _taskProcessor.PostGroupPalletConfirmAsync(targetPallet, state.RobotCrane?.DeviceName); |
| | | if (!confirmResult.IsSuccess) |
| | | { |
| | | QuartzLogger.Error($"æ¹éç»ç确认失败: {confirmResult.ErrorMessage}", state.RobotCrane?.DeviceName ?? "Unknown"); |
| | | return false; |
| | | } |
| | | |
| | | // å¤çå
¥åºä»»å¡åä¼ |
| | | // useSourceAddress: false 表示使ç¨ç®æ å°åï¼ç»çåºæ¯ï¼ |
| | | if (await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: false)) |
| | | if (!await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: false)) |
| | | { |
| | | // å
¥åºæåï¼å é¤ä»»å¡è®°å½ |
| | | _taskProcessor.DeleteTask(currentTask.RobotTaskId); |
| | | |
| | | // æ¸
çç¶æï¼ä¸ºä¸ä¸ä¸ªä»»å¡ååå¤ |
| | | state.CurrentTask = null; // æ¸
é¤å½åä»»å¡ |
| | | state.RobotTaskTotalNum = 0; // é置任å¡è®¡æ° |
| | | state.CellBarcode = new List<string>(); // æ¸
空æ¡ç å表 |
| | | |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Group,diskFinished"); |
| | | QuartzLogger.Info($"åéæ¶æ¯ï¼ãGroup,diskFinishedã", state.RobotCrane.DeviceName); |
| | | return true; |
| | | return false; |
| | | } |
| | | |
| | | // å
¥åºæåï¼å é¤ä»»å¡è®°å½ |
| | | if (_taskProcessor.DeleteTask(currentTask.RobotTaskId) != true) |
| | | { |
| | | QuartzLogger.Error($"allputfinishedï¼å é¤ä»»å¡è®°å½å¤±è´¥ï¼ä»»å¡å·: {currentTask.RobotTaskNum}", state.RobotCrane?.DeviceName ?? "Unknown"); |
| | | return false; |
| | | } |
| | | |
| | | // æ¸
çç¶æï¼ä¸ºä¸ä¸ä¸ªä»»å¡ååå¤ |
| | | state.CurrentTask = null; // æ¸
é¤å½åä»»å¡ |
| | | state.RobotTaskTotalNum = 0; // é置任å¡è®¡æ° |
| | | state.CellBarcode = new List<string>(); // æ¸
空æ¡ç å表 |
| | | |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, $"Group,diskFinished"); |
| | | QuartzLogger.Info($"åéæ¶æ¯ï¼ãGroup,diskFinishedã", state.RobotCrane.DeviceName); |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | |
| | | // 1. è¿è¡æ¨¡å¼ä¸ºèªå¨ï¼2ï¼ |
| | | // 2. æ§å¶æ¨¡å¼ä¸ºå®¢æ·ç«¯æ§å¶ï¼1ï¼ |
| | | // 3. è¿è¡ç¶ææ¯ Running |
| | | if (latestState.RobotRunMode == 2 /*&& latestState.RobotControlMode == 1*/ && latestState.OperStatus == "Running" && latestState.Homed == "Homed") |
| | | if (latestState.RobotRunMode == 2 /*&& latestState.RobotControlMode == 1*/ && latestState.OperStatus == "Running" && (latestState.Homed == "Homed" || latestState.Homed.IsNullOrEmpty())) |
| | | { |
| | | // ========== åè´§å®æåçæ¾è´§å¤ç ========== |
| | | // æ¡ä»¶ï¼ |
| | |
| | | // - æèä¸æç©æï¼RobotArmObject == 1ï¼ |
| | | // - ä»»å¡ç¶æä¸º RobotPickFinishï¼å·²è®°å½åè´§å®æï¼ |
| | | if ((latestState.CurrentAction == "PickFinished" || latestState.CurrentAction == "AllPickFinished") |
| | | && latestState.RobotArmObject == 1 |
| | | && (latestState.RobotArmObject.IsNullOrEmpty() || latestState.RobotArmObject == 1) |
| | | && task.RobotTaskState == TaskRobotStatusEnum.RobotPickFinish.GetHashCode()) |
| | | { |
| | | _logger.LogInformation("ExecuteAsyncï¼æ»¡è¶³æ¾è´§æ¡ä»¶ï¼å¼å§å¤çåè´§å®æï¼ä»»å¡å·: {TaskNum}", task.RobotTaskNum); |
| | | QuartzLogger.Info($"ExecuteAsyncï¼æ»¡è¶³æ¾è´§æ¡ä»¶ï¼å¼å§å¤çåè´§å®æ", latestState.RobotCrane?.DeviceName ?? ipAddress); |
| | | _logger.LogInformation("ExecuteAsyncï¼æ»¡è¶³æ¾è´§æ¡ä»¶ï¼å¼å§ä¸åæ¾è´§ä»»å¡ï¼ä»»å¡å·: {TaskNum}", task.RobotTaskNum); |
| | | QuartzLogger.Info($"ExecuteAsyncï¼æ»¡è¶³æ¾è´§æ¡ä»¶ï¼å¼å§ä¸åæ¾è´§ä»»å¡", latestState.RobotCrane?.DeviceName ?? ipAddress); |
| | | // åéæ¾è´§æä»¤ |
| | | await HandlePickFinishedStateAsync(task, ipAddress); |
| | | } |
| | |
| | | // - æè䏿 ç©æï¼RobotArmObject == 0ï¼ |
| | | // - ä»»å¡ç¶æä¸º RobotPutFinish æä¸æ¯ RobotExecuting |
| | | else if ((latestState.CurrentAction == "PutFinished" || latestState.CurrentAction == "AllPutFinished" || latestState.CurrentAction.IsNullOrEmpty()) |
| | | && latestState.RobotArmObject == 0 |
| | | && (latestState.RobotArmObject.IsNullOrEmpty() || latestState.RobotArmObject == 0) |
| | | && (task.RobotTaskState == TaskRobotStatusEnum.RobotPutFinish.GetHashCode() |
| | | || task.RobotTaskState != TaskRobotStatusEnum.RobotExecuting.GetHashCode())) |
| | | { |
| | | _logger.LogInformation("ExecuteAsyncï¼æ»¡è¶³åè´§æ¡ä»¶ï¼å¼å§å¤çæ¾è´§å®æï¼ä»»å¡å·: {TaskNum}", task.RobotTaskNum); |
| | | QuartzLogger.Info($"ExecuteAsyncï¼æ»¡è¶³åè´§æ¡ä»¶ï¼å¼å§å¤çæ¾è´§å®æ", latestState.RobotCrane?.DeviceName ?? ipAddress); |
| | | _logger.LogInformation("ExecuteAsyncï¼æ»¡è¶³åè´§æ¡ä»¶ï¼å¼å§ä¸ååè´§ä»»å¡ï¼ä»»å¡å·: {TaskNum}", task.RobotTaskNum); |
| | | QuartzLogger.Info($"ExecuteAsyncï¼æ»¡è¶³åè´§æ¡ä»¶ï¼å¼å§ä¸ååè´§ä»»å¡", latestState.RobotCrane?.DeviceName ?? ipAddress); |
| | | // åéåè´§æä»¤ |
| | | await HandlePutFinishedStateAsync(task, ipAddress); |
| | | } |
| | |
| | | |
| | | var state = _stateManager.GetState(ipAddress); |
| | | |
| | | // æ¢çä»»å¡ä½¿ç¨æ¹æ¬¡æ ¼å¼ |
| | | // æ¢ç任塿¹æ¬¡æ¨¡å¼ |
| | | if (task.RobotTaskType == RobotTaskTypeEnum.ChangePallet.GetHashCode()) |
| | | { |
| | | int targetNormalCount = task.RobotTaskTotalNum; |
| | |
| | | |
| | | bool isFlowA = task.RobotSourceAddressLineCode is "11001" or "11010"; |
| | | |
| | | // æµåA Phase 2ï¼æ¾åçµè¯å°ç®æ æç |
| | | if (isFlowA && state?.ChangePalletPhase == 2) |
| | | // ==================== Phase 2: æ¾æ£å¸¸çµè¯å°ç®æ æçï¼ä¸¤æµåç¸åï¼==================== |
| | | // PickFinished å°è¾¾ï¼Phase 1 ç Pick å½ä»¤å®æï¼ç°å¨ä¸å Put å½ä»¤æ¾æ£å¸¸çµè¯ |
| | | if (state?.ChangePalletPhase == 2) |
| | | { |
| | | int remaining = 48 - currentCompletedCount; |
| | | if (remaining <= 0) return; |
| | | int remainingNormal = targetNormalCount - currentCompletedCount; |
| | | if (remainingNormal <= 0) |
| | | { |
| | | // æ£å¸¸çµè¯å
¨é¨æ¾å®ï¼çå¾
HandlePutFinishedAsync åæ¢å° Phase 3 |
| | | return; |
| | | } |
| | | |
| | | int batchStart = targetNormalCount + 1 + (state.CurrentBatchIndex - 1); |
| | | int putCount = Math.Min(4, remaining); |
| | | int batchStart = (currentCompletedCount / 4) * 4 + 1; |
| | | int putCount = Math.Min(4, remainingNormal); |
| | | var (start, end) = _taskProcessor.BuildBatchRange(batchStart, putCount); |
| | | |
| | | await _taskProcessor.SendPutWithBatchAsync(task, state, task.RobotTargetAddress, start, end); |
| | | |
| | | // Phase ä¿æä¸º 2ï¼ç HandlePutFinishedAsync å¤ç宿¾è´§è®¡æ°åååå Phase 1 |
| | | _stateManager.TryUpdateStateSafely(ipAddress, state); |
| | | return; |
| | | } |
| | | |
| | | // æµåB Phase 4ï¼æ¾åçµè¯å°5å·ä½ |
| | | if (!isFlowA && state?.ChangePalletPhase == 4) |
| | | // ==================== Phase 4: æ¾åçµè¯ï¼ä¸¤æµåååï¼==================== |
| | | // PickFinished å°è¾¾ï¼Phase 3 ç Pick å½ä»¤å®æï¼ç°å¨ä¸å Put å½ä»¤æ¾åçµè¯ |
| | | if (state?.ChangePalletPhase == 4) |
| | | { |
| | | int fakeCount = 48 - targetNormalCount; |
| | | int completedFake = Math.Max(0, currentCompletedCount - targetNormalCount); |
| | | int remainingFake = fakeCount - completedFake; |
| | | |
| | | if (remainingFake <= 0) return; |
| | | |
| | | var positions = _taskProcessor.GetNextAvailableFakeBatteryPositions(Math.Min(4, remainingFake)); |
| | | if (positions.Count == 0) |
| | | if (remainingFake <= 0) |
| | | { |
| | | _logger.LogError("HandlePickFinishedStateAsyncï¼æ å¯ç¨åçµè¯ç¹ä½ï¼ä»»å¡å·: {TaskNum}", task.RobotTaskNum); |
| | | // åçµè¯å
¨é¨æ¾å®ï¼çå¾
allputfinished 触å Phase 5 å
¥åº |
| | | return; |
| | | } |
| | | |
| | | int start = positions.Min(); |
| | | int end = positions.Max(); |
| | | |
| | | await _taskProcessor.SendPutWithBatchAsync(task, state, "5", start, end); |
| | | return; |
| | | } |
| | | |
| | | // æµåB Phase 2ï¼æ¾æ£å¸¸çµè¯å°ç®æ æç |
| | | if (!isFlowA && state?.ChangePalletPhase == 2) |
| | | { |
| | | int remainingNormal = targetNormalCount - currentCompletedCount; |
| | | if (remainingNormal <= 0) return; |
| | | |
| | | int batchStart = ((currentCompletedCount - 1) / 4) * 4 + 1; |
| | | int putCount = Math.Min(4, remainingNormal); |
| | | var (start, end) = _taskProcessor.BuildBatchRange(batchStart, putCount); |
| | | |
| | | await _taskProcessor.SendPutWithBatchAsync(task, state, task.RobotTargetAddress, start, end); |
| | | return; |
| | | } |
| | | |
| | | // é»è®¤ï¼ä½¿ç¨åææ ¼å¼ |
| | | taskString = $"Putbattery,{task.RobotTargetAddress}"; |
| | | } |
| | | else |
| | | { |
| | | // 鿢çä»»å¡ï¼ä½¿ç¨åææ ¼å¼ |
| | | if (state != null && state.IsGroupPallet && task.RobotTaskType == RobotTaskTypeEnum.GroupPallet.GetHashCode()) |
| | | { |
| | | // ç»çä»»å¡ï¼æ¾è´§é夿æ¯å¦NGï¼å¦æNGåæ¾å°NGå£ |
| | | if (state.IsScanNG) |
| | | if (isFlowA) |
| | | { |
| | | taskString = $"Putbattery,NG"; |
| | | // æµåAï¼æ¾åçµè¯å°ç®æ æç |
| | | int batchStart = targetNormalCount + 1 + (state.CurrentBatchIndex - 1); |
| | | int putCount = Math.Min(4, remainingFake); |
| | | var (start, end) = _taskProcessor.BuildBatchRange(batchStart, putCount); |
| | | |
| | | await _taskProcessor.SendPutWithBatchAsync(task, state, task.RobotTargetAddress, start, end); |
| | | |
| | | state.CurrentBatchIndex += putCount; |
| | | // Phase ä¿æä¸º 4ï¼ç HandlePutFinishedAsync å¤çå®åååå Phase 3 |
| | | _stateManager.TryUpdateStateSafely(ipAddress, state); |
| | | } |
| | | else |
| | | { |
| | | taskString = $"Putbattery,{task.RobotTargetAddress}"; |
| | | // æµåBï¼æ¾åçµè¯å°5å·ä½ |
| | | var positions = _taskProcessor.GetNextAvailableFakeBatteryPositions(Math.Min(4, remainingFake)); |
| | | if (positions.Count == 0) |
| | | { |
| | | _logger.LogError("HandlePickFinishedStateAsyncï¼æ å¯ç¨åçµè¯ç¹ä½ï¼ä»»å¡å·: {TaskNum}", task.RobotTaskNum); |
| | | return; |
| | | } |
| | | |
| | | int start = positions.Min(); |
| | | int end = positions.Max(); |
| | | |
| | | await _taskProcessor.SendPutWithBatchAsync(task, state, "5", start, end); |
| | | |
| | | // Phase ä¿æä¸º 4ï¼ç HandlePutFinishedAsync å¤çå®åååå Phase 3 |
| | | _stateManager.TryUpdateStateSafely(ipAddress, state); |
| | | } |
| | | return; |
| | | } |
| | | |
| | | // éæ¹æ¬¡æ¨¡å¼æå
¶ä»é¶æ®µä¸ä¸åæä»¤ |
| | | return; |
| | | } |
| | | |
| | | // 鿢çä»»å¡ï¼ä½¿ç¨åææ ¼å¼ |
| | | if (state != null && state.IsGroupPallet && task.RobotTaskType == RobotTaskTypeEnum.GroupPallet.GetHashCode()) |
| | | { |
| | | if (state.IsScanNG) |
| | | { |
| | | taskString = $"Putbattery,1"; |
| | | } |
| | | else |
| | | { |
| | | taskString = $"Putbattery,{task.RobotTargetAddress}"; |
| | | } |
| | | } |
| | | else |
| | | taskString = $"Putbattery,{task.RobotTargetAddress}"; |
| | | |
| | | bool result = await _clientManager.SendToClientAsync(ipAddress, taskString); |
| | | |
| | |
| | | // 妿æ¯ç»çä»»å¡ |
| | | if (task.RobotTaskType == RobotTaskTypeEnum.GroupPallet.GetHashCode()) |
| | | { |
| | | // æ£æ¥çµæ± æ¯å¦å·²å°ä½ |
| | | if (!stateForUpdate.BatteryArrived) |
| | | { |
| | | return; |
| | | } |
| | | // 读å线ä½çµè¯æ¡ç |
| | | string trayBarcode1 = RobotBarcodeGenerator.GenerateTrayBarcode("DB40.990"); |
| | | string trayBarcode2 = RobotBarcodeGenerator.GenerateTrayBarcode("DB40.1020"); |
| | |
| | | |
| | | // åéåè´§æä»¤ æ è®°æ«ç NGï¼æ¾è´§æ¶ä¸ä½¿ç¨è¿äºæ¡ç ï¼å¹¶æ¾å
¥NGå£ |
| | | await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate, true); |
| | | return; |
| | | } |
| | | else |
| | | { |
| | | _logger.LogInformation("HandlePutFinishedStateAsyncï¼è¯»åçæçæ¡ç å¯ä¸ï¼ç»§ç»æ§è¡ï¼ä»»å¡å·: {TaskNum}", task.RobotTaskNum); |
| | | QuartzLogger.Info($"读åçæçæ¡ç å¯ä¸ï¼ç»§ç»æ§è¡", stateForUpdate.RobotCrane.DeviceName); |
| | | |
| | | // å°æ¡ç æ·»å å°ç¶æä¸ï¼ä¾åç»æ¾è´§æ¶ä½¿ç¨ |
| | | stateForUpdate.CellBarcode.Add(trayBarcode1); |
| | | stateForUpdate.CellBarcode.Add(trayBarcode2); |
| | | stateForUpdate.CellBarcode = new List<string>() |
| | | { |
| | | trayBarcode1,trayBarcode2 |
| | | }; |
| | | } |
| | | |
| | | |
| | |
| | | QuartzLogger.Info($"读åæçæ¡ç æå: {trayBarcode1}+{trayBarcode2}", stateForUpdate.RobotCrane.DeviceName); |
| | | |
| | | // åéåè´§æä»¤ |
| | | await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate, false); |
| | | await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate); |
| | | } |
| | | else |
| | | { |
| | |
| | | |
| | | // åéåè´§æä»¤ æ è®°æ«ç NGï¼æ¾è´§æ¶ä¸ä½¿ç¨è¿äºæ¡ç ï¼å¹¶æ¾å
¥NGå£ |
| | | await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate, true); |
| | | return; |
| | | } |
| | | } |
| | | else if (task.RobotTaskType == RobotTaskTypeEnum.ChangePallet.GetHashCode()) |
| | | { |
| | | const int targetTotal = 48; |
| | | // æ¢çä»»å¡è¿å
¥æ¹æ¬¡æ¨¡å¼ï¼åé¶æ®µå¤çæ£å¸¸çµè¯ååçµè¯ ï¼æºå¨äººä»»å¡æ»æ°ï¼ |
| | | int targetNormalCount = task.RobotTaskTotalNum; |
| | | // å½å已宿æ°éï¼åè´§å®æçæ°éï¼ï¼åå§ä¸ºç¶æä¸ç RobotTaskTotalNumï¼åç»æ ¹æ®åè´§å®æçæ°éå¨ææ´æ° |
| | | int currentCompletedCount = stateForUpdate.RobotTaskTotalNum; |
| | | |
| | | // 夿æµåï¼null-safeï¼ |
| | |
| | | // ç®æ æ°é为48ï¼ç´æ¥èµ°åæé»è¾ï¼ä¸è¿å
¥æ¹æ¬¡æ¨¡å¼ |
| | | if (targetNormalCount == targetTotal) |
| | | { |
| | | await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate, false); |
| | | await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate); |
| | | return; |
| | | } |
| | | |
| | |
| | | stateForUpdate.CurrentBatchIndex = 1; |
| | | _logger.LogInformation("HandlePutFinishedStateAsyncï¼æ¢çä»»å¡è¿å
¥æ¹æ¬¡æ¨¡å¼ï¼ä»»å¡å·: {TaskNum}ï¼æµå: {Flow}", |
| | | task.RobotTaskNum, isFlowA ? "A" : "B"); |
| | | _stateManager.TryUpdateStateSafely(ipAddress, stateForUpdate); |
| | | } |
| | | |
| | | // ==================== æµåAï¼è¡¥åçµè¯å°ç®æ æç ==================== |
| | | if (isFlowA) |
| | | // ==================== Phase 1: 忣叏çµè¯ï¼ä¸¤æµåç¸åï¼==================== |
| | | if (stateForUpdate.ChangePalletPhase == 1) |
| | | { |
| | | // Phase 1: ååçµè¯ï¼ä»5å·ä½ï¼ä½¿ç¨ PositionIndexï¼ |
| | | if (stateForUpdate.ChangePalletPhase == 1) |
| | | int remainingNormal = targetNormalCount - currentCompletedCount; |
| | | if (remainingNormal <= 0) |
| | | { |
| | | int remaining = targetTotal - currentCompletedCount; |
| | | if (remaining <= 0) |
| | | { |
| | | stateForUpdate.ChangePalletPhase = 0; |
| | | stateForUpdate.CurrentBatchIndex = 1; |
| | | stateForUpdate.IsInFakeBatteryMode = false; |
| | | _logger.LogInformation("HandlePutFinishedStateAsyncï¼æµåA宿ï¼ä»»å¡å·: {TaskNum}", task.RobotTaskNum); |
| | | return; |
| | | } |
| | | |
| | | int pickCount = Math.Min(4, remaining); |
| | | var positions = _taskProcessor.GetNextAvailableFakeBatteryPositions(pickCount); |
| | | if (positions.Count == 0) |
| | | { |
| | | _logger.LogError("HandlePutFinishedStateAsyncï¼æ å¯ç¨åçµè¯ç¹ä½ï¼ä»»å¡å·: {TaskNum}", task.RobotTaskNum); |
| | | return; |
| | | } |
| | | |
| | | await _taskProcessor.SendSocketRobotFakeBatteryPickAsync(task, stateForUpdate, positions); |
| | | stateForUpdate.ChangePalletPhase = 2; |
| | | // æ£å¸¸çµè¯åå®ï¼åæ¢å° Phase 3 ååçµè¯ |
| | | stateForUpdate.ChangePalletPhase = 3; |
| | | stateForUpdate.CurrentBatchIndex = 1; // åçµè¯æ¹æ¬¡ä»å¤´å¼å§ |
| | | _logger.LogInformation("HandlePutFinishedStateAsyncï¼æ£å¸¸çµè¯åå®ï¼åæ¢å°Phase 3ååçµè¯ï¼ä»»å¡å·: {TaskNum}", task.RobotTaskNum); |
| | | _stateManager.TryUpdateStateSafely(ipAddress, stateForUpdate); |
| | | return; |
| | | } |
| | | // Phase 2: æ¾åçµè¯å°ç®æ æçï¼ä» targetNormalCount+1 å¼å§éå¢ï¼ |
| | | else if (stateForUpdate.ChangePalletPhase == 2) |
| | | { |
| | | int remaining = targetTotal - currentCompletedCount; |
| | | if (remaining <= 0) |
| | | { |
| | | stateForUpdate.ChangePalletPhase = 0; |
| | | stateForUpdate.CurrentBatchIndex = 1; |
| | | stateForUpdate.IsInFakeBatteryMode = false; |
| | | _logger.LogInformation("HandlePutFinishedStateAsyncï¼æµåA宿ï¼ä»»å¡å·: {TaskNum}", task.RobotTaskNum); |
| | | return; |
| | | } |
| | | |
| | | // è®¡ç®æ¾è´§æ¹æ¬¡ç¼å·ï¼ä» targetNormalCount + 1 å¼å§ |
| | | int batchStart = targetNormalCount + 1 + (stateForUpdate.CurrentBatchIndex - 1); |
| | | int putCount = Math.Min(4, remaining); |
| | | var (start, end) = _taskProcessor.BuildBatchRange(batchStart, putCount); |
| | | int pickCount = Math.Min(4, remainingNormal); |
| | | var (start, end) = _taskProcessor.BuildBatchRange(stateForUpdate.CurrentBatchIndex, pickCount); |
| | | |
| | | await _taskProcessor.SendPutWithBatchAsync(task, stateForUpdate, task.RobotTargetAddress, start, end); |
| | | await _taskProcessor.SendPickWithBatchAsync(task, stateForUpdate, task.RobotSourceAddress, start, end); |
| | | |
| | | stateForUpdate.CurrentBatchIndex += putCount; |
| | | stateForUpdate.ChangePalletPhase = 1; |
| | | } |
| | | stateForUpdate.CurrentBatchIndex += pickCount; |
| | | // åå® Pick ååæ¢å° Phase=2ï¼ç PickFinished 触å HandlePickFinishedStateAsync ä¸åæ¾è´§æä»¤ |
| | | stateForUpdate.ChangePalletPhase = 2; |
| | | _stateManager.TryUpdateStateSafely(ipAddress, stateForUpdate); |
| | | return; |
| | | } |
| | | // ==================== æµåBï¼åæ£å¸¸çµè¯ + åæ¶åçµè¯ ==================== |
| | | else |
| | | |
| | | // ==================== Phase 3: å¤çåçµè¯ï¼æµåA/B ååï¼ï¼èªå·±å¾ªç¯ ==================== |
| | | if (stateForUpdate.ChangePalletPhase == 3) |
| | | { |
| | | // Phase 1: 忣叏çµè¯ï¼ä»æºå°åï¼ä»1å¼å§éå¢ï¼ |
| | | if (stateForUpdate.ChangePalletPhase == 1) |
| | | int fakeCount = targetTotal - targetNormalCount; |
| | | int completedFake = Math.Max(0, currentCompletedCount - targetNormalCount); |
| | | int remainingFake = fakeCount - completedFake; |
| | | |
| | | if (remainingFake <= 0) |
| | | { |
| | | int remainingNormal = targetNormalCount - currentCompletedCount; |
| | | if (remainingNormal <= 0) |
| | | { |
| | | // æ£å¸¸çµè¯åå®ï¼åæ¢å° Phase 3 |
| | | stateForUpdate.ChangePalletPhase = 3; |
| | | stateForUpdate.CurrentBatchIndex = targetNormalCount + 1; |
| | | _logger.LogInformation("HandlePutFinishedStateAsyncï¼æ£å¸¸çµè¯å
¨é¨åå®ï¼è¿å
¥Phase 3åæ¶åçµè¯ï¼ä»»å¡å·: {TaskNum}", task.RobotTaskNum); |
| | | return; |
| | | } |
| | | |
| | | int pickCount = Math.Min(4, remainingNormal); |
| | | var (start, end) = _taskProcessor.BuildBatchRange(stateForUpdate.CurrentBatchIndex, pickCount); |
| | | |
| | | await _taskProcessor.SendPickWithBatchAsync(task, stateForUpdate, task.RobotSourceAddress, start, end); |
| | | |
| | | stateForUpdate.CurrentBatchIndex += pickCount; |
| | | stateForUpdate.ChangePalletPhase = 2; |
| | | // åçµè¯å
¨é¨å¤çå®ï¼åæ¢å° Phase 5 çå¾
å
¥åº |
| | | stateForUpdate.ChangePalletPhase = 5; |
| | | _logger.LogInformation("HandlePutFinishedStateAsyncï¼åçµè¯å¤ç宿¯ï¼åæ¢å°Phase 5çå¾
å
¥åºï¼ä»»å¡å·: {TaskNum}", task.RobotTaskNum); |
| | | _stateManager.TryUpdateStateSafely(ipAddress, stateForUpdate); |
| | | return; |
| | | } |
| | | // Phase 2: æ¾æ£å¸¸çµè¯å°ç®æ æçï¼æ¾è´§ç¼å·ä¸åè´§ç¼å·ä¸è´ï¼ |
| | | else if (stateForUpdate.ChangePalletPhase == 2) |
| | | |
| | | if (isFlowA) |
| | | { |
| | | int remainingNormal = targetNormalCount - currentCompletedCount; |
| | | if (remainingNormal <= 0) |
| | | { |
| | | // æ£å¸¸çµè¯æ¾å®ï¼åæ¢å° Phase 3 |
| | | stateForUpdate.ChangePalletPhase = 3; |
| | | stateForUpdate.CurrentBatchIndex = targetNormalCount + 1; |
| | | _logger.LogInformation("HandlePutFinishedStateAsyncï¼æ£å¸¸çµè¯å
¨é¨æ¾å®ï¼è¿å
¥Phase 3åæ¶åçµè¯ï¼ä»»å¡å·: {TaskNum}", task.RobotTaskNum); |
| | | return; |
| | | } |
| | | |
| | | // è®¡ç®æ¬æ¹æ¾è´§ç¼å·ï¼åºäº currentCompletedCount æ¨å¯¼æ¹æ¬¡èµ·å§ |
| | | int batchStart = ((currentCompletedCount - 1) / 4) * 4 + 1; |
| | | int putCount = Math.Min(4, remainingNormal); |
| | | var (start, end) = _taskProcessor.BuildBatchRange(batchStart, putCount); |
| | | |
| | | await _taskProcessor.SendPutWithBatchAsync(task, stateForUpdate, task.RobotTargetAddress, start, end); |
| | | |
| | | stateForUpdate.ChangePalletPhase = 1; |
| | | } |
| | | // Phase 3: ååçµè¯ï¼ä»æºå°åï¼ä» targetNormalCount+1 å¼å§éå¢ï¼ |
| | | else if (stateForUpdate.ChangePalletPhase == 3) |
| | | { |
| | | int fakeCount = targetTotal - targetNormalCount; |
| | | int completedFake = Math.Max(0, currentCompletedCount - targetNormalCount); |
| | | int remainingFake = fakeCount - completedFake; |
| | | |
| | | if (remainingFake <= 0) |
| | | { |
| | | stateForUpdate.ChangePalletPhase = 0; |
| | | stateForUpdate.CurrentBatchIndex = 1; |
| | | stateForUpdate.IsInFakeBatteryMode = false; |
| | | _logger.LogInformation("HandlePutFinishedStateAsyncï¼æµåB宿ï¼ä»»å¡å·: {TaskNum}", task.RobotTaskNum); |
| | | return; |
| | | } |
| | | |
| | | int pickCount = Math.Min(4, remainingFake); |
| | | var (start, end) = _taskProcessor.BuildBatchRange(stateForUpdate.CurrentBatchIndex, pickCount); |
| | | |
| | | await _taskProcessor.SendPickWithBatchAsync(task, stateForUpdate, task.RobotSourceAddress, start, end); |
| | | |
| | | stateForUpdate.CurrentBatchIndex += pickCount; |
| | | stateForUpdate.ChangePalletPhase = 4; |
| | | } |
| | | // Phase 4: æ¾åçµè¯å°5å·ä½ï¼ä½¿ç¨ PositionIndexï¼ |
| | | else if (stateForUpdate.ChangePalletPhase == 4) |
| | | { |
| | | int fakeCount = targetTotal - targetNormalCount; |
| | | int completedFake = Math.Max(0, currentCompletedCount - targetNormalCount); |
| | | int remainingFake = fakeCount - completedFake; |
| | | |
| | | if (remainingFake <= 0) |
| | | { |
| | | stateForUpdate.ChangePalletPhase = 0; |
| | | stateForUpdate.CurrentBatchIndex = 1; |
| | | stateForUpdate.IsInFakeBatteryMode = false; |
| | | _logger.LogInformation("HandlePutFinishedStateAsyncï¼æµåB宿ï¼ä»»å¡å·: {TaskNum}", task.RobotTaskNum); |
| | | return; |
| | | } |
| | | |
| | | // æµåAï¼ä»5å·ä½ååçµè¯ |
| | | var positions = _taskProcessor.GetNextAvailableFakeBatteryPositions(Math.Min(4, remainingFake)); |
| | | if (positions.Count == 0) |
| | | { |
| | | _logger.LogError("HandlePutFinishedStateAsyncï¼æ å¯ç¨åçµè¯ç¹ä½ï¼ä»»å¡å·: {TaskNum}", task.RobotTaskNum); |
| | | return; |
| | | } |
| | | |
| | | int start = positions.Min(); |
| | | int end = positions.Max(); |
| | | |
| | | await _taskProcessor.SendPutWithBatchAsync(task, stateForUpdate, "5", start, end); |
| | | |
| | | stateForUpdate.ChangePalletPhase = 3; |
| | | await _taskProcessor.SendSocketRobotFakeBatteryPickAsync(task, stateForUpdate, positions); |
| | | } |
| | | else |
| | | { |
| | | // æµåBï¼ä»æºå°åååçµè¯ |
| | | int pickCount = Math.Min(4, remainingFake); |
| | | var (start, end) = _taskProcessor.BuildBatchRange(stateForUpdate.CurrentBatchIndex, pickCount); |
| | | await _taskProcessor.SendPickWithBatchAsync(task, stateForUpdate, task.RobotSourceAddress, start, end); |
| | | stateForUpdate.CurrentBatchIndex += pickCount; |
| | | } |
| | | |
| | | // åå® Pick ååæ¢å° Phase=4ï¼ç PickFinished 触å HandlePickFinishedStateAsync ä¸åæ¾è´§æä»¤ |
| | | stateForUpdate.ChangePalletPhase = 4; |
| | | _stateManager.TryUpdateStateSafely(ipAddress, stateForUpdate); |
| | | return; |
| | | } |
| | | |
| | | // ==================== Phase 5: 宿å
¥åºï¼allputfinished / allpickfinished 触åï¼==================== |
| | | if (stateForUpdate.ChangePalletPhase == 5) |
| | | { |
| | | // Phase 5 ç± allpickfinished/allputfinished 触åå
¥åºï¼æ¬æ¹æ³ä¸åä¸åæä»¤ |
| | | return; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | // éç»çä»»å¡ï¼ç´æ¥åéåè´§æä»¤ |
| | | await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate, false); |
| | | await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate); |
| | | } |
| | | } |
| | | } |
| | |
| | | break; |
| | | } |
| | | |
| | | if(message == lastMessage) |
| | | { |
| | | // é夿¶æ¯ï¼å¿½ç¥ |
| | | continue; |
| | | } |
| | | |
| | | // æ´æ°å®¢æ·ç«¯ç¶æ |
| | | UpdateClientStatus(clientId, message); |
| | | |
| | |
| | | public bool IsRunning { get; private set; } |
| | | |
| | | /// <summary> |
| | | /// 䏿¬¡æ¥æ¶æ¶æ¯æº |
| | | /// </summary> |
| | | public string lastMessage; |
| | | |
| | | /// <summary> |
| | | /// æ¶æ¯æ¥æ¶äºä»¶ |
| | | /// </summary> |
| | | /// <remarks> |
| | |
| | | |
| | | // ========== æ£æ¥å åæºä»»å¡å®æç¶æ ========== |
| | | commonStackerCrane.CheckStackerCraneTaskCompleted(); |
| | | //_logger.LogDebug("Executeï¼æ£æ¥ä»»å¡å®æç¶æï¼è®¾å¤: {DeviceCode}", _deviceCode); |
| | | //QuartzLogger.Debug($"æ£æ¥ä»»å¡å®æç¶æï¼è®¾å¤: {_deviceCode}", _deviceCode); |
| | | |
| | | // ========== æ£æ¥æ¯å¦å¯ä»¥åéæ°ä»»å¡ ========== |
| | | //if (!commonStackerCrane.IsCanSendTask(commonStackerCrane.Communicator, commonStackerCrane.DeviceProDTOs, commonStackerCrane.DeviceProtocolDetailDTOs)) |
| | | if (commonStackerCrane.StackerCraneStatusValue != StackerCraneStatus.Normal /*&& commonStackerCrane.StackerCraneAutoStatusValue != StackerCraneAutoStatus.Automatic && commonStackerCrane.StackerCraneWorkStatusValue != StackerCraneWorkStatus.Standby*/) |
| | | if (commonStackerCrane.StackerCraneStatusValue != StackerCraneStatus.Normal ) |
| | | { |
| | | // å åæºä¸å¯ç¨ï¼å¦æ£å¨æ§è¡ä¸ä¸ä»»å¡ï¼ï¼ç´æ¥è¿å |
| | | //_logger.LogDebug("Executeï¼å åæºä¸å¯ç¨ï¼è®¾å¤: {DeviceCode}", _deviceCode); |
| | | //QuartzLogger.Debug($"å åæºä¸å¯ç¨ï¼è®¾å¤: {_deviceCode}", _deviceCode); |
| | | return Task.CompletedTask; |
| | | } |
| | | |
| | |
| | | if (task == null) |
| | | { |
| | | // 没æå¯ç¨ä»»å¡ |
| | | //_logger.LogDebug("Executeï¼æ²¡æå¯ç¨ä»»å¡ï¼è®¾å¤: {DeviceCode}", _deviceCode); |
| | | //QuartzLogger.Debug($"没æå¯ç¨ä»»å¡ï¼è®¾å¤: {_deviceCode}", _deviceCode); |
| | | return Task.CompletedTask; |
| | | } |
| | | |
| | | //_logger.LogInformation("Executeï¼éæ©ä»»å¡ï¼è®¾å¤: {DeviceCode}ï¼ä»»å¡å·: {TaskNum}", _deviceCode, task.TaskNum); |
| | | //QuartzLogger.Info($"鿩任å¡ï¼ä»»å¡å·: {task.TaskNum}", _deviceCode); |
| | | |
| | | // ========== æå»ºå½ä»¤ ========== |
| | | // å½ä»¤æå»ºä¸æ²å°ä¸ç¨æå»ºå¨ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # æ¢çä»»å¡å®æ´æµç¨åæ |
| | | |
| | | ## ä»»å¡åæ° |
| | | |
| | | | åæ° | å¼ | |
| | | |------|-----| |
| | | | æµå | **Flow A** (isFlowA = true, æºå°å LineCode = "11001") | |
| | | | æºå°å | 11001 | |
| | | | ç®æ å°å | 2101 | |
| | | | æ£å¸¸çµè¯æ°é | **33** | |
| | | | åçµè¯æ°é | 48 - 33 = **15** | |
| | | | ç®æ æ»æ° | 48 | |
| | | |
| | | --- |
| | | |
| | | ## é¶æ®µç¶æå®ä¹ |
| | | |
| | | | Phase | å«ä¹ | |
| | | |-------|------| |
| | | | 0 | æªå¼å§ | |
| | | | 1 | 忣叏çµè¯ | |
| | | | 2 | æ¾æ£å¸¸çµè¯ | |
| | | | 3 | ååçµè¯ï¼Flow A: ä»5å·ä½åï¼ | |
| | | | 4 | æ¾åçµè¯ï¼Flow A: æ¾å°ç®æ æçï¼ | |
| | | | 5 | çå¾
å
¥åºå®æ | |
| | | |
| | | --- |
| | | |
| | | ## 宿´ä»£ç æ§è¡æµç¨ï¼33 æ£å¸¸ + 15 å = 48 æ»è®¡ï¼ |
| | | |
| | | ### åå§ç¶æ |
| | | |
| | | ``` |
| | | ChangePalletPhase = 0 |
| | | currentCompletedCount = 0 |
| | | targetNormalCount = 33 |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ### 第1è½®ï¼Pick 1-4 æ£å¸¸çµè¯ |
| | | |
| | | | æ¥éª¤ | æ¹æ³ | Phase | currentCompletedCount | remainingNormal | æä½ | |
| | | |------|------|-------|---------------------|----------------|------| |
| | | | 1 | HandlePutFinishedStateAsync | 1 | 0 | 33 - 0 = **33** | PickBatch(1, 4) â Phase=2 | |
| | | | 2 | (æºæ¢°ææ§è¡åè´§) | - | - | - | - | |
| | | | 3 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished, taskç¶æ=RobotPickFinish | |
| | | | 4 | HandlePickFinishedStateAsync | 2 | 0 | 33 - 0 = **33** | PutBatch(1, 4) â Phase=1 | |
| | | | 5 | (æºæ¢°ææ§è¡æ¾è´§) | - | - | - | - | |
| | | | 6 | HandlePutFinishedAsync | - | **4** | - | currentCompletedCount+=4, task.RobotTaskTotalNum-=4 | |
| | | |
| | | --- |
| | | |
| | | ### 第2è½®ï¼Pick 5-8 æ£å¸¸çµè¯ |
| | | |
| | | | æ¥éª¤ | æ¹æ³ | Phase | currentCompletedCount | remainingNormal | æä½ | |
| | | |------|------|-------|---------------------|----------------|------| |
| | | | 7 | HandlePutFinishedStateAsync | 1 | 4 | 33 - 4 = **29** | PickBatch(5, 8) â Phase=2 | |
| | | | 8 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished | |
| | | | 9 | HandlePickFinishedStateAsync | 2 | 4 | 33 - 4 = **29** | PutBatch(1, 4) â Phase=1 | |
| | | | 10 | HandlePutFinishedAsync | - | **8** | - | currentCompletedCount+=4 | |
| | | |
| | | --- |
| | | |
| | | ### 第3è½®ï¼Pick 9-12 æ£å¸¸çµè¯ |
| | | |
| | | | æ¥éª¤ | æ¹æ³ | Phase | currentCompletedCount | remainingNormal | æä½ | |
| | | |------|------|-------|---------------------|----------------|------| |
| | | | 11 | HandlePutFinishedStateAsync | 1 | 8 | 33 - 8 = **25** | PickBatch(9, 12) â Phase=2 | |
| | | | 12 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished | |
| | | | 13 | HandlePickFinishedStateAsync | 2 | 8 | 33 - 8 = **25** | PutBatch(1, 4) â Phase=1 | |
| | | | 14 | HandlePutFinishedAsync | - | **12** | - | currentCompletedCount+=4 | |
| | | |
| | | --- |
| | | |
| | | ### 第4è½®ï¼Pick 13-16 æ£å¸¸çµè¯ |
| | | |
| | | | æ¥éª¤ | æ¹æ³ | Phase | currentCompletedCount | remainingNormal | æä½ | |
| | | |------|------|-------|---------------------|----------------|------| |
| | | | 15 | HandlePutFinishedStateAsync | 1 | 12 | 33 - 12 = **21** | PickBatch(13, 16) â Phase=2 | |
| | | | 16 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished | |
| | | | 17 | HandlePickFinishedStateAsync | 2 | 12 | 33 - 12 = **21** | PutBatch(1, 4) â Phase=1 | |
| | | | 18 | HandlePutFinishedAsync | - | **16** | - | currentCompletedCount+=4 | |
| | | |
| | | --- |
| | | |
| | | ### 第5è½®ï¼Pick 17-20 æ£å¸¸çµè¯ |
| | | |
| | | | æ¥éª¤ | æ¹æ³ | Phase | currentCompletedCount | remainingNormal | æä½ | |
| | | |------|------|-------|---------------------|----------------|------| |
| | | | 19 | HandlePutFinishedStateAsync | 1 | 16 | 33 - 16 = **17** | PickBatch(17, 20) â Phase=2 | |
| | | | 20 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished | |
| | | | 21 | HandlePickFinishedStateAsync | 2 | 16 | 33 - 16 = **17** | PutBatch(1, 4) â Phase=1 | |
| | | | 22 | HandlePutFinishedAsync | - | **20** | - | currentCompletedCount+=4 | |
| | | |
| | | --- |
| | | |
| | | ### 第6è½®ï¼Pick 21-24 æ£å¸¸çµè¯ |
| | | |
| | | | æ¥éª¤ | æ¹æ³ | Phase | currentCompletedCount | remainingNormal | æä½ | |
| | | |------|------|-------|---------------------|----------------|------| |
| | | | 23 | HandlePutFinishedStateAsync | 1 | 20 | 33 - 20 = **13** | PickBatch(21, 24) â Phase=2 | |
| | | | 24 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished | |
| | | | 25 | HandlePickFinishedStateAsync | 2 | 20 | 33 - 20 = **13** | PutBatch(1, 4) â Phase=1 | |
| | | | 26 | HandlePutFinishedAsync | - | **24** | - | currentCompletedCount+=4 | |
| | | |
| | | --- |
| | | |
| | | ### 第7è½®ï¼Pick 25-28 æ£å¸¸çµè¯ |
| | | |
| | | | æ¥éª¤ | æ¹æ³ | Phase | currentCompletedCount | remainingNormal | æä½ | |
| | | |------|------|-------|---------------------|----------------|------| |
| | | | 27 | HandlePutFinishedStateAsync | 1 | 24 | 33 - 24 = **9** | PickBatch(25, 28) â Phase=2 | |
| | | | 28 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished | |
| | | | 29 | HandlePickFinishedStateAsync | 2 | 24 | 33 - 24 = **9** | PutBatch(1, 4) â Phase=1 | |
| | | | 30 | HandlePutFinishedAsync | - | **28** | - | currentCompletedCount+=4 | |
| | | |
| | | --- |
| | | |
| | | ### 第8è½®ï¼Pick 29-32 æ£å¸¸çµè¯ |
| | | |
| | | | æ¥éª¤ | æ¹æ³ | Phase | currentCompletedCount | remainingNormal | æä½ | |
| | | |------|------|-------|---------------------|----------------|------| |
| | | | 31 | HandlePutFinishedStateAsync | 1 | 28 | 33 - 28 = **5** | PickBatch(29, 32) â Phase=2 | |
| | | | 32 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished | |
| | | | 33 | HandlePickFinishedStateAsync | 2 | 28 | 33 - 28 = **5** | PutBatch(1, 4) â Phase=1 | |
| | | | 34 | HandlePutFinishedAsync | - | **32** | - | currentCompletedCount+=4 | |
| | | |
| | | --- |
| | | |
| | | ### 第9è½®ï¼Pick 33 æ£å¸¸çµè¯ï¼æå1ä¸ªï¼ |
| | | |
| | | | æ¥éª¤ | æ¹æ³ | Phase | currentCompletedCount | remainingNormal | æä½ | |
| | | |------|------|-------|---------------------|----------------|------| |
| | | | 35 | HandlePutFinishedStateAsync | 1 | 32 | 33 - 32 = **1** | PickBatch(33, 33) â Phase=2 | |
| | | | 36 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished | |
| | | | 37 | HandlePickFinishedStateAsync | 2 | 32 | 33 - 32 = **1** | PutBatch(33, 33) â Phase=1 | |
| | | | 38 | HandlePutFinishedAsync | - | **33** | - | currentCompletedCount+=1 | |
| | | |
| | | --- |
| | | |
| | | ### 第10è½®ï¼æ£å¸¸çµè¯å
¨é¨å®æ â 忢 Phase 3 |
| | | |
| | | | æ¥éª¤ | æ¹æ³ | Phase | currentCompletedCount | remainingNormal | æä½ | |
| | | |------|------|-------|---------------------|----------------|------| |
| | | | 39 | HandlePutFinishedStateAsync | 1 | **33** | 33 - 33 = **0** â â¤0 | **忢 Phase=3**, Pick fake from 5å·ä½ | |
| | | |
| | | > **Flow A ç¹æ§**ï¼æ£å¸¸çµè¯åå®åï¼æºæçï¼11001ï¼å·²ç©ºãæ¤æ¶æºæ¢°ææºå¸¦æå䏿¹æ£å¸¸çµè¯æ¾å°ç®æ æçåï¼æºæçèªå¨ç©ºåºååºã代ç ä¸ä¸éè¦æ¾å¼å¤çè¿ä¸ªååºå¨ä½ââç±è¾é线èªå¨å®æã |
| | | |
| | | --- |
| | | |
| | | ### 第11è½®ï¼Pick 1-4 åçµè¯ï¼ä»5å·ä½ï¼ |
| | | |
| | | | æ¥éª¤ | æ¹æ³ | Phase | currentCompletedCount | remainingFake | æä½ | |
| | | |------|------|-------|---------------------|--------------|------| |
| | | | 40 | HandlePutFinishedStateAsync | 3 | 33 | 15 - 0 = **15** | Pick fake from 5å·ä½(1,4) â Phase=4 | |
| | | | 41 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished | |
| | | | 42 | HandlePickFinishedStateAsync | 4 | 33 | 15 - 0 = **15** | Put fake to target(BatchStart=34, 4个) â Phase=3 | |
| | | | 43 | HandlePutFinishedAsync | - | **37** | - | currentCompletedCount+=4 | |
| | | |
| | | --- |
| | | |
| | | ### 第12è½®ï¼Pick 5-8 åçµè¯ |
| | | |
| | | | æ¥éª¤ | æ¹æ³ | Phase | currentCompletedCount | remainingFake | æä½ | |
| | | |------|------|-------|---------------------|--------------|------| |
| | | | 44 | HandlePutFinishedStateAsync | 3 | 37 | 15 - 4 = **11** | Pick fake from 5å·ä½(5,8) â Phase=4 | |
| | | | 45 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished | |
| | | | 46 | HandlePickFinishedStateAsync | 4 | 37 | 15 - 4 = **11** | Put fake to target(BatchStart=38, 4个) â Phase=3 | |
| | | | 47 | HandlePutFinishedAsync | - | **41** | - | currentCompletedCount+=4 | |
| | | |
| | | --- |
| | | |
| | | ### 第13è½®ï¼Pick 9-12 åçµè¯ |
| | | |
| | | | æ¥éª¤ | æ¹æ³ | Phase | currentCompletedCount | remainingFake | æä½ | |
| | | |------|------|-------|---------------------|--------------|------| |
| | | | 48 | HandlePutFinishedStateAsync | 3 | 41 | 15 - 8 = **7** | Pick fake from 5å·ä½(9,12) â Phase=4 | |
| | | | 49 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished | |
| | | | 50 | HandlePickFinishedStateAsync | 4 | 41 | 15 - 8 = **7** | Put fake to target(BatchStart=42, 4个) â Phase=3 | |
| | | | 51 | HandlePutFinishedAsync | - | **45** | - | currentCompletedCount+=4 | |
| | | |
| | | --- |
| | | |
| | | ### 第14è½®ï¼Pick 13-15 åçµè¯ï¼æå3ä¸ªï¼ |
| | | |
| | | | æ¥éª¤ | æ¹æ³ | Phase | currentCompletedCount | remainingFake | æä½ | |
| | | |------|------|-------|---------------------|--------------|------| |
| | | | 52 | HandlePutFinishedStateAsync | 3 | 45 | 15 - 12 = **3** | Pick fake from 5å·ä½(13,15) â Phase=4 | |
| | | | 53 | HandlePickFinishedAsync | - | - | - | CurrentAction=PickFinished | |
| | | | 54 | HandlePickFinishedStateAsync | 4 | 45 | 15 - 12 = **3** | Put fake to target(BatchStart=46, 3个) â Phase=3 | |
| | | | 55 | HandlePutFinishedAsync | - | **48** | - | currentCompletedCount+=3 | |
| | | |
| | | --- |
| | | |
| | | ### 第15è½®ï¼åçµè¯å
¨é¨å®æ â 忢 Phase 5 |
| | | |
| | | | æ¥éª¤ | æ¹æ³ | Phase | currentCompletedCount | remainingFake | æä½ | |
| | | |------|------|-------|---------------------|--------------|------| |
| | | | 56 | HandlePutFinishedStateAsync | 3 | **48** | 15 - 15 = **0** â â¤0 | **忢 Phase=5**, çå¾
å
¥åº | |
| | | |
| | | --- |
| | | |
| | | ### 第16è½®ï¼å
¨é¨æ¾è´§å®æ â å
¥åº |
| | | |
| | | | æ¥éª¤ | æ¹æ³ | Phase | æä½ | |
| | | |------|------|-------|------| |
| | | | 57 | HandlePutFinishedAsync | - | PutFinished â allputfinished | |
| | | | 58 | ExecuteAsync | - | æ£æµ allputfinished â RobotSimpleCommandHandler å¤ç | |
| | | | 59 | RobotSimpleCommandHandler | **5** | Phase=5 â è°ç¨ HandleInboundTaskAsync(useSourceAddress=false) å
¥åºå° **HCSC1** | |
| | | | 60 | - | - | å é¤ä»»å¡è®°å½ï¼éç½®ç¶æï¼åé "Group,diskFinished" | |
| | | |
| | | --- |
| | | |
| | | ## æ°æ®æµæ±æ» |
| | | |
| | | ### currentCompletedCount åå |
| | | |
| | | ``` |
| | | 0 â 4 â 8 â 12 â 16 â 20 â 24 â 28 â 32 â 33 â 37 â 41 â 45 â 48 |
| | | | | | | | | | | | | | | | | |
| | | æ£å¸¸çµè¯æ¹æ¬¡ æ£å¸¸å®æ åçµè¯æ¹æ¬¡ æ»å®æ |
| | | (æ¯æ¹4个) +0 (æ¯æ¹4个) +3 |
| | | ``` |
| | | |
| | | ### Phase åæ¢å¾ |
| | | |
| | | ``` |
| | | Phase=0 ââ(åå§å)ââ⺠Phase=1 ââ⺠Phase=2 ââ⺠Phase=1 ââ⺠... ââ⺠Phase=1 |
| | | (Pick 1-4) (Put 1-4) (Pick 5-8) (Pick 33) |
| | | â |
| | | Phase=2 ââ⺠... ââ⺠Phase=2 |
| | | (Put 5-8) (Put 33) |
| | | â |
| | | ââââââââââââââââââââââââââââââââââââââââ |
| | | â Phase=1 (remainingNormal=0) â |
| | | â â â |
| | | â Phase=3 (ååçµè¯) â |
| | | â Pick fake â Phase=4 â Put fake â |
| | | â ⺠â |
| | | â ç´å° remainingFake=0 â |
| | | â â â |
| | | â Phase=5 (å
¥åº) â |
| | | ââââââââââââââââââââââââââââââââââââââââ |
| | | ``` |
| | | |
| | | ### å
³é®æ°æ®å¯¹ç
§è¡¨ |
| | | |
| | | | 轮次 | Phase | æä½ | currentCompletedCount | remainingNormal | remainingFake | åéæä»¤ | |
| | | |------|-------|------|---------------------|----------------|--------------|---------| |
| | | | 1 | 1â2 | Pick 1-4 | 0 | 33 | - | PickBatch(1,4) | |
| | | | 1 | 2â1 | Put 1-4 | 4 | 33 | - | PutBatch(1,4) | |
| | | | 2 | 1â2 | Pick 5-8 | 4 | 29 | - | PickBatch(5,8) | |
| | | | 2 | 2â1 | Put 5-8 | 8 | 29 | - | PutBatch(1,4) | |
| | | | 3 | 1â2 | Pick 9-12 | 8 | 25 | - | PickBatch(9,12) | |
| | | | 3 | 2â1 | Put 9-12 | 12 | 25 | - | PutBatch(1,4) | |
| | | | 4 | 1â2 | Pick 13-16 | 12 | 21 | - | PickBatch(13,16) | |
| | | | 4 | 2â1 | Put 13-16 | 16 | 21 | - | PutBatch(1,4) | |
| | | | 5 | 1â2 | Pick 17-20 | 16 | 17 | - | PickBatch(17,20) | |
| | | | 5 | 2â1 | Put 17-20 | 20 | 17 | - | PutBatch(1,4) | |
| | | | 6 | 1â2 | Pick 21-24 | 20 | 13 | - | PickBatch(21,24) | |
| | | | 6 | 2â1 | Put 21-24 | 24 | 13 | - | PutBatch(1,4) | |
| | | | 7 | 1â2 | Pick 25-28 | 24 | 9 | - | PickBatch(25,28) | |
| | | | 7 | 2â1 | Put 25-28 | 28 | 9 | - | PutBatch(1,4) | |
| | | | 8 | 1â2 | Pick 29-32 | 28 | 5 | - | PickBatch(29,32) | |
| | | | 8 | 2â1 | Put 29-32 | 32 | 5 | - | PutBatch(1,4) | |
| | | | 9 | 1â2 | Pick 33 | 32 | 1 | - | PickBatch(33,33) | |
| | | | 9 | 2â1 | Put 33 | 33 | 0 | - | PutBatch(33,33) | |
| | | | 10 | 1â**3** | **忢** | 33 | **0** | 15 | Pick fake(5å·ä½ 1-4) | |
| | | | 11 | 3â4 | Pick fake 1-4 | 33 | 0 | 15 | PickBattery,5,1-4 | |
| | | | 11 | 4â3 | Put fake 34-37 | 37 | 0 | 11 | PutBatch(34,37) | |
| | | | 12 | 3â4 | Pick fake 5-8 | 37 | 0 | 11 | PickBattery,5,5-8 | |
| | | | 12 | 4â3 | Put fake 38-41 | 41 | 0 | 7 | PutBatch(38,41) | |
| | | | 13 | 3â4 | Pick fake 9-12 | 41 | 0 | 7 | PickBattery,5,9-12 | |
| | | | 13 | 4â3 | Put fake 42-45 | 45 | 0 | 3 | PutBatch(42,45) | |
| | | | 14 | 3â4 | Pick fake 13-15 | 45 | 0 | 3 | PickBattery,5,13-15 | |
| | | | 14 | 4â3 | Put fake 46-48 | 48 | 0 | 0 | PutBatch(46,48) | |
| | | | 15 | 3â**5** | **忢** | 48 | 0 | **0** | çå¾
å
¥åº | |
| | | | 16 | 5 | **å
¥åº** | - | - | - | allputfinished â HandleInboundTaskAsync â HCSC1 | |
| | | |
| | | --- |
| | | |
| | | ## 代ç è责对ç
§ |
| | | |
| | | | æ¹æ³ | 使¶è°ç¨ | èè´£ | |
| | | |------|---------|------| |
| | | | HandlePutFinishedStateAsync | `ExecuteAsync` æ£æµ PutFinished | åé **Pick** æä»¤ï¼æ´æ° Phase | |
| | | | HandlePickFinishedStateAsync | `ExecuteAsync` æ£æµ PickFinished | åé **Put** æä»¤ | |
| | | | HandlePickFinishedAsync | prefix command `pickfinished` | æ´æ°ç¶æ CurrentAction | |
| | | | HandlePutFinishedAsync | prefix command `putfinished` | æ´æ° currentCompletedCount è®¡æ° | |
| | | | RobotSimpleCommandHandler | å½ä»¤ `allpickfinished` / `allputfinished` | 触åå
¥åºï¼æ¸
çç¶æ | |
| | |
| | | window.webConfig = { |
| | | "webApiBaseUrl": "http://localhost:9291/", |
| | | "webApiProduction":"http://localhost:9291/" |
| | | "webApiProduction":"http://192.168.60.30:9291/" |
| | | } |
| | |
| | | axios.defaults.baseURL = window.webConfig.webApiBaseUrl; |
| | | } |
| | | else if (process.env.NODE_ENV == 'debug') { |
| | | axios.defaults.baseURL = 'http://127.0.0.1:8098/'; |
| | | axios.defaults.baseURL = window.webConfig.webApiBaseUrl; |
| | | } |
| | | |
| | | else if (process.env.NODE_ENV == 'production') { |
| | |
| | | open(row) { |
| | | this.row = row; |
| | | this.showDetialBox = true; |
| | | this.tableData = []; |
| | | this.getDetailData(); |
| | | this.getDictionaryData(); |
| | | }, |
| | |
| | | async loadOverview() { |
| | | try { |
| | | const res = await this.http.get("/api/Dashboard/Overview"); |
| | | console.log("æ»è§æ°æ®", res.Data); |
| | | if (res.Status && res.Data) { |
| | | this.overviewData = res.Data; |
| | | this.updateTodayChart(); |
| | |
| | | field: "locationCode", |
| | | title: "è´§ä½ç¼å·", |
| | | type: "string", |
| | | width: 200, |
| | | width: 120, |
| | | align: "left", |
| | | }, |
| | | { |
| | |
| | | <template> |
| | | <div class="stock-chat-container"> |
| | | <el-tabs v-model="activeWarehouse" @tab-change="onWarehouseChange"> |
| | | <el-tab-pane |
| | | v-for="wh in warehouseList" |
| | | :key="wh.warehouseId || wh.id" |
| | | :label="wh.warehouseName" |
| | | :name="wh.warehouseId || wh.id" |
| | | /> |
| | | <el-tab-pane v-for="wh in warehouseList" :key="wh.warehouseId || wh.id" :label="wh.warehouseName" |
| | | :name="wh.warehouseId || wh.id" /> |
| | | </el-tabs> |
| | | |
| | | <div class="toolbar"> |
| | |
| | | <div v-if="selectedLocation" class="detail-content"> |
| | | <el-descriptions :column="2" border> |
| | | <el-descriptions-item label="è´§ä½ç¼å·">{{ selectedLocation.locationCode }}</el-descriptions-item> |
| | | <el-descriptions-item label="è´§ä½ç¶æ">{{ getLocationStatusText(selectedLocation.locationStatus) }}</el-descriptions-item> |
| | | <el-descriptions-item label="è´§ä½ç¶æ">{{ getLocationStatusText(selectedLocation.locationStatus) |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æçç¼å·">{{ selectedLocation.palletCode || 'æ ' }}</el-descriptions-item> |
| | | <el-descriptions-item label="åºåç¶æ">{{ getStockStatusText(selectedLocation.stockStatus) }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ»åºå">{{ selectedLocation.stockQuantity }}{{ selectedLocation.unit || '' }}</el-descriptions-item> |
| | | <el-descriptions-item label="åºåºæ¥æ">{{ selectedLocation.outboundDate }}{{ selectedLocation.unit || '' }}</el-descriptions-item> |
| | | <el-descriptions-item label="åºåç¶æ">{{ getStockStatusText(selectedLocation.stockStatus) |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ»åºå">{{ selectedLocation.stockQuantity }}{{ selectedLocation.unit || '' |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="åºåºæ¥æ">{{ selectedLocation.outboundDate }}{{ selectedLocation.unit || '' |
| | | }}</el-descriptions-item> |
| | | </el-descriptions> |
| | | |
| | | <div v-if="selectedLocation.details && selectedLocation.details.length > 0" class="detail-table"> |
| | |
| | | |
| | | async function loadWarehouseData(warehouseId) { |
| | | try { |
| | | // æ¸
é¤é«äº®æ¡ |
| | | if (selectionOutline) { |
| | | selectionOutline.visible = false |
| | | } |
| | | selectedLocation.value = null |
| | | |
| | | // æ¸
空ç鿡件 |
| | | filterStockStatus.value = null |
| | | filterMaterielCode.value = null |
| | | filterBatchNo.value = null |
| | | const res = await proxy.http.get(`/api/StockInfo/Get3DLayout?warehouseId=${warehouseId}`) |
| | | if (res.status && res.data) { |
| | | const data = res.data |
| | |
| | | } |
| | | |
| | | async function onWarehouseChange(warehouseId) { |
| | | // æ¸
é¤éä¸çé«äº®æ¡ |
| | | if (selectionOutline) { |
| | | selectionOutline.visible = false |
| | | } |
| | | // æ¸
é¤éä¸çè´§ä½æ°æ® |
| | | selectedLocation.value = null |
| | | |
| | | // æ¸
空ææç鿡件 |
| | | filterStockStatus.value = null |
| | | filterMaterielCode.value = null |
| | | filterBatchNo.value = null |
| | | |
| | | // æ¸
空çéé项å表 |
| | | materielCodeList.value = [] |
| | | batchNoList.value = [] |
| | | |
| | | // å è½½æ°ä»åºæ°æ® |
| | | await loadWarehouseData(warehouseId) |
| | | } |
| | | |
| | | function onWindowResize() { |
| | | if (!canvasContainer.value || !camera || !renderer) { |
| | | return |
| | |
| | | field: "sourceAddress", |
| | | title: "èµ·å§å°å", |
| | | type: "int", |
| | | width: 220, |
| | | width: 120, |
| | | align: "left", |
| | | }, |
| | | { |
| | | field: "targetAddress", |
| | | title: "ç®æ å°å", |
| | | type: "string", |
| | | width: 220, |
| | | width: 120, |
| | | align: "left", |
| | | }, |
| | | { |
| | |
| | | width: 90, |
| | | align: "left", |
| | | }, |
| | | { |
| | | field: "grade", |
| | | title: "ä¼å
级", |
| | | type: "int", |
| | | width: 80, |
| | | align: "left", |
| | | }, |
| | | // { |
| | | // field: "grade", |
| | | // title: "ä¼å
级", |
| | | // type: "int", |
| | | // width: 80, |
| | | // align: "left", |
| | | // }, |
| | | { |
| | | field: "depth", |
| | | title: "深度", |
| | |
| | | field: "sourceAddress", |
| | | title: "èµ·å§å°å", |
| | | type: "int", |
| | | width: 220, |
| | | width: 120, |
| | | align: "left", |
| | | }, |
| | | { |
| | | field: "targetAddress", |
| | | title: "ç®æ å°å", |
| | | type: "string", |
| | | width: 220, |
| | | width: 120, |
| | | align: "left", |
| | | }, |
| | | // { |
| | |
| | | align: "left", |
| | | hidden: true, |
| | | }, |
| | | { |
| | | field: "grade", |
| | | title: "ä¼å
级", |
| | | type: "int", |
| | | width: 80, |
| | | align: "left", |
| | | }, |
| | | // { |
| | | // field: "grade", |
| | | // title: "ä¼å
级", |
| | | // type: "int", |
| | | // width: 80, |
| | | // align: "left", |
| | | // }, |
| | | { |
| | | field: "depth", |
| | | title: "深度", |
| | |
| | | }; |
| | | } |
| | | |
| | | private HttpRequestConfig BuildConfig(string token) |
| | | { |
| | | return new HttpRequestConfig |
| | | { |
| | | Headers = new Dictionary<string, string> |
| | | { |
| | | { "Authorization", token } |
| | | }, |
| | | 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()); |
| | | } |
| | | |
| | | private HttpResponseResult<MesResponse> Post<T>(string url, T request, HttpRequestConfig config) |
| | | { |
| | | string json = JsonConvert.SerializeObject(request); |
| | | return _httpClient.Post<MesResponse>(url, json, "application/json", config); |
| | | } |
| | | |
| | | public HttpResponseResult<MesResponse> BindContainer(BindContainerRequest request) |
| | |
| | | public HttpResponseResult<MesResponse> UnBindContainer(UnBindContainerRequest request) |
| | | { |
| | | return Post(_baseUrl + UnBindContainerPath, request); |
| | | } |
| | | |
| | | public HttpResponseResult<MesResponse> BindContainer(BindContainerRequest request, string token) |
| | | { |
| | | return Post(_baseUrl + BindContainerPath, request, BuildConfig(token)); |
| | | } |
| | | |
| | | public HttpResponseResult<MesResponse> UnBindContainer(UnBindContainerRequest request, string token) |
| | | { |
| | | return Post(_baseUrl + UnBindContainerPath, request, BuildConfig(token)); |
| | | } |
| | | |
| | | public HttpResponseResult<MesResponse> ContainerNgReport(ContainerNgReportRequest request) |
| | |
| | | { |
| | | return Post(_baseUrl + OutboundInContainerPath, request); |
| | | } |
| | | |
| | | public HttpResponseResult<MesResponse> InboundInContainer(InboundInContainerRequest request, string token) |
| | | { |
| | | return Post(_baseUrl + InboundInContainerPath, request, BuildConfig(token)); |
| | | } |
| | | |
| | | public HttpResponseResult<MesResponse> OutboundInContainer(OutboundInContainerRequest request, string token) |
| | | { |
| | | return Post(_baseUrl + OutboundInContainerPath, request, BuildConfig(token)); |
| | | } |
| | | } |
| | | } |
| | |
| | | /// ç®æ æçå· |
| | | /// </summary> |
| | | public string PalletCode { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 设å¤åç§°ï¼ç¨äºå¨æMESåè¯æ¥è¯¢ï¼ |
| | | /// </summary> |
| | | public string DeviceName { get; set; } |
| | | } |
| | | } |
| | |
| | | /// æºæçå· |
| | | /// </summary> |
| | | public string PalletCode { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 设å¤åç§°ï¼ç¨äºå¨æMESåè¯æ¥è¯¢ï¼ |
| | | /// </summary> |
| | | public string DeviceName { get; set; } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using WIDESEA_Core; |
| | | using WIDESEA_Model.Models; |
| | | |
| | | namespace WIDESEA_IBasicService |
| | | { |
| | | /// <summary> |
| | | /// MES设å¤é
ç½®ä¿¡æ¯æå¡æ¥å£ |
| | | /// </summary> |
| | | public interface IMESDeviceConfigService : IDependency |
| | | { |
| | | /// <summary> |
| | | /// æ ¹æ®è®¾å¤åç§°è·åMES设å¤é
ç½®ï¼ç²¾ç¡®å¹é
ï¼ |
| | | /// </summary> |
| | | /// <param name="deviceName">设å¤åç§°</param> |
| | | /// <returns>MES设å¤é
ç½®ï¼å¦ææªæ¾å°åè¿ånull</returns> |
| | | Dt_MESDeviceConfig? GetByDeviceName(string deviceName); |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®è®¾å¤åç§°åä»åºç¼ç è·åMES设å¤é
ç½® |
| | | /// å¹é
æ¡ä»¶ï¼DeviceName精确å¹é
ä¸ï¼WarehouseCode为空æçäºæå®çä»åºç¼ç ï¼ |
| | | /// </summary> |
| | | /// <param name="deviceName">设å¤åç§°</param> |
| | | /// <param name="warehouseCode">ä»åºç¼ç </param> |
| | | /// <returns>MES设å¤é
ç½®ï¼å¦ææªæ¾å°åè¿ånull</returns> |
| | | Dt_MESDeviceConfig? GetByDeviceNameAndWarehouse(string deviceName, string warehouseCode); |
| | | } |
| | | } |
| | |
| | | HttpResponseResult<MesResponse> UnBindContainer(UnBindContainerRequest request); |
| | | |
| | | /// <summary> |
| | | /// æççµè¯ç»å®ï¼æ¯æå¨æTokenï¼ |
| | | /// </summary> |
| | | HttpResponseResult<MesResponse> BindContainer(BindContainerRequest request, string token); |
| | | |
| | | /// <summary> |
| | | /// æççµè¯è§£ç»ï¼æ¯æå¨æTokenï¼ |
| | | /// </summary> |
| | | HttpResponseResult<MesResponse> UnBindContainer(UnBindContainerRequest request, string token); |
| | | |
| | | /// <summary> |
| | | /// æçNGçµè¯ä¸æ¥ |
| | | /// </summary> |
| | | HttpResponseResult<MesResponse> ContainerNgReport(ContainerNgReportRequest request); |
| | |
| | | HttpResponseResult<MesResponse> InboundInContainer(InboundInContainerRequest request); |
| | | |
| | | /// <summary> |
| | | /// æçè¿ç«ï¼æ¯æå¨æTokenï¼ |
| | | /// </summary> |
| | | HttpResponseResult<MesResponse> InboundInContainer(InboundInContainerRequest request, string token); |
| | | |
| | | /// <summary> |
| | | /// æçåºç« |
| | | /// </summary> |
| | | HttpResponseResult<MesResponse> OutboundInContainer(OutboundInContainerRequest request); |
| | | |
| | | /// <summary> |
| | | /// æçåºç«ï¼æ¯æå¨æTokenï¼ |
| | | /// </summary> |
| | | HttpResponseResult<MesResponse> OutboundInContainer(OutboundInContainerRequest request, string token); |
| | | } |
| | | } |
| | |
| | | using WIDESEA_Core.BaseRepository; |
| | | using WIDESEA_Core; |
| | | using WIDESEA_Core.BaseRepository; |
| | | using WIDESEA_Core.BaseServices; |
| | | using WIDESEA_DTO.Stock; |
| | | using WIDESEA_Model.Models; |
| | |
| | | /// </summary> |
| | | /// <param name="warehouseId">ä»åºID</param> |
| | | /// <returns>3Då¸å±DTO</returns> |
| | | Task<Stock3DLayoutDTO> Get3DLayoutAsync(int warehouseId); |
| | | Task<Stock3DLayoutDTO> Get3DLayoutAsync(int warehouseId);
|
| | |
|
| | | /// <summary> |
| | | /// 使ç¨äºå¡å é¤åºååæç»ä¿¡æ¯ï¼å
æ¥è¯¢åå é¤ï¼ |
| | | /// </summary> |
| | | /// <param name="stockId">åºåID</param> |
| | | /// <returns>å é¤ç»æ</returns> |
| | | Task<WebResponseContent> DeleteStockWithDetailsAsync(int stockId); |
| | | } |
| | | } |
| | |
| | | /// æ¹éæç确认 - 䏿¬¡æ§è°ç¨MESè§£ç»æ´ä¸ªæç |
| | | /// </summary> |
| | | /// <param name="palletCode">æºæçå·</param> |
| | | /// <param name="deviceName">设å¤åç§°ï¼ç¨äºå¨æMESåè¯æ¥è¯¢ï¼</param> |
| | | /// <returns>æä½ç»æ</returns> |
| | | Task<WebResponseContent> SplitPalletConfirmAsync(string palletCode); |
| | | Task<WebResponseContent> SplitPalletConfirmAsync(string palletCode, string deviceName); |
| | | |
| | | /// <summary> |
| | | /// æ¹éç»ç确认 - 䏿¬¡æ§è°ç¨MESç»å®æ´ä¸ªæç |
| | | /// </summary> |
| | | /// <param name="palletCode">ç®æ æçå·</param> |
| | | /// <param name="deviceName">设å¤åç§°ï¼ç¨äºå¨æMESåè¯æ¥è¯¢ï¼</param> |
| | | /// <returns>æä½ç»æ</returns> |
| | | Task<WebResponseContent> GroupPalletConfirmAsync(string palletCode); |
| | | Task<WebResponseContent> GroupPalletConfirmAsync(string palletCode, string deviceName); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using SqlSugar; |
| | | using System; |
| | | using WIDESEA_Core.DB.Models; |
| | | |
| | | namespace WIDESEA_Model.Models |
| | | { |
| | | /// <summary> |
| | | /// MES设å¤é
ç½®å®ä½ |
| | | /// </summary> |
| | | [SugarTable(nameof(Dt_MESDeviceConfig))] |
| | | public class Dt_MESDeviceConfig : BaseEntity |
| | | { |
| | | /// <summary> |
| | | /// 主é®IDï¼èªå¢ |
| | | /// </summary> |
| | | [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "主é®ID")] |
| | | public int Id { get; set; } |
| | | |
| | | /// <summary> |
| | | /// 设å¤åç§°ï¼å¦"注液ç»çæºæ¢°æ" |
| | | /// </summary> |
| | | [SugarColumn(Length = 50, IsNullable = false, ColumnDescription = "设å¤åç§°")] |
| | | public string DeviceName { get; set; } |
| | | |
| | | /// <summary> |
| | | /// MES设å¤ç¼ç ï¼å¦"A02-YZHJJS-001" |
| | | /// </summary> |
| | | [SugarColumn(Length = 50, IsNullable = false, ColumnDescription = "MES设å¤ç¼ç ")] |
| | | public string EquipmentCode { get; set; } |
| | | |
| | | /// <summary> |
| | | /// MESèµæºç¼ç ï¼å¦"ZY25091001" |
| | | /// </summary> |
| | | [SugarColumn(Length = 50, IsNullable = false, ColumnDescription = "MESèµæºç¼ç ")] |
| | | public string ResourceCode { get; set; } |
| | | |
| | | /// <summary> |
| | | /// MES API JWT令ç |
| | | /// </summary> |
| | | [SugarColumn(Length = 500, IsNullable = false, ColumnDescription = "MES API JWT令ç")] |
| | | public string Token { get; set; } |
| | | |
| | | /// <summary> |
| | | /// ä»åºç¼ç ï¼ç¨äºéè¦åºåä»åºçæºæ¢°æï¼å¯ä¸ºç©ºï¼ |
| | | /// </summary> |
| | | [SugarColumn(Length = 50, IsNullable = true, ColumnDescription = "ä»åºç¼ç ")] |
| | | public string WarehouseCode { get; set; } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- Dt_MESDeviceConfig SQL Script |
| | | -- 对åºå®ä½ Dt_MESDeviceConfigï¼ç»§æ¿èª BaseEntityï¼å
å« Creater, CreateDate, Modifier, ModifyDateï¼ |
| | | DROP TABLE IF EXISTS Dt_MESDeviceConfig; |
| | | |
| | | CREATE TABLE Dt_MESDeviceConfig ( |
| | | Id INT IDENTITY(1,1) PRIMARY KEY, |
| | | DeviceName NVARCHAR(50) NOT NULL, |
| | | EquipmentCode NVARCHAR(50) NOT NULL, |
| | | ResourceCode NVARCHAR(50) NOT NULL, |
| | | Token NVARCHAR(500) NOT NULL, |
| | | WarehouseCode NVARCHAR(50) NULL, |
| | | Creater NVARCHAR(50) NOT NULL, |
| | | CreateDate DATETIME NOT NULL, |
| | | Modifier NVARCHAR(50) NULL, |
| | | ModifyDate DATETIME NULL |
| | | ); |
| | | |
| | | -- INSERT device configuration data |
| | | INSERT INTO Dt_MESDeviceConfig (DeviceName, EquipmentCode, ResourceCode, Token, WarehouseCode, Creater, CreateDate) |
| | | VALUES |
| | | (N'注液ç»çæºæ¢°æ', N'A02-YZHJJS-001', N'ZY25091001', N'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEwODkyNjQ4MzYzODUzODI0MCIsIm5hbWUiOiLkuIDms6jlkI7mnLrmorDmiYsiLCJGYWN0b3J5SWQiOiI0Mjg3NDU2MTc3ODI1MzgyNCIsIlNpdGVJZCI6IjQyODc0NTYxNzc4MjUzODI0IiwiQ29kZSI6IkEwMi1ZWkhKSlMtMDAxIiwibmJmIjoxNzc2NDExODk0LCJleHAiOjIyMTc5MTU4OTQsImlzcyI6Imh0dHBzOi8vd3d3Lmh5bXNvbi5jb20iLCJhdWQiOiJodHRwczovL3d3dy5oeW1zb24uY29tIn0.HCBK-mq7zrbn6s335Ddn1ZwUffCXdFAmflgHFtOyOXg', NULL, N'Admin', GETDATE()), |
| | | (N'髿¸©1æ¢çæºæ¢°æ', N'A02-GW1HJJS-001', N'ZY25091002', N'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEwODkyNjUxOTA3NDExNTU4NCIsIm5hbWUiOiLpq5jmuKkx5ZCO5py65qKw5omLIiwiRmFjdG9yeUlkIjoiNDI4NzQ1NjE3NzgyNTM4MjQiLCJTaXRlSWQiOiI0Mjg3NDU2MTc3ODI1MzgyNCIsIkNvZGUiOiJBMDItR1cxSEpKUy0wMDEiLCJuYmYiOjE3NzY0MTE5MDgsImV4cCI6MjIxNzkxNTkwOCwiaXNzIjoiaHR0cHM6Ly93d3cuaHltc29uLmNvbSIsImF1ZCI6Imh0dHBzOi8vd3d3Lmh5bXNvbi5jb20ifQ.A8frl5Txy6F3hCM2AuMbrPk_0x-rYmwjvL4a1RbxdeY', NULL, N'Admin', GETDATE()), |
| | | (N'åææ¢çæºæ¢°æ', N'A02-HCHJJS-001', N'ZY25091003', N'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEwODkyNjU0ODk2NTg3MTYxNiIsIm5hbWUiOiLljJbmiJDlkI7mnLrmorDmiYvvvIjpq5jmuKky77yJIiwiRmFjdG9yeUlkIjoiNDI4NzQ1NjE3NzgyNTM4MjQiLCJTaXRlSWQiOiI0Mjg3NDU2MTc3ODI1MzgyNCIsIkNvZGUiOiJBMDItSENISkpTLTAwMSIsIm5iZiI6MTc3NjQxMTkxNiwiZXhwIjoyMjE3OTE1OTE2LCJpc3MiOiJodHRwczovL3d3dy5oeW1zb24uLmNvbSIsImF1ZCI6Imh0dHBzOi8vd3d3Lmh5bXNvbi5jb20ifQ.SHxbsdYoV2m4oUkaJauOBu4A-TfuX__J8-W-mqghg_A', NULL, N'Admin', GETDATE()), |
| | | (N'å¸¸æ¸©æºæ¢°æ', N'A02-CW1JJS-001', N'ZY25091004', N'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEwODkyNjU4MDA2ODczMjkyOCIsIm5hbWUiOiLluLjmuKkx5py65qKw5omLIiwiRmFjdG9yeUlkIjoiNDI4NzQ1NjE3NzgyNTM4MjQiLCJTaXRlSWQiOiI0Mjg3NDU2MTc3ODI1MzgyNCIsIkNvZGUiOiJBMDItQ1cxSkpTLTAwMSIsIm5iZiI6MTc3NjQxMTkyNCwiZXhwIjoyMjE3OTE1OTI0LCJpc3MiOiJodHRwczovL3d3dy5oeW1zb24uY29tIiwiYXVkIjoiaHR0cHM6Ly93d3cuaHltc29uLmNvbSJ9.CnBUKdmdSGURyW-YzW_JZvtP93o17zG2r5ZxHx867PQ', NULL, N'Admin', GETDATE()), |
| | | (N'æåç»çæºæ¢°æ', N'A02-EHJJS-001', N'ZY25091005', N'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEwODkyNjYwOTU1OTkzMjkyOCIsIm5hbWUiOiLkuozmrKHmsKbmo4DlkI7mnLrmorDmiYsiLCJGYWN0b3J5SWQiOiI0Mjg3NDU2MTc3ODI1MzgyNCIsIlNpdGVJZCI6IjQyODc0NTYxNzc4MjUzODI0IiwiQ29kZSI6IkEwMi1FSEpKUy0wMDEiLCJuYmYiOjE3NzY0MTE5MzIsImV4cCI6MjIxNzkxNTkzMiwiaXNzIjoiaHR0cHM6Ly93d3cuaHltc29uLmNvbSIsImF1ZCI6Imh0dHRwczovL3d3dy5oeW1zb24uY29tIn0.Imc2-8pDFrXgPrE_ro9Riasb8eGJ3Vi6gDyUDnUTpfY', NULL, N'Admin', GETDATE()), |
| | | (N'髿¸©éç½®1', N'A02-GWJZ-001', N'ZY25030001', N'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEwNzU0NjM1MTU4NDY5NDI3MiIsIm5hbWUiOiLpq5jmuKnpnZnnva4xIiwiRmFjdG9yeUlkIjoiNDI4NzQ1NjE3NzgyNTM4MjQiLCJTaXRlSWQiOiI0Mjg3NDU2MTc3ODI1MzgyNCIsIkNvZGUiOiJBMDItR1dKWi0wMDEiLCJuYmYiOjE3NzUwOTkzMDEsImV4cCI6MjIxNjYwMzMwMSwiaXNzIjoiaHR0cHM6Ly93d3cuaHltc29uLmNvbSIsImF1ZCI6Imh0dHBzOi8vd3d3Lmh5bXNvbi5jb20ifQ.EI3Q6kHieKk5q4a6Nmf9fozi0haan0WuqkA9QNA-bHk', NULL, N'Admin', GETDATE()), |
| | | (N'髿¸©éç½®2', N'A02-GWJZ-002', N'ZY25060001', N'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEwNzU0NjUxNTA0NTEwNTY2NCIsIm5hbWUiOiLpq5jmuKnpnZnnva4yIiwiRmFjdG9yeUlkIjoiNDI4NzQ1NjE3NzgyNTM4MjQiLCJTaXRlSWQiOiI0Mjg3NDU2MTc3ODI1MzgyNCIsIkNvZGUiOiJBMDItR1dKWi0wMDIiLCJuYmYiOjE3NzUwOTkzNDAsImV4cCI6MjIxNjYwMzM0MCwiaXNzIjoiaHR0cHM6Ly93d3cuaHltc29uLmNvbSIsImF1ZCI6Imh0dHBzOi8vd3d3Lmh5bXNvbi5jb20ifQ.imaa_1Xd9bHZKF3cy6c82Lb1ODXJC2MVytks4_eIyR4', NULL, N'Admin', GETDATE()), |
| | | (N'常温éç½®1', N'A02-CWJZ-001', N'ZY25070001', N'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEwNzU0NjU1ODU5OTgxMTA3MiIsIm5hbWUiOiLluLjmuKnpnZnnva4xIiwiRmFjdG9yeUlkIjoiNDI4NzQ1NjE3NzgyNTM4MjQiLCJTaXRlSWQiOiI0Mjg3NDU2MTc3ODI1MzgyNCIsIkNvZGUiOiJBMDItQ1dKWi0wMDEiLCJuYmYiOjE3NzUwOTkzNDgsImV4cCI6MjIxNjYwMzM0OCwiaXNzIjoiaHR0cHM6Ly93d3cuaHltc29uLmNvbSIsImF1ZCI6Imh0dHRzOi8vd3d3Lmh5bXNvbi5jb20ifQ.-WmBS4g4T0ZpJZ2qHszZMfe2pseMWCh6zyVeYgzsho4', NULL, N'Admin', GETDATE()); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using WIDESEA_Core; |
| | | using WIDESEA_Core.BaseRepository; |
| | | using WIDESEA_Core.BaseServices; |
| | | using WIDESEA_IBasicService; |
| | | using WIDESEA_Model.Models; |
| | | |
| | | namespace WIDESEA_StockService |
| | | { |
| | | /// <summary> |
| | | /// MES设å¤é
ç½®æå¡å®ç°ç±» |
| | | /// </summary> |
| | | public class MESDeviceConfigService : ServiceBase<Dt_MESDeviceConfig, IRepository<Dt_MESDeviceConfig>>, IMESDeviceConfigService |
| | | { |
| | | /// <summary> |
| | | /// è·åMES设å¤é
ç½®ä»å¨æ¥å£ |
| | | /// </summary> |
| | | public IRepository<Dt_MESDeviceConfig> Repository => BaseDal; |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | /// <param name="baseDal">åºç¡æ°æ®è®¿é®å¯¹è±¡</param> |
| | | public MESDeviceConfigService(IRepository<Dt_MESDeviceConfig> baseDal) : base(baseDal) |
| | | { |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®è®¾å¤åç§°è·åMES设å¤é
ç½®ï¼ç²¾ç¡®å¹é
ï¼ |
| | | /// </summary> |
| | | /// <param name="deviceName">设å¤åç§°</param> |
| | | /// <returns>MES设å¤é
ç½®ï¼å¦ææªæ¾å°åè¿ånull</returns> |
| | | public Dt_MESDeviceConfig? GetByDeviceName(string deviceName) |
| | | { |
| | | if (string.IsNullOrWhiteSpace(deviceName)) |
| | | { |
| | | return null; |
| | | } |
| | | |
| | | return BaseDal.QueryFirst(x => x.DeviceName == deviceName); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®è®¾å¤åç§°åä»åºç¼ç è·åMES设å¤é
ç½® |
| | | /// å¹é
æ¡ä»¶ï¼DeviceName精确å¹é
ä¸ï¼WarehouseCode为空æçäºæå®çä»åºç¼ç ï¼ |
| | | /// </summary> |
| | | /// <param name="deviceName">设å¤åç§°</param> |
| | | /// <param name="warehouseCode">ä»åºç¼ç </param> |
| | | /// <returns>MES设å¤é
ç½®ï¼å¦ææªæ¾å°åè¿ånull</returns> |
| | | public Dt_MESDeviceConfig? GetByDeviceNameAndWarehouse(string deviceName, string warehouseCode) |
| | | { |
| | | if (string.IsNullOrWhiteSpace(deviceName)) |
| | | { |
| | | return null; |
| | | } |
| | | |
| | | return BaseDal.QueryFirst(x => |
| | | x.DeviceName == deviceName && |
| | | (string.IsNullOrEmpty(x.WarehouseCode) || x.WarehouseCode == warehouseCode)); |
| | | } |
| | | } |
| | | } |
| | |
| | | /// </summary> |
| | | private readonly IWarehouseService _warehouseService; |
| | | private readonly IRecordService _recordService; |
| | | private readonly IUnitOfWorkManage _unitOfWorkManage; |
| | | private readonly IStockInfoDetailService _stockInfoDetailService; |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | |
| | | IRepository<Dt_StockInfo> baseDal, |
| | | ILocationInfoService locationInfoService, |
| | | IWarehouseService warehouseService, |
| | | IRecordService recordService) : base(baseDal) |
| | | IRecordService recordService, |
| | | IUnitOfWorkManage unitOfWorkManage, |
| | | IStockInfoDetailService stockInfoDetailService) : base(baseDal) |
| | | { |
| | | _locationInfoService = locationInfoService; |
| | | _warehouseService = warehouseService; |
| | | _recordService = recordService; |
| | | _unitOfWorkManage = unitOfWorkManage; |
| | | _stockInfoDetailService = stockInfoDetailService; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | Locations = locationItems |
| | | }; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 使ç¨äºå¡å é¤åºååæç»ä¿¡æ¯ï¼å
æ¥è¯¢åå é¤ï¼ |
| | | /// </summary> |
| | | /// <param name="stockId">åºåID</param> |
| | | /// <returns>å é¤ç»æ</returns> |
| | | public async Task<WebResponseContent> DeleteStockWithDetailsAsync(int stockId) |
| | | { |
| | | if (stockId <= 0) |
| | | return WebResponseContent.Instance.Error("åºåIDæ æ"); |
| | | |
| | | _unitOfWorkManage.BeginTran(); |
| | | try |
| | | { |
| | | // å
æ¥è¯¢åºåä¿¡æ¯ï¼å
嫿ç»ï¼ |
| | | var stockInfo = await BaseDal.QueryDataNavFirstAsync(x => x.Id == stockId); |
| | | if (stockInfo == null) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error("åºåè®°å½ä¸åå¨"); |
| | | } |
| | | |
| | | // æ¥è¯¢å¹¶å é¤åºåæç»è®°å½ |
| | | var existingDetails = await _stockInfoDetailService.Repository.QueryDataAsync(x => x.StockId == stockId); |
| | | if (existingDetails != null && existingDetails.Any()) |
| | | { |
| | | var deleteDetailResult = await _stockInfoDetailService.Repository.DeleteDataAsync(existingDetails); |
| | | if (!deleteDetailResult) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error("å é¤åºåæç»è®°å½å¤±è´¥"); |
| | | } |
| | | } |
| | | |
| | | // å é¤åºåä¸»è®°å½ |
| | | var deleteStockResult = await BaseDal.DeleteDataAsync(stockInfo); |
| | | if (!deleteStockResult) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error("å é¤åºå主记å½å¤±è´¥"); |
| | | } |
| | | |
| | | _unitOfWorkManage.CommitTran(); |
| | | |
| | | // è®°å½åºååæ´æ¥å¿ |
| | | var saveRecordResult = await _recordService.AddStockChangeRecordAsync(stockInfo, null, StockChangeTypeEnum.Outbound, remark: "åºåå é¤"); |
| | | if (!saveRecordResult) |
| | | { |
| | | return WebResponseContent.Instance.Error("åºååæ´è®°å½ä¿å失败"); |
| | | } |
| | | |
| | | return WebResponseContent.Instance.OK("åºåå 餿å"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error($"å é¤åºååæç»æ¶åçå¼å¸¸: {ex.Message}"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | /// æ¹éæç确认 - 䏿¬¡æ§è°ç¨MESè§£ç»æ´ä¸ªæç |
| | | /// </summary> |
| | | /// <param name="palletCode">æºæçå·</param> |
| | | /// <param name="deviceName">设å¤åç§°ï¼ç¨äºå¨æMESåè¯æ¥è¯¢ï¼</param> |
| | | /// <returns>æä½ç»æ</returns> |
| | | public async Task<WebResponseContent> SplitPalletConfirmAsync(string palletCode) |
| | | public async Task<WebResponseContent> SplitPalletConfirmAsync(string palletCode, string deviceName) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | |
| | | if (sfcList == null || !sfcList.Any()) |
| | | return content.Error("临æ¶è¡¨ä¸çµè¯å表为空"); |
| | | |
| | | // 2. è°ç¨MESè§£ç» |
| | | // 2. è·åMES设å¤é
ç½®ï¼å¨æåè¯ï¼ |
| | | string equipmentCode = StockConstants.MES_EQUIPMENT_CODE; |
| | | string resourceCode = StockConstants.MES_RESOURCE_CODE; |
| | | string token = null; |
| | | |
| | | if (!string.IsNullOrWhiteSpace(deviceName)) |
| | | { |
| | | var mesConfig = ResolveMesConfig(deviceName, palletCode); |
| | | if (mesConfig != null) |
| | | { |
| | | equipmentCode = mesConfig.EquipmentCode; |
| | | resourceCode = mesConfig.ResourceCode; |
| | | token = mesConfig.Token; |
| | | } |
| | | } |
| | | |
| | | // 3. è°ç¨MESè§£ç» |
| | | var unbindRequest = new UnBindContainerRequest |
| | | { |
| | | EquipmentCode = StockConstants.MES_EQUIPMENT_CODE, |
| | | ResourceCode = StockConstants.MES_RESOURCE_CODE, |
| | | EquipmentCode = equipmentCode, |
| | | ResourceCode = resourceCode, |
| | | LocalTime = DateTime.Now, |
| | | ContainCode = palletCode, |
| | | SfcList = sfcList |
| | | }; |
| | | var unbindResult = _mesService.UnBindContainer(unbindRequest); |
| | | var unbindResult = string.IsNullOrWhiteSpace(token) |
| | | ? _mesService.UnBindContainer(unbindRequest) |
| | | : _mesService.UnBindContainer(unbindRequest, token); |
| | | if (unbindResult == null || unbindResult.Data == null || !unbindResult.Data.IsSuccess) |
| | | { |
| | | return content.Error($"MESè§£ç»å¤±è´¥: {unbindResult?.Data?.Msg ?? unbindResult?.ErrorMessage ?? "æªç¥é误"}"); |
| | | } |
| | | |
| | | // 3. å é¤ä¸´æ¶è¡¨è®°å½ |
| | | // 4. å é¤ä¸´æ¶è¡¨è®°å½ |
| | | await SqlSugarClient.Deleteable<Dt_SplitTemp>().Where(t => t.PalletCode == palletCode).ExecuteCommandAsync(); |
| | | |
| | | return content.OK("æ¹éæç确认æå"); |
| | |
| | | /// æ¹éç»ç确认 - 䏿¬¡æ§è°ç¨MESç»å®æ´ä¸ªæç |
| | | /// </summary> |
| | | /// <param name="palletCode">ç®æ æçå·</param> |
| | | /// <param name="deviceName">设å¤åç§°ï¼ç¨äºå¨æMESåè¯æ¥è¯¢ï¼</param> |
| | | /// <returns>æä½ç»æ</returns> |
| | | public async Task<WebResponseContent> GroupPalletConfirmAsync(string palletCode) |
| | | public async Task<WebResponseContent> GroupPalletConfirmAsync(string palletCode, string deviceName) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | |
| | | if (details == null || !details.Any()) |
| | | return content.Error("æç䏿 çµè¯æ°æ®"); |
| | | |
| | | // 2. è°ç¨MESç»å® |
| | | // 2. è·åMES设å¤é
ç½®ï¼å¨æåè¯ï¼ |
| | | string equipmentCode = StockConstants.MES_EQUIPMENT_CODE; |
| | | string resourceCode = StockConstants.MES_RESOURCE_CODE; |
| | | string token = null; |
| | | |
| | | if (!string.IsNullOrWhiteSpace(deviceName)) |
| | | { |
| | | var mesConfig = ResolveMesConfig(deviceName, palletCode); |
| | | if (mesConfig != null) |
| | | { |
| | | equipmentCode = mesConfig.EquipmentCode; |
| | | resourceCode = mesConfig.ResourceCode; |
| | | token = mesConfig.Token; |
| | | } |
| | | } |
| | | |
| | | // 3. è°ç¨MESç»å® |
| | | var bindRequest = new BindContainerRequest |
| | | { |
| | | ContainerCode = palletCode, |
| | | EquipmentCode = StockConstants.MES_EQUIPMENT_CODE, |
| | | ResourceCode = StockConstants.MES_RESOURCE_CODE, |
| | | EquipmentCode = equipmentCode, |
| | | ResourceCode = resourceCode, |
| | | LocalTime = DateTime.Now, |
| | | OperationType = StockConstants.MES_BIND_OPERATION_TYPE, |
| | | ContainerSfcList = details.Select(d => new ContainerSfcItem |
| | |
| | | Location = d.InboundOrderRowNo.ToString() |
| | | }).ToList() |
| | | }; |
| | | var bindResult = _mesService.BindContainer(bindRequest); |
| | | var bindResult = string.IsNullOrWhiteSpace(token) |
| | | ? _mesService.BindContainer(bindRequest) |
| | | : _mesService.BindContainer(bindRequest, token); |
| | | if (bindResult == null || bindResult.Data == null || !bindResult.Data.IsSuccess) |
| | | { |
| | | return content.Error($"MESç»å®å¤±è´¥: {bindResult?.Data?.Msg ?? bindResult?.ErrorMessage ?? "æªç¥é误"}"); |
| | |
| | | return content.Error($"æ¹éç»ç确认失败: {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®è®¾å¤åç§°åæçå·è§£æMES设å¤é
ç½® |
| | | /// </summary> |
| | | /// <param name="deviceName">设å¤åç§°</param> |
| | | /// <param name="palletCode">æçå·ï¼ç¨äºæ¥è¯¢ä»åºç¼ç ï¼</param> |
| | | /// <returns>MES设å¤é
ç½®ï¼ä¸å卿¶è¿ånull</returns> |
| | | private Dt_MESDeviceConfig ResolveMesConfig(string deviceName, string palletCode) |
| | | { |
| | | // æ¢çæºæ¢°æéè¦åºåä»åº |
| | | if (deviceName.Contains("æ¢ç")) |
| | | { |
| | | // æ¥è¯¢æç对åºçä»åºç¼ç |
| | | var stockInfo = StockInfoService.Repository.QueryFirst(s => s.PalletCode == palletCode); |
| | | if (stockInfo != null && stockInfo.WarehouseId > 0) |
| | | { |
| | | var warehouse = _warehouseService.Repository.QureyDataById(stockInfo.WarehouseId); |
| | | if (warehouse != null && !string.IsNullOrWhiteSpace(warehouse.WarehouseCode)) |
| | | { |
| | | // å
æè®¾å¤å+ä»åºç¼ç æ¥è¯¢ |
| | | var config = SqlSugarClient.Queryable<Dt_MESDeviceConfig>() |
| | | .Where(c => c.DeviceName == deviceName && c.WarehouseCode == warehouse.WarehouseCode) |
| | | .First(); |
| | | if (config != null) |
| | | return config; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // æè®¾å¤åç§°æ¥è¯¢ï¼éç¨äºç»çæºæ¢°æææ¢çæºæ¢°ææªæ¾å°ä»åºå¹é
çæ
åµï¼ |
| | | return SqlSugarClient.Queryable<Dt_MESDeviceConfig>() |
| | | .Where(c => c.DeviceName == deviceName) |
| | | .First(); |
| | | } |
| | | } |
| | | } |
| | |
| | | private readonly IStockInfo_HtyService _stockInfo_HtyService; |
| | | private readonly IUnitOfWorkManage _unitOfWorkManage; |
| | | private readonly IRecordService _recordService; |
| | | private readonly IMESDeviceConfigService _mesDeviceConfigService; |
| | | |
| | | public IRepository<Dt_Task> Repository => BaseDal; |
| | | |
| | |
| | | ITask_HtyService task_HtyService, |
| | | IStockInfo_HtyService stockInfo_HtyService, |
| | | IUnitOfWorkManage unitOfWorkManage, |
| | | IRecordService recordService) : base(BaseDal) |
| | | IRecordService recordService, |
| | | IMESDeviceConfigService mesDeviceConfigService) : base(BaseDal) |
| | | { |
| | | _mapper = mapper; |
| | | _stockInfoService = stockInfoService; |
| | |
| | | _stockInfo_HtyService = stockInfo_HtyService; |
| | | _unitOfWorkManage = unitOfWorkManage; |
| | | _recordService = recordService; |
| | | _mesDeviceConfigService = mesDeviceConfigService; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | using Mapster; |
| | | using System.Text.Json; |
| | | using WIDESEA_Common.Constants; |
| | | using WIDESEA_Common.LocationEnum; |
| | | using WIDESEA_Common.StockEnum; |
| | | using WIDESEA_Common.TaskEnum; |
| | |
| | | using WIDESEA_Core.Enums; |
| | | using WIDESEA_Core.Helper; |
| | | using WIDESEA_DTO.Task; |
| | | using WIDESEA_IStockService; |
| | | using WIDESEA_Model.Models; |
| | | |
| | | namespace WIDESEA_TaskInfoService |
| | |
| | | return response.OK(); |
| | | |
| | | if (task.TaskStatus == (int)TaskInStatusEnum.InNew) |
| | | return CancelAgvInboundTask(task); |
| | | return await CancelAgvInboundTask(task); |
| | | |
| | | if (task.TaskStatus == (int)TaskOutStatusEnum.OutNew) |
| | | return await CancelAgvOutboundTaskAsync(task); |
| | |
| | | return response.Error($"å½åæç{dto.TrayNumber}å·²ç»å
¥åºäº"); |
| | | |
| | | // å建åºåæç» |
| | | var details = new Dt_StockInfoDetail |
| | | { |
| | | MaterielCode = dto.ProductNo, |
| | | MaterielName = dto.ProductName, |
| | | StockQuantity = int.TryParse(dto.Quantity, out int quantity) ? quantity : 0, |
| | | Unit = dto.UomCode, |
| | | OrderNo = dto.ProductNo, |
| | | ProductionDate =dto.ProductionDate, |
| | | EffectiveDate = dto.LowerLimitTime, |
| | | SerialNumber = dto.TrayNumber, |
| | | Status = (int)StockStatusEmun.å
¥åºç¡®è®¤, |
| | | InboundOrderRowNo = 1, |
| | | Creater = StockConstants.AGV_USER, |
| | | CreateDate = DateTime.Now, |
| | | Remark = $"AGVå
¥åºä»»å¡å建ï¼ä»»å¡å·ï¼{dto.TaskId}" |
| | | }; |
| | | |
| | | // å建åºåä¸»è®°å½ |
| | | var stock = new Dt_StockInfo |
| | | { |
| | | PalletCode = dto.TrayNumber, |
| | | PalletType = dto.Floor, |
| | | WarehouseId = dto.YinYang == 1 ? (int)WarehouseEnum.FJ1 : (int)WarehouseEnum.ZJ1, |
| | | StockStatus = (int)StockStatusEmun.å
¥åºç¡®è®¤, |
| | | Creater = StockConstants.AGV_USER, |
| | | CreateDate = DateTime.Now, |
| | | Remark = $"AGVå
¥åºä»»å¡å建ï¼ä»»å¡å·ï¼{dto.TaskId}", |
| | | Details = new List<Dt_StockInfoDetail> { details } |
| | | }; |
| | | |
| | | task.TaskType = (int)TaskInboundTypeEnum.Inbound; |
| | | task.TaskStatus = (int)TaskInStatusEnum.InNew; |
| | | task.CurrentAddress = task.SourceAddress; |
| | | |
| | | var addResult = await BaseDal.AddDataAsync(task) > 0; |
| | | return addResult ? null : response.Error("å
¥åºä»»å¡å建失败"); |
| | | _unitOfWorkManage.BeginTran(); |
| | | try |
| | | { |
| | | // å
åå»ºä»»å¡ |
| | | var taskResult = await BaseDal.AddDataAsync(task) > 0; |
| | | if (!taskResult) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return response.Error("å
¥åºä»»å¡å建失败"); |
| | | }
|
| | | var result = _stockInfoService.Repository.AddData(stock, x => x.Details);
|
| | | if (result)
|
| | | { |
| | | _unitOfWorkManage.CommitTran(); |
| | | return null; |
| | | }
|
| | | else |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return response.Error("åºåä¿¡æ¯å建失败"); |
| | | }
|
| | | // 使ç¨åºåæå¡æ·»å åºå主记å½åæç»
|
| | | //var stockResult = await _stockInfoService.AddStockWithDetailsUsingTransactionAsync(stock); |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return response.Error($"å
¥åºä»»å¡å建å¼å¸¸ï¼{ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | // åºåºå建 |
| | | private async Task<AGVResponse?> CreateAgvOutboundTaskAsync(Dt_Task task, ApplyInOutDto dto) |
| | | { |
| | | AGVResponse response = new AGVResponse(); |
| | | |
| | | // æ£æ¥åºåæ¯å¦åå¨ |
| | | var stockInfo = await _stockInfoService.GetStockInfoAsync(dto.TrayNumber); |
| | | if (stockInfo == null) |
| | | return response.Error($"æªæ¾å°æç{dto.TrayNumber}çåºåä¿¡æ¯"); |
| | | |
| | | //if (stockInfo.WarehouseId != dto.YinYang) |
| | | // return response.Error($"æç{dto.TrayNumber}ä¸å±äºå½å{(dto.YinYang == 1 ? "é´æ" : "鳿")}"); |
| | | // æ£æ¥åºåæ¯å¦ææç»ï¼å³æ¯å¦ççæåºåï¼ |
| | | if (stockInfo.Details == null || !stockInfo.Details.Any()) |
| | | return response.Error($"æç{dto.TrayNumber}没æåºåæç»ï¼æ æ³åºåº"); |
| | | |
| | | // æ£æ¥åºåæ»æ°éæ¯å¦å¤§äº0 |
| | | var totalQuantity = stockInfo.Details.Sum(d => d.StockQuantity); |
| | | if (totalQuantity <= 0) |
| | | return response.Error($"æç{dto.TrayNumber}åºåæ°éä¸è¶³ï¼æ æ³åºåº"); |
| | | |
| | | // æ ¹æ®dtoåæ°è¿ä¸æ¥éªè¯åºåä¿¡æ¯ |
| | | if (!string.IsNullOrEmpty(dto.ProductNo)) |
| | | { |
| | | // æ£æ¥åºåæç»ä¸æ¯å¦å
嫿å®çç©æç¼ç |
| | | var hasMatchingMaterial = stockInfo.Details.Any(d => d.MaterielCode == dto.ProductNo); |
| | | if (!hasMatchingMaterial) |
| | | return response.Error($"æç{dto.TrayNumber}䏿²¡æç©æç¼ç 为{dto.ProductNo}çåºåï¼æ æ³åºåº"); |
| | | } |
| | | |
| | | // æ£æ¥åºåç¶ææ¯å¦å
许åºåº |
| | | if (stockInfo.StockStatus != (int)StockStatusEmun.å
¥åºå®æ) |
| | | return response.Error($"æç{dto.TrayNumber}æ£å¨ç§»å¨ä¸ï¼è¯·ç¨åï¼"); |
| | | |
| | | // æ£æ¥è´§ä½ä¿¡æ¯ |
| | | var locationInfo = await _locationInfoService.GetLocationInfo(stockInfo.LocationCode); |
| | | if (locationInfo == null) |
| | | return response.Error($"æªæ¾å°æç{stockInfo.LocationCode}çè´§ä½ä¿¡æ¯"); |
| | | |
| | | // æ£æ¥è´§ä½ç¶ææ¯å¦å
许åºåº |
| | | if (locationInfo.LocationStatus != (int)LocationStatusEnum.InStock) |
| | | return response.Error($"å½åè´§ä½{locationInfo.LocationStatus}ç¶æä¿¡æ¯é误"); |
| | | |
| | | // éªè¯ä»åºIDæ¯å¦å¹é
ï¼æ ¹æ®dtoçé´é³æåæ°ï¼ |
| | | var expectedWarehouseId = dto.YinYang == 1 ? (int)WarehouseEnum.FJ1 : (int)WarehouseEnum.ZJ1; |
| | | if (stockInfo.WarehouseId != expectedWarehouseId) |
| | | return response.Error($"æç{dto.TrayNumber}ä¸å¨é¢æçä»åºä¸ï¼æ æ³åºåº"); |
| | | |
| | | task.TaskType = (int)TaskOutboundTypeEnum.Outbound; |
| | | task.TaskStatus = (int)TaskOutStatusEnum.OutNew; |
| | |
| | | task.TaskStatus = (int)TaskOutStatusEnum.OutFinish; |
| | | |
| | | _unitOfWorkManage.BeginTran(); |
| | | var deleteStockResult = _stockInfoService.DeleteData(stockInfo); |
| | | //var deleteStockResult = _stockInfoService.DeleteData(stockInfo) |
| | | var deleteStockResult = await _stockInfoService.DeleteStockWithDetailsAsync(stockInfo.Id); |
| | | var updateLocationResult = _locationInfoService.UpdateData(locationInfo); |
| | | BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.èªå¨å®æ : OperateTypeEnum.äººå·¥å®æ); |
| | | if (!deleteStockResult.Status || !updateLocationResult.Status) |
| | |
| | | if (existingStock != null) |
| | | return response.Error($"æç{task.PalletCode}çåºåä¿¡æ¯å·²åå¨ï¼è¯·å¿éå¤å
¥åº"); |
| | | |
| | | Dt_StockInfo stockInfo = new Dt_StockInfo |
| | | { |
| | | PalletCode = task.PalletCode, |
| | | StockStatus = (int)StockStatusEmun.å
¥åºç¡®è®¤, |
| | | LocationCode = locationInfo.LocationCode, |
| | | WarehouseId = task.WarehouseId, |
| | | Creater = "AGV", |
| | | CreateDate = DateTime.Now |
| | | }; |
| | | //Dt_StockInfo stockInfo = new Dt_StockInfo |
| | | //{ |
| | | // PalletCode = task.PalletCode, |
| | | // StockStatus = (int)StockStatusEmun.å
¥åºç¡®è®¤, |
| | | // LocationCode = locationInfo.LocationCode, |
| | | // WarehouseId = task.WarehouseId, |
| | | // Creater = "AGV", |
| | | // CreateDate = DateTime.Now |
| | | //}; |
| | | |
| | | locationInfo.LocationStatus = (int)LocationStatusEnum.FreeLock; |
| | | |
| | | _unitOfWorkManage.BeginTran(); |
| | | var updateTaskResult = BaseDal.UpdateData(task); |
| | | var updateLocationResult = _locationInfoService.UpdateData(locationInfo); |
| | | var addStockResult = _stockInfoService.AddData(stockInfo); |
| | | if (!updateTaskResult || !updateLocationResult.Status || !addStockResult.Status) |
| | | //var addStockResult = _stockInfoService.AddData(stockInfo); |
| | | if (!updateTaskResult || !updateLocationResult.Status /*|| !addStockResult.Status*/) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return response.Error("å
¥åºå®æåï¼æ¬å°ä»»å¡ãåºåæè´§ä½æ´æ°å¤±è´¥"); |
| | |
| | | } |
| | | |
| | | // AGVå
¥åºåæ¶ |
| | | private AGVResponse CancelAgvInboundTask(Dt_Task task) |
| | | private async Task<AGVResponse> CancelAgvInboundTask(Dt_Task task) |
| | | { |
| | | AGVResponse response = new AGVResponse(); |
| | | task.TaskStatus = (int)TaskInStatusEnum.InCancel; |
| | | |
| | | |
| | | _unitOfWorkManage.BeginTran(); |
| | | BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.èªå¨å®æ : OperateTypeEnum.äººå·¥å®æ); |
| | | _unitOfWorkManage.CommitTran(); |
| | | return response.OK(); |
| | | try |
| | | { |
| | | var stockInfo = await _stockInfoService.GetStockInfoAsync(task.PalletCode); |
| | | if (stockInfo != null) |
| | | { |
| | | var deleteResult = await _stockInfoService.DeleteStockWithDetailsAsync(stockInfo.Id); |
| | | if (!deleteResult.Status) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return response.Error($"å é¤åºå失败: {deleteResult.Message}"); |
| | | } |
| | | } |
| | | |
| | | BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.èªå¨å®æ : OperateTypeEnum.äººå·¥å®æ); |
| | | |
| | | _unitOfWorkManage.CommitTran(); |
| | | return response.OK(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return response.Error($"åæ¶å
¥åºä»»å¡æ¶åçå¼å¸¸: {ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | |
| | |
| | | using WIDESEA_Core; |
| | | using WIDESEA_DTO.MES; |
| | | using WIDESEA_DTO.Task; |
| | | using WIDESEA_IBasicService; |
| | | using WIDESEA_Model.Models; |
| | | |
| | | namespace WIDESEA_TaskInfoService |
| | |
| | | var updateStockResult = await _stockInfoService.UpdateStockAsync(stockInfo); |
| | | if (!updateLocationResult || !updateStockResult) |
| | | return WebResponseContent.Instance.Error("ä»»å¡å®æå¤±è´¥"); |
| | | // æ ¹æ®åºåRemarkéæ©é置设å¤ï¼æ¥MES卿åè¯ |
| | | string deviceName = stockInfo.Remark == "GW_1" ? "髿¸©éç½®1" |
| | | : stockInfo.Remark == "GW_2" ? "髿¸©éç½®2" |
| | | : "常温éç½®1"; |
| | | var mesConfig = _mesDeviceConfigService.GetByDeviceName(deviceName); |
| | | string equipmentCode = mesConfig?.EquipmentCode ?? StockConstants.MES_EQUIPMENT_CODE; |
| | | string resourceCode = mesConfig?.ResourceCode ?? StockConstants.MES_RESOURCE_CODE; |
| | | string token = mesConfig?.Token; |
| | | |
| | | // è°ç¨MESæçè¿ç« |
| | | var inboundRequest = new InboundInContainerRequest |
| | | { |
| | | EquipmentCode = "STK-GROUP-001", |
| | | ResourceCode = "STK-GROUP-001", |
| | | EquipmentCode = equipmentCode, |
| | | ResourceCode = resourceCode, |
| | | LocalTime = DateTime.Now, |
| | | ContainerCode = taskDto.PalletCode |
| | | }; |
| | | var inboundResult = _mesService.InboundInContainer(inboundRequest); |
| | | var inboundResult = string.IsNullOrWhiteSpace(token) |
| | | ? _mesService.InboundInContainer(inboundRequest) |
| | | : _mesService.InboundInContainer(inboundRequest, token); |
| | | if (inboundResult == null || inboundResult.Data == null || !inboundResult.Data.IsSuccess) |
| | | { |
| | | return content.Error($"ä»»å¡å®æå¤±è´¥ï¼MESè¿ç«å¤±è´¥: {inboundResult?.Data?.Msg ?? inboundResult?.ErrorMessage ?? "æªç¥é误"}"); |
| | |
| | | using WIDESEA_Common.TaskEnum; |
| | | using WIDESEA_Common.WareHouseEnum; |
| | | using WIDESEA_Core; |
| | | using WIDESEA_DTO.MES; |
| | | using WIDESEA_DTO.Task; |
| | | using WIDESEA_IBasicService; |
| | | using WIDESEA_Model.Models; |
| | | |
| | | namespace WIDESEA_TaskInfoService |
| | |
| | | inboundTaskDto = _mapper.Map<WMSTaskDTO>(inboundTask); |
| | | } |
| | | |
| | | // è°ç¨MESæçåºç« |
| | | string deviceName = stockInfo.Remark == "GW_1" ? "髿¸©éç½®1" |
| | | : stockInfo.Remark == "GW_2" ? "髿¸©éç½®2" |
| | | : "常温éç½®1"; |
| | | var mesConfig = _mesDeviceConfigService.GetByDeviceName(deviceName); |
| | | string equipmentCode = mesConfig?.EquipmentCode ?? StockConstants.MES_EQUIPMENT_CODE; |
| | | string resourceCode = mesConfig?.ResourceCode ?? StockConstants.MES_RESOURCE_CODE; |
| | | string token = mesConfig?.Token; |
| | | |
| | | var outboundRequest = new OutboundInContainerRequest |
| | | { |
| | | EquipmentCode = equipmentCode, |
| | | ResourceCode = resourceCode, |
| | | LocalTime = DateTime.Now, |
| | | ContainerCode = taskDto.PalletCode |
| | | }; |
| | | var outboundResult = string.IsNullOrWhiteSpace(token) |
| | | ? _mesService.OutboundInContainer(outboundRequest) |
| | | : _mesService.OutboundInContainer(outboundRequest, token); |
| | | if (outboundResult == null || outboundResult.Data == null || !outboundResult.Data.IsSuccess) |
| | | { |
| | | return content.Error($"åºåºå®æå¤±è´¥ï¼MESåºç«å¤±è´¥: {outboundResult?.Data?.Msg ?? outboundResult?.ErrorMessage ?? "æªç¥é误"}"); |
| | | } |
| | | |
| | | var completeResult = await CompleteTaskAsync(task, "åºåºå®æ"); |
| | | if (!completeResult.Status) |
| | | return completeResult; |
| | |
| | | Creater = "system" |
| | | }; |
| | | |
| | | var result = await Repository.AddDataAsync(task) > 0; |
| | | if (!result) |
| | | return WebResponseContent.Instance.Error($"æºæ¢°æ{taskName}ä»»å¡å建失败"); |
| | | //var result = await Repository.AddDataAsync(task) > 0; |
| | | //if (!result) |
| | | // return WebResponseContent.Instance.Error($"æºæ¢°æ{taskName}ä»»å¡å建失败"); |
| | | |
| | | var wmstaskDto = _mapper.Map<WMSTaskDTO>(task) ?? new WMSTaskDTO(); |
| | | wmstaskDto.TaskQuantity = stock.Details?.Sum(d => d.Quantity) ?? 0; |
| | |
| | | using Microsoft.AspNetCore.Authorization; |
| | | using Microsoft.AspNetCore.Mvc; |
| | | using SqlSugar; |
| | | using WIDESEA_Core; |
| | |
| | | /// <summary> |
| | | /// æ»è§æ°æ® |
| | | /// </summary> |
| | | [HttpGet("Overview")] |
| | | [HttpGet("Overview"), AllowAnonymous] |
| | | public async Task<WebResponseContent> Overview() |
| | | { |
| | | try |
| | |
| | | /// SqlSugar ç GroupBy 䏿¯æå¯¹ .Date è¿æ ·ç计ç®åç´æ¥çæ SQL GROUP BYï¼ |
| | | /// å æ¤éç¨æ¤æ¹å¼ä»¥ç¡®ä¿è·¨æ°æ®åºå
¼å®¹æ§ã |
| | | /// </remarks> |
| | | [HttpGet("DailyStats")] |
| | | [HttpGet("DailyStats"), AllowAnonymous] |
| | | public async Task<WebResponseContent> DailyStats([FromQuery] int days = 30) |
| | | { |
| | | try |
| | |
| | | /// 注æï¼æ°æ®å¨ SQL å±è¿æ»¤åï¼å¨åºç¨å±æ ISO 8601 å¨é®åç»ã |
| | | /// å¨é®ä¸º "YYYY-Www" æ ¼å¼ï¼æ æ³ç´æ¥å¨ SQL å±ç¨ GROUP BY å®ç°ã |
| | | /// </remarks> |
| | | [HttpGet("WeeklyStats")] |
| | | [HttpGet("WeeklyStats"), AllowAnonymous] |
| | | public async Task<WebResponseContent> WeeklyStats([FromQuery] int weeks = 12) |
| | | { |
| | | try |
| | |
| | | /// SqlSugar ç GroupBy 䏿¯æå¿å对象 (Year, Month) ç´æ¥æ å°å° SQL GROUP BYï¼ |
| | | /// å æ¤éç¨æ¤æ¹å¼ä»¥ç¡®ä¿è·¨æ°æ®åºå
¼å®¹æ§ã |
| | | /// </remarks> |
| | | [HttpGet("MonthlyStats")] |
| | | [HttpGet("MonthlyStats"), AllowAnonymous] |
| | | public async Task<WebResponseContent> MonthlyStats([FromQuery] int months = 12) |
| | | { |
| | | try |
| | |
| | | /// <summary> |
| | | /// åºååºé¾åå¸ |
| | | /// </summary> |
| | | [HttpGet("StockAgeDistribution")] |
| | | [HttpGet("StockAgeDistribution"), AllowAnonymous] |
| | | public async Task<WebResponseContent> StockAgeDistribution() |
| | | { |
| | | try |
| | |
| | | /// <remarks> |
| | | /// ä½¿ç¨ SQL GROUP BY 卿°æ®åºå±é¢èåï¼é¿å
å è½½å
¨é¨åºåè®°å½å°å
åã |
| | | /// </remarks> |
| | | [HttpGet("StockByWarehouse")] |
| | | [HttpGet("StockByWarehouse"), AllowAnonymous] |
| | | public async Task<WebResponseContent> StockByWarehouse() |
| | | { |
| | | try |
| | |
| | | { |
| | | public LocationStatusChangeRecordController(ILocationStatusChangeRecordService service) : base(service) |
| | | { |
| | | }
|
| | | /// <summary> |
| | | /// æ ¹æ®IDè·åè´§ä½ç¶æåå¨è®°å½ |
| | | /// </summary> |
| | | /// <param name="id">è´§ä½ç¶æåå¨è®°å½ID</param> |
| | | /// <returns>è´§ä½ç¶æåå¨è®°å½ä¿¡æ¯</returns> |
| | | [HttpPost("GetLocationState"), AllowAnonymous]
|
| | | public WebResponseContent GetLocationState(int id)
|
| | | {
|
| | | try
|
| | | {
|
| | | if (id <= 0)
|
| | | return WebResponseContent.Instance.Error("IDåæ°æ æ");
|
| | |
|
| | | var records = Service.Repository.QueryData(x => x.LocationId == id);
|
| | | if (records == null || records.Count == 0)
|
| | | return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçè´§ä½ç¶æåå¨è®°å½");
|
| | |
|
| | | return WebResponseContent.Instance.OK(null, records);
|
| | | }
|
| | | catch (Exception ex)
|
| | | {
|
| | | return WebResponseContent.Instance.Error($"è·åè´§ä½ç¶æåå¨è®°å½å¤±è´¥: {ex.Message}");
|
| | | }
|
| | | } |
| | | |
| | | } |
| | | } |
| | |
| | | [HttpPost("SplitPalletConfirm"), AllowAnonymous] |
| | | public async Task<WebResponseContent> SplitPalletConfirm([FromBody] SplitPalletConfirmRequestDto dto) |
| | | { |
| | | return await Service.SplitPalletConfirmAsync(dto.PalletCode); |
| | | return await Service.SplitPalletConfirmAsync(dto.PalletCode, dto.DeviceName); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | [HttpPost("GroupPalletConfirm"), AllowAnonymous] |
| | | public async Task<WebResponseContent> GroupPalletConfirm([FromBody] GroupPalletConfirmRequestDto dto) |
| | | { |
| | | return await Service.GroupPalletConfirmAsync(dto.PalletCode); |
| | | return await Service.GroupPalletConfirmAsync(dto.PalletCode, dto.DeviceName); |
| | | } |
| | | } |
| | | } |