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 NavcationList = new Dictionary(); /// /// 获取导入数据 /// /// /// /// /// public ImportDataModel GetImortData(Guid orgId, string configCode, string filePath, bool IsUpdate, bool delFlag) { var importConfig = this.GetEntity(t => t.CODE == configCode, new BaseFilter(orgId)); if (importConfig == null) throw new Exception("无效导入配置"); if (string.IsNullOrEmpty(importConfig.TABLE_NAME)) throw new Exception("未配置表名"); Dictionary existTypes = new Dictionary(); var type = this.GetTypeByEntityName(importConfig.TABLE_NAME, existTypes); if (type == null) throw new Exception("无效表名"); var configDetails = this.GetEntities(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 startRowIndexs = new Dictionary(); configDetails.ForEach(t => { startRowIndexs[t.SHEET_INDEX] = t.START_ROW_INDEX; }); //获取数据 var dataTables = FileUtils.ReadExcelByOledb(filePath, startRowIndexs); List pageEdits = null; if (!string.IsNullOrEmpty(importConfig.EDIT_FORM_CODE)) pageEdits = this.GetEntities(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 => t.CODE == editConfig, new BaseFilter(orgid)); if (importConfig == null) throw new Exception("无效导入配置"); if (string.IsNullOrEmpty(importConfig.TABLE_NAME)) throw new Exception("未配置表名"); //Dictionary existTypes = new Dictionary(); //var type = this.GetTypeByEntityName(importConfig.TABLE_NAME, existTypes); var filter = new BaseFilter(orgid); filter.Sort = "SHEET_INDEX"; var configDetails = this.GetEntities(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 pageEdits = null; if (!string.IsNullOrEmpty(importConfig.EDIT_FORM_CODE)) pageEdits = this.GetEntities(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 enumsCols = new List(); GetEnumColums(editConfigs, enumsCols); //Dictionary enumDesc = new Dictionary(); infoDetail.Nav_Fields = new List(); 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(); List hasEnums = new List(); 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 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 parentPairs = new Dictionary(); var filterRuleList = new List(); 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(); 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 tmpTotal = new List(); 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 tmp = new List(); foreach (var row in tmpResult) { dynamic info = new System.Dynamic.ExpandoObject(); var dic = (IDictionary)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; } /// /// 获取导入配置信息 /// /// /// /// public ImportConfigModel GetImportConfig(Guid orgId, string configCode) { ImportConfigModel config = new ImportConfigModel(); var importConfig = this.GetEntity(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 => t.CODE == importConfig.EDIT_FORM_CODE, new BaseFilter(importConfig.ORG_ID)); config.Nav_ImportConfig = importConfig; config.Nav_ImportTable = this.GetImportColumns(importConfig); return config; } #region 私有函数 /// /// 获取导入列信息 /// /// /// /// private ImportTableModel GetImportColumns(T_FM_IMPORT_CONFIG importConfig) { if (string.IsNullOrEmpty(importConfig.TABLE_NAME)) throw new Exception("未配置表名"); var configDetails = this.GetEntities(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 pageEdits = null; if (!string.IsNullOrEmpty(importConfig.EDIT_FORM_CODE)) pageEdits = this.GetEntities(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 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); } } } } /// /// 获取反射调用参数 /// /// /// /// /// /// private void GetImportInvokeParam(Guid? parentId, ImportInvokeParamModel parentParam, List configDetails, DataSet dataTables, List pageEdits, Dictionary 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); } }); } /// /// 实际获取反射调用参数 /// /// /// /// /// /// private ImportInvokeParamModel DoGetImportInvokeParam(T_FM_IMPORT_CONFIG_DETAIL configDetail, ImportInvokeParamModel parentParam, DataSet dataTables, List pageEdits, Dictionary 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 includes = null; if (!param.PageEditColumnNavIncludes.TryGetValue(first, out includes)) { includes = new Dictionary(); param.PageEditColumnNavIncludes.Add(first, includes); } if (!includes.ContainsKey(includeField)) includes.Add(includeField, 0); } } } } } return param; } /// /// 获取导入显示表信息 /// /// /// /// /// private void GetImportTable(Guid? parentId, ImportTableModel parentTable, List configDetails, List 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); } }); } /// /// 实际获取导入显示表信息 /// /// /// /// /// private ImportTableModel DoGetImportTable(T_FM_IMPORT_CONFIG_DETAIL configDetail, ImportTableModel parentTable, List 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 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 { /// 信息 Info = 0, /// 警告 Warning = 1, /// 错误 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); } } /// /// 根据行项获取字段值 /// /// /// /// /// /// /// /// 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; 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 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(BaseFilter filter) where T : MesEntityBase, new() { return this.GetEntity(null, filter); } public List GetEntityByInvoke(BasePageFilter filter) where T : MesEntityBase, new() { return this.GetOrderPageEntities(null, filter).Items.ToList(); } public List GetEntitiesByInvoke(BasePageFilter filter) where T : MesEntityBase, new() { return this.GetEntities(null, filter).ToList(); } /// /// 根据数据表获取实体 /// /// /// /// public List DoGetEntityByTable(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(); 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 result = new List(); List addResult = new List(); List updateResult = new List(); 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 dbData = new List(); Dictionary keyValuePairs = new Dictionary(); ImportInvokeFieldModel keyFieldModel = null; //ImportInvokeFieldModel parentKeyModel = null; var keyFieldSrcVal = ""; //构造查询条件 var ruleList = new List(); 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(null, filter).ToList(); dbData.AddRange(pageData); } //dbData = this.GetEntities(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; 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(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(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 } }