Merge branch 'xiaoyang' into dev
| | |
| | | /// æ ¹æ®è®¾å¤ç¼å·ãå½åå°åæç
§ä¼å
级以åå建æ¶é´æåºæ¥è¯¢ä»»å¡æ± åºåºç±»åçæ°å¢çä»»å¡ |
| | | /// </summary> |
| | | /// <param name="deviceNo">设å¤ç¼å·</param> |
| | | /// <param name="outStationCodes">å½åå°å</param> |
| | | /// <param name="outStationCodes">åºåºç«å°å°å</param> |
| | | /// <returns>è¿åä»»å¡å®ä½å¯¹è±¡éåï¼å¯è½ä¸ºnull</returns> |
| | | List<Dt_Task> QueryStackerCraneOutTasks(string deviceNo, List<string> outStationCodes); |
| | | List<Dt_Task> QueryStackerCraneOutTasks(string deviceNo, List<string> outStationCodes,bool isTrue = true); |
| | | |
| | | /// <summary> |
| | | /// æ´æ°ä»»å¡å¼å¸¸ä¿¡æ¯æ¾ç¤º |
| | |
| | | Dt_Task? UpdatePosition(int taskNum, string currentAddress); |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®ä»»å¡å·ãå½åå°åãä¸ä¸å°åæ´æ°ä»»å¡ä½ç½®ä¿¡æ¯ |
| | | /// </summary> |
| | | /// <param name="taskNum">ä»»å¡å·</param> |
| | | /// <param name="currentAddress">å½åå°å</param> |
| | | /// <param name="nextAddress">ä¸ä¸å°å</param> |
| | | /// <returns></returns> |
| | | Dt_Task? UpdatePosition(int taskNum, string currentAddress, string nextAddress); |
| | | |
| | | /// <summary> |
| | | /// ä»»å¡å®æ |
| | | /// </summary> |
| | | /// <param name="taskNum">ä»»å¡ç¼å·</param> |
| | |
| | | |
| | | if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish && task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty) |
| | | { |
| | | _robotTaskService.CreateLocalRobotTask(task); |
| | | return _robotTaskService.CreateLocalRobotTask(task); |
| | | //if (!content.Status) |
| | | //{ |
| | | // return content; |
| | |
| | | StockDTO stock = BuildRobotTaskStock(task, configKey); |
| | | |
| | | // è·åæååæ¾ç½®å°åç线ä½é
ç½®ï¼å¦ææï¼ |
| | | var section = App.Configuration.GetSection("RobotTaskAddressRules").GetSection(stock?.TargetLineNo ?? string.Empty).GetChildren().Select(c => c.Value).ToArray(); |
| | | var section = App.Configuration.GetSection("RobotAddressRules").GetSection(stock?.TargetLineNo ?? string.Empty).GetChildren().Select(c => c.Value).ToArray(); |
| | | if (section.Length < 2) |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°çº¿ä½[{stock?.TargetLineNo}]çå°åé
ç½®"); |
| | | |
| | | int taskType = MapConfigKeyToRobotTaskType(configKey); |
| | | // å建æ¬å°æºå¨äººä»»å¡ |
| | | Dt_RobotTask robotTask = new() |
| | | { |
| | |
| | | RobotTargetAddress = section[1]!, |
| | | RobotSourceAddressLineCode = stock?.SourceLineNo ?? string.Empty, |
| | | RobotTargetAddressLineCode = stock?.TargetLineNo ?? string.Empty, |
| | | RobotRoadway = stock?.Roadway ?? string.Empty, |
| | | RobotRoadway = stock?.TargetLineNo == "11068" ? "注液ç»çæºæ¢°æ" : "æ¢çæºæ¢°æ" ?? string.Empty, // todo |
| | | RobotSourceAddressPalletCode = stock?.SourcePalletNo ?? string.Empty, |
| | | RobotTargetAddressPalletCode = stock?.TargetPalletNo ?? string.Empty, |
| | | RobotTaskType = MapConfigKeyToRobotTaskType(configKey), |
| | | RobotTaskType = taskType, |
| | | RobotTaskState = (int)TaskRobotStatusEnum.RobotNew, |
| | | RobotGrade = task.Grade, |
| | | Creater = "WCS_Local", |
| | | RobotTaskTotalNum = 1, |
| | | RobotTaskTotalNum = taskType == (int)RobotTaskTypeEnum.GroupPallet ? 48 : 1, |
| | | CreateDate = DateTime.Now |
| | | }; |
| | | |
| | |
| | | /// <param name="deviceNo">设å¤ç¼å·</param> |
| | | /// <param name="currentAddress">å½åå°å</param> |
| | | /// <returns>è¿åä»»å¡å®ä½å¯¹è±¡éåï¼å¯è½ä¸ºnull</returns> |
| | | public List<Dt_Task> QueryStackerCraneOutTasks(string deviceNo, List<string> outStationCodes) |
| | | public List<Dt_Task> QueryStackerCraneOutTasks(string deviceNo, List<string> outStationCodes, bool isTrue = true) |
| | | { |
| | | return BaseDal.QueryData(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew && outStationCodes.Contains(x.CurrentAddress), TaskOrderBy); |
| | | if (isTrue) |
| | | return BaseDal.QueryData(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew && outStationCodes.Contains(x.NextAddress), TaskOrderBy); |
| | | else |
| | | return BaseDal.QueryData(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskStatus == (int)TaskOutStatusEnum.OutNew && !outStationCodes.Contains(x.NextAddress), TaskOrderBy); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®ä»»å¡å·ãå½åå°åæ´æ°ä»»å¡ä½ç½®ä¿¡æ¯ |
| | | /// </summary> |
| | | /// <param name="taskNum">ä»»å¡å·</param> |
| | | /// <param name="currentAddress">å½åå°å</param> |
| | | /// <param name="nextAddress">ä¸ä¸å°å</param> |
| | | /// <returns></returns> |
| | | public Dt_Task? UpdatePosition(int taskNum, string currentAddress, string nextAddress) |
| | | { |
| | | try |
| | | { |
| | | if (string.IsNullOrEmpty(currentAddress)) |
| | | throw new ArgumentNullException(nameof(currentAddress), "å½åå°åä¸è½ä¸ºç©º"); |
| | | |
| | | Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.CurrentAddress == currentAddress); |
| | | if (task == null) throw new Exception($"æªæ¾å°è¯¥ä»»å¡ä¿¡æ¯,ä»»å¡å·:ã{taskNum}ã"); |
| | | |
| | | string oldCurrentPos = task.CurrentAddress; |
| | | string oldNextPos = task.NextAddress; |
| | | |
| | | task.CurrentAddress = task.NextAddress; |
| | | task.NextAddress = nextAddress; |
| | | |
| | | task.ModifyDate = DateTime.Now; |
| | | task.Modifier = "System"; |
| | | BaseDal.UpdateData(task); |
| | | |
| | | _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"ç³»ç»èªå¨æµç¨ï¼æ´æ°å½åä½ç½®ã{oldCurrentPos} ----> {task.CurrentAddress}ãåä¸ä¸ä½ç½®ã{oldNextPos} ----> {task.NextAddress}ã"); |
| | | return task; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine($"UpdatePosition æ´æ°ä»»å¡ä½ç½®å¤±è´¥,ä»»å¡å·:ã{taskNum}ã,é误信æ¯:ã{ex.Message}ã"); |
| | | } |
| | | return null; |
| | | } |
| | | } |
| | |
| | | var task = _taskService.QueryManualInboundTask(childDeviceCode); |
| | | if (task != null) |
| | | { |
| | | QuartzLogHelper.LogInfo(_logger, $"è·åå°è¾é线å¼å§ä»»å¡ï¼ä»»å¡å·ï¼{task.TaskNum}ï¼ç¶æ: {task.TaskStatus},å½åå°åï¼{conveyorLine.DeviceCode}", conveyorLine.DeviceCode); |
| | | var handler = new ManualInboundTaskHandler(_taskService, _logger); |
| | | handler.WriteTaskToPlc(conveyorLine, childDeviceCode, task); |
| | | } |
| | |
| | | Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.TaskNo, childDeviceCode); |
| | | if (!task.IsNullOrEmpty()) |
| | | { |
| | | QuartzLogHelper.LogInfo(_logger, "Executeï¼åè®¾å¤ {ChildDeviceCode} å¤çä»»å¡ {TaskNum}ï¼ç¶æ: {Status}", $"å¤çä»»å¡ {task.TaskNum}ï¼ç¶æ: {task.TaskStatus}", conveyorLine.DeviceCode, childDeviceCode, task.TaskNum, task.TaskStatus); |
| | | QuartzLogHelper.LogInfo(_logger, $"å¤çä»»å¡ {task.TaskNum}ï¼ç¶æ: {task.TaskStatus}", conveyorLine.DeviceCode); |
| | | // å¤çä»»å¡ç¶æï¼æ ¹æ®ç¶æååå°ä¸åæ¹æ³ï¼ |
| | | ProcessTaskState(conveyorLine, command, task, childDeviceCode); |
| | | return Task.CompletedTask; |
| | | } |
| | | else if (!command.Barcode.IsNullOrEmpty() && childDeviceCode == "11068") |
| | | { |
| | | if (_robotTaskService.Db.Queryable<Dt_RobotTask>().Any(x => x.RobotTargetAddressPalletCode == command.Barcode)) |
| | | var isWcsTask = _taskService.Db.Queryable<Dt_Task>().Any(x => x.PalletCode == command.Barcode && x.TaskStatus == (int)TaskOutStatusEnum.OutNew); |
| | | var isRobotTask = _robotTaskService.Db.Queryable<Dt_RobotTask>().Any(x => x.RobotTargetAddressPalletCode == command.Barcode); |
| | | if (isWcsTask || isRobotTask) |
| | | { |
| | | return Task.CompletedTask; |
| | | } |
| | | |
| | | Random rnd = new Random(); |
| | | int num = rnd.StrictNext();//产ççéæºæ° |
| | | // 没æä»»å¡å·ä½ææ¡ç å¹¶ä¸å¨11068ä½ç½®ï¼ç´æ¥æ·»å æºæ¢°æç»çä»»å¡ |
| | | // ç´æ¥æ·»å æºæ¢°æç»çä»»å¡ |
| | | Dt_RobotTask robotTask = new Dt_RobotTask |
| | | { |
| | | RobotTargetAddressPalletCode = command.Barcode, |
| | |
| | | RobotGrade = 1, |
| | | RobotRoadway = "注液ç»çæºæ¢°æ", |
| | | RobotTargetAddressLineCode = childDeviceCode, |
| | | RobotTaskNum = num, // çæä»»å¡å· |
| | | RobotTaskNum = Random.Shared.StrictNext(), // çæä»»å¡å· |
| | | RobotDispatchertime = DateTime.Now, |
| | | }; |
| | | if (_robotTaskService.AddData(robotTask).Status) |
| | | { |
| | | QuartzLogHelper.LogInfo(_logger, $"çäº§æºæ¢°æä»»å¡æåï¼ {robotTask.RobotTaskNum}ï¼ç¶æ: {robotTask.RobotTaskState},å½åå°åï¼{conveyorLine.DeviceCode}", conveyorLine.DeviceCode); |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode); |
| | | } |
| | | } |
| | |
| | | using MapsterMapper; |
| | | using Serilog; |
| | | using System.Threading.Tasks; |
| | | using WIDESEAWCS_Common.TaskEnum; |
| | | using WIDESEAWCS_Core; |
| | | using WIDESEAWCS_ITaskInfoService; |
| | |
| | | |
| | | QuartzLogHelper.LogInfo(_logger, $"RequestInNextAddressï¼å
¥åºä¸ä¸å°åï¼ä»»å¡å·: {task.TaskNum}ï¼å设å¤: {childDeviceCode}", conveyorLine.DeviceCode); |
| | | |
| | | //// 妿䏿¯ç©ºæçä»»å¡ï¼å¤çç®æ å°å |
| | | //if (task.TaskType != (int)TaskOutboundTypeEnum.OutEmpty) |
| | | //{ |
| | | bool isEmptyTask = task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty; |
| | | |
| | | Dt_Router routers = _routerService.QueryNextRoute(task.NextAddress, task.TargetAddress); |
| | | if (routers == null) throw new Exception($"æªæ¾å°è®¾å¤è·¯ç±ä¿¡æ¯"); |
| | | // ç¡®å®ç®æ å°å |
| | | string targetAddress; |
| | | if (isEmptyTask) |
| | | { |
| | | targetAddress = "2125"; |
| | | QuartzLogHelper.LogDebug(_logger, $"å设å¤: {childDeviceCode}ï¼å
¥åºä¸ä¸ç®æ å°å: {2125}", conveyorLine.DeviceCode); |
| | | } |
| | | else |
| | | { |
| | | Dt_Router routers = _routerService.QueryNextRoute(task.NextAddress, task.TargetAddress); |
| | | if (routers == null) throw new Exception($"æªæ¾å°è®¾å¤è·¯ç±ä¿¡æ¯"); |
| | | targetAddress = routers.ChildPosi; |
| | | } |
| | | |
| | | _targetAddressSelector.HandleInboundNextAddress(conveyorLine, routers.ChildPosi, childDeviceCode); |
| | | //} |
| | | // å¤çç®æ å°åï¼ChildPosi == "2125" æ¶è·³è¿ HandleInboundNextAddress |
| | | if (targetAddress == "2125") |
| | | { |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.Target, "2125", childDeviceCode); |
| | | } |
| | | else if (!_targetAddressSelector.HandleInboundNextAddress(conveyorLine, targetAddress, childDeviceCode)) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | // æ´æ°ä»»å¡å½åä½ç½® |
| | | _ = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress); |
| | | |
| | | // 设置 WCS_STB æ å¿ï¼è¡¨ç¤º WCS å·²å¤ç |
| | | // æ´æ°ä»»å¡å½åä½ç½®å WCS_ACK |
| | | if (isEmptyTask) |
| | | { |
| | | _ = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress, "2125"); |
| | | } |
| | | else |
| | | { |
| | | _ = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress); |
| | | } |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode); |
| | | } |
| | | |
| | |
| | | /// <param name="conveyorLine">è¾é线设å¤å¯¹è±¡</param> |
| | | /// <param name="command">PLC å½ä»¤æ°æ®</param> |
| | | /// <param name="childDeviceCode">å设å¤ç¼ç </param> |
| | | public void RequestOutbound(CommonConveyorLine conveyorLine, ConveyorLineTaskCommandNew command, string childDeviceCode) |
| | | public Task RequestOutbound(CommonConveyorLine conveyorLine, ConveyorLineTaskCommandNew command, string childDeviceCode) |
| | | { |
| | | // æ¥è¯¢å¾
å¤çä»»å¡ |
| | | Dt_Task? task = _taskFilter.QueryPendingTask(conveyorLine.DeviceCode, childDeviceCode); |
| | | if (task != null) |
| | | if (task == null) return Task.CompletedTask; |
| | | |
| | | // ç¡®å®ç®æ å°åï¼ç©ºæçä»»å¡ä½¿ç¨ "2201"ï¼å
¶ä»ä»»å¡ä½¿ç¨ NextAddress |
| | | var isEmptyTask = task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty; |
| | | var targetAddress = task.CurrentAddress == "2217" ? (isEmptyTask ? "2201" : task.NextAddress) : task.NextAddress; |
| | | |
| | | // å¤çç¹æ®å°å 2217ï¼éè¦è°ç¨ç®æ å°åéæ©å¨ |
| | | if (task.CurrentAddress == "2217" && !_targetAddressSelector.HandleOutboundNextAddress(conveyorLine, targetAddress, childDeviceCode)) |
| | | { |
| | | // 设置任å¡å· |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, task.TaskNum, childDeviceCode); |
| | | |
| | | // 设置æçæ¡ç |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.Barcode, task.PalletCode, childDeviceCode); |
| | | |
| | | // è®¾ç½®ç®æ å°å |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.Target, task.NextAddress, childDeviceCode); |
| | | |
| | | // åå¤ ACK 确认 |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode); |
| | | |
| | | // æ´æ°ä»»å¡ç¶æ |
| | | _taskService.UpdateTaskStatusToNext(task); |
| | | |
| | | QuartzLogHelper.LogInfo(_logger, "RequestOutboundï¼åºåºä»»å¡å·²ä¸åï¼ä»»å¡å·: {TaskNum}ï¼å设å¤: {ChildDeviceCode}", $"åºåºä»»å¡å·²ä¸åï¼ä»»å¡å·: {task.TaskNum}", conveyorLine.DeviceCode, task.TaskNum, childDeviceCode); |
| | | return Task.CompletedTask; ; |
| | | } |
| | | |
| | | // 设置任å¡å·ãæçæ¡ç ãç®æ å°åãWCS_ACK |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, task.TaskNum, childDeviceCode); |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.Barcode, task.PalletCode, childDeviceCode); |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.Target, targetAddress, childDeviceCode); |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode); |
| | | |
| | | // æ´æ°ä»»å¡ç¶ææä½ç½® |
| | | if (isEmptyTask && task.NextAddress == "2217") |
| | | { |
| | | task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskOutStatusEnum>(); |
| | | task.NextAddress = "2201"; |
| | | _taskService.Repository.UpdateData(task); |
| | | } |
| | | else |
| | | { |
| | | _taskService.UpdateTaskStatusToNext(task); |
| | | } |
| | | |
| | | QuartzLogHelper.LogInfo(_logger, "RequestOutboundï¼åºåºä»»å¡å·²ä¸åï¼ä»»å¡å·: {TaskNum}ï¼å设å¤: {ChildDeviceCode}", $"åºåºä»»å¡å·²ä¸åï¼ä»»å¡å·: {task.TaskNum}", conveyorLine.DeviceCode, task.TaskNum, childDeviceCode); |
| | | return Task.CompletedTask; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// å½åºåºä»»å¡æ§è¡å°æä¸ªä¸é´ç«ç¹æ¶è°ç¨ã |
| | | /// æ ¹æ®ä¸ä¸å°å夿æ¯å¦éè¦ä¸æææº/ææéæºç设å¤äº¤äºã |
| | | /// </remarks> |
| | | /// <param name="conveyorLine">è¾é线设å¤å¯¹è±¡</param> |
| | | /// <param name="command">PLC å½ä»¤æ°æ®</param> |
| | |
| | | /// <param name="conveyorLine">è¾é线设å¤å¯¹è±¡ï¼ç¨äºåå
¥ç®æ å°åå ACK ä¿¡å·</param> |
| | | /// <param name="nextAddress">ä¸ä¸å°å/ç®æ 设å¤ç¼ç ï¼ç¨äºè¯å«ç®æ 设å¤ç±»å</param> |
| | | /// <param name="childDeviceCode">å½åå设å¤ç¼ç ï¼ç¨äºç²¾ç¡®å®ä½åå
¥åªä¸ªå设å¤</param> |
| | | public void HandleInboundNextAddress(CommonConveyorLine conveyorLine, string nextAddress, string childDeviceCode) |
| | | public bool HandleInboundNextAddress(CommonConveyorLine conveyorLine, string nextAddress, string childDeviceCode) |
| | | { |
| | | // è®°å½å
¥åºåºæ¯çè°è¯æ¥å¿ï¼å
å«å设å¤åç®æ å°åä¿¡æ¯ |
| | | WriteDebug(conveyorLine, "å
¥åºä¸ä¸å°å", childDeviceCode, nextAddress); |
| | |
| | | bool isAvailable = cvState == 2; |
| | | if (isAvailable) |
| | | { |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.Target, Convert.ToInt16(nextAddress), childDeviceCode); |
| | | return conveyorLine.SetValue(ConveyorLineDBNameNew.Target, Convert.ToInt16(nextAddress), childDeviceCode); |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | /// <param name="conveyorLine">è¾é线设å¤å¯¹è±¡ï¼ç¨äºåå
¥ç®æ å°åå ACK ä¿¡å·</param> |
| | | /// <param name="nextAddress">ä¸ä¸å°å/ç®æ 设å¤ç¼ç ï¼ç¨äºè¯å«ç®æ 设å¤ç±»å</param> |
| | | /// <param name="childDeviceCode">å½åå设å¤ç¼ç ï¼ç¨äºç²¾ç¡®å®ä½åå
¥åªä¸ªå设å¤</param> |
| | | public void HandleOutboundNextAddress(CommonConveyorLine conveyorLine, string nextAddress, string childDeviceCode) |
| | | public bool HandleOutboundNextAddress(CommonConveyorLine conveyorLine, string nextAddress, string childDeviceCode) |
| | | { |
| | | // è®°å½åºåºåºæ¯çè°è¯æ¥å¿ï¼å
å«å设å¤åç®æ å°åä¿¡æ¯ |
| | | WriteDebug(conveyorLine, "åºåºä¸ä¸å°å", childDeviceCode, nextAddress); |
| | |
| | | bool isAvailable = cvState == 2; |
| | | if (isAvailable) |
| | | { |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.Target, Convert.ToInt16(nextAddress), childDeviceCode); |
| | | return conveyorLine.SetValue(ConveyorLineDBNameNew.Target, Convert.ToInt16(nextAddress), childDeviceCode); |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | try |
| | | { |
| | | // åå
¥ä»»å¡å· |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, (short)task.TaskNum, childDeviceCode); |
| | | // åå
¥èµ·å§å°å |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.Source, short.Parse(task.SourceAddress ?? "0"), childDeviceCode); |
| | | var isTaskNum = conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, (short)task.TaskNum, childDeviceCode); |
| | | if (!isTaskNum) return; |
| | | QuartzLogHelper.LogInfo(_logger, $"ä»»å¡å·åå
¥PLCæåï¼ä»»å¡å·ã{task.TaskNum}ã", conveyorLine.DeviceCode); |
| | | Thread.Sleep(500); |
| | | |
| | | //// åå
¥èµ·å§å°å |
| | | //conveyorLine.SetValue(ConveyorLineDBNameNew.Source, short.Parse(task.SourceAddress ?? "0"), childDeviceCode); |
| | | //QuartzLogHelper.LogInfo(_logger, $"ä»»å¡å·åå
¥PLCæåï¼ä»»å¡å·ã{task.TaskNum}ã", conveyorLine.DeviceCode); |
| | | //Thread.Sleep(500); |
| | | |
| | | // åå
¥ç®æ å°å |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.Target, short.Parse(task.NextAddress ?? "0"), childDeviceCode); |
| | | var isTarget = conveyorLine.SetValue(ConveyorLineDBNameNew.Target, short.Parse(task.NextAddress ?? "0"), childDeviceCode); |
| | | if (!isTarget) return; |
| | | QuartzLogHelper.LogInfo(_logger, $"ç®æ å°ååå
¥PLCæåï¼ç®æ å°åã{task.NextAddress}ã", conveyorLine.DeviceCode); |
| | | Thread.Sleep(500); |
| | | |
| | | // åå
¥æçå· |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.Barcode, task.PalletCode, childDeviceCode); |
| | | //conveyorLine.SetValue(ConveyorLineDBNameNew.Barcode, task.PalletCode, childDeviceCode); |
| | | |
| | | // æ´æ°ä»»å¡ç¶æå°ä¸ä¸é¶æ®µ |
| | | var updateResult = _taskService.UpdateTaskStatusToNext(task); |
| | |
| | | // åå
¥ACKæ å¿ |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode); |
| | | |
| | | QuartzLogHelper.LogInfo(_logger, $"ManualInboundTaskHandler: æå¨ä»»å¡åå
¥PLCæåï¼ä»»å¡å·ã{task.TaskNum}ãï¼æºå°åã{task.SourceAddress}ã", conveyorLine.DeviceCode); |
| | | QuartzLogHelper.LogInfo(_logger, $"ManualInboundTaskHandler: æå¨ä»»å¡åå
¥PLCæåï¼ä»»å¡å·ã{task.TaskNum}ãï¼æºå°åã{task.SourceAddress}ãï¼ç®æ å°åã{task.NextAddress}ã", conveyorLine.DeviceCode); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | |
| | | // åå§åå½ä»¤å¤çå¨ |
| | | // ç®åå½ä»¤å¤çå¨ï¼å¤çç¶ææ´æ°çç®åå½ä»¤ |
| | | var simpleCommandHandler = new RobotSimpleCommandHandler(_taskProcessor, socketGateway, _logger); |
| | | var simpleCommandHandler = new RobotSimpleCommandHandler(_taskProcessor, socketGateway, _logger, _stateManager); |
| | | // åç¼å½ä»¤å¤çå¨ï¼å¤ç pickfinishedãputfinished ç另忰çå½ä»¤ |
| | | var prefixCommandHandler = new RobotPrefixCommandHandler(robotTaskService, _taskProcessor, _stateManager, socketGateway, fakeBatteryPositionService, _logger); |
| | | |
| | |
| | | var task = _taskProcessor.GetTask(robotCrane); |
| | | |
| | | // å¦ææ²¡æè·åå°å¾
å¤çä»»å¡ï¼ä¸RobotArmObject为1ï¼æç©æï¼ï¼åè·åè¯¥è®¾å¤æ§è¡ä¸çä»»å¡ |
| | | if (task == null && state.RobotArmObject == 1) |
| | | { |
| | | task = _taskProcessor.GetExecutingTask(robotCrane); |
| | | } |
| | | //if (task == null && state.RobotArmObject == 1) |
| | | //{ |
| | | // task = _taskProcessor.GetExecutingTask(robotCrane); |
| | | //} |
| | | |
| | | // 妿æå¾
å¤çä»»å¡ |
| | | if (task != null) |
| | |
| | | if (state.OperStatus == message) |
| | | { |
| | | // å¤çæååï¼å°åæ¶æ¯ååå°å®¢æ·ç«¯ï¼ä¿æåæè¡ä¸ºï¼ |
| | | await _socketClientGateway.SendMessageAsync(client, message); |
| | | //await _socketClientGateway.SendMessageAsync(client, message); |
| | | } |
| | | // è®°å½æ¥æ¶å°çæ¶æ¯æ¥å¿ |
| | | QuartzLogHelper.LogInfo(_logger, $"æ¥æ¶å°å®¢æ·ç«¯ã{state.RobotCrane?.DeviceName}ãåéæ¶æ¯ã{message}ã", state.RobotCrane?.DeviceName); |
| | |
| | | // æå»ºåè´§æä»¤ï¼æ ¼å¼ï¼Pickbattery,{æºå°å} |
| | | string taskString = $"Pickbattery,{task.RobotSourceAddress}"; |
| | | |
| | | // éè¿ Socket ç½å
³åéæä»¤å°æºå¨äººå®¢æ·ç«¯ |
| | | bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString); |
| | | // æ´æ°ä»»å¡ç¶æä¸º"æºå¨äººæ§è¡ä¸" |
| | | task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode(); |
| | | |
| | | if (result) |
| | | // å°ä»»å¡å
³èå°ç¶æå¯¹è±¡ |
| | | state.CurrentTask = task; |
| | | |
| | | if (isScanNG) |
| | | { |
| | | // åéæåï¼è®°å½ Info æ¥å¿ |
| | | QuartzLogHelper.LogInfo(_logger, $"ä¸ååè´§æä»¤æåï¼æä»¤: {taskString}ï¼è®¾å¤: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName); |
| | | |
| | | // æ´æ°ä»»å¡ç¶æä¸º"æºå¨äººæ§è¡ä¸" |
| | | task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode(); |
| | | |
| | | // å°ä»»å¡å
³èå°ç¶æå¯¹è±¡ |
| | | state.CurrentTask = task; |
| | | |
| | | if (isScanNG) |
| | | { |
| | | state.IsScanNG = true; |
| | | } |
| | | |
| | | // ä¿æåè¯ä¹ï¼ä»
å¨ç¶æå®å
¨åå
¥æåååæ´æ°ä»»å¡ç¶æ |
| | | // è¿æ ·å¯ä»¥ç¡®ä¿ç¶æåä»»å¡è®°å½çä¸è´æ§ |
| | | if (_stateManager.TryUpdateStateSafely(state.IPAddress, state)) |
| | | { |
| | | await _robotTaskService.UpdateRobotTaskAsync(task); |
| | | } |
| | | state.IsScanNG = true; |
| | | } |
| | | else |
| | | |
| | | // ä¿æåè¯ä¹ï¼ä»
å¨ç¶æå®å
¨åå
¥æåååæ´æ°ä»»å¡ç¶æ |
| | | // è¿æ ·å¯ä»¥ç¡®ä¿ç¶æåä»»å¡è®°å½çä¸è´æ§ |
| | | if (_stateManager.TryUpdateStateSafely(state.IPAddress, state)) |
| | | { |
| | | // åé失败ï¼è®°å½ Error æ¥å¿ |
| | | QuartzLogHelper.LogError(_logger, $"ä¸ååè´§æä»¤å¤±è´¥ï¼æä»¤: {taskString}ï¼è®¾å¤: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName); |
| | | QuartzLogHelper.LogInfo(_logger, $"ç¶ææ´æ°æåï¼è®¾å¤: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName); |
| | | // éè¿ Socket ç½å
³åéæä»¤å°æºå¨äººå®¢æ·ç«¯ |
| | | bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString); |
| | | if (result) |
| | | { |
| | | // åéæåï¼è®°å½ Info æ¥å¿ |
| | | QuartzLogHelper.LogInfo(_logger, $"ä¸ååè´§æä»¤æåï¼æä»¤: {taskString}ï¼è®¾å¤: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName); |
| | | //await _robotTaskService.UpdateRobotTaskAsync(task); |
| | | } |
| | | else |
| | | { |
| | | // åé失败ï¼è®°å½ Error æ¥å¿ |
| | | QuartzLogHelper.LogError(_logger, $"ä¸ååè´§æä»¤å¤±è´¥ï¼æä»¤: {taskString}ï¼è®¾å¤: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | // æ è®°ç¹ä½ä¸ºå·²ä½¿ç¨ |
| | | _fakeBatteryPositionService.MarkAsUsed(positions); |
| | | |
| | | // éè¿ Socket ç½å
³åéæä»¤å°æºå¨äººå®¢æ·ç«¯ |
| | | bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString); |
| | | // æ´æ°ä»»å¡ç¶æä¸º"æºå¨äººæ§è¡ä¸" |
| | | task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode(); |
| | | |
| | | if (result) |
| | | // å°ä»»å¡å
³èå°ç¶æå¯¹è±¡ |
| | | state.CurrentTask = task; |
| | | |
| | | if (_stateManager.TryUpdateStateSafely(state.IPAddress, state)) |
| | | { |
| | | QuartzLogHelper.LogInfo(_logger, $"ä¸ååçµè¯åè´§æä»¤æåï¼æä»¤: {taskString}ï¼ç¹ä½: {string.Join(",", positions)}ï¼è®¾å¤: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName); |
| | | // éè¿ Socket ç½å
³åéæä»¤å°æºå¨äººå®¢æ·ç«¯ |
| | | bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString); |
| | | |
| | | // æ´æ°ä»»å¡ç¶æä¸º"æºå¨äººæ§è¡ä¸" |
| | | task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode(); |
| | | |
| | | // å°ä»»å¡å
³èå°ç¶æå¯¹è±¡ |
| | | state.CurrentTask = task; |
| | | |
| | | if (_stateManager.TryUpdateStateSafely(state.IPAddress, state)) |
| | | if (result) |
| | | { |
| | | await _robotTaskService.UpdateRobotTaskAsync(task); |
| | | QuartzLogHelper.LogInfo(_logger, $"ä¸ååçµè¯åè´§æä»¤æåï¼æä»¤: {taskString}ï¼ç¹ä½: {string.Join(",", positions)}ï¼è®¾å¤: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName); |
| | | //await _robotTaskService.UpdateRobotTaskAsync(task); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | QuartzLogHelper.LogError(_logger, $"ä¸ååçµè¯åè´§æä»¤å¤±è´¥ï¼æä»¤: {taskString}ï¼è®¾å¤: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName); |
| | | else |
| | | { |
| | | QuartzLogHelper.LogError(_logger, $"ä¸ååçµè¯åè´§æä»¤å¤±è´¥ï¼æä»¤: {taskString}ï¼è®¾å¤: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | /// <param name="batchEnd">æ¹æ¬¡ç»æç¼å·</param> |
| | | public async Task SendPickWithBatchAsync(Dt_RobotTask task, RobotSocketState state, string position, int batchStart, int batchEnd) |
| | | { |
| | | // å
åéæ»æ°æä»¤ |
| | | string totalNumCmd = $"PickTotalNum,{task.RobotTaskTotalNum}"; |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, totalNumCmd); |
| | | |
| | | // ååéæ¹æ¬¡åè´§æä»¤ |
| | | string range = batchEnd == 0 ? $"{batchStart}-0" : $"{batchStart}-{batchEnd}"; |
| | | string taskString = $"Pickbattery,{position},{range}"; |
| | | task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode(); |
| | | state.CurrentTask = task; |
| | | |
| | | bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString); |
| | | |
| | | if (result) |
| | | if (_stateManager.TryUpdateStateSafely(state.IPAddress, state)) |
| | | { |
| | | QuartzLogHelper.LogInfo(_logger, $"ä¸åæ¹æ¬¡åè´§æä»¤æåï¼æä»¤: {taskString}ï¼æ¹æ¬¡: {range}ï¼è®¾å¤: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName); |
| | | // å
åéæ»æ°æä»¤ |
| | | string totalNumCmd = $"PickTotalNum,{task.RobotTaskTotalNum}"; |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, totalNumCmd); |
| | | |
| | | task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode(); |
| | | state.CurrentTask = task; |
| | | // ååéæ¹æ¬¡åè´§æä»¤ |
| | | string range = batchEnd == 0 ? $"{batchStart}-0" : $"{batchStart}-{batchEnd}"; |
| | | string taskString = $"Pickbattery,{position},{range}"; |
| | | |
| | | if (_stateManager.TryUpdateStateSafely(state.IPAddress, state)) |
| | | bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString); |
| | | |
| | | if (result) |
| | | { |
| | | await _robotTaskService.UpdateRobotTaskAsync(task); |
| | | QuartzLogHelper.LogInfo(_logger, $"ä¸åæ¹æ¬¡åè´§æä»¤æåï¼æä»¤: {taskString}ï¼æ¹æ¬¡: {range}ï¼è®¾å¤: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName); |
| | | //await _robotTaskService.UpdateRobotTaskAsync(task); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | QuartzLogHelper.LogError(_logger, $"ä¸åæ¹æ¬¡åè´§æä»¤å¤±è´¥ï¼æä»¤: {taskString}ï¼è®¾å¤: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName); |
| | | else |
| | | { |
| | | QuartzLogHelper.LogError(_logger, $"ä¸åæ¹æ¬¡åè´§æä»¤å¤±è´¥ï¼æä»¤: {taskString}ï¼è®¾å¤: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | /// <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); |
| | | task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode(); |
| | | state.CurrentTask = task; |
| | | |
| | | // ååéæ¹æ¬¡åè´§æä»¤ï¼åçµè¯åºå®ä»5å·ä½åï¼ |
| | | string range = batchEnd == 0 ? $"{batchStart}-0" : $"{batchStart}-{batchEnd}"; |
| | | string taskString = $"Pickbattery,5,{range}"; |
| | | |
| | | bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString); |
| | | |
| | | if (result) |
| | | if (_stateManager.TryUpdateStateSafely(state.IPAddress, state)) |
| | | { |
| | | QuartzLogHelper.LogInfo(_logger, $"ä¸ååçµè¯æ¹æ¬¡åè´§æä»¤æåï¼æä»¤: {taskString}ï¼æ¹æ¬¡: {range}ï¼è®¾å¤: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName); |
| | | // å
åéæ»æ°æä»¤ |
| | | string totalNumCmd = $"PickTotalNum,{task.RobotTaskTotalNum}"; |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, totalNumCmd); |
| | | |
| | | task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode(); |
| | | state.CurrentTask = task; |
| | | // ååéæ¹æ¬¡åè´§æä»¤ï¼åçµè¯åºå®ä»5å·ä½åï¼ |
| | | string range = batchEnd == 0 ? $"{batchStart}-0" : $"{batchStart}-{batchEnd}"; |
| | | string taskString = $"Pickbattery,5,{range}"; |
| | | |
| | | if (_stateManager.TryUpdateStateSafely(state.IPAddress, state)) |
| | | bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString); |
| | | |
| | | if (result) |
| | | { |
| | | await _robotTaskService.UpdateRobotTaskAsync(task); |
| | | QuartzLogHelper.LogInfo(_logger, $"ä¸ååçµè¯æ¹æ¬¡åè´§æä»¤æåï¼æä»¤: {taskString}ï¼æ¹æ¬¡: {range}ï¼è®¾å¤: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName); |
| | | |
| | | //await _robotTaskService.UpdateRobotTaskAsync(task); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | QuartzLogHelper.LogError(_logger, $"ä¸ååçµè¯æ¹æ¬¡åè´§æä»¤å¤±è´¥ï¼æä»¤: {taskString}ï¼è®¾å¤: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName); |
| | | else |
| | | { |
| | | QuartzLogHelper.LogError(_logger, $"ä¸ååçµè¯æ¹æ¬¡åè´§æä»¤å¤±è´¥ï¼æä»¤: {taskString}ï¼è®¾å¤: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | /// <param name="batchEnd">æ¹æ¬¡ç»æç¼å·</param> |
| | | public async Task SendPutWithBatchAsync(Dt_RobotTask task, RobotSocketState state, string position, int batchStart, int batchEnd) |
| | | { |
| | | // å
åéæ»æ°æä»¤ |
| | | string totalNumCmd = $"PutTotalNum,{task.RobotTaskTotalNum}"; |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, totalNumCmd); |
| | | task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode(); |
| | | state.CurrentTask = task; |
| | | |
| | | // ååéæ¹æ¬¡æ¾è´§æä»¤ |
| | | string range = batchEnd == 0 ? $"{batchStart}-0" : $"{batchStart}-{batchEnd}"; |
| | | string taskString = $"Putbattery,{position},{range}"; |
| | | |
| | | bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString); |
| | | |
| | | if (result) |
| | | if (_stateManager.TryUpdateStateSafely(state.IPAddress, state)) |
| | | { |
| | | QuartzLogHelper.LogInfo(_logger, $"ä¸åæ¾è´§æä»¤æåï¼æä»¤: {taskString}ï¼æ¹æ¬¡: {range}ï¼è®¾å¤: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName); |
| | | // å
åéæ»æ°æä»¤ |
| | | string totalNumCmd = $"PutTotalNum,{task.RobotTaskTotalNum}"; |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, totalNumCmd); |
| | | |
| | | task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode(); |
| | | state.CurrentTask = task; |
| | | // ååéæ¹æ¬¡æ¾è´§æä»¤ |
| | | string range = batchEnd == 0 ? $"{batchStart}-0" : $"{batchStart}-{batchEnd}"; |
| | | string taskString = $"Putbattery,{position},{range}"; |
| | | |
| | | if (_stateManager.TryUpdateStateSafely(state.IPAddress, state)) |
| | | bool result = await _socketClientGateway.SendToClientAsync(state.IPAddress, taskString); |
| | | |
| | | if (result) |
| | | { |
| | | await _robotTaskService.UpdateRobotTaskAsync(task); |
| | | QuartzLogHelper.LogInfo(_logger, $"ä¸åæ¾è´§æä»¤æåï¼æä»¤: {taskString}ï¼æ¹æ¬¡: {range}ï¼è®¾å¤: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName); |
| | | |
| | | //await _robotTaskService.UpdateRobotTaskAsync(task); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | QuartzLogHelper.LogError(_logger, $"ä¸åæ¾è´§æä»¤å¤±è´¥ï¼æä»¤: {taskString}ï¼è®¾å¤: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName); |
| | | else |
| | | { |
| | | QuartzLogHelper.LogError(_logger, $"ä¸åæ¾è´§æä»¤å¤±è´¥ï¼æä»¤: {taskString}ï¼è®¾å¤: {state.RobotCrane?.DeviceName}", state.RobotCrane?.DeviceName); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | return result; |
| | | } |
| | | |
| | | public bool UpdateRobotTask(Dt_RobotTask task) |
| | | { |
| | | WebResponseContent content = _robotTaskService.UpdateData(task); |
| | | return content.Status; |
| | | } |
| | | } |
| | | } |
| | |
| | | using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup; |
| | | using Serilog; |
| | | using System.Net; |
| | | using WIDESEAWCS_Common.TaskEnum; |
| | | using WIDESEAWCS_Core.LogHelper; |
| | | using WIDESEAWCS_Model.Models; |
| | |
| | | private readonly ILogger _logger; |
| | | |
| | | /// <summary> |
| | | /// æºæ¢°æç¶æç®¡çå¨ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// ç¨äºè¯»ååæ´æ°æºå¨äººçç¶æã |
| | | /// </remarks> |
| | | private readonly RobotStateManager _stateManager; |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | /// <param name="taskProcessor">ä»»å¡å¤çå¨å®ä¾</param> |
| | | /// <param name="logger">æ¥å¿è®°å½å¨</param> |
| | | public RobotSimpleCommandHandler(RobotTaskProcessor taskProcessor, ISocketClientGateway socketClientGateway, ILogger logger) |
| | | public RobotSimpleCommandHandler(RobotTaskProcessor taskProcessor, ISocketClientGateway socketClientGateway, ILogger logger, RobotStateManager stateManager) |
| | | { |
| | | _taskProcessor = taskProcessor; |
| | | _socketClientGateway = socketClientGateway; |
| | | _logger = logger; |
| | | _stateManager = stateManager; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | state.BatteryArrived = false; |
| | | |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, "batteryarrivedno"); |
| | | return true; |
| | | // ==================== æ¥æ¶ä»»å¡åé¦ ==================== |
| | | |
| | | // åè´§æ¥æ¶ |
| | | case "pickbatteryover": |
| | | var isResult = UpdateStatus(state, true); |
| | | if (!isResult) |
| | | return false; |
| | | return true; |
| | | |
| | | // æ¾è´§æ¥æ¶ |
| | | case "putbatteryover": |
| | | isResult = UpdateStatus(state, false); |
| | | if (!isResult) |
| | | return false; |
| | | return true; |
| | | |
| | | // ==================== å
¨é¨å®æå½ä»¤ ==================== |
| | |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | public bool UpdateStatus(RobotSocketState state, bool isPick) |
| | | { |
| | | var task = _taskProcessor.GetTask(state?.RobotCrane); |
| | | if (task == null) |
| | | { |
| | | QuartzLogHelper.LogError(_logger, $"åè´§æ¥æ¶å¤±è´¥: æªæ¾å°ã{state?.RobotCrane}ãçä»»å¡", state.RobotCrane?.DeviceName ?? "Unknown"); |
| | | } |
| | | task.RobotTaskState = (int)TaskRobotStatusEnum.RobotExecuting; |
| | | _taskProcessor.UpdateRobotTask(task); |
| | | return true; |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | if (_stateManager.TryUpdateStateSafely(ipAddress, stateToUpdate)) |
| | | { |
| | | await _robotTaskService.UpdateRobotTaskAsync(task); |
| | | //await _robotTaskService.UpdateRobotTaskAsync(task); |
| | | } |
| | | } |
| | | } |
| | |
| | | // 妿æ¡ç çææå |
| | | if (!string.IsNullOrEmpty(trayBarcode1) && !string.IsNullOrEmpty(trayBarcode2)) |
| | | { |
| | | if (stateForUpdate.CellBarcode.Contains(trayBarcode1) || stateForUpdate.CellBarcode.Contains(trayBarcode2)) |
| | | { |
| | | QuartzLogHelper.LogInfo(_logger, $"HandlePutFinishedStateAsyncï¼è¯»åççµè¯æ¡ç å·²åå¨ï¼å¯è½åå¨éå¤ï¼ä»»å¡å·: {task.RobotTaskNum}", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress); |
| | | //if (stateForUpdate.CellBarcode.Contains(trayBarcode1) || stateForUpdate.CellBarcode.Contains(trayBarcode2)) |
| | | //{ |
| | | // QuartzLogHelper.LogInfo(_logger, $"HandlePutFinishedStateAsyncï¼è¯»åççµè¯æ¡ç å·²åå¨ï¼å¯è½åå¨éå¤ï¼ä»»å¡å·: {task.RobotTaskNum}", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress); |
| | | |
| | | // åéåè´§æä»¤ æ è®°æ«ç NGï¼æ¾è´§æ¶ä¸ä½¿ç¨è¿äºæ¡ç ï¼å¹¶æ¾å
¥NGå£ |
| | | //await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate, true); |
| | | return; |
| | | } |
| | | else |
| | | // // åéåè´§æä»¤ æ è®°æ«ç NGï¼æ¾è´§æ¶ä¸ä½¿ç¨è¿äºæ¡ç ï¼å¹¶æ¾å
¥NGå£ |
| | | // //await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate, true); |
| | | // return; |
| | | //} |
| | | //else |
| | | { |
| | | if (trayBarcode1.Length < 13 || trayBarcode2.Length < 13) |
| | | { |
| | |
| | | using Newtonsoft.Json; |
| | | using Serilog; |
| | | using System.Diagnostics.CodeAnalysis; |
| | | using System.Threading.Tasks; |
| | | using WIDESEA_Core; |
| | | using WIDESEAWCS_Common.Constants; |
| | | using WIDESEAWCS_Common.HttpEnum; |
| | |
| | | return selectedTask; |
| | | } |
| | | |
| | | // ===== TargetAddress ä¸å¯ç¨æ¶ï¼å
å°è¯å NextAddress çå
¶ä»ä»»å¡ ===== |
| | | // ===== TargetAddress ä¸å¯ç¨æ¶ï¼å
å°è¯å NextAddressä¸åTargetAddress çå
¶ä»ä»»å¡ ===== |
| | | var sameStationTasks = _taskService |
| | | .QueryStackerCraneOutTasks(deviceCode, new List<string> { candidateTask.NextAddress }) |
| | | .Where(x => x.TaskId != candidateTask.TaskId) |
| | | .Where(x => x.TaskId != candidateTask.TaskId && x.TargetAddress != candidateTask.TargetAddress) |
| | | .ToList(); |
| | | |
| | | foreach (var sameStationTask in sameStationTasks) |
| | |
| | | |
| | | // ===== å NextAddress æ å¯ç¨ä»»å¡ï¼å°è¯ä¸å NextAddress çä»»å¡ ===== |
| | | // æ¥æ¾å
¶ä»å¯ç¨çåºåºç«å° |
| | | var otherOutStationCodes = _routerService |
| | | .QueryNextRoutes(deviceCode, candidateTask.NextAddress, candidateTask.TaskType) |
| | | .Select(x => x.ChildPosi) |
| | | .ToList(); |
| | | |
| | | // æ¥è¯¢å
¶ä»ç«å°çåºåºä»»å¡ |
| | | var tasks = _taskService.QueryStackerCraneOutTasks(deviceCode, otherOutStationCodes); |
| | | var tasks = _taskService.QueryStackerCraneOutTasks(deviceCode, new List<string> { candidateTask.NextAddress }, false); |
| | | foreach (var alternativeTask in tasks) |
| | | { |
| | | selectedTask = TrySelectOutboundTask(alternativeTask); |
| | |
| | | var locations = await BaseDal.QueryDataAsync(x => |
| | | x.EnableStatus == EnableStatusEnum.Normal.GetHashCode() && |
| | | x.RoadwayNo == roadwayNo && |
| | | x.LocationStatus == LocationStatusEnum.Free.GetHashCode()); |
| | | x.LocationStatus == LocationStatusEnum.Free.GetHashCode() && |
| | | (roadwayNo.Contains("HC") |
| | | ? x.LocationType == (int)LocationTypeEnum.Capacity |
| | | : x.LocationType == (int)LocationTypeEnum.ShelfCapacity)); |
| | | |
| | | return locations? |
| | | .OrderByDescending(x => x.Depth) // 1. 深度ä¼å
ï¼ä»å¤§å°å°ï¼ |
| | |
| | | /// <summary> |
| | | /// å容åºåºåºå°å |
| | | /// </summary> |
| | | public const string GRADING_OUTBOUND_ADDRESS = "10081"; |
| | | public const string GRADING_OUTBOUND_ADDRESS = "2103"; |
| | | |
| | | /// <summary> |
| | | /// å容åºåºåºå°å |
| | | /// </summary> |
| | | public const string GRADING_RoadWayNo = "HCSC1"; |
| | | } |
| | | } |
| | |
| | | Undefined = 0, |
| | | |
| | | /// <summary> |
| | | /// æ¨¡åæ®µ |
| | | /// è´§æ¶ |
| | | /// </summary> |
| | | [Description("æ¨¡åæ®µ")] |
| | | SmallPallet = 1, |
| | | [Description("è´§æ¶")] |
| | | ShelfCapacity = 1, |
| | | |
| | | /// <summary> |
| | | /// å·ç»æ®µ |
| | |
| | | ExtraPallet = 4, |
| | | |
| | | /// <summary> |
| | | /// åæç©ºæç |
| | | /// å容工è£
æ¶ |
| | | /// </summary> |
| | | [Description("åæç©ºæç")] |
| | | HCTrayPallet = 5, |
| | | [Description("å容工è£
æ¶")] |
| | | SubRackType = 5, |
| | | |
| | | /// <summary> |
| | | /// åæå容æç |
| | | /// å容æ |
| | | /// </summary> |
| | | [Description("åæå容æç")] |
| | | HCFRPallet = 6, |
| | | [Description("å容æ")] |
| | | Capacity = 6, |
| | | } |
| | | } |
| | |
| | | if (stockInfo == null) |
| | | { |
| | | var location = await _locationInfoService.GetLocationInfoAsync(input.LocationCode); |
| | | locationStatus = location?.LocationStatus ?? 0; |
| | | locationStatus = location?.LocationStatus == (int)LocationStatusEnum.InStock ? 10 : 0; |
| | | } |
| | | else |
| | | { |
| | | locationStatus = stockInfo.LocationDetails?.LocationStatus ?? 0; |
| | | locationStatus = MapLocationStatus(stockInfo.StockStatus); |
| | | } |
| | | |
| | | int MapLocationStatus(int stockStatus) => stockStatus switch |
| | | { |
| | | (int)StockStatusEmun.å
¥åºå®æ => 10, |
| | | (int)StockStatusEmun.空æçåºå => 11, |
| | | _ => 0 |
| | | }; |
| | | |
| | | OutputDto outPutDto = new OutputDto() |
| | | { |
| | |
| | | var result = await _locationInfoService.Db.Updateable<Dt_LocationInfo>() |
| | | .SetColumns(s => new Dt_LocationInfo |
| | | { |
| | | LocationStatus = input.LocationStatus |
| | | }).Where(s => s.LocationCode == input.LocationCode).ExecuteCommandAsync() > 0; |
| | | EnableStatus = input.LocationStatus == 1 ? 0 : 3, |
| | | }).Where(s => s.LocationCode == input.LocationCode && s.RoadwayNo == TaskAddressConstants.GRADING_RoadWayNo).ExecuteCommandAsync() > 0; |
| | | |
| | | if (result) |
| | | { |
| | |
| | | var stock = await _stockInfoService.GetStockInfoAsync(input.PalletCode, input.LocationCode); |
| | | if (stock == null) |
| | | { |
| | | content.Error("æªæ¾å°å¯¹åºçæç"); |
| | | return content.Error("æªæ¾å°å¯¹åºçæç"); |
| | | } |
| | | else |
| | | { |
| | | var taskList = new Dt_Task |
| | | { |
| | | WarehouseId = stock.WarehouseId, |
| | | PalletCode = stock.PalletCode, |
| | | PalletType = stock.PalletType, |
| | | SourceAddress = stock.LocationCode, |
| | | CurrentAddress = stock.LocationCode, |
| | | NextAddress = TaskAddressConstants.DEFAULT_ADDRESS, |
| | | TargetAddress = TaskAddressConstants.GRADING_OUTBOUND_ADDRESS, |
| | | Roadway = stock.LocationDetails.RoadwayNo, |
| | | TaskType = TaskOutboundTypeEnum.Outbound.GetHashCode(), |
| | | TaskStatus = TaskOutStatusEnum.OutNew.GetHashCode(), |
| | | Grade = 1, |
| | | TaskNum = await BaseDal.GetTaskNo(), |
| | | Creater = "system", |
| | | }; |
| | | |
| | | var taskList = new Dt_Task |
| | | { |
| | | WarehouseId = stock.WarehouseId, |
| | | PalletCode = stock.PalletCode, |
| | | PalletType = stock.PalletType, |
| | | SourceAddress = stock.LocationCode, |
| | | CurrentAddress = stock.LocationCode, |
| | | NextAddress = TaskAddressConstants.DEFAULT_ADDRESS, |
| | | TargetAddress = TaskAddressConstants.GRADING_OUTBOUND_ADDRESS, |
| | | Roadway = stock.LocationDetails.RoadwayNo, |
| | | TaskType = TaskOutboundTypeEnum.Outbound.GetHashCode(), |
| | | TaskStatus = TaskOutStatusEnum.OutNew.GetHashCode(), |
| | | Grade = 1, |
| | | TaskNum = await BaseDal.GetTaskNo(), |
| | | Creater = "system", |
| | | }; |
| | | |
| | | return await _unitOfWorkManage.BeginTranAsync(async () => |
| | | { |
| | | var result = await BaseDal.AddDataAsync(taskList) > 0; |
| | | var wmstaskDto = result ? _mapper.Map<WMSTaskDTO>(taskList) : null; |
| | | |
| | | var httpResponse = _httpClientHelper.Post<WebResponseContent>("http://logistics-service/api/logistics/notifyoutbound", JsonSerializer.Serialize(wmstaskDto)).Data; |
| | | if (result && httpResponse != null) |
| | | { |
| | | content.OK("åºåºè¯·æ±æå"); |
| | | return content.OK("åºåºè¯·æ±æå"); |
| | | } |
| | | else |
| | | { |
| | | content.Error("åºåºè¯·æ±å¤±è´¥"); |
| | | return content.Error("åºåºè¯·æ±å¤±è´¥"); |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | WebResponseContent content = new WebResponseContent(); |
| | | return await _unitOfWorkManage.BeginTranAsync(async () => |
| | | { |
| | | if (task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty) |
| | | { |
| | | location.LocationStatus = LocationStatusEnum.Free.GetHashCode(); |
| | | |
| | | var updateResult = await _locationInfoService.UpdateLocationInfoAsync(location); |
| | | var deleteResult = _stockInfoService.DeleteData(stockInfo).Status; |
| | | if (!updateResult && !deleteResult) |
| | | return content.Error("ä»»å¡å®æå¤±è´¥"); |
| | | |
| | | var completeResult1 = await CompleteTaskAsync(task, "åºåºå®æ"); |
| | | return content.OK(); |
| | | |
| | | } |
| | | |
| | | stockInfo.LocationId = 0; |
| | | stockInfo.LocationCode = string.Empty; |
| | | stockInfo.OutboundDate = DateTime.Now; |
| | | stockInfo.StockStatus = (int)StockStatusEmun.åºåºå®æ; |
| | | |
| | | location.LocationStatus = LocationStatusEnum.Free.GetHashCode(); |
| | | |
| | |
| | | "MainDB": "DB_WIDESEA", //å½å项ç®ç主åºï¼æå¯¹åºçè¿æ¥å符串çEnabledå¿
须为true |
| | | //è¿æ¥å符串 |
| | | //"ConnectionString": "HTI6FB1H05Krd07mNm9yBCNhofW6edA5zLs9TY~MNthRYW3kn0qKbMIsGp~3yyPDF1YZUCPBQx8U0Jfk4PH~ajNFXVIwlH85M3F~v_qKYQ3CeAz3q1mLVDn8O5uWt1~3Ut2V3KRkEwYHvW2oMDN~QIDXPxDgXN0R2oTIhc9dNu7QNaLEknblqmHhjaNSSpERdDVZIgHnMKejU_SL49tralBkZmDNi0hmkbL~837j1NWe37u9fJKmv91QPb~16JsuI9uu0EvNZ06g6PuZfOSAeFH9GMMIZiketdcJG3tHelo=", |
| | | "ConnectionString": "Data Source=192.168.60.30;Initial Catalog=WIDESEAWMS_ShanMei;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False", |
| | | "ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWMS_ShanMei;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False", |
| | | //"ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWMS_ShanMei;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False", |
| | | //"ConnectionString": "Data Source=10.30.4.92;Initial Catalog=WMS_TC;User ID=sa;Password=duo123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False", |
| | | //æ§WMSæ°æ®åºè¿æ¥ |