diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs index 8a22002ca..bf5aaddd8 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs @@ -354,7 +354,14 @@ namespace IRaCIS.Core.Application.Service [HttpPost("{id:guid}")] public async Task DeleteCustomTag(Guid id) { + + if (await _readingTaskQuestionMarkRepository.AnyAsync(t => (t.Id == id || t.MarkId == id) && t.QuestionId != null)) + { + throw new BusinessValidationFailedException(_localizer["ReadingCustomTag_CannotDelete"]); + } + var success = await _readingTaskQuestionMarkRepository.DeleteFromQueryAsync(t => t.Id == id||t.MarkId==id, true); + return ResponseOutput.Ok(); } @@ -2189,28 +2196,123 @@ namespace IRaCIS.Core.Application.Service async Task addOrEditmark(List addOrUpdatemarkList) { + #region 老的代码 + //var markids = addOrUpdatemarkList.Select(x => x.MarkId).Where(x => x != null).Distinct().ToList(); - var markids= addOrUpdatemarkList.Select(x => x.MarkId).Where(x => x != null).Distinct().ToList(); + //var markQuestionIds = addOrUpdatemarkList.Select(y => (Guid?)y.QuestionId).ToList(); - var markQuestionIds= addOrUpdatemarkList.Select(y => (Guid?)y.QuestionId).ToList(); - - // 绑定的历史标记的话 相当于要把历史标记改为现在的标记 先删再添加 得到的结果一样 - await _readingTaskQuestionMarkRepository.BatchDeleteNoTrackingAsync(x => markids.Contains(x.MarkId)&&x.QuestionId==null ); + //// 绑定的历史标记的话 相当于要把历史标记改为现在的标记 先删再添加 得到的结果一样 + //await _readingTaskQuestionMarkRepository.BatchDeleteNoTrackingAsync(x => markids.Contains(x.MarkId) && x.QuestionId == null); - await _readingTaskQuestionMarkRepository.BatchDeleteNoTrackingAsync(x => x.VisitTaskId == inDto.VisitTaskId && markQuestionIds.Contains(x.QuestionId)); + //// 这里还不能直接删除 因为可能该问题绑定的原标记为a 现在新绑定的标记要为b 那么就需要把原标记a的绑定关系删除 - var datetime = DateTime.Now; + //var oldMark = await _readingTaskQuestionMarkRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && markQuestionIds.Contains(x.QuestionId) && x.MarkId != null).ToListAsync(); - var markList = _mapper.Map, List>(addOrUpdatemarkList); - markList.ForEach(x => + //// 这里稽查又要记录为新增 只能把原标记记录为先删除再添加 不然稽查又对不上 + //List oldAddMark = new List(); + + //foreach (var item in oldMark) + //{ + // if (addOrUpdatemarkList.Any(x => x.QuestionId == item.QuestionId && x.MarkId != item.MarkId)) + // { + // var olditem = item.Clone(); + + // olditem.QuestionId = null; + // olditem.TableQuestionId = null; + // olditem.RowId = null; + // olditem.RowIndex = null; + // oldAddMark.Add(olditem); + // } + //} + + //await _readingTaskQuestionMarkRepository.BatchDeleteNoTrackingAsync(x => x.VisitTaskId == inDto.VisitTaskId && markQuestionIds.Contains(x.QuestionId)); + + //var datetime = DateTime.Now; + + //var markList = _mapper.Map, List>(addOrUpdatemarkList); + //markList.ForEach(x => + //{ + // x.Id = NewId.NextGuid(); + // x.VisitTaskId = inDto.VisitTaskId; + // x.CreateTime = datetime; + // x.FristAddTaskId = questionMarkList.Where(y => y.QuestionId == x.QuestionId).Select(x => x.FristAddTaskId).FirstOrDefault() ?? inDto.VisitTaskId; + //}); + //// 原来移除关系的 已经删除 这里要添加 为什么要先删再加 因为稽查需要记录 稽查的记录方式为Add + //oldAddMark.AddRange(markList); + //await _readingTaskQuestionMarkRepository.AddRangeAsync(oldAddMark); + #endregion + + foreach (var item in addOrUpdatemarkList) { - x.Id = NewId.NextGuid(); - x.VisitTaskId = inDto.VisitTaskId; - x.CreateTime = datetime; - x.FristAddTaskId = questionMarkList.Where(y => y.QuestionId == x.QuestionId).Select(x => x.FristAddTaskId).FirstOrDefault() ?? inDto.VisitTaskId; - }); - await _readingTaskQuestionMarkRepository.AddRangeAsync(markList); + var oldMark = await _readingTaskQuestionMarkRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && x.QuestionId == item.QuestionId).FirstOrDefaultAsync(); + if (oldMark != null) + { + // 这种情况要先移除原来标记的绑定关系 + if (oldMark.MarkId != item.MarkId) + { + await _readingTaskQuestionMarkRepository.UpdatePartialFromQueryAsync(x => x.Id == oldMark.Id, x => new ReadingTaskQuestionMark() + { + QuestionId = null, + TableQuestionId = null, + RowId = null, + RowIndex = null, + }); + + var newMark = _mapper.Map(item); + newMark.Id = NewId.NextGuid(); + newMark.VisitTaskId = inDto.VisitTaskId; + newMark.FristAddTaskId = inDto.VisitTaskId; + await _readingTaskQuestionMarkRepository.AddAsync(newMark); + } + else + { + // 这种情况直接更新 + await _readingTaskQuestionMarkRepository.UpdatePartialFromQueryAsync(x => x.Id == oldMark.Id, x => new ReadingTaskQuestionMark() + { + MeasureData = item.MeasureData ?? string.Empty, + OtherMeasureData = item.OtherMeasureData ?? string.Empty, + PicturePath = item.PicturePath ?? string.Empty, + OtherPicturePath = item.OtherPicturePath ?? string.Empty, + MarkTool = item.MarkTool ?? string.Empty, + + }); + } + } + else + { + // 这种情况可能是绑定历史的标记 + + if (item.MarkId != null && (await _readingTaskQuestionMarkRepository.AnyAsync(x => x.VisitTaskId == inDto.VisitTaskId&& x.QuestionId == null && x.MarkId == item.MarkId))) + { + + var oldMarkItem = await _readingTaskQuestionMarkRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && x.MarkId == item.MarkId && x.QuestionId == null).FirstOrDefaultAsync(); + + await _readingTaskQuestionMarkRepository.UpdatePartialFromQueryAsync(x => x.Id == oldMarkItem.Id, x => new ReadingTaskQuestionMark() + { + QuestionId = item.QuestionId, + TableQuestionId = item.TableQuestionId, + RowId = item.RowId, + MeasureData = item.MeasureData ?? string.Empty, + OtherMeasureData = item.OtherMeasureData ?? string.Empty, + PicturePath = item.PicturePath ?? string.Empty, + OtherPicturePath = item.OtherPicturePath ?? string.Empty, + MarkTool = item.MarkTool ?? string.Empty, + }); + } + else + { + var newMark = _mapper.Map(item); + newMark.Id = NewId.NextGuid(); + newMark.VisitTaskId = inDto.VisitTaskId; + newMark.FristAddTaskId = inDto.VisitTaskId; + await _readingTaskQuestionMarkRepository.AddAsync(newMark); + } + + + } + } + } diff --git a/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs b/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs index 26bb4439e..d062cb454 100644 --- a/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs +++ b/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs @@ -3168,11 +3168,26 @@ namespace IRaCIS.Core.Infra.EFCore.Common generalId = IdentifierHelper.CreateGuid(entity.VisitTaskId.ToString(), entity.QuestionId.ToString(), entity.RowId.ToString(), entity.TableQuestionId.ToString(), "ReadingTaskQuestionMark"); } + + bool isDistinctionInterface = true; + var customPrefix=string.Empty; + + // 对于一个标记绑定两个问题的不计稽查 + var exixtsMark = await _dbContext.ReadingTaskQuestionMark.AnyAsync(t => t.MarkId == entity.MarkId); + // 自定义表格 和问题添加标记的时候 要记录为 添加标记 + if ((_userInfo.RequestUrl == "SaveTaskQuestion/-10" + || _userInfo.RequestUrl == "saveTableQuestionMark/-10") && type== "Add"&&!exixtsMark) + { + isDistinctionInterface = false; + customPrefix = "ReadingImageTask/submitCustomTag"; + } + await InsertInspection(entity, type, x => new InspectionConvertDTO() { VisitTaskId = entity.VisitTaskId, GeneralId = generalId, ObjectRelationParentId = entity.VisitTaskId, + IsDistinctionInterface = isDistinctionInterface, }, new { @@ -3181,7 +3196,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common TableQuestionName = tableQuestionName, Answer = answer, LiverSegmentation = liverSegmentation, - }, _userInfo.AuditIdentification); + },string.Empty, customPrefix); } //保存影像质量 多条记录,只记录一条稽查 @@ -3996,8 +4011,10 @@ namespace IRaCIS.Core.Infra.EFCore.Common /// 类型 /// 表达式 /// 其他对象 + /// 额外标识 + /// 自定义前缀 /// - public async Task InsertInspection(T entityObj, string type, Expression> expression = null, object otherItem = null, string auditIdentification = "") where T : Entity + public async Task InsertInspection(T entityObj, string type, Expression> expression = null, object otherItem = null, string auditIdentification = "", string customPrefix = "") where T : Entity { InspectionConvertDTO inspection = new InspectionConvertDTO(); @@ -4014,7 +4031,7 @@ namespace IRaCIS.Core.Infra.EFCore.Common var generalId = (inspection.GeneralId != null && inspection.GeneralId != Guid.Empty) ? inspection.GeneralId : entityObj.Id; inspection.GeneralId = generalId; - inspection.Identification = GetInspectionRecordIdentification(entityObj, type, inspection.IsDistinctionInterface, inspection.IsSelfDefine, auditIdentification) + inspection.ExtraIndentification; + inspection.Identification = GetInspectionRecordIdentification(entityObj, type, inspection.IsDistinctionInterface, inspection.IsSelfDefine, auditIdentification, customPrefix) + inspection.ExtraIndentification; //将实体对象属性 映射到稽查实体 MapEntityPropertyToAuditEntity(entityObj, inspection); @@ -4224,7 +4241,15 @@ namespace IRaCIS.Core.Infra.EFCore.Common /// 获取稽查记录的标识符 部分业务会进行特殊处理 /// /// - public string GetInspectionRecordIdentification(T entityObj, string type, bool IsDistinctionInterface = true, bool isSelfDefine = false, string auditIdentification = "") + /// + /// + /// + /// + /// + /// + /// 自定义前缀 某些接口需要用同一个稽查 + /// + public string GetInspectionRecordIdentification(T entityObj, string type, bool IsDistinctionInterface = true, bool isSelfDefine = false, string auditIdentification = "",string customPrefix="") { //var entityType = _dbContext.Model.FindEntityType(entityObj.GetType()); //var tableName = entityType.GetTableName(); @@ -4271,6 +4296,11 @@ namespace IRaCIS.Core.Infra.EFCore.Common result = result + "/" + auditIdentification; } + if (customPrefix.IsNotNullOrEmpty()) + { + result = customPrefix + "/" + result; + } + return result; }