From 8e8d81c4f58a9f3e1de66f978bb687c042ec6a63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=A6=20=E8=B5=B5?= <89237069@qq.com> Date: Fri, 30 May 2025 17:25:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Migrations/JobDbContextModelSnapshot.cs | 87 ++++++++ .../CheryRecurringJobInputPageController.cs | 2 +- .../CheryRecurringJobOutPageController.cs | 2 +- .../Controllers/RecurringJobBaseController.cs | 195 ++++++++++++++++++ 4 files changed, 284 insertions(+), 2 deletions(-) create mode 100644 API/Wood.Service/Controllers/RecurringJobBaseController.cs diff --git a/API/TaskManager.EntityFramework/Migrations/JobDbContextModelSnapshot.cs b/API/TaskManager.EntityFramework/Migrations/JobDbContextModelSnapshot.cs index ebdafe6..d5bf50c 100644 --- a/API/TaskManager.EntityFramework/Migrations/JobDbContextModelSnapshot.cs +++ b/API/TaskManager.EntityFramework/Migrations/JobDbContextModelSnapshot.cs @@ -3010,6 +3010,93 @@ namespace TaskManager.EntityFramework.Migrations b.ToTable("SUPPLIER_MRP_STATE"); }); + modelBuilder.Entity("TaskManager.Entity.SUPPLIER_MRP_WARNING", b => + { + b.Property("UId") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("UId")); + + b.Property("CreateByUser") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("CreateTime") + .HasColumnType("datetime2"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("DateGap") + .HasColumnType("decimal(18,2)"); + + b.Property("Id") + .HasColumnType("nvarchar(max)"); + + b.Property("InventoryGap") + .HasColumnType("decimal(18,2)"); + + b.Property("IsDelete") + .HasColumnType("int"); + + b.Property("MaterialCode") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("MaterialDescription") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("PlantId") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("QuantityCurrent") + .HasColumnType("decimal(18,2)"); + + b.Property("QuantityInTransit") + .HasColumnType("decimal(18,2)"); + + b.Property("QuantityPlanned") + .HasColumnType("decimal(18,2)"); + + b.Property("QuantityPlannedDelivery") + .HasColumnType("decimal(18,2)"); + + b.Property("ReadState") + .HasColumnType("bit"); + + b.Property("ReckonDate") + .HasColumnType("datetime2"); + + b.Property("Remark") + .HasColumnType("nvarchar(max)"); + + b.Property("RequestDate") + .HasColumnType("nvarchar(max)"); + + b.Property("TaskId") + .HasColumnType("uniqueidentifier"); + + b.Property("UpdateByUser") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("UpdateTime") + .HasColumnType("datetime2"); + + b.Property("Version") + .HasColumnType("int"); + + b.Property("WriteState") + .HasColumnType("bit"); + + b.HasKey("UId"); + + b.ToTable("SUPPLIER_MRP_WARNING"); + }); + modelBuilder.Entity("TaskManager.Entity.SUPPLIER_PO", b => { b.Property("UId") diff --git a/API/Wood.Service/Controllers/CheryRecurringJobInputPageController.cs b/API/Wood.Service/Controllers/CheryRecurringJobInputPageController.cs index 77de8ca..c3cc2e7 100644 --- a/API/Wood.Service/Controllers/CheryRecurringJobInputPageController.cs +++ b/API/Wood.Service/Controllers/CheryRecurringJobInputPageController.cs @@ -18,7 +18,7 @@ using TaskManager.EntityFramework.Repository; namespace TaskManager.Controllers { - public class CheryRecurringJobInputPageController : CheryRecurringJobBaseController where T : BaseEntity + public class CheryRecurringJobInputPageController : RecurringJobBaseController where T : BaseEntity { protected readonly IRepository _repository; public CheryRecurringJobInputPageController(HttpClient httpClient, JobDbContext jobDbContext, LogController log, IRepository repository) : base(httpClient, jobDbContext, log) diff --git a/API/Wood.Service/Controllers/CheryRecurringJobOutPageController.cs b/API/Wood.Service/Controllers/CheryRecurringJobOutPageController.cs index 95f3f54..cbff2ca 100644 --- a/API/Wood.Service/Controllers/CheryRecurringJobOutPageController.cs +++ b/API/Wood.Service/Controllers/CheryRecurringJobOutPageController.cs @@ -20,7 +20,7 @@ namespace TaskManager.Controllers { //[ApiController] //[Route("api/[controller]")] - public class CheryRecurringJobOutPageController : CheryRecurringJobBaseController where T : CherryReadBaseEntity, new() where ToutputDetial : CherryReadBaseEntityDto + public class CheryRecurringJobOutPageController : RecurringJobBaseController where T : CherryReadBaseEntity, new() where ToutputDetial : CherryReadBaseEntityDto { protected readonly IRepository _repository; public CheryRecurringJobOutPageController(HttpClient httpClient, JobDbContext jobDbContext, LogController log,IRepository repository) : base(httpClient, jobDbContext, log) diff --git a/API/Wood.Service/Controllers/RecurringJobBaseController.cs b/API/Wood.Service/Controllers/RecurringJobBaseController.cs new file mode 100644 index 0000000..e79084e --- /dev/null +++ b/API/Wood.Service/Controllers/RecurringJobBaseController.cs @@ -0,0 +1,195 @@ + +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; + + + + +namespace TaskManager.Controllers +{ + [AllowAnonymous] + public class RecurringJobBaseController :ControllerBase, IDoExecute + { + 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 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(); // 抛出异常处理状态码 + var str = await response.Content.ReadAsStringAsync(); + await _logger.AddInfoRemark("test", TaskName,str); + + return str; + } + 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); + } + [NonAction] + public async Task ExecuteAsync(string url, string path, string taskName,string client) + { + var str = DateTime.Now.ToLongTimeString(); + await BeforeExecuteAsync(str); + + await DoExecutingAsync(url, path, taskName,client); + + await AfterExecuteAsync(str); + + } + protected async virtual Task DoExecutingAsync(string url, string path, string takName,string client) + { + + + + + + + } + protected static string RemoveWhitespace(string input) + { + if (string.IsNullOrEmpty(input)) + return input; + // 使用正则表达式移除空格和换行 + return Regex.Replace(input, @"[\s]+", ""); + } + + + + + + + + + + } + + + + + +} + + + + + + + + + + + + + + +