From 2115e4aa522388cd72eb3b6d8bce595b1673b1c4 Mon Sep 17 00:00:00 2001 From: tangweijie <877588133@qq.com> Date: Thu, 15 Jan 2026 22:36:24 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=89=8D=E7=AB=AF=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E8=AF=84=E4=BC=B0=E6=A8=A1=E5=9D=97=E4=B8=BA=E7=AD=94?= =?UTF-8?q?=E9=A2=98=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 主要变更: - 删除 assessment 模块前端代码 - 消费记录模块表单和列表优化 - 问卷答题记录模块扩展测评执行和统计功能 - 更新字典配置 Co-Authored-By: Claude --- src/api/prison/answer/index.ts | 73 ++++ src/api/prison/consumption/index.ts | 80 +++-- src/api/prison/questionnairerecord/index.ts | 158 ++++++++- src/api/prison/riskassessment/index.ts | 51 +-- src/api/prison/score/index.ts | 46 ++- src/utils/dict.ts | 5 +- src/views/prison/cell/index.vue | 10 +- .../consumption/ConsumptionDetailDialog.vue | 47 +++ .../prison/consumption/ConsumptionForm.vue | 251 +++++++++----- src/views/prison/consumption/index.vue | 53 +-- .../InitiateAssessmentDialog.vue | 167 ++++++++++ .../questionnairerecord/ManualScoreDialog.vue | 113 +++++++ .../prison/questionnairerecord/index.vue | 315 +++++++++++------- src/views/prison/riskassessment/index.vue | 9 +- src/views/prison/score/index.vue | 9 +- 15 files changed, 1056 insertions(+), 331 deletions(-) create mode 100644 src/api/prison/answer/index.ts create mode 100644 src/views/prison/consumption/ConsumptionDetailDialog.vue create mode 100644 src/views/prison/questionnairerecord/InitiateAssessmentDialog.vue create mode 100644 src/views/prison/questionnairerecord/ManualScoreDialog.vue diff --git a/src/api/prison/answer/index.ts b/src/api/prison/answer/index.ts new file mode 100644 index 00000000..42a49959 --- /dev/null +++ b/src/api/prison/answer/index.ts @@ -0,0 +1,73 @@ +import request from '@/config/axios' + +/** 答题记录信息 */ +export interface Answer { + id?: number // 记录ID + assessmentRecordId?: number // 测评记录ID + questionId?: number // 问题ID + questionnaireId?: number // 问卷ID + prisonerId?: number // 罪犯ID + questionType?: number // 问题类型:1-单选 2-多选 3-填空 4-评分 5-日期 6-数字 + answerText?: string // 答案内容 + optionIds?: string // 选项ID列表 + score?: number // 得分 + isCorrect?: boolean // 是否正确 + duration?: number // 答题用时(秒) + creator?: string // 创建者 + createTime?: string // 创建时间 +} + +/** 答题记录分页参数 */ +export interface AnswerPageParams { + pageNo: number + pageSize: number + assessmentRecordId?: number + questionId?: number + questionnaireId?: number + prisonerId?: number + questionType?: number + createTime?: string[] +} + +// 答题记录 API +export const AnswerApi = { + // 查询答题记录分页 + getAnswerPage: async (params: AnswerPageParams) => { + return await request.get({ url: `/prison/answer/page`, params }) + }, + + // 查询答题记录详情 + getAnswer: async (id: number) => { + return await request.get({ url: `/prison/answer/get`, params: { id } }) + }, + + // 新增答题记录 + createAnswer: async (data: Answer) => { + return await request.post({ url: `/prison/answer/create`, data }) + }, + + // 修改答题记录 + updateAnswer: async (data: Answer) => { + return await request.put({ url: `/prison/answer/update`, data }) + }, + + // 删除答题记录 + deleteAnswer: async (id: number) => { + return await request.delete({ url: `/prison/answer/delete`, params: { id } }) + }, + + /** 批量删除答题记录 */ + deleteAnswerList: async (ids: number[]) => { + return await request.post({ url: `/prison/answer/delete-list`, data: ids }) + }, + + // 根据测评记录ID查询答题列表 + getAnswersByAssessmentRecordId: async (assessmentRecordId: number) => { + return await request.get({ url: `/prison/answer/list-by-assessment-record`, params: { assessmentRecordId } }) + }, + + // 导出答题记录 Excel + exportAnswer: async (params: AnswerPageParams) => { + return await request.download({ url: `/prison/answer/export-excel`, params }) + } +} diff --git a/src/api/prison/consumption/index.ts b/src/api/prison/consumption/index.ts index f3e3885b..3ddd2d0a 100644 --- a/src/api/prison/consumption/index.ts +++ b/src/api/prison/consumption/index.ts @@ -1,56 +1,80 @@ import request from '@/config/axios' -import type { Dayjs } from 'dayjs'; -/** 消费记录信息 */ +/** 消费订单分页参数 */ +export interface ConsumptionPageParams { + pageNo: number + pageSize: number + prisonerNo?: string + type?: number + status?: number + totalAmount?: number + orderNo?: string +} + +/** 消费明细信息 */ +export interface ConsumptionDetail { + id?: number // 明细ID + goodsName: string // 商品名称 + goodsCode?: string // 商品编码 + goodsPrice: number // 商品单价 + goodsCount: number // 商品数量 + subtotal?: number // 小计金额 +} + +/** 消费订单信息 */ export interface Consumption { - id: number; // 记录ID - prisonerId?: number; // 罪犯ID - prisonerNo?: string; // 罪犯编号 - type?: number; // 类型:1-存款 2-消费 3-转账 - amount?: number; // 金额 - balance: number; // 账户余额 - goodsName: string; // 商品名称 - goodsCount: number; // 商品数量 - orderNo: string; // 订单号 - tradeTime?: string | Dayjs; // 交易时间 - status?: number; // 状态:1-成功 2-失败 - remark: string; // 备注 - } + id: number // 订单ID + prisonerId?: number // 罪犯ID + prisonerNo?: string // 罪犯编号 + orderNo?: string // 订单号 + type?: number // 类型:1-购物 2-餐饮 3-医疗 4-通讯 5-其他 + totalAmount?: number // 订单总金额 + balance: number // 账户余额 + tradeTime?: string // 交易时间 + status?: number // 状态:1-成功 2-失败 + remark: string // 备注 + details?: ConsumptionDetail[] // 消费明细列表 +} -// 消费记录 API +// 消费订单 API export const ConsumptionApi = { - // 查询消费记录分页 - getConsumptionPage: async (params: any) => { + // 查询消费订单分页 + getConsumptionPage: async (params: ConsumptionPageParams) => { return await request.get({ url: `/prison/consumption/page`, params }) }, - // 查询消费记录详情 + // 查询消费订单详情 getConsumption: async (id: number) => { - return await request.get({ url: `/prison/consumption/get?id=` + id }) + return await request.get({ url: `/prison/consumption/get`, params: { id } }) }, - // 新增消费记录 + // 新增消费订单 createConsumption: async (data: Consumption) => { return await request.post({ url: `/prison/consumption/create`, data }) }, - // 修改消费记录 + // 修改消费订单 updateConsumption: async (data: Consumption) => { return await request.put({ url: `/prison/consumption/update`, data }) }, - // 删除消费记录 + // 删除消费订单 deleteConsumption: async (id: number) => { - return await request.delete({ url: `/prison/consumption/delete?id=` + id }) + return await request.delete({ url: `/prison/consumption/delete`, params: { id } }) }, - /** 批量删除消费记录 */ + /** 批量删除消费订单 */ deleteConsumptionList: async (ids: number[]) => { return await request.delete({ url: `/prison/consumption/delete-list?ids=${ids.join(',')}` }) }, - // 导出消费记录 Excel - exportConsumption: async (params) => { + // 查询消费明细列表 + getConsumptionDetailList: async (consumptionId: number) => { + return await request.get({ url: `/prison/consumption/detail-list`, params: { consumptionId } }) + }, + + // 导出消费订单 Excel + exportConsumption: async (params: ConsumptionPageParams) => { return await request.download({ url: `/prison/consumption/export-excel`, params }) } -} \ No newline at end of file +} diff --git a/src/api/prison/questionnairerecord/index.ts b/src/api/prison/questionnairerecord/index.ts index 109ffc8d..b69b2e85 100644 --- a/src/api/prison/questionnairerecord/index.ts +++ b/src/api/prison/questionnairerecord/index.ts @@ -1,15 +1,32 @@ import request from '@/config/axios' -/** 问卷答题记录信息 */ +// ========== 问卷答题记录/测评记录类型 ========== + +/** 问卷答题记录/测评记录信息 */ export interface QuestionnaireRecord { - id?: number // 记录ID(创建时不需要) + id?: number // 记录ID questionnaireId?: number // 问卷ID + questionnaireName?: string // 问卷名称 prisonerId?: number // 罪犯ID prisonerNo?: string // 罪犯编号 - totalScore?: number // 得分 - passStatus?: number // 是否及格:0-未及格 1-及格 - answerTime?: string // 答题时间 - status?: number // 状态:1-待评估 2-已完成 + prisonerName?: string // 罪犯姓名 + status?: number // 状态:1-待测评 2-测评中 3-已完成 4-已过期 5-已取消 + startTime?: string // 开始时间 + endTime?: string // 结束时间 + deadline?: string // 截止日期 + objectiveScore?: number // 客观题得分 + subjectiveScore?: number // 主观题得分 + totalScore?: number // 总分 + passScore?: number // 及格分数 + passStatus?: number // 及格状态:1-及格 2-不及格 3-待评阅 + riskLevel?: number // 风险等级:1-高风险 2-中风险 3-低风险 + evaluatorId?: number // 评阅人ID + evaluatorName?: string // 评阅人姓名 + evaluateTime?: string // 评阅时间 + participantCount?: number // 参与人数 + completedCount?: number // 完成人数 + duration?: number // 答题用时(秒) + remark?: string // 备注 createTime?: string // 创建时间 } @@ -18,49 +35,156 @@ export interface QuestionnaireRecordPageParams { pageNo: number pageSize: number questionnaireId?: number + questionnaireName?: string prisonerId?: number prisonerNo?: string - totalScore?: number - passStatus?: number status?: number - answerTime?: string[] + passStatus?: number + riskLevel?: number + startTime?: string[] + endTime?: string[] createTime?: string[] } -// 问卷答题记录 API +/** 发起测评请求 */ +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?: number // 风险等级:1-高风险 2-中风险 3-低风险 +} + +/** 分数分布数据 */ +export interface ScoreDistribution { + '0-20'?: number + '21-40'?: number + '41-60'?: number + '61-80'?: number + '81-100'?: number +} + +/** 风险分布数据 */ +export interface RiskDistribution { + 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({ url: `/prison/questionnaire-record/get`, params: { id } }) }, - // 新增问卷答题记录 + /** 新增问卷答题记录 */ createQuestionnaireRecord: async (data: QuestionnaireRecord) => { return await request.post({ url: `/prison/questionnaire-record/create`, data }) }, - // 修改问卷答题记录 + /** 修改问卷答题记录 */ updateQuestionnaireRecord: async (data: QuestionnaireRecord) => { return await request.put({ url: `/prison/questionnaire-record/update`, data }) }, - // 删除问卷答题记录 + /** 删除问卷答题记录 */ deleteQuestionnaireRecord: async (id: number) => { return await request.delete({ url: `/prison/questionnaire-record/delete`, params: { id } }) }, /** 批量删除问卷答题记录 */ deleteQuestionnaireRecordList: async (ids: number[]) => { - return await request.delete({ url: `/prison/questionnaire-record/delete-list`, params: { ids: ids.join(',') } }) + return await request.post({ url: `/prison/questionnaire-record/delete-list`, data: ids }) }, - // 导出问卷答题记录 Excel + /** 导出问卷答题记录 Excel */ exportQuestionnaireRecord: async (params: QuestionnaireRecordPageParams) => { return await request.download({ url: `/prison/questionnaire-record/export-excel`, params }) + }, + + // ========== 测评执行相关 ========== + + /** 发起测评 */ + initiateAssessment: async (data: AssessmentInitiateReq) => { + return await request.post({ url: `/prison/questionnaire-record/initiate`, data }) + }, + + /** 开始测评 */ + startAssessment: async (id: number, prisonerId: number) => { + return await request.post({ url: `/prison/questionnaire-record/start`, params: { id, prisonerId } }) + }, + + /** 提交答卷 */ + submitAnswer: async (data: AssessmentAnswerSubmitReq) => { + return await request.post({ url: `/prison/questionnaire-record/submit`, data }) + }, + + /** 结束测评 */ + finishAssessment: async (id: number) => { + return await request.post({ url: `/prison/questionnaire-record/finish`, params: { id } }) + }, + + /** 取消测评 */ + cancelAssessment: async (id: number) => { + return await request.post({ url: `/prison/questionnaire-record/cancel`, params: { id } }) + }, + + // ========== 评分相关 ========== + + /** 自动评分 */ + autoScore: async (id: number) => { + return await request.post({ url: `/prison/questionnaire-record/auto-score`, params: { id } }) + }, + + /** 人工评分 */ + manualScore: async (data: AssessmentManualScoreReq) => { + return await request.post({ url: `/prison/questionnaire-record/manual-score`, data }) + }, + + // ========== 统计相关 ========== + + /** 获取完成率 */ + getCompletionRate: async (assessmentRecordId: number) => { + return await request.get({ url: `/prison/questionnaire-record/completion-rate`, params: { assessmentRecordId } }) + }, + + /** 获取分数分布 */ + getScoreDistribution: async (assessmentRecordId: number) => { + return await request.get({ url: `/prison/questionnaire-record/score-distribution`, params: { assessmentRecordId } }) + }, + + /** 获取风险分布 */ + getRiskDistribution: async (assessmentRecordId: number) => { + return await request.get({ url: `/prison/questionnaire-record/risk-distribution`, params: { assessmentRecordId } }) } } diff --git a/src/api/prison/riskassessment/index.ts b/src/api/prison/riskassessment/index.ts index 1a6468f9..ef160931 100644 --- a/src/api/prison/riskassessment/index.ts +++ b/src/api/prison/riskassessment/index.ts @@ -1,31 +1,40 @@ import request from '@/config/axios' -import type { Dayjs } from 'dayjs'; + +/** 危险评估分页参数 */ +export interface RiskAssessmentPageParams { + pageNo: number + pageSize: number + prisonerNo?: string + assessmentType?: number + riskLevel?: number + status?: number +} /** 危险评估信息 */ export interface RiskAssessment { - id: number; // 评估ID - prisonerId?: number; // 罪犯ID - prisonerNo?: string; // 罪犯编号 - assessmentType?: number; // 评估类型:1-入狱评估 2-定期评估 3-专项评估 - assessmentDate?: string | Dayjs; // 评估日期 - violenceScore: number; // 暴力倾向得分 - escapeScore: number; // 脱逃倾向得分 - suicideScore: number; // 自杀倾向得分 - totalScore: number; // 综合得分 - riskLevel?: number; // 风险等级:1-低风险 2-中风险 3-高风险 4-极高风险 - riskFactors: string; // 风险因素 - suggestions: string; // 管控建议 - assessorId: number; // 评估人ID - assessorName: string; // 评估人姓名 - nextAssessmentDate: string | Dayjs; // 下次评估日期 - status?: number; // 状态:1-待审核 2-已通过 - remark: string; // 备注 - } + id: number // 评估ID + prisonerId?: number // 罪犯ID + prisonerNo?: string // 罪犯编号 + assessmentType?: number // 评估类型:1-入狱评估 2-定期评估 3-专项评估 + assessmentDate?: string // 评估日期 + violenceScore: number // 暴力倾向得分 + escapeScore: number // 脱逃倾向得分 + suicideScore: number // 自杀倾向得分 + totalScore: number // 综合得分 + riskLevel?: number // 风险等级:1-低风险 2-中风险 3-高风险 4-极高风险 + riskFactors: string // 风险因素 + suggestions: string // 管控建议 + assessorId: number // 评估人ID + assessorName: string // 评估人姓名 + nextAssessmentDate: string // 下次评估日期 + status?: number // 状态:1-待审核 2-已通过 + remark: string // 备注 +} // 危险评估 API export const RiskAssessmentApi = { // 查询危险评估分页 - getRiskAssessmentPage: async (params: any) => { + getRiskAssessmentPage: async (params: RiskAssessmentPageParams) => { return await request.get({ url: `/prison/risk-assessment/page`, params }) }, @@ -55,7 +64,7 @@ export const RiskAssessmentApi = { }, // 导出危险评估 Excel - exportRiskAssessment: async (params) => { + exportRiskAssessment: async (params: RiskAssessmentPageParams) => { return await request.download({ url: `/prison/risk-assessment/export-excel`, params }) } } \ No newline at end of file diff --git a/src/api/prison/score/index.ts b/src/api/prison/score/index.ts index 42cbdf37..180344a4 100644 --- a/src/api/prison/score/index.ts +++ b/src/api/prison/score/index.ts @@ -1,28 +1,38 @@ import request from '@/config/axios' -import type { Dayjs } from 'dayjs'; + +/** 计分考核分页参数 */ +export interface ScorePageParams { + pageNo: number + pageSize: number + prisonerNo?: string + year?: number + month?: number + level?: number + status?: number +} /** 计分考核信息 */ export interface Score { - id: number; // 记录ID - prisonerId?: number; // 罪犯ID - prisonerNo?: string; // 罪犯编号 - year?: number; // 考核年份 - month?: number; // 考核月份 - baseScore: number; // 基础分 - rewardScore: number; // 加分 - penaltyScore: number; // 扣分 - totalScore: number; // 总分 - level: number; // 考核等级:1-优秀 2-良好 3-合格 4-不合格 - assessorId: number; // 考核人ID - assessorName: string; // 考核人姓名 - status?: number; // 状态:1-待审核 2-已通过 3-已驳回 - remark: string; // 备注 - } + id: number // 记录ID + prisonerId?: number // 罪犯ID + prisonerNo?: string // 罪犯编号 + year?: number // 考核年份 + month?: number // 考核月份 + baseScore: number // 基础分 + rewardScore: number // 加分 + penaltyScore: number // 扣分 + totalScore: number // 总分 + level: number // 考核等级:1-优秀 2-良好 3-合格 4-不合格 + assessorId: number // 考核人ID + assessorName: string // 考核人姓名 + status?: number // 状态:1-待审核 2-已通过 3-已驳回 + remark: string // 备注 +} // 计分考核 API export const ScoreApi = { // 查询计分考核分页 - getScorePage: async (params: any) => { + getScorePage: async (params: ScorePageParams) => { return await request.get({ url: `/prison/score/page`, params }) }, @@ -52,7 +62,7 @@ export const ScoreApi = { }, // 导出计分考核 Excel - exportScore: async (params) => { + exportScore: async (params: ScorePageParams) => { return await request.download({ url: `/prison/score/export-excel`, params }) } } \ No newline at end of file diff --git a/src/utils/dict.ts b/src/utils/dict.ts index c1fa49a8..8a5e1a77 100644 --- a/src/utils/dict.ts +++ b/src/utils/dict.ts @@ -273,5 +273,8 @@ export enum DICT_TYPE { PRISON_SCORE_CATEGORY = 'prison_score_category', // 考核类别:1-劳动改造 2-教育改造 3-日常行为 4-卫生纪律 5-加分项 6-扣分项 PRISON_SCORE_TYPE = 'prison_score_type', // 考核类型:1-加分 2-扣分 PRISON_RELEASE_STATUS = 'prison_release_status', // 释放状态:1-待释放 2-已释放 3-已取消 - PRISON_CERTIFICATE_TYPE = 'prison_certificate_type' // 证件类型:1-身份证 2-户口簿 3-其他 + PRISON_CERTIFICATE_TYPE = 'prison_certificate_type', // 证件类型:1-身份证 2-户口簿 3-其他 + PRISON_ASSESSMENT_STATUS = 'prison_assessment_status', // 测评状态:1-待测评 2-测评中 3-已完成 4-已过期 + PRISON_ASSESSMENT_PASS_STATUS = 'prison_assessment_pass_status', // 测评及格状态:1-及格 2-不及格 3-待评分 + PRISON_ASSESSMENT_ANSWER_STATUS = 'prison_assessment_answer_status' // 测评答题状态:1-待评分 2-已评分 } diff --git a/src/views/prison/cell/index.vue b/src/views/prison/cell/index.vue index b80fb096..acf7ca15 100644 --- a/src/views/prison/cell/index.vue +++ b/src/views/prison/cell/index.vue @@ -100,7 +100,7 @@ @@ -138,6 +138,7 @@ diff --git a/src/views/prison/consumption/ConsumptionForm.vue b/src/views/prison/consumption/ConsumptionForm.vue index 902bd51d..8536a039 100644 --- a/src/views/prison/consumption/ConsumptionForm.vue +++ b/src/views/prison/consumption/ConsumptionForm.vue @@ -1,5 +1,5 @@ + \ No newline at end of file + diff --git a/src/views/prison/consumption/index.vue b/src/views/prison/consumption/index.vue index 1a901a67..dde319fa 100644 --- a/src/views/prison/consumption/index.vue +++ b/src/views/prison/consumption/index.vue @@ -25,7 +25,7 @@ class="!w-100px" > - + + - + - - - @@ -112,10 +110,10 @@ - + diff --git a/src/views/prison/questionnairerecord/ManualScoreDialog.vue b/src/views/prison/questionnairerecord/ManualScoreDialog.vue new file mode 100644 index 00000000..d04f1faa --- /dev/null +++ b/src/views/prison/questionnairerecord/ManualScoreDialog.vue @@ -0,0 +1,113 @@ + + + diff --git a/src/views/prison/questionnairerecord/index.vue b/src/views/prison/questionnairerecord/index.vue index 8f1e5888..db934962 100644 --- a/src/views/prison/questionnairerecord/index.vue +++ b/src/views/prison/questionnairerecord/index.vue @@ -8,23 +8,21 @@ :inline="true" label-width="68px" > - - + - - - + filterable + > + + - - - - - - - - - - - - + - - + + + + + + + + + 搜索 重置 - 新增 + 发起测评 导出 批量删除 @@ -132,34 +114,39 @@ - - - - - - - + + + + + + + + + + + + - - + + + + - + \ No newline at end of file + diff --git a/src/views/prison/riskassessment/index.vue b/src/views/prison/riskassessment/index.vue index 6c529955..838db08f 100644 --- a/src/views/prison/riskassessment/index.vue +++ b/src/views/prison/riskassessment/index.vue @@ -129,7 +129,7 @@ @@ -167,6 +167,7 @@