using System;
|
using System.Collections.Generic;
|
using System.IdentityModel.Protocols.WSTrust;
|
using System.Linq;
|
using System.Security.Policy;
|
using System.Threading.Tasks;
|
|
using HH.WCS.Mobox3.AnGang.core;
|
using HH.WCS.Mobox3.AnGang.models;
|
using HH.WCS.Mobox3.AnGang.util;
|
|
using Newtonsoft.Json;
|
|
using static System.Net.WebRequestMethods;
|
using static HH.WCS.Mobox3.AnGang.api.ApiModel;
|
|
namespace HH.WCS.Mobox3.AnGang.dispatch {
|
/// <summary>
|
/// 国自调度辅助类
|
/// </summary>
|
public class GZRobot {
|
private static readonly HttpHelper apiHelper = new HttpHelper();
|
private static readonly string baseUrl = Settings.RCSApiUrl;//配置文件获取国自调度地址
|
//private static readonly string logName = "guozi";
|
public static List<IOState> GetIO() {
|
var result = apiHelper.Get(baseUrl + "api/engine/view/iostates/");
|
var data = JsonConvert.DeserializeObject<gzResult<IOState>>(result);
|
return data.data;
|
}
|
public static void UpdateIOState() {
|
var data = new { data = new List<IOSateInfo>() };
|
var result = apiHelper.Post(baseUrl + "api/engine/tasks/iostates/", JsonConvert.SerializeObject(data));
|
var dataResult = JsonConvert.DeserializeObject<gzResult<IOStatesInfoResult>>(result);
|
}
|
|
// DOC 1. 创建订单 WMS->RCS
|
public static int CreateOrder(string taskNo, int priority, string param, string ts = "churuku", string created_user = "hanhe") {
|
LogHelper.Info($"CreateOrder参数信息:taskNo:{taskNo},priority:{priority},param:{param},ts:{ts},created_user:{created_user}", "API");
|
var msg = "";
|
var orderId = 0;
|
var data = new OrderInfo() { order_name = taskNo, priority = priority, dead_line = DateTime.Now, ts_name = ts, parameters = param, created_user = created_user };
|
var request = JsonConvert.SerializeObject(data);
|
var response = apiHelper.Post(baseUrl + "api/om/order/", request);
|
LogHelper.Info($"CreateOrder:url:{baseUrl}api/om/order/,request:{request}", "API");
|
msg = $"[guozi-CreateOrder] request={request} response={response}";
|
Console.WriteLine(msg);
|
if (response != "") {
|
try {
|
var dataResult = JsonConvert.DeserializeObject<gzResult<OrderInfoResult>>(response);
|
// 原代码部分
|
//if (dataResult.code == 0) {
|
// orderId = dataResult.data[0].in_order_id;
|
//}
|
// 尊重文档的版本
|
// 返回参数中,code目前不再使用,可通过msg字段判断是否成功,如果msg为”success”则表示成功,否则为报错信息或不存在。http code为422时候的报错为系统报错,其中的msg无法全部获取。
|
// SELFNOTE: 直接调用HttpHelper.Post方法,无法获取header,暂时不考虑
|
if (dataResult.msg == "success") {
|
orderId = dataResult.data[0].in_order_id;
|
}
|
}
|
catch (Exception ex) {
|
}
|
}
|
else {
|
msg = "[guozi-CreateOrder]创建订单失败";
|
Console.WriteLine(msg);
|
LogHelper.Info($"创建订单失败", "API");
|
}
|
|
|
return orderId;
|
}
|
public static bool CancelOrder(int orderId) {
|
bool result = false;
|
string msg = "";
|
var request = new CancelOrderInfo() { order_list = new List<int>(orderId) };
|
var response = apiHelper.Post(baseUrl + "api/om/order/cancel/", JsonConvert.SerializeObject(request));
|
msg = $"[guozi-CancelOrder] request={request};response={response}";
|
Console.WriteLine(msg);
|
if (response != "") {
|
var dataResult = JsonConvert.DeserializeObject<gzResult<CancelOrderInfoResult>>(response);
|
if (dataResult.code == 0) {
|
result = true;
|
}
|
}
|
else {
|
msg = "[guozi-CancelOrder]取消订单失败";
|
Console.WriteLine(msg);
|
}
|
return result;
|
}
|
|
// DOC 2. 取消订单 WMS->RCS
|
public static bool CancelGZOrder(int orderId) {
|
bool result = false;
|
string msg = "";
|
List<CancelGZOrderInfo> requests = new List<CancelGZOrderInfo>();
|
var request = new CancelGZOrderInfo() { order_id = orderId, order_command_type_id = 2 };
|
requests.Add(request);
|
var response = apiHelper.Put(baseUrl + "api/om/order/order-command/", JsonConvert.SerializeObject(requests));
|
msg = $"[guozi-CancelOrder] request={requests};response={response}";
|
if (response != "") {
|
var dataResult = JsonConvert.DeserializeObject<CancelGZOrderResult>(response);
|
// 原代码版本
|
//if (dataResult.code == 0) {
|
// msg = "[guozi-CancelOrder]取消订单成功";
|
// Console.WriteLine(msg);
|
// result = true;
|
// return result;
|
//}
|
|
// 尊重文档的版本
|
if (dataResult.msg == "success") { // 目前只取消一个任务,成功无需再检查success_list和error_list
|
Console.WriteLine("[guozi-CancelOrder]取消订单成功");
|
result = true;
|
return result;
|
}
|
|
}
|
else {
|
msg = "[guozi-CancelOrder]取消订单失败";
|
Console.WriteLine(msg);
|
}
|
return result;
|
}
|
|
// DOC 3. 订单状态推送 RCS->WMS
|
/// <summary>
|
/// 订单状态反馈
|
/// </summary>
|
/// <returns></returns>
|
public static GzResult orderStatusReport(orderStatusReportParme model) {
|
LogHelper.Info("orderStatusReport:RCS国自AGV任务状态回报:" + JsonConvert.SerializeObject(model), "HosttoagvTask");
|
GzResult result = new GzResult();
|
AgvTaskState agv = new AgvTaskState();
|
|
if (model == null) {
|
result.resultCode = 1;
|
result.orderID = model.orderID;
|
result.msg = "返回订单状态失败";
|
}
|
|
switch (model.orderStatus) {
|
case "active":
|
agv.state = 1;
|
break;
|
case "waiting":
|
agv.state = 1;
|
break;
|
case "dispatched":
|
//调度派车(开始取货)NEW ADDED
|
agv.state = 3;
|
break;
|
case "source_finish":
|
//取货完成
|
agv.state = 4;
|
break;
|
case "dest_finish":
|
//卸货完成
|
agv.state = 6;
|
break;
|
case "finish":
|
agv.state = 2;
|
break;
|
case "manually_finish":
|
agv.state = 2;
|
break;
|
case "cancel_finish":
|
agv.state = 7;
|
break;
|
case "error":
|
agv.state = 7;
|
break;
|
default:
|
agv.state = 0;
|
break;
|
}
|
if (agv.state != 0) {
|
agv.task_no = model.orderName;
|
agv.forklift_no = model.agvIDList;
|
WCSCore.OperateAgvTaskStatus(agv);
|
}
|
else {
|
result.resultCode = 2;
|
result.orderID = model.orderID;
|
result.msg = "反馈订单状态失败,orderStatus参数不正确";
|
LogHelper.Info(result.msg, "API");
|
return result;
|
}
|
|
result.resultCode = 0;
|
result.msg = "返回订单状态成功";
|
result.orderID = model.orderID;
|
LogHelper.Info("orderStatusReport返回信息" + JsonConvert.SerializeObject(result), "API");
|
return result;
|
}
|
|
public class CancelGZOrderInfo
|
{
|
public int order_id { get; set; }
|
public int order_command_type_id { get; set; }
|
|
}
|
|
|
public static QueryOrderResult QueryOrder(int id) {
|
//
|
var result = new QueryOrderResult() { agv_list = new List<int> { 0 } };
|
string msg = "";
|
var response = apiHelper.Get(baseUrl + $"/api/om/order/{id}/");
|
msg = $"[guozi-QueryOrderResult] request={id};response={response}";
|
Console.WriteLine(msg);
|
if (response != "") {
|
var data = JsonConvert.DeserializeObject<gzResult<QueryOrderResult>>(response);
|
result = data.data[0];
|
}
|
else {
|
msg = "[guozi-QueryOrderResult]查询订单信息失败";
|
Console.WriteLine(msg);
|
}
|
return result;
|
}
|
|
// DOC 6. 交互表查询
|
/// <summary>
|
/// 获取交互信息
|
/// </summary>
|
/// <param name="typeId">1任务状态 2开门或交管 3目的点</param>
|
/// <param name="status"></param>
|
/// <returns></returns>
|
public static List<InteractInfoResult> QueryInteractInfo(int typeId, string status = "active") {
|
|
//string aaa = "{\"app_name\": \"Gouzi client\", \"version\": \"1.0.0\", \"code\": 0, \"msg\": \"success\", \"data\": [{\"interaction_info_id\": 233, \"interaction_info_name\": \"TN2012030001\", \"interaction_info_desp\": null, \"interaction_info_type_id\": 3, \"value_json\": {\"state\": \"4\"}, \"info_status\": \"active\", \"return_value\": null}]}";
|
//var data = JsonConvert.DeserializeObject<gzResult<InteractInfoResult>>(aaa);
|
var list = new List<InteractInfoResult>();
|
string msg = "";
|
var result = apiHelper.Get(baseUrl + $"api/om/interaction_info/find_by_type/?type_id={typeId}&info_status={status}");
|
if (!string.IsNullOrEmpty(result)) {
|
Console.WriteLine(result);
|
// {"app_name": "Gouzi client", "version": "1.0.0", "code": 0, "msg": "success", "data": [{"interaction_info_id": 230, "interaction_info_name": "2", "interaction_info_desp": null, "interaction_info_type_id": 3, "value_json": {"state": "4"}, "info_status": "active", "return_value": null}, {"interaction_info_id": 231, "interaction_info_name": "2", "interaction_info_desp": null, "interaction_info_type_id": 3, "value_json": {"state": "6"}, "info_status": "active", "return_value": null}, {"interaction_info_id": 232, "interaction_info_name": "2", "interaction_info_desp": null, "interaction_info_type_id": 3, "value_json": {"state": "2"}, "info_status": "active", "return_value": null}, {"interaction_info_id": 233, "interaction_info_name": "TN2012030001", "interaction_info_desp": null, "interaction_info_type_id": 3, "value_json": {"state": "4"}, "info_status": "active", "return_value": null}]}
|
try {
|
var data = JsonConvert.DeserializeObject<gzResult<InteractInfoResult>>(result);
|
if (data.data != null) {
|
list = data.data;
|
}
|
|
}
|
catch (Exception ex) {
|
Console.WriteLine(ex.Message);
|
}
|
|
}
|
else {
|
msg = "[guozi-QueryInteractInfo]读取交互信息失败";
|
Console.WriteLine(msg);
|
}
|
return list;
|
}
|
|
/// <summary>
|
/// 根据没有interaction_info_name(task.S_CODE)获取interaction_info_id
|
/// </summary>
|
/// <param name="taskCode"></param>
|
/// <param name="infoId"></param>
|
/// <returns></returns>
|
public static bool TryGetInteractionInfoId(string taskCode, out int infoId) {
|
var list = QueryInteractInfo(3);
|
if (list.Count == 0) {
|
LogHelper.Info($"查交互表失败!没有读取到交互表!");
|
infoId = 0;
|
return false;
|
}
|
|
var data = list.Where(i => i.interaction_info_name == taskCode).FirstOrDefault();
|
if (data == null) {
|
LogHelper.Info($"查交互表失败!没有interaction_info_name='{taskCode}'的值!" + JsonConvert.SerializeObject(list));
|
infoId = 0;
|
return false;
|
}
|
|
infoId = data.interaction_info_id;
|
return true;
|
}
|
|
// DOC 6. 交互表查询(更新终点货位)
|
public static bool UpdateInteractInfo(UpdateInteractInfo interactInfo) {
|
string msg = "";
|
var result = false;
|
var request = JsonConvert.SerializeObject(interactInfo);
|
var response = apiHelper.Post(baseUrl + "api/om/interaction_info/update/", request);
|
msg = $"[mes-UpdateInteractInfo] request={request};response={response}";
|
if (response != "") {
|
var dataResult = JsonConvert.DeserializeObject<gzResult<object>>(response);
|
result = dataResult.code == 0;
|
}
|
else {
|
msg = "[guozi-UpdateInteractInfo]更新交互信息失败";
|
//Console.WriteLine(msg);
|
LogHelper.Info(msg);
|
}
|
return result;
|
}
|
|
|
// DOC 5. 称重信息查询
|
public static List<CustomData> CustomBuf() {
|
var res = new List<CustomData>();
|
|
string msg = "";
|
//var result = apiHelper.Get(baseUrl + $"/api/engine/agvs/custom-buf/", "application/json");
|
LogHelper.Info($"正在请求GET: \"/api/engine/agvs/custom-buf/\"", "API");
|
var result = apiHelper.GetNew(baseUrl + $"api/engine/agvs/custom-buf/");
|
if (!string.IsNullOrEmpty(result)) {
|
Console.WriteLine(result);
|
|
try {
|
LogHelper.Info($"称重信息:" + result);
|
var data = JsonConvert.DeserializeObject<gzResult<CustomData>>(result);
|
|
if (data.data != null) {
|
res = data.data;
|
}
|
}
|
catch (Exception ex) {
|
Console.WriteLine(ex.Message);
|
}
|
|
}
|
else {
|
msg = "[guozi-CustomBuf]读取交互信息失败";
|
Console.WriteLine(msg);
|
}
|
|
return res;
|
}
|
|
}
|
|
public class CustomData {
|
public string agv_id { get; set; }
|
public string parameter_varchar200_up { get; set; }
|
public string parameter_varchar200_down { get; set; }
|
}
|
|
public class gzResult<T>
|
{
|
public string app_name { get; set; }
|
public string version { get; set; }
|
public int code { get; set; }
|
public string msg { get; set; }
|
public List<T> data { get; set; }
|
}
|
public class IOState
|
{
|
public int io_id { get; set; }
|
public string io_name { get; set; }
|
public string io_type_id { get; set; }
|
public string io_type { get; set; }
|
public int io_status_id { get; set; }
|
public string io_status_type { get; set; }
|
public string parameter_definition_int4_1 { get; set; }
|
public int io_value_int4_1 { get; set; }
|
public string parameter_definition_int4_2 { get; set; }
|
public int io_value_int4_2 { get; set; }
|
public string parameter_definition_int4_3 { get; set; }
|
public int io_value_int4_3 { get; set; }
|
public string parameter_definition_int4_4 { get; set; }
|
public int io_value_int4_4 { get; set; }
|
public string parameter_definition_json { get; set; }
|
public string io_value_json { get; set; }
|
}
|
public class IOSateInfo
|
{
|
public int io_id { get; set; }
|
public int io_status_id { get; set; }
|
public int io_value_int4_1 { get; set; }
|
public int io_value_int4_2 { get; set; }
|
public int io_value_int4_3 { get; set; }
|
public int io_value_int4_4 { get; set; }
|
public string io_value_json { get; set; }
|
}
|
public class IOStatesInfoResult
|
{
|
public List<ResultInfo> success_list { get; set; }
|
public List<ResultInfo> error_list { get; set; }
|
public class ResultInfo { public int io_id { get; set; } }
|
}
|
public class OrderInfo
|
{
|
public string order_name { get; set; }
|
public int priority { get; set; }
|
public DateTime dead_line { get; set; }
|
public string ts_name { get; set; }
|
public string parameters { get; set; }//{\"dock\":1}
|
public string created_user { get; set; }
|
|
}
|
public class OrderInfoResult
|
{
|
public int in_order_id { get; set; }
|
}
|
public class CancelOrderInfo
|
{
|
public List<int> order_list { get; set; }
|
}
|
public class CancelOrderInfoResult
|
{
|
public List<ResultInfo> success_list { get; set; }
|
public List<ResultInfo> error_list { get; set; }
|
public class ResultInfo { public int order_id { get; set; } }
|
}
|
public class cancle
|
{
|
public List<success_list> success_list { get; set; }
|
public List<error_list> error_list { get; set; }
|
}
|
public class success_list
|
{
|
public int order_id { get; set; }
|
}
|
|
public class error_list
|
{
|
}
|
public class CancelGZOrderResult
|
{
|
public string app_name { get; set; }
|
public string version { get; set; }
|
public int code { get; set; }
|
public string msg { get; set; }
|
public cancle data { get; set; }
|
public List<int> success_list { get; set; }
|
public List<int> error_list { get; set; }
|
}
|
public class QueryOrderResult
|
{
|
public int order_id { get; set; }
|
public string order_name { get; set; }
|
public int priority { get; set; }
|
public DateTime dead_line { get; set; }
|
public string ts_id { get; set; }
|
public string parameters { get; set; }//{"TN_LocationName":"3-2-B", "PalletType":1}",
|
public string trigger { get; set; }
|
public string command { get; set; }
|
public string status { get; set; }
|
public List<int> agv_list { get; set; }
|
public string current_task { get; set; }
|
public string current_dest { get; set; }
|
public string current_opt { get; set; }
|
public string current_omi { get; set; }
|
public DateTime create_time { get; set; }
|
public DateTime? active_time { get; set; }
|
public DateTime? finished_time { get; set; }
|
public DateTime? cancel_time { get; set; }
|
public string response_timespan { get; set; }
|
public string execute_timespa { get; set; }
|
public string total_timespan { get; set; }
|
}
|
public class InteractInfoResult
|
{
|
public int interaction_info_id { get; set; }
|
public string interaction_info_name { get; set; }
|
public string interaction_info_desp { get; set; }
|
public int interaction_info_type_id { get; set; }
|
public object value_json { get; set; }//{"dock": 1},
|
public string info_status { get; set; }
|
public string return_value { get; set; }
|
}
|
public class UpdateInteractInfo
|
{
|
public int interaction_info_id { get; set; }
|
public string type_name { get; set; } = "GET_DST";
|
public string info_status { get; set; }
|
public string return_value { get; set; } = "";
|
}
|
public class interaction_state
|
{
|
public string state { get; set; }
|
}
|
public class interaction_door
|
{
|
public string door { get; set; }
|
}
|
public class interaction_bit
|
{
|
public string order { get; set; }
|
}
|
}
|