using System.Reflection;
using System.Text.RegularExpressions;
using JNPF.Common.CodeGenUpload;
using JNPF.Common.Configuration;
using JNPF.Common.Const;
using JNPF.Common.Core.Manager;
using JNPF.Common.Core.Manager.Files;
using JNPF.Common.Dtos.VisualDev;
using JNPF.Common.Enums;
using JNPF.Common.Extension;
using JNPF.Common.Helper;
using JNPF.Common.Manager;
using JNPF.Common.Models;
using JNPF.Common.Models.NPOI;
using JNPF.Common.Security;
using JNPF.DataEncryption;
using JNPF.DependencyInjection;
using JNPF.FriendlyException;
using JNPF.RemoteRequest.Extensions;
using JNPF.Systems.Entitys.Model.DataInterFace;
using JNPF.Systems.Entitys.Permission;
using JNPF.Systems.Entitys.System;
using JNPF.Systems.Interfaces.System;
using JNPF.VisualDev;
using JNPF.VisualDev.Engine;
using JNPF.VisualDev.Engine.Core;
using JNPF.WorkFlow.Interfaces.Service;
using Mapster;
using Newtonsoft.Json.Linq;
using SqlSugar;
using Yitter.IdGenerator;
namespace JNPF.Common.CodeGen.ExportImport;
///
/// 代码生成导出数据帮助类.
///
public class ExportImportDataHelper : ITransient
{
///
/// 服务基础仓储.
///
private readonly ISqlSugarRepository _repository;
///
/// 用户管理器.
///
private readonly IUserManager _userManager;
///
/// 在线开发运行服务.
///
private readonly RunService _runService;
///
/// 单据.
///
private readonly IBillRullService _billRuleService;
///
/// 切库.
///
private readonly IDataBaseManager _databaseService;
///
/// 数据接口.
///
private readonly IDataInterfaceService _dataInterfaceService;
///
/// 缓存管理.
///
private readonly ICacheManager _cacheManager;
///
/// 工作流.
///
private readonly IFlowTaskService _flowTaskService;
///
/// 文件服务.
///
private readonly IFileManager _fileManager;
///
/// 客户端.
///
private static SqlSugarScope? _sqlSugarClient;
///
/// 构造函数.
///
public ExportImportDataHelper(
ISqlSugarRepository repositoryRepository,
IUserManager userManager,
RunService runService,
IBillRullService billRuleService,
IDataInterfaceService dataInterfaceService,
IDataBaseManager databaseService,
ICacheManager cacheManager,
IFlowTaskService flowTaskService,
IFileManager fileManager,
ISqlSugarClient context)
{
_repository = repositoryRepository;
_sqlSugarClient = (SqlSugarScope)context;
_billRuleService = billRuleService;
_databaseService = databaseService;
_dataInterfaceService = dataInterfaceService;
_runService = runService;
_cacheManager = cacheManager;
_flowTaskService = flowTaskService;
_fileManager = fileManager;
_userManager = userManager;
}
///
/// 组装导出带子表的数据,返回 第一个合并行标头,第二个导出数据.
///
/// 导出选择列.
/// 原数据集合.
/// 模板信息.
/// 第一行标头 , 导出数据.
public static object[] GetCreateFirstColumnsHeader(List selectKey, List> realList, List paramsModels)
{
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 = paramsModels.FirstOrDefault(x => x.field.Contains(item))?.value.Split("-")[0];
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 };
}
///
/// 数据导出通用.
///
/// 导出文件名.
/// selectKey.
/// 用户ID.
/// 数据集合.
/// 参数.
/// 是否分组表格.
/// 是否行内编辑.
///
public static dynamic GetDataExport(string fileName, string selectKey, string userId, List> realList, List paramList, bool isGroupTable = false, bool isInlineEditor = false)
{
switch (isInlineEditor)
{
case true:
paramList.ForEach(item =>
{
item.field = string.Format("{0}_name", item.field);
});
break;
}
var res = GetCreateFirstColumnsHeader(selectKey.Split(',').ToList(), realList, paramList);
var firstColumns = res.First().ToObject>();
var resultList = res.Last().ToObject>>();
List newSelectKey = selectKey.Split(',').ToList();
// 如果是 分组表格 类型
if (isGroupTable)
{
List>? newValueList = new List>();
realList.ForEach(item =>
{
List>? tt = item["children"].ToJsonString().ToObject>>();
newValueList.AddRange(tt);
});
realList = newValueList;
}
List newParamList = new List();
// 全部参数顺序
foreach (var item in firstColumns)
{
Regex re = new Regex(@"[\u4e00-\u9fa5]+");
switch (re.IsMatch(item.Key))
{
case false:
{
var param = newSelectKey.GetRange(0, item.Value);
newParamList.AddRange(paramList.FindAll(it => param.Contains(it.field)));
newSelectKey.RemoveAll(it => newParamList.Select(it => it.field).ToList().Contains(it));
}
break;
default:
var childTable = paramList.FindAll(it => it.value.Contains(item.Key.TrimEnd(' ')));
childTable = childTable.FindAll(it => selectKey.Split(',').ToList().Contains(it.field));
newParamList.AddRange(childTable);
newSelectKey.RemoveAll(it => newParamList.Select(it => it.field).ToList().Contains(it));
break;
}
}
if (newParamList.Count > 0) newSelectKey = newParamList.Select(it => it.field).ToList();
try
{
List columnList = new List();
ExcelConfig excelconfig = new ExcelConfig();
excelconfig.FileName = string.Format("{0}.xls", fileName);
excelconfig.HeadFont = "微软雅黑";
excelconfig.HeadPoint = 10;
excelconfig.IsAllSizeColumn = true;
excelconfig.ColumnModel = new List();
foreach (var item in newSelectKey)
{
ParamsModel isExist = new ParamsModel();
switch (isInlineEditor)
{
case true:
isExist = paramList.Find(p => p.field.Equals(string.Format("{0}_name", item)));
break;
default:
isExist = paramList.Find(p => p.field == item);
break;
}
if (isExist != null)
{
excelconfig.ColumnModel.Add(new ExcelColumnModel() { Column = isExist.field, ExcelColumn = isExist.value });
columnList.Add(isExist.value);
}
}
string? addPath = Path.Combine(FileVariable.TemporaryFilePath, excelconfig.FileName);
var fs = (firstColumns == null || firstColumns.Count() < 1) ? ExcelExportHelper>.ExportMemoryStream(realList, excelconfig, columnList) : ExcelExportHelper>.ExportMemoryStream(realList, excelconfig, columnList, firstColumns);
ExcelExportHelper>.Export(fs, addPath);
var fName = userId + "|" + addPath + "|xls";
return new
{
name = excelconfig.FileName,
url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fName, "JNPF")
};
}
catch (Exception)
{
throw;
}
}
///
/// 获取模板解析.
///
public static List GetTemplateParsing(T entity)
{
List fieldList = new List();
foreach (PropertyInfo prop in entity.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
{
FieldsModel field = new FieldsModel();
foreach (var att in prop.GetCustomAttributes(false))
{
if (att is CodeGenUploadAttribute)
{
var configModel = new ConfigModel();
field.__vModel__ = (att as CodeGenUploadAttribute).__Model__;
field.level = (att as CodeGenUploadAttribute).level;
field.min = (att as CodeGenUploadAttribute).min == 0 ? null : (att as CodeGenUploadAttribute).min;
field.max = (att as CodeGenUploadAttribute).max == 0 ? null : (att as CodeGenUploadAttribute).max;
field.activeTxt = (att as CodeGenUploadAttribute).activeTxt;
field.inactiveTxt = (att as CodeGenUploadAttribute).inactiveTxt;
field.format = (att as CodeGenUploadAttribute).format;
field.multiple = (att as CodeGenUploadAttribute).multiple;
field.separator = (att as CodeGenUploadAttribute).separator;
field.__slot__ = (att as CodeGenUploadAttribute).__slot__.Adapt();
field.props = (att as CodeGenUploadAttribute).props.Adapt();
field.options = (att as CodeGenUploadAttribute).options;
field.propsValue = (att as CodeGenUploadAttribute).propsValue;
field.relationField = (att as CodeGenUploadAttribute).relationField;
field.modelId = (att as CodeGenUploadAttribute).modelId;
field.interfaceId = (att as CodeGenUploadAttribute).interfaceId;
field.selectType = (att as CodeGenUploadAttribute).selectType;
field.ableDepIds = (att as CodeGenUploadAttribute).ableDepIds;
field.ablePosIds = (att as CodeGenUploadAttribute).ablePosIds;
field.ableUserIds = (att as CodeGenUploadAttribute).ableUserIds;
field.ableRoleIds = (att as CodeGenUploadAttribute).ableRoleIds;
field.ableGroupIds = (att as CodeGenUploadAttribute).ableGroupIds;
field.ableIds = (att as CodeGenUploadAttribute).ableIds;
field.relational = (att as CodeGenUploadAttribute).showField;
configModel = (att as CodeGenUploadAttribute).__config__.Adapt();
configModel.label = string.Format("{0}({1})", configModel.label, field.__vModel__);
field.__config__ = configModel;
fieldList.Add(field);
}
}
}
return fieldList;
}
///
/// 获取数据转换模板解析.
///
public static List GetDataConversionTemplateParsing(T entity)
{
List fieldList = new List();
foreach (PropertyInfo prop in entity.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
{
FieldsModel field = new FieldsModel();
foreach (var att in prop.GetCustomAttributes(false))
{
if (att is CodeGenUploadAttribute)
{
var configModel = new ConfigModel();
field.__vModel__ = (att as CodeGenUploadAttribute).__vModel__ ?? (att as CodeGenUploadAttribute).__Model__;
field.level = (att as CodeGenUploadAttribute).level;
field.min = (att as CodeGenUploadAttribute).min == 0 ? null : (att as CodeGenUploadAttribute).min;
field.max = (att as CodeGenUploadAttribute).max == 0 ? null : (att as CodeGenUploadAttribute).max;
field.activeTxt = (att as CodeGenUploadAttribute).activeTxt;
field.inactiveTxt = (att as CodeGenUploadAttribute).inactiveTxt;
field.format = (att as CodeGenUploadAttribute).format;
field.multiple = (att as CodeGenUploadAttribute).multiple;
field.separator = (att as CodeGenUploadAttribute).separator;
field.__slot__ = (att as CodeGenUploadAttribute).__slot__.Adapt();
field.props = (att as CodeGenUploadAttribute).props.Adapt();
field.options = (att as CodeGenUploadAttribute).options;
field.propsValue = (att as CodeGenUploadAttribute).propsValue;
field.relationField = (att as CodeGenUploadAttribute).relationField;
field.modelId = (att as CodeGenUploadAttribute).modelId;
field.interfaceId = (att as CodeGenUploadAttribute).interfaceId;
field.selectType = (att as CodeGenUploadAttribute).selectType;
field.ableDepIds = (att as CodeGenUploadAttribute).ableDepIds;
field.ablePosIds = (att as CodeGenUploadAttribute).ablePosIds;
field.ableUserIds = (att as CodeGenUploadAttribute).ableUserIds;
field.ableRoleIds = (att as CodeGenUploadAttribute).ableRoleIds;
field.ableGroupIds = (att as CodeGenUploadAttribute).ableGroupIds;
field.ableIds = (att as CodeGenUploadAttribute).ableIds;
field.relational = (att as CodeGenUploadAttribute).showField;
configModel = (att as CodeGenUploadAttribute).__config__.Adapt();
configModel.label = string.Format("{0}({1})", configModel.label, field.__vModel__);
field.__config__ = configModel;
fieldList.Add(field);
}
}
}
return fieldList;
}
///
/// 获取模板解析.
///
public static List GetTemplateParsing(T entity, string tableName)
{
List fieldList = new List();
foreach (PropertyInfo prop in entity.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
{
FieldsModel field = new FieldsModel();
foreach (var att in prop.GetCustomAttributes(false))
{
if (att is CodeGenUploadAttribute)
{
var configModel = new ConfigModel();
field.__vModel__ = string.Format("jnpf_{0}_jnpf_{1}", tableName, (att as CodeGenUploadAttribute).__Model__);
field.level = (att as CodeGenUploadAttribute).level;
field.min = (att as CodeGenUploadAttribute).min == 0 ? null : (att as CodeGenUploadAttribute).min;
field.max = (att as CodeGenUploadAttribute).max == 0 ? null : (att as CodeGenUploadAttribute).max;
field.activeTxt = (att as CodeGenUploadAttribute).activeTxt;
field.inactiveTxt = (att as CodeGenUploadAttribute).inactiveTxt;
field.format = (att as CodeGenUploadAttribute).format;
field.multiple = (att as CodeGenUploadAttribute).multiple;
field.separator = (att as CodeGenUploadAttribute).separator;
field.__slot__ = (att as CodeGenUploadAttribute).__slot__.Adapt();
field.props = (att as CodeGenUploadAttribute).props.Adapt();
field.options = (att as CodeGenUploadAttribute).options;
field.propsValue = (att as CodeGenUploadAttribute).propsValue;
field.relationField = (att as CodeGenUploadAttribute).relationField;
field.modelId = (att as CodeGenUploadAttribute).modelId;
field.interfaceId = (att as CodeGenUploadAttribute).interfaceId;
field.selectType = (att as CodeGenUploadAttribute).selectType;
field.ableDepIds = (att as CodeGenUploadAttribute).ableDepIds;
field.ablePosIds = (att as CodeGenUploadAttribute).ablePosIds;
field.ableUserIds = (att as CodeGenUploadAttribute).ableUserIds;
field.ableRoleIds = (att as CodeGenUploadAttribute).ableRoleIds;
field.ableGroupIds = (att as CodeGenUploadAttribute).ableGroupIds;
field.ableIds = (att as CodeGenUploadAttribute).ableIds;
field.relational = (att as CodeGenUploadAttribute).showField;
configModel = (att as CodeGenUploadAttribute).__config__.Adapt();
configModel.label = string.Format("{0}({1})", configModel.label, field.__vModel__);
field.__config__ = configModel;
fieldList.Add(field);
}
}
}
return fieldList;
}
///
/// 获取数据转换模板解析.
///
public static List GetDataConversionTemplateParsing(T entity, string tableName)
{
List fieldList = new List();
foreach (PropertyInfo prop in entity.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
{
FieldsModel field = new FieldsModel();
foreach (var att in prop.GetCustomAttributes(false))
{
if (att is CodeGenUploadAttribute)
{
var configModel = new ConfigModel();
field.__vModel__ = string.Format("jnpf_{0}_jnpf_{1}", tableName, (att as CodeGenUploadAttribute).__vModel__ ?? (att as CodeGenUploadAttribute).__Model__);
field.level = (att as CodeGenUploadAttribute).level;
field.min = (att as CodeGenUploadAttribute).min == 0 ? null : (att as CodeGenUploadAttribute).min;
field.max = (att as CodeGenUploadAttribute).max == 0 ? null : (att as CodeGenUploadAttribute).max;
field.activeTxt = (att as CodeGenUploadAttribute).activeTxt;
field.inactiveTxt = (att as CodeGenUploadAttribute).inactiveTxt;
field.format = (att as CodeGenUploadAttribute).format;
field.multiple = (att as CodeGenUploadAttribute).multiple;
field.separator = (att as CodeGenUploadAttribute).separator;
field.__slot__ = (att as CodeGenUploadAttribute).__slot__.Adapt();
field.props = (att as CodeGenUploadAttribute).props.Adapt();
field.options = (att as CodeGenUploadAttribute).options;
field.propsValue = (att as CodeGenUploadAttribute).propsValue;
field.relationField = (att as CodeGenUploadAttribute).relationField;
field.modelId = (att as CodeGenUploadAttribute).modelId;
field.interfaceId = (att as CodeGenUploadAttribute).interfaceId;
field.selectType = (att as CodeGenUploadAttribute).selectType;
field.ableDepIds = (att as CodeGenUploadAttribute).ableDepIds;
field.ablePosIds = (att as CodeGenUploadAttribute).ablePosIds;
field.ableUserIds = (att as CodeGenUploadAttribute).ableUserIds;
field.ableRoleIds = (att as CodeGenUploadAttribute).ableRoleIds;
field.ableGroupIds = (att as CodeGenUploadAttribute).ableGroupIds;
field.ableIds = (att as CodeGenUploadAttribute).ableIds;
field.relational = (att as CodeGenUploadAttribute).showField;
configModel = (att as CodeGenUploadAttribute).__config__.Adapt();
configModel.label = string.Format("{0}({1})", configModel.label, field.__vModel__);
field.__config__ = configModel;
fieldList.Add(field);
}
}
}
return fieldList;
}
///
/// 获取模板Excel头部.
///
/// 对象.
/// 实体.
/// 1-主表,2-副表,3-子表.
/// 替换内容.
///
public static Dictionary GetTemplateHeader(T entity, int type, string replaceContent = default)
{
var dicItem = new Dictionary();
foreach (PropertyInfo prop in entity.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(p => p.GetCustomAttributes(typeof(CodeGenUploadAttribute), false).Length > 0))
{
foreach (var att in prop.GetCustomAttributes(typeof(CodeGenUploadAttribute), false))
{
string vModel = (att as CodeGenUploadAttribute).__Model__;
CodeGenConfigModel congig = (att as CodeGenUploadAttribute).__config__.ToObject();
bool multiple = (bool)(att as CodeGenUploadAttribute)?.multiple;
string format = (att as CodeGenUploadAttribute)?.format;
int level = (int)(att as CodeGenUploadAttribute)?.level;
var dic = CodeGenHelper.CodeGenTemplate(congig.jnpfKey, multiple, congig?.label, format, level);
var title = string.Empty;
switch (type)
{
case 2:
title = string.Format("{0}(jnpf_{1}_jnpf_{2})", dic.Keys.FirstOrDefault(), replaceContent, vModel);
break;
case 3:
title = string.Format("{0}({1}-{2})", dic.Keys.FirstOrDefault(), replaceContent, vModel);
break;
default:
title = string.Format("{0}({1})", dic.Keys.FirstOrDefault(), vModel);
break;
}
dicItem[title] = dic.Values.FirstOrDefault();
}
}
return dicItem;
}
///
/// 获取表数据关联.
///
/// 实体信息.
/// 表类型.
/// 外键字段.
/// 关联主表.
/// 关联主键.
///
public static DbTableRelationModel GetTableRelation(EntityInfo entityInfo, string type, string tableField = default, string relationTable = default, string relationField = default)
{
DbTableRelationModel model = new DbTableRelationModel();
model.typeId = type;
model.table = entityInfo.DbTableName;
model.tableName = entityInfo.TableDescription;
model.tableKey = entityInfo.Columns.Find(it => it.IsPrimarykey).DbColumnName;
model.relationTable = relationTable;
model.tableField = tableField;
model.relationField = relationField;
return model;
}
///
/// 获取导入预览返回值.
///
///
///
///
public async Task GetImportPreviewData(TemplateParsingBase tInfo, string fileName)
{
var resData = new List>();
var headerRow = new List();
var isChildTable = tInfo.selectKey.Any(x => tInfo.ChildTableFields.ContainsKey(x));
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) && x != item).ToList().ForEach(it =>
{
childAddItem.Add(it.Replace(item + "-", string.Empty), dataItem[it]);
});
addItem.Add(item, new List> { childAddItem });
});
newData.Add(addItem);
}
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 =>
{
if (dataItem.ContainsKey(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 =>
{
if (dataItem.ContainsKey(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 };
}
///
/// 导入数据.
///
/// 模板信息.
/// 数据集合.
/// [成功列表,失败列表].
public async Task