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
|
{
|
/// <summary>
|
/// 立库出库AGV搬运
|
/// </summary>
|
/// <param name="outTask"></param>
|
/// <returns></returns>
|
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();
|
}
|
|
/// <summary>
|
/// 货位绑定
|
/// </summary>
|
/// <param name="qty"></param>
|
/// <param name="Point"></param>
|
/// <returns></returns>
|
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);
|
}
|
}
|
/// <summary>
|
/// 释放缓存点
|
/// </summary>
|
/// <param name="point"></param>
|
/// <returns></returns>
|
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);
|
}
|
}
|
|
/// <summary>
|
/// 叫料
|
/// </summary>
|
/// <param name="endPoint"></param>
|
/// <returns></returns>
|
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);
|
}
|
|
}
|
|
/// <summary>
|
/// 物料搬运
|
/// </summary>
|
/// <param name="startPoint"></param>
|
/// <returns></returns>
|
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);
|
}
|
}
|
/// <summary>
|
/// 搬运
|
/// </summary>
|
/// <param name="startPoint"></param>
|
/// <returns></returns>
|
/// <exception cref="Exception"></exception>
|
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;
|
}
|
/// <summary>
|
/// 叫料
|
/// </summary>
|
/// <param name="endPoint"></param>
|
/// <returns></returns>
|
/// <exception cref="Exception"></exception>
|
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;
|
}
|
|
/// <summary>
|
/// 下发AGV任务
|
/// </summary>
|
/// <param name="task"></param>
|
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<WebResponseContent>(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);
|
}
|
}
|
|
/// <summary>
|
/// 任务状态上报
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
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 = "成功" };
|
}
|
}
|
}
|