private static Func <ISession <PrivateAuthentication>, ITest, Task <IReadOnlyDictionary <object, FieldPropertyCollection> > > BeforeTest(Func <CreateFieldsRequest> createRequestFunction, IEnumerable <FieldProperty> select)
        {
            return(async(session, test) =>
            {
                var result = await CreateFields(createRequestFunction, select)(session, test);
                await DeleteFields(session, test, result);

                return result;
            });
        }
Esempio n. 2
0
        /// <summary>
        /// 编辑
        /// 1、明细表必须把主表的主键字段也设置为可编辑
        /// 2、修改、增加只会操作设置为编辑列的数据
        /// </summary>
        /// <param name="saveModel"></param>
        /// <returns></returns>
        public virtual WebResponseContent Update(SaveModel saveModel)
        {
            if (UpdateOnExecute != null)
            {
                Response = UpdateOnExecute(saveModel);
                if (!Response.Status)
                {
                    return(Response);
                }
            }
            if (saveModel == null)
            {
                return(Response.Error(ResponseType.ParametersLack));
            }

            Type type = typeof(T);

            //设置修改时间,修改人的默认值
            UserInfo userInfo = UserContext.Current.UserInfo;

            saveModel.SetDefaultVal(AppSetting.ModifyMember, userInfo);


            //判断提交的数据与实体格式是否一致
            string result = type.ValidateDicInEntity(saveModel.MainData, true, false, UserIgnoreFields);

            if (result != string.Empty)
            {
                return(Response.Error(result));
            }

            PropertyInfo mainKeyProperty = type.GetKeyProperty();
            //验证明细
            Type detailType = null;

            if (saveModel.DetailData != null || saveModel.DelKeys != null)
            {
                saveModel.DetailData = saveModel.DetailData == null
                    ? new List <Dictionary <string, object> >()
                    : saveModel.DetailData.Where(x => x.Count > 0).ToList();

                detailType = typeof(T).GetCustomAttribute <EntityAttribute>().DetailTable[0];

                result = detailType.ValidateDicInEntity(saveModel.DetailData, true, false, new string[] { mainKeyProperty.Name });
                if (result != string.Empty)
                {
                    return(Response.Error(result));
                }
            }

            //获取主建类型的默认值用于判断后面数据是否正确,int long默认值为0,guid :0000-000....
            object keyDefaultVal = mainKeyProperty.PropertyType.Assembly.CreateInstance(mainKeyProperty.PropertyType.FullName);//.ToString();

            //判断是否包含主键
            if (mainKeyProperty == null ||
                !saveModel.MainData.ContainsKey(mainKeyProperty.Name) ||
                saveModel.MainData[mainKeyProperty.Name] == null
                )
            {
                return(Response.Error(ResponseType.NoKey));
            }

            object mainKeyVal = saveModel.MainData[mainKeyProperty.Name];

            //判断主键类型是否正确
            (bool, string, object)validation = mainKeyProperty.ValidationValueForDbType(mainKeyVal).FirstOrDefault();
            if (!validation.Item1)
            {
                return(Response.Error(ResponseType.KeyError));
            }

            object valueType = mainKeyVal.ToString().ChangeType(mainKeyProperty.PropertyType);

            //判断主键值是不是当前类型的默认值
            if (valueType == null ||
                (!valueType.GetType().Equals(mainKeyProperty.PropertyType) ||
                 valueType.ToString() == keyDefaultVal.ToString()
                ))
            {
                return(Response.Error(ResponseType.KeyError));
            }

            if (saveModel.MainData.Count <= 1)
            {
                return(Response.Error("系统没有配置好编辑的数据,请检查model!"));
            }

            Expression <Func <T, bool> > expression = mainKeyProperty.Name.CreateExpression <T>(mainKeyVal.ToString(), LinqExpressionType.Equal);

            if (!repository.Exists(expression))
            {
                return(Response.Error("保存的数据不存在!"));
            }
            //没有明细的直接保存主表数据
            if (detailType == null)
            {
                saveModel.SetDefaultVal(AppSetting.ModifyMember, userInfo);
                T mainEntity = saveModel.MainData.DicToEntity <T>();
                if (UpdateOnExecuting != null)
                {
                    Response = UpdateOnExecuting(mainEntity, null, null, null);
                    if (!Response.Status)
                    {
                        return(Response);
                    }
                }
                //不修改!CreateFields.Contains创建人信息
                repository.Update(mainEntity, type.GetEditField().Where(c => saveModel.MainData.Keys.Contains(c) && !CreateFields.Contains(c)).ToArray());
                if (base.UpdateOnExecuted == null)
                {
                    repository.SaveChanges();
                    Response.OK(ResponseType.SaveSuccess);
                }
                else
                {
                    Response = repository.DbContextBeginTransaction(() =>
                    {
                        repository.SaveChanges();
                        Response = UpdateOnExecuted(mainEntity, null, null, null);
                        return(Response);
                    });
                }
                if (Response.Status)
                {
                    Response.Data = new { data = mainEntity }
                }
                ;
                if (Response.Status && string.IsNullOrEmpty(Response.Message))
                {
                    Response.OK(ResponseType.SaveSuccess);
                }
                return(Response);
            }

            saveModel.DetailData = saveModel.DetailData.Where(x => x.Count > 0).ToList();

            //明细操作
            PropertyInfo detailKeyInfo = detailType.GetKeyProperty();
            //主键类型
            //  string detailKeyType = mainKeyProperty.GetTypeCustomValue<ColumnAttribute>(c => new { c.TypeName });
            //判断明细是否包含了主表的主键

            string deatilDefaultVal = detailKeyInfo.PropertyType.Assembly.CreateInstance(detailKeyInfo.PropertyType.FullName).ToString();

            foreach (Dictionary <string, object> dic in saveModel.DetailData)
            {
                //不包含主键的默认添加主键默认值,用于后面判断是否为新增数据
                if (!dic.ContainsKey(detailKeyInfo.Name))
                {
                    dic.Add(detailKeyInfo.Name, keyDefaultVal);
                    if (dic.ContainsKey(mainKeyProperty.Name))
                    {
                        dic[mainKeyProperty.Name] = keyDefaultVal;
                    }
                    else
                    {
                        dic.Add(mainKeyProperty.Name, keyDefaultVal);
                    }
                    continue;
                }
                if (dic[detailKeyInfo.Name] == null)
                {
                    return(Response.Error(ResponseType.NoKey));
                }

                //主键值是否正确
                string detailKeyVal = dic[detailKeyInfo.Name].ToString();
                if (!mainKeyProperty.ValidationValueForDbType(detailKeyVal).FirstOrDefault().Item1 ||
                    deatilDefaultVal == detailKeyVal)
                {
                    return(Response.Error(ResponseType.KeyError));
                }

                //判断主表的值是否正确
                if (detailKeyVal != keyDefaultVal.ToString() && (!dic.ContainsKey(mainKeyProperty.Name) || dic[mainKeyProperty.Name] == null || dic[mainKeyProperty.Name].ToString() == keyDefaultVal.ToString()))
                {
                    return(Response.Error(mainKeyProperty.Name + "是必填项!"));
                }
            }

            if (saveModel.DetailData.Exists(c => c.Count <= 2))
            {
                return(Response.Error("系统没有配置好明细编辑的数据,请检查model!"));
            }
            return(this.GetType().GetMethod("UpdateToEntity")
                   .MakeGenericMethod(new Type[] { detailType })
                   .Invoke(this, new object[] { saveModel, mainKeyProperty, detailKeyInfo, keyDefaultVal })
                   as WebResponseContent);
        }
