示例#1
0
 public bool Import(Guid solutionId, IList <Domain.OptionSet> optionSets)
 {
     if (optionSets.NotEmpty())
     {
         foreach (var item in optionSets)
         {
             foreach (var d in item.Items)
             {
                 d.OptionSetId = item.OptionSetId;
             }
             var entity = _optionSetFinder.FindById(item.OptionSetId);
             if (entity != null)
             {
                 item.CreatedBy      = _appContext.GetFeature <ICurrentUser>().SystemUserId;
                 item.CreatedOn      = DateTime.Now;
                 item.SolutionId     = solutionId;
                 item.OrganizationId = _appContext.OrganizationId;
                 _optionSetUpdater.Update(item);
                 //_optionSetDetailService.DeleteByParentId(entity.OptionSetId);
                 //_optionSetDetailService.CreateMany(item.Items);
                 foreach (var d in item.Items)
                 {
                     var dd = _optionSetDetailFinder.Find(x => x.OptionSetId == item.OptionSetId && x.OptionSetDetailId == d.OptionSetDetailId);
                     if (dd != null)
                     {
                         dd.Name  = d.Name;
                         dd.Value = d.Value;
                         _optionSetDetailUpdater.Update(dd);
                     }
                     else
                     {
                         d.OptionSetId = item.OptionSetId;
                         _optionSetDetailCreater.Create(d);
                     }
                 }
             }
             else
             {
                 item.CreatedBy      = _appContext.GetFeature <ICurrentUser>().SystemUserId;
                 item.CreatedOn      = DateTime.Now;
                 item.SolutionId     = solutionId;
                 item.OrganizationId = _appContext.GetFeature <ICurrentUser>().OrganizationId;
                 _optionSetCreater.Create(item);
                 _optionSetDetailCreater.CreateMany(item.Items);
             }
         }
     }
     return(true);
 }
