tangweijie 535b7be802 fix(questionnaire): 修复问卷模块前端多个问题
- 修复 AgentFillDialog.vue 的 optionIds 类型问题
- 修复 AnswerDetailDialog.vue 多选题答案显示问题
- 修复 QuestionnaireFillDialog.vue 多选题 optionIds 提交问题
- 优化代码类型定义,修复 linter 错误

Closes #questionnaire-fixes
2026-02-04 18:29:46 +08:00

241 lines
6.6 KiB
TypeScript

import request from '@/config/axios'
/** 问卷任务信息 */
export interface QuestionnaireTask {
id?: number
taskName: string
questionnaireId: number
questionnaireName?: string
targetType: number // 1-指定犯人 2-指定监区 3-全部犯人
areaId?: number
areaName?: string
prisonerIds?: string
startTime?: string
deadline: string
status: number // 1-草稿 2-进行中 3-已结束 4-已取消
totalCount?: number
completedCount?: number
pendingCount?: number
completionRate?: string | number
remark?: string
createTime?: string
updateTime?: string
}
/** 问卷任务分页参数 */
export interface QuestionnaireTaskPageParams {
pageNo: number
pageSize: number
taskName?: string
questionnaireId?: number
status?: number
targetType?: number
createTime?: string[]
}
/** 问卷任务创建参数 */
export interface QuestionnaireTaskCreateParams {
taskName: string
questionnaireId: number
targetType: number
prisonerIds?: number[]
areaId?: number
startTime?: string
deadline: string
remark?: string
}
/** 问卷任务更新参数 */
export interface QuestionnaireTaskUpdateParams {
id: number
taskName?: string
deadline?: string
remark?: string
}
/** 任务进度详情 */
export interface TaskProgress {
taskId: number
taskName: string
questionnaireName: string
status: number
startTime?: string
deadline: string
totalCount: number
completedCount: number
pendingCount: number
completionRate: string | number
statusBreakdown: {
pending: number
inProgress: number
completed: number
expired: number
cancelled: number
}
}
/** 按监区统计 */
export interface TaskAreaStatistics {
areaId?: number
areaName?: string
totalCount: number
completedCount: number
completionRate: string | number
avgScore: string | number
passRate: string | number
riskDistribution: {
highRisk: number
mediumRisk: number
lowRisk: number
}
}
/** 按监区统计 */
export interface TaskAreaStatistics {
areaId?: number
areaName?: string
totalCount: number
completedCount: number
completionRate: string | number
avgScore: string | number
passRate: string | number
riskDistribution: {
highRisk: number
mediumRisk: number
lowRisk: number
}
}
/** 人员填写进度 */
export interface PrisonerProgress {
questionnaireId: number
questionnaireName?: string
id: number
prisonerId: number
prisonerNo: string
prisonerName: string
areaId?: number
areaName?: string
status: number
objectiveScore?: number
subjectiveScore?: number
totalScore?: number
riskLevel?: number
duration?: number
startTime?: string
finishTime?: string
}
/** 统计汇总 */
export interface TaskStatisticsSummary {
taskCount: number
totalPrisoners: number
totalCompleted: number
totalPending: number
overallCompletionRate: string | number
}
// 问卷任务 API
export const QuestionnaireTaskApi = {
// 查询问卷任务分页
getQuestionnaireTaskPage: async (params: QuestionnaireTaskPageParams) => {
return await request.get({ url: `/prison/questionnaire-task/page`, params })
},
// 查询问卷任务详情
getQuestionnaireTask: async (id: number) => {
return await request.get({ url: `/prison/questionnaire-task/get`, params: { id } })
},
// 新增问卷任务
createQuestionnaireTask: async (data: QuestionnaireTaskCreateParams) => {
return await request.post({ url: `/prison/questionnaire-task/create`, data })
},
// 修改问卷任务
updateQuestionnaireTask: async (data: QuestionnaireTaskUpdateParams) => {
return await request.put({ url: `/prison/questionnaire-task/update`, data })
},
// 删除问卷任务
deleteQuestionnaireTask: async (id: number) => {
return await request.delete({ url: `/prison/questionnaire-task/delete`, params: { id } })
},
// 批量删除问卷任务
deleteQuestionnaireTaskList: async (ids: number[]) => {
return await request.delete({ url: `/prison/questionnaire-task/delete-list`, params: { ids: ids.join(',') } })
},
// 导出问卷任务 Excel
exportQuestionnaireTask: async (params: QuestionnaireTaskPageParams) => {
return await request.download({ url: `/prison/questionnaire-task/export-excel`, params })
},
// ==================== 任务执行相关 ====================
// 取消任务
cancelTask: async (id: number) => {
return await request.post({ url: `/prison/questionnaire-task/cancel`, params: { id } })
},
// 结束任务
finishTask: async (id: number) => {
return await request.post({ url: `/prison/questionnaire-task/finish`, params: { id } })
},
// 重新开始任务
restartTask: async (id: number) => {
return await request.post({ url: `/prison/questionnaire-task/restart`, params: { id } })
},
// ==================== 进度跟踪相关 ====================
// 获取任务进度
getTaskProgress: async (id: number) => {
return await request.get<TaskProgress>({ url: `/prison/questionnaire-task/progress`, params: { id } })
},
// 获取任务未完成人员
getPendingPrisoners: async (id: number, params: any) => {
return await request.get({ url: `/prison/questionnaire-task/pending-prisoners`, params: { id, ...params } })
},
// 提醒未完成人员
remindPendingPrisoners: async (id: number) => {
return await request.post({ url: `/prison/questionnaire-task/remind`, params: { id } })
},
// 获取任务的人员填写进度列表
getPrisonerProgress: async (id: number) => {
return await request.get<PrisonerProgress[]>({ url: `/prison/questionnaire-task/prisoner-progress`, params: { id } })
},
// 通知单个人员
notifyPrisoner: async (recordId: number) => {
return await request.post({ url: `/prison/questionnaire-task/notify-prisoner`, params: { recordId } })
},
// 重置人员答题记录
resetPrisonerRecord: async (recordId: number) => {
return await request.post({ url: `/prison/questionnaire-task/reset-record`, params: { recordId } })
},
// ==================== 统计相关 ====================
// 按监区统计任务完成情况
getTaskAreaStatistics: async (id: number) => {
return await request.get<TaskAreaStatistics[]>({ url: `/prison/questionnaire-task/area-statistics`, params: { id } })
},
// 获取全局任务统计汇总
getStatisticsSummary: async () => {
return await request.get<TaskStatisticsSummary>({ url: `/prison/questionnaire-task/statistics-summary` })
},
// 按监区对比分析
compareAreasByQuestionnaire: async (questionnaireId?: number, areaIds?: number[]) => {
return await request.get({ url: `/prison/questionnaire-task/area-comparison`, params: { questionnaireId, areaIds } })
}
}