Waste/Waste.Web.Entry/Pages/Result/ResultColumnConfigService.cs

206 lines
8.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Formats.Asn1;
using System.Linq;
using System.Threading.Tasks;
using Furion;
using Furion.DependencyInjection;
using Furion.JsonSerialization;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Waste.Application;
using Waste.Domain;
namespace Waste.Web.Entry.Pages.Result
{
public class ResultColumnConfigService : ITransient
{
public const string AccountSettingDefinitionName = "AccountResultColumnConfig";
public const string GlobalSettingDefinitionName = "GlobalResultColumnConfig";
private readonly ILogger<ResultColumnConfigService> logger;
private readonly SettingProvider settingProvider;
private readonly UserSettingValueProvider userSettingValueProvider;
private readonly GlobalSettingValueProvider globalSettingValueProvider;
public static readonly Dictionary<string, string> SystemColumn = new Dictionary<string, string>()
{
{nameof(ResultList.DeviceFacEcode).ToLower(),"设备编号"},
{nameof(ResultList.DeviceEcode).ToLower(),"机器码"},
{nameof(ResultList.DeviceName).ToLower(),"设备名称"},
{nameof(ResultList.BusinessName).ToLower(),"所属商户"},
{nameof(ResultList.WasteType).ToLower(),"物品编码"},
{nameof(ResultList.GrossWeight).ToLower(),"毛重(KG)"},
{nameof(ResultList.Registration).ToLower(),"垃圾桶"},
{nameof(ResultList.Tare).ToLower(),"皮重(KG)"},
{nameof(ResultList.NetWeight).ToLower(),"净重(KG)"},
{nameof(ResultList.DeviceAddress).ToLower(),"地址"},
{nameof(ResultList.PostStatus).ToLower(),"状态"},
{nameof(ResultList.CreateTime).ToLower(),"回收时间"},
{nameof(ResultList.Measure_Price).ToLower(),"单价"},
{nameof(ResultList.Measure_Amount).ToLower(),"金额"},
{nameof(ResultList.Measure_OpUser).ToLower(),"操作员"},
{nameof(ResultList.Measure_UUID).ToLower(),"消息ID"},
{nameof(ResultList.Measure_WasteSType).ToLower(),"物品小类"},
};
public ResultColumnConfigService(ILogger<ResultColumnConfigService> logger, SettingProvider settingProvider, UserSettingValueProvider userSettingValueProvider, GlobalSettingValueProvider globalSettingValueProvider)
{
this.logger = logger;
this.settingProvider = settingProvider;
this.userSettingValueProvider = userSettingValueProvider;
this.globalSettingValueProvider = globalSettingValueProvider;
}
private Task<Dictionary<string, string>> GetDefaultColumn()
{
return Task.FromResult(SystemColumn);
}
public async Task<Dictionary<string, string>> GetAccountDefaultColumn()
{
return (await GetGlobalColumn()).Where(x => x.IsShow).ToDictionary(x => x.Name, x => x.Title);
}
public async Task<List<GlobalColumnConfig>> GetGlobalColumn()
{
var def = await GetDefaultColumn();
var value = await settingProvider.GetOrNullAsync(GlobalSettingDefinitionName);
if (string.IsNullOrWhiteSpace(value)) return DefaultList();
try
{
var config = JSON.Deserialize<GlobalConfig>(value);
if (config.ResultColumn != null && config.ResultColumn.Any())
{
return config.ResultColumn.GroupBy(x => x.Name)
.Where(x => def.ContainsKey(x.Key))
.Select(x =>
new GlobalColumnConfig { Name = x.Key, Title = x.First().Title, IsShow = x.First().IsShow }).ToList();
}
}
catch (Exception e)
{
logger.LogError(e, "反序列化失败:{value}", value);
}
return DefaultList();
List<GlobalColumnConfig> DefaultList()
{
return def.Select(x =>
new GlobalColumnConfig { Name = x.Key, Title = x.Value, IsShow = true }).ToList();
}
}
public async Task<Dictionary<string, string>> GetAccountColumn()
{
var _GlobalColumn = (await GetGlobalColumn()).Where(x => SystemColumn.ContainsKey(x.Name) && x.IsShow).ToDictionary(x => x.Name, x => string.IsNullOrWhiteSpace(x.Title) ? SystemColumn[x.Name] : x.Title);
var value = await settingProvider.GetOrNullAsync(AccountSettingDefinitionName);
if (string.IsNullOrWhiteSpace(value)) return _GlobalColumn;
try
{
var config = JSON.Deserialize<AccountConfig>(value);
if (config.ResultColumn != null && config.ResultColumn.Any())
{
return config.ResultColumn.GroupBy(x => x.Name)
.Where(x => _GlobalColumn.ContainsKey(x.Key))
.ToDictionary(x => x.Key,
//x => x.First().Title
x => _GlobalColumn[x.Key]
);
}
}
catch (Exception e)
{
logger.LogError(e, "反序列化失败:{value}", value);
}
return _GlobalColumn;
}
public async Task WriteAccountConfig(List<ColumnConfig> ResultColumn)
{
var value = SerializeConfig(ResultColumn, SystemColumn);
await userSettingValueProvider.SetAsync(AccountSettingDefinitionName, value);
}
public static string SerializeConfig(List<ColumnConfig> ResultColumn, Dictionary<string, string> DefaultColumn)
{
if (ResultColumn != null && ResultColumn.Any())
{
return JSON.Serialize(new AccountConfig
{ ResultColumn = ResultColumn.GroupBy(x => x.Name).Where(x => DefaultColumn.ContainsKey(x.Key) && x.Any()).Select(x => new ColumnConfig { Name = x.Key/*, Title = x.First().Title*/ }).ToList() });
}
return null;
}
public async Task WriteGlobalConfig(List<GlobalColumnConfig> ResultColumn)
{
var value = SerializeConfig(ResultColumn, SystemColumn);
await globalSettingValueProvider.SetAsync(GlobalSettingDefinitionName, value);
}
public static string SerializeConfig(List<GlobalColumnConfig> ResultColumn, Dictionary<string, string> DefaultColumn)
{
if (ResultColumn != null && ResultColumn.Any())
{
return JSON.Serialize(new GlobalConfig
{ ResultColumn = ResultColumn.Where(x => DefaultColumn.ContainsKey(x.Name)).ToList() });
}
return null;
}
}
public sealed class ResultColumnConfigStartup : AppStartup
{
public void ConfigureServices(IServiceCollection services)
{
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.ApplicationServices.GetRequiredService<SettingDefinitionManager>()
.AddSettingDefinition(new SettingDefinition()
{
Name = ResultColumnConfigService.GlobalSettingDefinitionName,
Providers = { GlobalSettingValueProvider.ProviderName }
})
.AddSettingDefinition(new SettingDefinition()
{
Name = ResultColumnConfigService.AccountSettingDefinitionName,
Providers = { UserSettingValueProvider.ProviderName }
});
}
}
public class AccountConfig
{
public List<ColumnConfig> ResultColumn { get; set; }
}
public class GlobalConfig
{
public List<GlobalColumnConfig> ResultColumn { get; set; }
}
public class ColumnConfig
{
public string Name { get; set; }
}
public class GlobalColumnConfig : ColumnConfig
{
//public string SystemTitle { get; set; }
public string Title { get; set; }
public bool IsShow { get; set; }
}
}