- 修复 AgentFillDialog.vue 的 optionIds 类型问题 - 修复 AnswerDetailDialog.vue 多选题答案显示问题 - 修复 QuestionnaireFillDialog.vue 多选题 optionIds 提交问题 - 优化代码类型定义,修复 linter 错误 Closes #questionnaire-fixes
241 lines
6.6 KiB
TypeScript
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 } })
|
|
}
|
|
}
|