|
|
@@ -7,22 +7,16 @@
|
|
|
using Admin.NET.Core.Service;
|
|
|
using Microsoft.AspNetCore.Http;
|
|
|
@{
|
|
|
- string joinTableName = "u";
|
|
|
- string joinTableAlias = "";
|
|
|
- Dictionary<string, int> definedObjects = new Dictionary<string, int>();
|
|
|
- bool haveLikeCdt = false;
|
|
|
- foreach (var column in Model.TableField){
|
|
|
- if (column.QueryWhether == "Y" && column.QueryType == "like"){
|
|
|
- haveLikeCdt = true;
|
|
|
- }
|
|
|
- }
|
|
|
- var hasSetStatus = Model.TableField.Any(col => col.NetType == "StatusEnum" && col.PropertyName == "Status");
|
|
|
- var dictTableField = Model.TableField.Where(x => x.WhetherImport == "Y" && x.EffectType == "Select") ?? default;
|
|
|
- var hasdictService = dictTableField.Count() > 0;
|
|
|
- var importField = Model.TableField.Where(x => x.WhetherImport == "Y");
|
|
|
- var displayColumnList = new List<string>();
|
|
|
+ string LowerFirstLetter(string text) => text.ToString()[..1].ToLower() + text[1..];
|
|
|
+
|
|
|
+ var primaryKey = Model.TableField.First(u => u.ColumnKey == "True");
|
|
|
+ var importFields = Model.TableField.Where(x => x.WhetherImport == "Y");
|
|
|
+
|
|
|
+ var injectServices = new List<string>();
|
|
|
+ if (Model.TableField.Any(u => u.EffectType == "Upload")) injectServices.Add("SysFileService");
|
|
|
+ if (Model.TableField.Any(x => x.WhetherImport == "Y" && x.EffectType == "Select")) injectServices.Add("SysDictTypeService");
|
|
|
}
|
|
|
-namespace @(Model.NameSpace).Service;
|
|
|
+namespace @(Model.NameSpace);
|
|
|
|
|
|
/// <summary>
|
|
|
/// @(Model.BusName)服务 🧩
|
|
|
@@ -31,18 +25,16 @@ namespace @(Model.NameSpace).Service;
|
|
|
public class @(Model.ClassName)Service : IDynamicApiController, ITransient
|
|
|
{
|
|
|
private readonly SqlSugarRepository<@(Model.ClassName)> _@(Model.LowerClassName)Rep;
|
|
|
-@if (hasdictService) {
|
|
|
- @:private readonly SysDictTypeService _sysDictTypeService;
|
|
|
-}
|
|
|
- public @(Model.ClassName)Service(SqlSugarRepository<@(Model.ClassName)> @(Model.LowerClassName)Rep
|
|
|
-@if (hasdictService) {
|
|
|
- @:,SysDictTypeService sysDictTypeService
|
|
|
-}
|
|
|
- ){
|
|
|
+ @foreach(var name in injectServices) {
|
|
|
+ @:private readonly @name _@(LowerFirstLetter(name));
|
|
|
+ }
|
|
|
+
|
|
|
+ public @(Model.ClassName)Service(SqlSugarRepository<@(Model.ClassName)> @(Model.LowerClassName)Rep@(injectServices.Count > 0 ? ", " + string.Join(", ", injectServices.Select(name => $"{name} {LowerFirstLetter(name)}")) : ""))
|
|
|
+ {
|
|
|
_@(Model.LowerClassName)Rep = @(Model.LowerClassName)Rep;
|
|
|
-@if (hasdictService) {
|
|
|
- @:_sysDictTypeService = sysDictTypeService;
|
|
|
-}
|
|
|
+ @foreach(var name in injectServices) {
|
|
|
+ @:_@LowerFirstLetter(name) = @LowerFirstLetter(name);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
@@ -50,76 +42,60 @@ public class @(Model.ClassName)Service : IDynamicApiController, ITransient
|
|
|
/// </summary>
|
|
|
/// <param name="input"></param>
|
|
|
/// <returns></returns>
|
|
|
- [ApiDescriptionSettings(Name = "Page"), HttpPost]
|
|
|
[DisplayName("分页查询@(Model.BusName)")]
|
|
|
+ [ApiDescriptionSettings(Name = "Page"), HttpPost]
|
|
|
public async Task<SqlSugarPagedList<@(Model.ClassName)Output>> Page(Page@(Model.ClassName)Input input)
|
|
|
{
|
|
|
-@if (haveLikeCdt) {
|
|
|
- @:input.Keyword = input.Keyword?.Trim();
|
|
|
-}
|
|
|
+ input.Keyword = input.Keyword?.Trim();
|
|
|
var query = _@(Model.LowerClassName)Rep.AsQueryable()
|
|
|
-@{string conditionFlag = "";}
|
|
|
-@if (haveLikeCdt) {
|
|
|
- @:.WhereIF(!string.IsNullOrEmpty(input.Keyword), u =>
|
|
|
- @foreach (var column in Model.TableField){
|
|
|
- if (column.QueryWhether == "Y" && column.QueryType == "like"){
|
|
|
- @:@(conditionFlag)u.@(column.PropertyName).Contains(input.Keyword)
|
|
|
- conditionFlag="|| ";
|
|
|
- }
|
|
|
- }
|
|
|
- @:)
|
|
|
-}
|
|
|
-@foreach (var column in Model.TableField){
|
|
|
-if (column.QueryWhether == "Y"){
|
|
|
- if (column.NetType?.TrimEnd('?') == "string"){
|
|
|
- if(column.QueryType == "like"){
|
|
|
- @:.WhereIF(!string.IsNullOrWhiteSpace(input.@column.PropertyName), u => u.@(column.PropertyName).Contains(input.@(column.PropertyName).Trim()))
|
|
|
- }else{
|
|
|
- @:.WhereIF(!string.IsNullOrWhiteSpace(input.@column.PropertyName), u => u.@(column.PropertyName) @column.QueryType input.@(column.PropertyName))
|
|
|
- }
|
|
|
- }else if(column.NetType?.TrimEnd('?') == "int" || column.NetType?.TrimEnd('?') == "long"){
|
|
|
- @:.WhereIF(input.@column.PropertyName != null, u => u.@(column.PropertyName) @column.QueryType input.@(column.PropertyName))
|
|
|
- }else if(column.NetType?.TrimEnd('?') == "DateTime" && column.QueryType == "~"){
|
|
|
- @:.WhereIF(input.@(column.PropertyName)Range != null && input.@(column.PropertyName)Range.Length == 2, u => u.@(column.PropertyName) >= input.@(column.PropertyName)Range[0] && u.@(column.PropertyName) <= input.@(column.PropertyName)Range[1])
|
|
|
- }else if(column.NetType?.TrimEnd('?').EndsWith("Enum") == true) {
|
|
|
- @:.WhereIF(input.@(column.PropertyName).HasValue, u => u.@(column.PropertyName) @column.QueryType input.@(column.PropertyName))
|
|
|
- }
|
|
|
-}
|
|
|
-}
|
|
|
-@if(Model.IsJoinTable){
|
|
|
- @:// 处理外键和TreeSelector相关字段的连接
|
|
|
- @foreach (var column in Model.TableField.Where(u => u.EffectType == "fk" || u.EffectType == "ApiTreeSelect")){
|
|
|
- joinTableAlias = Regex.Replace(column.LowerPropertyName, "[iI]d$", "");
|
|
|
+@{
|
|
|
+ string joinTableName = "u";
|
|
|
+ var queryFields = Model.TableField.Where(u => u.QueryWhether == "Y");
|
|
|
+ // 关键字模糊查询
|
|
|
+ if (queryFields.Any(u => u.QueryType == "like")) {
|
|
|
+ @:.WhereIF(!string.IsNullOrEmpty(input.Keyword), u => @string.Join(" || ", queryFields.Where(u => u.QueryType == "like").Select(col => $"u.{col.PropertyName}.Contains(input.Keyword)")))
|
|
|
+ }
|
|
|
+ // 字段组合查询
|
|
|
+ foreach(var column in queryFields) {
|
|
|
+ if (column.NetType.TrimEnd('?') == "string") {
|
|
|
+ @:.WhereIF(!string.IsNullOrWhiteSpace(input.@(column.PropertyName)), u => u.@(column.PropertyName)@(column.QueryType == "like" ? $".Contains(input.{column.PropertyName}.Trim())" : $" {column.QueryType} input.{column.PropertyName}.Trim()"))
|
|
|
+ } else if (column.NetType.TrimEnd('?') == "int" || column.NetType.TrimEnd('?') == "long") {
|
|
|
+ @:.WhereIF(input.@(column.PropertyName) != null, u => u.@(column.PropertyName) @(column.QueryType) input.@(column.PropertyName))
|
|
|
+ } else if (column.NetType.TrimEnd('?').EndsWith("Enum")) {
|
|
|
+ @:.WhereIF(input.@(column.PropertyName).HasValue, u => u.@(column.PropertyName) == input.@(column.PropertyName))
|
|
|
+ } else if (column.NetType.TrimEnd('?') == "DateTime" && column.QueryType == "~") {
|
|
|
+ @:.WhereIF(input.@(column.PropertyName)Range?.Length == 2, u => u.@(column.PropertyName) >= input.@(column.PropertyName)Range[0] && u.@(column.PropertyName) <= input.@(column.PropertyName)Range[1])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 联表
|
|
|
+ if (Model.IsJoinTable) {
|
|
|
+ @foreach (var column in Model.TableField.Where(u => u.EffectType == "fk" || u.EffectType == "ApiTreeSelect")){
|
|
|
+ var joinTableAlias = Regex.Replace(column.LowerPropertyName, "[iI]d$", "");
|
|
|
joinTableName += ", " + joinTableAlias;
|
|
|
@:.LeftJoin<@column.FkEntityName>((@joinTableName) => u.@(column.PropertyName) == @joinTableAlias.@(column.EffectType == "fk" ? column.FkLinkColumnName : column.ValueColumn))
|
|
|
- }
|
|
|
+ }
|
|
|
+ // 查询列表
|
|
|
@:.Select((@joinTableName) => new @(Model.ClassName)Output
|
|
|
@:{
|
|
|
-@foreach (var column in Model.TableField){
|
|
|
- joinTableAlias = Regex.Replace(column.LowerPropertyName, "[iI]d$", "");
|
|
|
- if(column.EffectType == "fk"){
|
|
|
+ foreach (var column in Model.TableField) {
|
|
|
+ var joinTableAlias = Regex.Replace(column.LowerPropertyName, "[iI]d$", "");
|
|
|
+ if (column.EffectType == "fk") {
|
|
|
+ var columnList = column.FkColumnName.Split(",").Select(n => $"{{{joinTableAlias}.{n}}}").ToList();
|
|
|
@:@(column.PropertyName) = u.@(column.PropertyName),
|
|
|
- @:@(column.PropertyName)@(column.FkColumnName) = @(joinTableAlias).@(column.FkColumnName),
|
|
|
- } else if(column.EffectType == "ApiTreeSelect"){
|
|
|
- displayColumnList = column.DisplayColumn.Split(",").Select(u => $"{{{joinTableAlias}.{u}}}").ToList();
|
|
|
+ @:@(column.PropertyName)FkColumn = $"@(string.Join("-", columnList))",
|
|
|
+ } else if (column.EffectType == "ApiTreeSelect") {
|
|
|
+ var columnList = column.DisplayColumn.Split(",").Select(n => $"{{{joinTableAlias}.{n}}}").ToList();
|
|
|
@:@(column.PropertyName) = u.@(column.PropertyName),
|
|
|
- @:@(column.PropertyName)Display = $"@(string.Join("-", displayColumnList))",
|
|
|
- } else if(column.NetType?.TrimEnd('?').EndsWith("Enum") == true){
|
|
|
- @:@(column.PropertyName) = u.@(column.PropertyName),
|
|
|
+ @:@(column.PropertyName)Display = $"@(string.Join("-", columnList))",
|
|
|
} else {
|
|
|
@:@(column.PropertyName) = u.@(column.PropertyName),
|
|
|
}
|
|
|
-}
|
|
|
+ }
|
|
|
@:});
|
|
|
-@foreach (var column in Model.TableField){
|
|
|
- if(column.EffectType == "fk"){
|
|
|
-
|
|
|
- }else if(column.EffectType == "Upload"){
|
|
|
- @://.Mapper(c => c.@(column.PropertyName)Attachment, c => c.@(column.PropertyName))
|
|
|
- }
|
|
|
-}
|
|
|
-} else {
|
|
|
+ } else {
|
|
|
+ // 无联表
|
|
|
@:.Select<@(Model.ClassName)Output>();
|
|
|
+ }
|
|
|
}
|
|
|
return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize);
|
|
|
}
|
|
|
@@ -129,13 +105,12 @@ if (column.QueryWhether == "Y"){
|
|
|
/// </summary>
|
|
|
/// <param name="input"></param>
|
|
|
/// <returns></returns>
|
|
|
- [ApiDescriptionSettings(Name = "Add"), HttpPost]
|
|
|
[DisplayName("增加@(Model.BusName)")]
|
|
|
+ [ApiDescriptionSettings(Name = "Add"), HttpPost]
|
|
|
public async Task<long> Add(Add@(Model.ClassName)Input input)
|
|
|
{
|
|
|
var entity = input.Adapt<@(Model.ClassName)>();
|
|
|
- await _@(Model.LowerClassName)Rep.InsertAsync(entity);
|
|
|
- return entity.Id;
|
|
|
+ return await _@(Model.LowerClassName)Rep.InsertAsync(entity) ? entity.Id : 0;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
@@ -143,13 +118,13 @@ if (column.QueryWhether == "Y"){
|
|
|
/// </summary>
|
|
|
/// <param name="input"></param>
|
|
|
/// <returns></returns>
|
|
|
- [ApiDescriptionSettings(Name = "Delete"), HttpPost]
|
|
|
[DisplayName("删除@(Model.BusName)")]
|
|
|
+ [ApiDescriptionSettings(Name = "Delete"), HttpPost]
|
|
|
public async Task Delete(Delete@(Model.ClassName)Input input)
|
|
|
{
|
|
|
-@foreach (var column in Model.TableField.Where(u => u.ColumnKey == "True")){
|
|
|
+ @foreach (var column in Model.TableField.Where(u => u.ColumnKey == "True")) {
|
|
|
@:var entity = await _@(Model.LowerClassName)Rep.GetFirstAsync(u => u.@(column.PropertyName) == input.@(column.PropertyName)) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
|
|
|
-}
|
|
|
+ }
|
|
|
await _@(Model.LowerClassName)Rep.FakeDeleteAsync(entity); //假删除
|
|
|
//await _@(Model.LowerClassName)Rep.DeleteAsync(entity); //真删除
|
|
|
}
|
|
|
@@ -159,13 +134,13 @@ if (column.QueryWhether == "Y"){
|
|
|
/// </summary>
|
|
|
/// <param name="input"></param>
|
|
|
/// <returns></returns>
|
|
|
- [ApiDescriptionSettings(Name = "BatchDelete"), HttpPost]
|
|
|
[DisplayName("批量删除@(Model.BusName)")]
|
|
|
+ [ApiDescriptionSettings(Name = "BatchDelete"), HttpPost]
|
|
|
public async Task<int> BatchDelete(BatchDelete@(Model.ClassName)Input input)
|
|
|
{
|
|
|
-@foreach (var column in Model.TableField.Where(u => u.ColumnKey == "True")){
|
|
|
+ @foreach (var column in Model.TableField.Where(u => u.ColumnKey == "True")) {
|
|
|
@:var list = await _@(Model.LowerClassName)Rep.AsQueryable().Where(u => input.@(column.PropertyName)List.Contains(u.@(column.PropertyName))).ToListAsync() ?? throw Oops.Oh(ErrorCodeEnum.D1002);
|
|
|
-}
|
|
|
+ }
|
|
|
return await _@(Model.LowerClassName)Rep.FakeDeleteAsync(list); //假删除
|
|
|
//return await _@(Model.LowerClassName)Rep.DeleteAsync(list); //真删除
|
|
|
}
|
|
|
@@ -175,42 +150,38 @@ if (column.QueryWhether == "Y"){
|
|
|
/// </summary>
|
|
|
/// <param name="input"></param>
|
|
|
/// <returns></returns>
|
|
|
- [ApiDescriptionSettings(Name = "Update"), HttpPost]
|
|
|
[DisplayName("更新@(Model.BusName)")]
|
|
|
+ [ApiDescriptionSettings(Name = "Update"), HttpPost]
|
|
|
public async Task Update(Update@(Model.ClassName)Input input)
|
|
|
{
|
|
|
var entity = input.Adapt<@(Model.ClassName)>();
|
|
|
await _@(Model.LowerClassName)Rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
|
|
|
}
|
|
|
-@if (hasSetStatus) {
|
|
|
-@:
|
|
|
+ @if (Model.TableField.Any(col => col.NetType == "StatusEnum" && col.PropertyName == "Status")) {
|
|
|
+ @:
|
|
|
@:/// <summary>
|
|
|
@:/// 设置@(Model.BusName)状态 🚫
|
|
|
@:/// </summary>
|
|
|
@:/// <param name="input"></param>
|
|
|
@:/// <returns></returns>
|
|
|
- @:[ApiDescriptionSettings(Name = "SetStatus"), HttpPost]
|
|
|
@:[DisplayName("设置@(Model.BusName)状态")]
|
|
|
- @:public async Task SetStatus(BaseStatusInput input)
|
|
|
+ @:[ApiDescriptionSettings(Name = "SetStatus"), HttpPost]
|
|
|
+ @:public async Task Set@(Model.ClassName)Status(BaseStatusInput input)
|
|
|
@:{
|
|
|
@:await _@(Model.LowerClassName)Rep.AsUpdateable().SetColumns(u => u.Status, input.Status).Where(u => u.Id == input.Id).ExecuteCommandAsync();
|
|
|
@:}
|
|
|
-}
|
|
|
+ }
|
|
|
|
|
|
/// <summary>
|
|
|
- /// 获取@(Model.BusName) ℹ️
|
|
|
+ /// 获取@(Model.BusName)详情 ℹ️
|
|
|
/// </summary>
|
|
|
/// <param name="input"></param>
|
|
|
/// <returns></returns>
|
|
|
+ [DisplayName("获取@(Model.BusName)详情")]
|
|
|
[ApiDescriptionSettings(Name = "Detail"), HttpGet]
|
|
|
- [DisplayName("获取@(Model.BusName)")]
|
|
|
public async Task<@(Model.ClassName)> Detail([FromQuery] QueryById@(Model.ClassName)Input input)
|
|
|
{
|
|
|
-@foreach (var column in Model.TableField){
|
|
|
-if (@column.ColumnKey == "True"){
|
|
|
- @:return await _@(Model.LowerClassName)Rep.GetFirstAsync(u => u.@(column.PropertyName) == input.@(column.PropertyName));
|
|
|
-}
|
|
|
-}
|
|
|
+ return await _@(Model.LowerClassName)Rep.GetFirstAsync(u => u.@(primaryKey.PropertyName) == input.@(primaryKey.PropertyName));
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
@@ -218,83 +189,71 @@ if (@column.ColumnKey == "True"){
|
|
|
/// </summary>
|
|
|
/// <param name="input"></param>
|
|
|
/// <returns></returns>
|
|
|
- [ApiDescriptionSettings(Name = "List"), HttpGet]
|
|
|
[DisplayName("获取@(Model.BusName)列表")]
|
|
|
+ [ApiDescriptionSettings(Name = "List"), HttpGet]
|
|
|
public async Task<List<@(Model.ClassName)Output>> List([FromQuery] Page@(Model.ClassName)Input input)
|
|
|
{
|
|
|
return await _@(Model.LowerClassName)Rep.AsQueryable().Select<@(Model.ClassName)Output>().ToListAsync();
|
|
|
}
|
|
|
-@foreach (var column in Model.TableField){
|
|
|
-if(column.EffectType == "fk" && (@column.WhetherAddUpdate == "Y" || column.QueryWhether == "Y")){
|
|
|
+@foreach (var column in Model.TableField.Where(u => u.EffectType == "fk" && (u.WhetherAddUpdate == "Y" || u.QueryWhether == "Y"))){
|
|
|
@:
|
|
|
+ var dropdownName = $"{column.FkEntityName}{Regex.Replace(column.PropertyName, "[iI]d$", "")}Dropdown";
|
|
|
@:/// <summary>
|
|
|
@:/// 获取@(column.ColumnComment)列表 🔖
|
|
|
@:/// </summary>
|
|
|
@:/// <returns></returns>
|
|
|
- @:[ApiDescriptionSettings(Name = "@(column.FkEntityName)@(column.PropertyName)Dropdown"), HttpGet]
|
|
|
@:[DisplayName("获取@(column.ColumnComment)列表")]
|
|
|
- @:public async Task<dynamic> @(column.FkEntityName)@(column.PropertyName)Dropdown()
|
|
|
+ @:[ApiDescriptionSettings(Name = "@(dropdownName)"), HttpGet]
|
|
|
+ @:public async Task<dynamic> @(dropdownName)([FromQuery]bool all)
|
|
|
@:{
|
|
|
- @:return await _@(Model.LowerClassName)Rep.Context.Queryable<@(column.FkEntityName)>().Select(u => new
|
|
|
+ var columnList = column.FkColumnName.Split(",").Select(name => $"{{u.{name}}}").ToList();
|
|
|
+ @:return await _@(Model.LowerClassName)Rep.Context.Queryable<@(column.FkEntityName)>()
|
|
|
+ @:.InnerJoinIF<@Model.ClassName>(!all, (u, r) => u.@(column.FkLinkColumnName) == r.@(column.PropertyName))
|
|
|
+ @:.Select(u => new
|
|
|
@:{
|
|
|
- @:Label = u.@(column.FkColumnName),
|
|
|
+ @:Label = $"@(string.Join("-", columnList))",
|
|
|
@:Value = u.@(column.FkLinkColumnName)
|
|
|
@:}
|
|
|
@:).ToListAsync();
|
|
|
@:}
|
|
|
}
|
|
|
-}
|
|
|
-@foreach (var column in Model.TableField){
|
|
|
-if(column.EffectType == "Upload"){
|
|
|
-@:
|
|
|
- @:/// <summary>
|
|
|
- @:/// 上传@(column.ColumnComment) ⬆️
|
|
|
- @:/// </summary>
|
|
|
- @:/// <param name="file"></param>
|
|
|
- @:/// <returns></returns>
|
|
|
- @:[ApiDescriptionSettings(Name = "Upload@(column.PropertyName)"), HttpPost]
|
|
|
- @:[DisplayName("上传@(column.ColumnComment)")]
|
|
|
- @:public async Task<SysFile> Upload@(column.PropertyName)([Required] IFormFile file)
|
|
|
- @:{
|
|
|
- @:var service = App.GetRequiredService<SysFileService>();
|
|
|
- @:return await service.UploadFile(new FileUploadInput { File = file, Path = "upload/@(column.PropertyName)" });
|
|
|
- @:}
|
|
|
-}
|
|
|
-}
|
|
|
-@foreach (var column in Model.TableField){
|
|
|
-if(column.EffectType == "ApiTreeSelect" && !definedObjects.ContainsKey("@(column.FkEntityName)Tree")){
|
|
|
+@{
|
|
|
+var definedObjects = new Dictionary<string, object>();
|
|
|
+@foreach (var column in Model.TableField.Where(u => u.EffectType == "ApiTreeSelect" && !definedObjects.ContainsKey("@(u.FkEntityName)Tree"))){
|
|
|
@:
|
|
|
definedObjects.Add("@(column.FkEntityName)Tree", 1);
|
|
|
@:/// <summary>
|
|
|
@:/// 获取@(column.ColumnComment)选择数据 🔖
|
|
|
@:/// </summary>
|
|
|
- @:[ApiDescriptionSettings(Name = "@(column.FkEntityName)Tree"), HttpGet]
|
|
|
@:[DisplayName("获取@(column.ColumnComment)选择数据")]
|
|
|
- @:public async Task<List<@(column.FkEntityName)TreeOutput>> @(column.FkEntityName)Tree()
|
|
|
+ @:[ApiDescriptionSettings(Name = "@(column.FkEntityName)Tree"), HttpGet]
|
|
|
+ @:public async Task<List<@(column.FkEntityName)TreeOutput>> @(column.FkEntityName)Tree([FromQuery]bool all)
|
|
|
@:{
|
|
|
- displayColumnList = column.DisplayColumn.Split(",").Select(u => $"{{u.{u}}}").ToList();
|
|
|
- @:return await _@(Model.LowerClassName)Rep.Context.Queryable<@(column.FkEntityName)>().Select(u => new @(column.FkEntityName)TreeOutput {
|
|
|
- @:Label = $"@(string.Join("-", displayColumnList))",
|
|
|
+ var columnList = column.DisplayColumn.Split(",").Select(name => $"{{u.{name}}}").ToList();
|
|
|
+ @:return await _@(Model.LowerClassName)Rep.Context.Queryable<@column.FkEntityName>()
|
|
|
+ @:.InnerJoinIF<@Model.ClassName>(!all, (u, r) => u.@(column.ValueColumn) == r.@(column.PropertyName))
|
|
|
+ @:.Select(u => new @(column.FkEntityName)TreeOutput {
|
|
|
+ @:Label = $"@(string.Join("-", columnList))",
|
|
|
@:Value = u.@column.ValueColumn
|
|
|
- @:}, true).ToTreeAsync(u => u.Children, u => u.@(column.PidColumn), @(column.WhetherRequired == "Y" ? "0" : "null"));
|
|
|
+ @:}, true).ToTreeAsync(u => u.Children, u => u.@column.PidColumn, @(column.WhetherRequired == "Y" ? "0" : "null"));
|
|
|
@:}
|
|
|
}
|
|
|
}
|
|
|
-@if (hasdictService) {
|
|
|
+@foreach (var column in Model.TableField.Where(u => u.EffectType == "Upload")) {
|
|
|
@:
|
|
|
@:/// <summary>
|
|
|
- @:/// 获取字典文本列表 🔖
|
|
|
+ @:/// 上传@(column.ColumnComment) ⬆️
|
|
|
@:/// </summary>
|
|
|
- @:/// <param name="dictTypeCode"></param>
|
|
|
+ @:/// <param name="file"></param>
|
|
|
@:/// <returns></returns>
|
|
|
- @:[ApiDescriptionSettings, HttpGet]
|
|
|
- @:[DisplayName("获取字典文本列表")]
|
|
|
- @:private List<string> GetDictDataTextList(string dictTypeCode)
|
|
|
+ @:[DisplayName("上传@(column.ColumnComment)")]
|
|
|
+ @:[ApiDescriptionSettings(Name = "Upload@(column.PropertyName)"), HttpPost]
|
|
|
+ @:public async Task<SysFile> Upload@(column.PropertyName)([Required] IFormFile file)
|
|
|
@:{
|
|
|
- @: return _sysDictTypeService.GetDataList(new GetDataDictTypeInput { Code = dictTypeCode }).Result?.Select(x => x.Value).ToList();
|
|
|
+ @:return await _sysFileService.UploadFile(new FileUploadInput { File = file, Path = "upload/@(Model.ClassName)/@(column.PropertyName)" });
|
|
|
@:}
|
|
|
}
|
|
|
-@if (importField?.Count() > 0) {
|
|
|
+@if (importFields.Count() > 0) {
|
|
|
@:
|
|
|
@:/// <summary>
|
|
|
@:/// 下载@(Model.BusName)数据导入模板 ⬇️
|
|
|
@@ -304,7 +263,19 @@ if(column.EffectType == "ApiTreeSelect" && !definedObjects.ContainsKey("@(column
|
|
|
@:[ApiDescriptionSettings(Name = "Import"), HttpGet, NonUnify]
|
|
|
@:public IActionResult DownloadTemplate()
|
|
|
@:{
|
|
|
+ var fieldsList = importFields.Where(u => u.EffectType == "fk" || u.EffectType == "ApiTreeSelect").ToList();
|
|
|
+ if (fieldsList.Any()) {
|
|
|
+ @:return ExcelHelper.ExportTemplate(new List<Export@(Model.ClassName)Output>(), "@(Model.BusName)导入模板", (_, info) =>
|
|
|
+ @:{
|
|
|
+ foreach (var column in fieldsList) {
|
|
|
+ var columnList = (column.EffectType == "fk" ? column.FkColumnName : column.DisplayColumn).Split(",").Select(n => $"{{u.{n}}}").ToList();
|
|
|
+ @:if (nameof(Export@(Model.ClassName)Output.@(column.PropertyName)Label) == info.Name) return _@(Model.LowerClassName)Rep.Context.Queryable<@(column.FkEntityName)>().Select(u => $"@(string.Join("-", columnList))").Distinct().ToList();
|
|
|
+ }
|
|
|
+ @:return null;
|
|
|
+ @:});
|
|
|
+ } else {
|
|
|
@:return ExcelHelper.ExportTemplate(new List<Export@(Model.ClassName)Output>(), "@(Model.BusName)导入模板");
|
|
|
+ }
|
|
|
@:}
|
|
|
@:
|
|
|
@:/// <summary>
|
|
|
@@ -317,47 +288,69 @@ if(column.EffectType == "ApiTreeSelect" && !definedObjects.ContainsKey("@(column
|
|
|
@:{
|
|
|
@:lock (this)
|
|
|
@:{
|
|
|
+ var dictTableField = Model.TableField.Where(x => x.WhetherImport == "Y" && x.EffectType == "Select") ?? default;
|
|
|
foreach (var column in dictTableField){
|
|
|
- @:var @(@column.LowerPropertyName)DictMap = _sysDictTypeService.GetDataList(new GetDataDictTypeInput { Code = "@(@column.DictTypeCode)" }).Result.ToDictionary(x => x.Value, x => x.Code);
|
|
|
+ @:var @(column.LowerPropertyName)DictMap = _sysDictTypeService.GetDataList(new GetDataDictTypeInput { Code = "@(column.DictTypeCode)" }).Result.ToDictionary(x => x.Value, x => x.Code);
|
|
|
}
|
|
|
- @:var stream = ExcelHelper.ImportData<Import@(@Model.ClassName)Input, @(@Model.ClassName)>(file, (list, markerErrorAction) =>
|
|
|
+
|
|
|
+ @:var stream = ExcelHelper.ImportData<Import@(Model.ClassName)Input, @(Model.ClassName)>(file, (list, markerErrorAction) =>
|
|
|
@:{
|
|
|
- @:_@(@Model.LowerClassName)Rep.Context.Utilities.PageEach(list, 2048, pageItems =>
|
|
|
+ @:_@(Model.LowerClassName)Rep.Context.Utilities.PageEach(list, 2048, pageItems =>
|
|
|
@:{
|
|
|
+ foreach (var column in importFields.Where(u => u.EffectType == "fk" || u.EffectType == "ApiTreeSelect")) {
|
|
|
+ @:// 链接 @(column.ColumnComment)
|
|
|
+ @:var @(column.LowerPropertyName)LabelList = pageItems.Where(x => x.@(column.PropertyName)Label != null).Select(x => x.@(column.PropertyName)Label).Distinct().ToList();
|
|
|
+ @:if (@(column.LowerPropertyName)LabelList.Any()) {
|
|
|
+ var valueColumn = column.EffectType == "fk" ? column.FkLinkColumnName : column.ValueColumn;
|
|
|
+ var columnList = (column.EffectType == "fk" ? column.FkColumnName : column.DisplayColumn).Split(",").Select(n => $"{{u.{n}}}").ToList();
|
|
|
+ @:var @(column.LowerPropertyName)LinkMap = _@(Model.LowerClassName)Rep.Context.Queryable<@(column.FkEntityName)>().Where(u => @(column.LowerPropertyName)LabelList.Contains($"@(string.Join("-", columnList))")).ToList().ToDictionary(u => $"@(string.Join("-", columnList))", u => u.@(valueColumn));
|
|
|
+ @:pageItems.ForEach(e => e.@(column.PropertyName) = @(column.LowerPropertyName)LinkMap?.GetValueOrDefault(e.@(column.PropertyName)Label, default));
|
|
|
+ @:}
|
|
|
+ }
|
|
|
+
|
|
|
+ @:
|
|
|
@:// 校验并过滤必填基本类型为null的字段
|
|
|
@:var rows = pageItems.Where(x => {
|
|
|
- foreach (var column in importField.Where(x => x.WhetherRequired == "Y" && Regex.IsMatch(x.NetType, "(int|long|double|float|bool|Enum[?]?)"))){
|
|
|
- @:if (x.@(@column.PropertyName) == null){
|
|
|
- @:x.Error = "@(@column.ColumnComment)不能为空";
|
|
|
+ foreach (var column in importFields.Where(x => x.WhetherRequired == "Y" && Regex.IsMatch(x.NetType, "(int|long|double|float|bool|Enum[?]?)"))){
|
|
|
+ @:if (x.@(column.PropertyName) == null){
|
|
|
+ @:x.Error = "@(column.ColumnComment)不能为空";
|
|
|
@:return false;
|
|
|
@:}
|
|
|
}
|
|
|
@:return true;
|
|
|
- @:}).Adapt<List<@(@Model.ClassName)>>();
|
|
|
- if (hasdictService){
|
|
|
+ @:}).Adapt<List<@(Model.ClassName)>>();
|
|
|
+
|
|
|
+ if (dictTableField.Any()) {
|
|
|
+ @:
|
|
|
@:// 映射字典值
|
|
|
- @:foreach(var row in rows){
|
|
|
+ @:foreach(var row in rows) {
|
|
|
foreach (var column in dictTableField){
|
|
|
- @:row.@(@column.PropertyName) = @(@column.LowerPropertyName)DictMap.GetValueOrDefault(row.@(@column.PropertyName) ?? "");
|
|
|
+ @:row.@(column.PropertyName) = @(column.LowerPropertyName)DictMap.GetValueOrDefault(row.@(column.PropertyName) ?? "");
|
|
|
}
|
|
|
@:}
|
|
|
}
|
|
|
- @:var storageable = _@(@Model.LowerClassName)Rep.Context.Storageable(rows)
|
|
|
- foreach (var column in importField){
|
|
|
- if (@column.WhetherRequired == "Y"){
|
|
|
+
|
|
|
+ @:
|
|
|
+ @:var storageable = _@(Model.LowerClassName)Rep.Context.Storageable(rows)
|
|
|
+ foreach (var column in importFields){
|
|
|
+ if (column.WhetherRequired == "Y"){
|
|
|
if(column.NetType.TrimEnd('?') == "string"){
|
|
|
- @:.SplitError(it => string.IsNullOrWhiteSpace(it.Item.@(@column.PropertyName)), "@(@column.ColumnComment)不能为空")
|
|
|
+ @:.SplitError(it => string.IsNullOrWhiteSpace(it.Item.@(column.PropertyName)), "@(column.ColumnComment)不能为空")
|
|
|
} else if(column.NetType.EndsWith('?') == true){
|
|
|
- @:.SplitError(it => it.Item.@(@column.PropertyName) == null, "@(@column.ColumnComment)不能为空")
|
|
|
+ @:.SplitError(it => it.Item.@(column.PropertyName) == null, "@(column.ColumnComment)不能为空")
|
|
|
}}
|
|
|
- if (@column.NetType?.TrimEnd('?') == "string"){
|
|
|
- @:.SplitError(it => it.Item.@(@column.PropertyName)?.Length > @column.ColumnLength, "@(@column.ColumnComment)长度不能超过@(@column.ColumnLength)个字符")
|
|
|
+ if (column.NetType?.TrimEnd('?') == "string"){
|
|
|
+ @:.SplitError(it => it.Item.@(column.PropertyName)?.Length > @(column.ColumnLength), "@(column.ColumnComment)长度不能超过@(column.ColumnLength)个字符")
|
|
|
}}
|
|
|
+ @:.SplitError(it => it.Any(), "记录已存在")
|
|
|
+ @:.SplitInsert(_ => true)
|
|
|
@:.ToStorage();
|
|
|
|
|
|
+ @:
|
|
|
@:storageable.BulkCopy();
|
|
|
@:storageable.BulkUpdate();
|
|
|
-
|
|
|
+ @:
|
|
|
+ @:// 标记错误信息
|
|
|
@:markerErrorAction.Invoke(storageable, pageItems, rows);
|
|
|
@:});
|
|
|
@:});
|