#nullable enable
using Furion;
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using iWare.Wms.Core;
using iWare.Wms.Core.Util;
using iWareCommon.Utils;
using Mapster;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.ComponentModel;
using System.Linq.Dynamic.Core;
using System.Reflection;
namespace iWare.Wms.Application
{
///
/// 字典类型服务
///
[ApiDescriptionSettings(Name = "DictType", Order = 100)]
[AllowAnonymous]
[Route("api")]
public class SysDictTypeService : ISysDictTypeService, IDynamicApiController, ITransient
{
private readonly IRepository _sysDictTypeRep;
private readonly IRepository _sysDictDataRep;
private readonly ISysDictDataService _sysDictDataService;
private readonly ISysCacheService _sysCacheService;
///
/// 构造函数
///
/// 字典类型表服务
/// 字典数据表仓储
/// 字典类型表仓储
///
public SysDictTypeService(ISysDictDataService sysDictDataService, IRepository sysDictDataRep,
IRepository sysDictTypeRep, ISysCacheService sysCacheService)
{
_sysDictDataService = sysDictDataService;
_sysDictDataRep = sysDictDataRep;
_sysDictTypeRep = sysDictTypeRep;
_sysCacheService = sysCacheService;
}
///
/// 分页查询字典类型
///
///
[HttpGet("sysDictType/page")]
public async Task> QueryDictTypePageList([FromQuery] DictTypePageInput input)
{
bool supperAdmin = CurrentUserInfo.IsSuperAdmin;
var code = !string.IsNullOrEmpty(input.Code?.Trim());
var name = !string.IsNullOrEmpty(input.Name?.Trim());
var c = input.Code?.Trim() ?? "";
var n = input.Name?.Trim() ?? "";
var dictTypes = await _sysDictTypeRep.DetachedEntities
.Where((code, u => EF.Functions.Like(u.Code, $"%{c}%")),(name, u => EF.Functions.Like(u.Name, $"%{n}%")))
.Where(u => (u.Status != CommonStatus.DELETED && !supperAdmin) || (u.Status <= CommonStatus.DELETED && supperAdmin))
.OrderBy(u => u.Sort).ToADPagedListAsync(input.PageNo, input.PageSize);
return dictTypes;
}
///
/// 获取字典类型列表
///
///
[HttpGet("sysDictType/list")]
public async Task> GetDictTypeList()
{
return await _sysDictTypeRep.DetachedEntities.Where(u => u.Status != CommonStatus.DELETED).ToListAsync();
}
///
/// 获取字典类型下所有字典值
///
///
///
[AllowAnonymous]
[HttpGet("sysDictType/dropDown")]
public async Task> GetDictTypeDropDown([FromQuery] DropDownDictTypeInput input)
{
var dictType = await _sysDictTypeRep.FirstOrDefaultAsync(u => u.Code == input.Code, false);
if (dictType == null) throw Oops.Oh(ErrorCode.D3000);
return await _sysDictDataService.GetDictDataListByDictTypeId(dictType.Id);
}
///
/// 添加字典类型
///
///
///
[HttpPost("sysDictType/add")]
public async Task AddDictType(AddDictTypeInput input)
{
var isExist = await _sysDictTypeRep.AnyAsync(u => u.Name == input.Name || u.Code == input.Code, false);
if (isExist) throw Oops.Oh(ErrorCode.D3001);
var dictType = input.Adapt();
await _sysDictTypeRep.InsertAsync(dictType);
}
///
/// 删除字典类型
///
///
///
[HttpPost("sysDictType/delete")]
public async Task DeleteDictType(DeleteDictTypeInput input)
{
var dictType = await _sysDictTypeRep.FirstOrDefaultAsync(u => u.Id == input.Id);
if (dictType == null) throw Oops.Oh(ErrorCode.D3000);
if (dictType.Status == CommonStatus.DELETED)
{
await dictType.DeleteAsync();
}
else
{
dictType.Status = CommonStatus.DELETED;
dictType.IsDeleted = true;
}
}
///
/// 更新字典类型
///
///
///
[HttpPost("sysDictType/edit"),]
public async Task UpdateDictType(UpdateDictTypeInput input)
{
var isExist = await _sysDictTypeRep.AnyAsync(u => u.Id == input.Id, false);
if (!isExist) throw Oops.Oh(ErrorCode.D3000);
// 排除自己并且判断与其他是否相同
isExist = await _sysDictTypeRep.AnyAsync(u => (u.Name == input.Name || u.Code == input.Code) && u.Id != input.Id, false);
if (isExist) throw Oops.Oh(ErrorCode.D3001);
var dictType = input.Adapt();
await _sysDictTypeRep.UpdateAsync(dictType, ignoreNullValues: true);
}
///
/// 字典类型详情
///
///
///
[HttpGet("sysDictType/detail")]
public async Task GetDictType([FromQuery] QueryDictTypeInfoInput input)
{
return await _sysDictTypeRep.FirstOrDefaultAsync(u => u.Id == input.Id, false);
}
///
/// 更新字典类型状态
///
///
///
[HttpPost("sysDictType/changeStatus")]
public async Task ChangeDictTypeStatus(ChangeStateDictTypeInput input)
{
var dictType = await _sysDictTypeRep.FirstOrDefaultAsync(u => u.Id == input.Id);
if (dictType == null) throw Oops.Oh(ErrorCode.D3000);
if (!Enum.IsDefined(typeof(CommonStatus), input.Status))
throw Oops.Oh(ErrorCode.D3005);
dictType.Status = input.Status;
dictType.IsDeleted = false;
}
///
/// 字典类型与字典值构造的字典树
///
///
[AllowAnonymous]
[HttpGet("sysDictType/tree")]
public async Task> GetDictTree()
{
return await _sysDictTypeRep.DetachedEntities.Select(u => new DictTreeOutput
{
Id = u.Id,
Code = u.Code,
Name = u.Name,
Remark = u.Remark,
Children = u.SysDictDatas.Select(c => new DictTreeOutput
{
Id = c.Id,
Pid = c.TypeId,
Code = c.Code,
Name = c.Value
}).ToList()
}).ToListAsync();
}
///
/// 根据枚举类型创建数据
///
/// 枚举类型名称
///
[AllowAnonymous]
[HttpGet("sysDictType/parseDataFromEnumType")]
public async Task ParseDataFromEnumType([FromQuery] string className)
{
Type? type = TypeUtil.GetType(className);
if (type == null)
{
throw new Exception($"类型{className}不存在");
}
if(!type.IsEnum)
{
throw new Exception($"{className}不是枚举类型");
}
var lastDictType = await _sysDictTypeRep.DetachedEntities.OrderByDescending(x => x.Id).FirstOrDefaultAsync();
var tId = lastDictType?.Id + 1 ?? 1;
var remark = "无";
if (type.IsDefined(typeof(DescriptionAttribute), true))
{
remark = ((DescriptionAttribute?)type.GetCustomAttribute(typeof(DescriptionAttribute), true))?.Description ?? "无";
}
var lastDictData = await _sysDictDataRep.DetachedEntities.OrderByDescending(x => x.Id).FirstOrDefaultAsync();
var dId = lastDictData?.Id + 1 ?? 1;
var sort = 10;
var folder = App.Configuration["Desktop"];
string fileName = DateTime.Now.Ticks + ".txt";
string msgDictType = $"new SysDictType {{ Id={tId}, Name=\"{remark}\", Sort=100, Code=\"{StringUtil.ToUnderLine(type.Name)}\", Remark=\"{remark}\", Status=0, EnumClassName=\"{type.FullName}\" }},";
FileUtil.WriteLine(folder, fileName, msgDictType);
FileUtil.WriteLine(folder, fileName, "");
foreach (var field in type.GetFields()) {
if(field.IsDefined(typeof(DescriptionAttribute), true))
{
var descr = ((DescriptionAttribute?)field.GetCustomAttribute(typeof(DescriptionAttribute), true))?.Description ?? "无";
string msgDictData = $"new SysDictData {{ Id={dId++}, TypeId={tId}, Value=\"{descr}\", Code=\"{(int)Enum.Parse(type, field.Name)}\", Sort={sort}, Remark=\"{field.Name}\", Status=0}},";
FileUtil.WriteLine(folder, fileName, msgDictData);
sort += 10;
}
}
return Path.Combine(folder, fileName);
}
[NonAction]
public async Task> GetDictTreeOutput()
{
var dictTree = await GetDictTree();
await _sysCacheService.SetDict(dictTree); // 缓存结果
return dictTree;
}
}
}