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

175 lines
5.4 KiB

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using TaskManager.Entity;
using TaskManager.EntityFramework;
namespace TaskManager.Controllers
{
public class RecurringJobBaseController :ControllerBase, IDoExecute
{
protected string appKey = "8EG566b9bedd2bf46d";
protected string appSecret = "48edc4425647425d87f806a1ba492580";
protected readonly HttpClient _httpClient;
protected readonly JobDbContext _jobDbContext;
protected string Path { set; get; } = "/v2/get/supplierProPlaning";
protected string Url { set; get; } = "/v2/get/supplierProPlaning";
protected virtual string TaskName { set; get; } = "SupplierProPlaning";
protected readonly LogController _logger;
public RecurringJobBaseController(
HttpClient httpClient,
JobDbContext jobDbContext,
LogController log
)
{
_httpClient = new HttpClient();
_jobDbContext = jobDbContext;
_logger = log;
}
/// <summary>
/// 提交给接口
/// </summary>
/// <param name="url"></param>
/// <param name="jsonData">录入DTOJson</param>
/// <returns>返回DTOJson</returns>
protected async Task<string> Post(string url, string path, string jsonData)
{
try
{
// 生成签名参数
string timeStamp = GetCurrentTimestamp();
string nonce = GenerateNonce();
var sign = GenerateSign(HttpMethod.Post.Method, path, appKey, appSecret, timeStamp, nonce, jsonData);
// 构建请求
var request = new HttpRequestMessage(HttpMethod.Post, url);
request.Content = new StringContent(jsonData, Encoding.UTF8, "application/json");
request.Headers.Add("appKey", appKey);
request.Headers.Add("appSecret", appSecret);
request.Headers.Add("timestamp", timeStamp);
request.Headers.Add("sign", sign);
request.Headers.Add("nonce", nonce);
// 发送请求
var response = await _httpClient.SendAsync(request);
response.EnsureSuccessStatusCode(); // 抛出异常处理状态码
return await response.Content.ReadAsStringAsync();
}
catch (HttpRequestException ex)
{
await _logger.AddError(ex.Message, this.TaskName);
//error = ex.Message;
return string.Empty;
}
}
private string GenerateSign(string method, string path, string appKey, string appSecret, string timestamp, string nonce, string jsonBody)
{
string paramStr = $"method={method.ToUpper()}&path={path}&appKey={appKey}&appSecret={appSecret}&timestamp={timestamp}&nonce={nonce}&jsonBody={jsonBody}";
return ComputeSHA512(paramStr);
}
private string ComputeSHA512(string input)
{
using (SHA512 sha512 = SHA512.Create())
{
byte[] bytes = Encoding.UTF8.GetBytes(input);
byte[] hash = sha512.ComputeHash(bytes);
StringBuilder builder = new StringBuilder();
for (int i = 0; i < hash.Length; i++)
{
builder.Append(hash[i].ToString("x2")); // "x2" 表示小写十六进制
}
return builder.ToString();
}
}
private string GetCurrentTimestamp()
{
return ((long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds).ToString();
}
private string GenerateNonce()
{
const string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random random = new Random();
int length = random.Next(10, 51);
return new string(Enumerable.Repeat(chars, length)
.Select(s => s[random.Next(s.Length)]).ToArray());
}
private async Task BeforeExecuteAsync(string uid)
{
await _logger.AddInfo($"{TaskName}开始执行作业{uid}", TaskName);
}
private async Task AfterExecuteAsync(string uid)
{
await _logger.AddInfo($"{TaskName}结束执行作业{uid}", TaskName);
}
[HttpGet]
public async Task ExecuteAsync(string url, string path, string taskName)
{
var str = DateTime.Now.ToLongTimeString();
await BeforeExecuteAsync(str);
await DoExecutingAsync(url, path, taskName);
await AfterExecuteAsync(str);
}
protected async virtual Task DoExecutingAsync(string url, string path, string takName)
{
}
protected static string RemoveWhitespace(string input)
{
if (string.IsNullOrEmpty(input))
return input;
// 使用正则表达式移除空格和换行
return Regex.Replace(input, @"[\s]+", "");
}
}
}