diff --git a/common/Tnb.Common.Core/Manager/DataBase/DataBaseManager.cs b/common/Tnb.Common.Core/Manager/DataBase/DataBaseManager.cs
index db3d0b5b..7ff09329 100644
--- a/common/Tnb.Common.Core/Manager/DataBase/DataBaseManager.cs
+++ b/common/Tnb.Common.Core/Manager/DataBase/DataBaseManager.cs
@@ -843,6 +843,7 @@ WHERE pcolumn.table_name='{0}' ORDER BY ordinal_position";
sb.Append(@"select a.relname F_TABLE,a.n_live_tup F_SUM,b.description F_TABLENAME from sys_stat_user_tables a left outer join sys_description b on a.relid = b.objoid where a.schemaname='public' and b.objsubid='0'");
break;
case "postgresql":
+ //modified by PhilPan 2023-04-12,修复大小写错误
sb.Append(@"select cast(relname as varchar) as F_TABLE, cast(reltuples as varchar) as F_SUM, cast(obj_description(relfilenode,'pg_class') as varchar) as F_TABLENAME from pg_class c inner join pg_namespace n on n.oid = c.relnamespace and nspname='public' inner join pg_tables z on z.tablename=c.relname where relkind = 'r' and relname not like 'pg_%' and relname not like 'sql_%' and schemaname='public' order by relname");
break;
default:
diff --git a/common/Tnb.Common/Dtos/VisualDev/VisualDevModelDataCrInput.cs b/common/Tnb.Common/Dtos/VisualDev/VisualDevModelDataCrInput.cs
index cfd307a4..c58b1dca 100644
--- a/common/Tnb.Common/Dtos/VisualDev/VisualDevModelDataCrInput.cs
+++ b/common/Tnb.Common/Dtos/VisualDev/VisualDevModelDataCrInput.cs
@@ -12,7 +12,8 @@ public class VisualDevModelDataCrInput: FlowTaskOtherModel
///
/// 数据.
///
- public string data { get; set; }
+ /// modified by PhilPan 2023-04-12 返回值不序列化
+ public Dictionary data { get; set; }
///
/// 1-保存.
diff --git a/visualdev/Tnb.VisualDev.Interfaces/IRunService.cs b/visualdev/Tnb.VisualDev.Interfaces/IRunService.cs
index 0b3f46e1..50773d67 100644
--- a/visualdev/Tnb.VisualDev.Interfaces/IRunService.cs
+++ b/visualdev/Tnb.VisualDev.Interfaces/IRunService.cs
@@ -102,7 +102,8 @@ public interface IRunService
///
///
///
- Task GetHaveTableInfoDetails(string id, VisualDevEntity templateEntity, bool isFlowTask = false);
+ /// modified by pf 2023-04-12 返回值不序列化
+ Task?> GetHaveTableInfoDetails(string id, VisualDevEntity templateEntity, bool isFlowTask = false);
///
/// 生成系统自动生成字段.
diff --git a/visualdev/Tnb.VisualDev/CodeGen/ExportImport/ExportImportDataHelper.cs b/visualdev/Tnb.VisualDev/CodeGen/ExportImport/ExportImportDataHelper.cs
index 4a35792c..577c23cc 100644
--- a/visualdev/Tnb.VisualDev/CodeGen/ExportImport/ExportImportDataHelper.cs
+++ b/visualdev/Tnb.VisualDev/CodeGen/ExportImport/ExportImportDataHelper.cs
@@ -789,7 +789,8 @@ public class ExportImportDataHelper : ITransient
if (item.ContainsKey("Update_MainTablePrimary_Id"))
{
string? mainId = item["Update_MainTablePrimary_Id"].ToString();
- var haveTableSql = await _runService.GetUpdateSqlByTemplate(tInfo, new VisualDevModelDataUpInput() { data = item.ToJsonString() }, mainId);
+ // modified by PhilPan 2023-04-12 提交和返回值不序列化
+ var haveTableSql = await _runService.GetUpdateSqlByTemplate(tInfo, new VisualDevModelDataUpInput() { data = item }, mainId);
foreach (var it in haveTableSql) await _databaseService.ExecuteSql(tInfo.DbLink, it); // 修改功能数据
}
else
@@ -802,7 +803,8 @@ public class ExportImportDataHelper : ITransient
else
{
string? mainId = YitIdHelper.NextId().ToString();
- var haveTableSql = await _runService.GetCreateSqlByTemplate(tInfo, new VisualDevModelDataCrInput() { data = item.ToJsonString() }, mainId);
+ // modified by PhilPan 2023-04-12 提交和返回值不序列化
+ var haveTableSql = await _runService.GetCreateSqlByTemplate(tInfo, new VisualDevModelDataCrInput() { data = item }, mainId);
// 主表自增长Id.
if (haveTableSql.ContainsKey("MainTableReturnIdentity"))
diff --git a/visualdev/Tnb.VisualDev/RunService.cs b/visualdev/Tnb.VisualDev/RunService.cs
index 273764b5..c329f870 100644
--- a/visualdev/Tnb.VisualDev/RunService.cs
+++ b/visualdev/Tnb.VisualDev/RunService.cs
@@ -486,7 +486,8 @@ public class RunService : IRunService, ITransient
/// 模板实体.
///
///
- public async Task GetHaveTableInfoDetails(string id, VisualDevEntity templateEntity, bool isFlowTask = false)
+ /// modified by pf 2023-04-12 返回值不序列化
+ public async Task?> GetHaveTableInfoDetails(string id, VisualDevEntity templateEntity, bool isFlowTask = false)
{
TemplateParsingBase? templateInfo = new TemplateParsingBase(templateEntity, isFlowTask); // 解析模板控件
DbLinkEntity link = await GetDbLink(templateEntity.DbLinkId);
@@ -496,7 +497,8 @@ public class RunService : IRunService, ITransient
var sql = GetInfoQuerySql(id, mainPrimary, templateInfo, ref tableFieldKeyValue); // 获取查询Sql
Dictionary? data = _databaseService.GetInterFaceData(link, sql).ToJsonString().ToObject>>().ToObject>>().FirstOrDefault();
- if (data == null) return id;
+ // modified by pf 2023-04-12 返回值不序列化
+ if (data == null) return data;
// 记录全部数据
Dictionary dataMap = new Dictionary();
@@ -573,7 +575,8 @@ public class RunService : IRunService, ITransient
_formDataParsing.GetBARAndQR(templateInfo.FieldsModelList, newDataMap, dataMap); // 处理 条形码 、 二维码 控件
if (!newDataMap.ContainsKey("id")) newDataMap.Add("id", id);
- return newDataMap.ToJsonString();
+ // modified by pf 2023-04-12 返回值不序列化
+ return newDataMap;
}
#endregion
@@ -623,7 +626,8 @@ public class RunService : IRunService, ITransient
}
public async Task>>> GetCreateSqlByTemplate(TemplateParsingBase templateInfo, VisualDevModelDataCrInput dataInput, string mainId)
{
- Dictionary? allDataMap = dataInput.data.ToObject>();
+ // modified by PhilPan 2023-04-12 提交和返回值不序列化
+ Dictionary? allDataMap = dataInput.data;
if (!templateInfo.VerifyTemplate()) throw Oops.Oh(ErrorCode.D1401); // 验证模板
// 处理系统控件(模板开启行编辑)
@@ -794,15 +798,16 @@ public class RunService : IRunService, ITransient
if (templateInfo.ColumnData.type.Equals(4) && _userManager.UserOrigin.Equals("pc"))
{
// 剔除 [增加前端回显字段 : key_name]
- Dictionary oldDataMap = visualdevModelDataUpForm.data.ToObject>();
+ // modified by PhilPan 2023-04-12 提交和返回值不序列化
+ Dictionary oldDataMap = visualdevModelDataUpForm.data;
Dictionary newDataMap = new Dictionary();
foreach (var item in oldDataMap)
{
var key = item.Key.Replace("_name", string.Empty);
if (!newDataMap.ContainsKey(key)) newDataMap.Add(key, oldDataMap[key]);
}
-
- if (newDataMap.Any()) visualdevModelDataUpForm.data = newDataMap.ToJsonString();
+ // modified by PhilPan 2023-04-12 提交和返回值不序列化
+ if (newDataMap.Any()) visualdevModelDataUpForm.data = newDataMap;
}
DbLinkEntity link = await GetDbLink(templateEntity.DbLinkId);
@@ -836,7 +841,8 @@ public class RunService : IRunService, ITransient
}
public async Task> GetUpdateSqlByTemplate(TemplateParsingBase templateInfo, VisualDevModelDataUpInput visualdevModelDataUpForm, string id)
{
- Dictionary? allDataMap = visualdevModelDataUpForm.data.ToObject>();
+ // modified by PhilPan 2023-04-12 提交和返回值不序列化
+ Dictionary? allDataMap = visualdevModelDataUpForm.data;
if (!templateInfo.VerifyTemplate()) throw Oops.Oh(ErrorCode.D1401); // 验证模板
// 处理系统控件(模板开启行编辑)
@@ -1017,12 +1023,14 @@ public class RunService : IRunService, ITransient
tInfo.DbLink = await GetDbLink(fEntity.DbLinkId);
if (isUpdate)
{
- var sqlList = await GetUpdateSqlByTemplate(tInfo, new VisualDevModelDataUpInput() { data = formData }, dataId);
+ // modified by PhilPan 2023-04-12 提交和返回值不序列化
+ var sqlList = await GetUpdateSqlByTemplate(tInfo, new VisualDevModelDataUpInput() { data = formData.ToObject>() }, dataId);
foreach (var item in sqlList) await _databaseService.ExecuteSql(tInfo.DbLink, item); // 修改功能数据
}
else
{
- var sqlList = await GetCreateSqlByTemplate(tInfo, new VisualDevModelDataUpInput() { data = formData }, dataId);
+ // modified by PhilPan 2023-04-12 提交和返回值不序列化
+ var sqlList = await GetCreateSqlByTemplate(tInfo, new VisualDevModelDataUpInput() { data = formData.ToObject>() }, dataId);
// 主表自增长Id.
if (sqlList.ContainsKey("MainTableReturnIdentity")) sqlList.Remove("MainTableReturnIdentity");
@@ -3196,12 +3204,10 @@ public class RunService : IRunService, ITransient
var relationValueId = dataItem[item.__vModel__].ToString(); // 获取关联表单id
var relationInfo = await _visualDevRepository.AsQueryable().FirstAsync(x => x.Id == item.modelId); // 获取 关联表单 转换后的数据
var relationValueStr = string.Empty;
- relationValueStr = await GetHaveTableInfoDetails(relationValueId, relationInfo);
-
- if (!relationValueStr.IsNullOrEmpty() && !relationValueStr.Equals(relationValueId))
+ // modified by pf 2023-04-12 返回值不序列化
+ var relationValue = await GetHaveTableInfoDetails(relationValueId, relationInfo);
+ if (relationValue != null)
{
- var relationValue = relationValueStr.ToObject>();
-
// 添加到 子表 列
model.__config__.children.Where(x => x.relationField.ReplaceRegex(@"_jnpfTable_(\w+)", string.Empty) == item.__vModel__).ToList().ForEach(citem =>
{
diff --git a/visualdev/Tnb.VisualDev/VisualDevModelDataService.cs b/visualdev/Tnb.VisualDev/VisualDevModelDataService.cs
index d4e1cf68..513fd245 100644
--- a/visualdev/Tnb.VisualDev/VisualDevModelDataService.cs
+++ b/visualdev/Tnb.VisualDev/VisualDevModelDataService.cs
@@ -37,2884 +37,2886 @@ using Yitter.IdGenerator;
namespace JNPF.VisualDev
{
- ///
- /// 可视化开发基础.
- ///
- [ApiDescriptionSettings(Tag = "VisualDev", Name = "OnlineDev", Order = 172)]
- [Route("api/visualdev/[controller]")]
- public class VisualDevModelDataService : IDynamicApiController, ITransient
- {
- ///
- /// 服务基础仓储.
- ///
- private readonly ISqlSugarRepository _visualDevRepository; // 在线开发功能实体
-
///
/// 可视化开发基础.
///
- private readonly IVisualDevService _visualDevService;
-
- ///
- /// 在线开发运行服务.
- ///
- private readonly RunService _runService;
-
- ///
- /// 单据.
- ///
- private readonly IBillRullService _billRuleService;
-
- ///
- /// 用户管理.
- ///
- private readonly IUserManager _userManager;
-
- ///
- /// 缓存管理.
- ///
- private readonly ICacheManager _cacheManager;
-
- ///
- /// 文件服务.
- ///
- private readonly IFileManager _fileManager;
-
- ///
- /// 工作流.
- ///
- private readonly IFlowTaskService _flowTaskService;
-
- ///
- /// 数据连接服务.
- ///
- private readonly IDbLinkService _dbLinkService;
-
- ///
- /// 切库.
- ///
- private readonly IDataBaseManager _databaseService;
-
- ///
- /// 数据接口.
- ///
- private readonly IDataInterfaceService _dataInterfaceService;
-
- ///
- /// 多租户事务.
- ///
- private readonly ITenant _db;
-
- ///
- /// 初始化一个类型的新实例.
- ///
- public VisualDevModelDataService(
- ISqlSugarRepository visualDevRepository,
- IVisualDevService visualDevService,
- RunService runService,
- IDbLinkService dbLinkService,
- IDataInterfaceService dataInterfaceService,
- IUserManager userManager,
- IDataBaseManager databaseService,
- IBillRullService billRuleService,
- ICacheManager cacheManager,
- IFlowTaskService flowTaskService,
- IFileManager fileManager,
- ISqlSugarClient context)
+ [ApiDescriptionSettings(Tag = "VisualDev", Name = "OnlineDev", Order = 172)]
+ [Route("api/visualdev/[controller]")]
+ public class VisualDevModelDataService : IDynamicApiController, ITransient
{
- _visualDevRepository = visualDevRepository;
- _visualDevService = visualDevService;
- _databaseService = databaseService;
- _dbLinkService = dbLinkService;
- _runService = runService;
- _billRuleService = billRuleService;
- _userManager = userManager;
- _cacheManager = cacheManager;
- _flowTaskService = flowTaskService;
- _fileManager = fileManager;
- _dataInterfaceService = dataInterfaceService;
- _db = context.AsTenant();
- }
+ ///
+ /// 服务基础仓储.
+ ///
+ private readonly ISqlSugarRepository _visualDevRepository; // 在线开发功能实体
- #region Get
+ ///
+ /// 可视化开发基础.
+ ///
+ private readonly IVisualDevService _visualDevService;
- ///
- /// 获取列表表单配置JSON.
- ///
- /// 主键id.
- /// 1 线上版本, 0 草稿版本.
- ///
- [HttpGet("{modelId}/Config")]
- [NonUnify]
+ ///
+ /// 在线开发运行服务.
+ ///
+ private readonly RunService _runService;
- public async Task GetData(string modelId, string type)
- {
- if (type.IsNullOrEmpty()) type = "1";
- VisualDevEntity? data = await _visualDevService.GetInfoById(modelId, type.Equals("1"));
- if (data == null) return new { code = 400, msg = "未找到该模板!" };
- if (data.EnableFlow.Equals(-1) && data.FlowId.IsNotEmptyOrNull()) return new { code = 400, msg = "该功能配置的流程已停用!" };
- if (data.EnableFlow.Equals(1) && data.FlowId.IsNullOrWhiteSpace()) return new { code = 400, msg = "该流程功能未绑定流程!" };
- if (data.WebType.Equals(1) && data.FormData.IsNullOrWhiteSpace()) return new { code = 400, msg = "该模板内表单内容为空,无法预览!" };
- else if (data.WebType.Equals(2) && data.ColumnData.IsNullOrWhiteSpace()) return new { code = 400, msg = "该模板内列表内容为空,无法预览!" };
- return new { code = 200, data = data.Adapt() };
- }
+ ///
+ /// 单据.
+ ///
+ private readonly IBillRullService _billRuleService;
- ///
- /// 获取列表配置JSON.
- ///
- /// 主键id.
- ///
- [HttpGet("{modelId}/ColumnData")]
- public async Task GetColumnData(string modelId)
- {
- VisualDevEntity? data = await _visualDevService.GetInfoById(modelId);
- return new { columnData = data.ColumnData };
- }
+ ///
+ /// 用户管理.
+ ///
+ private readonly IUserManager _userManager;
- ///
- /// 获取列表配置JSON.
- ///
- /// 主键id.
- ///
- [HttpGet("{modelId}/FormData")]
- public async Task GetFormData(string modelId)
- {
- VisualDevEntity? data = await _visualDevService.GetInfoById(modelId);
- return new { formData = data.FormData };
- }
+ ///
+ /// 缓存管理.
+ ///
+ private readonly ICacheManager _cacheManager;
- ///
- /// 获取列表配置JSON.
- ///
- /// 主键id.
- ///
- [HttpGet("{modelId}/FlowTemplate")]
- public async Task GetFlowTemplate(string modelId)
- {
- VisualDevEntity? data = await _visualDevService.GetInfoById(modelId);
- return new { flowTemplateJson = data.FlowTemplateJson };
- }
+ ///
+ /// 文件服务.
+ ///
+ private readonly IFileManager _fileManager;
- ///
- /// 获取数据信息.
- ///
- ///
- ///
- ///
- [HttpGet("{modelId}/{id}")]
- public async Task GetInfo(string id, string modelId)
- {
- var overideSvc = OverideVisualDevManager.GetOrDefault(modelId);
- if (overideSvc != null && overideSvc.OverideFuncs.GetAsync != null)
- {
- return await overideSvc.OverideFuncs.GetAsync(id);
- }
- else
- {
- VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(modelId, true); // 模板实体
+ ///
+ /// 工作流.
+ ///
+ private readonly IFlowTaskService _flowTaskService;
- // 有表
- if (!string.IsNullOrEmpty(templateEntity.Tables) && !"[]".Equals(templateEntity.Tables))
- return new { id = id, data = (await _runService.GetHaveTableInfo(id, templateEntity)).ToJsonString() };
- else
- return null;
- }
- }
+ ///
+ /// 数据连接服务.
+ ///
+ private readonly IDbLinkService _dbLinkService;
- ///
- /// 获取详情.
- ///
- ///
- ///
- ///
- [HttpGet("{modelId}/{id}/DataChange")]
- public async Task GetDetails(string id, string modelId)
- {
- var overideSvc = OverideVisualDevManager.GetOrDefault(modelId);
- if (overideSvc != null && overideSvc.OverideFuncs.GetDetailsAsync != null)
- {
- return await overideSvc.OverideFuncs.GetDetailsAsync(id);
- }
- else
- {
- VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(modelId, true); // 模板实体
+ ///
+ /// 切库.
+ ///
+ private readonly IDataBaseManager _databaseService;
- // 有表
- if (!string.IsNullOrEmpty(templateEntity.Tables) && !"[]".Equals(templateEntity.Tables))
- return new { id = id, data = await _runService.GetHaveTableInfoDetails(id, templateEntity) };
- else
- return null;
- }
- }
+ ///
+ /// 数据接口.
+ ///
+ private readonly IDataInterfaceService _dataInterfaceService;
- #endregion
+ ///
+ /// 多租户事务.
+ ///
+ private readonly ITenant _db;
- #region Post
-
- ///
- /// 功能导出.
- ///
- ///
- ///
- [HttpPost("{modelId}/Actions/ExportData")]
- public async Task ActionsExportData(string modelId)
- {
- VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(modelId); // 模板实体
- if (templateEntity.State.Equals(1))
- {
- var vREntity = await _visualDevRepository.AsSugarClient().Queryable().FirstAsync(v => v.Id == modelId && v.DeleteMark == null);
- templateEntity = vREntity.Adapt();
- templateEntity.State = 0;
- }
- string? jsonStr = templateEntity.ToJsonString();
- return await _fileManager.Export(jsonStr, templateEntity.FullName, ExportFileType.vdd);
- }
-
- ///
- /// 导入.
- ///
- ///
- ///
- [HttpPost("Model/Actions/ImportData")]
- public async Task ActionsActionsImport(IFormFile file)
- {
- string? fileType = Path.GetExtension(file.FileName).Replace(".", string.Empty);
- if (!fileType.ToLower().Equals(ExportFileType.vdd.ToString())) throw Oops.Oh(ErrorCode.D3006);
- string? josn = _fileManager.Import(file);
- VisualDevEntity? templateEntity;
- try
- {
- templateEntity = josn.ToObject();
- }
- catch
- {
- throw Oops.Oh(ErrorCode.D3006);
- }
-
- if (templateEntity == null || templateEntity.Type.IsNullOrEmpty()) throw Oops.Oh(ErrorCode.D3006);
- else if (templateEntity.Type != 1) throw Oops.Oh(ErrorCode.D3009);
- if (await _visualDevService.GetDataExists(templateEntity.EnCode, templateEntity.FullName))
- throw Oops.Oh(ErrorCode.D1400);
- await _visualDevService.CreateImportData(templateEntity);
- }
-
- ///
- /// 获取数据列表.
- ///
- /// 主键id.
- /// 分页查询条件.
- ///
- [HttpPost("{modelId}/List")]
- public async Task List(string modelId, [FromBody] VisualDevModelListQueryInput input)
- {
- var overideSvc = OverideVisualDevManager.GetOrDefault(modelId);
- if (overideSvc != null && overideSvc.OverideFuncs.GetListAsync != null)
- {
- return await overideSvc.OverideFuncs.GetListAsync(input);
- }
- else
- {
- VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(modelId, true);
- return await _runService.GetListResult(templateEntity, input);
- }
- }
-
- ///
- /// 创建数据.
- ///
- ///
- ///
- ///
- [HttpPost("{modelId}")]
- public async Task Create(string modelId, [FromBody] VisualDevModelDataCrInput visualdevModelDataCrForm)
- {
- var overideSvc = OverideVisualDevManager.GetOrDefault(modelId);
- if (overideSvc != null && overideSvc.OverideFuncs.CreateAsync != null)
- {
- await overideSvc.OverideFuncs.CreateAsync(visualdevModelDataCrForm);
- }
- else
- {
- VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(modelId, true);
- await _runService.Create(templateEntity, visualdevModelDataCrForm);
- }
- }
-
- ///
- /// 修改数据.
- ///
- ///
- ///
- ///
- ///
- [HttpPut("{modelId}/{id}")]
- public async Task Update(string modelId, string id, [FromBody] VisualDevModelDataUpInput visualdevModelDataUpForm)
- {
- var overideSvc = OverideVisualDevManager.GetOrDefault(modelId);
- if (overideSvc != null && overideSvc.OverideFuncs.UpdateAsync != null)
- {
- await overideSvc.OverideFuncs.UpdateAsync(id, visualdevModelDataUpForm);
- }
- else
- {
- VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(modelId, true);
- await _runService.Update(id, templateEntity, visualdevModelDataUpForm);
- }
- }
-
- ///
- /// 删除数据.
- ///
- ///
- ///
- ///
- [HttpDelete("{modelId}/{id}")]
- public async Task Delete(string id, string modelId)
- {
- var overideSvc = OverideVisualDevManager.GetOrDefault(modelId);
- if (overideSvc != null && overideSvc.OverideFuncs.DeleteAsync != null)
- {
- await overideSvc.OverideFuncs.DeleteAsync(id);
- }
- else
- {
- VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(modelId, true);
- if (!string.IsNullOrEmpty(templateEntity.Tables) && !"[]".Equals(templateEntity.Tables)) await _runService.DelHaveTableInfo(id, templateEntity);
- }
- }
-
- ///
- /// 批量删除.
- ///
- ///
- ///
- ///
- [HttpPost("batchDelete/{modelId}")]
- public async Task BatchDelete(string modelId, [FromBody] VisualDevModelDataBatchDelInput input)
- {
- var overideSvc = OverideVisualDevManager.GetOrDefault(modelId);
- if (overideSvc != null && overideSvc.OverideFuncs.DeleteRangeAsync != null)
- {
- await overideSvc.OverideFuncs.DeleteRangeAsync(input);
- }
- else
- {
- VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(modelId, true);
- if (!string.IsNullOrEmpty(templateEntity.Tables) && !"[]".Equals(templateEntity.Tables)) await _runService.BatchDelHaveTableData(input.ids, templateEntity);
- }
- }
-
- ///
- /// 导出.
- ///
- ///
- ///
- ///
- [HttpPost("{modelId}/Actions/Export")]
- public async Task Export(string modelId, [FromBody] VisualDevModelListQueryInput input)
- {
- VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(modelId, true);
- List list = new List();
- if (input.dataType == "1") input.pageSize = 99999999;
- PageResult>? pageList = await _runService.GetListResult(templateEntity, input);
-
- // 如果是 分组表格 模板
- ColumnDesignModel? columnData = templateEntity.ColumnData.ToObject(); // 列配置模型
- if (columnData.type == 3)
- {
- List>? newValueList = new List>();
- pageList.list.ForEach(item =>
+ ///
+ /// 初始化一个类型的新实例.
+ ///
+ public VisualDevModelDataService(
+ ISqlSugarRepository visualDevRepository,
+ IVisualDevService visualDevService,
+ RunService runService,
+ IDbLinkService dbLinkService,
+ IDataInterfaceService dataInterfaceService,
+ IUserManager userManager,
+ IDataBaseManager databaseService,
+ IBillRullService billRuleService,
+ ICacheManager cacheManager,
+ IFlowTaskService flowTaskService,
+ IFileManager fileManager,
+ ISqlSugarClient context)
{
- List>? tt = item["children"].ToJsonString().ToObject>>();
- newValueList.AddRange(tt);
- });
- pageList.list = newValueList;
- }
-
- List> realList = pageList.list.Copy();
- var templateInfo = new TemplateParsingBase(templateEntity);
- var res = GetCreateFirstColumnsHeader(input.selectKey, realList, templateInfo.AllFieldsModel);
- var firstColumns = res.First().ToObject>();
- var resultList = res.Last().ToObject>>();
- var newResultList = new List>();
- resultList.ForEach(row =>
- {
- foreach (var item in input.selectKey)
- {
- if (row[item].IsNotEmptyOrNull())
- {
- newResultList.Add(row);
- break;
- }
+ _visualDevRepository = visualDevRepository;
+ _visualDevService = visualDevService;
+ _databaseService = databaseService;
+ _dbLinkService = dbLinkService;
+ _runService = runService;
+ _billRuleService = billRuleService;
+ _userManager = userManager;
+ _cacheManager = cacheManager;
+ _flowTaskService = flowTaskService;
+ _fileManager = fileManager;
+ _dataInterfaceService = dataInterfaceService;
+ _db = context.AsTenant();
}
- });
- var excelName = string.Format("{0}", SnowflakeIdHelper.NextId());
- _cacheManager.Set(excelName + ".xls", string.Empty);
- return firstColumns.Any() ? await ExcelCreateModel(templateInfo.AllFieldsModel, resultList, input.selectKey, excelName, firstColumns)
- : await ExcelCreateModel(templateInfo.AllFieldsModel, resultList, input.selectKey, excelName);
- }
+ #region Get
- ///
- /// 模板下载.
- ///
- ///
- [HttpGet("{modelId}/TemplateDownload")]
- public async Task TemplateDownload(string modelId)
- {
- var tInfo = await GetUploaderTemplateInfoAsync(modelId);
+ ///
+ /// 获取列表表单配置JSON.
+ ///
+ /// 主键id.
+ /// 1 线上版本, 0 草稿版本.
+ ///
+ [HttpGet("{modelId}/Config")]
+ [NonUnify]
- if (tInfo.selectKey == null || !tInfo.selectKey.Any()) throw Oops.Oh(ErrorCode.D1411);
-
- // 初始化 一条空数据
- List>? dataList = new List>();
-
- // 赋予默认值
- var dicItem = new Dictionary();
- tInfo.AllFieldsModel.Where(x => tInfo.selectKey.Contains(x.__vModel__)).ToList().ForEach(item =>
- {
- switch (item.__config__.jnpfKey)
+ public async Task GetData(string modelId, string type)
{
- case JnpfKeyConst.CREATEUSER:
- case JnpfKeyConst.MODIFYUSER:
- case JnpfKeyConst.CREATETIME:
- case JnpfKeyConst.MODIFYTIME:
- case JnpfKeyConst.CURRORGANIZE:
- case JnpfKeyConst.CURRPOSITION:
- case JnpfKeyConst.CURRDEPT:
- case JnpfKeyConst.BILLRULE:
- dicItem.Add(item.__vModel__, "系统自动生成");
- break;
- case JnpfKeyConst.COMSELECT:
- dicItem.Add(item.__vModel__, item.multiple ? "例:拓通智联/产品部,拓通智联/技术部" : "例:拓通智联/技术部");
- break;
- case JnpfKeyConst.DEPSELECT:
- dicItem.Add(item.__vModel__, item.multiple ? "例:产品部/部门编码,技术部/部门编码" : "例:技术部/部门编码");
- break;
- case JnpfKeyConst.POSSELECT:
- dicItem.Add(item.__vModel__, item.multiple ? "例:技术经理/岗位编码,技术员/岗位编码" : "例:技术员/岗位编码");
- break;
- case JnpfKeyConst.USERSSELECT:
- dicItem.Add(item.__vModel__, item.selectType.Equals("all") ? "例:拓通智联/产品部,产品部/部门编码,技术经理/岗位编码,研发人员/角色编码,A分组/分组编码,张三/账号" : "例:李四/账号");
- break;
- case JnpfKeyConst.USERSELECT:
- dicItem.Add(item.__vModel__, item.multiple ? "例:张三/账号,李四/账号" : "例:张三/账号");
- break;
- case JnpfKeyConst.ROLESELECT:
- dicItem.Add(item.__vModel__, item.multiple ? "例:研发人员/角色编码,测试人员/角色编码" : "例:研发人员/角色编码");
- break;
- case JnpfKeyConst.GROUPSELECT:
- dicItem.Add(item.__vModel__, item.multiple ? "例:A分组/分组编码,B分组/分组编码" : "例:A分组/分组编码");
- break;
- case JnpfKeyConst.DATE:
- dicItem.Add(item.__vModel__, string.Format("例:{0}", item.format));
- break;
- case JnpfKeyConst.TIME:
- dicItem.Add(item.__vModel__, "例: HH:mm:ss");
- break;
- case JnpfKeyConst.ADDRESS:
- switch (item.level)
+ if (type.IsNullOrEmpty()) type = "1";
+ VisualDevEntity? data = await _visualDevService.GetInfoById(modelId, type.Equals("1"));
+ if (data == null) return new { code = 400, msg = "未找到该模板!" };
+ if (data.EnableFlow.Equals(-1) && data.FlowId.IsNotEmptyOrNull()) return new { code = 400, msg = "该功能配置的流程已停用!" };
+ if (data.EnableFlow.Equals(1) && data.FlowId.IsNullOrWhiteSpace()) return new { code = 400, msg = "该流程功能未绑定流程!" };
+ if (data.WebType.Equals(1) && data.FormData.IsNullOrWhiteSpace()) return new { code = 400, msg = "该模板内表单内容为空,无法预览!" };
+ else if (data.WebType.Equals(2) && data.ColumnData.IsNullOrWhiteSpace()) return new { code = 400, msg = "该模板内列表内容为空,无法预览!" };
+ return new { code = 200, data = data.Adapt() };
+ }
+
+ ///
+ /// 获取列表配置JSON.
+ ///
+ /// 主键id.
+ ///
+ [HttpGet("{modelId}/ColumnData")]
+ public async Task GetColumnData(string modelId)
+ {
+ VisualDevEntity? data = await _visualDevService.GetInfoById(modelId);
+ return new { columnData = data.ColumnData };
+ }
+
+ ///
+ /// 获取列表配置JSON.
+ ///
+ /// 主键id.
+ ///
+ [HttpGet("{modelId}/FormData")]
+ public async Task GetFormData(string modelId)
+ {
+ VisualDevEntity? data = await _visualDevService.GetInfoById(modelId);
+ return new { formData = data.FormData };
+ }
+
+ ///
+ /// 获取列表配置JSON.
+ ///
+ /// 主键id.
+ ///
+ [HttpGet("{modelId}/FlowTemplate")]
+ public async Task GetFlowTemplate(string modelId)
+ {
+ VisualDevEntity? data = await _visualDevService.GetInfoById(modelId);
+ return new { flowTemplateJson = data.FlowTemplateJson };
+ }
+
+ ///
+ /// 获取数据信息.
+ ///
+ ///
+ ///
+ ///
+ [HttpGet("{modelId}/{id}")]
+ public async Task GetInfo(string id, string modelId)
+ {
+ var overideSvc = OverideVisualDevManager.GetOrDefault(modelId);
+ if (overideSvc != null && overideSvc.OverideFuncs.GetAsync != null)
{
- case 0:
- dicItem.Add(item.__vModel__, item.multiple ? "例:福建省,广东省" : "例:福建省");
- break;
- case 1:
- dicItem.Add(item.__vModel__, item.multiple ? "例:福建省/莆田市,广东省/广州市" : "例:福建省/莆田市");
- break;
- case 2:
- dicItem.Add(item.__vModel__, item.multiple ? "例:福建省/莆田市/城厢区,广东省/广州市/荔湾区" : "例:福建省/莆田市/城厢区");
- break;
- case 3:
- dicItem.Add(item.__vModel__, item.multiple ? "例:福建省/莆田市/城厢区/霞林街道,广东省/广州市/荔湾区/沙面街道" : "例:福建省/莆田市/城厢区/霞林街道");
- break;
- }
- break;
- default:
- dicItem.Add(item.__vModel__, string.Empty);
- break;
- }
- });
- dicItem.Add("id", "id");
- dataList.Add(dicItem);
-
- var excelName = string.Format("{0} 导入模板_{1}", tInfo.FullName, SnowflakeIdHelper.NextId());
- var res = GetCreateFirstColumnsHeader(tInfo.selectKey, dataList, tInfo.AllFieldsModel);
- var firstColumns = res.First().ToObject>();
- var resultList = res.Last().ToObject>>();
- _cacheManager.Set(excelName + ".xls", string.Empty);
- return firstColumns.Any() ? await ExcelCreateModel(tInfo.AllFieldsModel, resultList, tInfo.selectKey, excelName, firstColumns)
- : await ExcelCreateModel(tInfo.AllFieldsModel, resultList, tInfo.selectKey, excelName);
- }
-
- ///
- /// 上传文件.
- ///
- ///
- ///
- [HttpPost("Uploader")]
- public async Task Uploader(IFormFile file)
- {
- var _filePath = _fileManager.GetPathByType(string.Empty);
- var _fileName = DateTime.Now.ToString("yyyyMMdd") + "_" + SnowflakeIdHelper.NextId() + Path.GetExtension(file.FileName);
- var stream = file.OpenReadStream();
- await _fileManager.UploadFileByType(stream, _filePath, _fileName);
- return new { name = _fileName, url = string.Format("/api/File/Image/{0}/{1}", string.Empty, _fileName) };
- }
-
- ///
- /// 导入预览.
- ///
- ///
- [HttpGet("{modelId}/ImportPreview")]
- public async Task ImportPreview(string modelId, string fileName)
- {
- var tInfo = await GetUploaderTemplateInfoAsync(modelId);
-
- var resData = new List>();
- var headerRow = new List();
-
- var isChildTable = tInfo.ColumnData.columnList.Any(x => tInfo.ChildTableFields.ContainsKey(x.__vModel__));
- try
- {
- var FileEncode = tInfo.AllFieldsModel.Where(x => tInfo.selectKey.Contains(x.__vModel__)).ToList();
-
- string? savePath = Path.Combine(FileVariable.TemporaryFilePath, fileName);
-
- // 得到数据
- global::System.Data.DataTable? excelData = ExcelImportHelper.ToDataTable(savePath);
- if (isChildTable) excelData = ExcelImportHelper.ToDataTable(savePath, 0, 1);
- if (excelData.Columns.Count > tInfo.selectKey.Count) excelData.Columns.RemoveAt(tInfo.selectKey.Count);
- foreach (object? item in excelData.Columns)
- {
- excelData.Columns[item.ToString()].ColumnName = FileEncode.Where(x => x.__config__.label == item.ToString()).FirstOrDefault().__vModel__;
- }
-
- resData = excelData.ToObject>>();
- if (resData.Any())
- {
- if (isChildTable)
- {
- var hRow = resData[1].Copy();
- foreach (var item in hRow)
- {
- if (item.Key.Contains("tableField") && item.Key.Contains("-"))
- {
- var childVModel = item.Key.Split("-").First();
- if (!headerRow.Any(x => x.id.Equals(childVModel)))
- {
- var child = new List();
- hRow.Where(x => x.Key.Contains(childVModel)).ToList().ForEach(x =>
- {
- child.Add(new { id = x.Key.Replace(childVModel + "-", string.Empty), fullName = x.Value.ToString().Replace(string.Format("({0})", x.Key), string.Empty) });
- });
- headerRow.Add(new { id = childVModel, fullName = tInfo.AllFieldsModel.Find(x => x.__vModel__.Equals(childVModel)).__config__.label.Replace(string.Format("({0})", childVModel), string.Empty), children = child });
- }
- }
- else
- {
- headerRow.Add(new { id = item.Key, fullName = item.Value.ToString().Replace(string.Format("({0})", item.Key), string.Empty) });
- }
- }
- resData.Remove(resData.First());
- resData.Remove(resData.First());
- }
- else
- {
- foreach (var item in resData.First().Copy()) headerRow.Add(new { id = item.Key, fullName = item.Value.ToString().Replace(string.Format("({0})", item.Key), string.Empty) });
- resData.Remove(resData.First());
- }
- }
- }
- catch (Exception e)
- {
- throw Oops.Oh(ErrorCode.D1410);
- }
-
- try
- {
- // 带子表字段数据导入
- if (isChildTable)
- {
- var newData = new List>();
- var singleForm = tInfo.selectKey.Where(x => !x.Contains("tableField")).ToList();
- var childTableVModel = tInfo.AllFieldsModel.Where(x => x.__config__.jnpfKey.Equals(JnpfKeyConst.TABLE)).Select(x => x.__vModel__).ToList();
- resData.ForEach(dataItem =>
- {
- var addItem = new Dictionary();
- var isNextRow = false;
- singleForm.ForEach(item =>
- {
- if (dataItem[item].IsNotEmptyOrNull()) isNextRow = true;
- });
-
- // 单条数据 (多行子表数据合并)
- if (isNextRow)
- {
- singleForm.ForEach(item => addItem.Add(item, dataItem[item]));
-
- // 子表数据
- childTableVModel.ForEach(item =>
- {
- var childAddItem = new Dictionary();
- tInfo.selectKey.Where(x => x.Contains(item)).ToList().ForEach(it =>
- {
- childAddItem.Add(it.Replace(item + "-", string.Empty), dataItem[it]);
- });
-
- addItem.Add(item, new List> { childAddItem });
- });
-
- newData.Add(addItem);
+ return await overideSvc.OverideFuncs.GetAsync(id);
}
else
{
- var item = newData.LastOrDefault();
- if (item != null)
- {
- // 子表数据
- childTableVModel.ForEach(citem =>
- {
- var childAddItem = new Dictionary();
- tInfo.selectKey.Where(x => x.Contains(citem)).ToList().ForEach(it =>
- {
- childAddItem.Add(it.Replace(citem + "-", string.Empty), dataItem[it]);
- });
+ VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(modelId, true); // 模板实体
- if (!item.ContainsKey(citem))
+ // 有表
+ if (!string.IsNullOrEmpty(templateEntity.Tables) && !"[]".Equals(templateEntity.Tables))
+ //modified by pf 2023-04-12 返回值不序列化成字符串
+ return new { id = id, data = (await _runService.GetHaveTableInfo(id, templateEntity)) };
+ return null;
+ }
+ }
+
+ ///
+ /// 获取详情.
+ ///
+ ///
+ ///
+ ///
+ [HttpGet("{modelId}/{id}/DataChange")]
+ public async Task GetDetails(string id, string modelId)
+ {
+ var overideSvc = OverideVisualDevManager.GetOrDefault(modelId);
+ if (overideSvc != null && overideSvc.OverideFuncs.GetDetailsAsync != null)
+ {
+ return await overideSvc.OverideFuncs.GetDetailsAsync(id);
+ }
+ else
+ {
+ VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(modelId, true); // 模板实体
+
+ // 有表
+ if (!string.IsNullOrEmpty(templateEntity.Tables) && !"[]".Equals(templateEntity.Tables))
+ //modified by pf 2023-04-12 返回值不序列化成字符串
+ return new { id = id, data = await _runService.GetHaveTableInfoDetails(id, templateEntity) };
+ return null;
+ }
+ }
+
+ #endregion
+
+ #region Post
+
+ ///
+ /// 功能导出.
+ ///
+ ///
+ ///
+ [HttpPost("{modelId}/Actions/ExportData")]
+ public async Task ActionsExportData(string modelId)
+ {
+ VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(modelId); // 模板实体
+ if (templateEntity.State.Equals(1))
+ {
+ var vREntity = await _visualDevRepository.AsSugarClient().Queryable().FirstAsync(v => v.Id == modelId && v.DeleteMark == null);
+ templateEntity = vREntity.Adapt();
+ templateEntity.State = 0;
+ }
+ string? jsonStr = templateEntity.ToJsonString();
+ return await _fileManager.Export(jsonStr, templateEntity.FullName, ExportFileType.vdd);
+ }
+
+ ///
+ /// 导入.
+ ///
+ ///
+ ///
+ [HttpPost("Model/Actions/ImportData")]
+ public async Task ActionsActionsImport(IFormFile file)
+ {
+ string? fileType = Path.GetExtension(file.FileName).Replace(".", string.Empty);
+ if (!fileType.ToLower().Equals(ExportFileType.vdd.ToString())) throw Oops.Oh(ErrorCode.D3006);
+ string? josn = _fileManager.Import(file);
+ VisualDevEntity? templateEntity;
+ try
+ {
+ templateEntity = josn.ToObject();
+ }
+ catch
+ {
+ throw Oops.Oh(ErrorCode.D3006);
+ }
+
+ if (templateEntity == null || templateEntity.Type.IsNullOrEmpty()) throw Oops.Oh(ErrorCode.D3006);
+ else if (templateEntity.Type != 1) throw Oops.Oh(ErrorCode.D3009);
+ if (await _visualDevService.GetDataExists(templateEntity.EnCode, templateEntity.FullName))
+ throw Oops.Oh(ErrorCode.D1400);
+ await _visualDevService.CreateImportData(templateEntity);
+ }
+
+ ///
+ /// 获取数据列表.
+ ///
+ /// 主键id.
+ /// 分页查询条件.
+ ///
+ [HttpPost("{modelId}/List")]
+ public async Task List(string modelId, [FromBody] VisualDevModelListQueryInput input)
+ {
+ var overideSvc = OverideVisualDevManager.GetOrDefault(modelId);
+ if (overideSvc != null && overideSvc.OverideFuncs.GetListAsync != null)
+ {
+ return await overideSvc.OverideFuncs.GetListAsync(input);
+ }
+ else
+ {
+ VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(modelId, true);
+ return await _runService.GetListResult(templateEntity, input);
+ }
+ }
+
+ ///
+ /// 创建数据.
+ ///
+ ///
+ ///
+ ///
+ [HttpPost("{modelId}")]
+ public async Task Create(string modelId, [FromBody] VisualDevModelDataCrInput visualdevModelDataCrForm)
+ {
+ var overideSvc = OverideVisualDevManager.GetOrDefault(modelId);
+ if (overideSvc != null && overideSvc.OverideFuncs.CreateAsync != null)
+ {
+ await overideSvc.OverideFuncs.CreateAsync(visualdevModelDataCrForm);
+ }
+ else
+ {
+ VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(modelId, true);
+ await _runService.Create(templateEntity, visualdevModelDataCrForm);
+ }
+ }
+
+ ///
+ /// 修改数据.
+ ///
+ ///
+ ///
+ ///
+ ///
+ [HttpPut("{modelId}/{id}")]
+ public async Task Update(string modelId, string id, [FromBody] VisualDevModelDataUpInput visualdevModelDataUpForm)
+ {
+ var overideSvc = OverideVisualDevManager.GetOrDefault(modelId);
+ if (overideSvc != null && overideSvc.OverideFuncs.UpdateAsync != null)
+ {
+ await overideSvc.OverideFuncs.UpdateAsync(id, visualdevModelDataUpForm);
+ }
+ else
+ {
+ VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(modelId, true);
+ await _runService.Update(id, templateEntity, visualdevModelDataUpForm);
+ }
+ }
+
+ ///
+ /// 删除数据.
+ ///
+ ///
+ ///
+ ///
+ [HttpDelete("{modelId}/{id}")]
+ public async Task Delete(string id, string modelId)
+ {
+ var overideSvc = OverideVisualDevManager.GetOrDefault(modelId);
+ if (overideSvc != null && overideSvc.OverideFuncs.DeleteAsync != null)
+ {
+ await overideSvc.OverideFuncs.DeleteAsync(id);
+ }
+ else
+ {
+ VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(modelId, true);
+ if (!string.IsNullOrEmpty(templateEntity.Tables) && !"[]".Equals(templateEntity.Tables)) await _runService.DelHaveTableInfo(id, templateEntity);
+ }
+ }
+
+ ///
+ /// 批量删除.
+ ///
+ ///
+ ///
+ ///
+ [HttpPost("batchDelete/{modelId}")]
+ public async Task BatchDelete(string modelId, [FromBody] VisualDevModelDataBatchDelInput input)
+ {
+ var overideSvc = OverideVisualDevManager.GetOrDefault(modelId);
+ if (overideSvc != null && overideSvc.OverideFuncs.DeleteRangeAsync != null)
+ {
+ await overideSvc.OverideFuncs.DeleteRangeAsync(input);
+ }
+ else
+ {
+ VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(modelId, true);
+ if (!string.IsNullOrEmpty(templateEntity.Tables) && !"[]".Equals(templateEntity.Tables)) await _runService.BatchDelHaveTableData(input.ids, templateEntity);
+ }
+ }
+
+ ///
+ /// 导出.
+ ///
+ ///
+ ///
+ ///
+ [HttpPost("{modelId}/Actions/Export")]
+ public async Task Export(string modelId, [FromBody] VisualDevModelListQueryInput input)
+ {
+ VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(modelId, true);
+ List list = new List();
+ if (input.dataType == "1") input.pageSize = 99999999;
+ PageResult>? pageList = await _runService.GetListResult(templateEntity, input);
+
+ // 如果是 分组表格 模板
+ ColumnDesignModel? columnData = templateEntity.ColumnData.ToObject(); // 列配置模型
+ if (columnData.type == 3)
+ {
+ List>? newValueList = new List>();
+ pageList.list.ForEach(item =>
+ {
+ List>? tt = item["children"].ToJsonString().ToObject>>();
+ newValueList.AddRange(tt);
+ });
+ pageList.list = newValueList;
+ }
+
+ List> realList = pageList.list.Copy();
+ var templateInfo = new TemplateParsingBase(templateEntity);
+ var res = GetCreateFirstColumnsHeader(input.selectKey, realList, templateInfo.AllFieldsModel);
+ var firstColumns = res.First().ToObject>();
+ var resultList = res.Last().ToObject>>();
+ var newResultList = new List>();
+ resultList.ForEach(row =>
+ {
+ foreach (var item in input.selectKey)
+ {
+ if (row[item].IsNotEmptyOrNull())
+ {
+ newResultList.Add(row);
+ break;
+ }
+ }
+ });
+
+ var excelName = string.Format("{0}", SnowflakeIdHelper.NextId());
+ _cacheManager.Set(excelName + ".xls", string.Empty);
+ return firstColumns.Any() ? await ExcelCreateModel(templateInfo.AllFieldsModel, resultList, input.selectKey, excelName, firstColumns)
+ : await ExcelCreateModel(templateInfo.AllFieldsModel, resultList, input.selectKey, excelName);
+ }
+
+ ///
+ /// 模板下载.
+ ///
+ ///
+ [HttpGet("{modelId}/TemplateDownload")]
+ public async Task TemplateDownload(string modelId)
+ {
+ var tInfo = await GetUploaderTemplateInfoAsync(modelId);
+
+ if (tInfo.selectKey == null || !tInfo.selectKey.Any()) throw Oops.Oh(ErrorCode.D1411);
+
+ // 初始化 一条空数据
+ List>? dataList = new List>();
+
+ // 赋予默认值
+ var dicItem = new Dictionary();
+ tInfo.AllFieldsModel.Where(x => tInfo.selectKey.Contains(x.__vModel__)).ToList().ForEach(item =>
+ {
+ switch (item.__config__.jnpfKey)
+ {
+ case JnpfKeyConst.CREATEUSER:
+ case JnpfKeyConst.MODIFYUSER:
+ case JnpfKeyConst.CREATETIME:
+ case JnpfKeyConst.MODIFYTIME:
+ case JnpfKeyConst.CURRORGANIZE:
+ case JnpfKeyConst.CURRPOSITION:
+ case JnpfKeyConst.CURRDEPT:
+ case JnpfKeyConst.BILLRULE:
+ dicItem.Add(item.__vModel__, "系统自动生成");
+ break;
+ case JnpfKeyConst.COMSELECT:
+ dicItem.Add(item.__vModel__, item.multiple ? "例:拓通智联/产品部,拓通智联/技术部" : "例:拓通智联/技术部");
+ break;
+ case JnpfKeyConst.DEPSELECT:
+ dicItem.Add(item.__vModel__, item.multiple ? "例:产品部/部门编码,技术部/部门编码" : "例:技术部/部门编码");
+ break;
+ case JnpfKeyConst.POSSELECT:
+ dicItem.Add(item.__vModel__, item.multiple ? "例:技术经理/岗位编码,技术员/岗位编码" : "例:技术员/岗位编码");
+ break;
+ case JnpfKeyConst.USERSSELECT:
+ dicItem.Add(item.__vModel__, item.selectType.Equals("all") ? "例:拓通智联/产品部,产品部/部门编码,技术经理/岗位编码,研发人员/角色编码,A分组/分组编码,张三/账号" : "例:李四/账号");
+ break;
+ case JnpfKeyConst.USERSELECT:
+ dicItem.Add(item.__vModel__, item.multiple ? "例:张三/账号,李四/账号" : "例:张三/账号");
+ break;
+ case JnpfKeyConst.ROLESELECT:
+ dicItem.Add(item.__vModel__, item.multiple ? "例:研发人员/角色编码,测试人员/角色编码" : "例:研发人员/角色编码");
+ break;
+ case JnpfKeyConst.GROUPSELECT:
+ dicItem.Add(item.__vModel__, item.multiple ? "例:A分组/分组编码,B分组/分组编码" : "例:A分组/分组编码");
+ break;
+ case JnpfKeyConst.DATE:
+ dicItem.Add(item.__vModel__, string.Format("例:{0}", item.format));
+ break;
+ case JnpfKeyConst.TIME:
+ dicItem.Add(item.__vModel__, "例: HH:mm:ss");
+ break;
+ case JnpfKeyConst.ADDRESS:
+ switch (item.level)
{
- item.Add(citem, new List> { childAddItem });
+ case 0:
+ dicItem.Add(item.__vModel__, item.multiple ? "例:福建省,广东省" : "例:福建省");
+ break;
+ case 1:
+ dicItem.Add(item.__vModel__, item.multiple ? "例:福建省/莆田市,广东省/广州市" : "例:福建省/莆田市");
+ break;
+ case 2:
+ dicItem.Add(item.__vModel__, item.multiple ? "例:福建省/莆田市/城厢区,广东省/广州市/荔湾区" : "例:福建省/莆田市/城厢区");
+ break;
+ case 3:
+ dicItem.Add(item.__vModel__, item.multiple ? "例:福建省/莆田市/城厢区/霞林街道,广东省/广州市/荔湾区/沙面街道" : "例:福建省/莆田市/城厢区/霞林街道");
+ break;
+ }
+ break;
+ default:
+ dicItem.Add(item.__vModel__, string.Empty);
+ break;
+ }
+ });
+ dicItem.Add("id", "id");
+ dataList.Add(dicItem);
+
+ var excelName = string.Format("{0} 导入模板_{1}", tInfo.FullName, SnowflakeIdHelper.NextId());
+ var res = GetCreateFirstColumnsHeader(tInfo.selectKey, dataList, tInfo.AllFieldsModel);
+ var firstColumns = res.First().ToObject>();
+ var resultList = res.Last().ToObject>>();
+ _cacheManager.Set(excelName + ".xls", string.Empty);
+ return firstColumns.Any() ? await ExcelCreateModel(tInfo.AllFieldsModel, resultList, tInfo.selectKey, excelName, firstColumns)
+ : await ExcelCreateModel(tInfo.AllFieldsModel, resultList, tInfo.selectKey, excelName);
+ }
+
+ ///
+ /// 上传文件.
+ ///
+ ///
+ ///
+ [HttpPost("Uploader")]
+ public async Task Uploader(IFormFile file)
+ {
+ var _filePath = _fileManager.GetPathByType(string.Empty);
+ var _fileName = DateTime.Now.ToString("yyyyMMdd") + "_" + SnowflakeIdHelper.NextId() + Path.GetExtension(file.FileName);
+ var stream = file.OpenReadStream();
+ await _fileManager.UploadFileByType(stream, _filePath, _fileName);
+ return new { name = _fileName, url = string.Format("/api/File/Image/{0}/{1}", string.Empty, _fileName) };
+ }
+
+ ///
+ /// 导入预览.
+ ///
+ ///
+ [HttpGet("{modelId}/ImportPreview")]
+ public async Task ImportPreview(string modelId, string fileName)
+ {
+ var tInfo = await GetUploaderTemplateInfoAsync(modelId);
+
+ var resData = new List>();
+ var headerRow = new List();
+
+ var isChildTable = tInfo.ColumnData.columnList.Any(x => tInfo.ChildTableFields.ContainsKey(x.__vModel__));
+ try
+ {
+ var FileEncode = tInfo.AllFieldsModel.Where(x => tInfo.selectKey.Contains(x.__vModel__)).ToList();
+
+ string? savePath = Path.Combine(FileVariable.TemporaryFilePath, fileName);
+
+ // 得到数据
+ global::System.Data.DataTable? excelData = ExcelImportHelper.ToDataTable(savePath);
+ if (isChildTable) excelData = ExcelImportHelper.ToDataTable(savePath, 0, 1);
+ if (excelData.Columns.Count > tInfo.selectKey.Count) excelData.Columns.RemoveAt(tInfo.selectKey.Count);
+ foreach (object? item in excelData.Columns)
+ {
+ excelData.Columns[item.ToString()].ColumnName = FileEncode.Where(x => x.__config__.label == item.ToString()).FirstOrDefault().__vModel__;
+ }
+
+ resData = excelData.ToObject>>();
+ if (resData.Any())
+ {
+ if (isChildTable)
+ {
+ var hRow = resData[1].Copy();
+ foreach (var item in hRow)
+ {
+ if (item.Key.Contains("tableField") && item.Key.Contains("-"))
+ {
+ var childVModel = item.Key.Split("-").First();
+ if (!headerRow.Any(x => x.id.Equals(childVModel)))
+ {
+ var child = new List();
+ hRow.Where(x => x.Key.Contains(childVModel)).ToList().ForEach(x =>
+ {
+ child.Add(new { id = x.Key.Replace(childVModel + "-", string.Empty), fullName = x.Value.ToString().Replace(string.Format("({0})", x.Key), string.Empty) });
+ });
+ headerRow.Add(new { id = childVModel, fullName = tInfo.AllFieldsModel.Find(x => x.__vModel__.Equals(childVModel)).__config__.label.Replace(string.Format("({0})", childVModel), string.Empty), children = child });
+ }
+ }
+ else
+ {
+ headerRow.Add(new { id = item.Key, fullName = item.Value.ToString().Replace(string.Format("({0})", item.Key), string.Empty) });
+ }
+ }
+ resData.Remove(resData.First());
+ resData.Remove(resData.First());
+ }
+ else
+ {
+ foreach (var item in resData.First().Copy()) headerRow.Add(new { id = item.Key, fullName = item.Value.ToString().Replace(string.Format("({0})", item.Key), string.Empty) });
+ resData.Remove(resData.First());
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ throw Oops.Oh(ErrorCode.D1410);
+ }
+
+ try
+ {
+ // 带子表字段数据导入
+ if (isChildTable)
+ {
+ var newData = new List>();
+ var singleForm = tInfo.selectKey.Where(x => !x.Contains("tableField")).ToList();
+ var childTableVModel = tInfo.AllFieldsModel.Where(x => x.__config__.jnpfKey.Equals(JnpfKeyConst.TABLE)).Select(x => x.__vModel__).ToList();
+ resData.ForEach(dataItem =>
+ {
+ var addItem = new Dictionary();
+ var isNextRow = false;
+ singleForm.ForEach(item =>
+ {
+ if (dataItem[item].IsNotEmptyOrNull()) isNextRow = true;
+ });
+
+ // 单条数据 (多行子表数据合并)
+ if (isNextRow)
+ {
+ singleForm.ForEach(item => addItem.Add(item, dataItem[item]));
+
+ // 子表数据
+ childTableVModel.ForEach(item =>
+ {
+ var childAddItem = new Dictionary();
+ tInfo.selectKey.Where(x => x.Contains(item)).ToList().ForEach(it =>
+ {
+ childAddItem.Add(it.Replace(item + "-", string.Empty), dataItem[it]);
+ });
+
+ addItem.Add(item, new List> { childAddItem });
+ });
+
+ newData.Add(addItem);
}
else
{
- var childList = item[citem].ToObject>>();
- childList.Add(childAddItem);
- item[citem] = childList;
+ var item = newData.LastOrDefault();
+ if (item != null)
+ {
+ // 子表数据
+ childTableVModel.ForEach(citem =>
+ {
+ var childAddItem = new Dictionary();
+ tInfo.selectKey.Where(x => x.Contains(citem)).ToList().ForEach(it =>
+ {
+ childAddItem.Add(it.Replace(citem + "-", string.Empty), dataItem[it]);
+ });
+
+ if (!item.ContainsKey(citem))
+ {
+ item.Add(citem, new List> { childAddItem });
+ }
+ else
+ {
+ var childList = item[citem].ToObject>>();
+ childList.Add(childAddItem);
+ item[citem] = childList;
+ }
+ });
+ }
+ else
+ {
+ singleForm.ForEach(item => addItem.Add(item, dataItem[item]));
+
+ // 子表数据
+ childTableVModel.ForEach(item =>
+ {
+ var childAddItem = new Dictionary();
+ tInfo.selectKey.Where(x => x.Contains(item)).ToList().ForEach(it =>
+ {
+ childAddItem.Add(it.Replace(item + "-", string.Empty), dataItem[it]);
+ });
+
+ addItem.Add(item, new List> { childAddItem });
+ });
+
+ newData.Add(addItem);
+ }
}
- });
- }
- else
- {
- singleForm.ForEach(item => addItem.Add(item, dataItem[item]));
-
- // 子表数据
- childTableVModel.ForEach(item =>
- {
- var childAddItem = new Dictionary();
- tInfo.selectKey.Where(x => x.Contains(item)).ToList().ForEach(it =>
- {
- childAddItem.Add(it.Replace(item + "-", string.Empty), dataItem[it]);
- });
-
- addItem.Add(item, new List> { childAddItem });
- });
-
- newData.Add(addItem);
- }
- }
- });
- resData = newData;
- }
- }
- catch
- {
- throw Oops.Oh(ErrorCode.D1412);
- }
-
- resData.ForEach(items =>
- {
- foreach (var item in items)
- {
- var vmodel = tInfo.AllFieldsModel.FirstOrDefault(x => x.__vModel__.Equals(item.Key));
- if (vmodel != null && vmodel.__config__.jnpfKey.Equals(JnpfKeyConst.DATE) && item.Value.IsNotEmptyOrNull()) items[item.Key] = item.Value + " ";
- }
- });
-
- // 返回结果
- return new { dataRow = resData, headerRow = headerRow };
- }
-
- ///
- /// 导入数据的错误报告.
- ///
- ///
- ///
- [HttpPost("{modelId}/ImportExceptionData")]
- [UnitOfWork]
- public async Task ExportExceptionData(string modelId, [FromBody] VisualDevImportDataInput list)
- {
- var tInfo = await GetUploaderTemplateInfoAsync(modelId);
- //object[]? res = await ImportMenuData(tInfo, list.list, tInfo.visualDevEntity);
-
- // 错误数据
- tInfo.selectKey.Add("errorsInfo");
- tInfo.AllFieldsModel.Add(new FieldsModel() { __vModel__ = "errorsInfo", __config__ = new ConfigModel() { label = "异常原因" } });
- for (var i = 0; i < list.list.Count(); i++) list.list[i].Add("id", i);
-
- var result = GetCreateFirstColumnsHeader(tInfo.selectKey, list.list, tInfo.AllFieldsModel);
- var firstColumns = result.First().ToObject>();
- var resultList = result.Last().ToObject>>();
-
- _cacheManager.Set(string.Format("{0} 导入错误报告.xls", tInfo.FullName), string.Empty);
- return firstColumns.Any()
- ? await ExcelCreateModel(tInfo.AllFieldsModel, resultList, tInfo.selectKey, string.Format("{0} 导入错误报告", tInfo.FullName), firstColumns)
- : await ExcelCreateModel(tInfo.AllFieldsModel, resultList, tInfo.selectKey, string.Format("{0} 导入错误报告", tInfo.FullName));
- }
-
- ///
- /// 导入数据.
- ///
- ///
- ///
- [HttpPost("{modelId}/ImportData")]
- [UnitOfWork]
- public async Task ImportData(string modelId, [FromBody] VisualDevImportDataInput list)
- {
- var tInfo = await GetUploaderTemplateInfoAsync(modelId);
- object[]? res = await ImportMenuData(tInfo, list.list, tInfo.visualDevEntity);
- var addlist = res.First() as List>;
- var errorlist = res.Last() as List>;
- var result = new VisualDevImportDataOutput()
- {
- snum = addlist.Count,
- fnum = errorlist.Count,
- failResult = errorlist,
- resultType = errorlist.Count < 1 ? 0 : 1
- };
-
- return result;
- }
-
- #endregion
-
- #region PublicMethod
-
- ///
- /// Excel 转输出 Model.
- ///
- /// 控件集合.
- /// 数据列表.
- ///
- /// 导出文件名称.
- /// 手动输入第一行(合并主表列和各个子表列).
- /// VisualDevModelDataExportOutput.
- public async Task ExcelCreateModel(List fieldList, List> realList, List keys, string excelName = null, Dictionary firstColumns = null)
- {
- VisualDevModelDataExportOutput output = new VisualDevModelDataExportOutput();
- try
- {
- List columnList = new List();
- ExcelConfig excelconfig = new ExcelConfig();
- excelconfig.FileName = (excelName.IsNullOrEmpty() ? SnowflakeIdHelper.NextId() : excelName) + ".xls";
- excelconfig.HeadFont = "微软雅黑";
- excelconfig.HeadPoint = 10;
- excelconfig.IsAllSizeColumn = true;
- excelconfig.ColumnModel = new List();
- foreach (string? item in keys)
- {
- FieldsModel? excelColumn = fieldList.Find(t => t.__vModel__ == item);
- if (excelColumn != null)
- {
- excelconfig.ColumnModel.Add(new ExcelColumnModel() { Column = item, ExcelColumn = excelColumn.__config__.label });
- columnList.Add(excelColumn.__config__.label);
- }
- }
-
- string? addPath = Path.Combine(FileVariable.TemporaryFilePath, excelconfig.FileName);
- var fs = firstColumns == null ? ExcelExportHelper>.ExportMemoryStream(realList, excelconfig, columnList) : ExcelExportHelper>.ExportMemoryStream(realList, excelconfig, columnList, firstColumns);
- var flag = await _fileManager.UploadFileByType(fs, FileVariable.TemporaryFilePath, excelconfig.FileName);
- if (flag)
- {
- fs.Flush();
- fs.Close();
- }
- output.name = excelconfig.FileName;
- output.url = "/api/file/Download?encryption=" + DESCEncryption.Encrypt(_userManager.UserId + "|" + excelconfig.FileName + "|" + addPath, "JNPF");
- return output;
- }
- catch (Exception)
- {
- throw;
- }
- }
-
- ///
- /// 组装导出带子表得数据,返回 第一个合并行标头,第二个导出数据.
- ///
- /// 导出选择列.
- /// 原数据集合.
- /// 控件列表.
- /// 第一行标头 , 导出数据.
- public object[] GetCreateFirstColumnsHeader(List selectKey, List> realList, List fieldList)
- {
- selectKey.ForEach(item =>
- {
- realList.ForEach(it =>
- {
- if (!it.ContainsKey(item)) it.Add(item, string.Empty);
- });
- });
-
- var newRealList = realList.Copy();
-
- realList.ForEach(items =>
- {
- var rowChildDatas = new Dictionary>>();
- foreach (var item in items)
- {
- if (item.Value != null && item.Key.ToLower().Contains("tablefield") && (item.Value is List> || item.Value.GetType().Name.Equals("JArray")))
- {
- var ctList = item.Value.ToObject>>();
- rowChildDatas.Add(item.Key, ctList);
- }
- }
-
- var len = rowChildDatas.Select(x => x.Value.Count()).OrderByDescending(x => x).FirstOrDefault();
-
- if (len != null && len > 0)
- {
- for (int i = 0; i < len; i++)
- {
- if (i == 0)
- {
- var newRealItem = newRealList.Find(x => x["id"].Equals(items["id"]));
- foreach (var cData in rowChildDatas)
- {
- var itemData = cData.Value.FirstOrDefault();
- if (itemData != null)
- {
- foreach (var key in itemData)
- if (newRealItem.ContainsKey(cData.Key + "-" + key.Key)) newRealItem[cData.Key + "-" + key.Key] = key.Value;
- }
- }
- }
- else
- {
- var newRealItem = new Dictionary();
- foreach (var it in items)
- {
- if (it.Key.Equals("id")) newRealItem.Add(it.Key, it.Value);
- else newRealItem.Add(it.Key, string.Empty);
- }
- foreach (var cData in rowChildDatas)
- {
- if (cData.Value.Count > i)
- {
- foreach (var it in cData.Value[i])
- if (newRealItem.ContainsKey(cData.Key + "-" + it.Key)) newRealItem[cData.Key + "-" + it.Key] = it.Value;
- }
- }
- newRealList.Add(newRealItem);
- }
- }
- }
- });
-
- var resultList = new List>();
-
- newRealList.ForEach(newRealItem =>
- {
- if (!resultList.Any(x => x["id"].Equals(newRealItem["id"]))) resultList.AddRange(newRealList.Where(x => x["id"].Equals(newRealItem["id"])).ToList());
- });
-
- var firstColumns = new Dictionary();
-
- if (selectKey.Any(x => x.Contains("-") && x.ToLower().Contains("tablefield")))
- {
- var empty = string.Empty;
- var keyList = selectKey.Select(x => x.Split("-").First()).Distinct().ToList();
- var mainFieldIndex = 1;
- keyList.ForEach(item =>
- {
- if (item.ToLower().Contains("tablefield"))
- {
- var title = fieldList.FirstOrDefault(x => x.__vModel__.Equals(item))?.__config__.label;
- firstColumns.Add(title + empty, selectKey.Count(x => x.Contains(item)));
- empty += " ";
- mainFieldIndex = 1;
- }
- else
- {
- if (mainFieldIndex == 1) empty += " ";
- if (!firstColumns.ContainsKey(empty)) firstColumns.Add(empty, mainFieldIndex);
- else firstColumns[empty] = mainFieldIndex;
- mainFieldIndex++;
- }
- });
- }
-
- return new object[] { firstColumns, resultList };
- }
- #endregion
-
- #region PrivateMethod
-
- ///
- /// 获取导出模板信息.
- ///
- ///
- ///
- private async Task GetUploaderTemplateInfoAsync(string modelId)
- {
- VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(modelId, true);
- var tInfo = new TemplateParsingBase(templateEntity);
- tInfo.DbLink = await _dbLinkService.GetInfo(templateEntity.DbLinkId);
- if (tInfo.DbLink == null) tInfo.DbLink = _databaseService.GetTenantDbLink(_userManager.TenantId, _userManager.TenantDbName); // 当前数据库连接
- var tableList = _databaseService.GetFieldList(tInfo.DbLink, tInfo.MainTableName); // 获取主表所有列
- var mainPrimary = tableList.Find(t => t.primaryKey); // 主表主键
- if (mainPrimary == null || mainPrimary.IsNullOrEmpty()) throw Oops.Oh(ErrorCode.D1402); // 主表未设置主键
- tInfo.MainPrimary = mainPrimary.field;
- tInfo.AllFieldsModel = tInfo.AllFieldsModel.Where(x => !x.__config__.jnpfKey.Equals(JnpfKeyConst.UPLOADFZ)
- && !x.__config__.jnpfKey.Equals(JnpfKeyConst.UPLOADIMG)
- && !x.__config__.jnpfKey.Equals(JnpfKeyConst.COLORPICKER)
- && !x.__config__.jnpfKey.Equals(JnpfKeyConst.POPUPTABLESELECT)
- && !x.__config__.jnpfKey.Equals(JnpfKeyConst.RELATIONFORM)
- && !x.__config__.jnpfKey.Equals(JnpfKeyConst.POPUPSELECT)
- && !x.__config__.jnpfKey.Equals(JnpfKeyConst.RELATIONFORMATTR)
- && !x.__config__.jnpfKey.Equals(JnpfKeyConst.POPUPATTR)
- && !x.__config__.jnpfKey.Equals(JnpfKeyConst.QRCODE)
- && !x.__config__.jnpfKey.Equals(JnpfKeyConst.BARCODE)
- && !x.__config__.jnpfKey.Equals(JnpfKeyConst.CALCULATE)).ToList();
- tInfo.AllFieldsModel.Where(x => x.__vModel__.IsNotEmptyOrNull()).ToList().ForEach(item => item.__config__.label = string.Format("{0}({1})", item.__config__.label, item.__vModel__));
- return tInfo;
- }
-
- ///
- /// 导入数据.
- ///
- /// 模板信息.
- /// 数据集合.
- /// 开发实体.
- /// [成功列表,失败列表].
- private async Task