| | |
| | | *----------------------------------------------------------------*/ |
| | | #endregion << ç æ¬ 注 é >> |
| | | |
| | | using AutoMapper; |
| | | using Magicodes.ExporterAndImporter.Core; |
| | | using Microsoft.AspNetCore.Mvc.RazorPages; |
| | | using NetTaste; |
| | | using Newtonsoft.Json; |
| | | using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime; |
| | | using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; |
| | | using OfficeOpenXml.FormulaParsing.Excel.Functions.Text; |
| | | using SqlSugar; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.ComponentModel; |
| | | using System.Diagnostics; |
| | | using System.Diagnostics.CodeAnalysis; |
| | | using System.Linq; |
| | | using System.Linq.Expressions; |
| | | using System.Reflection; |
| | | using System.Reflection.Metadata; |
| | | using System.Security.Policy; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | using System.Xml.Linq; |
| | | using WIDESEA_Comm.Http; |
| | | using WIDESEA_Common.Log; |
| | | using WIDESEAWCS_Common.TaskEnum; |
| | | using AutoMapper; |
| | | using HslCommunication; |
| | | using HslCommunication.WebSocket; |
| | | using OfficeOpenXml.FormulaParsing.Excel.Functions.Information; |
| | | using SqlSugar; |
| | | using WIDESEAWCS_BasicInfoRepository; |
| | | using WIDESEAWCS_BasicInfoService; |
| | | using WIDESEAWCS_Common; |
| | | using WIDESEAWCS_Core; |
| | | using WIDESEAWCS_Core.BaseRepository; |
| | | using WIDESEAWCS_Core.BaseServices; |
| | | using WIDESEAWCS_Core.Enums; |
| | | using WIDESEAWCS_Core.Utilities; |
| | | using WIDESEAWCS_DTO.Enum; |
| | | using WIDESEAWCS_Core.Helper; |
| | | using WIDESEAWCS_DTO.BasicInfo; |
| | | using WIDESEAWCS_DTO.PlacedBlockDTO; |
| | | using WIDESEAWCS_DTO.TaskInfo; |
| | | using WIDESEAWCS_IBasicInfoRepository; |
| | | using WIDESEAWCS_IBasicInfoService; |
| | | using WIDESEAWCS_ITaskInfoRepository; |
| | | using WIDESEAWCS_ITaskInfoService; |
| | | using WIDESEAWCS_Model.Models; |
| | | using WIDESEAWCS_QuartzJob.Models; |
| | | using WIDESEAWCS_QuartzJob.Service; |
| | | using static Microsoft.IO.RecyclableMemoryStreamManager; |
| | | using WIDESEAWCS_QuartzJob.Repository; |
| | | using static Dm.net.buffer.ByteArrayBuffer; |
| | | |
| | | namespace WIDESEAWCS_TaskInfoService |
| | | { |
| | | /// <summary> |
| | | /// 任塿å¡ç±»ï¼æä¾ä»»å¡ç¸å
³çä¸å¡é»è¾æä½ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// 主è¦åè½å
æ¬ï¼ <br/> |
| | | /// 1. æ¥è¯¢é¨æ¶è®¾å¤æªæ§è¡ä»»å¡ <br/> |
| | | /// 2. æ§è¡è®¢ååæ¾ç½®æµè¯ <br/> |
| | | /// 3. å建å管çä»»å¡ <br/> |
| | | /// 4. çæåéæ°çæä»»å¡ <br/> |
| | | /// 5. å¤çå¼å¸¸ä»»å¡ <br/> |
| | | /// 6. ä»»å¡å®æå¤ç <br/> |
| | | /// ä¾èµä»å¨å±è¿è¡æ°æ®è®¿é®ï¼éè¿å·¥ä½åå
管çäºå¡ <br/> |
| | | /// 使ç¨WebSocketè¿è¡å®æ¶éç¥ï¼å¹¶å
å«å®æ´çå¼å¸¸å¤çæºå¶ |
| | | /// </remarks> |
| | | public class TaskService : ServiceBase<Dt_Task, ITaskRepository>, ITaskService |
| | | { |
| | | private readonly IRouterService _routerService; |
| | | private readonly ITaskExecuteDetailService _taskExecuteDetailService; |
| | | private readonly ITaskExecuteDetailRepository _taskExecuteDetailRepository; |
| | | private readonly ITask_HtyService _task_HtyService; |
| | | /// <summary> |
| | | /// å·¥ä½åå
ç®¡çæ¥å£å®ä¾ï¼ç¨äºç®¡çæ°æ®åºäºå¡åå·¥ä½åå
|
| | | /// </summary> |
| | | private readonly IUnitOfWorkManage _unitOfWorkManage; |
| | | |
| | | /// <summary> |
| | | /// ç¨äºå¯¹è±¡æ å°çæ å°å¨å®ä¾ |
| | | /// </summary> |
| | | private readonly IMapper _mapper; |
| | | |
| | | /// <summary> |
| | | /// 容å¨ä»å¨æ¥å£å®ä¾ï¼ç¨äºå®¹å¨ç¸å
³æ°æ®æä½ |
| | | /// </summary> |
| | | private readonly IContainerRepository _containerRepository; |
| | | |
| | | private Dictionary<string, OrderByType> _taskOrderBy = new() |
| | | { |
| | | {nameof(Dt_Task.Grade),OrderByType.Desc }, |
| | | {nameof(Dt_Task.CreateDate),OrderByType.Asc}, |
| | | }; |
| | | /// <summary> |
| | | /// 容å¨ç©åä»å¨æ¥å£å®ä¾ï¼åªè¯»ï¼ |
| | | /// </summary> |
| | | private readonly IContainerItemRepository _containerItemRepository; |
| | | |
| | | public Dictionary<string, OrderByType> TaskOrderBy { get { return _taskOrderBy; } set { _taskOrderBy = value; } } |
| | | /// <summary> |
| | | /// WebSocketæå¡å¨å®ä¾ï¼ç¨äºå¤çWebSocketè¿æ¥ |
| | | /// </summary> |
| | | private readonly WebSocketServer _webSocketServer; |
| | | |
| | | public List<int> TaskInboundTypes => typeof(TaskInboundTypeEnum).GetEnumIndexList(); |
| | | /// <summary> |
| | | /// 订å详æ
ä»å¨æ¥å£å®ä¾ï¼åªè¯»ï¼ |
| | | /// </summary> |
| | | private readonly IOrderDetailsRepository _orderDetailsRepository; |
| | | |
| | | public List<int> TaskOutboundTypes => typeof(TaskOutboundTypeEnum).GetEnumIndexList(); |
| | | /// <summary> |
| | | /// 容卿塿¥å£å®ä¾ï¼ç¨äºç®¡çä¾èµæ³¨å
¥å®¹å¨ç¸å
³æä½ |
| | | /// </summary> |
| | | private readonly IContainerService _containerService; |
| | | |
| | | public TaskService(ITaskRepository BaseDal, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IMapper mapper, ITask_HtyService task_HtyService) : base(BaseDal) |
| | | /// <summary> |
| | | /// 订åæç»æå¡æ¥å£ |
| | | /// </summary> |
| | | private readonly IOrderDetailsService _orderDetailsService; |
| | | |
| | | /// <summary> |
| | | /// 订åè¡ä»å¨æ¥å£å®ä¾ï¼ç¨äºæä½è®¢åè¡æ°æ® |
| | | /// </summary> |
| | | private readonly IOrderrowsRepository _orderrowsRepository; |
| | | |
| | | /// <summary> |
| | | /// 订å容å¨ä»å¨æ¥å£å®ä¾ï¼ç¨äºæä½è®¢å容å¨ç¸å
³æ°æ® |
| | | /// </summary> |
| | | private readonly IOrderContainerRepository _orderContainerRepository; |
| | | |
| | | public TaskService(ITaskRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IMapper mapper, IContainerRepository containerRepository, IContainerItemRepository containerItemRepository, WebSocketServer webSocketServer, IOrderDetailsRepository orderDetailsRepository, IContainerService containerService, IOrderDetailsService orderDetailsService, IOrderrowsRepository orderrowsRepository, IOrderContainerRepository orderContainerRepository) : base(BaseDal) |
| | | { |
| | | _routerService = routerService; |
| | | _taskExecuteDetailService = taskExecuteDetailService; |
| | | _taskExecuteDetailRepository = taskExecuteDetailRepository; |
| | | _task_HtyService = task_HtyService; |
| | | _unitOfWorkManage = unitOfWorkManage; |
| | | _mapper = mapper; |
| | | _containerRepository = containerRepository; |
| | | _containerItemRepository = containerItemRepository; |
| | | _webSocketServer = webSocketServer; |
| | | _orderDetailsRepository = orderDetailsRepository; |
| | | _containerService = containerService; |
| | | _orderDetailsService = orderDetailsService; |
| | | _orderrowsRepository = orderrowsRepository; |
| | | _orderContainerRepository = orderContainerRepository; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¥æ¶WMSä»»å¡ä¿¡æ¯ |
| | | /// æ¥è¯¢æå®é¨æ¶è®¾å¤æªæ§è¡çä»»å¡ |
| | | /// </summary> |
| | | /// <param name="taskDTOs">WMSä»»å¡å¯¹è±¡éå</param> |
| | | /// <returns>è¿åå¤çç»æ</returns> |
| | | public WebResponseContent ReceiveWMSTask(Dt_Task taskDTOs) |
| | | /// <param name="gantryDeviceNo">鍿¶è®¾å¤ç¼å·</param> |
| | | /// <returns>æªæ§è¡ç任塿°æ®ï¼è¥ä¸åå¨åè¿ånull</returns> |
| | | public Dt_Task? QueryAGantryUnExecuteTask(string gantryDeviceNo) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | return BaseDal.QueryFirst(x => x.TaskState == (int)TaskStatusEnum.Gantry_New && x.DeviceCode == gantryDeviceNo); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ§è¡è®¢ååæ¾ç½®æµè¯ï¼æ ¹æ®è®¢åè¡IDè·å订åæç»å¹¶è®¡ç®æ¾ç½®ä½ç½® |
| | | /// </summary> |
| | | /// <param name="orderRowId">订åè¡ID</param> |
| | | /// <returns>å
嫿¾ç½®åä¿¡æ¯çWebååºå
容ãæåæ¶è¿åæ¾ç½®åå表ï¼å¤±è´¥æ¶è¿åé误信æ¯</returns> |
| | | /// <remarks> |
| | | /// 1. éè¿è®¢åè¡IDæ¥è¯¢è®¢åæç»æ°æ® <br/> |
| | | /// 2. 对æ¯ä¸ªææè®¢åæç»è®¡ç®åéçæ¾ç½®ä½ç½® <br/> |
| | | /// 3. å建容å¨é¡¹åä»»å¡è®°å½ <br/> |
| | | /// 4. éè¿WebSocketå叿¾ç½®ä½ç½®ä¿¡æ¯ <br/> |
| | | /// 5. è¿åæææåæ¾ç½®çåä¿¡æ¯ |
| | | /// </remarks> |
| | | public WebResponseContent PlaceBlockTest(int orderRowId) |
| | | { |
| | | try |
| | | { |
| | | |
| | | BaseDal.AddData(taskDTOs); |
| | | content = WebResponseContent.Instance.OK("æå"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | content = WebResponseContent.Instance.Error($"çæä»»å¡å¤±è´¥,é误信æ¯:{ex.Message}"); |
| | | } |
| | | finally |
| | | { |
| | | WriteLog.GetLog("çæä»»å¡").Write(JsonConvert.SerializeObject(content), "çæä»»å¡"); |
| | | } |
| | | return content; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¥æ¾è¯¥ç«å°æ¯å¦æä»»å¡ |
| | | /// </summary> |
| | | /// <param name="deviceNo">设å¤ç¼å·</param> |
| | | /// <param name="currentAddress">å½åå°å</param> |
| | | /// <returns></returns> |
| | | public List<string> QueryConveyorLineTaskSourceAddress() |
| | | { |
| | | return BaseDal.QueryData().Select(task => task.SourceAddress).ToList(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ä¿®æ¹ä»»å¡ï¼æ·»å ç®æ å°å |
| | | /// </summary> |
| | | /// <param name="deviceNo">设å¤ç¼å·</param> |
| | | /// <param name="currentAddress">å½åå°å</param> |
| | | /// <returns></returns> |
| | | public WebResponseContent UpdateTargetAddress(int TaskId,string TargetAddress) |
| | | { |
| | | |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | Dt_Task dt_Task = BaseDal.QueryFirst(x => x.TaskId == TaskId); |
| | | dt_Task.TargetAddress = TargetAddress; |
| | | dt_Task.NextAddress = TargetAddress; |
| | | BaseDal.UpdateData(dt_Task); |
| | | content = WebResponseContent.Instance.OK("æå"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | content = WebResponseContent.Instance.Error($"任塿¥æ¶é误,é误信æ¯:{ex.Message}"); |
| | | } |
| | | finally |
| | | { |
| | | WriteLog.GetLog("æ¥æ¶ä»»å¡").Write(JsonConvert.SerializeObject(content), "æ¥æ¶ä»»å¡"); |
| | | } |
| | | return content; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¥æ¾æ¯å¦æä»»å¡å¯ä»¥æ¾å¨è¯¥ä½ç½® |
| | | /// </summary> |
| | | /// <param name="deviceNo">设å¤ç¼å·</param> |
| | | /// <param name="currentAddress">å½åå°å</param> |
| | | /// <returns></returns> |
| | | public Dt_Task QueryConveyorLineTaskRoadway(int agvarea) |
| | | { |
| | | return BaseDal.QueryFirst(x => x.Roadway == agvarea.ToString() && x.MaterialType == (int)AgvStationEnum.BoardUnload && x.TargetAddress ==""); |
| | | |
| | | } |
| | | |
| | | |
| | | public bool QueryConveyorLinetaeersuadd(string taeersuadd) |
| | | { |
| | | Dt_Task dt_= BaseDal.QueryFirst(x => x.SourceAddress == taeersuadd || x.TargetAddress == taeersuadd); |
| | | if(dt_==null) return true; |
| | | else return false; |
| | | |
| | | } |
| | | /// <summary> |
| | | /// æ ¹æ®è®¾å¤ç¼å·ãå½åå°åæ¥è¯¢è¾éçº¿æªæ§è¡çä»»å¡ |
| | | /// </summary> |
| | | /// <param name="deviceNo">设å¤ç¼å·</param> |
| | | /// <param name="currentAddress">å½åå°å</param> |
| | | /// <returns></returns> |
| | | public Dt_Task QueryConveyorLineTask(string deviceNo, string currentAddress) |
| | | { |
| | | return BaseDal.QueryFirst(x => (TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.InNew || TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.SC_OutFinish) && x.CurrentAddress == currentAddress, TaskOrderBy); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®ä»»å¡å·ãä¸ä¸å°åæ¥è¯¢è¾é线æ§è¡ä¸çä»»å¡ |
| | | /// </summary> |
| | | /// <param name="taskNum">ä»»å¡å·</param> |
| | | /// <param name="nextAddress">ä¸ä¸å°å</param> |
| | | /// <returns></returns> |
| | | public Dt_Task QueryExecutingConveyorLineTask(int taskNum, string nextAddress) |
| | | { |
| | | return BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.NextAddress == nextAddress && (x.TaskState == (int)TaskInStatusEnum.Line_InExecuting || x.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting), TaskOrderBy); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®ä»»å¡å·ãå½åå°åæ¥è¯¢è¾éçº¿å®æçä»»å¡ |
| | | /// </summary> |
| | | /// <param name="taskNum">ä»»å¡å·</param> |
| | | /// <param name="currentAddress">å½åå°å</param> |
| | | /// <returns></returns> |
| | | public Dt_Task QueryCompletedConveyorLineTask(int taskNum, string currentAddress) |
| | | { |
| | | return BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.CurrentAddress == currentAddress && (x.TaskState == (int)TaskInStatusEnum.Line_InFinish || x.TaskState == (int)TaskOutStatusEnum.Line_OutFinish), TaskOrderBy); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®è®¾å¤ç¼å·ãä»»å¡ç±»ååç»(å¯é)æç
§ä¼å
级以åå建æ¶é´æåºæ¥è¯¢ä»»å¡æ± æ°å¢çä»»å¡ |
| | | /// </summary> |
| | | /// <param name="deviceNo">设å¤ç¼å·</param> |
| | | /// <param name="taskTypeGroup">ä»»å¡ç±»ååç»(å¯é)</param> |
| | | /// <returns></returns> |
| | | public Dt_Task? QuertStackerCraneTask(string deviceNo, TaskTypeGroup? taskTypeGroup = null) |
| | | { |
| | | if(taskTypeGroup == null) |
| | | return BaseDal.QueryFirst(x => x.Roadway == deviceNo && (TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish || TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew), TaskOrderBy); |
| | | if(taskTypeGroup.Value == TaskTypeGroup.InboundGroup) |
| | | return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish, TaskOrderBy); |
| | | if(taskTypeGroup.Value == TaskTypeGroup.OutbondGroup) |
| | | return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew, TaskOrderBy); |
| | | return null; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®è®¾å¤ç¼å·ãå½åå°åæç
§ä¼å
级以åå建æ¶é´æåºæ¥è¯¢ä»»å¡æ± æ°å¢çä»»å¡ |
| | | /// </summary> |
| | | /// <param name="deviceNo">设å¤ç¼å·</param> |
| | | /// <param name="currentAddress">å½åå°å</param> |
| | | /// <returns>è¿åä»»å¡å®ä½å¯¹è±¡ï¼å¯è½ä¸ºnull</returns> |
| | | public Dt_Task QueryStackerCraneTask(string deviceNo, string currentAddress = "") |
| | | { |
| | | return BaseDal.QueryFirst(x => x.TaskState == (int)TaskOutStatusEnum.OutNew && (deviceNo == "AGV01" ? x.Roadway == AgvareaEnum.AreaOne.ToString() : x.Roadway != AgvareaEnum.AreaOne.ToString()),TaskOrderBy); |
| | | } |
| | | |
| | | |
| | | public Dt_Task IngStackerCraneTask(string deviceNo) |
| | | { |
| | | //string deviceNot = deviceNo == "SC01" ? "1" : "2"; |
| | | return BaseDal.QueryFirst(x => x.Roadway == deviceNo && x.TaskState == (int)TaskInStatusEnum.SC_InExecuting); |
| | | } |
| | | |
| | | public Dt_Task IngStackerCraneTask2(string deviceNo) |
| | | { |
| | | //string deviceNot = deviceNo == "SC01" ? "1" : "2"; |
| | | try |
| | | { |
| | | return BaseDal.QueryFirst(x => x.Roadway == deviceNo && x.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | |
| | | throw; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®è®¾å¤ç¼å·ãå½åå°åæç
§ä¼å
级以åå建æ¶é´æåºæ¥è¯¢ä»»å¡æ± å
¥åºç±»åçæ°å¢çä»»å¡ |
| | | /// </summary> |
| | | /// <param name="deviceNo">设å¤ç¼å·</param> |
| | | /// <param name="currentAddress">å½åå°å</param> |
| | | /// <returns>è¿åä»»å¡å®ä½å¯¹è±¡ï¼å¯è½ä¸ºnull</returns> |
| | | public Dt_Task QueryStackerCraneInTask(string deviceNo, string currentAddress = "") |
| | | { |
| | | if (string.IsNullOrEmpty(currentAddress)) |
| | | return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish, TaskOrderBy); |
| | | else |
| | | return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish && x.CurrentAddress == currentAddress, TaskOrderBy); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®è®¾å¤ç¼å·ãå½åå°åæç
§ä¼å
级以åå建æ¶é´æåºæ¥è¯¢ä»»å¡æ± åºåºç±»åçæ°å¢çä»»å¡ |
| | | /// </summary> |
| | | /// <param name="deviceNo">设å¤ç¼å·</param> |
| | | /// <param name="currentAddress">å½åå°å</param> |
| | | /// <returns>è¿åä»»å¡å®ä½å¯¹è±¡ï¼å¯è½ä¸ºnull</returns> |
| | | public Dt_Task QueryStackerCraneOutTask(string deviceNo, string currentAddress = "") |
| | | { |
| | | if (string.IsNullOrEmpty(currentAddress)) |
| | | return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew, TaskOrderBy); |
| | | else |
| | | return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew && x.CurrentAddress == currentAddress, TaskOrderBy); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®è®¾å¤ç¼å·ãå½åå°åæç
§ä¼å
级以åå建æ¶é´æåºæ¥è¯¢ä»»å¡æ± åºåºç±»åçæ°å¢çä»»å¡ |
| | | /// </summary> |
| | | /// <param name="deviceNo">设å¤ç¼å·</param> |
| | | /// <param name="currentAddress">å½åå°å</param> |
| | | /// <returns>è¿åä»»å¡å®ä½å¯¹è±¡éåï¼å¯è½ä¸ºnull</returns> |
| | | public List<Dt_Task> QueryStackerCraneOutTasks(string deviceNo, List<string> outStationCodes) |
| | | { |
| | | return BaseDal.QueryData(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew && outStationCodes.Contains(x.CurrentAddress), TaskOrderBy); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®åºåºè´§ä½æ¥è¯¢æ¯å¦æå½åæµ
è´§ä½ä»»å¡ |
| | | /// </summary> |
| | | /// <param name="deviceNo">设å¤ç¼å·</param> |
| | | /// <param name="currentAddress">å½åå°å</param> |
| | | /// <returns>è¿åä»»å¡å®ä½å¯¹è±¡éåï¼å¯è½ä¸ºnull</returns> |
| | | public List<Dt_Task> QueryStationIsOccupiedOutTasks(string deviceNo, string SourceAddress) |
| | | { |
| | | return BaseDal.QueryData(x => x.Roadway == deviceNo && SourceAddress.Contains(x.SourceAddress), TaskOrderBy); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ´æ°ä»»å¡å¼å¸¸ä¿¡æ¯æ¾ç¤º |
| | | /// </summary> |
| | | /// <param name="taskNum">ä»»å¡å·</param> |
| | | /// <param name="message">å¼å¸¸ä¿¡æ¯</param> |
| | | public WebResponseContent UpdateTaskExceptionMessage(int taskNum, string message) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); |
| | | if (task == null) return WebResponseContent.Instance.Error($"æªæ¾å°è¯¥ä»»å¡ä¿¡æ¯,ä»»å¡å·:ã{taskNum}ã"); |
| | | if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) |
| | | List<OrderDetails> orderDetails = _orderDetailsRepository.QueryData(x => x.Orderrowsid == orderRowId); |
| | | if (orderDetails == null || orderDetails.Count == 0) |
| | | { |
| | | task.TaskState = (int)TaskOutStatusEnum.OutPending; |
| | | return WebResponseContent.Instance.Error("æªæ¾å°è®¢åæç»ä¿¡æ¯"); |
| | | } |
| | | else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup) |
| | | |
| | | List<PlacedBlock> placedBlocks = new List<PlacedBlock>(); |
| | | |
| | | string putPosition = ""; |
| | | |
| | | for (int i = 0; i < orderDetails.Count; i++) |
| | | { |
| | | task.TaskState = (int)TaskInStatusEnum.InPending; |
| | | } |
| | | task.ExceptionMessage = message; |
| | | task.ModifyDate = DateTime.Now; |
| | | BaseDal.UpdateData(task); |
| | | |
| | | _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, task.ExceptionMessage); |
| | | |
| | | content = WebResponseContent.Instance.OK(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | content = WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | return content; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ´æ°ä»»å¡ç¶æä¿¡æ¯ï¼å¹¶åæ¥è³WMS |
| | | /// </summary> |
| | | /// <param name="taskNum">ä»»å¡å·</param> |
| | | /// <param name="status">ä»»å¡ç¶æ</param> |
| | | public void UpdateTaskStatus(int taskNum, int status) |
| | | { |
| | | Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); |
| | | if (task == null) return; |
| | | task.TaskState = status; |
| | | task.ModifyDate = DateTime.Now; |
| | | BaseDal.UpdateData(task); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å°ä»»å¡ç¶æä¿®æ¹ä¸ºä¸ä¸ä¸ªç¶æ |
| | | /// </summary> |
| | | /// <param name="taskNum">ä»»å¡å·</param> |
| | | public WebResponseContent UpdateTaskStatusToNext(int taskNum) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); |
| | | if (task == null) return WebResponseContent.Instance.Error($"æªæ¾å°è¯¥ä»»å¡ä¿¡æ¯,ä»»å¡å·:ã{taskNum}ã"); |
| | | return UpdateTaskStatusToNext(task); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | content = WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | return content; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å°ä»»å¡ç¶æä¿®æ¹ä¸ºä¸ä¸ä¸ªç¶æ |
| | | /// </summary> |
| | | /// <param name="task">ä»»å¡å®ä½å¯¹è±¡</param> |
| | | /// <returns></returns> |
| | | public WebResponseContent UpdateTaskStatusToNext([NotNull] Dt_Task task) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | int oldState = task.TaskState; |
| | | if (task.TaskType == (int)TaskOutboundTypeEnum.Outbound) |
| | | { |
| | | if (task.TaskState >= (int)TaskOutStatusEnum.OutFinish) |
| | | try |
| | | { |
| | | return content = WebResponseContent.Instance.Error($"该任å¡ç¶æä¸å¯è·³è½¬å°ä¸ä¸æ¥,ä»»å¡å·:ã{task.TaskNum}ã,ä»»å¡ç¶æ:ã{task.TaskState}ã"); |
| | | } |
| | | |
| | | int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskOutStatusEnum>(); |
| | | |
| | | task.TaskState = nextStatus; |
| | | if (task.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting) |
| | | { |
| | | task.Dispatchertime = DateTime.Now; |
| | | } |
| | | } |
| | | else if (task.TaskType == (int)TaskInboundTypeEnum.Inbound) |
| | | { |
| | | if (task.TaskState >= (int)TaskInStatusEnum.InFinish) |
| | | { |
| | | return content = WebResponseContent.Instance.Error($"该任å¡ç¶æä¸å¯è·³è½¬å°ä¸ä¸æ¥,ä»»å¡å·:ã{task.TaskNum}ã,ä»»å¡ç¶æ:ã{task.TaskState}ã"); |
| | | } |
| | | |
| | | int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskInStatusEnum>(); |
| | | task.TaskState = nextStatus; |
| | | if (task.TaskState == (int)TaskInStatusEnum.SC_InExecuting) |
| | | { |
| | | task.Dispatchertime = DateTime.Now; |
| | | } |
| | | if (task.TaskState == (int)TaskRelocationTypeEnum.Relocation) |
| | | { |
| | | Random random = new Random(); |
| | | task.CurrentAddress = task.NextAddress; |
| | | task.NextAddress = $"{random.Next(1, 100).ToString().PadLeft(3, '0')}-{random.Next(1, 100).ToString().PadLeft(3, '0')}-{random.Next(1, 100).ToString().PadLeft(3, '0')}"; |
| | | task.TargetAddress = task.NextAddress; |
| | | } |
| | | } |
| | | else if (task.TaskType == (int)TaskInboundTypeEnum.Inbound) |
| | | { |
| | | if (task.TaskState <= (int)TaskRelocationStatusEnum.SC_RelocationFinish) |
| | | { |
| | | |
| | | return content = WebResponseContent.Instance.Error($"该任å¡ç¶æä¸å¯è·³è½¬å°ä¸ä¸æ¥,ä»»å¡å·:ã{task.TaskNum}ã,ä»»å¡ç¶æ:ã{task.TaskState}ã"); |
| | | } |
| | | |
| | | int nextStatus = (int)TaskRelocationStatusEnum.SC_RelocationExecuting; |
| | | task.TaskState = nextStatus; |
| | | if (task.TaskState == (int)TaskRelocationStatusEnum.SC_RelocationExecuting) |
| | | { |
| | | task.Dispatchertime = DateTime.Now; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | throw new Exception($"ä»»å¡ç±»åé误,æªæ¾å°è¯¥ä»»å¡ç±»å,ä»»å¡å·:ã{task.TaskNum}ã,ä»»å¡ç±»å:ã{task.TaskType}ã"); |
| | | } |
| | | |
| | | if (task.TaskState <= 0) |
| | | { |
| | | return content = WebResponseContent.Instance.Error($"该任å¡ç¶æä¸å¯è·³è½¬å°ä¸ä¸æ¥,ä»»å¡å·:ã{task.TaskNum}ã,ä»»å¡ç¶æ:ã{task.TaskState}ã"); |
| | | } |
| | | |
| | | |
| | | task.ModifyDate = DateTime.Now; |
| | | task.Modifier = "System"; |
| | | BaseDal.UpdateData(task); |
| | | |
| | | _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, App.User.UserId > 0 ? $"人工æå¨å°ä»»å¡ç¶æä»ã{oldState}ã跳转å°ã{task.TaskState}ã" : $"ç³»ç»èªå¨æµç¨ï¼ä»»å¡ç¶æä»ã{oldState}ã转å°ã{task.TaskState}ã"); |
| | | |
| | | content = WebResponseContent.Instance.OK(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | content = WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | return content; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®ä»»å¡å·ãå½åå°åæ´æ°ä»»å¡ä½ç½®ä¿¡æ¯ |
| | | /// </summary> |
| | | /// <param name="taskNum">ä»»å¡å·</param> |
| | | /// <param name="currentAddress">å½åå°å</param> |
| | | /// <returns></returns> |
| | | public Dt_Task? UpdatePosition(int taskNum, string currentAddress) |
| | | { |
| | | try |
| | | { |
| | | 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; |
| | | |
| | | List<Dt_Router> routers = _routerService.QueryNextRoutes(task.NextAddress, task.TargetAddress); |
| | | if (!routers.Any()) throw new Exception($"æªæ¾å°è®¾å¤è·¯ç±ä¿¡æ¯"); |
| | | |
| | | task.CurrentAddress = task.NextAddress; |
| | | task.NextAddress = routers.FirstOrDefault().ChildPosi; |
| | | |
| | | 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) |
| | | { |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | |
| | | public WebResponseContent StackCraneTaskCompleted(int taskNum) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); |
| | | if (task == null) return WebResponseContent.Instance.Error($"æªæ¾å°è¯¥ä»»å¡ä¿¡æ¯,ä»»å¡å·:ã{taskNum}ã"); |
| | | |
| | | if (task.TaskType == (int)TaskOutboundTypeEnum.Outbound && task.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting) |
| | | { |
| | | /*List<Dt_Router> routers = _routerService.QueryNextRoutes(task.NextAddress, task.TargetAddress); |
| | | if (!routers.Any()) return WebResponseContent.Instance.Error($"æªæ¾å°è®¾å¤è·¯ç±ä¿¡æ¯");*/ |
| | | |
| | | task.TaskState = (int)TaskOutStatusEnum.OutFinish; |
| | | task.ModifyDate = DateTime.Now; |
| | | BaseDal.DeleteData(task); |
| | | _task_HtyService.AddTaskHty(task); |
| | | _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"åºåºå®æ"); |
| | | //todo 忥å°WMS |
| | | |
| | | //æä¸èèå¤ä¸ªåºåºå£ |
| | | } |
| | | else if (task.TaskType == (int)TaskInboundTypeEnum.Inbound && task.TaskState == (int)TaskInStatusEnum.SC_InExecuting) |
| | | { |
| | | //todo |
| | | //int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskInStatusEnum>(); |
| | | task.TaskState = (int)TaskInStatusEnum.InFinish; |
| | | task.ModifyDate = DateTime.Now; |
| | | task.Modifier = "System"; |
| | | BaseDal.DeleteData(task); |
| | | _task_HtyService.AddTaskHty(task); |
| | | _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"å
¥åºå®æ"); |
| | | |
| | | } |
| | | else |
| | | { |
| | | throw new Exception($"ä»»å¡ç±»åé误,æªæ¾å°è¯¥ä»»å¡ç±»å,ä»»å¡å·:ã{taskNum}ã,ä»»å¡ç±»å:ã{task.TaskType}ã"); |
| | | } |
| | | content = WebResponseContent.Instance.OK(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | content = WebResponseContent.Instance.Error($"ä»»å¡å®æå¼å¸¸,ä»»å¡å·:ã{taskNum}ã"); |
| | | } |
| | | return content; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¢å¤æèµ·ä»»å¡ |
| | | /// </summary> |
| | | /// <param name="taskNum">ä»»å¡å·</param> |
| | | /// <returns>è¿åå¤çç»æ</returns> |
| | | public WebResponseContent TaskStatusRecovery(int taskNum) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); |
| | | if (task == null) return WebResponseContent.Instance.Error($"æªæ¾å°è¯¥ä»»å¡ä¿¡æ¯,ä»»å¡å·:ã{taskNum}ã"); |
| | | if (task.TaskState != (int)TaskInStatusEnum.InPending && task.TaskState != (int)TaskOutStatusEnum.OutPending) |
| | | { |
| | | return content = WebResponseContent.Instance.Error($"该任å¡ç¶æä¸å¯æ¢å¤,ä»»å¡å·:ã{taskNum}ã,ä»»å¡ç¶æ:ã{task.TaskState}ã"); |
| | | } |
| | | |
| | | Dt_TaskExecuteDetail taskExecuteDetail = _taskExecuteDetailRepository.QueryFirst(x => x.TaskId == task.TaskId && x.IsNormal, new Dictionary<string, OrderByType> { { nameof(Dt_TaskExecuteDetail.TaskDetailId), OrderByType.Desc } }); |
| | | if (taskExecuteDetail != null) |
| | | { |
| | | task.TaskState = taskExecuteDetail.TaskState; |
| | | } |
| | | else |
| | | { |
| | | if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) |
| | | { |
| | | task.TaskState = (int)TaskOutStatusEnum.OutNew; |
| | | } |
| | | else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup) |
| | | { |
| | | task.TaskState = (int)TaskInStatusEnum.InNew; |
| | | } |
| | | //todo |
| | | } |
| | | |
| | | task.ExceptionMessage = string.Empty; |
| | | |
| | | BaseDal.UpdateData(task); |
| | | |
| | | _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"人工æ¢å¤æèµ·ä»»å¡,æ¢å¤æèµ·æ¶ä»»å¡ç¶æã{task.TaskState}ã"); |
| | | |
| | | content = WebResponseContent.Instance.OK(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | content = WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | return content; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 忻任å¡ç¶æ |
| | | /// </summary> |
| | | /// <param name="taskNum">ä»»å¡å·</param> |
| | | /// <returns>è¿åå¤çç»æ</returns> |
| | | public WebResponseContent RollbackTaskStatusToLast(int taskNum) |
| | | { |
| | | WebResponseContent content = new(); |
| | | try |
| | | { |
| | | Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); |
| | | if (task == null) return WebResponseContent.Instance.Error($"æªæ¾å°è¯¥ä»»å¡ä¿¡æ¯,ä»»å¡å·:ã{taskNum}ã"); |
| | | |
| | | int oldState = task.TaskState; |
| | | Dt_TaskExecuteDetail taskExecuteDetail = _taskExecuteDetailRepository.QueryFirst(x => x.TaskId == task.TaskId && x.TaskState < task.TaskState && x.TaskState > 0, new Dictionary<string, OrderByType> { { nameof(Dt_TaskExecuteDetail.TaskDetailId), OrderByType.Desc } }); |
| | | if (taskExecuteDetail != null) |
| | | { |
| | | task.TaskState = taskExecuteDetail.TaskState; |
| | | task.CurrentAddress = taskExecuteDetail.CurrentAddress; |
| | | task.NextAddress = taskExecuteDetail.NextAddress; |
| | | } |
| | | else |
| | | { |
| | | return content = WebResponseContent.Instance.Error($"æªæ¾å°ä»»å¡æç»ä¿¡æ¯,该任å¡ç¶æä¸å¯åæ»å°ä¸ä¸æ¥,ä»»å¡å·:ã{taskNum}ã,ä»»å¡ç¶æ:ã{task.TaskState}ã"); |
| | | } |
| | | |
| | | task.ExceptionMessage = string.Empty; |
| | | |
| | | BaseDal.UpdateData(task); |
| | | |
| | | _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"人工å°ä»»å¡ç¶æä»ã{oldState}ãåæ»å°ã{task.TaskState}ã"); |
| | | |
| | | content = WebResponseContent.Instance.OK(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | content = WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | return content; |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// å 餿°æ® |
| | | /// </summary> |
| | | /// <param name="keys">䏻鮿°ç»</param> |
| | | /// <returns></returns> |
| | | public virtual WebResponseContent DeleteData(object[] keys) |
| | | { |
| | | try |
| | | { |
| | | List<Dt_Task> tasks = BaseDal.QureyDataByIds(keys); |
| | | foreach (Dt_Task task in tasks) |
| | | { |
| | | _task_HtyService.AddTaskHty(task); |
| | | } |
| | | |
| | | |
| | | if (typeof(Dt_Task).GetNavigatePro() == null) |
| | | return BaseDal.DeleteDataByIds(keys) ? WebResponseContent.Instance.OK() : WebResponseContent.Instance.Error(); |
| | | else |
| | | { |
| | | if (keys != null) |
| | | { |
| | | Type detailType = typeof(Dt_Task).GetDetailType(); |
| | | string name = typeof(Dt_Task).GetMainIdByDetail(); |
| | | List<object> dynamicDelKeys = new List<object>(); |
| | | |
| | | for (int i = 0; i < keys.Length; i++) |
| | | lock (placedBlocks) |
| | | { |
| | | dynamicDelKeys.Add(keys[i]); |
| | | int length = Convert.ToInt32(orderDetails[i].Orderdetails_length); |
| | | int width = Convert.ToInt32(orderDetails[i].Orderdetails_width); |
| | | int height = Convert.ToInt32(orderDetails[i].Orderdetails_thickness); |
| | | |
| | | OrderInfo orderInfo = _orderDetailsService.GetOrderInfoByBarcode(orderDetails[i].Orderdetails_outid); |
| | | |
| | | var (flag, taskPosition, message) = _containerService.GetPosition(orderInfo.OrderHeadId, orderInfo.OrderNo, length, width, height); |
| | | if (flag && taskPosition != null) |
| | | { |
| | | if (string.IsNullOrEmpty(putPosition)) |
| | | { |
| | | putPosition = taskPosition.PutPosition; |
| | | } |
| | | |
| | | if (putPosition != taskPosition.PutPosition) |
| | | { |
| | | continue; |
| | | } |
| | | |
| | | Dt_OrderContainer orderContainer = _orderContainerRepository.QueryFirst(x => x.OrderNo == orderInfo.OrderNo && x.ContainerCode == taskPosition.PutPosition); |
| | | |
| | | Dt_Container putContainer = _containerRepository.QueryFirst(x => x.ContainerCode == taskPosition.PutPosition); |
| | | if (putContainer == null) |
| | | { |
| | | //todo |
| | | throw new Exception("æªæ¾å°æ¾è´§ä½ç½®"); |
| | | } |
| | | |
| | | bool isAdd = false; |
| | | if (orderContainer == null) |
| | | { |
| | | orderContainer = new Dt_OrderContainer() |
| | | { |
| | | OrderId = orderInfo.OrderHeadId, |
| | | ContainerCode = putContainer.ContainerCode, |
| | | ContainerId = putContainer.Id, |
| | | OrderNo = orderInfo.OrderNo, |
| | | }; |
| | | int containerLength = putContainer.ContainerLength; |
| | | int containerWidth = putContainer.ContainerWidth; |
| | | int maxValue = Math.Max(length, width); |
| | | int minValue = Math.Min(length, width); |
| | | if (minValue > putContainer.ContainerWidth) |
| | | { |
| | | containerLength = maxValue; |
| | | containerWidth = minValue; |
| | | } |
| | | |
| | | orderContainer.MaxLength = containerLength; |
| | | orderContainer.MaxWidth = containerWidth; |
| | | isAdd = true; |
| | | } |
| | | |
| | | if (taskPosition != null) |
| | | { |
| | | Dt_ContainerItem dt_ContainerItem = new Dt_ContainerItem() |
| | | { |
| | | ContainerId = putContainer.Id, |
| | | ItemCode = orderInfo.Barcode, |
| | | ItemLength = length, |
| | | ItemWidth = width, |
| | | ItemHeight = height, |
| | | ItemPositionX = taskPosition.PositionX, |
| | | ItemPositionY = taskPosition.PositionY, |
| | | ItemPositionZ = taskPosition.PositionZ, |
| | | ItemRelaPositionX = taskPosition.PutPositionX, |
| | | ItemRelaPositionY = taskPosition.PutPositionY, |
| | | ItemRelaPositionZ = taskPosition.PutPositionZ, |
| | | ItemStatus = (int)ItemStatusEnum.Assigned, |
| | | ItemName = orderInfo.Barcode |
| | | }; |
| | | |
| | | Dt_Task dt_Task = new Dt_Task() |
| | | { |
| | | PalletCode = orderInfo.Barcode, |
| | | DeviceCode = putContainer.DeviceCode, |
| | | TaskState = (int)TaskStatusEnum.Gantry_Wait, |
| | | TaskType = 0, |
| | | SourceAddress = "", |
| | | TargetAddress = $"F06", |
| | | CurrentAddress = $"F06*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}", |
| | | NextAddress = $"{putContainer.ContainerCode}*{taskPosition.PutPositionX}*{taskPosition.PutPositionY}*{taskPosition.PutPositionZ}*{taskPosition.PositionR}", |
| | | ItemInfo = $"{length}*{width}*{height}", |
| | | Grade = 0, |
| | | }; |
| | | putContainer.ContainerStatus = ContainerStatusEnum.NonEmpty.ObjToInt(); |
| | | _unitOfWorkManage.BeginTran(); |
| | | BaseDal.AddData(dt_Task); |
| | | _containerRepository.UpdateData(putContainer); |
| | | _containerItemRepository.AddData(dt_ContainerItem); |
| | | if (isAdd) |
| | | { |
| | | _orderContainerRepository.AddData(orderContainer); |
| | | } |
| | | _unitOfWorkManage.CommitTran(); |
| | | |
| | | PlacedBlock placedBlock = new PlacedBlock(new Point3D(taskPosition.PositionX, taskPosition.PositionY, taskPosition.PositionZ), length > width ? length : width, width > length ? length : width, height); |
| | | placedBlocks.Add(placedBlock); |
| | | |
| | | Thread.Sleep(1000); |
| | | object obj = new |
| | | { |
| | | x = taskPosition.PutCenterPositionX - putContainer.ContainerLength / 2, |
| | | y = taskPosition.PutCenterPositionY - putContainer.ContainerWidth / 2, |
| | | z = taskPosition.PutPositionZ, |
| | | length = length > width ? length : width, |
| | | width = width > length ? length : width, |
| | | height, |
| | | }; |
| | | _webSocketServer.PublishAllClientPayload(obj.Serialize()); |
| | | } |
| | | } |
| | | } |
| | | ((SqlSugarClient)BaseDal.Db).BeginTran(); |
| | | |
| | | if (dynamicDelKeys.Count > 0) |
| | | BaseDal.Db.Deleteable<object>().AS(detailType.Name).Where($"{name} in (@id)", new { id = dynamicDelKeys.ToArray() }).ExecuteCommandHasChange(); |
| | | |
| | | BaseDal.DeleteDataByIds(keys); |
| | | |
| | | ((SqlSugarClient)BaseDal.Db).CommitTran(); |
| | | |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | | else |
| | | catch (Exception ex) |
| | | { |
| | | return WebResponseContent.Instance.Error("åæ°é误"); |
| | | |
| | | } |
| | | } |
| | | return WebResponseContent.Instance.OK(data: placedBlocks); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | ((SqlSugarClient)BaseDal.Db).RollbackTran(); |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | } |
| | | |
| | | //agvä»»å¡ |
| | | public WebResponseContent GetAgvTaskData() |
| | | /// <summary> |
| | | /// å建任å¡å¹¶è®¡ç®ç©åæ¾ç½®ä½ç½® |
| | | /// </summary> |
| | | /// <param name="takePosition">åè´§ä½ç½®ç¼ç </param> |
| | | /// <param name="putPosition">æ¾è´§ä½ç½®ç¼ç </param> |
| | | /// <param name="deviceCode">设å¤ç¼ç </param> |
| | | /// <param name="length">ç©åé¿åº¦</param> |
| | | /// <param name="width">ç©å宽度</param> |
| | | /// <param name="height">ç©åé«åº¦</param> |
| | | /// <returns>å
嫿ä½ç»æçWebååºå
容</returns> |
| | | /// <remarks> |
| | | /// 1. éªè¯åè´§/æ¾è´§ä½ç½®æ¯å¦åå¨ <br/> |
| | | /// 2. 计ç®ç©åå¨å®¹å¨ä¸çæä½³æ¾ç½®ä½ç½® <br/> |
| | | /// 3. å建容å¨ç©åè®°å½åä»»å¡è®°å½ <br/> |
| | | /// 4. éè¿WebSocketéç¥å®¢æ·ç«¯ |
| | | /// </remarks> |
| | | public WebResponseContent CreateTask(string takePosition, string putPosition, string deviceCode, int length, int width, int height) |
| | | { |
| | | WebResponseContent content=new WebResponseContent(); |
| | | List<Dt_Task> tasks = BaseDal.QueryData().ToList(); |
| | | List<AGCTaskDto> agvdto = new List<AGCTaskDto>(); |
| | | foreach (var item in tasks) |
| | | { |
| | | AGCTaskDto aGCTaskDto = new AGCTaskDto(); |
| | | aGCTaskDto.TaskNum = item.TaskNum; |
| | | aGCTaskDto.SourceAddress= item.SourceAddress; |
| | | aGCTaskDto.TargetAddress= item.TargetAddress==null? "æå®" : item.TargetAddress; |
| | | aGCTaskDto.Dispatchertime = item.Dispatchertime; |
| | | aGCTaskDto.TaskState = item.TaskState == (int)TaskInStatusEnum.InNew ? "æ°å»ºä»»å¡" : (item.TaskState == (int)TaskInStatusEnum.AGV_InExecuting ? "AGV任塿§è¡" : "ä»»å¡å®æ"); |
| | | aGCTaskDto.TaskType = item.TaskType.ToString(); |
| | | aGCTaskDto.Roadway = item.Roadway=="1"?"åºåä¸":(item.Roadway == "2" ? "åºåäº": item.Roadway == "3" ? "åºåä¸":"åºåå"); |
| | | agvdto.Add(aGCTaskDto); |
| | | } |
| | | return content.OK(data: agvdto); |
| | | } |
| | | |
| | | //agvç¶æ |
| | | public WebResponseContent GetAgvStatusData() |
| | | { |
| | | var response = new WebResponseContent(); |
| | | try |
| | | { |
| | | //agvç±»åï¼0-æ½ä¼åï¼1 - çµå¼åï¼2 - æ¿è½½åï¼3 - 举ååï¼4 -è¾éåï¼5 - å车åï¼6 - å
¶ä» |
| | | int agvType = 0; |
| | | //agvç¼å· |
| | | int agvCode = 2; |
| | | //agvä¸ä¸çº¿ç¶æï¼0-ä¸çº¿ï¼1 - ä¸çº¿ |
| | | int agvOnline = 4; |
| | | //agvå½åå°æ å· |
| | | int agvRfidLabel = 6; |
| | | //agvå½åxåæ å¼ |
| | | int agvXcoordinate = 8; |
| | | //agvå½åyåæ å¼ |
| | | int agvYcoordinate = 12; |
| | | //agvè¿è¡ç¶æ ï¼0-忢ï¼1 - è¡é©¶ï¼2 - æå |
| | | int agvStatus = 16; |
| | | //agvå½åè¿è¡é度(mm / s) |
| | | int agvSpeed = 18; |
| | | //agvæ¥è¦ä»£ç (æä½ç¶ææåï¼æå¤å¯è¡¨ç¤º32ç§æ¥è¦ |
| | | int agvAlarmCode = 20; |
| | | bool isFirst = true; |
| | | List<AGVStatus> statusList = new List<AGVStatus>(); |
| | | |
| | | for (int i = 0; i < 3; i++) |
| | | Dt_Container takeContainer = _containerRepository.QueryFirst(x => x.ContainerCode == takePosition && x.ContainerType == ContainerTypeEnum.TakeContainer.ObjToInt()); |
| | | if (takeContainer == null) |
| | | { |
| | | AGVStatus aGVStatus = new AGVStatus(); |
| | | aGVStatus.agvCode = i; |
| | | aGVStatus.agvType = 1+i; |
| | | aGVStatus.agvOnline = "123" + i; |
| | | aGVStatus.agvRfidLabel = 2 + i; |
| | | aGVStatus.agvXcoordinate = 3 + i; |
| | | aGVStatus.agvYcoordinate = 4 + i; |
| | | aGVStatus.agvStatus = 5 + i; |
| | | aGVStatus.agvSpeed = 6 + i; |
| | | aGVStatus.agvAlarmCode = i+99; //client.SiemensPLCClient.SiemensS7NetClient.Read("DB1001." + agvAlarmCode.ToString(), 32).Content; |
| | | statusList.Add(aGVStatus); |
| | | |
| | | return WebResponseContent.Instance.Error("åè´§ä½ç½®ä¸åå¨"); |
| | | } |
| | | |
| | | response.OK(data: statusList); |
| | | |
| | | List<Dt_Container> containers = _containerRepository.QueryData(x => x.DeviceCode == deviceCode && x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt()); |
| | | |
| | | Dt_Container putContainer = _containerRepository.QueryFirst(x => x.ContainerCode == putPosition && x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt()); |
| | | if (putContainer == null) |
| | | { |
| | | return WebResponseContent.Instance.Error("æ¾è´§ä½ç½®ä¸åå¨"); |
| | | } |
| | | |
| | | int edge = 0; |
| | | if (putContainer.ContainerNo == containers.Min(x => x.ContainerNo)) |
| | | { |
| | | edge = 1; |
| | | } |
| | | |
| | | ContainerSize containerSize = new ContainerSize(putContainer.ContainerLength, putContainer.ContainerWidth, putContainer.ContainerHeight); |
| | | List<Dt_ContainerItem> containerItems = _containerItemRepository.QueryData(x => x.ContainerId == putContainer.Id); |
| | | |
| | | List<PlacedBlock> placedBlocks = containerItems.Select(x => new PlacedBlock(new Point3D(x.ItemPositionX, x.ItemPositionY, x.ItemPositionZ), x.ItemLength > x.ItemLength ? x.ItemLength : x.ItemWidth, x.ItemLength > x.ItemLength ? x.ItemWidth : x.ItemLength, x.ItemHeight)).ToList(); |
| | | |
| | | |
| | | TaskPosition? taskPosition = _containerService.GetTaskPosition(length, width, height, containerSize, placedBlocks, edge); |
| | | if (taskPosition == null) |
| | | { |
| | | return WebResponseContent.Instance.Error("æªæ¾å°åéæ¾ç½®ä½ç½®"); |
| | | } |
| | | |
| | | object obj = new |
| | | { |
| | | x = taskPosition.PutCenterPositionX - putContainer.ContainerLength / 2, |
| | | y = taskPosition.PutCenterPositionY - putContainer.ContainerWidth / 2, |
| | | z = taskPosition.PutCenterPositionZ, |
| | | length, |
| | | width, |
| | | height, |
| | | }; |
| | | |
| | | _webSocketServer.PublishAllClientPayload(obj.Serialize()); |
| | | |
| | | string code = DateTime.Now.ToString("yyyyMMddHHmmss"); |
| | | |
| | | Dt_ContainerItem dt_ContainerItem = new Dt_ContainerItem() |
| | | { |
| | | ContainerId = putContainer.Id, |
| | | ItemCode = code, |
| | | ItemLength = length, |
| | | ItemWidth = width, |
| | | ItemHeight = height, |
| | | ItemPositionX = taskPosition.PositionX, |
| | | ItemPositionY = taskPosition.PositionY, |
| | | ItemPositionZ = taskPosition.PositionZ, |
| | | ItemRelaPositionX = taskPosition.PutPositionX, |
| | | ItemRelaPositionY = taskPosition.PutPositionY, |
| | | ItemRelaPositionZ = taskPosition.PutPositionZ, |
| | | ItemStatus = (int)ItemStatusEnum.Assigned, |
| | | ItemName = code |
| | | }; |
| | | |
| | | Dt_Task dt_Task = new Dt_Task() |
| | | { |
| | | PalletCode = code, |
| | | DeviceCode = putContainer.DeviceCode, |
| | | TaskState = (int)TaskStatusEnum.Gantry_New, |
| | | TaskType = 0, |
| | | SourceAddress = "", |
| | | TargetAddress = $"{takeContainer.ContainerNo}", |
| | | CurrentAddress = $"{takeContainer.ContainerCode}*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}", |
| | | NextAddress = $"{putContainer.ContainerCode}*{taskPosition.PutPositionX}*{taskPosition.PutPositionY}*{taskPosition.PutPositionZ}*{taskPosition.PositionR}", |
| | | ItemInfo = $"{length}*{width}*{height}", |
| | | Grade = 0, |
| | | }; |
| | | |
| | | _containerItemRepository.AddData(dt_ContainerItem); |
| | | base.AddData(dt_Task); |
| | | |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | response.Error(ex.Message); |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | |
| | | return response; |
| | | } |
| | | |
| | | public WebResponseContent GetAgvStatusData2() |
| | | /// <summary> |
| | | /// æ ¹æ®è®¢åä¿¡æ¯çæä»»å¡ |
| | | /// </summary> |
| | | /// <param name="orderInfo">订åä¿¡æ¯</param> |
| | | /// <returns>å
å«ä¸ä¸ªå¼çå
ç»ï¼ <br/> |
| | | /// Item1 - æä½æ¯å¦æå (bool) <br/> |
| | | /// Item2 - çæçä»»å¡å¯¹è±¡ (Dt_Task)ï¼å¤±è´¥æ¶ä¸ºnull <br/> |
| | | /// Item3 - éè¯¯æ¶æ¯ (string)ï¼æåæ¶ä¸ºç©ºå符串 |
| | | /// </returns> |
| | | /// <remarks> |
| | | /// è¯¥æ¹æ³ä¼ï¼ <br/> |
| | | /// 1. æ ¹æ®è®¢å尺寸è·ååéçè´§ä½ <br/> |
| | | /// 2. å建容å¨é¡¹åä»»å¡è®°å½ <br/> |
| | | /// 3. æ´æ°ç¸å
³å®¹å¨ç¶æ <br/> |
| | | /// 4. å¨äºå¡ä¸æ§è¡æææ°æ®åºæä½ |
| | | /// </remarks> |
| | | public (bool, Dt_Task?, string) GenerateTask(OrderInfo orderInfo) |
| | | { |
| | | var response = new WebResponseContent(); |
| | | try |
| | | { |
| | | //agvç±»åï¼0-æ½ä¼åï¼1 - çµå¼åï¼2 - æ¿è½½åï¼3 - 举ååï¼4 -è¾éåï¼5 - å车åï¼6 - å
¶ä» |
| | | int agvType = 0; |
| | | //agvç¼å· |
| | | int agvCode = 2; |
| | | //agvä¸ä¸çº¿ç¶æï¼0-ä¸çº¿ï¼1 - ä¸çº¿ |
| | | int agvOnline = 4; |
| | | //agvå½åå°æ å· |
| | | int agvRfidLabel = 6; |
| | | //agvå½åxåæ å¼ |
| | | int agvXcoordinate = 8; |
| | | //agvå½åyåæ å¼ |
| | | int agvYcoordinate = 12; |
| | | //agvè¿è¡ç¶æ ï¼0-忢ï¼1 - è¡é©¶ï¼2 - æå |
| | | int agvStatus = 16; |
| | | //agvå½åè¿è¡é度(mm / s) |
| | | int agvSpeed = 18; |
| | | //agvæ¥è¦ä»£ç (æä½ç¶ææåï¼æå¤å¯è¡¨ç¤º32ç§æ¥è¦ |
| | | int agvAlarmCode = 20; |
| | | bool isFirst = true; |
| | | List<AGVStatus> statusList = new List<AGVStatus>(); |
| | | int length = Convert.ToInt32(orderInfo.Length); |
| | | int width = Convert.ToInt32(orderInfo.Width); |
| | | int height = Convert.ToInt32(orderInfo.Thickness); |
| | | |
| | | for (int i = 0; i < 6; i++) |
| | | var (flag, taskPosition, message) = _containerService.GetPosition(orderInfo.OrderHeadId, orderInfo.OrderNo, length, width, height); |
| | | if (flag && taskPosition != null) |
| | | { |
| | | AGVStatus aGVStatus = new AGVStatus(); |
| | | aGVStatus.agvCode = i; |
| | | aGVStatus.agvType = 1 + i; |
| | | aGVStatus.agvOnline = "123" + i; |
| | | aGVStatus.agvRfidLabel = 2 + i; |
| | | aGVStatus.agvXcoordinate = 3 + i; |
| | | aGVStatus.agvYcoordinate = 4 + i; |
| | | aGVStatus.agvStatus = 5 + i; |
| | | aGVStatus.agvSpeed = 6 + i; |
| | | aGVStatus.agvAlarmCode = i + 99; //client.SiemensPLCClient.SiemensS7NetClient.Read("DB1001." + agvAlarmCode.ToString(), 32).Content; |
| | | statusList.Add(aGVStatus); |
| | | Dt_Container putContainer = _containerRepository.QueryFirst(x => x.ContainerCode == taskPosition.PutPosition); |
| | | if (putContainer == null) |
| | | { |
| | | return (false, null, "æªæ¾å°æ¾è´§ä½ç½®"); |
| | | } |
| | | |
| | | Dt_Container? takeContainer = GetTakePosition(putContainer.DeviceCode); |
| | | if (takeContainer == null) |
| | | { |
| | | return (false, null, "æªæ¾å°åè´§ä½ç½®"); |
| | | } |
| | | |
| | | Dt_OrderContainer orderContainer = _orderContainerRepository.QueryFirst(x => x.OrderNo == orderInfo.OrderNo && x.ContainerCode == putContainer.ContainerCode); |
| | | |
| | | bool isAdd = false; |
| | | bool isUpdate = false; |
| | | if (orderContainer == null) |
| | | { |
| | | orderContainer = new Dt_OrderContainer() |
| | | { |
| | | OrderId = orderInfo.OrderHeadId, |
| | | ContainerCode = putContainer.ContainerCode, |
| | | ContainerId = putContainer.Id, |
| | | OrderNo = orderInfo.OrderNo, |
| | | }; |
| | | |
| | | int containerLength = putContainer.ContainerLength; |
| | | int containerWidth = putContainer.ContainerWidth; |
| | | int maxValue = Math.Max(length, width); |
| | | int minValue = Math.Min(length, width); |
| | | if (minValue > putContainer.ContainerWidth) |
| | | { |
| | | containerLength = maxValue; |
| | | containerWidth = minValue; |
| | | } |
| | | |
| | | orderContainer.MaxLength = containerLength; |
| | | orderContainer.MaxWidth = containerWidth; |
| | | isAdd = true; |
| | | } |
| | | |
| | | Dt_ContainerItem dt_ContainerItem = new Dt_ContainerItem() |
| | | { |
| | | ContainerId = putContainer.Id, |
| | | ItemCode = orderInfo.Barcode, |
| | | ItemLength = length, |
| | | ItemWidth = width, |
| | | ItemHeight = height, |
| | | ItemPositionX = taskPosition.PositionX, |
| | | ItemPositionY = taskPosition.PositionY, |
| | | ItemPositionZ = taskPosition.PositionZ, |
| | | ItemRelaPositionX = taskPosition.PutPositionX, |
| | | ItemRelaPositionY = taskPosition.PutPositionY, |
| | | ItemRelaPositionZ = taskPosition.PutPositionZ, |
| | | ItemStatus = (int)ItemStatusEnum.Assigned, |
| | | ItemName = orderInfo.Barcode, |
| | | Remark = $"{takeContainer.ContainerCode}*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}" |
| | | }; |
| | | |
| | | Dt_Task dt_Task = new Dt_Task() |
| | | { |
| | | PalletCode = orderInfo.Barcode, |
| | | DeviceCode = putContainer.DeviceCode, |
| | | TaskState = (int)TaskStatusEnum.Gantry_Wait, |
| | | TaskType = 0, |
| | | SourceAddress = "", |
| | | TargetAddress = $"{takeContainer.ContainerNo}", |
| | | CurrentAddress = $"{takeContainer.ContainerCode}*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}", |
| | | NextAddress = $"{putContainer.ContainerCode}*{taskPosition.PutPositionX}*{taskPosition.PutPositionY}*{taskPosition.PutPositionZ}*{taskPosition.PositionR}", |
| | | ItemInfo = $"{length}*{width}*{height}", |
| | | Grade = 0, |
| | | }; |
| | | putContainer.ContainerStatus = ContainerStatusEnum.NonEmpty.ObjToInt(); |
| | | _unitOfWorkManage.BeginTran(); |
| | | BaseDal.AddData(dt_Task); |
| | | _containerRepository.UpdateData(putContainer); |
| | | _containerItemRepository.AddData(dt_ContainerItem); |
| | | if (isAdd) |
| | | { |
| | | _orderContainerRepository.AddData(orderContainer); |
| | | } |
| | | else if (isUpdate) |
| | | { |
| | | _orderContainerRepository.UpdateData(orderContainer); |
| | | } |
| | | _unitOfWorkManage.CommitTran(); |
| | | |
| | | return (true, dt_Task, ""); |
| | | } |
| | | |
| | | response.OK(data: statusList); |
| | | else |
| | | { |
| | | return (false, null, message); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | response.Error(ex.Message); |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return (false, null, $"é误,{ex.ExceptionToString()}"); |
| | | } |
| | | |
| | | return response; |
| | | } |
| | | |
| | | |
| | | public class AGVStatus |
| | | /// <summary> |
| | | /// éæ°çæä»»å¡ |
| | | /// </summary> |
| | | /// <param name="task">åå§ä»»å¡å¯¹è±¡</param> |
| | | /// <param name="stationCode">å·¥ä½ç«ç¼ç </param> |
| | | /// <returns> |
| | | /// å
å«ä¸ä¸ªå¼çå
ç»ï¼ <br/> |
| | | /// 1. bool - æä½æ¯å¦æå <br/> |
| | | /// 2. Dt_Task - æ´æ°åçä»»å¡å¯¹è±¡ï¼å¤±è´¥æ¶ä¸ºnullï¼ <br/> |
| | | /// 3. string - éè¯¯æ¶æ¯ï¼æåæ¶ä¸ºç©ºåç¬¦ä¸²ï¼ |
| | | /// </returns> |
| | | /// <remarks> |
| | | /// è¯¥æ¹æ³ç¨äºéæ°çæä»»å¡ä¿¡æ¯ï¼å
æ¬ï¼ <br/> |
| | | /// 1. è§£ææ¿åå°ºå¯¸ä¿¡æ¯ <br/> |
| | | /// 2. éªè¯åè´§/æ¾è´§ä½ç½® <br/> |
| | | /// 3. 计ç®ç©åæ¾ç½®ä½ç½® <br/> |
| | | /// 4. æ´æ°ä»»å¡ç¶æåä½ç½®ä¿¡æ¯ <br/> |
| | | /// 5. å¨äºå¡ä¸æ´æ°æ°æ®åºè®°å½ |
| | | /// </remarks> |
| | | public (bool, Dt_Task?, string) RegenerateTask(Dt_Task task, string stationCode) |
| | | { |
| | | /// <summary> |
| | | /// agvç±»åï¼0-æ½ä¼åï¼1 - çµå¼åï¼2 - æ¿è½½åï¼3 - 举ååï¼4 -è¾éåï¼5 - å车åï¼6 - å
¶ä» |
| | | /// </summary> |
| | | public int agvType { get; set; } |
| | | try |
| | | { |
| | | int length = 0; |
| | | int width = 0; |
| | | int height = 0; |
| | | Dt_ContainerItem containerItem = _containerItemRepository.QueryFirst(x => x.ItemCode == task.PalletCode); |
| | | if (containerItem == null) |
| | | { |
| | | List<string> itemInfos = task.ItemInfo.Split("*").ToList(); |
| | | if (itemInfos.Count == 3) |
| | | { |
| | | length = Convert.ToInt32(itemInfos[0]); |
| | | width = Convert.ToInt32(itemInfos[1]); |
| | | height = Convert.ToInt32(itemInfos[2]); |
| | | } |
| | | else |
| | | { |
| | | return (false, null, "æ¿å尺寸信æ¯é误"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | length = containerItem.ItemLength; |
| | | width = containerItem.ItemWidth; |
| | | height = containerItem.ItemHeight; |
| | | } |
| | | string containerCode = task.NextAddress.Split("*")[0]; |
| | | |
| | | /// <summary> |
| | | /// agvç¼å· |
| | | /// </summary> |
| | | public int agvCode { get; set; } |
| | | Dt_Container putContainer = _containerRepository.QueryFirst(x => x.ContainerCode == containerCode); |
| | | |
| | | /// <summary> |
| | | /// agvä¸ä¸çº¿ç¶æï¼0-ä¸çº¿ï¼1 - ä¸çº¿ |
| | | /// </summary> |
| | | public string agvOnline { get; set; } |
| | | if (putContainer == null) |
| | | { |
| | | return (false, null, "æªæ¾å°æ¾è´§ä½ç½®"); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// agvå½åå°æ å· |
| | | /// </summary> |
| | | public int agvRfidLabel { get; set; } |
| | | Dt_Container? takeContainer = _containerRepository.QueryFirst(x => x.ContainerCode == stationCode); |
| | | if (takeContainer == null) |
| | | { |
| | | return (false, null, "æªæ¾å°åè´§ä½ç½®"); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// agvå½åxåæ å¼ |
| | | /// </summary> |
| | | public int agvXcoordinate { get; set; } |
| | | var (flag, taskPosition, message) = _containerService.GetPosition(putContainer, length, width, height); |
| | | if (!flag || taskPosition == null) |
| | | { |
| | | return (false, null, message); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// agvå½åyåæ å¼ |
| | | /// </summary> |
| | | public int agvYcoordinate { get; set; } |
| | | Dt_OrderContainer orderContainer = _orderContainerRepository.QueryFirst(x => x.ContainerCode == putContainer.ContainerCode); |
| | | |
| | | /// <summary> |
| | | /// agvè¿è¡ç¶æ ï¼0-忢ï¼1 - è¡é©¶ï¼2 - æå |
| | | /// </summary> |
| | | public int agvStatus { get; set; } |
| | | bool isAdd = false; |
| | | |
| | | /// <summary> |
| | | /// agvå½åè¿è¡é度(mm / s) |
| | | /// </summary> |
| | | public int agvSpeed { get; set; } |
| | | if (orderContainer == null) |
| | | { |
| | | return (false, null, "æªæ¾å°è®¢åä¸å®¹å¨ç»å®å
³ç³»"); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// agvæ¥è¦ä»£ç (æä½ç¶ææåï¼æå¤å¯è¡¨ç¤º32ç§æ¥è¦ |
| | | /// </summary> |
| | | public int agvAlarmCode { get; set; } |
| | | int containerLength = putContainer.ContainerLength; |
| | | int containerWidth = putContainer.ContainerWidth; |
| | | int maxValue = Math.Max(length, width); |
| | | int minValue = Math.Min(length, width); |
| | | if (minValue > putContainer.ContainerWidth) |
| | | { |
| | | containerLength = maxValue; |
| | | containerWidth = minValue; |
| | | } |
| | | |
| | | orderContainer.MaxLength = containerLength; |
| | | orderContainer.MaxWidth = containerWidth; |
| | | |
| | | if (containerItem == null) |
| | | { |
| | | containerItem = new Dt_ContainerItem() |
| | | { |
| | | ContainerId = putContainer.Id, |
| | | ItemCode = task.PalletCode, |
| | | ItemLength = length, |
| | | ItemWidth = width, |
| | | ItemHeight = height, |
| | | ItemPositionX = taskPosition.PositionX, |
| | | ItemPositionY = taskPosition.PositionY, |
| | | ItemPositionZ = taskPosition.PositionZ, |
| | | ItemRelaPositionX = taskPosition.PutPositionX, |
| | | ItemRelaPositionY = taskPosition.PutPositionY, |
| | | ItemRelaPositionZ = taskPosition.PutPositionZ, |
| | | ItemStatus = (int)ItemStatusEnum.Assigned, |
| | | ItemName = task.PalletCode, |
| | | Remark = $"{takeContainer.ContainerCode}*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}" |
| | | }; |
| | | isAdd = true; |
| | | } |
| | | else |
| | | { |
| | | containerItem.ItemLength = length; |
| | | containerItem.ItemWidth = width; |
| | | containerItem.ItemHeight = height; |
| | | containerItem.ItemPositionX = taskPosition.PositionX; |
| | | containerItem.ItemPositionY = taskPosition.PositionY; |
| | | containerItem.ItemPositionZ = taskPosition.PositionZ; |
| | | containerItem.ItemRelaPositionX = taskPosition.PutPositionX; |
| | | containerItem.ItemRelaPositionY = taskPosition.PutPositionY; |
| | | containerItem.ItemRelaPositionZ = taskPosition.PutPositionZ; |
| | | containerItem.ItemStatus = (int)ItemStatusEnum.Assigned; |
| | | containerItem.Remark = $"{takeContainer.ContainerCode}*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}"; |
| | | } |
| | | |
| | | task.TaskState = (int)TaskStatusEnum.Gantry_New; |
| | | task.CurrentAddress = $"{takeContainer.ContainerCode}*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}"; |
| | | task.NextAddress = $"{putContainer.ContainerCode}*{taskPosition.PutPositionX}*{taskPosition.PutPositionY}*{taskPosition.PutPositionZ}*{taskPosition.PositionR}"; |
| | | task.ItemInfo = $"{length}*{width}*{height}"; |
| | | |
| | | _unitOfWorkManage.BeginTran(); |
| | | BaseDal.UpdateData(task); |
| | | _containerRepository.UpdateData(putContainer); |
| | | _orderContainerRepository.UpdateData(orderContainer); |
| | | |
| | | if (isAdd) |
| | | { |
| | | _containerItemRepository.AddData(containerItem); |
| | | } |
| | | else |
| | | { |
| | | _containerItemRepository.UpdateData(containerItem); |
| | | } |
| | | _unitOfWorkManage.CommitTran(); |
| | | |
| | | return (true, task, ""); |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return (false, null, $"é误,{ex.ExceptionToString()}"); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// çæå¼å¸¸ä»»å¡ |
| | | /// </summary> |
| | | /// <param name="orderInfo">订åä¿¡æ¯</param> |
| | | /// <returns>å
ç»å
å«ä¸ä¸ªå¼ï¼ <br/> |
| | | /// Item1 - æä½æ¯å¦æåï¼boolï¼ <br/> |
| | | /// Item2 - çæçä»»å¡å¯¹è±¡ï¼Dt_Taskï¼ï¼å¤±è´¥æ¶ä¸ºnull <br/> |
| | | /// Item3 - éè¯¯æ¶æ¯ï¼stringï¼ï¼æåæ¶ä¸ºç©ºå符串</returns> |
| | | /// <remarks> |
| | | /// è¯¥æ¹æ³ä¼æ ¹æ®è®¢åä¿¡æ¯çæä¸ä¸ªå¼å¸¸å¤çä»»å¡ï¼å
æ¬ï¼ <br/> |
| | | /// 1. è·åå¼å¸¸ä½ç½® <br/> |
| | | /// 2. éªè¯æ¾è´§/åè´§ä½ç½® <br/> |
| | | /// 3. å建容å¨é¡¹åä»»å¡è®°å½ <br/> |
| | | /// 4. æäº¤äºå¡ |
| | | /// </remarks> |
| | | public (bool, Dt_Task?, string) GenerateExceptionTask(OrderInfo orderInfo) |
| | | { |
| | | int length = Convert.ToInt32(orderInfo.Length); |
| | | int width = Convert.ToInt32(orderInfo.Width); |
| | | int height = Convert.ToInt32(orderInfo.Thickness); |
| | | |
| | | var (flag, taskPosition, message) = _containerService.GetExceptionPosition(length, width, height); |
| | | if (flag && taskPosition != null) |
| | | { |
| | | Dt_Container putContainer = _containerRepository.QueryFirst(x => x.ContainerCode == taskPosition.PutPosition); |
| | | if (putContainer == null) |
| | | { |
| | | return (false, null, "æªæ¾å°æ¾è´§ä½ç½®"); |
| | | } |
| | | |
| | | Dt_Container? takeContainer = GetTakePosition(putContainer.DeviceCode); |
| | | if (takeContainer == null) |
| | | { |
| | | return (false, null, "æªæ¾å°åè´§ä½ç½®"); |
| | | } |
| | | |
| | | Dt_ContainerItem dt_ContainerItem = new Dt_ContainerItem() |
| | | { |
| | | ContainerId = putContainer.Id, |
| | | ItemCode = orderInfo.Barcode, |
| | | ItemLength = length, |
| | | ItemWidth = width, |
| | | ItemHeight = height, |
| | | ItemPositionX = taskPosition.PositionX, |
| | | ItemPositionY = taskPosition.PositionY, |
| | | ItemPositionZ = taskPosition.PositionZ, |
| | | ItemRelaPositionX = taskPosition.PutPositionX, |
| | | ItemRelaPositionY = taskPosition.PutPositionY, |
| | | ItemRelaPositionZ = taskPosition.PutPositionZ, |
| | | ItemStatus = (int)ItemStatusEnum.Assigned, |
| | | ItemName = orderInfo.Barcode, |
| | | Remark = $"{takeContainer.ContainerCode}*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}" |
| | | }; |
| | | |
| | | Dt_Task dt_Task = new Dt_Task() |
| | | { |
| | | PalletCode = orderInfo.Barcode, |
| | | DeviceCode = putContainer.DeviceCode, |
| | | TaskState = (int)TaskStatusEnum.Gantry_Wait, |
| | | TaskType = 0, |
| | | SourceAddress = "", |
| | | TargetAddress = $"{takeContainer.ContainerNo}", |
| | | CurrentAddress = $"{takeContainer.ContainerCode}*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}", |
| | | NextAddress = $"{putContainer.ContainerCode}*{taskPosition.PutPositionX}*{taskPosition.PutPositionY}*{taskPosition.PutPositionZ}*{taskPosition.PositionR}", |
| | | ItemInfo = $"{length}*{width}*{height}", |
| | | Grade = 0, |
| | | }; |
| | | |
| | | if (taskPosition.TakeCenterPositionZ == 99) |
| | | { |
| | | dt_Task.TaskState = (int)TaskStatusEnum.Gantry_BeRelease; |
| | | } |
| | | |
| | | _unitOfWorkManage.BeginTran(); |
| | | BaseDal.AddData(dt_Task); |
| | | _containerItemRepository.AddData(dt_ContainerItem); |
| | | _unitOfWorkManage.CommitTran(); |
| | | |
| | | return (true, dt_Task, ""); |
| | | } |
| | | else |
| | | { |
| | | return (false, null, message); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®è®¾å¤ç¼å·è·ååè´§ä½ç½® |
| | | /// </summary> |
| | | /// <param name="deviceCode">设å¤ç¼å·</param> |
| | | /// <returns>ç¬¦åæ¡ä»¶ç容å¨å¯¹è±¡ï¼è¥æ¾ä¸å°åè¿ånull</returns> |
| | | /// <remarks> |
| | | /// 1. é¦å
æ¥è¯¢æå®è®¾å¤ä¸ææå¯ç¨çå货容å¨ï¼å¹¶æContainerSortååºæåº <br/> |
| | | /// 2. æ¥æ¾è¯¥è®¾å¤æè¿çä»»å¡è®°å½ <br/> |
| | | /// 3. 妿æ¾å°ä»»å¡è®°å½ï¼åæ ¹æ®ä»»å¡æºå°åå¹é
容å¨ï¼è¿åä¸ä¸ä¸ªå®¹å¨(è¥å·²æ¯æåä¸ä¸ªåè¿å第ä¸ä¸ª) <br/> |
| | | /// 4. 妿åºç°å¼å¸¸ææªæ¾å°å¹é
项ï¼åè¿å第ä¸ä¸ªå¯ç¨å®¹å¨ |
| | | /// </remarks> |
| | | public Dt_Container? GetTakePosition(string deviceCode) |
| | | { |
| | | Dictionary<string, OrderByType> orderby = new Dictionary<string, OrderByType>() { { nameof(Dt_Container.ContainerSort), OrderByType.Asc } }; |
| | | List<Dt_Container> containers = _containerRepository.QueryData(x => x.ContainerType == ContainerTypeEnum.TakeContainer.ObjToInt() && x.DeviceCode == deviceCode && x.ContainerEnable, orderby); |
| | | |
| | | try |
| | | { |
| | | if (containers == null || containers.Count == 0) |
| | | { |
| | | throw new Exception($"æªæ¾å°å¯¹åºçåè´§ä½ç½®,设å¤ç¼å·:{deviceCode}"); |
| | | } |
| | | |
| | | Dictionary<string, OrderByType> taskOrderby = new Dictionary<string, OrderByType>() { { nameof(Dt_Task.TaskNum), OrderByType.Desc } }; |
| | | Dt_Task task = BaseDal.QueryFirst(x => x.DeviceCode == deviceCode, taskOrderby); |
| | | if (task != null) |
| | | { |
| | | string? sourceCode = task.SourceAddress.Split("*").FirstOrDefault(); |
| | | if (!string.IsNullOrEmpty(sourceCode)) |
| | | { |
| | | Dt_Container? container = containers.FirstOrDefault(x => x.ContainerCode == sourceCode); |
| | | if (container != null) |
| | | { |
| | | int index = containers.IndexOf(container); |
| | | |
| | | if (index + 1 < containers.Count) |
| | | { |
| | | return containers[index + 1]; |
| | | } |
| | | else |
| | | { |
| | | return containers.FirstOrDefault(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | |
| | | } |
| | | return containers.FirstOrDefault(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ä»»å¡å®æå¤çæ¹æ³ |
| | | /// </summary> |
| | | /// <param name="task">ä»»å¡å®ä½</param> |
| | | /// <returns>Webååºå
容</returns> |
| | | /// <remarks> |
| | | /// 1. æ´æ°ä»»å¡ç¶æä¸º"é¾é¨æ¶å®æ" <br/> |
| | | /// 2. æ´æ°ç¸å
³è®¢å详æ
ç¶æä¸º"ç åæå" <br/> |
| | | /// 3. æ´æ°è®¢åè¡ä¸çæçæ°é <br/> |
| | | /// 4. æ ¹æ®ä»»å¡å®ææ
åµåéWebSocketéç¥ <br/> |
| | | /// 5. è®°å½æä½æ¥å¿å¹¶æäº¤äºå¡ <br/> |
| | | /// 6. å¼å¸¸æ¶åæ»äºå¡å¹¶è¿åéè¯¯ä¿¡æ¯ |
| | | /// </remarks> |
| | | public WebResponseContent TaskComplete(Dt_Task task) |
| | | { |
| | | try |
| | | { |
| | | task.TaskState = TaskStatusEnum.Gantry_Completed.ObjToInt(); |
| | | _unitOfWorkManage.BeginTran(); |
| | | OrderDetails orderDetails = _orderDetailsRepository.QueryFirst(x => x.Orderdetails_outid == task.PalletCode); |
| | | if (orderDetails != null) |
| | | { |
| | | orderDetails.Orderdetails_status = PalletingStatusEnmu.PalletingSuccess.ObjToInt(); |
| | | |
| | | Orderrows orderrows = _orderrowsRepository.QueryFirst(x => x.id == orderDetails.Orderrowsid); |
| | | if (orderrows != null) |
| | | { |
| | | orderrows.Orderrows_PalletNum = orderrows.Orderrows_PalletNum ?? 0 + 1; |
| | | |
| | | Dt_Container container = _containerRepository.QueryFirst(x => task.NextAddress.Contains(x.ContainerCode)); |
| | | |
| | | _orderDetailsRepository.UpdateData(orderDetails); |
| | | _orderrowsRepository.UpdateData(orderrows); |
| | | |
| | | if (container.ContainerType == ContainerTypeEnum.ExceptionContainer.ObjToInt()) |
| | | { |
| | | int count = Db.Queryable<Dt_ContainerItem>().Count(x => x.ContainerId == container.Id); |
| | | if (count >= 5) |
| | | { |
| | | if (LightStatusStorage.LightStatusDic.ContainsKey(container.ContainerCode)) |
| | | { |
| | | LightStatusStorage.LightStatusDic[container.ContainerCode] = LightStatusEnum.LightError; |
| | | } |
| | | } |
| | | } |
| | | |
| | | try |
| | | { |
| | | List<string> containerItemCodes = _containerItemRepository.QueryData(x => x.ContainerId == container.Id).Select(x => x.ItemCode).ToList(); |
| | | |
| | | List<OrderDetails> totalDetails = _orderDetailsRepository.QueryData(x => x.Orderrowsid == orderrows.id); |
| | | List<OrderDetails> details = totalDetails.Where(x => x.Orderrowsid == orderrows.id && x.Orderdetails_status == PalletingStatusEnmu.PalletingSuccess.ObjToInt() && containerItemCodes.Contains(x.Orderdetails_outid)).ToList(); |
| | | |
| | | int sortedNum = totalDetails.Where(x => x.Orderrowsid == orderrows.id && x.Orderdetails_status == PalletingStatusEnmu.PalletingSuccess.ObjToInt()).Count(); |
| | | |
| | | List<object> orderData = new List<object>(); |
| | | foreach (var item in details) |
| | | { |
| | | object obj = new |
| | | { |
| | | name = item.Orderdetails_name, |
| | | baseName = item.Orderdetails_productName, |
| | | size = $"{item.Orderdetails_length}*{item.Orderdetails_width}*{item.Orderdetails_thickness}", |
| | | process = "", |
| | | }; |
| | | orderData.Add(obj); |
| | | } |
| | | object data = new |
| | | { |
| | | orderCode = orderrows.Orderrows_orderid, |
| | | orderName = orderrows.Orderrows_name, |
| | | cusName = orderrows.Orderrows_customer, |
| | | stationCode = container.ContainerCode, |
| | | orderTotalNum = totalDetails.Count, |
| | | sortedNum = sortedNum, |
| | | unsortedNum = totalDetails.Count - sortedNum, |
| | | stationSortedNum = details.Count, |
| | | orderData = orderData, |
| | | orderId = orderrows.id, |
| | | release = 0 |
| | | }; |
| | | |
| | | |
| | | _webSocketServer.PublishAllClientPayload(data.Serialize()); |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | |
| | | } |
| | | } |
| | | } |
| | | |
| | | BaseDal.DeleteAndMoveIntoHty(task, App.User?.UserId > 0 ? OperateTypeEnum.äººå·¥å®æ : OperateTypeEnum.èªå¨å®æ); |
| | | _unitOfWorkManage.CommitTran(); |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | } |
| | | } |
| | | } |