# 计分考核模块 - 前端实施文档 > 版本:v1.0 > 创建日期:2026-01-14 > 优先级:P0 --- ## 一、概述 ### 1.1 文档说明 本文档为计分考核模块的前端实施指南,基于需求文档「需求-03-计分考核.md」和后端实施文档编写。 ### 1.2 前端文件结构 ``` frontend/src/ ├── views/prison/score/ │ ├── subject/ # 考核规则配置 │ │ ├── index.vue # 列表页 │ │ └── SubjectForm.vue # 新增/编辑表单 │ ├── record/ # 日常考核记录 │ │ ├── index.vue # 列表页 │ │ └── RecordForm.vue # 新增/编辑表单(含批量录入) │ ├── monthly/ # 月度考核汇总 │ │ ├── index.vue # 列表页 │ │ └── MonthlyDetail.vue # 月度明细 │ ├── level/ # 等级规则配置 │ │ └── index.vue # 配置页 │ ├── notice/ # 考核公示 │ │ ├── index.vue # 列表页 │ │ └── NoticeForm.vue # 新增/编辑/发布表单 │ └── parole/ # 减刑假释数据 │ └── index.vue # 数据提取页 │ └── api/prison/score/ ├── subject.ts # 考核规则API ├── record.ts # 日常记录API ├── monthly.ts # 月度汇总API ├── level.ts # 等级规则API ├── notice.ts # 公示公告API └── parole.ts # 减刑假释API ``` --- ## 二、API接口定义 ### 2.1 考核规则科目API(subject.ts) ```typescript import { request } from '@/config/axios' import type { PageData, PageResult } from '@/types' /** 考核规则科目接口 */ export interface ScoreSubject { id: number code: string name: string category: number categoryName: string score: number dailyLimit: number monthlyLimit: number description: string status: number statusName: string sort: number createTime: string } /** 查询参数 */ export interface ScoreSubjectQuery extends PageData { code?: string name?: string category?: number status?: number } /** 保存参数 */ export interface ScoreSubjectSaveParams { id?: number code: string name: string category: number score: number dailyLimit?: number monthlyLimit?: number description?: string status?: number sort?: number } /** 考核类别选项 */ export const CATEGORY_OPTIONS = [ { value: 1, label: '劳动改造' }, { value: 2, label: '教育改造' }, { value: 3, label: '日常行为' }, { value: 4, label: '卫生纪律' }, { value: 5, label: '加分项' }, { value: 6, label: '扣分项' } ] export const ScoreSubjectApi = { /** 分页查询 */ getPage: async (params: ScoreSubjectQuery) => { return await request.get({ url: '/score/subject/page', params }) }, /** 获取详情 */ get: async (id: number) => { return await request.get({ url: `/score/subject/get?id=${id}` }) }, /** 获取列表(无分页) */ getList: async (params?: Omit) => { return await request.get({ url: '/score/subject/list', params }) }, /** 创建 */ create: async (data: ScoreSubjectSaveParams) => { return await request.post({ url: '/score/subject/create', data }) }, /** 更新 */ update: async (data: ScoreSubjectSaveParams) => { return await request.put({ url: '/score/subject/update', data }) }, /** 删除 */ delete: async (id: number) => { return await request.delete({ url: `/score/subject/delete?id=${id}` }) }, /** 批量删除 */ deleteList: async (ids: number[]) => { return await request.delete({ url: `/score/subject/delete-list?ids=${ids.join(',')}` }) }, /** 更新状态 */ updateStatus: async (id: number, status: number) => { return await request.put({ url: '/score/subject/update-status', params: { id, status } }) }, /** 导出Excel */ export: async (params: ScoreSubjectQuery) => { return await request.download({ url: '/score/subject/export-excel', params }) } } ``` ### 2.2 日常考核记录API(record.ts) ```typescript import { request } from '@/config/axios' import type { PageData, PageResult } from '@/types' /** 日常考核记录接口 */ export interface ScoreRecord { id: number prisonerId: number prisonerNo: string prisonerName: string prisonAreaId: number prisonAreaName: string recordDate: string subjectId: number subjectName: string category: number categoryName: string score: number actualScore: number remark: string recorderId: number recorderName: string createTime: string } /** 查询参数 */ export interface ScoreRecordQuery extends PageData { prisonerNo?: string prisonerName?: string recordDate?: string recordDateRange?: string[] category?: number subjectId?: number prisonAreaId?: number } /** 保存参数 */ export interface ScoreRecordSaveParams { id?: number prisonerId: number recordDate: string subjectId: number score: number remark?: string } /** 批量创建参数 */ export interface ScoreRecordBatchParams { recordDate: string prisonerIds: number[] subjectId: number score: number remark?: string } export const ScoreRecordApi = { /** 分页查询 */ getPage: async (params: ScoreRecordQuery) => { return await request.get({ url: '/score/record/page', params }) }, /** 获取详情 */ get: async (id: number) => { return await request.get({ url: `/score/record/get?id=${id}` }) }, /** 获取罪犯考核明细 */ getByPrisoner: async (prisonerId: number, year?: number, month?: number) => { return await request.get({ url: '/score/record/get-by-prisoner', params: { prisonerId, year, month } }) }, /** 创建 */ create: async (data: ScoreRecordSaveParams) => { return await request.post({ url: '/score/record/create', data }) }, /** 批量创建 */ batchCreate: async (data: ScoreRecordBatchParams) => { return await request.post({ url: '/score/record/batch-create', data }) }, /** 更新 */ update: async (data: ScoreRecordSaveParams) => { return await request.put({ url: '/score/record/update', data }) }, /** 删除 */ delete: async (id: number) => { return await request.delete({ url: `/score/record/delete?id=${id}` }) }, /** 导出Excel */ export: async (params: ScoreRecordQuery) => { return await request.download({ url: '/score/record/export-excel', params }) } } ``` ### 2.3 月度考核汇总API(monthly.ts) ```typescript import { request } from '@/config/axios' import type { PageData } from '@/types' /** 月度考核汇总接口 */ export interface ScoreMonthly { id: number prisonerId: number prisonerNo: string prisonerName: string prisonAreaId: number prisonAreaName: string year: number month: number baseScore: number rewardScore: number penaltyScore: number totalScore: number level: number levelName: string assessorId: number assessorName: string status: number statusName: string remark: string createTime: string } /** 查询参数 */ export interface ScoreMonthlyQuery extends PageData { prisonerNo?: string prisonerName?: string year: number month?: number level?: number status?: number prisonAreaId?: number } /** 月度汇总明细 */ export interface ScoreMonthlyDetail { monthly: ScoreMonthly records: ScoreRecord[] } /** 减刑假释数据 */ export interface ScoreParoleData { prisonerId: number prisonerNo: string prisonerName: string monthlyScores: Array<{ year: number month: number totalScore: number level: number levelName: string }> yearlyTotalScore: number praiseCount: number warningCount: number suggestion: { canApplyReduction: boolean suggestedReductionMonths: number canApplyParole: boolean paroleOpinion: string } } export const ScoreMonthlyApi = { /** 分页查询 */ getPage: async (params: ScoreMonthlyQuery) => { return await request.get({ url: '/score/monthly/page', params }) }, /** 获取汇总详情 */ getSummary: async (id: number) => { return await request.get({ url: `/score/monthly/get-summary?id=${id}` }) }, /** 获取月度汇总明细 */ getDetail: async (id: number) => { return await request.get({ url: `/score/monthly/get-detail?id=${id}` }) }, /** 手动触发月度汇总计算 */ calculate: async (year: number, month: number) => { return await request.post({ url: '/score/monthly/calculate', params: { year, month } }) }, /** 提交审核 */ submitAudit: async (id: number) => { return await request.post({ url: '/score/monthly/submit-audit', params: { id } }) }, /** 审核通过 */ auditPass: async (id: number, remark?: string) => { return await request.post({ url: '/score/monthly/audit', params: { id, status: 2, remark } }) }, /** 审核驳回 */ auditReject: async (id: number, remark: string) => { return await request.post({ url: '/score/monthly/audit', params: { id, status: 3, remark } }) }, /** 导出Excel */ export: async (params: ScoreMonthlyQuery) => { return await request.download({ url: '/score/monthly/export-excel', params }) }, /** 获取减刑假释数据 */ getParoleData: async (prisonerId: number) => { return await request.get({ url: '/score/parole/get-data', params: { prisonerId } }) }, /** 生成减刑假释建议 */ generateSuggestion: async (prisonerId: number) => { return await request.post({ url: '/score/parole/generate-suggestion', params: { prisonerId } }) } } ``` ### 2.4 等级规则API(level.ts) ```typescript import { request } from '@/config/axios' /** 等级规则接口 */ export interface ScoreLevelRule { id: number level: number levelName: string minScore: number maxScore: number description: string sort: number status: number } /** 基础分配置 */ export interface BaseScoreConfig { baseScore: number } export const ScoreLevelApi = { /** 获取等级规则列表 */ getList: async () => { return await request.get({ url: '/score/level/get' }) }, /** 更新等级规则 */ update: async (data: ScoreLevelRule[]) => { return await request.put({ url: '/score/level/update', data }) }, /** 获取基础分配置 */ getBaseScore: async () => { return await request.get({ url: '/score/level/get-base-score' }) }, /** 更新基础分配置 */ updateBaseScore: async (baseScore: number) => { return await request.put({ url: '/score/level/update-base-score', params: { baseScore } }) } } ``` ### 2.5 公示公告API(notice.ts) ```typescript import { request } from '@/config/axios' import type { PageData } from '@/types' /** 公示公告接口 */ export interface ScoreNotice { id: number title: string noticeType: number noticeTypeName: string startDate: string endDate: string scopeType: number scopeTypeName: string scopePrisonAreaIds: string scopePrisonAreaNames: string content: string status: number statusName: string publisherId: number publisherName: string publishTime: string createTime: string } /** 查询参数 */ export interface ScoreNoticeQuery extends PageData { title?: string noticeType?: number status?: number startDate?: string endDate?: string } /** 保存参数 */ export interface ScoreNoticeSaveParams { id?: number title: string noticeType: number startDate: string endDate: string scopeType: number scopePrisonAreaIds?: string content?: string } export const ScoreNoticeApi = { /** 分页查询 */ getPage: async (params: ScoreNoticeQuery) => { return await request.get({ url: '/score/notice/page', params }) }, /** 获取详情 */ get: async (id: number) => { return await request.get({ url: `/score/notice/get?id=${id}` }) }, /** 创建 */ create: async (data: ScoreNoticeSaveParams) => { return await request.post({ url: '/score/notice/create', data }) }, /** 更新 */ update: async (data: ScoreNoticeSaveParams) => { return await request.put({ url: '/score/notice/update', data }) }, /** 发布 */ publish: async (id: number) => { return await request.put({ url: `/score/notice/publish?id=${id}` }) }, /** 撤回 */ withdraw: async (id: number) => { return await request.put({ url: `/score/notice/withdraw?id=${id}` }) }, /** 删除 */ delete: async (id: number) => { return await request.delete({ url: `/score/notice/delete?id=${id}` }) } } ``` --- ## 三、页面组件设计 ### 3.1 考核规则配置页面(subject/index.vue) ```vue ``` ### 3.2 考核规则表单组件(subject/SubjectForm.vue) ```vue ``` ### 3.3 日常考核记录页面(record/index.vue) ```vue ``` ### 3.4 批量录入表单组件(record/BatchRecordForm.vue) ```vue ``` ### 3.5 月度考核汇总页面(monthly/index.vue) ```vue ``` ### 3.6 月度明细组件(monthly/MonthlyDetail.vue) ```vue ``` --- ## 四、路由配置 ```typescript // router/routes/modules/prison.ts { path: '/prison/score', component: Layout, redirect: '/prison/score/subject', name: 'PrisonScore', meta: { title: '计分考核', icon: 'score', alwaysShow: true }, children: [ { path: 'subject', component: () => import('@/views/prison/score/subject/index.vue'), name: 'PrisonScoreSubject', meta: { title: '考核规则配置', icon: 'list', permissions: ['prison:score:subject:query'] } }, { path: 'record', component: () => import('@/views/prison/score/record/index.vue'), name: 'PrisonScoreRecord', meta: { title: '日常考核记录', icon: 'edit', permissions: ['prison:score:record:query'] } }, { path: 'monthly', component: () => import('@/views/prison/score/monthly/index.vue'), name: 'PrisonScoreMonthly', meta: { title: '月度考核汇总', icon: 'date', permissions: ['prison:score:monthly:query'] } }, { path: 'level', component: () => import('@/views/prison/score/level/index.vue'), name: 'PrisonScoreLevel', meta: { title: '等级规则配置', icon: 'setting', permissions: ['prison:score:level:query'] } }, { path: 'notice', component: () => import('@/views/prison/score/notice/index.vue'), name: 'PrisonScoreNotice', meta: { title: '考核公示', icon: 'notification', permissions: ['prison:score:notice:query'] } }, { path: 'parole', component: () => import('@/views/prison/score/parole/index.vue'), name: 'PrisonScoreParole', meta: { title: '减刑假释数据', icon: 'document', permissions: ['prison:score:parole:query'] } } ] } ``` --- ## 五、菜单权限SQL ```sql -- 计分考核模块菜单权限 -- 1. 考核规则配置 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component) VALUES ('考核规则配置', '', 2, 1, (SELECT id FROM system_menu WHERE name = '计分考核'), 'subject', 'list', 'prison/score/subject/index'); -- 2. 日常考核记录 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component) VALUES ('日常考核记录', '', 2, 2, (SELECT id FROM system_menu WHERE name = '计分考核'), 'record', 'edit', 'prison/score/record/index'); -- 3. 月度考核汇总 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component) VALUES ('月度考核汇总', '', 2, 3, (SELECT id FROM system_menu WHERE name = '计分考核'), 'monthly', 'date', 'prison/score/monthly/index'); -- 4. 等级规则配置 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component) VALUES ('等级规则配置', '', 2, 4, (SELECT id FROM system_menu WHERE name = '计分考核'), 'level', 'setting', 'prison/score/level/index'); -- 5. 考核公示 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component) VALUES ('考核公示', '', 2, 5, (SELECT id FROM system_menu WHERE name = '计分考核'), 'notice', 'notification', 'prison/score/notice/index'); -- 6. 减刑假释数据 INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component) VALUES ('减刑假释数据', '', 2, 6, (SELECT id FROM system_menu WHERE name = '计分考核'), 'parole', 'document', 'prison/score/parole/index'); ``` --- ## 六、验收标准 - [ ] 考核规则配置页面:支持规则的增删改查、状态切换 - [ ] 日常考核记录页面:支持单条录入和批量录入 - [ ] 月度考核汇总页面:支持月度统计展示、明细查看 - [ ] 等级规则配置页面:支持等级标准和基础分配置 - [ ] 考核公示页面:支持公示的发布和撤回 - [ ] 减刑假释数据页面:支持考核数据提取和展示 - [ ] 所有页面通过TypeScript类型检查 - [ ] 所有页面响应式适配