From 5f46609ecec5cef6a6374a22321b0bc86ef9fe35 Mon Sep 17 00:00:00 2001
From: 18631081161 <2088094923@qq.com>
Date: Tue, 7 Apr 2026 15:15:16 +0800
Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=96=B0=E6=B5=8B=E8=AF=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Controllers/AssessmentController.cs | 53 ++++++++++++-
.../Interfaces/IAssessmentService.cs | 16 +++-
.../Services/AssessmentService.cs | 79 ++++++++++++++++++-
.../Models/Assessment/RetestRequest.cs | 12 +++
uniapp/api/assessment.js | 12 ++-
uniapp/pages/assessment/history/index.vue | 37 ++++++---
uniapp/pages/assessment/info/index.vue | 44 ++++++++++-
uniapp/pages/assessment/loading/index.vue | 49 +++++++++---
uniapp/pages/order/list/index.vue | 33 +++++---
9 files changed, 295 insertions(+), 40 deletions(-)
create mode 100644 server/MiAssessment/src/MiAssessment.Model/Models/Assessment/RetestRequest.cs
diff --git a/server/MiAssessment/src/MiAssessment.Api/Controllers/AssessmentController.cs b/server/MiAssessment/src/MiAssessment.Api/Controllers/AssessmentController.cs
index a0fa63c..b251a96 100644
--- a/server/MiAssessment/src/MiAssessment.Api/Controllers/AssessmentController.cs
+++ b/server/MiAssessment/src/MiAssessment.Api/Controllers/AssessmentController.cs
@@ -413,7 +413,7 @@ public class AssessmentController : ControllerBase
///
/// GET /api/assessment/getPendingRecord?typeId=1
///
- /// 查询当前用户状态为待测评或测评中的最新测评记录,用于断点续答。
+ /// 查询当前用户状态为待测评、测评中、生成失败或需重测的最新测评记录,用于断点续答和失败重测。
/// 需要用户登录认证。
///
/// 测评类型ID
@@ -446,4 +446,55 @@ public class AssessmentController : ControllerBase
return ApiResponse.Fail("查询进行中的测评记录失败");
}
}
+
+ ///
+ /// 重新测评(生成失败或需重测时免费重测)
+ ///
+ ///
+ /// POST /api/assessment/retest
+ ///
+ /// 将状态为生成失败(5)或需重测(7)的测评记录重置为待测评(1),
+ /// 清除旧的答案、结果和结论数据,允许用户免费重新答题。
+ /// 需要用户登录认证。
+ ///
+ /// 重测请求
+ /// 重测结果
+ [HttpPost("retest")]
+ [Authorize]
+ [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)]
+ [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status401Unauthorized)]
+ public async Task> Retest([FromBody] RetestRequest request)
+ {
+ var userId = GetCurrentUserId();
+ if (userId == null)
+ {
+ return ApiResponse.Unauthorized();
+ }
+
+ try
+ {
+ if (request == null || request.RecordId <= 0)
+ {
+ return ApiResponse.Fail("测评记录ID无效");
+ }
+
+ var result = await _assessmentService.RetestAsync(userId.Value, request.RecordId);
+ return ApiResponse.Success(result);
+ }
+ catch (UnauthorizedAccessException ex)
+ {
+ _logger.LogWarning(ex, "Unauthorized retest, userId: {UserId}, recordId: {RecordId}", userId, request?.RecordId);
+ return ApiResponse.Fail("无权限访问该测评记录", -1);
+ }
+ catch (InvalidOperationException ex)
+ {
+ _logger.LogWarning(ex, "Invalid retest, userId: {UserId}, recordId: {RecordId}", userId, request?.RecordId);
+ return ApiResponse.Fail(ex.Message);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Failed to retest, userId: {UserId}, recordId: {RecordId}", userId, request?.RecordId);
+ return ApiResponse.Fail("重新测评失败");
+ }
+ }
}
diff --git a/server/MiAssessment/src/MiAssessment.Core/Interfaces/IAssessmentService.cs b/server/MiAssessment/src/MiAssessment.Core/Interfaces/IAssessmentService.cs
index f639b64..0843428 100644
--- a/server/MiAssessment/src/MiAssessment.Core/Interfaces/IAssessmentService.cs
+++ b/server/MiAssessment/src/MiAssessment.Core/Interfaces/IAssessmentService.cs
@@ -116,11 +116,23 @@ public interface IAssessmentService
/// 获取用户进行中的测评记录
///
///
- /// 查询当前用户状态为待测评(1)或测评中(2)的最新测评记录。
- /// 用于页面加载时检测是否有未完成的测评,支持断点续答。
+ /// 查询当前用户状态为待测评(1)、测评中(2)、生成失败(5)或需重测(7)的最新测评记录。
+ /// 用于页面加载时检测是否有未完成的测评,支持断点续答和失败重测。
///
/// 当前用户ID
/// 测评类型ID
/// 进行中的测评记录,如果没有则返回null
Task GetPendingRecordAsync(long userId, long typeId);
+
+ ///
+ /// 重新测评(生成失败或需重测时免费重测)
+ ///
+ ///
+ /// 将状态为生成失败(5)或需重测(7)的测评记录重置为待测评(1),
+ /// 清除旧的答案、结果和结论数据,允许用户免费重新答题。
+ ///
+ /// 当前用户ID
+ /// 测评记录ID
+ /// 重置是否成功
+ Task RetestAsync(long userId, long recordId);
}
diff --git a/server/MiAssessment/src/MiAssessment.Core/Services/AssessmentService.cs b/server/MiAssessment/src/MiAssessment.Core/Services/AssessmentService.cs
index 5d90d33..bd585c1 100644
--- a/server/MiAssessment/src/MiAssessment.Core/Services/AssessmentService.cs
+++ b/server/MiAssessment/src/MiAssessment.Core/Services/AssessmentService.cs
@@ -695,7 +695,7 @@ public class AssessmentService : IAssessmentService
.AsNoTracking()
.Where(r => r.UserId == userId
&& r.AssessmentTypeId == typeId
- && (r.Status == 1 || r.Status == 2 || r.Status == 7)
+ && (r.Status == 1 || r.Status == 2 || r.Status == 5 || r.Status == 7)
&& !r.IsDeleted)
.OrderByDescending(r => r.CreateTime)
.Select(r => new PendingRecordDto
@@ -724,4 +724,81 @@ public class AssessmentService : IAssessmentService
return record;
}
+
+ ///
+ public async Task RetestAsync(long userId, long recordId)
+ {
+ _logger.LogInformation("重新测评请求,userId: {UserId}, recordId: {RecordId}", userId, recordId);
+
+ var record = await _dbContext.AssessmentRecords
+ .Where(r => r.Id == recordId && !r.IsDeleted)
+ .FirstOrDefaultAsync();
+
+ if (record == null)
+ {
+ _logger.LogWarning("测评记录不存在,recordId: {RecordId}", recordId);
+ throw new InvalidOperationException("测评记录不存在");
+ }
+
+ if (record.UserId != userId)
+ {
+ _logger.LogWarning("测评记录不属于当前用户,userId: {UserId}, recordUserId: {RecordUserId}", userId, record.UserId);
+ throw new UnauthorizedAccessException("无权限访问该测评记录");
+ }
+
+ // 只有生成失败(5)和需重测(7)状态才允许重测
+ if (record.Status != 5 && record.Status != 7)
+ {
+ _logger.LogWarning("测评记录状态不允许重测,status: {Status}, recordId: {RecordId}", record.Status, recordId);
+ throw new InvalidOperationException("当前测评状态不允许重新测评");
+ }
+
+ using var transaction = await _dbContext.Database.BeginTransactionAsync();
+ try
+ {
+ // 清除旧答案
+ var oldAnswers = await _dbContext.AssessmentAnswers
+ .Where(a => a.RecordId == recordId)
+ .ToListAsync();
+ if (oldAnswers.Any())
+ {
+ _dbContext.AssessmentAnswers.RemoveRange(oldAnswers);
+ }
+
+ // 清除旧结果
+ var oldResults = await _dbContext.AssessmentResults
+ .Where(r => r.RecordId == recordId)
+ .ToListAsync();
+ if (oldResults.Any())
+ {
+ _dbContext.AssessmentResults.RemoveRange(oldResults);
+ }
+
+ // 清除旧结论
+ var oldConclusions = await _dbContext.AssessmentRecordConclusions
+ .Where(c => c.RecordId == recordId)
+ .ToListAsync();
+ if (oldConclusions.Any())
+ {
+ _dbContext.AssessmentRecordConclusions.RemoveRange(oldConclusions);
+ }
+
+ // 重置状态为待测评
+ record.Status = 1;
+ record.SubmitTime = null;
+ record.UpdateTime = DateTime.Now;
+
+ await _dbContext.SaveChangesAsync();
+ await transaction.CommitAsync();
+
+ _logger.LogInformation("重新测评重置成功,recordId: {RecordId}, userId: {UserId}", recordId, userId);
+ return true;
+ }
+ catch (Exception ex)
+ {
+ await transaction.RollbackAsync();
+ _logger.LogError(ex, "重新测评重置失败,recordId: {RecordId}", recordId);
+ throw;
+ }
+ }
}
diff --git a/server/MiAssessment/src/MiAssessment.Model/Models/Assessment/RetestRequest.cs b/server/MiAssessment/src/MiAssessment.Model/Models/Assessment/RetestRequest.cs
new file mode 100644
index 0000000..4f013ec
--- /dev/null
+++ b/server/MiAssessment/src/MiAssessment.Model/Models/Assessment/RetestRequest.cs
@@ -0,0 +1,12 @@
+namespace MiAssessment.Model.Models.Assessment;
+
+///
+/// 重新测评请求
+///
+public class RetestRequest
+{
+ ///
+ /// 测评记录ID
+ ///
+ public long RecordId { get; set; }
+}
diff --git a/uniapp/api/assessment.js b/uniapp/api/assessment.js
index 17f2af8..b31e757 100644
--- a/uniapp/api/assessment.js
+++ b/uniapp/api/assessment.js
@@ -89,6 +89,15 @@ export function getPendingRecord(typeId) {
return get('/assessment/getPendingRecord', { typeId })
}
+/**
+ * 重新测评(生成失败或需重测时免费重测)
+ * @param {number} recordId - 测评记录ID
+ * @returns {Promise