tangweijie 934f2935ac feat: 更新前端 API 接口和评估报告组件
- AreaApi 完善查询方法
- CellApi 新增获取列表方法
- ConsumptionApi 优化查询参数
- QuestionnaireApi 调整接口结构
- QuestionnaireRecordApi 完善类型定义
- RiskAssessmentApi 优化接口参数
- ReportDetailDialog 修复样式问题

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-19 23:14:40 +08:00

202 lines
7.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import request from '@/config/axios'
// ========== 风险等级枚举 ==========
export enum RiskLevelEnum {
LOW = 1, // 低风险
MEDIUM = 2, // 中风险
HIGH = 3, // 高风险
EXTREME = 4 // 极高风险
}
// ========== 问卷答题记录/测评记录类型 ==========
/** 问卷答题记录/测评记录信息 */
export interface QuestionnaireRecord {
id?: number // 记录ID
questionnaireId?: number // 问卷ID
questionnaireName?: string // 问卷名称
prisonerId?: number // 罪犯ID
prisonerNo?: string // 罪犯编号
prisonerName?: string // 罪犯姓名
status?: number // 状态1-待测评 2-测评中 3-已完成 4-已过期 5-已取消
startTime?: string // 开始时间
endTime?: string // 结束时间
answerTime?: string // 答题时间
deadline?: string // 截止日期
objectiveScore?: number | string // 客观题得分后端为BigDecimal
subjectiveScore?: number | string // 主观题得分后端为BigDecimal
totalScore?: number | string // 总分后端为BigDecimal
passScore?: number | string // 及格分数后端为BigDecimal
passStatus?: number // 及格状态1-及格 2-不及格 3-待评阅
riskLevel?: RiskLevelEnum // 风险等级1-低风险 2-中风险 3-高风险 4-极高风险
evaluatorId?: number // 评阅人ID
evaluatorName?: string // 评阅人姓名
evaluateTime?: string // 评阅时间
participantCount?: number // 参与人数
completedCount?: number // 完成人数
duration?: number // 答题用时(秒)
remark?: string // 备注
createTime?: string // 创建时间
}
/** 问卷答题记录分页参数 */
export interface QuestionnaireRecordPageParams {
pageNo: number
pageSize: number
questionnaireId?: number // 问卷ID
questionnaireName?: string // 问卷名称
prisonerId?: number // 罪犯ID
prisonerNo?: string // 罪犯编号
status?: number // 状态1-待测评 2-测评中 3-已完成 4-已过期 5-已取消
passStatus?: number // 及格状态1-及格 2-不及格 3-待评阅
riskLevel?: RiskLevelEnum // 风险等级
startTime?: string[] // 开始时间范围
endTime?: string[] // 结束时间范围
deadline?: string[] // 截止日期范围
createTime?: string[] // 创建时间范围
}
/** 发起测评请求 */
export interface AssessmentInitiateReq {
questionnaireId: number // 问卷模板ID
prisonerIds: number[] // 罪犯ID列表
deadline?: string // 截止日期
remark?: string // 备注
}
/** 答题详情项 */
export interface AnswerItem {
questionId: number // 问题ID
answer?: string // 答案
optionIds?: number[] // 选择的选项ID列表
}
/** 提交答卷请求 */
export interface AssessmentAnswerSubmitReq {
recordId: number // 测评记录ID
prisonerId: number // 罪犯ID
answers: AnswerItem[] // 答题详情列表
}
/** 人工评分请求 */
export interface AssessmentManualScoreReq {
recordId: number // 测评记录ID
subjectiveScore: number // 主观题得分
comment?: string // 评语
riskLevel?: RiskLevelEnum // 风险等级1-低风险 2-中风险 3-高风险 4-极高风险
}
/** 分数分布数据 */
export interface ScoreDistribution {
'0-20'?: number
'21-40'?: number
'41-60'?: number
'61-80'?: number
'81-100'?: number
}
/** 风险分布数据 */
export interface RiskDistribution {
extreme?: number // 极高风险
high?: number
medium?: number
low?: number
}
// ========== API 对象 ==========
export const QuestionnaireRecordApi = {
// ========== 基础 CRUD ==========
/** 查询问卷答题记录分页 */
getQuestionnaireRecordPage: async (params: QuestionnaireRecordPageParams) => {
return await request.get({ url: `/prison/questionnaire-record/page`, params })
},
/** 查询问卷答题记录详情 */
getQuestionnaireRecord: async (id: number) => {
return await request.get<QuestionnaireRecord>({ url: `/prison/questionnaire-record/get`, params: { id } })
},
/** 新增问卷答题记录 */
createQuestionnaireRecord: async (data: QuestionnaireRecord) => {
return await request.post<number>({ url: `/prison/questionnaire-record/create`, data })
},
/** 修改问卷答题记录 */
updateQuestionnaireRecord: async (data: QuestionnaireRecord) => {
return await request.put<boolean>({ url: `/prison/questionnaire-record/update`, data })
},
/** 删除问卷答题记录 */
deleteQuestionnaireRecord: async (id: number) => {
return await request.delete<boolean>({ url: `/prison/questionnaire-record/delete`, params: { id } })
},
/** 批量删除问卷答题记录 */
deleteQuestionnaireRecordList: async (ids: number[]) => {
return await request.post<boolean>({ url: `/prison/questionnaire-record/delete-list`, data: ids })
},
/** 导出问卷答题记录 Excel */
exportQuestionnaireRecord: async (params: QuestionnaireRecordPageParams) => {
return await request.download({ url: `/prison/questionnaire-record/export-excel`, params })
},
// ========== 测评执行相关 ==========
/** 发起测评 */
initiateAssessment: async (data: AssessmentInitiateReq) => {
return await request.post<number>({ url: `/prison/questionnaire-record/initiate`, data })
},
/** 开始测评 */
startAssessment: async (id: number, prisonerId: number) => {
return await request.post<boolean>({ url: `/prison/questionnaire-record/start`, params: { id, prisonerId } })
},
/** 提交答卷 */
submitAnswer: async (data: AssessmentAnswerSubmitReq) => {
return await request.post<boolean>({ url: `/prison/questionnaire-record/submit`, data })
},
/** 结束测评 */
finishAssessment: async (id: number) => {
return await request.post<boolean>({ url: `/prison/questionnaire-record/finish`, params: { id } })
},
/** 取消测评 */
cancelAssessment: async (id: number) => {
return await request.post<boolean>({ url: `/prison/questionnaire-record/cancel`, params: { id } })
},
// ========== 评分相关 ==========
/** 自动评分 */
autoScore: async (id: number) => {
return await request.post<boolean>({ url: `/prison/questionnaire-record/auto-score`, params: { id } })
},
/** 人工评分 */
manualScore: async (data: AssessmentManualScoreReq) => {
return await request.post<boolean>({ url: `/prison/questionnaire-record/manual-score`, data })
},
// ========== 统计相关 ==========
/** 获取完成率 */
getCompletionRate: async (assessmentRecordId: number) => {
return await request.get<number>({ url: `/prison/questionnaire-record/completion-rate`, params: { assessmentRecordId } })
},
/** 获取分数分布 */
getScoreDistribution: async (assessmentRecordId: number) => {
return await request.get<ScoreDistribution>({ url: `/prison/questionnaire-record/score-distribution`, params: { assessmentRecordId } })
},
/** 获取风险分布 */
getRiskDistribution: async (assessmentRecordId: number) => {
return await request.get<RiskDistribution>({ url: `/prison/questionnaire-record/risk-distribution`, params: { assessmentRecordId } })
}
}