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 CallMateriel(string endPoint)
{
try
{
Dt_CachePoint cachePoint = GetCachePointByEndPoint(endPoint);
Dt_Task task = new Dt_Task()
{
CurrentAddress = "D02",// cachePoint.PointCode,
Grade = 0,
NextAddress = "C01",//endPoint,
OrderNo = "",
PalletCode = "",//cachePoint.Remark,
Roadway = "",
SourceAddress = "D02",//cachePoint.PointCode,
TargetAddress = "C01",//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();
#region MyRegion
AGVSendTaskModel aGVSendTask = new AGVSendTaskModel
{
task_id = task.TaskNum.ToString(),// BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)).ToString(),
src_pos = task.CurrentAddress,// "C01",
site_value_type = 1,
dst_pos = task.NextAddress,// "E14"
src_level=3,
};
#endregion
var response = HttpHelper.Post(AGVurl + "sendTask/", aGVSendTask, "叫料任务下发");
if (response.Code != 200)
{
_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
{
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();
_basicService.CachePointService.Repository.UpdateData(cachePoint);
Repository.AddData(task);
return WebResponseContent.Instance.OK();
}
catch (Exception ex)
{
return WebResponseContent.Instance.Error(ex.Message);
}
}
///
/// 搬运
///
///
///
///
private Dt_CachePoint GetCachePointByStartPoint(string startPoint)
{
Dt_AreaRouter areaRouter = _basicService.AreaRouterService.Repository.QueryFirst(x => x.StartArea == startPoint);
if (areaRouter == null)
{
throw new Exception("未找到路由信息!");
}
Dt_AreaInfo areaInfo = _basicService.AreaInfoService.Repository.QueryFirst(x => x.AreaCode == areaRouter.NextArea);
if (areaInfo == null)
{
throw new Exception("未找到下一区域信息!");
}
Dt_CachePoint? cachePoint = _basicService.CachePointService.AssignCachePoint(areaInfo.Id);
if (cachePoint == null)
{
throw new Exception("未找到空闲缓存点!");
}
return cachePoint;
}
///
/// 叫料
///
///
///
///
private Dt_CachePoint GetCachePointByEndPoint(string endPoint)
{
Dt_AreaRouter areaRouter = _basicService.AreaRouterService.Repository.QueryFirst(x => x.NextArea == endPoint);
if (areaRouter == null)
{
throw new Exception("未找到路由信息!");
}
Dt_AreaInfo areaInfo = _basicService.AreaInfoService.Repository.QueryFirst(x => x.AreaCode == areaRouter.StartArea);
if (areaInfo == null)
{
throw new Exception("未找到起点缓存区域信息!");
}
Dt_CachePoint? cachePoint = _basicService.CachePointService.GetIbStockCachePoint(areaInfo.Id);
if (cachePoint == null)
{
throw new Exception("未找到有货缓存点!");
}
return cachePoint;
}
///
/// 任务状态上报
///
///
///
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 = "未找到该任务!" };
}
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 == 3)//判断是否为模组空栈板区域
{
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:
{
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 = "成功" };
}
}
}