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.

512 lines
21 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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 保留所有权利。
* CLR版本4.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
{
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";
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));
string json = JsonConvert.SerializeObject(gbTaskSubmit);
Console.WriteLine($"请求报文:{json}");
return request.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";
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.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";
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.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";
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.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";
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.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";
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.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";
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.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";
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.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";
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.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";
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.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";
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.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";
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.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";
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.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";
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.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";
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.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";
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.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";
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.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";
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.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";
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.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";
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.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";
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.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";
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.PostJsonAsync(equipmentNotify).Result.GetJsonAsync<EquipmentNotifyResultDto>().Result;
}
}
}