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; 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; } /// /// 提交给接口 /// /// /// 录入DTOJson /// 返回DTOJson protected async Task 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}×tamp={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]+", ""); } } }