diff --git a/.env.local b/.env.local
index 14cd1e33..b2b5fbb6 100644
--- a/.env.local
+++ b/.env.local
@@ -3,8 +3,8 @@ NODE_ENV=development
VITE_DEV=true
-# 请求路径 - 本地后端服务地址
-VITE_BASE_URL='http://localhost:48080'
+# 请求路径 - 后端服务地址
+VITE_BASE_URL='http://192.168.9.121:48080'
# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持 S3 服务
VITE_UPLOAD_TYPE=server
diff --git a/.eslintrc.js b/.eslintrc.js
index b28255ca..1df855fa 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -70,6 +70,10 @@ module.exports = defineConfig({
'vue/no-v-html': 'off',
'prettier/prettier': 'off', // 芋艿:默认关闭 prettier 的 ESLint 校验,因为我们使用的是 IDE 的 Prettier 插件
'@unocss/order': 'off', // 芋艿:禁用 unocss 【css】顺序的提示,因为暂时不需要这么严格,警告也有点繁琐
- '@unocss/order-attributify': 'off' // 芋艿:禁用 unocss 【属性】顺序的提示,因为暂时不需要这么严格,警告也有点繁琐
+ '@unocss/order-attributify': 'off', // 芋艿:禁用 unocss 【属性】顺序的提示,因为暂时不需要这么严格,警告也有点繁琐
+
+ // 禁止命名空间导入,统一使用默认导入或命名导入
+ 'import/default': 'error',
+ 'import/no-namespace': 'error'
}
})
diff --git a/index.html b/index.html
index 8cfcbefa..9b0a531a 100644
--- a/index.html
+++ b/index.html
@@ -25,7 +25,7 @@
justify-content: center;
align-items: center;
flex-direction: column;
- background: #f0f2f5;
+ background: linear-gradient(135deg, #1a365d 0%, #2d3748 50%, #1a365d 100%);
}
.app-loading .app-loading-wrap {
@@ -41,15 +41,19 @@
}
.app-loading .app-loading-title {
- margin-bottom: 30px;
+ margin-bottom: 20px;
font-size: 20px;
font-weight: bold;
text-align: center;
+ color: #f6e05e;
+ letter-spacing: 2px;
}
.app-loading .app-loading-logo {
- width: 100px;
- margin: 0 auto 15px auto;
+ width: 64px;
+ height: 64px;
+ margin: 0 auto 10px auto;
+ border-radius: 8px;
}
.app-loading .app-loading-item {
@@ -58,91 +62,121 @@
width: 60px;
height: 60px;
vertical-align: middle;
- border-radius: 50%;
}
- .app-loading .app-loading-outter {
+ /* 书本+天平图标 */
+ .app-loading .app-loading-shield {
+ width: 80px;
+ height: 80px;
+ animation: bookFloat 2s ease-in-out infinite;
+ }
+
+ @keyframes bookFloat {
+ 0%, 100% {
+ transform: translateY(0);
+ }
+ 50% {
+ transform: translateY(-8px);
+ }
+ }
+
+ /* 旋转光环 */
+ .app-loading .app-loading-ring {
position: absolute;
- width: 100%;
+ top: 50%;
+ left: 50%;
+ width: 100px;
+ height: 100px;
+ border: 3px solid transparent;
+ border-top-color: #ffd700;
+ border-radius: 50%;
+ transform: translate(-50%, -50%);
+ animation: rotateRing 2s linear infinite;
+ opacity: 0.6;
+ }
+
+ @keyframes rotateRing {
+ from {
+ transform: translate(-50%, -50%) rotate(0deg);
+ }
+ to {
+ transform: translate(-50%, -50%) rotate(360deg);
+ }
+ }
+
+ /* 进度条 */
+ .app-loading .app-loading-progress {
+ width: 200px;
+ height: 4px;
+ background: rgba(255, 255, 255, 0.1);
+ border-radius: 2px;
+ margin-top: 30px;
+ overflow: hidden;
+ }
+
+ .app-loading .app-loading-progress-bar {
height: 100%;
- border: 4px solid #2d8cf0;
- border-bottom: 0;
- border-left-color: transparent;
- border-radius: 50%;
- animation: loader-outter 1s cubic-bezier(0.42, 0.61, 0.58, 0.41) infinite;
+ width: 30%;
+ background: linear-gradient(90deg, #daa520, #ffd700, #daa520);
+ border-radius: 2px;
+ animation: progressMove 1.5s ease-in-out infinite;
}
- .app-loading .app-loading-inner {
- position: absolute;
- top: calc(50% - 20px);
- left: calc(50% - 20px);
- width: 40px;
- height: 40px;
- border: 4px solid #87bdff;
- border-right: 0;
- border-top-color: transparent;
- border-radius: 50%;
- animation: loader-inner 1s cubic-bezier(0.42, 0.61, 0.58, 0.41) infinite;
- }
-
- @-webkit-keyframes loader-outter {
+ @keyframes progressMove {
0% {
- -webkit-transform: rotate(0deg);
- transform: rotate(0deg);
+ width: 10%;
+ margin-left: 0;
+ }
+ 50% {
+ width: 50%;
+ margin-left: 25%;
}
-
100% {
- -webkit-transform: rotate(360deg);
- transform: rotate(360deg);
+ width: 10%;
+ margin-left: 90%;
}
}
- @keyframes loader-outter {
- 0% {
- -webkit-transform: rotate(0deg);
- transform: rotate(0deg);
- }
-
- 100% {
- -webkit-transform: rotate(360deg);
- transform: rotate(360deg);
- }
- }
-
- @-webkit-keyframes loader-inner {
- 0% {
- -webkit-transform: rotate(0deg);
- transform: rotate(0deg);
- }
-
- 100% {
- -webkit-transform: rotate(-360deg);
- transform: rotate(-360deg);
- }
- }
-
- @keyframes loader-inner {
- 0% {
- -webkit-transform: rotate(0deg);
- transform: rotate(0deg);
- }
-
- 100% {
- -webkit-transform: rotate(-360deg);
- transform: rotate(-360deg);
- }
+ /* 加载文字 */
+ .app-loading .app-loading-text {
+ margin-top: 15px;
+ font-size: 14px;
+ color: #a0aec0;
+ letter-spacing: 2px;
}
-
-

-
%VITE_APP_TITLE%
-
+
%VITE_APP_TITLE%
+
-
-
+
+
+
+
正在加载系统中...
diff --git a/package.json b/package.json
index 1a12256e..6a53ca91 100644
--- a/package.json
+++ b/package.json
@@ -109,6 +109,7 @@
"eslint": "^8.57.0",
"eslint-config-prettier": "^9.1.0",
"eslint-define-config": "^2.1.0",
+ "eslint-plugin-import": "^2.29.1",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-vue": "^9.22.0",
"lint-staged": "^15.2.2",
diff --git a/src/api/prison/consumption/index.ts b/src/api/prison/consumption/index.ts
index 3ddd2d0a..4facb3d9 100644
--- a/src/api/prison/consumption/index.ts
+++ b/src/api/prison/consumption/index.ts
@@ -5,6 +5,9 @@ export interface ConsumptionPageParams {
pageNo: number
pageSize: number
prisonerNo?: string
+ prisonerName?: string // 罪犯姓名
+ prisonAreaId?: number // 监区ID
+ prisonCellId?: number // 监室ID
type?: number
status?: number
totalAmount?: number
@@ -26,6 +29,11 @@ export interface Consumption {
id: number // 订单ID
prisonerId?: number // 罪犯ID
prisonerNo?: string // 罪犯编号
+ prisonerName?: string // 罪犯姓名
+ prisonAreaId?: number // 监区ID
+ prisonAreaName?: string // 监区名称
+ prisonCellId?: number // 监室ID
+ prisonCellName?: string // 监室名称
orderNo?: string // 订单号
type?: number // 类型:1-购物 2-餐饮 3-医疗 4-通讯 5-其他
totalAmount?: number // 订单总金额
@@ -34,6 +42,7 @@ export interface Consumption {
status?: number // 状态:1-成功 2-失败
remark: string // 备注
details?: ConsumptionDetail[] // 消费明细列表
+ createTime?: Date // 创建时间
}
// 消费订单 API
diff --git a/src/api/prison/dashboard/index.ts b/src/api/prison/dashboard/index.ts
index be8879e1..e58e82e6 100644
--- a/src/api/prison/dashboard/index.ts
+++ b/src/api/prison/dashboard/index.ts
@@ -24,7 +24,7 @@ export interface ChartDataVO {
/** 省份数据 */
export interface ProvinceChartVO {
province: string // 省份名称
- provinceCode: number // 省份编码
+ provinceCode: string | number // 省份编码(支持字符串名称或数字编码)
count: number // 人数
}
diff --git a/src/api/prison/prisoner/index.ts b/src/api/prison/prisoner/index.ts
index 257aeb49..5f1579ff 100644
--- a/src/api/prison/prisoner/index.ts
+++ b/src/api/prison/prisoner/index.ts
@@ -1,10 +1,19 @@
import request from '@/config/axios'
+// 性别枚举:0-未知 1-男 2-女
+export const GENDER_ENUM = {
+ UNKNOWN: 0,
+ MALE: 1,
+ FEMALE: 2
+} as const
+
+export type GenderType = typeof GENDER_ENUM[keyof typeof GENDER_ENUM]
+
export interface PrisonerVO {
id: number
prisonerNo: string
name: string
- gender: number
+ gender: number // 性别:0-未知 1-男 2-女
genderName?: string // 性别名称
birthday: string
idCard: string
@@ -47,7 +56,7 @@ export interface PrisonerCreateVO {
id?: number
prisonerNo: string
name: string
- gender: number
+ gender: number // 性别:0-未知 1-男 2-女
birthday: string
idCard: string
ethnicity: string
@@ -74,39 +83,48 @@ export interface PrisonerCreateVO {
remark: string
}
-// 服刑人员分页查询
-export const getPrisonerPage = (params: PageParam) => {
- return request.get({ url: '/prison/prisoner/page', params })
-}
-
-// 服刑人员详情
-export const getPrisoner = (id: number) => {
- return request.get({ url: '/prison/prisoner/get?id=' + id })
-}
-
-// 新增服刑人员
-export const createPrisoner = (data: PrisonerCreateVO) => {
- return request.post({ url: '/prison/prisoner/create', data })
-}
-
-// 修改服刑人员
-export const updatePrisoner = (data: PrisonerCreateVO) => {
- return request.put({ url: '/prison/prisoner/update', data })
-}
-
-// 删除服刑人员
-export const deletePrisoner = (id: number) => {
- return request.delete({ url: '/prison/prisoner/delete?id=' + id })
-}
-
-// 批量删除服刑人员
-export const deletePrisonerList = (ids: number[]) => {
- return request.delete({ url: '/prison/prisoner/delete-list', params: { ids: ids.join(',') } })
-}
-
-// 导出服刑人员
-export const exportPrisoner = (params) => {
- return request.download({ url: '/prison/prisoner/export-excel', params })
+// PrisonerApi 对象 - 统一使用对象导出模式
+export const PrisonerApi = {
+ // 分页查询
+ getPage: (params: PageParam) => {
+ return request.get({ url: '/prison/prisoner/page', params })
+ },
+ // 获取详情
+ get: (id: number) => {
+ return request.get({ url: '/prison/prisoner/get', params: { id } })
+ },
+ // 创建
+ create: (data: PrisonerCreateVO) => {
+ return request.post({ url: '/prison/prisoner/create', data })
+ },
+ // 更新
+ update: (data: PrisonerCreateVO) => {
+ return request.put({ url: '/prison/prisoner/update', data })
+ },
+ // 删除
+ delete: (id: number) => {
+ return request.delete({ url: '/prison/prisoner/delete', params: { id } })
+ },
+ // 批量删除
+ deleteList: (ids: number[]) => {
+ return request.delete({ url: '/prison/prisoner/delete-list', params: { ids: ids.join(',') } })
+ },
+ // 导出
+ export: (params: PageParam) => {
+ return request.download({ url: '/prison/prisoner/export-excel', params })
+ },
+ // 调监
+ doTransfer: (data: TransferReqVO) => {
+ return request.post({ url: '/prison/prisoner/transfer', params: data })
+ },
+ // 获取位置历史
+ getAreaHistory: (prisonerId: number) => {
+ return request.get({ url: '/prison/prisoner-area-log/list-by-prisoner-id', params: { prisonerId } })
+ },
+ // 导入
+ import: (data: FormData) => {
+ return request.upload({ url: '/prison/prisoner/import-excel', data })
+ }
}
// 调监请求
@@ -116,11 +134,6 @@ export interface TransferReqVO {
reason?: string
}
-// 执行调监
-export const doTransfer = (data: TransferReqVO) => {
- return request.post({ url: '/prison/prisoner/transfer', params: data })
-}
-
// 罪犯位置历史记录
export interface PrisonerAreaLogVO {
id: number
@@ -142,27 +155,3 @@ export interface PrisonerAreaLogVO {
operatorName: string
createTime: string
}
-
-// 获取罪犯位置历史
-export const getPrisonerAreaHistory = (prisonerId: number) => {
- return request.get({ url: '/prison/prisoner-area-log/list-by-prisoner-id', params: { prisonerId } })
-}
-
-// 导入服刑人员
-export const importPrisoner = (data: FormData) => {
- return request.upload({ url: '/prison/prisoner/import-excel', data })
-}
-
-// PrisonerApi 对象 - 用于组件导入
-export const PrisonerApi = {
- getPage: getPrisonerPage,
- get: getPrisoner,
- create: createPrisoner,
- update: updatePrisoner,
- delete: deletePrisoner,
- deleteList: deletePrisonerList,
- export: exportPrisoner,
- doTransfer: doTransfer,
- getAreaHistory: getPrisonerAreaHistory,
- import: importPrisoner
-}
diff --git a/src/api/prison/question/index.ts b/src/api/prison/question/index.ts
index a331b264..3cefbbec 100644
--- a/src/api/prison/question/index.ts
+++ b/src/api/prison/question/index.ts
@@ -3,20 +3,19 @@ import request from '@/config/axios'
/** 问卷问题信息 */
export interface Question {
id?: number // 问题ID(创建时不需要)
- questionnaireId?: number // 所属问卷ID
- title?: string // 问题标题
- type?: number // 问题类型:1-单选 2-多选 3-填空 4-评分 5-日期 6-数字
- options?: string // 选项JSON
+ questionnaireId: number // 所属问卷ID
+ title: string // 问题标题
+ type: number // 问题类型:1-单选 2-多选 3-填空 4-评分 5-日期 6-数字
+ options?: string // 选项JSON(单选/多选时使用)
score?: number // 分值
sort?: number // 排序
isRequired?: boolean // 是否必答
- // 新增字段
partName?: string // 分区名称
partSort?: number // 分区排序
- helpText?: string // 帮助说明
+ helpText?: string // 帮助说明文字
placeholder?: string // 占位提示
defaultValue?: string // 默认值
- autoFillType?: string // 自动填充类型:NONE/AUTO/MANUAL
+ autoFillType?: string // 自动填充类型:NONE-无 AUTO-自动填充 MANUAL-手动输入
autoFillSource?: string // 自动填充来源
displayCondition?: string // 显示条件JSON
minValue?: number // 最小值
@@ -28,23 +27,20 @@ export interface Question {
export interface QuestionPageParams {
pageNo: number
pageSize: number
- questionnaireId?: number
- title?: string
- type?: number
- partName?: string
-}
-
-/** 批量更新参数 */
-export interface BatchUpdateQuestion {
- id: number
- partName?: string
- partSort?: number
- sort?: number
+ questionnaireId?: number // 所属问卷ID
+ title?: string // 问题标题
+ type?: number // 问题类型
+ partName?: string // 分区名称
}
/** 批量更新请求 */
-export interface BatchUpdateReq {
- questions: BatchUpdateQuestion[]
+export interface QuestionBatchUpdateReq {
+ questions: Array<{
+ id: number
+ partName?: string
+ partSort?: number
+ sort?: number
+ }>
}
// 问卷问题 API
@@ -79,13 +75,13 @@ export const QuestionApi = {
return await request.delete({ url: `/prison/question/delete-list`, params: { ids: ids.join(',') } })
},
+ // 批量更新问卷问题
+ batchUpdate: async (data: QuestionBatchUpdateReq) => {
+ return await request.put({ url: `/prison/question/batch-update`, data })
+ },
+
// 导出问卷问题 Excel
exportQuestion: async (params: QuestionPageParams) => {
return await request.download({ url: `/prison/question/export-excel`, params })
- },
-
- // 批量更新问卷问题(仅排序和分区字段)
- batchUpdate: async (data: BatchUpdateReq) => {
- return await request.post({ url: `/prison/question/batch-update`, data })
}
}
diff --git a/src/api/prison/questionnaire/index.ts b/src/api/prison/questionnaire/index.ts
index d155318e..43d99b10 100644
--- a/src/api/prison/questionnaire/index.ts
+++ b/src/api/prison/questionnaire/index.ts
@@ -27,18 +27,20 @@ export interface QuestionnairePageParams {
title?: string
type?: number
status?: number
+ description?: string
coverImage?: string
instruction?: string
estimatedTime?: number
partCount?: number
allowAnonymous?: boolean
+ createTime?: string
}
// 问卷模板 API
export const QuestionnaireApi = {
// 查询问卷模板分页
getQuestionnairePage: async (params: QuestionnairePageParams) => {
- return await request.get({ url: `/prison/questionnaire/page`, params })
+ return await request.get<{ list: Questionnaire[]; total: number }>({ url: `/prison/questionnaire/page`, params })
},
// 查询问卷模板详情
diff --git a/src/api/prison/questionnairerecord/index.ts b/src/api/prison/questionnairerecord/index.ts
index b69b2e85..a65f3d5d 100644
--- a/src/api/prison/questionnairerecord/index.ts
+++ b/src/api/prison/questionnairerecord/index.ts
@@ -19,7 +19,7 @@ export interface QuestionnaireRecord {
totalScore?: number // 总分
passScore?: number // 及格分数
passStatus?: number // 及格状态:1-及格 2-不及格 3-待评阅
- riskLevel?: number // 风险等级:1-高风险 2-中风险 3-低风险
+ riskLevel?: number // 风险等级:1-低风险 2-中风险 3-高风险 4-极高风险
evaluatorId?: number // 评阅人ID
evaluatorName?: string // 评阅人姓名
evaluateTime?: string // 评阅时间
@@ -73,7 +73,7 @@ export interface AssessmentManualScoreReq {
recordId: number // 测评记录ID
subjectiveScore: number // 主观题得分
comment?: string // 评语
- riskLevel?: number // 风险等级:1-高风险 2-中风险 3-低风险
+ riskLevel?: number // 风险等级:1-低风险 2-中风险 3-高风险 4-极高风险
}
/** 分数分布数据 */
@@ -87,6 +87,7 @@ export interface ScoreDistribution {
/** 风险分布数据 */
export interface RiskDistribution {
+ extreme?: number // 极高风险
high?: number
medium?: number
low?: number
diff --git a/src/api/prison/quick-comment/index.ts b/src/api/prison/quick-comment/index.ts
new file mode 100644
index 00000000..8b97db02
--- /dev/null
+++ b/src/api/prison/quick-comment/index.ts
@@ -0,0 +1,107 @@
+import request from '@/config/axios'
+
+// ============ 快捷评语相关类型 ============
+
+/** 快捷评语分类 */
+export interface CommentCategory {
+ id: number
+ name: string
+ type: number // 评估类型:1-入监 2-定期 3-出监 4-减刑 5-专项
+ sort: number
+ status: number
+}
+
+/** 快捷评语分页参数 */
+export interface QuickCommentPageParams {
+ pageNo: number
+ pageSize: number
+ categoryId?: number
+ content?: string
+ status?: number
+}
+
+/** 快捷评语 */
+export interface QuickComment {
+ id: number
+ categoryId: number
+ categoryName?: string // 分类名称
+ content: string // 评语内容
+ usageCount: number // 使用次数
+ sort: number
+ status: number // 0-停用 1-启用
+ creator?: string
+ createTime?: string
+}
+
+// ============ 快捷评语分类 API ============
+
+export const CommentCategoryApi = {
+ // 查询分类列表
+ getList: async (params?: { type?: number; status?: number }) => {
+ return await request.get({ url: '/prison/quick-comment/category/list', params })
+ },
+
+ // 查询分类详情
+ getCategory: async (id: number) => {
+ return await request.get({ url: '/prison/quick-comment/category/get?id=' + id })
+ },
+
+ // 新增分类
+ createCategory: async (data: Partial) => {
+ return await request.post({ url: '/prison/quick-comment/category/create', data })
+ },
+
+ // 修改分类
+ updateCategory: async (data: Partial) => {
+ return await request.put({ url: '/prison/quick-comment/category/update', data })
+ },
+
+ // 删除分类
+ deleteCategory: async (id: number) => {
+ return await request.delete({ url: '/prison/quick-comment/category/delete?id=' + id })
+ }
+}
+
+// ============ 快捷评语 API ============
+
+export const QuickCommentApi = {
+ // 查询评语分页
+ getPage: async (params: QuickCommentPageParams) => {
+ return await request.get({ url: '/prison/quick-comment/page', params })
+ },
+
+ // 查询评语详情
+ get: async (id: number) => {
+ return await request.get({ url: '/prison/quick-comment/get?id=' + id })
+ },
+
+ // 新增评语
+ create: async (data: QuickComment) => {
+ return await request.post({ url: '/prison/quick-comment/create', data })
+ },
+
+ // 修改评语
+ update: async (data: QuickComment) => {
+ return await request.put({ url: '/prison/quick-comment/update', data })
+ },
+
+ // 删除评语
+ delete: async (id: number) => {
+ return await request.delete({ url: '/prison/quick-comment/delete?id=' + id })
+ },
+
+ // 批量删除评语
+ deleteList: async (ids: number[]) => {
+ return await request.delete({ url: '/prison/quick-comment/delete-list?ids=' + ids.join(',') })
+ },
+
+ // 导入评语
+ importComments: async (data: { categoryId: number; contents: string[] }) => {
+ return await request.post({ url: '/prison/quick-comment/import', data })
+ },
+
+ // 导出评语
+ export: async (params: QuickCommentPageParams) => {
+ return await request.download({ url: '/prison/quick-comment/export', params })
+ }
+}
diff --git a/src/api/prison/report/index.ts b/src/api/prison/report/index.ts
new file mode 100644
index 00000000..e4e05d5a
--- /dev/null
+++ b/src/api/prison/report/index.ts
@@ -0,0 +1,386 @@
+import request from '@/config/axios'
+
+// ============ 评估报告模板相关类型 ============
+
+/** 评估报告模板分页参数 */
+export interface ReportTemplatePageParams {
+ pageNo: number
+ pageSize: number
+ name?: string
+ type?: number
+ status?: number
+}
+
+/** 评估维度配置 */
+export interface ReportDimension {
+ id?: number
+ name: string // 维度名称
+ aiPrompt?: string // AI提示词
+ dataSources: string[] // 数据源绑定
+ outputFormat: string // 输出格式:text/paragraph/list
+ enableAi: boolean // 是否AI生成
+ editorType: string // 编辑器类型:text/richtext/select
+ sort: number // 排序
+}
+
+/** 评估报告模板 */
+export interface ReportTemplate {
+ id: number
+ name: string // 模板名称
+ type: number // 模板类型:1-入监综合评估 2-定期考核报告 3-出监评估 4-减刑假释建议 5-专项评估
+ titleFormat: string // 报告标题格式
+ dimensions: ReportDimension[] // 评估维度
+ aiPromptConfig?: string // AI提示词配置(JSON)
+ styleConfig?: string // 样式配置(JSON)
+ status: number // 状态:0-停用 1-启用
+ isDefault: boolean // 是否默认
+ version: number // 版本号
+ remark?: string // 备注
+ creator?: string
+ createTime?: string
+}
+
+// ============ 评估报告相关类型 ============
+
+/** 报告分页参数 */
+export interface ReportPageParams {
+ pageNo: number
+ pageSize: number
+ reportNo?: string
+ prisonerNo?: string
+ templateId?: number
+ status?: number
+ reportDate?: string[]
+}
+
+/** 报告维度内容 */
+export interface ReportDimensionContent {
+ dimensionId: number
+ dimensionName: string
+ content: string // 内容
+ dataSources?: string // 数据源(JSON)
+ isAiGenerated: boolean // 是否AI生成
+ aiGenerateTime?: string // AI生成时间
+ lastModifyTime?: string // 最后修改时间
+ lastModifyBy?: string // 最后修改人
+}
+
+/** 评估报告 */
+export interface Report {
+ id: number
+ reportNo: string // 报告编号
+ prisonerId: number // 罪犯ID
+ prisonerNo: string // 罪犯编号
+ prisonerName?: string // 罪犯姓名
+ templateId: number // 模板ID
+ templateName?: string // 模板名称
+ title: string // 报告标题
+ reportDate: string // 报告日期
+ dimensions: ReportDimensionContent[] // 维度内容
+ conclusion?: string // 综合结论
+ suggestions?: string // 改造建议
+ riskLevel?: number // 风险等级:1-低风险 2-中风险 3-高风险 4-极高风险
+ attachments?: string[] // 附件列表
+ status: number // 状态:1-草稿 2-待审核 3-已通过 4-已退回
+ version: number // 版本号
+ signature?: string // 数字签名
+ fingerprint?: string // 报告指纹
+ submitterId?: number // 提交人ID
+ submitterName?: string // 提交人姓名
+ submitTime?: string // 提交时间
+ reviewerId?: number // 审核人ID
+ reviewerName?: string // 审核人姓名
+ reviewTime?: string // 审核时间
+ reviewComment?: string // 审核意见
+ remark?: string // 备注
+ creator?: string
+ createTime?: string
+}
+
+// ============ 快捷评语相关类型 ============
+
+/** 快捷评语分类 */
+export interface CommentCategory {
+ id: number
+ name: string
+ type: number // 评估类型
+ sort: number
+ status: number
+}
+
+/** 快捷评语 */
+export interface QuickComment {
+ id: number
+ categoryId: number
+ categoryName?: string // 分类名称
+ content: string
+ usageCount: number // 使用次数
+ sort: number
+ status: number
+}
+
+// ============ 报告版本历史 ============
+
+/** 报告版本历史 */
+export interface ReportVersion {
+ id: number
+ reportId: number
+ version: number
+ content: string // 内容快照(JSON)
+ modifierId: number
+ modifierName: string
+ modifyTime: string
+ comment?: string // 版本备注
+}
+
+// ============ 评估报告模板 API ============
+
+export const ReportTemplateApi = {
+ // 查询模板分页
+ getTemplatePage: async (params: ReportTemplatePageParams) => {
+ return await request.get({ url: '/prison/report-template/page', params })
+ },
+
+ // 查询模板详情
+ getTemplate: async (id: number) => {
+ return await request.get({ url: '/prison/report-template/get?id=' + id })
+ },
+
+ // 新增模板
+ createTemplate: async (data: ReportTemplate) => {
+ return await request.post({ url: '/prison/report-template/create', data })
+ },
+
+ // 修改模板
+ updateTemplate: async (data: ReportTemplate) => {
+ return await request.put({ url: '/prison/report-template/update', data })
+ },
+
+ // 删除模板
+ deleteTemplate: async (id: number) => {
+ return await request.delete({ url: '/prison/report-template/delete?id=' + id })
+ },
+
+ // 批量删除模板
+ deleteTemplateList: async (ids: number[]) => {
+ return await request.delete({ url: '/prison/report-template/delete-list?ids=' + ids.join(',') })
+ },
+
+ // 复制模板
+ copyTemplate: async (id: number) => {
+ return await request.post({ url: '/prison/report-template/copy?id=' + id })
+ },
+
+ // 启用/停用模板
+ updateStatus: async (id: number, status: number) => {
+ return await request.put({ url: '/prison/report-template/update-status', params: { id, status } })
+ },
+
+ // 设为默认
+ setDefault: async (id: number) => {
+ return await request.put({ url: '/prison/report-template/set-default?id=' + id })
+ },
+
+ // 导出模板
+ exportTemplate: async (params: ReportTemplatePageParams) => {
+ return await request.download({ url: '/prison/report-template/export-excel', params })
+ }
+}
+
+// ============ 评估报告 API ============
+
+export const ReportApi = {
+ // 查询报告分页
+ getReportPage: async (params: ReportPageParams) => {
+ return await request.get({ url: '/prison/report/page', params })
+ },
+
+ // 查询报告详情
+ getReport: async (id: number) => {
+ return await request.get({ url: '/prison/report/get?id=' + id })
+ },
+
+ // 根据报告编号查询
+ getReportByNo: async (reportNo: string) => {
+ return await request.get({ url: '/prison/report/get-by-no?reportNo=' + reportNo })
+ },
+
+ // 新增报告
+ createReport: async (data: Report) => {
+ return await request.post({ url: '/prison/report/create', data })
+ },
+
+ // 修改报告
+ updateReport: async (data: Report) => {
+ return await request.put({ url: '/prison/report/update', data })
+ },
+
+ // 删除报告
+ deleteReport: async (id: number) => {
+ return await request.delete({ url: '/prison/report/delete?id=' + id })
+ },
+
+ // 批量删除报告
+ deleteReportList: async (ids: number[]) => {
+ return await request.delete({ url: '/prison/report/delete-list?ids=' + ids.join(',') })
+ },
+
+ // 提交审核
+ submitReport: async (id: number) => {
+ return await request.post({ url: '/prison/report/submit?id=' + id })
+ },
+
+ // 审核通过
+ approveReport: async (id: number, comment?: string) => {
+ return await request.post({ url: '/prison/report/approve', data: { id, comment } })
+ },
+
+ // 审核退回
+ rejectReport: async (id: number, comment: string) => {
+ return await request.post({ url: '/prison/report/reject', data: { id, comment } })
+ },
+
+ // AI生成报告
+ generateReportByAi: async (id: number, dimensionIds?: number[]) => {
+ return await request.post({
+ url: '/prison/report/generate-by-ai',
+ data: { id, dimensionIds }
+ })
+ },
+
+ // 批量生成报告
+ batchGenerateReports: async (data: { templateId: number; prisonerIds: number[] }) => {
+ return await request.post({ url: '/prison/report/batch-generate', data })
+ },
+
+ // 获取AI生成进度
+ getGenerateProgress: async (taskId: string) => {
+ return await request.get({ url: '/prison/report/generate-progress?taskId=' + taskId })
+ },
+
+ // 验证报告签名
+ verifySignature: async (id: number) => {
+ return await request.get({ url: '/prison/report/verify-signature?id=' + id })
+ },
+
+ // 导出报告
+ exportReport: async (id: number, format: 'pdf' | 'word') => {
+ return await request.download({ url: '/prison/report/export', params: { id, format } })
+ },
+
+ // 批量导出报告
+ batchExportReports: async (ids: number[], format: 'pdf' | 'word') => {
+ return await request.download({ url: '/prison/report/batch-export', params: { ids: ids.join(','), format } })
+ },
+
+ // 归档报告
+ archiveReport: async (id: number) => {
+ return await request.post({ url: '/prison/report/archive?id=' + id })
+ },
+
+ // 导出报告 Excel
+ exportReportExcel: async (params: ReportPageParams) => {
+ return await request.download({ url: '/prison/report/export-excel', params })
+ }
+}
+
+// ============ 快捷评语 API ============
+
+export const QuickCommentApi = {
+ // 查询评语分类列表
+ getCategoryList: async (params: { type?: number; status?: number }) => {
+ return await request.get({ url: '/prison/quick-comment/category/list', params })
+ },
+
+ // 查询评语分页
+ getCommentPage: async (params: { pageNo: number; pageSize: number; categoryId?: number; keyword?: string }) => {
+ return await request.get({ url: '/prison/quick-comment/page', params })
+ },
+
+ // 新增评语
+ createComment: async (data: QuickComment) => {
+ return await request.post({ url: '/prison/quick-comment/create', data })
+ },
+
+ // 修改评语
+ updateComment: async (data: QuickComment) => {
+ return await request.put({ url: '/prison/quick-comment/update', data })
+ },
+
+ // 删除评语
+ deleteComment: async (id: number) => {
+ return await request.delete({ url: '/prison/quick-comment/delete?id=' + id })
+ },
+
+ // 批量删除评语
+ deleteCommentList: async (ids: number[]) => {
+ return await request.delete({ url: '/prison/quick-comment/delete-list?ids=' + ids.join(',') })
+ },
+
+ // 导入评语
+ importComments: async (data: { categoryId: number; comments: string[] }) => {
+ return await request.post({ url: '/prison/quick-comment/import', data })
+ },
+
+ // 导出评语
+ exportComments: async (categoryId: number) => {
+ return await request.download({ url: '/prison/quick-comment/export', params: { categoryId } })
+ }
+}
+
+// ============ 报告版本历史 API ============
+
+export const ReportVersionApi = {
+ // 查询版本历史
+ getVersionList: async (reportId: number) => {
+ return await request.get({ url: '/prison/report-version/list?reportId=' + reportId })
+ },
+
+ // 获取版本详情
+ getVersion: async (id: number) => {
+ return await request.get({ url: '/prison/report-version/get?id=' + id })
+ },
+
+ // 恢复版本
+ restoreVersion: async (id: number) => {
+ return await request.post({ url: '/prison/report-version/restore?id=' + id })
+ },
+
+ // 对比版本
+ compareVersions: async (versionId1: number, versionId2: number) => {
+ return await request.get({ url: '/prison/report-version/compare', params: { versionId1, versionId2 } })
+ }
+}
+
+// ============ 罪犯选择相关 API ============
+
+/** 罪犯简要信息 */
+export interface PrisonerBrief {
+ id: number
+ prisonerNo: string
+ name: string
+ areaId: number
+ areaName: string
+ riskLevel?: number // 风险等级
+}
+
+/** 罪犯分页参数 */
+export interface PrisonerPageParams {
+ pageNo: number
+ pageSize: number
+ name?: string
+ prisonerNo?: string
+ areaId?: number
+}
+
+export const PrisonerSelectApi = {
+ // 查询罪犯简要信息分页
+ getPrisonerPage: async (params: PrisonerPageParams) => {
+ return await request.get({ url: '/prison/prisoner/brief/page', params })
+ },
+
+ // 查询所有罪犯简要信息(用于选择列表)
+ getAllPrisoners: async (params: { name?: string; prisonerNo?: string }) => {
+ return await request.get({ url: '/prison/prisoner/brief/list', params })
+ }
+}
diff --git a/src/api/prison/risk/index.ts b/src/api/prison/risk/index.ts
new file mode 100644
index 00000000..c8c03223
--- /dev/null
+++ b/src/api/prison/risk/index.ts
@@ -0,0 +1,123 @@
+import request from '@/config/axios'
+
+/** 风险评估信息 */
+export interface Risk {
+ id: number // 评估ID
+ prisonerId?: number // 罪犯ID
+ prisonerCode?: string // 罪犯编号
+ prisonerName?: string // 罪犯姓名
+ assessmentType?: number // 评估类型:1-入监评估 2-定期评估 3-专项评估 4-出监评估
+ assessmentDate?: Date // 评估日期
+ assessMethod?: number // 评估方式:1-量表评估 2-民警评估 3-综合评估
+ overallScore?: number // 综合风险得分
+ riskLevel?: number // 风险等级:1-低风险 2-中风险 3-高风险 4-极高风险
+ mentalState?: number // 精神状态:1-正常 2-异常
+ escapeRisk?: number // 脱逃风险:1-低 2-中 3-高
+ violenceRisk?: number // 暴力倾向:1-低 2-中 3-高
+ revoltRisk?: number // 抗改风险:1-低 2-中 3-高
+ selfHarmRisk?: number // 自杀自伤:1-低 2-中 3-高
+ recommendation?: string // 建议
+ assessor?: string // 评估人
+ conclusion?: string // 结论
+ itemScores?: string // 项目得分JSON
+ remark?: string // 备注
+ createTime?: Date // 创建时间
+}
+
+// 风险评估创建/更新请求
+export interface RiskSaveReqVO {
+ id?: number
+ prisonerId?: number
+ prisonerCode?: string
+ prisonerName?: string
+ assessmentType?: number
+ assessmentDate?: string
+ assessMethod?: number
+ overallScore?: number
+ riskLevel?: number
+ mentalState?: number
+ escapeRisk?: number
+ violenceRisk?: number
+ revoltRisk?: number
+ selfHarmRisk?: number
+ recommendation?: string
+ assessor?: string
+ conclusion?: string
+ itemScores?: string
+ remark?: string
+}
+
+// 风险评估分页查询
+export interface RiskPageReqVO {
+ pageNo: number
+ pageSize: number
+ prisonerId?: number
+ prisonerCode?: string // 罪犯编号
+ prisonerName?: string // 罪犯姓名
+ assessmentType?: number
+ riskLevel?: number
+ assessor?: string
+ assessmentDate?: string
+}
+
+// 风险评估详情响应
+export interface RiskRespVO {
+ id: number
+ prisonerId: number
+ prisonerCode: string // 罪犯编号
+ prisonerName: string // 罪犯姓名
+ assessmentType: number
+ assessmentDate: string
+ assessMethod: number
+ overallScore: number
+ riskLevel: number
+ mentalState: string
+ escapeRisk: string
+ violenceRisk: string
+ revoltRisk: string
+ selfHarmRisk: string
+ recommendation: string
+ assessor: string
+ conclusion: string
+ itemScores: string
+ remark: string
+ createTime: string
+}
+
+/** 风险评估 API */
+export const RiskApi = {
+ // 查询风险评估分页
+ getRiskPage: async (params: RiskPageReqVO) => {
+ return await request.get({ url: `/prison/risk/page`, params })
+ },
+
+ // 查询风险评估详情
+ getRisk: async (id: number) => {
+ return await request.get({ url: `/prison/risk/get?id=` + id })
+ },
+
+ // 新增风险评估
+ createRisk: async (data: RiskSaveReqVO) => {
+ return await request.post({ url: `/prison/risk/create`, data })
+ },
+
+ // 修改风险评估
+ updateRisk: async (data: RiskSaveReqVO) => {
+ return await request.put({ url: `/prison/risk/update`, data })
+ },
+
+ // 删除风险评估
+ deleteRisk: async (id: number) => {
+ return await request.delete({ url: `/prison/risk/delete?id=` + id })
+ },
+
+ /** 批量删除风险评估 */
+ deleteRiskList: async (ids: number[]) => {
+ return await request.delete({ url: `/prison/risk/delete-list?ids=${ids.join(',')}` })
+ },
+
+ // 导出风险评估 Excel
+ exportRisk: async (params) => {
+ return await request.download({ url: `/prison/risk/export-excel`, params })
+ }
+}
diff --git a/src/api/prison/riskassessment/index.ts b/src/api/prison/riskassessment/index.ts
index ef160931..0a81aa16 100644
--- a/src/api/prison/riskassessment/index.ts
+++ b/src/api/prison/riskassessment/index.ts
@@ -4,7 +4,9 @@ import request from '@/config/axios'
export interface RiskAssessmentPageParams {
pageNo: number
pageSize: number
+ prisonerId?: number
prisonerNo?: string
+ prisonerName?: string
assessmentType?: number
riskLevel?: number
status?: number
@@ -15,6 +17,7 @@ export interface RiskAssessment {
id: number // 评估ID
prisonerId?: number // 罪犯ID
prisonerNo?: string // 罪犯编号
+ prisonerName?: string // 罪犯姓名
assessmentType?: number // 评估类型:1-入狱评估 2-定期评估 3-专项评估
assessmentDate?: string // 评估日期
violenceScore: number // 暴力倾向得分
diff --git a/src/api/prison/score/index.ts b/src/api/prison/score/index.ts
index 180344a4..9dbd5b9e 100644
--- a/src/api/prison/score/index.ts
+++ b/src/api/prison/score/index.ts
@@ -5,6 +5,9 @@ export interface ScorePageParams {
pageNo: number
pageSize: number
prisonerNo?: string
+ prisonerName?: string // 罪犯姓名
+ prisonAreaId?: number // 监区ID
+ prisonCellId?: number // 监室ID
year?: number
month?: number
level?: number
@@ -16,6 +19,11 @@ export interface Score {
id: number // 记录ID
prisonerId?: number // 罪犯ID
prisonerNo?: string // 罪犯编号
+ prisonerName?: string // 罪犯姓名
+ prisonAreaId?: number // 监区ID
+ prisonAreaName?: string // 监区名称
+ prisonCellId?: number // 监室ID
+ prisonCellName?: string // 监室名称
year?: number // 考核年份
month?: number // 考核月份
baseScore: number // 基础分
@@ -27,6 +35,8 @@ export interface Score {
assessorName: string // 考核人姓名
status?: number // 状态:1-待审核 2-已通过 3-已驳回
remark: string // 备注
+ createTime?: Date // 创建时间
+ updateTime?: Date // 更新时间
}
// 计分考核 API
diff --git a/src/api/prison/situation/index.ts b/src/api/prison/situation/index.ts
new file mode 100644
index 00000000..189e4533
--- /dev/null
+++ b/src/api/prison/situation/index.ts
@@ -0,0 +1,119 @@
+import request from '@/config/axios'
+import { AreaApi } from '@/api/prison/area'
+
+/** 狱情收集信息 */
+export interface Situation {
+ id: number // 狱情ID
+ title?: string // 标题
+ content?: string // 详情内容
+ category?: number // 分类:1-监管安全 2-生产安全 3-生活卫生 4-教育改造 5-民警队伍 6-其他
+ level?: number // 等级:1-一般 2-重要 3-紧急
+ source?: number // 来源:1-现场发现 2-耳目反映 3-技术监控 4-他人举报 5-主动报告 6-其他
+ status?: number // 状态:1-待处理 2-处理中 3-已处理 4-已归档
+ areaId?: number // 监区ID
+ cellId?: number // 监室ID
+ reporter?: string // 报告人
+ handler?: string // 处理人
+ occurTime?: Date // 发生时间
+ remark?: string // 备注
+ createTime?: Date // 创建时间
+}
+
+// 狱情收集创建/更新请求
+export interface SituationSaveReqVO {
+ id?: number
+ title: string
+ content?: string
+ category?: number
+ level?: number
+ source?: number
+ status?: number
+ areaId?: number
+ cellId?: number
+ reporter?: string
+ handler?: string
+ occurTime?: string
+ remark?: string
+}
+
+// 狱情收集分页查询
+export interface SituationPageReqVO {
+ pageNo: number
+ pageSize: number
+ title?: string
+ category?: number
+ level?: number
+ source?: number
+ status?: number
+ areaId?: number
+ cellId?: number
+ reporter?: string
+ handler?: string
+ occurTime?: string
+}
+
+// 狱情收集详情响应
+export interface SituationRespVO {
+ id: number
+ title: string
+ content: string
+ category: number
+ level: number
+ source: number
+ status: number
+ areaId: number
+ cellId: number
+ reporter: string
+ handler: string
+ occurTime: string
+ remark: string
+ createTime: string
+ areaName?: string // 监区名称
+ cellName?: string // 监室名称
+}
+
+/** 狱情收集 API */
+export const SituationApi = {
+ // 查询狱情收集分页
+ getSituationPage: async (params: SituationPageReqVO) => {
+ return await request.get({ url: `/prison/situation/page`, params })
+ },
+
+ // 查询狱情收集详情
+ getSituation: async (id: number) => {
+ return await request.get({ url: `/prison/situation/get?id=` + id })
+ },
+
+ // 查询监室列表(用于新增/编辑时选择)
+ getCellList: async (params?: { areaId?: number; status?: number }) => {
+ return await request.get({ url: `/prison/cell/list`, params })
+ },
+
+ // 新增狱情收集
+ createSituation: async (data: SituationSaveReqVO) => {
+ return await request.post({ url: `/prison/situation/create`, data })
+ },
+
+ // 修改狱情收集
+ updateSituation: async (data: SituationSaveReqVO) => {
+ return await request.put({ url: `/prison/situation/update`, data })
+ },
+
+ // 删除狱情收集
+ deleteSituation: async (id: number) => {
+ return await request.delete({ url: `/prison/situation/delete?id=` + id })
+ },
+
+ /** 批量删除狱情收集 */
+ deleteSituationList: async (ids: number[]) => {
+ return await request.delete({ url: `/prison/situation/delete-list?ids=${ids.join(',')}` })
+ },
+
+ // 导出狱情收集 Excel
+ exportSituation: async (params) => {
+ return await request.download({ url: `/prison/situation/export-excel`, params })
+ },
+
+ // 导出 AreaApi 供页面使用
+ AreaApi
+}
diff --git a/src/api/prison/warning/index.ts b/src/api/prison/warning/index.ts
new file mode 100644
index 00000000..5e138017
--- /dev/null
+++ b/src/api/prison/warning/index.ts
@@ -0,0 +1,174 @@
+import request from '@/config/axios'
+import { AreaApi } from '@/api/prison/area'
+
+/** 预警管理 */
+export interface Warning {
+ id: number // 预警ID
+ title?: string // 标题
+ content?: string // 内容
+ type?: number // 类型
+ level?: number // 等级
+ status?: number // 状态
+ source?: number // 来源
+ situationId?: number // 关联狱情ID
+ areaId?: number // 监区ID
+ cellId?: number // 监室ID
+ alertTime?: Date // 预警时间
+ verifyTime?: Date // 核实时间
+ verifier?: string // 核实人
+ verifyResult?: string // 核实结果
+ handleTime?: Date // 处置时间
+ handler?: string // 处置人
+ handleResult?: string // 处置结果
+ releaseTime?: Date // 解除时间
+ releaser?: string // 解除人
+ releaseReason?: string // 解除原因
+ occurTime?: Date // 发生时间
+ remark?: string // 备注
+ createTime?: Date // 创建时间
+}
+
+// 预警创建/更新请求
+export interface WarningSaveReqVO {
+ id?: number
+ title: string
+ content?: string
+ type?: number
+ level?: number
+ status?: number
+ source?: number
+ situationId?: number
+ areaId?: number
+ cellId?: number
+ alertTime?: string
+ occurTime?: string
+ remark?: string
+}
+
+// 预警核实请求
+export interface WarningVerifyReqVO {
+ id: number
+ verifyResult: string
+}
+
+// 预警处置请求
+export interface WarningHandleReqVO {
+ id: number
+ handleResult: string
+}
+
+// 预警解除请求
+export interface WarningReleaseReqVO {
+ id: number
+ releaseReason: string
+}
+
+// 预警分页查询
+export interface WarningPageReqVO {
+ pageNo: number
+ pageSize: number
+ title?: string
+ type?: number
+ level?: number
+ status?: number
+ source?: number
+ areaId?: number
+ cellId?: number
+ occurTime?: string
+}
+
+// 预警详情响应
+export interface WarningRespVO {
+ id: number
+ title: string
+ content: string
+ type: number
+ level: number
+ status: number
+ source: number
+ situationId: number
+ areaId: number
+ cellId: number
+ alertTime: string
+ verifyTime: string
+ verifier: string
+ verifyResult: string
+ handleTime: string
+ handler: string
+ handleResult: string
+ releaseTime: string
+ releaser: string
+ releaseReason: string
+ occurTime: string
+ remark: string
+ createTime: string
+ areaName?: string // 监区名称
+ cellName?: string // 监室名称
+ situationTitle?: string // 关联狱情标题
+}
+
+/** 预警管理 API */
+export const WarningApi = {
+ // 查询预警分页
+ getWarningPage: async (params: WarningPageReqVO) => {
+ return await request.get({ url: `/prison/warning/page`, params })
+ },
+
+ // 查询预警详情
+ getWarning: async (id: number) => {
+ return await request.get({ url: `/prison/warning/get?id=` + id })
+ },
+
+ // 查询监室列表
+ getCellList: async (params?: { areaId?: number; status?: number }) => {
+ return await request.get({ url: `/prison/cell/list`, params })
+ },
+
+ // 查询狱情列表
+ getSituationList: async (params?: { status?: number }) => {
+ return await request.get({ url: `/prison/situation/list`, params })
+ },
+
+ // 新增预警
+ createWarning: async (data: WarningSaveReqVO) => {
+ return await request.post({ url: `/prison/warning/create`, data })
+ },
+
+ // 修改预警
+ updateWarning: async (data: WarningSaveReqVO) => {
+ return await request.put({ url: `/prison/warning/update`, data })
+ },
+
+ // 预警核实
+ verifyWarning: async (data: WarningVerifyReqVO) => {
+ return await request.put({ url: `/prison/warning/verify`, data })
+ },
+
+ // 预警处置
+ handleWarning: async (data: WarningHandleReqVO) => {
+ return await request.put({ url: `/prison/warning/handle`, data })
+ },
+
+ // 预警解除
+ releaseWarning: async (data: WarningReleaseReqVO) => {
+ return await request.put({ url: `/prison/warning/release`, data })
+ },
+
+ // 删除预警
+ deleteWarning: async (id: number) => {
+ return await request.delete({ url: `/prison/warning/delete?id=` + id })
+ },
+
+ /** 批量删除预警 */
+ deleteWarningList: async (ids: number[]) => {
+ return await request.delete({ url: `/prison/warning/delete-list?ids=${ids.join(',')}` })
+ },
+
+ // 导出预警 Excel
+ exportWarning: async (params) => {
+ return await request.download({ url: `/prison/warning/export-excel`, params })
+ },
+
+ // 导出 AreaApi 供页面使用
+ AreaApi
+}
diff --git a/src/components/Icon/JusticeIcon.vue b/src/components/Icon/JusticeIcon.vue
new file mode 100644
index 00000000..b4a5e7c6
--- /dev/null
+++ b/src/components/Icon/JusticeIcon.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
diff --git a/src/components/index.ts b/src/components/index.ts
index 4d030c37..5ec86d49 100644
--- a/src/components/index.ts
+++ b/src/components/index.ts
@@ -1,6 +1,8 @@
import type { App } from 'vue'
import { Icon } from './Icon'
+import JusticeIcon from './Icon/JusticeIcon.vue'
export const setupGlobCom = (app: App): void => {
app.component('Icon', Icon)
+ app.component('JusticeIcon', JusticeIcon)
}
diff --git a/src/router/modules/remaining.ts b/src/router/modules/remaining.ts
index 99a994b9..a3513d6e 100644
--- a/src/router/modules/remaining.ts
+++ b/src/router/modules/remaining.ts
@@ -768,6 +768,32 @@ const remainingRouter: AppRouteRecordRaw[] = [
hidden: true,
canTo: true
}
+ },
+ {
+ path: 'situation-platform',
+ component: () => import('@/views/prison/situation/index.vue'),
+ name: 'PrisonSituationPlatform',
+ meta: {
+ title: '狱情收集',
+ icon: 'ep:warning',
+ permission: 'prison:situation:query',
+ noCache: false,
+ hidden: true,
+ canTo: true
+ }
+ },
+ {
+ path: 'report/edit',
+ component: () => import('@/views/prison/report/edit/index.vue'),
+ name: 'PrisonReportEdit',
+ meta: {
+ title: '评估报告编辑',
+ icon: 'ep:document-checked',
+ permission: 'prison:report:update',
+ noCache: true,
+ hidden: true,
+ canTo: true
+ }
}
]
}
diff --git a/src/utils/dict.ts b/src/utils/dict.ts
index 8a5e1a77..91613f88 100644
--- a/src/utils/dict.ts
+++ b/src/utils/dict.ts
@@ -1,10 +1,13 @@
/**
* 数据字典工具类
*/
-import { useDictStoreWithOut } from '@/store/modules/dict'
+import { useDictStoreWithOut as _useDictStoreWithOut } from '@/store/modules/dict'
import { ElementPlusInfoType } from '@/types/elementPlus'
-const dictStore = useDictStoreWithOut()
+const dictStore = _useDictStoreWithOut()
+
+// Re-export for convenience
+export const useDictStoreWithOut = _useDictStoreWithOut
/**
* 获取 dictType 对应的数据字典数组
@@ -276,5 +279,10 @@ export enum DICT_TYPE {
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-已评分
+ PRISON_ASSESSMENT_ANSWER_STATUS = 'prison_assessment_answer_status', // 测评答题状态:1-待评分 2-已评分
+
+ // ========== 评估报告模块 ==========
+ PRISON_REPORT_STATUS = 'prison_report_status', // 报告状态:1-草稿 2-待审核 3-已通过 4-已退回
+ PRISON_REPORT_TEMPLATE_TYPE = 'prison_report_template_type', // 报告模板类型:1-入监综合评估 2-定期考核报告 3-出监评估 4-减刑假释建议 5-专项评估
+ PRISON_COMMON_STATUS = 'prison_common_status' // 通用状态:0-停用 1-启用
}
diff --git a/src/utils/formatTime.ts b/src/utils/formatTime.ts
index 99eb428c..89b3e1b2 100644
--- a/src/utils/formatTime.ts
+++ b/src/utils/formatTime.ts
@@ -72,6 +72,17 @@ export function formatDate(date: Date, format?: string): string {
return date ? dayjs(date).format(format ?? 'YYYY-MM-DD HH:mm:ss') : ''
}
+/**
+ * 格式化日期时间为 YYYY-MM-DD HH:mm:ss 格式
+ * @param dateTime 日期时间值
+ */
+export function formatDateTime(dateTime: any): string {
+ if (!dateTime) {
+ return ''
+ }
+ return dayjs(dateTime).format('YYYY-MM-DD HH:mm:ss')
+}
+
/**
* 获取当前的日期+时间
*/
@@ -198,7 +209,16 @@ export function formatPast2(ms: number): string {
* @param cellValue 字段值
*/
export function dateFormatter(_row: any, _column: TableColumnCtx, cellValue: any): string {
- return cellValue ? formatDate(cellValue) : ''
+ if (!cellValue) {
+ return ''
+ }
+ // 直接返回已有格式的日期字符串
+ if (typeof cellValue === 'string' && cellValue.match(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/)) {
+ return cellValue
+ }
+ // 处理其他格式
+ const date = dayjs(cellValue)
+ return date.isValid() ? date.format('YYYY-MM-DD HH:mm:ss') : ''
}
/**
diff --git a/src/views/Login/components/LoginForm.vue b/src/views/Login/components/LoginForm.vue
index 1bb5173d..4f9c7096 100644
--- a/src/views/Login/components/LoginForm.vue
+++ b/src/views/Login/components/LoginForm.vue
@@ -1,4 +1,14 @@
+
+
+
+
import { ElLoading } from 'element-plus'
import LoginFormTitle from './LoginFormTitle.vue'
+import PrisonLoginLoading from './PrisonLoginLoading.vue'
import type { RouteLocationNormalizedLoaded } from 'vue-router'
import { useIcon } from '@/hooks/web/useIcon'
@@ -245,7 +256,14 @@ const getTenantByWebsite = async () => {
}
}
}
-const loading = ref() // ElLoading.service 返回的实例
+const loading = ref() // 自定义Loading实例
+const customLoadingVisible = ref(false) // 控制自定义加载动画显示
+
+// 加载动画配置项(保留原有 ElLoading 可配置项)
+const loadingText = ref('正在加载系统中...') // 提示文字
+const loadingBackground = ref('rgba(0, 0, 0, 0.7)') // 背景颜色
+const loadingLock = ref(true) // 是否锁定页面
+const loadingSystemName = ref('') // 系统名称(可选,默认从 store 获取)
// 登录
const handleLogin = async (params: any) => {
loginLoading.value = true
@@ -261,11 +279,8 @@ const handleLogin = async (params: any) => {
if (!res) {
return
}
- loading.value = ElLoading.service({
- lock: true,
- text: '正在加载系统中...',
- background: 'rgba(0, 0, 0, 0.7)'
- })
+ // 使用自定义监狱风格加载动画
+ customLoadingVisible.value = true
if (loginDataLoginForm.rememberMe) {
authUtil.setLoginForm(loginDataLoginForm)
} else {
@@ -283,7 +298,7 @@ const handleLogin = async (params: any) => {
}
} finally {
loginLoading.value = false
- loading.value.close()
+ customLoadingVisible.value = false
}
}
@@ -357,4 +372,15 @@ onMounted(() => {
cursor: pointer;
}
}
+
+// 自定义加载动画过渡效果
+.fade-enter-active,
+.fade-leave-active {
+ transition: opacity 0.5s ease;
+}
+
+.fade-enter-from,
+.fade-leave-to {
+ opacity: 0;
+}
diff --git a/src/views/Login/components/PrisonLoginLoading.vue b/src/views/Login/components/PrisonLoginLoading.vue
new file mode 100644
index 00000000..dee8c763
--- /dev/null
+++ b/src/views/Login/components/PrisonLoginLoading.vue
@@ -0,0 +1,266 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ systemName }}
+
{{ message }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/prison/cell/index.vue b/src/views/prison/cell/index.vue
index acf7ca15..c54e5078 100644
--- a/src/views/prison/cell/index.vue
+++ b/src/views/prison/cell/index.vue
@@ -100,10 +100,10 @@
- {{ dateFormatter(scope.row.createTime) }}
+ {{ formatDateTime(scope.row.createTime) }}
-
+
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
-import { dateFormatter } from '@/utils/formatTime'
+import { formatDateTime } from '@/utils/formatTime'
import download from '@/utils/download'
import { CellApi } from '@/api/prison/cell'
import { AreaApi } from '@/api/prison/area'
diff --git a/src/views/prison/consumption/ConsumptionForm.vue b/src/views/prison/consumption/ConsumptionForm.vue
index 8536a039..0c6d96a7 100644
--- a/src/views/prison/consumption/ConsumptionForm.vue
+++ b/src/views/prison/consumption/ConsumptionForm.vue
@@ -77,7 +77,7 @@
消费明细
-
+
@@ -102,7 +102,7 @@
-
+
删除
diff --git a/src/views/prison/consumption/index.vue b/src/views/prison/consumption/index.vue
index dde319fa..8f4628a8 100644
--- a/src/views/prison/consumption/index.vue
+++ b/src/views/prison/consumption/index.vue
@@ -17,6 +17,15 @@
class="!w-140px"
/>
+
+
+
-
+
+
+
+
@@ -113,7 +125,7 @@
{{ formatDateTime(scope.row.createTime) }}
-
+
import { ref, computed, onMounted } from 'vue'
import type { EChartsOption } from 'echarts'
-import { StatCard } from './components'
+import StatCard from './components/StatCard.vue'
import { DashboardApi, type DashboardStatisticsVO } from '@/api/prison/dashboard'
import EChart from '@/components/Echart/src/Echart.vue'
import ChinaMap from './components/ChinaMap.vue'
@@ -129,6 +129,7 @@ const ageChartOptions = computed(() => ({
top: 'center',
icon: 'circle'
},
+ color: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272'],
series: [
{
type: 'pie',
@@ -170,6 +171,7 @@ const sentenceChartOptions = computed(() => ({
top: 'center',
icon: 'circle'
},
+ color: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de'],
series: [
{
type: 'pie',
@@ -211,6 +213,7 @@ const educationChartOptions = computed(() => ({
top: 'center',
icon: 'circle'
},
+ color: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4'],
series: [
{
type: 'pie',
diff --git a/src/views/prison/prisoner/PrisonerDetail.vue b/src/views/prison/prisoner/PrisonerDetail.vue
index 42aa3eb5..be4ad192 100644
--- a/src/views/prison/prisoner/PrisonerDetail.vue
+++ b/src/views/prison/prisoner/PrisonerDetail.vue
@@ -6,14 +6,16 @@
{{ data.prisonerNo }}
{{ data.name }}
-
+
+ -
{{ data.idCard }}
{{ data.birthday }}
{{ data.ethnicity }}
{{ data.nativePlace }}
-
+
+ -
{{ data.occupation }}
{{ data.address }}
@@ -35,15 +37,18 @@
-
+
+ -
-
+
+ -
{{ data.prisonAreaName }}
{{ data.prisonCellName }}
-
+
+ -
{{ data.remark }}
@@ -55,7 +60,7 @@
@@ -74,7 +79,8 @@
+
+
diff --git a/src/views/prison/prisoner/TransferForm.vue b/src/views/prison/prisoner/TransferForm.vue
index f51adbcb..fdc5c3bd 100644
--- a/src/views/prison/prisoner/TransferForm.vue
+++ b/src/views/prison/prisoner/TransferForm.vue
@@ -80,7 +80,7 @@
diff --git a/src/views/prison/question/index.vue b/src/views/prison/question/index.vue
deleted file mode 100644
index 20d50940..00000000
--- a/src/views/prison/question/index.vue
+++ /dev/null
@@ -1,236 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 搜索
- 重置
-
- 新增
-
-
- 批量删除
-
-
- 导出
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ scope.row.isRequired ? '是' : '否' }}
-
-
-
-
-
- {{ dateFormatter(scope.row.createTime) }}
-
-
-
-
-
- 修改
-
-
- 删除
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/views/prison/questionnaire/QuestionnaireForm.vue b/src/views/prison/questionnaire/QuestionnaireForm.vue
index 3f468040..65e367a2 100644
--- a/src/views/prison/questionnaire/QuestionnaireForm.vue
+++ b/src/views/prison/questionnaire/QuestionnaireForm.vue
@@ -23,12 +23,26 @@
+
+
+
+
+
+
+
+
+ 分钟
+
+
+
+ 允许匿名填写
+
{
title: undefined,
type: undefined,
description: undefined,
+ coverImage: [] as string[],
+ instruction: undefined,
+ estimatedTime: undefined,
totalScore: undefined,
passScore: undefined,
+ allowAnonymous: false,
status: undefined
}
formRef.value?.resetFields()
diff --git a/src/views/prison/questionnaire/components/QuestionForm.vue b/src/views/prison/questionnaire/components/QuestionForm.vue
new file mode 100644
index 00000000..b9c597aa
--- /dev/null
+++ b/src/views/prison/questionnaire/components/QuestionForm.vue
@@ -0,0 +1,973 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/prison/questionnaire/components/QuestionList.vue b/src/views/prison/questionnaire/components/QuestionList.vue
index 21104eaa..c104645b 100644
--- a/src/views/prison/questionnaire/components/QuestionList.vue
+++ b/src/views/prison/questionnaire/components/QuestionList.vue
@@ -193,11 +193,11 @@
- 添加分区
+ 添加分区
- 保存设置
+ 保存设置
取消
@@ -206,7 +206,7 @@
+
+
diff --git a/src/views/prison/quick-comment/QuickCommentForm.vue b/src/views/prison/quick-comment/QuickCommentForm.vue
new file mode 100644
index 00000000..29ff1302
--- /dev/null
+++ b/src/views/prison/quick-comment/QuickCommentForm.vue
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 启用
+ 停用
+
+
+
+
+ 取消
+
+ 确定
+
+
+
+
+
+
diff --git a/src/views/prison/quick-comment/index.vue b/src/views/prison/quick-comment/index.vue
new file mode 100644
index 00000000..52bf833c
--- /dev/null
+++ b/src/views/prison/quick-comment/index.vue
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 新增评语
+
+
+ 导入
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/prison/release/index.vue b/src/views/prison/release/index.vue
index af84436d..50a52a07 100644
--- a/src/views/prison/release/index.vue
+++ b/src/views/prison/release/index.vue
@@ -70,7 +70,7 @@
@@ -95,7 +95,7 @@
-
+
详情
编辑
@@ -112,7 +112,7 @@
type="success"
@click="handleDoRelease(row)"
v-if="row.status === 1"
- v-hasPermi="'prison:release:update'"
+ v-hasPermi="['prison:release:update']"
>
执行释放
@@ -121,7 +121,7 @@
type="warning"
@click="handleCancel(row)"
v-if="row.status === 1"
- v-hasPermi="'prison:release:update'"
+ v-hasPermi="['prison:release:update']"
>
取消
@@ -130,7 +130,7 @@
type="danger"
@click="handleDelete(row)"
v-if="row.status === 1"
- v-hasPermi="'prison:release:delete'"
+ v-hasPermi="['prison:release:delete']"
>
删除
@@ -153,16 +153,18 @@
+
+
diff --git a/src/views/prison/report-template/index.vue b/src/views/prison/report-template/index.vue
new file mode 100644
index 00000000..d3da2c63
--- /dev/null
+++ b/src/views/prison/report-template/index.vue
@@ -0,0 +1,309 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 新增模板
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.dimensions?.length || 0 }} 个
+
+
+
+
+ v{{ row.version }}
+
+
+
+
+
+
+
+
+
+ 是
+ -
+
+
+
+
+
+
+
+ 修改
+
+
+ 复制
+
+
+
+ {{ row.status === 1 ? '停用' : '启用' }}
+
+
+ 设为默认
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/prison/report/components/CreateReportDialog.vue b/src/views/prison/report/components/CreateReportDialog.vue
new file mode 100644
index 00000000..73a90102
--- /dev/null
+++ b/src/views/prison/report/components/CreateReportDialog.vue
@@ -0,0 +1,230 @@
+
+
+
+
+
+
+
diff --git a/src/views/prison/report/components/QuickCommentDialog.vue b/src/views/prison/report/components/QuickCommentDialog.vue
new file mode 100644
index 00000000..3bc629ee
--- /dev/null
+++ b/src/views/prison/report/components/QuickCommentDialog.vue
@@ -0,0 +1,222 @@
+
+
+
+
+
+
+
diff --git a/src/views/prison/report/components/ReportPreviewDialog.vue b/src/views/prison/report/components/ReportPreviewDialog.vue
new file mode 100644
index 00000000..e9b02256
--- /dev/null
+++ b/src/views/prison/report/components/ReportPreviewDialog.vue
@@ -0,0 +1,349 @@
+
+
+
+
+
+
+
diff --git a/src/views/prison/report/components/VersionHistoryDialog.vue b/src/views/prison/report/components/VersionHistoryDialog.vue
new file mode 100644
index 00000000..b1e9643f
--- /dev/null
+++ b/src/views/prison/report/components/VersionHistoryDialog.vue
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
diff --git a/src/views/prison/report/edit/index.vue b/src/views/prison/report/edit/index.vue
new file mode 100644
index 00000000..9d5610ff
--- /dev/null
+++ b/src/views/prison/report/edit/index.vue
@@ -0,0 +1,899 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentReport.prisonerName }} ({{ currentReport.prisonerNo }})
+
+
+ {{ currentReport.areaName || '-' }}
+
+
+ {{ currentReport.reportDate }}
+
+
+ {{ currentReport.templateName }}
+
+
+
+ {{ getRiskLevelLabel(currentReport.riskLevel) }}
+
+ -
+
+
+
+
+
+ v{{ currentReport.version }}
+
+
+
+ 已加载 {{ dataSourceStatus.loaded }}/{{ dataSourceStatus.total }}
+
+
+ 加载中...
+
+
+
+
+
+
+
+
+
+ 审核退回原因:{{ currentReport.reviewComment }}
+
+ 立即修改
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ index + 1 }}. {{ dimension.dimensionName }}
+
+
+ AI生成
+
+
+ 已修改
+
+
+ {{ dimension.aiGenerateTime }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ dimension.isAiGenerated ? '重新生成' : 'AI生成' }}
+
+
+ 恢复AI内容
+
+
+
+
+
+
+
+
+
+
综合结论与建议
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 创建报告
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/prison/report/index.vue b/src/views/prison/report/index.vue
new file mode 100644
index 00000000..10e3f76d
--- /dev/null
+++ b/src/views/prison/report/index.vue
@@ -0,0 +1,421 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 创建报告
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ row.prisonerName?.charAt(0) }}
+
+ {{ row.prisonerName }}
+ {{ row.prisonerNo }}
+
+
+
+
+
+
+
+
+
+
+ {{ getRiskLevelLabel(row.riskLevel) }}
+
+ -
+
+
+
+
+
+
+
+
+
+ v{{ row.version }}
+
+
+
+
+
+
+
+
+ 编辑
+
+
+ 预览
+
+
+ 下载
+
+
+ 提交审核
+
+
+ 重新提交
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/prison/risk/RiskForm.vue b/src/views/prison/risk/RiskForm.vue
new file mode 100644
index 00000000..624e46da
--- /dev/null
+++ b/src/views/prison/risk/RiskForm.vue
@@ -0,0 +1,354 @@
+
+
+
+
+
diff --git a/src/views/prison/risk/index.vue b/src/views/prison/risk/index.vue
new file mode 100644
index 00000000..b57d0883
--- /dev/null
+++ b/src/views/prison/risk/index.vue
@@ -0,0 +1,295 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 新增评估
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatDate(row.assessmentDate) }}
+ -
+
+
+
+
+ {{ row.overallScore ?? '-' }}
+
+
+
+
+
+
+
+
+
+
+ {{ formatDateTime(row.createTime) }}
+ -
+
+
+
+
+
+ 查看
+
+
+ 修改
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/prison/riskassessment/RiskAssessmentForm.vue b/src/views/prison/riskassessment/RiskAssessmentForm.vue
index 9b7a4eaf..6f3908b8 100644
--- a/src/views/prison/riskassessment/RiskAssessmentForm.vue
+++ b/src/views/prison/riskassessment/RiskAssessmentForm.vue
@@ -7,11 +7,24 @@
label-width="100px"
v-loading="formLoading"
>
-
-
-
-
-
+
+
+
+
@@ -95,6 +108,7 @@
\ No newline at end of file
diff --git a/src/views/prison/riskassessment/index.vue b/src/views/prison/riskassessment/index.vue
index 838db08f..27d1f5ff 100644
--- a/src/views/prison/riskassessment/index.vue
+++ b/src/views/prison/riskassessment/index.vue
@@ -14,7 +14,16 @@
placeholder="请输入罪犯编号"
clearable
@keyup.enter="handleQuery"
- class="!w-140px"
+ class="!w-120px"
+ />
+
+
+
@@ -105,12 +114,17 @@
+
-
+
+
+ {{ formatDateTime(scope.row.assessmentDate) }}
+
+
@@ -129,10 +143,10 @@
- {{ dateFormatter(scope.row.createTime) }}
+ {{ formatDateTime(scope.row.createTime) }}
-
+
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
-import { dateFormatter } from '@/utils/formatTime'
+import { formatDateTime } from '@/utils/formatTime'
import download from '@/utils/download'
import { RiskAssessmentApi, RiskAssessment } from '@/api/prison/riskassessment'
import RiskAssessmentForm from './RiskAssessmentForm.vue'
@@ -184,6 +198,7 @@ const queryParams = reactive({
pageNo: 1,
pageSize: 10,
prisonerNo: undefined,
+ prisonerName: undefined,
assessmentType: undefined,
riskLevel: undefined,
status: undefined
diff --git a/src/views/prison/score-rule/index.vue b/src/views/prison/score-rule/index.vue
index 420671f5..cf894f20 100644
--- a/src/views/prison/score-rule/index.vue
+++ b/src/views/prison/score-rule/index.vue
@@ -48,7 +48,7 @@
@@ -78,10 +78,10 @@
-
+
编辑
-
+
删除
diff --git a/src/views/prison/score/ScoreForm.vue b/src/views/prison/score/ScoreForm.vue
index d97ea071..cd2f1626 100644
--- a/src/views/prison/score/ScoreForm.vue
+++ b/src/views/prison/score/ScoreForm.vue
@@ -7,32 +7,58 @@
label-width="100px"
v-loading="formLoading"
>
-
-
-
-
-
+
+
+
+
-
+
-
+
+
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { ScoreApi, Score } from '@/api/prison/score'
+import { PrisonerApi, PrisonerVO } from '@/api/prison/prisoner'
/** 计分考核 表单 */
defineOptions({ name: 'ScoreForm' })
@@ -80,31 +101,65 @@ const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') // 弹窗的标题
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
const formType = ref('') // 表单的类型:create - 新增;update - 修改
+
+// 罪犯选择相关
+const prisonerLoading = ref(false)
+const prisonerList = ref([])
+
const formData = ref({
id: undefined,
- prisonerId: undefined,
- prisonerNo: undefined,
- year: undefined,
- month: undefined,
- baseScore: undefined,
- rewardScore: undefined,
- penaltyScore: undefined,
- totalScore: undefined,
- level: undefined,
- assessorId: undefined,
- assessorName: undefined,
- status: undefined,
- remark: undefined
+ prisonerId: undefined as number | undefined,
+ prisonerNo: undefined as string | undefined,
+ year: undefined as string | undefined,
+ month: undefined as number | undefined,
+ baseScore: 0,
+ rewardScore: 0,
+ penaltyScore: 0,
+ totalScore: 0,
+ level: undefined as number | undefined,
+ assessorId: undefined as number | undefined,
+ assessorName: undefined as string | undefined,
+ status: 1,
+ remark: undefined as string | undefined
})
const formRules = reactive({
- prisonerId: [{ required: true, message: '罪犯ID不能为空', trigger: 'blur' }],
- prisonerNo: [{ required: true, message: '罪犯编号不能为空', trigger: 'blur' }],
- year: [{ required: true, message: '考核年份不能为空', trigger: 'blur' }],
- month: [{ required: true, message: '考核月份不能为空', trigger: 'blur' }],
- status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
+ prisonerId: [{ required: true, message: '罪犯不能为空', trigger: 'change' }],
+ year: [{ required: true, message: '考核年份不能为空', trigger: 'change' }],
+ month: [{ required: true, message: '考核月份不能为空', trigger: 'change' }],
+ status: [{ required: true, message: '状态不能为空', trigger: 'change' }]
})
const formRef = ref() // 表单 Ref
+/** 搜索罪犯 */
+const searchPrisoner = async (query: string) => {
+ if (!query) {
+ prisonerList.value = []
+ return
+ }
+ prisonerLoading.value = true
+ try {
+ const data = await PrisonerApi.getPage({
+ pageNo: 1,
+ pageSize: 20,
+ name: query // 按姓名搜索
+ } as any)
+ prisonerList.value = data.list || []
+ } catch (error) {
+ console.error('搜索罪犯失败:', error)
+ prisonerList.value = []
+ } finally {
+ prisonerLoading.value = false
+ }
+}
+
+/** 罪犯选择变化 */
+const handlePrisonerChange = async (prisonerId: number) => {
+ const prisoner = prisonerList.value.find(p => p.id === prisonerId)
+ if (prisoner) {
+ formData.value.prisonerNo = prisoner.prisonerNo
+ }
+}
+
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
@@ -115,7 +170,13 @@ const open = async (type: string, id?: number) => {
if (id) {
formLoading.value = true
try {
- formData.value = await ScoreApi.getScore(id)
+ const data = await ScoreApi.getScore(id)
+ formData.value = { ...data, year: data.year?.toString() } as any
+ // 加载已选罪犯信息
+ if (data.prisonerId) {
+ const prisoner = await PrisonerApi.getPrisoner(data.prisonerId)
+ prisonerList.value = [prisoner]
+ }
} finally {
formLoading.value = false
}
@@ -155,16 +216,17 @@ const resetForm = () => {
prisonerNo: undefined,
year: undefined,
month: undefined,
- baseScore: undefined,
- rewardScore: undefined,
- penaltyScore: undefined,
- totalScore: undefined,
+ baseScore: 0,
+ rewardScore: 0,
+ penaltyScore: 0,
+ totalScore: 0,
level: undefined,
assessorId: undefined,
assessorName: undefined,
- status: undefined,
+ status: 1,
remark: undefined
}
+ prisonerList.value = []
formRef.value?.resetFields()
}
-
\ No newline at end of file
+
diff --git a/src/views/prison/score/index.vue b/src/views/prison/score/index.vue
index 89bfb04b..95651aa5 100644
--- a/src/views/prison/score/index.vue
+++ b/src/views/prison/score/index.vue
@@ -17,6 +17,15 @@
class="!w-140px"
/>
+
+
+
+
+
+
@@ -118,10 +130,10 @@
- {{ dateFormatter(scope.row.createTime) }}
+ {{ formatDateTime(scope.row.createTime) }}
-
+
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
-import { dateFormatter } from '@/utils/formatTime'
+import { formatDateTime } from '@/utils/formatTime'
import download from '@/utils/download'
import { ScoreApi, Score } from '@/api/prison/score'
import ScoreForm from './ScoreForm.vue'
@@ -173,6 +185,7 @@ const queryParams = reactive({
pageNo: 1,
pageSize: 10,
prisonerNo: undefined,
+ prisonerName: undefined,
year: undefined,
level: undefined,
status: undefined
diff --git a/src/views/prison/situation/SituationForm.vue b/src/views/prison/situation/SituationForm.vue
new file mode 100644
index 00000000..ac8dd8f1
--- /dev/null
+++ b/src/views/prison/situation/SituationForm.vue
@@ -0,0 +1,340 @@
+
+
+
+
+
diff --git a/src/views/prison/situation/index.vue b/src/views/prison/situation/index.vue
new file mode 100644
index 00000000..5421e14f
--- /dev/null
+++ b/src/views/prison/situation/index.vue
@@ -0,0 +1,315 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 新增狱情
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatDateTime(row.occurTime) }}
+ -
+
+
+
+
+ {{ formatDateTime(row.createTime) }}
+ -
+
+
+
+
+
+ 查看
+
+
+ 修改
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/prison/warning/WarningActionForm.vue b/src/views/prison/warning/WarningActionForm.vue
new file mode 100644
index 00000000..b163aaf0
--- /dev/null
+++ b/src/views/prison/warning/WarningActionForm.vue
@@ -0,0 +1,134 @@
+
+
+
+
+
diff --git a/src/views/prison/warning/WarningForm.vue b/src/views/prison/warning/WarningForm.vue
new file mode 100644
index 00000000..1ce9e4bd
--- /dev/null
+++ b/src/views/prison/warning/WarningForm.vue
@@ -0,0 +1,444 @@
+
+
+
+
+
diff --git a/src/views/prison/warning/index.vue b/src/views/prison/warning/index.vue
new file mode 100644
index 00000000..638e7ab7
--- /dev/null
+++ b/src/views/prison/warning/index.vue
@@ -0,0 +1,332 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 新增预警
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatDateTime(row.alertTime) }}
+ -
+
+
+
+
+ {{ formatDateTime(row.createTime) }}
+ -
+
+
+
+
+
+ 查看
+
+
+ 修改
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+