From 9125b9804582dc7a47c0ed462e2b078f73fdddc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E9=B9=8F?= <304594656@qq.com> Date: Mon, 16 Dec 2024 16:09:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=9E=E6=94=B6=E8=AE=B0=E5=BD=95=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E5=B1=95=E7=A4=BA:=201.=E5=A2=9E=E5=8A=A0=E5=8D=95?= =?UTF-8?q?=E4=BB=B7/=E9=87=91=E9=A2=9D/=E6=93=8D=E4=BD=9C=E5=91=98?= =?UTF-8?q?=EF=BC=9B=202.=E6=94=AF=E6=8C=81=E7=94=A8=E6=88=B7=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E5=B1=95=E7=A4=BA=E5=88=97=EF=BC=9B=202.?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=AE=A1=E7=90=86=E5=91=98=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E5=88=97=E5=90=8D/=E6=98=AF=E5=90=A6=E5=B1=95?= =?UTF-8?q?=E7=A4=BA=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ResultInfos/Dtos/ResultDto.cs | 21 ++ .../ResultInfos/ResultService.cs | 5 + Waste.Application/Waste.Application.xml | 90 +++++ Waste.Domain/DataModel/JT_Setting.cs | 311 ++++++++++++++++++ Waste.Web.Entry/Handler/BaseModel.cs | 7 + .../Pages/Result/GlobalConfig.cshtml | 97 ++++++ .../Pages/Result/GlobalConfig.cshtml.cs | 43 +++ Waste.Web.Entry/Pages/Result/Index.cshtml | 103 +++--- Waste.Web.Entry/Pages/Result/Index.cshtml.cs | 47 ++- .../Pages/Result/ResultColumnConfigService.cs | 206 ++++++++++++ 10 files changed, 871 insertions(+), 59 deletions(-) create mode 100644 Waste.Domain/DataModel/JT_Setting.cs create mode 100644 Waste.Web.Entry/Pages/Result/GlobalConfig.cshtml create mode 100644 Waste.Web.Entry/Pages/Result/GlobalConfig.cshtml.cs create mode 100644 Waste.Web.Entry/Pages/Result/ResultColumnConfigService.cs diff --git a/Waste.Application/ResultInfos/Dtos/ResultDto.cs b/Waste.Application/ResultInfos/Dtos/ResultDto.cs index 00a9cfc..ad99880 100644 --- a/Waste.Application/ResultInfos/Dtos/ResultDto.cs +++ b/Waste.Application/ResultInfos/Dtos/ResultDto.cs @@ -146,6 +146,27 @@ namespace Waste.Application /// 上报是否成功,1-成功,0-失败 /// public int PostStatus { get; set; } + + /// + /// 物品小类 + /// + public string Measure_WasteSType { get; set; } + /// + /// 价格 + /// + public decimal? Measure_Price { get; set; } + /// + /// 金额 + /// + public decimal? Measure_Amount { get; set; } + /// + /// 操作员 + /// + public string Measure_OpUser { get; set; } + /// + /// 唯一消息ID + /// + public string Measure_UUID { get; set; } } /// diff --git a/Waste.Application/ResultInfos/ResultService.cs b/Waste.Application/ResultInfos/ResultService.cs index b1ebcda..e802254 100644 --- a/Waste.Application/ResultInfos/ResultService.cs +++ b/Waste.Application/ResultInfos/ResultService.cs @@ -145,6 +145,11 @@ namespace Waste.Application }); var ext = allext.FirstOrDefault(e => e.ResultId == it.Id); it.WasteType = ext != null && !ext.WasteSType.IsEmpty() ? $"{ext.WasteSType}【{it.WasteType}】" : it.WasteType; + it.Measure_WasteSType = ext?.WasteSType; + it.Measure_Price = ext?.Price; + it.Measure_Amount = ext?.Amount; + it.Measure_OpUser = ext?.OpUser; + it.Measure_UUID = ext?.UUID; }) .ToPageListAsync(param.offset, param.limit, totalnum); return new PageParms diff --git a/Waste.Application/Waste.Application.xml b/Waste.Application/Waste.Application.xml index 9ef9b59..a7fcc08 100644 --- a/Waste.Application/Waste.Application.xml +++ b/Waste.Application/Waste.Application.xml @@ -1722,6 +1722,31 @@ 上报是否成功,1-成功,0-失败 + + + 物品小类 + + + + + 价格 + + + + + 金额 + + + + + 操作员 + + + + + 唯一消息ID + + 上传的数据包体 @@ -2398,6 +2423,36 @@ 上报时间 + + + 设备机器码 + + + + + 设备编号 + + + + + 设备所属省份 + + + + + 设备所属城市 + + + + + 设备所属区/县 + + + + + 设备详细地址 + + 发送第三方消息 @@ -2448,6 +2503,41 @@ 设备ID + + + 设备机器码 + + + + + 设备编号 + + + + + 设备所属省份 + + + + + 设备所属城市 + + + + + 设备所属区/县 + + + + + 设备详细地址 + + + + + 最近心跳时间 + + CAP订阅相关接口 diff --git a/Waste.Domain/DataModel/JT_Setting.cs b/Waste.Domain/DataModel/JT_Setting.cs new file mode 100644 index 0000000..5781538 --- /dev/null +++ b/Waste.Domain/DataModel/JT_Setting.cs @@ -0,0 +1,311 @@ +using System; +using System.Threading.Tasks; +using Furion.DependencyInjection; +using SqlSugar; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using Microsoft.EntityFrameworkCore.Query.Internal; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; + +namespace Waste.Domain +{ + public class JT_Setting + { + public JT_Setting() { } + public JT_Setting(Guid id, string name, string value, string providerName, string providerKey) + { + this.Id = id; + this.Name = name; + this.Value = value; + this.ProviderName = providerName; + this.ProviderKey = providerKey; + } + [SugarColumn(IsPrimaryKey = true)] + public Guid Id { get; set; } + public string Name { get; set; } + public string Value { get; set; } + + public string ProviderName { get; set; } + public string ProviderKey { get; set; } + + public override string ToString() + { + return $"{base.ToString()}, Name = {Name}, Value = {Value}, ProviderName = {ProviderName}, ProviderKey = {ProviderKey}"; + } + } + public class SettingProvider : ITransient + { + private readonly IServiceProvider _serviceProvider; + + private readonly SettingDefinitionManager SettingDefinitionManager; + private readonly SettingValueProviderManager SettingValueProviderManager; + + + public SettingProvider(IServiceProvider serviceProvider, SettingDefinitionManager settingDefinitionManager, SettingValueProviderManager settingValueProviderManager) + { + _serviceProvider = serviceProvider; + SettingDefinitionManager = settingDefinitionManager; + SettingValueProviderManager = settingValueProviderManager; + } + + public virtual async Task GetOrNullAsync(string name) + { + var setting = await SettingDefinitionManager.GetAsync(name); + var providers = Enumerable + .Reverse(SettingValueProviderManager.Providers); + + if (setting.Providers.Any()) + { + providers = providers.Where(p => setting.Providers.Contains(p.Name)); + } + + //TODO: How to implement setting.IsInherited? + + var value = await GetOrNullValueFromProvidersAsync(providers, setting); + /* if (value != null && setting.IsEncrypted) + { + value = SettingEncryptionService.Decrypt(setting, value); + }*/ + + return value; + } + + + + protected virtual async Task GetOrNullValueFromProvidersAsync( + IEnumerable providers, + SettingDefinition setting) + { + foreach (var provider in providers) + { + var value = await provider.GetOrNullAsync(setting); + if (value != null) + { + return value; + } + } + + return null; + } + } + + public class SettingDefinitionManager : ISingleton + { + protected IDictionary SettingDefinitions { get; } = + new Dictionary(); + + public SettingDefinitionManager AddSettingDefinition(SettingDefinition settingDefinition) + { + SettingDefinitions[settingDefinition.Name] = settingDefinition; + return this; + } + public virtual async Task GetAsync(string name) + { + + var setting = await GetOrNullAsync(name); + + if (setting == null) + { + throw new Exception("Undefined setting: " + name); + } + + return setting; + } + public virtual Task GetOrNullAsync(string name) + { + return Task.FromResult(GetOrDefault(SettingDefinitions, name)); + } + public static TValue? GetOrDefault(IDictionary dictionary, TKey key) + { + return dictionary.TryGetValue(key, out var obj) ? obj : default; + } + } + + public class SettingValueProviderManager : ISingleton + { + public List Providers => _lazyProviders.Value; + private readonly Lazy> _lazyProviders; + protected IServiceProvider ServiceProvider { get; } + public SettingValueProviderManager(IServiceProvider serviceProvider) + { + ServiceProvider = serviceProvider; + _lazyProviders = new Lazy>(GetProviders, true); + } + + + + protected virtual List GetProviders() + { + + using (var scope = ServiceProvider.CreateScope()) + + return new List() + { + scope.ServiceProvider.GetRequiredService(), + scope.ServiceProvider.GetRequiredService(), + scope.ServiceProvider.GetRequiredService(), + }; + } + } + + + public class SettingManagementStore : ITransient + { + private readonly ISqlSugarRepository repository; + + public SettingManagementStore(ISqlSugarRepository repository) + { + this.repository = repository; + } + + public virtual async Task GetOrNullAsync(string name, string providerName, string providerKey) + { + return (await FindAsync(name, providerName, providerKey))?.Value; + } + public virtual async Task SetAsync(string name, string value, string providerName, string providerKey) + { + var setting = await FindAsync(name, providerName, providerKey); + if (setting == null) + { + setting = new JT_Setting(Guid.NewGuid(), name, value, providerName, providerKey); + await repository.InsertAsync(setting); + } + else + { + setting.Value = value; + await repository.UpdateAsync(setting); + } + + + } + + private async Task FindAsync(string name, string providerName, string providerKey) + { + return await repository.Where(x => + x.Name == name && x.ProviderName == providerName) + .WhereIF(!string.IsNullOrWhiteSpace(providerKey), x => x.ProviderKey == providerKey).FirstAsync(); + } + } + + public abstract class SettingValueProvider : ITransient + { + public abstract string Name { get; } + + protected SettingManagementStore SettingStore { get; } + + protected SettingValueProvider(SettingManagementStore settingStore) + { + SettingStore = settingStore; + } + public abstract Task GetOrNullAsync(SettingDefinition setting); + + protected virtual async Task SetAsync(string name, string value, string providerKey) + { + await SettingStore.SetAsync(name, value, Name, providerKey); + + } + + protected virtual async Task SetAsync(SettingDefinition setting, string value, string providerKey) + { + await SettingStore.SetAsync(setting.Name, value, Name, providerKey); + } + + } + + public class GlobalSettingValueProvider : SettingValueProvider + { + public GlobalSettingValueProvider(SettingManagementStore settingStore) : base(settingStore) + { + } + + public const string ProviderName = "G"; + + public override string Name => ProviderName; + + public override Task GetOrNullAsync(SettingDefinition setting) + { + return SettingStore.GetOrNullAsync(setting.Name, Name, null); + } + public Task SetAsync(string name, string value) + { + return base.SetAsync(name, value, null); + } + } + public class UserSettingValueProvider : SettingValueProvider + { + public const string ProviderName = "U"; + + public override string Name => ProviderName; + + protected ICurrentUser CurrentUser { get; } + + public UserSettingValueProvider(SettingManagementStore settingStore, ICurrentUser currentUser) + : base(settingStore) + { + CurrentUser = currentUser; + } + + public override async Task GetOrNullAsync(SettingDefinition setting) + { + if (CurrentUser.Id == null) + { + return null; + } + + return await SettingStore.GetOrNullAsync(setting.Name, Name, CurrentUser.Id.ToString()); + } + + public Task SetAsync(string name, string value) + { + return base.SetAsync(name, value, CurrentUser.Id.ToString()); + } + } + + public interface ICurrentUser + { + Guid? Id { get; } + } + public class DefaultValueSettingValueProvider : SettingValueProvider + { + public const string ProviderName = "D"; + + public override string Name => ProviderName; + + public DefaultValueSettingValueProvider(SettingManagementStore settingStore) + : base(settingStore) + { + + } + + public override Task GetOrNullAsync(SettingDefinition setting) + { + return Task.FromResult(setting.DefaultValue); + } + + + } + // public Guid UserId { get; set; } + + public class SettingDefinition + { + /// + /// Unique name of the setting. + /// + [NotNull] + public string Name { get; set; } + + public string DisplayName { get; set; } + + /// + /// Default value of the setting. + /// + public string? DefaultValue { get; set; } + /// + /// A list of allowed providers to get/set value of this setting. + /// An empty list indicates that all providers are allowed. + /// + public List Providers { get; } = new List(); + } +} \ No newline at end of file diff --git a/Waste.Web.Entry/Handler/BaseModel.cs b/Waste.Web.Entry/Handler/BaseModel.cs index be36528..9041028 100644 --- a/Waste.Web.Entry/Handler/BaseModel.cs +++ b/Waste.Web.Entry/Handler/BaseModel.cs @@ -6,6 +6,8 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Furion.DependencyInjection; +using Waste.Domain; namespace Waste.Web.Entry { @@ -65,4 +67,9 @@ namespace Waste.Web.Entry }); } } + + public class CurrentUser : ICurrentUser, ITransient + { + public Guid? Id => OperatorProvider.Provider.GetCurrent()?.UserId; + } } diff --git a/Waste.Web.Entry/Pages/Result/GlobalConfig.cshtml b/Waste.Web.Entry/Pages/Result/GlobalConfig.cshtml new file mode 100644 index 0000000..5821570 --- /dev/null +++ b/Waste.Web.Entry/Pages/Result/GlobalConfig.cshtml @@ -0,0 +1,97 @@ +@page +@model Waste.Web.Entry.Pages.Result.GlobalConfigModel +@{ + ViewData["Title"] = "字段配置"; +} +
+ +
+
+ @foreach (var item in Model.Column) + { +
+
+ +
+ +
+
+
+ +
+
+ } +
+
+ +
+
+
+
+
+ +@section Scripts +{ + + +} diff --git a/Waste.Web.Entry/Pages/Result/GlobalConfig.cshtml.cs b/Waste.Web.Entry/Pages/Result/GlobalConfig.cshtml.cs new file mode 100644 index 0000000..23b8c2c --- /dev/null +++ b/Waste.Web.Entry/Pages/Result/GlobalConfig.cshtml.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace Waste.Web.Entry.Pages.Result +{ + public class GlobalConfigModel : PageModel + { + private readonly ResultColumnConfigService columnConfigService; + + public GlobalConfigModel(ResultColumnConfigService columnConfigService) + { + this.columnConfigService = columnConfigService; + } + + public async Task OnGetAsync() + { + Column = (await columnConfigService.GetGlobalColumn()).Select(x => new GlobalColumnConfigOutput + { + SystemTitle = ResultColumnConfigService.SystemColumn[x.Name], + Name = x.Name, + Title = x.Title, + IsShow = x.IsShow + }); + + } + + public async Task OnPostUpdateConfigAsync([FromBody] List input) + { + await columnConfigService.WriteGlobalConfig(input); + //await service.UpdateAccountConfig(Baseuser.UserId, config); + return Content("ok"); + } + + public IEnumerable Column { get; set; } + public class GlobalColumnConfigOutput : GlobalColumnConfig + { + public string SystemTitle { get; set; } + } + } +} diff --git a/Waste.Web.Entry/Pages/Result/Index.cshtml b/Waste.Web.Entry/Pages/Result/Index.cshtml index 701dd74..2d17bea 100644 --- a/Waste.Web.Entry/Pages/Result/Index.cshtml +++ b/Waste.Web.Entry/Pages/Result/Index.cshtml @@ -58,6 +58,22 @@ @section Scripts {