using NCC.Dependency;
using NCC.DynamicApiController;
using NCC.System.Entitys.Permission;
using NCC.VisualDev.Entitys;
using NCC.VisualDev.Entitys.Dto.VisualDev;
using NCC.VisualDev.Interfaces;
using NCC.VisualDev.Run.Interfaces;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using System.Threading.Tasks;
using Mapster;
using System.Collections.Generic;
using System.Linq;
using NCC.Common.Util;
using NCC.System.Entitys.System;
using NCC.VisualDev.Entitys.Model.VisualDevModelData;
using System;
using NCC.System.Interfaces.System;
using NCC.VisualDev.Entitys.Dto.VisualDevModelData;
using NCC.Common.Extension;
using NCC.Common.Helper;
using NCC.JsonSerialization;
namespace NCC.VisualDev
{
///
/// 可视化开发基础
///
[ApiDescriptionSettings(Tag = "VisualDev", Name = "Base", Order = 171)]
[Route("api/visualdev/[controller]")]
public class VisualDevService : IVisualDevService, IDynamicApiController, ITransient
{
private readonly ISqlSugarRepository _visualDevRepository;
private readonly IDictionaryDataService _dictionaryDataService;
private readonly IRunService _runService;
///
/// 初始化一个类型的新实例
///
public VisualDevService(ISqlSugarRepository visualDevRepository, IRunService runService, IDictionaryDataService dictionaryDataService)
{
_visualDevRepository = visualDevRepository;
_dictionaryDataService = dictionaryDataService;
_runService = runService;
}
#region Get
///
/// 获取功能列表
///
/// 请求参数
///
[HttpGet("")]
public async Task GetList([FromQuery] VisualDevListQueryInput input)
{
var data = await _visualDevRepository.Context.Queryable((a, b, c) => new JoinQueryInfos(JoinType.Left, b.Id == a.CreatorUserId, JoinType.Left, c.Id == a.LastModifyUserId))
.Select((a, b, c) => new { Id = a.Id, FullName = a.FullName, EnCode = a.EnCode, State = a.State, Type = a.Type, Tables = a.Tables, Description = a.Description, Category = a.Category, CreatorTime = a.CreatorTime, CreatorUser = SqlFunc.MergeString(b.RealName, "/", b.Account), Lastmodifytime = a.LastModifyTime, Lastmodifyuser = SqlFunc.MergeString(c.RealName, SqlFunc.IIF(c.RealName == null, "", "/"), c.Account), DeleteMark = a.DeleteMark, SortCode = a.SortCode, ParentId = a.Category })
.MergeTable().Select()
.WhereIF(!string.IsNullOrEmpty(input.keyword), v => v.fullName.Contains(input.keyword) || v.enCode.Contains(input.keyword))
.Where(v => v.deleteMark == null && v.type == input.type)
.OrderBy(o => o.category).OrderBy(o => o.sortCode)
.ToListAsync();
var parentIds = data.Select(x => x.parentId).ToList().Distinct();
var parentData = await _visualDevRepository.Context.Queryable()
.Select(d => new { ParentId = "-1", FullName = d.FullName, Id = d.Id, DeleteMark = d.DeleteMark, SortCode = d.SortCode, state = d.EnabledMark }).MergeTable().Select()
.Where(d => parentIds.Contains(d.id) && d.deleteMark == null && d.state.Equals("1")).OrderBy(o => o.sortCode).ToListAsync();
var treeList = data.Union(parentData).ToList().ToTree("-1");
return new { list = treeList };
}
///
/// 获取功能列表下拉框
///
///
///
[HttpGet("Selector")]
public async Task GetSelector([FromQuery] VisualDevSelectorInput input)
{
var data = await _visualDevRepository.Where(v => v.Type == input.type && v.State == 1 && v.DeleteMark == null).OrderBy(o => o.SortCode).ToListAsync();
var output = data.Adapt>();
var parentIds = output.Select(x => x.parentId).ToList().Distinct();
var pList = new List();
var parentData = await _visualDevRepository.Context.Queryable().Where(d => parentIds.Contains(d.Id) && d.DeleteMark == null).ToListAsync();
foreach (var item in parentData)
{
var pData = item.Adapt();
pData.parentId = "-1";
pList.Add(pData);
}
var treeList = output.Union(pList).ToList().ToTree("-1");
return new { list = treeList };
}
///
/// 获取功能信息
///
/// 主键id
///
[HttpGet("{id}")]
public async Task GetInfo(string id)
{
var data = await _visualDevRepository.FirstOrDefaultAsync(v => v.Id == id && v.DeleteMark == null);
var output = data.Adapt();
return output;
}
///
/// 获取表单主表属性下拉框
///
///
///
[HttpGet("{id}/FormDataFields")]
public async Task GetFormDataFields(string id)
{
var templateEntity = await _visualDevRepository.FirstOrDefaultAsync(v => v.Id == id && v.DeleteMark == null);
var formData = TemplateKeywordsHelper.ReplaceKeywords(templateEntity.FormData).Deserialize();
//剔除多虑多余控件
var newFields = _runService.TemplateDataConversion(formData.fields);
var fieldsModels = newFields.FindAll(x => !"".Equals(x.__vModel__) && !"table".Equals(x.__config__.NCCKey) && !"relationForm".Equals(x.__config__.NCCKey));
var output = fieldsModels.Select(x => new VisualDevFormDataFieldsOutput()
{
label = x.__config__.label,
vmodel = x.__vModel__
}).ToList();
return new { list = output };
}
///
/// 获取表单主表属性列表
///
///
///
[HttpGet("{id}/FieldDataSelect")]
public async Task GetFieldDataSelect(string id)
{
var templateEntity = await _visualDevRepository.FirstOrDefaultAsync(v => v.Id == id);
var formData = TemplateKeywordsHelper.ReplaceKeywords(templateEntity.FormData).Deserialize();
var columnData = TemplateKeywordsHelper.ReplaceKeywords(templateEntity.ColumnData).Deserialize();
//获取值 无分页
VisualDevModelListQueryInput listQueryInput = new VisualDevModelListQueryInput
{
dataType = "1",
sidx = columnData.defaultSidx,
sort = columnData.sort
};
var realList = (await _runService.GetListResult(templateEntity, listQueryInput)).list;
return realList;
}
#endregion
#region Post
///
/// 新建功能信息
///
/// 实体对象
///
[HttpPost("")]
public async Task Create([FromBody] VisualDevCrInput input)
{
var entity = input.Adapt();
try
{
//开启事务
_visualDevRepository.Ado.BeginTran();
var visualDev = await _visualDevRepository.Context.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).CallEntityMethod(m => m.Create()).ExecuteReturnEntityAsync();
//关闭事务
_visualDevRepository.Ado.CommitTran();
}
catch (Exception)
{
_visualDevRepository.Ado.RollbackTran();
throw;
}
}
///
/// 修改接口
///
/// 主键id
/// 参数
///
[HttpPut("{id}")]
public async Task Update(string id, [FromBody] VisualDevUpInput input)
{
var entity = input.Adapt();
entity.FlowId = entity.Id;
try
{
//开启事务
_visualDevRepository.Ado.BeginTran();
await _visualDevRepository.Context.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.LastModify()).ExecuteCommandAsync();
//关闭事务
_visualDevRepository.Ado.CommitTran();
}
catch (Exception)
{
_visualDevRepository.Ado.RollbackTran();
throw;
}
}
///
/// 删除接口
///
/// 主键id
///
[HttpDelete("{id}")]
public async Task Delete(string id)
{
var entity = await _visualDevRepository.FirstOrDefaultAsync(v => v.Id == id && v.DeleteMark == null);
await _visualDevRepository.Context.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.Delete()).ExecuteCommandAsync();
}
///
/// 复制
///
/// 主键值
///
[HttpPost("{id}/Actions/Copy")]
public async Task ActionsCopy(string id)
{
var entity = await _visualDevRepository.FirstOrDefaultAsync(v => v.Id == id && v.DeleteMark == null);
entity.FullName = entity.FullName + "_副本";
entity.EnCode = entity.EnCode + ".1";
entity.State = 0;
{
await _visualDevRepository.Context.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).CallEntityMethod(m => m.Creator()).ExecuteCommandAsync();
}
}
#endregion
#region PublicMethod
///
/// 获取功能信息
///
/// 主键ID
///
[NonAction]
public async Task GetInfoById(string id)
{
return await _visualDevRepository.FirstOrDefaultAsync(v => v.Id == id && v.DeleteMark == null);
}
///
/// 判断功能ID是否存在
///
///
[NonAction]
public async Task GetDataExists(string id)
{
return await _visualDevRepository.AnyAsync(it => it.Id == id && it.DeleteMark == null);
}
///
/// 判断是否存在编码、名称相同的数据
///
///
[NonAction]
public async Task GetDataExists(string enCode, string fullName)
{
return await _visualDevRepository.AnyAsync(it => it.EnCode == enCode && it.FullName == fullName && it.DeleteMark == null);
}
///
/// 新增导入数据
///
///
///
[NonAction]
public async Task CreateImportData(VisualDevEntity input)
{
}
#endregion
}
}