first commit

This commit is contained in:
2026-09-02 16:31:50 +08:00
commit a461727193
911 changed files with 692450 additions and 0 deletions
@@ -0,0 +1,114 @@
using JSMachine.WMS.RPC.ErpRPC.Dto.In.BusinessDto;
namespace JSMachine.WMS.RPC.RcsRPC.Dto.In
{
/// <summary>
/// Agv作业执行信息
/// </summary>
public class AgvExcutionInfo
{
/// <summary>
/// 立体库编号,对应立体库位置
/// </summary>
public string StorageNum { get; set; }
/// <summary>
/// RCS任务模版中的AGV执行到的动作状态,扩展字段:
///1:未开始
///2:运行中*
///3:完成中*
///4:失败
///5:取消
/// </summary>
public string SubTaskStatus { get; set; }
/// <summary>
/// 第三方系统任务id
/// 必须
/// </summary>
public string OrderId { get; set; }
/// <summary>
/// AGV序列号
/// 否
/// </summary>
public string DeviceCode { get; set; }
/// <summary>
/// 任务流程模版编号
/// 必须
/// </summary>
public string ModelProcessCode { get; set; }
/// <summary>
/// AGV动作类型,扩展字段
/// 必须
/// </summary>
public string SubTaskTypeId { get; set; }
/// <summary>
/// RCS子任务编号,备用字段
/// 必须
/// </summary>
public string SubTaskId { get; set; }
/// <summary>
/// AGV编号
/// 否
/// </summary>
public string DeviceNum { get; set; }
/// <summary>
/// 当前子任务预到达目标点,对应任务下发时下发的点位
/// 否
/// </summary>
public string QrContent { get; set; }
/// <summary>
/// 第几个动作,从0开始,扩展字段
/// 必须
/// </summary>
public string SubTaskSeq { get; set; }
/// <summary>
/// ICS记录的此任务的id值,扩展字段
/// 必须
/// </summary>
public string IcsTaskOrderDetailId { get; set; }
/// <summary>
/// 任务状态
/// 3:已取消
/// 5:发送失败
/// 6:运行中
///7:执行失败
///8:已完成
///9:已下发
///10:等待确认
///20:取货中
///21:取货完成
///22:放货中
///23:放货完成
/// 必须
/// </summary>
public int Status { get; set; }
/// <summary>
/// 任务执行失败,或者发送给AGV时失败的失败原因
/// 否
/// </summary>
public string ErrorDesc { get; set; }
/// <summary>
/// 货架当前位置
/// 否
/// </summary>
public string ShelfCurrPosition { get; set; }
/// <summary>
/// 货架编号
/// 否
/// </summary>
public string ShelfNumber { get; set; }
}
}
@@ -0,0 +1,23 @@
using JSMachine.WMS.RPC.ErpRPC.Dto.In.BusinessDto;
namespace JSMachine.WMS.RPC.RcsRPC.Dto.In
{
public class CancelTaskParam : BusinessParamBase
{
/// <summary>
/// 第三方系统任务单号,支持批量取消任务,传入数据格式为数组
/// </summary>
public string orderId { get; set; }
/// <summary>
/// 设备编号,同第三方系统任务单号选填其一,仅支持对第三方系统任务订单进行取消操作
/// </summary>
public string deviceNumber { get; set; }
/// <summary>
/// 取消任务后,货架放置的目标位置,只有在货架举升起来之后才会放置到指定位置,否则会直接取消。不传该值,任务会在取消后将货架放到原地,或者搬回到起始位置
/// </summary>
public string destPosition { get; set; }
}
}
@@ -0,0 +1,61 @@
using JSMachine.WMS.RPC.ErpRPC.Dto.In.BusinessDto;
namespace JSMachine.WMS.RPC.RcsRPC.Dto.In
{
/// <summary>
/// 创建Rcs任务,请求参数
/// </summary>
public class CreateTaskParam: BusinessParamBase
{
public CreateTaskParam()
{
modelProcessCode = "cattleCarry4";
fromSystem = "WMS";
priority = 6;
}
/// <summary>
/// 业务流程名称编号
/// </summary>
public string modelProcessCode { get; set; }
/// <summary>
/// 优先级:
///4:高
///6:中
///8:低
///高优先级的任务将会被优先调度,默认为6
/// </summary>
public int priority { get; set; }
/// <summary>
/// 来源系统:下发任务的第三方系统,由第三方系统自定义。如:MES、WMS等
/// </summary>
public string fromSystem { get; set; }
/// <summary>
/// 任务单号:需要第三方系统下发任务时指定且保证每次的任务单号唯一且和之前不重复
/// </summary>
public string orderId { get; set; }
/// <summary>
///
/// </summary>
public TaskOrderDetailDto taskOrderDetail;
}
public partial class TaskOrderDetailDto
{
/// <summary>
/// 任务路径点集
/// </summary>
public string taskPath { get; set; }
/// <summary>
/// 货架编号
/// </summary>
public string shelfNumber { get; set; }
}
}
@@ -0,0 +1,28 @@
namespace JSMachine.WMS.RPC.RcsRPC.Dto
{
public class RcsApiResult
{
/// <summary>
/// 状态码
/// 1000:请求成功
/// 1001:请求失败
/// 7201:请求参数错误
/// 2103:任务流程模板编号不存在
/// 2107:需要传路径点时,路径集合为空
/// 2108:路径集合有误
/// 2111:请勿重复下发任务
/// 2115:任务已完成
/// 其他:其他错误
/// </summary>
public int code { get; set; }
/// <summary>
/// 状态码描述
/// </summary>
public string desc { get; set; }
/// <summary>
/// 内容
/// </summary>
public string data { get; set; }
}
}
@@ -0,0 +1,25 @@
using JSMachine.WMS.RPC.RcsRPC.Dto.In;
using JSMachine.WMS.RPC.RcsRPC.Dto;
using JSMachine.WMS.RPC.ErpRPC.Dto.Out;
namespace JSMachine.WMS.RPC.RcsRPC.IService
{
/// <summary>
/// RCS 任务接口,封装任务创建和批量取消操作。
/// </summary>
public interface IRcsService
{
/// <summary>
/// 创建任务
/// </summary>
/// <param name="createTaskParam"></param>
/// <returns></returns>
Task<ApiReturnResult<bool>> CreateTask(CreateTaskParam createTaskParam);
/// <summary>
/// 取消任务
/// </summary>
/// <returns></returns>
Task<ApiReturnResult<bool>> CancelTask(List<CancelTaskParam> cancelTaskParams);
}
}
@@ -0,0 +1,120 @@
using JSMachine.WMS.Common;
using JSMachine.WMS.Infrastructure.Helper;
using JSMachine.WMS.RPC.ErpRPC.Dto.Out;
using JSMachine.WMS.RPC.RcsRPC.Dto;
using JSMachine.WMS.RPC.RcsRPC.Dto.In;
using JSMachine.WMS.RPC.RcsRPC.IService;
using Newtonsoft.Json;
using RestSharp;
namespace JSMachine.WMS.RPC.RcsRPC.Service
{
/// <summary>
/// RCS HTTP RPC 客户端,封装任务创建和取消接口调用及统一错误转换。
/// </summary>
public class RcsService: IRcsService
{
private static readonly string rcsUrl = Global.AppSettings.RcsConfig.RcsUrl;
private static readonly string createTaskUrl = Global.AppSettings.RcsConfig.CreateTaskUrl;
private static readonly string cancelTaskUrl = Global.AppSettings.RcsConfig.CancelTaskUrl;
/// <summary>
/// 创建任务
/// </summary>
/// <param name="createTaskParam"></param>
/// <returns></returns>
/// <remarks>外部接口返回码为 1000 时转换为本地成功码 200。</remarks>
public async Task<ApiReturnResult<bool>> CreateTask(CreateTaskParam createTaskParam)
{
var result = new ApiReturnResult<bool>();
try
{
var url = rcsUrl + createTaskUrl;
var jsonParam = new CreateTaskParam
{
modelProcessCode = createTaskParam.modelProcessCode,
priority = createTaskParam.priority,
fromSystem = createTaskParam.fromSystem,
orderId = createTaskParam.orderId,
};
jsonParam.taskOrderDetail = new TaskOrderDetailDto
{
taskPath = createTaskParam.taskOrderDetail.taskPath,
shelfNumber = createTaskParam.taskOrderDetail.shelfNumber,
};
string resStr = await HttpRequestHelper.RequestByJson(url, Method.POST, JsonConvert.SerializeObject(jsonParam));
if (string.IsNullOrEmpty(resStr))
{
var msg = $"调用Rcs创建任务接口失败(CreateTask)";
LogHelper.Error(msg);
result.ErrorMsg = msg;
return result;
}
var apiResult = JsonConvert.DeserializeObject<RcsApiResult>(resStr);
if (apiResult.code != 1000)
{
var msg = $"创建任务失败(CreateTask): {apiResult.desc}";
LogHelper.Error(msg);
result.ErrorMsg = msg;
return result;
}
result.ResultCode = "200";
}
catch (Exception ex)
{
var msg = $"创建任务异常(CreateTask):: {ex.Message} \n {ex.StackTrace}";
LogHelper.Error(msg);
result.ErrorMsg = msg;
}
return result;
}
/// <summary>
/// 向 RCS 批量提交任务取消请求。
/// </summary>
/// <param name="cancelTaskParams">待取消的 RCS 任务参数。</param>
/// <returns>外部接口成功时返回本地成功码,否则携带错误信息。</returns>
public async Task<ApiReturnResult<bool>> CancelTask(List<CancelTaskParam> cancelTaskParams)
{
var result = new ApiReturnResult<bool>();
try
{
var url = rcsUrl + cancelTaskUrl;
var jsonParam = new List<CancelTaskParam>();
foreach (var item in cancelTaskParams)
{
jsonParam.Add(item);
}
string resStr = await HttpRequestHelper.RequestByJson(url, Method.POST, JsonConvert.SerializeObject(jsonParam));
if (string.IsNullOrEmpty(resStr))
{
var msg = $"调用Rcs取消任务接口失败(CancelTask)";
LogHelper.Error(msg);
result.ErrorMsg = msg;
return result;
}
var apiResult = JsonConvert.DeserializeObject<RcsApiResult>(resStr);
if (apiResult.code != 1000)
{
var msg = $"取消任务失败(CancelTask): {apiResult.desc}";
LogHelper.Error(msg);
result.ErrorMsg = msg;
return result;
}
result.ResultCode = "200";
}
catch (Exception ex)
{
var msg = $"取消任务异常(CancelTask):: {ex.Message} \n {ex.StackTrace}";
LogHelper.Error(msg);
result.ErrorMsg = msg;
}
return result;
}
}
}