Files
Web_CRICS_Server_VS2010_Prod/CommonEntity/FCS.cs
2025-12-19 16:58:44 +08:00

474 lines
18 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using RestSharp;
using System.Net;
using Newtonsoft.Json.Linq;
using Common;
using Newtonsoft.Json;
namespace CommonEntity
{
public class User
{
public string username { get; set; }
public string password { get; set; }
public int oauth_id { get; set; }
}
public class FCS_ReturnInfo
{
public int success { get; set; }
public FCS_ReturnData data { get; set; }
}
// {"success": 1, "data": true, "rmsg": {"code": "s_job_orders", "param": ["JO-0001970-01"]}}
public class FCS_JobResponse
{
public int success { get; set; }
public bool data { get; set; }
//"rmsg":
//[
//{
// "code": "s_user_not_found",
// "param": []
//}
//]
public List<FCSJobResponseData> rmsg { get; set; }
}
public class FCSJobResponseData
{
public string code { get; set; }
public List<string> param { get; set; }
}
public class FCS_ReturnData
{
public bool is_authenticated { get; set; }
public string access_token { get; set; }
public string refresh_token { get; set; }
public bool show_password_expire { get; set; }
public string password_expired_date { get; set; }
public bool password_expired { get; set; }
public bool valid_license_access { get; set; }
public bool require_reset { get; set; }
public string property_config { get; set; }
public string show_pp { get; set; }
public int oauth_id { get; set; }
public bool is_ip_valid { get; set; }
public bool is_support_aliyun { get; set; }
}
public class FCS_JobRequest
{
public List<string> location_uuid { get; set; }
public List<FCS_service_items> service_items { get; set; }
public string remark { get; set; }
public string assigned_to { get; set; }
public int user_type { get; set; }
public bool get_details { get; set; }
}
public class FCS_service_items
{
public string item_uuid { get; set; }
public int quantity { get; set; }
}
public struct FCS_OrderData
{
public string LocationUUID { get; set; }
public string ItemUUID { get; set; }
public string PropertyID { get; set; }
public string ItemType { get; set; }
public string OrderUUID { get; set; }
public string OrderNo { get; set; }
public string HotelCode { get; set; }
public string RoomNUMBER { get; set; }
public string HostNUMBER { get; set; }
}
public class FCS_Response
{
public int success { get; set; }
public List<FCS_R_DataItem> data { get; set; }
public RMSG rmsg { get; set; }
}
public class FCS_R_DataItem
{
public string job_no { get; set; }
public string job_status_colour { get; set; }
public string job_uuid { get; set; }
}
public class RMSG
{
public string code { get; set; }
public List<string> param { get; set; }
}
/// <summary>
/// 查询 类
/// </summary>
public class QueryFCSOrder
{
public string filter { get; set; }
public OrderQueryItem column_filter { get; set; }
}
public class OrderQueryItem
{
public string field { get; set; }
public List<string> value { get; set; }
}
public class QueryOrderResponse
{
public string success { get; set; }
public List<Dictionary<string, string>> data { get; set; }
public object[] rmsg { get; set; }
}
public class RR
{
private static log4net.ILog logger = log4net.LogManager.GetLogger(typeof(RR));
private static void SSLXieYi()
{
//ssl 协议不兼容
var A = (SecurityProtocolType)48;
var B = (SecurityProtocolType)192;
var C = (SecurityProtocolType)768;
var D = (SecurityProtocolType)3072;
var E = (SecurityProtocolType)12288;
ServicePointManager.SecurityProtocol = A | B | C | D | E;
}
public static void Login(string FCSLoginUrl, string FCSLoginUserName, string FCSLoginPassWord, string HotelCode, string RoomNum)
{
try
{
SSLXieYi();
var client1 = new RestClient(FCSLoginUrl);
var request1 = new RestRequest("/api/security/authenticate", Method.POST);
Dictionary<string, string> dic = new Dictionary<string, string>();
User us = new User();
us.username = FCSLoginUserName;
us.password = FCSLoginPassWord;
us.oauth_id = 1;
request1.AddJsonBody(us);
Interface3Log w1 = new Interface3Log();
w1.HotelCode = HotelCode;
w1.RoomNumber = RoomNum;
w1.TriggerTime = DateTime.Now;
w1.ActionData = new HttpActionData() { RequestData = Newtonsoft.Json.JsonConvert.SerializeObject(dic) };
w1.CommandType = ChangLiangValue.CommandType_FCS;
var q1 = Newtonsoft.Json.JsonConvert.SerializeObject(w1);
CSRedisCacheHelper.Publish(CacheKey.InvokeHttpInterface, q1);
var QQQ = client1.Execute(request1);
HttpStatusCode HHH = QQQ.StatusCode;
if (HHH == HttpStatusCode.Created || HHH == HttpStatusCode.OK)
{
string ddd = QQQ.Content;
Interface3Log w2 = new Interface3Log();
w2.HotelCode = HotelCode;
w2.RoomNumber = RoomNum;
w2.TriggerTime = DateTime.Now;
w2.ActionData = new HttpActionData() { ResponseData = ddd };
w2.CommandType = ChangLiangValue.CommandType_FCS;
var q2 = Newtonsoft.Json.JsonConvert.SerializeObject(w2);
CSRedisCacheHelper.Publish(CacheKey.InvokeHttpInterface, q2);
var FFFA = Newtonsoft.Json.JsonConvert.DeserializeObject<FCS_ReturnInfo>(ddd);
string TokenKey = CacheKey.FCSToken;
CSRedisCacheHelper.Set_Partition(TokenKey, FFFA, 1);
}
}
catch (Exception ex)
{
logger.Error("FCS Login Error" + ex.Message);
logger.Error(ex.StackTrace);
}
//client1.ExecuteAsync(request1, (response) =>
//{
// Console.WriteLine(response.Content);
//});
}
public static void JobRequest(string AccessToken, string location_uuid, string item_uuid, string FCSLoginUrl, string UserName, string PassWord, string PropertyID, string code, string roomno, string remarkdata, string itemclass)
{
if (string.IsNullOrEmpty(item_uuid))
{
return;
}
SSLXieYi();
var client1 = new RestClient(FCSLoginUrl);
var request1 = new RestRequest("/api-secure/job/request", Method.POST);
FCS_JobRequest fff = new FCS_JobRequest();
fff.location_uuid = new List<string>() { location_uuid };
fff.service_items = new List<FCS_service_items>()
{
new FCS_service_items()
{
item_uuid=item_uuid,
quantity=1
}
};
fff.remark = remarkdata;
fff.assigned_to = "auto";
fff.user_type = 1;
fff.get_details = true;
string WER = Newtonsoft.Json.JsonConvert.SerializeObject(fff);
logger.Error("push data is " + WER);
logger.Error("push token is " + AccessToken);
request1.AddHeader("token", AccessToken);
//下面这个是个定值
request1.AddHeader("property", PropertyID);
request1.AddParameter("payload", WER);
Interface3Log w1 = new Interface3Log();
w1.HotelCode = code;
w1.RoomNumber = roomno;
w1.TriggerTime = DateTime.Now;
w1.ActionData = new HttpActionData() { RequestData = Newtonsoft.Json.JsonConvert.SerializeObject(WER) };
w1.CommandType = ChangLiangValue.CommandType_FCS;
var q1 = Newtonsoft.Json.JsonConvert.SerializeObject(w1);
CSRedisCacheHelper.Publish(CacheKey.InvokeHttpInterface, q1);
client1.ExecuteAsync(request1, (QQQ) =>
{
HttpStatusCode HHH = QQQ.StatusCode;
string FHS = QQQ.Content;
Interface3Log w2 = new Interface3Log();
w2.HotelCode = code;
w2.RoomNumber = roomno;
w2.TriggerTime = DateTime.Now;
w2.ActionData = new HttpActionData() { ResponseData = FHS };
w2.CommandType = ChangLiangValue.CommandType_FCS;
var q2 = Newtonsoft.Json.JsonConvert.SerializeObject(w2);
CSRedisCacheHelper.Publish(CacheKey.InvokeHttpInterface, q2);
//{
// "success": 1,
// "data": [
// {
// "job_no": "JO-0004548-01",
// "job_status_colour": "#FA8C16",
// "job_uuid": "b1dcb088-6dbc-4ca5-a1c4-0a8b951113fd"
// }
// ],
// "rmsg": {
// "code": "s_job_orders",
// "param": [
// "JO-0004548-01"
// ]
// }
//}
logger.Error("PushData 返回值为:" + FHS);
logger.Error("PushData Status:" + HHH.ToString());
if (string.IsNullOrEmpty(FHS))
{
return;
}
JObject jsonObject = JObject.Parse(FHS);
var error = jsonObject.SelectToken("error");
//如果有错
if (error != null)
{
Login(FCSLoginUrl, UserName, PassWord, code, roomno);
}
else
{
if (itemclass.Equals("Clean"))
{
logger.Error("写入订单"+FHS);
//FCS_Response
var FFF = JsonConvert.DeserializeObject<FCS_Response>(FHS);
var JJJ = FFF.data.FirstOrDefault();
if (JJJ != null)
{
string orderuuid = JJJ.job_uuid;
FCS_OrderData f = new FCS_OrderData();
f.OrderUUID = orderuuid;
f.PropertyID = PropertyID;
f.ItemType = "Clean";
f.OrderNo = JJJ.job_no;
f.ItemUUID = item_uuid;
f.LocationUUID = location_uuid;
f.HotelCode = code;
f.RoomNUMBER = roomno;
string fsa = Newtonsoft.Json.JsonConvert.SerializeObject(f);
//这个是 供轮循的时候调用使用
CSRedisCacheHelper.HMSet(3, 60 * 24, CacheKey.FCSOrder, Guid.NewGuid().ToString("N"), fsa);
//这个是供 取消订单的时候使用的
//这个只 支持 取消 清理
logger.Error("记录入循环:"+orderuuid);
CSRedisCacheHelper.Set_PartitionWithTime(CacheKey.FCSRoom_Mapping_Order + "_" + location_uuid, orderuuid, 24 * 60, 3);
}
}
}
if (HHH == HttpStatusCode.OK)
{
}
});
}
/// <summary>
/// FCS数据推送
/// </summary>
/// <param name="Item_UUID"></param>
public static void FCS_PushData(string Item_UUID, string location_UUID, string PropertyUUID, string LoginUrl, string UserName, string PassWord, string code, string roomno, string remarkdata = "", string HOSTNUMBER = "")
{
try
{
if (string.IsNullOrEmpty(Item_UUID))
{
return;
}
//logger.Error("FCS push data");
if (!string.IsNullOrEmpty(location_UUID))
{
string Key = CacheKey.FCSToken;
var TokenTakeOut = CSRedisCacheHelper.Get_Partition<FCS_ReturnInfo>(Key, 1);
if (TokenTakeOut == null)
{
logger.Error("FCS login");
RR.Login(LoginUrl, UserName, PassWord, code, roomno);
}
else
{
logger.Error("FCS push action data");
string ItemClass = "";
if (!string.IsNullOrEmpty(HOSTNUMBER))
{
ItemClass = "Clean";
}
logger.Error("FCS push action itemclass:" + ItemClass);
RR.JobRequest(TokenTakeOut.data.access_token, location_UUID, Item_UUID, LoginUrl, UserName, PassWord, PropertyUUID, code, roomno, remarkdata, ItemClass);
if (!string.IsNullOrEmpty(HOSTNUMBER))
{
string CleanTrigger = CacheKey.CleanFCS_TriggerCount + "_" + HOSTNUMBER;
CSRedisCacheHelper.Set_PartitionWithTime<int>(CleanTrigger, 1, 3);
}
}
}
}
catch (Exception ex)
{
logger.Error("FCS PushData Error: " + ex.Message);
}
}
/// <summary>
/// 取消Job
/// </summary>
/// <param name="AccessToken"></param>
/// <param name="location_uuid"></param>
/// <param name="item_uuid"></param>
/// <param name="FCSLoginUrl"></param>
/// <param name="UserName"></param>
/// <param name="PassWord"></param>
/// <param name="PropertyID"></param>
/// <param name="HotelCode"></param>
/// <param name="RoomNo"></param>
/// <param name="remarkdata"></param>
/// <param name="itemclass"></param>
public static void JobCancelRequest(string AccessToken, string FCSLoginUrl, string PropertyID, string HotelCode, string RoomNo, string OrderId)
{
if (string.IsNullOrEmpty(OrderId))
{
return;
}
SSLXieYi();
string RUrl = string.Format("/api-secure/job/order/{0}/cancelled", OrderId);
var client1 = new RestClient(FCSLoginUrl);
var request1 = new RestRequest(RUrl, Method.POST);
logger.Error("push data is " + OrderId);
logger.Error("push token is " + AccessToken);
request1.AddHeader("token", AccessToken);
//下面这个是个定值
request1.AddHeader("property", PropertyID);
Interface3Log w1 = new Interface3Log();
w1.HotelCode = HotelCode;
w1.RoomNumber = RoomNo;
w1.TriggerTime = DateTime.Now;
w1.ActionData = new HttpActionData() { RequestData = OrderId };
w1.CommandType = ChangLiangValue.CommandType_FCS;
var q1 = Newtonsoft.Json.JsonConvert.SerializeObject(w1);
CSRedisCacheHelper.Publish(CacheKey.InvokeHttpInterface, q1);
client1.ExecuteAsync(request1, (QQQ) =>
{
HttpStatusCode HHH = QQQ.StatusCode;
string FHS = QQQ.Content;
logger.Error("cancel PushData not data is" + FHS);
Interface3Log w2 = new Interface3Log();
w2.HotelCode = HotelCode;
w2.RoomNumber = RoomNo;
w2.TriggerTime = DateTime.Now;
w2.ActionData = new HttpActionData() { ResponseData = FHS };
w2.CommandType = ChangLiangValue.CommandType_FCS;
var q2 = Newtonsoft.Json.JsonConvert.SerializeObject(w2);
CSRedisCacheHelper.Publish(CacheKey.InvokeHttpInterface, q2);
});
}
public static void FCS_CancelOrderJob(string location_UUID, string PropertyUUID, string LoginUrl, string UserName, string PassWord, string code, string roomno, string OrderUUID = "")
{
try
{
if (string.IsNullOrEmpty(OrderUUID))
{
return;
}
if (!string.IsNullOrEmpty(location_UUID))
{
string Key = CacheKey.FCSToken;
var TokenTakeOut = CSRedisCacheHelper.Get_Partition<FCS_ReturnInfo>(Key, 1);
if (TokenTakeOut == null)
{
logger.Error("FCS login");
RR.Login(LoginUrl, UserName, PassWord, code, roomno);
}
else
{
logger.Error("FCS cancel push action data");
RR.JobCancelRequest(TokenTakeOut.data.access_token, LoginUrl, PropertyUUID, code, roomno, OrderUUID);
}
}
}
catch (Exception ex)
{
logger.Error("FCS PushData Error: " + ex.Message);
}
}
}
}