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 } }