示例#2
0
        private bool ImportCore(ImportFile file, ImportMap map, List <dynamic> data, Action <int, object, string, int, Guid> itemProcceed)
        {
            var mappings   = new List <ColumnMapping>().DeserializeFromJson(map.MapCustomizations);
            var columns    = new List <string>().DeserializeFromJson(file.HeaderRow);
            var attributes = _attributeFinder.FindByEntityName(file.TargetEntityName);
            //更新记录时,根据哪些字段查询已存在的记录
            var updatePrimaryFields = new List <string> {
                attributes.Find(x => x.IsPrimaryField).Name
            };

            updatePrimaryFields.AddRange(mappings.Where(x => x.IsUpdatePrimaryField).Select(x => x.Mapping.Attribute));
            int rowIndex = 0, failureCount = 0;

            foreach (var d in data)
            {
                rowIndex++;
                StringBuilder rowError       = new StringBuilder();
                var           entity         = new Entity(file.TargetEntityName);
                var           retrieveFilter = new Dictionary <string, object>();
                for (int i = 0; i < columns.Count; i++)
                {
                    var value   = d[i];
                    var mapping = mappings[i].Mapping;
                    //字段
                    var attr = attributes.Find(x => x.Name.IsCaseInsensitiveEqual(mapping.Attribute));
                    //是否类型
                    if (attr.TypeIsBit() || attr.TypeIsState())
                    {
                        if (value == null)
                        {
                            if (mapping.NullHandle == "ignore")
                            {
                            }
                            else if (mapping.NullHandle == "defaultvalue")
                            {
                                value = attr.DefaultValue;
                            }
                            else if (mapping.NullHandle.IsInteger())
                            {
                                var item = _stringMapFinder.Find(x => x.AttributeId == attr.AttributeId && x.Value == int.Parse(mapping.NullHandle));
                                if (item != null)
                                {
                                    value = item.Value;
                                }
                                else
                                {
                                    //失败记录
                                    rowError.AppendLine($"\"{columns[i]}\"的值\"{value}\"不存在");
                                }
                            }
                        }
                        else
                        {
                            var v    = (string)value;
                            var item = _stringMapFinder.Find(x => x.AttributeId == attr.AttributeId && x.Name == v);
                            if (item != null)
                            {
                                value = item.Value;
                            }
                            else
                            {
                                //失败记录
                                rowError.AppendLine($"\"{columns[i]}\"的值\"{value}\"不存在");
                            }
                        }
                    }
                    //选项集类型
                    else if (attr.TypeIsPickList() || attr.TypeIsStatus())
                    {
                        if (value == null)
                        {
                            if (mapping.NullHandle == "ignore")
                            {
                            }
                            else if (mapping.NullHandle == "defaultvalue")
                            {
                                value = attr.DefaultValue;
                            }
                            else if (((string)value).IsInteger())
                            {
                                var item = attr.PickLists.Find(x => x.Value == (int)value);
                                if (item != null)
                                {
                                    value = new OptionSetValue(item.Value);
                                }
                                else
                                {
                                    //失败记录
                                    rowError.AppendLine($"\"{columns[i]}\"的值\"{value}\"不存在");
                                }
                            }
                        }
                        else
                        {
                            var v    = (string)value;
                            var item = _optionSetDetailServiceFinder.Find(x => x.OptionSetId == attr.OptionSetId && x.Name == v);
                            if (item != null)
                            {
                                value = new OptionSetValue(item.Value);
                            }
                            else
                            {
                                //失败记录
                                rowError.AppendLine($"\"{columns[i]}\"的值\"{value}\"不存在");
                            }
                        }
                    }
                    //引用类型
                    else if (attr.TypeIsLookUp() || attr.TypeIsOwner() || attr.TypeIsCustomer())
                    {
                        if (value != null)
                        {
                            var criteria = new Dictionary <string, object>();
                            if (((string)value).IsGuid())
                            {
                                criteria.Add(entity.IdName, value);
                            }
                            if (mapping.LookupName.IsNotEmpty())
                            {
                                criteria.Add(mapping.LookupName, value);
                            }
                            else
                            {
                                var primaryField = _attributeFinder.Find(x => x.EntityId == attr.ReferencedEntityId && x.IsPrimaryField == true);
                                criteria.Add(primaryField.Name, value);
                            }
                            var filter = new Sdk.Abstractions.Query.FilterExpression();
                            foreach (var c in criteria)
                            {
                                filter.AddCondition(c.Key, Sdk.Abstractions.Query.ConditionOperator.Equal, c.Value);
                            }
                            var matchedCount = _aggregateService.Count(attr.ReferencedEntityName, filter);
                            if (matchedCount > 1)
                            {
                                //失败记录
                                rowError.AppendLine($"\"{columns[i]}\"的值\"{value}\"不唯一");
                            }
                            else
                            {
                                var referenced = _dataFinder.RetrieveByAttribute(attr.ReferencedEntityName, criteria, new List <string> {
                                    attr.ReferencedEntityName + "Id"
                                });
                                if (referenced.NotEmpty())
                                {
                                    if (attr.TypeIsOwner())
                                    {
                                        value = new OwnerObject(OwnerTypes.SystemUser, referenced.Id);
                                    }
                                    else
                                    {
                                        value = new EntityReference(attr.ReferencedEntityName, referenced.Id);
                                    }
                                }
                                else
                                {
                                    //失败记录
                                    rowError.AppendLine($"\"{columns[i]}\"的值\"{value}\"不存在");
                                }
                            }
                        }
                    }
                    //金额类型
                    else if (attr.TypeIsMoney() || attr.TypeIsSmallMoney())
                    {
                        if (value != null)
                        {
                            if (decimal.TryParse((string)value, out decimal v))
                            {
                                value = new Money(v);
                            }
                            else
                            {
                                //失败记录
                                rowError.AppendLine($"\"{columns[i]}\"的值\"{value}\"格式错误");
                            }
                        }
                    }
                    //浮点型类型
                    else if (attr.TypeIsDecimal() || attr.TypeIsFloat())
                    {
                        if (value != null)
                        {
                            if (!decimal.TryParse((string)value, out _))
                            {
                                //失败记录
                                rowError.AppendLine($"\"{columns[i]}\"的值\"{value}\"格式错误");
                            }
                        }
                    }
                    //整型类型
                    else if (attr.TypeIsInt())
                    {
                        if (value != null)
                        {
                            if (!((string)value).IsInteger())
                            {
                                //失败记录
                                rowError.AppendLine($"\"{columns[i]}\"的值\"{value}\"格式错误");
                            }
                        }
                    }
                    //日期类型
                    else if (attr.TypeIsDateTime() || attr.TypeIsSmallDateTime())
                    {
                        if (value != null)
                        {
                            if (!((string)value).IsDateTime())
                            {
                                //失败记录
                                rowError.AppendLine($"\"{columns[i]}\"的值\"{value}\"格式错误");
                            }
                        }
                    }
                    else if (value != null)
                    {
                        value = (string)value;
                    }
                    if (rowError.Length == 0 && value != null)
                    {
                        entity.SetAttributeValue(attr.Name, value);
                        if (updatePrimaryFields.Exists(x => x.IsCaseInsensitiveEqual(attr.Name)))
                        {
                            retrieveFilter.Add(attr.Name, value);
                        }
                    }
                }
                int errorType = rowError.Length > 0 ? 2 : 0;//错误类型:数据=2
                //重复数据的操作
                if (retrieveFilter.Count > 0)
                {
                    var existsEntity = _dataFinder.RetrieveByAttribute(file.TargetEntityName, retrieveFilter, updatePrimaryFields, true);
                    //不导入重复数据
                    if (file.DuplicateDetection == 1 && existsEntity.NotEmpty())
                    {
                        rowError.AppendLine("记录已存在");
                    }
                    //覆盖导入
                    else if (file.DuplicateDetection == 2 && existsEntity.NotEmpty())
                    {
                        entity.SetIdValue(existsEntity.Id);
                    }
                    //仅覆盖重复数据
                    else if (file.DuplicateDetection == 3)
                    {
                        if (existsEntity.NotEmpty())
                        {
                            entity.SetIdValue(existsEntity.Id);
                        }
                        else
                        {
                            rowError.AppendLine("记录不存在");
                        }
                    }
                }
                Guid recordId = entity.Id;
                //本行数据验证通过
                if (rowError.Length == 0)
                {
                    try
                    {
                        if (recordId.IsEmpty())
                        {
                            recordId = _dataCreater.Create(entity);
                        }
                        else
                        {
                            _dataUpdater.Update(entity);
                        }
                    }
                    catch (Exception e)
                    {
                        errorType = 1;//错误类型:系统
                        rowError.AppendLine(e.Message);
                    }
                }
                if (rowError.Length > 0)
                {
                    failureCount++;
                }
                //每行导入结果
                itemProcceed(rowIndex, d, rowError.ToString(), errorType, recordId);
            }
            //文件导入结果
            file.SuccessCount = data.Count - failureCount;
            file.FailureCount = failureCount;
            _importFileService.Update(file);
            return(true);
        }