Files
tnb.server/workflow/Tnb.WorkFlow/Service/FlowEngineService.cs
2023-05-31 10:19:05 +08:00

700 lines
27 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using JNPF.Common.Const;
using JNPF.Common.Core.Manager;
using JNPF.Common.Core.Manager.Files;
using JNPF.Common.Enums;
using JNPF.Common.Extension;
using JNPF.Common.Filter;
using JNPF.Common.Security;
using JNPF.DependencyInjection;
using JNPF.DynamicApiController;
using JNPF.FriendlyException;
using JNPF.Systems.Entitys.Permission;
using JNPF.Systems.Entitys.System;
using JNPF.Systems.Interfaces.System;
using JNPF.VisualDev.Engine.Core;
using JNPF.VisualDev.Entitys;
using JNPF.VisualDev.Interfaces;
using JNPF.WorkFlow.Entitys.Dto.FlowEngine;
using JNPF.WorkFlow.Entitys.Entity;
using JNPF.WorkFlow.Entitys.Model;
using JNPF.WorkFlow.Entitys.Model.Properties;
using JNPF.WorkFlow.Interfaces.Repository;
using JNPF.WorkFlow.Interfaces.Service;
using Mapster;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
namespace JNPF.WorkFlow.Service;
/// <summary>
/// 流程设计.
/// </summary>
[ApiDescriptionSettings(Tag = "WorkflowEngine", Name = "FlowEngine", Order = 301)]
[Route("api/workflow/Engine/[controller]")]
public class FlowEngineService : IFlowEngineService, IDynamicApiController, ITransient
{
private readonly ISqlSugarRepository<FlowEngineEntity> _repository;
private readonly IFlowTaskRepository _flowTaskRepository;
private readonly IDictionaryDataService _dictionaryDataService;
private readonly IRunService _runService;
private readonly IVisualDevService _visualDevService;
private readonly IUserManager _userManager;
private readonly IFileManager _fileManager;
private readonly IDataBaseManager _dataBaseManager;
private readonly ITenant _db;
public FlowEngineService(
ISqlSugarRepository<FlowEngineEntity> repository,
IFlowTaskRepository flowTaskRepository,
IDictionaryDataService dictionaryDataService,
IRunService runService,
IVisualDevService visualDevService,
IUserManager userManager,
IFileManager fileManager,
IDataBaseManager dataBaseManager,
ISqlSugarClient context)
{
_repository = repository;
_flowTaskRepository = flowTaskRepository;
_dictionaryDataService = dictionaryDataService;
_runService = runService;
_visualDevService = visualDevService;
_userManager = userManager;
_fileManager = fileManager;
_dataBaseManager = dataBaseManager;
_db = context.AsTenant();
}
#region GET
/// <summary>
/// 列表.
/// </summary>
/// <param name="input">请求参数.</param>
/// <returns></returns>
[HttpGet("")]
public async Task<dynamic> GetList([FromQuery] FlowEngineListInput input)
{
var list = await _repository.AsSugarClient().Queryable<FlowEngineEntity, DictionaryDataEntity>((a, b) => new JoinQueryInfos(JoinType.Left, a.Category == b.EnCode))
.Where((a, b) => a.DeleteMark == null && b.DictionaryTypeId == "507f4f5df86b47588138f321e0b0dac7")
.Where(a => !(a.FormType == 2 && a.Type == 1))
.WhereIF(input.category.IsNotEmptyOrNull(), a => a.Category == input.category)
.WhereIF(input.keyword.IsNotEmptyOrNull(), a => a.FullName.Contains(input.keyword) || a.EnCode.Contains(input.keyword))
.Select((a, b) => new FlowEngineListAllOutput
{
category = b.FullName,
id = a.Id,
description = a.Description,
creatorTime = a.CreatorTime,
creatorUser = SqlFunc.Subqueryable<UserEntity>().Where(u => u.Id == a.CreatorUserId).Select(u => SqlFunc.MergeString(u.RealName, "/", u.Account)),
enCode = a.EnCode,
enabledMark = a.EnabledMark,
flowTemplateJson = a.FlowTemplateJson,
formData = a.FormTemplateJson,
fullName = a.FullName,
formType = a.FormType,
icon = a.Icon,
iconBackground = a.IconBackground,
lastModifyTime = a.LastModifyTime,
lastModifyUser = SqlFunc.Subqueryable<UserEntity>().Where(u => u.Id == a.LastModifyUserId).Select(u => SqlFunc.MergeString(u.RealName, "/", u.Account)),
sortCode = a.SortCode,
type = a.Type,
visibleType = a.VisibleType,
}).MergeTable().OrderBy(a => a.sortCode).OrderBy(a => a.creatorTime, OrderByType.Desc)
.OrderByIF(!string.IsNullOrEmpty(input.keyword), t => t.lastModifyTime, OrderByType.Desc).ToPagedListAsync(input.currentPage, input.pageSize);
return PageResult<FlowEngineListAllOutput>.SqlSugarPageResult(list);
}
/// <summary>
/// 列表(树形).
/// </summary>
/// <returns></returns>
[HttpGet("ListAll")]
public async Task<dynamic> GetListAll()
{
var list1 = await GetFlowFormList();
var dicDataInfo = await _dictionaryDataService.GetInfo(list1.First().parentId);
var dicDataList = await _dictionaryDataService.GetList(dicDataInfo.DictionaryTypeId);
var list2 = new List<FlowEngineListOutput>();
foreach (var item in dicDataList)
{
list2.Add(new FlowEngineListOutput()
{
fullName = item.FullName,
parentId = "0",
id = item.Id,
num = list1.FindAll(x => x.category == item.EnCode).Count
});
}
var output = list1.Union(list2).ToList().ToTree();
return new { list = output };
}
/// <summary>
/// 列表(分页).
/// </summary>
/// <param name="input">请求参数.</param>
/// <returns></returns>
[HttpGet("PageListAll")]
public async Task<dynamic> GetListPageAll([FromQuery] FlowEngineListInput input)
{
var data = await GetFlowFormList();
if (input.category.IsNotEmptyOrNull())
data = data.FindAll(x => x.category == input.category);
if (input.keyword.IsNotEmptyOrNull())
data = data.FindAll(o => o.fullName.Contains(input.keyword) || o.enCode.Contains(input.keyword));
var pageList = new SqlSugarPagedList<FlowEngineListOutput>()
{
list = data.Skip((input.currentPage - 1)* input.pageSize).Take(input.pageSize).ToList(),
pagination = new Pagination()
{
CurrentPage = input.currentPage,
PageSize = input.pageSize,
Total = data.Count
}
};
return PageResult<FlowEngineListOutput>.SqlSugarPageResult(pageList);
}
/// <summary>
/// 信息.
/// </summary>
/// <param name="id">主键值.</param>
/// <returns></returns>
[HttpGet("{id}")]
public async Task<dynamic> GetInfo_Api(string id)
{
return (await GetInfo(id)).Adapt<FlowEngineInfoOutput>();
}
/// <summary>
/// 列表(子流程选择流程).
/// </summary>
/// <param name="type">(预留字段).</param>
/// <returns></returns>
[HttpGet("Selector")]
public async Task<dynamic> ListSelect([FromQuery] int type)
{
var list1 = await GetOutList();
if (type.IsEmpty())
list1 = list1.FindAll(x => x.formType == type);
var dicDataInfo = await _dictionaryDataService.GetInfo(list1.First().parentId);
var dicDataList = (await _dictionaryDataService.GetList(dicDataInfo.DictionaryTypeId)).FindAll(x => x.EnabledMark == 1);
var list2 = new List<FlowEngineListOutput>();
foreach (var item in dicDataList)
{
var index = list1.FindAll(x => x.category == item.EnCode).Count;
if (index > 0)
{
list2.Add(new FlowEngineListOutput()
{
fullName = item.FullName,
parentId = "0",
id = item.Id,
num = index
});
}
}
var output = list1.Union(list2).ToList().ToTree();
return new { list = output };
}
/// <summary>
/// 表单主表属性.
/// </summary>
/// <param name="id">主键.</param>
/// <returns></returns>
[HttpGet("{id}/FormDataFields")]
public async Task<dynamic> getFormDataField(string id)
{
var entity = await GetInfo(id);
List<FlowEngineFieldOutput> formDataFieldList = new List<FlowEngineFieldOutput>();
if (entity.FormType == 1)
{
var dicList = entity.FormTemplateJson.ToList<Dictionary<string, object>>();
formDataFieldList = dicList.Select(x =>
new FlowEngineFieldOutput()
{
vmodel = x.ContainsKey("filedId") ? x["filedId"].ToString() : string.Empty,
label = x.ContainsKey("filedName") ? x["filedName"].ToString() : string.Empty
}).ToList();
}
else
{
var formTemplateBase = new TemplateParsingBase(entity.FormTemplateJson, entity.Tables, true);
formDataFieldList = formTemplateBase.SingleFormData
.Where(x => x.__config__.jnpfKey != JnpfKeyConst.RELATIONFORM && x.__config__.jnpfKey != "relationFlow")
.Select(x => new FlowEngineFieldOutput() { vmodel = x.__vModel__, label = x.__config__.label }).ToList();
}
return new { list = formDataFieldList };
}
/// <summary>
/// 表单列表.
/// </summary>
/// <param name="id">流程id.</param>
/// <returns></returns>
[HttpGet("{id}/FieldDataSelect")]
public async Task<dynamic> getFormData(string id)
{
var flowTaskList = await _flowTaskRepository.GetTaskList(id);
return flowTaskList.Select(x => new FlowEngineListSelectOutput()
{
id = x.Id,
fullName = SqlFunc.MergeString(x.FullName, "/", x.EnCode)
}).ToList();
}
/// <summary>
/// 导出.
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}/Actions/ExportData")]
public async Task<dynamic> ActionsExport(string id)
{
var importModel = new FlowEngineImportOutput();
importModel.flowEngine = await _repository.GetFirstAsync(x => x.Id == id && x.DeleteMark == null);
importModel.visibleList = await _repository.AsSugarClient().Queryable<FlowEngineVisibleEntity>().Where(x => x.FlowId == id).ToListAsync();
var jsonStr = importModel.ToJsonString();
return await _fileManager.Export(jsonStr, importModel.flowEngine.FullName, ExportFileType.ffe);
}
#endregion
#region POST
/// <summary>
/// 删除.
/// </summary>
/// <param name="id">主键值.</param>
/// <returns></returns>
[HttpDelete("{id}")]
public async Task Delete(string id)
{
var flowEngineEntity = await GetInfo(id);
if (flowEngineEntity == null)
throw Oops.Oh(ErrorCode.COM1005);
if (await _flowTaskRepository.AnyFlowTask(x => x.DeleteMark == null && x.FlowId == id))
throw Oops.Oh(ErrorCode.WF0024);
_db.BeginTran();
await _repository.AsSugarClient().Deleteable<FlowEngineVisibleEntity>(a => a.FlowId == flowEngineEntity.Id).ExecuteCommandHasChangeAsync();
var isOk = await _repository.AsUpdateable(flowEngineEntity).CallEntityMethod(m => m.Delete()).UpdateColumns(it => new { it.DeleteMark, it.DeleteTime, it.DeleteUserId }).ExecuteCommandHasChangeAsync();
_db.CommitTran();
if (!isOk)
throw Oops.Oh(ErrorCode.COM1002);
}
/// <summary>
/// 新建.
/// </summary>
/// <param name="input">请求参数.</param>
/// <returns></returns>
[HttpPost("")]
public async Task Create([FromBody] FlowEngineCrInput input)
{
if (await _repository.IsAnyAsync(x => (x.EnCode == input.enCode || x.FullName == input.fullName) && x.DeleteMark == null))
throw Oops.Oh(ErrorCode.COM1004);
if (input.formType == 2)
{
var formTemplateBase = new TemplateParsingBase(input.formData, input.tables, true);
if (!formTemplateBase.VerifyTemplate())
throw Oops.Oh(ErrorCode.D1401);
}
var flowEngineEntity = input.Adapt<FlowEngineEntity>();
flowEngineEntity.Version = "1";
var flowVisibleList = GetFlowEngineVisibleList(input.flowTemplateJson);
var result = await Create(flowEngineEntity, flowVisibleList);
_ = result ?? throw Oops.Oh(ErrorCode.COM1000);
}
/// <summary>
/// 更新.
/// </summary>
/// <param name="id">主键值.</param>
/// <param name="input">请求参数.</param>
/// <returns></returns>
[HttpPut("{id}")]
public async Task Update(string id, [FromBody] FlowEngineUpInput input)
{
if (await _repository.IsAnyAsync(x => x.Id != id && (x.EnCode == input.enCode || x.FullName == input.fullName) && x.DeleteMark == null))
throw Oops.Oh(ErrorCode.COM1004);
if (input.formType == 2)
{
var formTemplateBase = new TemplateParsingBase(input.formData, input.tables, true);
if (!formTemplateBase.VerifyTemplate())
throw Oops.Oh(ErrorCode.D1401);
}
var flowEngineEntity = input.Adapt<FlowEngineEntity>();
flowEngineEntity.Version = ((await _repository.GetFirstAsync(x => x.Id == id && x.DeleteMark == null)).Version.ParseToInt() + 1).ToString();
var flowVisibleList = GetFlowEngineVisibleList(input.flowTemplateJson);
var isOk = await Update(flowEngineEntity, flowVisibleList);
if (!isOk)
throw Oops.Oh(ErrorCode.COM1001);
}
/// <summary>
/// 复制.
/// </summary>
/// <param name="id">主键值.</param>
/// <returns></returns>
[HttpPost("{id}/Actions/Copy")]
public async Task ActionsCopy(string id)
{
var entity = await GetInfo(id);
var random = RandomExtensions.NextLetterAndNumberString(new Random(), 5).ToLower();
entity.FullName = string.Format("{0}副本{1}", entity.FullName, random);
entity.EnCode = string.Format("{0}{1}", entity.EnCode, random);
entity.Version = "1";
if (entity.FullName.Length >= 50 || entity.EnCode.Length >= 50)
throw Oops.Oh(ErrorCode.COM1009);
var flowVisibleList = GetFlowEngineVisibleList(entity.FlowTemplateJson);
var result = await Create(entity, flowVisibleList);
_ = result ?? throw Oops.Oh(ErrorCode.WF0002);
}
/// <summary>
/// 导入.
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
[HttpPost("Actions/ImportData")]
public async Task ActionsImport(IFormFile file)
{
var fileType = Path.GetExtension(file.FileName).Replace(".", string.Empty);
if (!fileType.ToLower().Equals(ExportFileType.ffe.ToString()))
throw Oops.Oh(ErrorCode.D3006);
var josn = _fileManager.Import(file);
FlowEngineImportOutput model;
try
{
model = josn.ToObject<FlowEngineImportOutput>();
}
catch
{
throw Oops.Oh(ErrorCode.D3006);
}
if (model == null)
throw Oops.Oh(ErrorCode.D3006);
await ImportData(model);
}
/// <summary>
/// 发布.
/// </summary>
/// <param name="id">主键值.</param>
/// <returns></returns>
[HttpPost("Release/{id}")]
public async Task Release(string id)
{
var entity = await GetInfo(id);
if (entity == null)
throw Oops.Oh(ErrorCode.COM1005);
var isOk = await _repository.AsSugarClient().Updateable<FlowEngineEntity>().SetColumns(it => it.EnabledMark == 1).Where(it => it.Id == id).ExecuteCommandHasChangeAsync();
if (!isOk)
throw Oops.Oh(ErrorCode.COM1003);
}
/// <summary>
/// 停止.
/// </summary>
/// <param name="id">主键值.</param>
/// <returns></returns>
[HttpPost("Stop/{id}")]
public async Task Stop(string id)
{
var entity = await GetInfo(id);
if (entity == null)
throw Oops.Oh(ErrorCode.COM1005);
var isOk = await _repository.AsSugarClient().Updateable<FlowEngineEntity>().SetColumns(it => it.EnabledMark == 0).Where(it => it.Id == id).ExecuteCommandHasChangeAsync();
if (!isOk)
throw Oops.Oh(ErrorCode.COM1003);
}
#endregion
#region PublicMethod
/// <summary>
/// 发起列表.
/// </summary>
/// <returns></returns>
[NonAction]
public async Task<List<FlowEngineListOutput>> GetFlowFormList()
{
var list = await GetOutList();
if (_userManager.User.IsAdministrator == 0)
{
var data = await GetVisibleFlowList();
data = data.Union(list.FindAll(x => x.visibleType == 0)).ToList();
return data;
}
else
{
return list;
}
}
#endregion
#region PrivateMethod
/// <summary>
/// 详情.
/// </summary>
/// <param name="id">主键.</param>
/// <returns></returns>
[NonAction]
private async Task<FlowEngineEntity> GetInfo(string id)
{
return await _repository.GetFirstAsync(a => a.Id == id && a.DeleteMark == null);
}
/// <summary>
/// 新增流程.
/// </summary>
/// <param name="entity">流程实例.</param>
/// <param name="visibleList">可见范围.</param>
/// <returns></returns>
[NonAction]
private async Task<FlowEngineEntity> Create(FlowEngineEntity entity, List<FlowEngineVisibleEntity> visibleList)
{
try
{
_db.BeginTran();
entity.VisibleType = visibleList.Count == 0 ? 0 : 1;
entity.Id = SnowflakeIdHelper.NextId();
foreach (var item in visibleList)
{
item.FlowId = entity.Id;
item.SortCode = visibleList.IndexOf(item);
}
if (visibleList.Count > 0)
await _repository.AsSugarClient().Insertable(visibleList).CallEntityMethod(m => m.Creator()).ExecuteCommandAsync();
if (entity.FormType == 2)
{
// 无表转有表
if (entity.Tables.IsNullOrEmpty() || entity.Tables == "[]")
{
var random = RandomExtensions.NextLetterAndNumberString(new Random(), 5).ToLower();
// 主表名称
var mTableName = "wform_" + entity.EnCode + "_" + random;
var devEntity = new VisualDevEntity()
{
//FlowId = entity.Id,
FormData = entity.FormTemplateJson,
};
var res = await _visualDevService.NoTblToTable(devEntity, mTableName);
entity.Tables = res.Tables;
entity.FormTemplateJson = res.FormData;
}
}
var result = await _repository.AsSugarClient().Insertable(entity).CallEntityMethod(m => m.Create()).ExecuteReturnEntityAsync();
if (result == null)
throw Oops.Oh(ErrorCode.COM1005);
_db.CommitTran();
return result;
}
catch (Exception ex)
{
_db.RollbackTran();
return null;
}
}
/// <summary>
/// 修改流程.
/// </summary>
/// <param name="entity">流程实体.</param>
/// <param name="visibleList">可见范围.</param>
/// <returns></returns>
[NonAction]
private async Task<bool> Update(FlowEngineEntity entity, List<FlowEngineVisibleEntity> visibleList)
{
try
{
_db.BeginTran();
entity.VisibleType = visibleList.Count == 0 ? 0 : 1;
await _repository.AsSugarClient().Deleteable<FlowEngineVisibleEntity>(a => a.FlowId == entity.Id).ExecuteCommandHasChangeAsync();
foreach (var item in visibleList)
{
item.FlowId = entity.Id;
item.SortCode = visibleList.IndexOf(item);
}
if (visibleList.Count > 0)
await _repository.AsSugarClient().Insertable(visibleList).CallEntityMethod(m => m.Creator()).ExecuteCommandAsync();
if (entity.FormType == 2)
{
#region
//无表转有表
var mTableName = "wform_" + entity.EnCode;//主表名称
if (entity.Tables.IsNullOrEmpty() || entity.Tables == "[]")
{
var devEntity = new VisualDevEntity()
{
//FlowId = entity.Id,
FormData = entity.FormTemplateJson
};
var res = await _visualDevService.NoTblToTable(devEntity, mTableName);
}
#endregion
}
var isOk = await _repository.AsSugarClient().Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).CallEntityMethod(m => m.LastModify()).ExecuteCommandHasChangeAsync();
_db.CommitTran();
return isOk;
}
catch (Exception ex)
{
_db.RollbackTran();
return false;
}
}
/// <summary>
/// 解析流程可见参数.
/// </summary>
/// <param name="josnStr"></param>
/// <returns></returns>
private List<FlowEngineVisibleEntity> GetFlowEngineVisibleList(string josnStr)
{
var output = new List<FlowEngineVisibleEntity>();
// 发起节点属性.
var pro = josnStr.ToObject<FlowTemplateJsonModel>().properties.ToObject<StartProperties>();
if (pro.initiator != null && pro.initiator.Count > 0)
{
var list = pro.initiator.Select(x => new FlowEngineVisibleEntity() { OperatorId = x, OperatorType = "user" }).ToList();
output.AddRange(list);
}
if (pro.initiatePos != null && pro.initiatePos.Count > 0)
{
var list = pro.initiatePos.Select(x => new FlowEngineVisibleEntity() { OperatorId = x, OperatorType = "Position" }).ToList();
output.AddRange(list);
}
if (pro.initiateRole != null && pro.initiateRole.Count > 0)
{
var list = pro.initiateRole.Select(x => new FlowEngineVisibleEntity() { OperatorId = x, OperatorType = "Role" }).ToList();
output.AddRange(list);
}
return output;
}
/// <summary>
/// 获取当前用户可见流程.
/// </summary>
/// <returns></returns>
[NonAction]
private async Task<List<FlowEngineListOutput>> GetVisibleFlowList()
{
return await _repository.AsSugarClient().Queryable<FlowEngineVisibleEntity, UserRelationEntity, FlowEngineEntity>((a, b, c) => new JoinQueryInfos(JoinType.Left, a.OperatorId == b.ObjectId, JoinType.Left, a.FlowId == c.Id))
.Where((a, b, c) => (a.OperatorId == _userManager.UserId || b.UserId == _userManager.UserId) && c.DeleteMark == null && c.EnabledMark == 1 && c.Type == 0)
.Select((a, b, c) => new FlowEngineListOutput
{
category = c.Category,
id = c.Id,
description = c.Description,
creatorTime = c.CreatorTime,
creatorUser = SqlFunc.Subqueryable<UserEntity>().Where(u => u.Id == c.CreatorUserId).Select(u => SqlFunc.MergeString(u.RealName, "/", u.Account)),
enCode = c.EnCode,
enabledMark = c.EnabledMark,
flowTemplateJson = c.FlowTemplateJson,
formData = c.FormTemplateJson,
fullName = c.FullName,
formType = c.FormType,
icon = c.Icon,
iconBackground = c.IconBackground,
lastModifyTime = c.LastModifyTime,
lastModifyUser = SqlFunc.Subqueryable<UserEntity>().Where(u => u.Id == c.LastModifyUserId).Select(u => SqlFunc.MergeString(u.RealName, "/", u.Account)),
sortCode = a.SortCode,
type = c.Type,
visibleType = c.VisibleType,
parentId = SqlFunc.Subqueryable<DictionaryDataEntity>().Where(d => d.EnCode == c.Category && d.DictionaryTypeId== "507f4f5df86b47588138f321e0b0dac7").Select(d => d.Id),
}).MergeTable().OrderBy(a => a.sortCode).OrderBy(a => a.creatorTime, OrderByType.Desc)
.OrderBy(a => a.lastModifyTime, OrderByType.Desc).ToListAsync();
}
/// <summary>
/// 流程列表(功能流程不显示).
/// </summary>
/// <returns></returns>
private async Task<List<FlowEngineListOutput>> GetOutList()
{
return await _repository.AsSugarClient().Queryable<FlowEngineEntity, DictionaryDataEntity>((a, b) => new JoinQueryInfos(JoinType.Left, a.Category == b.EnCode))
.Where((a, b) => a.DeleteMark == null && a.EnabledMark == 1 && a.Type == 0 && b.DictionaryTypeId == "507f4f5df86b47588138f321e0b0dac7")
.Select((a, b) => new FlowEngineListOutput
{
category = a.Category,
id = a.Id,
description = a.Description,
creatorTime = a.CreatorTime,
creatorUser = SqlFunc.Subqueryable<UserEntity>().Where(u => u.Id == a.CreatorUserId).Select(u => SqlFunc.MergeString(u.RealName, "/", u.Account)),
enCode = a.EnCode,
enabledMark = a.EnabledMark,
flowTemplateJson = a.FlowTemplateJson,
formData = a.FormTemplateJson,
fullName = a.FullName,
formType = a.FormType,
icon = a.Icon,
iconBackground = a.IconBackground,
lastModifyTime = a.LastModifyTime,
lastModifyUser = SqlFunc.Subqueryable<UserEntity>().Where(u => u.Id == a.LastModifyUserId).Select(u => SqlFunc.MergeString(u.RealName, "/", u.Account)),
sortCode = a.SortCode,
type = a.Type,
visibleType = a.VisibleType,
parentId = b.Id
}).MergeTable().OrderBy(a => a.sortCode).OrderBy(a => a.creatorTime, OrderByType.Desc)
.OrderBy(a => a.lastModifyTime, OrderByType.Desc).ToListAsync();
}
/// <summary>
/// 导入数据.
/// </summary>
/// <param name="model">导入实例.</param>
/// <returns></returns>
private async Task ImportData(FlowEngineImportOutput model)
{
try
{
_db.BeginTran();
// 存在更新不存在插入 根据主键
var stor = _repository.AsSugarClient().Storageable(model.flowEngine).Saveable().ToStorage();
// 执行插入
await stor.AsInsertable.ExecuteCommandAsync();
// await stor.AsUpdateable.ExecuteCommandAsync(); //执行更新停用原因Oracle 数据库环境会抛异常ora-01704: 字符串文字太长
// 执行更新
await _repository.AsSugarClient().Updateable(model.flowEngine).ExecuteCommandAsync();
// 存在更新不存在插入 根据主键
var stor1 = _repository.AsSugarClient().Storageable(model.visibleList).Saveable().ToStorage();
// 执行插入
await stor1.AsInsertable.ExecuteCommandAsync();
// 执行更新
await stor1.AsUpdateable.ExecuteCommandAsync();
_db.CommitTran();
}
catch (Exception ex)
{
_db.RollbackTran();
throw Oops.Oh(ErrorCode.D3006);
}
}
#endregion
}