Beispiel #1
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);
        }
Beispiel #2
0
        /// <summary>
        /// 新建
        /// </summary>
        /// <param name="saveDataModel"></param>
        /// <returns></returns>
        public virtual WebResponseContent Add(SaveModel saveDataModel)
        {
            if (AddOnExecute != null)
            {
                Response = AddOnExecute(saveDataModel);
                if (!Response.Status)
                {
                    return(Response);
                }
            }
            if (saveDataModel == null ||
                saveDataModel.MainData == null ||
                saveDataModel.MainData.Count == 0)
            {
                return(Response.Set(ResponseType.ParametersLack, false));
            }

            saveDataModel.DetailData = saveDataModel.DetailData?.Where(x => x.Count > 0).ToList();
            Type type = typeof(T);

            string validReslut = type.ValidateDicInEntity(saveDataModel.MainData, true, UserIgnoreFields);

            if (!string.IsNullOrEmpty(validReslut))
            {
                return(Response.Error(validReslut));
            }

            if (saveDataModel.MainData.Count == 0)
            {
                return(Response.Error("保存的数据为空,请检查model是否配置正确!"));
            }

            UserInfo userInfo = UserContext.Current.UserInfo;

            saveDataModel.SetDefaultVal(AppSetting.CreateMember, userInfo);

            PropertyInfo keyPro = type.GetKeyProperty();

            if (keyPro.PropertyType == typeof(Guid))
            {
                saveDataModel.MainData.Add(keyPro.Name, Guid.NewGuid());
            }
            else
            {
                saveDataModel.MainData.Remove(keyPro.Name);
            }
            //没有明细直接保存返回
            if (saveDataModel.DetailData == null || saveDataModel.DetailData.Count == 0)
            {
                T mainEntity = saveDataModel.MainData.DicToEntity <T>();
                if (base.AddOnExecuting != null)
                {
                    Response = base.AddOnExecuting(mainEntity, null);
                    if (!Response.Status)
                    {
                        return(Response);
                    }
                }
                Response = repository.DbContextBeginTransaction(() =>
                {
                    repository.Add(mainEntity, true);
                    saveDataModel.MainData[keyPro.Name] = keyPro.GetValue(mainEntity);
                    Response.OK(ResponseType.SaveSuccess);
                    if (base.AddOnExecuted != null)
                    {
                        Response = base.AddOnExecuted(mainEntity, null);
                    }
                    return(Response);
                });
                if (Response.Status)
                {
                    Response.Data = new { data = saveDataModel.MainData }
                }
                ;
                return(Response);
            }

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

            return(typeof(ServiceBase <T, TRepository>)
                   .GetMethod("Add", BindingFlags.Instance | BindingFlags.NonPublic)
                   .MakeGenericMethod(new Type[] { detailType })
                   .Invoke(this, new object[] { saveDataModel })
                   as WebResponseContent);
        }