#region << 版 本 注 释 >> /*---------------------------------------------------------------- * 命名空间:WIDESEAWCS_TaskInfoService * 创建者:胡童庆 * 创建时间:2024/8/2 16:13:36 * 版本:V1.0.0 * 描述: * * ---------------------------------------------------------------- * 修改人: * 修改时间: * 版本:V1.0.1 * 修改说明: * *----------------------------------------------------------------*/ #endregion << 版 本 注 释 >> using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical; using System.Text.Json; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Core; using WIDESEAWCS_Core.BaseServices; using WIDESEAWCS_DTO.TaskInfo; using WIDESEAWCS_ITaskInfoRepository; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_ISystemServices; using WIDESEAWCS_ISystemRepository; using WIDESEA_Common; using WIDESEA_Core.Enums; using SqlSugar.Extensions; using System.Threading.Tasks; using System.Reflection.Emit; using WIDESEAWCS_Core.Enums; using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup; using OfficeOpenXml.FormulaParsing.Excel.Functions.Numeric; using WIDESEAWCS_Core.Tool; using System.Net; namespace WIDESEAWCS_TaskInfoService { public class TaskCZService : ServiceBase, ITaskCZService { private readonly ITaskRepository _taskRepository; private readonly ITaskService _taskService; private readonly ITaskCZDetailsRepository _detailsRepository; private readonly IDt_StationinfoRepository _stationinfoRepository; private readonly ITaskHtyRepository _taskHtyRepository; private readonly ITaskHtyService _taskHtyService; public TaskCZService(ITaskCZRepository BaseDal, ITaskHtyService taskHtyService, ITaskHtyRepository taskHtyRepository, IDt_StationinfoRepository stationinfoRepository, ITaskService taskService, ITaskRepository taskRepository, ITaskCZDetailsRepository detailsRepository) : base(BaseDal) { _taskRepository = taskRepository; _detailsRepository = detailsRepository; _taskService = taskService; _stationinfoRepository = stationinfoRepository; _taskHtyRepository = taskHtyRepository; _taskHtyService = taskHtyService; } public Task AddTaskCZAsync(CZTaskDto dto) { var response = new WebResponseContent(); try { var task = BaseDal.QueryFirst(x => (x.TaskTaskID == dto.DTaskId) || (x.TaskEndAddress == dto.InputValue) || (x.TaskType == dto.TaskType)); if (task != null) { response.Error("任务已存在,请勿重复添加!"); } var taskModel = new DtCZTask() { TaskTaskID = dto.DTaskId, TaskType = dto.TaskType, TaskEndAddress = dto.InputValue, TaskStatus = TaskInStatusEnum.InNew.ToString(), CreateDate = DateTime.Now, TaskStartDate = DateTime.Now, TaskEndDate = DateTime.Now.AddDays(1), TaskName = dto.TaskType.ToString(), TaskNumber = dto.Number, TaskExecutor = "CZ", TaskOrderNo = dto.OrderNo, TaskOwner = "KH", TaskProductCode = dto.ProductCode, Creater = "KH" }; var isTrue = BaseDal.AddData(taskModel) > 0; if (isTrue) response.OK("任务添加成功!"); else response.Error("任务添加失败!"); } catch (System.Exception ex) { response.Error(ex.Message); } return Task.FromResult(response); } /// /// 完成任务 /// /// /// public Task FinishTask(CZTaskFinshDto dto) { WebResponseContent response = new WebResponseContent(); try { //ConsoleHelper.WriteErrorLine($"{nameof(dto.TaskId)}"); WriteLog.Info("任务完成").Write($"任务号{dto.TaskId}", "任务完成"); if (dto.Floor == 1) { var czTask = BaseDal.QueryFirst(x => x.TaskTaskID == dto.TaskId); if (czTask == null) { response.Error("任务不存在!"); return Task.FromResult(response); } //if (dto.Tags.Contains("正极")) //{ // czTask.TaskZJFinishNumber += 1; //} //else //{ // czTask.TaskFJFinishNumber += 1; //} //if (czTask.TaskZJFinishNumber == czTask.TaskNumber || czTask.TaskFJFinishNumber == czTask.TaskNumber) //{ // czTask.TaskStatus = TaskInStatusEnum.InFinish.ToString(); // czTask.TaskEndDate = DateTime.Now; //} //else //{ czTask.TaskStatus = TaskInStatusEnum.Line_InExecuting.ToString(); //} var details = new DtCZTaskDetails() { MaterialBarCode = dto.MaterialBarcode, MaterialType = dto.ProductCode, TaskDescription = "创智提交任务完成", TaskEndAddress = czTask.TaskEndAddress, TaskName = czTask.TaskName, TaskType = czTask.TaskType, TaskStatus = czTask.TaskStatus, TaskTaskID = czTask.TaskTaskID, }; _detailsRepository.AddData(details); //if (dto.FinishNum is < 1 or > 4) // throw new ArgumentException("参数错误!FinishNum 必须为 1-4"); //var detail = dto.FinishNum == 1 // ? new CZTaskBarCodeDto() // : JsonSerializer.Deserialize(czTask.DtCZTaskDetails) ?? new CZTaskBarCodeDto(); //var property = dto.FinishNum switch //{ // 1 => nameof(CZTaskBarCodeDto.BarCode1), // 2 => nameof(CZTaskBarCodeDto.BarCode2), // 3 => nameof(CZTaskBarCodeDto.BarCode3), // 4 => nameof(CZTaskBarCodeDto.BarCode4), // _ => throw new ArgumentOutOfRangeException("参数错误!请检查【FinishNum】!") //}; //typeof(CZTaskBarCodeDto).GetProperty(property)?.SetValue(detail, dto.MaterialBarcode); //czTask.DtCZTaskDetails = JsonSerializer.Serialize(detail); var isTrue = BaseDal.UpdateData(czTask); if (isTrue) { response.OK("任务完成成功!"); } else { response.Error("任务完成失败!"); } } else { Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == dto.TaskId.ObjToInt()); if (task == null) { response.Error("任务不存在!"); return Task.FromResult(response); } WriteLog.Info("1").Write($"任务号{task.TaskNum}", "1"); task.TaskState = TaskInStatusEnum.AGV_InFinish.ObjToInt(); if (task.SourceAddress.Contains("SL-0")) { var address = task.SourceAddress.Split("||"); WriteLog.Info("1").Write($"{address}", "1"); Dt_Stationinfo Stationinfo = _stationinfoRepository.QueryFirst(x => x.StationCode == address[0]); WriteLog.Info("1").Write($"{Stationinfo.StationCode}", "1"); Dt_Stationinfo Stationinfo1 = _stationinfoRepository.QueryFirst(x => x.StationCode == address[1]); WriteLog.Info("1").Write($"{Stationinfo.StationCode}", "1"); Stationinfo.Location_state = LocationStatusEnum.Free.ObjToInt(); _stationinfoRepository.UpdateData(Stationinfo); Stationinfo1.Location_state = LocationStatusEnum.Free.ObjToInt(); _stationinfoRepository.UpdateData(Stationinfo1); } if (task.TargetAddress.Contains("SL-0")) { var address = task.TargetAddress.Split("||"); Dt_Stationinfo Stationinfo = _stationinfoRepository.QueryFirst(x => x.StationCode == address[0]); WriteLog.Info("2").Write($"{Stationinfo.StationCode}", "2"); Dt_Stationinfo Stationinfo1 = _stationinfoRepository.QueryFirst(x => x.StationCode == address[1]); WriteLog.Info("2").Write($"{Stationinfo.StationCode}", "2"); Stationinfo.Location_state = LocationStatusEnum.InStock.ObjToInt(); _stationinfoRepository.UpdateData(Stationinfo); Stationinfo1.Location_state = LocationStatusEnum.InStock.ObjToInt(); _stationinfoRepository.UpdateData(Stationinfo1); } _taskHtyService.AddTask_Hty(task, OperateTypeEnum.自动完成); _taskService.DeleteData(task); response.OK("任务完成成功!"); WriteLog.Info("任务完成成功").Write($"任务号{task.TaskId}", "任务完成成功"); } } catch (Exception ex) { response.Error(ex.Message); } return Task.FromResult(response); } /// /// 空托回流 AGV任务完成之后需更新缓存架状态 /// /// /// public Task EmptyTask(SaveModel saveModel) { WebResponseContent webResponseContent = new WebResponseContent(); try { //通过站点表判断缓存架是那个区域去那条输送线回流口。。。。。。。。。。。 string Saddress = saveModel.MainData["sourceAddress"].ToString(); string Saddress1 = saveModel.MainData["sourceAddress1"].ToString(); string Taddress = saveModel.MainData["targetAddress"].ToString(); if (Saddress == Saddress1) { webResponseContent.Error("同一缓存架不能扫描两次!"); return Task.FromResult(webResponseContent); } Dt_Task task = _taskRepository.QueryFirst(x => x.SourceAddress == Saddress || x.SourceAddress == Saddress1 || x.TargetAddress == Saddress || x.TargetAddress == Saddress1); if (task != null) { webResponseContent.Error("此缓存架已存在任务!"); return Task.FromResult(webResponseContent); } Dt_Stationinfo Stationinfo = _stationinfoRepository.QueryFirst(x => x.StationCode == Saddress && x.Enable); Dt_Stationinfo Stationinfo1 = _stationinfoRepository.QueryFirst(x => x.StationCode == Saddress1 && x.Enable); if (Stationinfo == null || Stationinfo1 == null) { webResponseContent.Error("未找到此起点缓存架,或此缓存架已被禁用!"); return Task.FromResult(webResponseContent); } Stationinfo.Location_state = LocationStatusEnum.Lock.ObjToInt(); _stationinfoRepository.UpdateData(Stationinfo); Stationinfo1.Location_state = LocationStatusEnum.Lock.ObjToInt(); _stationinfoRepository.UpdateData(Stationinfo1); Dt_Task dt_Task = new Dt_Task(); { dt_Task.TaskNum = _taskService.GetTaskNum(); dt_Task.CreateDate = DateTime.Now; dt_Task.Creater = "system"; dt_Task.CurrentAddress = Stationinfo.StationCode + "||" + Stationinfo1.StationCode; dt_Task.SourceAddress = Stationinfo.StationCode + "||" + Stationinfo1.StationCode; dt_Task.TaskState = (int)TaskInStatusEnum.InNew; //dt_Task.TaskType = (int)TaskOutboundTypeEnum.Outbound; dt_Task.Grade = 1; dt_Task.PalletCode = ""; if (Stationinfo.Area == "A区") { dt_Task.TargetAddress = "ZJXL-KPHLS001"; dt_Task.NextAddress = "ZJXL-KPHLX001"; dt_Task.TaskType = 64; } else { dt_Task.TargetAddress = "FJXL-KPHLS001"; dt_Task.NextAddress = "FJXL-KPHLX001"; dt_Task.TaskType = 256; } dt_Task.NextAddress = dt_Task.TargetAddress; dt_Task.Barcode = ""; dt_Task.Roadway = "AGV"; dt_Task.WMSId = 0; dt_Task.Remark = "空托回流"; dt_Task.Floor = 3; } var isTrue = _taskRepository.AddData(dt_Task); Dt_Task dt_Tasks = new Dt_Task(); { dt_Tasks.TaskNum = _taskService.GetTaskNum(); dt_Tasks.CreateDate = DateTime.Now; dt_Tasks.Creater = "system"; if (Stationinfo.Area == "A区") { dt_Tasks.CurrentAddress = "ZJXL-KPHLX001"; } else { dt_Tasks.CurrentAddress = "FJXL-KPHLX001"; } dt_Tasks.SourceAddress = dt_Tasks.CurrentAddress; dt_Tasks.TaskState = (int)TaskInStatusEnum.InPending; dt_Tasks.TaskType = 16; dt_Tasks.Grade = 1; dt_Tasks.PalletCode = ""; dt_Tasks.TargetAddress = Taddress; dt_Tasks.NextAddress = Taddress; dt_Tasks.Barcode = ""; dt_Tasks.Roadway = "AGV"; dt_Tasks.WMSId = 0; dt_Tasks.Remark = "空托回流"; dt_Task.Floor = 3; } var isTrue1 = _taskRepository.AddData(dt_Tasks); webResponseContent.OK("任务下发成功!"); } catch (Exception ex) { webResponseContent.Error(ex.Message); } return Task.FromResult(webResponseContent); } /// /// 烘烤出料 AGV任务完成之后需更新缓存架状态 /// /// /// public Task OutBoundTask(SaveModel saveModel) { WebResponseContent webResponseContent = new WebResponseContent(); try { string Saddress = saveModel.MainData["sourceAddress"].ToString(); Dt_Task task = _taskRepository.QueryFirst(x => x.SourceAddress == Saddress); if (task != null) { webResponseContent.Error("起点已存在任务!"); return Task.FromResult(webResponseContent); } //var station = _stationinfoRepository.QueryFirst(x => x.StationCode == Saddress); //// 查找两个可用的空缓存架 //var freeStations = _stationinfoRepository // .QueryData(x => x.Location_state == LocationStatusEnum.Free.ObjToInt() && x.Enable && x.Remark == station.Remark && x.Area == station.Area)// && x.Stationtype == station.Stationtype // .Take(2) // 只取前两个 // .ToList(); //int floor = 0; //if (station.Area.Contains("A区")) //{ // floor = 32; //} //else //{ // floor = 128; //} //if (freeStations.Count < 2) //{ // webResponseContent.Error("未找到足够的空缓存架!"); // return Task.FromResult(webResponseContent); //} //// 检查这两个缓存架是否被任务占用 //var stationCodes = freeStations.Select(s => s.StationCode).ToList(); //freeStations[0].Location_state = LocationStatusEnum.Lock.ObjToInt(); //_stationinfoRepository.UpdateData(freeStations[0]); //freeStations[1].Location_state = LocationStatusEnum.Lock.ObjToInt(); //_stationinfoRepository.UpdateData(freeStations[1]); ////stationCodes. //var tasks = _taskRepository.QueryData(x => stationCodes.Contains(x.SourceAddress) || stationCodes.Contains(x.TargetAddress)).ToList(); //if (tasks.Any()) //{ // webResponseContent.Error("部分缓存架已被占用,无法使用!"); // return Task.FromResult(webResponseContent); //} Dt_Task dt_Task = new Dt_Task() { TaskNum = _taskService.GetTaskNum(), CreateDate = DateTime.Now, Creater = "system", CurrentAddress = Saddress, SourceAddress = Saddress, TaskState = (int)TaskInStatusEnum.AGV_Queue, TaskType = 0,//floor Grade = 1, PalletCode = "", Floor = 3, TargetAddress = "",//string.Join("||", freeStations.Select(s => s.StationCode)) NextAddress = "",//string.Join("||", freeStations.Select(s => s.StationCode)) Barcode = "", Roadway = "AGV", WMSId = 0, Remark = "空托回流" }; var isTrue = _taskRepository.AddData(dt_Task); webResponseContent.OK("任务下发成功!"); } catch (Exception ex) { webResponseContent.Error(ex.Message); } return Task.FromResult(webResponseContent); } /// /// 烘烤回炉 AGV任务完成之后需更新缓存架状态 /// /// /// public Task OutBoundTasks(SaveModel saveModel) { WebResponseContent webResponseContent = new WebResponseContent(); try { //通过站点表判断缓存架是那个区域去那条输送线回流口。。。。。。。。。。。 string Saddress = saveModel.MainData["sourceAddress"].ToString(); string Saddress1 = saveModel.MainData["sourceAddress1"].ToString(); string Taddress = saveModel.MainData["targetAddress"].ToString(); if (Saddress == Saddress1) { webResponseContent.Error("同一缓存架不能扫描两次!"); return Task.FromResult(webResponseContent); } Dt_Stationinfo Stationinfo = _stationinfoRepository.QueryFirst(x => x.StationCode == Saddress && x.Enable); Dt_Stationinfo Stationinfo1 = _stationinfoRepository.QueryFirst(x => x.StationCode == Saddress1 && x.Enable); if (Stationinfo == null || Stationinfo1 == null) { webResponseContent.Error("未找到此起点缓存架,或此缓存架已被禁用!"); return Task.FromResult(webResponseContent); } Stationinfo.Location_state = LocationStatusEnum.Lock.ObjToInt(); _stationinfoRepository.UpdateData(Stationinfo); Stationinfo1.Location_state = LocationStatusEnum.Lock.ObjToInt(); _stationinfoRepository.UpdateData(Stationinfo1); Dt_Task dt_Task = new Dt_Task(); { dt_Task.TaskNum = _taskService.GetTaskNum(); dt_Task.CreateDate = DateTime.Now; dt_Task.Creater = "system"; dt_Task.CurrentAddress = Stationinfo.StationCode + "||" + Stationinfo1.StationCode; dt_Task.SourceAddress = Stationinfo.StationCode + "||" + Stationinfo1.StationCode; dt_Task.TaskState = (int)TaskInStatusEnum.InNew; //dt_Task.TaskType = (int)TaskOutboundTypeEnum.Outbound; dt_Task.Grade = 1; dt_Task.PalletCode = ""; if (Stationinfo.Area == "A区") { dt_Task.TargetAddress = "ZJXL-KPHLS001"; dt_Task.NextAddress = "ZJXL-KPHLX001"; dt_Task.TaskType = 64; } else { dt_Task.TargetAddress = "FJXL-KPHLS001"; dt_Task.NextAddress = "FJXL-KPHLX001"; dt_Task.TaskType = 256; } dt_Task.Barcode = ""; dt_Task.Roadway = "AGV"; dt_Task.WMSId = 0; dt_Task.Remark = "烘烤回炉"; dt_Task.Floor = 3; } var isTrue = _taskRepository.AddData(dt_Task); Dt_Task dt_Tasks = new Dt_Task(); { dt_Tasks.TaskNum = _taskService.GetTaskNum(); dt_Tasks.CreateDate = DateTime.Now; dt_Tasks.Creater = "system"; if (Stationinfo.Area == "A区") { dt_Tasks.CurrentAddress = "ZJXL-KPHLX001"; } else { dt_Tasks.CurrentAddress = "FJXL-KPHLX001"; } dt_Tasks.SourceAddress = dt_Tasks.CurrentAddress; dt_Tasks.TaskState = (int)TaskInStatusEnum.InPending; dt_Tasks.TaskType = 8; dt_Tasks.Grade = 1; dt_Tasks.PalletCode = ""; dt_Tasks.TargetAddress = Taddress; dt_Tasks.NextAddress = Taddress; dt_Tasks.Barcode = ""; dt_Tasks.Roadway = "AGV"; dt_Tasks.WMSId = 0; dt_Tasks.Remark = "烘烤回炉"; dt_Task.Floor = 3; } var isTrue1 = _taskRepository.AddData(dt_Tasks); webResponseContent.OK("任务下发成功!"); } catch (Exception ex) { webResponseContent.Error(ex.Message); } return Task.FromResult(webResponseContent); } } }