/// <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); }
/// <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); }