public async Task <List <ChangeLog> > GetChangeLog(EntityDto <Guid> input, Guid flowId) { var flowModel = _workFlowCacheManager.GetWorkFlowModelFromCache(flowId); if (flowModel == null) { throw new UserFriendlyException((int)ErrorCode.DataAccessErr, "流程不存在"); } var tableName = flowModel.TitleField.Table; var query = (from a in _projectAuditRepository.GetAll() where a.InstanceId == input.Id.ToString() && a.TableName == tableName group a by new { a.GroupId } into g select new { CreatTime = g.First().CreationTime, g }).OrderByDescending(c => c.CreatTime); var logs = await query.ToListAsync(); var ret = new List <ChangeLog>(); foreach (var item in logs) { var firstModel = item.g.FirstOrDefault(); var entity = new ChangeLog() { ChangeTime = firstModel.CreationTime, UserName = (await UserManager.GetUserByIdAsync(firstModel.CreatorUserId.Value)).Name, }; //entity.Content = ModelColumnLogsHepler.MakeContent(item.g.ToList()); foreach (var model in item.g) { var logModel = new LogColumnModel() { ChangeType = model.ChangeType, FieldName = model.FieldName, NewValue = model.NewValue, OldValue = model.OldValue, }; entity.ContentModel.Add(logModel); } ret.Add(entity); } return(ret); }
public static List <LogColumnModel> GetColumnAllLogs(object o, object n) { var logs = new List <LogColumnModel>(); foreach (var f in o.GetType().GetProperties()) { var attr = f.GetCustomAttributes(typeof(LogColumnAttribute), true); if (attr.Length > 0) { var colattr = (LogColumnAttribute)attr[0]; if (colattr.IsLog) { if (f.PropertyType.GetInterface("IEnumerable", false) != null && f.PropertyType.GetInterface("IList", false) != null) { var childType = f.PropertyType.GetGenericArguments()[0]; var childValues = f.GetValue(o); var newChilds = f.GetValue(n) as IEnumerable; foreach (var item in (childValues as IEnumerable)) { var old_Id = item.GetType().GetProperty("Id").GetValue(item, null); var nameValue = GetNameFieldValue(item); var hasSameId = false; object newEditObj = null; foreach (var itemNew in newChilds) { var new_Id = itemNew.GetType().GetProperty("Id").GetValue(itemNew, null); if (new_Id == null) { continue; } ///编辑的 if (new_Id.ToString() == old_Id.ToString()) { hasSameId = true; newEditObj = itemNew; break; } ///删除的 else { continue; } } if (hasSameId) { var editlogs = GetColumnAllLogs(item, newEditObj); foreach (var log in editlogs) { log.FieldName = $"{colattr.Name}:{nameValue}->{log.FieldName}"; //log.ChangeType = 2; logs.Add(log); } } else { var deletelog = new LogColumnModel() { ChangeType = 3, FieldName = $"{colattr.Name}:{nameValue}", NewValue = "", OldValue = old_Id.ToString(), }; logs.Add(deletelog); } } foreach (var itemNew in newChilds) { var new_Id = itemNew.GetType().GetProperty("Id").GetValue(itemNew, null); var nameValue = GetNameFieldValue(itemNew); if (new_Id == null) { var addlog = new LogColumnModel() { ChangeType = 1, FieldName = $"{colattr.Name}:{nameValue}", //NewValue = new_Id.ToString(), NewValue = "", OldValue = "", }; logs.Add(addlog); } else { var hasSameId = false; foreach (var item in (childValues as IEnumerable)) { var old_Id = item.GetType().GetProperty("Id").GetValue(item, null); if (new_Id.ToString() == old_Id.ToString()) { hasSameId = true; break; } } if (!hasSameId) { var addlog = new LogColumnModel() { ChangeType = 1, FieldName = $"{colattr.Name}:{nameValue}", NewValue = new_Id.ToString(), //FieldName = $"{colattr.Name}", //NewValue = nameValue, OldValue = "", }; logs.Add(addlog); } } } } else { var oldValue = f.GetValue(o); var newValue = f.GetValue(n); if (oldValue == null) { oldValue = "空"; } if (newValue == null) { newValue = "空"; } if (oldValue.ToString() != newValue.ToString()) { //if (oldValue.ToString().IndexOf(".0000", StringComparison.Ordinal) > 0) if (f.PropertyType == typeof(decimal) || f.PropertyType == typeof(decimal?)) { var oldValueNumber = 0m; var newValueNumber = 0m; if (decimal.TryParse(oldValue.ToString(), out oldValueNumber) && decimal.TryParse(newValue.ToString(), out newValueNumber)) { if (oldValueNumber == newValueNumber) { continue; } } } if (f.PropertyType == typeof(bool) || f.PropertyType == typeof(bool?)) { var oldValueBoolen = oldValue.ToString() == "空" ? "否" : bool.Parse(oldValue.ToString()) ? "是" : "否"; var newValueBoolen = newValue.ToString() == "空" ? "否" : bool.Parse(newValue.ToString()) ? "是" : "否"; if (oldValueBoolen == newValueBoolen) { continue; } else { oldValue = oldValueBoolen; newValue = newValueBoolen; } } var field = string.IsNullOrWhiteSpace(colattr.Name) ? f.Name : colattr.Name; logs.Add(new LogColumnModel { FieldName = field, OldValue = oldValue.ToString(), NewValue = newValue.ToString() }); } } } } } return(logs); }