You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

372 lines
14 KiB
C#

3 months ago
using Flurl.Http;
using Newtonsoft.Json;
using Sln.Wcs.HikRoBotSdk.Config;
using Sln.Wcs.HikRoBotSdk.Dto.CancelTask;
using Sln.Wcs.HikRoBotSdk.Dto.ContinueTask;
using Sln.Wcs.HikRoBotSdk.Dto.GbCancelTask;
using Sln.Wcs.HikRoBotSdk.Dto.GbContinueTask;
using Sln.Wcs.HikRoBotSdk.Dto.GbTaskSubmit;
using Sln.Wcs.HikRoBotSdk.Dto.GenAgvSchedulingTask;
using Sln.Wcs.HikRoBotSdk.Dto.TaskGroup;
using Sln.Wcs.HikRoBotSdk.Dto.TaskPriority;
using Sln.Wcs.HikRoBotSdk.Dto.ZonePause;
using Sln.Wcs.HikRoBotSdk.Dto.ZoneHoming;
using Sln.Wcs.HikRoBotSdk.Dto.ZoneBanish;
using Sln.Wcs.HikRoBotSdk.Dto.ZoneBlockade;
using Sln.Wcs.HikRoBotSdk.Dto.CarrierBind;
using Sln.Wcs.HikRoBotSdk.Dto.CarrierUnbind;
using Sln.Wcs.HikRoBotSdk.Dto.SiteBind;
using Sln.Wcs.HikRoBotSdk.Dto.CarrierLock;
using Sln.Wcs.HikRoBotSdk.Dto.SiteLock;
using Sln.Wcs.HikRoBotSdk.Dto.PreTask;
using Sln.Wcs.HikRoBotSdk.Dto.QueryTask;
using Sln.Wcs.HikRoBotSdk.Dto.QueryRobot;
using Sln.Wcs.HikRoBotSdk.Dto.QueryCarrier;
using Sln.Wcs.HikRoBotSdk.Dto.MatLabelBind;
using Sln.Wcs.HikRoBotSdk.Dto.MatLabelUnbind;
using Sln.Wcs.HikRoBotSdk.Dto.EquipmentNotify;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Authentication;
using System.Text;
using System.Threading.Tasks;
#region << 版 本 注 释 >>
/*--------------------------------------------------------------------
* (c) 2026 WenJY
* CLR4.0.30319.42000
* T14-GEN3-7895
* Sln.Wcs.HikRoBotSdk
* 17e983b2-0c7e-4b27-ae05-e333d623b85d
*
* WenJY
*
* 2026-02-25 14:40:23
* V1.0.0
*
*
*--------------------------------------------------------------------
*
*
*
*
* V1.0.0
*--------------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
namespace Sln.Wcs.HikRoBotSdk
{
3 months ago
public class HIKRoBotSdk : IHIKRoBotSdk
{
private readonly HikRoBotConfig hikRoBotConfig;
public HIKRoBotSdk(HikRoBotConfig hikRoBotConfig)
{
this.hikRoBotConfig = hikRoBotConfig;
}
/// <summary>
/// GB标准-任务下发接口
///
/// 业务系统发送任务请求,物流机器人调度系统生成任务执行单并下发执行。
/// </summary>
/// <param name="gbTaskSubmit"></param>
/// <returns></returns>
public GbTaskSubmitResultDto GbTaskSubmit(GbTaskSubmitDto gbTaskSubmit)
{
string url = $"{hikRoBotConfig.api}/task/submit";
return GenRequestHeader(url).PostJsonAsync(gbTaskSubmit).Result.GetJsonAsync<GbTaskSubmitResultDto>().Result;
}
/// <summary>
/// GB标准-任务继续执行接口
///
/// 一个任务包含多个步骤,每个步骤完成后,通过此接口驱动下一个步骤执行。
/// </summary>
/// <param name="gbContinueTask"></param>
/// <returns></returns>
public GbContinueTaskResultDto GbContinueTask(GbContinueTaskDto gbContinueTask)
{
string url = $"{hikRoBotConfig.api}/task/extend/continue";
return GenRequestHeader(url).PostJsonAsync(gbContinueTask).Result.GetJsonAsync<GbContinueTaskResultDto>().Result;
}
/// <summary>
/// GB标准-任务取消接口
///
/// 取消指定任务,支持软取消(回库)和硬取消(直接丢弃)。
/// </summary>
/// <param name="gbCancelTask"></param>
/// <returns></returns>
public GbCancelTaskResultDto GbCancelTask(GbCancelTaskDto gbCancelTask)
{
string url = $"{hikRoBotConfig.api}/task/cancel";
return GenRequestHeader(url).PostJsonAsync(gbCancelTask).Result.GetJsonAsync<GbCancelTaskResultDto>().Result;
}
/// <summary>
/// 任务分组
///
/// 对多个任务进行分组,组内任务按优先级顺序执行。
/// </summary>
/// <param name="taskGroup"></param>
/// <returns></returns>
public TaskGroupResultDto TaskGroup(TaskGroupDto taskGroup)
{
string url = $"{hikRoBotConfig.api}/task/group";
return GenRequestHeader(url).PostJsonAsync(taskGroup).Result.GetJsonAsync<TaskGroupResultDto>().Result;
}
/// <summary>
/// 设置任务优先级
///
/// 修改指定任务的优先级。
/// </summary>
/// <param name="taskPriority"></param>
/// <returns></returns>
public TaskPriorityResultDto SetTaskPriority(TaskPriorityDto taskPriority)
{
string url = $"{hikRoBotConfig.api}/task/priority";
return GenRequestHeader(url).PostJsonAsync(taskPriority).Result.GetJsonAsync<TaskPriorityResultDto>().Result;
}
/// <summary>
/// 区域暂停
///
/// 暂停指定区域内的所有AGV任务。
/// </summary>
/// <param name="zonePause"></param>
/// <returns></returns>
public ZonePauseResultDto ZonePause(ZonePauseDto zonePause)
{
string url = $"{hikRoBotConfig.api}/zone/pause";
return GenRequestHeader(url).PostJsonAsync(zonePause).Result.GetJsonAsync<ZonePauseResultDto>().Result;
}
/// <summary>
/// 区域回库
///
/// 将指定区域内的AGV召回至充电桩/待命点。
/// </summary>
/// <param name="zoneHoming"></param>
/// <returns></returns>
public ZoneHomingResultDto ZoneHoming(ZoneHomingDto zoneHoming)
{
string url = $"{hikRoBotConfig.api}/zone/homing";
return GenRequestHeader(url).PostJsonAsync(zoneHoming).Result.GetJsonAsync<ZoneHomingResultDto>().Result;
}
/// <summary>
/// 区域驱赶
///
/// 将指定区域内的AGV驱赶出该区域。
/// </summary>
/// <param name="zoneBanish"></param>
/// <returns></returns>
public ZoneBanishResultDto ZoneBanish(ZoneBanishDto zoneBanish)
{
string url = $"{hikRoBotConfig.api}/zone/banish";
return GenRequestHeader(url).PostJsonAsync(zoneBanish).Result.GetJsonAsync<ZoneBanishResultDto>().Result;
}
/// <summary>
/// 区域封锁
///
/// 封锁指定区域禁止AGV进入该区域。
/// </summary>
/// <param name="zoneBlockade"></param>
/// <returns></returns>
public ZoneBlockadeResultDto ZoneBlockade(ZoneBlockadeDto zoneBlockade)
{
string url = $"{hikRoBotConfig.api}/zone/blockade";
return GenRequestHeader(url).PostJsonAsync(zoneBlockade).Result.GetJsonAsync<ZoneBlockadeResultDto>().Result;
}
/// <summary>
/// 载具绑定
///
/// 将载具(货架/料箱等)与指定库位进行绑定。
/// </summary>
/// <param name="carrierBind"></param>
/// <returns></returns>
public CarrierBindResultDto CarrierBind(CarrierBindDto carrierBind)
{
string url = $"{hikRoBotConfig.api}/carrier/bind";
return GenRequestHeader(url).PostJsonAsync(carrierBind).Result.GetJsonAsync<CarrierBindResultDto>().Result;
}
/// <summary>
/// 载具解绑
///
/// 解除载具(货架/料箱等)与库位的绑定关系。
/// </summary>
/// <param name="carrierUnbind"></param>
/// <returns></returns>
public CarrierUnbindResultDto CarrierUnbind(CarrierUnbindDto carrierUnbind)
{
string url = $"{hikRoBotConfig.api}/carrier/unbind";
return GenRequestHeader(url).PostJsonAsync(carrierUnbind).Result.GetJsonAsync<CarrierUnbindResultDto>().Result;
}
/// <summary>
/// 库位绑定
///
/// 将载具绑定到指定库位。
/// </summary>
/// <param name="siteBind"></param>
/// <returns></returns>
public SiteBindResultDto SiteBind(SiteBindDto siteBind)
{
string url = $"{hikRoBotConfig.api}/site/bind";
return GenRequestHeader(url).PostJsonAsync(siteBind).Result.GetJsonAsync<SiteBindResultDto>().Result;
}
/// <summary>
/// 载具锁定
///
/// 锁定指定载具禁止AGV操作该载具。
/// </summary>
/// <param name="carrierLock"></param>
/// <returns></returns>
public CarrierLockResultDto CarrierLock(CarrierLockDto carrierLock)
{
string url = $"{hikRoBotConfig.api}/carrier/lock";
return GenRequestHeader(url).PostJsonAsync(carrierLock).Result.GetJsonAsync<CarrierLockResultDto>().Result;
}
/// <summary>
/// 库位锁定
///
/// 锁定指定库位禁止AGV访问该库位。
/// </summary>
/// <param name="siteLock"></param>
/// <returns></returns>
public SiteLockResultDto SiteLock(SiteLockDto siteLock)
{
string url = $"{hikRoBotConfig.api}/site/lock";
return GenRequestHeader(url).PostJsonAsync(siteLock).Result.GetJsonAsync<SiteLockResultDto>().Result;
}
/// <summary>
/// 预占任务
///
/// 预占AGV资源为后续任务执行做准备。
/// </summary>
/// <param name="preTask"></param>
/// <returns></returns>
public PreTaskResultDto PreTask(PreTaskDto preTask)
{
string url = $"{hikRoBotConfig.api}/task/pretask";
return GenRequestHeader(url).PostJsonAsync(preTask).Result.GetJsonAsync<PreTaskResultDto>().Result;
}
/// <summary>
/// 查询任务状态
///
/// 根据任务编号查询任务的当前执行状态。
/// </summary>
/// <param name="queryTask"></param>
/// <returns></returns>
public QueryTaskResultDto QueryTaskStatus(QueryTaskDto queryTask)
{
string url = $"{hikRoBotConfig.api}/task/query";
return GenRequestHeader(url).PostJsonAsync(queryTask).Result.GetJsonAsync<QueryTaskResultDto>().Result;
}
/// <summary>
/// 查询机器人状态
///
/// 查询指定机器人的当前运行状态信息。
/// </summary>
/// <param name="queryRobot"></param>
/// <returns></returns>
public QueryRobotResultDto QueryRobotStatus(QueryRobotDto queryRobot)
{
string url = $"{hikRoBotConfig.api}/robot/query";
return GenRequestHeader(url).PostJsonAsync(queryRobot).Result.GetJsonAsync<QueryRobotResultDto>().Result;
}
/// <summary>
/// 查询载具状态
///
/// 查询指定载具的当前位置和状态信息。
/// </summary>
/// <param name="queryCarrier"></param>
/// <returns></returns>
public QueryCarrierResultDto QueryCarrierStatus(QueryCarrierDto queryCarrier)
{
string url = $"{hikRoBotConfig.api}/carrier/query";
return GenRequestHeader(url).PostJsonAsync(queryCarrier).Result.GetJsonAsync<QueryCarrierResultDto>().Result;
}
/// <summary>
/// 物料标签绑定
///
/// 将物料与标签进行绑定关联。
/// </summary>
/// <param name="matLabelBind"></param>
/// <returns></returns>
public MatLabelBindResultDto MatLabelBind(MatLabelBindDto matLabelBind)
{
string url = $"{hikRoBotConfig.api}/matlabel/bind";
return GenRequestHeader(url).PostJsonAsync(matLabelBind).Result.GetJsonAsync<MatLabelBindResultDto>().Result;
}
/// <summary>
/// 物料标签解绑
///
/// 解除物料与标签的绑定关系。
/// </summary>
/// <param name="matLabelUnbind"></param>
/// <returns></returns>
public MatLabelUnbindResultDto MatLabelUnbind(MatLabelUnbindDto matLabelUnbind)
{
string url = $"{hikRoBotConfig.api}/matlabel/unbind";
return GenRequestHeader(url).PostJsonAsync(matLabelUnbind).Result.GetJsonAsync<MatLabelUnbindResultDto>().Result;
}
/// <summary>
/// 设备状态通知
///
/// 向上层系统通知设备AGV/载具等)的状态变化。
/// </summary>
/// <param name="equipmentNotify"></param>
/// <returns></returns>
public EquipmentNotifyResultDto EquipmentNotify(EquipmentNotifyDto equipmentNotify)
{
string url = $"{hikRoBotConfig.api}/spi/wcs/robot/eqpt/notify";
return GenRequestHeader(url).PostJsonAsync(equipmentNotify).Result.GetJsonAsync<EquipmentNotifyResultDto>().Result;
}
/// <summary>
/// 设备状态通知(国标)
///
/// 以国标格式向上层系统通知设备状态变化。
/// </summary>
/// <param name="equipmentNotify"></param>
/// <returns></returns>
public EquipmentNotifyResultDto EquipmentNotifyGbt(EquipmentNotifyDto equipmentNotify)
{
string url = $"{hikRoBotConfig.api}/spi/wcs/robot/eqpt/notifyGbt";
return GenRequestHeader(url).PostJsonAsync(equipmentNotify).Result.GetJsonAsync<EquipmentNotifyResultDto>().Result;
}
/// <summary>
/// 生成请求头
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
private IFlurlRequest GenRequestHeader(string url)
{
var request = url
.WithHeader("Content-Type", hikRoBotConfig.contentType)
.WithHeader("User-Agent", hikRoBotConfig.userAgent)
.WithHeader("X-lr-request-id", System.Guid.NewGuid().ToString("N"))
.WithHeader("X-lr-version", hikRoBotConfig.xlrVersion)
.WithTimeout(TimeSpan.FromSeconds(15));
return request;
}
}
}