From c3517a2fe5b07644439a7919dd00128a1885fc6a Mon Sep 17 00:00:00 2001 From: CortexCore <2630229280@qq.com> Date: Fri, 31 May 2024 01:19:55 +0800 Subject: [PATCH] 1 --- Components/App.razor | 1 + Components/DynamicTags.razor | 2 +- Components/Layout/NavMenu.razor | 4 +- Components/Pages/FAQ.razor | 19 +++- Components/Pages/OneClickRegistration.razor | 53 +++++++++ Components/Pages/PrefixQuery.razor | 81 ++++++++++++- Components/Pages/Query.razor | 28 ++++- ...stration.razor => QueryRegistration.razor} | 0 Components/Pages/Register.razor | 91 +++++++++------ Components/Pages/Signature.razor | 106 ++++++++++++++++++ Components/_Imports.razor | 2 +- Data/OneClickRegister.cs | 101 +++++++++++++++++ Program.cs | 2 + Properties/launchSettings.json | 2 +- appsettings.json | 5 + 15 files changed, 452 insertions(+), 45 deletions(-) create mode 100644 Components/Pages/OneClickRegistration.razor rename Components/Pages/{LatestRegistration.razor => QueryRegistration.razor} (100%) create mode 100644 Components/Pages/Signature.razor create mode 100644 Data/OneClickRegister.cs diff --git a/Components/App.razor b/Components/App.razor index c246f05..ed75a98 100644 --- a/Components/App.razor +++ b/Components/App.razor @@ -20,6 +20,7 @@ + diff --git a/Components/DynamicTags.razor b/Components/DynamicTags.razor index 5cfe6b9..44bf396 100644 --- a/Components/DynamicTags.razor +++ b/Components/DynamicTags.razor @@ -25,7 +25,7 @@ public Action OnSelectedChipsChanged { get; set; } private List values { get; set; }= new() { - "oder","material","device","procedure","product" + "oder","material","product","device","procedure", }; public void Add() { diff --git a/Components/Layout/NavMenu.razor b/Components/Layout/NavMenu.razor index 167de36..d049a93 100644 --- a/Components/Layout/NavMenu.razor +++ b/Components/Layout/NavMenu.razor @@ -2,7 +2,9 @@ 主页 解析标识 注册标识模板 - 注册标识 + 注册标识 + 签名标识 + 一键注册 注册企业 前缀查询 diff --git a/Components/Pages/FAQ.razor b/Components/Pages/FAQ.razor index 40130a1..8d328a3 100644 --- a/Components/Pages/FAQ.razor +++ b/Components/Pages/FAQ.razor @@ -3,8 +3,20 @@ + 我从哪里开始? + IDIS.Server.Console + + + + 现在就给我文档 + 【腾讯文档】标识解析附件1 SNMS-API-1.2.6 + 请注意,该文档的版本是v1,源自于冰河时期的文档 + + + 如何通过标签查询标识 - http://host:port/api/GetQueryByTag?tags=tag1;tag2;tag3&today=false + http://host:port/api/query/by?tags=tag1;tag2;tag3&today=false + tags使用;分隔多个标签 today是可选参数 @@ -23,7 +35,10 @@ 我怎么知道这些Tag是啥子东西 YL106.Models - + + + 非常方便的快捷方式 + 例如,在涉及到工单PZK20240510的所有标识下,注册的时候可以添加标签oder_20240510来方便查询该工单下的所有标识 仓库注册解析操作标识最新十条 注册记录 diff --git a/Components/Pages/OneClickRegistration.razor b/Components/Pages/OneClickRegistration.razor new file mode 100644 index 0000000..8c5eae8 --- /dev/null +++ b/Components/Pages/OneClickRegistration.razor @@ -0,0 +1,53 @@ +@page "/OneClickRegistration" +@using IDIS.Client.Web.Data +@using IDIS.Models +@using IDIS.Services +@using Cysharp.Threading.Tasks +@inject IDIS_TemplateService templateService +@inject OneClickRegister register +@inject IDialogService dialogService +一键注册 +选择需要的项目,对生产过程中产生的标识进行一键注册 +在生产过程中,更新对应的标识即可 + + + + 快速注册 + + + + @foreach (var (name,template) in registerTemplates) + { + + } + + + 一键注册 + + + + + +@code { + private Dictionary registerTemplates { get; set; }= new(); + private string registerTemplate { get; set; } + private string registerName { get; set; } + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (!firstRender) return; + await Rebuild(); + await InvokeAsync(StateHasChanged); + } + private async UniTask Rebuild() + { + registerTemplates = await register.GetAllTemplate(); + } + + private async void Register() + { + await register.Register(registerTemplate,registerName); + dialogService.ShowMessageBox("注册成功", "注册成功").AndForget(); + + await InvokeAsync(StateHasChanged); + } +} \ No newline at end of file diff --git a/Components/Pages/PrefixQuery.razor b/Components/Pages/PrefixQuery.razor index 525c348..741fba4 100644 --- a/Components/Pages/PrefixQuery.razor +++ b/Components/Pages/PrefixQuery.razor @@ -1,6 +1,85 @@ @page "/Enterprise/Query" -

使用管理员账户登录查看

+@using BITKit +@using IDIS.Models +@inject IDIS_EnterpriseService enterpriseService +

企业查询

+ + + @CurrentReport + + + + 前缀名称 + 前缀创建时间 + 前缀注册服务机构 + 前缀状态 + 企业中文名称 + 企业官方地址 + 企业所属行业 + 企业中文地址 + 企业简介 + + + @queryData.Prefix + @queryData.CreateDate + @queryData.GhrName + @queryData.Status + @queryData.EntNameCn + @queryData.EntSite + @queryData.EntIndustry + @queryData.EntAddrCn + @queryData.EntDesc + + + + + @code { + private string Prefix { get; set; } = "88.123.99"; + + private readonly ValidHandle _isBusy = new(); + private IDIS_EnterpriseData queryData { get; set; } = new IDIS_EnterpriseData(); + + private string CurrentReport { get; set; } = "查询一个前缀开始"; + private Severity Severity { get; set; } = Severity.Normal; + + protected override void OnAfterRender(bool firstRender) + { + if(!firstRender)return; + + _isBusy.AddListener(x=>InvokeAsync(StateHasChanged).AndForget()); + } + + private async void QueryInternal() + { + CurrentReport = "正在查询..."; + Severity = Severity.Info; + _isBusy.AddElement(this); + + try + { + queryData = await enterpriseService.GetEnterpriseAsync(Prefix); + + CurrentReport = "查询成功"; + Severity = Severity.Success; + } + catch (Exception e) + { + CurrentReport = e.Message; + Severity = Severity.Error; + } + + _isBusy.RemoveElement(this); + } } \ No newline at end of file diff --git a/Components/Pages/Query.razor b/Components/Pages/Query.razor index ec001fe..dbc767c 100644 --- a/Components/Pages/Query.razor +++ b/Components/Pages/Query.razor @@ -1,4 +1,5 @@ @page "/Query" +@page "/query/{handle?}" @inject IDIS_Service service @inject IDIS_TemplateService templateService @inject ISnackbar snackbar @@ -8,7 +9,7 @@ - @templateItem.Name + @templateItem.Name - @x.Data.Value + @if (x.Data.Value.Contains("data:image")) + { + + } + else + { + @x.Data.Value + } } @@ -42,11 +50,21 @@ } @code { - private string handle { get; set; } + [Parameter] + public string handle { get; set; } private IDIS_Query_Data queryData { get; set; }= new IDIS_Query_Data(); private IDIS_Template template { get; set; } = new IDIS_Template(); private string currentMessage { get; set; } = "从解析一个标识开始"; private Severity severity { get; set; } = Severity.Normal; + + protected override void OnAfterRender(bool firstRender) + { + if (!firstRender) return; + if (string.IsNullOrEmpty(handle) is false) + { + QueryInternal(); + } + } private async void QueryInternal() { try @@ -58,13 +76,13 @@ currentMessage = "查询成功"; severity = Severity.Success; - await InvokeAsync(StateHasChanged); } catch (Exception e) { currentMessage = e.Message; severity = Severity.Error; } + await InvokeAsync(StateHasChanged); } } \ No newline at end of file diff --git a/Components/Pages/LatestRegistration.razor b/Components/Pages/QueryRegistration.razor similarity index 100% rename from Components/Pages/LatestRegistration.razor rename to Components/Pages/QueryRegistration.razor diff --git a/Components/Pages/Register.razor b/Components/Pages/Register.razor index b5efd73..8c51799 100644 --- a/Components/Pages/Register.razor +++ b/Components/Pages/Register.razor @@ -11,8 +11,9 @@ @inject IDIS_EnterpriseService enterpriseService @inject IDIS_Service service @inherits OwningComponentBase -注册标识 -当我们创建标识模板后
我们就可以通过标识模板快速注册标识
+注册与更新标识 +当我们创建标识模板后,我们就可以通过标识模板,快速注册与更新标识 +如果需要更新标识,只需要填写需要更新的值 @@ -42,42 +43,51 @@ 注册值 - @for(var index=0;index<_valueInfo.Length;index++) - { - var i = index; - var templateInfo = this.template.Items[index]; - - @* @if (templateInfo.MetaData.Type is ("dateTime" or "DateTime")) *@ - @* { *@ - @* $1$ #1# *@ - @* *@ - @* } *@ - @* else *@ + @for (var index = 0; index < _valueInfo.Length; index++) { - + var i = index; + var templateInfo = this.template.Items[index]; + + + @if (regOrUpdate) + { + + } + + @if (templateInfo.MetaData.Type is ("dateTime" or "DateTime")) + { + + } + else + { + + } + } - } + @if (string.IsNullOrEmpty(currentMessage) is false) { @currentMessage } -
- 注册标识:@handle -
+ + 注册或更新 + @(regOrUpdate?"注册或更新标识":"注册标识") :@handle +
@@ -86,7 +96,9 @@ { public DateTime? Value { get; set; } = DateTime.Now; } - + private List dateTimeProxies { get; set; } = new(); + private bool[] updateFlags { get; set; } = Array.Empty(); + private Reference templateSelector { get; set; } = new(); private IDIS_Template template = new IDIS_Template(); @@ -98,6 +110,8 @@ private string handle_code { get; set; } = DateTime.Now.Ticks.ToString(); private string generatedHandleCode { get; set; } = DateTime.Now.Ticks.ToString(); private string handle=> $"{prefix_c}.{prefix_p}.{prefix_e.Split("(").Last().Split(")").First()}/{handle_code}"; + + private bool regOrUpdate { get; set; } private string currentMessage { get; set; } = string.Empty; private IDIS_Enterprise.EnterpriseInfo[] enterprises { get; set; } = Array.Empty(); @@ -119,6 +133,8 @@ { template = newValue; _valueInfo = new IDIS_Register_Data.ValueInfo[template.Items.Length]; + dateTimeProxies.Clear(); + updateFlags = new bool[template.Items.Length]; for (var index = 0; index < template.Items.Length; index++) { var x = template.Items[index]; @@ -135,6 +151,7 @@ if(x.MetaData.Type is ("dateTime" or "DateTime")) info.Data.Value = DateTime.Now.ToString(CultureInfo.InvariantCulture); _valueInfo[index] = info; + dateTimeProxies.Add(new DateTimeProxy()); } InvokeAsync(StateHasChanged).AndForget(); } @@ -149,6 +166,14 @@ { throw new Exception($"标识格式错误,正则表达式为{IDIS_Code.AddressRegex}"); } + for (var index = 0; index < template.Items.Length; index++) + { + var x = template.Items[index]; + if (x.MetaData.Type is ("dateTime" or "DateTime")) + { + _valueInfo[index].Data.Value = dateTimeProxies[index].Value!.ToString()!; + } + } await service.RegisterAsync(handle, template.Version, _valueInfo); currentMessage = "注册成功,标识码为:\n" + handle; severity=Severity.Success; @@ -170,7 +195,7 @@ { try { - enterprises = await enterpriseService.GetEnterpriseAsync(); + enterprises = await enterpriseService.GetEnterprisesAsync(); return enterprises .Select(x =>$"{x.NameCN}({x.Prefix.Split(".")[2]})") .Where(x => x.Contains(arg)) diff --git a/Components/Pages/Signature.razor b/Components/Pages/Signature.razor new file mode 100644 index 0000000..f764fb9 --- /dev/null +++ b/Components/Pages/Signature.razor @@ -0,0 +1,106 @@ +@page "/Signature" +@using Ril.BlazorSignatureCanvas +@using IDIS.Services +@using SkiaSharp +@inject IDIS_Service service + +在线签名 +我们把签名写入标识中,用于其他应用通过解析标识,获取来自边缘终端的签名 + + + + + + + + + + + 清除签名 + + 保存签名 + + + + @message + + + + + + +@code { + private string handle { get; set; } = string.Empty; + string type { get; set; } = "signature"; + + SignatureCanvas signatureCanvas { get; set; } + + private string message { get; set; } = "等待注册中"; + private Severity severity { get; set; } = Severity.Normal; + + protected override void OnAfterRender(bool firstRender) + { + if(!firstRender)return; + { + if(BITKit.Data.TryGetValue("Signature.DefaultHandle",out var value)) + { + handle = value; + } + } + { + if(BITKit.Data.TryGetValue("Signature.DefaultType",out var value)) + { + type = value; + } + } + StateHasChanged(); + } + + async Task HandleClear() + { + await signatureCanvas.Clear(); + } + + async Task HandleSave() + { + message = "正在更新标识"; + severity = Severity.Normal; + await InvokeAsync(StateHasChanged); + + using var bitmap = SKBitmap.Decode(await signatureCanvas.ToByteArray()); + using var signBitMap = SKBitmap.Decode(await signatureCanvas.ToByteArray()); + using var canvas = new SKCanvas(bitmap); + canvas.Clear(SKColors.White); + canvas.DrawBitmap(signBitMap, new SKPoint()); + + using var rotatedData = bitmap.Encode(SKEncodedImageFormat.Png, 40); + + using var newMs = new MemoryStream(); + rotatedData.SaveTo(newMs); + + var data = Convert.ToBase64String(newMs.ToArray()); + + data = "data:image/png;base64," + data; + + try + { + await service.UpdateAsync(handle,new Dictionary() + { + {type,data}, + }); + message = "更新成功"; + severity = Severity.Success; + } + catch (Exception e) + { + message = e.Message; + severity = Severity.Error; + } + await InvokeAsync(StateHasChanged); + } +} diff --git a/Components/_Imports.razor b/Components/_Imports.razor index 25f03fa..63bec85 100644 --- a/Components/_Imports.razor +++ b/Components/_Imports.razor @@ -10,4 +10,4 @@ @using IDIS.Client.Web @using IDIS.Client.Web.Components @using MudBlazor -@using MudBlazor.Services \ No newline at end of file +@using MudBlazor.Services diff --git a/Data/OneClickRegister.cs b/Data/OneClickRegister.cs new file mode 100644 index 0000000..80c01cd --- /dev/null +++ b/Data/OneClickRegister.cs @@ -0,0 +1,101 @@ +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Net; +using System.Reflection.Metadata; +using System.Text.RegularExpressions; +using BITKit; +using Cysharp.Threading.Tasks; +using IDIS.Models; +using IDIS.Services; +using IDIS.Services.Models; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Org.BouncyCastle.Security; + +namespace IDIS.Client.Web.Data; + +public record OneClickRegisterData +{ + public string Name; + public string Prefix; + public Dictionary Dictionary; +} + +public class OneClickRegister:DbContext +{ + [Keyless] + public class Info + { + public string Name { get; set; } + public string Json { get; set; } + } + [Keyless] + public class SavedInfo:Info + { + + } + private readonly IDIS_Service _service; + + public OneClickRegister(IDIS_Service service) + { + _service = service; + } + public DbSet oneClickTemplates { get; set; } + public DbSet oneClickRegisters { get; set; } + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + var connectionString = BITKit.Data.Get("DefaultConnection"); + + optionsBuilder.UseMySQL(connectionString); + } + public async UniTask> GetAllTemplate() + { + var array = await oneClickTemplates.ToArrayAsync(); + return array.ToDictionary(info => info.Name, info => JsonConvert.DeserializeObject(info.Json)!); + } + public async UniTask CreateTemplate(string name,string prefix,Dictionary dictionary) + { + var _all =await GetAllTemplate(); + if(_all.ContainsKey(name)) + throw new ArgumentException("模板已存在"); + oneClickTemplates.Add(new Info{Name = name,Json = JsonConvert.SerializeObject(new OneClickRegisterData{Name = name,Prefix = prefix,Dictionary = dictionary})}); + await SaveChangesAsync(); + } + public async UniTask DeleteTemplate(string name) + { + oneClickTemplates.RemoveRange(oneClickTemplates.Where(x => x.Name == name)); + await SaveChangesAsync(); + } + public async UniTask Register(string templateName,string name) + { + if (string.IsNullOrEmpty(name)) + { + name = DateTime.Now.ToString(CultureInfo.InvariantCulture); + } + var _all =await GetAllTemplate(); + if(_all.TryGetValue(templateName,out var template) is false) + throw new ArgumentException($"未找到模板:{templateName}"); + var tick = DateTime.Now.Ticks; + var export = new OneClickRegisterData + { + Name = name, + Prefix = template.Prefix, + Dictionary = new(), + }; + foreach (var (entryName,templateVersion) in template.Dictionary) + { + var handle = $"{template.Prefix}/{tick++}"; + await _service.RegisterAsync(handle,templateVersion,Array.Empty()); + export.Dictionary.Add(entryName,handle); + } + + await oneClickRegisters.AddAsync(new SavedInfo{Name = name,Json = JsonConvert.SerializeObject(export)}); + await SaveChangesAsync(); + + return export; + } +} \ No newline at end of file diff --git a/Program.cs b/Program.cs index 7d97266..34e32bc 100644 --- a/Program.cs +++ b/Program.cs @@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using IDIS.Client.Web.Components; +using IDIS.Client.Web.Data; using IDIS.Models; using IDIS.Services; using MudBlazor.Services; @@ -28,6 +29,7 @@ builder.Services.AddMudServices(); builder.Services.AddCascadingAuthenticationState(); +builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); diff --git a/Properties/launchSettings.json b/Properties/launchSettings.json index a4591a8..dc18129 100644 --- a/Properties/launchSettings.json +++ b/Properties/launchSettings.json @@ -13,7 +13,7 @@ "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": false, - "applicationUrl": "http://localhost:5150", + "applicationUrl": "http://localhost:5150;http://localhost:5151", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/appsettings.json b/appsettings.json index 45d5ab6..c16cd66 100644 --- a/appsettings.json +++ b/appsettings.json @@ -6,5 +6,10 @@ } }, "DefaultConnection":"server=server.bitfall.icu;port=3306;database=ifactory;uid=ifactory;password=JdBfKR2dxhm76Ss2;", + "Urls":"http://+:5150", + "Signature": { + "DefaultHandle": "88.123.99/638514755153927653", + "DefaultType": "base64" + }, "AllowedHosts": "*" }