| | |
| | | using System; |
| | | using Autofac.Core; |
| | | using Magicodes.IE.Core; |
| | | using NetTaste; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Net.NetworkInformation; |
| | | using System.Reflection.Metadata; |
| | | using System.Text; |
| | | using System.Text.Json; |
| | | using System.Threading.Tasks; |
| | | using WIDESEAWCS_Common; |
| | | using WIDESEAWCS_Common.LocationEnum; |
| | | using WIDESEAWCS_Common.TaskEnum; |
| | | using WIDESEAWCS_Core; |
| | | using WIDESEAWCS_Core.Enums; |
| | | using WIDESEAWCS_Core.Helper; |
| | | using WIDESEAWCS_DTO; |
| | | using WIDESEAWCS_DTO.AGV.HIKROBOT; |
| | | using WIDESEAWCS_DTO.RGV.FOURBOT; |
| | | using WIDESEAWCS_DTO.WMS; |
| | | using WIDESEAWCS_Model.Models; |
| | | using WIDESEAWCS_QuartzJob; |
| | | |
| | | namespace WIDESEAWCS_TaskInfoService |
| | | { |
| | | public partial class TaskService |
| | | { |
| | | |
| | | #region æ´æ°ä»»å¡ç¶æ |
| | | /// <summary> |
| | | /// æ´æ°ä»»å¡ç¶æ |
| | | /// </summary> |
| | |
| | | /// <exception cref="NotImplementedException"></exception> |
| | | public WebResponseContent UpdateTaskStatus(object TaskDTO, DeviceTypeEnum deviceTypeEnum) |
| | | { |
| | | |
| | | WebResponseContent content = new WebResponseContent(); |
| | | GALAXISUpdateTaskStatus gALAXIS = new(); |
| | | RGVReturnInfo Rgv = new();//åå车任å¡ç¶æéç¥ |
| | | HIKROBOTTaskProcessReport hIKROBOT = new();//海康æºå¨äºº |
| | | string deviceName = ""; |
| | | try |
| | | { |
| | | if (deviceTypeEnum == DeviceTypeEnum.GALAXIS) |
| | | { |
| | | |
| | | deviceName = "å¯ä¹å£«"; |
| | | gALAXIS = TaskDTO.Serialize().DeserializeObject<GALAXISUpdateTaskStatus>(); |
| | | if (gALAXIS == null) throw new Exception("åæ°è½¬æ¢å¤±è´¥ï¼"); |
| | | var task = BaseDal.QueryFirst(x => x.WMSTaskNum == gALAXIS.taskId); |
| | | if (task == null) throw new Exception($"æªæ¾å°ä»»å¡,ä»»å¡ç¼å·ã{gALAXIS.taskId}ã"); |
| | | switch (gALAXIS.taskStatus) |
| | | { |
| | | case 0: |
| | | TaskCompleted(task, deviceTypeEnum); |
| | | break; |
| | | case 4: |
| | | TaskFromCompleted(task, deviceTypeEnum); |
| | | break; |
| | | default: |
| | | task.TaskState = ReturnTaskStatus(gALAXIS.taskStatus, deviceTypeEnum); |
| | | if (gALAXIS.taskStatus == 10) TaskFeedback(task, 1); |
| | | else BaseDal.UpdateData(task); |
| | | break; |
| | | } |
| | | } |
| | | else if (deviceTypeEnum == DeviceTypeEnum.HIKROBOT) |
| | | { |
| | | deviceName = "海康"; |
| | | hIKROBOT = TaskDTO.Serialize().DeserializeObject<HIKROBOTTaskProcessReport>(); |
| | | if (hIKROBOT == null) throw new Exception("åæ°è½¬æ¢å¤±è´¥ï¼"); |
| | | var task = BaseDal.QueryFirst(x => x.WMSTaskNum == hIKROBOT.robotTaskCode); |
| | | if (task == null) throw new Exception($"æªæ¾å°ä»»å¡,ä»»å¡ç¼å·ã{hIKROBOT.robotTaskCode}ã"); |
| | | switch (hIKROBOT.extra.values.method) |
| | | { |
| | | case "end": |
| | | TaskCompleted(task, deviceTypeEnum); |
| | | break; |
| | | case "outbin": |
| | | TaskFromCompleted(task, deviceTypeEnum); |
| | | break; |
| | | case "start": |
| | | task.TaskState = (int)TaskStatusEnum.Takeing; |
| | | TaskFeedback(task, 1); |
| | | break; |
| | | default: |
| | | task.TaskState = ReturnTaskStatus(hIKROBOT.extra.values.method, deviceTypeEnum); |
| | | BaseDal.UpdateData(task); |
| | | break; |
| | | } |
| | | } |
| | | else //åå车 |
| | | { |
| | | deviceName = "åå车"; |
| | | Rgv = TaskDTO.Serialize().DeserializeObject<RGVReturnInfo>(); |
| | | if (Rgv == null) throw new Exception("åæ°è½¬æ¢å¤±è´¥ï¼"); |
| | | //var task = BaseDal.QueryFirst(x => x.RGVTaskId == Rgv.content.taskID); |
| | | var task = BaseDal.QueryFirst(x => x.PalletCode == Rgv.content.podID); |
| | | if (task == null) throw new Exception($"æªæ¾å°ä»»å¡,ä»»å¡ç¼å·ã{Rgv.content.taskID}ã"); |
| | | |
| | | if (Rgv.messageType == 72)//å°è½¦é¡¶èµ·è´§ç© |
| | | { |
| | | if (task.TaskType == (int)TaskTypeEnum.CPInbound && task.TaskState == (int)TaskStatusEnum.Execut) |
| | | { |
| | | task.TaskState = (int)TaskStatusEnum.WaiCheckShape; |
| | | //BaseDal.UpdateData(task);//ç»è´¨æ£é¨åå
¥å¯å¨ä¿¡å· |
| | | var device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "F1") as OtherDevice; |
| | | if (device == null) task.ExceptionMessage = "æªæ¾å°1楼质æ£é¨è®¾å¤ä¿¡æ¯"; |
| | | else |
| | | { |
| | | if (device.IsConnected) |
| | | device.SetValue(QualityInspectionCommandEnum.StartqualityInspection, true, task.SourceAddress); |
| | | else |
| | | task.ExceptionMessage = "1楼质æ£é¨è®¾å¤è¿æ¥å¤±è´¥"; |
| | | } |
| | | TaskFeedback(task, 4); |
| | | } |
| | | else |
| | | { |
| | | TaskFromCompleted(task, deviceTypeEnum); |
| | | } |
| | | } |
| | | else if (Rgv.messageType == 10) |
| | | { |
| | | if (Rgv.content.status == 2) TaskFeedback(task, 1); |
| | | if (Rgv.content.status == 4) |
| | | { |
| | | if (task.TaskType == TaskTypeEnum.CPMoveInventory.ObjToInt()) |
| | | { |
| | | deviceName += "ç§»åº"; |
| | | WMSMoveLocationFeedback wMSMoveLocationFeedback = new WMSMoveLocationFeedback() |
| | | { |
| | | containerCode = task.PalletCode, |
| | | fromStationCode = task.SourceAddress, |
| | | toLocationCode = task.TargetAddress |
| | | }; |
| | | Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(WMSInOutBoundCompleteFeedback)); |
| | | WMSReturn agvContent = null; |
| | | if (apiInfo == null) task.ExceptionMessage = "æªæ¾å°åºå
¥åºå®æåé¦WMSæ¥å£é
置信æ¯ï¼è¯·æ£æ¥æ¥å£é
ç½®"; |
| | | else |
| | | { |
| | | string response = HttpHelper.Post(apiInfo.ApiAddress, wMSMoveLocationFeedback.Serialize()); |
| | | agvContent = response.DeserializeObject<WMSReturn>(); |
| | | content.OK(data: agvContent); |
| | | if (agvContent.code != 200) |
| | | { |
| | | task.ExceptionMessage = agvContent.message; |
| | | content.Error(agvContent.message); |
| | | } |
| | | } |
| | | } |
| | | else if (task.TaskType == (int)TaskTypeEnum.CPInbound && task.TaskState == (int)TaskStatusEnum.TakeFinish) |
| | | { |
| | | if (!string.IsNullOrEmpty(task.ExceptionMessage)) task.TaskState = TaskStatusEnum.CheckShapeingNG.ObjToInt(); |
| | | else task.TaskState = (int)TaskStatusEnum.CheckShapeing; |
| | | BaseDal.UpdateData(task); |
| | | } |
| | | else if (task.TaskType == (int)TaskTypeEnum.CPInbound && task.TaskState == (int)TaskStatusEnum.Puting) |
| | | { |
| | | if (!string.IsNullOrEmpty(task.ExceptionMessage)) |
| | | ErrorTaskFeedback(task, true/*!task.ExceptionMessage.Contains("夿£å¤±è´¥")*/); |
| | | else |
| | | TaskCompleted(task, deviceTypeEnum); |
| | | } |
| | | else if (task.TaskType == (int)TaskTypeEnum.CPOutbound || task.TaskType == (int)TaskTypeEnum.CPMoveInventory)//åºåºãç§»åºå®æ |
| | | { |
| | | TaskCompleted(task, deviceTypeEnum); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | content.OK(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | content.Error(ex.Message); |
| | | } |
| | | finally |
| | | { |
| | | _trackloginfoService.AddTrackLog(TaskDTO, content, $"{deviceName}ä»»å¡ç¶æåé¦", "", ""); |
| | | } |
| | | return content; |
| | | } |
| | | #endregion |
| | | |
| | | #region ä»»å¡ç¶æè½¬æ¢ |
| | | public int ReturnTaskStatus(object status, DeviceTypeEnum deviceTypeEnum) |
| | | { |
| | | try |
| | | { |
| | | if (deviceTypeEnum == DeviceTypeEnum.GALAXIS) |
| | | { |
| | | TaskStatusEnum taskStatus = status switch |
| | | { |
| | | 1 => TaskStatusEnum.FromOutOfStock, |
| | | 2 => TaskStatusEnum.ToaddInStock, |
| | | 3 => TaskStatusEnum.TaskNumRepetition, |
| | | 5 => TaskStatusEnum.RCSDataError, |
| | | 6 => TaskStatusEnum.TaskTypeError, |
| | | 7 => TaskStatusEnum.ParameterError, |
| | | 8 => TaskStatusEnum.RCSError, |
| | | 10 => TaskStatusEnum.Takeing, |
| | | 13 => TaskStatusEnum.Cancel, |
| | | _ => throw new ArgumentOutOfRangeException( |
| | | nameof(status), |
| | | status, |
| | | $"æªç¥çä»»å¡ç¶æç : {status}" |
| | | ) |
| | | }; |
| | | return (int)taskStatus; |
| | | } |
| | | else if (deviceTypeEnum == DeviceTypeEnum.HIKROBOT) |
| | | { |
| | | return 0; |
| | | } |
| | | else |
| | | { |
| | | return 0; |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | throw new Exception(ex.Message); |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | #region ä»»å¡èµ·ç¹å®æ |
| | | /// <summary> |
| | | /// ä»»å¡èµ·ç¹å®æ |
| | | /// </summary> |
| | | /// <param name="dt_Task"></param> |
| | | /// <param name="deviceTypeEnum"></param> |
| | | /// <returns></returns> |
| | | public WebResponseContent TaskFromCompleted(Dt_Task dt_Task, DeviceTypeEnum deviceTypeEnum) |
| | | { |
| | | try |
| | | { |
| | | dt_Task.TaskState = TaskStatusEnum.TakeFinish.ObjToInt(); |
| | | TaskFeedback(dt_Task, 4); |
| | | //Db.Ado.BeginTran(); |
| | | UpdateLocationStatus(dt_Task.SourceAddress, dt_Task.PalletCode, deviceTypeEnum, LocationStatusEnum.Free); |
| | | //BaseDal.UpdateData(dt_Task); |
| | | //Db.Ado.CommitTran(); |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Db.Ado.RollbackTran(); |
| | | throw new Exception(ex.Message); |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | #region ä»»å¡å®æ |
| | | /// <summary> |
| | | /// ä»»å¡å®æ |
| | | /// </summary> |
| | | /// <param name=""></param> |
| | | /// <param name="deviceTypeEnum"></param> |
| | | /// <returns></returns> |
| | | public WebResponseContent TaskCompleted(Dt_Task dt_Task, DeviceTypeEnum deviceTypeEnum) |
| | | { |
| | | try |
| | | { |
| | | dt_Task.TaskState = TaskStatusEnum.Finish.ObjToInt(); |
| | | TaskFeedback(dt_Task, 2); |
| | | //Db.Ado.BeginTran(); |
| | | UpdateLocationStatus(dt_Task.TargetAddress, dt_Task.PalletCode, deviceTypeEnum, LocationStatusEnum.InStock); |
| | | |
| | | //Db.Ado.CommitTran(); |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | //Db.Ado.RollbackTran(); |
| | | throw new Exception(ex.Message); |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | #region æ´æ°è´§ä½ç¶æ |
| | | /// <summary> |
| | | /// æ´æ°è´§ä½ç¶æ |
| | | /// </summary> |
| | | /// <param name="LocationCode"></param> |
| | | /// <param name="deviceTypeEnum"></param> |
| | | /// <param name="locationStatusEnum"></param> |
| | | /// <returns></returns> |
| | | public WebResponseContent UpdateLocationStatus(string locationCode, string palletCode, DeviceTypeEnum deviceTypeEnum, LocationStatusEnum locationStatusEnum) |
| | | { |
| | | try |
| | | { |
| | | if (deviceTypeEnum == DeviceTypeEnum.GALAXIS) |
| | | { |
| | | Dt_KLSLocationInfo? dt_KLSLocationInfo = _kLSLocationInfoService.Repository.QueryFirst(x => x.LocationCode == locationCode); |
| | | if (dt_KLSLocationInfo != null) |
| | | { |
| | | if (locationStatusEnum == LocationStatusEnum.Free) //å¦æèµ·ç¹å®æå°±ç»è´§ä½èµå¼æçå· |
| | | { |
| | | dt_KLSLocationInfo.PalletCode = ""; |
| | | } |
| | | else |
| | | { |
| | | dt_KLSLocationInfo.PalletCode = palletCode; |
| | | } |
| | | dt_KLSLocationInfo.LocationStatus = locationStatusEnum.ObjToInt(); |
| | | _kLSLocationInfoService.Repository.UpdateData(dt_KLSLocationInfo); |
| | | } |
| | | } |
| | | else if (deviceTypeEnum == DeviceTypeEnum.HIKROBOT) |
| | | { |
| | | Dt_HKLocationInfo? dt_HKLocationInfo = _hKLocationInfoService.Repository.QueryFirst(x => x.LocationCode == locationCode); |
| | | if (dt_HKLocationInfo != null) |
| | | { |
| | | if (locationStatusEnum == LocationStatusEnum.Free) //å¦æèµ·ç¹å®æå°±ç»è´§ä½èµå¼æçå· |
| | | { |
| | | dt_HKLocationInfo.PalletCode = ""; |
| | | } |
| | | else |
| | | { |
| | | dt_HKLocationInfo.PalletCode = palletCode; |
| | | } |
| | | dt_HKLocationInfo.LocationStatus = locationStatusEnum.ObjToInt(); |
| | | _hKLocationInfoService.Repository.UpdateData(dt_HKLocationInfo); |
| | | } |
| | | } |
| | | else if (deviceTypeEnum == DeviceTypeEnum.YuanLiJuHe) |
| | | { |
| | | Dt_RGVLocationInfo dt_RGVLocationInfo = _rGVLocationInfoService.Repository.QueryFirst(x => x.LocationCode == locationCode); |
| | | //è¿éå°ä»»å¡çæçå·ç»è´§ä½è¡¨ä¸çPalletCodeåæ®µã |
| | | |
| | | if (dt_RGVLocationInfo != null) |
| | | { |
| | | if (locationStatusEnum == LocationStatusEnum.Free) //å¦æèµ·ç¹å®æå°±ç»è´§ä½èµå¼æçå· |
| | | { |
| | | dt_RGVLocationInfo.PalletCode = ""; |
| | | } |
| | | else |
| | | { |
| | | dt_RGVLocationInfo.PalletCode = palletCode; |
| | | } |
| | | dt_RGVLocationInfo.LocationStatus = locationStatusEnum.ObjToInt(); |
| | | _rGVLocationInfoService.Repository.UpdateData(dt_RGVLocationInfo); |
| | | } |
| | | } |
| | | else//å¹³åºåºä½ |
| | | { |
| | | |
| | | } |
| | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | throw new Exception(ex.Message); |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | #region 䏿¥WMS |
| | | public WebResponseContent TaskFeedback(Dt_Task dt_Task, int Status) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | WMSInOutBoundCompleteFeedback boundCompleteFeedback = new WMSInOutBoundCompleteFeedback(); |
| | | WMSReturn agvContent = null; |
| | | try |
| | | { |
| | | Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(WMSInOutBoundCompleteFeedback)); |
| | | if (apiInfo == null) dt_Task.ExceptionMessage = "æªæ¾å°åºå
¥åºå®æåé¦WMSæ¥å£é
置信æ¯ï¼è¯·æ£æ¥æ¥å£é
ç½®"; |
| | | else |
| | | { |
| | | boundCompleteFeedback.taskCode = dt_Task.WMSTaskNum; |
| | | boundCompleteFeedback.containerCode = dt_Task.PalletCode; |
| | | boundCompleteFeedback.fromStationCode = dt_Task.SourceAddress; |
| | | boundCompleteFeedback.toLocationCode = dt_Task.TargetAddress; |
| | | boundCompleteFeedback.status = Status; |
| | | boundCompleteFeedback.custStatus = ""; |
| | | string response = HttpHelper.Post(apiInfo.ApiAddress, boundCompleteFeedback.Serialize()); |
| | | agvContent = response.DeserializeObject<WMSReturn>(); |
| | | content.OK(data: agvContent); |
| | | if (agvContent.code != 200) |
| | | { |
| | | dt_Task.ExceptionMessage = agvContent.message; |
| | | content.Error(agvContent.message); |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | dt_Task.ExceptionMessage = ex.Message; |
| | | } |
| | | finally |
| | | { |
| | | _trackloginfoService.AddTrackLog(boundCompleteFeedback, content, "åºå
¥åºä»»å¡ç¶æåé¦WMS", "", ""); |
| | | if (agvContent != null && agvContent.code == 200 && Status == 2) |
| | | BaseDal.DeleteAndMoveIntoHty(dt_Task, OperateTypeEnum.èªå¨å®æ); |
| | | else |
| | | BaseDal.UpdateData(dt_Task); |
| | | } |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | | #endregion |
| | | #region 失败任å¡ä¸æ¥WMSå¹¶å é¤ä»»å¡ |
| | | public WebResponseContent ErrorTaskFeedback(Dt_Task dt_Task, bool Del) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | WMSInOutBoundCompleteFeedback boundCompleteFeedback = new WMSInOutBoundCompleteFeedback(); |
| | | WMSReturn agvContent = null; |
| | | try |
| | | { |
| | | Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(WMSInOutBoundCompleteFeedback)); |
| | | if (apiInfo == null) dt_Task.ExceptionMessage = "æªæ¾å°åºå
¥åºå®æåé¦WMSæ¥å£é
置信æ¯ï¼è¯·æ£æ¥æ¥å£é
ç½®"; |
| | | else |
| | | { |
| | | boundCompleteFeedback.taskCode = dt_Task.WMSTaskNum; |
| | | boundCompleteFeedback.containerCode = dt_Task.PalletCode; |
| | | boundCompleteFeedback.fromStationCode = dt_Task.SourceAddress; |
| | | boundCompleteFeedback.toLocationCode = dt_Task.TargetAddress; |
| | | boundCompleteFeedback.status = 3; |
| | | boundCompleteFeedback.custStatus = ""; |
| | | boundCompleteFeedback.memo = dt_Task.ExceptionMessage; |
| | | string response = HttpHelper.Post(apiInfo.ApiAddress, boundCompleteFeedback.Serialize()); |
| | | agvContent = response.DeserializeObject<WMSReturn>(); |
| | | content.OK(data: agvContent); |
| | | if (agvContent.code != 200) |
| | | { |
| | | dt_Task.ExceptionMessage = agvContent.message; |
| | | content.Error(agvContent.message); |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | dt_Task.ExceptionMessage = ex.Message; |
| | | content.Error(ex.Message); |
| | | } |
| | | finally |
| | | { |
| | | _trackloginfoService.AddTrackLog(boundCompleteFeedback, content, "åºå
¥åºä»»å¡ç¶æåé¦WMS", "", ""); |
| | | if (agvContent != null && agvContent.code == 200 && Del) BaseDal.DeleteAndMoveIntoHty(dt_Task, OperateTypeEnum.èªå¨å é¤); |
| | | else BaseDal.UpdateData(dt_Task); |
| | | } |
| | | return content; |
| | | } |
| | | #endregion |
| | | } |
| | | } |