From b52aec1611a05000217ababce6dcc0fb688841c8 Mon Sep 17 00:00:00 2001
From: wsm <2746563060@侵权。>
Date: Thu, 9 Apr 2026 19:33:52 +0800
Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E5=BC=80=E6=BA=90=E7=89=88=E6=9C=AC?=
=?UTF-8?q?=E7=9A=84=E4=BF=AE=E6=94=B9=E6=89=93=E8=A1=A5=E4=B8=81=E5=BA=94?=
=?UTF-8?q?=E7=94=A8=E5=88=B0=E5=95=86=E4=B8=9A=E7=89=88?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 1 +
README.md | 35 ++
jeecg-boot-base-core/pom.xml | 1 +
.../common/aspect/CascadeDeleteAspect.java | 75 +++
.../aspect/annotation/CascadeDelete.java | 11 +
.../common/aspect/annotation/SonTable.java | 16 +
.../org/jeecg/common/system/vo/LoginUser.java | 9 +
.../java/org/jeecg/common/util/MinioUtil.java | 316 +++++++++++
.../org/jeecg/common/util/SecureUtils.java | 44 ++
jeecg-module-supervision/pom.xml | 24 +
.../check/controller/DjCheckController.java | 182 +++++++
.../modules/demo/check/entity/DjCheck.java | 105 ++++
.../demo/check/mapper/DjCheckMapper.java | 17 +
.../demo/check/mapper/xml/DjCheckMapper.xml | 5 +
.../demo/check/service/IDjCheckService.java | 14 +
.../service/impl/DjCheckServiceImpl.java | 19 +
.../DjDemoLifeMeetingController.java | 182 +++++++
.../demoMetting/entity/DjDemoLifeMeeting.java | 114 ++++
.../mapper/DjDemoLifeMeetingMapper.java | 17 +
.../mapper/xml/DjDemoLifeMeetingMapper.xml | 5 +
.../service/IDjDemoLifeMeetingService.java | 14 +
.../impl/DjDemoLifeMeetingServiceImpl.java | 19 +
.../controller/DjPeopleServiceController.java | 182 +++++++
.../peopleService/entity/DjPeopleService.java | 92 ++++
.../mapper/DjPeopleServiceMapper.java | 17 +
.../mapper/xml/DjPeopleServiceMapper.xml | 5 +
.../service/IDjPeopleServiceService.java | 14 +
.../impl/DjPeopleServiceServiceImpl.java | 19 +
.../DjInspectionRectifyListController.java | 298 ++++++++++
.../entity/DjInspectionRectifyList.java | 126 +++++
.../mapper/DjInspectionRectifyListMapper.java | 35 ++
.../xml/DjInspectionRectifyListMapper.xml | 25 +
.../IDjInspectionRectifyListService.java | 74 +++
.../DjInspectionRectifyListServiceImpl.java | 219 ++++++++
.../controller/SupervisionTestController.java | 182 +++++++
.../entity/SupervisionTest.java | 89 +++
.../mapper/SupervisionTestMapper.java | 17 +
.../mapper/xml/SupervisionTestMapper.xml | 5 +
.../service/ISupervisionTestService.java | 14 +
.../impl/SupervisionTestServiceImpl.java | 19 +
.../controller/DjMeetingRecordController.java | 182 +++++++
.../tzMetting/entity/DjMeetingRecord.java | 92 ++++
.../mapper/DjMeetingRecordMapper.java | 17 +
.../mapper/xml/DjMeetingRecordMapper.xml | 5 +
.../service/IDjMeetingRecordService.java | 14 +
.../impl/DjMeetingRecordServiceImpl.java | 19 +
.../controller/TestMainTableController.java | 270 ++++++++++
.../modules/test/entity/TestMainTable.java | 65 +++
.../modules/test/entity/TestSonTable.java | 62 +++
.../test/mapper/TestMainTableMapper.java | 17 +
.../test/mapper/TestSonTableMapper.java | 31 ++
.../test/mapper/xml/TestMainTableMapper.xml | 5 +
.../test/mapper/xml/TestSonTableMapper.xml | 16 +
.../test/service/ITestMainTableService.java | 48 ++
.../test/service/ITestSonTableService.java | 22 +
.../impl/TestMainTableServiceImpl.java | 83 +++
.../service/impl/TestSonTableServiceImpl.java | 27 +
.../modules/test/vo/TestMainTablePage.java | 64 +++
.../controller/TestMainTableController.java | 270 ++++++++++
.../src/test/entity/TestMainTable.java | 65 +++
.../src/test/entity/TestSonTable.java | 62 +++
.../src/test/mapper/TestMainTableMapper.java | 17 +
.../src/test/mapper/TestSonTableMapper.java | 31 ++
.../test/mapper/xml/TestMainTableMapper.xml | 5 +
.../test/mapper/xml/TestSonTableMapper.xml | 16 +
.../test/service/ITestMainTableService.java | 48 ++
.../test/service/ITestSonTableService.java | 22 +
.../impl/TestMainTableServiceImpl.java | 82 +++
.../service/impl/TestSonTableServiceImpl.java | 27 +
.../src/test/vo/TestMainTablePage.java | 64 +++
.../src/test/vue3/TestMainTable.api.ts | 71 +++
.../src/test/vue3/TestMainTable.data.ts | 81 +++
.../src/test/vue3/TestMainTableList.vue | 207 +++++++
.../vue3/components/TestMainTableForm.vue | 115 ++++
.../vue3/components/TestMainTableModal.vue | 144 +++++
.../test/vue3/components/TestSonTableForm.vue | 79 +++
.../jeecg/common/system/api/ISysBaseAPI.java | 18 +
.../system/controller/FileController.java | 507 ++++++++++++++++++
.../controller/SysDepartController.java | 51 +-
.../SysFileAttachmentController.java | 182 +++++++
.../system/controller/SysRoleController.java | 315 +++++++----
.../system/controller/SysUserController.java | 127 ++++-
.../jeecg/modules/system/dto/DeptRoleVO.java | 15 +
.../modules/system/dto/UserDeptSaveDTO.java | 15 +
.../modules/system/entity/SysDepart.java | 7 +-
.../system/entity/SysFileAttachment.java | 132 +++++
.../jeecg/modules/system/entity/SysUser.java | 22 +-
.../modules/system/entity/SysUserRole.java | 5 +
.../mapper/SysFileAttachmentMapper.java | 17 +
.../system/mapper/SysUserDepartMapper.java | 15 +-
.../modules/system/mapper/SysUserMapper.java | 26 +-
.../system/mapper/SysUserRoleMapper.java | 6 +
.../mapper/xml/SysFileAttachmentMapper.xml | 5 +
.../system/mapper/xml/SysUserDepartMapper.xml | 17 +
.../system/mapper/xml/SysUserMapper.xml | 43 +-
.../system/model/SysDepartTreeModel.java | 14 +-
.../system/service/ISysDepartService.java | 4 +
.../service/ISysFileAttachmentService.java | 14 +
.../system/service/ISysRoleService.java | 9 +
.../system/service/ISysUserDepartService.java | 19 +-
.../system/service/ISysUserService.java | 14 +
.../system/service/impl/SysBaseApiImpl.java | 258 +++++++++
.../service/impl/SysDepartServiceImpl.java | 31 ++
.../impl/SysFileAttachmentServiceImpl.java | 19 +
.../service/impl/SysRoleServiceImpl.java | 12 +
.../impl/SysUserDepartServiceImpl.java | 146 ++++-
.../service/impl/SysUserServiceImpl.java | 33 +-
.../modules/system/vo/SysUserRoleDeptsVo.java | 20 +
.../jeecg-system-start/pom.xml | 6 +
.../src/main/resources/application-dev.yml | 1 +
pom.xml | 263 ++++-----
111 files changed, 7215 insertions(+), 275 deletions(-)
create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/CascadeDeleteAspect.java
create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/CascadeDelete.java
create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/SonTable.java
create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SecureUtils.java
create mode 100644 jeecg-module-supervision/pom.xml
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/controller/DjCheckController.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/entity/DjCheck.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/mapper/DjCheckMapper.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/mapper/xml/DjCheckMapper.xml
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/service/IDjCheckService.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/service/impl/DjCheckServiceImpl.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/controller/DjDemoLifeMeetingController.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/entity/DjDemoLifeMeeting.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/mapper/DjDemoLifeMeetingMapper.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/mapper/xml/DjDemoLifeMeetingMapper.xml
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/service/IDjDemoLifeMeetingService.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/service/impl/DjDemoLifeMeetingServiceImpl.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/controller/DjPeopleServiceController.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/entity/DjPeopleService.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/mapper/DjPeopleServiceMapper.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/mapper/xml/DjPeopleServiceMapper.xml
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/service/IDjPeopleServiceService.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/service/impl/DjPeopleServiceServiceImpl.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/controller/DjInspectionRectifyListController.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/entity/DjInspectionRectifyList.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/mapper/DjInspectionRectifyListMapper.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/mapper/xml/DjInspectionRectifyListMapper.xml
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/service/IDjInspectionRectifyListService.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/service/impl/DjInspectionRectifyListServiceImpl.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/controller/SupervisionTestController.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/entity/SupervisionTest.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/mapper/SupervisionTestMapper.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/mapper/xml/SupervisionTestMapper.xml
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/service/ISupervisionTestService.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/service/impl/SupervisionTestServiceImpl.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/controller/DjMeetingRecordController.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/entity/DjMeetingRecord.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/mapper/DjMeetingRecordMapper.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/mapper/xml/DjMeetingRecordMapper.xml
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/service/IDjMeetingRecordService.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/service/impl/DjMeetingRecordServiceImpl.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/test/controller/TestMainTableController.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/test/entity/TestMainTable.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/test/entity/TestSonTable.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/TestMainTableMapper.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/TestSonTableMapper.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/xml/TestMainTableMapper.xml
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/xml/TestSonTableMapper.xml
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/ITestMainTableService.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/ITestSonTableService.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/impl/TestMainTableServiceImpl.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/impl/TestSonTableServiceImpl.java
create mode 100644 jeecg-module-supervision/src/main/java/org/jeecg/modules/test/vo/TestMainTablePage.java
create mode 100644 jeecg-module-supervision/src/test/controller/TestMainTableController.java
create mode 100644 jeecg-module-supervision/src/test/entity/TestMainTable.java
create mode 100644 jeecg-module-supervision/src/test/entity/TestSonTable.java
create mode 100644 jeecg-module-supervision/src/test/mapper/TestMainTableMapper.java
create mode 100644 jeecg-module-supervision/src/test/mapper/TestSonTableMapper.java
create mode 100644 jeecg-module-supervision/src/test/mapper/xml/TestMainTableMapper.xml
create mode 100644 jeecg-module-supervision/src/test/mapper/xml/TestSonTableMapper.xml
create mode 100644 jeecg-module-supervision/src/test/service/ITestMainTableService.java
create mode 100644 jeecg-module-supervision/src/test/service/ITestSonTableService.java
create mode 100644 jeecg-module-supervision/src/test/service/impl/TestMainTableServiceImpl.java
create mode 100644 jeecg-module-supervision/src/test/service/impl/TestSonTableServiceImpl.java
create mode 100644 jeecg-module-supervision/src/test/vo/TestMainTablePage.java
create mode 100644 jeecg-module-supervision/src/test/vue3/TestMainTable.api.ts
create mode 100644 jeecg-module-supervision/src/test/vue3/TestMainTable.data.ts
create mode 100644 jeecg-module-supervision/src/test/vue3/TestMainTableList.vue
create mode 100644 jeecg-module-supervision/src/test/vue3/components/TestMainTableForm.vue
create mode 100644 jeecg-module-supervision/src/test/vue3/components/TestMainTableModal.vue
create mode 100644 jeecg-module-supervision/src/test/vue3/components/TestSonTableForm.vue
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/FileController.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysFileAttachmentController.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/dto/DeptRoleVO.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/dto/UserDeptSaveDTO.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysFileAttachment.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/SysFileAttachmentMapper.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysFileAttachmentMapper.xml
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/ISysFileAttachmentService.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysFileAttachmentServiceImpl.java
create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/vo/SysUserRoleDeptsVo.java
diff --git a/.gitignore b/.gitignore
index d498a38..0cddd63 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,7 @@ rebel.xml
## backend
**/target
**/logs
+**/yml
## front
**/*.lock
diff --git a/README.md b/README.md
index 5b8e415..8a7ebab 100644
--- a/README.md
+++ b/README.md
@@ -85,6 +85,41 @@ Docker快速启动项目
- [Docker启动微服务后台](https://help.jeecg.com/java/springcloud/docker.html)
+git提交规范
+-----------------------------------
+姓名-前端/后端/AI-日期-新增功能/bug修复-代码提交描述
+
+- demo: yxk-前端-20260327-新增功能-上传文件功能
+
+
+git提交规范
+-----------------------------------
+姓名-前端/后端/AI-日期-新增功能/bug修复-代码提交描述
+
+- demo: yxk-前端-20260327-新增功能-上传文件功能
+
+
+git提交规范
+-----------------------------------
+姓名-前端/后端/AI-日期-新增功能/bug修复-代码提交描述
+
+- demo: yxk-前端-20260327-新增功能-上传文件功能
+
+
+git提交规范
+-----------------------------------
+姓名-前端/后端/AI-日期-新增功能/bug修复-代码提交描述
+
+- demo: yxk-前端-20260327-新增功能-上传文件功能
+
+
+git提交规范
+-----------------------------------
+姓名-前端/后端/AI-日期-新增功能/bug修复-代码提交描述
+
+- demo: yxk-前端-20260327-新增功能-上传文件功能
+
+
技术文档
-----------------------------------
diff --git a/jeecg-boot-base-core/pom.xml b/jeecg-boot-base-core/pom.xml
index c03a8fb..cc16906 100644
--- a/jeecg-boot-base-core/pom.xml
+++ b/jeecg-boot-base-core/pom.xml
@@ -8,6 +8,7 @@
4.0.0
jeecg-boot-base-core
+ 3.8.1
diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/CascadeDeleteAspect.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/CascadeDeleteAspect.java
new file mode 100644
index 0000000..f354fc8
--- /dev/null
+++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/CascadeDeleteAspect.java
@@ -0,0 +1,75 @@
+package org.jeecg.common.aspect;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.jeecg.common.aspect.annotation.CascadeDelete;
+import org.jeecg.common.aspect.annotation.SonTable;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+@Slf4j
+@Aspect
+@Component
+public class CascadeDeleteAspect {
+
+ @Autowired
+ private ApplicationContext context;
+
+ /**
+ * 环绕通知:通过 REQUIRED 传播属性确保事务一致性
+ */
+ @Around("@annotation(cascadeDelete)")
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)//已完成测试,子表删除时抛出异常主表会一起回滚
+ public Object doCascadeDelete(ProceedingJoinPoint joinPoint, CascadeDelete cascadeDelete) throws Throwable {
+ // 1. 获取主表 ID (约定第一个参数)
+ Object[] args = joinPoint.getArgs();
+ if (args == null || args.length == 0 || args[0] == null) {
+ return joinPoint.proceed();
+ }
+ String mainId = args[0].toString();
+
+ // 2. 执行子表逻辑删除
+ // 因为标记了 @Transactional,这里的删除操作会自动进入事务
+ for (SonTable son : cascadeDelete.sons()) {
+ Object mapper = context.getBean(son.mapper());
+ executeDelete(mapper, son.joinColumn(), mainId);
+ log.info("级联删除子表 [{}] 成功", son.mapper().getSimpleName());
+ }
+ // 3. 执行主表删除逻辑
+ if (true) {
+ throw new RuntimeException("模拟子表删除异常,触发回滚!");
+ }
+ // 如果主表 Service 抛出异常,整个事务(含上面的子表删除)都会回滚
+ return joinPoint.proceed();
+ }
+
+ /**
+ * 辅助方法:解决 MyBatis-Plus 泛型注入问题
+ */
+ @SuppressWarnings("unchecked")
+ private void executeDelete(Object mapper, String column, Object value) {
+ if (mapper instanceof BaseMapper) {
+ BaseMapper baseMapper = (BaseMapper) mapper;
+ QueryWrapper wrapper = new QueryWrapper<>();
+ wrapper.eq(column, value);
+ baseMapper.delete(wrapper);
+ }
+ }
+}
+// 使用方法如下
+//@Override
+//@Transactional(rollbackFor = Exception.class)
+//@CascadeDelete(sons = {
+// // 配置子表1:Mapper类 + 子表中关联主表的字段名
+// @SonTable(mapper = TestSonTableMapper.class, joinColumn = "main_table_id"),
+//})
+//public void delMain(String id) {
+// testMainTableMapper.deleteById(id);
+//}
\ No newline at end of file
diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/CascadeDelete.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/CascadeDelete.java
new file mode 100644
index 0000000..d450151
--- /dev/null
+++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/CascadeDelete.java
@@ -0,0 +1,11 @@
+package org.jeecg.common.aspect.annotation;
+
+import java.lang.annotation.*;
+
+@Target(ElementType.METHOD) // 作用在方法上
+@Retention(RetentionPolicy.RUNTIME) // 运行时可见
+@Documented
+public @interface CascadeDelete {
+ // 子表配置数组,支持一个主表对应多个子表
+ SonTable[] sons();
+}
diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/SonTable.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/SonTable.java
new file mode 100644
index 0000000..1001cbb
--- /dev/null
+++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/annotation/SonTable.java
@@ -0,0 +1,16 @@
+package org.jeecg.common.aspect.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.ANNOTATION_TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface SonTable {
+ // 子表 Mapper 的类对象
+ Class> mapper();
+
+ // 子表中关联主表 ID 的字段名(数据库字段名,如 main_id)
+ String joinColumn();
+}
\ No newline at end of file
diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java
index 32d4b49..5b7bc50 100644
--- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java
+++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/system/vo/LoginUser.java
@@ -138,4 +138,13 @@ public class LoginUser {
/**设备id uniapp推送用*/
private String clientId;
+
+ /**人员密级*/
+
+ private Integer userSecurityLevel;
+
+ /**
+ * 人员密级
+ */
+ private Integer isSpecial;
}
diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MinioUtil.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MinioUtil.java
index d5a13c0..7705e87 100644
--- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MinioUtil.java
+++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/MinioUtil.java
@@ -8,8 +8,13 @@ import org.jeecg.common.util.filter.SsrfFileTypeFilter;
import org.jeecg.common.util.filter.StrAttackFilter;
import org.springframework.web.multipart.MultipartFile;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
import java.io.InputStream;
import java.net.URLDecoder;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
/**
* minio文件上传工具类
@@ -221,4 +226,315 @@ public class MinioUtil {
return minioUrl+bucketName+"/"+relativePath;
}
+
+ /**
+ * 文件加密上传
+ *
+ * @param file
+ * @param bizPath
+ * @return
+ */
+ public static String encryptUpload(MultipartFile file, String bizPath) {
+ return encryptUpload(file, bizPath, null);
+ }
+ /**
+ * 加密上传文件(带年份,文件名)
+ *
+ * @param file
+ * @return
+ */
+ public static String encryptUpload(File file, String bizPath, String customBucket, String year, String fileName) {
+ String file_url = "";
+ //update-begin-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击
+ bizPath = StrAttackFilter.filter(bizPath);
+ // fileName = StrAttackFilter.filter(fileName);
+ //update-end-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击
+ String newBucket = bucketName;
+ if (oConvertUtils.isNotEmpty(customBucket)) {
+ newBucket = customBucket;
+ }
+ try {
+ initMinio(minioUrl, minioName, minioPass);
+ // 检查存储桶是否已经存在
+ if (minioClient.bucketExists(BucketExistsArgs.builder().bucket(newBucket).build())) {
+ log.info("Bucket already exists.");
+ } else {
+ // 创建一个名为ota的存储桶
+ minioClient.makeBucket(MakeBucketArgs.builder().bucket(newBucket).build());
+ log.info("create a new bucket.");
+ }
+ //update-begin-author:liusq date:20210809 for: 过滤上传文件类型
+ //FileTypeFilter.fileTypeFilter(file);
+ //SecretKey key = AESUtil.getKeyFromString(AES_KEY);
+ MultipartFile multipartFile = (MultipartFile) file;
+ byte[] fileBytes = multipartFile.getBytes();
+ fileBytes = SecureUtils.encrypt(fileBytes);
+ InputStream stream = new ByteArrayInputStream(fileBytes);
+ /*
+ 原公文系统的加密
+ InputStream inputStream = new FileInputStream(file);
+ InputStream stream = inputStreamEncrypt(inputStream);
+ */
+
+
+ //update-end-author:liusq date:20210809 for: 过滤上传文件类型
+ //InputStream stream = file.getInputStream();
+ // 获取文件名
+ String orgName = fileName;
+ if ("".equals(orgName)) {
+ orgName = file.getName();
+ }
+ orgName = CommonUtils.getFileName(orgName);
+ String objectName = bizPath + "/"
+ + (orgName.indexOf(".") == -1
+ ? orgName + "_" + System.currentTimeMillis()
+ : orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf("."))
+ );
+
+ // 使用putObject上传一个本地文件到存储桶中。
+ if (objectName.startsWith("/")) {
+ objectName = objectName.substring(1);
+ }
+
+
+ PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName)
+ .bucket(newBucket)
+ .contentType("application/octet-stream")
+ .stream(stream, stream.available(), -1).build();
+ minioClient.putObject(objectArgs);
+ stream.close();
+ file_url = "/" + objectName;
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ }
+ return file_url;
+ }
+ /**
+ * 加密上传文件(带年份)
+ *
+ * @param file
+ * @return
+ */
+ public static String encryptUpload(File file, String bizPath, String customBucket, String year) {
+ String file_url = "";
+ //update-begin-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击
+ bizPath = StrAttackFilter.filter(bizPath);
+ //update-end-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击
+ String newBucket = bucketName;
+ if (oConvertUtils.isNotEmpty(customBucket)) {
+ newBucket = customBucket;
+ }
+ try {
+ initMinio(minioUrl, minioName, minioPass);
+ // 检查存储桶是否已经存在
+ if (minioClient.bucketExists(BucketExistsArgs.builder().bucket(newBucket).build())) {
+ log.info("Bucket already exists.");
+ } else {
+ // 创建一个名为ota的存储桶
+ minioClient.makeBucket(MakeBucketArgs.builder().bucket(newBucket).build());
+ log.info("create a new bucket.");
+ }
+ //update-begin-author:liusq date:20210809 for: 过滤上传文件类型
+ //FileTypeFilter.fileTypeFilter(file);
+ //SecretKey key = AESUtil.getKeyFromString(AES_KEY);
+ MultipartFile multipartFile = (MultipartFile) file;
+ byte[] fileBytes = multipartFile.getBytes();
+ fileBytes = SecureUtils.encrypt(fileBytes);
+ InputStream stream = new ByteArrayInputStream(fileBytes);
+ /*
+ 原公文系统的加密
+ InputStream inputStream = new FileInputStream(file);
+ InputStream stream = inputStreamEncrypt(inputStream);
+ */
+
+ //update-end-author:liusq date:20210809 for: 过滤上传文件类型
+ //InputStream stream = file.getInputStream();
+ // 获取文件名
+ String orgName = file.getName();
+ if ("".equals(orgName)) {
+ orgName = file.getName();
+ }
+ orgName = CommonUtils.getFileName(orgName);
+ String objectName = bizPath + "/"
+ + (orgName.indexOf(".") == -1
+ ? orgName + "_" + System.currentTimeMillis()
+ : orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf("."))
+ );
+
+ // 使用putObject上传一个本地文件到存储桶中。
+ if (objectName.startsWith("/")) {
+ objectName = objectName.substring(1);
+ }
+
+
+ PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName)
+ .bucket(newBucket)
+ .contentType("application/octet-stream")
+ .stream(stream, stream.available(), -1).build();
+ minioClient.putObject(objectArgs);
+ stream.close();
+ file_url = "/" + objectName;
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ }
+ return file_url;
+ }
+
+ /**
+ * 加密上传文件
+ *
+ * @param file
+ * @return
+ */
+ public static String encryptUpload(MultipartFile file, String bizPath, String customBucket) {
+ String file_url = "";
+ //update-begin-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击
+ bizPath = StrAttackFilter.filter(bizPath);
+ //update-end-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击
+ String newBucket = bucketName;
+ if (oConvertUtils.isNotEmpty(customBucket)) {
+ newBucket = customBucket;
+ }
+ try {
+ initMinio(minioUrl, minioName, minioPass);
+ // 检查存储桶是否已经存在
+ if (minioClient.bucketExists(BucketExistsArgs.builder().bucket(newBucket).build())) {
+ log.info("Bucket already exists.");
+ } else {
+ // 创建一个名为ota的存储桶
+ minioClient.makeBucket(MakeBucketArgs.builder().bucket(newBucket).build());
+ log.info("create a new bucket.");
+ }
+ //update-begin-author:liusq date:20210809 for: 过滤上传文件类型
+ SsrfFileTypeFilter.checkUploadFileType(file);
+ //SecretKey key = AESUtil.getKeyFromString(AES_KEY);
+ byte[] fileBytes = file.getBytes();
+ fileBytes = SecureUtils.encrypt(fileBytes);
+ InputStream stream = new ByteArrayInputStream(fileBytes);
+ /*
+ 原公文系统的加密
+ InputStream inputStream = new FileInputStream(file);
+ InputStream stream = inputStreamEncrypt(inputStream);
+ */
+
+ //update-end-author:liusq date:20210809 for: 过滤上传文件类型
+ //InputStream stream = file.getInputStream();
+ // 获取文件名
+ String orgName = file.getOriginalFilename();
+ if ("".equals(orgName)) {
+ orgName = file.getName();
+ }
+ orgName = CommonUtils.getFileName(orgName);
+ String objectName = bizPath + "/"
+ + (orgName.indexOf(".") == -1
+ ? orgName + "_" + System.currentTimeMillis()
+ : orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.lastIndexOf("."))
+ );
+
+ // 使用putObject上传一个本地文件到存储桶中。
+ if (objectName.startsWith("/")) {
+ objectName = objectName.substring(1);
+ }
+
+
+ PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName)
+ .bucket(newBucket)
+ .contentType("application/octet-stream")
+ .stream(stream, stream.available(), -1).build();
+ minioClient.putObject(objectArgs);
+ stream.close();
+ file_url = objectName;
+// file_url = minioUrl + newBucket + "/" + objectName;
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ }
+ return file_url;
+ }
+
+
+// /*
+//获取文件元数据
+// */
+// public static String getLastModifiedTime(String objectName) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
+// initMinio(minioUrl, minioName, minioPass);
+// StatObjectResponse statObjectResponse = minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());
+//
+// return String.valueOf(statObjectResponse.lastModified().toInstant().toEpochMilli()) ;
+//
+// }
+// /*
+// 判断文件是否存在
+// */
+// public static String checkFileExistence( String objectName) {
+// try {
+// initMinio(minioUrl, minioName, minioPass);
+//
+// // 使用 StatObject 来获取对象的元数据,判断文件是否存在
+// StatObjectResponse statObjectResponse = minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());
+//
+// // 如果没有异常抛出,文件存在,返回 1
+// return minioUrl + bucketName + "/"+objectName;
+// } catch (MinioException e) {
+// // 如果文件不存在或发生错误,返回 0
+// return "0";
+// } catch (Exception e) {
+// // 捕获其他异常,返回 0
+// return "0";
+// }
+// }
+
+ /**
+ * 上传并更新文件
+ *
+ * @param file
+ * @return
+ */
+ public static String uploadUpdate(MultipartFile file, String objectName, String customBucket) {
+ String file_url = "";
+ //update-begin-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击
+// objectName = StrAttackFilter.filter(objectName);
+ //update-end-author:wangshuai date:20201012 for: 过滤上传文件夹名特殊字符,防止攻击
+ String newBucket = bucketName;
+ if (oConvertUtils.isNotEmpty(customBucket)) {
+ newBucket = customBucket;
+ }
+ try {
+ initMinio(minioUrl, minioName, minioPass);
+ // 检查存储桶是否已经存在
+ if (minioClient.bucketExists(BucketExistsArgs.builder().bucket(newBucket).build())) {
+ log.info("Bucket already exists.");
+ } else {
+ // 创建一个名为ota的存储桶
+ minioClient.makeBucket(MakeBucketArgs.builder().bucket(newBucket).build());
+ log.info("create a new bucket.");
+ }
+ //update-begin-author:liusq date:20210809 for: 过滤上传文件类型
+ SsrfFileTypeFilter.checkUploadFileType(file);
+ //update-end-author:liusq date:20210809 for: 过滤上传文件类型
+
+ // 以下为管理信息化系统加密
+ byte[] fileBytes = file.getBytes();
+ fileBytes = SecureUtils.encrypt(fileBytes);
+ InputStream stream = new ByteArrayInputStream(fileBytes);
+
+
+ // 使用putObject上传一个本地文件到存储桶中。
+ if (objectName.startsWith("/")) {
+ objectName = objectName.substring(1);
+ }
+ PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName)
+ .bucket(newBucket)
+ .contentType("application/octet-stream")
+ .stream(stream, stream.available(), -1).build();
+ minioClient.putObject(objectArgs);
+ stream.close();
+ file_url = objectName;
+// file_url = minioUrl + newBucket + "/" + objectName;
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ }
+ return file_url;
+ }
+
+
}
diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SecureUtils.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SecureUtils.java
new file mode 100644
index 0000000..28b5dff
--- /dev/null
+++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/SecureUtils.java
@@ -0,0 +1,44 @@
+package org.jeecg.common.util;
+
+import cn.hutool.crypto.SecureUtil;
+
+/*
+* @ClassName SecureUtils
+* @Description 功能说明: 对称加密工具类 aes、des对对称加密 ras非对称加密
+* 此为凌安公司在管理信息化系统中使用的加解密
+* 注意:密钥不要修改
+ */
+public class SecureUtils {
+ /**
+ * 密钥
+ */
+ private final static byte[] KEY = {-40, -1, 45, -41, -51, -34, -33, 56, -22, 88, -46, 113, 110, -61, -82, -84};
+
+ /**
+ * 解密文件内容
+ *
+ * @param fileContent 已加密的文件内容byte数组
+ * @return 解密的文件内容byte数组
+ */
+ public static byte[] decrypt(byte[] fileContent) {
+ if (fileContent == null) {
+ throw new RuntimeException("需要解密的文件内容不能为空");
+ }
+
+ return SecureUtil.aes(SecureUtils.KEY).decrypt(fileContent);
+ }
+
+ /**
+ * 加密文件内容
+ *
+ * @param fileContent 的文件内容byte数组
+ * @return 解密的文件内容byte数组
+ */
+ public static byte[] encrypt(byte[] fileContent) {
+ if (fileContent == null) {
+ throw new RuntimeException("需要加密的文件内容不能为空");
+ }
+
+ return SecureUtil.aes(SecureUtils.KEY).encrypt(fileContent);
+ }
+}
diff --git a/jeecg-module-supervision/pom.xml b/jeecg-module-supervision/pom.xml
new file mode 100644
index 0000000..af038ac
--- /dev/null
+++ b/jeecg-module-supervision/pom.xml
@@ -0,0 +1,24 @@
+
+
+
+ jeecg-boot-parent
+ org.jeecgframework.boot
+ 3.8.1
+
+ 4.0.0
+
+ jeecg-module-supervision
+ org.jeecgframework.boot
+ 3.8.1
+
+
+
+ org.jeecgframework.boot
+ jeecg-boot-base-core
+ 3.8.1
+
+
+
+
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/controller/DjCheckController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/controller/DjCheckController.java
new file mode 100644
index 0000000..319fd6e
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/controller/DjCheckController.java
@@ -0,0 +1,182 @@
+package org.jeecg.modules.demo.check.controller;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.query.QueryRuleEnum;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.demo.check.entity.DjCheck;
+import org.jeecg.modules.demo.check.service.IDjCheckService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+ /**
+ * @Description: 党建检查台账
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+@Tag(name="党建检查台账")
+@RestController
+@RequestMapping("/check/djCheck")
+@Slf4j
+public class DjCheckController extends JeecgController {
+ @Autowired
+ private IDjCheckService djCheckService;
+
+ /**
+ * 分页列表查询
+ *
+ * @param djCheck
+ * @param pageNo
+ * @param pageSize
+ * @param req
+ * @return
+ */
+ //@AutoLog(value = "党建检查台账-分页列表查询")
+ @Operation(summary="党建检查台账-分页列表查询")
+ @GetMapping(value = "/list")
+ public Result> queryPageList(DjCheck djCheck,
+ @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+ @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+ HttpServletRequest req) {
+
+
+ QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(djCheck, req.getParameterMap());
+ Page page = new Page(pageNo, pageSize);
+ IPage pageList = djCheckService.page(page, queryWrapper);
+ return Result.OK(pageList);
+ }
+
+ /**
+ * 添加
+ *
+ * @param djCheck
+ * @return
+ */
+ @AutoLog(value = "党建检查台账-添加")
+ @Operation(summary="党建检查台账-添加")
+ @RequiresPermissions("check:dj_check:add")
+ @PostMapping(value = "/add")
+ public Result add(@RequestBody DjCheck djCheck) {
+ djCheckService.save(djCheck);
+
+ return Result.OK("添加成功!");
+ }
+
+ /**
+ * 编辑
+ *
+ * @param djCheck
+ * @return
+ */
+ @AutoLog(value = "党建检查台账-编辑")
+ @Operation(summary="党建检查台账-编辑")
+ @RequiresPermissions("check:dj_check:edit")
+ @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+ public Result edit(@RequestBody DjCheck djCheck) {
+ djCheckService.updateById(djCheck);
+ return Result.OK("编辑成功!");
+ }
+
+ /**
+ * 通过id删除
+ *
+ * @param id
+ * @return
+ */
+ @AutoLog(value = "党建检查台账-通过id删除")
+ @Operation(summary="党建检查台账-通过id删除")
+ @RequiresPermissions("check:dj_check:delete")
+ @DeleteMapping(value = "/delete")
+ public Result delete(@RequestParam(name="id",required=true) String id) {
+ djCheckService.removeById(id);
+ return Result.OK("删除成功!");
+ }
+
+ /**
+ * 批量删除
+ *
+ * @param ids
+ * @return
+ */
+ @AutoLog(value = "党建检查台账-批量删除")
+ @Operation(summary="党建检查台账-批量删除")
+ @RequiresPermissions("check:dj_check:deleteBatch")
+ @DeleteMapping(value = "/deleteBatch")
+ public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+ this.djCheckService.removeByIds(Arrays.asList(ids.split(",")));
+ return Result.OK("批量删除成功!");
+ }
+
+ /**
+ * 通过id查询
+ *
+ * @param id
+ * @return
+ */
+ //@AutoLog(value = "党建检查台账-通过id查询")
+ @Operation(summary="党建检查台账-通过id查询")
+ @GetMapping(value = "/queryById")
+ public Result queryById(@RequestParam(name="id",required=true) String id) {
+ DjCheck djCheck = djCheckService.getById(id);
+ if(djCheck==null) {
+ return Result.error("未找到对应数据");
+ }
+ return Result.OK(djCheck);
+ }
+
+ /**
+ * 导出excel
+ *
+ * @param request
+ * @param djCheck
+ */
+ @RequiresPermissions("check:dj_check:exportXls")
+ @RequestMapping(value = "/exportXls")
+ public ModelAndView exportXls(HttpServletRequest request, DjCheck djCheck) {
+ return super.exportXls(request, djCheck, DjCheck.class, "党建检查台账");
+ }
+
+ /**
+ * 通过excel导入数据
+ *
+ * @param request
+ * @param response
+ * @return
+ */
+ @RequiresPermissions("check:dj_check:importExcel")
+ @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+ public Result> importExcel(HttpServletRequest request, HttpServletResponse response) {
+ return super.importExcel(request, response, DjCheck.class);
+ }
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/entity/DjCheck.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/entity/DjCheck.java
new file mode 100644
index 0000000..55f668e
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/entity/DjCheck.java
@@ -0,0 +1,105 @@
+package org.jeecg.modules.demo.check.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import org.jeecg.common.constant.ProvinceCityArea;
+import org.jeecg.common.util.SpringContextUtils;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: 党建检查台账
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+@Data
+@TableName("dj_check")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description="党建检查台账")
+public class DjCheck implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**主键*/
+ @TableId(type = IdType.ASSIGN_ID)
+ @Schema(description = "主键")
+ private java.lang.String id;
+ /**创建人*/
+ @Schema(description = "创建人")
+ private java.lang.String createBy;
+ /**创建日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "创建日期")
+ private java.util.Date createTime;
+ /**更新人*/
+ @Schema(description = "更新人")
+ private java.lang.String updateBy;
+ /**更新日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "更新日期")
+ private java.util.Date updateTime;
+ /**所属部门*/
+ @Schema(description = "所属部门")
+ private java.lang.String sysOrgCode;
+ /**序号*/
+ @Excel(name = "序号", width = 15)
+ @Schema(description = "序号")
+ private java.lang.Integer sortNo;
+ /**一级指标*/
+ @Excel(name = "一级指标", width = 15)
+ @Schema(description = "一级指标")
+ private java.lang.String primaryIndex;
+ /**评价要点*/
+ @Excel(name = "评价要点", width = 15)
+ @Schema(description = "评价要点")
+ private java.lang.String evalPoints;
+ /**评价内容*/
+ @Excel(name = "评价内容", width = 15)
+ @Schema(description = "评价内容")
+ private java.lang.String evalContent;
+ /**问题表现*/
+ @Excel(name = "问题表现", width = 15)
+ @Schema(description = "问题表现")
+ private java.lang.String problemManifestation;
+ /**整改措施*/
+ @Excel(name = "整改措施", width = 15)
+ @Schema(description = "整改措施")
+ private java.lang.String rectificationMeasures;
+ /**完成时限*/
+ @Excel(name = "完成时限", width = 15, format = "yyyy-MM-dd")
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+ @DateTimeFormat(pattern="yyyy-MM-dd")
+ @Schema(description = "完成时限")
+ private java.util.Date completionDeadline;
+ /**责任部门*/
+ @Excel(name = "责任部门", width = 15)
+ @Schema(description = "责任部门")
+ @Dict(dictTable ="sys_depart",dicText = "depart_name",dicCode = "id")
+ private java.lang.String responsibleDept;
+ /**完成情况*/
+ @Excel(name = "完成情况", width = 15)
+ @Schema(description = "完成情况")
+ private java.lang.String completionStatus;
+ /**是否可发起(0不可发起,1可发起)*/
+ @Excel(name = "是否可发起", width = 15)
+ @Dict(dicCode = "is_launchable")
+ private String isLaunchable;
+ @TableLogic(value = "0", delval = "1")
+ private int delFlag = 0;
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/mapper/DjCheckMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/mapper/DjCheckMapper.java
new file mode 100644
index 0000000..9eddc5d
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/mapper/DjCheckMapper.java
@@ -0,0 +1,17 @@
+package org.jeecg.modules.demo.check.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.demo.check.entity.DjCheck;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 党建检查台账
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+public interface DjCheckMapper extends BaseMapper {
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/mapper/xml/DjCheckMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/mapper/xml/DjCheckMapper.xml
new file mode 100644
index 0000000..f2ff7d0
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/mapper/xml/DjCheckMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/service/IDjCheckService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/service/IDjCheckService.java
new file mode 100644
index 0000000..78b5608
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/service/IDjCheckService.java
@@ -0,0 +1,14 @@
+package org.jeecg.modules.demo.check.service;
+
+import org.jeecg.modules.demo.check.entity.DjCheck;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 党建检查台账
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+public interface IDjCheckService extends IService {
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/service/impl/DjCheckServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/service/impl/DjCheckServiceImpl.java
new file mode 100644
index 0000000..02b83db
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/check/service/impl/DjCheckServiceImpl.java
@@ -0,0 +1,19 @@
+package org.jeecg.modules.demo.check.service.impl;
+
+import org.jeecg.modules.demo.check.entity.DjCheck;
+import org.jeecg.modules.demo.check.mapper.DjCheckMapper;
+import org.jeecg.modules.demo.check.service.IDjCheckService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 党建检查台账
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+@Service
+public class DjCheckServiceImpl extends ServiceImpl implements IDjCheckService {
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/controller/DjDemoLifeMeetingController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/controller/DjDemoLifeMeetingController.java
new file mode 100644
index 0000000..5e210a8
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/controller/DjDemoLifeMeetingController.java
@@ -0,0 +1,182 @@
+package org.jeecg.modules.demo.demoMetting.controller;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.query.QueryRuleEnum;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.demo.demoMetting.entity.DjDemoLifeMeeting;
+import org.jeecg.modules.demo.demoMetting.service.IDjDemoLifeMeetingService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+ /**
+ * @Description: 所领导板子民主生活会问题台账
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+@Tag(name="所领导板子民主生活会问题台账")
+@RestController
+@RequestMapping("/demoMetting/djDemoLifeMeeting")
+@Slf4j
+public class DjDemoLifeMeetingController extends JeecgController {
+ @Autowired
+ private IDjDemoLifeMeetingService djDemoLifeMeetingService;
+
+ /**
+ * 分页列表查询
+ *
+ * @param djDemoLifeMeeting
+ * @param pageNo
+ * @param pageSize
+ * @param req
+ * @return
+ */
+ //@AutoLog(value = "所领导板子民主生活会问题台账-分页列表查询")
+ @Operation(summary="所领导板子民主生活会问题台账-分页列表查询")
+ @GetMapping(value = "/list")
+ public Result> queryPageList(DjDemoLifeMeeting djDemoLifeMeeting,
+ @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+ @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+ HttpServletRequest req) {
+
+
+ QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(djDemoLifeMeeting, req.getParameterMap());
+ Page page = new Page(pageNo, pageSize);
+ IPage pageList = djDemoLifeMeetingService.page(page, queryWrapper);
+ return Result.OK(pageList);
+ }
+
+ /**
+ * 添加
+ *
+ * @param djDemoLifeMeeting
+ * @return
+ */
+ @AutoLog(value = "所领导板子民主生活会问题台账-添加")
+ @Operation(summary="所领导板子民主生活会问题台账-添加")
+ @RequiresPermissions("demoMetting:dj_demo_life_meeting:add")
+ @PostMapping(value = "/add")
+ public Result add(@RequestBody DjDemoLifeMeeting djDemoLifeMeeting) {
+ djDemoLifeMeetingService.save(djDemoLifeMeeting);
+
+ return Result.OK("添加成功!");
+ }
+
+ /**
+ * 编辑
+ *
+ * @param djDemoLifeMeeting
+ * @return
+ */
+ @AutoLog(value = "所领导板子民主生活会问题台账-编辑")
+ @Operation(summary="所领导板子民主生活会问题台账-编辑")
+ @RequiresPermissions("demoMetting:dj_demo_life_meeting:edit")
+ @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+ public Result edit(@RequestBody DjDemoLifeMeeting djDemoLifeMeeting) {
+ djDemoLifeMeetingService.updateById(djDemoLifeMeeting);
+ return Result.OK("编辑成功!");
+ }
+
+ /**
+ * 通过id删除
+ *
+ * @param id
+ * @return
+ */
+ @AutoLog(value = "所领导板子民主生活会问题台账-通过id删除")
+ @Operation(summary="所领导板子民主生活会问题台账-通过id删除")
+ @RequiresPermissions("demoMetting:dj_demo_life_meeting:delete")
+ @DeleteMapping(value = "/delete")
+ public Result delete(@RequestParam(name="id",required=true) String id) {
+ djDemoLifeMeetingService.removeById(id);
+ return Result.OK("删除成功!");
+ }
+
+ /**
+ * 批量删除
+ *
+ * @param ids
+ * @return
+ */
+ @AutoLog(value = "所领导板子民主生活会问题台账-批量删除")
+ @Operation(summary="所领导板子民主生活会问题台账-批量删除")
+ @RequiresPermissions("demoMetting:dj_demo_life_meeting:deleteBatch")
+ @DeleteMapping(value = "/deleteBatch")
+ public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+ this.djDemoLifeMeetingService.removeByIds(Arrays.asList(ids.split(",")));
+ return Result.OK("批量删除成功!");
+ }
+
+ /**
+ * 通过id查询
+ *
+ * @param id
+ * @return
+ */
+ //@AutoLog(value = "所领导板子民主生活会问题台账-通过id查询")
+ @Operation(summary="所领导板子民主生活会问题台账-通过id查询")
+ @GetMapping(value = "/queryById")
+ public Result queryById(@RequestParam(name="id",required=true) String id) {
+ DjDemoLifeMeeting djDemoLifeMeeting = djDemoLifeMeetingService.getById(id);
+ if(djDemoLifeMeeting==null) {
+ return Result.error("未找到对应数据");
+ }
+ return Result.OK(djDemoLifeMeeting);
+ }
+
+ /**
+ * 导出excel
+ *
+ * @param request
+ * @param djDemoLifeMeeting
+ */
+ @RequiresPermissions("demoMetting:dj_demo_life_meeting:exportXls")
+ @RequestMapping(value = "/exportXls")
+ public ModelAndView exportXls(HttpServletRequest request, DjDemoLifeMeeting djDemoLifeMeeting) {
+ return super.exportXls(request, djDemoLifeMeeting, DjDemoLifeMeeting.class, "所领导板子民主生活会问题台账");
+ }
+
+ /**
+ * 通过excel导入数据
+ *
+ * @param request
+ * @param response
+ * @return
+ */
+ @RequiresPermissions("demoMetting:dj_demo_life_meeting:importExcel")
+ @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+ public Result> importExcel(HttpServletRequest request, HttpServletResponse response) {
+ return super.importExcel(request, response, DjDemoLifeMeeting.class);
+ }
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/entity/DjDemoLifeMeeting.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/entity/DjDemoLifeMeeting.java
new file mode 100644
index 0000000..5e07693
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/entity/DjDemoLifeMeeting.java
@@ -0,0 +1,114 @@
+package org.jeecg.modules.demo.demoMetting.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import org.jeecg.common.constant.ProvinceCityArea;
+import org.jeecg.common.util.SpringContextUtils;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: 所领导板子民主生活会问题台账
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+@Data
+@TableName("dj_demo_life_meeting")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description="所领导板子民主生活会问题台账")
+public class DjDemoLifeMeeting implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**主键*/
+ @TableId(type = IdType.ASSIGN_ID)
+ @Schema(description = "主键")
+ private java.lang.String id;
+ /**创建人*/
+ @Schema(description = "创建人")
+ private java.lang.String createBy;
+ /**创建日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "创建日期")
+ private java.util.Date createTime;
+ /**更新人*/
+ @Schema(description = "更新人")
+ private java.lang.String updateBy;
+ /**更新日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "更新日期")
+ private java.util.Date updateTime;
+ /**所属部门*/
+ @Schema(description = "所属部门")
+ private java.lang.String sysOrgCode;
+ /**序号*/
+ @Excel(name = "序号", width = 15)
+ @Schema(description = "序号")
+ private java.lang.Integer sortNo;
+ /**问题分类*/
+ @Excel(name = "问题分类", width = 15)
+ @Schema(description = "问题分类")
+ private java.lang.Integer problemType;
+ /**问题清单*/
+ @Excel(name = "问题清单", width = 15)
+ @Schema(description = "问题清单")
+ private java.lang.String problemList;
+ /**问题表现*/
+ @Excel(name = "问题表现", width = 15)
+ @Schema(description = "问题表现")
+ private java.lang.String problemManifestation;
+ /**责任领导*/
+ @Excel(name = "责任领导", width = 15)
+ @Schema(description = "责任领导")
+ private java.lang.String responsibleLeader;
+ /**责任部门*/
+ @Excel(name = "责任部门", width = 15)
+ @Schema(description = "责任部门")
+ @Dict(dictTable ="sys_depart",dicText = "depart_name",dicCode = "id")
+ private java.lang.String responsibleDept;
+ /**整改措施*/
+ @Excel(name = "整改措施", width = 15)
+ @Schema(description = "整改措施")
+ private java.lang.String rectificationMeasures;
+ /**完成时限*/
+ @Excel(name = "完成时限", width = 15, format = "yyyy-MM-dd")
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+ @DateTimeFormat(pattern="yyyy-MM-dd")
+ @Schema(description = "完成时限")
+ private java.util.Date completionDeadline;
+ /**完成时间*/
+ @Excel(name = "完成时间", width = 15, format = "yyyy-MM-dd")
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+ @DateTimeFormat(pattern="yyyy-MM-dd")
+ @Schema(description = "完成时间")
+ private java.util.Date completionDate;
+ /**输出成果*/
+ @Excel(name = "输出成果", width = 15)
+ @Schema(description = "输出成果")
+ private java.lang.String outputResults;
+ /**完成情况*/
+ @Excel(name = "完成情况", width = 15)
+ @Schema(description = "完成情况")
+ private java.lang.String completionStatus;
+ /**是否可发起(0不可发起,1可发起)*/
+ @Excel(name = "是否可发起", width = 15)
+ @Dict(dicCode = "is_launchable")
+ private String isLaunchable;
+ @TableLogic(value = "0", delval = "1")
+ private int delFlag = 0;
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/mapper/DjDemoLifeMeetingMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/mapper/DjDemoLifeMeetingMapper.java
new file mode 100644
index 0000000..4f06700
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/mapper/DjDemoLifeMeetingMapper.java
@@ -0,0 +1,17 @@
+package org.jeecg.modules.demo.demoMetting.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.demo.demoMetting.entity.DjDemoLifeMeeting;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 所领导板子民主生活会问题台账
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+public interface DjDemoLifeMeetingMapper extends BaseMapper {
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/mapper/xml/DjDemoLifeMeetingMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/mapper/xml/DjDemoLifeMeetingMapper.xml
new file mode 100644
index 0000000..432c353
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/mapper/xml/DjDemoLifeMeetingMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/service/IDjDemoLifeMeetingService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/service/IDjDemoLifeMeetingService.java
new file mode 100644
index 0000000..12cb9e3
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/service/IDjDemoLifeMeetingService.java
@@ -0,0 +1,14 @@
+package org.jeecg.modules.demo.demoMetting.service;
+
+import org.jeecg.modules.demo.demoMetting.entity.DjDemoLifeMeeting;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 所领导板子民主生活会问题台账
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+public interface IDjDemoLifeMeetingService extends IService {
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/service/impl/DjDemoLifeMeetingServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/service/impl/DjDemoLifeMeetingServiceImpl.java
new file mode 100644
index 0000000..26241aa
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/demoMetting/service/impl/DjDemoLifeMeetingServiceImpl.java
@@ -0,0 +1,19 @@
+package org.jeecg.modules.demo.demoMetting.service.impl;
+
+import org.jeecg.modules.demo.demoMetting.entity.DjDemoLifeMeeting;
+import org.jeecg.modules.demo.demoMetting.mapper.DjDemoLifeMeetingMapper;
+import org.jeecg.modules.demo.demoMetting.service.IDjDemoLifeMeetingService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 所领导板子民主生活会问题台账
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+@Service
+public class DjDemoLifeMeetingServiceImpl extends ServiceImpl implements IDjDemoLifeMeetingService {
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/controller/DjPeopleServiceController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/controller/DjPeopleServiceController.java
new file mode 100644
index 0000000..c98553c
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/controller/DjPeopleServiceController.java
@@ -0,0 +1,182 @@
+package org.jeecg.modules.demo.peopleService.controller;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.query.QueryRuleEnum;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.demo.peopleService.entity.DjPeopleService;
+import org.jeecg.modules.demo.peopleService.service.IDjPeopleServiceService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+ /**
+ * @Description: 我为群众办实事台账
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+@Tag(name="我为群众办实事台账")
+@RestController
+@RequestMapping("/peopleService/djPeopleService")
+@Slf4j
+public class DjPeopleServiceController extends JeecgController {
+ @Autowired
+ private IDjPeopleServiceService djPeopleServiceService;
+
+ /**
+ * 分页列表查询
+ *
+ * @param djPeopleService
+ * @param pageNo
+ * @param pageSize
+ * @param req
+ * @return
+ */
+ //@AutoLog(value = "我为群众办实事台账-分页列表查询")
+ @Operation(summary="我为群众办实事台账-分页列表查询")
+ @GetMapping(value = "/list")
+ public Result> queryPageList(DjPeopleService djPeopleService,
+ @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+ @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+ HttpServletRequest req) {
+
+
+ QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(djPeopleService, req.getParameterMap());
+ Page page = new Page(pageNo, pageSize);
+ IPage pageList = djPeopleServiceService.page(page, queryWrapper);
+ return Result.OK(pageList);
+ }
+
+ /**
+ * 添加
+ *
+ * @param djPeopleService
+ * @return
+ */
+ @AutoLog(value = "我为群众办实事台账-添加")
+ @Operation(summary="我为群众办实事台账-添加")
+ @RequiresPermissions("peopleService:dj_people_service:add")
+ @PostMapping(value = "/add")
+ public Result add(@RequestBody DjPeopleService djPeopleService) {
+ djPeopleServiceService.save(djPeopleService);
+
+ return Result.OK("添加成功!");
+ }
+
+ /**
+ * 编辑
+ *
+ * @param djPeopleService
+ * @return
+ */
+ @AutoLog(value = "我为群众办实事台账-编辑")
+ @Operation(summary="我为群众办实事台账-编辑")
+ @RequiresPermissions("peopleService:dj_people_service:edit")
+ @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+ public Result edit(@RequestBody DjPeopleService djPeopleService) {
+ djPeopleServiceService.updateById(djPeopleService);
+ return Result.OK("编辑成功!");
+ }
+
+ /**
+ * 通过id删除
+ *
+ * @param id
+ * @return
+ */
+ @AutoLog(value = "我为群众办实事台账-通过id删除")
+ @Operation(summary="我为群众办实事台账-通过id删除")
+ @RequiresPermissions("peopleService:dj_people_service:delete")
+ @DeleteMapping(value = "/delete")
+ public Result delete(@RequestParam(name="id",required=true) String id) {
+ djPeopleServiceService.removeById(id);
+ return Result.OK("删除成功!");
+ }
+
+ /**
+ * 批量删除
+ *
+ * @param ids
+ * @return
+ */
+ @AutoLog(value = "我为群众办实事台账-批量删除")
+ @Operation(summary="我为群众办实事台账-批量删除")
+ @RequiresPermissions("peopleService:dj_people_service:deleteBatch")
+ @DeleteMapping(value = "/deleteBatch")
+ public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+ this.djPeopleServiceService.removeByIds(Arrays.asList(ids.split(",")));
+ return Result.OK("批量删除成功!");
+ }
+
+ /**
+ * 通过id查询
+ *
+ * @param id
+ * @return
+ */
+ //@AutoLog(value = "我为群众办实事台账-通过id查询")
+ @Operation(summary="我为群众办实事台账-通过id查询")
+ @GetMapping(value = "/queryById")
+ public Result queryById(@RequestParam(name="id",required=true) String id) {
+ DjPeopleService djPeopleService = djPeopleServiceService.getById(id);
+ if(djPeopleService==null) {
+ return Result.error("未找到对应数据");
+ }
+ return Result.OK(djPeopleService);
+ }
+
+ /**
+ * 导出excel
+ *
+ * @param request
+ * @param djPeopleService
+ */
+ @RequiresPermissions("peopleService:dj_people_service:exportXls")
+ @RequestMapping(value = "/exportXls")
+ public ModelAndView exportXls(HttpServletRequest request, DjPeopleService djPeopleService) {
+ return super.exportXls(request, djPeopleService, DjPeopleService.class, "我为群众办实事台账");
+ }
+
+ /**
+ * 通过excel导入数据
+ *
+ * @param request
+ * @param response
+ * @return
+ */
+ @RequiresPermissions("peopleService:dj_people_service:importExcel")
+ @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+ public Result> importExcel(HttpServletRequest request, HttpServletResponse response) {
+ return super.importExcel(request, response, DjPeopleService.class);
+ }
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/entity/DjPeopleService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/entity/DjPeopleService.java
new file mode 100644
index 0000000..d397cd6
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/entity/DjPeopleService.java
@@ -0,0 +1,92 @@
+package org.jeecg.modules.demo.peopleService.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import org.jeecg.common.constant.ProvinceCityArea;
+import org.jeecg.common.util.SpringContextUtils;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: 我为群众办实事台账
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+@Data
+@TableName("dj_people_service")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description="我为群众办实事台账")
+public class DjPeopleService implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**主键*/
+ @TableId(type = IdType.ASSIGN_ID)
+ @Schema(description = "主键")
+ private java.lang.String id;
+ /**创建人*/
+ @Schema(description = "创建人")
+ private java.lang.String createBy;
+ /**创建日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "创建日期")
+ private java.util.Date createTime;
+ /**更新人*/
+ @Schema(description = "更新人")
+ private java.lang.String updateBy;
+ /**更新日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "更新日期")
+ private java.util.Date updateTime;
+ /**所属部门*/
+ @Schema(description = "所属部门")
+ private java.lang.String sysOrgCode;
+ /**序号*/
+ @Excel(name = "序号", width = 15)
+ @Schema(description = "序号")
+ private java.lang.Integer sortNo;
+ /**问题分类*/
+ @Excel(name = "问题分类", width = 15)
+ @Schema(description = "问题分类")
+ private java.lang.String problemType;
+ /**具体措施*/
+ @Excel(name = "具体措施", width = 15)
+ @Schema(description = "具体措施")
+ private java.lang.String specificMeasure;
+ /**完成时限*/
+ @Excel(name = "完成时限", width = 15, format = "yyyy-MM-dd")
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+ @DateTimeFormat(pattern="yyyy-MM-dd")
+ @Schema(description = "完成时限")
+ private java.util.Date completionDeadline;
+ /**责任部门*/
+ @Excel(name = "责任部门", width = 15)
+ @Schema(description = "责任部门")
+ @Dict(dictTable ="sys_depart",dicText = "depart_name",dicCode = "id")
+ private java.lang.String responsibleDept;
+ /**完成情况*/
+ @Excel(name = "完成情况", width = 15)
+ @Schema(description = "完成情况")
+ private java.lang.String completionStatus;
+ /**是否可发起(0不可发起,1可发起)*/
+ @Excel(name = "是否可发起", width = 15)
+ @Dict(dicCode = "is_launchable")
+ private String isLaunchable;
+ @TableLogic(value = "0", delval = "1")
+ private int delFlag = 0;
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/mapper/DjPeopleServiceMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/mapper/DjPeopleServiceMapper.java
new file mode 100644
index 0000000..61a41b7
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/mapper/DjPeopleServiceMapper.java
@@ -0,0 +1,17 @@
+package org.jeecg.modules.demo.peopleService.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.demo.peopleService.entity.DjPeopleService;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 我为群众办实事台账
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+public interface DjPeopleServiceMapper extends BaseMapper {
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/mapper/xml/DjPeopleServiceMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/mapper/xml/DjPeopleServiceMapper.xml
new file mode 100644
index 0000000..7b6cb99
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/mapper/xml/DjPeopleServiceMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/service/IDjPeopleServiceService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/service/IDjPeopleServiceService.java
new file mode 100644
index 0000000..e220f57
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/service/IDjPeopleServiceService.java
@@ -0,0 +1,14 @@
+package org.jeecg.modules.demo.peopleService.service;
+
+import org.jeecg.modules.demo.peopleService.entity.DjPeopleService;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 我为群众办实事台账
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+public interface IDjPeopleServiceService extends IService {
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/service/impl/DjPeopleServiceServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/service/impl/DjPeopleServiceServiceImpl.java
new file mode 100644
index 0000000..d090aa9
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/peopleService/service/impl/DjPeopleServiceServiceImpl.java
@@ -0,0 +1,19 @@
+package org.jeecg.modules.demo.peopleService.service.impl;
+
+import org.jeecg.modules.demo.peopleService.entity.DjPeopleService;
+import org.jeecg.modules.demo.peopleService.mapper.DjPeopleServiceMapper;
+import org.jeecg.modules.demo.peopleService.service.IDjPeopleServiceService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 我为群众办实事台账
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+@Service
+public class DjPeopleServiceServiceImpl extends ServiceImpl implements IDjPeopleServiceService {
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/controller/DjInspectionRectifyListController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/controller/DjInspectionRectifyListController.java
new file mode 100644
index 0000000..85ad1d1
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/controller/DjInspectionRectifyListController.java
@@ -0,0 +1,298 @@
+package org.jeecg.modules.demo.rectifylist.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.common.system.vo.SelectTreeModel;
+import org.jeecg.modules.demo.rectifylist.entity.DjInspectionRectifyList;
+import org.jeecg.modules.demo.rectifylist.service.IDjInspectionRectifyListService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+
+ /**
+ * @Description: 党建巡视整改提升工作台账
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+@Tag(name="党建巡视整改提升工作台账")
+@RestController
+@RequestMapping("/rectifylist/djInspectionRectifyList")
+@Slf4j
+public class DjInspectionRectifyListController extends JeecgController{
+ @Autowired
+ private IDjInspectionRectifyListService djInspectionRectifyListService;
+
+ /**
+ * 分页列表查询
+ *
+ * @param djInspectionRectifyList
+ * @param pageNo
+ * @param pageSize
+ * @param req
+ * @return
+ */
+ //@AutoLog(value = "党建巡视整改提升工作台账-分页列表查询")
+ @Operation(summary="党建巡视整改提升工作台账-分页列表查询")
+ @GetMapping(value = "/rootList")
+ public Result> queryPageList(DjInspectionRectifyList djInspectionRectifyList,
+ @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+ @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+ HttpServletRequest req) {
+ String hasQuery = req.getParameter("hasQuery");
+ if(hasQuery != null && "true".equals(hasQuery)){
+ QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(djInspectionRectifyList, req.getParameterMap());
+ List list = djInspectionRectifyListService.queryTreeListNoPage(queryWrapper);
+ IPage pageList = new Page<>(1, 10, list.size());
+ pageList.setRecords(list);
+ return Result.OK(pageList);
+ }else{
+ String parentId = djInspectionRectifyList.getPid();
+ if (oConvertUtils.isEmpty(parentId)) {
+ parentId = "0";
+ }
+ djInspectionRectifyList.setPid(null);
+ QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(djInspectionRectifyList, req.getParameterMap());
+ // 使用 eq 防止模糊查询
+ queryWrapper.eq("pid", parentId);
+ Page page = new Page(pageNo, pageSize);
+ IPage pageList = djInspectionRectifyListService.page(page, queryWrapper);
+ return Result.OK(pageList);
+ }
+ }
+
+ /**
+ * 【vue3专用】加载节点的子数据
+ *
+ * @param pid
+ * @return
+ */
+ @RequestMapping(value = "/loadTreeChildren", method = RequestMethod.GET)
+ public Result> loadTreeChildren(@RequestParam(name = "pid") String pid) {
+ Result> result = new Result<>();
+ try {
+ List ls = djInspectionRectifyListService.queryListByPid(pid);
+ result.setResult(ls);
+ result.setSuccess(true);
+ } catch (Exception e) {
+ e.printStackTrace();
+ result.setMessage(e.getMessage());
+ result.setSuccess(false);
+ }
+ return result;
+ }
+
+ /**
+ * 【vue3专用】加载一级节点/如果是同步 则所有数据
+ *
+ * @param async
+ * @param pcode
+ * @return
+ */
+ @RequestMapping(value = "/loadTreeRoot", method = RequestMethod.GET)
+ public Result> loadTreeRoot(@RequestParam(name = "async") Boolean async, @RequestParam(name = "pcode") String pcode) {
+ Result> result = new Result<>();
+ try {
+ List ls = djInspectionRectifyListService.queryListByCode(pcode);
+ if (!async) {
+ loadAllChildren(ls);
+ }
+ result.setResult(ls);
+ result.setSuccess(true);
+ } catch (Exception e) {
+ e.printStackTrace();
+ result.setMessage(e.getMessage());
+ result.setSuccess(false);
+ }
+ return result;
+ }
+
+ /**
+ * 【vue3专用】递归求子节点 同步加载用到
+ *
+ * @param ls
+ */
+ private void loadAllChildren(List ls) {
+ for (SelectTreeModel tsm : ls) {
+ List temp = djInspectionRectifyListService.queryListByPid(tsm.getKey());
+ if (temp != null && temp.size() > 0) {
+ tsm.setChildren(temp);
+ loadAllChildren(temp);
+ }
+ }
+ }
+
+ /**
+ * 获取子数据
+ * @param djInspectionRectifyList
+ * @param req
+ * @return
+ */
+ //@AutoLog(value = "党建巡视整改提升工作台账-获取子数据")
+ @Operation(summary="党建巡视整改提升工作台账-获取子数据")
+ @GetMapping(value = "/childList")
+ public Result> queryPageList(DjInspectionRectifyList djInspectionRectifyList,HttpServletRequest req) {
+ QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(djInspectionRectifyList, req.getParameterMap());
+ List list = djInspectionRectifyListService.list(queryWrapper);
+ IPage pageList = new Page<>(1, 10, list.size());
+ pageList.setRecords(list);
+ return Result.OK(pageList);
+ }
+
+ /**
+ * 批量查询子节点
+ * @param parentIds 父ID(多个采用半角逗号分割)
+ * @return 返回 IPage
+ * @param parentIds
+ * @return
+ */
+ //@AutoLog(value = "党建巡视整改提升工作台账-批量获取子数据")
+ @Operation(summary="党建巡视整改提升工作台账-批量获取子数据")
+ @GetMapping("/getChildListBatch")
+ public Result getChildListBatch(@RequestParam("parentIds") String parentIds) {
+ try {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ List parentIdList = Arrays.asList(parentIds.split(","));
+ queryWrapper.in("pid", parentIdList);
+ List list = djInspectionRectifyListService.list(queryWrapper);
+ IPage pageList = new Page<>(1, 10, list.size());
+ pageList.setRecords(list);
+ return Result.OK(pageList);
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ return Result.error("批量查询子节点失败:" + e.getMessage());
+ }
+ }
+
+ /**
+ * 添加
+ *
+ * @param djInspectionRectifyList
+ * @return
+ */
+ @AutoLog(value = "党建巡视整改提升工作台账-添加")
+ @Operation(summary="党建巡视整改提升工作台账-添加")
+ @RequiresPermissions("rectifylist:dj_inspection_rectify_list:add")
+ @PostMapping(value = "/add")
+ public Result add(@RequestBody DjInspectionRectifyList djInspectionRectifyList) {
+ djInspectionRectifyListService.addDjInspectionRectifyList(djInspectionRectifyList);
+ return Result.OK("添加成功!");
+ }
+
+ /**
+ * 编辑
+ *
+ * @param djInspectionRectifyList
+ * @return
+ */
+ @AutoLog(value = "党建巡视整改提升工作台账-编辑")
+ @Operation(summary="党建巡视整改提升工作台账-编辑")
+ @RequiresPermissions("rectifylist:dj_inspection_rectify_list:edit")
+ @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+ public Result edit(@RequestBody DjInspectionRectifyList djInspectionRectifyList) {
+ djInspectionRectifyListService.updateDjInspectionRectifyList(djInspectionRectifyList);
+ return Result.OK("编辑成功!");
+ }
+
+ /**
+ * 通过id删除
+ *
+ * @param id
+ * @return
+ */
+ @AutoLog(value = "党建巡视整改提升工作台账-通过id删除")
+ @Operation(summary="党建巡视整改提升工作台账-通过id删除")
+ @RequiresPermissions("rectifylist:dj_inspection_rectify_list:delete")
+ @DeleteMapping(value = "/delete")
+ public Result delete(@RequestParam(name="id",required=true) String id) {
+ djInspectionRectifyListService.deleteDjInspectionRectifyList(id);
+ return Result.OK("删除成功!");
+ }
+
+ /**
+ * 批量删除
+ *
+ * @param ids
+ * @return
+ */
+ @AutoLog(value = "党建巡视整改提升工作台账-批量删除")
+ @Operation(summary="党建巡视整改提升工作台账-批量删除")
+ @RequiresPermissions("rectifylist:dj_inspection_rectify_list:deleteBatch")
+ @DeleteMapping(value = "/deleteBatch")
+ public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+ this.djInspectionRectifyListService.removeByIds(Arrays.asList(ids.split(",")));
+ return Result.OK("批量删除成功!");
+ }
+
+ /**
+ * 通过id查询
+ *
+ * @param id
+ * @return
+ */
+ //@AutoLog(value = "党建巡视整改提升工作台账-通过id查询")
+ @Operation(summary="党建巡视整改提升工作台账-通过id查询")
+ @GetMapping(value = "/queryById")
+ public Result queryById(@RequestParam(name="id",required=true) String id) {
+ DjInspectionRectifyList djInspectionRectifyList = djInspectionRectifyListService.getById(id);
+ if(djInspectionRectifyList==null) {
+ return Result.error("未找到对应数据");
+ }
+ return Result.OK(djInspectionRectifyList);
+ }
+
+ /**
+ * 导出excel
+ *
+ * @param request
+ * @param djInspectionRectifyList
+ */
+ @RequiresPermissions("rectifylist:dj_inspection_rectify_list:exportXls")
+ @RequestMapping(value = "/exportXls")
+ public ModelAndView exportXls(HttpServletRequest request, DjInspectionRectifyList djInspectionRectifyList) {
+ return super.exportXls(request, djInspectionRectifyList, DjInspectionRectifyList.class, "党建巡视整改提升工作台账");
+ }
+
+ /**
+ * 通过excel导入数据
+ *
+ * @param request
+ * @param response
+ * @return
+ */
+ @RequiresPermissions("rectifylist:dj_inspection_rectify_list:importExcel")
+ @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+ public Result> importExcel(HttpServletRequest request, HttpServletResponse response) {
+ return super.importExcel(request, response, DjInspectionRectifyList.class);
+ }
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/entity/DjInspectionRectifyList.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/entity/DjInspectionRectifyList.java
new file mode 100644
index 0000000..d4ba8de
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/entity/DjInspectionRectifyList.java
@@ -0,0 +1,126 @@
+package org.jeecg.modules.demo.rectifylist.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import org.jeecg.common.constant.ProvinceCityArea;
+import org.jeecg.common.util.SpringContextUtils;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * @Description: 党建巡视整改提升工作台账
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+@Data
+@TableName("dj_inspection_rectify_list")
+@Schema(description="党建巡视整改提升工作台账")
+public class DjInspectionRectifyList implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**主键*/
+ @TableId(type = IdType.ASSIGN_ID)
+ @Schema(description = "主键")
+ private java.lang.String id;
+ /**创建人*/
+ @Schema(description = "创建人")
+ private java.lang.String createBy;
+ /**创建日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "创建日期")
+ private java.util.Date createTime;
+ /**更新人*/
+ @Schema(description = "更新人")
+ private java.lang.String updateBy;
+ /**更新日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "更新日期")
+ private java.util.Date updateTime;
+ /**所属部门*/
+ @Schema(description = "所属部门")
+ private java.lang.String sysOrgCode;
+ /**父级节点*/
+ @Excel(name = "父级节点", width = 15)
+ @Schema(description = "父级节点")
+ private java.lang.String pid;
+ /**是否有子节点*/
+ @Excel(name = "是否有子节点", width = 15, dicCode = "yn")
+ @Dict(dicCode = "yn")
+ @Schema(description = "是否有子节点")
+ private java.lang.String hasChild;
+ /**问题名称*/
+ @Excel(name = "问题名称", width = 15)
+ @Schema(description = "问题名称")
+ private java.lang.String issueName;
+ /**问题分类*/
+ @Excel(name = "问题分类", width = 15)
+ @Schema(description = "问题分类")
+ private java.lang.Integer problemType;
+ /**面上问题*/
+ @Excel(name = "面上问题", width = 15)
+ @Schema(description = "面上问题")
+ private java.lang.String msIssue;
+ /**具体问题*/
+ @Excel(name = "具体问题", width = 15)
+ @Schema(description = "具体问题")
+ private java.lang.String specificIssue;
+ /**整改措施*/
+ @Excel(name = "整改措施", width = 15)
+ @Schema(description = "整改措施")
+ private java.lang.String rectificationMeasures;
+ /**完成时限*/
+ @Excel(name = "完成时限", width = 15, format = "yyyy-MM-dd")
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+ @DateTimeFormat(pattern="yyyy-MM-dd")
+ @Schema(description = "完成时限")
+ private java.util.Date completionDeadline;
+ /**责任部门*/
+ @Excel(name = "责任部门", width = 15)
+ @Schema(description = "责任部门")
+ @Dict(dictTable ="sys_depart",dicText = "depart_name",dicCode = "id")
+ private java.lang.String responsibleDept;
+ /**分管所领导*/
+ @Excel(name = "分管所领导", width = 15)
+ @Schema(description = "分管所领导")
+ private java.lang.String supervisingLeader;
+ /**标志性成果*/
+ @Excel(name = "标志性成果", width = 15)
+ @Schema(description = "标志性成果")
+ private java.lang.String landmarkAchievement;
+ /**完成时间*/
+ @Excel(name = "完成时间", width = 15, format = "yyyy-MM-dd")
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+ @DateTimeFormat(pattern="yyyy-MM-dd")
+ @Schema(description = "完成时间")
+ private java.util.Date completionDate;
+ /**监督意见*/
+ @Excel(name = "监督意见", width = 15)
+ @Schema(description = "监督意见")
+ private java.lang.String supervisionOpinion;
+ /**措施数量*/
+ @Excel(name = "措施数量", width = 15)
+ @Schema(description = "措施数量")
+ private java.lang.Integer measureCount;
+ /**是否可发起(0不可发起,1可发起)*/
+ @Excel(name = "是否可发起", width = 15)
+ @Dict(dicCode = "is_launchable")
+ private String isLaunchable;
+ @TableLogic(value = "0", delval = "1")
+ private int delFlag = 0;
+ // 该表单未设置逻辑删除功能,因为该表单为树形结构
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/mapper/DjInspectionRectifyListMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/mapper/DjInspectionRectifyListMapper.java
new file mode 100644
index 0000000..9258f0e
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/mapper/DjInspectionRectifyListMapper.java
@@ -0,0 +1,35 @@
+package org.jeecg.modules.demo.rectifylist.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.common.system.vo.SelectTreeModel;
+import org.jeecg.modules.demo.rectifylist.entity.DjInspectionRectifyList;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 党建巡视整改提升工作台账
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+public interface DjInspectionRectifyListMapper extends BaseMapper {
+
+ /**
+ * 编辑节点状态
+ * @param id
+ * @param status
+ */
+ void updateTreeNodeStatus(@Param("id") String id,@Param("status") String status);
+
+ /**
+ * 【vue3专用】根据父级ID查询树节点数据
+ *
+ * @param pid
+ * @param query
+ * @return
+ */
+ List queryListByPid(@Param("pid") String pid, @Param("query") Map query);
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/mapper/xml/DjInspectionRectifyListMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/mapper/xml/DjInspectionRectifyListMapper.xml
new file mode 100644
index 0000000..fbda438
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/mapper/xml/DjInspectionRectifyListMapper.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+ update dj_inspection_rectify_list set has_child = #{status} where id = #{id}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/service/IDjInspectionRectifyListService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/service/IDjInspectionRectifyListService.java
new file mode 100644
index 0000000..8cd18f3
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/service/IDjInspectionRectifyListService.java
@@ -0,0 +1,74 @@
+package org.jeecg.modules.demo.rectifylist.service;
+
+import org.jeecg.common.system.vo.SelectTreeModel;
+import org.jeecg.modules.demo.rectifylist.entity.DjInspectionRectifyList;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.common.exception.JeecgBootException;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import java.util.List;
+
+/**
+ * @Description: 党建巡视整改提升工作台账
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+public interface IDjInspectionRectifyListService extends IService {
+
+ /**根节点父ID的值*/
+ public static final String ROOT_PID_VALUE = "0";
+
+ /**树节点有子节点状态值*/
+ public static final String HASCHILD = "1";
+
+ /**树节点无子节点状态值*/
+ public static final String NOCHILD = "0";
+
+ /**
+ * 新增节点
+ *
+ * @param djInspectionRectifyList
+ */
+ void addDjInspectionRectifyList(DjInspectionRectifyList djInspectionRectifyList);
+
+ /**
+ * 修改节点
+ *
+ * @param djInspectionRectifyList
+ * @throws JeecgBootException
+ */
+ void updateDjInspectionRectifyList(DjInspectionRectifyList djInspectionRectifyList) throws JeecgBootException;
+
+ /**
+ * 删除节点
+ *
+ * @param id
+ * @throws JeecgBootException
+ */
+ void deleteDjInspectionRectifyList(String id) throws JeecgBootException;
+
+ /**
+ * 查询所有数据,无分页
+ *
+ * @param queryWrapper
+ * @return List
+ */
+ List queryTreeListNoPage(QueryWrapper queryWrapper);
+
+ /**
+ * 【vue3专用】根据父级编码加载分类字典的数据
+ *
+ * @param parentCode
+ * @return
+ */
+ List queryListByCode(String parentCode);
+
+ /**
+ * 【vue3专用】根据pid查询子节点集合
+ *
+ * @param pid
+ * @return
+ */
+ List queryListByPid(String pid);
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/service/impl/DjInspectionRectifyListServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/service/impl/DjInspectionRectifyListServiceImpl.java
new file mode 100644
index 0000000..9bb9205
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/rectifylist/service/impl/DjInspectionRectifyListServiceImpl.java
@@ -0,0 +1,219 @@
+package org.jeecg.modules.demo.rectifylist.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.common.system.vo.SelectTreeModel;
+import org.jeecg.modules.demo.rectifylist.entity.DjInspectionRectifyList;
+import org.jeecg.modules.demo.rectifylist.mapper.DjInspectionRectifyListMapper;
+import org.jeecg.modules.demo.rectifylist.service.IDjInspectionRectifyListService;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 党建巡视整改提升工作台账
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+@Service
+public class DjInspectionRectifyListServiceImpl extends ServiceImpl implements IDjInspectionRectifyListService {
+
+ @Override
+ public void addDjInspectionRectifyList(DjInspectionRectifyList djInspectionRectifyList) {
+ //新增时设置hasChild为0
+ djInspectionRectifyList.setHasChild(IDjInspectionRectifyListService.NOCHILD);
+ if(oConvertUtils.isEmpty(djInspectionRectifyList.getPid())){
+ djInspectionRectifyList.setPid(IDjInspectionRectifyListService.ROOT_PID_VALUE);
+ }else{
+ //如果当前节点父ID不为空 则设置父节点的hasChildren 为1
+ DjInspectionRectifyList parent = baseMapper.selectById(djInspectionRectifyList.getPid());
+ if(parent!=null && !"1".equals(parent.getHasChild())){
+ parent.setHasChild("1");
+ baseMapper.updateById(parent);
+ }
+ }
+ baseMapper.insert(djInspectionRectifyList);
+ }
+
+ @Override
+ public void updateDjInspectionRectifyList(DjInspectionRectifyList djInspectionRectifyList) {
+ DjInspectionRectifyList entity = this.getById(djInspectionRectifyList.getId());
+ if(entity==null) {
+ throw new JeecgBootException("未找到对应实体");
+ }
+ String old_pid = entity.getPid();
+ String new_pid = djInspectionRectifyList.getPid();
+ if(!old_pid.equals(new_pid)) {
+ updateOldParentNode(old_pid);
+ if(oConvertUtils.isEmpty(new_pid)){
+ djInspectionRectifyList.setPid(IDjInspectionRectifyListService.ROOT_PID_VALUE);
+ }
+ if(!IDjInspectionRectifyListService.ROOT_PID_VALUE.equals(djInspectionRectifyList.getPid())) {
+ baseMapper.updateTreeNodeStatus(djInspectionRectifyList.getPid(), IDjInspectionRectifyListService.HASCHILD);
+ }
+ }
+ baseMapper.updateById(djInspectionRectifyList);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void deleteDjInspectionRectifyList(String id) throws JeecgBootException {
+ //查询选中节点下所有子节点一并删除
+ id = this.queryTreeChildIds(id);
+ if(id.indexOf(",")>0) {
+ StringBuffer sb = new StringBuffer();
+ String[] idArr = id.split(",");
+ for (String idVal : idArr) {
+ if(idVal != null){
+ DjInspectionRectifyList djInspectionRectifyList = this.getById(idVal);
+ String pidVal = djInspectionRectifyList.getPid();
+ //查询此节点上一级是否还有其他子节点
+ List dataList = baseMapper.selectList(new QueryWrapper().eq("pid", pidVal).notIn("id",Arrays.asList(idArr)));
+ boolean flag = (dataList == null || dataList.size() == 0) && !Arrays.asList(idArr).contains(pidVal) && !sb.toString().contains(pidVal);
+ if(flag){
+ //如果当前节点原本有子节点 现在木有了,更新状态
+ sb.append(pidVal).append(",");
+ }
+ }
+ }
+ //批量删除节点
+ baseMapper.deleteBatchIds(Arrays.asList(idArr));
+ //修改已无子节点的标识
+ String[] pidArr = sb.toString().split(",");
+ for(String pid : pidArr){
+ this.updateOldParentNode(pid);
+ }
+ }else{
+ DjInspectionRectifyList djInspectionRectifyList = this.getById(id);
+ if(djInspectionRectifyList==null) {
+ throw new JeecgBootException("未找到对应实体");
+ }
+ updateOldParentNode(djInspectionRectifyList.getPid());
+ baseMapper.deleteById(id);
+ }
+ }
+
+ @Override
+ public List queryTreeListNoPage(QueryWrapper queryWrapper) {
+ List dataList = baseMapper.selectList(queryWrapper);
+ List mapList = new ArrayList<>();
+ for(DjInspectionRectifyList data : dataList){
+ String pidVal = data.getPid();
+ //递归查询子节点的根节点
+ if(pidVal != null && !IDjInspectionRectifyListService.NOCHILD.equals(pidVal)){
+ DjInspectionRectifyList rootVal = this.getTreeRoot(pidVal);
+ if(rootVal != null && !mapList.contains(rootVal)){
+ mapList.add(rootVal);
+ }
+ }else{
+ if(!mapList.contains(data)){
+ mapList.add(data);
+ }
+ }
+ }
+ return mapList;
+ }
+
+ @Override
+ public List queryListByCode(String parentCode) {
+ String pid = ROOT_PID_VALUE;
+ if (oConvertUtils.isNotEmpty(parentCode)) {
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.eq(DjInspectionRectifyList::getPid, parentCode);
+ List list = baseMapper.selectList(queryWrapper);
+ if (list == null || list.size() == 0) {
+ throw new JeecgBootException("该编码【" + parentCode + "】不存在,请核实!");
+ }
+ if (list.size() > 1) {
+ throw new JeecgBootException("该编码【" + parentCode + "】存在多个,请核实!");
+ }
+ pid = list.get(0).getId();
+ }
+ return baseMapper.queryListByPid(pid, null);
+ }
+
+ @Override
+ public List queryListByPid(String pid) {
+ if (oConvertUtils.isEmpty(pid)) {
+ pid = ROOT_PID_VALUE;
+ }
+ return baseMapper.queryListByPid(pid, null);
+ }
+
+ /**
+ * 根据所传pid查询旧的父级节点的子节点并修改相应状态值
+ * @param pid
+ */
+ private void updateOldParentNode(String pid) {
+ if(!IDjInspectionRectifyListService.ROOT_PID_VALUE.equals(pid)) {
+ Long count = baseMapper.selectCount(new QueryWrapper().eq("pid", pid));
+ if(count==null || count<=1) {
+ baseMapper.updateTreeNodeStatus(pid, IDjInspectionRectifyListService.NOCHILD);
+ }
+ }
+ }
+
+ /**
+ * 递归查询节点的根节点
+ * @param pidVal
+ * @return
+ */
+ private DjInspectionRectifyList getTreeRoot(String pidVal){
+ DjInspectionRectifyList data = baseMapper.selectById(pidVal);
+ if(data != null && !IDjInspectionRectifyListService.ROOT_PID_VALUE.equals(data.getPid())){
+ return this.getTreeRoot(data.getPid());
+ }else{
+ return data;
+ }
+ }
+
+ /**
+ * 根据id查询所有子节点id
+ * @param ids
+ * @return
+ */
+ private String queryTreeChildIds(String ids) {
+ //获取id数组
+ String[] idArr = ids.split(",");
+ StringBuffer sb = new StringBuffer();
+ for (String pidVal : idArr) {
+ if(pidVal != null){
+ if(!sb.toString().contains(pidVal)){
+ if(sb.toString().length() > 0){
+ sb.append(",");
+ }
+ sb.append(pidVal);
+ this.getTreeChildIds(pidVal,sb);
+ }
+ }
+ }
+ return sb.toString();
+ }
+
+ /**
+ * 递归查询所有子节点
+ * @param pidVal
+ * @param sb
+ * @return
+ */
+ private StringBuffer getTreeChildIds(String pidVal,StringBuffer sb){
+ List dataList = baseMapper.selectList(new QueryWrapper().eq("pid", pidVal));
+ if(dataList != null && dataList.size()>0){
+ for(DjInspectionRectifyList tree : dataList) {
+ if(!sb.toString().contains(tree.getId())){
+ sb.append(",").append(tree.getId());
+ }
+ this.getTreeChildIds(tree.getId(),sb);
+ }
+ }
+ return sb;
+ }
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/controller/SupervisionTestController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/controller/SupervisionTestController.java
new file mode 100644
index 0000000..c694faf
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/controller/SupervisionTestController.java
@@ -0,0 +1,182 @@
+package org.jeecg.modules.demo.supervisiontest.controller;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.query.QueryRuleEnum;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.demo.supervisiontest.entity.SupervisionTest;
+import org.jeecg.modules.demo.supervisiontest.service.ISupervisionTestService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+ /**
+ * @Description: supervision_test
+ * @Author: jeecg-boot
+ * @Date: 2026-03-20
+ * @Version: V1.0
+ */
+@Tag(name="supervision_test")
+@RestController
+@RequestMapping("/supervisiontest/supervisionTest")
+@Slf4j
+public class SupervisionTestController extends JeecgController {
+ @Autowired
+ private ISupervisionTestService supervisionTestService;
+
+ /**
+ * 分页列表查询
+ *
+ * @param supervisionTest
+ * @param pageNo
+ * @param pageSize
+ * @param req
+ * @return
+ */
+ //@AutoLog(value = "supervision_test-分页列表查询")
+ @Operation(summary="supervision_test-分页列表查询")
+ @GetMapping(value = "/list")
+ public Result> queryPageList(SupervisionTest supervisionTest,
+ @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+ @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+ HttpServletRequest req) {
+
+
+ QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(supervisionTest, req.getParameterMap());
+ Page page = new Page(pageNo, pageSize);
+ IPage pageList = supervisionTestService.page(page, queryWrapper);
+ return Result.OK(pageList);
+ }
+
+ /**
+ * 添加
+ *
+ * @param supervisionTest
+ * @return
+ */
+ @AutoLog(value = "supervision_test-添加")
+ @Operation(summary="supervision_test-添加")
+ @RequiresPermissions("supervisiontest:supervision_test:add")
+ @PostMapping(value = "/add")
+ public Result add(@RequestBody SupervisionTest supervisionTest) {
+ supervisionTestService.save(supervisionTest);
+
+ return Result.OK("添加成功!");
+ }
+
+ /**
+ * 编辑
+ *
+ * @param supervisionTest
+ * @return
+ */
+ @AutoLog(value = "supervision_test-编辑")
+ @Operation(summary="supervision_test-编辑")
+ @RequiresPermissions("supervisiontest:supervision_test:edit")
+ @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+ public Result edit(@RequestBody SupervisionTest supervisionTest) {
+ supervisionTestService.updateById(supervisionTest);
+ return Result.OK("编辑成功!");
+ }
+
+ /**
+ * 通过id删除
+ *
+ * @param id
+ * @return
+ */
+ @AutoLog(value = "supervision_test-通过id删除")
+ @Operation(summary="supervision_test-通过id删除")
+ @RequiresPermissions("supervisiontest:supervision_test:delete")
+ @DeleteMapping(value = "/delete")
+ public Result delete(@RequestParam(name="id",required=true) String id) {
+ supervisionTestService.removeById(id);
+ return Result.OK("删除成功!");
+ }
+
+ /**
+ * 批量删除
+ *
+ * @param ids
+ * @return
+ */
+ @AutoLog(value = "supervision_test-批量删除")
+ @Operation(summary="supervision_test-批量删除")
+ @RequiresPermissions("supervisiontest:supervision_test:deleteBatch")
+ @DeleteMapping(value = "/deleteBatch")
+ public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+ this.supervisionTestService.removeByIds(Arrays.asList(ids.split(",")));
+ return Result.OK("批量删除成功!");
+ }
+
+ /**
+ * 通过id查询
+ *
+ * @param id
+ * @return
+ */
+ //@AutoLog(value = "supervision_test-通过id查询")
+ @Operation(summary="supervision_test-通过id查询")
+ @GetMapping(value = "/queryById")
+ public Result queryById(@RequestParam(name="id",required=true) String id) {
+ SupervisionTest supervisionTest = supervisionTestService.getById(id);
+ if(supervisionTest==null) {
+ return Result.error("未找到对应数据");
+ }
+ return Result.OK(supervisionTest);
+ }
+
+ /**
+ * 导出excel
+ *
+ * @param request
+ * @param supervisionTest
+ */
+ @RequiresPermissions("supervisiontest:supervision_test:exportXls")
+ @RequestMapping(value = "/exportXls")
+ public ModelAndView exportXls(HttpServletRequest request, SupervisionTest supervisionTest) {
+ return super.exportXls(request, supervisionTest, SupervisionTest.class, "supervision_test");
+ }
+
+ /**
+ * 通过excel导入数据
+ *
+ * @param request
+ * @param response
+ * @return
+ */
+ @RequiresPermissions("supervisiontest:supervision_test:importExcel")
+ @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+ public Result> importExcel(HttpServletRequest request, HttpServletResponse response) {
+ return super.importExcel(request, response, SupervisionTest.class);
+ }
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/entity/SupervisionTest.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/entity/SupervisionTest.java
new file mode 100644
index 0000000..1ecea13
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/entity/SupervisionTest.java
@@ -0,0 +1,89 @@
+package org.jeecg.modules.demo.supervisiontest.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import org.jeecg.common.constant.ProvinceCityArea;
+import org.jeecg.common.util.SpringContextUtils;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: supervision_test
+ * @Author: jeecg-boot
+ * @Date: 2026-03-20
+ * @Version: V1.0
+ */
+@Data
+@TableName("supervision_test")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description="supervision_test")
+public class SupervisionTest implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**主键*/
+ @TableId(type = IdType.ASSIGN_ID)
+ @Schema(description = "主键")
+ private java.lang.String id;
+ /**创建人*/
+ @Schema(description = "创建人")
+ private java.lang.String createBy;
+ /**创建日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "创建日期")
+ private java.util.Date createTime;
+ /**更新人*/
+ @Schema(description = "更新人")
+ private java.lang.String updateBy;
+ /**更新日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "更新日期")
+ private java.util.Date updateTime;
+ /**所属部门*/
+ @Schema(description = "所属部门")
+ private java.lang.String sysOrgCode;
+ /**附件1*/
+ @Excel(name = "附件1", width = 15)
+ @Schema(description = "附件1")
+ private java.lang.String fileurl1;
+ /**附件2*/
+ @Excel(name = "附件2", width = 15)
+ @Schema(description = "附件2")
+ private java.lang.String fileurl2;
+ /**督办标题*/
+ @Excel(name = "督办标题", width = 15)
+ @Schema(description = "督办标题")
+ private java.lang.String supervisionTitle;
+ /**督办人*/
+ @Excel(name = "督办人", width = 15, dictTable = "sys_user", dicText = "realname", dicCode = "username")
+ @Dict(dictTable = "sys_user", dicText = "realname", dicCode = "username")
+ @Schema(description = "督办人")
+ private java.lang.String supervisionPerson;
+ /**督办部门*/
+ @Excel(name = "督办部门", width = 15, dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
+ @Dict(dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
+ @Schema(description = "督办部门")
+ private java.lang.String supervisionDepart;
+ /**督办类型*/
+ @Excel(name = "督办类型", width = 15)
+ @Schema(description = "督办类型")
+ private java.lang.String supervitionType;
+ /**删除状态(0,正常,1已删除)*/
+ @TableLogic
+ @Dict(dicCode = "del_flag")
+ private String delFlag;
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/mapper/SupervisionTestMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/mapper/SupervisionTestMapper.java
new file mode 100644
index 0000000..53da16c
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/mapper/SupervisionTestMapper.java
@@ -0,0 +1,17 @@
+package org.jeecg.modules.demo.supervisiontest.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.demo.supervisiontest.entity.SupervisionTest;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: supervision_test
+ * @Author: jeecg-boot
+ * @Date: 2026-03-20
+ * @Version: V1.0
+ */
+public interface SupervisionTestMapper extends BaseMapper {
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/mapper/xml/SupervisionTestMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/mapper/xml/SupervisionTestMapper.xml
new file mode 100644
index 0000000..37a7817
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/mapper/xml/SupervisionTestMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/service/ISupervisionTestService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/service/ISupervisionTestService.java
new file mode 100644
index 0000000..0e86cd3
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/service/ISupervisionTestService.java
@@ -0,0 +1,14 @@
+package org.jeecg.modules.demo.supervisiontest.service;
+
+import org.jeecg.modules.demo.supervisiontest.entity.SupervisionTest;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: supervision_test
+ * @Author: jeecg-boot
+ * @Date: 2026-03-20
+ * @Version: V1.0
+ */
+public interface ISupervisionTestService extends IService {
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/service/impl/SupervisionTestServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/service/impl/SupervisionTestServiceImpl.java
new file mode 100644
index 0000000..a6a2350
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/supervisiontest/service/impl/SupervisionTestServiceImpl.java
@@ -0,0 +1,19 @@
+package org.jeecg.modules.demo.supervisiontest.service.impl;
+
+import org.jeecg.modules.demo.supervisiontest.entity.SupervisionTest;
+import org.jeecg.modules.demo.supervisiontest.mapper.SupervisionTestMapper;
+import org.jeecg.modules.demo.supervisiontest.service.ISupervisionTestService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: supervision_test
+ * @Author: jeecg-boot
+ * @Date: 2026-03-20
+ * @Version: V1.0
+ */
+@Service
+public class SupervisionTestServiceImpl extends ServiceImpl implements ISupervisionTestService {
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/controller/DjMeetingRecordController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/controller/DjMeetingRecordController.java
new file mode 100644
index 0000000..3d48616
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/controller/DjMeetingRecordController.java
@@ -0,0 +1,182 @@
+package org.jeecg.modules.demo.tzMetting.controller;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.query.QueryRuleEnum;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.demo.tzMetting.entity.DjMeetingRecord;
+import org.jeecg.modules.demo.tzMetting.service.IDjMeetingRecordService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+import com.alibaba.fastjson.JSON;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+ /**
+ * @Description: 统战座谈会意见台账及督办反馈
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+@Tag(name="统战座谈会意见台账及督办反馈")
+@RestController
+@RequestMapping("/tzMetting/djMeetingRecord")
+@Slf4j
+public class DjMeetingRecordController extends JeecgController {
+ @Autowired
+ private IDjMeetingRecordService djMeetingRecordService;
+
+ /**
+ * 分页列表查询
+ *
+ * @param djMeetingRecord
+ * @param pageNo
+ * @param pageSize
+ * @param req
+ * @return
+ */
+ //@AutoLog(value = "统战座谈会意见台账及督办反馈-分页列表查询")
+ @Operation(summary="统战座谈会意见台账及督办反馈-分页列表查询")
+ @GetMapping(value = "/list")
+ public Result> queryPageList(DjMeetingRecord djMeetingRecord,
+ @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+ @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+ HttpServletRequest req) {
+
+
+ QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(djMeetingRecord, req.getParameterMap());
+ Page page = new Page(pageNo, pageSize);
+ IPage pageList = djMeetingRecordService.page(page, queryWrapper);
+ return Result.OK(pageList);
+ }
+
+ /**
+ * 添加
+ *
+ * @param djMeetingRecord
+ * @return
+ */
+ @AutoLog(value = "统战座谈会意见台账及督办反馈-添加")
+ @Operation(summary="统战座谈会意见台账及督办反馈-添加")
+ @RequiresPermissions("tzMetting:dj_meeting_record:add")
+ @PostMapping(value = "/add")
+ public Result add(@RequestBody DjMeetingRecord djMeetingRecord) {
+ djMeetingRecordService.save(djMeetingRecord);
+
+ return Result.OK("添加成功!");
+ }
+
+ /**
+ * 编辑
+ *
+ * @param djMeetingRecord
+ * @return
+ */
+ @AutoLog(value = "统战座谈会意见台账及督办反馈-编辑")
+ @Operation(summary="统战座谈会意见台账及督办反馈-编辑")
+ @RequiresPermissions("tzMetting:dj_meeting_record:edit")
+ @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+ public Result edit(@RequestBody DjMeetingRecord djMeetingRecord) {
+ djMeetingRecordService.updateById(djMeetingRecord);
+ return Result.OK("编辑成功!");
+ }
+
+ /**
+ * 通过id删除
+ *
+ * @param id
+ * @return
+ */
+ @AutoLog(value = "统战座谈会意见台账及督办反馈-通过id删除")
+ @Operation(summary="统战座谈会意见台账及督办反馈-通过id删除")
+ @RequiresPermissions("tzMetting:dj_meeting_record:delete")
+ @DeleteMapping(value = "/delete")
+ public Result delete(@RequestParam(name="id",required=true) String id) {
+ djMeetingRecordService.removeById(id);
+ return Result.OK("删除成功!");
+ }
+
+ /**
+ * 批量删除
+ *
+ * @param ids
+ * @return
+ */
+ @AutoLog(value = "统战座谈会意见台账及督办反馈-批量删除")
+ @Operation(summary="统战座谈会意见台账及督办反馈-批量删除")
+ @RequiresPermissions("tzMetting:dj_meeting_record:deleteBatch")
+ @DeleteMapping(value = "/deleteBatch")
+ public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+ this.djMeetingRecordService.removeByIds(Arrays.asList(ids.split(",")));
+ return Result.OK("批量删除成功!");
+ }
+
+ /**
+ * 通过id查询
+ *
+ * @param id
+ * @return
+ */
+ //@AutoLog(value = "统战座谈会意见台账及督办反馈-通过id查询")
+ @Operation(summary="统战座谈会意见台账及督办反馈-通过id查询")
+ @GetMapping(value = "/queryById")
+ public Result queryById(@RequestParam(name="id",required=true) String id) {
+ DjMeetingRecord djMeetingRecord = djMeetingRecordService.getById(id);
+ if(djMeetingRecord==null) {
+ return Result.error("未找到对应数据");
+ }
+ return Result.OK(djMeetingRecord);
+ }
+
+ /**
+ * 导出excel
+ *
+ * @param request
+ * @param djMeetingRecord
+ */
+ @RequiresPermissions("tzMetting:dj_meeting_record:exportXls")
+ @RequestMapping(value = "/exportXls")
+ public ModelAndView exportXls(HttpServletRequest request, DjMeetingRecord djMeetingRecord) {
+ return super.exportXls(request, djMeetingRecord, DjMeetingRecord.class, "统战座谈会意见台账及督办反馈");
+ }
+
+ /**
+ * 通过excel导入数据
+ *
+ * @param request
+ * @param response
+ * @return
+ */
+ @RequiresPermissions("tzMetting:dj_meeting_record:importExcel")
+ @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+ public Result> importExcel(HttpServletRequest request, HttpServletResponse response) {
+ return super.importExcel(request, response, DjMeetingRecord.class);
+ }
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/entity/DjMeetingRecord.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/entity/DjMeetingRecord.java
new file mode 100644
index 0000000..7c58bc0
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/entity/DjMeetingRecord.java
@@ -0,0 +1,92 @@
+package org.jeecg.modules.demo.tzMetting.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import org.jeecg.common.constant.ProvinceCityArea;
+import org.jeecg.common.util.SpringContextUtils;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: 统战座谈会意见台账及督办反馈
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+@Data
+@TableName("dj_meeting_record")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description="统战座谈会意见台账及督办反馈")
+public class DjMeetingRecord implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**主键*/
+ @TableId(type = IdType.ASSIGN_ID)
+ @Schema(description = "主键")
+ private java.lang.String id;
+ /**创建人*/
+ @Schema(description = "创建人")
+ private java.lang.String createBy;
+ /**创建日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "创建日期")
+ private java.util.Date createTime;
+ /**更新人*/
+ @Schema(description = "更新人")
+ private java.lang.String updateBy;
+ /**更新日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "更新日期")
+ private java.util.Date updateTime;
+ /**所属部门*/
+ @Schema(description = "所属部门")
+ private java.lang.String sysOrgCode;
+ /**序号*/
+ @Excel(name = "序号", width = 15)
+ @Schema(description = "序号")
+ private java.lang.Integer sortNo;
+ /**问题分类*/
+ @Excel(name = "问题分类", width = 15)
+ @Schema(description = "问题分类")
+ private java.lang.Integer problemType;
+ /**具体措施*/
+ @Excel(name = "具体措施", width = 15)
+ @Schema(description = "具体措施")
+ private java.lang.String specificMeasure;
+ /**完成时限*/
+ @Excel(name = "完成时限", width = 15, format = "yyyy-MM-dd")
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+ @DateTimeFormat(pattern="yyyy-MM-dd")
+ @Schema(description = "完成时限")
+ private java.util.Date completionDeadline;
+ /**责任部门*/
+ @Excel(name = "责任部门", width = 15)
+ @Schema(description = "责任部门")
+ @Dict(dictTable ="sys_depart",dicText = "depart_name",dicCode = "id")
+ private java.lang.String responsibleDept;
+ /**完成情况*/
+ @Excel(name = "完成情况", width = 15)
+ @Schema(description = "完成情况")
+ private java.lang.String completionStatus;
+ /**是否可发起(0不可发起,1可发起)*/
+ @Excel(name = "是否可发起", width = 15)
+ @Dict(dicCode = "is_launchable")
+ private String isLaunchable;
+ @TableLogic(value = "0", delval = "1")
+ private int delFlag = 0;
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/mapper/DjMeetingRecordMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/mapper/DjMeetingRecordMapper.java
new file mode 100644
index 0000000..1dd8148
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/mapper/DjMeetingRecordMapper.java
@@ -0,0 +1,17 @@
+package org.jeecg.modules.demo.tzMetting.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.demo.tzMetting.entity.DjMeetingRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 统战座谈会意见台账及督办反馈
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+public interface DjMeetingRecordMapper extends BaseMapper {
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/mapper/xml/DjMeetingRecordMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/mapper/xml/DjMeetingRecordMapper.xml
new file mode 100644
index 0000000..0add93d
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/mapper/xml/DjMeetingRecordMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/service/IDjMeetingRecordService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/service/IDjMeetingRecordService.java
new file mode 100644
index 0000000..f2da28b
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/service/IDjMeetingRecordService.java
@@ -0,0 +1,14 @@
+package org.jeecg.modules.demo.tzMetting.service;
+
+import org.jeecg.modules.demo.tzMetting.entity.DjMeetingRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * @Description: 统战座谈会意见台账及督办反馈
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+public interface IDjMeetingRecordService extends IService {
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/service/impl/DjMeetingRecordServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/service/impl/DjMeetingRecordServiceImpl.java
new file mode 100644
index 0000000..c4c9d27
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/demo/tzMetting/service/impl/DjMeetingRecordServiceImpl.java
@@ -0,0 +1,19 @@
+package org.jeecg.modules.demo.tzMetting.service.impl;
+
+import org.jeecg.modules.demo.tzMetting.entity.DjMeetingRecord;
+import org.jeecg.modules.demo.tzMetting.mapper.DjMeetingRecordMapper;
+import org.jeecg.modules.demo.tzMetting.service.IDjMeetingRecordService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 统战座谈会意见台账及督办反馈
+ * @Author: jeecg-boot
+ * @Date: 2026-03-24
+ * @Version: V1.0
+ */
+@Service
+public class DjMeetingRecordServiceImpl extends ServiceImpl implements IDjMeetingRecordService {
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/controller/TestMainTableController.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/controller/TestMainTableController.java
new file mode 100644
index 0000000..5cf41b6
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/controller/TestMainTableController.java
@@ -0,0 +1,270 @@
+package org.jeecg.modules.test.controller;
+
+import java.io.UnsupportedEncodingException;
+import java.io.IOException;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.HashMap;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.jeecg.common.system.vo.LoginUser;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.query.QueryRuleEnum;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.test.entity.TestSonTable;
+import org.jeecg.modules.test.entity.TestMainTable;
+import org.jeecg.modules.test.vo.TestMainTablePage;
+import org.jeecg.modules.test.service.ITestMainTableService;
+import org.jeecg.modules.test.service.ITestSonTableService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+import com.alibaba.fastjson.JSON;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+
+
+ /**
+ * @Description: test
+ * @Author: jeecg-boot
+ * @Date: 2026-04-03
+ * @Version: V1.0
+ */
+@Tag(name="test")
+@RestController
+@RequestMapping("/test/testMainTable")
+@Slf4j
+public class TestMainTableController {
+ @Autowired
+ private ITestMainTableService testMainTableService;
+ @Autowired
+ private ITestSonTableService testSonTableService;
+
+ /**
+ * 分页列表查询
+ *
+ * @param testMainTable
+ * @param pageNo
+ * @param pageSize
+ * @param req
+ * @return
+ */
+ //@AutoLog(value = "test-分页列表查询")
+ @Operation(summary="test-分页列表查询")
+ @GetMapping(value = "/list")
+ public Result> queryPageList(TestMainTable testMainTable,
+ @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+ @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+ HttpServletRequest req) {
+ QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(testMainTable, req.getParameterMap());
+ Page page = new Page(pageNo, pageSize);
+ IPage pageList = testMainTableService.page(page, queryWrapper);
+ return Result.OK(pageList);
+ }
+
+ /**
+ * 添加
+ *
+ * @param testMainTablePage
+ * @return
+ */
+ @AutoLog(value = "test-添加")
+ @Operation(summary="test-添加")
+ @RequiresPermissions("test:test_main_table:add")
+ @PostMapping(value = "/add")
+ public Result add(@RequestBody TestMainTablePage testMainTablePage) {
+ TestMainTable testMainTable = new TestMainTable();
+ BeanUtils.copyProperties(testMainTablePage, testMainTable);
+ testMainTableService.saveMain(testMainTable, testMainTablePage.getTestSonTableList());
+ return Result.OK("添加成功!");
+ }
+
+ /**
+ * 编辑
+ *
+ * @param testMainTablePage
+ * @return
+ */
+ @AutoLog(value = "test-编辑")
+ @Operation(summary="test-编辑")
+ @RequiresPermissions("test:test_main_table:edit")
+ @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+ public Result edit(@RequestBody TestMainTablePage testMainTablePage) {
+ TestMainTable testMainTable = new TestMainTable();
+ BeanUtils.copyProperties(testMainTablePage, testMainTable);
+ TestMainTable testMainTableEntity = testMainTableService.getById(testMainTable.getId());
+ if(testMainTableEntity==null) {
+ return Result.error("未找到对应数据");
+ }
+ testMainTableService.updateMain(testMainTable, testMainTablePage.getTestSonTableList());
+ return Result.OK("编辑成功!");
+ }
+
+ /**
+ * 通过id删除
+ *
+ * @param id
+ * @return
+ */
+ @AutoLog(value = "test-通过id删除")
+ @Operation(summary="test-通过id删除")
+ @RequiresPermissions("test:test_main_table:delete")
+ @DeleteMapping(value = "/delete")
+ public Result delete(@RequestParam(name="id",required=true) String id) {
+ testMainTableService.delMain(id);
+ return Result.OK("删除成功!");
+ }
+
+ /**
+ * 批量删除
+ *
+ * @param ids
+ * @return
+ */
+ @AutoLog(value = "test-批量删除")
+ @Operation(summary="test-批量删除")
+ @RequiresPermissions("test:test_main_table:deleteBatch")
+ @DeleteMapping(value = "/deleteBatch")
+ public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+ this.testMainTableService.delBatchMain(Arrays.asList(ids.split(",")));
+ return Result.OK("批量删除成功!");
+ }
+
+ /**
+ * 通过id查询
+ *
+ * @param id
+ * @return
+ */
+ //@AutoLog(value = "test-通过id查询")
+ @Operation(summary="test-通过id查询")
+ @GetMapping(value = "/queryById")
+ public Result queryById(@RequestParam(name="id",required=true) String id) {
+ TestMainTable testMainTable = testMainTableService.getById(id);
+ if(testMainTable==null) {
+ return Result.error("未找到对应数据");
+ }
+ return Result.OK(testMainTable);
+
+ }
+
+ /**
+ * 通过id查询
+ *
+ * @param id
+ * @return
+ */
+ //@AutoLog(value = "test通过主表ID查询")
+ @Operation(summary="test主表ID查询")
+ @GetMapping(value = "/queryTestSonTableByMainId")
+ public Result> queryTestSonTableListByMainId(@RequestParam(name="id",required=true) String id) {
+ List testSonTableList = testSonTableService.selectByMainId(id);
+ return Result.OK(testSonTableList);
+ }
+
+ /**
+ * 导出excel
+ *
+ * @param request
+ * @param testMainTable
+ */
+ @RequiresPermissions("test:test_main_table:exportXls")
+ @RequestMapping(value = "/exportXls")
+ public ModelAndView exportXls(HttpServletRequest request, TestMainTable testMainTable) {
+
+ // Step.1 组装查询条件查询数据
+ QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(testMainTable, request.getParameterMap());
+ LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+
+ //配置选中数据查询条件
+ String selections = request.getParameter("selections");
+ if(oConvertUtils.isNotEmpty(selections)) {
+ List selectionList = Arrays.asList(selections.split(","));
+ queryWrapper.in("id",selectionList);
+ }
+ //Step.2 获取导出数据
+ List testMainTableList = testMainTableService.list(queryWrapper);
+
+ // Step.3 组装pageList
+ List pageList = new ArrayList();
+ for (TestMainTable main : testMainTableList) {
+ TestMainTablePage vo = new TestMainTablePage();
+ BeanUtils.copyProperties(main, vo);
+ List testSonTableList = testSonTableService.selectByMainId(main.getId());
+ vo.setTestSonTableList(testSonTableList);
+ pageList.add(vo);
+ }
+
+ // Step.4 AutoPoi 导出Excel
+ ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+ mv.addObject(NormalExcelConstants.FILE_NAME, "test列表");
+ mv.addObject(NormalExcelConstants.CLASS, TestMainTablePage.class);
+ mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("test数据", "导出人:"+sysUser.getRealname(), "test"));
+ mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+ return mv;
+ }
+
+ /**
+ * 通过excel导入数据
+ *
+ * @param request
+ * @param response
+ * @return
+ */
+ @RequiresPermissions("test:test_main_table:importExcel")
+ @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+ public Result> importExcel(HttpServletRequest request, HttpServletResponse response) {
+ MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+ Map fileMap = multipartRequest.getFileMap();
+ for (Map.Entry entity : fileMap.entrySet()) {
+ // 获取上传文件对象
+ MultipartFile file = entity.getValue();
+ ImportParams params = new ImportParams();
+ params.setTitleRows(2);
+ params.setHeadRows(1);
+ params.setNeedSave(true);
+ try {
+ List list = ExcelImportUtil.importExcel(file.getInputStream(), TestMainTablePage.class, params);
+ for (TestMainTablePage page : list) {
+ TestMainTable po = new TestMainTable();
+ BeanUtils.copyProperties(page, po);
+ testMainTableService.saveMain(po, page.getTestSonTableList());
+ }
+ return Result.OK("文件导入成功!数据行数:" + list.size());
+ } catch (Exception e) {
+ log.error(e.getMessage(),e);
+ return Result.error("文件导入失败:"+e.getMessage());
+ } finally {
+ try {
+ file.getInputStream().close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return Result.OK("文件导入失败!");
+ }
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/entity/TestMainTable.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/entity/TestMainTable.java
new file mode 100644
index 0000000..603e89f
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/entity/TestMainTable.java
@@ -0,0 +1,65 @@
+package org.jeecg.modules.test.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import org.jeecg.common.constant.ProvinceCityArea;
+import org.jeecg.common.util.SpringContextUtils;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * @Description: test
+ * @Author: jeecg-boot
+ * @Date: 2026-04-03
+ * @Version: V1.0
+ */
+@Schema(description="test")
+@Data
+@TableName("test_main_table")
+public class TestMainTable implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**主键*/
+ @TableId(type = IdType.ASSIGN_ID)
+ @Schema(description = "主键")
+ private String id;
+ /**创建人*/
+ @Schema(description = "创建人")
+ private String createBy;
+ /**创建日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "创建日期")
+ private Date createTime;
+ /**更新人*/
+ @Schema(description = "更新人")
+ private String updateBy;
+ /**更新日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "更新日期")
+ private Date updateTime;
+ /**所属部门*/
+ @Schema(description = "所属部门")
+ private String sysOrgCode;
+ /**a字段*/
+ @Excel(name = "a字段", width = 15)
+ @Schema(description = "a字段")
+ private String fieldA;
+ /**b字段*/
+ @Excel(name = "b字段", width = 15)
+ @Schema(description = "b字段")
+ private String fieldB;
+ @TableLogic(value = "0", delval = "1")
+ private int delFlag = 0;
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/entity/TestSonTable.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/entity/TestSonTable.java
new file mode 100644
index 0000000..4dd3db8
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/entity/TestSonTable.java
@@ -0,0 +1,62 @@
+package org.jeecg.modules.test.entity;
+
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import org.jeecg.common.constant.ProvinceCityArea;
+import org.jeecg.common.util.SpringContextUtils;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import java.util.Date;
+import io.swagger.v3.oas.annotations.media.Schema;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * @Description: test
+ * @Author: jeecg-boot
+ * @Date: 2026-04-03
+ * @Version: V1.0
+ */
+@Schema(description="test")
+@Data
+@TableName("test_son_table")
+public class TestSonTable implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**主键*/
+ @TableId(type = IdType.ASSIGN_ID)
+ @Schema(description = "主键")
+ private String id;
+ /**创建人*/
+ @Schema(description = "创建人")
+ private String createBy;
+ /**创建日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "创建日期")
+ private Date createTime;
+ /**更新人*/
+ @Schema(description = "更新人")
+ private String updateBy;
+ /**更新日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "更新日期")
+ private Date updateTime;
+ /**所属部门*/
+ @Schema(description = "所属部门")
+ private String sysOrgCode;
+ /**字段c*/
+ @Excel(name = "字段c", width = 15)
+ @Schema(description = "字段c")
+ private String fieldC;
+ /**主表id*/
+ @Schema(description = "主表id")
+ private String mainTableId;
+ @TableLogic(value = "0", delval = "1")
+ private int delFlag = 0;
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/TestMainTableMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/TestMainTableMapper.java
new file mode 100644
index 0000000..bf1dbc7
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/TestMainTableMapper.java
@@ -0,0 +1,17 @@
+package org.jeecg.modules.test.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.test.entity.TestMainTable;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: test
+ * @Author: jeecg-boot
+ * @Date: 2026-04-03
+ * @Version: V1.0
+ */
+public interface TestMainTableMapper extends BaseMapper {
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/TestSonTableMapper.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/TestSonTableMapper.java
new file mode 100644
index 0000000..ee502e6
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/TestSonTableMapper.java
@@ -0,0 +1,31 @@
+package org.jeecg.modules.test.mapper;
+
+import java.util.List;
+import org.jeecg.modules.test.entity.TestSonTable;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @Description: test
+ * @Author: jeecg-boot
+ * @Date: 2026-04-03
+ * @Version: V1.0
+ */
+public interface TestSonTableMapper extends BaseMapper {
+
+ /**
+ * 通过主表id删除子表数据
+ *
+ * @param mainId 主表id
+ * @return boolean
+ */
+ public boolean deleteByMainId(@Param("mainId") String mainId);
+
+ /**
+ * 通过主表id查询子表数据
+ *
+ * @param mainId 主表id
+ * @return List
+ */
+ public List selectByMainId(@Param("mainId") String mainId);
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/xml/TestMainTableMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/xml/TestMainTableMapper.xml
new file mode 100644
index 0000000..3954740
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/xml/TestMainTableMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/xml/TestSonTableMapper.xml b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/xml/TestSonTableMapper.xml
new file mode 100644
index 0000000..87ca9ba
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/mapper/xml/TestSonTableMapper.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ DELETE
+ FROM test_son_table
+ WHERE
+ main_table_id = #{mainId}
+
+
+
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/ITestMainTableService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/ITestMainTableService.java
new file mode 100644
index 0000000..e84b5be
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/ITestMainTableService.java
@@ -0,0 +1,48 @@
+package org.jeecg.modules.test.service;
+
+import org.jeecg.modules.test.entity.TestSonTable;
+import org.jeecg.modules.test.entity.TestMainTable;
+import com.baomidou.mybatisplus.extension.service.IService;
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @Description: test
+ * @Author: jeecg-boot
+ * @Date: 2026-04-03
+ * @Version: V1.0
+ */
+public interface ITestMainTableService extends IService {
+
+ /**
+ * 添加一对多
+ *
+ * @param testMainTable
+ * @param testSonTableList
+ */
+ public void saveMain(TestMainTable testMainTable,List testSonTableList) ;
+
+ /**
+ * 修改一对多
+ *
+ * @param testMainTable
+ * @param testSonTableList
+ */
+ public void updateMain(TestMainTable testMainTable,List testSonTableList);
+
+ /**
+ * 删除一对多
+ *
+ * @param id
+ */
+ public void delMain (String id);
+
+ /**
+ * 批量删除一对多
+ *
+ * @param idList
+ */
+ public void delBatchMain (Collection extends Serializable> idList);
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/ITestSonTableService.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/ITestSonTableService.java
new file mode 100644
index 0000000..c171ce5
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/ITestSonTableService.java
@@ -0,0 +1,22 @@
+package org.jeecg.modules.test.service;
+
+import org.jeecg.modules.test.entity.TestSonTable;
+import com.baomidou.mybatisplus.extension.service.IService;
+import java.util.List;
+
+/**
+ * @Description: test
+ * @Author: jeecg-boot
+ * @Date: 2026-04-03
+ * @Version: V1.0
+ */
+public interface ITestSonTableService extends IService {
+
+ /**
+ * 通过主表id查询子表数据
+ *
+ * @param mainId 主表id
+ * @return List
+ */
+ public List selectByMainId(String mainId);
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/impl/TestMainTableServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/impl/TestMainTableServiceImpl.java
new file mode 100644
index 0000000..4b49b82
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/impl/TestMainTableServiceImpl.java
@@ -0,0 +1,83 @@
+package org.jeecg.modules.test.service.impl;
+
+import org.jeecg.common.aspect.annotation.CascadeDelete;
+import org.jeecg.common.aspect.annotation.SonTable;
+import org.jeecg.modules.test.entity.TestMainTable;
+import org.jeecg.modules.test.entity.TestSonTable;
+import org.jeecg.modules.test.mapper.TestSonTableMapper;
+import org.jeecg.modules.test.mapper.TestMainTableMapper;
+import org.jeecg.modules.test.service.ITestMainTableService;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Collection;
+import org.jeecg.common.aspect.annotation.AutoLog;
+
+/**
+ * @Description: test
+ * @Author: jeecg-boot
+ * @Date: 2026-04-03
+ * @Version: V1.0
+ */
+@Service
+public class TestMainTableServiceImpl extends ServiceImpl implements ITestMainTableService {
+
+ @Autowired
+ private TestMainTableMapper testMainTableMapper;
+ @Autowired
+ private TestSonTableMapper testSonTableMapper;
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void saveMain(TestMainTable testMainTable, List testSonTableList) {
+ testMainTableMapper.insert(testMainTable);
+ if(testSonTableList!=null && testSonTableList.size()>0) {
+ for(TestSonTable entity:testSonTableList) {
+ //外键设置
+ entity.setMainTableId(testMainTable.getId());
+ testSonTableMapper.insert(entity);
+ }
+ }
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void updateMain(TestMainTable testMainTable,List testSonTableList) {
+ testMainTableMapper.updateById(testMainTable);
+
+ //1.先删除子表数据
+ testSonTableMapper.deleteByMainId(testMainTable.getId());
+
+ //2.子表数据重新插入
+ if(testSonTableList!=null && testSonTableList.size()>0) {
+ for(TestSonTable entity:testSonTableList) {
+ //外键设置
+ entity.setMainTableId(testMainTable.getId());
+ testSonTableMapper.insert(entity);
+ }
+ }
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ @CascadeDelete(sons = {
+ // 配置子表1:Mapper类 + 子表中关联主表的字段名
+ @SonTable(mapper = TestSonTableMapper.class, joinColumn = "main_table_id"),
+ })
+ public void delMain(String id) {
+ testMainTableMapper.deleteById(id);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void delBatchMain(Collection extends Serializable> idList) {
+ for(Serializable id:idList) {
+ testSonTableMapper.deleteByMainId(id.toString());
+ testMainTableMapper.deleteById(id);
+ }
+ }
+
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/impl/TestSonTableServiceImpl.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/impl/TestSonTableServiceImpl.java
new file mode 100644
index 0000000..3bfc3c6
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/service/impl/TestSonTableServiceImpl.java
@@ -0,0 +1,27 @@
+package org.jeecg.modules.test.service.impl;
+
+import org.jeecg.modules.test.entity.TestSonTable;
+import org.jeecg.modules.test.mapper.TestSonTableMapper;
+import org.jeecg.modules.test.service.ITestSonTableService;
+import org.springframework.stereotype.Service;
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * @Description: test
+ * @Author: jeecg-boot
+ * @Date: 2026-04-03
+ * @Version: V1.0
+ */
+@Service
+public class TestSonTableServiceImpl extends ServiceImpl implements ITestSonTableService {
+
+ @Autowired
+ private TestSonTableMapper testSonTableMapper;
+
+ @Override
+ public List selectByMainId(String mainId) {
+ return testSonTableMapper.selectByMainId(mainId);
+ }
+}
diff --git a/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/vo/TestMainTablePage.java b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/vo/TestMainTablePage.java
new file mode 100644
index 0000000..0e73f8f
--- /dev/null
+++ b/jeecg-module-supervision/src/main/java/org/jeecg/modules/test/vo/TestMainTablePage.java
@@ -0,0 +1,64 @@
+package org.jeecg.modules.test.vo;
+
+import java.util.List;
+import org.jeecg.modules.test.entity.TestMainTable;
+import org.jeecg.modules.test.entity.TestSonTable;
+import lombok.Data;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecgframework.poi.excel.annotation.ExcelEntity;
+import org.jeecgframework.poi.excel.annotation.ExcelCollection;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.util.Date;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.jeecg.common.constant.ProvinceCityArea;
+import org.jeecg.common.util.SpringContextUtils;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * @Description: test
+ * @Author: jeecg-boot
+ * @Date: 2026-04-03
+ * @Version: V1.0
+ */
+@Data
+@Schema(description="test")
+public class TestMainTablePage {
+
+ /**主键*/
+ @Schema(description = "主键")
+ private String id;
+ /**创建人*/
+ @Schema(description = "创建人")
+ private String createBy;
+ /**创建日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "创建日期")
+ private Date createTime;
+ /**更新人*/
+ @Schema(description = "更新人")
+ private String updateBy;
+ /**更新日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "更新日期")
+ private Date updateTime;
+ /**所属部门*/
+ @Schema(description = "所属部门")
+ private String sysOrgCode;
+ /**a字段*/
+ @Excel(name = "a字段", width = 15)
+ @Schema(description = "a字段")
+ private String fieldA;
+ /**b字段*/
+ @Excel(name = "b字段", width = 15)
+ @Schema(description = "b字段")
+ private String fieldB;
+
+ @ExcelCollection(name="test")
+ @Schema(description = "test")
+ private List testSonTableList;
+
+}
diff --git a/jeecg-module-supervision/src/test/controller/TestMainTableController.java b/jeecg-module-supervision/src/test/controller/TestMainTableController.java
new file mode 100644
index 0000000..5cf41b6
--- /dev/null
+++ b/jeecg-module-supervision/src/test/controller/TestMainTableController.java
@@ -0,0 +1,270 @@
+package org.jeecg.modules.test.controller;
+
+import java.io.UnsupportedEncodingException;
+import java.io.IOException;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.HashMap;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.jeecg.common.system.vo.LoginUser;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.query.QueryRuleEnum;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.test.entity.TestSonTable;
+import org.jeecg.modules.test.entity.TestMainTable;
+import org.jeecg.modules.test.vo.TestMainTablePage;
+import org.jeecg.modules.test.service.ITestMainTableService;
+import org.jeecg.modules.test.service.ITestSonTableService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+import com.alibaba.fastjson.JSON;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+
+
+ /**
+ * @Description: test
+ * @Author: jeecg-boot
+ * @Date: 2026-04-03
+ * @Version: V1.0
+ */
+@Tag(name="test")
+@RestController
+@RequestMapping("/test/testMainTable")
+@Slf4j
+public class TestMainTableController {
+ @Autowired
+ private ITestMainTableService testMainTableService;
+ @Autowired
+ private ITestSonTableService testSonTableService;
+
+ /**
+ * 分页列表查询
+ *
+ * @param testMainTable
+ * @param pageNo
+ * @param pageSize
+ * @param req
+ * @return
+ */
+ //@AutoLog(value = "test-分页列表查询")
+ @Operation(summary="test-分页列表查询")
+ @GetMapping(value = "/list")
+ public Result> queryPageList(TestMainTable testMainTable,
+ @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+ @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+ HttpServletRequest req) {
+ QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(testMainTable, req.getParameterMap());
+ Page page = new Page(pageNo, pageSize);
+ IPage pageList = testMainTableService.page(page, queryWrapper);
+ return Result.OK(pageList);
+ }
+
+ /**
+ * 添加
+ *
+ * @param testMainTablePage
+ * @return
+ */
+ @AutoLog(value = "test-添加")
+ @Operation(summary="test-添加")
+ @RequiresPermissions("test:test_main_table:add")
+ @PostMapping(value = "/add")
+ public Result add(@RequestBody TestMainTablePage testMainTablePage) {
+ TestMainTable testMainTable = new TestMainTable();
+ BeanUtils.copyProperties(testMainTablePage, testMainTable);
+ testMainTableService.saveMain(testMainTable, testMainTablePage.getTestSonTableList());
+ return Result.OK("添加成功!");
+ }
+
+ /**
+ * 编辑
+ *
+ * @param testMainTablePage
+ * @return
+ */
+ @AutoLog(value = "test-编辑")
+ @Operation(summary="test-编辑")
+ @RequiresPermissions("test:test_main_table:edit")
+ @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+ public Result edit(@RequestBody TestMainTablePage testMainTablePage) {
+ TestMainTable testMainTable = new TestMainTable();
+ BeanUtils.copyProperties(testMainTablePage, testMainTable);
+ TestMainTable testMainTableEntity = testMainTableService.getById(testMainTable.getId());
+ if(testMainTableEntity==null) {
+ return Result.error("未找到对应数据");
+ }
+ testMainTableService.updateMain(testMainTable, testMainTablePage.getTestSonTableList());
+ return Result.OK("编辑成功!");
+ }
+
+ /**
+ * 通过id删除
+ *
+ * @param id
+ * @return
+ */
+ @AutoLog(value = "test-通过id删除")
+ @Operation(summary="test-通过id删除")
+ @RequiresPermissions("test:test_main_table:delete")
+ @DeleteMapping(value = "/delete")
+ public Result delete(@RequestParam(name="id",required=true) String id) {
+ testMainTableService.delMain(id);
+ return Result.OK("删除成功!");
+ }
+
+ /**
+ * 批量删除
+ *
+ * @param ids
+ * @return
+ */
+ @AutoLog(value = "test-批量删除")
+ @Operation(summary="test-批量删除")
+ @RequiresPermissions("test:test_main_table:deleteBatch")
+ @DeleteMapping(value = "/deleteBatch")
+ public Result deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+ this.testMainTableService.delBatchMain(Arrays.asList(ids.split(",")));
+ return Result.OK("批量删除成功!");
+ }
+
+ /**
+ * 通过id查询
+ *
+ * @param id
+ * @return
+ */
+ //@AutoLog(value = "test-通过id查询")
+ @Operation(summary="test-通过id查询")
+ @GetMapping(value = "/queryById")
+ public Result queryById(@RequestParam(name="id",required=true) String id) {
+ TestMainTable testMainTable = testMainTableService.getById(id);
+ if(testMainTable==null) {
+ return Result.error("未找到对应数据");
+ }
+ return Result.OK(testMainTable);
+
+ }
+
+ /**
+ * 通过id查询
+ *
+ * @param id
+ * @return
+ */
+ //@AutoLog(value = "test通过主表ID查询")
+ @Operation(summary="test主表ID查询")
+ @GetMapping(value = "/queryTestSonTableByMainId")
+ public Result> queryTestSonTableListByMainId(@RequestParam(name="id",required=true) String id) {
+ List testSonTableList = testSonTableService.selectByMainId(id);
+ return Result.OK(testSonTableList);
+ }
+
+ /**
+ * 导出excel
+ *
+ * @param request
+ * @param testMainTable
+ */
+ @RequiresPermissions("test:test_main_table:exportXls")
+ @RequestMapping(value = "/exportXls")
+ public ModelAndView exportXls(HttpServletRequest request, TestMainTable testMainTable) {
+
+ // Step.1 组装查询条件查询数据
+ QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(testMainTable, request.getParameterMap());
+ LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+
+ //配置选中数据查询条件
+ String selections = request.getParameter("selections");
+ if(oConvertUtils.isNotEmpty(selections)) {
+ List selectionList = Arrays.asList(selections.split(","));
+ queryWrapper.in("id",selectionList);
+ }
+ //Step.2 获取导出数据
+ List testMainTableList = testMainTableService.list(queryWrapper);
+
+ // Step.3 组装pageList
+ List pageList = new ArrayList();
+ for (TestMainTable main : testMainTableList) {
+ TestMainTablePage vo = new TestMainTablePage();
+ BeanUtils.copyProperties(main, vo);
+ List testSonTableList = testSonTableService.selectByMainId(main.getId());
+ vo.setTestSonTableList(testSonTableList);
+ pageList.add(vo);
+ }
+
+ // Step.4 AutoPoi 导出Excel
+ ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+ mv.addObject(NormalExcelConstants.FILE_NAME, "test列表");
+ mv.addObject(NormalExcelConstants.CLASS, TestMainTablePage.class);
+ mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("test数据", "导出人:"+sysUser.getRealname(), "test"));
+ mv.addObject(NormalExcelConstants.DATA_LIST, pageList);
+ return mv;
+ }
+
+ /**
+ * 通过excel导入数据
+ *
+ * @param request
+ * @param response
+ * @return
+ */
+ @RequiresPermissions("test:test_main_table:importExcel")
+ @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+ public Result> importExcel(HttpServletRequest request, HttpServletResponse response) {
+ MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+ Map fileMap = multipartRequest.getFileMap();
+ for (Map.Entry entity : fileMap.entrySet()) {
+ // 获取上传文件对象
+ MultipartFile file = entity.getValue();
+ ImportParams params = new ImportParams();
+ params.setTitleRows(2);
+ params.setHeadRows(1);
+ params.setNeedSave(true);
+ try {
+ List list = ExcelImportUtil.importExcel(file.getInputStream(), TestMainTablePage.class, params);
+ for (TestMainTablePage page : list) {
+ TestMainTable po = new TestMainTable();
+ BeanUtils.copyProperties(page, po);
+ testMainTableService.saveMain(po, page.getTestSonTableList());
+ }
+ return Result.OK("文件导入成功!数据行数:" + list.size());
+ } catch (Exception e) {
+ log.error(e.getMessage(),e);
+ return Result.error("文件导入失败:"+e.getMessage());
+ } finally {
+ try {
+ file.getInputStream().close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return Result.OK("文件导入失败!");
+ }
+
+}
diff --git a/jeecg-module-supervision/src/test/entity/TestMainTable.java b/jeecg-module-supervision/src/test/entity/TestMainTable.java
new file mode 100644
index 0000000..cb498e0
--- /dev/null
+++ b/jeecg-module-supervision/src/test/entity/TestMainTable.java
@@ -0,0 +1,65 @@
+package org.jeecg.modules.test.entity;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import org.jeecg.common.constant.ProvinceCityArea;
+import org.jeecg.common.util.SpringContextUtils;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecg.common.aspect.annotation.Dict;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * @Description: test
+ * @Author: jeecg-boot
+ * @Date: 2026-04-03
+ * @Version: V1.0
+ */
+@Schema(description="test")
+@Data
+@TableName("test_main_table")
+public class TestMainTable implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**主键*/
+ @TableId(type = IdType.ASSIGN_ID)
+ @Schema(description = "主键")
+ private java.lang.String id;
+ /**创建人*/
+ @Schema(description = "创建人")
+ private java.lang.String createBy;
+ /**创建日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "创建日期")
+ private java.util.Date createTime;
+ /**更新人*/
+ @Schema(description = "更新人")
+ private java.lang.String updateBy;
+ /**更新日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "更新日期")
+ private java.util.Date updateTime;
+ /**所属部门*/
+ @Schema(description = "所属部门")
+ private java.lang.String sysOrgCode;
+ /**a字段*/
+ @Excel(name = "a字段", width = 15)
+ @Schema(description = "a字段")
+ private java.lang.String fieldA;
+ /**b字段*/
+ @Excel(name = "b字段", width = 15)
+ @Schema(description = "b字段")
+ private java.lang.String fieldB;
+ @TableLogic(value = "0", delval = "1")
+ private int delFlag = 0;
+}
diff --git a/jeecg-module-supervision/src/test/entity/TestSonTable.java b/jeecg-module-supervision/src/test/entity/TestSonTable.java
new file mode 100644
index 0000000..0895b9e
--- /dev/null
+++ b/jeecg-module-supervision/src/test/entity/TestSonTable.java
@@ -0,0 +1,62 @@
+package org.jeecg.modules.test.entity;
+
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import org.jeecg.common.constant.ProvinceCityArea;
+import org.jeecg.common.util.SpringContextUtils;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import java.util.Date;
+import io.swagger.v3.oas.annotations.media.Schema;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * @Description: test
+ * @Author: jeecg-boot
+ * @Date: 2026-04-03
+ * @Version: V1.0
+ */
+@Schema(description="test")
+@Data
+@TableName("test_son_table")
+public class TestSonTable implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**主键*/
+ @TableId(type = IdType.ASSIGN_ID)
+ @Schema(description = "主键")
+ private java.lang.String id;
+ /**创建人*/
+ @Schema(description = "创建人")
+ private java.lang.String createBy;
+ /**创建日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "创建日期")
+ private java.util.Date createTime;
+ /**更新人*/
+ @Schema(description = "更新人")
+ private java.lang.String updateBy;
+ /**更新日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "更新日期")
+ private java.util.Date updateTime;
+ /**所属部门*/
+ @Schema(description = "所属部门")
+ private java.lang.String sysOrgCode;
+ /**字段c*/
+ @Excel(name = "字段c", width = 15)
+ @Schema(description = "字段c")
+ private java.lang.String fieldC;
+ /**主表id*/
+ @Schema(description = "主表id")
+ private java.lang.String mainTableId;
+ @TableLogic(value = "0", delval = "1")
+ private int delFlag = 0;
+}
diff --git a/jeecg-module-supervision/src/test/mapper/TestMainTableMapper.java b/jeecg-module-supervision/src/test/mapper/TestMainTableMapper.java
new file mode 100644
index 0000000..bf1dbc7
--- /dev/null
+++ b/jeecg-module-supervision/src/test/mapper/TestMainTableMapper.java
@@ -0,0 +1,17 @@
+package org.jeecg.modules.test.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.test.entity.TestMainTable;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: test
+ * @Author: jeecg-boot
+ * @Date: 2026-04-03
+ * @Version: V1.0
+ */
+public interface TestMainTableMapper extends BaseMapper {
+
+}
diff --git a/jeecg-module-supervision/src/test/mapper/TestSonTableMapper.java b/jeecg-module-supervision/src/test/mapper/TestSonTableMapper.java
new file mode 100644
index 0000000..ee502e6
--- /dev/null
+++ b/jeecg-module-supervision/src/test/mapper/TestSonTableMapper.java
@@ -0,0 +1,31 @@
+package org.jeecg.modules.test.mapper;
+
+import java.util.List;
+import org.jeecg.modules.test.entity.TestSonTable;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @Description: test
+ * @Author: jeecg-boot
+ * @Date: 2026-04-03
+ * @Version: V1.0
+ */
+public interface TestSonTableMapper extends BaseMapper {
+
+ /**
+ * 通过主表id删除子表数据
+ *
+ * @param mainId 主表id
+ * @return boolean
+ */
+ public boolean deleteByMainId(@Param("mainId") String mainId);
+
+ /**
+ * 通过主表id查询子表数据
+ *
+ * @param mainId 主表id
+ * @return List
+ */
+ public List selectByMainId(@Param("mainId") String mainId);
+}
diff --git a/jeecg-module-supervision/src/test/mapper/xml/TestMainTableMapper.xml b/jeecg-module-supervision/src/test/mapper/xml/TestMainTableMapper.xml
new file mode 100644
index 0000000..3954740
--- /dev/null
+++ b/jeecg-module-supervision/src/test/mapper/xml/TestMainTableMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/jeecg-module-supervision/src/test/mapper/xml/TestSonTableMapper.xml b/jeecg-module-supervision/src/test/mapper/xml/TestSonTableMapper.xml
new file mode 100644
index 0000000..87ca9ba
--- /dev/null
+++ b/jeecg-module-supervision/src/test/mapper/xml/TestSonTableMapper.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ DELETE
+ FROM test_son_table
+ WHERE
+ main_table_id = #{mainId}
+
+
+
diff --git a/jeecg-module-supervision/src/test/service/ITestMainTableService.java b/jeecg-module-supervision/src/test/service/ITestMainTableService.java
new file mode 100644
index 0000000..e84b5be
--- /dev/null
+++ b/jeecg-module-supervision/src/test/service/ITestMainTableService.java
@@ -0,0 +1,48 @@
+package org.jeecg.modules.test.service;
+
+import org.jeecg.modules.test.entity.TestSonTable;
+import org.jeecg.modules.test.entity.TestMainTable;
+import com.baomidou.mybatisplus.extension.service.IService;
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @Description: test
+ * @Author: jeecg-boot
+ * @Date: 2026-04-03
+ * @Version: V1.0
+ */
+public interface ITestMainTableService extends IService {
+
+ /**
+ * 添加一对多
+ *
+ * @param testMainTable
+ * @param testSonTableList
+ */
+ public void saveMain(TestMainTable testMainTable,List testSonTableList) ;
+
+ /**
+ * 修改一对多
+ *
+ * @param testMainTable
+ * @param testSonTableList
+ */
+ public void updateMain(TestMainTable testMainTable,List testSonTableList);
+
+ /**
+ * 删除一对多
+ *
+ * @param id
+ */
+ public void delMain (String id);
+
+ /**
+ * 批量删除一对多
+ *
+ * @param idList
+ */
+ public void delBatchMain (Collection extends Serializable> idList);
+
+}
diff --git a/jeecg-module-supervision/src/test/service/ITestSonTableService.java b/jeecg-module-supervision/src/test/service/ITestSonTableService.java
new file mode 100644
index 0000000..c171ce5
--- /dev/null
+++ b/jeecg-module-supervision/src/test/service/ITestSonTableService.java
@@ -0,0 +1,22 @@
+package org.jeecg.modules.test.service;
+
+import org.jeecg.modules.test.entity.TestSonTable;
+import com.baomidou.mybatisplus.extension.service.IService;
+import java.util.List;
+
+/**
+ * @Description: test
+ * @Author: jeecg-boot
+ * @Date: 2026-04-03
+ * @Version: V1.0
+ */
+public interface ITestSonTableService extends IService {
+
+ /**
+ * 通过主表id查询子表数据
+ *
+ * @param mainId 主表id
+ * @return List
+ */
+ public List selectByMainId(String mainId);
+}
diff --git a/jeecg-module-supervision/src/test/service/impl/TestMainTableServiceImpl.java b/jeecg-module-supervision/src/test/service/impl/TestMainTableServiceImpl.java
new file mode 100644
index 0000000..bc65fbf
--- /dev/null
+++ b/jeecg-module-supervision/src/test/service/impl/TestMainTableServiceImpl.java
@@ -0,0 +1,82 @@
+package org.jeecg.modules.test.service.impl;
+
+import org.jeecg.common.aspect.annotation.CascadeDelete;
+import org.jeecg.common.aspect.annotation.SonTable;
+import org.jeecg.modules.test.entity.TestMainTable;
+import org.jeecg.modules.test.entity.TestSonTable;
+import org.jeecg.modules.test.mapper.TestSonTableMapper;
+import org.jeecg.modules.test.mapper.TestMainTableMapper;
+import org.jeecg.modules.test.service.ITestMainTableService;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Collection;
+
+/**
+ * @Description: test
+ * @Author: jeecg-boot
+ * @Date: 2026-04-03
+ * @Version: V1.0
+ */
+@Service
+public class TestMainTableServiceImpl extends ServiceImpl implements ITestMainTableService {
+
+ @Autowired
+ private TestMainTableMapper testMainTableMapper;
+ @Autowired
+ private TestSonTableMapper testSonTableMapper;
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void saveMain(TestMainTable testMainTable, List testSonTableList) {
+ testMainTableMapper.insert(testMainTable);
+ if(testSonTableList!=null && testSonTableList.size()>0) {
+ for(TestSonTable entity:testSonTableList) {
+ //外键设置
+ entity.setMainTableId(testMainTable.getId());
+ testSonTableMapper.insert(entity);
+ }
+ }
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void updateMain(TestMainTable testMainTable,List testSonTableList) {
+ testMainTableMapper.updateById(testMainTable);
+
+ //1.先删除子表数据
+ testSonTableMapper.deleteByMainId(testMainTable.getId());
+
+ //2.子表数据重新插入
+ if(testSonTableList!=null && testSonTableList.size()>0) {
+ for(TestSonTable entity:testSonTableList) {
+ //外键设置
+ entity.setMainTableId(testMainTable.getId());
+ testSonTableMapper.insert(entity);
+ }
+ }
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ @CascadeDelete(sons = {
+ // 配置子表1:Mapper类 + 子表中关联主表的字段名
+ @SonTable(mapper = TestSonTableMapper.class, joinColumn = "main_table_id"),
+ })
+ public void delMain(String id) {
+ testMainTableMapper.deleteById(id);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void delBatchMain(Collection extends Serializable> idList) {
+ for(Serializable id:idList) {
+ testSonTableMapper.deleteByMainId(id.toString());
+ testMainTableMapper.deleteById(id);
+ }
+ }
+
+}
diff --git a/jeecg-module-supervision/src/test/service/impl/TestSonTableServiceImpl.java b/jeecg-module-supervision/src/test/service/impl/TestSonTableServiceImpl.java
new file mode 100644
index 0000000..3bfc3c6
--- /dev/null
+++ b/jeecg-module-supervision/src/test/service/impl/TestSonTableServiceImpl.java
@@ -0,0 +1,27 @@
+package org.jeecg.modules.test.service.impl;
+
+import org.jeecg.modules.test.entity.TestSonTable;
+import org.jeecg.modules.test.mapper.TestSonTableMapper;
+import org.jeecg.modules.test.service.ITestSonTableService;
+import org.springframework.stereotype.Service;
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * @Description: test
+ * @Author: jeecg-boot
+ * @Date: 2026-04-03
+ * @Version: V1.0
+ */
+@Service
+public class TestSonTableServiceImpl extends ServiceImpl implements ITestSonTableService {
+
+ @Autowired
+ private TestSonTableMapper testSonTableMapper;
+
+ @Override
+ public List selectByMainId(String mainId) {
+ return testSonTableMapper.selectByMainId(mainId);
+ }
+}
diff --git a/jeecg-module-supervision/src/test/vo/TestMainTablePage.java b/jeecg-module-supervision/src/test/vo/TestMainTablePage.java
new file mode 100644
index 0000000..ac9359e
--- /dev/null
+++ b/jeecg-module-supervision/src/test/vo/TestMainTablePage.java
@@ -0,0 +1,64 @@
+package org.jeecg.modules.test.vo;
+
+import java.util.List;
+import org.jeecg.modules.test.entity.TestMainTable;
+import org.jeecg.modules.test.entity.TestSonTable;
+import lombok.Data;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecgframework.poi.excel.annotation.ExcelEntity;
+import org.jeecgframework.poi.excel.annotation.ExcelCollection;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.util.Date;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.jeecg.common.constant.ProvinceCityArea;
+import org.jeecg.common.util.SpringContextUtils;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * @Description: test
+ * @Author: jeecg-boot
+ * @Date: 2026-04-03
+ * @Version: V1.0
+ */
+@Data
+@Schema(description="test")
+public class TestMainTablePage {
+
+ /**主键*/
+ @Schema(description = "主键")
+ private java.lang.String id;
+ /**创建人*/
+ @Schema(description = "创建人")
+ private java.lang.String createBy;
+ /**创建日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "创建日期")
+ private java.util.Date createTime;
+ /**更新人*/
+ @Schema(description = "更新人")
+ private java.lang.String updateBy;
+ /**更新日期*/
+ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ @Schema(description = "更新日期")
+ private java.util.Date updateTime;
+ /**所属部门*/
+ @Schema(description = "所属部门")
+ private java.lang.String sysOrgCode;
+ /**a字段*/
+ @Excel(name = "a字段", width = 15)
+ @Schema(description = "a字段")
+ private java.lang.String fieldA;
+ /**b字段*/
+ @Excel(name = "b字段", width = 15)
+ @Schema(description = "b字段")
+ private java.lang.String fieldB;
+
+ @ExcelCollection(name="test")
+ @Schema(description = "test")
+ private List testSonTableList;
+
+}
diff --git a/jeecg-module-supervision/src/test/vue3/TestMainTable.api.ts b/jeecg-module-supervision/src/test/vue3/TestMainTable.api.ts
new file mode 100644
index 0000000..c985263
--- /dev/null
+++ b/jeecg-module-supervision/src/test/vue3/TestMainTable.api.ts
@@ -0,0 +1,71 @@
+import {defHttp} from '/@/utils/http/axios';
+import { useMessage } from "/@/hooks/web/useMessage";
+
+const { createConfirm } = useMessage();
+
+enum Api {
+ list = '/test/testMainTable/list',
+ save='/test/testMainTable/add',
+ edit='/test/testMainTable/edit',
+ deleteOne = '/test/testMainTable/delete',
+ deleteBatch = '/test/testMainTable/deleteBatch',
+ importExcel = '/test/testMainTable/importExcel',
+ exportXls = '/test/testMainTable/exportXls',
+ testSonTableList = '/test/testMainTable/queryTestSonTableByMainId',
+}
+/**
+ * 导出api
+ * @param params
+ */
+export const getExportUrl = Api.exportXls;
+
+/**
+ * 导入api
+ */
+export const getImportUrl = Api.importExcel;
+/**
+ * 查询子表数据
+ * @param params
+ */
+export const testSonTableList = Api.testSonTableList;
+/**
+ * 列表接口
+ * @param params
+ */
+export const list = (params) =>
+ defHttp.get({url: Api.list, params});
+
+/**
+ * 删除单个
+ */
+export const deleteOne = (params,handleSuccess) => {
+ return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
+ handleSuccess();
+ });
+}
+/**
+ * 批量删除
+ * @param params
+ */
+export const batchDelete = (params, handleSuccess) => {
+ createConfirm({
+ iconType: 'warning',
+ title: '确认删除',
+ content: '是否删除选中数据',
+ okText: '确认',
+ cancelText: '取消',
+ onOk: () => {
+ return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {
+ handleSuccess();
+ });
+ }
+ });
+}
+/**
+ * 保存或者更新
+ * @param params
+ */
+export const saveOrUpdate = (params, isUpdate) => {
+ let url = isUpdate ? Api.edit : Api.save;
+ return defHttp.post({url: url, params});
+}
diff --git a/jeecg-module-supervision/src/test/vue3/TestMainTable.data.ts b/jeecg-module-supervision/src/test/vue3/TestMainTable.data.ts
new file mode 100644
index 0000000..6306a78
--- /dev/null
+++ b/jeecg-module-supervision/src/test/vue3/TestMainTable.data.ts
@@ -0,0 +1,81 @@
+import {BasicColumn} from '/@/components/Table';
+import {FormSchema} from '/@/components/Table';
+import { rules} from '/@/utils/helper/validator';
+import { render } from '/@/utils/common/renderUtils';
+import {JVxeTypes,JVxeColumn} from '/@/components/jeecg/JVxeTable/types'
+import { getWeekMonthQuarterYear } from '/@/utils';
+//列表数据
+export const columns: BasicColumn[] = [
+ {
+ title: 'a字段',
+ align:"center",
+ dataIndex: 'fieldA'
+ },
+ {
+ title: 'b字段',
+ align:"center",
+ dataIndex: 'fieldB'
+ },
+];
+//查询数据
+export const searchFormSchema: FormSchema[] = [
+];
+//表单数据
+export const formSchema: FormSchema[] = [
+ {
+ label: 'a字段',
+ field: 'fieldA',
+ component: 'Input',
+ },
+ {
+ label: 'b字段',
+ field: 'fieldB',
+ component: 'Input',
+ },
+ // TODO 主键隐藏字段,目前写死为ID
+ {
+ label: '',
+ field: 'id',
+ component: 'Input',
+ show: false
+ },
+];
+//子表单数据
+export const testSonTableFormSchema: FormSchema[] = [
+ {
+ label: '字段c',
+ field: 'fieldC',
+ component: 'Input',
+ },
+ {
+ label: '',
+ field: 'id',
+ component: 'Input',
+ show: false
+ },
+];
+//子表表格配置
+
+
+// 高级查询数据
+export const superQuerySchema = {
+ fieldA: {title: 'a字段',order: 0,view: 'text', type: 'string',},
+ fieldB: {title: 'b字段',order: 1,view: 'text', type: 'string',},
+ //子表高级查询
+ testSonTable: {
+ title: 'test',
+ view: 'table',
+ fields: {
+ fieldC: {title: '字段c',order: 0,view: 'text', type: 'string',},
+ }
+ },
+};
+
+/**
+* 流程表单调用这个方法获取formSchema
+* @param param
+*/
+export function getBpmFormSchema(_formData): FormSchema[]{
+// 默认和原始表单保持一致 如果流程中配置了权限数据,这里需要单独处理formSchema
+ return formSchema;
+}
\ No newline at end of file
diff --git a/jeecg-module-supervision/src/test/vue3/TestMainTableList.vue b/jeecg-module-supervision/src/test/vue3/TestMainTableList.vue
new file mode 100644
index 0000000..27991f5
--- /dev/null
+++ b/jeecg-module-supervision/src/test/vue3/TestMainTableList.vue
@@ -0,0 +1,207 @@
+
+
+
+
+
+
+ 新增
+ 导出
+ 导入
+
+
+
+
+
+ 删除
+
+
+
+ 批量操作
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jeecg-module-supervision/src/test/vue3/components/TestMainTableForm.vue b/jeecg-module-supervision/src/test/vue3/components/TestMainTableForm.vue
new file mode 100644
index 0000000..0886b2c
--- /dev/null
+++ b/jeecg-module-supervision/src/test/vue3/components/TestMainTableForm.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/jeecg-module-supervision/src/test/vue3/components/TestMainTableModal.vue b/jeecg-module-supervision/src/test/vue3/components/TestMainTableModal.vue
new file mode 100644
index 0000000..58c3627
--- /dev/null
+++ b/jeecg-module-supervision/src/test/vue3/components/TestMainTableModal.vue
@@ -0,0 +1,144 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/jeecg-module-supervision/src/test/vue3/components/TestSonTableForm.vue b/jeecg-module-supervision/src/test/vue3/components/TestSonTableForm.vue
new file mode 100644
index 0000000..15b1fe1
--- /dev/null
+++ b/jeecg-module-supervision/src/test/vue3/components/TestSonTableForm.vue
@@ -0,0 +1,79 @@
+
+
+
+
+
diff --git a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java
index 67966d2..74e3fd1 100644
--- a/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java
+++ b/jeecg-module-system/jeecg-system-api/jeecg-system-local-api/src/main/java/org/jeecg/common/system/api/ISysBaseAPI.java
@@ -1,5 +1,6 @@
package org.jeecg.common.system.api;
+import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.jeecg.common.api.CommonAPI;
import org.jeecg.common.api.dto.DataLogDTO;
@@ -544,4 +545,21 @@ public interface ISysBaseAPI extends CommonAPI {
*/
boolean dictTableWhiteListCheckByDict(String tableOrDictCode, String... fields);
+// 新增附件
+ String addSysFileAttachment(JSONObject jsonObject);
+
+ //删除附件
+ void deleteFileAttachment(String id);
+
+ String getFilePath(String id);
+
+ JSONArray getFileDetialById(String ids);
+
+ JSONArray getFileInfoByBussinessId(String bussinessId, String misFlag);
+
+ String getFilesPath(String ids);
+
+ Map queryFileMapById(String id);
+
+ String updateBusinessId(String businessId, List deliverablesList);
}
diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/FileController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/FileController.java
new file mode 100644
index 0000000..2620f44
--- /dev/null
+++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/FileController.java
@@ -0,0 +1,507 @@
+package org.jeecg.modules.system.controller;
+
+
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.druid.util.StringUtils;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.util.IOUtils;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authz.UnauthorizedException;
+import org.apiguardian.api.API;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.common.system.api.ISysBaseAPI;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.*;
+import org.jeecg.modules.base.service.BaseCommonService;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.lang.reflect.Array;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.util.*;
+
+/**
+ * @Description: 文件上传下载更新接口
+ * @Author: gelingjia
+ * @Date:2025.9.22
+ * @Version:V1.0
+ */
+@Tag(name = "文件上传下载更新接口")
+@RestController
+@RequestMapping("/sys/file")
+@Slf4j
+public class FileController {
+
+
+ @Autowired
+ public ISysBaseAPI sysBaseAPI;
+ @Autowired
+ private RedisUtil redisUtil;
+ @Autowired
+ private BaseCommonService baseCommonService;
+ @Value(value = "${jeecg.appName}")
+ private String applicationName;
+
+
+
+ /**
+ * 附件加密上传接口
+ *
+ * @param request
+ * @param response
+ * @return
+ */
+ @AutoLog(value = "系统自动日志:文件加密上传")
+ @Operation(summary = "附件加密上传接口")
+ @PostMapping(value = "/upload")
+ public Result