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_RoadwayInfo dt_RoadwayInfo = _basicService.RoadwayInfoService.Repository.QueryFirst(x => x.OutSCStationCode == outTask.TargetAddress);
if (dt_RoadwayInfo == null || dt_RoadwayInfo.AreaId == 11) return WebResponseContent.Instance.OK();
Dt_CachePoint startcachePoint = new Dt_CachePoint();
Dt_CachePoint cachePoint = GetCachePointByStartPoint(dt_RoadwayInfo.OutStationCode, "", ref startcachePoint);
if (startcachePoint.EnableStatus == EnableStatusEnum.Disable.ObjToInt()) return WebResponseContent.Instance.OK();
//if (dt_RoadwayInfo.AreaId == 11)//辅料不用AGV搬运
//{
// startcachePoint.PointStatus = LocationStatusEnum.Lock.ObjToInt();
// _basicService.CachePointService.Repository.UpdateData(startcachePoint);
// return WebResponseContent.Instance.OK();
//}
Dt_Task task = new()
{
CurrentAddress = startcachePoint.PointCode,
Grade = 0,
NextAddress = cachePoint.PointCode,
OrderNo = outTask.OrderNo,
PalletCode = outTask.PalletCode + "-AGV",
Roadway = "",
SourceAddress = startcachePoint.PointCode,
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();
//startcachePoint.PointStatus = LocationStatusEnum.Lock.ObjToInt();
_basicService.CachePointService.Repository.UpdateData(cachePoint);
//_basicService.CachePointService.Repository.UpdateData(startcachePoint);
Repository.AddData(task);
SendAGVTask(task, cachePoint);
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}】存在AGV任务!");
Dt_CachePoint? cachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == point);
if (cachePoint == null) throw new Exception("未找到缓存点!");
if (cachePoint.Depth == 1)
{
Dt_CachePoint? cachePoint1 = _basicService.CachePointService.Repository.QueryFirst(x => x.AreaId == cachePoint.AreaId && x.Column == cachePoint.Column && cachePoint.Row - x.Row == 1);
if (cachePoint1 != null)
{
if (Repository.QueryFirst(x => x.SourceAddress == cachePoint1.PointCode &&
x.TaskStatus < AGVTaskStatusEnum.DoneFetch.ObjToInt() ||
x.TargetAddress == cachePoint1.PointCode) != null)
throw new Exception($"内置缓存点【{cachePoint1.PointCode}】存在AGV任务!");
}
}
//if (cachePoint.AreaId != 4) throw new Exception("当前缓存点区域无绑定权限!");
cachePoint.PointStatus = LocationStatusEnum.InStock.ObjToInt();
if (cachePoint.AreaId == 4) 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}】存在AGV任务!");
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();
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 CallMateriel(string endPoint, string startPoint)
{
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, startPoint);
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, string endPoint)
{
try
{
if (Repository.QueryFirst(x => x.SourceAddress == startPoint &&
x.TaskStatus < AGVTaskStatusEnum.DoneFetch.ObjToInt() ||
x.TargetAddress == startPoint) != null)
throw new Exception($"站点【{startPoint}】存在任务!");
Dt_CachePoint startcachePoint = new Dt_CachePoint();
Dt_CachePoint cachePoint = GetCachePointByStartPoint(startPoint, endPoint, ref startcachePoint);
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, string endPoint, ref Dt_CachePoint startcachePoint)
{
#region MyRegion
Dt_CachePoint? StartcachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == startPoint);
if (StartcachePoint == null) throw new Exception($"未找到缓存点{startPoint}!");
startcachePoint = StartcachePoint;
endPoint = "";
if (!string.IsNullOrEmpty(endPoint))
{
Dt_CachePoint? cachePoint1 = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == endPoint);
if (cachePoint1 == null) throw new Exception($"未找到缓存点{endPoint}!");
if (Repository.QueryFirst(x => x.SourceAddress == endPoint &&
x.TaskStatus < AGVTaskStatusEnum.DoneFetch.ObjToInt() ||
x.TargetAddress == endPoint) != null)
throw new Exception($"缓存点【{endPoint}】存在任务!");
return cachePoint1;
}
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, string startPoint)
{
#region MyRegion
Dt_CachePoint? StartcachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == endPoint);
if (StartcachePoint == null) throw new Exception($"未找到缓存点{endPoint}!");
if (!string.IsNullOrEmpty(endPoint))
{
Dt_CachePoint? cachePoint1 = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == startPoint);
if (cachePoint1 == null) throw new Exception($"未找到缓存点{startPoint}!");
if (Repository.QueryFirst(x => x.SourceAddress == startPoint &&
x.TaskStatus < AGVTaskStatusEnum.DoneFetch.ObjToInt() ||
x.TargetAddress == startPoint) != null)
throw new Exception($"缓存点【{startPoint}】存在任务!");
return cachePoint1;
}
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("AGV任务下发失败:" + 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();
}
//else if (startCachePoint.AreaId == 1)
//{
// startCachePoint.PointStatus = LocationStatusEnum.PalletLock.ObjToInt();
//}
_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 = "成功" };
}
}
}