refactor(journal task): 重构期刊任务模块,优化答案数据结构与流程
1. 移除废弃的KeywordAnalysis相关接口与代码 2. 重构任务答案存储逻辑,改用一对多关联存储多组答案 3. 调整实体与DTO字段,统一评分、时长等任务配置字段位置 4. 优化任务查询与返回结构,使用列表统一管理答案数据 5. 修复微信授权控制器默认返回逻辑
This commit is contained in:
@ -143,20 +143,33 @@ public class JournalPageService(BaseRepository<Journal> JournalRepository,
|
||||
|
||||
if (output != null)
|
||||
{
|
||||
output.Tasks = await JournalPageTaskRepository.Queryable()
|
||||
.LeftJoin<JournalPageTaskAnswer>((a, ans) => ans.JournalPageTaskId == a.Id)
|
||||
.Where((a, ans) => a.JournalPageId == output.JournalPageId)
|
||||
.Select((a, ans) => new JournalPageTaskV2Output
|
||||
{
|
||||
Id = a.Id,
|
||||
GroupId = a.GroupId,
|
||||
No = a.No,
|
||||
Type = (TaskBankTypeEnum)a.Type,
|
||||
Options = a.Options,
|
||||
Answers = ans.Answer,
|
||||
Analysis = ans.Analysis,
|
||||
})
|
||||
var tasks = await JournalPageTaskRepository.Queryable()
|
||||
.Where(a => a.JournalPageId == output.JournalPageId)
|
||||
.ToListAsync();
|
||||
|
||||
if (tasks.Count > 0)
|
||||
{
|
||||
var taskIds = tasks.Select(t => t.Id).ToList();
|
||||
var allAnswers = await JournalPageTaskAnswerRepository.Queryable()
|
||||
.Where(a => taskIds.Contains(a.JournalPageTaskId))
|
||||
.ToListAsync();
|
||||
|
||||
output.Tasks = tasks.Select(t => new JournalPageTaskV2Output
|
||||
{
|
||||
Id = t.Id,
|
||||
GroupId = t.GroupId,
|
||||
No = t.No,
|
||||
Type = t.Type,
|
||||
Answers = allAnswers
|
||||
.Where(a => a.JournalPageTaskId == t.Id)
|
||||
.Select(a => new JournalTaskAnswerOutput
|
||||
{
|
||||
Id = a.Id,
|
||||
Answer = a.Answer,
|
||||
AnswerUrl = a.AnswerUrL
|
||||
}).ToList()
|
||||
}).ToList();
|
||||
}
|
||||
}
|
||||
//if (output?.Areas != null)
|
||||
// output.Areas = await _JournalPageOtherRepository.Queryable().Where(w => w.JournalPageId == output.JournalPageId).Select<JournalPageOtherOutput>().ToListAsync();
|
||||
|
||||
@ -33,36 +33,7 @@ public class JournalPageTaskService(BaseRepository<Journal> journalRepository, O
|
||||
map.Type = groupTask.Type;
|
||||
}
|
||||
|
||||
var data = await base.InsertAsync(map);
|
||||
|
||||
// 创建默认答案记录
|
||||
var answer = new JournalPageTaskAnswer
|
||||
{
|
||||
JournalPageTaskId = map.Id,
|
||||
CreatedBy = "System",
|
||||
UpdatedBy = "System",
|
||||
CreatedAt = DateTime.Now,
|
||||
UpdatedAt = DateTime.Now,
|
||||
IsDeleted = false
|
||||
};
|
||||
|
||||
// 如果是关联跨页题目,从第一部分的 Answer 复制 Score 和 AnswerTime
|
||||
if (no.Last() >= 2)
|
||||
{
|
||||
var startNo = $"{no[0]}-{no[1]}-{no[2]}-1";
|
||||
var firstTask = await Queryable().Where(w => w.No == startNo && w.JournalId == input.JournalId).FirstAsync();
|
||||
if (firstTask != null)
|
||||
{
|
||||
var firstAnswer = await answerRepository.Queryable().Where(a => a.JournalPageTaskId == firstTask.Id).FirstAsync();
|
||||
if (firstAnswer != null)
|
||||
{
|
||||
answer.Score = firstAnswer.Score;
|
||||
answer.AnswerTime = firstAnswer.AnswerTime;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
await answerRepository.InsertAsync(answer);
|
||||
await base.InsertAsync(map);
|
||||
|
||||
return map?.Id;
|
||||
}
|
||||
@ -82,13 +53,20 @@ public class JournalPageTaskService(BaseRepository<Journal> journalRepository, O
|
||||
|
||||
var key = $"journal/{task.JournalId}/{task.JournalPageId}/{task.GroupId}";
|
||||
|
||||
// 题目侧字段处理
|
||||
// 题目内容处理
|
||||
input.Task = Deal(task.Task, input.Task, key, "task");
|
||||
|
||||
task.Type = input.Type;
|
||||
task.Task = input.Task;
|
||||
task.Options = input.Options;
|
||||
task.No = input.No;
|
||||
task.Points = input.Points;
|
||||
task.GrowthPoint = (int?)input.GrowthPoint;
|
||||
task.Comprehension = input.Comprehension;
|
||||
task.Judgment = input.Judgment;
|
||||
task.Expression = input.Expression;
|
||||
task.Persuasiveness = input.Persuasiveness;
|
||||
task.AnswerTime = input.AnswerTime;
|
||||
|
||||
var no = input.No.Split('-').Select(int.Parse).ToArray();
|
||||
if (no.Last() >= 2)
|
||||
{
|
||||
@ -101,89 +79,68 @@ public class JournalPageTaskService(BaseRepository<Journal> journalRepository, O
|
||||
|
||||
var taskResult = await base.Updateable(task).ExecuteCommandAsync() > 0;
|
||||
|
||||
// 答案侧字段处理
|
||||
var answer = await answerRepository.Queryable().Where(a => a.JournalPageTaskId == task.Id).FirstAsync();
|
||||
if (answer == null)
|
||||
{
|
||||
// 兼容旧数据:如果 Answer 记录不存在则创建
|
||||
answer = new JournalPageTaskAnswer
|
||||
{
|
||||
JournalPageTaskId = task.Id,
|
||||
CreatedBy = "System",
|
||||
CreatedAt = DateTime.Now,
|
||||
IsDeleted = false
|
||||
};
|
||||
}
|
||||
// 答案处理:先删后插
|
||||
await answerRepository.DeleteAsync(a => a.JournalPageTaskId == task.Id);
|
||||
|
||||
// 答案/解析内容处理
|
||||
answer.Answer = Deal(answer.Answer, input.Answer, key, "answer");
|
||||
answer.Analysis = Deal(answer.Analysis, input.Analysis, key, "analysis");
|
||||
answer.Score = input.Score;
|
||||
answer.AnswerTime = input.AnswerTime;
|
||||
answer.UpdatedBy = "System";
|
||||
answer.UpdatedAt = DateTime.Now;
|
||||
|
||||
if (no.Last() >= 2)
|
||||
if (input.TaskAnswer != null && input.TaskAnswer.Count > 0)
|
||||
{
|
||||
var startNo = $"{no[0]}-{no[1]}-{no[2]}-1";
|
||||
var firstTask = await Queryable().Where(w => w.No == startNo && w.JournalId == input.JournalId).FirstAsync();
|
||||
if (firstTask != null)
|
||||
foreach (var ansInput in input.TaskAnswer)
|
||||
{
|
||||
var firstAnswer = await answerRepository.Queryable().Where(a => a.JournalPageTaskId == firstTask.Id).FirstAsync();
|
||||
if (firstAnswer != null)
|
||||
// 处理答案中的文件OSS拷贝
|
||||
ansInput.Answer = Deal(null, ansInput.Answer, key, "answer");
|
||||
ansInput.AnswerUrl = Deal(null, ansInput.AnswerUrl, key, "answerUrl");
|
||||
|
||||
var answerEntity = new JournalPageTaskAnswer
|
||||
{
|
||||
answer.Score = firstAnswer.Score;
|
||||
answer.AnswerTime = firstAnswer.AnswerTime;
|
||||
}
|
||||
JournalPageTaskId = task.Id,
|
||||
Answer = ansInput.Answer,
|
||||
AnswerUrL = ansInput.AnswerUrl,
|
||||
CreatedBy = "System",
|
||||
CreatedAt = DateTime.Now,
|
||||
IsDeleted = false
|
||||
};
|
||||
await answerRepository.InsertAsync(answerEntity);
|
||||
}
|
||||
}
|
||||
|
||||
if (answer.Id == 0)
|
||||
{
|
||||
await answerRepository.InsertAsync(answer);
|
||||
}
|
||||
else
|
||||
{
|
||||
await answerRepository.UpdateAsync(answer);
|
||||
}
|
||||
|
||||
return taskResult;
|
||||
}
|
||||
|
||||
public async Task<bool> KeywordAnalysisAsync(JournalPageTaskKeywordAnalysis input)
|
||||
{
|
||||
// KeywordAnalysis 已移至 Answer 表,通过 GroupId 关联的 Task 找到对应的 Answer 记录进行更新
|
||||
var taskIds = await Queryable().Where(w => w.GroupId == input.Id).Select(w => w.Id).ToListAsync();
|
||||
if (taskIds.Count == 0) return false;
|
||||
|
||||
return await answerRepository.Updateable()
|
||||
.SetColumns(s => s.KeywordAnalysis, input.KeywordAnalysis)
|
||||
.Where(a => taskIds.Contains(a.JournalPageTaskId))
|
||||
.ExecuteCommandAsync() > 0;
|
||||
}
|
||||
|
||||
public async Task<JournalPageTaskOutput> DetailAsync(long id)
|
||||
{
|
||||
var data = await base.Queryable()
|
||||
.InnerJoin<JournalPageTaskAnswer>((w, a) => a.JournalPageTaskId == w.Id)
|
||||
.Where((w, a) => w.Id == id)
|
||||
.Select((w, a) => new JournalPageTaskOutput()
|
||||
{
|
||||
Id = w.Id,
|
||||
JournalId = w.JournalId,
|
||||
JournalPageId = w.JournalPageId,
|
||||
No = w.No,
|
||||
Type = (TaskBankTypeEnum)w.Type,
|
||||
Task = w.Task,
|
||||
Options = w.Options,
|
||||
Answer = a.Answer,
|
||||
Analysis = a.Analysis,
|
||||
Score = a.Score,
|
||||
AnswerTime = a.AnswerTime,
|
||||
KeywordAnalysis = a.KeywordAnalysis
|
||||
}, true).FirstAsync();
|
||||
return data;
|
||||
var task = await base.Queryable().Where(w => w.Id == id).FirstAsync();
|
||||
if (task == null) return null;
|
||||
|
||||
var data = new JournalPageTaskOutput
|
||||
{
|
||||
Id = task.Id,
|
||||
JournalId = task.JournalId,
|
||||
JournalPageId = task.JournalPageId,
|
||||
No = task.No,
|
||||
Type = task.Type,
|
||||
Task = task.Task,
|
||||
Points = task.Points,
|
||||
GrowthPoint = task.GrowthPoint ?? 0,
|
||||
Comprehension = task.Comprehension,
|
||||
Judgment = task.Judgment,
|
||||
Expression = task.Expression,
|
||||
Persuasiveness = task.Persuasiveness,
|
||||
AnswerTime = task.AnswerTime,
|
||||
};
|
||||
|
||||
// 查询答案列表
|
||||
var answers = await answerRepository.Queryable()
|
||||
.Where(a => a.JournalPageTaskId == id)
|
||||
.ToListAsync();
|
||||
|
||||
data.Answers = answers.Select(a => new JournalTaskAnswerOutput
|
||||
{
|
||||
Id = a.Id,
|
||||
Answer = a.Answer,
|
||||
AnswerUrl = a.AnswerUrL
|
||||
}).ToList();
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
public async Task<bool> DeleteAsync(long id)
|
||||
|
||||
Reference in New Issue
Block a user