using System; using System.Collections.Generic; using System.Linq; using System.Reflection.Metadata; using System.Text; using System.Threading.Tasks; using WIDESEA_Common; using WIDESEA_Core; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_Model.Models; namespace WIDESEA_TaskInfoService { public partial class TaskService { /// /// 立库出库AGV搬运 /// /// /// public WebResponseContent ShelfOutboundCarry(Dt_Task outTask) { //判断是否为电芯库,辅料库人工处理(立库目标地址转换成AGV站点地址) Dt_CachePoint cachePoint = GetCachePointByStartPoint(outTask.TargetAddress); Dt_Task task = new() { CurrentAddress = outTask.TargetAddress, Grade = 0, NextAddress = cachePoint.PointCode, OrderNo = outTask.OrderNo, PalletCode = outTask.PalletCode + "-AGV", Roadway = "", SourceAddress = outTask.TargetAddress, TargetAddress = cachePoint.PointCode, SourceKey = outTask.TaskId, TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), TaskStatus = AGVTaskStatusEnum.Create.ObjToInt(), TaskType = TaskTypeEnum.AGVCarry.ObjToInt(), CreateDate = DateTime.Now, Creater = App.User.UserId > 0 ? App.User.UserName : "System", }; cachePoint.PointStatus = LocationStatusEnum.Lock.ObjToInt(); _basicService.CachePointService.Repository.UpdateData(cachePoint); Repository.AddData(task); return WebResponseContent.Instance.OK(); } /// /// 货位绑定 /// /// /// /// public WebResponseContent Bind(string qty, string point) { try { if (Repository.QueryFirst(x => x.SourceAddress == point && x.TaskStatus < AGVTaskStatusEnum.DoneFetch.ObjToInt() || x.TargetAddress == point) != null) throw new Exception($"站点【{point}】存在任务!"); Dt_CachePoint? cachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == point); if (cachePoint == null) throw new Exception("未找到缓存点!"); if (cachePoint.AreaId != 4) throw new Exception("当前缓存点区域无绑定权限!"); cachePoint.PointStatus = LocationStatusEnum.InStock.ObjToInt(); cachePoint.Remark = qty; cachePoint.Modifier = App.User.UserName; _basicService.CachePointService.Repository.UpdateData(cachePoint); return WebResponseContent.Instance.OK(); } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } /// /// 释放缓存点 /// /// /// public WebResponseContent AcrossFloorCallMat(string point) { try { if (Repository.QueryFirst(x => x.SourceAddress == point && x.TaskStatus < AGVTaskStatusEnum.DoneFetch.ObjToInt() || x.TargetAddress == point) != null) throw new Exception($"站点【{point}】存在任务!"); Dt_CachePoint? cachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == point); if (cachePoint == null) throw new Exception("未找到缓存点!"); if (cachePoint.AreaId != 2 && cachePoint.AreaId != 5 && cachePoint.AreaId != 8) throw new Exception("当前缓存点区域无释放权限!"); cachePoint.PointStatus = LocationStatusEnum.Free.ObjToInt(); _basicService.CachePointService.Repository.UpdateData(cachePoint); return WebResponseContent.Instance.OK(); } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } /// /// 叫料 /// /// /// public WebResponseContent CallMateriel(string endPoint) { try { if (Repository.QueryFirst(x => x.SourceAddress == endPoint && x.TaskStatus < AGVTaskStatusEnum.DoneFetch.ObjToInt() || x.TargetAddress == endPoint) != null) throw new Exception($"站点【{endPoint}】存在任务!"); Dt_CachePoint cachePoint = GetCachePointByEndPoint(endPoint); Dt_Task task = new Dt_Task() { CurrentAddress = cachePoint.PointCode, Grade = 0, NextAddress = endPoint, OrderNo = "", PalletCode = cachePoint.Remark, Roadway = "", SourceAddress = cachePoint.PointCode, TargetAddress = endPoint, SourceKey = 0, TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), TaskStatus = AGVTaskStatusEnum.Create.ObjToInt(), TaskType = TaskTypeEnum.AGVCarry.ObjToInt(), }; cachePoint.PointStatus = LocationStatusEnum.Lock.ObjToInt(); Db.Ado.BeginTran(); var response = SendAGVTask(task, cachePoint); if (!response.Status) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error($"{response.Message}"); } _basicService.CachePointService.Repository.UpdateData(cachePoint); Repository.AddData(task); Db.Ado.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { Db.Ado.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } /// /// 物料搬运 /// /// /// public WebResponseContent MaterielCarry(string startPoint) { try { if (Repository.QueryFirst(x => x.SourceAddress == startPoint && x.TaskStatus < AGVTaskStatusEnum.DoneFetch.ObjToInt() || x.TargetAddress == startPoint) != null) throw new Exception($"站点【{startPoint}】存在任务!"); Dt_CachePoint cachePoint = GetCachePointByStartPoint(startPoint); Dt_Task task = new() { CurrentAddress = startPoint, Grade = 0, NextAddress = cachePoint.PointCode, OrderNo = "", PalletCode = startPoint + "-AGV", Roadway = "", SourceAddress = startPoint, TargetAddress = cachePoint.PointCode, SourceKey = 0, TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), TaskStatus = AGVTaskStatusEnum.Create.ObjToInt(), TaskType = TaskTypeEnum.AGVCarry.ObjToInt(), }; cachePoint.PointStatus = LocationStatusEnum.Lock.ObjToInt(); Db.Ado.BeginTran(); var response = SendAGVTask(task, cachePoint); if (!response.Status) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error($"{response.Message}"); } _basicService.CachePointService.Repository.UpdateData(cachePoint); Repository.AddData(task); Db.Ado.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { Db.Ado.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } /// /// 搬运 /// /// /// /// private Dt_CachePoint GetCachePointByStartPoint(string startPoint) { #region MyRegion Dt_CachePoint? StartcachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == startPoint); if (StartcachePoint == null) throw new Exception("未找到缓存点!"); Dt_AreaRouter areaRouter = _basicService.AreaRouterService.Repository.QueryFirst(x => x.StartArea == StartcachePoint.AreaId.ToString()); if (areaRouter == null) throw new Exception("未找到路由信息!"); Dt_CachePoint? cachePoint = _basicService.CachePointService.AssignCachePoint(areaRouter.NextArea.ObjToInt()); if (cachePoint == null) { throw new Exception("未找到空闲缓存点!"); } #endregion return cachePoint; } /// /// 叫料 /// /// /// /// private Dt_CachePoint GetCachePointByEndPoint(string endPoint) { #region MyRegion Dt_CachePoint? StartcachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == endPoint); if (StartcachePoint == null) throw new Exception("未找到缓存点!"); Dt_AreaRouter areaRouter = _basicService.AreaRouterService.Repository.QueryFirst(x => x.NextArea == StartcachePoint.AreaId.ToString()); if (areaRouter == null) throw new Exception("未找到路由信息!"); Dt_CachePoint? cachePoint = _basicService.CachePointService.GetIbStockCachePoint(areaRouter.StartArea.ObjToInt()); if (cachePoint == null) { throw new Exception("未找到有货缓存点!"); } #endregion return cachePoint; } /// /// 下发AGV任务 /// /// public WebResponseContent SendAGVTask(Dt_Task task, Dt_CachePoint? cachePoint = null) { try { AGVSendTaskModel aGVSendTask = new AGVSendTaskModel { task_id = task.TaskNum.ToString(), src_pos = task.CurrentAddress, site_value_type = 1, dst_pos = task.NextAddress }; if (cachePoint != null && cachePoint.AreaId == 4) aGVSendTask.src_level = cachePoint.Remark.ObjToInt() - 1; var response = HttpHelper.Post(AGVurl + "sendTask/", aGVSendTask, "叫料任务下发"); if (response.Code != 200) throw new Exception(response.Message); return WebResponseContent.Instance.OK(); } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } /// /// 任务状态上报 /// /// /// public object AGVTaskFeedBack(AGVTaskFeedBackModel model) { Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == Convert.ToInt32(model.Task_id)); if (task == null) { return new { code = 404, message = "未找到该任务!" }; } if (task.TaskStatus == ((AGVTaskStatusEnum)Enum.Parse(typeof(AGVTaskStatusEnum), model.Task_status)).ObjToInt()) return new { code = 200, message = "成功" }; switch ((AGVTaskStatusEnum)Enum.Parse(typeof(AGVTaskStatusEnum), model.Task_status)) { case AGVTaskStatusEnum.Create: break; case AGVTaskStatusEnum.Queuing: task.TaskStatus = AGVTaskStatusEnum.Queuing.ObjToInt(); break; case AGVTaskStatusEnum.Running: task.TaskStatus = AGVTaskStatusEnum.Running.ObjToInt(); break; case AGVTaskStatusEnum.DoneFetch: { task.TaskStatus = AGVTaskStatusEnum.DoneFetch.ObjToInt(); Dt_CachePoint startCachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == task.SourceAddress); if (startCachePoint != null) { startCachePoint.PointStatus = LocationStatusEnum.Free.ObjToInt(); if (startCachePoint.AreaId == 4)//判断是否为模组空栈板区域 { var qty = (startCachePoint.Remark.ObjToInt() - 1); if (qty > 0) startCachePoint.PointStatus = LocationStatusEnum.InStock.ObjToInt(); startCachePoint.Remark = qty.ToString(); } _basicService.CachePointService.Repository.UpdateData(startCachePoint); } } break; case AGVTaskStatusEnum.DonePut: { task.TaskStatus = AGVTaskStatusEnum.DonePut.ObjToInt(); Dt_CachePoint endCachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == task.TargetAddress); if (endCachePoint != null) { endCachePoint.PointStatus = LocationStatusEnum.InStock.ObjToInt(); _basicService.CachePointService.Repository.UpdateData(endCachePoint); } } break; case AGVTaskStatusEnum.Finish: { task.TaskStatus = AGVTaskStatusEnum.Finish.ObjToInt(); BaseDal.DeleteAndMoveIntoHty(task, /*App.User.UserId == 0 ?*/ OperateType.自动完成 /*: OperateType.人工完成*/); return new { code = 200, message = "成功" }; } case AGVTaskStatusEnum.Cancel: case AGVTaskStatusEnum.Terminate: case AGVTaskStatusEnum.Error: { if (task.TaskStatus < AGVTaskStatusEnum.DoneFetch.ObjToInt()) { Dt_CachePoint startCachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == task.SourceAddress); startCachePoint.PointStatus = LocationStatusEnum.InStock.ObjToInt(); _basicService.CachePointService.Repository.UpdateData(startCachePoint); } task.TaskStatus = AGVTaskStatusEnum.Cancel.ObjToInt(); BaseDal.DeleteAndMoveIntoHty(task, OperateType.自动删除); return new { code = 200, message = "成功" }; } //case AGVTaskStatusEnum.Terminate: // task.TaskStatus = AGVTaskStatusEnum.Terminate.ObjToInt(); // break; //case AGVTaskStatusEnum.Error: // task.TaskStatus = AGVTaskStatusEnum.Error.ObjToInt(); // break; default: return new { code = 404, message = "未定义任务类型!" }; } BaseDal.UpdateData(task); return new { code = 200, message = "成功" }; } } }