diff --git a/.claude/agents/QUICK-REFERENCE.md b/.claude/agents/QUICK-REFERENCE.md deleted file mode 100644 index e90ad3b..0000000 --- a/.claude/agents/QUICK-REFERENCE.md +++ /dev/null @@ -1,256 +0,0 @@ -# 🚀 Agents 快速参考卡 - -## 一句话调用 - -```bash -# 后端代码审查 -@backend-reviewer 审查这个类的代码质量和性能 - -# 前端代码审查 -@frontend-reviewer 检查这个组件的性能和用户体验 - -# 数据库优化 -@database-expert 优化这个SQL查询并设计合适的索引 - -# 生成API文档 -@api-documenter 为这个Controller生成完整文档 - -# 生成测试代码 -@test-generator 为这个Service生成单元测试 - -# 代码重构 -@refactor-expert 分析代码问题并提供重构方案 -``` - ---- - -## 📋 常见任务速查 - -### 开发新功能流程 - -```bash -1️⃣ @database-expert 设计数据表 - "帮我设计用户评分表,包含用户ID、分数、评分时间等字段" - -2️⃣ 开发后端代码 - -3️⃣ @backend-reviewer 审查代码 - "审查 ScoreService 的代码质量" - -4️⃣ @test-generator 生成测试 - "为 ScoreService 生成完整的单元测试" - -5️⃣ @api-documenter 生成文档 - "为 ScoreController 生成API文档" - -6️⃣ 开发前端页面 - -7️⃣ @frontend-reviewer 审查前端 - "审查 ScoreList.vue 组件" -``` - -### 性能优化流程 - -```bash -1️⃣ @database-expert 分析慢查询 - "这个查询很慢,帮我分析并优化" - -2️⃣ @backend-reviewer 检查后端性能 - "检查这个Service是否有性能问题" - -3️⃣ @frontend-reviewer 检查前端性能 - "这个页面加载慢,帮我找出原因" -``` - -### 代码质量提升流程 - -```bash -1️⃣ @refactor-expert 识别问题 - "分析这段代码有什么问题" - -2️⃣ @refactor-expert 提供方案 - "提供详细的重构方案" - -3️⃣ 实施重构 - -4️⃣ @backend-reviewer 验证重构 - "审查重构后的代码" - -5️⃣ @test-generator 补充测试 - "为重构后的代码生成测试" -``` - ---- - -## 💡 使用技巧 - -### ✅ 好的提问方式 - -``` -❌ "看看这个代码" -✅ "@backend-reviewer 审查 UserService.java 的性能问题,特别关注数据库查询" - -❌ "写个测试" -✅ "@test-generator 为 ScoreService.createScore() 方法生成单元测试,包含正常和异常场景" - -❌ "优化数据库" -✅ "@database-expert 这个查询执行很慢(贴上EXPLAIN结果),帮我优化并设计合适的索引" -``` - -### 📍 提供清晰的上下文 - -1. **指定文件路径** - ``` - @backend-reviewer 审查 backend/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/ScoreService.java - ``` - -2. **说明具体问题** - ``` - @database-expert 这个查询在数据量大时很慢,经常超过5秒,帮我优化 - ``` - -3. **提供相关代码** - ``` - @refactor-expert 这个方法有100多行,很难维护,请帮我重构 - [贴上代码] - ``` - ---- - -## 🎯 专项任务模板 - -### 新建数据表 -``` -@database-expert -需求:设计一个问卷调查表 -字段要求: -- 问卷ID(主键) -- 问卷标题 -- 问卷描述 -- 状态(草稿/已发布/已关闭) -- 创建人、创建时间、更新时间 -- 需要关联到监区表 - -请设计完整的建表SQL,包括索引和注释 -``` - -### 代码审查检查清单 -``` -@backend-reviewer -请审查以下方面: -1. 代码规范和可读性 -2. 安全性(SQL注入、权限控制) -3. 性能问题(N+1查询、缓存使用) -4. 异常处理 -5. 日志记录 - -[贴上代码] -``` - -### 生成完整测试 -``` -@test-generator -请为 QuestionnaireService 生成完整测试: -1. 测试创建问卷(正常、重复、参数校验) -2. 测试查询问卷(分页、条件查询) -3. 测试更新问卷(状态流转、并发) -4. 测试删除问卷(软删除、权限) - -使用 JUnit 5 和 Mockito -``` - -### API文档生成 -``` -@api-documenter -为 QuestionnaireController 生成API文档,包括: -1. 所有接口的请求参数和响应格式 -2. 实际的cURL调用示例 -3. 常见错误码说明 -4. 接口调用流程图 - -使用Markdown格式 -``` - ---- - -## 🔄 组合使用案例 - -### Case 1: 接手遗留代码 -```bash -# 第一步:理解代码结构 -@refactor-expert "分析这个Service的职责和代码问题" - -# 第二步:识别改进点 -@backend-reviewer "列出这个类的主要问题" - -# 第三步:补充测试 -@test-generator "先生成测试保护现有功能" - -# 第四步:逐步重构 -@refactor-expert "提供分步骤的重构方案" -``` - -### Case 2: 性能调优 -```bash -# 第一步:数据库层面 -@database-expert "分析这些慢查询日志并优化" - -# 第二步:后端层面 -@backend-reviewer "检查缓存使用和查询方式" - -# 第三步:前端层面 -@frontend-reviewer "检查是否有不必要的渲染和请求" -``` - -### Case 3: 新功能开发 -```bash -# 设计阶段 -@database-expert "设计数据模型" - -# 开发阶段 -# (自己开发) - -# 审查阶段 -@backend-reviewer "审查后端实现" -@frontend-reviewer "审查前端实现" - -# 质量保证 -@test-generator "生成测试代码" -@api-documenter "生成接口文档" -``` - ---- - -## ⚡ 快捷命令 - -```bash -# 列出所有agents -/agents - -# 查看某个agent的详细配置 -@backend-reviewer /help - -# 切换到不同的agent -@frontend-reviewer -``` - ---- - -## 🎓 学习建议 - -1. **从简单任务开始**: 先用agents做代码审查,熟悉它们的风格 -2. **逐步尝试复杂任务**: 尝试让agents生成代码和测试 -3. **调整优化**: 根据反馈改进你的提问方式 -4. **形成习惯**: 将agents集成到日常开发流程中 - ---- - -## 📞 获取帮助 - -- 查看完整文档:`README.md` -- 查看agent配置:`.claude/agents/*.md` -- 实验和探索:agents很智能,大胆尝试! - ---- - -**记住**: Agents 是你的AI编程助手,充分利用它们提升开发效率! 🚀 diff --git a/.claude/agents/README.md b/.claude/agents/README.md deleted file mode 100644 index d002060..0000000 --- a/.claude/agents/README.md +++ /dev/null @@ -1,237 +0,0 @@ -# Claude Code Agents 使用指南 - -本项目包含 6 个专业的 Claude Code Subagents,用于提升开发效率和代码质量。 - -## 📋 可用的 Agents - -### 1. 🔍 Backend Reviewer(后端代码审查专家) -**文件**: `backend-reviewer.md` -**用途**: 审查 Java/Spring Boot 后端代码 - -**适用场景**: -- 代码提交前的质量检查 -- 识别安全漏洞和性能问题 -- 验证 Spring Boot 最佳实践 -- 审查数据库查询效率 - -**使用方法**: -``` -@backend-reviewer 请审查这个 Service 类的代码质量 -``` - ---- - -### 2. 🎨 Frontend Reviewer(前端代码审查专家) -**文件**: `frontend-reviewer.md` -**用途**: 审查 Vue.js 前端代码 - -**适用场景**: -- 审查组件设计和代码质量 -- 检查 TypeScript 类型使用 -- 识别性能优化机会 -- 验证用户体验设计 - -**使用方法**: -``` -@frontend-reviewer 请审查这个 Vue 组件的性能 -``` - ---- - -### 3. 🗄️ Database Expert(数据库专家) -**文件**: `database-expert.md` -**用途**: 数据库设计和 SQL 优化 - -**适用场景**: -- 设计数据库表结构 -- 优化复杂 SQL 查询 -- 设计索引策略 -- 编写数据迁移脚本 - -**使用方法**: -``` -@database-expert 帮我优化这个 SQL 查询的性能 -``` - -**注意**: 已配置项目数据库连接信息(192.168.10.126:3306/bank_go) - ---- - -### 4. 📖 API Documenter(API 文档专家) -**文件**: `api-documenter.md` -**用途**: 生成和维护 API 文档 - -**适用场景**: -- 根据 Controller 生成 API 文档 -- 编写接口使用示例 -- 维护 API 变更记录 -- 生成 Postman 集合 - -**使用方法**: -``` -@api-documenter 为这个 Controller 生成完整的 API 文档 -``` - ---- - -### 5. 🧪 Test Generator(测试代码生成专家) -**文件**: `test-generator.md` -**用途**: 生成单元测试和集成测试 - -**适用场景**: -- 为 Service 生成单元测试 -- 为 Controller 生成集成测试 -- 为 Vue 组件生成测试 -- 提高代码覆盖率 - -**使用方法**: -``` -@test-generator 为这个 Service 类生成完整的单元测试 -``` - ---- - -### 6. ♻️ Refactor Expert(代码重构专家) -**文件**: `refactor-expert.md` -**用途**: 识别代码问题并提供重构方案 - -**适用场景**: -- 识别代码异味 -- 简化复杂逻辑 -- 应用设计模式 -- 改善代码可维护性 - -**使用方法**: -``` -@refactor-expert 请分析这段代码并提供重构建议 -``` - ---- - -## 🚀 快速开始 - -### 在 Claude Code 中使用 - -1. **列出所有 agents**: - ``` - /agents - ``` - -2. **调用特定 agent**: - ``` - @agent-name 你的任务描述 - ``` - -3. **查看 agent 详情**: - 在 `/agents` 命令中选择对应的 agent 查看完整配置 - -### 组合使用示例 - -#### 场景 1: 开发新功能 -``` -1. @database-expert 设计用户评分表结构 -2. @backend-reviewer 审查生成的 Service 代码 -3. @test-generator 生成单元测试 -4. @api-documenter 生成 API 文档 -``` - -#### 场景 2: 代码优化 -``` -1. @refactor-expert 分析代码问题 -2. @backend-reviewer 审查重构后的代码 -3. @test-generator 补充测试覆盖 -``` - -#### 场景 3: 性能优化 -``` -1. @database-expert 分析慢查询 -2. @backend-reviewer 检查代码性能问题 -3. @frontend-reviewer 检查前端性能瓶颈 -``` - ---- - -## ⚙️ 自定义配置 - -每个 agent 的配置文件都可以根据项目需求进行调整: - -### 修改工具权限 -```yaml -tools: Read, Grep, Glob, Write, Bash -``` - -可用工具: -- `Read` - 读取文件 -- `Grep` - 搜索文本 -- `Glob` - 文件模式匹配 -- `Write` - 写入文件 -- `Bash` - 执行命令 - -### 修改模型 -```yaml -model: sonnet # 或 opus(更强但更慢) -``` - -### 自定义系统提示 -修改 YAML 元数据后的内容,添加项目特定的规则和约定。 - ---- - -## 📌 最佳实践 - -1. **明确任务**: 给 agent 提供清晰具体的任务描述 -2. **提供上下文**: 说明相关的文件路径和代码位置 -3. **迭代改进**: 根据 agent 的反馈逐步优化 -4. **版本控制**: 将 `.claude/agents/` 纳入 Git 版本管理 -5. **团队协作**: 团队成员共享和改进 agent 配置 - ---- - -## 🔧 故障排除 - -### Agent 无法找到 -- 确保文件在 `.claude/agents/` 目录下 -- 检查文件名和 `name` 字段是否一致 -- 重启 Claude Code - -### Agent 权限不足 -- 检查 `tools` 配置是否包含所需工具 -- 确认文件路径可访问 - -### Agent 响应不符合预期 -- 调整系统提示,提供更具体的指令 -- 添加示例和约束条件 -- 考虑使用更强大的模型(opus) - ---- - -## 📚 相关资源 - -- [Claude Code 官方文档](https://docs.anthropic.com/) -- [Spring Boot 最佳实践](https://spring.io/guides) -- [Vue.js 风格指南](https://vuejs.org/style-guide/) -- [MySQL 性能优化](https://dev.mysql.com/doc/) - ---- - -## 🤝 贡献 - -欢迎根据项目需求改进这些 agents: - -1. Fork 配置文件 -2. 添加新的 agent 或改进现有的 -3. 提交 Pull Request -4. 分享最佳实践 - ---- - -## 📝 更新日志 - -### v1.0.0 (2026-01-13) -- ✨ 初始版本 -- ✅ 创建 6 个专业 agents -- 📖 完整的使用文档 - ---- - -**提示**: 这些 agents 会随着项目发展不断改进,建议定期review和更新配置。 diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000..0766bf0 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,9 @@ +{ + "enabledPlugins": { + "jvm-languages@claude-code-workflows": true, + "javascript-typescript@claude-code-workflows": true, + "backend-development@claude-code-workflows": true, + "database-design@claude-code-workflows": true, + "unit-testing@claude-code-workflows": true + } +} diff --git a/.gitignore b/.gitignore index f7bd0e1..f9b09f0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,96 @@ -# Generated codegen files +# ========== General ========== +.DS_Store +Thumbs.db +*.swp +*.swo +*~ +.env +.env.local +.env.*.local +.vscode/ +.idea/ +*.iml +*.log +.history/ codegen/ + +# ========== Frontend (separate repo) ========== +frontend/ +node_modules/ +package-lock.json +package.json + +# ========== Java/Maven ========== +target/ +.mvn/ +.mvn.tgz +mvnw +mvnw.cmd +*.class +.project +.classpath +.settings/ +.gradle/ +build/ +!gradle/wrapper/gradle-wrapper.jar +!.gitignore +!.gitattributes +!.gitkeep +.apt_generated +spring-loaded.properties +jmx.properties +.flattened-pom.xml +generated/ +dist/ +dist-srpm/ +SRPMS/ +*.rpm +.deb +.deploy +.cdt/ +.cproject +.externalToolBuilders/ +.launch/ +launch/ +.rav +spring-*.xml +sts/.classpath +sts/.project +.sts4-build/ +*.apk +*.ap_ +*.dex +*.dex +*.class +/bin/ +/gen/ +/generated/ +/build/ +/captures/ +.externalNativeBuild/ +.cxx/ +*.pyc +*.pyo +*.pdb +*.pem +*.keystore +.jks +*.bks +*.rks +hs_err_pid* +replay_pid* + +# ========== Node.js/Vue ========== +dist/ +dist-ssr +*.local +pnpm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-store/ +.eslintcache +.stylelintcache +coverage/ +.nyc_output/ +*.tsbuildinfo +vite.config.ts.timestamp-* diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 0000000..c773e90 --- /dev/null +++ b/.mcp.json @@ -0,0 +1,17 @@ +{ + "mcpServers": { +"mysql": { + "command": "npx", + "args": [ + "-y", + "@executeautomation/database-server", + "--mysql", + "--host", "192.168.10.130", + "--database", "xlcp_dev", + "--port", "3306", + "--user", "xlcp_dev", + "--password", "xlcp_dev" + ] + } + } +} \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md index f28975a..a9c72e4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -8,22 +8,29 @@ XL Prison Management System (XL监狱综合管理平台) - A prison management p ## Tech Stack -**Backend**: Java 17, Spring Boot 3.5.9, MyBatis-Plus, Maven multi-module -**Frontend**: Vue 3.5.12, Vite 5.1.4, TypeScript 5.3.3, Element Plus, Pinia, Vue Router -**Database**: MySQL +**Backend**: Java 17, Spring Boot 3.5.9, MyBatis-Plus, Maven multi-module, Spring Security, Swagger/OpenAPI 3 +**Frontend**: Vue 3.5.12, Vite 5.1.4, TypeScript 5.3.3, Element Plus, Pinia, Vue Router, Axios +**Database**: MySQL 8.0+, Redis +**Build Tools**: Maven 3.9+, pnpm 8.6+ ## Commands ### Backend (Java/Maven) ```bash -# Build all modules +# Build all modules (from backend directory) cd backend && mvn clean install -DskipTests -# Build specific module +# Build specific prison module cd backend/yudao-module-prison && mvn clean package -# Run development server +# Run development server (from backend directory) cd backend/yudao-server && mvn spring-boot:run + +# Run tests for prison module +cd backend/yudao-module-prison && mvn test + +# Run single test class +mvn test -Dtest=GenderEnumTest ``` ### Frontend (Vue/Vite) @@ -33,21 +40,25 @@ cd frontend # Install dependencies pnpm install -# Dev server (local mode) +# Dev server (local mode - uses .env.local) pnpm dev -# TypeScript check +# Dev server (development mode - uses .env.dev) +pnpm dev-server + +# TypeScript type checking pnpm ts:check # Build for different environments -pnpm build:local # Local build -pnpm build:dev # Development -pnpm build:test # Testing -pnpm build:prod # Production +pnpm build:local # Local build (uses .env.local) +pnpm build:dev # Development build (uses .env.dev) +pnpm build:test # Testing build (uses .env.test) +pnpm build:prod # Production build (uses .env.prod) -# Linting -pnpm lint:eslint # ESLint fix +# Linting and formatting +pnpm lint:eslint # ESLint check and fix pnpm lint:format # Prettier format +pnpm lint:style # Stylelint check and fix ``` ## Architecture @@ -55,89 +66,361 @@ pnpm lint:format # Prettier format ### Backend Structure ``` backend/ -├── yudao-server/ # Main application entry -├── yudao-framework/ # Core framework (security, web, mybatis, redis, etc.) +├── yudao-server/ # Main application entry (Spring Boot) +├── yudao-framework/ # Core framework modules +│ ├── yudao-spring-boot-starter-web +│ ├── yudao-spring-boot-starter-security +│ ├── yudao-spring-boot-starter-mybatis +│ ├── yudao-spring-boot-starter-redis +│ └── ... ├── yudao-module-system/ # User/permission system module -├── yudao-module-infra/ # Infrastructure module (code gen, config) -└── yudao-module-prison/ # Prison management module (active development) +├── yudao-module-infra/ # Infrastructure (code generation, config) +├── yudao-module-prison/ # Prison management module (active development) +└── yudao-module-temp/ # Temporary/template module ``` **Prison Module Structure** (`yudao-module-prison/`): ``` src/main/java/cn/iocoder/yudao/module/prison/ ├── controller/admin/{module}/ # REST API controllers -│ ├── {Module}Controller.java -│ └── vo/ # Request/Response VO objects +│ ├── {Module}Controller.java # CRUD endpoints +│ └── vo/ # Request/Response VO objects +│ ├── {Module}SaveReqVO.java # Create/Update request +│ ├── {Module}PageReqVO.java # Page query request +│ ├── {Module}RespVO.java # Response object +│ └── ... ├── service/{module}/ # Service layer -│ ├── {Module}Service.java -│ └── impl/{Module}ServiceImpl.java -├── dal/{module}/ # Data access layer (MyBatis-Plus) -├── convert/{module}/ # DO to VO converters -├── enums/ # Enum definitions & error codes +│ ├── {Module}Service.java # Service interface +│ └── impl/ +│ └── {Module}ServiceImpl.java # Service implementation +├── dal/ # Data access layer +│ ├── dataobject/{module}/ # MyBatis-Plus DO objects +│ │ └── {Module}DO.java +│ ├── mysql/{module}/ # MyBatis mappers +│ │ └── {Module}Mapper.java +│ └── dal/ # Data access helpers +├── convert/{module}/ # MapStruct converters +│ └── {Module}Convert.java +├── enums/ # Enum definitions +│ └── {Module}Enum.java └── util/ # Utility classes ``` +**Database Schema Convention**: +- Table prefix: `prison_{module}` +- Common fields: `id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id` +- Soft delete: `deleted` bit(1) field +- Tenant support: `tenant_id` bigint field + ### Frontend Structure ``` frontend/src/ -├── views/{module}/ # Page components -├── api/{module}/ # API definitions +├── views/prison/{module}/ # Page components +│ ├── index.vue # List page with table/search +│ └── {Module}Form.vue # Create/Edit form dialog +├── api/prison/{module}/ # API definitions +│ └── index.ts # Axios API calls + TypeScript types ├── components/ # Shared components -├── store/ # Pinia stores +├── store/ # Pinia stores (state management) ├── router/ # Vue Router config ├── hooks/ # Composable hooks -├── types/ # TypeScript definitions -└── utils/ # Utility functions +├── types/ # TypeScript type definitions +├── utils/ # Utility functions +└── config/ # Configuration files ``` -**Prison Views Pattern**: -``` -views/prison/{module}/ -├── index.vue # List page with search/form -└── {Module}Form.vue # Create/Edit form dialog +**Frontend API Pattern** (`api/prison/{module}/index.ts`): +```typescript +// Interface definitions +export interface Area { + id: number; + name?: string; + code: string; + type: number; + // ... +} + +// API object with methods +export const AreaApi = { + getAreaPage: async (params: any) => { ... }, + getArea: async (id: number) => { ... }, + createArea: async (data: Area) => { ... }, + updateArea: async (data: Area) => { ... }, + deleteArea: async (id: number) => { ... }, + deleteAreaList: async (ids: number[]) => { ... }, + exportArea: async (params) => { ... } +} ``` -**Prison API Pattern**: +**Frontend View Pattern** (`views/prison/{module}/index.vue`): +- Uses Element Plus table with pagination +- Search form with filters +- CRUD operations with dialog forms +- Export functionality +- Batch delete support + +### Data Flow Pattern ``` -api/prison/{module}/index.ts # Axios API calls +Frontend (Vue Component) + ↓ +API Layer (TypeScript + Axios) + ↓ +Backend Controller (REST API) + ↓ +Service Layer (Business Logic) + ↓ +Data Access (MyBatis-Plus) + ↓ +MySQL Database ``` ## Current Integration Status -**8 Modules being integrated into prison module**: -| Module | Chinese | Status | -|--------|---------|--------| -| Area | 监区管理 | In progress | -| Cell | 监室管理 | In progress | -| Consumption | 消费记录 | In progress | -| Question | 问卷问题 | In progress | -| Questionnaire | 问卷模板 | In progress | -| QuestionnaireRecord | 问卷答题记录 | In progress | -| RiskAssessment | 危险评估 | In progress | -| Score | 计分考核 | In progress | +**8 Modules integrated into prison module**: +| Module | Chinese | Backend Path | Frontend Path | Status | +|--------|---------|--------------|---------------|--------| +| Area | 监区管理 | `controller/admin/area/` | `views/prison/area/` | ✅ Complete | +| Cell | 监室管理 | `controller/admin/cell/` | `views/prison/cell/` | ✅ Complete | +| Consumption | 消费记录 | `controller/admin/consumption/` | `views/prison/consumption/` | ✅ Complete | +| Question | 问卷问题 | `controller/admin/question/` | `views/prison/question/` | ✅ Complete | +| Questionnaire | 问卷模板 | `controller/admin/questionnaire/` | `views/prison/questionnaire/` | ✅ Complete | +| QuestionnaireRecord | 问卷答题记录 | `controller/admin/questionnairerecord/` | `views/prison/questionnairerecord/` | ✅ Complete | +| RiskAssessment | 危险评估 | `controller/admin/riskassessment/` | `views/prison/riskassessment/` | ✅ Complete | +| Score | 计分考核 | `controller/admin/score/` | `views/prison/score/` | ✅ Complete | -See `implement/plan.md` for detailed integration tasks. +**Core Features per Module**: +- ✅ RESTful CRUD API endpoints +- ✅ MyBatis-Plus data access layer +- ✅ Request/Response VO objects +- ✅ MapStruct type conversion +- ✅ Frontend list page with pagination +- ✅ Frontend form dialogs for create/edit +- ✅ Export to Excel functionality +- ✅ Batch delete operations +- ✅ Menu permissions SQL scripts -## Database +## Database Configuration **Development Database**: ``` -jdbc:mysql://192.168.10.130:3306/xlcp_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true +URL: jdbc:mysql://192.168.10.130:3306/xlcp_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true +Username: (configured in application-local.yaml) +Password: (configured in application-local.yaml) ``` -SQL scripts located at: -- `backend/yudao-module-prison/src/main/resources/sql/prison_module.sql` - Module tables and menu permissions +**SQL Scripts Location**: +- Module tables and permissions: `backend/yudao-module-prison/src/main/resources/sql/prison_module.sql` +- Execute this script to create all prison module tables and menu permissions -## Configuration +## Configuration Files -**Mock Settings** (application-*.yml): -- `mock-secret`: Mock authentication secret -- `mock-enable`: Enable/disable mock mode (true/false) +### Backend Configuration +**Location**: `backend/yudao-server/src/main/resources/` + +**Key Files**: +- `application.yaml` - Base configuration +- `application-local.yaml` - Local development (port 48080) +- `application-dev.yaml` - Development environment + +**Mock Settings** (application-local.yaml): +```yaml +yudao: + mock: + enable: true + secret: emsoft +``` + +### Frontend Configuration +**Location**: `frontend/` + +**Key Files**: +- `.env.local` - Local development environment +- `.env.dev` - Development environment +- `.env.test` - Testing environment +- `.env.prod` - Production environment + +**Local Environment** (.env.local): +``` +VITE_BASE_URL='http://localhost:48080' +VITE_API_URL='/admin-api' +VITE_DEV=true +``` + +## Development Workflow + +### Adding a New Module +1. **Backend**: + - Create package: `controller/admin/{module}/`, `service/{module}/`, `dal/dataobject/{module}/`, etc. + - Define DO in `dal/dataobject/{module}/{Module}DO.java` + - Create Mapper in `dal/mysql/{module}/{Module}Mapper.java` + - Implement Service in `service/{module}/impl/{Module}ServiceImpl.java` + - Create Controller in `controller/admin/{module}/{Module}Controller.java` + - Define VOs in `controller/admin/{module}/vo/` + - Add MapStruct converter in `convert/{module}/{Module}Convert.java` + - Add enum if needed in `enums/` + +2. **Frontend**: + - Create API: `api/prison/{module}/index.ts` + - Create views: `views/prison/{module}/index.vue` and `{Module}Form.vue` + - Define TypeScript interfaces + - Implement CRUD operations + +3. **Database**: + - Add table creation SQL to `backend/yudao-module-prison/src/main/resources/sql/prison_module.sql` + - Add menu permission SQL + +### Testing a Module +**Backend**: +```bash +# Test all prison module +cd backend/yudao-module-prison && mvn test + +# Test specific class +mvn test -Dtest=PrisonAreaControllerTest +``` + +**Frontend**: +```bash +# Type check only +cd frontend && pnpm ts:check + +# Dev server with hot reload +pnpm dev +``` + +## Common Patterns + +### Backend Controller Pattern +```java +@RestController +@RequestMapping("/prison/{module}") +@Tag(name = "管理后台 - {中文名称}") +public class {Module}Controller { + + @Resource + private {Module}Service {module}Service; + + @PostMapping("/create") + @Operation(summary = "创建{中文名称}") + @PreAuthorize("@ss.hasPermission('prison:{module}:create')") + public CommonResult create(@Valid @RequestBody {Module}SaveReqVO vo) { + return success({module}Service.create(vo)); + } + + @PutMapping("/update") + @Operation(summary = "更新{中文名称}") + @PreAuthorize("@ss.hasPermission('prison:{module}:update')") + public CommonResult update(@Valid @RequestBody {Module}SaveReqVO vo) { + return success({module}Service.update(vo)); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除{中文名称}") + @PreAuthorize("@ss.hasPermission('prison:{module}:delete')") + public CommonResult delete(@RequestParam("id") Long id) { + return success({module}Service.delete(id)); + } + + @GetMapping("/page") + @Operation(summary = "分页查询{中文名称}") + @PreAuthorize("@ss.hasPermission('prison:{module}:query')") + public CommonResult> page(@Valid {Module}PageReqVO vo) { + return success({module}Service.page(vo)); + } + + @GetMapping("/get") + @Operation(summary = "查询{中文名称}详情") + @PreAuthorize("@ss.hasPermission('prison:{module}:query')") + public CommonResult<{Module}RespVO> get(@RequestParam("id") Long id) { + return success({module}Service.get(id)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出{中文名称} Excel") + @PreAuthorize("@ss.hasPermission('prison:{module}:export')") + public void exportExcel(@Valid {Module}PageReqVO vo, HttpServletResponse response) { + {module}Service.exportExcel(vo, response); + } +} +``` + +### Service Layer Pattern +```java +public interface {Module}Service { + Long create({Module}SaveReqVO vo); + Boolean update({Module}SaveReqVO vo); + Boolean delete(Long id); + {Module}RespVO get(Long id); + PageResult<{Module}RespVO> page({Module}PageReqVO vo); + void exportExcel({Module}PageReqVO vo, HttpServletResponse response); +} +``` + +### Frontend API Pattern +```typescript +export interface {Module} { + id: number; + // ... other fields +} + +export const {Module}Api = { + getPage: async (params: any) => { + return await request.get({ url: `/{module}/page`, params }) + }, + get: async (id: number) => { + return await request.get({ url: `/{module}/get?id=${id}` }) + }, + create: async (data: {Module}) => { + return await request.post({ url: `/{module}/create`, data }) + }, + update: async (data: {Module}) => { + return await request.put({ url: `/{module}/update`, data }) + }, + delete: async (id: number) => { + return await request.delete({ url: `/{module}/delete?id=${id}` }) + }, + deleteList: async (ids: number[]) => { + return await request.delete({ url: `/{module}/delete-list?ids=${ids.join(',')}` }) + }, + export: async (params) => { + return await request.download({ url: `/{module}/export-excel`, params }) + } +} +``` ## Important Notes -- Frontend files use `views/prison/` and `api/prison/` paths -- Backend uses package prefix `cn.iocoder.yudao.module.prison` -- Error codes defined in `ErrorCodeConstants.java` -- Enum types defined in `enums/` directory -- Codegen source files in `codegen/` directory +- **Package Prefix**: All prison module classes use `cn.iocoder.yudao.module.prison` +- **API Base Path**: `/admin-api/prison/{module}` +- **Permission Codes**: Follow pattern `prison:{module}:{action}` (e.g., `prison:area:create`) +- **Frontend Paths**: Use `views/prison/` and `api/prison/` directories +- **Database Tables**: Use `prison_` prefix and soft delete (`deleted` field) +- **Error Codes**: Defined in `ErrorCodeConstants.java` (shared across modules) +- **Enum Types**: Defined in `enums/` directory with `Enum` suffix +- **VO Naming**: `SaveReqVO`, `PageReqVO`, `RespVO` suffixes +- **DO Naming**: `{Module}DO` with table mapping via `@TableName` +- **Mapper Naming**: `{Module}Mapper` extending `BaseMapper<{Module}DO>` +- **Service Impl**: Located in `service/{module}/impl/` directory + +## Code Generation + +**Source**: `codegen/` directory contains template files for generating new modules +**Usage**: Copy and adapt these templates when adding new prison modules + +## Build & Deployment + +**Backend JAR**: `backend/yudao-server/target/yudao-server-{version}.jar` +**Frontend Dist**: `frontend/dist/` (static files for nginx) + +## Troubleshooting + +**Common Issues**: +1. **Maven dependency issues**: Run `mvn clean install -U` to force update +2. **Frontend type errors**: Run `pnpm ts:check` to identify issues +3. **Database connection**: Verify MySQL is running and credentials in `application-local.yaml` +4. **Mock mode**: Check `yudao.mock.enable` setting in configuration +5. **Port conflicts**: Default backend port is 48080 + +**Debug Mode**: +- Backend: Add `--debug` to mvn command for remote debugging on port 5005 +- Frontend: Browser dev tools + Vue DevTools browser extension diff --git a/XL监狱综合管理平台-监区犯人管理改造设计方案.md b/XL监狱综合管理平台-监区犯人管理改造设计方案.md new file mode 100644 index 0000000..90ddf45 --- /dev/null +++ b/XL监狱综合管理平台-监区犯人管理改造设计方案.md @@ -0,0 +1,1099 @@ +# XL监狱综合管理平台 - 监区犯人管理改造设计方案 + +> 文档版本:v2.0 +> 创建日期:2026-01-14 +> 状态:待实施 +> 评审专家:监狱业务专家 + +--- + +## 一、背景说明 + +### 1.1 项目概述 + +XL监狱综合管理平台是面向监狱管理的信息化系统,基于芋道源码(yudao-boot-mini)进行二次开发,实现罪犯管理、教育改造、考核评估等业务的规范化、智能化。 + +### 1.2 文档目的 + +本设计文档用于指导系统改造,主要解决以下问题: +1. 监区层级关系缺失(扁平结构改为树形结构) +2. 核心业务流程不完整(出监/移交/调监) +3. 考核评估功能不完善 +4. 数据联动逻辑缺失 + +--- + +## 二、现状问题分析 + +### 2.1 监区管理问题 + +| 问题 | 现状 | 影响 | +|-----|------|------| +| 层级缺失 | 监区为扁平结构,无父子关系 | 无法表达"监区→分监区"层级 | +| 人数不同步 | current_count 为手动维护字段 | 数据不一致风险 | +| 特殊监区混淆 | 用 type 区分"医院/禁闭室" | 与普通监区并列不合理 | + +### 2.2 服刑人员管理问题 + +| 问题 | 现状 | 影响 | +|-----|------|------| +| 出监功能缺失 | 无释放/移交登记功能 | 业务流程不闭环 | +| 调监无记录 | 虽有 prisoner_area_log 表但无功能 | 位置变更无法追溯 | +| 释放无预警 | 临近释放无提醒机制 | 可能漏放 | + +### 2.3 计分考核问题 + +| 问题 | 现状 | 影响 | +|-----|------|------| +| 规则未配置 | 无考核规则配置功能 | 考核标准不统一 | +| 自动计算缺失 | 月度汇总需手动计算 | 工作量大、易出错 | +| 公示功能缺失 | 无考核结果公示模块 | 透明度不足 | + +--- + +## 三、监区层级设计方案 + +### 3.1 中国监狱组织架构参考 + +``` +┌─────────────────────────────────────────────────────────┐ +│ 监狱(行政单位) │ +├─────────────────────────────────────────────────────────┤ +│ 职能科室:办公室、政治处、刑罚执行科、狱政管理科、教育改造科等 │ +├─────────────────────────────────────────────────────────┤ +│ 监区(大队) │ +│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ +│ │ 一监区 │ │ 二监区 │ │ 医院监区│ │ 禁闭室 │ │ +│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │ +│ │ │ │ │ │ +│ ▼ ▼ ▼ ▼ │ +│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ +│ │一分监区 │ │二分监区 │ │ 医疗区 │ │ 禁闭室 │ │ +│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │ +│ │ │ │ │ │ +│ ▼ ▼ ▼ ▼ │ +│ ┌─────────────────────────────────────────────┐ │ +│ │ 监室(101、102、201...) │ │ +│ └─────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────┘ +``` + +### 3.2 数据结构设计 + +#### 3.2.1 监区信息表(改造) + +```sql +-- 改造后的 prison_area 表 +CREATE TABLE IF NOT EXISTS `prison_area` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '监区ID', + `name` varchar(100) NOT NULL COMMENT '监区名称', + `code` varchar(50) NOT NULL COMMENT '监区编码(唯一)', + `parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父级ID,0表示顶级监区', + `level` tinyint NOT NULL DEFAULT 1 COMMENT '级别:1-监区(大队) 2-分监区(中队)', + `type` tinyint NOT NULL DEFAULT 1 COMMENT '类型:1-普通 2-严管 3-集训 4-出监 5-医院 6-禁闭室', + `capacity` int NOT NULL DEFAULT 0 COMMENT '容纳人数', + `current_count` int NOT NULL DEFAULT 0 COMMENT '当前人数(自动计算)', + `sort` int NOT NULL DEFAULT 0 COMMENT '排序', + `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-启用 2-禁用', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_code` (`code`), + KEY `idx_parent_id` (`parent_id`), + KEY `idx_level` (`level`), + KEY `idx_type` (`type`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='监区信息表'; +``` + +**字段变更说明**: + +| 字段 | 原设计 | 新设计 | 说明 | +|-----|-------|-------|------| +| parent_id | 无 | 新增 | 父级ID,支持树形结构 | +| level | 无 | 新增 | 区分监区/分监区 | +| type | 1-普通 2-严管 3-医院 4-禁闭 | 1-普通 2-严管 3-集训 4-出监 5-医院 6-禁闭 | 细化特殊监区类型 | + +#### 3.2.2 监室信息表(改造) + +```sql +-- 改造后的 prison_cell 表(无变更,关联分监区) +CREATE TABLE IF NOT EXISTS `prison_cell` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '监室ID', + `area_id` bigint NOT NULL COMMENT '所属监区ID(关联分监区,即 level=2 的记录)', + `name` varchar(100) NOT NULL COMMENT '监室名称', + `code` varchar(50) NOT NULL COMMENT '监室编码(唯一)', + `bed_count` int NOT NULL DEFAULT 0 COMMENT '床位数量', + `current_count` int NOT NULL DEFAULT 0 COMMENT '当前人数', + `sort` int NOT NULL DEFAULT 0 COMMENT '排序', + `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-启用 2-禁用', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_code` (`code`), + KEY `idx_area_id` (`area_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='监室信息表'; +``` + +**说明**:监室关联的是分监区(level=2),通过分监区的 parent_id 可追溯到监区。 + +#### 3.2.3 服刑人员表(补充字段) + +```sql +-- prison_prisoner 表需要补充的字段 +ALTER TABLE `prison_prisoner` +ADD COLUMN `photo` varchar(500) DEFAULT NULL COMMENT '照片URL' AFTER `idCard`, +ADD COLUMN `release_type` tinyint DEFAULT NULL COMMENT '释放类型:1-刑满 2-假释 3-暂予监外执行 4-减刑 5-移交 6-死亡' AFTER `releaseDate`, +ADD COLUMN `release_reason` varchar(500) DEFAULT NULL COMMENT '释放原因' AFTER `release_type`; +``` + +#### 3.2.4 新增:罪犯区域变动记录表 + +```sql +-- 新增:罪犯区域变动记录表(用于调监追溯) +CREATE TABLE IF NOT EXISTS `prison_prisoner_area_log` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `prisoner_id` bigint NOT NULL COMMENT '罪犯ID', + `prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号', + `from_area_id` bigint DEFAULT NULL COMMENT '原监区ID', + `from_cell_id` bigint DEFAULT NULL COMMENT '原监室ID', + `to_area_id` bigint NOT NULL COMMENT '新监区ID', + `to_cell_id` bigint NOT NULL COMMENT '新监室ID', + `change_type` tinyint NOT NULL COMMENT '变动类型:1-入监分配 2-调监 3-出监 4-移交转入 5-移交转出', + `change_reason` varchar(500) DEFAULT NULL COMMENT '变动原因', + `operator_id` bigint DEFAULT NULL COMMENT '操作人ID', + `operator_name` varchar(50) DEFAULT NULL COMMENT '操作人姓名', + `operate_time` datetime NOT NULL COMMENT '操作时间', + `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`), + KEY `idx_prisoner_id` (`prisoner_id`), + KEY `idx_prisoner_no` (`prisoner_no`), + KEY `idx_operate_time` (`operate_time`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='罪犯区域变动记录表'; +``` + +#### 3.2.5 新增:释放登记记录表 + +```sql +-- 新增:释放登记记录表 +CREATE TABLE IF NOT EXISTS `prison_prisoner_release` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `prisoner_id` bigint NOT NULL COMMENT '罪犯ID', + `prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号', + `prisoner_name` varchar(50) NOT NULL COMMENT '罪犯姓名', + `release_type` tinyint NOT NULL COMMENT '释放类型:1-刑满释放 2-假释 3-暂予监外执行 4-减刑 5-法院裁定释放 6-死亡 7-其他', + `release_reason` varchar(500) DEFAULT NULL COMMENT '释放原因', + `court_name` varchar(100) DEFAULT NULL COMMENT '裁定法院(假释/减刑时)', + `judgment_no` varchar(50) DEFAULT NULL COMMENT '裁定书编号', + `actual_release_date` date NOT NULL COMMENT '实际释放日期', + `handover_person` varchar(100) DEFAULT NULL COMMENT '交接人', + `handover_unit` varchar(200) DEFAULT NULL COMMENT '交接单位(移交时)', + `certificate_type` tinyint DEFAULT NULL COMMENT '证件类型:1-身份证 2-户口簿 3-其他', + `certificate_no` varchar(50) DEFAULT NULL COMMENT '证件号码', + `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-待释放 2-已释放 3-已取消', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + `operator_id` bigint DEFAULT NULL COMMENT '操作人ID', + `operator_name` varchar(50) DEFAULT NULL COMMENT '操作人姓名', + `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`), + KEY `idx_prisoner_id` (`prisoner_id`), + KEY `idx_release_type` (`release_type`), + KEY `idx_actual_release_date` (`actual_release_date`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='释放登记记录表'; +``` + +#### 3.2.6 新增:考核规则配置表 + +```sql +-- 新增:考核规则配置表 +CREATE TABLE IF NOT EXISTS `prison_score_rule` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '规则ID', + `category` tinyint NOT NULL COMMENT '类别:1-劳动改造 2-教育改造 3-日常行为 4-卫生纪律 5-加分项 6-扣分项', + `item_name` varchar(100) NOT NULL COMMENT '项目名称', + `item_code` varchar(50) NOT NULL COMMENT '项目编码(唯一)', + `score` decimal(5,2) NOT NULL COMMENT '分值(加分正数,扣分负数)', + `max_daily_score` decimal(5,2) DEFAULT NULL COMMENT '日最高分限制', + `max_monthly_score` decimal(5,2) DEFAULT NULL COMMENT '月最高分限制', + `description` varchar(500) DEFAULT NULL COMMENT '规则说明', + `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-启用 2-禁用', + `sort` int NOT NULL DEFAULT 0 COMMENT '排序', + `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_item_code` (`item_code`), + KEY `idx_category` (`category`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='考核规则配置表'; +``` + +#### 3.2.7 新增:考核记录明细表 + +```sql +-- 新增:考核记录明细表(日常考核) +CREATE TABLE IF NOT EXISTS `prison_score_detail` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID', + `prisoner_id` bigint NOT NULL COMMENT '罪犯ID', + `prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号', + `record_date` date NOT NULL COMMENT '记录日期', + `rule_id` bigint NOT NULL COMMENT '规则ID', + `score` decimal(5,2) NOT NULL COMMENT '得分', + `score_type` tinyint NOT NULL COMMENT '类型:1-加分 2-扣分', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + `recorder_id` bigint NOT NULL COMMENT '记录人ID', + `recorder_name` varchar(50) DEFAULT NULL COMMENT '记录人姓名', + `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-有效 2-作废', + `creator` varchar(64) DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', + PRIMARY KEY (`id`), + KEY `idx_prisoner_date` (`prisoner_id`, `record_date`), + KEY `idx_rule_id` (`rule_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='考核记录明细表'; +``` + +### 3.3 字典配置 + +```sql +-- 新增字典数据 +INSERT INTO system_dict_data (dict_code, dict_sort, parent_code, dict_label, dict_value, status, create_time) VALUES +-- 监区级别 +('prj_area_level', 1, NULL, '监区(大队)', '1', 0, NOW()), +('prj_area_level', 2, NULL, '分监区(中队)', '2', 0, NOW()), +-- 监区类型(改造后) +('prj_area_type', 1, NULL, '普通监区', '1', 0, NOW()), +('prj_area_type', 2, NULL, '严管监区', '2', 0, NOW()), +('prj_area_type', 3, NULL, '集训监区', '3', 0, NOW()), +('prj_area_type', 4, NULL, '出监监区', '4', 0, NOW()), +('prj_area_type', 5, NULL, '医院监区', '5', 0, NOW()), +('prj_area_type', 6, NULL, '禁闭室', '6', 0, NOW()), +-- 释放类型 +('prj_release_type', 1, NULL, '刑满释放', '1', 0, NOW()), +('prj_release_type', 2, NULL, '假释', '2', 0, NOW()), +('prj_release_type', 3, NULL, '暂予监外执行', '3', 0, NOW()), +('prj_release_type', 4, NULL, '减刑', '4', 0, NOW()), +('prj_release_type', 5, NULL, '法院裁定释放', '5', 0, NOW()), +('prj_release_type', 6, NULL, '死亡', '6', 0, NOW()), +('prj_release_type', 7, NULL, '其他', '7', 0, NOW()), +-- 变动类型 +('prj_area_change_type', 1, NULL, '入监分配', '1', 0, NOW()), +('prj_area_change_type', 2, NULL, '调监', '2', 0, NOW()), +('prj_area_change_type', 3, NULL, '出监', '3', 0, NOW()), +('prj_area_change_type', 4, NULL, '移交转入', '4', 0, NOW()), +('prj_area_change_type', 5, NULL, '移交转出', '5', 0, NOW()), +-- 考核类别 +('prj_score_category', 1, NULL, '劳动改造', '1', 0, NOW()), +('prj_score_category', 2, NULL, '教育改造', '2', 0, NOW()), +('prj_score_category', 3, NULL, '日常行为', '3', 0, NOW()), +('prj_score_category', 4, NULL, '卫生纪律', '4', 0, NOW()), +('prj_score_category', 5, NULL, '加分项', '5', 0, NOW()), +('prj_score_category', 6, NULL, '扣分项', '6', 0, NOW()); +``` + +--- + +## 四、功能改造清单 + +### 4.1 P0 - 核心功能(必须完成) + +| 序号 | 模块 | 功能 | 改造类型 | 预估工时 | 优先级 | +|-----|------|-----|---------|---------|-------| +| 1 | 监区管理 | 树形结构展示 | 新增 | 4h | P0 | +| 2 | 监区管理 | 父级关联配置 | 新增 | 2h | P0 | +| 3 | 监区管理 | 人数自动同步 | 新增 | 4h | P0 | +| 4 | 服刑人员 | 释放登记功能 | 新增 | 6h | P0 | +| 5 | 服刑人员 | 移交登记功能 | 新增 | 6h | P0 | +| 6 | 服刑人员 | 调监记录功能 | 新增 | 4h | P0 | +| 7 | 服刑人员 | 余刑预警提醒 | 新增 | 4h | P0 | +| 8 | 服刑人员 | 照片字段补充 | 改造 | 2h | P0 | +| 9 | 服刑人员 | 释放类型字段 | 改造 | 2h | P0 | +| 10 | 考核管理 | 考核规则配置 | 新增 | 6h | P0 | +| 11 | 考核管理 | 日常考核录入 | 新增 | 4h | P0 | +| 12 | 考核管理 | 月度自动汇总 | 新增 | 4h | P0 | +| 13 | 考核管理 | 考核等级评定 | 新增 | 2h | P0 | + +### 4.2 P1 - 重要功能(计划完成) + +| 序号 | 模块 | 功能 | 改造类型 | 预估工时 | 优先级 | +|-----|------|-----|---------|---------|-------| +| 1 | 监区管理 | 监区人数统计报表 | 新增 | 4h | P1 | +| 2 | 监区管理 | 层级数据导出 | 改造 | 2h | P1 | +| 3 | 服刑人员 | 批量入监登记 | 新增 | 4h | P1 | +| 4 | 服刑人员 | 罪犯详情页 | 新增 | 4h | P1 | +| 5 | 服刑人员 | 位置历史轨迹 | 新增 | 4h | P1 | +| 6 | 考核管理 | 考核结果公示 | 新增 | 4h | P1 | +| 7 | 考核管理 | 考核趋势图表 | 新增 | 4h | P1 | +| 8 | 考核管理 | 减刑假释关联 | 新增 | 4h | P1 | +| 9 | 消费管理 | 消费限额配置 | 新增 | 2h | P1 | +| 10 | 消费管理 | 消费异常预警 | 新增 | 4h | P1 | + +--- + +## 五、详细功能设计 + +### 5.1 监区管理功能设计 + +#### 5.1.1 树形展示逻辑 + +```typescript +// 前端展示数据结构 +interface AreaNode { + id: number; + name: string; + code: string; + level: number; // 1-监区 2-分监区 + type: number; + capacity: number; + currentCount: number; + children?: AreaNode[]; // 子节点 +} +``` + +**展示效果**: + +``` +🔍 搜索:[监区名称____] [类型▽] [状态▽] [搜索] [重置] [+新增监区] + +📋 监区列表(树形) +▼ 一监区 (A01) | 普通 | 容量: 320 | 当前: 285 + ├── ▼ 一监区一分监区 (A01-01) | 普通 | 容量: 85 | 当前: 78 + │ ├── 101监室 | 床位: 10 | 当前: 8 + │ └── 102监室 | 床位: 10 | 当前: 9 + ├── ▼ 一监区二分监区 (A01-02) | 普通 | 容量: 80 | 当前: 72 + │ ├── 201监室 | 床位: 10 | 当前: 7 + │ └── 202监室 | 床位: 10 | 当前: 8 + └── ▼ 一监区三分监区 (A01-03) | 普通 | 容量: 80 | 当前: 70 + ├── 301监室 | 床位: 10 | 当前: 6 + └── 302监室 | 床位: 10 | 当前: 8 + +▼ 二监区 (A02) | 严管 | 容量: 200 | 当前: 156 + └── ... +``` + +#### 5.1.2 人数自动同步逻辑 + +```java +// 人数同步服务 +@Service +public class AreaCountSyncService { + + @Resource + private PrisonerMapper prisonerMapper; + + @Transactional + public void syncAreaCount(Long areaId) { + // 统计该监区(含子监区)下的罪犯数量 + Integer count = prisonerMapper.countByAreaIdOrChildren(areaId); + + // 更新监区当前人数 + areaMapper.updateCurrentCount(areaId, count); + } + + /** + * 罪犯监区变更时触发人数同步 + */ + public void onPrisonerAreaChange(Long prisonerId, Long oldAreaId, Long newAreaId) { + // 1. 同步原监区人数 + syncAreaCount(oldAreaId); + // 2. 同步新监区人数 + syncAreaCount(newAreaId); + // 3. 同步到顶层监区 + Long topAreaId = getTopAreaId(newAreaId); + syncAreaCount(topAreaId); + } +} +``` + +### 5.2 释放登记功能设计 + +#### 5.2.1 释放类型与流程 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ 释放登记流程 │ +├─────────────────────────────────────────────────────────────┤ +│ │ +│ 选择罪犯 ──→ 选择释放类型 ──→ 填写释放信息 ──→ 确认提交 │ +│ │ │ │ │ │ +│ ▼ ▼ ▼ ▼ │ +│ 列表选择 1. 刑满释放 释放日期 状态更新 │ +│ 2. 假释 交接信息 监区变更 │ +│ 3. 暂予监外执行 证件信息 日志记录 │ +│ 4. 减刑 备注 │ +│ 5. 法院裁定 │ +│ 6. 死亡 │ +│ 7. 其他 │ +│ │ +└─────────────────────────────────────────────────────────────┘ +``` + +#### 5.2.2 释放登记表单 + +```typescript +interface ReleaseForm { + prisonerId: number; // 罪犯ID + prisonerNo: string; // 罪犯编号(只读) + prisonerName: string; // 罪犯姓名(只读) + releaseType: number; // 释放类型(必选) + releaseReason: string; // 释放原因 + actualReleaseDate: string; // 实际释放日期(必填) + + // 假释/减刑时需填写 + courtName?: string; // 裁定法院 + judgmentNo?: string; // 裁定书编号 + + // 移交时需填写 + handoverUnit?: string; // 交接单位 + handoverPerson?: string; // 交接人 + + // 证件信息 + certificateType?: number; // 证件类型 + certificateNo?: string; // 证件号码 + + remark?: string; // 备注 +} +``` + +### 5.3 调监功能设计 + +#### 5.3.1 调监流程 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ 调监流程 │ +├─────────────────────────────────────────────────────────────┤ +│ │ +│ 选择罪犯 ──→ 选择目标监区/监室 ──→ 填写原因 ──→ 确认提交 │ +│ │ │ │ │ │ +│ ▼ ▼ ▼ ▼ │ +│ 列表选择 目标监区下拉框 调监原因 状态更新 │ +│ (含分监区) 选择/填写 监区变更 │ +│ 日志记录 │ +│ 人数同步 │ +│ │ +└─────────────────────────────────────────────────────────────┘ +``` + +#### 5.3.2 调监校验规则 + +```java +@Service +public class TransferService { + + /** + * 调监前校验 + */ + public void validateTransfer(Long prisonerId, Long targetCellId) { + Prisoner prisoner = prisonerService.getById(prisonerId); + Cell targetCell = cellService.getById(targetCellId); + + // 1. 校验目标监室是否可用 + if (targetCell.getStatus() != 1) { + throw new ServiceException("目标监室已禁用"); + } + + // 2. 校验床位是否已满 + if (targetCell.getCurrentCount() >= targetCell.getBedCount()) { + throw new ServiceException("目标监室床位已满"); + } + + // 3. 校验严管犯不能调入普通监区 + if (prisoner.getSupervisionLevel() == SupervisionLevelEnum.STRICT + && targetCell.getArea().getType() != AreaTypeEnum.STRICT) { + throw new ServiceException("严管级罪犯不能调入普通监区"); + } + } + + /** + * 执行调监 + */ + @Transactional + public void doTransfer(Long prisonerId, Long targetCellId, String reason, Long operatorId) { + // 1. 校验 + validateTransfer(prisonerId, targetCellId); + + // 2. 获取原位置 + Prisoner prisoner = prisonerService.getById(prisonerId); + Long oldAreaId = prisoner.getPrisonAreaId(); + Long oldCellId = prisoner.getPrisonCellId(); + + // 3. 更新罪犯位置 + Cell targetCell = cellService.getById(targetCellId); + prisoner.setPrisonAreaId(targetCell.getAreaId()); + prisoner.setPrisonCellId(targetCellId); + prisonerService.update(prisoner); + + // 4. 记录变动日志 + prisonerAreaLogService.createLog(prisonerId, oldAreaId, oldCellId, + targetCell.getAreaId(), targetCellId, + ChangeTypeEnum.TRANSFER, reason, operatorId); + + // 5. 同步人数 + areaCountSyncService.onPrisonerAreaChange(prisonerId, oldAreaId, targetCell.getAreaId()); + } +} +``` + +### 5.4 余刑预警设计 + +```java +@Service +public class ReminderService { + + /** + * 定时任务:检查即将释放的罪犯 + * 每天凌晨执行 + */ + @Scheduled(cron = "0 0 2 * * ?") + public void checkUpcomingRelease() { + // 1. 查询30天内即将释放的罪犯 + LocalDate now = LocalDate.now(); + LocalDate thirtyDaysLater = now.plusDays(30); + List upcomingList = prisonerMapper.selectList( + Wrapper.lambdaQuery() + .lt(Prisoner::getReleaseDate, thirtyDaysLater) + .gt(Prisoner::getReleaseDate, now) + .eq(Prisoner::getStatus, PrisonerStatusEnum.IMPRISONED) + ); + + // 2. 发送预警通知 + for (Prisoner prisoner : upcomingList) { + long daysLeft = ChronoUnit.DAYS.between(now, prisoner.getReleaseDate()); + String message = String.format("罪犯[%s]还有%d天即将释放", + prisoner.getName(), daysLeft); + + // 发送系统通知(可根据需求扩展为短信、邮件等) + notifyService.sendWarning(message, NotifyType.RELEASE_REMINDER); + } + + // 3. 查询超期未释放的罪犯(异常情况) + List overdueList = prisonerMapper.selectList( + Wrapper.lambdaQuery() + .lt(Prisoner::getReleaseDate, now) + .eq(Prisoner::getStatus, PrisonerStatusEnum.IMPRISONED) + ); + + for (Prisoner prisoner : overdueList) { + String message = String.format("警告:罪犯[%s]已过释放日期但仍未释放!", + prisoner.getName()); + notifyService.sendUrgent(message, NotifyType.RELEASE_OVERDUE); + } + } +} +``` + +### 5.5 考核规则配置设计 + +```sql +-- 考核规则示例数据 +INSERT INTO prison_score_rule (category, item_name, item_code, score, description, status) VALUES +-- 劳动改造(加分项) +(1, '超额完成生产任务', 'LD_001', 2.00, '完成生产任务120%以上', 1), +(1, '完成生产任务', 'LD_002', 1.00, '完成生产任务100%-120%', 1), +(1, '基本完成生产任务', 'LD_003', 0.50, '完成生产任务80%-100%', 1), + +-- 教育改造(加分项) +(2, '参加义务劳动', 'JY_001', 1.00, '参加监狱组织的义务劳动', 1), +(2, '阅读指定书籍', 'JY_002', 0.50, '完成指定书籍阅读并写心得', 1), +(2, '考试合格', 'JY_003', 1.00, '教育考试分数60分以上', 1), + +-- 日常行为(加分项) +(3, '获得表扬', 'RC_001', 2.00, '获得监狱/监区表扬', 1), +(3, '主动报告隐患', 'RC_002', 1.00, '主动报告安全隐患', 1), + +-- 卫生纪律(扣分项) +(4, '内务不整洁', 'WS_001', -0.50, '个人内务检查不合格', 1), +(4, '违规吸烟', 'WS_002', -2.00, '在禁烟区域吸烟', 1), + +-- 扣分项(通用) +(6, '打架斗殴', 'KO_001', -5.00, '打架斗殴(未造成伤害)', 1), +(6, '打架致伤', 'KO_002', -10.00, '打架致他人伤害', 1), +(6, '私藏违禁品', 'KO_003', -10.00, '私藏违禁物品', 1), +(6, '脱离监管视线', 'KO_004', -3.00, '脱离民警监管视线', 1); +``` + +--- + +## 六、菜单权限设计 + +### 6.1 菜单结构调整 + +```sql +-- 监狱综合管理父菜单(已有) +SELECT @prisonParentId := id FROM system_menu WHERE name = '监狱综合管理'; + +-- 1. 监区信息管理(改造) +UPDATE system_menu SET name = '监区信息管理', path = 'area', component = 'views/prison/area/index.vue' +WHERE parent_id = @prisonParentId AND name = '监区信息管理'; + +-- 2. 新增:释放登记管理菜单 +INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status, component_name) +VALUES ('释放登记管理', '', 2, 3, @prisonParentId, 'release', 'ep:document-checked', 'views/prison/release/index.vue', 0, 'Release'); +SELECT @releaseParentId := LAST_INSERT_ID(); +INSERT INTO system_menu (name, permission, type, sort, parent_id) VALUES +('释放登记查询', 'prison:release:query', 3, 1, @releaseParentId), +('释放登记创建', 'prison:release:create', 3, 2, @releaseParentId), +('释放登记导出', 'prison:release:export', 3, 3, @releaseParentId); + +-- 3. 新增:调监管理菜单(合并到服刑人员管理) +INSERT INTO system_menu (name, permission, type, sort, parent_id) VALUES +('服刑人员调监', 'prison:prisoner:transfer', 3, 4, (SELECT id FROM system_menu WHERE parent_id = @prisonParentId AND name = '服刑人员管理')); + +-- 4. 新增:考核规则配置菜单 +INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status, component_name) +VALUES ('考核规则配置', '', 2, 9, @prisonParentId, 'score-rule', 'ep:setting', 'views/prison/score-rule/index.vue', 0, 'ScoreRule'); +SELECT @scoreRuleParentId := LAST_INSERT_ID(); +INSERT INTO system_menu (name, permission, type, sort, parent_id) VALUES +('考核规则查询', 'prison:score-rule:query', 3, 1, @scoreRuleParentId), +('考核规则创建', 'prison:score-rule:create', 3, 2, @scoreRuleParentId), +('考核规则更新', 'prison:score-rule:update', 3, 3, @scoreRuleParentId), +('考核规则删除', 'prison:score-rule:delete', 3, 4, @scoreRuleParentId); +``` + +--- + +## 七、前端改造点 + +### 7.1 监区管理页面改造 + +**文件**:`frontend/src/views/prison/area/index.vue` + +**改造点**: +1. 使用 Element Plus Tree 组件展示层级结构 +2. 新增/编辑时增加父级选择和级别选择 +3. 移除原有的监区类型(医院/禁闭室独立为同级) + +```vue + +``` + +### 7.2 新增页面 + +| 页面 | 路径 | 功能 | +|-----|------|-----| +| 释放登记列表 | `views/prison/release/index.vue` | 释放登记CRUD | +| 释放登记表单 | `views/prison/release/ReleaseForm.vue` | 释放登记弹窗 | +| 考核规则列表 | `views/prison/score-rule/index.vue` | 规则配置CRUD | +| 考核规则表单 | `views/prison/score-rule/ScoreRuleForm.vue` | 规则编辑弹窗 | +| 考核录入 | `views/prison/score-record/index.vue` | 日常考核录入 | +| 调监弹窗 | `views/prison/prisoner/TransferDialog.vue` | 调监操作 | + +### 7.3 API 新增 + +```typescript +// api/prison/release/index.ts +export interface Release { + id: number; + prisonerId: number; + prisonerNo: string; + prisonerName: string; + releaseType: number; + releaseReason: string; + actualReleaseDate: string; + courtName?: string; + judgmentNo?: string; + status: number; +} + +export const ReleaseApi = { + getReleasePage: (params) => request.get({ url: '/prison/release/page', params }), + getRelease: (id) => request.get({ url: `/prison/release/get?id=${id}` }), + createRelease: (data) => request.post({ url: '/prison/release/create', data }), + exportRelease: (params) => request.download({ url: '/prison/release/export-excel', params }) +} + +// api/prison/score-rule/index.ts +export const ScoreRuleApi = { + getRulePage: (params) => request.get({ url: '/prison/score-rule/page', params }), + createRule: (data) => request.post({ url: '/prison/score-rule/create', data }), + updateRule: (data) => request.put({ url: '/prison/score-rule/update', data }), + deleteRule: (id) => request.delete({ url: `/prison/score-rule/delete?id=${id}` }), + getRuleByCategory: (category) => request.get({ url: `/prison/score-rule/list-by-category?category=${category}` }) +} + +// api/prison/prisoner/index.ts 新增 +export const PrisonerApi = { + // ... 现有方法 + + // 调监 + transfer: (data: { prisonerId: number; targetCellId: number; reason: string }) => + request.put({ url: '/prison/prisoner/transfer', data }), + + // 罪犯详情 + getDetail: (id: number) => request.get({ url: `/prison/prisoner/get-detail?id=${id}` }), + + // 获取位置历史 + getAreaHistory: (id: number) => request.get({ url: `/prison/prisoner/get-area-history?id=${id}` }) +} +``` + +--- + +## 八、后端改造点 + +### 8.1 Controller 新增 + +| Controller | 路径 | 功能 | +|-----------|------|-----| +| ReleaseController | controller/admin/release/ | 释放登记CRUD | +| ScoreRuleController | controller/admin/scorerule/ | 考核规则CRUD | +| PrisonerController 新增 | controller/admin/prisoner/ | 调监接口 | + +### 8.2 Service 新增/改造 + +```java +// 新增:释放登记服务 +public interface ReleaseService { + PageResult page(ReleasePageReqVO vo); + Long create(ReleaseSaveReqVO vo); + void update(ReleaseSaveReqVO vo); + ReleaseRespVO get(Long id); + void doRelease(Long id, Long operatorId); // 执行释放 + void cancelRelease(Long id, Long operatorId); // 取消释放 +} + +// 新增:调监服务 +public interface TransferService { + void validateTransfer(Long prisonerId, Long targetCellId); + void doTransfer(Long prisonerId, Long targetCellId, String reason, Long operatorId); +} + +// 改造:AreaService +public interface AreaService { + // 原有方法... + + // 新增:获取树形结构 + List getAreaTree(); + + // 新增:获取子监区列表 + List getChildAreas(Long parentId); + + // 新增:同步人数 + void syncCurrentCount(Long areaId); +} + +// 改造:AreaServiceImpl - 人数同步逻辑 +@Service +public class AreaServiceImpl implements AreaService { + + @Resource + private PrisonerMapper prisonerMapper; + + @Override + @Transactional + public void syncCurrentCount(Long areaId) { + // 递归同步所有子监区 + List children = getChildAreas(areaId); + int totalCount = 0; + for (AreaDO child : children) { + syncCurrentCount(child.getId()); + totalCount += child.getCurrentCount(); + } + + // 统计罪犯数量(当前监区的罪犯 + 子监区的罪犯) + Integer count = prisonerMapper.countByAreaIdOrChildren(areaId); + + // 更新 + updateCurrentCount(areaId, count); + } +} +``` + +### 8.3 Mapper 新增 + +```java +// PrisonerMapper 新增方法 +public interface PrisonerMapper extends BaseMapper { + + /** + * 统计某监区(含子监区)下的罪犯数量 + */ + Integer countByAreaIdOrChildren(@Param("areaId") Long areaId); + + /** + * 查询即将释放的罪犯 + */ + List selectUpcomingRelease(@Param("startDate") LocalDate startDate, + @Param("endDate") LocalDate endDate); + + /** + * 查询超过释放日期仍未释放的罪犯 + */ + List selectOverdueRelease(@Param("date") LocalDate date); +} +``` + +--- + +## 九、数据库迁移脚本 + +### 9.1 监区表迁移 + +```sql +-- 1. 添加新字段 +ALTER TABLE `prison_area` +ADD COLUMN `parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父级ID,0表示顶级监区' AFTER `code`, +ADD COLUMN `level` tinyint NOT NULL DEFAULT 1 COMMENT '级别:1-监区(大队) 2-分监区(中队)' AFTER `parent_id`; + +-- 2. 更新现有数据(将原来的监区设置为顶级,分监区暂不处理) +-- 假设原有的都是监区(大队)级别 +UPDATE `prison_area` SET `level` = 1, `parent_id` = 0; + +-- 3. 更新字典(删除旧的,增加新的) +DELETE FROM system_dict_data WHERE dict_code = 'PRISON_AREA_TYPE'; + +INSERT INTO system_dict_data (dict_code, dict_sort, dict_label, dict_value, status) VALUES +('PRISON_AREA_TYPE', 1, '普通监区', '1', 0), +('PRISON_AREA_TYPE', 2, '严管监区', '2', 0), +('PRISON_AREA_TYPE', 3, '集训监区', '3', 0), +('PRISON_AREA_TYPE', 4, '出监监区', '4', 0), +('PRISON_AREA_TYPE', 5, '医院监区', '5', 0), +('PRISON_AREA_TYPE', 6, '禁闭室', '6', 0); +``` + +### 9.2 创建新表 + +```sql +-- 1. 创建罪犯区域变动记录表 +CREATE TABLE IF NOT EXISTS `prison_prisoner_area_log` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `prisoner_id` bigint NOT NULL, + `prisoner_no` varchar(50) NOT NULL, + `from_area_id` bigint DEFAULT NULL, + `from_cell_id` bigint DEFAULT NULL, + `to_area_id` bigint NOT NULL, + `to_cell_id` bigint NOT NULL, + `change_type` tinyint NOT NULL, + `change_reason` varchar(500) DEFAULT NULL, + `operator_id` bigint DEFAULT NULL, + `operator_name` varchar(50) DEFAULT NULL, + `operate_time` datetime NOT NULL, + `creator` varchar(64) DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT b'0', + `tenant_id` bigint NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + KEY `idx_prisoner_id` (`prisoner_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 2. 创建释放登记记录表 +CREATE TABLE IF NOT EXISTS `prison_prisoner_release` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `prisoner_id` bigint NOT NULL, + `prisoner_no` varchar(50) NOT NULL, + `prisoner_name` varchar(50) NOT NULL, + `release_type` tinyint NOT NULL, + `release_reason` varchar(500) DEFAULT NULL, + `court_name` varchar(100) DEFAULT NULL, + `judgment_no` varchar(50) DEFAULT NULL, + `actual_release_date` date NOT NULL, + `handover_person` varchar(100) DEFAULT NULL, + `handover_unit` varchar(200) DEFAULT NULL, + `certificate_type` tinyint DEFAULT NULL, + `certificate_no` varchar(50) DEFAULT NULL, + `status` tinyint NOT NULL DEFAULT 1, + `remark` varchar(500) DEFAULT NULL, + `operator_id` bigint DEFAULT NULL, + `operator_name` varchar(50) DEFAULT NULL, + `creator` varchar(64) DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) DEFAULT '', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT b'0', + `tenant_id` bigint NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + KEY `idx_prisoner_id` (`prisoner_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 3. 创建考核规则配置表 +CREATE TABLE IF NOT EXISTS `prison_score_rule` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `category` tinyint NOT NULL, + `item_name` varchar(100) NOT NULL, + `item_code` varchar(50) NOT NULL, + `score` decimal(5,2) NOT NULL, + `max_daily_score` decimal(5,2) DEFAULT NULL, + `max_monthly_score` decimal(5,2) DEFAULT NULL, + `description` varchar(500) DEFAULT NULL, + `status` tinyint NOT NULL DEFAULT 1, + `sort` int NOT NULL DEFAULT 0, + `creator` varchar(64) DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updater` varchar(64) DEFAULT '', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT b'0', + `tenant_id` bigint NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_item_code` (`item_code`), + KEY `idx_category` (`category`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- 4. 创建考核记录明细表 +CREATE TABLE IF NOT EXISTS `prison_score_detail` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `prisoner_id` bigint NOT NULL, + `prisoner_no` varchar(50) NOT NULL, + `record_date` date NOT NULL, + `rule_id` bigint NOT NULL, + `score` decimal(5,2) NOT NULL, + `score_type` tinyint NOT NULL, + `remark` varchar(500) DEFAULT NULL, + `recorder_id` bigint NOT NULL, + `recorder_name` varchar(50) DEFAULT NULL, + `status` tinyint NOT NULL DEFAULT 1, + `creator` varchar(64) DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `deleted` bit(1) NOT NULL DEFAULT b'0', + `tenant_id` bigint NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + KEY `idx_prisoner_date` (`prisoner_id`, `record_date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +``` + +### 9.3 服刑人员表补充字段 + +```sql +ALTER TABLE `prison_prisoner` +ADD COLUMN `photo` varchar(500) DEFAULT NULL COMMENT '照片URL' AFTER `idCard`, +ADD COLUMN `release_type` tinyint DEFAULT NULL COMMENT '释放类型:1-刑满 2-假释 3-暂予监外执行 4-减刑 5-移交 6-死亡' AFTER `releaseDate`, +ADD COLUMN `release_reason` varchar(500) DEFAULT NULL COMMENT '释放原因' AFTER `release_type`; +``` + +--- + +## 十、实施计划 + +### 10.1 第一阶段:基础数据改造(P0) + +| 序号 | 任务 | 文件/位置 | 负责人 | +|-----|------|----------|-------| +| 1 | 监区表结构改造 | `AreaDO.java` + SQL | | +| 2 | 监区树形展示 | `area/index.vue` | | +| 3 | 监区新增/编辑表单改造 | `AreaForm.vue` | | +| 4 | 人数同步服务 | `AreaCountSyncService.java` | | +| 5 | 新增字典数据 | SQL脚本 | | + +### 10.2 第二阶段:核心业务功能(P0) + +| 序号 | 任务 | 文件/位置 | 负责人 | +|-----|------|----------|-------| +| 1 | 释放登记模块后端 | `ReleaseController.java`, `ReleaseService.java` | | +| 2 | 释放登记模块前端 | `release/index.vue`, `ReleaseForm.vue` | | +| 3 | 调监功能后端 | `PrisonerController.transfer()`, `TransferService.java` | | +| 4 | 调监功能前端 | `TransferDialog.vue` | | +| 5 | 余刑预警定时任务 | `ReminderService.java` | | +| 6 | 罪犯照片和释放类型字段 | `PrisonerDO.java` | | + +### 10.3 第三阶段:考核管理(P0) + +| 序号 | 任务 | 文件/位置 | 负责人 | +|-----|------|----------|-------| +| 1 | 考核规则模块后端 | `ScoreRuleController.java`, `ScoreRuleService.java` | | +| 2 | 考核规则模块前端 | `score-rule/index.vue`, `ScoreRuleForm.vue` | | +| 3 | 考核记录明细表及服务 | `ScoreDetailService.java` | | +| 4 | 日常考核录入页面 | `score-record/index.vue` | | +| 5 | 月度汇总自动计算 | `ScoreMonthly汇总任务` | | + +### 10.4 第四阶段:统计与优化(P1) + +| 序号 | 任务 | 文件/位置 | 负责人 | +|-----|------|----------|-------| +| 1 | 监区人数统计报表 | 新增页面 | | +| 2 | 罪犯位置历史轨迹 | `prisoner/detail.vue` | | +| 3 | 考核结果公示 | `score/public.vue` | | +| 4 | 批量入监导入 | `prisoner/import.vue` | | +| 5 | 消费限额配置 | `consumption/limit.vue` | | + +--- + +## 十一、验收标准 + +### 功能验收 + +- [ ] 监区支持树形层级展示 +- [ ] 新增监区时可以选择父级和级别 +- [ ] 监区人数随罪犯位置变更自动同步 +- [ ] 支持释放登记(刑满/假释/暂外/减刑等) +- [ ] 支持调监操作并自动记录日志 +- [ ] 释放前30天有预警提醒 +- [ ] 支持考核规则配置 +- [ ] 支持日常考核录入 +- [ ] 月度考核自动汇总计算 + +### 数据验收 + +- [ ] 监区层级关系正确 +- [ ] 监区人数统计准确 +- [ ] 罪犯位置历史记录完整 +- [ ] 释放记录状态流转正确 + +--- + +## 附录 + +### A. 相关文件清单 + +| 类型 | 文件路径 | +|-----|---------| +| 后端-DO | `dal/dataobject/area/AreaDO.java` | +| 后端-DO | `dal/dataobject/PrisonerDO.java` (改造) | +| 后端-Service | `service/area/AreaService.java` (改造) | +| 后端-Service | `service/area/impl/AreaServiceImpl.java` (改造) | +| 后端-Controller | `controller/admin/area/PrisonAreaController.java` (改造) | +| 后端-Controller | `controller/admin/release/PrisonerReleaseController.java` (新增) | +| 后端-Controller | `controller/admin/scorerule/ScoreRuleController.java` (新增) | +| 前端-页面 | `views/prison/area/index.vue` (改造) | +| 前端-页面 | `views/prison/area/AreaForm.vue` (改造) | +| 前端-页面 | `views/prison/release/index.vue` (新增) | +| 前端-页面 | `views/prison/release/ReleaseForm.vue` (新增) | +| 前端-API | `api/prison/area/index.ts` (改造) | +| 前端-API | `api/prison/release/index.ts` (新增) | +| 前端-API | `api/prison/score-rule/index.ts` (新增) | + +### B. 技术债务 + +1. 监区人数同步需要分布式锁(多实例部署时) +2. 大数据量下树形查询性能优化 +3. 定期归档历史变动记录 + +--- + +**文档创建:** Claude AI +**待评审专家:** 监狱业务专家、系统架构师 diff --git a/detail.png b/detail.png new file mode 100644 index 0000000..078762c Binary files /dev/null and b/detail.png differ diff --git a/frontend b/frontend index d4cb996..4be92f6 160000 --- a/frontend +++ b/frontend @@ -1 +1 @@ -Subproject commit d4cb996085114345aca929c551801d2b74328dde +Subproject commit 4be92f62bd27980cc21058cf67bde2545e0be916 diff --git a/image.png b/image.png new file mode 100644 index 0000000..b27acf9 Binary files /dev/null and b/image.png differ diff --git a/prisoner_list.png b/prisoner_list.png new file mode 100644 index 0000000..d13effb Binary files /dev/null and b/prisoner_list.png differ diff --git a/requirements/实施文档-01-监管看板.md b/requirements/实施文档-01-监管看板.md new file mode 100644 index 0000000..1fa9c42 --- /dev/null +++ b/requirements/实施文档-01-监管看板.md @@ -0,0 +1,885 @@ +# 实施文档 - 监管看板 + +> 模块名称:监管看板 +> 关联需求:需求-01-监管看板.md +> 创建日期:2026-01-14 + +--- + +## 一、实施概览 + +### 1.1 功能清单 + +| 序号 | 功能模块 | 后端 | 前端 | 优先级 | +|------|---------|------|------|--------| +| 1 | 核心指标卡片 | ✅ | ✅ | P0 | +| 2 | 年龄分布饼图 | ✅ | ✅ | P0 | +| 3 | 刑期分布饼图 | ✅ | ✅ | P0 | +| 4 | 文化程度饼图 | ✅ | ✅ | P0 | +| 5 | 省份分布地图 | ✅ | ✅ | P0 | +| 6 | 数据脱敏组件 | ✅ | ✅ | P0 | + +### 1.2 预估工时 + +| 阶段 | 后端 | 前端 | 合计 | +|------|------|------|------| +| 数据库 | 0.5h | - | 0.5h | +| 接口开发 | 4h | - | 4h | +| 前端页面 | - | 6h | 6h | +| 联调测试 | 2h | 2h | 4h | +| **总计** | **6.5h** | **8h** | **14.5h** | + +--- + +## 二、数据库实施 + +> **说明**:使用现有表进行统计,无需新增表 +> - "本月已移交" 使用现有的 `prison_prisoner_area_log` 表(调监记录) +> - "本月已释放" 使用现有的 `prison_prisoner_release` 表 + +### 2.1 新增索引 + +```sql +-- 罪犯表:年龄计算需要用到 birthday 字段 +ALTER TABLE prison_prisoner ADD INDEX idx_birthday (birthday); + +-- 释放记录表:按月统计需要 +ALTER TABLE prison_prisoner_release ADD INDEX idx_actual_release_date (actual_release_date); + +-- 监区变动记录表:按月统计需要 +ALTER TABLE prison_prisoner_area_log ADD INDEX idx_operate_time_change_type (operate_time, change_type); +``` + +### 2.3 菜单权限 SQL + +```sql +-- 监管看板菜单 +INSERT INTO system_menu (name, permission, type, sort, path, icon, component, parent_id) +VALUES ('监管看板', '', 2, 1, 'dashboard', 'ep:data-board', 'prison/dashboard/index', + (SELECT id FROM system_menu WHERE name = '监狱管理' LIMIT 1)); + +-- 获取刚插入的菜单ID +SET @dashboard_menu_id = LAST_INSERT_ID(); + +-- 监管看板查询权限 +INSERT INTO system_menu (name, permission, type, sort, parent_id) +VALUES ('监管看板查询', 'prison:dashboard:query', 3, 1, @dashboard_menu_id); +``` + +--- + +## 三、后端实施 + +### 3.1 文件结构 + +``` +backend/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/ +├── controller/admin/dashboard/ +│ ├── PrisonDashboardController.java # 控制器 +│ └── vo/ +│ ├── DashboardStatisticsVO.java # 看板统计响应 +│ ├── DashboardCardVO.java # 卡片数据响应 +│ ├── ChartDataVO.java # 图表数据项 +│ └── ProvinceChartVO.java # 省份数据项 +├── service/dashboard/ +│ ├── PrisonDashboardService.java # 服务接口 +│ └── impl/ +│ └── PrisonDashboardServiceImpl.java # 服务实现 +├── dal/mysql/dashboard/ +│ └── PrisonDashboardMapper.java # Mapper接口 +├── dal/mysql/transfer/ +│ └── PrisonTransferMapper.java # 移交记录Mapper(新增) +└── util/ + └── DataMaskUtils.java # 数据脱敏工具类(新增) +``` + +### 3.2 VO 定义 + +#### 3.2.1 DashboardStatisticsVO.java + +```java +package cn.iocoder.yudao.module.prison.controller.admin.dashboard.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import java.time.LocalDateTime; +import java.util.List; + +@Data +@Schema(description = "管理后台 - 监管看板统计 Response VO") +public class DashboardStatisticsVO { + + // 核心指标卡片 + @Schema(description = "在册罪犯总数") + private Integer totalPrisoners; + + @Schema(description = "本月已释放人数") + private Integer monthlyReleased; + + @Schema(description = "本月已移交人数") + private Integer monthlyTransferred; + + @Schema(description = "当前就医人数") + private Integer hospitalCount; + + @Schema(description = "当前禁闭人数") + private Integer solitaryCount; + + // 图表数据 + @Schema(description = "年龄分布") + private List ageDistribution; + + @Schema(description = "刑期分布") + private List sentenceDistribution; + + @Schema(description = "文化程度分布") + private List educationDistribution; + + @Schema(description = "省份分布") + private List provinceDistribution; + + @Schema(description = "统计时间") + private LocalDateTime statisticsTime; +} +``` + +#### 3.2.2 ChartDataVO.java + +```java +package cn.iocoder.yudao.module.prison.controller.admin.dashboard.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(description = "图表数据项") +public class ChartDataVO { + + @Schema(description = "分组名称", example = "18-30岁") + private String name; + + @Schema(description = "数量", example = "100") + private Integer value; + + @Schema(description = "占比", example = "28.5") + private Double percentage; +} +``` + +#### 3.2.3 ProvinceChartVO.java + +```java +package cn.iocoder.yudao.module.prison.controller.admin.dashboard.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(description = "省份图表数据") +public class ProvinceChartVO { + + @Schema(description = "省份名称", example = "河南省") + private String province; + + @Schema(description = "省份编码", example = "41") + private Integer provinceCode; + + @Schema(description = "人数", example = "156") + private Integer count; +} +``` + +### 3.3 Mapper 接口 + +#### 3.3.1 PrisonDashboardMapper.java + +```java +package cn.iocoder.yudao.module.prison.dal.mysql.dashboard; + +import cn.iocoder.yudao.module.prison.controller.admin.dashboard.vo.ChartDataVO; +import cn.iocoder.yudao.module.prison.controller.admin.dashboard.vo.DashboardCardVO; +import cn.iocoder.yudao.module.prison.controller.admin.dashboard.vo.ProvinceChartVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface PrisonDashboardMapper { + + /** + * 查询核心指标卡片数据 + */ + @Select(""" + SELECT + COALESCE(SUM(CASE WHEN p.status = 1 THEN 1 ELSE 0 END), 0) AS total_prisoners, + COALESCE(SUM(CASE WHEN pa.type = 5 THEN 1 ELSE 0 END), 0) AS hospital_count, + COALESCE(SUM(CASE WHEN pa.type = 6 THEN 1 ELSE 0 END), 0) AS solitary_count + FROM prison_prisoner p + LEFT JOIN prison_area pa ON p.prison_area_id = pa.id + WHERE p.deleted = 0 + """) + DashboardCardVO selectDashboardCards(); + + /** + * 查询本月释放人数 + */ + @Select(""" + SELECT COUNT(*) FROM prison_prisoner_release + WHERE deleted = 0 + AND DATE_FORMAT(actual_release_date, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m') + AND status = 1 + """) + Integer selectMonthlyReleased(); + + /** + * 查询本月调监次数(移交) + * change_type: 1-调入 2-调出 + * 使用现有的 prison_prisoner_area_log 表 + */ + @Select(""" + SELECT COUNT(*) FROM prison_prisoner_area_log + WHERE deleted = 0 + AND change_type IN (1, 2) + AND DATE_FORMAT(operate_time, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m') + """) + Integer selectMonthlyTransferred(); + + /** + * 查询年龄分布 + */ + @Select(""" + SELECT + CASE + WHEN TIMESTAMPDIFF(YEAR, p.birthday, CURDATE()) < 18 THEN '未成年(≤17)' + WHEN TIMESTAMPDIFF(YEAR, p.birthday, CURDATE()) BETWEEN 18 AND 30 THEN '青年(18-30)' + WHEN TIMESTAMPDIFF(YEAR, p.birthday, CURDATE()) BETWEEN 31 AND 50 THEN '中年(31-50)' + WHEN TIMESTAMPDIFF(YEAR, p.birthday, CURDATE()) BETWEEN 51 AND 60 THEN '中老年(51-60)' + ELSE '老龄(60+)' + END AS name, + COUNT(*) AS value + FROM prison_prisoner p + WHERE p.status = 1 AND p.deleted = 0 + GROUP BY name + """) + List selectAgeDistribution(); + + /** + * 查询刑期分布 + */ + @Select(""" + SELECT + CASE + WHEN p.death_sentence_reprieve = 1 THEN '死缓' + WHEN p.life_imprisonment = 1 THEN '无期' + WHEN (COALESCE(p.sentence_years, 0) * 12 + COALESCE(p.sentence_months, 0)) <= 36 THEN '短刑(≤3年)' + WHEN (COALESCE(p.sentence_years, 0) * 12 + COALESCE(p.sentence_months, 0)) BETWEEN 37 AND 120 THEN '中刑(3-10年)' + ELSE '长刑(10年以上)' + END AS name, + COUNT(*) AS value + FROM prison_prisoner p + WHERE p.status = 1 AND p.deleted = 0 + GROUP BY name + """) + List selectSentenceDistribution(); + + /** + * 查询文化程度分布 + */ + @Select(""" + SELECT + CASE p.education + WHEN 1 THEN '文盲' + WHEN 2 THEN '小学' + WHEN 3 THEN '初中' + WHEN 4 THEN '高中' + WHEN 5 THEN '中专' + WHEN 6 THEN '大专' + WHEN 7 THEN '本科' + WHEN 8 THEN '研究生及以上' + ELSE '未知' + END AS name, + COUNT(*) AS value + FROM prison_prisoner p + WHERE p.status = 1 AND p.deleted = 0 + GROUP BY p.education + """) + List selectEducationDistribution(); + + /** + * 查询省份分布 + */ + @Select(""" + SELECT + LEFT(p.native_place, 2) AS province_code, + COUNT(*) AS count + FROM prison_prisoner p + WHERE p.status = 1 AND p.deleted = 0 AND p.native_place IS NOT NULL + GROUP BY LEFT(p.native_place, 2) + """) + List selectProvinceDistributionRaw(); +} +``` + +### 3.4 Service 实现 + +```java +package cn.iocoder.yudao.module.prison.service.dashboard.impl; + +import cn.iocoder.yudao.module.prison.controller.admin.dashboard.vo.*; +import cn.iocoder.yudao.module.prison.dal.mysql.dashboard.PrisonDashboardMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +@Slf4j +@Service +@RequiredArgsConstructor +public class PrisonDashboardServiceImpl implements PrisonDashboardService { + + private final PrisonDashboardMapper dashboardMapper; + + private static final String DASHBOARD_CACHE_KEY = "prison:dashboard:stats:"; + + @Override + @Cacheable(value = "dashboard", key = "#root.target.getCacheKey()", unless = "#result == null") + public DashboardStatisticsVO getDashboardStatistics() { + DashboardStatisticsVO vo = new DashboardStatisticsVO(); + vo.setStatisticsTime(LocalDateTime.now()); + + // 核心指标卡片 + DashboardCardVO cards = dashboardMapper.selectDashboardCards(); + vo.setTotalPrisoners(cards.getTotalPrisoners()); + vo.setHospitalCount(cards.getHospitalCount()); + vo.setSolitaryCount(cards.getSolitaryCount()); + vo.setMonthlyReleased(dashboardMapper.selectMonthlyReleased()); + vo.setMonthlyTransferred(dashboardMapper.selectMonthlyTransferred()); + + // 图表数据 + vo.setAgeDistribution(dashboardMapper.selectAgeDistribution()); + vo.setSentenceDistribution(dashboardMapper.selectSentenceDistribution()); + vo.setEducationDistribution(dashboardMapper.selectEducationDistribution()); + vo.setProvinceDistribution(convertProvinceData(dashboardMapper.selectProvinceDistributionRaw())); + + return vo; + } + + private List convertProvinceData(List rawData) { + // 省份编码转省份名称的映射逻辑 + return rawData.stream() + .map(item -> ProvinceChartVO.builder() + .province(ProvinceCodeMapper.getName(item.getProvinceCode())) + .provinceCode(item.getProvinceCode()) + .count(item.getCount()) + .build()) + .toList(); + } + + public String getCacheKey() { + return DASHBOARD_CACHE_KEY + "all"; + } +} +``` + +### 3.5 Controller + +```java +package cn.iocoder.yudao.module.prison.controller.admin.dashboard; + +import cn.iocoder.yudao.module.prison.controller.admin.dashboard.vo.DashboardStatisticsVO; +import cn.iocoder.yudao.module.prison.service.dashboard.PrisonDashboardService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/prison/dashboard") +@Tag(name = "管理后台 - 监管看板") +@RequiredArgsConstructor +public class PrisonDashboardController { + + private final PrisonDashboardService dashboardService; + + @GetMapping("/statistics") + @Operation(summary = "获取看板统计数据") + @PreAuthorize("@ss.hasPermission('prison:dashboard:query')") + public DashboardStatisticsVO getStatistics() { + return dashboardService.getDashboardStatistics(); + } +} +``` + +### 3.6 数据脱敏工具 + +```java +package cn.iocoder.yudao.module.prison.util; + +import cn.hutool.core.util.StrUtil; + +public class DataMaskUtils { + + /** + * 身份证号脱敏:110101199001011234 -> 110***********1234 + */ + public static String maskIdCard(String idCard) { + if (StrUtil.isBlank(idCard) || idCard.length() < 7) { + return idCard; + } + return idCard.substring(0, 3) + "*".repeat(idCard.length() - 7) + idCard.substring(idCard.length() - 4); + } + + /** + * 手机号脱敏:13812345678 -> 138****5678 + */ + public static String maskPhone(String phone) { + if (StrUtil.isBlank(phone) || phone.length() < 7) { + return phone; + } + return phone.substring(0, 3) + "****" + phone.substring(phone.length() - 4); + } + + /** + * 姓名脱敏:张三丰 -> 张** + */ + public static String maskName(String name) { + if (StrUtil.isBlank(name) || name.length() == 1) { + return name; + } + return name.charAt(0) + "*".repeat(name.length() - 1); + } + + /** + * 地址脱敏:北京市海淀区*** -> 北京市海淀区*** + */ + public static String maskAddress(String address) { + if (StrUtil.isBlank(address)) { + return address; + } + int lastSeparator = Math.max(address.lastIndexOf('区'), address.lastIndexOf('县')); + if (lastSeparator > 0 && lastSeparator < address.length() - 1) { + return address.substring(0, lastSeparator + 1) + "***"; + } + return address; + } +} +``` + +--- + +## 四、前端实施 + +### 4.1 文件结构 + +``` +frontend/src/ +├── views/prison/dashboard/ +│ ├── index.vue # 主页面组件 +│ └── components/ +│ ├── StatCard.vue # 指标卡片组件 +│ ├── AgePieChart.vue # 年龄分布饼图 +│ ├── SentencePieChart.vue # 刑期分布饼图 +│ ├── EducationPieChart.vue # 文化程度饼图 +│ └── ChinaMap.vue # 中国地图热力图 +├── api/prison/dashboard/ +│ └── index.ts # API 接口定义 +├── components/DataMaskingCell/ +│ ├── index.vue # 脱敏单元格组件 +│ └── index.ts # 组件类型定义 +└── plugins/echarts.ts # ECharts 地图注册 +``` + +### 4.2 API 定义 + +```typescript +// frontend/src/api/prison/dashboard/index.ts + +/** 看板统计响应 */ +export interface DashboardStatisticsVO { + totalPrisoners: number; + monthlyReleased: number; + monthlyTransferred: number; + hospitalCount: number; + solitaryCount: number; + ageDistribution: ChartDataVO[]; + sentenceDistribution: ChartDataVO[]; + educationDistribution: ChartDataVO[]; + provinceDistribution: ProvinceChartVO[]; + statisticsTime: string; +} + +/** 图表数据项 */ +export interface ChartDataVO { + name: string; + value: number; + percentage?: number; +} + +/** 省份数据 */ +export interface ProvinceChartVO { + province: string; + provinceCode: number; + count: number; +} + +export const DashboardApi = { + getStatistics: async (): Promise => { + return await request.get({ url: '/prison/dashboard/statistics' }) + } +} +``` + +### 4.3 指标卡片组件 + +```vue + + + + + + +``` + +### 4.4 主页面 + +```vue + + + + + + +``` + +### 4.5 地图资源配置 + +```typescript +// frontend/src/plugins/echarts.ts +import * as echarts from 'echarts' +import chinaJson from 'echarts/map/json/china.json' + +// 注册中国地图 +echarts.registerMap('china', chinaJson) + +export { echarts } +``` + +> **注意**:需要下载中国地图 JSON 文件到 `frontend/public/china.json` +> 下载地址:https://echarts.apache.org/examples/zh/data/asset/geo/china.json + +### 4.6 路由配置 + +```typescript +// frontend/src/router/routes/modules/prison.ts + +{ + path: 'dashboard', + name: 'PrisonDashboard', + component: () => import('@/views/prison/dashboard/index.vue'), + meta: { + title: '监管看板', + icon: 'ep:data-board', + permission: 'prison:dashboard:query' + } +} +``` + +--- + +## 五、任务分解 + +### 5.1 后端任务 + +> **说明**:使用现有表,无需新建移交记录表 + +| 序号 | 任务 | 负责人 | 预计工时 | 状态 | +|------|------|--------|---------|------| +| 1 | 新增数据库索引 SQL(3个索引) | | 0.5h | 待开发 | +| 2 | 菜单权限 SQL | | 0.5h | 待开发 | +| 3 | VO 类开发(4个文件) | | 1h | 待开发 | +| 4 | PrisonDashboardMapper 接口 | | 1h | 待开发 | +| 5 | PrisonDashboardService 接口和实现 | | 1h | 待开发 | +| 6 | PrisonDashboardController | | 0.5h | 待开发 | +| 7 | DataMaskUtils 工具类 | | 0.5h | 待开发 | +| 8 | 接口测试 | | 1h | 待开发 | + +### 5.2 前端任务 + +| 序号 | 任务 | 负责人 | 预计工时 | 状态 | +|------|------|--------|---------|------| +| 1 | 下载并配置中国地图 JSON | | 0.5h | 待开发 | +| 2 | API 接口定义 | | 0.5h | 待开发 | +| 3 | StatCard 组件 | | 1h | 待开发 | +| 4 | ChinaMap 组件 | | 2h | 待开发 | +| 5 | 主页面开发 | | 2h | 待开发 | +| 6 | 路由配置 | | 0.5h | 待开发 | +| 7 | 联调测试 | | 2h | 待开发 | + +--- + +## 六、验收标准 + +### 6.1 功能验收 + +- [ ] 核心指标卡片数据与数据库一致 +- [ ] 年龄分布饼图按要求分段显示 +- [ ] 刑期分布饼图按要求分段显示 +- [ ] 文化程度饼图按要求分类显示 +- [ ] 中国地图正确显示各省热力分布 +- [ ] 点击地图省份显示详细信息 +- [ ] 响应式布局在各种屏幕尺寸下正常显示 +- [ ] 数据加载时显示骨架屏 + +### 6.2 性能验收 + +- [ ] 页面加载时间 < 3秒 +- [ ] 图表渲染时间 < 1秒 +- [ ] 支持多用户并发访问 + +### 6.3 安全验收 + +- [ ] 敏感信息已配置脱敏规则 +- [ ] 数据权限控制生效(按监区) + +--- + +## 七、联调步骤 + +### 7.1 后端启动 +```bash +cd backend/yudao-module-prison +mvn clean package -DskipTests +cd ../yudao-server +mvn spring-boot:run +``` + +### 7.2 前端启动 +```bash +cd frontend +pnpm dev +``` + +### 7.3 测试数据 +```sql +-- 确保有以下测试数据 +-- 1. 罪犯表有在押状态数据 +-- 2. 释放记录表有本月数据 +-- 3. 监区表有医院(5)和禁闭室(6)类型数据 +``` + +--- + +## 八、风险与应对 + +| 风险 | 等级 | 应对措施 | +|------|------|----------| +| 移交记录表缺失 | 高 | 优先完成数据库设计 | +| 地图 JSON 资源 | 中 | 提前下载或使用 CDN | +| 数据权限复杂性 | 中 | 先实现基础版本,再迭代 | +| 性能问题 | 低 | 添加 Redis 缓存 | + +--- + +## 九、依赖项 + +### 9.1 前置依赖 +- [ ] 罪犯信息管理模块(数据来源) +- [ ] 释放记录模块(数据来源) +- [ ] 监区管理模块(数据来源) + +### 9.2 外部依赖 +- [ ] ECharts 地图 JSON 文件 + +--- + +**文档版本**:v1.0 +**创建日期**:2026-01-14 +**评审人**:前端架构师、后端架构师 diff --git a/requirements/需求-01-监管看板.md b/requirements/需求-01-监管看板.md new file mode 100644 index 0000000..81315bf --- /dev/null +++ b/requirements/需求-01-监管看板.md @@ -0,0 +1,126 @@ +# 需求-01-监管看板 + +> 模块名称:监管看板 +> 优先级:P0 +> 预估工时:18h + +--- + +## 一、业务背景 + +监管看板是系统的首页,为监狱管理者提供全局视角的数据概览,帮助快速掌握监狱运行状态。 + +## 二、用户故事 + +| 角色 | 故事描述 | 优先级 | +|-----|---------|-------| +| 监狱长 | 作为监狱管理者,我希望在首页看到在册罪犯总数,这样我能快速了解监狱规模 | P0 | +| 教导员 | 作为教导员,我希望看到不同年龄段罪犯的分布情况,这样我好制定针对性教育方案 | P0 | +| 狱政科长 | 作为狱政科长,我希望看到不同刑期罪犯的占比,这样我能合理安排警力配置 | P0 | +| 分管领导 | 作为分管领导,我希望看到各省籍贯分布热力图,这样我能了解罪犯构成特点 | P0 | +| 管理员 | 作为系统管理员,我希望敏感信息自动脱敏显示,这样保护罪犯隐私 | P0 | + +## 三、功能需求 + +### 3.1 首页框架 + +**功能描述**:搭建监管看板的整体布局结构 + +**功能列表**: +- 顶部导航菜单配置 +- 左侧侧边栏菜单 +- 主体内容区域布局 +- 响应式适配 + +### 3.2 核心指标卡片 + +**功能描述**:展示监狱关键数据的汇总卡片 + +**指标项**: + +| 指标名称 | 数据来源 | 计算逻辑 | 展示形式 | +|---------|---------|---------|---------| +| 在册罪犯总数 | 罪犯表 | status=在押 count | 数字卡片 | +| 本月已释放 | 释放记录 | 本月释放 count | 数字卡片 | +| 本月已移交 | 移交记录 | 本月移交 count | 数字卡片 | +| 当前就医人数 | 罪犯位置 | 在医院监区 count | 数字卡片 | +| 当前禁闭人数 | 罪犯位置 | 在禁闭室 count | 数字卡片 | + +### 3.3 年龄分布图表 + +**功能描述**:展示罪犯年龄结构分布 + +**展示要求**: +- 使用 ECharts 饼图 +- 年龄分段:未成年(≤17)、青年(18-30)、中年(31-50)、老年(51-60)、老龄(60+) +- 鼠标悬停显示具体人数和占比 +- 支持图例点击筛选 + +### 3.4 刑期分布图表 + +**功能描述**:展示罪犯刑期结构分布 + +**展示要求**: +- 使用 ECharts 饼图 +- 刑期分段:短刑(≤3年)、中刑(3-10年)、长刑(10年以上)、无期、死缓 +- 颜色区分不同刑期类型 + +### 3.5 文化程度图表 + +**功能描述**:展示罪犯文化程度分布 + +**展示要求**: +- 使用 ECharts 饼图 +- 学历分类:文盲、小学、初中、高中、中专、大专、本科、研究生及以上 + +### 3.6 省份分布地图 + +**功能描述**:使用热力图展示罪犯籍贯分布 + +**展示要求**: +- 使用 ECharts 中国地图 +- 按省份着色,深度代表人数多少 +- 点击省份显示该省罪犯数量和占比 + +### 3.7 数据脱敏组件 + +**功能描述**:对敏感信息进行脱敏展示 + +**脱敏规则**: + +| 字段 | 脱敏规则 | 示例 | +|-----|---------|-----| +| 身份证号 | 保留前3后4位,中间用*替代 | 110***********1234 | +| 手机号 | 保留前3后4位,中间用*替代 | 138****5678 | +| 家庭住址 | 详细地址只显示到区县 | 北京市朝阳区*** | +| 姓名 | 只显示第一个字 | 张** | + +## 四、非功能需求 + +### 4.1 性能需求 +- 页面加载时间 < 3秒 +- 图表渲染时间 < 1秒 + +### 4.2 安全需求 +- 敏感数据脱敏展示 +- 数据权限控制(按监区/分监区) + +## 五、验收标准 + +- [ ] 核心指标卡片数据准确 +- [ ] 年龄分布饼图展示正常,交互正常 +- [ ] 刑期分布饼图展示正常 +- [ ] 文化程度饼图展示正常 +- [ ] 中国地图热力图正常显示 +- [ ] 敏感信息自动脱敏 +- [ ] 页面响应式适配正常 + +## 六、相关模块 + +- 依赖:狱政信息管理模块(罪犯数据) +- 依赖:系统管理模块(用户权限) + +--- + +**创建日期**:2026-01-14 +**版本**:v1.0 diff --git a/requirements/需求-02-狱政信息管理.md b/requirements/需求-02-狱政信息管理.md new file mode 100644 index 0000000..f926235 --- /dev/null +++ b/requirements/需求-02-狱政信息管理.md @@ -0,0 +1,247 @@ +# 需求-02-狱政信息管理 + +> 模块名称:狱政信息管理 +> 优先级:P0 +> 预估工时:24h + +--- + +## 一、业务背景 + +狱政信息管理是监狱管理的核心模块,实现罪犯从入监到出监的全生命周期管理。 + +## 二、用户故事 + +| 角色 | 故事描述 | 优先级 | +|-----|---------|-------| +| 狱政干事 | 作为狱政干事,我希望能够登记新入监罪犯的信息,这样罪犯才能正式纳入管理 | P0 | +| 狱政科长 | 作为狱政科长,我希望能够查询所有罪犯信息,这样我好掌握整体情况 | P0 | +| 分监区长 | 作为分监区长,我希望能够查询本分监区的罪犯,这样我能快速找到目标罪犯 | P0 | +| 狱政干事 | 作为狱政干事,我希望能够修改罪犯信息,这样保证信息准确 | P1 | +| 狱政干事 | 作为狱政干事,我希望能够登记罪犯释放信息,这样业务流程完整 | P0 | +| 狱政干事 | 作为狱政干事,我希望能够登记罪犯调监信息,这样追踪罪犯位置变更 | P0 | +| 管理员 | 作为管理员,我希望能够批量导入导出罪犯数据,这样提高工作效率 | P1 | + +## 三、功能需求 + +### 3.1 罪犯信息管理 + +#### 3.1.1 入监登记 + +**功能描述**:登记新入监罪犯的基础信息 + +**表单字段**: + +| 字段分组 | 字段名称 | 必填 | 说明 | +|---------|---------|-----|------| +| **基础信息** | 罪犯编号 | 是 | 系统自动生成或手动录入 | +| | 姓名 | 是 | 罪犯真实姓名 | +| | 性别 | 是 | 男/女 | +| | 身份证号 | 是 | 18位身份证号码 | +| | 出生日期 | 是 | 由身份证号解析或手动填写 | +| | 民族 | 否 | 民族选择 | +| | 籍贯 | 否 | 省市区三级联 | +| | 文化程度 | 否 | 文盲/小学/初中/高中/大专/本科及以上 | +| | 职业 | 否 | 捕前职业 | +| | 家庭住址 | 否 | 详细地址 | +| **刑罚信息** | 罪名 | 是 | 罪名选择或输入 | +| | 刑期-年 | 是 | 数字输入 | +| | 刑期-月 | 是 | 0-11数字输入 | +| | 是否无期 | 是 | 是/否 | +| | 是否死缓 | 是 | 是/否 | +| | 判决法院 | 否 | 判决法院名称 | +| | 判决日期 | 是 | 日期选择 | +| | 判决书编号 | 否 | 判决书文号 | +| | 原判刑期 | 否 | 原判刑期描述 | +| | 入狱日期 | 是 | 日期选择 | +| | 释放日期 | 是 | 根据刑期自动计算或手动调整 | +| **监管信息** | 监管等级 | 是 | 宽管/普管/严管/考察 | +| | 风险等级 | 是 | 高风险/中风险/低风险 | +| | 监区 | 是 | 选择监区 | +| | 分监区 | 是 | 根据监区联动显示 | +| | 监室 | 是 | 根据分监区联动显示 | +| | 状态 | 是 | 默认可选:在押 | + +**业务规则**: +- 释放日期 = 入狱日期 + 刑期(需考虑减刑情况) +- 身份证号需校验格式 +- 编号需唯一 + +#### 3.1.2 罪犯列表 + +**功能描述**:查询和展示罪犯列表 + +**列表字段**: +- 罪犯编号、姓名、性别、身份证号(脱敏) +- 罪名、刑期、入狱日期 +- 监管等级、风险等级 +- 当前监区、当前监室 +- 状态、创建时间 + +**筛选条件**: +- 罪犯编号(模糊搜索) +- 姓名(模糊搜索) +- 性别(下拉选择) +- 罪名(下拉选择) +- 监管等级(下拉选择) +- 风险等级(下拉选择) +- 监区(下拉选择) +- 状态(下拉选择) +- 入狱日期范围(日期区间) + +**操作功能**: +- 查看详情 +- 修改信息 +- 删除(逻辑删除) +- 批量删除 +- 导出Excel + +#### 3.1.3 罪犯详情 + +**功能描述**:查看罪犯详细信息 + +**展示内容**: +- 基础信息卡片 +- 刑罚信息卡片 +- 监管信息卡片 +- 位置变更历史 +- 考核记录汇总 +- 测评记录汇总 +- 消费记录汇总 + +#### 3.1.4 罪犯信息修改 + +**功能描述**:修改罪犯信息 + +**规则**: +- 部分字段修改需要审批(如刑期变更) +- 修改记录需要留痕 + +### 3.2 出监管理 + +#### 3.2.1 释放登记 + +**功能描述**:登记罪犯释放信息 + +**释放类型**: +- 刑满释放 +- 假释 +- 暂予监外执行 +- 减刑 +- 法院裁定释放 +- 死亡 +- 其他 + +**表单字段**: +- 罪犯选择(从列表选择或搜索) +- 释放类型 +- 释放原因 +- 实际释放日期 +- 释放凭证(文书编号等) +- 交接人信息 +- 备注 + +**业务流程**: +1. 选择或搜索罪犯 +2. 填写释放信息 +3. 提交审核 +4. 审核通过后更新罪犯状态为"已释放" +5. 记录释放日志 + +#### 3.2.2 移交登记 + +**功能描述**:登记罪犯转监/移交信息 + +**表单字段**: +- 罪犯选择 +- 移交类型(转入/转出) +- 目标监狱 +- 移交原因 +- 移交日期 +- 交接人信息 + +### 3.3 调监管理 + +#### 3.3.1 调监操作 + +**功能描述**:罪犯在监区/监室间的调换 + +**表单字段**: +- 罪犯选择 +- 目标监区 +- 目标分监区 +- 目标监室 +- 调监原因 + +**业务规则**: +- 目标监室床位未满 +- 严管级罪犯不能调入普通监区 +- 调监后自动同步人数 + +#### 3.3.2 位置历史 + +**功能描述**:查看罪犯位置变更历史 + +**展示内容**: +- 时间线展示位置变更记录 +- 包含:变更时间、原位置、新位置、变更原因、操作人 + +### 3.4 批量操作 + +#### 3.4.1 批量导入 + +**功能描述**:通过Excel批量导入罪犯信息 + +**要求**: +- 提供导入模板下载 +- 支持数据校验 +- 显示导入结果(成功/失败数量) +- 失败记录提供下载 + +#### 3.4.2 批量导出 + +**功能描述**:导出罪犯列表 + +**要求**: +- 支持按条件筛选后导出 +- 支持导出全部 +- 敏感字段自动脱敏 + +## 四、业务规则汇总 + +| 规则编号 | 规则描述 | +|---------|---------| +| BR-001 | 罪犯编号全局唯一 | +| BR-002 | 身份证号需符合18位校验规则 | +| BR-003 | 释放日期根据入狱日期和刑期自动计算 | +| BR-004 | 调监时目标监室人数不能超过床位数 | +| BR-005 | 严管级罪犯只能分配在严管监区 | +| BR-006 | 敏感信息在列表页脱敏展示 | +| BR-007 | 罪犯状态变更需要记录变更日志 | + +## 五、验收标准 + +- [ ] 支持入监登记,信息完整 +- [ ] 支持罪犯列表查询和筛选 +- [ ] 支持查看罪犯详情 +- [ ] 支持修改罪犯信息 +- [ ] 支持释放登记 +- [ ] 支持移交登记 +- [ ] 支持调监操作 +- [ ] 支持查看位置历史 +- [ ] 支持批量导入导出 +- [ ] 敏感信息自动脱敏 +- [ ] 数据权限控制(按监区) + +## 六、相关模块 + +- 依赖:监区管理模块(获取监区/监室列表) +- 依赖:字典管理模块(获取选项数据) +- 被依赖:计分考核模块(获取罪犯信息) +- 被依赖:测评管理模块(获取罪犯信息) +- 被依赖:消费管理模块(获取罪犯信息) + +--- + +**创建日期**:2026-01-14 +**版本**:v1.0 diff --git a/requirements/需求-03-计分考核.md b/requirements/需求-03-计分考核.md new file mode 100644 index 0000000..63643cb --- /dev/null +++ b/requirements/需求-03-计分考核.md @@ -0,0 +1,231 @@ +# 需求-03-计分考核 + +> 模块名称:计分考核 +> 优先级:P0 +> 预估工时:24h + +--- + +## 一、业务背景 + +计分考核是监狱对罪犯进行日常管理和改造评价的核心手段,直接关系到罪犯的减刑、假释等处遇变更。 + +## 二、用户故事 + +| 角色 | 故事描述 | 优先级 | +|-----|---------|-------| +| 分监区长 | 作为分监区长,我希望配置考核规则,这样考核标准统一明确 | P0 | +| 考核干事 | 作为考核干事,我希望每天记录罪犯的考核得分,这样客观评价罪犯表现 | P0 | +| 考核干事 | 作为考核干事,我希望自动计算月度总分,这样减少人工计算工作量 | P0 | +| 监狱长 | 作为监狱长,我希望查看考核等级评定结果,这样为减刑假释提供依据 | P0 | +| 罪犯 | 作为罪犯,我希望看到自己的考核得分和等级,这样我知道自己的改造表现 | P1 | +| 考核干事 | 作为考核干事,我希望考核结果公示,这样增加透明度 | P1 | + +## 三、功能需求 + +### 3.1 考核规则配置 + +#### 3.1.1 规则分类 + +**考核类别**: +- 劳动改造 +- 教育改造 +- 日常行为 +- 卫生纪律 +- 加分项 +- 扣分项 + +#### 3.1.2 规则管理 + +**规则字段**: +- 规则编码(唯一) +- 规则名称 +- 所属类别 +- 分值(正数为加分,负数为扣分) +- 日最高分限制 +- 月最高分限制 +- 规则说明 +- 状态(启用/禁用) +- 排序 + +**示例规则**: + +| 类别 | 规则名称 | 分值 | 日限 | 月限 | +|-----|---------|-----|-----|-----| +| 劳动改造 | 超额完成生产任务 | +2 | 5 | 30 | +| 劳动改造 | 完成生产任务 | +1 | 3 | 20 | +| 教育改造 | 参加义务劳动 | +1 | 2 | 10 | +| 教育改造 | 考试合格 | +1 | 3 | 15 | +| 日常行为 | 获得表扬 | +2 | 5 | 20 | +| 日常行为 | 主动报告隐患 | +1 | 2 | 10 | +| 卫生纪律 | 内务不整洁 | -0.5 | -3 | -10 | +| 卫生纪律 | 违规吸烟 | -2 | -5 | -20 | +| 扣分项 | 打架斗殴 | -5 | -10 | -30 | +| 扣分项 | 私藏违禁品 | -10 | -20 | -50 | + +### 3.2 日常考核记录 + +#### 3.2.1 考核录入 + +**功能描述**:为罪犯录入日常考核得分 + +**表单字段**: +- 考核日期(默认当天,可修改) +- 罪犯选择(支持批量选择) +- 考核规则(从规则库选择) +- 得分(根据规则自动带出,可调整) +- 备注说明 + +**业务流程**: +1. 选择考核日期 +2. 选择罪犯(支持搜索、分监区筛选) +3. 选择考核规则 +4. 系统自动带出规则分值 +5. 填写备注 +6. 提交保存 + +#### 3.2.2 考核查询 + +**功能描述**:查询日常考核记录 + +**列表字段**: +- 考核日期 +- 罪犯编号、姓名 +- 监区/分监区 +- 考核类别 +- 规则名称 +- 得分 +- 记录人 +- 操作时间 + +**筛选条件**: +- 考核日期范围 +- 罪犯姓名/编号 +- 监区/分监区 +- 考核类别 +- 规则名称 + +### 3.3 月度考核汇总 + +#### 3.3.1 自动计算 + +**功能描述**:每月自动汇总罪犯考核得分 + +**计算逻辑**: +``` +月度总分 = 基础分 + 当月加分累计 - 当月扣分累计 +``` + +**基础分**: +- 默认100分(可配置) + +**计算规则**: +- 每日考核得分累加 +- 超过日限的按日限计算 +- 超过月限的按月限计算 + +#### 3.3.2 等级评定 + +**功能描述**:根据月度总分评定考核等级 + +**评定标准**(示例,可配置): + +| 等级 | 分值范围 | 说明 | +|-----|---------|-----| +| 优秀 | ≥120分 | 表现突出 | +| 良好 | 100-119分 | 表现良好 | +| 合格 | 80-99分 | 表现一般 | +| 不合格 | <80分 | 表现较差 | + +#### 3.3.3 月度汇总展示 + +**展示内容**: +- 罪犯基础信息 +- 基础分 +- 加分合计 +- 扣分合计 +- 月度总分 +- 考核等级 +- 考核人 +- 审核状态 + +**操作功能**: +- 查看明细 +- 导出报表 +- 提交审核 + +### 3.4 考核公示 + +#### 3.4.1 公示发布 + +**功能描述**:发布考核结果供罪犯查看 + +**公示内容**: +- 公示期间 +- 公示范围(全狱/指定监区) +- 考核结果列表 + +#### 3.4.2 罪犯查询 + +**功能描述**:罪犯查询自己的考核结果 + +**展示内容**: +- 本月得分明细 +- 本月总分 +- 考核等级 +- 与上月对比 + +### 3.5 减刑假释关联 + +#### 3.5.1 考核数据提取 + +**功能描述**:提取用于减刑假释的考核数据 + +**提取内容**: +- 近6个月/月度考核得分 +- 年度累计考核分 +- 表扬次数 +- 警告次数 +- 等级评定记录 + +#### 3.5.2 建议生成 + +**功能描述**:根据考核数据生成减刑假释建议 + +**建议内容**: +- 可申报减刑月份 +- 建议减刑幅度 +- 建议假释意见 + +## 四、业务规则汇总 + +| 规则编号 | 规则描述 | +|---------|---------| +| BR-001 | 每日考核分值不能超过日最高分限制 | +| BR-002 | 每月考核分值不能超过月最高分限制 | +| BR-003 | 考核等级根据配置的标准自动评定 | +| BR-004 | 月度汇总每月1日自动计算 | +| BR-005 | 考核结果公示后才能生效 | +| BR-006 | 不合格等级达到一定次数触发严管 | + +## 五、验收标准 + +- [ ] 支持考核规则的增删改查 +- [ ] 支持日常考核录入(单条/批量) +- [ ] 支持日常考核查询 +- [ ] 支持月度考核自动汇总计算 +- [ ] 支持考核等级评定 +- [ ] 支持考核结果公示 +- [ ] 支持减刑假释数据提取 +- [ ] 考核数据与罪犯信息联动 + +## 六、相关模块 + +- 依赖:狱政信息管理模块(罪犯基础数据) +- 依赖:监区管理模块(获取监区结构) +- 被依赖:评估报告模块(考核数据引用) + +--- + +**创建日期**:2026-01-14 +**版本**:v1.0 diff --git a/requirements/需求-04-测评问卷管理.md b/requirements/需求-04-测评问卷管理.md new file mode 100644 index 0000000..f5789e8 --- /dev/null +++ b/requirements/需求-04-测评问卷管理.md @@ -0,0 +1,228 @@ +# 需求-04-测评问卷管理 + +> 模块名称:测评问卷管理 +> 优先级:P0 +> 预估工时:40h + +--- + +## 一、业务背景 + +测评问卷用于对罪犯进行心理测评、风险评估等,是了解罪犯心理状态和制定管理方案的重要工具。 + +## 二、用户故事 + +| 角色 | 故事描述 | 优先级 | +|-----|---------|-------| +| 教育科长 | 作为教育科长,我希望创建不同类型的测评问卷,这样满足不同测评需求 | P0 | +| 心理辅导员 | 作为心理辅导员,我希望编辑问卷题目,这样问卷内容符合测评目标 | P0 | +| 心理辅导员 | 作为心理辅导员,我希望设置题目分值,这样自动计算测评得分 | P0 | +| 教育科长 | 作为教育科长,我希望发布和下架问卷,这样控制问卷可用状态 | P0 | +| 心理辅导员 | 作为心理辅导员,我希望预览问卷效果,这样发布前检查问卷内容 | P0 | +| 管理员 | 作为管理员,我希望复制已有问卷,这样快速创建相似问卷 | P1 | + +## 三、功能需求 + +### 3.1 问卷分类管理 + +#### 3.1.1 分类列表 + +**分类类型**: +- 心理测评 +- 风险评估 +- 日常调查 +- 入监测评 +- 出监测评 + +#### 3.1.2 分类管理 + +**功能**: +- 新增分类 +- 修改分类 +- 删除分类(无问卷时可删) +- 查看分类下的问卷数量 + +### 3.2 问卷管理 + +#### 3.2.1 问卷列表 + +**列表字段**: +- 问卷标题 +- 所属分类 +- 题目数量 +- 总分值 +- 时限(分钟) +- 状态(草稿/已发布/已下架) +- 创建人 +- 创建时间 +- 发布时间 + +**筛选条件**: +- 分类筛选 +- 状态筛选 +- 标题搜索 +- 创建时间范围 + +#### 3.2.2 创建问卷 + +**问卷属性**: +- 问卷标题(必填) +- 所属分类(必选) +- 问卷描述(可选) +- 时限(分钟,0表示不限时) +- 及格分数(可选) +- 是否允许重考(是/否) +- 状态(默认草稿) + +#### 3.2.3 编辑问卷 + +**功能描述**:修改问卷内容 + +**可编辑项**: +- 问卷属性 +- 题目内容 +- 题目顺序 +- 题目分值 + +**限制**: +- 已发布的问卷不能直接修改 +- 如需修改应先下架 + +#### 3.2.4 问卷预览 + +**功能描述**:预览问卷效果 + +**预览内容**: +- 问卷标题和描述 +- 题目列表(按顺序) +- 题目类型和选项 +- 分值显示 +- 预计完成时间 + +#### 3.2.5 发布/下架 + +**发布操作**: +- 状态从"草稿"变为"已发布" +- 记录发布时间 +- 问卷可用于测评 + +**下架操作**: +- 状态从"已发布"变为"已下架" +- 下架后不可用于新测评 +- 历史测评记录保留 + +#### 3.2.6 问卷复制 + +**功能描述**:创建问卷副本 + +**复制内容**: +- 问卷属性 +- 所有题目(含选项) + +**复制后**: +- 新问卷状态为"草稿" +- 标题自动添加"副本"标识 + +### 3.3 题目管理 + +#### 3.3.1 题目类型 + +| 类型 | 说明 | 评分方式 | +|-----|------|---------| +| 单选题 | 从多个选项中选择一个 | 固定分值 | +| 多选题 | 从多个选项中选择多个 | 按选项得分累加 | +| 判断题 | 判断对错 | 固定分值 | +| 填空题 | 输入文字答案 | 需人工评分 | +| 简述题 | 输入大段文字 | 需人工评分 | +| 评分题 | 选择分数等级 | 固定分值 | + +#### 3.3.2 题目编辑 + +**题目属性**: +- 题目内容(必填) +- 题目类型(必选) +- 题目分值(必填) +- 是否必答(是/否) +- 排序序号 + +**选项管理(单选/多选/判断)**: +- 选项内容 +- 选项分值 +- 是否正确答案(用于自动评分) + +**示例 - 单选题**: +``` +题目:您最近一周的情绪状态如何? +分值:5分 + +选项: +A. 心情愉快 (+5分) +B. 心情一般 (+2分) +C. 心情低落 (0分) +D. 情绪低落 (-2分) +``` + +#### 3.3.3 题目排序 + +**功能**:拖拽调整题目顺序 + +**说明**: +- 序号根据排序自动生成 +- 保存后生效 + +#### 3.3.4 题目分值设置 + +**功能**:配置每题分值 + +**规则**: +- 客观题(单选/多选/判断/评分)可直接设置选项得分 +- 主观题(填空/简述)需人工评分 + +### 3.4 问卷发布流程 + +``` +草稿 → 内容审核 → 发布 → 测评执行 → 下架 → 归档 +``` + +**审核节点(可选)**: +- 发布前增加审核环节 +- 审核人可退回或通过 + +## 四、业务规则汇总 + +| 规则编号 | 规则描述 | +|---------|---------| +| BR-001 | 问卷标题在同一分类下必须唯一 | +| BR-002 | 已发布的问卷不能直接修改内容 | +| BR-003 | 问卷下架后不能再发起新测评 | +| BR-004 | 客观题支持自动评分,主观题需人工评分 | +| BR-005 | 超过时限自动提交(限时的问卷) | +| BR-006 | 不允许重考的问卷,一个罪犯只能答一次 | +| BR-007 | 题目顺序影响试卷展示顺序 | + +## 五、验收标准 + +- [ ] 支持问卷分类管理 +- [ ] 支持问卷的增删改查 +- [ ] 支持问卷预览 +- [ ] 支持问卷发布和下架 +- [ ] 支持问卷复制 +- [ ] 支持单选题编辑 +- [ ] 支持多选题编辑 +- [ ] 支持判断题编辑 +- [ ] 支持填空题编辑 +- [ ] 支持简述题编辑 +- [ ] 支持评分题编辑 +- [ ] 支持题目排序 +- [ ] 支持题目分值设置 + +## 六、相关模块 + +- 依赖:测评执行模块(使用问卷) +- 依赖:测评结果模块(存储答卷) +- 被依赖:危险评估模块(可引用问卷) + +--- + +**创建日期**:2026-01-14 +**版本**:v1.0 diff --git a/requirements/需求-05-测评执行与评分.md b/requirements/需求-05-测评执行与评分.md new file mode 100644 index 0000000..e4a993c --- /dev/null +++ b/requirements/需求-05-测评执行与评分.md @@ -0,0 +1,248 @@ +# 需求-05-测评执行与评分 + +> 模块名称:测评执行与评分 +> 优先级:P0 +> 预估工时:24h + +--- + +## 一、业务背景 + +测评执行是罪犯在线完成测评问卷的过程,系统需要提供良好的答题体验并确保测评数据的完整性和准确性。 + +## 二、用户故事 + +| 角色 | 故事描述 | 优先级 | +|-----|---------|-------| +| 心理辅导员 | 作为心理辅导员,我希望罪犯在线完成测评问卷,这样方便快捷 | P0 | +| 心理辅导员 | 作为心理辅导员,我希望自动计算客观题得分,这样提高工作效率 | P0 | +| 心理辅导员 | 作为心理辅导员,我希望查看测评结果,这样分析罪犯心理状态 | P0 | +| 教育科长 | 作为教育科长,我希望统计分析测评数据,这样了解整体情况 | P1 | +| 罪犯 | 作为罪犯,我希望能够完成测评,这样接受心理评估 | P0 | + +## 三、功能需求 + +### 3.1 在线测评 + +#### 3.1.1 发起测评 + +**功能描述**:为罪犯发起测评任务 + +**发起方式**: +- 单个发起:选择罪犯 + 选择问卷 +- 批量发起:选择多个罪犯 + 选择问卷 +- 按监区发起:选择监区 + 选择问卷 + +**表单字段**: +- 罪犯选择(支持搜索、筛选) +- 问卷选择(根据测评类型筛选) +- 测评说明(可选) +- 截止日期(可选) + +**校验规则**: +- 罪犯状态必须为"在押" +- 问卷状态必须为"已发布" +- 不可重复测评的问卷需要检查是否已测评 + +#### 3.1.2 答题界面 + +**页面布局**: +- 顶部:问卷标题、剩余时间(限时问卷) +- 左侧:题目导航(序号标识) +- 主体:当前题目内容 +- 底部:上一题、下一题、提交按钮 + +**题目展示**: +- 显示题目序号和内容 +- 显示题目分值 +- 显示是否必答 +- 显示选项或输入框 +- 显示已选/已答状态 + +**交互功能**: +- 选项点击选择/取消 +- 填空输入 +- 简述输入 +- 上一题/下一题切换 +- 题目导航快速跳转 +- 剩余时间倒计时 + +**时限处理**: +- 限时问卷显示倒计时 +- 时间到自动提交 +- 超时未提交的题目按0分计 + +#### 3.1.3 提交答卷 + +**提交方式**: +- 手动提交:点击提交按钮 +- 自动提交:时间到自动提交 + +**提交确认**: +- 提交前提示未答题数量 +- 支持返回修改或确认提交 + +**提交后**: +- 客观题自动计算得分 +- 生成测评记录 +- 跳转到完成页面 + +### 3.2 答题记录 + +#### 3.2.1 记录查询 + +**查询条件**: +- 罪犯姓名/编号 +- 问卷名称 +- 测评时间范围 +- 状态(待评估/已完成) + +**列表字段**: +- 测评记录ID +- 罪犯编号、姓名 +- 问卷标题 +- 测评时间 +- 得分 +- 评估结果 +- 状态 +- 操作 + +#### 3.2.2 记录详情 + +**展示内容**: +- 罪犯信息 +- 问卷信息 +- 测评时间 +- 得分详情(每题得分) +- 总分 +- 评估结果 + +**答卷内容**: +- 显示所有题目和答案 +- 客观题显示标准答案 +- 主观题显示作答内容 + +### 3.3 自动评分 + +#### 3.3.1 评分规则 + +**客观题评分**: +- 单选题:选择正确答案得满分,否则得0分 +- 多选题:每个正确选项得相应分值,错误选项扣分 +- 判断题:正确得满分,错误得0分 +- 评分题:按选择分值计算 + +**主观题评分**: +- 填空题:需人工评分 +- 简述题:需人工评分 + +#### 3.3.2 结果生成 + +**总分计算**: +``` +总分 = 客观题得分 + 主观题得分 +``` + +**评估结果**: +- 及格/不及格(根据及格分数线判断) +- 风险等级(根据测评类型和分数判断) +- 测评建议(根据测评类型生成) + +### 3.4 人工评分 + +#### 3.4.1 待评分列表 + +**功能描述**:显示需要人工评分的答卷 + +**筛选条件**: +- 测评时间范围 +- 问卷类型 +- 监区 + +**列表字段**: +- 记录ID +- 罪犯信息 +- 问卷名称 +- 客观题得分 +- 主观题数量 +- 待评分数 + +#### 3.4.2 主观题评分 + +**评分界面**: +- 显示题目和作答内容 +- 输入分数 +- 填写评语(可选) + +**提交后**: +- 更新总分 +- 生成评估结果 + +### 3.5 测评统计分析 + +#### 3.5.1 完成率统计 + +**统计维度**: +- 按问卷统计:各问卷的完成率 +- 按监区统计:各监区的完成率 +- 按时间统计:日/周/月完成数量 + +#### 3.5.2 分数分布统计 + +**统计维度**: +- 按分数段统计人数(0-20, 21-40, 41-60, 61-80, 81-100) +- 及格率统计 +- 平均分统计 + +#### 3.5.3 风险分布统计 + +**统计维度**: +- 高风险人数和占比 +- 中风险人数和占比 +- 低风险人数和占比 + +#### 3.5.4 统计图表 + +**图表类型**: +- 柱状图:完成数量趋势 +- 饼图:分数分布 +- 饼图:风险等级分布 +- 折线图:平均分趋势 + +## 四、业务规则汇总 + +| 规则编号 | 规则描述 | +|---------|---------| +| BR-001 | 限时问卷时间到自动提交 | +| BR-002 | 不允许重考的问卷只能测评一次 | +| BR-003 | 客观题自动评分,主观题需人工评分 | +| BR-004 | 测评记录一旦生成不能删除 | +| BR-005 | 测评过程中刷新页面保留已答题状态 | +| BR-006 | 未登录状态下不能发起测评 | + +## 五、验收标准 + +- [ ] 支持单个发起测评 +- [ ] 支持批量发起测评 +- [ ] 支持按监区发起测评 +- [ ] 答题界面展示正确 +- [ ] 答题交互正常(上一题/下一题/导航) +- [ ] 限时功能正常,时间到自动提交 +- [ ] 提交功能正常 +- [ ] 客观题自动评分正确 +- [ ] 支持人工评分主观题 +- [ ] 测评记录查询正常 +- [ ] 测评详情展示正确 +- [ ] 支持测评统计分析 + +## 六、相关模块 + +- 依赖:测评问卷管理模块(获取问卷) +- 依赖:狱政信息管理模块(获取罪犯列表) +- 被依赖:危险评估模块(测评结果引用) +- 被依赖:评估报告模块(测评数据引用) + +--- + +**创建日期**:2026-01-14 +**版本**:v1.0 diff --git a/requirements/需求-06-狱情平台.md b/requirements/需求-06-狱情平台.md new file mode 100644 index 0000000..1018327 --- /dev/null +++ b/requirements/需求-06-狱情平台.md @@ -0,0 +1,199 @@ +# 需求-06-狱情平台 + +> 模块名称:狱情平台 +> 优先级:P1 +> 预估工时:22h + +--- + +## 一、业务背景 + +狱情平台用于记录和管理狱内发生的各类事件,支持狱情动态跟踪、预警信息管理和事件处理流程。 + +## 二、用户故事 + +| 角色 | 故事描述 | 优先级 | +|-----|---------|-------| +| 狱政科长 | 作为狱政科长,我希望记录狱内发生的重要事件,这样留存管理痕迹 | P1 | +| 分监区长 | 作为分监区长,我希望登记突发事件,这样及时上报 | P1 | +| 监狱长 | 作为监狱长,我希望查看预警信息,这样及时掌握风险 | P1 | +| 狱政干事 | 作为狱政干事,我希望跟踪事件处理进度,这样确保事件闭环 | P1 | +| 管理员 | 作为管理员,我希望管理应急预案,这样突发事件有据可依 | P2 | + +## 三、功能需求 + +### 3.1 狱情动态记录 + +#### 3.1.1 事件登记 + +**事件类型**: +- 监管事件(脱逃、行凶、违规等) +- 安全事件(事故、隐患等) +- 医疗事件(疾病、伤亡等) +- 教育事件(冲突、思想动态等) +- 其他事件 + +**表单字段**: +- 事件标题 +- 事件类型(必选) +- 发生时间(必填) +- 发生地点(监区/分监区) +- 涉及罪犯(可多选) +- 事件描述(详细经过) +- 事件等级(一般/较大/重大/特大) +- 现场处置情况 +- 附件上传(照片、文件等) + +#### 3.1.2 事件列表 + +**列表字段**: +- 事件编号 +- 事件标题 +- 事件类型 +- 发生时间 +- 发生地点 +- 事件等级 +- 处理状态 +- 登记人 +- 登记时间 + +**筛选条件**: +- 事件类型 +- 发生时间范围 +- 事件等级 +- 处理状态 +- 发生地点 + +#### 3.1.3 事件详情 + +**展示内容**: +- 事件基本信息 +- 涉及罪犯列表 +- 事件经过 +- 处置情况 +- 附件列表 +- 处理记录时间线 + +### 3.2 预警信息管理 + +#### 3.2.1 预警规则配置 + +**预警类型**: +- 罪犯行为异常预警 +- 考核连续下滑预警 +- 消费异常预警 +- 风险评估预警 +- 余刑到期预警 + +**规则配置**: +- 预警名称 +- 预警类型 +- 触发条件 +- 预警级别(一般/紧急/严重) +- 通知对象 +- 通知方式 + +**示例规则**: +``` +规则名称:消费异常预警 +触发条件:单日消费超过500元 +预警级别:一般 +通知对象:分监区长、狱政科长 +``` + +#### 3.2.2 预警触发 + +**触发机制**: +- 定时检查(每日凌晨) +- 实时触发(数据变更时) + +**预警生成**: +- 生成预警记录 +- 发送通知 + +#### 3.2.3 预警处理 + +**处理流程**: +1. 接收预警通知 +2. 查看预警详情 +3. 填写处置措施 +4. 标记处理状态 + +**预警处理表单**: +- 预警详情 +- 处置措施 +- 处置人 +- 处置时间 + +### 3.3 事件处理跟踪 + +#### 3.3.1 处理流程 + +**流程节点**: +- 登记 → 审核 → 处置 → 结案 + +**状态流转**: +``` +登记(待审核) → 审核(处理中) → 处置(已完成) → 结案 + ↓ + 退回修改 +``` + +#### 3.3.2 跟踪记录 + +**时间线展示**: +- 登记时间 +- 审核时间 +- 处置时间 +- 结案时间 +- 各节点操作人 + +### 3.4 应急预案管理(P2) + +#### 3.4.1 预案库 + +**预案分类**: +- 突发事件预案 +- 安全事故预案 +- 医疗急救预案 +- 舆情应对预案 + +#### 3.4.2 预案管理 + +**功能**: +- 预案新增/编辑/删除 +- 预案分类管理 +- 预案启用/停用 +- 预案演练记录 + +## 四、业务规则汇总 + +| 规则编号 | 规则描述 | +|---------|---------| +| BR-001 | 重大事件需要多人审核 | +| BR-002 | 预警处理有时限要求 | +| BR-003 | 事件处理记录不可删除 | +| BR-004 | 涉及罪犯需要权限验证 | +| BR-005 | 附件上传有大小限制 | + +## 五、验收标准 + +- [ ] 支持事件登记 +- [ ] 支持事件列表查询 +- [ ] 支持事件详情查看 +- [ ] 支持预警规则配置 +- [ ] 支持预警触发 +- [ ] 支持预警处理 +- [ ] 支持事件处理流程跟踪 +- [ ] 支持事件状态流转 + +## 六、相关模块 + +- 依赖:狱政信息管理模块(罪犯数据) +- 依赖:消费管理模块(消费预警) +- 依赖:计分考核模块(考核预警) + +--- + +**创建日期**:2026-01-14 +**版本**:v1.0 diff --git a/requirements/需求-07-危险评估.md b/requirements/需求-07-危险评估.md new file mode 100644 index 0000000..4e40af9 --- /dev/null +++ b/requirements/需求-07-危险评估.md @@ -0,0 +1,207 @@ +# 需求-07-危险评估 + +> 模块名称:危险评估 +> 优先级:P1 +> 预估工时:22h + +--- + +## 一、业务背景 + +危险评估是对罪犯进行风险评估的系统,通过专业评估确定罪犯的风险等级,为管理决策提供依据。 + +## 二、用户故事 + +| 角色 | 故事描述 | 优先级 | +|-----|---------|-------| +| 心理辅导员 | 作为心理辅导员,我希望配置评估问卷,这样评估维度全面 | P1 | +| 心理辅导员 | 作为心理辅导员,我希望为罪犯做危险评估,这样确定风险等级 | P1 | +| 心理辅导员 | 作为心理辅导员,我希望系统自动计算风险值,这样提高效率 | P1 | +| 狱政科长 | 作为狱政科长,我希望看到风险等级划分结果,这样合理配置警力 | P1 | +| 心理辅导员 | 作为心理辅导员,我希望有定期复评提醒,这样及时更新评估 | P1 | + +## 三、功能需求 + +### 3.1 评估问卷配置 + +#### 3.1.1 评估维度 + +**标准评估维度**: +- 犯罪史评估 +- 家庭背景评估 +- 社会支持评估 +- 心理状态评估 +- 行为表现评估 +- 改造态度评估 + +#### 3.1.2 评估问卷 + +**评估类型**: +- 入监评估(新入监罪犯) +- 定期评估(在押罪犯定期评估) +- 出监评估(释放前评估) +- 专项评估(针对特定情况) + +**问卷结构**: +- 评估基本信息 +- 各维度题目 +- 风险因素清单 +- 管控措施建议 + +### 3.2 危险评估录入 + +#### 3.2.1 创建评估 + +**评估类型选择**: +- 入监评估 +- 定期评估(月度/季度/年度) +- 出监评估 +- 专项评估 + +**罪犯选择**: +- 支持搜索罪犯 +- 显示基本信息 + +#### 3.2.2 填写评估 + +**评估内容**: +- 各维度题目作答 +- 风险因素勾选 +- 管控措施填写 +- 评估人意见 + +**风险因素选项**(示例): +- 有脱逃倾向 +- 有暴力倾向 +- 有自杀倾向 +- 近期情绪异常 +- 家庭变故 +- 与他犯有矛盾 +- 其他 + +**管控措施选项**(示例): +- 列为重点关注 +- 调整监管等级 +- 增加巡查频次 +- 安排心理疏导 +- 调整监区 +- 其他 + +### 3.3 风险计算引擎 + +#### 3.3.1 计算规则 + +**风险分值计算**: +- 各维度题目得分累加 +- 风险因素加权 +- 最终得出风险总分 + +**风险分值范围**:0-100分 + +#### 3.3.2 风险等级划分 + +**等级划分标准**(可配置): + +| 风险等级 | 分值范围 | 说明 | +|---------|---------|-----| +| 高风险 | ≥70分 | 需要重点关注和管控 | +| 中风险 | 40-69分 | 需要一般关注 | +| 低风险 | <40分 | 正常管理 | + +**等级颜色标识**: +- 高风险:红色 +- 中风险:橙色 +- 低风险:绿色 + +### 3.4 评估结果管理 + +#### 3.4.1 评估记录 + +**列表字段**: +- 评估编号 +- 罪犯姓名/编号 +- 评估类型 +- 评估日期 +- 风险等级 +- 风险分值 +- 评估人 +- 状态(有效/过期) + +#### 3.4.2 评估详情 + +**展示内容**: +- 评估基本信息 +- 各维度得分详情 +- 风险因素 +- 管控措施 +- 历史评估对比 + +### 3.5 定期复评提醒 + +#### 3.5.1 复评周期配置 + +**默认周期**: +- 高风险:每月复评 +- 中风险:每季度复评 +- 低风险:每半年复评 + +**可按罪犯调整**: + +#### 3.5.2 提醒机制 + +**触发时机**: +- 临近复评日期提前提醒(可配置天数) +- 超过复评日期未复评提醒 + +**通知方式**: +- 系统消息提醒 +- 站内通知 + +### 3.6 历史评估对比 + +#### 3.6.1 对比展示 + +**对比维度**: +- 风险分值趋势 +- 风险等级变化 +- 各维度得分对比 + +#### 3.6.2 趋势分析 + +**图表展示**: +- 折线图:风险分值趋势 +- 柱状图:各维度得分对比 + +## 四、业务规则汇总 + +| 规则编号 | 规则描述 | +|---------|---------| +| BR-001 | 入监评估必须在入监后7天内完成 | +| BR-002 | 高风险罪犯必须每月复评 | +| BR-003 | 风险等级变更需要审批 | +| BR-004 | 评估记录不可删除 | +| BR-005 | 评估有效期根据风险等级自动计算 | + +## 五、验收标准 + +- [ ] 支持评估问卷配置 +- [ ] 支持评估维度管理 +- [ ] 支持创建评估任务 +- [ ] 支持评估内容填写 +- [ ] 支持风险分值自动计算 +- [ ] 支持风险等级自动划分 +- [ ] 支持评估记录查询 +- [ ] 支持评估详情查看 +- [ ] 支持定期复评提醒 +- [ ] 支持历史评估对比 + +## 六、相关模块 + +- 依赖:测评问卷管理模块(问卷基础) +- 依赖:狱政信息管理模块(罪犯数据) +- 被依赖:狱政信息管理模块(风险等级引用) + +--- + +**创建日期**:2026-01-14 +**版本**:v1.0 diff --git a/requirements/需求-08-消费系统.md b/requirements/需求-08-消费系统.md new file mode 100644 index 0000000..643faf9 --- /dev/null +++ b/requirements/需求-08-消费系统.md @@ -0,0 +1,205 @@ +# 需求-08-消费系统 + +> 模块名称:消费系统 +> 优先级:P1 +> 预估工时:18h + +--- + +## 一、业务背景 + +消费系统管理罪犯的账户余额、消费记录和存款,是保障罪犯日常生活和规范消费行为的重要模块。 + +## 二、用户故事 + +| 角色 | 故事描述 | 优先级 | +|-----|---------|-------| +| 生活卫生科长 | 作为生活卫生科长,我希望管理罪犯账户余额,这样掌握消费情况 | P1 | +| 家属 | 作为罪犯家属,我希望给罪犯存款,这样罪犯有钱花 | P1 | +| 罪犯 | 作为罪犯,我希望查询自己的消费记录,这样我知道钱花哪了 | P1 | +| 狱政科长 | 作为狱政科长,我希望设置消费限额,这样控制过度消费 | P1 | +| 管理员 | 作为管理员,我希望分析消费数据,这样发现异常消费 | P1 | + +## 三、功能需求 + +### 3.1 账户管理 + +#### 3.1.1 账户查询 + +**查询条件**: +- 罪犯姓名/编号 +- 监区/分监区 +- 账户状态(正常/冻结) + +**列表字段**: +- 罪犯编号、姓名 +- 监区/分监区 +- 账户余额 +- 累计存款 +- 累计消费 +- 账户状态 +- 开户时间 + +#### 3.1.2 账户详情 + +**展示内容**: +- 罪犯基本信息 +- 账户信息(余额、状态) +- 存款记录(最近10笔) +- 消费记录(最近10笔) +- 月度消费统计 + +### 3.2 家属存款 + +#### 3.2.1 存款登记 + +**表单字段**: +- 罪犯选择(支持搜索) +- 存款金额(必填) +- 存款人姓名 +- 存款人关系 +- 联系方式 +- 备注 + +**存款方式**: +- 现场存款(家属到窗口) +- 银行转账(系统对接银行) +- 线上支付(微信/支付宝) + +**到账确认**: +- 线下存款需工作人员确认 +- 系统存款自动到账 + +#### 3.2.2 存款记录 + +**列表字段**: +- 记录编号 +- 罪犯姓名/编号 +- 存款金额 +- 存款人 +- 存款方式 +- 存款时间 +- 状态(待确认/已到账/已取消) + +### 3.3 消费记录 + +#### 3.3.1 消费类型 + +**消费类型**: +- 购物消费(超市购物) +- 餐饮消费(食堂) +- 医疗消费(看病) +- 通讯消费(电话费) +- 其他消费 + +#### 3.3.2 消费查询 + +**查询条件**: +- 罪犯姓名/编号 +- 消费类型 +- 消费时间范围 +- 监区 + +**列表字段**: +- 订单编号 +- 罪犯姓名/编号 +- 消费类型 +- 消费金额 +- 商品名称 +- 消费时间 +- 账户余额(消费后) + +#### 3.3.3 消费详情 + +**展示内容**: +- 订单信息 +- 商品列表 +- 金额明细 +- 消费时间 +- 操作人 + +### 3.4 消费限额 + +#### 3.4.1 全局限额配置 + +**配置项**: +- 日消费限额 +- 月消费限额 +- 单笔消费限额 +- 特殊商品限制 + +**默认限额**: +- 日限额:50元 +- 月限额:500元 +- 单笔限额:100元 + +#### 3.4.2 个体限额配置 + +**按罪犯设置**: +- 单独设置限额 +- 按监管等级设置 +- 按风险等级设置 + +**限额类型**: +- 宽管级:标准限额的120% +- 普管级:标准限额 +- 严管级:标准限额的60% +- 考察级:最低保障 + +### 3.5 消费统计分析 + +#### 3.5.1 统计维度 + +**统计报表**: +- 日消费统计 +- 月消费统计 +- 人均消费统计 +- 监区消费排名 +- 商品销售排行 + +#### 3.5.2 异常检测 + +**异常规则**: +- 单日消费超过日限额 +- 单月消费超过月限额 +- 消费频率异常(短时间内多次消费) + +**异常处理**: +- 超出限额时拦截 +- 生成异常预警 +- 通知管理人员 + +## 四、业务规则汇总 + +| 规则编号 | 规则描述 | +|---------|---------| +| BR-001 | 罪犯账户余额不能为负数 | +| BR-002 | 消费金额不能超过账户余额 | +| BR-003 | 消费金额不能超过单笔限额 | +| BR-004 | 累计消费不能超过日/月限额 | +| BR-005 | 存款需校验金额格式 | +| BR-006 | 严管级罪犯消费限额更低 | +| BR-007 | 消费记录不可删除 | + +## 五、验收标准 + +- [ ] 支持账户查询 +- [ ] 支持账户详情查看 +- [ ] 支持存款登记 +- [ ] 支持存款记录查询 +- [ ] 支持消费记录查询 +- [ ] 支持消费限额配置 +- [ ] 支持个体限额设置 +- [ ] 支持消费统计分析 +- [ ] 支持异常消费预警 + +## 六、相关模块 + +- 依赖:狱政信息管理模块(罪犯数据) +- 依赖:监区管理模块(监区数据) +- 被依赖:数据分析模块(消费数据引用) + +--- + +**创建日期**:2026-01-14 +**版本**:v1.0 diff --git a/requirements/需求-09-数据汇总.md b/requirements/需求-09-数据汇总.md new file mode 100644 index 0000000..26895ad --- /dev/null +++ b/requirements/需求-09-数据汇总.md @@ -0,0 +1,228 @@ +# 需求-09-数据汇总 + +> 模块名称:数据汇总 +> 优先级:P1 +> 预估工时:20h + +--- + +## 一、业务背景 + +数据汇总模块提供各类统计报表和分析图表,帮助管理层全面了解监狱运行状况。 + +## 二、用户故事 + +| 角色 | 故事描述 | 优先级 | +|-----|---------|-------| +| 监狱长 | 作为监狱长,我希望看到在册罪犯统计,这样了解整体规模 | P1 | +| 教导员 | 作为教导员,我希望看到押犯构成分析,这样了解罪犯特点 | P1 | +| 考核干事 | 作为考核干事,我希望看到考核统计报表,这样了解整体改造情况 | P1 | +| 生活科长 | 作为生活科长,我希望看到消费统计,这样了解消费水平 | P1 | +| 教育科长 | 作为教育科长,我希望看到评估统计,这样了解测评情况 | P1 | + +## 三、功能需求 + +### 3.1 人口统计分析 + +#### 3.1.1 在册统计 + +**统计指标**: +- 当前在册总数 +- 本月新收数量 +- 本月释放数量 +- 本月移交数量 +- 本月死亡数量 + +**时间维度**: +- 日统计 +- 月统计 +- 年统计 + +#### 3.1.2 动态统计 + +**统计图表**: +- 折线图:在册人数趋势 +- 柱状图:月度收押/释放对比 + +### 3.2 押犯构成分析 + +#### 3.2.1 年龄分布 + +**年龄段**: +- 未成年(≤17) +- 青年(18-30) +- 中年(31-50) +- 老年(51-60) +- 老龄(60+) + +**展示形式**: +- 饼图:年龄占比 +- 柱状图:各年龄段人数 + +#### 3.2.2 刑期分布 + +**刑期段**: +- 短刑(≤3年) +- 中刑(3-10年) +- 长刑(10年以上) +- 无期 +- 死缓 + +**展示形式**:饼图 + +#### 3.2.3 罪名分布 + +**分类**: +- 暴力型(故意杀人、故意伤害、抢劫等) +- 财产型(盗窃、诈骗、抢夺等) +- 淫欲型(强奸、猥亵等) +- 涉毒型(贩毒、吸毒等) +- 涉黑涉恶型 +- 其他 + +**展示形式**:柱状图 + +#### 3.2.4 其他维度 + +**文化程度分布**:饼图 +**民族分布**:饼图 +**籍贯分布**:地图热力图 + +### 3.3 考核统计报表 + +#### 3.3.1 分数分布 + +**统计维度**: +- 各分数段人数 +- 平均分 +- 最高分/最低分 + +**展示形式**: +- 柱状图:分数分布 +- 表格:统计数据 + +#### 3.3.2 等级分布 + +**考核等级**: +- 优秀人数/占比 +- 良好人数/占比 +- 合格人数/占比 +- 不合格人数/占比 + +**展示形式**:饼图 + +#### 3.3.3 月度趋势 + +**趋势分析**: +- 月度平均分趋势 +- 各等级占比趋势 + +**展示形式**:折线图 + +### 3.4 消费统计报表 + +#### 3.4.1 消费金额统计 + +**统计指标**: +- 总消费金额 +- 人均消费金额 +- 日均消费金额 +- 消费总额趋势 + +#### 3.4.2 消费类型分布 + +**类型占比**: +- 超市购物 +- 餐饮消费 +- 医疗消费 +- 通讯消费 +- 其他 + +**展示形式**:饼图 + +#### 3.4.3 监区消费排名 + +**排名维度**: +- 人均消费排名 +- 消费总额排名 +- 月环比增长排名 + +**展示形式**:排行榜表格 + +### 3.5 评估统计报表 + +#### 3.5.1 测评完成率 + +**统计指标**: +- 应测评人数 +- 已完成人数 +- 完成率 +- 待测评人数 + +#### 3.5.2 风险分布 + +**风险等级**: +- 高风险人数/占比 +- 中风险人数/占比 +- 低风险人数/占比 + +**展示形式**:饼图 + +#### 3.5.3 评估趋势 + +**趋势分析**: +- 高风险占比趋势 +- 测评覆盖率趋势 + +### 3.6 综合报表 + +#### 3.6.1 监狱运行月报 + +**报告内容**: +- 在押犯情况 +- 收押释放情况 +- 考核情况 +- 消费情况 +- 测评情况 +- 重点关注事项 + +#### 3.6.2 自定义报表 + +**功能**: +- 选择统计指标 +- 选择时间范围 +- 选择统计维度 +- 生成报表 + +## 四、业务规则汇总 + +| 规则编号 | 规则描述 | +|---------|---------| +| BR-001 | 统计数据实时更新 | +| BR-002 | 支持按时间范围筛选 | +| BR-003 | 支持按监区筛选 | +| BR-004 | 报表支持导出(Excel/PDF) | +| BR-005 | 敏感数据脱敏展示 | + +## 五、验收标准 + +- [ ] 支持人口统计分析 +- [ ] 支持押犯构成分析(年龄/刑期/罪名) +- [ ] 支持考核统计报表 +- [ ] 支持消费统计报表 +- [ ] 支持评估统计报表 +- [ ] 支持综合报表生成 +- [ ] 支持数据导出 +- [ ] 支持图表交互(筛选、导出) + +## 六、相关模块 + +- 依赖:狱政信息管理模块(人口数据) +- 依赖:计分考核模块(考核数据) +- 依赖:消费管理模块(消费数据) +- 依赖:测评管理模块(评估数据) + +--- + +**创建日期**:2026-01-14 +**版本**:v1.0 diff --git a/requirements/需求-10-评估报告.md b/requirements/需求-10-评估报告.md new file mode 100644 index 0000000..593019f --- /dev/null +++ b/requirements/需求-10-评估报告.md @@ -0,0 +1,226 @@ +# 需求-10-评估报告 + +> 模块名称:评估报告 +> 优先级:P1 +> 预估工时:20h + +--- + +## 一、业务背景 + +评估报告模块用于生成罪犯的综合评估报告,为减刑假释、处遇调整等决策提供依据。 + +## 二、用户故事 + +| 角色 | 故事描述 | 优先级 | +|-----|---------|-------| +| 心理辅导员 | 作为心理辅导员,我希望有报告模板,这样统一报告格式 | P1 | +| 心理辅导员 | 作为心理辅导员,我希望根据评估数据生成报告,这样提高效率 | P1 | +| 监狱长 | 作为监狱长,我希望预览报告内容,这样审核报告 | P1 | +| 刑罚执行科 | 作为刑罚执行科,我希望下载报告用于呈报,这样准备减刑材料 | P1 | +| 教育科长 | 作为教育科长,我希望审核报告,这样确保报告准确 | P1 | + +## 三、功能需求 + +### 3.1 报告模板管理 + +#### 3.1.1 模板分类 + +**模板类型**: +- 入监综合评估报告 +- 定期考核报告 +- 出监评估报告 +- 减刑假释建议报告 +- 专项评估报告 + +#### 3.1.2 模板配置 + +**模板内容**: +- 模板名称 +- 模板类型 +- 报告标题格式 +- 章节结构 +- 数据字段映射 +- 样式配置 + +**章节结构示例**: +``` +一、基本信息 + - 罪犯姓名、编号、入狱日期等 + +二、犯罪及刑罚情况 + - 罪名、刑期、判决情况等 + +三、改造表现 + - 考核得分、等级 + - 表扬/处分记录 + +四、心理评估 + - 测评结果 + - 风险等级 + +五、管教意见 + - 改造评价 + - 建议意见 + +六、附件 + - 相关证明材料 +``` + +#### 3.1.3 模板操作 + +**功能**: +- 新增模板 +- 编辑模板 +- 复制模板 +- 启用/停用模板 +- 设为默认 + +### 3.2 报告生成 + +#### 3.2.1 创建报告 + +**创建方式**: +- 手动创建:选择罪犯 + 选择模板 +- 自动创建:批量生成多个罪犯的报告 + +**生成流程**: +1. 选择罪犯 +2. 选择报告模板 +3. 设置报告日期范围 +4. 系统自动填充数据 +5. 生成报告预览 + +#### 3.2.2 数据填充 + +**自动填充内容**: +- 罪犯基本信息(从狱政模块获取) +- 考核数据(从计分考核模块获取) +- 测评数据(从测评模块获取) +- 风险评估数据(从危险评估模块获取) +- 消费数据(从消费模块获取) + +**手动补充内容**: +- 管教意见 +- 建议结论 +- 附件上传 + +### 3.3 报告预览 + +#### 3.3.1 在线预览 + +**展示内容**: +- 报告标题 +- 报告生成时间 +- 完整报告内容(分章节展示) +- 附件列表 + +**交互功能**: +- 章节导航 +- 缩放控制 +- 打印预览 + +#### 3.3.2 报告编辑 + +**可编辑内容**: +- 管教意见 +- 建议结论 +- 附件管理 + +**不可编辑内容**: +- 系统自动填充的数据 + +### 3.4 报告审核 + +#### 3.4.1 审核流程 + +**流程节点**: +- 起草 → 审核 → 发布 + +**审核权限**: +- 起草人:创建、编辑 +- 审核人:审核通过/退回 +- 发布人:发布归档 + +#### 3.4.2 审核操作 + +**通过**: +- 状态变为"已审核" +- 记录审核人和时间 + +**退回**: +- 状态变为"已退回" +- 填写退回原因 +- 返回起草人修改 + +### 3.5 报告下载 + +#### 3.5.1 导出格式 + +**支持格式**: +- PDF(推荐) +- Word +- Excel(数据表格) + +#### 3.5.2 下载操作 + +**功能**: +- 单个下载 +- 批量下载 +- 批量打包下载 + +### 3.6 报告归档 + +#### 3.6.1 归档管理 + +**归档条件**: +- 已审核的报告 +- 超过一定时间的报告 + +**归档操作**: +- 标记已归档 +- 移至归档列表 +- 归档后不可修改 + +#### 3.6.2 归档查询 + +**查询条件**: +- 归档时间范围 +- 报告类型 +- 罪犯信息 + +## 四、业务规则汇总 + +| 规则编号 | 规则描述 | +|---------|---------| +| BR-001 | 报告编号全局唯一 | +| BR-002 | 已发布的报告不能修改 | +| BR-003 | 报告数据取自源系统,保证一致性 | +| BR-004 | 报告需要审核后才能下载 | +| BR-005 | 归档报告不可删除 | +| BR-006 | 敏感信息在报告中脱敏 | + +## 五、验收标准 + +- [ ] 支持报告模板管理 +- [ ] 支持创建报告 +- [ ] 支持数据自动填充 +- [ ] 支持报告预览 +- [ ] 支持报告编辑 +- [ ] 支持报告审核流程 +- [ ] 支持报告下载(PDF/Word) +- [ ] 支持报告归档 +- [ ] 支持批量生成报告 + +## 六、相关模块 + +- 依赖:狱政信息管理模块(罪犯数据) +- 依赖:计分考核模块(考核数据) +- 依赖:测评管理模块(测评数据) +- 依赖:危险评估模块(风险数据) +- 依赖:消费管理模块(消费数据) + +--- + +**创建日期**:2026-01-14 +**版本**:v1.0 diff --git a/requirements/需求-11-智能预警.md b/requirements/需求-11-智能预警.md new file mode 100644 index 0000000..cc7797e --- /dev/null +++ b/requirements/需求-11-智能预警.md @@ -0,0 +1,157 @@ +# 需求-11-智能预警 + +> 模块名称:智能预警 +> 优先级:P2 +> 预估工时:32h + +--- + +## 一、业务背景 + +智能预警系统通过分析罪犯的行为数据,自动发现异常模式和潜在风险,提前预警。 + +## 二、用户故事 + +| 角色 | 故事描述 | 优先级 | +|-----|---------|-------| +| 心理辅导员 | 作为心理辅导员,我希望系统发现异常行为模式,这样及时干预 | P2 | +| 狱政科长 | 作为狱政科长,我希望消费异常有预警,这样防止过度消费 | P2 | +| 分监区长 | 作为分监区长,我希望考核下滑有预警,这样关注重点人员 | P2 | +| 管理员 | 作为管理员,我希望有风险预测模型,这样提前识别高风险罪犯 | P2 | + +## 三、功能需求 + +### 3.1 行为异常检测 + +#### 3.1.1 行为模式分析 + +**分析维度**: +- 考核得分趋势 +- 消费行为模式 +- 人际交往情况 +- 情绪表达特征 + +**检测规则**: +- 考核连续下滑(连续3个月下降) +- 消费突然增加(较历史均值增加50%) +- 社交圈变化(突然接触新群体) +- 情绪表达异常(测评分数突变) + +#### 3.1.2 异常标记 + +**标记内容**: +- 异常类型 +- 异常程度 +- 触发规则 +- 建议关注点 + +### 3.2 消费异常预警 + +#### 3.2.1 阈值预警 + +**预警规则**: +- 单日消费超过设定阈值 +- 单月消费超过设定阈值 +- 消费频率异常(单日多次消费) + +**预警触发**: +- 超出阈值时生成预警 +- 通知相关管理人员 + +#### 3.2.2 模式预警 + +**分析规则**: +- 与历史消费模式偏离 +- 与同监区平均消费偏离 +- 消费时间异常(非正常时段) + +### 3.3 考核下滑预警 + +#### 3.3.1 趋势分析 + +**分析维度**: +- 连续下降月数 +- 下降幅度 +- 下降原因推断 + +**预警规则**: +- 连续2月下降超过10% +- 连续3月下降 +- 考核等级降级 + +### 3.4 风险预测模型 + +#### 3.4.1 特征提取 + +**输入特征**: +- 历史考核得分 +- 历史测评结果 +- 风险评估等级 +- 消费行为特征 +- 违规记录 + +#### 3.4.2 风险评分 + +**输出**: +- 风险评分(0-100) +- 风险等级(高/中/低) +- 风险因素(哪些因素导致高分) + +**模型说明**: +- 基于历史数据训练的预测模型 +- 定期更新模型参数 + +### 3.5 预警通知 + +#### 3.5.1 通知方式 + +**通知渠道**: +- 系统站内消息 +- 短信通知(预留接口) +- 邮件通知(预留接口) + +#### 3.5.2 通知配置 + +**配置项**: +- 通知接收人 +- 通知方式 +- 通知时机(即时/汇总) +- 通知频率 + +#### 3.5.3 预警汇总 + +**汇总报告**: +- 每日预警汇总 +- 每周预警趋势 +- 高风险预警列表 + +## 四、业务规则汇总 + +| 规则编号 | 规则描述 | +|---------|---------| +| BR-001 | 预警产生后需要人工确认 | +| BR-002 | 高风险预警必须24小时内处理 | +| BR-003 | 预警记录不可删除 | +| BR-004 | 预测模型定期更新 | +| BR-005 | 误报率需要控制在合理范围 | + +## 五、验收标准 + +- [ ] 支持行为异常检测 +- [ ] 支持消费异常预警 +- [ ] 支持考核下滑预警 +- [ ] 支持风险预测评分 +- [ ] 支持预警通知配置 +- [ ] 支持预警汇总报告 +- [ ] 预警准确率达到要求 + +## 六、相关模块 + +- 依赖:消费管理模块(消费数据) +- 依赖:计分考核模块(考核数据) +- 依赖:危险评估模块(风险数据) + +--- + +**创建日期**:2026-01-14 +**版本**:v1.0 diff --git a/requirements/需求-12-智能分析.md b/requirements/需求-12-智能分析.md new file mode 100644 index 0000000..cbf7293 --- /dev/null +++ b/requirements/需求-12-智能分析.md @@ -0,0 +1,182 @@ +# 需求-12-智能分析 + +> 模块名称:智能分析 +> 优先级:P2 +> 预估工时:22h + +--- + +## 一、业务背景 + +智能分析模块提供深度数据分析和预测功能,帮助管理层发现规律、制定决策。 + +## 二、用户故事 + +| 角色 | 故事描述 | 优先级 | +|-----|---------|-------| +| 监狱长 | 作为监狱长,我希望系统自动生成分析报告,这样减少人工汇总 | P2 | +| 教育科长 | 作为教育科长,我希望有趋势预测,这样制定教育计划 | P2 | +| 心理辅导员 | 作为心理辅导员,我希望发现数据关联,这样针对性干预 | P2 | +| 管理员 | 作为管理员,我希望有智能分析结果,这样辅助决策 | P2 | + +## 三、功能需求 + +### 3.1 自动报表生成 + +#### 3.1.1 报告类型 + +**周期报告**: +- 日报:每日运行情况 +- 周报:每周运行情况 +- 月报:每月运行情况 +- 年报:每年运行情况 + +**专题报告**: +- 人口构成分析 +- 考核情况分析 +- 消费行为分析 +- 风险评估分析 + +#### 3.1.2 报告内容 + +**报告结构**: +- 关键指标概览 +- 数据图表展示 +- 异常情况说明 +- 趋势分析 +- 建议措施 + +#### 3.1.3 自动生成 + +**生成机制**: +- 定时生成(日/周/月/年) +- 手动触发生成 +- 按模板生成 + +### 3.2 趋势预测 + +#### 3.2.1 人口预测 + +**预测维度**: +- 在册人数趋势 +- 收押趋势 +- 释放趋势 +- 刑满释放预测 + +**预测周期**: +- 短期预测(未来1个月) +- 中期预测(未来3个月) +- 长期预测(未来1年) + +#### 3.2.2 考核趋势 + +**预测内容**: +- 整体考核得分趋势 +- 优秀率趋势 +- 不合格率趋势 + +#### 3.2.3 风险趋势 + +**预测内容**: +- 高风险占比趋势 +- 风险变化预测 + +### 3.3 关联分析 + +#### 3.3.1 因素关联 + +**分析维度**: +- 刑期与考核表现关联 +- 年龄与风险等级关联 +- 消费与考核关联 +- 测评与违规关联 + +**分析方法**: +- 相关性分析 +- 回归分析 +- 聚类分析 + +#### 3.3.2 异常发现 + +**发现规则**: +- 偏离正常模式的数据点 +- 突然变化的数据趋势 +- 异常的数据分布 + +**展示方式**: +- 异常标记 +- 异常说明 +- 可能原因分析 + +### 3.4 分析可视化 + +#### 3.4.1 图表类型 + +**基础图表**: +- 折线图(趋势) +- 柱状图(对比) +- 饼图(占比) +- 散点图(分布) +- 雷达图(多维度) + +**高级图表**: +- 桑基图(流转分析) +- 热力图(密度分布) +- 关系图(关联分析) + +#### 3.4.2 交互功能 + +**交互操作**: +- 数据筛选 +- 时间范围选择 +- 维度切换 +- 图表联动 +- 数据钻取 + +### 3.5 分析报告导出 + +#### 3.5.1 导出格式 + +**支持格式**: +- PDF(完整报告) +- Word(文档报告) +- Excel(数据表格) +- PPT(演示文稿) + +#### 3.5.2 导出内容 + +**可导出内容**: +- 分析报告全文 +- 图表图片 +- 原始数据 +- 分析结论 + +## 四、业务规则汇总 + +| 规则编号 | 规则描述 | +|---------|---------| +| BR-001 | 预测数据仅供参考 | +| BR-002 | 分析结果需人工确认 | +| BR-003 | 历史数据完整才能做趋势分析 | +| BR-004 | 敏感分析结果需要权限控制 | +| BR-005 | 预测模型定期校验 | + +## 五、验收标准 + +- [ ] 支持自动报表生成 +- [ ] 支持多种报告类型 +- [ ] 支持趋势预测 +- [ ] 支持关联分析 +- [ ] 支持可视化展示 +- [ ] 支持报告导出 +- [ ] 预测准确率达到要求 + +## 六、相关模块 + +- 依赖:所有业务模块(数据来源) +- 被依赖:监管看板模块(可视化展示) + +--- + +**创建日期**:2026-01-14 +**版本**:v1.0 diff --git a/requirements/需求索引.md b/requirements/需求索引.md new file mode 100644 index 0000000..1e8704f --- /dev/null +++ b/requirements/需求索引.md @@ -0,0 +1,228 @@ +# XL监狱综合管理平台 - 需求索引 + +> 文档版本:v1.0 +> 创建日期:2026-01-14 + +--- + +## 一、需求总览 + +本项目共拆分为 **12个独立需求文档**,每个文档对应一个功能模块,可独立迭代。 + +``` +XL监狱综合管理平台 +│ +├── P0 - 核心功能 +│ ├── 需求-01-监管看板 (18h) ← 首页仪表盘 +│ ├── 需求-02-狱政信息管理 (24h) ← 罪犯全生命周期管理 +│ ├── 需求-03-计分考核 (24h) ← 考核规则与评分 +│ ├── 需求-04-测评问卷管理 (40h) ← 问卷模板CRUD +│ └── 需求-05-测评执行与评分 (24h) ← 在线测评与评分 +│ +├── P1 - 重要功能 +│ ├── 需求-06-狱情平台 (22h) ← 事件记录与预警 +│ ├── 需求-07-危险评估 (22h) ← 风险评估 +│ ├── 需求-08-消费系统 (18h) ← 存款与消费 +│ ├── 需求-09-数据汇总 (20h) ← 统计分析报表 +│ └── 需求-10-评估报告 (20h) ← 报告生成与导出 +│ +└── P2 - 增值功能 + ├── 需求-11-智能预警 (32h) ← 异常检测与预警 + └── 需求-12-智能分析 (22h) ← 趋势预测与关联分析 +``` + +--- + +## 二、优先级矩阵 + +### P0 - 核心功能(必须完成) + +| 序号 | 需求 | 名称 | 预估工时 | 依赖关系 | +|-----|------|-----|---------|---------| +| 1 | 需求-02 | 狱政信息管理 | 24h | 无(基础) | +| 2 | 需求-03 | 计分考核 | 24h | 依赖需求-02 | +| 3 | 需求-01 | 监管看板 | 18h | 依赖需求-02 | +| 4 | 需求-04 | 测评问卷管理 | 40h | 无 | +| 5 | 需求-05 | 测评执行与评分 | 24h | 依赖需求-04 | + +**P0小计**:130h + +### P1 - 重要功能(计划完成) + +| 序号 | 需求 | 名称 | 预估工时 | 依赖关系 | +|-----|------|-----|---------|---------| +| 1 | 需求-06 | 狱情平台 | 22h | 依赖需求-02 | +| 2 | 需求-07 | 危险评估 | 22h | 依赖需求-04, 需求-05 | +| 3 | 需求-08 | 消费系统 | 18h | 依赖需求-02 | +| 4 | 需求-09 | 数据汇总 | 20h | 依赖需求-02,03,05,07,08 | +| 5 | 需求-10 | 评估报告 | 20h | 依赖需求-02,03,05,07,08 | + +**P1小计**:102h + +### P2 - 增值功能(选做) + +| 序号 | 需求 | 名称 | 预估工时 | 依赖关系 | +|-----|------|-----|---------|---------| +| 1 | 需求-11 | 智能预警 | 32h | 依赖需求-02,03,07,08 | +| 2 | 需求-12 | 智能分析 | 22h | 依赖所有模块 | + +**P2小计**:54h + +### 总工时 + +| 阶段 | 工时 | +|-----|------| +| P0 核心功能 | 130h | +| P1 重要功能 | 102h | +| P2 增值功能 | 54h | +| **合计** | **286h** | + +--- + +## 三、模块依赖关系 + +### 3.1 依赖图 + +``` + ┌─────────────────┐ + │ 需求-02 狱政信息│ + │ (基础数据) │ + └────────┬────────┘ + │ + ┌─────────────────┼─────────────────┐ + │ │ │ + ▼ ▼ ▼ + ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ + │需求-01看板 │ │需求-03考核 │ │需求-08消费 │ + └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ + │ │ │ + │ │ │ + │ ▼ │ + │ ┌─────────────┐ │ + │ │需求-04问卷 │ │ + │ └──────┬──────┘ │ + │ │ │ + │ ▼ │ + │ ┌─────────────┐ │ + │ │需求-05执行 │ │ + │ └──────┬──────┘ │ + │ │ │ + │ ┌──────────┼──────────┐ │ + │ │ │ │ │ + ▼ ▼ ▼ ▼ ▼ + ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ + │需求-06 │ │需求-07 │ │需求-09 │ │需求-10 │ + │狱情平台 │ │危险评估 │ │数据汇总 │ │评估报告 │ + └─────────┘ └────┬────┘ └─────────┘ └─────────┘ + │ + ▼ + ┌────────────────┐ + │ 需求-11 智能预警│ + └───────┬────────┘ + │ + ▼ + ┌────────────────┐ + │ 需求-12 智能分析│ + └────────────────┘ +``` + +### 3.2 依赖说明 + +| 模块 | 被依赖 | 依赖 | +|-----|-------|------| +| 需求-02 狱政信息管理 | 所有模块 | 无 | +| 需求-01 监管看板 | 无 | 需求-02 | +| 需求-03 计分考核 | 需求-09,10,11 | 需求-02 | +| 需求-04 测评问卷管理 | 需求-05,07 | 无 | +| 需求-05 测评执行 | 需求-07,09,10 | 需求-04 | +| 需求-06 狱情平台 | 无 | 需求-02 | +| 需求-07 危险评估 | 需求-09,10,11 | 需求-04,05 | +| 需求-08 消费系统 | 需求-09,10,11 | 需求-02 | +| 需求-09 数据汇总 | 无 | 需求-02,03,05,07,08 | +| 需求-10 评估报告 | 无 | 需求-02,03,05,07,08 | +| 需求-11 智能预警 | 无 | 需求-02,03,07,08 | +| 需求-12 智能分析 | 无 | 所有模块 | + +--- + +## 四、迭代建议 + +### 迭代顺序 + +``` +第1迭代:基础平台 +├── 需求-02 狱政信息管理(P0) +└── 需求-03 计分考核(P0) + +第2迭代:监管看板 +└── 需求-01 监管看板(P0) + +第3迭代:测评模块 +├── 需求-04 测评问卷管理(P0) +└── 需求-05 测评执行与评分(P0) + +第4迭代:辅助功能 +├── 需求-06 狱情平台(P1) +├── 需求-07 危险评估(P1) +├── 需求-08 消费系统(P1) +└── 需求-09 数据汇总(P1) + +第5迭代:报告模块 +└── 需求-10 评估报告(P1) + +第6迭代:智能功能 +├── 需求-11 智能预警(P2) +└── 需求-12 智能分析(P2) +``` + +### 每个迭代的工作量 + +| 迭代 | 内容 | 预估工时 | +|-----|------|---------| +| 第1迭代 | 狱政管理 + 计分考核 | 48h | +| 第2迭代 | 监管看板 | 18h | +| 第3迭代 | 测评问卷 + 测评执行 | 64h | +| 第4迭代 | 狱情 + 危评 + 消费 + 汇总 | 82h | +| 第5迭代 | 评估报告 | 20h | +| 第6迭代 | 智能预警 + 智能分析 | 54h | + +--- + +## 五、通用验收标准 + +所有模块需满足以下通用验收标准: + +### 功能验收 + +- [ ] 列表查询功能正常 +- [ ] 新增功能正常 +- [ ] 修改功能正常 +- [ ] 删除功能正常(逻辑删除) +- [ ] 导出功能正常 +- [ ] 数据权限控制生效 + +### 性能验收 + +- [ ] 页面加载时间 < 3秒 +- [ ] 接口响应时间 < 500ms +- [ ] 支持100并发用户 + +### 安全验收 + +- [ ] 敏感数据脱敏显示 +- [ ] 操作日志完整记录 +- [ ] 权限控制生效 +- [ ] 无SQL注入/XSS漏洞 + +--- + +## 六、相关文档 + +- 需求拆解文档:`XL监狱综合管理平台-需求拆解文档.md` +- 改造设计文档:`XL监狱综合管理平台-监区犯人管理改造设计方案.md` +- 技术架构文档:待创建 + +--- + +**创建日期**:2026-01-14 +**版本**:v1.0