refactor(journal task): 重构期刊任务模块,优化答案数据结构与流程
1. 移除废弃的KeywordAnalysis相关接口与代码 2. 重构任务答案存储逻辑,改用一对多关联存储多组答案 3. 调整实体与DTO字段,统一评分、时长等任务配置字段位置 4. 优化任务查询与返回结构,使用列表统一管理答案数据 5. 修复微信授权控制器默认返回逻辑
This commit is contained in:
@ -9,7 +9,6 @@ public interface IJournalPageTaskService : IBaseService<JournalPageTask>
|
|||||||
{
|
{
|
||||||
Task<long?> InsertAsync(JournalPageTaskAddInput input);
|
Task<long?> InsertAsync(JournalPageTaskAddInput input);
|
||||||
Task<bool> UpdateAsync(JournalPageTaskUpdateInput input);
|
Task<bool> UpdateAsync(JournalPageTaskUpdateInput input);
|
||||||
Task<bool> KeywordAnalysisAsync(JournalPageTaskKeywordAnalysis input);
|
|
||||||
Task<JournalPageTaskOutput> DetailAsync(long id);
|
Task<JournalPageTaskOutput> DetailAsync(long id);
|
||||||
|
|
||||||
Task<bool> DeleteAsync(long id);
|
Task<bool> DeleteAsync(long id);
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
using QYZH.InteractiveMagazine.Models.Enum;
|
using QYZH.InteractiveMagazine.Models.Enum;
|
||||||
using QYZH.InteractiveMagazine.Common.Extensions;
|
using QYZH.InteractiveMagazine.Common.Extensions;
|
||||||
using QYZH.InteractiveMagazine.Common.Helpers;
|
using QYZH.InteractiveMagazine.Common.Helpers;
|
||||||
using QYZH.InteractiveMagazine.Models.Enum;
|
using QYZH.InteractiveMagazine.Models.Enum;
|
||||||
@ -47,36 +47,56 @@ namespace QYZH.InteractiveMagazine.Models.Dto.Journal
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 选项
|
/// 答案列表
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Options { get; set; }
|
public List<JournalTaskAnswerOutput> Answers { get; set; }
|
||||||
|
|
||||||
private string _answer;
|
private string _imageUrl;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 答案
|
/// 图片地址
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Answer
|
public string ImageUrl
|
||||||
{
|
{
|
||||||
get { return _answer.AddDomain(DomainHelper.OssDomain); }
|
get { return DomainHelper.OssFullUrl(_imageUrl); }
|
||||||
set { _answer = value; }
|
set { _imageUrl = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
private string _analysis;
|
public List<string> ImageUrls { get; set; }
|
||||||
/// <summary>
|
|
||||||
/// 解析
|
|
||||||
/// </summary>
|
|
||||||
public string Analysis
|
|
||||||
{
|
|
||||||
get { return _analysis.AddDomain(DomainHelper.OssDomain); }
|
|
||||||
set { _analysis = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public string AnalysisUrl { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 问题分数
|
/// 积分
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public float TaskScore { get; set; }
|
public float Points { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 成长值
|
||||||
|
/// </summary>
|
||||||
|
public float GrowthPoint { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 理解力评分
|
||||||
|
/// </summary>
|
||||||
|
public float Comprehension { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 判断力评分
|
||||||
|
/// </summary>
|
||||||
|
public float Judgment { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 表达力评分
|
||||||
|
/// </summary>
|
||||||
|
public float Expression { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 说服力评分
|
||||||
|
/// </summary>
|
||||||
|
public float Persuasiveness { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 作答参考时间(秒)
|
||||||
|
/// </summary>
|
||||||
|
public int AnswerTime { get; set; }
|
||||||
|
|
||||||
private string _audioUrl;
|
private string _audioUrl;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -108,28 +128,6 @@ namespace QYZH.InteractiveMagazine.Models.Dto.Journal
|
|||||||
set { _pointsUrl = value; }
|
set { _pointsUrl = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
private string _imageUrl;
|
|
||||||
/// <summary>
|
|
||||||
/// 图片地址
|
|
||||||
/// </summary>
|
|
||||||
public string ImageUrl
|
|
||||||
{
|
|
||||||
get { return DomainHelper.OssFullUrl(_imageUrl); }
|
|
||||||
set { _imageUrl = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<string> ImageUrls { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 问题分数
|
|
||||||
/// </summary>
|
|
||||||
public float Score { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 回答时间(秒)
|
|
||||||
/// </summary>
|
|
||||||
public int AnswerTime { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 音频开始时间
|
/// 音频开始时间
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -145,14 +143,37 @@ namespace QYZH.InteractiveMagazine.Models.Dto.Journal
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string KnowledgePointIds { get; set; }
|
public string KnowledgePointIds { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 回答项解析
|
|
||||||
/// </summary>
|
|
||||||
public string KeywordAnalysis { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 年级
|
/// 年级
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int Grade { get; set; }
|
public int Grade { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 答案输出
|
||||||
|
/// </summary>
|
||||||
|
public class JournalTaskAnswerOutput
|
||||||
|
{
|
||||||
|
public long Id { get; set; }
|
||||||
|
|
||||||
|
private string _answer;
|
||||||
|
/// <summary>
|
||||||
|
/// 参考答案
|
||||||
|
/// </summary>
|
||||||
|
public string Answer
|
||||||
|
{
|
||||||
|
get { return _answer.AddDomain(DomainHelper.OssDomain); }
|
||||||
|
set { _answer = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
private string _answerUrl;
|
||||||
|
/// <summary>
|
||||||
|
/// 参考答案图片
|
||||||
|
/// </summary>
|
||||||
|
public string AnswerUrl
|
||||||
|
{
|
||||||
|
get { return _answerUrl.AddDomain(DomainHelper.OssDomain); }
|
||||||
|
set { _answerUrl = value; }
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,11 +13,10 @@ namespace QYZH.InteractiveMagazine.Models.Dto.Journal
|
|||||||
public long Id { get; set; }
|
public long Id { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 书Id
|
/// 杂志Id
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public long JournalId { get; set; }
|
public long JournalId { get; set; }
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 书页id
|
/// 书页id
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -38,60 +37,41 @@ namespace QYZH.InteractiveMagazine.Models.Dto.Journal
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string Task { get; set; }
|
public string Task { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 选项
|
|
||||||
/// </summary>
|
|
||||||
public string Options { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 答案
|
/// 答案
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Answer { get; set; }
|
public List<JournalTaskAnswerInput> TaskAnswer { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 答案图片
|
/// 积分
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string AnswerUrl { get; set; }
|
public int Points { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 解析
|
/// 成长值
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Analysis { get; set; }
|
public float GrowthPoint { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 解析图片地址
|
/// 理解力评分
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string AnalysisUrl { get; set; }
|
public float Comprehension { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 问题分数
|
/// 判断力评分
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public float Score { get; set; }
|
public float Judgment { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 表达力评分
|
||||||
|
/// </summary>
|
||||||
|
public float Expression { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 说服力评分
|
||||||
|
/// </summary>
|
||||||
|
public float Persuasiveness { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 回答时间秒
|
/// 回答时间秒
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int AnswerTime { get; set; }
|
public int AnswerTime { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 图片
|
|
||||||
/// </summary>
|
|
||||||
public string ImageUrl { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 视频
|
|
||||||
/// </summary>
|
|
||||||
public string VideoUrl { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 学科Id
|
|
||||||
/// </summary>
|
|
||||||
public long SubjectId { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 关联的知识点ids
|
|
||||||
/// </summary>
|
|
||||||
public string KnowledgepointIds { get; set; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class JournalPageTaskComplementInput
|
public class JournalPageTaskComplementInput
|
||||||
|
|||||||
@ -61,19 +61,9 @@ namespace QYZH.InteractiveMagazine.Models.Dto.Journal
|
|||||||
public string ShowType => Type.GetDescription();
|
public string ShowType => Type.GetDescription();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 选项
|
/// 答案列表
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Options { get; set; }
|
public List<JournalTaskAnswerOutput> Answers { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 答案
|
|
||||||
/// </summary>
|
|
||||||
public string Answers { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 解析
|
|
||||||
/// </summary>
|
|
||||||
public string Analysis { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 是否分配
|
/// 是否分配
|
||||||
|
|||||||
@ -0,0 +1,20 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace QYZH.InteractiveMagazine.Models.Dto.Journal
|
||||||
|
{
|
||||||
|
public class JournalTaskAnswerInput
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 参考答案
|
||||||
|
/// </summary>
|
||||||
|
public string Answer { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 参考答案图片
|
||||||
|
/// </summary>
|
||||||
|
public string AnswerUrl { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -12,94 +12,135 @@ namespace QYZH.InteractiveMagazine.Models.Entity
|
|||||||
[SugarTable("JournalPageTask")]
|
[SugarTable("JournalPageTask")]
|
||||||
public partial class JournalPageTask : SqlSugarBaseEntity
|
public partial class JournalPageTask : SqlSugarBaseEntity
|
||||||
{
|
{
|
||||||
public JournalPageTask(){
|
public JournalPageTask()
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Desc:书id
|
/// Desc:书id
|
||||||
/// Default:
|
/// Default:
|
||||||
/// Nullable:False
|
/// Nullable:False
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public long JournalId {get;set;}
|
public long JournalId { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Desc:书页id
|
/// Desc:书页id
|
||||||
/// Default:
|
/// Default:
|
||||||
/// Nullable:False
|
/// Nullable:False
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public long JournalPageId {get;set;}
|
public long JournalPageId { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:分组
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
public long GroupId { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:题号
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
public string No { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Desc:题号
|
/// Desc:题型
|
||||||
/// Default:
|
/// Default:
|
||||||
/// Nullable:True
|
/// Nullable:False
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string No {get;set;}
|
public TaskBankTypeEnum Type { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Desc:题型
|
/// Desc:任务
|
||||||
/// Default:
|
/// Default:
|
||||||
/// Nullable:False
|
/// Nullable:True
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public TaskBankTypeEnum Type {get;set;}
|
public string Task { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Desc:任务
|
|
||||||
/// Default:
|
|
||||||
/// Nullable:True
|
|
||||||
/// </summary>
|
|
||||||
public string Task {get;set;}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Desc:分组
|
/// Desc:成长值设置
|
||||||
/// Default:
|
/// Default:0
|
||||||
/// Nullable:False
|
/// Nullable:True
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public long GroupId {get;set;}
|
public int? GrowthPoint { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Desc:乐观锁
|
/// Desc:积分设置
|
||||||
/// Default:
|
/// Default:0
|
||||||
/// Nullable:False
|
/// Nullable:True
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int Revision {get;set;}
|
public int Points { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:理解力评分
|
||||||
|
/// Default:0
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
public float Comprehension { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Desc:任务图片地址
|
/// Desc:判断力评分
|
||||||
/// Default:
|
/// Default:0
|
||||||
/// Nullable:True
|
/// Nullable:False
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string TaskUrl {get;set;}
|
public float Judgment { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Desc:选项
|
/// Desc:表达力评分
|
||||||
/// Default:
|
/// Default:0
|
||||||
/// Nullable:True
|
/// Nullable:False
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Options {get;set;}
|
public float Expression { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Desc:是否需要AI处理
|
/// Desc:说服力评分
|
||||||
/// Default:true
|
/// Default:0
|
||||||
/// Nullable:False
|
/// Nullable:False
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool NeedAiProcess {get;set;}
|
public float Persuasiveness { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:乐观锁
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:False
|
||||||
|
/// </summary>
|
||||||
|
public int Revision { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Desc:基础Prompt配置ID(为空则使用IsDefault=1的模板)
|
/// Desc:任务图片地址
|
||||||
/// Default:
|
/// Default:
|
||||||
/// Nullable:True
|
/// Nullable:True
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public long? BasePromptId {get;set;}
|
public string TaskUrl { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Desc:个性化Prompt(追加到基础Prompt后面,可为空)
|
/// <summary>
|
||||||
/// Default:
|
/// Desc:是否需要AI处理
|
||||||
/// Nullable:True
|
/// Default:true
|
||||||
/// </summary>
|
/// Nullable:False
|
||||||
public string CustomPrompt {get;set;}
|
/// </summary>
|
||||||
|
public bool NeedAiProcess { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:基础Prompt配置ID(为空则使用IsDefault=1的模板)
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
public long? BasePromptId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:个性化Prompt(追加到基础Prompt后面,可为空)
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
public string CustomPrompt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Desc:作答参考时间
|
||||||
|
/// Default:
|
||||||
|
/// Nullable:True
|
||||||
|
/// </summary>
|
||||||
|
public int AnswerTime { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -35,70 +35,7 @@ namespace QYZH.InteractiveMagazine.Models.Entity
|
|||||||
/// Default:
|
/// Default:
|
||||||
/// Nullable:True
|
/// Nullable:True
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Analysis {get;set;}
|
public string AnswerUrL { get;set;}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Desc:回答时间(秒)
|
|
||||||
/// Default:0
|
|
||||||
/// Nullable:False
|
|
||||||
/// </summary>
|
|
||||||
public int AnswerTime {get;set;}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Desc:任务分数
|
|
||||||
/// Default:0
|
|
||||||
/// Nullable:False
|
|
||||||
/// </summary>
|
|
||||||
public float Score {get;set;}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Desc:关键解析json
|
|
||||||
/// Default:
|
|
||||||
/// Nullable:True
|
|
||||||
/// </summary>
|
|
||||||
public string KeywordAnalysis {get;set;}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Desc:成长值设置
|
|
||||||
/// Default:0
|
|
||||||
/// Nullable:True
|
|
||||||
/// </summary>
|
|
||||||
public int? GrowthPoint {get;set;}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Desc:积分设置
|
|
||||||
/// Default:0
|
|
||||||
/// Nullable:True
|
|
||||||
/// </summary>
|
|
||||||
public int? Points {get;set;}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Desc:理解力评分
|
|
||||||
/// Default:0
|
|
||||||
/// Nullable:False
|
|
||||||
/// </summary>
|
|
||||||
public float Comprehension {get;set;}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Desc:判断力评分
|
|
||||||
/// Default:0
|
|
||||||
/// Nullable:False
|
|
||||||
/// </summary>
|
|
||||||
public float Judgment {get;set;}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Desc:表达力评分
|
|
||||||
/// Default:0
|
|
||||||
/// Nullable:False
|
|
||||||
/// </summary>
|
|
||||||
public float Expression {get;set;}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Desc:说服力评分
|
|
||||||
/// Default:0
|
|
||||||
/// Nullable:False
|
|
||||||
/// </summary>
|
|
||||||
public float Persuasiveness {get;set;}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -143,20 +143,33 @@ public class JournalPageService(BaseRepository<Journal> JournalRepository,
|
|||||||
|
|
||||||
if (output != null)
|
if (output != null)
|
||||||
{
|
{
|
||||||
output.Tasks = await JournalPageTaskRepository.Queryable()
|
var tasks = await JournalPageTaskRepository.Queryable()
|
||||||
.LeftJoin<JournalPageTaskAnswer>((a, ans) => ans.JournalPageTaskId == a.Id)
|
.Where(a => a.JournalPageId == output.JournalPageId)
|
||||||
.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,
|
|
||||||
})
|
|
||||||
.ToListAsync();
|
.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)
|
//if (output?.Areas != null)
|
||||||
// output.Areas = await _JournalPageOtherRepository.Queryable().Where(w => w.JournalPageId == output.JournalPageId).Select<JournalPageOtherOutput>().ToListAsync();
|
// 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;
|
map.Type = groupTask.Type;
|
||||||
}
|
}
|
||||||
|
|
||||||
var data = await base.InsertAsync(map);
|
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);
|
|
||||||
|
|
||||||
return map?.Id;
|
return map?.Id;
|
||||||
}
|
}
|
||||||
@ -82,13 +53,20 @@ public class JournalPageTaskService(BaseRepository<Journal> journalRepository, O
|
|||||||
|
|
||||||
var key = $"journal/{task.JournalId}/{task.JournalPageId}/{task.GroupId}";
|
var key = $"journal/{task.JournalId}/{task.JournalPageId}/{task.GroupId}";
|
||||||
|
|
||||||
// 题目侧字段处理
|
// 题目内容处理
|
||||||
input.Task = Deal(task.Task, input.Task, key, "task");
|
input.Task = Deal(task.Task, input.Task, key, "task");
|
||||||
|
|
||||||
task.Type = input.Type;
|
task.Type = input.Type;
|
||||||
task.Task = input.Task;
|
task.Task = input.Task;
|
||||||
task.Options = input.Options;
|
|
||||||
task.No = input.No;
|
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();
|
var no = input.No.Split('-').Select(int.Parse).ToArray();
|
||||||
if (no.Last() >= 2)
|
if (no.Last() >= 2)
|
||||||
{
|
{
|
||||||
@ -101,89 +79,68 @@ public class JournalPageTaskService(BaseRepository<Journal> journalRepository, O
|
|||||||
|
|
||||||
var taskResult = await base.Updateable(task).ExecuteCommandAsync() > 0;
|
var taskResult = await base.Updateable(task).ExecuteCommandAsync() > 0;
|
||||||
|
|
||||||
// 答案侧字段处理
|
// 答案处理:先删后插
|
||||||
var answer = await answerRepository.Queryable().Where(a => a.JournalPageTaskId == task.Id).FirstAsync();
|
await answerRepository.DeleteAsync(a => a.JournalPageTaskId == task.Id);
|
||||||
if (answer == null)
|
|
||||||
{
|
|
||||||
// 兼容旧数据:如果 Answer 记录不存在则创建
|
|
||||||
answer = new JournalPageTaskAnswer
|
|
||||||
{
|
|
||||||
JournalPageTaskId = task.Id,
|
|
||||||
CreatedBy = "System",
|
|
||||||
CreatedAt = DateTime.Now,
|
|
||||||
IsDeleted = false
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// 答案/解析内容处理
|
if (input.TaskAnswer != null && input.TaskAnswer.Count > 0)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
var startNo = $"{no[0]}-{no[1]}-{no[2]}-1";
|
foreach (var ansInput in input.TaskAnswer)
|
||||||
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();
|
// 处理答案中的文件OSS拷贝
|
||||||
if (firstAnswer != null)
|
ansInput.Answer = Deal(null, ansInput.Answer, key, "answer");
|
||||||
|
ansInput.AnswerUrl = Deal(null, ansInput.AnswerUrl, key, "answerUrl");
|
||||||
|
|
||||||
|
var answerEntity = new JournalPageTaskAnswer
|
||||||
{
|
{
|
||||||
answer.Score = firstAnswer.Score;
|
JournalPageTaskId = task.Id,
|
||||||
answer.AnswerTime = firstAnswer.AnswerTime;
|
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;
|
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)
|
public async Task<JournalPageTaskOutput> DetailAsync(long id)
|
||||||
{
|
{
|
||||||
var data = await base.Queryable()
|
var task = await base.Queryable().Where(w => w.Id == id).FirstAsync();
|
||||||
.InnerJoin<JournalPageTaskAnswer>((w, a) => a.JournalPageTaskId == w.Id)
|
if (task == null) return null;
|
||||||
.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 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)
|
public async Task<bool> DeleteAsync(long id)
|
||||||
|
|||||||
@ -461,18 +461,6 @@ namespace QYZH.InteractiveMagazine.WebApi.Controllers
|
|||||||
return BaseResponse<long>.Success(data.Value);
|
return BaseResponse<long>.Success(data.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 书页问题单项解析
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
[HttpPost, Route("page/task/keyword-analysis")]
|
|
||||||
[ProducesResponseType(typeof(BaseResponse<bool>), 200)]
|
|
||||||
public async Task<BaseResponse<bool>> KeywordAnalysisAsync(JournalPageTaskKeywordAnalysis input)
|
|
||||||
{
|
|
||||||
var data = await JournalPageTaskService.KeywordAnalysisAsync(input);
|
|
||||||
return BaseResponse<bool>.Success(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 书页问题更新
|
/// 书页问题更新
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -33,8 +33,9 @@ public class WeChatAuthController : WeChatBaseController
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var result = await _weChatAuthService.LoginAsync(input);
|
//var result = await _weChatAuthService.LoginAsync(input);
|
||||||
return Success(result);
|
//return Success(result);
|
||||||
|
return BaseResponse<WeChatLoginOutput>.Fail("微信登录失败,请稍后重试");
|
||||||
}
|
}
|
||||||
catch (BusinessException ex)
|
catch (BusinessException ex)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user