mh_jy_safe/APT.BaseData.Services/Services/FM/FMImportService.cs

1413 lines
68 KiB
C#
Raw Permalink Normal View History

2025-08-25 09:56:57 +08:00
using APT.BaseData.Domain.ApiModel;
using APT.BaseData.Domain.Entities;
using APT.BaseData.Domain.Entities.FM;
using APT.BaseData.Domain.Enums;
using APT.BaseData.Domain.IServices;
using APT.BaseData.Domain.IServices.FM;
using APT.Infrastructure.Api;
using APT.Infrastructure.Core;
using APT.Utility;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
namespace APT.BaseData.Services.Services.FM
{
public class FMImportService : CommonService, IFMImportService
{
public FMImportService(IRepository repository)
: base(repository)
{
}
private Dictionary<string, object> NavcationList = new Dictionary<string, object>();
/// <summary>
/// 获取导入数据
/// </summary>
/// <param name="orgId"></param>
/// <param name="configCode"></param>
/// <param name="filePath"></param>
/// <returns></returns>
public ImportDataModel GetImortData(Guid orgId, string configCode, string filePath, bool IsUpdate, bool delFlag)
{
var importConfig = this.GetEntity<T_FM_IMPORT_CONFIG>(t => t.CODE == configCode, new BaseFilter(orgId));
if (importConfig == null)
throw new Exception("无效导入配置");
if (string.IsNullOrEmpty(importConfig.TABLE_NAME))
throw new Exception("未配置表名");
Dictionary<string, Type> existTypes = new Dictionary<string, Type>();
var type = this.GetTypeByEntityName(importConfig.TABLE_NAME, existTypes);
if (type == null)
throw new Exception("无效表名");
var configDetails = this.GetEntities<T_FM_IMPORT_CONFIG_DETAIL>(t => t.IMPORT_CONFIG_ID == importConfig.ID, new BaseFilter(orgId), new string[] { "Nav_Fields" }).ToList();
if (configDetails == null || !configDetails.Any())
throw new Exception("未配置明细信息");
ImportDataModel importData = new ImportDataModel();
Dictionary<int, int> startRowIndexs = new Dictionary<int, int>();
configDetails.ForEach(t =>
{
startRowIndexs[t.SHEET_INDEX] = t.START_ROW_INDEX;
});
//获取数据
var dataTables = FileUtils.ReadExcelByOledb(filePath, startRowIndexs);
List<T_PF_PAGE_EDIT> pageEdits = null;
if (!string.IsNullOrEmpty(importConfig.EDIT_FORM_CODE))
pageEdits = this.GetEntities<T_PF_PAGE_EDIT>(t => t.Nav_PageForm.CODE == importConfig.EDIT_FORM_CODE, new BaseFilter(importConfig.ORG_ID), new string[] { "Nav_Columns" }).ToList();
//获取主表配置信息
var firstConfigDetail = configDetails.FirstOrDefault(t => t.PARENT_ID == null);
var param = DoGetImportInvokeParam(firstConfigDetail, null, dataTables, pageEdits, existTypes, importData);
if (param != null)
{
param.IsUpdate = IsUpdate;
param.DelFlag = delFlag;
//获取从表配置信息
GetImportInvokeParam(firstConfigDetail.ID, param, configDetails, dataTables, pageEdits, existTypes, importData);
//从数据获取对象
try
{
MethodInfo methodInfo = this.GetType().GetMethod("DoGetEntityByTable", BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
importData.Data = methodInfo.MakeGenericMethod(new Type[] { type }).Invoke(this, new object[] { param });
}
catch (TargetInvocationException ex)
{
this.ThrowError("010001", ex.InnerException.Message);
}
}
return importData;
}
public dynamic DownLoadFile(dynamic config)
{
string editConfig = config.CODE;
Guid orgid = config.ORG_ID;
bool isData = config.IsData;
var importConfig = this.GetEntity<T_FM_IMPORT_CONFIG>(t => t.CODE == editConfig, new BaseFilter(orgid));
if (importConfig == null)
throw new Exception("无效导入配置");
if (string.IsNullOrEmpty(importConfig.TABLE_NAME))
throw new Exception("未配置表名");
//Dictionary<string, Type> existTypes = new Dictionary<string, Type>();
//var type = this.GetTypeByEntityName(importConfig.TABLE_NAME, existTypes);
var filter = new BaseFilter(orgid);
filter.Sort = "SHEET_INDEX";
var configDetails = this.GetEntities<T_FM_IMPORT_CONFIG_DETAIL>(t => t.IMPORT_CONFIG_ID == importConfig.ID,
filter, new string[] { "Nav_Fields" }).OrderBy(t => t.SHEET_INDEX).ToList();
if (configDetails == null || !configDetails.Any())
throw new Exception("未配置明细信息");
//configDetails = configDetails.OrderBy(t => t.SHEET_INDEX);
List<T_PF_PAGE_EDIT> pageEdits = null;
if (!string.IsNullOrEmpty(importConfig.EDIT_FORM_CODE))
pageEdits = this.GetEntities<T_PF_PAGE_EDIT>(t => t.Nav_PageForm.CODE == importConfig.EDIT_FORM_CODE,
new BaseFilter(importConfig.ORG_ID), new string[] { "Nav_Columns" }).ToList();
var editConfigs = GetImportColumns(importConfig);
foreach (var c in configDetails)
{
T_PF_PAGE_EDIT table = null;
if (c.PARENT_ID == null)
{
table = pageEdits.FirstOrDefault(i => i.PARENT_ID == null);
}
else
{
if (!string.IsNullOrEmpty(c.PAGE_EDIT_CODE))
{
table = pageEdits.FirstOrDefault(i => i.CODE == c.PAGE_EDIT_CODE);
}
else
{
table = pageEdits.FirstOrDefault();
}
}
ImportData(orgid, c, table, configDetails, editConfigs, isData);
}
if (configDetails.Any())
{
var index = configDetails.LastOrDefault().SHEET_INDEX + 1;
T_FM_IMPORT_CONFIG_DETAIL infoDetail = new T_FM_IMPORT_CONFIG_DETAIL();
infoDetail.SHEET_INDEX = index;
infoDetail.DESCRIPTION = "导入枚举字段说明";
List<ImportTableColumnModel> enumsCols = new List<ImportTableColumnModel>();
GetEnumColums(editConfigs, enumsCols);
//Dictionary<string, string> enumDesc = new Dictionary<string, string>();
infoDetail.Nav_Fields = new List<T_FM_IMPORT_CONFIG_FIELD>();
infoDetail.Nav_Fields.Add(new T_FM_IMPORT_CONFIG_FIELD() { DEST_FIELD_NAME = "enumname", SRC_FIELD_NAME = "字段" });
infoDetail.Nav_Fields.Add(new T_FM_IMPORT_CONFIG_FIELD() { DEST_FIELD_NAME = "enumdesc", SRC_FIELD_NAME = "对应关系" });
if (enumsCols.Any())
{
var data = new List<dynamic>();
List<string> hasEnums = new List<string>();
foreach (var e in enumsCols)
{
var enumType = DataHelper.EnumToType(e.Nav_EditColumn.ENUM);
if (enumType != null && enumType.IsEnum && !hasEnums.Contains(e.Nav_EditColumn.ENUM))
{
dynamic enumObj = new System.Dynamic.ExpandoObject();
enumObj.enumname = e.Nav_EditColumn.LABEL;
var desc = "";
hasEnums.Add(e.Nav_EditColumn.ENUM);
foreach (var x in Enum.GetNames(enumType))
{
var value = (int)Enum.Parse(enumType, x.ToString());
desc += $"{x}:{value},";
}
desc = desc.TrimEnd(',');
enumObj.enumdesc = desc;
data.Add(enumObj);
}
}
//
infoDetail.Data = data;
}
configDetails.Add(infoDetail);
}
dynamic retObj = new System.Dynamic.ExpandoObject();
retObj.Name = importConfig.NAME;
retObj.ImportTable = configDetails;
return retObj;
}
private void ImportData(Guid orgid, T_FM_IMPORT_CONFIG_DETAIL c,
T_PF_PAGE_EDIT table, List<T_FM_IMPORT_CONFIG_DETAIL> Details, ImportTableModel tableModel, bool isData)
{
if (table != null)
{
var tableName = table.EDIT_NAME;
var fileds = c.Nav_Fields.Select(i => i.DEST_FIELD_NAME).ToArray();
BasePageFilter filter = new BasePageFilter();
filter.OrgId = orgid;
filter.Limit = 10;
filter.PageIndex = 1;
filter.Sort = "ID";
filter.Order = DbOrder.ASC;
//filter.SelectField = fileds;
T_FM_IMPORT_CONFIG_FIELD addKeyField = null;
T_FM_IMPORT_CONFIG_DETAIL parent = null;
string relationField = "";
Dictionary<Guid, object> parentPairs = new Dictionary<Guid, object>();
var filterRuleList = new List<FilterRule>();
var filterGroup = new FilterGroup();
filterGroup.IsAnd = false;
filter.FilterGroup.Groups.Add(filterGroup);
foreach (var filed in fileds)
{
if (filed.IndexOf(".") > 0)
{
var indexPos = filed.LastIndexOf(".");
var navfield = filed.Substring(0, indexPos);
if (!filter.Include.Contains(navfield))
filter.Include.Add(navfield);
}
}
Type typeName = DataHelper.GetTypeByEntityName(tableName);
//filter.Include.Clear();
if (typeName == null)
this.ThrowError("020011");
if (c.PARENT_ID != null)
{
parent = Details.FirstOrDefault(x => x.ID == c.PARENT_ID);
var parentDataId = new List<Guid>();
if (parent != null)
{
var parentModel = GetTableMode(tableModel, parent.ID);
Type parentType = DataHelper.GetTypeByEntityName(parentModel.Nav_PageEdit.EDIT_NAME);
if (parentType == null)
this.ThrowError("020011");
var parentKey = parent.Nav_Fields.FirstOrDefault(i => i.SRC_FIELD_NAME ==
parent.SHEET_KEY_FIELD_NAME);
if (parentKey == null)
{
this.ThrowError("020011");
}
addKeyField = new T_FM_IMPORT_CONFIG_FIELD();
addKeyField.DEST_FIELD_NAME = parentKey.DEST_FIELD_NAME;
addKeyField.SRC_FIELD_NAME = parentKey.SRC_FIELD_NAME;
foreach (var d in parent.Data)
{
if (!parentDataId.Contains(d.ID))
parentDataId.Add(d.ID);
if (!parentPairs.ContainsKey(d.ID))
parentPairs.Add(d.ID, this.GetFieldValue(addKeyField.DEST_FIELD_NAME, d));
}
}
var model = GetTableMode(tableModel, c.ID);
if (model != null)
{
relationField = model.Nav_PageEdit.RELATION_FIELD;
if (parentDataId.Any())
{
foreach (var i in parentDataId)
{
var fiterRule = new FilterRule();
fiterRule.Field = relationField;
fiterRule.Operate = FilterOperate.Equal;
fiterRule.Value = i;
filterRuleList.Add(fiterRule);
}
}
}
}
dynamic tmpResult = new System.Dynamic.ExpandoObject();
MethodInfo methodInfo = null;
if (!isData)
{
methodInfo = this.GetType().GetMethod("GetEntityByInvoke", new Type[] { typeof(BasePageFilter) });
}
else
{
methodInfo = this.GetType().GetMethod("GetEntitiesByInvoke", new Type[] { typeof(BasePageFilter) });
}
if (filterRuleList.Any())
{
var limit = 1000;
List<dynamic> tmpTotal = new List<dynamic>();
for (var x = 0; x < filterRuleList.Count; x = x + limit)
{
filterGroup.Rules.Clear();
var pageRules = filterRuleList.Skip(x).Take(limit).ToArray();
for (var j = 0; j < pageRules.Count(); j++)
{
filterGroup.Rules.Add(pageRules[j]);
}
dynamic tmp = methodInfo.MakeGenericMethod(new Type[] { typeName }).Invoke(this, new object[] { filter });
foreach (var row in tmp)
tmpTotal.Add(row);
}
tmpResult = tmpTotal;
}
else
{
tmpResult = methodInfo.MakeGenericMethod(new Type[] { typeName }).Invoke(this, new object[] { filter });
}
if (c.PARENT_ID != null && addKeyField != null)
{
addKeyField.DEST_FIELD_NAME = c.PARENT_ID + "_" + addKeyField.DEST_FIELD_NAME;
c.Nav_Fields.Add(addKeyField);
List<dynamic> tmp = new List<dynamic>();
foreach (var row in tmpResult)
{
dynamic info = new System.Dynamic.ExpandoObject();
var dic = (IDictionary<string, object>)info;
var props = typeName.GetProperties();
foreach (var p in props)
{
var pValue = typeName.GetProperty(p.Name).GetValue(row);
if (!dic.ContainsKey(p.Name))
dic.Add(p.Name, pValue);
if (p.Name == relationField)
{
if (!dic.ContainsKey(addKeyField.DEST_FIELD_NAME))
{
dic.Add(addKeyField.DEST_FIELD_NAME, parentPairs[pValue]);
}
}
}
tmp.Add(info);
}
tmpResult = tmp;
}
c.Data = tmpResult;
}
}
private ImportTableModel GetTableMode(ImportTableModel model, Guid configDetailId)
{
if (model != null)
{
if (model.Nav_ConfigDetail.ID == configDetailId)
{
return model;
}
else
{
var childModels = model.Nav_SubTables;
if (childModels != null && childModels.Any())
{
foreach (var c in childModels)
{
var subModel = GetTableMode(c, configDetailId);
if (subModel != null)
return subModel;
}
}
}
}
return null;
}
/// <summary>
/// 获取导入配置信息
/// </summary>
/// <param name="orgId"></param>
/// <param name="configCode"></param>
/// <returns></returns>
public ImportConfigModel GetImportConfig(Guid orgId, string configCode)
{
ImportConfigModel config = new ImportConfigModel();
var importConfig = this.GetEntity<T_FM_IMPORT_CONFIG>(t => t.CODE == configCode, new BaseFilter(orgId));
if (importConfig == null)
throw new Exception("无效导入配置");
if (!string.IsNullOrEmpty(importConfig.EDIT_FORM_CODE))
config.Nav_EditForm = this.GetEntity<T_PF_FORM>(t => t.CODE == importConfig.EDIT_FORM_CODE, new BaseFilter(importConfig.ORG_ID));
config.Nav_ImportConfig = importConfig;
config.Nav_ImportTable = this.GetImportColumns(importConfig);
return config;
}
#region
/// <summary>
/// 获取导入列信息
/// </summary>
/// <param name="orgId"></param>
/// <param name="configCode"></param>
/// <returns></returns>
private ImportTableModel GetImportColumns(T_FM_IMPORT_CONFIG importConfig)
{
if (string.IsNullOrEmpty(importConfig.TABLE_NAME))
throw new Exception("未配置表名");
var configDetails = this.GetEntities<T_FM_IMPORT_CONFIG_DETAIL>(t => t.IMPORT_CONFIG_ID == importConfig.ID, new BaseFilter(importConfig.ORG_ID), new string[] { "Nav_Fields" }).ToList();
if (configDetails == null || !configDetails.Any())
throw new Exception("未配置明细信息");
List<T_PF_PAGE_EDIT> pageEdits = null;
if (!string.IsNullOrEmpty(importConfig.EDIT_FORM_CODE))
pageEdits = this.GetEntities<T_PF_PAGE_EDIT>(t => t.Nav_PageForm.CODE == importConfig.EDIT_FORM_CODE,
new BaseFilter(importConfig.ORG_ID), new string[] { "Nav_Columns" }).ToList();
//获取主表配置信息
var firstConfigDetail = configDetails.FirstOrDefault(t => t.PARENT_ID == null);
if (firstConfigDetail == null)
throw new Exception("未配置主表信息");
var table = DoGetImportTable(firstConfigDetail, null, pageEdits);
if (table != null)
{
//获取从表配置信息
GetImportTable(firstConfigDetail.ID, table, configDetails, pageEdits);
}
return table;
}
private void GetEnumColums(ImportTableModel editConfigs, List<ImportTableColumnModel> enums)
{
if (editConfigs != null)
{
var cols = editConfigs.Nav_Columns.Where(i => !string.IsNullOrEmpty(i.Nav_EditColumn.ENUM)).ToList();
if (cols.Any())
{
enums.AddRange(cols);
}
if (editConfigs.Nav_SubTables != null && editConfigs.Nav_SubTables.Any())
{
foreach (var table in editConfigs.Nav_SubTables)
{
GetEnumColums(table, enums);
}
}
}
}
/// <summary>
/// 获取反射调用参数
/// </summary>
/// <param name="parentId"></param>
/// <param name="parentParam"></param>
/// <param name="configDetails"></param>
/// <param name="dataTables"></param>
/// <param name="pageEdits"></param>
private void GetImportInvokeParam(Guid? parentId, ImportInvokeParamModel parentParam,
List<T_FM_IMPORT_CONFIG_DETAIL> configDetails, DataSet dataTables, List<T_PF_PAGE_EDIT> pageEdits,
Dictionary<string, Type> existTypes, ImportDataModel importDataModel)
{
if (configDetails == null) return;
var list = configDetails.Where(t => t.PARENT_ID == parentId).ToList();
if (list == null || !list.Any()) return;
list.ForEach(t =>
{
var param = DoGetImportInvokeParam(t, parentParam, dataTables, pageEdits, existTypes, importDataModel);
if (param != null)
{
if (parentParam != null)
parentParam.Nav_ChildConfigDetails.Add(param);
GetImportInvokeParam(t.ID, param, configDetails, dataTables, pageEdits, existTypes, importDataModel);
}
});
}
/// <summary>
/// 实际获取反射调用参数
/// </summary>
/// <param name="configDetail"></param>
/// <param name="parentParam"></param>
/// <param name="dataTables"></param>
/// <param name="pageEdits"></param>
/// <returns></returns>
private ImportInvokeParamModel DoGetImportInvokeParam(T_FM_IMPORT_CONFIG_DETAIL configDetail, ImportInvokeParamModel parentParam, DataSet dataTables,
List<T_PF_PAGE_EDIT> pageEdits, Dictionary<string, Type> existTypes, ImportDataModel importDataModel)
{
ImportInvokeParamModel param = new ImportInvokeParamModel();
param.Nav_ConfigDetail = configDetail;
param.ExistTypes = existTypes;
param.ImportDataModel = importDataModel;
if (dataTables.Tables.Count > configDetail.SHEET_INDEX)
param.Nav_DataTable = dataTables.Tables[configDetail.SHEET_INDEX];
if (configDetail != null && configDetail.Nav_Fields != null && configDetail.Nav_Fields.Any())
{
foreach (var f in configDetail.Nav_Fields)
{
ImportInvokeFieldModel field = new ImportInvokeFieldModel();
field.Nav_ConfigField = f;
param.Fields.Add(field);
}
}
if (pageEdits != null && pageEdits.Any())
{
if (configDetail.PARENT_ID == null)
param.Nav_PageEdit = pageEdits.FirstOrDefault(t => t.PARENT_ID == null);
else
{
if (!string.IsNullOrEmpty(configDetail.PAGE_EDIT_CODE))
{
param.Nav_PageEdit = pageEdits.FirstOrDefault(t => t.CODE == configDetail.PAGE_EDIT_CODE);
}
else
{
param.Nav_PageEdit = pageEdits.FirstOrDefault(t => parentParam != null && parentParam.Nav_PageEdit != null && t.PARENT_ID == parentParam.Nav_PageEdit.ID);
}
}
//获取编辑表列中的导航字段的Include字段
if (param.Nav_PageEdit != null && param.Nav_PageEdit.Nav_Columns != null && param.Nav_PageEdit.Nav_Columns.Any())
{
foreach (var col in param.Nav_PageEdit.Nav_Columns)
{
if (string.IsNullOrEmpty(col.FIELD_NAME)) continue;
var invokeField = param.Fields.FirstOrDefault(t => t.Nav_ConfigField != null && t.Nav_ConfigField.DEST_FIELD_NAME == col.FIELD_NAME);
if (invokeField != null)
invokeField.Nav_EditColumn = col;
var fields = col.FIELD_NAME.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries).ToList();
if (fields.Count > 1)
{
fields.RemoveAt(fields.Count - 1);
string tmp = string.Join(".", fields);
if (!param.PageEditTableIncludes.ContainsKey(tmp))
param.PageEditTableIncludes.Add(tmp, 0);
if (fields.Count > 1)
{
string first = fields[0];
fields.RemoveAt(0);
string includeField = string.Join(".", fields);
Dictionary<string, byte> includes = null;
if (!param.PageEditColumnNavIncludes.TryGetValue(first, out includes))
{
includes = new Dictionary<string, byte>();
param.PageEditColumnNavIncludes.Add(first, includes);
}
if (!includes.ContainsKey(includeField))
includes.Add(includeField, 0);
}
}
}
}
}
return param;
}
/// <summary>
/// 获取导入显示表信息
/// </summary>
/// <param name="parentId"></param>
/// <param name="parentTable"></param>
/// <param name="configDetails"></param>
/// <param name="pageEdits"></param>
private void GetImportTable(Guid? parentId, ImportTableModel parentTable,
List<T_FM_IMPORT_CONFIG_DETAIL> configDetails, List<T_PF_PAGE_EDIT> pageEdits)
{
if (configDetails == null) return;
var list = configDetails.Where(t => t.PARENT_ID == parentId).ToList();
if (list == null || !list.Any()) return;
list.ForEach(t =>
{
var table = DoGetImportTable(t, parentTable, pageEdits);
if (table != null)
{
if (parentTable != null)
parentTable.Nav_SubTables.Add(table);
GetImportTable(t.ID, table, configDetails, pageEdits);
}
});
}
/// <summary>
/// 实际获取导入显示表信息
/// </summary>
/// <param name="configDetail"></param>
/// <param name="parentTable"></param>
/// <param name="pageEdits"></param>
/// <returns></returns>
private ImportTableModel DoGetImportTable(T_FM_IMPORT_CONFIG_DETAIL configDetail, ImportTableModel parentTable, List<T_PF_PAGE_EDIT> pageEdits)
{
ImportTableModel table = new ImportTableModel();
table.Nav_ConfigDetail = configDetail;
if (pageEdits != null && pageEdits.Any())
{
if (configDetail.PARENT_ID == null)
table.Nav_PageEdit = pageEdits.FirstOrDefault(t => t.PARENT_ID == null);
else
{
if (!string.IsNullOrEmpty(configDetail.PAGE_EDIT_CODE))
{
table.Nav_PageEdit = pageEdits.FirstOrDefault(t => !string.IsNullOrEmpty(configDetail.PAGE_EDIT_CODE) && t.CODE == configDetail.PAGE_EDIT_CODE);
}
else
{
table.Nav_PageEdit = pageEdits.FirstOrDefault(t => parentTable != null && parentTable.Nav_PageEdit != null && t.PARENT_ID == parentTable.Nav_PageEdit.ID);
}
}
if (table.Nav_PageEdit != null)
{
table.NavProperty = table.Nav_PageEdit.NAV_PROPERTY;
if (table.Nav_PageEdit.Nav_Columns != null && table.Nav_PageEdit.Nav_Columns.Any())
{
var list = table.Nav_PageEdit.Nav_Columns.OrderBy(t => t.NUM).ToList();
list.ForEach(t1 =>
{
ImportTableColumnModel col = new ImportTableColumnModel();
col.Nav_EditColumn = t1;
col.Label = t1.LABEL;
col.FieldName = t1.FIELD_NAME;
table.Nav_Columns.Add(col);
});
}
}
}
return table;
}
private Type GetTypeByEntityName(string entityName, Dictionary<string, Type> existTypes)
{
Type type = null;
if (existTypes == null || !existTypes.TryGetValue(entityName, out type))
{
type = DataHelper.GetTypeByEntityName(entityName);
if (existTypes != null)
existTypes.Add(entityName, type);
}
return type;
}
enum ImportMessageTypeEnum
{
/// <summary>信息</summary>
Info = 0,
/// <summary>警告</summary>
Warning = 1,
/// <summary>错误</summary>
Error = 2,
}
private void AddMessage(ImportInvokeParamModel param, ImportMessageTypeEnum messageType, string message)
{
if (param.ImportDataModel != null && param.ImportDataModel.MessageList != null)
{
string messageTypeStr = string.Empty;
switch (messageType)
{
case ImportMessageTypeEnum.Error:
messageTypeStr = "【错误】:";
break;
case ImportMessageTypeEnum.Info:
messageTypeStr = "【信息】:";
break;
case ImportMessageTypeEnum.Warning:
messageTypeStr = "【警告】:";
break;
}
param.ImportDataModel.MessageList.Add(messageTypeStr + message);
}
}
/// <summary>
/// 根据行项获取字段值
/// </summary>
/// <param name="param"></param>
/// <param name="row"></param>
/// <param name="invokeField"></param>
/// <param name="table"></param>
/// <param name="entityType"></param>
/// <param name="srcValue"></param>
/// <returns></returns>
private object GetFieldValueByRow(ImportInvokeParamModel param, DataRow row, ImportInvokeFieldModel invokeField,
DataTable table, Type entityType, out string srcValue)
{
srcValue = string.Empty;
var field = invokeField.Nav_ConfigField;
if (field == null) return null;
T_FM_IMPORT_CONFIG_DETAIL configDetail = param.Nav_ConfigDetail;
if (field.SRC_FEILD_TYPE == (int)FMImportConfigSrcFieldTypeEnum. || field.SRC_FEILD_TYPE == (int)FMImportConfigSrcFieldTypeEnum.ID字段)
{
if (string.IsNullOrEmpty(field.SRC_FIELD_NAME)) return null;
DataColumn col = table.Columns[field.SRC_FIELD_NAME];
if (col == null)
return null;
srcValue = LibUtils.ToString(row[col]);
}
else if (field.SRC_FEILD_TYPE == (int)FMImportConfigSrcFieldTypeEnum.)
{
srcValue = field.SRC_FIELD_NAME;
}
if (!string.IsNullOrEmpty(srcValue))
srcValue = srcValue.Trim();
if (string.IsNullOrEmpty(srcValue)) return null;
string destFieldName = field.DEST_FIELD_NAME;//目的字段
if (field.SRC_FEILD_TYPE == (int)FMImportConfigSrcFieldTypeEnum.ID字段)
{
if (string.IsNullOrEmpty(field.ID_TABLE_NAME) || string.IsNullOrEmpty(field.ID_TABLE_FIELD_NAME)) return null;
if (destFieldName.IndexOf(".", StringComparison.OrdinalIgnoreCase) == -1)//字段中不存在.
{
BaseFilter filter = new BaseFilter(configDetail.ORG_ID);
filter.FilterGroup.Rules.Add(new FilterRule(field.ID_TABLE_FIELD_NAME, srcValue, FilterOperate.Equal));
var type = this.GetTypeByEntityName(field.ID_TABLE_NAME, param.ExistTypes);
if (type != null)
{
MethodInfo methodInfo = this.GetType().GetMethod("GetEntityByInvoke", BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
var tmpEntity = methodInfo.MakeGenericMethod(new Type[] { type }).
Invoke(this, new object[] { filter });
if (tmpEntity != null)
{
var entityBase = tmpEntity as EntityBase<Guid>;
if (entityBase != null) return entityBase.ID;
}
}
}
}
else
{
var splitDestFieldName = destFieldName.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries).ToList();
if (splitDestFieldName != null && splitDestFieldName.Any())
{
string firstField = splitDestFieldName[0];
var des = entityType.GetProperty(firstField);
if (des == null) return null;
if (splitDestFieldName.Count == 1)
{
#region
string propertyTypeName = des.PropertyType.Name;
string fullTypeName = des.PropertyType.FullName;
if (string.Compare(propertyTypeName, "GUID", true) == 0 || fullTypeName.IndexOf("Guid", StringComparison.OrdinalIgnoreCase) > -1)
return LibUtils.ToGuid(srcValue);
else if (string.Compare(propertyTypeName, "DateTime", true) == 0 || fullTypeName.IndexOf("DateTime", StringComparison.OrdinalIgnoreCase) > -1)
return LibUtils.ToDateTime(srcValue);
else if (string.Compare(propertyTypeName, "bool", true) == 0 || string.Compare(propertyTypeName, "boolean", true) == 0 || fullTypeName.IndexOf("bool", StringComparison.OrdinalIgnoreCase) > -1)
return LibUtils.ToBoolean(srcValue);
else if (string.Compare(propertyTypeName, "int", true) == 0 || fullTypeName.IndexOf("int", StringComparison.OrdinalIgnoreCase) > -1 || des.PropertyType.IsEnum)
{
int r = LibUtils.ToInt(srcValue);
EnumNameAttribute enumNameAttr = null;
object[] attrs = des.GetCustomAttributes(typeof(EnumNameAttribute), true);
if (attrs.Length == 1)
enumNameAttr = (EnumNameAttribute)attrs[0];
string enumName = string.Empty;
//下拉选择
//if (invokeField.Nav_EditColumn != null
// && !string.IsNullOrEmpty(invokeField.Nav_EditColumn.ENUM))
// enumName = invokeField.Nav_EditColumn.ENUM;
//else if (r == 0 && enumNameAttr != null
// && !string.IsNullOrEmpty(enumNameAttr.EnumName))
// enumName = enumNameAttr.EnumName;
//if (!string.IsNullOrEmpty(enumName))
//{
// var enumType = DataHelper.EnumToType(enumName);
// if (enumType != null && enumType.IsEnum)
// {
// foreach (var x in Enum.GetValues(enumType))
// {
// if (string.Compare(x.ToString(), srcValue, true) == 0)
// {
// r = (int)x;
// break;
// }
// }
// }
//}
return r;
}
else if (string.Compare(propertyTypeName, "decimal", true) == 0 || fullTypeName.IndexOf("decimal", StringComparison.OrdinalIgnoreCase) > -1)
return LibUtils.ToDecimal(srcValue);
else
return srcValue;
#endregion
}
else
{
#region
if (string.IsNullOrEmpty(srcValue))
return null;
splitDestFieldName.RemoveAt(0);
BaseFilter filter = new BaseFilter(configDetail.ORG_ID);
string ruleField = string.Join(".", splitDestFieldName);
var typeKey = des.PropertyType?.Name + "&&" + ruleField + "==" + srcValue;
if (NavcationList.ContainsKey(typeKey))
{
return NavcationList[typeKey];
}
filter.FilterGroup.Rules.Add(new FilterRule(ruleField, srcValue, FilterOperate.Equal));
Dictionary<string, byte> includes = null;
if (param.PageEditColumnNavIncludes != null && param.PageEditColumnNavIncludes.TryGetValue(firstField, out includes))
{
foreach (var item in includes)
filter.Include.Add(item.Key);
}
try
{
MethodInfo methodInfo = this.GetType().GetMethod("GetEntityByInvoke", new Type[] { typeof(BaseFilter) });
var tmpEntity = methodInfo.MakeGenericMethod(new Type[] { des.PropertyType }).Invoke(this, new object[] { filter });
if (tmpEntity != null)
{
if (!NavcationList.ContainsKey(typeKey))
NavcationList.Add(typeKey, tmpEntity);
return tmpEntity;
}
else
{
string errorLine = des.PropertyType.Name;
this.ThrowError("010001", errorLine + " 列 "+ srcValue + " 不存在");
}
}
catch (TargetInvocationException ex)
{
this.ThrowError("010001", ex.Message);
}
#endregion
}
}
}
return null;
}
private string GetFieldValue(string fieldName, object o)
{
//var tmpType = d;
var tmpO = o;
var tmpFieldName = fieldName;
if (fieldName.IndexOf(".") < 0)
{
var obj = o.GetType().GetProperty(fieldName).GetValue(tmpO);
if (obj == null)
{
return "";
}
return obj.ToString();
}
else
{
var indexPos = fieldName.IndexOf(".");
tmpFieldName = tmpFieldName.Substring(0, indexPos);
var subName = fieldName.Substring(indexPos + 1);
var prop = o.GetType().GetProperty(tmpFieldName);
if (prop != null)
{
var objVal = prop.GetValue(o);
if (objVal == null)
{
return "";
//this.ThrowError("010001", "字段:" + prop.Name + "对应数据不存在," + Newtonsoft.Json.JsonConvert.SerializeObject(o));
}
return GetFieldValue(subName, objVal);
}
}
return "";
}
#endregion
#region
public T GetEntityByInvoke<T>(BaseFilter filter) where T : MesEntityBase, new()
{
return this.GetEntity<T>(null, filter);
}
public List<T> GetEntityByInvoke<T>(BasePageFilter filter) where T : MesEntityBase, new()
{
return this.GetOrderPageEntities<T>(null, filter).Items.ToList();
}
public List<T> GetEntitiesByInvoke<T>(BasePageFilter filter) where T : MesEntityBase, new()
{
return this.GetEntities<T>(null, filter).ToList();
}
/// <summary>
/// 根据数据表获取实体
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="param"></param>
/// <returns></returns>
public List<T> DoGetEntityByTable<T>(ImportInvokeParamModel param) where T : MesEntityBase, new()
{
NavcationList.Clear();
if (param == null) return null;
T_FM_IMPORT_CONFIG_DETAIL configDetail = param.Nav_ConfigDetail;
var codeRuleService = APT.Infrastructure.Api.ServiceLocator.Instance.GetService<IPFCodeRuleService>();
if (configDetail == null) return null;
DataTable table = param.Nav_DataTable;
if (table == null)
{
//this.AddMessage(param, ImportMessageTypeEnum.Warning, string.Format("未获取到表{0}对应数据", configDetail.DESCRIPTION));
this.ThrowError("020022", configDetail.DESCRIPTION);
return null;
}
try
{
List<T> result = new List<T>();
List<T> addResult = new List<T>();
List<T> updateResult = new List<T>();
Type entityType = typeof(T);
BaseFilter filter = new BaseFilter(param.Nav_PageEdit.ORG_ID);
var group = new FilterGroup();
group.IsAnd = false;
filter.FilterGroup.Groups.Add(group);
filter.IgnoreDataRule = true;
List<T> dbData = new List<T>();
Dictionary<string, Guid> keyValuePairs = new Dictionary<string, Guid>();
ImportInvokeFieldModel keyFieldModel = null;
//ImportInvokeFieldModel parentKeyModel = null;
var keyFieldSrcVal = "";
//构造查询条件
var ruleList = new List<FilterRule>();
foreach (DataRow row in table.Rows)
{
var list = !param.IsParentAdd && param.Fields != null && param.Fields.Any() ?
param.Fields.Where(t1 => t1.Nav_ConfigField != null).ToList() : null;
if (list != null && list.Any())
{
//BaseFilter filter = new BaseFilter(configDetail.ORG_ID);
if (!string.IsNullOrEmpty(configDetail.SHEET_KEY_FIELD_NAME))
{
keyFieldModel = list.FirstOrDefault(i => i.Nav_ConfigField.SRC_FIELD_NAME == configDetail.SHEET_KEY_FIELD_NAME);
if (keyFieldModel == null)
this.ThrowError("020012", configDetail.SHEET_KEY_FIELD_NAME);
var fieldValue = this.GetFieldValueByRow(param, row, keyFieldModel, table, entityType, out keyFieldSrcVal);
if (fieldValue != null)
{
ruleList.Add(new FilterRule(keyFieldModel.Nav_ConfigField.DEST_FIELD_NAME, keyFieldSrcVal.Trim(), FilterOperate.Equal));
}
}
//foreach (var invokeField in list)
//{
// var field = invokeField.Nav_ConfigField;
// if (field == null) continue;
// string destFieldName = field.DEST_FIELD_NAME;//目的字段
// if (string.IsNullOrEmpty(destFieldName)) continue;
// if (invokeField.Nav_ConfigField.SRC_FIELD_NAME == configDetail.SHEET_KEY_FIELD_NAME)
// {
// string srcValue = string.Empty;
// var fieldValue = this.GetFieldValueByRow(param, row, invokeField, table, entityType, out srcValue);
// if (fieldValue != null)
// group.Rules.Add(new FilterRule(destFieldName, srcValue.Trim(), FilterOperate.Equal));
// break;
// }
// //}
// //else if (!string.IsNullOrEmpty(srcValue))
// // filter.FilterGroup.Rules.Add(new FilterRule(destFieldName, srcValue, FilterOperate.Equal));
//}
//从表关联主表字段
if (param.Nav_PageEdit != null && !string.IsNullOrEmpty(param.Nav_PageEdit.RELATION_FIELD))
{
//parentKeyModel= list.FirstOrDefault(i => i.Nav_ConfigField.SRC_FIELD_NAME == param.KeyField);
var col = row[param.KeyField];
if (col == null)
{
this.ThrowError("020013", param.Nav_ConfigDetail.DESCRIPTION, param.KeyField);
}
//var fieldSrc = "";
//var fieldValue = this.GetFieldValueByRow(param, row, parentKeyModel, table, entityType, out fieldSrc);
var fieldValue = LibUtils.ToString(row[param.KeyField]);
if (param.KeyPairDic.Any() && param.KeyPairDic.ContainsKey(fieldValue))
{
filter.FilterGroup.Rules.Add(new FilterRule(param.Nav_PageEdit.RELATION_FIELD, param.KeyPairDic[fieldValue], FilterOperate.Equal));
}
else
{
this.ThrowError("020014", param.Nav_ConfigDetail.DESCRIPTION, param.KeyField, fieldValue);
}
}
//添加导航
if (param.PageEditTableIncludes != null && param.PageEditTableIncludes.Any())
{
foreach (var k in param.PageEditTableIncludes)
if (!filter.Include.Contains(k.Key))
filter.Include.Add(k.Key);
}
}
}
var limit = 1000;
for (var x = 0; x < ruleList.Count; x = x + limit)
{
var pageRule = ruleList.Skip(x).Take(limit).ToArray();
group.Rules.Clear();
for (var j = 0; j < pageRule.Count(); j++)
{
group.Rules.Add(pageRule[j]);
}
var pageData = this.GetEntities<T>(null, filter).ToList();
dbData.AddRange(pageData);
}
//dbData = this.GetEntities<T>(null, filter).ToList();
//字段赋值
bool isParentSet = false;
foreach (DataRow row in table.Rows)
{
var keyFieldValue = "";
//主从表关系判断
//if (!string.IsNullOrEmpty(configDetail.SHEET_KEY_FIELD_NAME) && !string.IsNullOrEmpty(param.KeyValue))
//{
// DataColumn col = table.Columns[configDetail.SHEET_KEY_FIELD_NAME];
// string curKeyValue = col == null ? string.Empty : LibUtils.ToString(row[col]);
// if (string.IsNullOrEmpty(curKeyValue) || string.Compare(curKeyValue, param.KeyValue, true) != 0) continue;
//}
bool isEntityAdd = false;
//获取已有数据
T t = null;
if (dbData.Any())
{
if (keyFieldModel != null)
{
string curKeyValue = LibUtils.ToString(row[configDetail.SHEET_KEY_FIELD_NAME]);
foreach (var d in dbData)
{
var dataFieldValue = this.GetFieldValue(keyFieldModel.Nav_ConfigField.DEST_FIELD_NAME, d);
if (dataFieldValue.Trim() == curKeyValue.Trim())
{
t = d;
break;
}
}
}
}
//不存在已有记录
if (t == null)
{
isEntityAdd = true;
t = new T();
addResult.Add(t);
Type type2 = t.GetType();
var orgPropoerty = type2.GetProperty("ORG_ID");
if (orgPropoerty != null)
orgPropoerty.SetValue(t, configDetail.ORG_ID, null);
if (param.Nav_PageEdit != null && !string.IsNullOrEmpty(param.Nav_PageEdit.RELATION_FIELD))
{
var des = type2.GetProperty(param.Nav_PageEdit.RELATION_FIELD);
if (des != null)
{
var col = row[param.KeyField];
if (col == null)
{
this.ThrowError("020013", param.Nav_ConfigDetail.DESCRIPTION, param.KeyField);
}
var fieldValue = LibUtils.ToString(row[param.KeyField]);
if (param.KeyPairDic.Any() && param.KeyPairDic.ContainsKey(fieldValue))
{
des.SetValue(t, param.KeyPairDic[fieldValue], null);
}
else
{
this.ThrowError("020014", param.Nav_ConfigDetail.DESCRIPTION, param.KeyField, fieldValue);
}
}
}
if (param.Nav_PageEdit != null && !string.IsNullOrEmpty(param.Nav_PageEdit.CODE_FIELD_NAME) &&
param.Nav_PageEdit.CODE_RULE_TYPE.HasValue && param.Nav_PageEdit.CODE_RULE_TYPE != 0)
{
var des = entityType.GetProperty(param.Nav_PageEdit.CODE_FIELD_NAME);
if (des != null)
{
SystemCodeFilter codeFilter = new SystemCodeFilter();
codeFilter.CodeType = param.Nav_PageEdit.CODE_RULE_TYPE.Value;
codeFilter.Count = 1;
codeFilter.OrgId = configDetail.ORG_ID;
var c = codeRuleService.NewGenSerial(codeFilter);
des.SetValue(t, c, null);
}
}
if (param.Nav_PageEdit != null && param.Nav_PageEdit.Nav_Columns != null && param.Nav_PageEdit.Nav_Columns.Any())
{
foreach (var editCol in param.Nav_PageEdit.Nav_Columns)
{
if (editCol.CONTROL_TYPE == (int)PFControlTypeEnum. &&
editCol.CODE_RULE_TYPE.HasValue && editCol.CODE_RULE_TYPE != 0)
{
var des1 = entityType.GetProperty(editCol.FIELD_NAME);
if (des1 != null)
{
SystemCodeFilter codeFilter = new SystemCodeFilter();
codeFilter.CodeType = editCol.CODE_RULE_TYPE.Value;
codeFilter.Count = 1;
codeFilter.OrgId = configDetail.ORG_ID;
var c = codeRuleService.NewGenSerial(codeFilter);
des1.SetValue(t, c, null);
}
}
if (string.IsNullOrEmpty(editCol.FIELD_NAME) ||
editCol.FIELD_NAME.IndexOf(".", StringComparison.OrdinalIgnoreCase) > -1 ||
string.IsNullOrEmpty(editCol.DEFAULT_VALUE)) continue;
var des = entityType.GetProperty(editCol.FIELD_NAME);
if (des == null) return null;
string propertyTypeName = des.PropertyType.Name;
string fullTypeName = des.PropertyType.FullName;
object obj = null;
if (string.Compare(propertyTypeName, "GUID", true) == 0 || fullTypeName.IndexOf("Guid", StringComparison.OrdinalIgnoreCase) > -1)
obj = LibUtils.ToGuid(editCol.DEFAULT_VALUE);
else if (string.Compare(propertyTypeName, "DateTime", true) == 0 || fullTypeName.IndexOf("DateTime", StringComparison.OrdinalIgnoreCase) > -1)
{
if (editCol.DEFAULT_VALUE.StartsWith("@nowDate"))
obj = DateTime.Now.Date;
else if (editCol.DEFAULT_VALUE.StartsWith("@now"))
obj = DateTime.Now;
else
obj = LibUtils.ToDateTime(editCol.DEFAULT_VALUE);
}
else if (string.Compare(propertyTypeName, "bool", true) == 0 || string.Compare(propertyTypeName, "boolean", true) == 0 || fullTypeName.IndexOf("bool", StringComparison.OrdinalIgnoreCase) > -1)
obj = LibUtils.ToBoolean(editCol.DEFAULT_VALUE);
else if (string.Compare(propertyTypeName, "int", true) == 0 || fullTypeName.IndexOf("int", StringComparison.OrdinalIgnoreCase) > -1)
{
int r = LibUtils.ToInt(editCol.DEFAULT_VALUE);
//下拉选择
//if (!string.IsNullOrEmpty(editCol.ENUM))
//{
// var enumType = DataHelper.EnumToType(editCol.ENUM);
// if (enumType != null && enumType.IsEnum)
// {
// foreach (var x in Enum.GetValues(enumType))
// {
// if (string.Compare(x.ToString(), editCol.DEFAULT_VALUE, true) == 0)
// r = (int)x;
// }
// }
//}
obj = r;
}
else if (string.Compare(propertyTypeName, "decimal", true) == 0 || fullTypeName.IndexOf("decimal", StringComparison.OrdinalIgnoreCase) > -1)
obj = LibUtils.ToDecimal(editCol.DEFAULT_VALUE);
else if (!editCol.DEFAULT_VALUE.StartsWith("@"))
obj = editCol.DEFAULT_VALUE;
if (obj != null)
des.SetValue(t, obj, null);
}
}
}
else
{
updateResult.Add(t);
}
if (param.Fields != null && param.Fields.Any())
{
foreach (var invokeField in param.Fields)
{
var field = invokeField.Nav_ConfigField;
if (field == null) continue;
//父节点字段先不赋值
if (field.DEST_FIELD_NAME.StartsWith("Nav_Parent") && !param.IsParentUpdate)
{
isParentSet = true;
continue;
}
string destFieldName = field.DEST_FIELD_NAME;//目的字段
if (string.IsNullOrEmpty(destFieldName)) continue;
string srcValue = string.Empty;
//获取字段值
var fieldValue = this.GetFieldValueByRow(param, row, invokeField, table, entityType, out srcValue);
if (field.SRC_FEILD_TYPE == (int)FMImportConfigSrcFieldTypeEnum.ID字段)
{
if (destFieldName.IndexOf(".", StringComparison.OrdinalIgnoreCase) > -1)
{
this.AddMessage(param, ImportMessageTypeEnum.Warning,
string.Format("获取表{0}时,字段{1}不允许配置导航字段{2}", configDetail.DESCRIPTION, field.LABEL, field.DEST_FIELD_NAME));
continue;
}
if (fieldValue == null)
{
this.AddMessage(param, ImportMessageTypeEnum.Warning,
string.Format("获取表{0}时,字段{1}未获取到有效记录", configDetail.DESCRIPTION, field.LABEL, field.ID_TABLE_NAME));
continue;
}
var des = entityType.GetProperty(destFieldName);
if (des == null) continue;
des.SetValue(t, fieldValue, null);
}
else
{
var splitDestFieldName = destFieldName.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries).ToList();
if (splitDestFieldName != null && splitDestFieldName.Any())
{
string firstField = splitDestFieldName[0];
var des = entityType.GetProperty(firstField);
if (des == null) continue;
if (splitDestFieldName.Count == 1)
{
if (fieldValue == null) continue;
des.SetValue(t, fieldValue, null);
}
else
{
if (string.IsNullOrEmpty(field.ID_FIELD_NAME))
{
this.AddMessage(param, ImportMessageTypeEnum.Warning,
string.Format("获取表{0}时,字段{1}未配置ID字段名称", configDetail.DESCRIPTION, field.LABEL));
continue;
}
var idFieldNameProperty = entityType.GetProperty(field.ID_FIELD_NAME);
if (idFieldNameProperty == null)
{
this.AddMessage(param, ImportMessageTypeEnum.Warning,
string.Format("获取表{0}时,字段{1}无效ID字段名称{2}", configDetail.DESCRIPTION, field.LABEL, field.ID_FIELD_NAME));
continue;
}
if (fieldValue == null)
{
if (!string.IsNullOrEmpty(srcValue))
{
splitDestFieldName.RemoveAt(0);
string ruleField = string.Join(".", splitDestFieldName);
this.AddMessage(param, ImportMessageTypeEnum.Warning,
string.Format("获取表{0}时,导航字段{1}为匹配到实体(字段{2},值{3}", configDetail.DESCRIPTION, field.LABEL, ruleField, srcValue));
}
continue;
}
des.SetValue(t, fieldValue, null);
var entityBase = fieldValue as EntityBase<Guid>;
if (entityBase != null)
idFieldNameProperty.SetValue(t, entityBase.ID, null);
}
}
}
}
}
if (keyFieldModel != null)
{
keyFieldValue = GetFieldValue(keyFieldModel.Nav_ConfigField.DEST_FIELD_NAME, t);
if (!string.IsNullOrEmpty(keyFieldValue) && !keyValuePairs.ContainsKey(keyFieldValue))
keyValuePairs.Add(keyFieldValue, t.ID);
}
result.Add(t);
}
if (updateResult.Any())
{
var type = updateResult.FirstOrDefault().GetType();
var pros = type.GetProperties().Where(i => i.Name.StartsWith("Nav"));
foreach (var s in updateResult)
{
foreach (var pro in pros)
{
type.GetProperty(pro.Name).SetValue(s, null);
}
}
}
if (addResult.Any())
{
var type = addResult.FirstOrDefault().GetType();
var pros = type.GetProperties().Where(i => i.Name.StartsWith("Nav"));
foreach (var s in addResult)
{
foreach (var pro in pros)
{
type.GetProperty(pro.Name).SetValue(s, null);
}
}
}
if (configDetail.PARENT_ID == null)//主表
this.AddMessage(param, ImportMessageTypeEnum.Info, string.Format("获取到数据{0}笔", result.Count));
///更新
if (param.IsUpdate)
{
this.UnifiedCommit(() =>
{
if (addResult.Any())
this.BantchAddEntityNoCommit(addResult);
if (updateResult.Any())
if (!param.IsParentUpdate)
this.BantchUpdateEntityNoCommit(updateResult);
else
this.BantchSaveEntityNoCommit(updateResult);
});
}
//父节点字段处理
if (isParentSet)
{
param.IsParentUpdate = true;
DoGetEntityByTable<T>(param);
}
//子表处理
//foreach (DataRow row in table.Rows)
//{
//子表赋值
if (!string.IsNullOrEmpty(configDetail.SHEET_KEY_FIELD_NAME) && param.Nav_ChildConfigDetails != null && param.Nav_ChildConfigDetails.Any())
{
DataColumn col = table.Columns[configDetail.SHEET_KEY_FIELD_NAME];
//string keyValue = col == null ? string.Empty : LibUtils.ToString(row[col]);
//if (!string.IsNullOrEmpty(keyValue))
//{
foreach (var child in param.Nav_ChildConfigDetails)
{
child.IsUpdate = param.IsUpdate;
if (child.Nav_PageEdit == null || string.IsNullOrEmpty(child.Nav_PageEdit.NAV_PROPERTY))
{
this.AddMessage(param, ImportMessageTypeEnum.Warning, string.Format("获取表{0}时,子表{1}未配置导航",
configDetail.DESCRIPTION, child.Nav_ConfigDetail == null ? "" : child.Nav_ConfigDetail.DESCRIPTION));
continue;
}
var navProperty = entityType.GetProperty(child.Nav_PageEdit.NAV_PROPERTY);
if (navProperty == null)
{
this.AddMessage(param, ImportMessageTypeEnum.Warning, string.Format("获取表{0}时,子表{1}无效导航{2}", configDetail.DESCRIPTION,
child.Nav_ConfigDetail == null ? "" : child.Nav_ConfigDetail.DESCRIPTION, child.Nav_PageEdit.NAV_PROPERTY));
continue;
}
child.IsParentAdd = false;
child.KeyPairDic = keyValuePairs;
child.KeyField = configDetail.SHEET_KEY_FIELD_NAME;
//child.KeyValue = keyValue;
//child.ParentId = keyValuePairs[keyValue];
int i1 = navProperty.PropertyType.FullName.IndexOf("T_");
if (i1 >= 0)
{
int i2 = navProperty.PropertyType.FullName.IndexOf(",", i1 + 2);
if (i2 >= 0)
{
var childTable = navProperty.PropertyType.FullName.Substring(i1, i2 - i1);
var type = this.GetTypeByEntityName(childTable, param.ExistTypes);
if (type != null)
{
try
{
MethodInfo methodInfo = this.GetType().GetMethod("DoGetEntityByTable", BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
var tmpResult = methodInfo.MakeGenericMethod(new Type[] { type }).Invoke(this, new object[] { child });
//if (tmpResult != null)
// navProperty.SetValue(t, tmpResult, null);
}
catch (TargetInvocationException ex)
{
this.ThrowError("010001", ex.InnerException.Message);
}
}
}
//}
}
}
//}
}
//刪除
if (param.DelFlag)
{
var ids = addResult.Select(i => i.ID).ToList();
var updateIds = updateResult.Select(i => i.ID).ToList();
ids.AddRange(updateIds);
this.DeleteEntity<T>(i => !ids.Contains(i.ID));
}
return result;
}
catch (Exception ex)
{
this.AddMessage(param, ImportMessageTypeEnum.Error,
string.Format("获取表数据{0}发生错误,详情:{1}", configDetail.DESCRIPTION,
ex.InnerException != null ? ex.InnerException.Message : ex.Message));
this.ThrowError("010001", ex.Message);
}
return null;
}
#endregion
}
}