CommonService.cs 15.9 KB
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Hh.Mes.Common.Json;
using Hh.Mes.Pojo.System;
using HHECS.Application.ApiModel;
using HHECS.Application.Service;
using HHECS.BllModel;
using HHECS.Infrastructure.CommonHelper;
using HHECS.Infrastructure.Enums;
using HHECS.Model.Entities;
using HHECS.Model.Enums;
using Newtonsoft.Json;
using NPOI.SS.Formula.Functions;
using Ubiety.Dns.Core.Common;

namespace HHECS.BLL.Services
{
    public class CommonService : BaseService
    {
        private readonly LogService logService = new LogService();

        /// <summary>
        /// 静态单例,在全生命周期中使用
        /// </summary>
        private static readonly HttpClient client = new HttpClient();

        //public CommonService(LogService logService)
        //{
        //    this.logService = logService;
        //}

        /// <summary>
        /// keyvalue键值对请求,要求以json返回
        /// </summary>
        /// <param name="list"></param>
        /// <param name="url"></param>
        /// <returns></returns>
        public async Task<BllResult<T>> FormPostAsync<T>(string title, string url, List<KeyValuePair<string, string>> list, int timeout = 5)
        {
            string poststr = string.Join("||", list.Select(t => t.Key + ":" + t.Value).ToArray());
            string responseBody = "";
            try
            {
                HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, url);
                httpRequestMessage.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
                httpRequestMessage.Headers.Add("Origin", "https://localhost:5001");
                httpRequestMessage.Headers.Add("Referer", "https://localhost:5001/Home/Index");
                httpRequestMessage.Content = new FormUrlEncodedContent(list);
                CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(timeout));
                var ret = await client.SendAsync(httpRequestMessage, cancellationTokenSource.Token).ConfigureAwait(false);
                if (ret.IsSuccessStatusCode)
                {
                    responseBody = await ret.Content.ReadAsStringAsync();
                    var b = JsonConvert.DeserializeObject<ResponseModel<T>>(responseBody);
                    if (b.Code == "200")
                    {
                        logService.LogInterface(title, poststr, responseBody, Level.Success, "", "");
                        return BllResultFactory.Success<T>(b.Data, b.Msg);
                    }
                    else
                    {
                        logService.LogInterface(title, poststr, responseBody, Level.Failure, "", "");
                        return BllResultFactory.Error<T>( b.Msg);
                    }
                }
                else
                {
                    logService.LogInterface(title, poststr, "", Level.Failure, ret.ReasonPhrase, "");
                    return BllResultFactory.Error<T>( $"请求WMS失败,请检查网络连接,详情:{ret.ReasonPhrase}");
                }
            }
            catch (Exception ex)
            {
                logService.LogInterface(title, poststr, responseBody, Level.Exception, ex.ToString(), "");
                return BllResultFactory.Error<T>( $"请求WMS失败,详情:{ex.Message}");
            }
        }

        /// <summary>
        /// 根据类型T 进行Post Json 提交
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="title"></param>
        /// <param name="url"></param>
        /// <param name="obj"></param>
        /// <returns></returns>
        public async Task<BllResult<T>> PostJson<T>(string title, string url, Object obj, int timeout = 5)
        {
            string postJsonString = JsonConvert.SerializeObject(obj);
            string responseBody = "";
            try
            {
                StringContent content = new StringContent(postJsonString, Encoding.UTF8, "application/json");
                CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(timeout));
                HttpResponseMessage response = await client.PostAsync(url, content, cancellationTokenSource.Token).ConfigureAwait(false);
                if (response.IsSuccessStatusCode)
                {
                    responseBody = await response.Content.ReadAsStringAsync();
                    var temp = JsonConvert.DeserializeObject<ResponseModel<T>>(responseBody);
                    if (temp.Code == "200")//成功
                    {
                        logService.LogInterface(title, postJsonString, responseBody, Level.Success, "", "");

                        return BllResultFactory.Success<T>(temp.Data);
                    }
                    else
                    {
                        logService.LogInterface(title, postJsonString, responseBody, Level.Failure, "", "");
                        return BllResultFactory.Error<T>(temp.Data, temp.Msg);
                    }
                }
                else
                {
                    logService.LogInterface(title, postJsonString, "", Level.Failure, "", "");
                    return BllResultFactory.Error<T>($"请求失败:{response.ReasonPhrase}");
                }

            }
            catch (Exception ex)
            {
                logService.LogInterface(title, postJsonString, responseBody, Level.Exception, ex.ToString(), "");
                return BllResultFactory.Error<T>($"请求失败:{ex.Message}");
            }
        }


        public async Task<BllResult<T>> PostJson<T>(string title, string url, Object obj, string Origin , string Referer ,int timeout = 5)
        {
            string postJsonString = JsonConvert.SerializeObject(obj);
            string responseBody = "";
            try
            {
                HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, url);
                httpRequestMessage.Headers.Add("Origin", Origin);
                httpRequestMessage.Headers.Add("Referer", Referer);
                httpRequestMessage.Content = new StringContent(postJsonString, Encoding.UTF8, "application/json");
                CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(timeout));
                HttpClient client1 = new HttpClient();
                var ret = await client1.SendAsync(httpRequestMessage, cancellationTokenSource.Token).ConfigureAwait(false);
                if (ret.IsSuccessStatusCode)
                {
                    responseBody = await ret.Content.ReadAsStringAsync();
                    var b = JsonConvert.DeserializeObject<ResponseModel<T>>(responseBody);
                    if (b.Code == "200")
                    {
                        logService.LogInterface(title, postJsonString, responseBody, Level.Success, "", "");
                        return BllResultFactory.Success<T>(b.Data, b.Msg);
                    }
                    else
                    {
                        logService.LogInterface(title, postJsonString, responseBody, Level.Failure, "", "");
                        return BllResultFactory.Error<T>( b.Msg);
                    }
                }
                else
                {
                    logService.LogInterface(title, postJsonString, "", Level.Failure, ret.ReasonPhrase, "");
                    return BllResultFactory.Error<T>( $"请求WMS失败,请检查网络连接,详情:{ret.ReasonPhrase}");
                }
            }
            catch (Exception ex)
            {
                logService.LogInterface(title, postJsonString, responseBody, Level.Exception, ex.ToString(), "");
                return BllResultFactory.Error<T>( $"请求WMS失败,详情:{ex.Message}");
            }
        }


        /// <summary>
        /// http  
        /// </summary>
        public BllResult HttpMan(string url, dynamic requestData, string title, string method = "post", string contentType = "application/json", string token = null)
        {
            var stopwatch = new Stopwatch();
            stopwatch.Start();
            //var response = new Response(false);
            dynamic postdata = requestData;
            if (!(requestData is string))
            {
                postdata = JsonConvert.SerializeObject(requestData);
            }
            var httpItem = new HttpItem
            {
                URL = url,
                Method = method,
                ContentType = contentType,
                Postdata = postdata,
                Timeout = 80000
            };

            if (!string.IsNullOrEmpty(token))
            {
                //雷萨token key
                httpItem.Header.Add("Authorization", token);
            }
            var httpHelper = new HttpHelper();
            var httpResult = httpHelper.GetHtml(httpItem);
            stopwatch.Stop();
            var resultMsg = title + ",返回结果:" + httpResult.Html;
            if (httpResult.StatusCode== HttpStatusCode.OK)
            {
                var b = JsonConvert.DeserializeObject<Response>(httpResult.Html);
                if (b.Code == 200)
                {
                    var Result = new
                    {
                        Batch = b.Result.Batch,
                        MaterialCode = b.Result.MaterialCode
                    };
                    logService.LogInterface(title, postdata, resultMsg, Level.Success, "", "");
                    return BllResultFactory.Success(Result,b.Message);
                }
                else
                {
                    logService.LogInterface(title, postdata, resultMsg, Level.Failure, "", "");
                    return BllResultFactory.Error<T>(b.Message);
                }
            }
            else
            {
                logService.LogInterface(title, postdata, "", Level.Failure, "", "");
                return BllResultFactory.Error<T>($"请求WMS失败,请检查网络连接,详情:{""}");
            }
        }

        public Response HttpMan2(string url, dynamic requestData, string title, string method = "post", string contentType = "application/json", string token = null)
        {
            var stopwatch = new Stopwatch();
            stopwatch.Start();
            var response = new Response(false);
            dynamic postdata = requestData;
            if (!(requestData is string))
            {
                postdata = JsonConvert.SerializeObject(requestData);
            }
            var httpItem = new HttpItem
            {
                URL = url,
                Method = method,
                ContentType = contentType,
                Postdata = postdata,
                Timeout = 80000
            };

            if (!string.IsNullOrEmpty(token))
            {
                //雷萨token key
                httpItem.Header.Add("Authorization", token);
            }
            var httpHelper = new HttpHelper();
            var httpResult = httpHelper.GetHtml(httpItem);
            response.Result = httpResult.Html;
            stopwatch.Stop();
            var resultMsg = title + ",返回结果:" + httpResult.Html;
            if (httpResult.StatusCode == HttpStatusCode.OK)
            {
                var b = JsonConvert.DeserializeObject<Response>(httpResult.Html);
                if (b.Code == 200)
                {
                    response.Result = b.Result;
                    logService.LogInterface(title, postdata, resultMsg, Level.Success, "", "");
                    return response.ResponseSuccess("请求返回成功");
                }
                else
                {
                    logService.LogInterface(title, postdata, resultMsg, Level.Failure, "", "");
                    return response.ResponseError(resultMsg);
                }
            }
            else
            {
                logService.LogInterface(title, postdata, "", Level.Failure, "", "");
                return response.ResponseError($"请求WMS失败,请检查网络连接,详情:{""}");
            }
        }

        /// <summary>
        /// http  
        /// </summary>
        public Response HttpMan1(string url, dynamic requestData, string title, string method = "post", string contentType = "application/json", string token = null)
        {
            var stopwatch = new Stopwatch();
            stopwatch.Start();
            var response = new Response(false);
            dynamic postdata = requestData;
            if (!(requestData is string))
            {
                postdata = JsonConvert.SerializeObject(requestData);
            }
            var httpItem = new HttpItem
            {
                URL = url,
                Method = method,
                ContentType = contentType,
                Postdata = postdata,
                Timeout = 80000
            };

            if (!string.IsNullOrEmpty(token))
            {
                //雷萨token key
                httpItem.Header.Add("Authorization", token);
            }
            var httpHelper = new HttpHelper();
            var httpResult = httpHelper.GetHtml(httpItem);
            response.Result = httpResult.Html;
            stopwatch.Stop();
            var resultMsg = title + ",返回结果:" + httpResult.Html;
            //var user = sysUserApi == null ? (sysWebUser == null ? "定时器" : sysWebUser.Account) : sysUserApi.Account;
            //QueueInterLog.GetInstance.EnqueueInterLog(httpItem, httpResult, title, resultMsg, stopwatch.Elapsed.TotalMilliseconds, user: user, sysTitle: title);

            if (httpResult.StatusCode == HttpStatusCode.OK)
            {
                //根据实际情况处理
                var resultTemp = httpResult.Html.TrimStart('[').TrimEnd(']');
                dynamic result = DynamicJson.Parse(resultTemp);
                if (result == null)
                {
                    logService.LogInterface(title, postdata, resultMsg, Level.Failure, "", "");
                    return response.ResponseError(resultMsg);
                }

                //请求返回成功 
                var isExtCode = result.IsDefined("code");
                if (isExtCode)
                {
                    if (result.code == 0 || result.code == 200) return response.ResponseSuccess("请求返回成功");
                }

                var isExtCodeGet = result.IsDefined("Code");
                if (isExtCodeGet)
                {
                    if (result.Code == 0 || result.Code == 200) return response.ResponseSuccess("请求返回成功");
                }

                //雷萨MOM请求返回成功
                var isExtFlag = result.IsDefined("flag");
                if (isExtFlag && result.flag == "1")
                {
                    return response.ResponseSuccess("请求返回成功");
                }

                //agv请求返回成功
                var isExtState = result.IsDefined("state");
                if (isExtState && result.state)
                {
                    return response.ResponseSuccess("请求返回成功");
                }
            }
            if (httpResult.StatusCode == HttpStatusCode.InternalServerError)
            {
                response.Message = resultMsg;
                logService.LogInterface(title, postdata, resultMsg, Level.Failure, "", "");
                return response;
            }
            else if (httpResult.StatusCode == HttpStatusCode.NotFound)
            {
                response.Message = "url:" + httpItem.URL + "错误、请求地址未找到404" + resultMsg;
                logService.LogInterface(title, postdata, resultMsg, Level.Failure, "", "");
                return response;
            }
            logService.LogInterface(title, postdata, resultMsg, Level.Failure, "", "");
            response.Message = resultMsg;
            return response;
        }
    }
}