using Microsoft.AspNetCore.Authorization; 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 Wood.Entity; namespace TaskManager.Controllers { [AllowAnonymous] public class RecurringJobBaseController :ControllerBase, IDoExecute, IScoped { protected string appKey = "8EG566b9bedd2bf46d"; protected string appSecret = "48edc4425647425d87f806a1ba492580"; protected readonly HttpClient _httpClient; protected readonly JobDbContext _jobDbContext; protected string Client { set; get; } = "Wood"; protected string Path { set; get; } = "/v2/get/supplierProPlaning"; protected string Url { set; get; } = "/v2/get/supplierProPlaning"; protected int CPageSize { set; get; } = 1000; 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, Guid taskid, string version) { try { await _logger.AddPostRequest("请求", TaskName, taskid, version, jsonData); // 生成签名参数 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(); // 抛出异常处理状态码 var str = await response.Content.ReadAsStringAsync(); await _logger.AddPostResponse("响应", TaskName, taskid, version, str); return str; } catch (HttpRequestException ex) { await _logger.AddError(ex.Message, this.TaskName, taskid, version); //error = ex.Message; return string.Empty; } ////string jsonContent = System.IO.File.ReadAllText("采购订单.json"); //// string jsonContent = System.IO.File.ReadAllText("过焊装未过总装.json"); //// string jsonContent = System.IO.File.ReadAllText("计划协议.json"); ////string jsonContent = System.IO.File.ReadAllText("奇瑞RDC共享库存.json"); ////string jsonContent4 = System.IO.File.ReadAllText("日MRP状态监控.json"); //string jsonContent = System.IO.File.ReadAllText("日物料需求计划.json"); ////string jsonContent = System.IO.File.ReadAllText("整车月度生产计划1.json"); ///string jsonContent = System.IO.File.ReadAllText("M+6月物料需求计划1.json"); //string jsonContent = System.IO.File.ReadAllText("过涂装未过总装.json"); //return jsonContent; } 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); } [NonAction] public async Task ExecuteAsync(string url, string path, string taskName,string client,int pageSize) { var str = DateTime.Now.ToLongTimeString(); await BeforeExecuteAsync(str); await DoExecutingAsync(url, path, taskName,client,pageSize); await AfterExecuteAsync(str); } protected async virtual Task DoExecutingAsync(string url, string path, string takName,string client,int pageSize) { } protected static string RemoveWhitespace(string input) { if (string.IsNullOrEmpty(input)) return input; // 使用正则表达式移除空格和换行 return Regex.Replace(input, @"[\s]+", ""); } } }