From 8077990e5d64cfa144519a26d69ba56d9aae7130 Mon Sep 17 00:00:00 2001
From: tangweijie <877588133@qq.com>
Date: Tue, 13 Jan 2026 16:23:55 +0800
Subject: [PATCH] =?UTF-8?q?feat(prison):=20=E9=97=AE=E5=8D=B7=E7=B3=BB?=
=?UTF-8?q?=E7=BB=9F=E6=89=B9=E9=87=8F=E6=9B=B4=E6=96=B0=E6=8E=A5=E5=8F=A3?=
=?UTF-8?q?=E5=8F=8A=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 添加问卷问题批量更新API: POST /prison/question/batch-update
- 修复savePartitions循环调用API问题 (50题只需1次请求)
- 修复onPartitionDragEnd拖拽排序性能问题
- 修复onQuestionDragEnd问题拖拽排序性能问题
- 添加QuestionBatchUpdateReqVO请求对象
- 添加自动填充来源字典SQL (35个选项)
---
.gitignore | 3 +
pom.xml | 1 +
sql/prison_dict_data.sql | 151 ++++++++
sql/prison_init.sql | 228 ++++++++++++
sql/prison_inmate_schema.sql | 45 +++
sql/prison_sample_data.sql | 56 +++
sql/upgrade_questionnaire_20260113.sql | 73 ++++
...uestionnaire_auto_fill_source_20260113.sql | 68 ++++
yudao-module-prison/pom.xml | 77 ++++
.../admin/area/PrisonAreaController.java | 104 ++++++
.../admin/area/vo/AreaPageReqVO.java | 44 +++
.../controller/admin/area/vo/AreaRespVO.java | 55 +++
.../admin/area/vo/AreaSaveReqVO.java | 42 +++
.../admin/cell/PrisonCellController.java | 104 ++++++
.../admin/cell/vo/CellPageReqVO.java | 44 +++
.../controller/admin/cell/vo/CellRespVO.java | 55 +++
.../admin/cell/vo/CellSaveReqVO.java | 43 +++
.../PrisonConsumptionController.java | 104 ++++++
.../consumption/vo/ConsumptionPageReqVO.java | 55 +++
.../consumption/vo/ConsumptionRespVO.java | 68 ++++
.../consumption/vo/ConsumptionSaveReqVO.java | 57 +++
.../admin/prisoner/PrisonerController.java | 109 ++++++
.../admin/prisoner/vo/PrisonerExcelVO.java | 76 ++++
.../admin/prisoner/vo/PrisonerPageReqVO.java | 58 +++
.../admin/prisoner/vo/PrisonerRespVO.java | 106 ++++++
.../admin/prisoner/vo/PrisonerSaveReqVO.java | 93 +++++
.../question/PrisonQuestionController.java | 122 +++++++
.../question/vo/QuestionBatchUpdateReqVO.java | 35 ++
.../admin/question/vo/QuestionPageReqVO.java | 42 +++
.../admin/question/vo/QuestionRespVO.java | 87 +++++
.../admin/question/vo/QuestionSaveReqVO.java | 72 ++++
.../PrisonQuestionnaireController.java | 104 ++++++
.../vo/QuestionnairePageReqVO.java | 39 ++
.../questionnaire/vo/QuestionnaireRespVO.java | 48 +++
.../vo/QuestionnaireSaveReqVO.java | 37 ++
.../PrisonQuestionnaireRecordController.java | 104 ++++++
.../vo/QuestionnaireRecordPageReqVO.java | 43 +++
.../vo/QuestionnaireRecordRespVO.java | 52 +++
.../vo/QuestionnaireRecordSaveReqVO.java | 44 +++
.../PrisonRiskAssessmentController.java | 104 ++++++
.../vo/RiskAssessmentPageReqVO.java | 72 ++++
.../vo/RiskAssessmentRespVO.java | 89 +++++
.../vo/RiskAssessmentSaveReqVO.java | 71 ++++
.../admin/score/PrisonScoreController.java | 104 ++++++
.../admin/score/vo/ScorePageReqVO.java | 60 ++++
.../admin/score/vo/ScoreRespVO.java | 76 ++++
.../admin/score/vo/ScoreSaveReqVO.java | 60 ++++
.../convert/prisoner/PrisonerConvert.java | 31 ++
.../prison/dal/dataobject/PrisonerDO.java | 135 +++++++
.../prison/dal/dataobject/area/AreaDO.java | 64 ++++
.../prison/dal/dataobject/cell/CellDO.java | 64 ++++
.../dataobject/consumption/ConsumptionDO.java | 79 +++++
.../dal/dataobject/question/QuestionDO.java | 107 ++++++
.../questionnaire/QuestionnaireDO.java | 79 +++++
.../QuestionnaireRecordDO.java | 62 ++++
.../riskassessment/RiskAssessmentDO.java | 97 +++++
.../prison/dal/dataobject/score/ScoreDO.java | 88 +++++
.../prison/dal/mysql/PrisonerMapper.java | 15 +
.../prison/dal/mysql/area/AreaMapper.java | 34 ++
.../prison/dal/mysql/cell/CellMapper.java | 34 ++
.../mysql/consumption/ConsumptionMapper.java | 37 ++
.../dal/mysql/question/QuestionMapper.java | 33 ++
.../questionnaire/QuestionnaireMapper.java | 32 ++
.../QuestionnaireRecordMapper.java | 33 ++
.../riskassessment/RiskAssessmentMapper.java | 42 +++
.../prison/dal/mysql/score/ScoreMapper.java | 39 ++
.../prison/enums/DictTypeConstants.java | 15 +
.../module/prison/enums/EducationEnum.java | 28 ++
.../prison/enums/ErrorCodeConstants.java | 48 +++
.../yudao/module/prison/enums/GenderEnum.java | 23 ++
.../prison/enums/PrisonerStatusEnum.java | 26 ++
.../module/prison/enums/RiskLevelEnum.java | 24 ++
.../prison/enums/SupervisionLevelEnum.java | 24 ++
.../prison/service/PrisonerService.java | 69 ++++
.../prison/service/area/AreaService.java | 62 ++++
.../prison/service/area/AreaServiceImpl.java | 85 +++++
.../prison/service/cell/CellService.java | 62 ++++
.../prison/service/cell/CellServiceImpl.java | 85 +++++
.../consumption/ConsumptionService.java | 62 ++++
.../consumption/ConsumptionServiceImpl.java | 85 +++++
.../service/impl/PrisonerServiceImpl.java | 123 +++++++
.../service/question/QuestionService.java | 69 ++++
.../service/question/QuestionServiceImpl.java | 105 ++++++
.../questionnaire/QuestionnaireService.java | 62 ++++
.../QuestionnaireServiceImpl.java | 85 +++++
.../QuestionnaireRecordService.java | 62 ++++
.../QuestionnaireRecordServiceImpl.java | 85 +++++
.../riskassessment/RiskAssessmentService.java | 62 ++++
.../RiskAssessmentServiceImpl.java | 85 +++++
.../prison/service/score/ScoreService.java | 62 ++++
.../service/score/ScoreServiceImpl.java | 85 +++++
.../src/main/resources/application.yaml | 11 +
.../main/resources/mapper/PrisonerMapper.xml | 36 ++
.../src/main/resources/sql/prison_module.sql | 333 ++++++++++++++++++
yudao-module-temp | 1 +
yudao-server/pom.xml | 7 +
.../src/main/resources/application-local.yaml | 19 +-
97 files changed, 6470 insertions(+), 9 deletions(-)
create mode 100644 sql/prison_dict_data.sql
create mode 100644 sql/prison_init.sql
create mode 100644 sql/prison_inmate_schema.sql
create mode 100644 sql/prison_sample_data.sql
create mode 100644 sql/upgrade_questionnaire_20260113.sql
create mode 100644 sql/upgrade_questionnaire_auto_fill_source_20260113.sql
create mode 100644 yudao-module-prison/pom.xml
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/area/PrisonAreaController.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/area/vo/AreaPageReqVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/area/vo/AreaRespVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/area/vo/AreaSaveReqVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/cell/PrisonCellController.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/cell/vo/CellPageReqVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/cell/vo/CellRespVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/cell/vo/CellSaveReqVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/consumption/PrisonConsumptionController.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/consumption/vo/ConsumptionPageReqVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/consumption/vo/ConsumptionRespVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/consumption/vo/ConsumptionSaveReqVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/prisoner/PrisonerController.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/prisoner/vo/PrisonerExcelVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/prisoner/vo/PrisonerPageReqVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/prisoner/vo/PrisonerRespVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/prisoner/vo/PrisonerSaveReqVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/question/PrisonQuestionController.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/question/vo/QuestionBatchUpdateReqVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/question/vo/QuestionPageReqVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/question/vo/QuestionRespVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/question/vo/QuestionSaveReqVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnaire/PrisonQuestionnaireController.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnaire/vo/QuestionnairePageReqVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnaire/vo/QuestionnaireRespVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnaire/vo/QuestionnaireSaveReqVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnairerecord/PrisonQuestionnaireRecordController.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnairerecord/vo/QuestionnaireRecordPageReqVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnairerecord/vo/QuestionnaireRecordRespVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnairerecord/vo/QuestionnaireRecordSaveReqVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/riskassessment/PrisonRiskAssessmentController.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/riskassessment/vo/RiskAssessmentPageReqVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/riskassessment/vo/RiskAssessmentRespVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/riskassessment/vo/RiskAssessmentSaveReqVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/score/PrisonScoreController.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/score/vo/ScorePageReqVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/score/vo/ScoreRespVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/score/vo/ScoreSaveReqVO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/convert/prisoner/PrisonerConvert.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/PrisonerDO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/area/AreaDO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/cell/CellDO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/consumption/ConsumptionDO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/question/QuestionDO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/questionnaire/QuestionnaireDO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/questionnairerecord/QuestionnaireRecordDO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/riskassessment/RiskAssessmentDO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/score/ScoreDO.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/PrisonerMapper.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/area/AreaMapper.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/cell/CellMapper.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/consumption/ConsumptionMapper.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/question/QuestionMapper.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/questionnaire/QuestionnaireMapper.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/questionnairerecord/QuestionnaireRecordMapper.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/riskassessment/RiskAssessmentMapper.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/score/ScoreMapper.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/DictTypeConstants.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/EducationEnum.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/ErrorCodeConstants.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/GenderEnum.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/PrisonerStatusEnum.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/RiskLevelEnum.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/SupervisionLevelEnum.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/PrisonerService.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/area/AreaService.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/area/AreaServiceImpl.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/cell/CellService.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/cell/CellServiceImpl.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/consumption/ConsumptionService.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/consumption/ConsumptionServiceImpl.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/impl/PrisonerServiceImpl.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/question/QuestionService.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/question/QuestionServiceImpl.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/questionnaire/QuestionnaireService.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/questionnaire/QuestionnaireServiceImpl.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/questionnairerecord/QuestionnaireRecordService.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/questionnairerecord/QuestionnaireRecordServiceImpl.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/riskassessment/RiskAssessmentService.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/riskassessment/RiskAssessmentServiceImpl.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/score/ScoreService.java
create mode 100644 yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/score/ScoreServiceImpl.java
create mode 100644 yudao-module-prison/src/main/resources/application.yaml
create mode 100644 yudao-module-prison/src/main/resources/mapper/PrisonerMapper.xml
create mode 100644 yudao-module-prison/src/main/resources/sql/prison_module.sql
create mode 160000 yudao-module-temp
diff --git a/.gitignore b/.gitignore
index 49330ee16f..23fc194d35 100644
--- a/.gitignore
+++ b/.gitignore
@@ -52,3 +52,6 @@ application-my.yaml
/yudao-ui-app/unpackage/
**/.DS_Store
+
+# Generated codegen files
+/codegen/
diff --git a/pom.xml b/pom.xml
index 562ae24415..6264bb5241 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,6 +25,7 @@
+ yudao-module-prison
${project.artifactId}
diff --git a/sql/prison_dict_data.sql b/sql/prison_dict_data.sql
new file mode 100644
index 0000000000..3ce4900289
--- /dev/null
+++ b/sql/prison_dict_data.sql
@@ -0,0 +1,151 @@
+-- ============================================
+-- 监狱管理模块字典数据
+-- ============================================
+
+-- 1. 监管等级 (prison_supervision_level)
+INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES (2008, '监管等级', 'prison_supervision_level', '0', '服刑人员监管等级', 'admin', NOW(), 'admin', NOW(), 0);
+
+INSERT INTO system_dict_data (id, sort, label, value, color_type, css_class, dict_type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES
+(200801, 1, '严管级', '1', 'danger', '', 'prison_supervision_level', '0', '需要重点监控', 'admin', NOW(), 'admin', NOW(), 0),
+(200802, 2, '普管级', '2', 'warning', '', 'prison_supervision_level', '0', '常规管理', 'admin', NOW(), 'admin', NOW(), 0),
+(200803, 3, '宽管级', '3', 'success', '', 'prison_supervision_level', '0', '表现良好,给予更多自主权', 'admin', NOW(), 'admin', NOW(), 0);
+
+-- 2. 风险等级 (prison_risk_level)
+INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES (2009, '风险等级', 'prison_risk_level', '0', '服刑人员风险等级', 'admin', NOW(), 'admin', NOW(), 0);
+
+INSERT INTO system_dict_data (id, sort, label, value, color_type, css_class, dict_type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES
+(200901, 1, '低风险', '1', 'success', '', 'prison_risk_level', '0', '低风险,表现稳定', 'admin', NOW(), 'admin', NOW(), 0),
+(200902, 2, '中风险', '2', 'warning', '', 'prison_risk_level', '0', '中风险,需要定期关注', 'admin', NOW(), 'admin', NOW(), 0),
+(200903, 3, '高风险', '3', 'danger', '', 'prison_risk_level', '0', '高风险,需要重点关注', 'admin', NOW(), 'admin', NOW(), 0),
+(200904, 4, '极高风险', '4', 'danger', '', 'prison_risk_level', '0', '极高风险,需要重点监控', 'admin', NOW(), 'admin', NOW(), 0);
+
+-- 3. 服刑人员状态 (prisoner_status)
+INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES (2010, '服刑人员状态', 'prisoner_status', '0', '服刑人员状态', 'admin', NOW(), 'admin', NOW(), 0);
+
+INSERT INTO system_dict_data (id, sort, label, value, color_type, css_class, dict_type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES
+(201001, 1, '在押', '1', 'primary', '', 'prisoner_status', '0', '正在服刑', 'admin', NOW(), 'admin', NOW(), 0),
+(201002, 2, '假释', '2', 'warning', '', 'prisoner_status', '0', '假释期间', 'admin', NOW(), 'admin', NOW(), 0),
+(201003, 3, '暂予监外执行', '3', 'info', '', 'prisoner_status', '0', '暂予监外执行', 'admin', NOW(), 'admin', NOW(), 0),
+(201004, 4, '已释放', '4', 'success', '', 'prisoner_status', '0', '已刑满释放', 'admin', NOW(), 'admin', NOW(), 0),
+(201005, 5, '已死亡', '5', 'danger', '', 'prisoner_status', '0', '已死亡', 'admin', NOW(), 'admin', NOW(), 0);
+
+-- 4. 文化程度 (prison_education)
+INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES (2011, '文化程度', 'prison_education', '0', '服刑人员文化程度', 'admin', NOW(), 'admin', NOW(), 0);
+
+INSERT INTO system_dict_data (id, sort, label, value, color_type, css_class, dict_type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES
+(201101, 1, '文盲', '1', 'info', '', 'prison_education', '0', '未接受过教育', 'admin', NOW(), 'admin', NOW(), 0),
+(201102, 2, '小学', '2', 'info', '', 'prison_education', '0', '小学毕业', 'admin', NOW(), 'admin', NOW(), 0),
+(201103, 3, '初中', '3', 'primary', '', 'prison_education', '0', '初中毕业', 'admin', NOW(), 'admin', NOW(), 0),
+(201104, 4, '高中', '4', 'primary', '', 'prison_education', '0', '高中毕业', 'admin', NOW(), 'admin', NOW(), 0),
+(201105, 5, '中专', '5', 'success', '', 'prison_education', '0', '中专毕业', 'admin', NOW(), 'admin', NOW(), 0),
+(201106, 6, '大专', '6', 'success', '', 'prison_education', '0', '大专毕业', 'admin', NOW(), 'admin', NOW(), 0),
+(201107, 7, '本科及以上', '7', 'success', '', 'prison_education', '0', '本科及以上学历', 'admin', NOW(), 'admin', NOW(), 0);
+
+-- 5. 问卷问题类型 (prison_question_type)
+INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES (2012, '问卷问题类型', 'prison_question_type', '0', '问卷问题类型', 'admin', NOW(), 'admin', NOW(), 0);
+
+INSERT INTO system_dict_data (id, sort, label, value, color_type, css_class, dict_type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES
+(201201, 1, '单选', '1', 'primary', '', 'prison_question_type', '0', '单选题', 'admin', NOW(), 'admin', NOW(), 0),
+(201202, 2, '多选', '2', 'success', '', 'prison_question_type', '0', '多选题', 'admin', NOW(), 'admin', NOW(), 0),
+(201203, 3, '填空', '3', 'warning', '', 'prison_question_type', '0', '填空题', 'admin', NOW(), 'admin', NOW(), 0),
+(201204, 4, '评分', '4', 'info', '', 'prison_question_type', '0', '评分题', 'admin', NOW(), 'admin', NOW(), 0);
+
+-- 6. 问卷状态 (prison_questionnaire_status)
+INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES (2013, '问卷状态', 'prison_questionnaire_status', '0', '问卷状态', 'admin', NOW(), 'admin', NOW(), 0);
+
+INSERT INTO system_dict_data (id, sort, label, value, color_type, css_class, dict_type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES
+(201301, 1, '草稿', '1', 'info', '', 'prison_questionnaire_status', '0', '问卷草稿', 'admin', NOW(), 'admin', NOW(), 0),
+(201302, 2, '已发布', '2', 'success', '', 'prison_questionnaire_status', '0', '问卷已发布', 'admin', NOW(), 'admin', NOW(), 0),
+(201303, 3, '已禁用', '3', 'danger', '', 'prison_questionnaire_status', '0', '问卷已禁用', 'admin', NOW(), 'admin', NOW(), 0);
+
+-- 6.1 问卷类型 (prison_questionnaire_type)
+INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES (2021, '问卷类型', 'prison_questionnaire_type', '0', '问卷类型', 'admin', NOW(), 'admin', NOW(), 0);
+
+INSERT INTO system_dict_data (id, sort, label, value, color_type, css_class, dict_type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES
+(202101, 1, '心理测评', '1', 'primary', '', 'prison_questionnaire_type', '0', '心理测评问卷', 'admin', NOW(), 'admin', NOW(), 0),
+(202102, 2, '行为评估', '2', 'warning', '', 'prison_questionnaire_type', '0', '行为评估问卷', 'admin', NOW(), 'admin', NOW(), 0),
+(202103, 3, '满意度调查', '3', 'success', '', 'prison_questionnaire_type', '0', '满意度调查问卷', 'admin', NOW(), 'admin', NOW(), 0);
+
+-- 7. 消费类型 (prison_consumption_type)
+INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES (2014, '消费类型', 'prison_consumption_type', '0', '消费记录类型', 'admin', NOW(), 'admin', NOW(), 0);
+
+INSERT INTO system_dict_data (id, sort, label, value, color_type, css_class, dict_type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES
+(201401, 1, '存款', '1', 'success', '', 'prison_consumption_type', '0', '存款', 'admin', NOW(), 'admin', NOW(), 0),
+(201402, 2, '消费', '2', 'primary', '', 'prison_consumption_type', '0', '消费', 'admin', NOW(), 'admin', NOW(), 0),
+(201403, 3, '转账', '3', 'warning', '', 'prison_consumption_type', '0', '转账', 'admin', NOW(), 'admin', NOW(), 0);
+
+-- 8. 消费状态 (prison_consumption_status)
+INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES (2015, '消费状态', 'prison_consumption_status', '0', '消费记录状态', 'admin', NOW(), 'admin', NOW(), 0);
+
+INSERT INTO system_dict_data (id, sort, label, value, color_type, css_class, dict_type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES
+(201501, 1, '成功', '1', 'success', '', 'prison_consumption_status', '0', '交易成功', 'admin', NOW(), 'admin', NOW(), 0),
+(201502, 2, '失败', '2', 'danger', '', 'prison_consumption_status', '0', '交易失败', 'admin', NOW(), 'admin', NOW(), 0);
+
+-- 9. 评估类型 (prison_assessment_type)
+INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES (2016, '评估类型', 'prison_assessment_type', '0', '危险评估类型', 'admin', NOW(), 'admin', NOW(), 0);
+
+INSERT INTO system_dict_data (id, sort, label, value, color_type, css_class, dict_type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES
+(201601, 1, '入狱评估', '1', 'primary', '', 'prison_assessment_type', '0', '入狱时评估', 'admin', NOW(), 'admin', NOW(), 0),
+(201602, 2, '定期评估', '2', 'success', '', 'prison_assessment_type', '0', '定期评估', 'admin', NOW(), 'admin', NOW(), 0),
+(201603, 3, '专项评估', '3', 'warning', '', 'prison_assessment_type', '0', '专项评估', 'admin', NOW(), 'admin', NOW(), 0);
+
+-- 10. 考核等级 (prison_score_level)
+INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES (2017, '考核等级', 'prison_score_level', '0', '计分考核等级', 'admin', NOW(), 'admin', NOW(), 0);
+
+INSERT INTO system_dict_data (id, sort, label, value, color_type, css_class, dict_type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES
+(201701, 1, '优秀', '1', 'success', '', 'prison_score_level', '0', '表现优秀', 'admin', NOW(), 'admin', NOW(), 0),
+(201702, 2, '良好', '2', 'primary', '', 'prison_score_level', '0', '表现良好', 'admin', NOW(), 'admin', NOW(), 0),
+(201703, 3, '合格', '3', 'warning', '', 'prison_score_level', '0', '表现合格', 'admin', NOW(), 'admin', NOW(), 0),
+(201704, 4, '不合格', '4', 'danger', '', 'prison_score_level', '0', '表现不合格', 'admin', NOW(), 'admin', NOW(), 0);
+
+-- 11. 考核状态 (prison_score_status)
+INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES (2018, '考核状态', 'prison_score_status', '0', '计分考核状态', 'admin', NOW(), 'admin', NOW(), 0);
+
+INSERT INTO system_dict_data (id, sort, label, value, color_type, css_class, dict_type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES
+(201801, 1, '待审核', '1', 'info', '', 'prison_score_status', '0', '待审核', 'admin', NOW(), 'admin', NOW(), 0),
+(201802, 2, '已通过', '2', 'success', '', 'prison_score_status', '0', '已通过审核', 'admin', NOW(), 'admin', NOW(), 0),
+(201803, 3, '已驳回', '3', 'danger', '', 'prison_score_status', '0', '已驳回', 'admin', NOW(), 'admin', NOW(), 0);
+
+-- 12. 监区类型 (prison_area_type)
+INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES (2019, '监区类型', 'prison_area_type', '0', '监区类型', 'admin', NOW(), 'admin', NOW(), 0);
+
+INSERT INTO system_dict_data (id, sort, label, value, color_type, css_class, dict_type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES
+(201901, 1, '普通监区', '1', 'primary', '', 'prison_area_type', '0', '普通管理监区', 'admin', NOW(), 'admin', NOW(), 0),
+(201902, 2, '严管监区', '2', 'danger', '', 'prison_area_type', '0', '严格管理监区', 'admin', NOW(), 'admin', NOW(), 0),
+(201903, 3, '医院', '3', 'success', '', 'prison_area_type', '0', '监狱医院', 'admin', NOW(), 'admin', NOW(), 0),
+(201904, 4, '禁闭室', '4', 'warning', '', 'prison_area_type', '0', '禁闭室', 'admin', NOW(), 'admin', NOW(), 0);
+
+-- 13. 监室状态 (prison_cell_status)
+INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES (2020, '监室状态', 'prison_cell_status', '0', '监室状态', 'admin', NOW(), 'admin', NOW(), 0);
+
+INSERT INTO system_dict_data (id, sort, label, value, color_type, css_class, dict_type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES
+(202001, 1, '启用', '1', 'success', '', 'prison_cell_status', '0', '监室启用', 'admin', NOW(), 'admin', NOW(), 0),
+(202002, 2, '禁用', '2', 'danger', '', 'prison_cell_status', '0', '监室禁用', 'admin', NOW(), 'admin', NOW(), 0);
diff --git a/sql/prison_init.sql b/sql/prison_init.sql
new file mode 100644
index 0000000000..bbb9f57cb2
--- /dev/null
+++ b/sql/prison_init.sql
@@ -0,0 +1,228 @@
+-- ============================================
+-- XL监狱综合管理平台 - 数据库初始化脚本
+-- ============================================
+
+-- 罪犯信息表
+CREATE TABLE IF NOT EXISTS `prison_prisoner` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '罪犯ID',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ `prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号',
+ `name` varchar(50) NOT NULL COMMENT '姓名',
+ `gender` tinyint NOT NULL COMMENT '性别:1-男 2-女',
+ `birthday` date DEFAULT NULL COMMENT '出生日期',
+ `id_card` varchar(18) DEFAULT NULL COMMENT '身份证号',
+ `ethnicity` varchar(50) DEFAULT NULL COMMENT '民族',
+ `native_place` varchar(100) DEFAULT NULL COMMENT '籍贯',
+ `education` tinyint DEFAULT NULL COMMENT '文化程度:1-文盲 2-小学 3-初中 4-高中 5-中专 6-大专 7-本科 8-硕士 9-博士',
+ `occupation` varchar(50) DEFAULT NULL COMMENT '入狱前职业',
+ `address` varchar(500) DEFAULT NULL COMMENT '家庭住址',
+ `crime` varchar(200) NOT NULL COMMENT '罪名',
+ `sentence_years` int DEFAULT 0 COMMENT '刑期(年)',
+ `sentence_months` int DEFAULT 0 COMMENT '刑期(月)',
+ `imprisonment_date` date DEFAULT NULL COMMENT '入狱日期',
+ `release_date` date DEFAULT NULL COMMENT '释放日期',
+ `supervision_level` tinyint DEFAULT 2 COMMENT '监管等级:1-严管 2-普管 3-宽管',
+ `risk_level` tinyint DEFAULT 1 COMMENT '风险等级:1-低风险 2-中风险 3-高风险 4-极高风险',
+ `prison_area_id` bigint DEFAULT NULL COMMENT '监区ID',
+ `prison_cell_id` bigint DEFAULT NULL COMMENT '监室ID',
+ `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-在押 2-已释放 3-已死亡 4-假释',
+ `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 '是否删除',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `uk_prisoner_no` (`prisoner_no`, `tenant_id`),
+ KEY `idx_name` (`name`),
+ KEY `idx_id_card` (`id_card`),
+ KEY `idx_status` (`status`)
+) ENGINE=InnoDB COMMENT='罪犯信息表';
+
+-- 监区信息表
+CREATE TABLE IF NOT EXISTS `prison_area` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '监区ID',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ `name` varchar(50) NOT NULL COMMENT '监区名称',
+ `code` varchar(50) NOT NULL COMMENT '监区编码',
+ `type` tinyint DEFAULT NULL COMMENT '监区类型:1-普通监区 2-严管监区 3-医院 4-禁闭室',
+ `capacity` int DEFAULT NULL COMMENT '容纳人数',
+ `current_count` int DEFAULT 0 COMMENT '当前人数',
+ `sort` int 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 '是否删除',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `uk_code` (`code`, `tenant_id`),
+ KEY `idx_sort` (`sort`)
+) ENGINE=InnoDB COMMENT='监区信息表';
+
+-- 监室信息表
+CREATE TABLE IF NOT EXISTS `prison_cell` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '监室ID',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ `area_id` bigint NOT NULL COMMENT '所属监区ID',
+ `name` varchar(50) NOT NULL COMMENT '监室名称',
+ `code` varchar(50) NOT NULL COMMENT '监室编码',
+ `capacity` int DEFAULT NULL COMMENT '床位数量',
+ `current_count` int DEFAULT 0 COMMENT '当前人数',
+ `sort` int 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 '是否删除',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `uk_code` (`code`, `tenant_id`),
+ KEY `idx_area_id` (`area_id`)
+) ENGINE=InnoDB COMMENT='监室信息表';
+
+-- 计分考核表
+CREATE TABLE IF NOT EXISTS `prison_score` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ `prisoner_id` bigint NOT NULL COMMENT '罪犯ID',
+ `prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号',
+ `year` int NOT NULL COMMENT '考核年份',
+ `month` int NOT NULL COMMENT '考核月份',
+ `base_score` decimal(10,2) DEFAULT 0.00 COMMENT '基础分',
+ `reward_score` decimal(10,2) DEFAULT 0.00 COMMENT '加分',
+ `penalty_score` decimal(10,2) DEFAULT 0.00 COMMENT '扣分',
+ `total_score` decimal(10,2) DEFAULT 0.00 COMMENT '总分',
+ `level` tinyint DEFAULT NULL COMMENT '考核等级:1-优秀 2-良好 3-合格 4-不合格',
+ `assessor_id` bigint DEFAULT NULL COMMENT '考核人ID',
+ `assessor_name` varchar(50) DEFAULT NULL COMMENT '考核人姓名',
+ `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-待审核 2-已通过 3-已驳回',
+ `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 '是否删除',
+ PRIMARY KEY (`id`),
+ KEY `idx_prisoner_id` (`prisoner_id`),
+ KEY `idx_year_month` (`year`, `month`)
+) ENGINE=InnoDB COMMENT='计分考核表';
+
+-- 危险评估表
+CREATE TABLE IF NOT EXISTS `prison_risk_assessment` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '评估ID',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ `prisoner_id` bigint NOT NULL COMMENT '罪犯ID',
+ `prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号',
+ `assessment_type` tinyint NOT NULL COMMENT '评估类型:1-入狱评估 2-定期评估 3-专项评估',
+ `assessment_date` date NOT NULL COMMENT '评估日期',
+ `violence_score` decimal(10,2) DEFAULT 0.00 COMMENT '暴力倾向得分',
+ `escape_score` decimal(10,2) DEFAULT 0.00 COMMENT '脱逃倾向得分',
+ `suicide_score` decimal(10,2) DEFAULT 0.00 COMMENT '自杀倾向得分',
+ `total_score` decimal(10,2) DEFAULT 0.00 COMMENT '综合得分',
+ `risk_level` tinyint NOT NULL COMMENT '风险等级:1-低风险 2-中风险 3-高风险 4-极高风险',
+ `risk_factors` varchar(500) DEFAULT NULL COMMENT '风险因素',
+ `suggestions` varchar(500) DEFAULT NULL COMMENT '管控建议',
+ `assessor_id` bigint DEFAULT NULL COMMENT '评估人ID',
+ `assessor_name` varchar(50) DEFAULT NULL COMMENT '评估人姓名',
+ `next_assessment_date` date DEFAULT NULL 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 '是否删除',
+ PRIMARY KEY (`id`),
+ KEY `idx_prisoner_id` (`prisoner_id`),
+ KEY `idx_assessment_date` (`assessment_date`)
+) ENGINE=InnoDB COMMENT='危险评估表';
+
+-- 消费记录表
+CREATE TABLE IF NOT EXISTS `prison_consumption` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ `prisoner_id` bigint NOT NULL COMMENT '罪犯ID',
+ `prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号',
+ `type` tinyint NOT NULL COMMENT '类型:1-存款 2-消费 3-转账',
+ `amount` decimal(12,2) NOT NULL COMMENT '金额',
+ `balance` decimal(12,2) DEFAULT 0.00 COMMENT '账户余额',
+ `goods_name` varchar(100) DEFAULT NULL COMMENT '商品名称',
+ `goods_count` int DEFAULT 1 COMMENT '商品数量',
+ `order_no` varchar(64) DEFAULT NULL COMMENT '订单号',
+ `trade_time` datetime NOT NULL 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 '是否删除',
+ PRIMARY KEY (`id`),
+ KEY `idx_prisoner_id` (`prisoner_id`),
+ KEY `idx_trade_time` (`trade_time`),
+ KEY `idx_type` (`type`)
+) ENGINE=InnoDB COMMENT='消费记录表';
+
+-- 问卷模板表
+CREATE TABLE IF NOT EXISTS `prison_questionnaire` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '问卷ID',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ `title` varchar(200) NOT NULL COMMENT '问卷标题',
+ `type` tinyint NOT NULL COMMENT '问卷类型:1-心理测评 2-行为评估 3-满意度调查',
+ `description` varchar(500) DEFAULT NULL COMMENT '问卷说明',
+ `total_score` decimal(10,2) DEFAULT 100.00 COMMENT '总分',
+ `pass_score` decimal(10,2) DEFAULT 60.00 COMMENT '及格分',
+ `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-草稿 2-已发布 3-已禁用',
+ `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 '是否删除',
+ PRIMARY KEY (`id`),
+ KEY `idx_type` (`type`),
+ KEY `idx_status` (`status`)
+) ENGINE=InnoDB COMMENT='问卷模板表';
+
+-- 问卷问题表
+CREATE TABLE IF NOT EXISTS `prison_question` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '问题ID',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ `questionnaire_id` bigint NOT NULL COMMENT '所属问卷ID',
+ `title` varchar(500) NOT NULL COMMENT '问题标题',
+ `type` tinyint NOT NULL COMMENT '问题类型:1-单选 2-多选 3-填空 4-评分',
+ `options` text COMMENT '选项JSON:[{label:"选项1",score:10},...]',
+ `score` decimal(10,2) DEFAULT 0.00 COMMENT '分值',
+ `sort` int DEFAULT 0 COMMENT '排序',
+ `is_required` bit(1) DEFAULT b'1' 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 '是否删除',
+ PRIMARY KEY (`id`),
+ KEY `idx_questionnaire_id` (`questionnaire_id`)
+) ENGINE=InnoDB COMMENT='问卷问题表';
+
+-- 问卷答题记录表
+CREATE TABLE IF NOT EXISTS `prison_questionnaire_record` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ `questionnaire_id` bigint NOT NULL COMMENT '问卷ID',
+ `prisoner_id` bigint NOT NULL COMMENT '罪犯ID',
+ `prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号',
+ `total_score` decimal(10,2) DEFAULT 0.00 COMMENT '得分',
+ `pass_status` tinyint DEFAULT NULL COMMENT '是否及格:1-及格 2-不及格',
+ `answer_time` datetime NOT 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 '创建时间',
+ `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 '是否删除',
+ PRIMARY KEY (`id`),
+ KEY `idx_questionnaire_id` (`questionnaire_id`),
+ KEY `idx_prisoner_id` (`prisoner_id`)
+) ENGINE=InnoDB COMMENT='问卷答题记录表';
diff --git a/sql/prison_inmate_schema.sql b/sql/prison_inmate_schema.sql
new file mode 100644
index 0000000000..a76c891fe8
--- /dev/null
+++ b/sql/prison_inmate_schema.sql
@@ -0,0 +1,45 @@
+-- ============================================
+-- 服刑人员表
+-- ============================================
+DROP TABLE IF EXISTS prison_inmate;
+CREATE TABLE prison_inmate (
+ id bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+ prisoner_no varchar(50) NOT NULL COMMENT '服刑人员编号',
+ name varchar(50) NOT NULL COMMENT '姓名',
+ gender tinyint NOT NULL COMMENT '性别:1-男,2-女',
+ birthday date DEFAULT NULL COMMENT '出生日期',
+ id_card varchar(18) DEFAULT NULL COMMENT '身份证号',
+ ethnicity varchar(50) DEFAULT '' COMMENT '民族',
+ native_place varchar(100) DEFAULT '' COMMENT '籍贯',
+ education tinyint DEFAULT NULL COMMENT '文化程度:1-文盲,2-小学,3-初中,4-高中,5-中专,6-大专,7-本科及以上',
+ occupation varchar(100) DEFAULT '' COMMENT '职业',
+ address varchar(500) DEFAULT '' COMMENT '家庭住址',
+ crime varchar(200) NOT NULL COMMENT '罪名',
+ sentence_years int DEFAULT 0 COMMENT '刑期(年)',
+ sentence_months int DEFAULT 0 COMMENT '刑期(月)',
+ imprisonment_date date DEFAULT NULL COMMENT '入狱日期',
+ release_date date DEFAULT NULL COMMENT '释放日期',
+ supervision_level tinyint DEFAULT NULL COMMENT '监管等级:1-严管级,2-普管级,3-宽管级',
+ risk_level tinyint DEFAULT NULL COMMENT '风险等级:1-高风险,2-中风险,3-低风险',
+ prison_area_id bigint DEFAULT NULL COMMENT '当前监区ID',
+ prison_cell_id bigint DEFAULT NULL COMMENT '当前监室ID',
+ status tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-在押,2-假释,3-暂予监外执行,4-已释放,5-已死亡',
+ remark varchar(500) DEFAULT '' 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 tinyint NOT NULL DEFAULT 0 COMMENT '是否删除',
+ tenant_id bigint NOT NULL DEFAULT 1 COMMENT '租户编号',
+ PRIMARY KEY (id),
+ UNIQUE KEY uk_prisoner_no (prisoner_no),
+ KEY idx_name (name),
+ KEY idx_id_card (id_card),
+ KEY idx_prison_area_id (prison_area_id),
+ KEY idx_prison_cell_id (prison_cell_id),
+ KEY idx_status (status)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='服刑人员信息表';
+
+-- 创建序列(如果需要)
+-- DROP SEQUENCE IF EXISTS prison_inmate_seq;
+-- CREATE SEQUENCE prison_inmate_seq START WITH 1 INCREMENT BY 1;
diff --git a/sql/prison_sample_data.sql b/sql/prison_sample_data.sql
new file mode 100644
index 0000000000..ee7006bca0
--- /dev/null
+++ b/sql/prison_sample_data.sql
@@ -0,0 +1,56 @@
+-- ============================================
+-- 服刑人员仿真数据
+-- ============================================
+
+-- 插入服刑人员数据
+INSERT INTO prison_prisoner (id, prisoner_no, name, gender, birthday, id_card, ethnicity, native_place, education, occupation, address, crime, sentence_years, sentence_months, imprisonment_date, release_date, supervision_level, risk_level, prison_area_id, prison_cell_id, status, remark, creator, create_time, updater, update_time, deleted, tenant_id)
+VALUES
+-- 1. 张三 - 盗窃罪
+(1, 'ZF2024001', '张三', 1, '1985-03-15', '310101198503151234', '汉族', '上海市', 3, '无业', '上海市徐汇区某路100号', '盗窃罪', 3, 6, '2024-01-15', '2027-07-14', 2, 1, 1, 101, 1, '多次盗窃,数额较大', 'admin', NOW(), 'admin', NOW(), 0, 1),
+
+-- 2. 李四 - 故意伤害罪
+(2, 'ZF2024002', '李四', 1, '1990-07-22', '320101199007221234', '汉族', '江苏省南京市', 4, '工人', '南京市鼓楼区某路200号', '故意伤害罪', 5, 0, '2023-06-01', '2028-05-31', 2, 2, 1, 102, 1, '打架斗殴致人重伤', 'admin', NOW(), 'admin', NOW(), 0, 1),
+
+-- 3. 王芳 - 诈骗罪
+(3, 'ZF2024003', '王芳', 2, '1992-11-08', '330102199211081234', '汉族', '浙江省杭州市', 5, '公司职员', '杭州市西湖区某路300号', '诈骗罪', 2, 0, '2024-03-20', '2026-03-19', 3, 3, 2, 201, 1, '电信诈骗初犯', 'admin', NOW(), 'admin', NOW(), 0, 1),
+
+-- 4. 赵六 - 抢劫罪
+(4, 'ZF2024004', '赵六', 1, '1988-05-30', '410101198805301234', '汉族', '河南省郑州市', 2, '无业', '郑州市金水区某路400号', '抢劫罪', 8, 0, '2022-09-10', '2030-09-09', 1, 1, 1, 103, 1, '团伙抢劫累犯', 'admin', NOW(), 'admin', NOW(), 0, 1),
+
+-- 5. 陈小明 - 贩卖毒品罪
+(5, 'ZF2024005', '陈小明', 1, '1995-01-25', '510101199501251234', '汉族', '四川省成都市', 3, '无业', '成都市武侯区某路500号', '贩卖毒品罪', 10, 0, '2021-12-01', '2031-11-30', 1, 1, 1, 104, 1, '贩卖毒品罪情节严重', 'admin', NOW(), 'admin', NOW(), 0, 1),
+
+-- 6. 刘丽 - 职务侵占罪
+(6, 'ZF2024006', '刘丽', 2, '1987-09-12', '440101198709121234', '汉族', '广东省广州市', 6, '会计', '广州市天河区某路600号', '职务侵占罪', 3, 0, '2024-02-15', '2027-02-14', 2, 2, 2, 202, 1, '侵占公司资金', 'admin', NOW(), 'admin', NOW(), 0, 1),
+
+-- 7. 孙强 - 交通肇事罪
+(7, 'ZF2024007', '孙强', 1, '1993-04-18', '420101199304181234', '汉族', '湖北省武汉市', 4, '司机', '武汉市江岸区某路700号', '交通肇事罪', 2, 0, '2024-05-01', '2026-04-30', 3, 3, 2, 203, 1, '醉驾致人死亡', 'admin', NOW(), 'admin', NOW(), 0, 1),
+
+-- 8. 周雪 - 非法吸收公众存款罪
+(8, 'ZF2024008', '周雪', 2, '1980-12-03', '310101198012031234', '汉族', '上海市', 7, '金融从业者', '上海市浦东新区某路800号', '非法吸收公众存款罪', 4, 0, '2023-08-15', '2027-08-14', 2, 2, 1, 105, 1, 'P2P平台非法集资', 'admin', NOW(), 'admin', NOW(), 0, 1),
+
+-- 9. 吴刚 - 强奸罪
+(9, 'ZF2024009', '吴刚', 1, '1998-06-28', '520101199806281234', '汉族', '贵州省贵阳市', 2, '无业', '贵阳市南明区某路900号', '强奸罪', 6, 0, '2023-03-20', '2029-03-19', 1, 1, 1, 106, 1, '强奸罪累犯', 'admin', NOW(), 'admin', NOW(), 0, 1),
+
+-- 10. 郑敏 - 组织卖淫罪
+(10, 'ZF2024010', '郑敏', 2, '1983-08-15', '330102198308151234', '汉族', '浙江省宁波市', 3, '无业', '宁波市鄞州区某路1000号', '组织卖淫罪', 5, 0, '2023-11-01', '2028-10-31', 1, 1, 2, 204, 1, '组织卖淫团伙头目', 'admin', NOW(), 'admin', NOW(), 0, 1);
+
+-- 插入监区数据
+INSERT INTO prison_area (id, tenant_id, name, code, type, capacity, current_count, sort, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES
+(1, 1, '第一监区', 'AREA001', 1, 100, 50, 1, 1, '普通监区', 'admin', NOW(), 'admin', NOW(), 0),
+(2, 1, '第二监区', 'AREA002', 1, 100, 30, 2, 1, '普通监区', 'admin', NOW(), 'admin', NOW(), 0),
+(3, 1, '严管监区', 'AREA003', 2, 50, 20, 3, 1, '严管监区', 'admin', NOW(), 'admin', NOW(), 0);
+
+-- 插入监室数据
+INSERT INTO prison_cell (id, tenant_id, area_id, name, code, capacity, current_count, sort, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES
+(101, 1, 1, '101室', 'CELL101', 10, 8, 1, 1, '第一监区第一室', 'admin', NOW(), 'admin', NOW(), 0),
+(102, 1, 1, '102室', 'CELL102', 10, 7, 2, 1, '第一监区第二室', 'admin', NOW(), 'admin', NOW(), 0),
+(103, 1, 1, '103室', 'CELL103', 10, 5, 3, 1, '第一监区第三室', 'admin', NOW(), 'admin', NOW(), 0),
+(104, 1, 1, '104室', 'CELL104', 10, 6, 4, 1, '第一监区第四室', 'admin', NOW(), 'admin', NOW(), 0),
+(105, 1, 1, '105室', 'CELL105', 10, 4, 5, 1, '第一监区第五室', 'admin', NOW(), 'admin', NOW(), 0),
+(201, 1, 2, '201室', 'CELL201', 10, 5, 1, 1, '第二监区第一室', 'admin', NOW(), 'admin', NOW(), 0),
+(202, 1, 2, '202室', 'CELL202', 10, 6, 2, 1, '第二监区第二室', 'admin', NOW(), 'admin', NOW(), 0),
+(203, 1, 2, '203室', 'CELL203', 10, 4, 3, 1, '第二监区第三室', 'admin', NOW(), 'admin', NOW(), 0),
+(204, 1, 2, '204室', 'CELL204', 10, 5, 4, 1, '第二监区第四室', 'admin', NOW(), 'admin', NOW(), 0);
diff --git a/sql/upgrade_questionnaire_20260113.sql b/sql/upgrade_questionnaire_20260113.sql
new file mode 100644
index 0000000000..ff9b3dc4be
--- /dev/null
+++ b/sql/upgrade_questionnaire_20260113.sql
@@ -0,0 +1,73 @@
+-- =====================================================
+-- XL监狱综合管理平台 - 问卷系统增强脚本
+-- 执行日期:2026-01-13
+-- =====================================================
+
+-- 切换到目标数据库
+USE xlcp_dev;
+
+-- =====================================================
+-- 1. 问题表 (prison_question) 新增字段
+-- =====================================================
+ALTER TABLE prison_question
+ADD COLUMN part_name VARCHAR(100) COMMENT '分区名称(Part名称),用于将问题分组' AFTER is_required,
+ADD COLUMN part_sort INT DEFAULT 0 COMMENT '分区排序(同一问卷内的分区序号)' AFTER part_name,
+ADD COLUMN help_text VARCHAR(500) COMMENT '帮助说明文字' AFTER part_sort,
+ADD COLUMN placeholder VARCHAR(200) COMMENT '占位提示(填空题/数字题显示)' AFTER help_text,
+ADD COLUMN default_value VARCHAR(200) COMMENT '默认值' AFTER placeholder,
+ADD COLUMN auto_fill_type VARCHAR(20) DEFAULT 'NONE' COMMENT '自动填充类型:NONE-无 AUTO-系统自动填充 MANUAL-手动输入' AFTER default_value,
+ADD COLUMN auto_fill_source VARCHAR(100) COMMENT '自动填充来源:dict:字典类型 / field:字段名 示例:dict:system_user_sex 或 field:prisonerName' AFTER auto_fill_type,
+ADD COLUMN display_condition VARCHAR(500) COMMENT '显示条件JSON:{\"field\":\"字段名\",\"operator\":\">=\",\"value\":\"值\"} 示例:{\"field\":\"riskLevel\",\"operator\":\">=\",\"value\":\"3\"}' AFTER auto_fill_source,
+ADD COLUMN min_value INT COMMENT '最小值(数字/评分题)' AFTER display_condition,
+ADD COLUMN max_value INT COMMENT '最大值(数字/评分题)' AFTER min_value;
+
+-- =====================================================
+-- 2. 问卷表 (prison_questionnaire) 新增字段
+-- =====================================================
+ALTER TABLE prison_questionnaire
+ADD COLUMN cover_image VARCHAR(500) COMMENT '封面图片URL' AFTER status,
+ADD COLUMN instruction VARCHAR(1000) COMMENT '填写说明' AFTER cover_image,
+ADD COLUMN estimated_time INT COMMENT '预计耗时(分钟)' AFTER instruction,
+ADD COLUMN part_count INT DEFAULT 0 COMMENT '分区数量' AFTER estimated_time,
+ADD COLUMN allow_anonymous TINYINT(1) DEFAULT 1 COMMENT '是否允许匿名:0-否 1-是' AFTER part_count;
+
+-- =====================================================
+-- 3. 验证脚本 - 查看新增字段
+-- =====================================================
+SELECT COLUMN_NAME, COLUMN_TYPE, COLUMN_COMMENT
+FROM INFORMATION_SCHEMA.COLUMNS
+WHERE TABLE_SCHEMA = 'xlcp_dev'
+ AND TABLE_NAME = 'prison_question'
+ AND COLUMN_NAME LIKE 'part_%'
+ OR COLUMN_NAME = 'help_text'
+ OR COLUMN_NAME = 'placeholder'
+ OR COLUMN_NAME = 'default_value'
+ OR COLUMN_NAME LIKE 'auto_%'
+ OR COLUMN_NAME = 'display_condition'
+ OR COLUMN_NAME IN ('min_value', 'max_value')
+ORDER BY ORDINAL_POSITION;
+
+SELECT COLUMN_NAME, COLUMN_TYPE, COLUMN_COMMENT
+FROM INFORMATION_SCHEMA.COLUMNS
+WHERE TABLE_SCHEMA = 'xlcp_dev'
+ AND TABLE_NAME = 'prison_questionnaire'
+ AND COLUMN_NAME IN ('cover_image', 'instruction', 'estimated_time', 'part_count', 'allow_anonymous')
+ORDER BY ORDINAL_POSITION;
+
+-- =====================================================
+-- 4. 问题类型字典数据(如果需要)
+-- =====================================================
+-- 问题类型:1-单选 2-多选 3-填空 4-评分 5-日期 6-数字
+-- INSERT INTO system_dict_data (dict_type, dict_value, dict_label, sort_order, status)
+-- VALUES ('prison_question_type', '5', '日期', 5, '0'),
+-- ('prison_question_type', '6', '数字', 6, '0');
+
+-- =====================================================
+-- 5. 自动填充类型字典数据
+-- =====================================================
+-- INSERT INTO system_dict_data (dict_type, dict_value, dict_label, sort_order, status)
+-- VALUES ('question_auto_fill_type', 'NONE', '无', 1, '0'),
+-- ('question_auto_fill_type', 'AUTO', '系统自动填充', 2, '0'),
+-- ('question_auto_fill_type', 'MANUAL', '手动输入', 3, '0');
+
+SELECT '脚本执行完成!请验证字段是否添加成功。' AS RESULT;
diff --git a/sql/upgrade_questionnaire_auto_fill_source_20260113.sql b/sql/upgrade_questionnaire_auto_fill_source_20260113.sql
new file mode 100644
index 0000000000..64379a947a
--- /dev/null
+++ b/sql/upgrade_questionnaire_auto_fill_source_20260113.sql
@@ -0,0 +1,68 @@
+-- =====================================================
+-- XL监狱综合管理平台 - 问卷自动填充来源字典
+-- 执行日期:2026-01-13
+-- =====================================================
+
+-- 切换到目标数据库
+USE xlcp_dev;
+
+-- =====================================================
+-- 1. 自动填充来源字典类型
+-- =====================================================
+INSERT INTO system_dict_type (id, name, type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES (2100, '问卷自动填充来源', 'prison_question_auto_fill_source', '0', '问卷问题自动填充来源配置', 'admin', NOW(), 'admin', NOW(), 0);
+
+-- =====================================================
+-- 2. 自动填充来源字典数据
+-- =====================================================
+
+-- 罪犯基本信息类(field: 前缀)
+INSERT INTO system_dict_data (id, sort, label, value, color_type, css_class, dict_type, status, remark, creator, create_time, updater, update_time, deleted)
+VALUES
+ -- 罪犯基本信息 (ID: 210101-210110)
+ (210101, 1, '罪犯姓名', 'field:prisonerName', '', '', 'prison_question_auto_fill_source', '0', '从罪犯基本信息获取姓名', 'admin', NOW(), 'admin', NOW(), 0),
+ (210102, 2, '罪犯编号', 'field:prisonerNo', '', '', 'prison_question_auto_fill_source', '0', '从罪犯基本信息获取编号', 'admin', NOW(), 'admin', NOW(), 0),
+ (210103, 3, '年龄', 'field:age', '', '', 'prison_question_auto_fill_source', '0', '从罪犯基本信息计算年龄', 'admin', NOW(), 'admin', NOW(), 0),
+ (210104, 4, '性别', 'field:gender', '', '', 'prison_question_auto_fill_source', '0', '从罪犯基本信息获取性别', 'admin', NOW(), 'admin', NOW(), 0),
+ (210105, 5, '民族', 'field:nation', '', '', 'prison_question_auto_fill_source', '0', '从罪犯基本信息获取民族', 'admin', NOW(), 'admin', NOW(), 0),
+ (210106, 6, '文化程度', 'field:education', '', '', 'prison_question_auto_fill_source', '0', '从罪犯基本信息获取文化程度', 'admin', NOW(), 'admin', NOW(), 0),
+ (210107, 7, '出生日期', 'field:birthDate', '', '', 'prison_question_auto_fill_source', '0', '从罪犯基本信息获取出生日期', 'admin', NOW(), 'admin', NOW(), 0),
+ (210108, 8, '籍贯', 'field:nativePlace', '', '', 'prison_question_auto_fill_source', '0', '从罪犯基本信息获取籍贯', 'admin', NOW(), 'admin', NOW(), 0),
+ (210109, 9, '身份证号', 'field:idCard', '', '', 'prison_question_auto_fill_source', '0', '从罪犯基本信息获取身份证号', 'admin', NOW(), 'admin', NOW(), 0),
+ (210110, 10, '家庭住址', 'field:address', '', '', 'prison_question_auto_fill_source', '0', '从罪犯基本信息获取家庭住址', 'admin', NOW(), 'admin', NOW(), 0),
+
+ -- 狱政管理类 (ID: 210120-210128)
+ (210120, 20, '监管等级', 'field:supervisionLevel', '', '', 'prison_question_auto_fill_source', '0', '从狱政管理获取监管等级', 'admin', NOW(), 'admin', NOW(), 0),
+ (210121, 21, '风险等级', 'field:riskLevel', '', '', 'prison_question_auto_fill_source', '0', '从危评系统获取风险等级', 'admin', NOW(), 'admin', NOW(), 0),
+ (210122, 22, '在押时长(月)', 'field:months', '', '', 'prison_question_auto_fill_source', '0', '计算在押时长(月)', 'admin', NOW(), 'admin', NOW(), 0),
+ (210123, 23, '入监日期', 'field:admissionDate', '', '', 'prison_question_auto_fill_source', '0', '从狱政管理获取入监日期', 'admin', NOW(), 'admin', NOW(), 0),
+ (210124, 24, '预计出监日期', 'field:releaseDate', '', '', 'prison_question_auto_fill_source', '0', '从狱政管理获取预计出监日期', 'admin', NOW(), 'admin', NOW(), 0),
+ (210125, 25, '刑期(年)', 'field:sentenceYears', '', '', 'prison_question_auto_fill_source', '0', '从狱政管理获取刑期', 'admin', NOW(), 'admin', NOW(), 0),
+ (210126, 26, '犯罪类型', 'field:crimeType', '', '', 'prison_question_auto_fill_source', '0', '从狱政管理获取犯罪类型', 'admin', NOW(), 'admin', NOW(), 0),
+ (210127, 27, '所在监区', 'field:prisonArea', '', '', 'prison_question_auto_fill_source', '0', '从狱政管理获取所在监区', 'admin', NOW(), 'admin', NOW(), 0),
+ (210128, 28, '所在监室', 'field:prisonCell', '', '', 'prison_question_auto_fill_source', '0', '从狱政管理获取所在监室', 'admin', NOW(), 'admin', NOW(), 0),
+
+ -- 考核评估类 (ID: 210140-210145)
+ (210140, 40, '当前总分', 'field:totalScore', '', '', 'prison_question_auto_fill_source', '0', '从计分考核获取当前总分', 'admin', NOW(), 'admin', NOW(), 0),
+ (210141, 41, '本月得分', 'field:monthScore', '', '', 'prison_question_auto_fill_source', '0', '从计分考核获取本月得分', 'admin', NOW(), 'admin', NOW(), 0),
+ (210142, 42, '本年累计得分', 'field:yearScore', '', '', 'prison_question_auto_fill_source', '0', '从计分考核获取本年累计得分', 'admin', NOW(), 'admin', NOW(), 0),
+ (210143, 43, '评估次数', 'field:assessmentCount', '', '', 'prison_question_auto_fill_source', '0', '从危评系统获取评估次数', 'admin', NOW(), 'admin', NOW(), 0),
+ (210144, 44, '上次评估日期', 'field:lastAssessmentDate', '', '', 'prison_question_auto_fill_source', '0', '从危评系统获取上次评估日期', 'admin', NOW(), 'admin', NOW(), 0),
+ (210145, 45, '考核等级', 'field:scoreLevel', '', '', 'prison_question_auto_fill_source', '0', '从计分考核获取考核等级', 'admin', NOW(), 'admin', NOW(), 0),
+
+ -- 系统字典类(dict: 前缀)(ID: 210160-210164)
+ (210160, 60, '性别(字典)', 'dict:system_user_sex', '', '', 'prison_question_auto_fill_source', '0', '从系统字典获取性别选项', 'admin', NOW(), 'admin', NOW(), 0),
+ (210161, 61, '监管等级(字典)', 'dict:prison_supervision_level', '', '', 'prison_question_auto_fill_source', '0', '从系统字典获取监管等级选项', 'admin', NOW(), 'admin', NOW(), 0),
+ (210162, 62, '风险等级(字典)', 'dict:prison_risk_level', '', '', 'prison_question_auto_fill_source', '0', '从系统字典获取风险等级选项', 'admin', NOW(), 'admin', NOW(), 0),
+ (210163, 63, '文化程度(字典)', 'dict:prison_education', '', '', 'prison_question_auto_fill_source', '0', '从系统字典获取文化程度选项', 'admin', NOW(), 'admin', NOW(), 0),
+ (210164, 64, '考核等级(字典)', 'dict:prison_score_level', '', '', 'prison_question_auto_fill_source', '0', '从系统字典获取考核等级选项', 'admin', NOW(), 'admin', NOW(), 0);
+
+-- =====================================================
+-- 3. 验证脚本 - 查看新增字典数据
+-- =====================================================
+SELECT id, sort, label, value, dict_type, status
+FROM system_dict_data
+WHERE dict_type = 'prison_question_auto_fill_source'
+ORDER BY sort;
+
+SELECT '字典数据插入完成!请在系统管理-字典管理中查看并启用。' AS RESULT;
diff --git a/yudao-module-prison/pom.xml b/yudao-module-prison/pom.xml
new file mode 100644
index 0000000000..387934634e
--- /dev/null
+++ b/yudao-module-prison/pom.xml
@@ -0,0 +1,77 @@
+
+
+
+ cn.iocoder.boot
+ yudao
+ ${revision}
+
+ 4.0.0
+
+ yudao-module-prison
+ jar
+
+ yudao-module-prison
+ 监狱管理模块:罪犯信息、监区管理、计分考核、危险评估等
+
+
+
+
+ cn.iocoder.boot
+ yudao-spring-boot-starter-web
+
+
+ cn.iocoder.boot
+ yudao-spring-boot-starter-security
+
+
+ cn.iocoder.boot
+ yudao-spring-boot-starter-mybatis
+
+
+ cn.iocoder.boot
+ yudao-spring-boot-starter-redis
+
+
+ cn.iocoder.boot
+ yudao-spring-boot-starter-biz-tenant
+
+
+ cn.iocoder.boot
+ yudao-spring-boot-starter-biz-data-permission
+
+
+ cn.iocoder.boot
+ yudao-spring-boot-starter-excel
+
+
+
+
+ cn.iocoder.boot
+ yudao-module-system
+ ${revision}
+
+
+
+
+ cn.iocoder.boot
+ yudao-module-infra
+ ${revision}
+
+
+
+
+ cn.hutool
+ hutool-all
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/area/PrisonAreaController.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/area/PrisonAreaController.java
new file mode 100644
index 0000000000..736b93546b
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/area/PrisonAreaController.java
@@ -0,0 +1,104 @@
+package cn.iocoder.yudao.module.prison.controller.admin.area;
+
+import org.springframework.web.bind.annotation.*;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import jakarta.validation.constraints.*;
+import jakarta.validation.*;
+import jakarta.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.prison.controller.admin.area.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.area.AreaDO;
+import cn.iocoder.yudao.module.prison.service.area.AreaService;
+
+@Tag(name = "管理后台 - 监区信息")
+@RestController
+@RequestMapping("/prison/area")
+@Validated
+public class PrisonAreaController {
+
+ @Resource
+ private AreaService areaService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建监区信息")
+ @PreAuthorize("@ss.hasPermission('prison:area:create')")
+ public CommonResult createArea(@Valid @RequestBody AreaSaveReqVO createReqVO) {
+ return success(areaService.createArea(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新监区信息")
+ @PreAuthorize("@ss.hasPermission('prison:area:update')")
+ public CommonResult updateArea(@Valid @RequestBody AreaSaveReqVO updateReqVO) {
+ areaService.updateArea(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除监区信息")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('prison:area:delete')")
+ public CommonResult deleteArea(@RequestParam("id") Long id) {
+ areaService.deleteArea(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除监区信息")
+ @PreAuthorize("@ss.hasPermission('prison:area:delete')")
+ public CommonResult deleteAreaList(@RequestParam("ids") List ids) {
+ areaService.deleteAreaListByIds(ids);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得监区信息")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('prison:area:query')")
+ public CommonResult getArea(@RequestParam("id") Long id) {
+ AreaDO area = areaService.getArea(id);
+ return success(BeanUtils.toBean(area, AreaRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得监区信息分页")
+ @PreAuthorize("@ss.hasPermission('prison:area:query')")
+ public CommonResult> getAreaPage(@Valid AreaPageReqVO pageReqVO) {
+ PageResult pageResult = areaService.getAreaPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, AreaRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出监区信息 Excel")
+ @PreAuthorize("@ss.hasPermission('prison:area:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportAreaExcel(@Valid AreaPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = areaService.getAreaPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "监区信息.xls", "数据", AreaRespVO.class,
+ BeanUtils.toBean(list, AreaRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/area/vo/AreaPageReqVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/area/vo/AreaPageReqVO.java
new file mode 100644
index 0000000000..c6d641add9
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/area/vo/AreaPageReqVO.java
@@ -0,0 +1,44 @@
+package cn.iocoder.yudao.module.prison.controller.admin.area.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 监区信息分页 Request VO")
+@Data
+public class AreaPageReqVO extends PageParam {
+
+ @Schema(description = "监区名称", example = "李四")
+ private String name;
+
+ @Schema(description = "监区编码")
+ private String code;
+
+ @Schema(description = "监区类型:1-普通监区 2-严管监区 3-医院 4-禁闭室", example = "1")
+ private Integer type;
+
+ @Schema(description = "容纳人数")
+ private Integer capacity;
+
+ @Schema(description = "当前人数", example = "26596")
+ private Integer currentCount;
+
+ @Schema(description = "排序")
+ private Integer sort;
+
+ @Schema(description = "状态:1-启用 2-禁用", example = "2")
+ private Integer status;
+
+ @Schema(description = "备注", example = "你猜")
+ private String remark;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/area/vo/AreaRespVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/area/vo/AreaRespVO.java
new file mode 100644
index 0000000000..24da832f09
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/area/vo/AreaRespVO.java
@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.prison.controller.admin.area.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import cn.idev.excel.annotation.*;
+
+@Schema(description = "管理后台 - 监区信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class AreaRespVO {
+
+ @Schema(description = "监区ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19443")
+ @ExcelProperty("监区ID")
+ private Long id;
+
+ @Schema(description = "监区名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
+ @ExcelProperty("监区名称")
+ private String name;
+
+ @Schema(description = "监区编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("监区编码")
+ private String code;
+
+ @Schema(description = "监区类型:1-普通监区 2-严管监区 3-医院 4-禁闭室", example = "1")
+ @ExcelProperty("监区类型:1-普通监区 2-严管监区 3-医院 4-禁闭室")
+ private Integer type;
+
+ @Schema(description = "容纳人数")
+ @ExcelProperty("容纳人数")
+ private Integer capacity;
+
+ @Schema(description = "当前人数", example = "26596")
+ @ExcelProperty("当前人数")
+ private Integer currentCount;
+
+ @Schema(description = "排序")
+ @ExcelProperty("排序")
+ private Integer sort;
+
+ @Schema(description = "状态:1-启用 2-禁用", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @ExcelProperty("状态:1-启用 2-禁用")
+ private Integer status;
+
+ @Schema(description = "备注", example = "你猜")
+ @ExcelProperty("备注")
+ private String remark;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/area/vo/AreaSaveReqVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/area/vo/AreaSaveReqVO.java
new file mode 100644
index 0000000000..bbd2a2fe57
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/area/vo/AreaSaveReqVO.java
@@ -0,0 +1,42 @@
+package cn.iocoder.yudao.module.prison.controller.admin.area.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+
+@Schema(description = "管理后台 - 监区信息新增/修改 Request VO")
+@Data
+public class AreaSaveReqVO {
+
+ @Schema(description = "监区ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19443")
+ private Long id;
+
+ @Schema(description = "监区名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
+ @NotEmpty(message = "监区名称不能为空")
+ private String name;
+
+ @Schema(description = "监区编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "监区编码不能为空")
+ private String code;
+
+ @Schema(description = "监区类型:1-普通监区 2-严管监区 3-医院 4-禁闭室", example = "1")
+ private Integer type;
+
+ @Schema(description = "容纳人数")
+ private Integer capacity;
+
+ @Schema(description = "当前人数", example = "26596")
+ private Integer currentCount;
+
+ @Schema(description = "排序")
+ private Integer sort;
+
+ @Schema(description = "状态:1-启用 2-禁用", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @NotNull(message = "状态:1-启用 2-禁用不能为空")
+ private Integer status;
+
+ @Schema(description = "备注", example = "你猜")
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/cell/PrisonCellController.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/cell/PrisonCellController.java
new file mode 100644
index 0000000000..e6d6b83455
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/cell/PrisonCellController.java
@@ -0,0 +1,104 @@
+package cn.iocoder.yudao.module.prison.controller.admin.cell;
+
+import org.springframework.web.bind.annotation.*;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import jakarta.validation.constraints.*;
+import jakarta.validation.*;
+import jakarta.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.prison.controller.admin.cell.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.cell.CellDO;
+import cn.iocoder.yudao.module.prison.service.cell.CellService;
+
+@Tag(name = "管理后台 - 监室信息")
+@RestController
+@RequestMapping("/prison/cell")
+@Validated
+public class PrisonCellController {
+
+ @Resource
+ private CellService cellService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建监室信息")
+ @PreAuthorize("@ss.hasPermission('prison:cell:create')")
+ public CommonResult createCell(@Valid @RequestBody CellSaveReqVO createReqVO) {
+ return success(cellService.createCell(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新监室信息")
+ @PreAuthorize("@ss.hasPermission('prison:cell:update')")
+ public CommonResult updateCell(@Valid @RequestBody CellSaveReqVO updateReqVO) {
+ cellService.updateCell(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除监室信息")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('prison:cell:delete')")
+ public CommonResult deleteCell(@RequestParam("id") Long id) {
+ cellService.deleteCell(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除监室信息")
+ @PreAuthorize("@ss.hasPermission('prison:cell:delete')")
+ public CommonResult deleteCellList(@RequestParam("ids") List ids) {
+ cellService.deleteCellListByIds(ids);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得监室信息")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('prison:cell:query')")
+ public CommonResult getCell(@RequestParam("id") Long id) {
+ CellDO cell = cellService.getCell(id);
+ return success(BeanUtils.toBean(cell, CellRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得监室信息分页")
+ @PreAuthorize("@ss.hasPermission('prison:cell:query')")
+ public CommonResult> getCellPage(@Valid CellPageReqVO pageReqVO) {
+ PageResult pageResult = cellService.getCellPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, CellRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出监室信息 Excel")
+ @PreAuthorize("@ss.hasPermission('prison:cell:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportCellExcel(@Valid CellPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = cellService.getCellPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "监室信息.xls", "数据", CellRespVO.class,
+ BeanUtils.toBean(list, CellRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/cell/vo/CellPageReqVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/cell/vo/CellPageReqVO.java
new file mode 100644
index 0000000000..52a7f19602
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/cell/vo/CellPageReqVO.java
@@ -0,0 +1,44 @@
+package cn.iocoder.yudao.module.prison.controller.admin.cell.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 监室信息分页 Request VO")
+@Data
+public class CellPageReqVO extends PageParam {
+
+ @Schema(description = "所属监区ID", example = "9889")
+ private Long areaId;
+
+ @Schema(description = "监室名称", example = "张三")
+ private String name;
+
+ @Schema(description = "监室编码")
+ private String code;
+
+ @Schema(description = "床位数量")
+ private Integer capacity;
+
+ @Schema(description = "当前人数", example = "31423")
+ private Integer currentCount;
+
+ @Schema(description = "排序")
+ private Integer sort;
+
+ @Schema(description = "状态:1-启用 2-禁用", example = "1")
+ private Integer status;
+
+ @Schema(description = "备注", example = "随便")
+ private String remark;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/cell/vo/CellRespVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/cell/vo/CellRespVO.java
new file mode 100644
index 0000000000..07b5fe9aff
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/cell/vo/CellRespVO.java
@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.prison.controller.admin.cell.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import cn.idev.excel.annotation.*;
+
+@Schema(description = "管理后台 - 监室信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class CellRespVO {
+
+ @Schema(description = "监室ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4727")
+ @ExcelProperty("监室ID")
+ private Long id;
+
+ @Schema(description = "所属监区ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "9889")
+ @ExcelProperty("所属监区ID")
+ private Long areaId;
+
+ @Schema(description = "监室名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
+ @ExcelProperty("监室名称")
+ private String name;
+
+ @Schema(description = "监室编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("监室编码")
+ private String code;
+
+ @Schema(description = "床位数量")
+ @ExcelProperty("床位数量")
+ private Integer capacity;
+
+ @Schema(description = "当前人数", example = "31423")
+ @ExcelProperty("当前人数")
+ private Integer currentCount;
+
+ @Schema(description = "排序")
+ @ExcelProperty("排序")
+ private Integer sort;
+
+ @Schema(description = "状态:1-启用 2-禁用", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @ExcelProperty("状态:1-启用 2-禁用")
+ private Integer status;
+
+ @Schema(description = "备注", example = "随便")
+ @ExcelProperty("备注")
+ private String remark;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/cell/vo/CellSaveReqVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/cell/vo/CellSaveReqVO.java
new file mode 100644
index 0000000000..2d537c1877
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/cell/vo/CellSaveReqVO.java
@@ -0,0 +1,43 @@
+package cn.iocoder.yudao.module.prison.controller.admin.cell.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+
+@Schema(description = "管理后台 - 监室信息新增/修改 Request VO")
+@Data
+public class CellSaveReqVO {
+
+ @Schema(description = "监室ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4727")
+ private Long id;
+
+ @Schema(description = "所属监区ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "9889")
+ @NotNull(message = "所属监区ID不能为空")
+ private Long areaId;
+
+ @Schema(description = "监室名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
+ @NotEmpty(message = "监室名称不能为空")
+ private String name;
+
+ @Schema(description = "监室编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "监室编码不能为空")
+ private String code;
+
+ @Schema(description = "床位数量")
+ private Integer capacity;
+
+ @Schema(description = "当前人数", example = "31423")
+ private Integer currentCount;
+
+ @Schema(description = "排序")
+ private Integer sort;
+
+ @Schema(description = "状态:1-启用 2-禁用", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotNull(message = "状态:1-启用 2-禁用不能为空")
+ private Integer status;
+
+ @Schema(description = "备注", example = "随便")
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/consumption/PrisonConsumptionController.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/consumption/PrisonConsumptionController.java
new file mode 100644
index 0000000000..4682cb1249
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/consumption/PrisonConsumptionController.java
@@ -0,0 +1,104 @@
+package cn.iocoder.yudao.module.prison.controller.admin.consumption;
+
+import org.springframework.web.bind.annotation.*;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import jakarta.validation.constraints.*;
+import jakarta.validation.*;
+import jakarta.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.prison.controller.admin.consumption.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.consumption.ConsumptionDO;
+import cn.iocoder.yudao.module.prison.service.consumption.ConsumptionService;
+
+@Tag(name = "管理后台 - 消费记录")
+@RestController
+@RequestMapping("/prison/consumption")
+@Validated
+public class PrisonConsumptionController {
+
+ @Resource
+ private ConsumptionService consumptionService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建消费记录")
+ @PreAuthorize("@ss.hasPermission('prison:consumption:create')")
+ public CommonResult createConsumption(@Valid @RequestBody ConsumptionSaveReqVO createReqVO) {
+ return success(consumptionService.createConsumption(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新消费记录")
+ @PreAuthorize("@ss.hasPermission('prison:consumption:update')")
+ public CommonResult updateConsumption(@Valid @RequestBody ConsumptionSaveReqVO updateReqVO) {
+ consumptionService.updateConsumption(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除消费记录")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('prison:consumption:delete')")
+ public CommonResult deleteConsumption(@RequestParam("id") Long id) {
+ consumptionService.deleteConsumption(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除消费记录")
+ @PreAuthorize("@ss.hasPermission('prison:consumption:delete')")
+ public CommonResult deleteConsumptionList(@RequestParam("ids") List ids) {
+ consumptionService.deleteConsumptionListByIds(ids);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得消费记录")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('prison:consumption:query')")
+ public CommonResult getConsumption(@RequestParam("id") Long id) {
+ ConsumptionDO consumption = consumptionService.getConsumption(id);
+ return success(BeanUtils.toBean(consumption, ConsumptionRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得消费记录分页")
+ @PreAuthorize("@ss.hasPermission('prison:consumption:query')")
+ public CommonResult> getConsumptionPage(@Valid ConsumptionPageReqVO pageReqVO) {
+ PageResult pageResult = consumptionService.getConsumptionPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, ConsumptionRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出消费记录 Excel")
+ @PreAuthorize("@ss.hasPermission('prison:consumption:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportConsumptionExcel(@Valid ConsumptionPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = consumptionService.getConsumptionPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "消费记录.xls", "数据", ConsumptionRespVO.class,
+ BeanUtils.toBean(list, ConsumptionRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/consumption/vo/ConsumptionPageReqVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/consumption/vo/ConsumptionPageReqVO.java
new file mode 100644
index 0000000000..5968c5d155
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/consumption/vo/ConsumptionPageReqVO.java
@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.prison.controller.admin.consumption.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 消费记录分页 Request VO")
+@Data
+public class ConsumptionPageReqVO extends PageParam {
+
+ @Schema(description = "罪犯ID", example = "25932")
+ private Long prisonerId;
+
+ @Schema(description = "罪犯编号")
+ private String prisonerNo;
+
+ @Schema(description = "类型:1-存款 2-消费 3-转账", example = "1")
+ private Integer type;
+
+ @Schema(description = "金额")
+ private BigDecimal amount;
+
+ @Schema(description = "账户余额")
+ private BigDecimal balance;
+
+ @Schema(description = "商品名称", example = "芋艿")
+ private String goodsName;
+
+ @Schema(description = "商品数量", example = "3906")
+ private Integer goodsCount;
+
+ @Schema(description = "订单号")
+ private String orderNo;
+
+ @Schema(description = "交易时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] tradeTime;
+
+ @Schema(description = "状态:1-成功 2-失败", example = "1")
+ private Integer status;
+
+ @Schema(description = "备注", example = "你说的对")
+ private String remark;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/consumption/vo/ConsumptionRespVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/consumption/vo/ConsumptionRespVO.java
new file mode 100644
index 0000000000..35fa06c6d5
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/consumption/vo/ConsumptionRespVO.java
@@ -0,0 +1,68 @@
+package cn.iocoder.yudao.module.prison.controller.admin.consumption.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import cn.idev.excel.annotation.*;
+
+@Schema(description = "管理后台 - 消费记录 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class ConsumptionRespVO {
+
+ @Schema(description = "记录ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4042")
+ @ExcelProperty("记录ID")
+ private Long id;
+
+ @Schema(description = "罪犯ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "25932")
+ @ExcelProperty("罪犯ID")
+ private Long prisonerId;
+
+ @Schema(description = "罪犯编号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("罪犯编号")
+ private String prisonerNo;
+
+ @Schema(description = "类型:1-存款 2-消费 3-转账", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @ExcelProperty("类型:1-存款 2-消费 3-转账")
+ private Integer type;
+
+ @Schema(description = "金额", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("金额")
+ private BigDecimal amount;
+
+ @Schema(description = "账户余额")
+ @ExcelProperty("账户余额")
+ private BigDecimal balance;
+
+ @Schema(description = "商品名称", example = "芋艿")
+ @ExcelProperty("商品名称")
+ private String goodsName;
+
+ @Schema(description = "商品数量", example = "3906")
+ @ExcelProperty("商品数量")
+ private Integer goodsCount;
+
+ @Schema(description = "订单号")
+ @ExcelProperty("订单号")
+ private String orderNo;
+
+ @Schema(description = "交易时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("交易时间")
+ private LocalDateTime tradeTime;
+
+ @Schema(description = "状态:1-成功 2-失败", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @ExcelProperty("状态:1-成功 2-失败")
+ private Integer status;
+
+ @Schema(description = "备注", example = "你说的对")
+ @ExcelProperty("备注")
+ private String remark;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/consumption/vo/ConsumptionSaveReqVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/consumption/vo/ConsumptionSaveReqVO.java
new file mode 100644
index 0000000000..44b0b30535
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/consumption/vo/ConsumptionSaveReqVO.java
@@ -0,0 +1,57 @@
+package cn.iocoder.yudao.module.prison.controller.admin.consumption.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 消费记录新增/修改 Request VO")
+@Data
+public class ConsumptionSaveReqVO {
+
+ @Schema(description = "记录ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4042")
+ private Long id;
+
+ @Schema(description = "罪犯ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "25932")
+ @NotNull(message = "罪犯ID不能为空")
+ private Long prisonerId;
+
+ @Schema(description = "罪犯编号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "罪犯编号不能为空")
+ private String prisonerNo;
+
+ @Schema(description = "类型:1-存款 2-消费 3-转账", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotNull(message = "类型:1-存款 2-消费 3-转账不能为空")
+ private Integer type;
+
+ @Schema(description = "金额", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "金额不能为空")
+ private BigDecimal amount;
+
+ @Schema(description = "账户余额")
+ private BigDecimal balance;
+
+ @Schema(description = "商品名称", example = "芋艿")
+ private String goodsName;
+
+ @Schema(description = "商品数量", example = "3906")
+ private Integer goodsCount;
+
+ @Schema(description = "订单号")
+ private String orderNo;
+
+ @Schema(description = "交易时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "交易时间不能为空")
+ private LocalDateTime tradeTime;
+
+ @Schema(description = "状态:1-成功 2-失败", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotNull(message = "状态:1-成功 2-失败不能为空")
+ private Integer status;
+
+ @Schema(description = "备注", example = "你说的对")
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/prisoner/PrisonerController.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/prisoner/PrisonerController.java
new file mode 100644
index 0000000000..34ad70838e
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/prisoner/PrisonerController.java
@@ -0,0 +1,109 @@
+package cn.iocoder.yudao.module.prison.controller.admin.prisoner;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.prison.controller.admin.prisoner.vo.*;
+import cn.iocoder.yudao.module.prison.convert.prisoner.PrisonerConvert;
+import cn.iocoder.yudao.module.prison.dal.dataobject.PrisonerDO;
+import cn.iocoder.yudao.module.prison.service.PrisonerService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+/**
+ * 服刑人员信息管理 Controller
+ *
+ * @author xlcp
+ */
+@Tag(name = "管理后台 - 服刑人员信息管理")
+@RestController
+@RequestMapping("/prison/prisoner")
+@Validated
+public class PrisonerController {
+
+ @Resource
+ private PrisonerService prisonerService;
+
+ @PostMapping("/create")
+ @Operation(summary = "新增服刑人员")
+ @PreAuthorize("@ss.hasPermission('prison:prisoner:create')")
+ public CommonResult createPrisoner(@Valid @RequestBody PrisonerSaveReqVO reqVO) {
+ Long id = prisonerService.createPrisoner(reqVO);
+ return success(id);
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "修改服刑人员")
+ @PreAuthorize("@ss.hasPermission('prison:prisoner:update')")
+ public CommonResult updatePrisoner(@Valid @RequestBody PrisonerSaveReqVO reqVO) {
+ prisonerService.updatePrisoner(reqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除服刑人员")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('prison:prisoner:delete')")
+ public CommonResult deletePrisoner(@RequestParam("id") Long id) {
+ prisonerService.deletePrisoner(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Operation(summary = "批量删除服刑人员")
+ @Parameter(name = "ids", description = "编号列表", required = true)
+ @PreAuthorize("@ss.hasPermission('prison:prisoner:delete')")
+ public CommonResult deletePrisonerList(@RequestParam("ids") List ids) {
+ prisonerService.deletePrisonerList(ids);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获取服刑人员详情")
+ @Parameter(name = "id", description = "编号", required = true)
+ public CommonResult getPrisoner(@RequestParam("id") Long id) {
+ PrisonerDO prisoner = prisonerService.getPrisoner(id);
+ return success(PrisonerConvert.INSTANCE.convert(prisoner));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获取服刑人员分页列表")
+ public CommonResult> getPrisonerPage(@Valid PrisonerPageReqVO reqVO) {
+ PageResult pageResult = prisonerService.getPrisonerPage(reqVO);
+ return success(PrisonerConvert.INSTANCE.convertPage(pageResult));
+ }
+
+ @GetMapping("/get-by-no")
+ @Operation(summary = "根据服刑人员编号获取服刑人员")
+ @Parameter(name = "prisonerNo", description = "服刑人员编号", required = true)
+ public CommonResult getPrisonerByNo(@RequestParam("prisonerNo") String prisonerNo) {
+ PrisonerDO prisoner = prisonerService.getPrisonerByNo(prisonerNo);
+ return success(PrisonerConvert.INSTANCE.convert(prisoner));
+ }
+
+ @PostMapping("/export-excel")
+ @Operation(summary = "导出服刑人员 Excel")
+ @ApiAccessLog(operateType = EXPORT)
+ @PreAuthorize("@ss.hasPermission('prison:prisoner:export')")
+ public void exportExcel(HttpServletResponse response, @Valid PrisonerPageReqVO reqVO) throws IOException {
+ PageResult pageResult = prisonerService.getPrisonerPage(reqVO);
+ List excelVOs = PrisonerConvert.INSTANCE.convertExcelList(pageResult.getList());
+ ExcelUtils.write(response, "服刑人员数据.xls", "服刑人员列表", PrisonerExcelVO.class, excelVOs);
+ }
+
+}
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/prisoner/vo/PrisonerExcelVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/prisoner/vo/PrisonerExcelVO.java
new file mode 100644
index 0000000000..8a60f7e6b1
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/prisoner/vo/PrisonerExcelVO.java
@@ -0,0 +1,76 @@
+package cn.iocoder.yudao.module.prison.controller.admin.prisoner.vo;
+
+import cn.idev.excel.annotation.ExcelProperty;
+import cn.idev.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * 服刑人员信息 Excel VO
+ *
+ * @author xlcp
+ */
+@Data
+@HeadRowHeight(30)
+public class PrisonerExcelVO {
+
+ @ExcelProperty("服刑人员编号")
+ private String prisonerNo;
+
+ @ExcelProperty("姓名")
+ private String name;
+
+ @ExcelProperty("性别")
+ private Integer gender;
+
+ @ExcelProperty("出生日期")
+ private LocalDate birthday;
+
+ @ExcelProperty("身份证号")
+ private String idCard;
+
+ @ExcelProperty("民族")
+ private String ethnicity;
+
+ @ExcelProperty("籍贯")
+ private String nativePlace;
+
+ @ExcelProperty("文化程度")
+ private Integer education;
+
+ @ExcelProperty("职业")
+ private String occupation;
+
+ @ExcelProperty("罪名")
+ private String crime;
+
+ @ExcelProperty("刑期(年)")
+ private Integer sentenceYears;
+
+ @ExcelProperty("刑期(月)")
+ private Integer sentenceMonths;
+
+ @ExcelProperty("入狱日期")
+ private LocalDate imprisonmentDate;
+
+ @ExcelProperty("释放日期")
+ private LocalDate releaseDate;
+
+ @ExcelProperty("监管等级")
+ private Integer supervisionLevel;
+
+ @ExcelProperty("风险等级")
+ private Integer riskLevel;
+
+ @ExcelProperty("状态")
+ private Integer status;
+
+ @ExcelProperty("备注")
+ private String remark;
+
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/prisoner/vo/PrisonerPageReqVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/prisoner/vo/PrisonerPageReqVO.java
new file mode 100644
index 0000000000..403bf81c1b
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/prisoner/vo/PrisonerPageReqVO.java
@@ -0,0 +1,58 @@
+package cn.iocoder.yudao.module.prison.controller.admin.prisoner.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDate;
+
+/**
+ * 服刑人员分页查询 Request VO
+ *
+ * @author xlcp
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class PrisonerPageReqVO extends PageParam {
+
+ @Schema(description = "服刑人员编号", example = "ZF2024001")
+ private String prisonerNo;
+
+ @Schema(description = "姓名", example = "张三")
+ private String name;
+
+ @Schema(description = "性别", example = "1")
+ private Integer gender;
+
+ @Schema(description = "身份证号", example = "310101199001011234")
+ private String idCard;
+
+ @Schema(description = "罪名", example = "盗窃罪")
+ private String crime;
+
+ @Schema(description = "监管等级", example = "2")
+ private Integer supervisionLevel;
+
+ @Schema(description = "风险等级", example = "1")
+ private Integer riskLevel;
+
+ @Schema(description = "监区ID", example = "1")
+ private Long prisonAreaId;
+
+ @Schema(description = "监室ID", example = "1")
+ private Long prisonCellId;
+
+ @Schema(description = "状态", example = "1")
+ private Integer status;
+
+ @Schema(description = "入狱日期开始", example = "2024-01-01")
+ @DateTimeFormat(pattern = "yyyy-MM-dd")
+ private LocalDate imprisonmentDateStart;
+
+ @Schema(description = "入狱日期结束", example = "2024-12-31")
+ @DateTimeFormat(pattern = "yyyy-MM-dd")
+ private LocalDate imprisonmentDateEnd;
+
+}
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/prisoner/vo/PrisonerRespVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/prisoner/vo/PrisonerRespVO.java
new file mode 100644
index 0000000000..d877ccda3b
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/prisoner/vo/PrisonerRespVO.java
@@ -0,0 +1,106 @@
+package cn.iocoder.yudao.module.prison.controller.admin.prisoner.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+/**
+ * 服刑人员信息 Response VO
+ *
+ * @author xlcp
+ */
+@Data
+public class PrisonerRespVO {
+
+ @Schema(description = "服刑人员ID", example = "1")
+ private Long id;
+
+ @Schema(description = "服刑人员编号", example = "ZF2024001")
+ private String prisonerNo;
+
+ @Schema(description = "姓名", example = "张三")
+ private String name;
+
+ @Schema(description = "性别", example = "1")
+ private Integer gender;
+
+ @Schema(description = "性别名称", example = "男")
+ private String genderName;
+
+ @Schema(description = "出生日期", example = "1990-01-01")
+ private LocalDate birthday;
+
+ @Schema(description = "身份证号", example = "310101199001011234")
+ private String idCard;
+
+ @Schema(description = "民族", example = "汉族")
+ private String ethnicity;
+
+ @Schema(description = "籍贯", example = "上海")
+ private String nativePlace;
+
+ @Schema(description = "文化程度", example = "3")
+ private Integer education;
+
+ @Schema(description = "文化程度名称", example = "初中")
+ private String educationName;
+
+ @Schema(description = "职业", example = "无业")
+ private String occupation;
+
+ @Schema(description = "家庭住址", example = "上海市浦东新区xxx")
+ private String address;
+
+ @Schema(description = "罪名", example = "盗窃罪")
+ private String crime;
+
+ @Schema(description = "刑期(年)", example = "3")
+ private Integer sentenceYears;
+
+ @Schema(description = "刑期(月)", example = "6")
+ private Integer sentenceMonths;
+
+ @Schema(description = "入狱日期", example = "2024-01-01")
+ private LocalDate imprisonmentDate;
+
+ @Schema(description = "释放日期", example = "2027-07-01")
+ private LocalDate releaseDate;
+
+ @Schema(description = "监管等级", example = "2")
+ private Integer supervisionLevel;
+
+ @Schema(description = "监管等级名称", example = "普管级")
+ private String supervisionLevelName;
+
+ @Schema(description = "风险等级", example = "1")
+ private Integer riskLevel;
+
+ @Schema(description = "风险等级名称", example = "低风险")
+ private String riskLevelName;
+
+ @Schema(description = "监区ID", example = "1")
+ private Long prisonAreaId;
+
+ @Schema(description = "监区名称", example = "一监区")
+ private String prisonAreaName;
+
+ @Schema(description = "监室ID", example = "1")
+ private Long prisonCellId;
+
+ @Schema(description = "监室名称", example = "101监室")
+ private String prisonCellName;
+
+ @Schema(description = "状态", example = "1")
+ private Integer status;
+
+ @Schema(description = "状态名称", example = "在押")
+ private String statusName;
+
+ @Schema(description = "备注", example = "无")
+ private String remark;
+
+ @Schema(description = "创建时间", example = "2024-01-01 10:00:00")
+ private String createTime;
+
+}
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/prisoner/vo/PrisonerSaveReqVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/prisoner/vo/PrisonerSaveReqVO.java
new file mode 100644
index 0000000000..4fc9c924b7
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/prisoner/vo/PrisonerSaveReqVO.java
@@ -0,0 +1,93 @@
+package cn.iocoder.yudao.module.prison.controller.admin.prisoner.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDate;
+
+/**
+ * 服刑人员信息创建/更新 Request VO
+ *
+ * @author xlcp
+ */
+@Data
+public class PrisonerSaveReqVO {
+
+ @Schema(description = "服刑人员ID", example = "1")
+ private Long id;
+
+ @Schema(description = "服刑人员编号", example = "ZF2024001")
+ @NotBlank(message = "服刑人员编号不能为空")
+ private String prisonerNo;
+
+ @Schema(description = "姓名", example = "张三")
+ @NotBlank(message = "姓名不能为空")
+ private String name;
+
+ @Schema(description = "性别", example = "1", required = true)
+ @NotNull(message = "性别不能为空")
+ private Integer gender;
+
+ @Schema(description = "出生日期", example = "1990-01-01")
+ @DateTimeFormat(pattern = "yyyy-MM-dd")
+ private LocalDate birthday;
+
+ @Schema(description = "身份证号", example = "310101199001011234")
+ private String idCard;
+
+ @Schema(description = "民族", example = "汉族")
+ private String ethnicity;
+
+ @Schema(description = "籍贯", example = "上海")
+ private String nativePlace;
+
+ @Schema(description = "文化程度", example = "3")
+ private Integer education;
+
+ @Schema(description = "职业", example = "无业")
+ private String occupation;
+
+ @Schema(description = "家庭住址", example = "上海市浦东新区xxx")
+ private String address;
+
+ @Schema(description = "罪名", example = "盗窃罪", required = true)
+ @NotBlank(message = "罪名不能为空")
+ private String crime;
+
+ @Schema(description = "刑期(年)", example = "3")
+ private Integer sentenceYears;
+
+ @Schema(description = "刑期(月)", example = "6")
+ private Integer sentenceMonths;
+
+ @Schema(description = "入狱日期", example = "2024-01-01", required = true)
+ @NotNull(message = "入狱日期不能为空")
+ @DateTimeFormat(pattern = "yyyy-MM-dd")
+ private LocalDate imprisonmentDate;
+
+ @Schema(description = "释放日期", example = "2027-07-01")
+ @DateTimeFormat(pattern = "yyyy-MM-dd")
+ private LocalDate releaseDate;
+
+ @Schema(description = "监管等级", example = "2")
+ private Integer supervisionLevel;
+
+ @Schema(description = "风险等级", example = "1")
+ private Integer riskLevel;
+
+ @Schema(description = "监区ID", example = "1")
+ private Long prisonAreaId;
+
+ @Schema(description = "监室ID", example = "1")
+ private Long prisonCellId;
+
+ @Schema(description = "状态", example = "1")
+ private Integer status;
+
+ @Schema(description = "备注", example = "无")
+ private String remark;
+
+}
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/question/PrisonQuestionController.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/question/PrisonQuestionController.java
new file mode 100644
index 0000000000..f5ab8d0e2f
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/question/PrisonQuestionController.java
@@ -0,0 +1,122 @@
+package cn.iocoder.yudao.module.prison.controller.admin.question;
+
+import org.springframework.web.bind.annotation.*;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import jakarta.validation.constraints.*;
+import jakarta.validation.*;
+import jakarta.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.prison.controller.admin.question.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.question.QuestionDO;
+import cn.iocoder.yudao.module.prison.service.question.QuestionService;
+
+@Tag(name = "管理后台 - 问卷问题")
+@RestController
+@RequestMapping("/prison/question")
+@Validated
+public class PrisonQuestionController {
+
+ @Resource
+ private QuestionService questionService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建问卷问题")
+ @PreAuthorize("@ss.hasPermission('prison:question:create')")
+ public CommonResult createQuestion(@Valid @RequestBody QuestionSaveReqVO createReqVO) {
+ return success(questionService.createQuestion(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新问卷问题")
+ @PreAuthorize("@ss.hasPermission('prison:question:update')")
+ public CommonResult updateQuestion(@Valid @RequestBody QuestionSaveReqVO updateReqVO) {
+ questionService.updateQuestion(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除问卷问题")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('prison:question:delete')")
+ public CommonResult deleteQuestion(@RequestParam("id") Long id) {
+ questionService.deleteQuestion(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除问卷问题")
+ @PreAuthorize("@ss.hasPermission('prison:question:delete')")
+ public CommonResult deleteQuestionList(@RequestParam("ids") List ids) {
+ questionService.deleteQuestionListByIds(ids);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得问卷问题")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('prison:question:query')")
+ public CommonResult getQuestion(@RequestParam("id") Long id) {
+ QuestionDO question = questionService.getQuestion(id);
+ return success(BeanUtils.toBean(question, QuestionRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得问卷问题分页")
+ @PreAuthorize("@ss.hasPermission('prison:question:query')")
+ public CommonResult> getQuestionPage(@Valid QuestionPageReqVO pageReqVO) {
+ PageResult pageResult = questionService.getQuestionPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, QuestionRespVO.class));
+ }
+
+ @PostMapping("/batch-update")
+ @Operation(summary = "批量更新问卷问题")
+ @PreAuthorize("@ss.hasPermission('prison:question:update')")
+ public CommonResult batchUpdateQuestion(@Valid @RequestBody QuestionBatchUpdateReqVO reqVO) {
+ // 转换为 Service 需要的格式
+ List updateList = new ArrayList<>();
+ for (QuestionBatchUpdateReqVO.QuestionUpdateItem item : reqVO.getQuestions()) {
+ QuestionSaveReqVO saveReqVO = new QuestionSaveReqVO();
+ saveReqVO.setId(item.getId());
+ saveReqVO.setPartName(item.getPartName());
+ saveReqVO.setPartSort(item.getPartSort());
+ saveReqVO.setSort(item.getSort());
+ updateList.add(saveReqVO);
+ }
+ questionService.batchUpdateQuestion(updateList);
+ return success(true);
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出问卷问题 Excel")
+ @PreAuthorize("@ss.hasPermission('prison:question:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportQuestionExcel(@Valid QuestionPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = questionService.getQuestionPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "问卷问题.xls", "数据", QuestionRespVO.class,
+ BeanUtils.toBean(list, QuestionRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/question/vo/QuestionBatchUpdateReqVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/question/vo/QuestionBatchUpdateReqVO.java
new file mode 100644
index 0000000000..94a7e8ca57
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/question/vo/QuestionBatchUpdateReqVO.java
@@ -0,0 +1,35 @@
+package cn.iocoder.yudao.module.prison.controller.admin.question.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+
+@Schema(description = "管理后台 - 问卷问题批量更新 Request VO")
+@Data
+public class QuestionBatchUpdateReqVO {
+
+ @Schema(description = "问题更新列表", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "更新列表不能为空")
+ private List questions;
+
+ @Schema(description = "问题更新项")
+ @Data
+ public static class QuestionUpdateItem {
+
+ @Schema(description = "问题ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+ @NotNull(message = "问题ID不能为空")
+ private Long id;
+
+ @Schema(description = "分区名称")
+ private String partName;
+
+ @Schema(description = "分区排序")
+ private Integer partSort;
+
+ @Schema(description = "问题排序")
+ private Integer sort;
+
+ }
+
+}
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/question/vo/QuestionPageReqVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/question/vo/QuestionPageReqVO.java
new file mode 100644
index 0000000000..ebd1731b80
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/question/vo/QuestionPageReqVO.java
@@ -0,0 +1,42 @@
+package cn.iocoder.yudao.module.prison.controller.admin.question.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 问卷问题分页 Request VO")
+@Data
+public class QuestionPageReqVO extends PageParam {
+
+ @Schema(description = "所属问卷ID", example = "2967")
+ private Long questionnaireId;
+
+ @Schema(description = "问题标题")
+ private String title;
+
+ @Schema(description = "问题类型:1-单选 2-多选 3-填空 4-评分", example = "2")
+ private Integer type;
+
+ @Schema(description = "选项JSON,格式如:[{label:选项1,score:10},...]")
+ private String options;
+
+ @Schema(description = "分值")
+ private BigDecimal score;
+
+ @Schema(description = "排序")
+ private Integer sort;
+
+ @Schema(description = "是否必答")
+ private Boolean isRequired;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/question/vo/QuestionRespVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/question/vo/QuestionRespVO.java
new file mode 100644
index 0000000000..d445f4f611
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/question/vo/QuestionRespVO.java
@@ -0,0 +1,87 @@
+package cn.iocoder.yudao.module.prison.controller.admin.question.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import cn.idev.excel.annotation.*;
+
+@Schema(description = "管理后台 - 问卷问题 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class QuestionRespVO {
+
+ @Schema(description = "问题ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1324")
+ @ExcelProperty("问题ID")
+ private Long id;
+
+ @Schema(description = "所属问卷ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "2967")
+ @ExcelProperty("所属问卷ID")
+ private Long questionnaireId;
+
+ @Schema(description = "问题标题", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("问题标题")
+ private String title;
+
+ @Schema(description = "问题类型:1-单选 2-多选 3-填空 4-评分 5-日期 6-数字", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @ExcelProperty("问题类型")
+ private Integer type;
+
+ @Schema(description = "选项JSON")
+ @ExcelProperty("选项")
+ private String options;
+
+ @Schema(description = "分值")
+ @ExcelProperty("分值")
+ private BigDecimal score;
+
+ @Schema(description = "排序")
+ @ExcelProperty("排序")
+ private Integer sort;
+
+ @Schema(description = "是否必答")
+ @ExcelProperty("是否必答")
+ private Boolean isRequired;
+
+ // ==================== 新增字段 ====================
+
+ @Schema(description = "分区名称")
+ @ExcelProperty("分区名称")
+ private String partName;
+
+ @Schema(description = "分区排序")
+ @ExcelProperty("分区排序")
+ private Integer partSort;
+
+ @Schema(description = "帮助说明文字")
+ @ExcelProperty("帮助说明")
+ private String helpText;
+
+ @Schema(description = "占位提示")
+ private String placeholder;
+
+ @Schema(description = "默认值")
+ private String defaultValue;
+
+ @Schema(description = "自动填充类型:NONE-无 AUTO-自动填充 MANUAL-手动输入")
+ private String autoFillType;
+
+ @Schema(description = "自动填充来源")
+ private String autoFillSource;
+
+ @Schema(description = "显示条件JSON")
+ private String displayCondition;
+
+ @Schema(description = "最小值")
+ private Integer minValue;
+
+ @Schema(description = "最大值")
+ private Integer maxValue;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/question/vo/QuestionSaveReqVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/question/vo/QuestionSaveReqVO.java
new file mode 100644
index 0000000000..39b3c7a775
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/question/vo/QuestionSaveReqVO.java
@@ -0,0 +1,72 @@
+package cn.iocoder.yudao.module.prison.controller.admin.question.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+import java.math.BigDecimal;
+
+@Schema(description = "管理后台 - 问卷问题新增/修改 Request VO")
+@Data
+public class QuestionSaveReqVO {
+
+ @Schema(description = "问题ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1324")
+ private Long id;
+
+ @Schema(description = "所属问卷ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "2967")
+ @NotNull(message = "所属问卷ID不能为空")
+ private Long questionnaireId;
+
+ @Schema(description = "问题标题", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "问题标题不能为空")
+ private String title;
+
+ @Schema(description = "问题类型:1-单选 2-多选 3-填空 4-评分 5-日期 6-数字", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @NotNull(message = "问题类型不能为空")
+ private Integer type;
+
+ @Schema(description = "选项JSON,格式如:[{label:选项1,score:10,isOther:false},...]")
+ private String options;
+
+ @Schema(description = "分值")
+ private BigDecimal score;
+
+ @Schema(description = "排序")
+ private Integer sort;
+
+ @Schema(description = "是否必答")
+ private Boolean isRequired;
+
+ // ==================== 新增字段 ====================
+
+ @Schema(description = "分区名称(Part名称)")
+ private String partName;
+
+ @Schema(description = "分区排序")
+ private Integer partSort;
+
+ @Schema(description = "帮助说明文字")
+ private String helpText;
+
+ @Schema(description = "占位提示")
+ private String placeholder;
+
+ @Schema(description = "默认值")
+ private String defaultValue;
+
+ @Schema(description = "自动填充类型:NONE-无 AUTO-自动填充 MANUAL-手动输入")
+ private String autoFillType;
+
+ @Schema(description = "自动填充来源:dict:字典类型 / field:字段名")
+ private String autoFillSource;
+
+ @Schema(description = "显示条件JSON")
+ private String displayCondition;
+
+ @Schema(description = "最小值(数字/评分题)")
+ private Integer minValue;
+
+ @Schema(description = "最大值(数字/评分题)")
+ private Integer maxValue;
+
+}
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnaire/PrisonQuestionnaireController.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnaire/PrisonQuestionnaireController.java
new file mode 100644
index 0000000000..c6132efd2b
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnaire/PrisonQuestionnaireController.java
@@ -0,0 +1,104 @@
+package cn.iocoder.yudao.module.prison.controller.admin.questionnaire;
+
+import org.springframework.web.bind.annotation.*;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import jakarta.validation.constraints.*;
+import jakarta.validation.*;
+import jakarta.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.prison.controller.admin.questionnaire.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.questionnaire.QuestionnaireDO;
+import cn.iocoder.yudao.module.prison.service.questionnaire.QuestionnaireService;
+
+@Tag(name = "管理后台 - 问卷模板")
+@RestController
+@RequestMapping("/prison/questionnaire")
+@Validated
+public class PrisonQuestionnaireController {
+
+ @Resource
+ private QuestionnaireService questionnaireService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建问卷模板")
+ @PreAuthorize("@ss.hasPermission('prison:questionnaire:create')")
+ public CommonResult createQuestionnaire(@Valid @RequestBody QuestionnaireSaveReqVO createReqVO) {
+ return success(questionnaireService.createQuestionnaire(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新问卷模板")
+ @PreAuthorize("@ss.hasPermission('prison:questionnaire:update')")
+ public CommonResult updateQuestionnaire(@Valid @RequestBody QuestionnaireSaveReqVO updateReqVO) {
+ questionnaireService.updateQuestionnaire(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除问卷模板")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('prison:questionnaire:delete')")
+ public CommonResult deleteQuestionnaire(@RequestParam("id") Long id) {
+ questionnaireService.deleteQuestionnaire(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除问卷模板")
+ @PreAuthorize("@ss.hasPermission('prison:questionnaire:delete')")
+ public CommonResult deleteQuestionnaireList(@RequestParam("ids") List ids) {
+ questionnaireService.deleteQuestionnaireListByIds(ids);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得问卷模板")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('prison:questionnaire:query')")
+ public CommonResult getQuestionnaire(@RequestParam("id") Long id) {
+ QuestionnaireDO questionnaire = questionnaireService.getQuestionnaire(id);
+ return success(BeanUtils.toBean(questionnaire, QuestionnaireRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得问卷模板分页")
+ @PreAuthorize("@ss.hasPermission('prison:questionnaire:query')")
+ public CommonResult> getQuestionnairePage(@Valid QuestionnairePageReqVO pageReqVO) {
+ PageResult pageResult = questionnaireService.getQuestionnairePage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, QuestionnaireRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出问卷模板 Excel")
+ @PreAuthorize("@ss.hasPermission('prison:questionnaire:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportQuestionnaireExcel(@Valid QuestionnairePageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = questionnaireService.getQuestionnairePage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "问卷模板.xls", "数据", QuestionnaireRespVO.class,
+ BeanUtils.toBean(list, QuestionnaireRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnaire/vo/QuestionnairePageReqVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnaire/vo/QuestionnairePageReqVO.java
new file mode 100644
index 0000000000..f93893c0ed
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnaire/vo/QuestionnairePageReqVO.java
@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.prison.controller.admin.questionnaire.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 问卷模板分页 Request VO")
+@Data
+public class QuestionnairePageReqVO extends PageParam {
+
+ @Schema(description = "问卷标题")
+ private String title;
+
+ @Schema(description = "问卷类型:1-心理测评 2-行为评估 3-满意度调查", example = "2")
+ private Integer type;
+
+ @Schema(description = "问卷说明", example = "你猜")
+ private String description;
+
+ @Schema(description = "总分")
+ private BigDecimal totalScore;
+
+ @Schema(description = "及格分")
+ private BigDecimal passScore;
+
+ @Schema(description = "状态:1-草稿 2-已发布 3-已禁用", example = "2")
+ private Integer status;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnaire/vo/QuestionnaireRespVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnaire/vo/QuestionnaireRespVO.java
new file mode 100644
index 0000000000..c9445362dd
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnaire/vo/QuestionnaireRespVO.java
@@ -0,0 +1,48 @@
+package cn.iocoder.yudao.module.prison.controller.admin.questionnaire.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import cn.idev.excel.annotation.*;
+
+@Schema(description = "管理后台 - 问卷模板 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class QuestionnaireRespVO {
+
+ @Schema(description = "问卷ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26045")
+ @ExcelProperty("问卷ID")
+ private Long id;
+
+ @Schema(description = "问卷标题", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("问卷标题")
+ private String title;
+
+ @Schema(description = "问卷类型:1-心理测评 2-行为评估 3-满意度调查", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @ExcelProperty("问卷类型:1-心理测评 2-行为评估 3-满意度调查")
+ private Integer type;
+
+ @Schema(description = "问卷说明", example = "你猜")
+ @ExcelProperty("问卷说明")
+ private String description;
+
+ @Schema(description = "总分")
+ @ExcelProperty("总分")
+ private BigDecimal totalScore;
+
+ @Schema(description = "及格分")
+ @ExcelProperty("及格分")
+ private BigDecimal passScore;
+
+ @Schema(description = "状态:1-草稿 2-已发布 3-已禁用", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @ExcelProperty("状态:1-草稿 2-已发布 3-已禁用")
+ private Integer status;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnaire/vo/QuestionnaireSaveReqVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnaire/vo/QuestionnaireSaveReqVO.java
new file mode 100644
index 0000000000..a8ee0cc013
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnaire/vo/QuestionnaireSaveReqVO.java
@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.prison.controller.admin.questionnaire.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+import java.math.BigDecimal;
+
+@Schema(description = "管理后台 - 问卷模板新增/修改 Request VO")
+@Data
+public class QuestionnaireSaveReqVO {
+
+ @Schema(description = "问卷ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26045")
+ private Long id;
+
+ @Schema(description = "问卷标题", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "问卷标题不能为空")
+ private String title;
+
+ @Schema(description = "问卷类型:1-心理测评 2-行为评估 3-满意度调查", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @NotNull(message = "问卷类型:1-心理测评 2-行为评估 3-满意度调查不能为空")
+ private Integer type;
+
+ @Schema(description = "问卷说明", example = "你猜")
+ private String description;
+
+ @Schema(description = "总分")
+ private BigDecimal totalScore;
+
+ @Schema(description = "及格分")
+ private BigDecimal passScore;
+
+ @Schema(description = "状态:1-草稿 2-已发布 3-已禁用", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @NotNull(message = "状态:1-草稿 2-已发布 3-已禁用不能为空")
+ private Integer status;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnairerecord/PrisonQuestionnaireRecordController.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnairerecord/PrisonQuestionnaireRecordController.java
new file mode 100644
index 0000000000..09fcbcbb83
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnairerecord/PrisonQuestionnaireRecordController.java
@@ -0,0 +1,104 @@
+package cn.iocoder.yudao.module.prison.controller.admin.questionnairerecord;
+
+import org.springframework.web.bind.annotation.*;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import jakarta.validation.constraints.*;
+import jakarta.validation.*;
+import jakarta.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.prison.controller.admin.questionnairerecord.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.questionnairerecord.QuestionnaireRecordDO;
+import cn.iocoder.yudao.module.prison.service.questionnairerecord.QuestionnaireRecordService;
+
+@Tag(name = "管理后台 - 问卷答题记录")
+@RestController
+@RequestMapping("/prison/questionnaire-record")
+@Validated
+public class PrisonQuestionnaireRecordController {
+
+ @Resource
+ private QuestionnaireRecordService questionnaireRecordService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建问卷答题记录")
+ @PreAuthorize("@ss.hasPermission('prison:questionnaire-record:create')")
+ public CommonResult createQuestionnaireRecord(@Valid @RequestBody QuestionnaireRecordSaveReqVO createReqVO) {
+ return success(questionnaireRecordService.createQuestionnaireRecord(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新问卷答题记录")
+ @PreAuthorize("@ss.hasPermission('prison:questionnaire-record:update')")
+ public CommonResult updateQuestionnaireRecord(@Valid @RequestBody QuestionnaireRecordSaveReqVO updateReqVO) {
+ questionnaireRecordService.updateQuestionnaireRecord(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除问卷答题记录")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('prison:questionnaire-record:delete')")
+ public CommonResult deleteQuestionnaireRecord(@RequestParam("id") Long id) {
+ questionnaireRecordService.deleteQuestionnaireRecord(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除问卷答题记录")
+ @PreAuthorize("@ss.hasPermission('prison:questionnaire-record:delete')")
+ public CommonResult deleteQuestionnaireRecordList(@RequestParam("ids") List ids) {
+ questionnaireRecordService.deleteQuestionnaireRecordListByIds(ids);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得问卷答题记录")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('prison:questionnaire-record:query')")
+ public CommonResult getQuestionnaireRecord(@RequestParam("id") Long id) {
+ QuestionnaireRecordDO questionnaireRecord = questionnaireRecordService.getQuestionnaireRecord(id);
+ return success(BeanUtils.toBean(questionnaireRecord, QuestionnaireRecordRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得问卷答题记录分页")
+ @PreAuthorize("@ss.hasPermission('prison:questionnaire-record:query')")
+ public CommonResult> getQuestionnaireRecordPage(@Valid QuestionnaireRecordPageReqVO pageReqVO) {
+ PageResult pageResult = questionnaireRecordService.getQuestionnaireRecordPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, QuestionnaireRecordRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出问卷答题记录 Excel")
+ @PreAuthorize("@ss.hasPermission('prison:questionnaire-record:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportQuestionnaireRecordExcel(@Valid QuestionnaireRecordPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = questionnaireRecordService.getQuestionnaireRecordPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "问卷答题记录.xls", "数据", QuestionnaireRecordRespVO.class,
+ BeanUtils.toBean(list, QuestionnaireRecordRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnairerecord/vo/QuestionnaireRecordPageReqVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnairerecord/vo/QuestionnaireRecordPageReqVO.java
new file mode 100644
index 0000000000..a276486e7d
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnairerecord/vo/QuestionnaireRecordPageReqVO.java
@@ -0,0 +1,43 @@
+package cn.iocoder.yudao.module.prison.controller.admin.questionnairerecord.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 问卷答题记录分页 Request VO")
+@Data
+public class QuestionnaireRecordPageReqVO extends PageParam {
+
+ @Schema(description = "问卷ID", example = "18966")
+ private Long questionnaireId;
+
+ @Schema(description = "罪犯ID", example = "4071")
+ private Long prisonerId;
+
+ @Schema(description = "罪犯编号")
+ private String prisonerNo;
+
+ @Schema(description = "得分")
+ private BigDecimal totalScore;
+
+ @Schema(description = "是否及格:1-及格 2-不及格", example = "2")
+ private Integer passStatus;
+
+ @Schema(description = "答题时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] answerTime;
+
+ @Schema(description = "状态:1-已完成 2-已过期", example = "1")
+ private Integer status;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnairerecord/vo/QuestionnaireRecordRespVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnairerecord/vo/QuestionnaireRecordRespVO.java
new file mode 100644
index 0000000000..08f4f8b80a
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnairerecord/vo/QuestionnaireRecordRespVO.java
@@ -0,0 +1,52 @@
+package cn.iocoder.yudao.module.prison.controller.admin.questionnairerecord.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import cn.idev.excel.annotation.*;
+
+@Schema(description = "管理后台 - 问卷答题记录 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class QuestionnaireRecordRespVO {
+
+ @Schema(description = "记录ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8596")
+ @ExcelProperty("记录ID")
+ private Long id;
+
+ @Schema(description = "问卷ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "18966")
+ @ExcelProperty("问卷ID")
+ private Long questionnaireId;
+
+ @Schema(description = "罪犯ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4071")
+ @ExcelProperty("罪犯ID")
+ private Long prisonerId;
+
+ @Schema(description = "罪犯编号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("罪犯编号")
+ private String prisonerNo;
+
+ @Schema(description = "得分")
+ @ExcelProperty("得分")
+ private BigDecimal totalScore;
+
+ @Schema(description = "是否及格:1-及格 2-不及格", example = "2")
+ @ExcelProperty("是否及格:1-及格 2-不及格")
+ private Integer passStatus;
+
+ @Schema(description = "答题时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("答题时间")
+ private LocalDateTime answerTime;
+
+ @Schema(description = "状态:1-已完成 2-已过期", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @ExcelProperty("状态:1-已完成 2-已过期")
+ private Integer status;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnairerecord/vo/QuestionnaireRecordSaveReqVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnairerecord/vo/QuestionnaireRecordSaveReqVO.java
new file mode 100644
index 0000000000..0cfb7e8362
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/questionnairerecord/vo/QuestionnaireRecordSaveReqVO.java
@@ -0,0 +1,44 @@
+package cn.iocoder.yudao.module.prison.controller.admin.questionnairerecord.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 问卷答题记录新增/修改 Request VO")
+@Data
+public class QuestionnaireRecordSaveReqVO {
+
+ @Schema(description = "记录ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8596")
+ private Long id;
+
+ @Schema(description = "问卷ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "18966")
+ @NotNull(message = "问卷ID不能为空")
+ private Long questionnaireId;
+
+ @Schema(description = "罪犯ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4071")
+ @NotNull(message = "罪犯ID不能为空")
+ private Long prisonerId;
+
+ @Schema(description = "罪犯编号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "罪犯编号不能为空")
+ private String prisonerNo;
+
+ @Schema(description = "得分")
+ private BigDecimal totalScore;
+
+ @Schema(description = "是否及格:1-及格 2-不及格", example = "2")
+ private Integer passStatus;
+
+ @Schema(description = "答题时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "答题时间不能为空")
+ private LocalDateTime answerTime;
+
+ @Schema(description = "状态:1-已完成 2-已过期", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotNull(message = "状态:1-已完成 2-已过期不能为空")
+ private Integer status;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/riskassessment/PrisonRiskAssessmentController.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/riskassessment/PrisonRiskAssessmentController.java
new file mode 100644
index 0000000000..8ec1c77fff
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/riskassessment/PrisonRiskAssessmentController.java
@@ -0,0 +1,104 @@
+package cn.iocoder.yudao.module.prison.controller.admin.riskassessment;
+
+import org.springframework.web.bind.annotation.*;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import jakarta.validation.constraints.*;
+import jakarta.validation.*;
+import jakarta.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.prison.controller.admin.riskassessment.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.riskassessment.RiskAssessmentDO;
+import cn.iocoder.yudao.module.prison.service.riskassessment.RiskAssessmentService;
+
+@Tag(name = "管理后台 - 危险评估")
+@RestController
+@RequestMapping("/prison/risk-assessment")
+@Validated
+public class PrisonRiskAssessmentController {
+
+ @Resource
+ private RiskAssessmentService riskAssessmentService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建危险评估")
+ @PreAuthorize("@ss.hasPermission('prison:risk-assessment:create')")
+ public CommonResult createRiskAssessment(@Valid @RequestBody RiskAssessmentSaveReqVO createReqVO) {
+ return success(riskAssessmentService.createRiskAssessment(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新危险评估")
+ @PreAuthorize("@ss.hasPermission('prison:risk-assessment:update')")
+ public CommonResult updateRiskAssessment(@Valid @RequestBody RiskAssessmentSaveReqVO updateReqVO) {
+ riskAssessmentService.updateRiskAssessment(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除危险评估")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('prison:risk-assessment:delete')")
+ public CommonResult deleteRiskAssessment(@RequestParam("id") Long id) {
+ riskAssessmentService.deleteRiskAssessment(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除危险评估")
+ @PreAuthorize("@ss.hasPermission('prison:risk-assessment:delete')")
+ public CommonResult deleteRiskAssessmentList(@RequestParam("ids") List ids) {
+ riskAssessmentService.deleteRiskAssessmentListByIds(ids);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得危险评估")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('prison:risk-assessment:query')")
+ public CommonResult getRiskAssessment(@RequestParam("id") Long id) {
+ RiskAssessmentDO riskAssessment = riskAssessmentService.getRiskAssessment(id);
+ return success(BeanUtils.toBean(riskAssessment, RiskAssessmentRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得危险评估分页")
+ @PreAuthorize("@ss.hasPermission('prison:risk-assessment:query')")
+ public CommonResult> getRiskAssessmentPage(@Valid RiskAssessmentPageReqVO pageReqVO) {
+ PageResult pageResult = riskAssessmentService.getRiskAssessmentPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, RiskAssessmentRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出危险评估 Excel")
+ @PreAuthorize("@ss.hasPermission('prison:risk-assessment:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportRiskAssessmentExcel(@Valid RiskAssessmentPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = riskAssessmentService.getRiskAssessmentPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "危险评估.xls", "数据", RiskAssessmentRespVO.class,
+ BeanUtils.toBean(list, RiskAssessmentRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/riskassessment/vo/RiskAssessmentPageReqVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/riskassessment/vo/RiskAssessmentPageReqVO.java
new file mode 100644
index 0000000000..3bdd4863fb
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/riskassessment/vo/RiskAssessmentPageReqVO.java
@@ -0,0 +1,72 @@
+package cn.iocoder.yudao.module.prison.controller.admin.riskassessment.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 危险评估分页 Request VO")
+@Data
+public class RiskAssessmentPageReqVO extends PageParam {
+
+ @Schema(description = "罪犯ID", example = "7687")
+ private Long prisonerId;
+
+ @Schema(description = "罪犯编号")
+ private String prisonerNo;
+
+ @Schema(description = "评估类型:1-入狱评估 2-定期评估 3-专项评估", example = "2")
+ private Integer assessmentType;
+
+ @Schema(description = "评估日期")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDate[] assessmentDate;
+
+ @Schema(description = "暴力倾向得分")
+ private BigDecimal violenceScore;
+
+ @Schema(description = "脱逃倾向得分")
+ private BigDecimal escapeScore;
+
+ @Schema(description = "自杀倾向得分")
+ private BigDecimal suicideScore;
+
+ @Schema(description = "综合得分")
+ private BigDecimal totalScore;
+
+ @Schema(description = "风险等级:1-低风险 2-中风险 3-高风险 4-极高风险")
+ private Integer riskLevel;
+
+ @Schema(description = "风险因素")
+ private String riskFactors;
+
+ @Schema(description = "管控建议")
+ private String suggestions;
+
+ @Schema(description = "评估人ID", example = "11993")
+ private Long assessorId;
+
+ @Schema(description = "评估人姓名", example = "赵六")
+ private String assessorName;
+
+ @Schema(description = "下次评估日期")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDate[] nextAssessmentDate;
+
+ @Schema(description = "状态:1-待审核 2-已通过", example = "1")
+ private Integer status;
+
+ @Schema(description = "备注", example = "你猜")
+ private String remark;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/riskassessment/vo/RiskAssessmentRespVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/riskassessment/vo/RiskAssessmentRespVO.java
new file mode 100644
index 0000000000..b929a41182
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/riskassessment/vo/RiskAssessmentRespVO.java
@@ -0,0 +1,89 @@
+package cn.iocoder.yudao.module.prison.controller.admin.riskassessment.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import cn.idev.excel.annotation.*;
+
+@Schema(description = "管理后台 - 危险评估 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class RiskAssessmentRespVO {
+
+ @Schema(description = "评估ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "13958")
+ @ExcelProperty("评估ID")
+ private Long id;
+
+ @Schema(description = "罪犯ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "7687")
+ @ExcelProperty("罪犯ID")
+ private Long prisonerId;
+
+ @Schema(description = "罪犯编号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("罪犯编号")
+ private String prisonerNo;
+
+ @Schema(description = "评估类型:1-入狱评估 2-定期评估 3-专项评估", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @ExcelProperty("评估类型:1-入狱评估 2-定期评估 3-专项评估")
+ private Integer assessmentType;
+
+ @Schema(description = "评估日期", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("评估日期")
+ private LocalDate assessmentDate;
+
+ @Schema(description = "暴力倾向得分")
+ @ExcelProperty("暴力倾向得分")
+ private BigDecimal violenceScore;
+
+ @Schema(description = "脱逃倾向得分")
+ @ExcelProperty("脱逃倾向得分")
+ private BigDecimal escapeScore;
+
+ @Schema(description = "自杀倾向得分")
+ @ExcelProperty("自杀倾向得分")
+ private BigDecimal suicideScore;
+
+ @Schema(description = "综合得分")
+ @ExcelProperty("综合得分")
+ private BigDecimal totalScore;
+
+ @Schema(description = "风险等级:1-低风险 2-中风险 3-高风险 4-极高风险", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("风险等级:1-低风险 2-中风险 3-高风险 4-极高风险")
+ private Integer riskLevel;
+
+ @Schema(description = "风险因素")
+ @ExcelProperty("风险因素")
+ private String riskFactors;
+
+ @Schema(description = "管控建议")
+ @ExcelProperty("管控建议")
+ private String suggestions;
+
+ @Schema(description = "评估人ID", example = "11993")
+ @ExcelProperty("评估人ID")
+ private Long assessorId;
+
+ @Schema(description = "评估人姓名", example = "赵六")
+ @ExcelProperty("评估人姓名")
+ private String assessorName;
+
+ @Schema(description = "下次评估日期")
+ @ExcelProperty("下次评估日期")
+ private LocalDate nextAssessmentDate;
+
+ @Schema(description = "状态:1-待审核 2-已通过", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @ExcelProperty("状态:1-待审核 2-已通过")
+ private Integer status;
+
+ @Schema(description = "备注", example = "你猜")
+ @ExcelProperty("备注")
+ private String remark;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/riskassessment/vo/RiskAssessmentSaveReqVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/riskassessment/vo/RiskAssessmentSaveReqVO.java
new file mode 100644
index 0000000000..b9792d3f9b
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/riskassessment/vo/RiskAssessmentSaveReqVO.java
@@ -0,0 +1,71 @@
+package cn.iocoder.yudao.module.prison.controller.admin.riskassessment.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@Schema(description = "管理后台 - 危险评估新增/修改 Request VO")
+@Data
+public class RiskAssessmentSaveReqVO {
+
+ @Schema(description = "评估ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "13958")
+ private Long id;
+
+ @Schema(description = "罪犯ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "7687")
+ @NotNull(message = "罪犯ID不能为空")
+ private Long prisonerId;
+
+ @Schema(description = "罪犯编号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "罪犯编号不能为空")
+ private String prisonerNo;
+
+ @Schema(description = "评估类型:1-入狱评估 2-定期评估 3-专项评估", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @NotNull(message = "评估类型:1-入狱评估 2-定期评估 3-专项评估不能为空")
+ private Integer assessmentType;
+
+ @Schema(description = "评估日期", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "评估日期不能为空")
+ private LocalDate assessmentDate;
+
+ @Schema(description = "暴力倾向得分")
+ private BigDecimal violenceScore;
+
+ @Schema(description = "脱逃倾向得分")
+ private BigDecimal escapeScore;
+
+ @Schema(description = "自杀倾向得分")
+ private BigDecimal suicideScore;
+
+ @Schema(description = "综合得分")
+ private BigDecimal totalScore;
+
+ @Schema(description = "风险等级:1-低风险 2-中风险 3-高风险 4-极高风险", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "风险等级:1-低风险 2-中风险 3-高风险 4-极高风险不能为空")
+ private Integer riskLevel;
+
+ @Schema(description = "风险因素")
+ private String riskFactors;
+
+ @Schema(description = "管控建议")
+ private String suggestions;
+
+ @Schema(description = "评估人ID", example = "11993")
+ private Long assessorId;
+
+ @Schema(description = "评估人姓名", example = "赵六")
+ private String assessorName;
+
+ @Schema(description = "下次评估日期")
+ private LocalDate nextAssessmentDate;
+
+ @Schema(description = "状态:1-待审核 2-已通过", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotNull(message = "状态:1-待审核 2-已通过不能为空")
+ private Integer status;
+
+ @Schema(description = "备注", example = "你猜")
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/score/PrisonScoreController.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/score/PrisonScoreController.java
new file mode 100644
index 0000000000..ba71bc0466
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/score/PrisonScoreController.java
@@ -0,0 +1,104 @@
+package cn.iocoder.yudao.module.prison.controller.admin.score;
+
+import org.springframework.web.bind.annotation.*;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import jakarta.validation.constraints.*;
+import jakarta.validation.*;
+import jakarta.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.prison.controller.admin.score.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.score.ScoreDO;
+import cn.iocoder.yudao.module.prison.service.score.ScoreService;
+
+@Tag(name = "管理后台 - 计分考核")
+@RestController
+@RequestMapping("/prison/score")
+@Validated
+public class PrisonScoreController {
+
+ @Resource
+ private ScoreService scoreService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建计分考核")
+ @PreAuthorize("@ss.hasPermission('prison:score:create')")
+ public CommonResult createScore(@Valid @RequestBody ScoreSaveReqVO createReqVO) {
+ return success(scoreService.createScore(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新计分考核")
+ @PreAuthorize("@ss.hasPermission('prison:score:update')")
+ public CommonResult updateScore(@Valid @RequestBody ScoreSaveReqVO updateReqVO) {
+ scoreService.updateScore(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除计分考核")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('prison:score:delete')")
+ public CommonResult deleteScore(@RequestParam("id") Long id) {
+ scoreService.deleteScore(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除计分考核")
+ @PreAuthorize("@ss.hasPermission('prison:score:delete')")
+ public CommonResult deleteScoreList(@RequestParam("ids") List ids) {
+ scoreService.deleteScoreListByIds(ids);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得计分考核")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('prison:score:query')")
+ public CommonResult getScore(@RequestParam("id") Long id) {
+ ScoreDO score = scoreService.getScore(id);
+ return success(BeanUtils.toBean(score, ScoreRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得计分考核分页")
+ @PreAuthorize("@ss.hasPermission('prison:score:query')")
+ public CommonResult> getScorePage(@Valid ScorePageReqVO pageReqVO) {
+ PageResult pageResult = scoreService.getScorePage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, ScoreRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出计分考核 Excel")
+ @PreAuthorize("@ss.hasPermission('prison:score:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportScoreExcel(@Valid ScorePageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = scoreService.getScorePage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "计分考核.xls", "数据", ScoreRespVO.class,
+ BeanUtils.toBean(list, ScoreRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/score/vo/ScorePageReqVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/score/vo/ScorePageReqVO.java
new file mode 100644
index 0000000000..43c1603f28
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/score/vo/ScorePageReqVO.java
@@ -0,0 +1,60 @@
+package cn.iocoder.yudao.module.prison.controller.admin.score.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 计分考核分页 Request VO")
+@Data
+public class ScorePageReqVO extends PageParam {
+
+ @Schema(description = "罪犯ID", example = "1070")
+ private Long prisonerId;
+
+ @Schema(description = "罪犯编号")
+ private String prisonerNo;
+
+ @Schema(description = "考核年份")
+ private Integer year;
+
+ @Schema(description = "考核月份")
+ private Integer month;
+
+ @Schema(description = "基础分")
+ private BigDecimal baseScore;
+
+ @Schema(description = "加分")
+ private BigDecimal rewardScore;
+
+ @Schema(description = "扣分")
+ private BigDecimal penaltyScore;
+
+ @Schema(description = "总分")
+ private BigDecimal totalScore;
+
+ @Schema(description = "考核等级:1-优秀 2-良好 3-合格 4-不合格")
+ private Integer level;
+
+ @Schema(description = "考核人ID", example = "14206")
+ private Long assessorId;
+
+ @Schema(description = "考核人姓名", example = "赵六")
+ private String assessorName;
+
+ @Schema(description = "状态:1-待审核 2-已通过 3-已驳回", example = "2")
+ private Integer status;
+
+ @Schema(description = "备注", example = "你说的对")
+ private String remark;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/score/vo/ScoreRespVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/score/vo/ScoreRespVO.java
new file mode 100644
index 0000000000..fb1b9ddee0
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/score/vo/ScoreRespVO.java
@@ -0,0 +1,76 @@
+package cn.iocoder.yudao.module.prison.controller.admin.score.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import cn.idev.excel.annotation.*;
+
+@Schema(description = "管理后台 - 计分考核 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class ScoreRespVO {
+
+ @Schema(description = "记录ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "451")
+ @ExcelProperty("记录ID")
+ private Long id;
+
+ @Schema(description = "罪犯ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1070")
+ @ExcelProperty("罪犯ID")
+ private Long prisonerId;
+
+ @Schema(description = "罪犯编号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("罪犯编号")
+ private String prisonerNo;
+
+ @Schema(description = "考核年份", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("考核年份")
+ private Integer year;
+
+ @Schema(description = "考核月份", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("考核月份")
+ private Integer month;
+
+ @Schema(description = "基础分")
+ @ExcelProperty("基础分")
+ private BigDecimal baseScore;
+
+ @Schema(description = "加分")
+ @ExcelProperty("加分")
+ private BigDecimal rewardScore;
+
+ @Schema(description = "扣分")
+ @ExcelProperty("扣分")
+ private BigDecimal penaltyScore;
+
+ @Schema(description = "总分")
+ @ExcelProperty("总分")
+ private BigDecimal totalScore;
+
+ @Schema(description = "考核等级:1-优秀 2-良好 3-合格 4-不合格")
+ @ExcelProperty("考核等级:1-优秀 2-良好 3-合格 4-不合格")
+ private Integer level;
+
+ @Schema(description = "考核人ID", example = "14206")
+ @ExcelProperty("考核人ID")
+ private Long assessorId;
+
+ @Schema(description = "考核人姓名", example = "赵六")
+ @ExcelProperty("考核人姓名")
+ private String assessorName;
+
+ @Schema(description = "状态:1-待审核 2-已通过 3-已驳回", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @ExcelProperty("状态:1-待审核 2-已通过 3-已驳回")
+ private Integer status;
+
+ @Schema(description = "备注", example = "你说的对")
+ @ExcelProperty("备注")
+ private String remark;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/score/vo/ScoreSaveReqVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/score/vo/ScoreSaveReqVO.java
new file mode 100644
index 0000000000..10242cf900
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/score/vo/ScoreSaveReqVO.java
@@ -0,0 +1,60 @@
+package cn.iocoder.yudao.module.prison.controller.admin.score.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+import java.math.BigDecimal;
+
+@Schema(description = "管理后台 - 计分考核新增/修改 Request VO")
+@Data
+public class ScoreSaveReqVO {
+
+ @Schema(description = "记录ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "451")
+ private Long id;
+
+ @Schema(description = "罪犯ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1070")
+ @NotNull(message = "罪犯ID不能为空")
+ private Long prisonerId;
+
+ @Schema(description = "罪犯编号", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "罪犯编号不能为空")
+ private String prisonerNo;
+
+ @Schema(description = "考核年份", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "考核年份不能为空")
+ private Integer year;
+
+ @Schema(description = "考核月份", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "考核月份不能为空")
+ private Integer month;
+
+ @Schema(description = "基础分")
+ private BigDecimal baseScore;
+
+ @Schema(description = "加分")
+ private BigDecimal rewardScore;
+
+ @Schema(description = "扣分")
+ private BigDecimal penaltyScore;
+
+ @Schema(description = "总分")
+ private BigDecimal totalScore;
+
+ @Schema(description = "考核等级:1-优秀 2-良好 3-合格 4-不合格")
+ private Integer level;
+
+ @Schema(description = "考核人ID", example = "14206")
+ private Long assessorId;
+
+ @Schema(description = "考核人姓名", example = "赵六")
+ private String assessorName;
+
+ @Schema(description = "状态:1-待审核 2-已通过 3-已驳回", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+ @NotNull(message = "状态:1-待审核 2-已通过 3-已驳回不能为空")
+ private Integer status;
+
+ @Schema(description = "备注", example = "你说的对")
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/convert/prisoner/PrisonerConvert.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/convert/prisoner/PrisonerConvert.java
new file mode 100644
index 0000000000..3283f87166
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/convert/prisoner/PrisonerConvert.java
@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.prison.convert.prisoner;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.prison.controller.admin.prisoner.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.PrisonerDO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * 服刑人员信息 Convert
+ *
+ * @author xlcp
+ */
+@Mapper
+public interface PrisonerConvert {
+
+ PrisonerConvert INSTANCE = Mappers.getMapper(PrisonerConvert.class);
+
+ PrisonerDO convert(PrisonerSaveReqVO bean);
+
+ PrisonerRespVO convert(PrisonerDO bean);
+
+ List convertList(List list);
+
+ PageResult convertPage(PageResult page);
+
+ List convertExcelList(List list);
+
+}
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/PrisonerDO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/PrisonerDO.java
new file mode 100644
index 0000000000..a174237a60
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/PrisonerDO.java
@@ -0,0 +1,135 @@
+package cn.iocoder.yudao.module.prison.dal.dataobject;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.prison.enums.*;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.time.LocalDate;
+
+/**
+ * 服刑人员信息 DO
+ *
+ * @author xlcp
+ */
+@TableName("prison_prisoner")
+@KeySequence("prison_prisoner_seq")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PrisonerDO extends BaseDO {
+
+ /**
+ * 主键ID
+ */
+ private Long id;
+
+ /**
+ * 服刑人员编号
+ */
+ private String prisonerNo;
+
+ /**
+ * 姓名
+ */
+ private String name;
+
+ /**
+ * 性别
+ */
+ private GenderEnum gender;
+
+ /**
+ * 出生日期
+ */
+ private LocalDate birthday;
+
+ /**
+ * 身份证号
+ */
+ private String idCard;
+
+ /**
+ * 民族
+ */
+ private String ethnicity;
+
+ /**
+ * 籍贯
+ */
+ private String nativePlace;
+
+ /**
+ * 文化程度
+ */
+ private EducationEnum education;
+
+ /**
+ * 职业
+ */
+ private String occupation;
+
+ /**
+ * 家庭住址
+ */
+ private String address;
+
+ /**
+ * 罪名
+ */
+ private String crime;
+
+ /**
+ * 刑期(年)
+ */
+ private Integer sentenceYears;
+
+ /**
+ * 刑期(月)
+ */
+ private Integer sentenceMonths;
+
+ /**
+ * 入狱日期
+ */
+ private LocalDate imprisonmentDate;
+
+ /**
+ * 释放日期
+ */
+ private LocalDate releaseDate;
+
+ /**
+ * 当前监管等级
+ */
+ private SupervisionLevelEnum supervisionLevel;
+
+ /**
+ * 当前风险等级
+ */
+ private RiskLevelEnum riskLevel;
+
+ /**
+ * 当前监区ID
+ */
+ private Long prisonAreaId;
+
+ /**
+ * 当前监室ID
+ */
+ private Long prisonCellId;
+
+ /**
+ * 状态
+ */
+ private PrisonerStatusEnum status;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/area/AreaDO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/area/AreaDO.java
new file mode 100644
index 0000000000..509ec76bfc
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/area/AreaDO.java
@@ -0,0 +1,64 @@
+package cn.iocoder.yudao.module.prison.dal.dataobject.area;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 监区信息 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("prison_area")
+@KeySequence("prison_area_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AreaDO extends BaseDO {
+
+ /**
+ * 监区ID
+ */
+ @TableId
+ private Long id;
+ /**
+ * 监区名称
+ */
+ private String name;
+ /**
+ * 监区编码
+ */
+ private String code;
+ /**
+ * 监区类型:1-普通监区 2-严管监区 3-医院 4-禁闭室
+ */
+ private Integer type;
+ /**
+ * 容纳人数
+ */
+ private Integer capacity;
+ /**
+ * 当前人数
+ */
+ private Integer currentCount;
+ /**
+ * 排序
+ */
+ private Integer sort;
+ /**
+ * 状态:1-启用 2-禁用
+ */
+ private Integer status;
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/cell/CellDO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/cell/CellDO.java
new file mode 100644
index 0000000000..03347a97e2
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/cell/CellDO.java
@@ -0,0 +1,64 @@
+package cn.iocoder.yudao.module.prison.dal.dataobject.cell;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 监室信息 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("prison_cell")
+@KeySequence("prison_cell_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CellDO extends BaseDO {
+
+ /**
+ * 监室ID
+ */
+ @TableId
+ private Long id;
+ /**
+ * 所属监区ID
+ */
+ private Long areaId;
+ /**
+ * 监室名称
+ */
+ private String name;
+ /**
+ * 监室编码
+ */
+ private String code;
+ /**
+ * 床位数量
+ */
+ private Integer capacity;
+ /**
+ * 当前人数
+ */
+ private Integer currentCount;
+ /**
+ * 排序
+ */
+ private Integer sort;
+ /**
+ * 状态:1-启用 2-禁用
+ */
+ private Integer status;
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/consumption/ConsumptionDO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/consumption/ConsumptionDO.java
new file mode 100644
index 0000000000..35289fc4a5
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/consumption/ConsumptionDO.java
@@ -0,0 +1,79 @@
+package cn.iocoder.yudao.module.prison.dal.dataobject.consumption;
+
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 消费记录 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("prison_consumption")
+@KeySequence("prison_consumption_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ConsumptionDO extends BaseDO {
+
+ /**
+ * 记录ID
+ */
+ @TableId
+ private Long id;
+ /**
+ * 罪犯ID
+ */
+ private Long prisonerId;
+ /**
+ * 罪犯编号
+ */
+ private String prisonerNo;
+ /**
+ * 类型:1-存款 2-消费 3-转账
+ */
+ private Integer type;
+ /**
+ * 金额
+ */
+ private BigDecimal amount;
+ /**
+ * 账户余额
+ */
+ private BigDecimal balance;
+ /**
+ * 商品名称
+ */
+ private String goodsName;
+ /**
+ * 商品数量
+ */
+ private Integer goodsCount;
+ /**
+ * 订单号
+ */
+ private String orderNo;
+ /**
+ * 交易时间
+ */
+ private LocalDateTime tradeTime;
+ /**
+ * 状态:1-成功 2-失败
+ */
+ private Integer status;
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/question/QuestionDO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/question/QuestionDO.java
new file mode 100644
index 0000000000..768e13696a
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/question/QuestionDO.java
@@ -0,0 +1,107 @@
+package cn.iocoder.yudao.module.prison.dal.dataobject.question;
+
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 问卷问题 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("prison_question")
+@KeySequence("prison_question_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class QuestionDO extends BaseDO {
+
+ /**
+ * 问题ID
+ */
+ @TableId
+ private Long id;
+ /**
+ * 所属问卷ID
+ */
+ private Long questionnaireId;
+ /**
+ * 问题标题
+ */
+ private String title;
+ /**
+ * 问题类型:1-单选 2-多选 3-填空 4-评分 5-日期 6-数字
+ */
+ private Integer type;
+ /**
+ * 选项JSON:[{label:"选项1",score:10,isOther:false},...]
+ * 日期格式:{min:"起始日期",max:"结束日期"}
+ * 数字格式:{min:0,max:100}
+ */
+ private String options;
+ /**
+ * 分值
+ */
+ private BigDecimal score;
+ /**
+ * 排序
+ */
+ private Integer sort;
+ /**
+ * 是否必答
+ */
+ private Boolean isRequired;
+
+ // ==================== 新增字段 ====================
+
+ /**
+ * 分区名称(Part名称),用于将问题分组
+ */
+ private String partName;
+ /**
+ * 分区排序(同一问卷内的分区序号)
+ */
+ private Integer partSort;
+ /**
+ * 帮助说明文字
+ */
+ private String helpText;
+ /**
+ * 占位提示(填空题/数字题显示)
+ */
+ private String placeholder;
+ /**
+ * 默认值
+ */
+ private String defaultValue;
+ /**
+ * 自动填充类型:NONE-无 AUTO-系统自动填充 MANUAL-手动输入
+ */
+ private String autoFillType;
+ /**
+ * 自动填充来源:dict:字典类型 / field:字段名
+ * 示例:dict:system_user_sex 或 field:prisonerName
+ */
+ private String autoFillSource;
+ /**
+ * 显示条件JSON:{"field":"字段名","operator":">=","value":"值"}
+ * 示例:{"field":"riskLevel","operator":">=","value":"3"}
+ */
+ private String displayCondition;
+ /**
+ * 最小值(数字/评分题)
+ */
+ private Integer minValue;
+ /**
+ * 最大值(数字/评分题)
+ */
+ private Integer maxValue;
+
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/questionnaire/QuestionnaireDO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/questionnaire/QuestionnaireDO.java
new file mode 100644
index 0000000000..85c378d933
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/questionnaire/QuestionnaireDO.java
@@ -0,0 +1,79 @@
+package cn.iocoder.yudao.module.prison.dal.dataobject.questionnaire;
+
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 问卷模板 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("prison_questionnaire")
+@KeySequence("prison_questionnaire_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class QuestionnaireDO extends BaseDO {
+
+ /**
+ * 问卷ID
+ */
+ @TableId
+ private Long id;
+ /**
+ * 问卷标题
+ */
+ private String title;
+ /**
+ * 问卷类型:1-心理测评 2-行为评估 3-满意度调查
+ */
+ private Integer type;
+ /**
+ * 问卷说明
+ */
+ private String description;
+ /**
+ * 总分
+ */
+ private BigDecimal totalScore;
+ /**
+ * 及格分
+ */
+ private BigDecimal passScore;
+ /**
+ * 状态:1-草稿 2-已发布 3-已禁用
+ */
+ private Integer status;
+
+ // ==================== 新增字段 ====================
+
+ /**
+ * 封面图片URL
+ */
+ private String coverImage;
+ /**
+ * 填写说明
+ */
+ private String instruction;
+ /**
+ * 预计耗时(分钟)
+ */
+ private Integer estimatedTime;
+ /**
+ * 分区数量
+ */
+ private Integer partCount;
+ /**
+ * 是否允许匿名:false-不允许 true-允许
+ */
+ private Boolean allowAnonymous;
+
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/questionnairerecord/QuestionnaireRecordDO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/questionnairerecord/QuestionnaireRecordDO.java
new file mode 100644
index 0000000000..fb3ca80326
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/questionnairerecord/QuestionnaireRecordDO.java
@@ -0,0 +1,62 @@
+package cn.iocoder.yudao.module.prison.dal.dataobject.questionnairerecord;
+
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 问卷答题记录 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("prison_questionnaire_record")
+@KeySequence("prison_questionnaire_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class QuestionnaireRecordDO extends BaseDO {
+
+ /**
+ * 记录ID
+ */
+ @TableId
+ private Long id;
+ /**
+ * 问卷ID
+ */
+ private Long questionnaireId;
+ /**
+ * 罪犯ID
+ */
+ private Long prisonerId;
+ /**
+ * 罪犯编号
+ */
+ private String prisonerNo;
+ /**
+ * 得分
+ */
+ private BigDecimal totalScore;
+ /**
+ * 是否及格:1-及格 2-不及格
+ */
+ private Integer passStatus;
+ /**
+ * 答题时间
+ */
+ private LocalDateTime answerTime;
+ /**
+ * 状态:1-已完成 2-已过期
+ */
+ private Integer status;
+
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/riskassessment/RiskAssessmentDO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/riskassessment/RiskAssessmentDO.java
new file mode 100644
index 0000000000..5b4e683751
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/riskassessment/RiskAssessmentDO.java
@@ -0,0 +1,97 @@
+package cn.iocoder.yudao.module.prison.dal.dataobject.riskassessment;
+
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 危险评估 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("prison_risk_assessment")
+@KeySequence("prison_risk_assessment_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class RiskAssessmentDO extends BaseDO {
+
+ /**
+ * 评估ID
+ */
+ @TableId
+ private Long id;
+ /**
+ * 罪犯ID
+ */
+ private Long prisonerId;
+ /**
+ * 罪犯编号
+ */
+ private String prisonerNo;
+ /**
+ * 评估类型:1-入狱评估 2-定期评估 3-专项评估
+ */
+ private Integer assessmentType;
+ /**
+ * 评估日期
+ */
+ private LocalDate assessmentDate;
+ /**
+ * 暴力倾向得分
+ */
+ private BigDecimal violenceScore;
+ /**
+ * 脱逃倾向得分
+ */
+ private BigDecimal escapeScore;
+ /**
+ * 自杀倾向得分
+ */
+ private BigDecimal suicideScore;
+ /**
+ * 综合得分
+ */
+ private BigDecimal totalScore;
+ /**
+ * 风险等级:1-低风险 2-中风险 3-高风险 4-极高风险
+ */
+ private Integer riskLevel;
+ /**
+ * 风险因素
+ */
+ private String riskFactors;
+ /**
+ * 管控建议
+ */
+ private String suggestions;
+ /**
+ * 评估人ID
+ */
+ private Long assessorId;
+ /**
+ * 评估人姓名
+ */
+ private String assessorName;
+ /**
+ * 下次评估日期
+ */
+ private LocalDate nextAssessmentDate;
+ /**
+ * 状态:1-待审核 2-已通过
+ */
+ private Integer status;
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/score/ScoreDO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/score/ScoreDO.java
new file mode 100644
index 0000000000..400594477e
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/dataobject/score/ScoreDO.java
@@ -0,0 +1,88 @@
+package cn.iocoder.yudao.module.prison.dal.dataobject.score;
+
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import java.math.BigDecimal;
+import java.math.BigDecimal;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 计分考核 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("prison_score")
+@KeySequence("prison_score_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ScoreDO extends BaseDO {
+
+ /**
+ * 记录ID
+ */
+ @TableId
+ private Long id;
+ /**
+ * 罪犯ID
+ */
+ private Long prisonerId;
+ /**
+ * 罪犯编号
+ */
+ private String prisonerNo;
+ /**
+ * 考核年份
+ */
+ private Integer year;
+ /**
+ * 考核月份
+ */
+ private Integer month;
+ /**
+ * 基础分
+ */
+ private BigDecimal baseScore;
+ /**
+ * 加分
+ */
+ private BigDecimal rewardScore;
+ /**
+ * 扣分
+ */
+ private BigDecimal penaltyScore;
+ /**
+ * 总分
+ */
+ private BigDecimal totalScore;
+ /**
+ * 考核等级:1-优秀 2-良好 3-合格 4-不合格
+ */
+ private Integer level;
+ /**
+ * 考核人ID
+ */
+ private Long assessorId;
+ /**
+ * 考核人姓名
+ */
+ private String assessorName;
+ /**
+ * 状态:1-待审核 2-已通过 3-已驳回
+ */
+ private Integer status;
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/PrisonerMapper.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/PrisonerMapper.java
new file mode 100644
index 0000000000..17b1cca3a5
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/PrisonerMapper.java
@@ -0,0 +1,15 @@
+package cn.iocoder.yudao.module.prison.dal.mysql;
+
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.prison.dal.dataobject.PrisonerDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 服刑人员信息 Mapper
+ *
+ * @author xlcp
+ */
+@Mapper
+public interface PrisonerMapper extends BaseMapperX {
+
+}
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/area/AreaMapper.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/area/AreaMapper.java
new file mode 100644
index 0000000000..d1f9033029
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/area/AreaMapper.java
@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.prison.dal.mysql.area;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.prison.dal.dataobject.area.AreaDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.prison.controller.admin.area.vo.*;
+
+/**
+ * 监区信息 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface AreaMapper extends BaseMapperX {
+
+ default PageResult selectPage(AreaPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .likeIfPresent(AreaDO::getName, reqVO.getName())
+ .eqIfPresent(AreaDO::getCode, reqVO.getCode())
+ .eqIfPresent(AreaDO::getType, reqVO.getType())
+ .eqIfPresent(AreaDO::getCapacity, reqVO.getCapacity())
+ .eqIfPresent(AreaDO::getCurrentCount, reqVO.getCurrentCount())
+ .eqIfPresent(AreaDO::getSort, reqVO.getSort())
+ .eqIfPresent(AreaDO::getStatus, reqVO.getStatus())
+ .eqIfPresent(AreaDO::getRemark, reqVO.getRemark())
+ .betweenIfPresent(AreaDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(AreaDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/cell/CellMapper.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/cell/CellMapper.java
new file mode 100644
index 0000000000..12a261d3be
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/cell/CellMapper.java
@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.prison.dal.mysql.cell;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.prison.dal.dataobject.cell.CellDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.prison.controller.admin.cell.vo.*;
+
+/**
+ * 监室信息 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface CellMapper extends BaseMapperX {
+
+ default PageResult selectPage(CellPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(CellDO::getAreaId, reqVO.getAreaId())
+ .likeIfPresent(CellDO::getName, reqVO.getName())
+ .eqIfPresent(CellDO::getCode, reqVO.getCode())
+ .eqIfPresent(CellDO::getCapacity, reqVO.getCapacity())
+ .eqIfPresent(CellDO::getCurrentCount, reqVO.getCurrentCount())
+ .eqIfPresent(CellDO::getSort, reqVO.getSort())
+ .eqIfPresent(CellDO::getStatus, reqVO.getStatus())
+ .eqIfPresent(CellDO::getRemark, reqVO.getRemark())
+ .betweenIfPresent(CellDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(CellDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/consumption/ConsumptionMapper.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/consumption/ConsumptionMapper.java
new file mode 100644
index 0000000000..3c6276b960
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/consumption/ConsumptionMapper.java
@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.prison.dal.mysql.consumption;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.prison.dal.dataobject.consumption.ConsumptionDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.prison.controller.admin.consumption.vo.*;
+
+/**
+ * 消费记录 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface ConsumptionMapper extends BaseMapperX {
+
+ default PageResult selectPage(ConsumptionPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(ConsumptionDO::getPrisonerId, reqVO.getPrisonerId())
+ .eqIfPresent(ConsumptionDO::getPrisonerNo, reqVO.getPrisonerNo())
+ .eqIfPresent(ConsumptionDO::getType, reqVO.getType())
+ .eqIfPresent(ConsumptionDO::getAmount, reqVO.getAmount())
+ .eqIfPresent(ConsumptionDO::getBalance, reqVO.getBalance())
+ .likeIfPresent(ConsumptionDO::getGoodsName, reqVO.getGoodsName())
+ .eqIfPresent(ConsumptionDO::getGoodsCount, reqVO.getGoodsCount())
+ .eqIfPresent(ConsumptionDO::getOrderNo, reqVO.getOrderNo())
+ .betweenIfPresent(ConsumptionDO::getTradeTime, reqVO.getTradeTime())
+ .eqIfPresent(ConsumptionDO::getStatus, reqVO.getStatus())
+ .eqIfPresent(ConsumptionDO::getRemark, reqVO.getRemark())
+ .betweenIfPresent(ConsumptionDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(ConsumptionDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/question/QuestionMapper.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/question/QuestionMapper.java
new file mode 100644
index 0000000000..fa9ade537c
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/question/QuestionMapper.java
@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.module.prison.dal.mysql.question;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.prison.dal.dataobject.question.QuestionDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.prison.controller.admin.question.vo.*;
+
+/**
+ * 问卷问题 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface QuestionMapper extends BaseMapperX {
+
+ default PageResult selectPage(QuestionPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(QuestionDO::getQuestionnaireId, reqVO.getQuestionnaireId())
+ .eqIfPresent(QuestionDO::getTitle, reqVO.getTitle())
+ .eqIfPresent(QuestionDO::getType, reqVO.getType())
+ .eqIfPresent(QuestionDO::getOptions, reqVO.getOptions())
+ .eqIfPresent(QuestionDO::getScore, reqVO.getScore())
+ .eqIfPresent(QuestionDO::getSort, reqVO.getSort())
+ .eqIfPresent(QuestionDO::getIsRequired, reqVO.getIsRequired())
+ .betweenIfPresent(QuestionDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(QuestionDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/questionnaire/QuestionnaireMapper.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/questionnaire/QuestionnaireMapper.java
new file mode 100644
index 0000000000..f74d55f019
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/questionnaire/QuestionnaireMapper.java
@@ -0,0 +1,32 @@
+package cn.iocoder.yudao.module.prison.dal.mysql.questionnaire;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.prison.dal.dataobject.questionnaire.QuestionnaireDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.prison.controller.admin.questionnaire.vo.*;
+
+/**
+ * 问卷模板 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface QuestionnaireMapper extends BaseMapperX {
+
+ default PageResult selectPage(QuestionnairePageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(QuestionnaireDO::getTitle, reqVO.getTitle())
+ .eqIfPresent(QuestionnaireDO::getType, reqVO.getType())
+ .eqIfPresent(QuestionnaireDO::getDescription, reqVO.getDescription())
+ .eqIfPresent(QuestionnaireDO::getTotalScore, reqVO.getTotalScore())
+ .eqIfPresent(QuestionnaireDO::getPassScore, reqVO.getPassScore())
+ .eqIfPresent(QuestionnaireDO::getStatus, reqVO.getStatus())
+ .betweenIfPresent(QuestionnaireDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(QuestionnaireDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/questionnairerecord/QuestionnaireRecordMapper.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/questionnairerecord/QuestionnaireRecordMapper.java
new file mode 100644
index 0000000000..808c55ad6a
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/questionnairerecord/QuestionnaireRecordMapper.java
@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.module.prison.dal.mysql.questionnairerecord;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.prison.dal.dataobject.questionnairerecord.QuestionnaireRecordDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.prison.controller.admin.questionnairerecord.vo.*;
+
+/**
+ * 问卷答题记录 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface QuestionnaireRecordMapper extends BaseMapperX {
+
+ default PageResult selectPage(QuestionnaireRecordPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(QuestionnaireRecordDO::getQuestionnaireId, reqVO.getQuestionnaireId())
+ .eqIfPresent(QuestionnaireRecordDO::getPrisonerId, reqVO.getPrisonerId())
+ .eqIfPresent(QuestionnaireRecordDO::getPrisonerNo, reqVO.getPrisonerNo())
+ .eqIfPresent(QuestionnaireRecordDO::getTotalScore, reqVO.getTotalScore())
+ .eqIfPresent(QuestionnaireRecordDO::getPassStatus, reqVO.getPassStatus())
+ .betweenIfPresent(QuestionnaireRecordDO::getAnswerTime, reqVO.getAnswerTime())
+ .eqIfPresent(QuestionnaireRecordDO::getStatus, reqVO.getStatus())
+ .betweenIfPresent(QuestionnaireRecordDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(QuestionnaireRecordDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/riskassessment/RiskAssessmentMapper.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/riskassessment/RiskAssessmentMapper.java
new file mode 100644
index 0000000000..61c50d25e5
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/riskassessment/RiskAssessmentMapper.java
@@ -0,0 +1,42 @@
+package cn.iocoder.yudao.module.prison.dal.mysql.riskassessment;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.prison.dal.dataobject.riskassessment.RiskAssessmentDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.prison.controller.admin.riskassessment.vo.*;
+
+/**
+ * 危险评估 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface RiskAssessmentMapper extends BaseMapperX {
+
+ default PageResult selectPage(RiskAssessmentPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(RiskAssessmentDO::getPrisonerId, reqVO.getPrisonerId())
+ .eqIfPresent(RiskAssessmentDO::getPrisonerNo, reqVO.getPrisonerNo())
+ .eqIfPresent(RiskAssessmentDO::getAssessmentType, reqVO.getAssessmentType())
+ .betweenIfPresent(RiskAssessmentDO::getAssessmentDate, reqVO.getAssessmentDate())
+ .eqIfPresent(RiskAssessmentDO::getViolenceScore, reqVO.getViolenceScore())
+ .eqIfPresent(RiskAssessmentDO::getEscapeScore, reqVO.getEscapeScore())
+ .eqIfPresent(RiskAssessmentDO::getSuicideScore, reqVO.getSuicideScore())
+ .eqIfPresent(RiskAssessmentDO::getTotalScore, reqVO.getTotalScore())
+ .eqIfPresent(RiskAssessmentDO::getRiskLevel, reqVO.getRiskLevel())
+ .eqIfPresent(RiskAssessmentDO::getRiskFactors, reqVO.getRiskFactors())
+ .eqIfPresent(RiskAssessmentDO::getSuggestions, reqVO.getSuggestions())
+ .eqIfPresent(RiskAssessmentDO::getAssessorId, reqVO.getAssessorId())
+ .likeIfPresent(RiskAssessmentDO::getAssessorName, reqVO.getAssessorName())
+ .betweenIfPresent(RiskAssessmentDO::getNextAssessmentDate, reqVO.getNextAssessmentDate())
+ .eqIfPresent(RiskAssessmentDO::getStatus, reqVO.getStatus())
+ .eqIfPresent(RiskAssessmentDO::getRemark, reqVO.getRemark())
+ .betweenIfPresent(RiskAssessmentDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(RiskAssessmentDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/score/ScoreMapper.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/score/ScoreMapper.java
new file mode 100644
index 0000000000..1c4434dd62
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/dal/mysql/score/ScoreMapper.java
@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.prison.dal.mysql.score;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.prison.dal.dataobject.score.ScoreDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.prison.controller.admin.score.vo.*;
+
+/**
+ * 计分考核 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface ScoreMapper extends BaseMapperX {
+
+ default PageResult selectPage(ScorePageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(ScoreDO::getPrisonerId, reqVO.getPrisonerId())
+ .eqIfPresent(ScoreDO::getPrisonerNo, reqVO.getPrisonerNo())
+ .eqIfPresent(ScoreDO::getYear, reqVO.getYear())
+ .eqIfPresent(ScoreDO::getMonth, reqVO.getMonth())
+ .eqIfPresent(ScoreDO::getBaseScore, reqVO.getBaseScore())
+ .eqIfPresent(ScoreDO::getRewardScore, reqVO.getRewardScore())
+ .eqIfPresent(ScoreDO::getPenaltyScore, reqVO.getPenaltyScore())
+ .eqIfPresent(ScoreDO::getTotalScore, reqVO.getTotalScore())
+ .eqIfPresent(ScoreDO::getLevel, reqVO.getLevel())
+ .eqIfPresent(ScoreDO::getAssessorId, reqVO.getAssessorId())
+ .likeIfPresent(ScoreDO::getAssessorName, reqVO.getAssessorName())
+ .eqIfPresent(ScoreDO::getStatus, reqVO.getStatus())
+ .eqIfPresent(ScoreDO::getRemark, reqVO.getRemark())
+ .betweenIfPresent(ScoreDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(ScoreDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/DictTypeConstants.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/DictTypeConstants.java
new file mode 100644
index 0000000000..3a55c38494
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/DictTypeConstants.java
@@ -0,0 +1,15 @@
+package cn.iocoder.yudao.module.prison.enums;
+
+/**
+ * 监狱管理 字典类型的枚举类
+ *
+ * @author xlcp
+ */
+public interface DictTypeConstants {
+
+ String PRISON_SUPERVISION_LEVEL = "prison_supervision_level"; // 监管等级
+ String PRISON_RISK_LEVEL = "prison_risk_level"; // 风险等级
+ String PRISONER_STATUS = "prisoner_status"; // 服刑人员状态
+ String PRISON_EDUCATION = "prison_education"; // 文化程度
+
+}
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/EducationEnum.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/EducationEnum.java
new file mode 100644
index 0000000000..aa3265b65b
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/EducationEnum.java
@@ -0,0 +1,28 @@
+package cn.iocoder.yudao.module.prison.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 文化程度枚举
+ *
+ * @author xlcp
+ */
+@Getter
+@AllArgsConstructor
+public enum EducationEnum {
+
+ ILLITERATE(1, "文盲"),
+ PRIMARY_SCHOOL(2, "小学"),
+ MIDDLE_SCHOOL(3, "初中"),
+ HIGH_SCHOOL(4, "高中"),
+ TECHNICAL_SCHOOL(5, "中专"),
+ COLLEGE(6, "大专"),
+ BACHELOR_OR_ABOVE(7, "本科及以上");
+
+ @EnumValue
+ private final Integer value;
+ private final String name;
+
+}
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/ErrorCodeConstants.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/ErrorCodeConstants.java
new file mode 100644
index 0000000000..a3b5e14868
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/ErrorCodeConstants.java
@@ -0,0 +1,48 @@
+package cn.iocoder.yudao.module.prison.enums;
+
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+
+/**
+ * 监狱管理模块错误码
+ *
+ * @author xlcp
+ */
+public class ErrorCodeConstants {
+
+ // ========== 服刑人员信息 1xxxx ==========
+ public static final ErrorCode PRISONER_NOT_EXISTS = new ErrorCode(1_000_001, "服刑人员信息不存在");
+ public static final ErrorCode PRISONER_NO_EXISTS = new ErrorCode(1_000_002, "服刑人员编号【{0}】已存在");
+
+ // ========== 监区管理 2xxxx ==========
+ public static final ErrorCode PRISON_AREA_NOT_EXISTS = new ErrorCode(2_000_001, "监区信息不存在");
+ public static final ErrorCode PRISON_AREA_CODE_EXISTS = new ErrorCode(2_000_002, "监区编码【{0}】已存在");
+
+ // ========== 监室管理 3xxxx ==========
+ public static final ErrorCode PRISON_CELL_NOT_EXISTS = new ErrorCode(3_000_001, "监室信息不存在");
+ public static final ErrorCode PRISON_CELL_CODE_EXISTS = new ErrorCode(3_000_002, "监室编码【{0}】已存在");
+
+ // ========== 计分考核 4xxxx ==========
+ public static final ErrorCode PRISON_SCORE_NOT_EXISTS = new ErrorCode(4_000_001, "计分记录不存在");
+
+ // ========== 危险评估 5xxxx ==========
+ public static final ErrorCode PRISON_RISK_NOT_EXISTS = new ErrorCode(5_000_001, "评估记录不存在");
+
+ // ========== 问卷管理 6xxxx ==========
+ public static final ErrorCode PRISON_QUESTIONNAIRE_NOT_EXISTS = new ErrorCode(6_000_001, "问卷不存在");
+ public static final ErrorCode PRISON_QUESTION_NOT_EXISTS = new ErrorCode(6_000_002, "问题不存在");
+ public static final ErrorCode PRISON_QUESTIONNAIRE_RECORD_NOT_EXISTS = new ErrorCode(6_000_003, "问卷答题记录不存在");
+
+ // ========== 消费记录 7xxxx ==========
+ public static final ErrorCode PRISON_CONSUMPTION_NOT_EXISTS = new ErrorCode(7_000_001, "消费记录不存在");
+
+ // ========== 别名 (兼容codegen生成的代码) ==========
+ public static final ErrorCode AREA_NOT_EXISTS = PRISON_AREA_NOT_EXISTS;
+ public static final ErrorCode CELL_NOT_EXISTS = PRISON_CELL_NOT_EXISTS;
+ public static final ErrorCode SCORE_NOT_EXISTS = PRISON_SCORE_NOT_EXISTS;
+ public static final ErrorCode RISK_ASSESSMENT_NOT_EXISTS = PRISON_RISK_NOT_EXISTS;
+ public static final ErrorCode CONSUMPTION_NOT_EXISTS = PRISON_CONSUMPTION_NOT_EXISTS;
+ public static final ErrorCode QUESTIONNAIRE_NOT_EXISTS = PRISON_QUESTIONNAIRE_NOT_EXISTS;
+ public static final ErrorCode QUESTION_NOT_EXISTS = PRISON_QUESTION_NOT_EXISTS;
+ public static final ErrorCode QUESTIONNAIRE_RECORD_NOT_EXISTS = PRISON_QUESTIONNAIRE_RECORD_NOT_EXISTS;
+
+}
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/GenderEnum.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/GenderEnum.java
new file mode 100644
index 0000000000..20d9b2324f
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/GenderEnum.java
@@ -0,0 +1,23 @@
+package cn.iocoder.yudao.module.prison.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 性别枚举
+ *
+ * @author xlcp
+ */
+@Getter
+@AllArgsConstructor
+public enum GenderEnum {
+
+ MALE(1, "男"),
+ FEMALE(2, "女");
+
+ @EnumValue
+ private final Integer value;
+ private final String name;
+
+}
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/PrisonerStatusEnum.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/PrisonerStatusEnum.java
new file mode 100644
index 0000000000..35559b12e1
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/PrisonerStatusEnum.java
@@ -0,0 +1,26 @@
+package cn.iocoder.yudao.module.prison.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 服刑人员状态枚举
+ *
+ * @author xlcp
+ */
+@Getter
+@AllArgsConstructor
+public enum PrisonerStatusEnum {
+
+ IMPRISONED(1, "在押"),
+ PAROLED(2, "假释"),
+ OUTSIDE_EXECUTION(3, "暂予监外执行"),
+ RELEASED(4, "已释放"),
+ DECEASED(5, "已死亡");
+
+ @EnumValue
+ private final Integer value;
+ private final String name;
+
+}
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/RiskLevelEnum.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/RiskLevelEnum.java
new file mode 100644
index 0000000000..be21498e99
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/RiskLevelEnum.java
@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.prison.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 风险等级枚举
+ *
+ * @author xlcp
+ */
+@Getter
+@AllArgsConstructor
+public enum RiskLevelEnum {
+
+ HIGH(1, "高风险"),
+ MEDIUM(2, "中风险"),
+ LOW(3, "低风险");
+
+ @EnumValue
+ private final Integer value;
+ private final String name;
+
+}
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/SupervisionLevelEnum.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/SupervisionLevelEnum.java
new file mode 100644
index 0000000000..a0e27a428d
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/enums/SupervisionLevelEnum.java
@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.prison.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 监管等级枚举
+ *
+ * @author xlcp
+ */
+@Getter
+@AllArgsConstructor
+public enum SupervisionLevelEnum {
+
+ STRICT(1, "严管级"),
+ NORMAL(2, "普管级"),
+ RELAXED(3, "宽管级");
+
+ @EnumValue
+ private final Integer value;
+ private final String name;
+
+}
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/PrisonerService.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/PrisonerService.java
new file mode 100644
index 0000000000..e78e16d68b
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/PrisonerService.java
@@ -0,0 +1,69 @@
+package cn.iocoder.yudao.module.prison.service;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.prison.controller.admin.prisoner.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.PrisonerDO;
+
+import java.util.List;
+
+/**
+ * 服刑人员信息 Service 接口
+ *
+ * @author xlcp
+ */
+public interface PrisonerService {
+
+ /**
+ * 创建服刑人员信息
+ *
+ * @param reqVO 创建信息
+ * @return 服刑人员ID
+ */
+ Long createPrisoner(PrisonerSaveReqVO reqVO);
+
+ /**
+ * 更新服刑人员信息
+ *
+ * @param reqVO 更新信息
+ */
+ void updatePrisoner(PrisonerSaveReqVO reqVO);
+
+ /**
+ * 删除服刑人员信息
+ *
+ * @param id 服刑人员ID
+ */
+ void deletePrisoner(Long id);
+
+ /**
+ * 批量删除服刑人员信息
+ *
+ * @param ids 服刑人员ID列表
+ */
+ void deletePrisonerList(List ids);
+
+ /**
+ * 获取服刑人员信息
+ *
+ * @param id 服刑人员ID
+ * @return 服刑人员信息
+ */
+ PrisonerDO getPrisoner(Long id);
+
+ /**
+ * 获取服刑人员分页列表
+ *
+ * @param reqVO 查询条件
+ * @return 服刑人员分页列表
+ */
+ PageResult getPrisonerPage(PrisonerPageReqVO reqVO);
+
+ /**
+ * 根据服刑人员编号获取服刑人员
+ *
+ * @param prisonerNo 服刑人员编号
+ * @return 服刑人员信息
+ */
+ PrisonerDO getPrisonerByNo(String prisonerNo);
+
+}
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/area/AreaService.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/area/AreaService.java
new file mode 100644
index 0000000000..7906ab9f7c
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/area/AreaService.java
@@ -0,0 +1,62 @@
+package cn.iocoder.yudao.module.prison.service.area;
+
+import java.util.*;
+import jakarta.validation.*;
+import cn.iocoder.yudao.module.prison.controller.admin.area.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.area.AreaDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+/**
+ * 监区信息 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface AreaService {
+
+ /**
+ * 创建监区信息
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createArea(@Valid AreaSaveReqVO createReqVO);
+
+ /**
+ * 更新监区信息
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateArea(@Valid AreaSaveReqVO updateReqVO);
+
+ /**
+ * 删除监区信息
+ *
+ * @param id 编号
+ */
+ void deleteArea(Long id);
+
+ /**
+ * 批量删除监区信息
+ *
+ * @param ids 编号
+ */
+ void deleteAreaListByIds(List ids);
+
+ /**
+ * 获得监区信息
+ *
+ * @param id 编号
+ * @return 监区信息
+ */
+ AreaDO getArea(Long id);
+
+ /**
+ * 获得监区信息分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 监区信息分页
+ */
+ PageResult getAreaPage(AreaPageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/area/AreaServiceImpl.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/area/AreaServiceImpl.java
new file mode 100644
index 0000000000..4020844ab8
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/area/AreaServiceImpl.java
@@ -0,0 +1,85 @@
+package cn.iocoder.yudao.module.prison.service.area;
+
+import cn.hutool.core.collection.CollUtil;
+import org.springframework.stereotype.Service;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import cn.iocoder.yudao.module.prison.controller.admin.area.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.area.AreaDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.prison.dal.mysql.area.AreaMapper;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList;
+import static cn.iocoder.yudao.module.prison.enums.ErrorCodeConstants.*;
+
+/**
+ * 监区信息 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class AreaServiceImpl implements AreaService {
+
+ @Resource
+ private AreaMapper areaMapper;
+
+ @Override
+ public Long createArea(AreaSaveReqVO createReqVO) {
+ // 插入
+ AreaDO area = BeanUtils.toBean(createReqVO, AreaDO.class);
+ areaMapper.insert(area);
+
+ // 返回
+ return area.getId();
+ }
+
+ @Override
+ public void updateArea(AreaSaveReqVO updateReqVO) {
+ // 校验存在
+ validateAreaExists(updateReqVO.getId());
+ // 更新
+ AreaDO updateObj = BeanUtils.toBean(updateReqVO, AreaDO.class);
+ areaMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteArea(Long id) {
+ // 校验存在
+ validateAreaExists(id);
+ // 删除
+ areaMapper.deleteById(id);
+ }
+
+ @Override
+ public void deleteAreaListByIds(List ids) {
+ // 删除
+ areaMapper.deleteByIds(ids);
+ }
+
+
+ private void validateAreaExists(Long id) {
+ if (areaMapper.selectById(id) == null) {
+ throw exception(AREA_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public AreaDO getArea(Long id) {
+ return areaMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getAreaPage(AreaPageReqVO pageReqVO) {
+ return areaMapper.selectPage(pageReqVO);
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/cell/CellService.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/cell/CellService.java
new file mode 100644
index 0000000000..13fb7f0ac7
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/cell/CellService.java
@@ -0,0 +1,62 @@
+package cn.iocoder.yudao.module.prison.service.cell;
+
+import java.util.*;
+import jakarta.validation.*;
+import cn.iocoder.yudao.module.prison.controller.admin.cell.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.cell.CellDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+/**
+ * 监室信息 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface CellService {
+
+ /**
+ * 创建监室信息
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createCell(@Valid CellSaveReqVO createReqVO);
+
+ /**
+ * 更新监室信息
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateCell(@Valid CellSaveReqVO updateReqVO);
+
+ /**
+ * 删除监室信息
+ *
+ * @param id 编号
+ */
+ void deleteCell(Long id);
+
+ /**
+ * 批量删除监室信息
+ *
+ * @param ids 编号
+ */
+ void deleteCellListByIds(List ids);
+
+ /**
+ * 获得监室信息
+ *
+ * @param id 编号
+ * @return 监室信息
+ */
+ CellDO getCell(Long id);
+
+ /**
+ * 获得监室信息分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 监室信息分页
+ */
+ PageResult getCellPage(CellPageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/cell/CellServiceImpl.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/cell/CellServiceImpl.java
new file mode 100644
index 0000000000..d97d1f34f8
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/cell/CellServiceImpl.java
@@ -0,0 +1,85 @@
+package cn.iocoder.yudao.module.prison.service.cell;
+
+import cn.hutool.core.collection.CollUtil;
+import org.springframework.stereotype.Service;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import cn.iocoder.yudao.module.prison.controller.admin.cell.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.cell.CellDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.prison.dal.mysql.cell.CellMapper;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList;
+import static cn.iocoder.yudao.module.prison.enums.ErrorCodeConstants.*;
+
+/**
+ * 监室信息 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class CellServiceImpl implements CellService {
+
+ @Resource
+ private CellMapper cellMapper;
+
+ @Override
+ public Long createCell(CellSaveReqVO createReqVO) {
+ // 插入
+ CellDO cell = BeanUtils.toBean(createReqVO, CellDO.class);
+ cellMapper.insert(cell);
+
+ // 返回
+ return cell.getId();
+ }
+
+ @Override
+ public void updateCell(CellSaveReqVO updateReqVO) {
+ // 校验存在
+ validateCellExists(updateReqVO.getId());
+ // 更新
+ CellDO updateObj = BeanUtils.toBean(updateReqVO, CellDO.class);
+ cellMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteCell(Long id) {
+ // 校验存在
+ validateCellExists(id);
+ // 删除
+ cellMapper.deleteById(id);
+ }
+
+ @Override
+ public void deleteCellListByIds(List ids) {
+ // 删除
+ cellMapper.deleteByIds(ids);
+ }
+
+
+ private void validateCellExists(Long id) {
+ if (cellMapper.selectById(id) == null) {
+ throw exception(CELL_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public CellDO getCell(Long id) {
+ return cellMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getCellPage(CellPageReqVO pageReqVO) {
+ return cellMapper.selectPage(pageReqVO);
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/consumption/ConsumptionService.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/consumption/ConsumptionService.java
new file mode 100644
index 0000000000..cc6e4bb7e6
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/consumption/ConsumptionService.java
@@ -0,0 +1,62 @@
+package cn.iocoder.yudao.module.prison.service.consumption;
+
+import java.util.*;
+import jakarta.validation.*;
+import cn.iocoder.yudao.module.prison.controller.admin.consumption.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.consumption.ConsumptionDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+/**
+ * 消费记录 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface ConsumptionService {
+
+ /**
+ * 创建消费记录
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createConsumption(@Valid ConsumptionSaveReqVO createReqVO);
+
+ /**
+ * 更新消费记录
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateConsumption(@Valid ConsumptionSaveReqVO updateReqVO);
+
+ /**
+ * 删除消费记录
+ *
+ * @param id 编号
+ */
+ void deleteConsumption(Long id);
+
+ /**
+ * 批量删除消费记录
+ *
+ * @param ids 编号
+ */
+ void deleteConsumptionListByIds(List ids);
+
+ /**
+ * 获得消费记录
+ *
+ * @param id 编号
+ * @return 消费记录
+ */
+ ConsumptionDO getConsumption(Long id);
+
+ /**
+ * 获得消费记录分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 消费记录分页
+ */
+ PageResult getConsumptionPage(ConsumptionPageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/consumption/ConsumptionServiceImpl.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/consumption/ConsumptionServiceImpl.java
new file mode 100644
index 0000000000..471a3b0ac4
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/consumption/ConsumptionServiceImpl.java
@@ -0,0 +1,85 @@
+package cn.iocoder.yudao.module.prison.service.consumption;
+
+import cn.hutool.core.collection.CollUtil;
+import org.springframework.stereotype.Service;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import cn.iocoder.yudao.module.prison.controller.admin.consumption.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.consumption.ConsumptionDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.prison.dal.mysql.consumption.ConsumptionMapper;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList;
+import static cn.iocoder.yudao.module.prison.enums.ErrorCodeConstants.*;
+
+/**
+ * 消费记录 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class ConsumptionServiceImpl implements ConsumptionService {
+
+ @Resource
+ private ConsumptionMapper consumptionMapper;
+
+ @Override
+ public Long createConsumption(ConsumptionSaveReqVO createReqVO) {
+ // 插入
+ ConsumptionDO consumption = BeanUtils.toBean(createReqVO, ConsumptionDO.class);
+ consumptionMapper.insert(consumption);
+
+ // 返回
+ return consumption.getId();
+ }
+
+ @Override
+ public void updateConsumption(ConsumptionSaveReqVO updateReqVO) {
+ // 校验存在
+ validateConsumptionExists(updateReqVO.getId());
+ // 更新
+ ConsumptionDO updateObj = BeanUtils.toBean(updateReqVO, ConsumptionDO.class);
+ consumptionMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteConsumption(Long id) {
+ // 校验存在
+ validateConsumptionExists(id);
+ // 删除
+ consumptionMapper.deleteById(id);
+ }
+
+ @Override
+ public void deleteConsumptionListByIds(List ids) {
+ // 删除
+ consumptionMapper.deleteByIds(ids);
+ }
+
+
+ private void validateConsumptionExists(Long id) {
+ if (consumptionMapper.selectById(id) == null) {
+ throw exception(CONSUMPTION_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public ConsumptionDO getConsumption(Long id) {
+ return consumptionMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getConsumptionPage(ConsumptionPageReqVO pageReqVO) {
+ return consumptionMapper.selectPage(pageReqVO);
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/impl/PrisonerServiceImpl.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/impl/PrisonerServiceImpl.java
new file mode 100644
index 0000000000..c14c3ea21a
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/impl/PrisonerServiceImpl.java
@@ -0,0 +1,123 @@
+package cn.iocoder.yudao.module.prison.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.prison.controller.admin.prisoner.vo.*;
+import cn.iocoder.yudao.module.prison.convert.prisoner.PrisonerConvert;
+import cn.iocoder.yudao.module.prison.dal.dataobject.PrisonerDO;
+import cn.iocoder.yudao.module.prison.dal.mysql.PrisonerMapper;
+import cn.iocoder.yudao.module.prison.service.PrisonerService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.prison.enums.ErrorCodeConstants.*;
+
+/**
+ * 服刑人员信息 Service 实现类
+ *
+ * @author xlcp
+ */
+@Service
+@Validated
+public class PrisonerServiceImpl implements PrisonerService {
+
+ @Resource
+ private PrisonerMapper prisonerMapper;
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Long createPrisoner(PrisonerSaveReqVO reqVO) {
+ // 检查服刑人员编号是否唯一
+ PrisonerDO existedPrisoner = getPrisonerByNo(reqVO.getPrisonerNo());
+ if (existedPrisoner != null) {
+ throw exception(PRISONER_NO_EXISTS, reqVO.getPrisonerNo());
+ }
+
+ // 插入
+ PrisonerDO prisoner = PrisonerConvert.INSTANCE.convert(reqVO);
+ prisonerMapper.insert(prisoner);
+ return prisoner.getId();
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void updatePrisoner(PrisonerSaveReqVO reqVO) {
+ // 校验存在
+ PrisonerDO prisoner = getPrisoner(reqVO.getId());
+ if (prisoner == null) {
+ throw exception(PRISONER_NOT_EXISTS);
+ }
+
+ // 检查服刑人员编号是否唯一(排除自己)
+ PrisonerDO existedPrisoner = getPrisonerByNo(reqVO.getPrisonerNo());
+ if (existedPrisoner != null && !existedPrisoner.getId().equals(reqVO.getId())) {
+ throw exception(PRISONER_NO_EXISTS, reqVO.getPrisonerNo());
+ }
+
+ // 更新
+ PrisonerDO updateObj = PrisonerConvert.INSTANCE.convert(reqVO);
+ prisonerMapper.updateById(updateObj);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void deletePrisoner(Long id) {
+ // 校验存在
+ PrisonerDO prisoner = getPrisoner(id);
+ if (prisoner == null) {
+ throw exception(PRISONER_NOT_EXISTS);
+ }
+
+ // 删除
+ prisonerMapper.deleteById(id);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void deletePrisonerList(List ids) {
+ // 校验存在
+ List prisoners = prisonerMapper.selectBatchIds(ids);
+ if (CollUtil.isEmpty(prisoners)) {
+ throw exception(PRISONER_NOT_EXISTS);
+ }
+
+ // 删除
+ prisonerMapper.deleteBatchIds(ids);
+ }
+
+ @Override
+ public PrisonerDO getPrisoner(Long id) {
+ return prisonerMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getPrisonerPage(PrisonerPageReqVO reqVO) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+ wrapper.like(reqVO.getPrisonerNo() != null, PrisonerDO::getPrisonerNo, reqVO.getPrisonerNo())
+ .like(reqVO.getName() != null, PrisonerDO::getName, reqVO.getName())
+ .eq(reqVO.getGender() != null, PrisonerDO::getGender, reqVO.getGender())
+ .eq(reqVO.getIdCard() != null, PrisonerDO::getIdCard, reqVO.getIdCard())
+ .eq(reqVO.getCrime() != null, PrisonerDO::getCrime, reqVO.getCrime())
+ .eq(reqVO.getSupervisionLevel() != null, PrisonerDO::getSupervisionLevel, reqVO.getSupervisionLevel())
+ .eq(reqVO.getRiskLevel() != null, PrisonerDO::getRiskLevel, reqVO.getRiskLevel())
+ .eq(reqVO.getPrisonAreaId() != null, PrisonerDO::getPrisonAreaId, reqVO.getPrisonAreaId())
+ .eq(reqVO.getPrisonCellId() != null, PrisonerDO::getPrisonCellId, reqVO.getPrisonCellId())
+ .eq(reqVO.getStatus() != null, PrisonerDO::getStatus, reqVO.getStatus())
+ .ge(reqVO.getImprisonmentDateStart() != null, PrisonerDO::getImprisonmentDate, reqVO.getImprisonmentDateStart())
+ .le(reqVO.getImprisonmentDateEnd() != null, PrisonerDO::getImprisonmentDate, reqVO.getImprisonmentDateEnd());
+ return prisonerMapper.selectPage(reqVO, wrapper);
+ }
+
+ @Override
+ public PrisonerDO getPrisonerByNo(String prisonerNo) {
+ return prisonerMapper.selectOne(new LambdaQueryWrapper()
+ .eq(PrisonerDO::getPrisonerNo, prisonerNo));
+ }
+
+}
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/question/QuestionService.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/question/QuestionService.java
new file mode 100644
index 0000000000..7d7f842a3e
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/question/QuestionService.java
@@ -0,0 +1,69 @@
+package cn.iocoder.yudao.module.prison.service.question;
+
+import java.util.*;
+import jakarta.validation.*;
+import cn.iocoder.yudao.module.prison.controller.admin.question.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.question.QuestionDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+/**
+ * 问卷问题 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface QuestionService {
+
+ /**
+ * 创建问卷问题
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createQuestion(@Valid QuestionSaveReqVO createReqVO);
+
+ /**
+ * 更新问卷问题
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateQuestion(@Valid QuestionSaveReqVO updateReqVO);
+
+ /**
+ * 删除问卷问题
+ *
+ * @param id 编号
+ */
+ void deleteQuestion(Long id);
+
+ /**
+ * 批量删除问卷问题
+ *
+ * @param ids 编号
+ */
+ void deleteQuestionListByIds(List ids);
+
+ /**
+ * 获得问卷问题
+ *
+ * @param id 编号
+ * @return 问卷问题
+ */
+ QuestionDO getQuestion(Long id);
+
+ /**
+ * 获得问卷问题分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 问卷问题分页
+ */
+ PageResult getQuestionPage(QuestionPageReqVO pageReqVO);
+
+ /**
+ * 批量更新问卷问题(仅更新排序和分区相关字段)
+ *
+ * @param updateList 更新列表
+ */
+ void batchUpdateQuestion(List updateList);
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/question/QuestionServiceImpl.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/question/QuestionServiceImpl.java
new file mode 100644
index 0000000000..19f613062d
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/question/QuestionServiceImpl.java
@@ -0,0 +1,105 @@
+package cn.iocoder.yudao.module.prison.service.question;
+
+import cn.hutool.core.collection.CollUtil;
+import org.springframework.stereotype.Service;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import cn.iocoder.yudao.module.prison.controller.admin.question.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.question.QuestionDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.prison.dal.mysql.question.QuestionMapper;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList;
+import static cn.iocoder.yudao.module.prison.enums.ErrorCodeConstants.*;
+
+/**
+ * 问卷问题 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class QuestionServiceImpl implements QuestionService {
+
+ @Resource
+ private QuestionMapper questionMapper;
+
+ @Override
+ public Long createQuestion(QuestionSaveReqVO createReqVO) {
+ // 插入
+ QuestionDO question = BeanUtils.toBean(createReqVO, QuestionDO.class);
+ questionMapper.insert(question);
+
+ // 返回
+ return question.getId();
+ }
+
+ @Override
+ public void updateQuestion(QuestionSaveReqVO updateReqVO) {
+ // 校验存在
+ validateQuestionExists(updateReqVO.getId());
+ // 更新
+ QuestionDO updateObj = BeanUtils.toBean(updateReqVO, QuestionDO.class);
+ questionMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteQuestion(Long id) {
+ // 校验存在
+ validateQuestionExists(id);
+ // 删除
+ questionMapper.deleteById(id);
+ }
+
+ @Override
+ public void deleteQuestionListByIds(List ids) {
+ // 删除
+ questionMapper.deleteByIds(ids);
+ }
+
+
+ private void validateQuestionExists(Long id) {
+ if (questionMapper.selectById(id) == null) {
+ throw exception(QUESTION_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public QuestionDO getQuestion(Long id) {
+ return questionMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getQuestionPage(QuestionPageReqVO pageReqVO) {
+ return questionMapper.selectPage(pageReqVO);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void batchUpdateQuestion(List updateList) {
+ if (CollUtil.isEmpty(updateList)) {
+ return;
+ }
+ // 批量更新
+ for (QuestionSaveReqVO updateReqVO : updateList) {
+ // 校验存在
+ validateQuestionExists(updateReqVO.getId());
+ // 更新(仅更新排序和分区相关字段)
+ QuestionDO updateObj = new QuestionDO();
+ updateObj.setId(updateReqVO.getId());
+ updateObj.setPartName(updateReqVO.getPartName());
+ updateObj.setPartSort(updateReqVO.getPartSort());
+ updateObj.setSort(updateReqVO.getSort());
+ questionMapper.updateById(updateObj);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/questionnaire/QuestionnaireService.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/questionnaire/QuestionnaireService.java
new file mode 100644
index 0000000000..2a30d7e7eb
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/questionnaire/QuestionnaireService.java
@@ -0,0 +1,62 @@
+package cn.iocoder.yudao.module.prison.service.questionnaire;
+
+import java.util.*;
+import jakarta.validation.*;
+import cn.iocoder.yudao.module.prison.controller.admin.questionnaire.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.questionnaire.QuestionnaireDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+/**
+ * 问卷模板 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface QuestionnaireService {
+
+ /**
+ * 创建问卷模板
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createQuestionnaire(@Valid QuestionnaireSaveReqVO createReqVO);
+
+ /**
+ * 更新问卷模板
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateQuestionnaire(@Valid QuestionnaireSaveReqVO updateReqVO);
+
+ /**
+ * 删除问卷模板
+ *
+ * @param id 编号
+ */
+ void deleteQuestionnaire(Long id);
+
+ /**
+ * 批量删除问卷模板
+ *
+ * @param ids 编号
+ */
+ void deleteQuestionnaireListByIds(List ids);
+
+ /**
+ * 获得问卷模板
+ *
+ * @param id 编号
+ * @return 问卷模板
+ */
+ QuestionnaireDO getQuestionnaire(Long id);
+
+ /**
+ * 获得问卷模板分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 问卷模板分页
+ */
+ PageResult getQuestionnairePage(QuestionnairePageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/questionnaire/QuestionnaireServiceImpl.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/questionnaire/QuestionnaireServiceImpl.java
new file mode 100644
index 0000000000..62a14de749
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/questionnaire/QuestionnaireServiceImpl.java
@@ -0,0 +1,85 @@
+package cn.iocoder.yudao.module.prison.service.questionnaire;
+
+import cn.hutool.core.collection.CollUtil;
+import org.springframework.stereotype.Service;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import cn.iocoder.yudao.module.prison.controller.admin.questionnaire.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.questionnaire.QuestionnaireDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.prison.dal.mysql.questionnaire.QuestionnaireMapper;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList;
+import static cn.iocoder.yudao.module.prison.enums.ErrorCodeConstants.*;
+
+/**
+ * 问卷模板 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class QuestionnaireServiceImpl implements QuestionnaireService {
+
+ @Resource
+ private QuestionnaireMapper questionnaireMapper;
+
+ @Override
+ public Long createQuestionnaire(QuestionnaireSaveReqVO createReqVO) {
+ // 插入
+ QuestionnaireDO questionnaire = BeanUtils.toBean(createReqVO, QuestionnaireDO.class);
+ questionnaireMapper.insert(questionnaire);
+
+ // 返回
+ return questionnaire.getId();
+ }
+
+ @Override
+ public void updateQuestionnaire(QuestionnaireSaveReqVO updateReqVO) {
+ // 校验存在
+ validateQuestionnaireExists(updateReqVO.getId());
+ // 更新
+ QuestionnaireDO updateObj = BeanUtils.toBean(updateReqVO, QuestionnaireDO.class);
+ questionnaireMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteQuestionnaire(Long id) {
+ // 校验存在
+ validateQuestionnaireExists(id);
+ // 删除
+ questionnaireMapper.deleteById(id);
+ }
+
+ @Override
+ public void deleteQuestionnaireListByIds(List ids) {
+ // 删除
+ questionnaireMapper.deleteByIds(ids);
+ }
+
+
+ private void validateQuestionnaireExists(Long id) {
+ if (questionnaireMapper.selectById(id) == null) {
+ throw exception(QUESTIONNAIRE_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public QuestionnaireDO getQuestionnaire(Long id) {
+ return questionnaireMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getQuestionnairePage(QuestionnairePageReqVO pageReqVO) {
+ return questionnaireMapper.selectPage(pageReqVO);
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/questionnairerecord/QuestionnaireRecordService.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/questionnairerecord/QuestionnaireRecordService.java
new file mode 100644
index 0000000000..53b2a43f82
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/questionnairerecord/QuestionnaireRecordService.java
@@ -0,0 +1,62 @@
+package cn.iocoder.yudao.module.prison.service.questionnairerecord;
+
+import java.util.*;
+import jakarta.validation.*;
+import cn.iocoder.yudao.module.prison.controller.admin.questionnairerecord.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.questionnairerecord.QuestionnaireRecordDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+/**
+ * 问卷答题记录 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface QuestionnaireRecordService {
+
+ /**
+ * 创建问卷答题记录
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createQuestionnaireRecord(@Valid QuestionnaireRecordSaveReqVO createReqVO);
+
+ /**
+ * 更新问卷答题记录
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateQuestionnaireRecord(@Valid QuestionnaireRecordSaveReqVO updateReqVO);
+
+ /**
+ * 删除问卷答题记录
+ *
+ * @param id 编号
+ */
+ void deleteQuestionnaireRecord(Long id);
+
+ /**
+ * 批量删除问卷答题记录
+ *
+ * @param ids 编号
+ */
+ void deleteQuestionnaireRecordListByIds(List ids);
+
+ /**
+ * 获得问卷答题记录
+ *
+ * @param id 编号
+ * @return 问卷答题记录
+ */
+ QuestionnaireRecordDO getQuestionnaireRecord(Long id);
+
+ /**
+ * 获得问卷答题记录分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 问卷答题记录分页
+ */
+ PageResult getQuestionnaireRecordPage(QuestionnaireRecordPageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/questionnairerecord/QuestionnaireRecordServiceImpl.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/questionnairerecord/QuestionnaireRecordServiceImpl.java
new file mode 100644
index 0000000000..9a7f76427f
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/questionnairerecord/QuestionnaireRecordServiceImpl.java
@@ -0,0 +1,85 @@
+package cn.iocoder.yudao.module.prison.service.questionnairerecord;
+
+import cn.hutool.core.collection.CollUtil;
+import org.springframework.stereotype.Service;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import cn.iocoder.yudao.module.prison.controller.admin.questionnairerecord.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.questionnairerecord.QuestionnaireRecordDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.prison.dal.mysql.questionnairerecord.QuestionnaireRecordMapper;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList;
+import static cn.iocoder.yudao.module.prison.enums.ErrorCodeConstants.*;
+
+/**
+ * 问卷答题记录 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class QuestionnaireRecordServiceImpl implements QuestionnaireRecordService {
+
+ @Resource
+ private QuestionnaireRecordMapper questionnaireRecordMapper;
+
+ @Override
+ public Long createQuestionnaireRecord(QuestionnaireRecordSaveReqVO createReqVO) {
+ // 插入
+ QuestionnaireRecordDO questionnaireRecord = BeanUtils.toBean(createReqVO, QuestionnaireRecordDO.class);
+ questionnaireRecordMapper.insert(questionnaireRecord);
+
+ // 返回
+ return questionnaireRecord.getId();
+ }
+
+ @Override
+ public void updateQuestionnaireRecord(QuestionnaireRecordSaveReqVO updateReqVO) {
+ // 校验存在
+ validateQuestionnaireRecordExists(updateReqVO.getId());
+ // 更新
+ QuestionnaireRecordDO updateObj = BeanUtils.toBean(updateReqVO, QuestionnaireRecordDO.class);
+ questionnaireRecordMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteQuestionnaireRecord(Long id) {
+ // 校验存在
+ validateQuestionnaireRecordExists(id);
+ // 删除
+ questionnaireRecordMapper.deleteById(id);
+ }
+
+ @Override
+ public void deleteQuestionnaireRecordListByIds(List ids) {
+ // 删除
+ questionnaireRecordMapper.deleteByIds(ids);
+ }
+
+
+ private void validateQuestionnaireRecordExists(Long id) {
+ if (questionnaireRecordMapper.selectById(id) == null) {
+ throw exception(QUESTIONNAIRE_RECORD_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public QuestionnaireRecordDO getQuestionnaireRecord(Long id) {
+ return questionnaireRecordMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getQuestionnaireRecordPage(QuestionnaireRecordPageReqVO pageReqVO) {
+ return questionnaireRecordMapper.selectPage(pageReqVO);
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/riskassessment/RiskAssessmentService.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/riskassessment/RiskAssessmentService.java
new file mode 100644
index 0000000000..b2aaa0590f
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/riskassessment/RiskAssessmentService.java
@@ -0,0 +1,62 @@
+package cn.iocoder.yudao.module.prison.service.riskassessment;
+
+import java.util.*;
+import jakarta.validation.*;
+import cn.iocoder.yudao.module.prison.controller.admin.riskassessment.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.riskassessment.RiskAssessmentDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+/**
+ * 危险评估 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface RiskAssessmentService {
+
+ /**
+ * 创建危险评估
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createRiskAssessment(@Valid RiskAssessmentSaveReqVO createReqVO);
+
+ /**
+ * 更新危险评估
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateRiskAssessment(@Valid RiskAssessmentSaveReqVO updateReqVO);
+
+ /**
+ * 删除危险评估
+ *
+ * @param id 编号
+ */
+ void deleteRiskAssessment(Long id);
+
+ /**
+ * 批量删除危险评估
+ *
+ * @param ids 编号
+ */
+ void deleteRiskAssessmentListByIds(List ids);
+
+ /**
+ * 获得危险评估
+ *
+ * @param id 编号
+ * @return 危险评估
+ */
+ RiskAssessmentDO getRiskAssessment(Long id);
+
+ /**
+ * 获得危险评估分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 危险评估分页
+ */
+ PageResult getRiskAssessmentPage(RiskAssessmentPageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/riskassessment/RiskAssessmentServiceImpl.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/riskassessment/RiskAssessmentServiceImpl.java
new file mode 100644
index 0000000000..bf7a313b1d
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/riskassessment/RiskAssessmentServiceImpl.java
@@ -0,0 +1,85 @@
+package cn.iocoder.yudao.module.prison.service.riskassessment;
+
+import cn.hutool.core.collection.CollUtil;
+import org.springframework.stereotype.Service;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import cn.iocoder.yudao.module.prison.controller.admin.riskassessment.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.riskassessment.RiskAssessmentDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.prison.dal.mysql.riskassessment.RiskAssessmentMapper;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList;
+import static cn.iocoder.yudao.module.prison.enums.ErrorCodeConstants.*;
+
+/**
+ * 危险评估 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class RiskAssessmentServiceImpl implements RiskAssessmentService {
+
+ @Resource
+ private RiskAssessmentMapper riskAssessmentMapper;
+
+ @Override
+ public Long createRiskAssessment(RiskAssessmentSaveReqVO createReqVO) {
+ // 插入
+ RiskAssessmentDO riskAssessment = BeanUtils.toBean(createReqVO, RiskAssessmentDO.class);
+ riskAssessmentMapper.insert(riskAssessment);
+
+ // 返回
+ return riskAssessment.getId();
+ }
+
+ @Override
+ public void updateRiskAssessment(RiskAssessmentSaveReqVO updateReqVO) {
+ // 校验存在
+ validateRiskAssessmentExists(updateReqVO.getId());
+ // 更新
+ RiskAssessmentDO updateObj = BeanUtils.toBean(updateReqVO, RiskAssessmentDO.class);
+ riskAssessmentMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteRiskAssessment(Long id) {
+ // 校验存在
+ validateRiskAssessmentExists(id);
+ // 删除
+ riskAssessmentMapper.deleteById(id);
+ }
+
+ @Override
+ public void deleteRiskAssessmentListByIds(List ids) {
+ // 删除
+ riskAssessmentMapper.deleteByIds(ids);
+ }
+
+
+ private void validateRiskAssessmentExists(Long id) {
+ if (riskAssessmentMapper.selectById(id) == null) {
+ throw exception(RISK_ASSESSMENT_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public RiskAssessmentDO getRiskAssessment(Long id) {
+ return riskAssessmentMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getRiskAssessmentPage(RiskAssessmentPageReqVO pageReqVO) {
+ return riskAssessmentMapper.selectPage(pageReqVO);
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/score/ScoreService.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/score/ScoreService.java
new file mode 100644
index 0000000000..f62e1bbef2
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/score/ScoreService.java
@@ -0,0 +1,62 @@
+package cn.iocoder.yudao.module.prison.service.score;
+
+import java.util.*;
+import jakarta.validation.*;
+import cn.iocoder.yudao.module.prison.controller.admin.score.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.score.ScoreDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+/**
+ * 计分考核 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface ScoreService {
+
+ /**
+ * 创建计分考核
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createScore(@Valid ScoreSaveReqVO createReqVO);
+
+ /**
+ * 更新计分考核
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateScore(@Valid ScoreSaveReqVO updateReqVO);
+
+ /**
+ * 删除计分考核
+ *
+ * @param id 编号
+ */
+ void deleteScore(Long id);
+
+ /**
+ * 批量删除计分考核
+ *
+ * @param ids 编号
+ */
+ void deleteScoreListByIds(List ids);
+
+ /**
+ * 获得计分考核
+ *
+ * @param id 编号
+ * @return 计分考核
+ */
+ ScoreDO getScore(Long id);
+
+ /**
+ * 获得计分考核分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 计分考核分页
+ */
+ PageResult getScorePage(ScorePageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/score/ScoreServiceImpl.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/score/ScoreServiceImpl.java
new file mode 100644
index 0000000000..9b8362cd7f
--- /dev/null
+++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/score/ScoreServiceImpl.java
@@ -0,0 +1,85 @@
+package cn.iocoder.yudao.module.prison.service.score;
+
+import cn.hutool.core.collection.CollUtil;
+import org.springframework.stereotype.Service;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import cn.iocoder.yudao.module.prison.controller.admin.score.vo.*;
+import cn.iocoder.yudao.module.prison.dal.dataobject.score.ScoreDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.prison.dal.mysql.score.ScoreMapper;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList;
+import static cn.iocoder.yudao.module.prison.enums.ErrorCodeConstants.*;
+
+/**
+ * 计分考核 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class ScoreServiceImpl implements ScoreService {
+
+ @Resource
+ private ScoreMapper scoreMapper;
+
+ @Override
+ public Long createScore(ScoreSaveReqVO createReqVO) {
+ // 插入
+ ScoreDO score = BeanUtils.toBean(createReqVO, ScoreDO.class);
+ scoreMapper.insert(score);
+
+ // 返回
+ return score.getId();
+ }
+
+ @Override
+ public void updateScore(ScoreSaveReqVO updateReqVO) {
+ // 校验存在
+ validateScoreExists(updateReqVO.getId());
+ // 更新
+ ScoreDO updateObj = BeanUtils.toBean(updateReqVO, ScoreDO.class);
+ scoreMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteScore(Long id) {
+ // 校验存在
+ validateScoreExists(id);
+ // 删除
+ scoreMapper.deleteById(id);
+ }
+
+ @Override
+ public void deleteScoreListByIds(List ids) {
+ // 删除
+ scoreMapper.deleteByIds(ids);
+ }
+
+
+ private void validateScoreExists(Long id) {
+ if (scoreMapper.selectById(id) == null) {
+ throw exception(SCORE_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public ScoreDO getScore(Long id) {
+ return scoreMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getScorePage(ScorePageReqVO pageReqVO) {
+ return scoreMapper.selectPage(pageReqVO);
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-prison/src/main/resources/application.yaml b/yudao-module-prison/src/main/resources/application.yaml
new file mode 100644
index 0000000000..945db22412
--- /dev/null
+++ b/yudao-module-prison/src/main/resources/application.yaml
@@ -0,0 +1,11 @@
+server:
+ port: 48080
+
+spring:
+ application:
+ name: yudao-module-prison
+
+#芋道配置
+yudao:
+ prisoner:
+ enabled: true
diff --git a/yudao-module-prison/src/main/resources/mapper/PrisonerMapper.xml b/yudao-module-prison/src/main/resources/mapper/PrisonerMapper.xml
new file mode 100644
index 0000000000..6cebb85773
--- /dev/null
+++ b/yudao-module-prison/src/main/resources/mapper/PrisonerMapper.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/yudao-module-prison/src/main/resources/sql/prison_module.sql b/yudao-module-prison/src/main/resources/sql/prison_module.sql
new file mode 100644
index 0000000000..3fd11f78ea
--- /dev/null
+++ b/yudao-module-prison/src/main/resources/sql/prison_module.sql
@@ -0,0 +1,333 @@
+-- =====================================================
+-- XL监狱综合管理平台 - 监狱模块数据库脚本
+-- 生成时间: 2026-01-12
+-- =====================================================
+
+-- 注意: 执行前请确保已经创建了 prison 模块的基础表 prison_prisoner
+-- 此脚本包含 8 个子模块的表结构和菜单权限
+
+-- =====================================================
+-- 1. 监区信息表 (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 '监区编码',
+ `type` tinyint NOT NULL DEFAULT 1 COMMENT '监区类型:1-普通监区 2-严管监区 3-医院 4-禁闭室',
+ `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_prison_area_code` (`code`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='监区信息表';
+
+-- =====================================================
+-- 2. 监室信息表 (prison_cell)
+-- =====================================================
+CREATE TABLE IF NOT EXISTS `prison_cell` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '监室ID',
+ `area_id` bigint NOT NULL COMMENT '所属监区ID',
+ `name` varchar(100) NOT NULL COMMENT '监室名称',
+ `code` varchar(50) NOT NULL COMMENT '监室编码',
+ `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_prison_cell_area_id` (`area_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='监室信息表';
+
+-- =====================================================
+-- 3. 消费记录表 (prison_consumption)
+-- =====================================================
+CREATE TABLE IF NOT EXISTS `prison_consumption` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+ `prisoner_id` bigint NOT NULL COMMENT '罪犯ID',
+ `prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号',
+ `type` tinyint NOT NULL DEFAULT 1 COMMENT '类型:1-存款 2-消费 3-转账',
+ `amount` decimal(10,2) NOT NULL COMMENT '金额',
+ `balance` decimal(10,2) NOT NULL COMMENT '账户余额',
+ `goods_name` varchar(200) DEFAULT NULL COMMENT '商品名称',
+ `goods_count` int DEFAULT 0 COMMENT '商品数量',
+ `order_no` varchar(64) DEFAULT NULL COMMENT '订单号',
+ `trade_time` datetime NOT NULL 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`),
+ KEY `idx_prison_consumption_prisoner_id` (`prisoner_id`),
+ KEY `idx_prison_consumption_prisoner_no` (`prisoner_no`),
+ KEY `idx_prison_consumption_trade_time` (`trade_time`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='消费记录表';
+
+-- =====================================================
+-- 4. 问卷模板表 (prison_questionnaire)
+-- =====================================================
+CREATE TABLE IF NOT EXISTS `prison_questionnaire` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '问卷ID',
+ `title` varchar(200) NOT NULL COMMENT '问卷标题',
+ `description` varchar(500) DEFAULT NULL COMMENT '问卷描述',
+ `type` tinyint NOT NULL DEFAULT 1 COMMENT '问卷类型:1-心理测评 2-风险评估 3-日常调查',
+ `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-草稿 2-已发布 3-已停用',
+ `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_prison_questionnaire_status` (`status`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='问卷模板表';
+
+-- =====================================================
+-- 5. 问卷问题表 (prison_question)
+-- =====================================================
+CREATE TABLE IF NOT EXISTS `prison_question` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '问题ID',
+ `questionnaire_id` bigint NOT NULL COMMENT '问卷ID',
+ `title` varchar(500) NOT NULL COMMENT '问题标题',
+ `type` tinyint NOT NULL DEFAULT 1 COMMENT '问题类型:1-单选 2-多选 3-问答 4-评分',
+ `options` text COMMENT '选项,JSON格式:[{ "label": "选项1", "value": "1" }]',
+ `score` int DEFAULT 0 COMMENT '分值',
+ `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`),
+ KEY `idx_prison_question_questionnaire_id` (`questionnaire_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='问卷问题表';
+
+-- =====================================================
+-- 6. 问卷答题记录表 (prison_questionnaire_record)
+-- =====================================================
+CREATE TABLE IF NOT EXISTS `prison_questionnaire_record` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+ `questionnaire_id` bigint NOT NULL COMMENT '问卷ID',
+ `prisoner_id` bigint NOT NULL COMMENT '罪犯ID',
+ `prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号',
+ `answers` text NOT NULL COMMENT '答案,JSON格式',
+ `score` int DEFAULT 0 COMMENT '得分',
+ `result` text COMMENT '评估结果',
+ `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-待评估 2-已完成',
+ `answer_time` datetime NOT 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_prison_questionnaire_record_questionnaire_id` (`questionnaire_id`),
+ KEY `idx_prison_questionnaire_record_prisoner_id` (`prisoner_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='问卷答题记录表';
+
+-- =====================================================
+-- 7. 危险评估表 (prison_risk_assessment)
+-- =====================================================
+CREATE TABLE IF NOT EXISTS `prison_risk_assessment` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '评估ID',
+ `prisoner_id` bigint NOT NULL COMMENT '罪犯ID',
+ `prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号',
+ `assessment_type` tinyint NOT NULL DEFAULT 1 COMMENT '评估类型:1-入监评估 2-定期评估 3-出监评估',
+ `risk_level` tinyint NOT NULL COMMENT '风险等级:1-高风险 2-中风险 3-低风险',
+ `risk_score` int DEFAULT 0 COMMENT '风险评分',
+ `factors` text COMMENT '风险因素,JSON格式',
+ `measures` text COMMENT '管控措施',
+ `assessor_id` bigint DEFAULT NULL COMMENT '评估人ID',
+ `assessor_name` varchar(50) DEFAULT NULL COMMENT '评估人姓名',
+ `assessment_date` date NOT NULL COMMENT '评估日期',
+ `next_date` date 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 '创建时间',
+ `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_prison_risk_assessment_prisoner_id` (`prisoner_id`),
+ KEY `idx_prison_risk_assessment_assessment_date` (`assessment_date`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='危险评估表';
+
+-- =====================================================
+-- 8. 计分考核表 (prison_score)
+-- =====================================================
+CREATE TABLE IF NOT EXISTS `prison_score` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+ `prisoner_id` bigint NOT NULL COMMENT '罪犯ID',
+ `prisoner_no` varchar(50) NOT NULL COMMENT '罪犯编号',
+ `year` int NOT NULL COMMENT '考核年份',
+ `month` int NOT NULL COMMENT '考核月份',
+ `base_score` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '基础分',
+ `reward_score` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '加分',
+ `penalty_score` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '扣分',
+ `total_score` decimal(10,2) NOT NULL COMMENT '总分',
+ `level` tinyint DEFAULT NULL COMMENT '考核等级:1-优秀 2-良好 3-合格 4-不合格',
+ `assessor_id` bigint DEFAULT NULL COMMENT '考核人ID',
+ `assessor_name` varchar(50) DEFAULT NULL COMMENT '考核人姓名',
+ `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-待审核 2-已通过 3-已驳回',
+ `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_prisoner_year_month` (`prisoner_no`, `year`, `month`),
+ KEY `idx_prison_score_prisoner_id` (`prisoner_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='计分考核表';
+
+-- =====================================================
+-- 菜单权限 SQL
+-- 注意: 请将 ${table.parentMenuId} 替换为实际的父菜单ID
+-- 监狱管理模块的父菜单ID通常为 2000 (系统管理) 或对应的监狱模块菜单ID
+-- =====================================================
+
+-- 获取监狱模块父菜单ID (假设为 2000,请根据实际情况调整)
+-- SELECT @parentId := 2000;
+
+-- 1. 监区信息管理菜单
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status, component_name)
+VALUES ('监区信息管理', '', 2, 1, 2000, 'area', '', 'prison/area/index', 0, 'Area');
+SELECT @areaParentId := LAST_INSERT_ID();
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('监区信息查询', 'prison:area:query', 3, 1, @areaParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('监区信息创建', 'prison:area:create', 3, 2, @areaParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('监区信息更新', 'prison:area:update', 3, 3, @areaParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('监区信息删除', 'prison:area:delete', 3, 4, @areaParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('监区信息导出', 'prison:area:export', 3, 5, @areaParentId, '', '', '', 0);
+
+-- 2. 监室信息管理菜单
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status, component_name)
+VALUES ('监室信息管理', '', 2, 2, 2000, 'cell', '', 'prison/cell/index', 0, 'Cell');
+SELECT @cellParentId := LAST_INSERT_ID();
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('监室信息查询', 'prison:cell:query', 3, 1, @cellParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('监室信息创建', 'prison:cell:create', 3, 2, @cellParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('监室信息更新', 'prison:cell:update', 3, 3, @cellParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('监室信息删除', 'prison:cell:delete', 3, 4, @cellParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('监室信息导出', 'prison:cell:export', 3, 5, @cellParentId, '', '', '', 0);
+
+-- 3. 消费记录管理菜单
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status, component_name)
+VALUES ('消费记录管理', '', 2, 3, 2000, 'consumption', '', 'prison/consumption/index', 0, 'Consumption');
+SELECT @consumptionParentId := LAST_INSERT_ID();
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('消费记录查询', 'prison:consumption:query', 3, 1, @consumptionParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('消费记录创建', 'prison:consumption:create', 3, 2, @consumptionParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('消费记录更新', 'prison:consumption:update', 3, 3, @consumptionParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('消费记录删除', 'prison:consumption:delete', 3, 4, @consumptionParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('消费记录导出', 'prison:consumption:export', 3, 5, @consumptionParentId, '', '', '', 0);
+
+-- 4. 问卷模板管理菜单
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status, component_name)
+VALUES ('问卷模板管理', '', 2, 4, 2000, 'questionnaire', '', 'prison/questionnaire/index', 0, 'Questionnaire');
+SELECT @questionnaireParentId := LAST_INSERT_ID();
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('问卷模板查询', 'prison:questionnaire:query', 3, 1, @questionnaireParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('问卷模板创建', 'prison:questionnaire:create', 3, 2, @questionnaireParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('问卷模板更新', 'prison:questionnaire:update', 3, 3, @questionnaireParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('问卷模板删除', 'prison:questionnaire:delete', 3, 4, @questionnaireParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('问卷模板导出', 'prison:questionnaire:export', 3, 5, @questionnaireParentId, '', '', '', 0);
+
+-- 5. 问卷问题管理菜单
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status, component_name)
+VALUES ('问卷问题管理', '', 2, 5, 2000, 'question', '', 'prison/question/index', 0, 'Question');
+SELECT @questionParentId := LAST_INSERT_ID();
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('问卷问题查询', 'prison:question:query', 3, 1, @questionParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('问卷问题创建', 'prison:question:create', 3, 2, @questionParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('问卷问题更新', 'prison:question:update', 3, 3, @questionParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('问卷问题删除', 'prison:question:delete', 3, 4, @questionParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('问卷问题导出', 'prison:question:export', 3, 5, @questionParentId, '', '', '', 0);
+
+-- 6. 问卷答题记录管理菜单
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status, component_name)
+VALUES ('问卷答题记录管理', '', 2, 6, 2000, 'questionnaire-record', '', 'prison/questionnairerecord/index', 0, 'QuestionnaireRecord');
+SELECT @recordParentId := LAST_INSERT_ID();
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('问卷答题记录查询', 'prison:questionnaire-record:query', 3, 1, @recordParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('问卷答题记录创建', 'prison:questionnaire-record:create', 3, 2, @recordParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('问卷答题记录更新', 'prison:questionnaire-record:update', 3, 3, @recordParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('问卷答题记录删除', 'prison:questionnaire-record:delete', 3, 4, @recordParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('问卷答题记录导出', 'prison:questionnaire-record:export', 3, 5, @recordParentId, '', '', '', 0);
+
+-- 7. 危险评估管理菜单
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status, component_name)
+VALUES ('危险评估管理', '', 2, 7, 2000, 'risk-assessment', '', 'prison/riskassessment/index', 0, 'RiskAssessment');
+SELECT @riskParentId := LAST_INSERT_ID();
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('危险评估查询', 'prison:risk-assessment:query', 3, 1, @riskParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('危险评估创建', 'prison:risk-assessment:create', 3, 2, @riskParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('危险评估更新', 'prison:risk-assessment:update', 3, 3, @riskParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('危险评估删除', 'prison:risk-assessment:delete', 3, 4, @riskParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('危险评估导出', 'prison:risk-assessment:export', 3, 5, @riskParentId, '', '', '', 0);
+
+-- 8. 计分考核管理菜单
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status, component_name)
+VALUES ('计分考核管理', '', 2, 8, 2000, 'score', '', 'prison/score/index', 0, 'Score');
+SELECT @scoreParentId := LAST_INSERT_ID();
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('计分考核查询', 'prison:score:query', 3, 1, @scoreParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('计分考核创建', 'prison:score:create', 3, 2, @scoreParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('计分考核更新', 'prison:score:update', 3, 3, @scoreParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('计分考核删除', 'prison:score:delete', 3, 4, @scoreParentId, '', '', '', 0);
+INSERT INTO system_menu (name, permission, type, sort, parent_id, path, icon, component, status)
+VALUES ('计分考核导出', 'prison:score:export', 3, 5, @scoreParentId, '', '', '', 0);
diff --git a/yudao-module-temp b/yudao-module-temp
new file mode 160000
index 0000000000..bf6875adf6
--- /dev/null
+++ b/yudao-module-temp
@@ -0,0 +1 @@
+Subproject commit bf6875adf6a99d90ca95f84a6045aea1cc8779c8
diff --git a/yudao-server/pom.xml b/yudao-server/pom.xml
index 97ee0daf38..7d03bc6372 100644
--- a/yudao-server/pom.xml
+++ b/yudao-server/pom.xml
@@ -115,6 +115,13 @@
+
+
+ cn.iocoder.boot
+ yudao-module-prison
+ ${revision}
+
+
org.springframework.boot
diff --git a/yudao-server/src/main/resources/application-local.yaml b/yudao-server/src/main/resources/application-local.yaml
index f9234cecfa..f8fa7dcfcc 100644
--- a/yudao-server/src/main/resources/application-local.yaml
+++ b/yudao-server/src/main/resources/application-local.yaml
@@ -47,7 +47,7 @@ spring:
primary: master
datasource:
master:
- url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ url: jdbc:mysql://192.168.10.130:3306/xlcp_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
# url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=true&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true # MySQL Connector/J 5.X 连接的示例
# url: jdbc:postgresql://127.0.0.1:5432/ruoyi-vue-pro # PostgreSQL 连接的示例
# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例
@@ -55,8 +55,8 @@ spring:
# url: jdbc:dm://127.0.0.1:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
# url: jdbc:kingbase8://127.0.0.1:54321/test # 人大金仓 KingbaseES 连接的示例
# url: jdbc:postgresql://127.0.0.1:5432/postgres # OpenGauss 连接的示例
- username: root
- password: 123456
+ username: xlcp_dev
+ password: xlcp_dev
# username: sa # SQL Server 连接的示例
# password: Yudao@2024 # SQL Server 连接的示例
# username: SYSDBA # DM 连接的示例
@@ -66,8 +66,8 @@ spring:
slave: # 模拟从库,可根据自己需要修改
lazy: true # 开启懒加载,保证启动速度
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true
- username: root
- password: 123456
+ username: xlcp_dev
+ password: xlcp_dev
# tdengine: # IoT 数据库(需要 IoT 物联网再开启噢!)
# url: jdbc:TAOS-WS://127.0.0.1:6041/ruoyi_vue_pro
# driver-class-name: com.taosdata.jdbc.ws.WebSocketDriver
@@ -79,10 +79,10 @@ spring:
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
data:
redis:
- host: 127.0.0.1 # 地址
- port: 6379 # 端口
- database: 0 # 数据库索引
-# password: dev # 密码,建议生产环境开启
+ host: 192.168.10.130
+ port: 6379
+ database: 0
+ password: redis_8a8EYH
--- #################### 定时任务相关配置 ####################
@@ -229,6 +229,7 @@ yudao:
enable: false # 本地环境,暂时关闭图片验证码,方便登录等接口的测试;
security:
mock-enable: true
+ mock-secret: emsoft
pay:
order-notify-url: https://yutou.mynatapp.cc/admin-api/pay/notify/order # 支付渠道的【支付】回调地址
refund-notify-url: https://yutou.mynatapp.cc/admin-api/pay/notify/refund # 支付渠道的【退款】回调地址