Esempio n. 3
0
        /// <summary>
        /// 将数据转换成对象后最终保存
        /// </summary>
        /// <typeparam name="DetailT"></typeparam>
        /// <param name="saveModel"></param>
        /// <param name="mainKeyProperty"></param>
        /// <param name="detailKeyInfo"></param>
        /// <param name="keyDefaultVal"></param>
        /// <returns></returns>
        public WebResponseContent UpdateToEntity <DetailT>(SaveModel saveModel, PropertyInfo mainKeyProperty, PropertyInfo detailKeyInfo, object keyDefaultVal) where DetailT : class
        {
            T mainEnity = saveModel.MainData.DicToEntity <T>();
            List <DetailT> detailList = saveModel.DetailData.DicToList <DetailT>();

            //删除的主键

            //查出所有明细表数据的ID
            System.Collections.IList detailKeys = this.GetType().GetMethod("GetUpdateDetailSelectKeys")
                                                  .MakeGenericMethod(new Type[] { typeof(DetailT), detailKeyInfo.PropertyType })
                                                  .Invoke(this, new object[] {
                detailKeyInfo.Name, mainKeyProperty.Name,
                saveModel.MainData[mainKeyProperty.Name].ToString()
            }) as System.Collections.IList;

            //新增对象
            List <DetailT> addList = new List <DetailT>();
            //   List<object> containsKeys = new List<object>();
            //编辑对象
            List <DetailT> editList = new List <DetailT>();
            //删除的主键
            List <object> delKeys = new List <object>();

            mainKeyProperty = typeof(DetailT).GetProperties().Where(x => x.Name == mainKeyProperty.Name).FirstOrDefault();
            //获取新增与修改的对象
            foreach (DetailT item in detailList)
            {
                object value = detailKeyInfo.GetValue(item);
                if (keyDefaultVal.Equals(value))//主键为默认值的,新增数据
                {
                    //设置新增的主表的值
                    mainKeyProperty.SetValue(item,
                                             saveModel.MainData[mainKeyProperty.Name]
                                             .ChangeType(mainKeyProperty.PropertyType));

                    if (detailKeyInfo.PropertyType == typeof(Guid))
                    {
                        detailKeyInfo.SetValue(item, Guid.NewGuid());
                    }
                    addList.Add(item);
                }
                else if (detailKeys.Contains(value))
                {
                    //containsKeys.Add(value);
                    editList.Add(item);
                }
            }

            //获取需要删除的对象的主键
            if (saveModel.DelKeys != null && saveModel.DelKeys.Count > 0)
            {
                delKeys = saveModel.DelKeys
                          .Where(x => detailKeys.Contains(x.ChangeType(detailKeyInfo.PropertyType)))
                          .Select(q => q.ChangeType(detailKeyInfo.PropertyType)).ToList();
            }

            if (UpdateOnExecuting != null)
            {
                Response = UpdateOnExecuting(mainEnity, addList, editList, delKeys);
                if (!Response.Status)
                {
                    return(Response);
                }
            }
            mainEnity.SetModifyDefaultVal();
            //主表修改
            //不修改!CreateFields.Contains创建人信息
            repository.Update(mainEnity, typeof(T).GetEditField()
                              .Where(c => saveModel.MainData.Keys.Contains(c) && !CreateFields.Contains(c))
                              .ToArray());
            foreach (var item in saveModel.DetailData)
            {
                item.SetModifyDefaultVal();
            }
            //明细修改
            editList.ForEach(x =>
            {
                //获取编辑的字段
                string[] updateField = saveModel.DetailData
                                       .Where(c => c[detailKeyInfo.Name].ChangeType(detailKeyInfo.PropertyType)
                                              .Equal(detailKeyInfo.GetValue(x)))
                                       .FirstOrDefault()
                                       .Keys.Where(k => k != detailKeyInfo.Name)
                                       .Where(r => !CreateFields.Contains(r))
                                       .ToArray();
                //設置默認值
                x.SetModifyDefaultVal();
                //添加修改字段
                repository.Update <DetailT>(x, updateField);
            });

            //明细新增
            addList.ForEach(x =>
            {
                x.SetCreateDefaultVal();
                repository.DbContext.Entry <DetailT>(x).State = EntityState.Added;
            });
            //明细删除
            delKeys.ForEach(x =>
            {
                DetailT delT = Activator.CreateInstance <DetailT>();
                detailKeyInfo.SetValue(delT, x);
                repository.DbContext.Entry <DetailT>(delT).State = EntityState.Deleted;
            });

            if (UpdateOnExecuted == null)
            {
                repository.DbContext.SaveChanges();
                Response.OK(ResponseType.SaveSuccess);
            }
            else
            {
                Response = repository.DbContextBeginTransaction(() =>
                {
                    repository.DbContext.SaveChanges();
                    Response = UpdateOnExecuted(mainEnity, addList, editList, delKeys);
                    return(Response);
                });
            }
            if (Response.Status)
            {
                addList.AddRange(editList);
                Response.Data = new { data = mainEnity, list = addList };
                if (string.IsNullOrEmpty(Response.Message))
                {
                    Response.OK(ResponseType.SaveSuccess);
                }
            }
            return(Response);
        }