Ver código fonte

Merge remote-tracking branch 'origin/master'

kk 4 dias atrás
pai
commit
eabac334c6
56 arquivos alterados com 5429 adições e 8 exclusões
  1. 369 0
      .docs/260611-数据统计模块开发记录.md
  2. 149 0
      .docs/sql/建表语句/数据统计3张表.sql
  3. 267 0
      .docs/sql/测试数据/数据统计3张表测试数据.sql
  4. 92 0
      .docs/系统需要的数据字典.txt
  5. 217 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statJobReflux/controller/StatJobRefluxController.java
  6. 101 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statJobReflux/entity/StatJobReflux.java
  7. 46 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statJobReflux/entity/StatJobRefluxStatisticsVo.java
  8. 22 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statJobReflux/mapper/StatJobRefluxMapper.java
  9. 19 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statJobReflux/mapper/xml/StatJobRefluxMapper.xml
  10. 31 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statJobReflux/service/IStatJobRefluxService.java
  11. 36 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statJobReflux/service/impl/StatJobRefluxServiceImpl.java
  12. 217 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statKeyPersonReflux/controller/StatKeyPersonRefluxController.java
  13. 91 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statKeyPersonReflux/entity/StatKeyPersonReflux.java
  14. 51 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statKeyPersonReflux/entity/StatKeyPersonRefluxStatisticsVo.java
  15. 21 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statKeyPersonReflux/mapper/StatKeyPersonRefluxMapper.java
  16. 30 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statKeyPersonReflux/mapper/xml/StatKeyPersonRefluxMapper.xml
  17. 31 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statKeyPersonReflux/service/IStatKeyPersonRefluxService.java
  18. 39 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statKeyPersonReflux/service/impl/StatKeyPersonRefluxServiceImpl.java
  19. 217 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statWorkerReflux/controller/StatWorkerRefluxController.java
  20. 95 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statWorkerReflux/entity/StatWorkerReflux.java
  21. 46 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statWorkerReflux/entity/StatWorkerRefluxStatisticsVo.java
  22. 21 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statWorkerReflux/mapper/StatWorkerRefluxMapper.java
  23. 24 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statWorkerReflux/mapper/xml/StatWorkerRefluxMapper.xml
  24. 31 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statWorkerReflux/service/IStatWorkerRefluxService.java
  25. 40 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statWorkerReflux/service/impl/StatWorkerRefluxServiceImpl.java
  26. 3 0
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/personal/entity/PersonalInfo.java
  27. 1 7
      jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/personal/vo/PersonalInfoVO.java
  28. 421 0
      jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V20260611_1__menu_dataReflux.sql
  29. 79 0
      jeecgboot-vue3/src/views/dataReflux/statJobReflux/StatJobReflux.api.ts
  30. 77 0
      jeecgboot-vue3/src/views/dataReflux/statJobReflux/StatJobReflux.data.ts
  31. 168 0
      jeecgboot-vue3/src/views/dataReflux/statJobReflux/StatJobRefluxList.vue
  32. 95 0
      jeecgboot-vue3/src/views/dataReflux/statJobReflux/components/StatJobRefluxDetailModal.vue
  33. 201 0
      jeecgboot-vue3/src/views/dataReflux/statJobReflux/components/StatJobRefluxForm.vue
  34. 92 0
      jeecgboot-vue3/src/views/dataReflux/statJobReflux/components/StatJobRefluxModal.vue
  35. 79 0
      jeecgboot-vue3/src/views/dataReflux/statKeyPersonReflux/StatKeyPersonReflux.api.ts
  36. 59 0
      jeecgboot-vue3/src/views/dataReflux/statKeyPersonReflux/StatKeyPersonReflux.data.ts
  37. 168 0
      jeecgboot-vue3/src/views/dataReflux/statKeyPersonReflux/StatKeyPersonRefluxList.vue
  38. 84 0
      jeecgboot-vue3/src/views/dataReflux/statKeyPersonReflux/components/StatKeyPersonRefluxDetailModal.vue
  39. 183 0
      jeecgboot-vue3/src/views/dataReflux/statKeyPersonReflux/components/StatKeyPersonRefluxForm.vue
  40. 92 0
      jeecgboot-vue3/src/views/dataReflux/statKeyPersonReflux/components/StatKeyPersonRefluxModal.vue
  41. 79 0
      jeecgboot-vue3/src/views/dataReflux/statWorkerReflux/StatWorkerReflux.api.ts
  42. 65 0
      jeecgboot-vue3/src/views/dataReflux/statWorkerReflux/StatWorkerReflux.data.ts
  43. 168 0
      jeecgboot-vue3/src/views/dataReflux/statWorkerReflux/StatWorkerRefluxList.vue
  44. 88 0
      jeecgboot-vue3/src/views/dataReflux/statWorkerReflux/components/StatWorkerRefluxDetailModal.vue
  45. 189 0
      jeecgboot-vue3/src/views/dataReflux/statWorkerReflux/components/StatWorkerRefluxForm.vue
  46. 92 0
      jeecgboot-vue3/src/views/dataReflux/statWorkerReflux/components/StatWorkerRefluxModal.vue
  47. 1 1
      jeecgboot-vue3/src/views/deepAnalysis/absorbDifficultSubsidy/DaAbsorbDifficultSubsidy.data.ts
  48. 17 0
      jeecgboot-vue3/src/views/statistics/jobReflux/JobRefluxStatistics.api.ts
  49. 55 0
      jeecgboot-vue3/src/views/statistics/jobReflux/JobRefluxStatistics.data.ts
  50. 140 0
      jeecgboot-vue3/src/views/statistics/jobReflux/JobRefluxStatisticsList.vue
  51. 17 0
      jeecgboot-vue3/src/views/statistics/keyPersonReflux/KeyPersonRefluxStatistics.api.ts
  52. 61 0
      jeecgboot-vue3/src/views/statistics/keyPersonReflux/KeyPersonRefluxStatistics.data.ts
  53. 140 0
      jeecgboot-vue3/src/views/statistics/keyPersonReflux/KeyPersonRefluxStatisticsList.vue
  54. 17 0
      jeecgboot-vue3/src/views/statistics/workerReflux/WorkerRefluxStatistics.api.ts
  55. 55 0
      jeecgboot-vue3/src/views/statistics/workerReflux/WorkerRefluxStatistics.data.ts
  56. 140 0
      jeecgboot-vue3/src/views/statistics/workerReflux/WorkerRefluxStatisticsList.vue

+ 369 - 0
.docs/260611-数据统计模块开发记录.md

@@ -0,0 +1,369 @@
+# 数据统计模块开发记录
+
+> 创建日期:2026-06-11   
+> 需求依据:《需求规格说明书》第3.11节 - 数据统计
+
+---
+
+## 一、模块概述
+
+"数据统计"模块用于接收外部系统回流的数据,包含3张核心明细表及其对应的3张统计报表页面,共6个前端菜单。
+
+### 1.1 三张核心数据表
+
+| 序号 | 表名 | 表说明 | 实体类 |
+|------|------|--------|--------|
+| 1 | `stat_job_reflux` | 岗位数据回流明细表 | `StatJobReflux` |
+| 2 | `stat_key_person_reflux` | 重点人群回流明细表 | `StatKeyPersonReflux` |
+| 3 | `stat_worker_reflux` | 农民工流动回流明细表 | `StatWorkerReflux` |
+
+### 1.2 六个前端页面
+
+| 序号 | 路由路径 | 页面名称 | 功能类型 |
+|------|----------|----------|----------|
+| 1 | `/dataReflux/statJobReflux` | 岗位回流数据 | 明细管理 |
+| 2 | `/dataReflux/statWorkerReflux` | 农民工流动回流数据 | 明细管理 |
+| 3 | `/dataReflux/statKeyPersonReflux` | 重点人群回流数据 | 明细管理 |
+| 4 | `/statistics/jobReflux` | 岗位归集数量统计 | 统计报表 |
+| 5 | `/statistics/workerReflux` | 农民工返乡返岗统计 | 统计报表 |
+| 6 | `/statistics/keyPersonReflux` | 重点人群统计 | 统计报表 |
+
+---
+
+## 二、后端代码结构
+
+后端代码位于路径:`jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/`
+
+每个子模块(statJobReflux / statKeyPersonReflux / statWorkerReflux)均采用统一的分层架构:
+
+```
+├── controller/          # 控制器层(REST API)
+├── entity/              # 实体类 + 统计VO
+├── mapper/              # MyBatis Mapper接口
+│   └── xml/             # Mapper XML
+└── service/             # 业务接口
+    └── impl/            # 业务实现
+```
+
+### 2.1 各表实体字段说明
+
+#### stat_job_reflux(岗位数据回流明细表)
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| id | String | 主键(ASSIGN_ID) |
+| unitCreditCode | String | 统一社会信用代码 |
+| enterpriseName | String | 企业名称 |
+| district | String | 所属区县 |
+| jobName | String | 招聘岗位名称 |
+| planHireCount | Integer | 计划招聘人数 |
+| jobIndustry | String | 岗位所属行业 |
+| salaryRange | String | 薪资区间 |
+| educationRequire | String | 学历要求 |
+| jobPublishTime | Date | 岗位发布时间 |
+| jobStatus | String | 岗位状态 |
+| dataRefluxTime | Date | 数据回流时间 |
+| createBy/createTime/updateBy/updateTime/sysOrgCode | — | 系统标准字段 |
+
+#### stat_key_person_reflux(重点人群回流明细表)
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| id | String | 主键(ASSIGN_ID) |
+| idCard | String | 身份证号码 |
+| fullName | String | 姓名 |
+| district | String | 所属区县 |
+| keyPersonCategory | String | 重点人群类别 |
+| confirmDate | Date | 认定日期 |
+| validDate | Date | 有效日期 |
+| currentEmployStatus | String | 当前就业状态 |
+| dataRefluxTime | Date | 数据回流时间 |
+| createBy/createTime/updateBy/updateTime/sysOrgCode | — | 系统标准字段 |
+
+#### stat_worker_reflux(农民工流动回流明细表)
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| id | String | 主键(ASSIGN_ID) |
+| idCard | String | 身份证号码 |
+| fullName | String | 姓名 |
+| district | String | 所属区县 |
+| ruralRegisterFlag | String | 乡村户籍标识 |
+| originWorkArea | String | 原就业外出地市/省份 |
+| workEndDate | Date | 外出就业结束日期 |
+| localEmployDate | Date | 本地新就业登记日期 |
+| personCategoryTag | String | 人员类别标签 |
+| dataRefluxTime | Date | 数据回流时间 |
+| createBy/createTime/updateBy/updateTime/sysOrgCode | — | 系统标准字段 |
+
+### 2.2 Controller API 接口
+
+每个Controller继承自 `JeecgController<T, IService<T>>`,提供以下标准接口:
+
+| 接口 | HTTP方法 | 路径 | 说明 |
+|------|----------|------|------|
+| 分页查询 | GET | `/list` | 支持QueryGenerator动态查询条件 |
+| 主键查询 | GET | `/queryById` | 通过id查询单条记录 |
+| 新增 | POST | `/add` | 新增记录 |
+| 编辑 | PUT/POST | `/edit` | 更新记录 |
+| 删除 | DELETE | `/delete` | 通过id删除 |
+| 批量删除 | DELETE | `/deleteBatch` | 逗号分隔id批量删除 |
+| 导出Excel | GET/POST | `/exportXls` | 导出明细数据到Excel |
+| 导入Excel | POST | `/importExcel` | 从Excel导入数据 |
+| 统计查询 | GET | `/statistics/queryByMonth` | 按月统计查询(传入year参数) |
+| 统计导出 | GET/POST | `/statistics/exportXls` | 导出统计报表到Excel |
+
+### 2.3 统计SQL逻辑
+
+三个MyBatis XML中的统计SQL均按 **年份** 进行筛选,按 **月份 + 区县**(+ 类别)维度进行 GROUP BY 聚合:
+
+- **岗位统计**:`DATE_FORMAT(t.DATA_REFLUX_TIME, '%Y-%m')` + `DISTRICT`,统计归集总数、本期新增、本期失效
+- **重点人群统计**:`DATE_FORMAT(t.DATA_REFLUX_TIME, '%Y-%m')` + `DISTRICT` + `KEY_PERSON_CATEGORY`,统计总人数、已失效人数、未就业人数
+- **农民工统计**:`DATE_FORMAT(t.DATA_REFLUX_TIME, '%Y-%m')` + `DISTRICT` + `PERSON_CATEGORY_TAG`,统计返乡总人数、新就业登记人数
+
+### 2.4 Service层
+
+- 每个Service接口均扩展 `IService<T>`,继承MyBatis-Plus基础CRUD能力
+- 每个ServiceImpl均扩展 `ServiceImpl<Mapper, Entity>`,实现 `ITranslateDictFieldService` 接口
+- `translateDictFields` 方法用于导出时将字典值翻译为中文标签(当前3表暂无字典字段需要翻译,直接返回原列表)
+- `queryStatisticsByYear` 方法委托给对应的Mapper执行统计SQL
+
+---
+
+## 三、前端代码结构
+
+### 3.1 明细管理页面(dataReflux目录)
+
+每个表的明细页面包含6个文件,结构一致:
+
+| 文件 | 说明 |
+|------|------|
+| `StatXxxReflux.api.ts` | API接口定义(list/save/edit/delete/exportXls/importExcel/queryById) |
+| `StatXxxReflux.data.ts` | 表格列定义(columns)+ 高级查询字段定义(superQuerySchema) |
+| `StatXxxRefluxList.vue` | 列表主页面(查询区域 + BasicTable + 导出按钮 + 详情弹窗) |
+| `components/StatXxxRefluxDetailModal.vue` | 详情弹窗组件(使用a-descriptions展示字段) |
+| `components/StatXxxRefluxForm.vue` | 表单组件(新增/编辑) |
+| `components/StatXxxRefluxModal.vue` | 弹窗容器组件(包裹Form) |
+
+#### 关键技术点:
+
+1. **查询区域**:默认可见3个查询条件,高级搜索通过 `superQuerySchema` 支持更多字段
+2. **操作栏**:每行显示"查看"按钮,点击打开详情弹窗
+3. **详情弹窗**:通过 `queryById` 接口获取完整数据,使用 `a-descriptions` 展示
+4. **导出**:通过 `useListPage` hook 统一的 `onExportXls` 方法
+5. **日期选择器**:表单中的日期字段使用 `a-date-picker`,格式为 `YYYY-MM-DD`
+
+#### 查询条件(各表默认可见):
+
+| 表 | 查询条件1 | 查询条件2 | 查询条件3 |
+|----|-----------|-----------|-----------|
+| 岗位 | 企业名称 | 岗位名称 | 所属区县 |
+| 重点人群 | 姓名 | 身份证号码 | 所属区县 |
+| 农民工 | 姓名 | 身份证号码 | 所属区县 |
+
+### 3.2 统计报表页面(statistics目录)
+
+每个表的统计页面包含3个文件,结构一致:
+
+| 文件 | 说明 |
+|------|------|
+| `XxxStatistics.api.ts` | API定义(statisticsList + statisticsExportXls) |
+| `XxxStatistics.data.ts` | 统计表格列定义 + 单元格合并逻辑 |
+| `XxxStatisticsList.vue` | 统计列表页面(年份选择 + BasicTable + 导出按钮) |
+
+#### 关键技术点:
+
+1. **年份选择器**:使用 `a-date-picker picker="year"`,默认值为当前年份
+2. **单元格合并**:通过 `afterFetch` 钩子计算同月份行的 `_rowSpanMap`,在 `customCell` 中实现同月份的多行合并展示
+3. **分页**:统计报表关闭分页(`pagination: false`),一次性展示全年数据
+4. **操作栏**:统计报表隐藏操作栏(`showActionColumn: false`)
+
+#### 统计报表列定义:
+
+**岗位归集数量统计报表**:
+
+| 列 | 是否合并 |
+|----|----------|
+| 序号 | 按月合并 |
+| 统计月份 | 按月合并 |
+| 所属区县 | 不合并 |
+| 归集岗位总数 | 不合并 |
+| 本期新增岗位数 | 不合并 |
+| 本期失效下架岗位数 | 不合并 |
+
+**重点人群统计报表**:
+
+| 列 | 是否合并 |
+|----|----------|
+| 序号 | 按月合并 |
+| 统计月份 | 按月合并 |
+| 所属区县 | 不合并 |
+| 重点人群类别 | 不合并 |
+| 本期本类别总人数 | 不合并 |
+| 本期本类别已失效总人数 | 不合并 |
+| 本期本类别未就业总人数 | 不合并 |
+
+**农民工返乡返岗统计报表**:
+
+| 列 | 是否合并 |
+|----|----------|
+| 序号 | 按月合并 |
+| 统计月份 | 按月合并 |
+| 所属区县 | 不合并 |
+| 人员类别 | 不合并 |
+| 本期返乡总人数 | 不合并 |
+| 本期新就业登记总人数 | 不合并 |
+
+---
+
+## 四、权限与菜单配置
+
+权限菜单SQL文件位于:  
+`jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V20260611_1__menu_dataReflux.sql`
+
+### 4.1 菜单结构
+
+所有主菜单的父级菜单ID为 `2064888275729645570`。
+
+#### 明细管理菜单(3个主菜单,每个含7个子权限):
+
+| 菜单ID | 菜单名称 | 排序 |
+|--------|----------|------|
+| 178061200000101 | 岗位回流数据 | 1 |
+| 178061200000201 | 农民工流动回流数据 | 2 |
+| 178061200000301 | 重点人群回流数据 | 3 |
+
+每个主菜单下包含:添加、编辑、删除、批量删除、导出excel、导入excel 共6个按钮级权限。
+
+#### 统计报表菜单(3个主菜单,每个含2个子权限):
+
+| 菜单ID | 菜单名称 | 排序 |
+|--------|----------|------|
+| 178061200000401 | 岗位归集数量统计 | 4 |
+| 178061200000501 | 农民工返乡返岗统计 | 5 |
+| 178061200000601 | 重点人群统计 | 6 |
+
+每个统计菜单下包含:查询、导出excel 共2个按钮级权限。
+
+### 4.2 权限命名规范
+
+| 权限类型 | 格式 |
+|----------|------|
+| 明细-添加 | `dataReflux:stat_{table}_reflux:add` |
+| 明细-编辑 | `dataReflux:stat_{table}_reflux:edit` |
+| 明细-删除 | `dataReflux:stat_{table}_reflux:delete` |
+| 明细-批量删除 | `dataReflux:stat_{table}_reflux:deleteBatch` |
+| 明细-导出 | `dataReflux:stat_{table}_reflux:exportXls` |
+| 明细-导入 | `dataReflux:stat_{table}_reflux:importExcel` |
+| 统计-查询 | `dataReflux:stat_{table}_reflux:statisticsQuery` |
+| 统计-导出 | `dataReflux:stat_{table}_reflux:statisticsExportXls` |
+
+其中 `{table}` 为 `job` / `worker` / `key_person`。
+
+### 4.3 角色授权
+
+所有菜单和权限均已授权给 admin 角色(role_id: `f6817f48af4fb3af11b9e8bf182f618b`)。
+
+---
+
+## 五、涉及文件清单
+
+### 5.1 后端文件(21个)
+
+```
+jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/
+├── statJobReflux/
+│   ├── controller/StatJobRefluxController.java        # 岗位回流控制器(CRUD + 统计 + Excel导入导出)
+│   ├── entity/StatJobReflux.java                      # 岗位回流实体(11个业务字段)
+│   ├── entity/StatJobRefluxStatisticsVo.java          # 岗位统计报表VO(5个统计字段)
+│   ├── mapper/StatJobRefluxMapper.java                # Mapper接口(统计查询方法)
+│   ├── mapper/xml/StatJobRefluxMapper.xml             # 统计SQL(按月+区县分组聚合)
+│   ├── service/IStatJobRefluxService.java             # 服务接口
+│   └── service/impl/StatJobRefluxServiceImpl.java     # 服务实现
+├── statKeyPersonReflux/
+│   ├── controller/StatKeyPersonRefluxController.java  # 重点人群回流控制器
+│   ├── entity/StatKeyPersonReflux.java                # 重点人群回流实体(8个业务字段)
+│   ├── entity/StatKeyPersonRefluxStatisticsVo.java    # 重点人群统计报表VO(6个统计字段)
+│   ├── mapper/StatKeyPersonRefluxMapper.java          # Mapper接口
+│   ├── mapper/xml/StatKeyPersonRefluxMapper.xml       # 统计SQL(按月+区县+类别分组)
+│   ├── service/IStatKeyPersonRefluxService.java       # 服务接口
+│   └── service/impl/StatKeyPersonRefluxServiceImpl.java # 服务实现
+└── statWorkerReflux/
+    ├── controller/StatWorkerRefluxController.java     # 农民工回流控制器
+    ├── entity/StatWorkerReflux.java                   # 农民工回流实体(9个业务字段)
+    ├── entity/StatWorkerRefluxStatisticsVo.java       # 农民工统计报表VO(5个统计字段)
+    ├── mapper/StatWorkerRefluxMapper.java             # Mapper接口
+    ├── mapper/xml/StatWorkerRefluxMapper.xml          # 统计SQL(按月+区县+人员类别分组)
+    ├── service/IStatWorkerRefluxService.java          # 服务接口
+    └── service/impl/StatWorkerRefluxServiceImpl.java  # 服务实现
+```
+
+### 5.2 前端文件(27个)
+
+```
+jeecgboot-vue3/src/views/
+
+dataReflux/
+├── statJobReflux/
+│   ├── StatJobReflux.api.ts                           # 岗位回流API定义(8个接口)
+│   ├── StatJobReflux.data.ts                          # 岗位表格列定义(11列) + 高级查询(11字段)
+│   ├── StatJobRefluxList.vue                          # 岗位回流列表页(企业名称/岗位名称/区县查询)
+│   └── components/
+│       ├── StatJobRefluxDetailModal.vue               # 岗位详情弹窗
+│       ├── StatJobRefluxForm.vue                      # 岗位表单(11个业务字段输入)
+│       └── StatJobRefluxModal.vue                     # 岗位弹窗容器
+├── statKeyPersonReflux/
+│   ├── StatKeyPersonReflux.api.ts                     # 重点人群回流API定义
+│   ├── StatKeyPersonReflux.data.ts                    # 重点人群表格列定义(8列) + 高级查询(8字段)
+│   ├── StatKeyPersonRefluxList.vue                    # 重点人群列表页(姓名/身份证/区县查询)
+│   └── components/
+│       ├── StatKeyPersonRefluxDetailModal.vue         # 重点人群详情弹窗
+│       ├── StatKeyPersonRefluxForm.vue                # 重点人群表单(8个业务字段输入)
+│       └── StatKeyPersonRefluxModal.vue               # 重点人群弹窗容器
+└── statWorkerReflux/
+    ├── StatWorkerReflux.api.ts                        # 农民工回流API定义
+    ├── StatWorkerReflux.data.ts                       # 农民工表格列定义(9列) + 高级查询(9字段)
+    ├── StatWorkerRefluxList.vue                       # 农民工列表页(姓名/身份证/区县查询)
+    └── components/
+        ├── StatWorkerRefluxDetailModal.vue            # 农民工详情弹窗
+        ├── StatWorkerRefluxForm.vue                   # 农民工表单(9个业务字段输入)
+        └── StatWorkerRefluxModal.vue                  # 农民工弹窗容器
+
+statistics/
+├── jobReflux/
+│   ├── JobRefluxStatistics.api.ts                     # 岗位统计API(查询+导出)
+│   ├── JobRefluxStatistics.data.ts                    # 岗位统计表格列定义(6列,含单元格合并)
+│   └── JobRefluxStatisticsList.vue                    # 岗位统计页面(年份选择 + 无分页 + 月份合并)
+├── keyPersonReflux/
+│   ├── KeyPersonRefluxStatistics.api.ts               # 重点人群统计API
+│   ├── KeyPersonRefluxStatistics.data.ts              # 重点人群统计表格列定义(7列,含单元格合并)
+│   └── KeyPersonRefluxStatisticsList.vue              # 重点人群统计页面
+└── workerReflux/
+    ├── WorkerRefluxStatistics.api.ts                  # 农民工统计API
+    ├── WorkerRefluxStatistics.data.ts                 # 农民工统计表格列定义(6列,含单元格合并)
+    └── WorkerRefluxStatisticsList.vue                 # 农民工统计页面
+```
+
+### 5.3 SQL文件(1个)
+
+```
+jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/
+└── V20260611_1__menu_dataReflux.sql                   # 菜单权限SQL(6个主菜单 + 37个子权限 + 角色授权)
+```
+
+---
+
+## 六、技术要点总结
+
+| 要点 | 说明 |
+|------|------|
+| 框架 | Spring Boot + MyBatis-Plus + JeecgBoot |
+| ORM | MyBatis-Plus(基础CRUD自动生成)+ MyBatis XML(统计SQL手写) |
+| 前端 | Vue 3 + TypeScript + Ant Design Vue + JeecgBoot Vue3封装组件 |
+| 权限 | Apache Shiro注解 + sys_permission表存储菜单/按钮权限 |
+| 导入导出 | AutoPoi(JeecgEntityExcelView) |
+| 数据库迁移 | Flyway(SQL脚本命名规范:V{YYYYMMDD}_{序号}__描述.sql) |
+| 统计维度 | 年份筛选 + 月份/区县/类别多维度聚合 |
+| 前端合并 | 通过 `afterFetch` 计算 `_rowSpanMap` + `customCell` 实现同月单元格合并 |
+| JSON格式化 | 后端日期字段统一 `GMT+8`、`yyyy-MM-dd` 格式 |
+| Excel导出 | 明细导出 - 可选择导出字段列表;统计导出 - 固定导出字段 |

+ 149 - 0
.docs/sql/建表语句/数据统计3张表.sql

@@ -0,0 +1,149 @@
+-- ============================================================
+-- 湛江市智慧人社运营运维(2025-2027年)项目
+-- 就业一湛通服务平台 - 数据统计 达梦数据库建表脚本
+-- 
+-- 依据:《需求规格说明书》第3.11节 - 数据统计
+--   3.11.1 统计岗位归集数量 - 岗位数据回流明细表
+--   3.11.2 农民工返乡返岗统计 - 农民工流动回流明细表
+--   3.11.3 重点人群统计 - 重点人群回流明细表
+-- 数据库:达梦数据库 (DM8)
+-- 创建日期:2025-06-10
+-- ============================================================
+
+-- ============================================================
+-- 表1:岗位数据回流明细表
+-- 说明:按行业、主管部门、县(市、区)、镇街统计岗位归集数量的数据明细
+-- 数据来源:省平台回流
+-- ============================================================
+CREATE TABLE STAT_JOB_REFLUX (
+    ID                              VARCHAR(36)     NOT NULL,
+    UNIT_CREDIT_CODE                VARCHAR(50),
+    ENTERPRISE_NAME                 VARCHAR(200),
+    DISTRICT                        VARCHAR(50),
+    JOB_NAME                        VARCHAR(200),
+    PLAN_HIRE_COUNT                 INTEGER,
+    JOB_INDUSTRY                    VARCHAR(100),
+    SALARY_RANGE                    VARCHAR(100),
+    EDUCATION_REQUIRE               VARCHAR(100),
+    JOB_PUBLISH_TIME                DATE,
+    JOB_STATUS                      VARCHAR(50),
+    DATA_REFLUX_TIME                DATE,
+    CREATE_BY                       VARCHAR(50),
+    CREATE_TIME                     DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    UPDATE_BY                       VARCHAR(50),
+    UPDATE_TIME                     DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    SYS_ORG_CODE                    VARCHAR(50),
+    PRIMARY KEY (ID)
+);
+
+COMMENT ON TABLE STAT_JOB_REFLUX IS '岗位数据回流明细表';
+COMMENT ON COLUMN STAT_JOB_REFLUX.ID IS '主键ID';
+COMMENT ON COLUMN STAT_JOB_REFLUX.UNIT_CREDIT_CODE IS '统一社会信用代码';
+COMMENT ON COLUMN STAT_JOB_REFLUX.ENTERPRISE_NAME IS '企业名称';
+COMMENT ON COLUMN STAT_JOB_REFLUX.DISTRICT IS '所属区县';
+COMMENT ON COLUMN STAT_JOB_REFLUX.JOB_NAME IS '招聘岗位名称';
+COMMENT ON COLUMN STAT_JOB_REFLUX.PLAN_HIRE_COUNT IS '计划招聘人数';
+COMMENT ON COLUMN STAT_JOB_REFLUX.JOB_INDUSTRY IS '岗位所属行业';
+COMMENT ON COLUMN STAT_JOB_REFLUX.SALARY_RANGE IS '薪资区间';
+COMMENT ON COLUMN STAT_JOB_REFLUX.EDUCATION_REQUIRE IS '学历要求';
+COMMENT ON COLUMN STAT_JOB_REFLUX.JOB_PUBLISH_TIME IS '岗位发布时间';
+COMMENT ON COLUMN STAT_JOB_REFLUX.JOB_STATUS IS '岗位状态';
+COMMENT ON COLUMN STAT_JOB_REFLUX.DATA_REFLUX_TIME IS '数据回流时间';
+COMMENT ON COLUMN STAT_JOB_REFLUX.CREATE_BY IS '创建人';
+COMMENT ON COLUMN STAT_JOB_REFLUX.CREATE_TIME IS '创建时间';
+COMMENT ON COLUMN STAT_JOB_REFLUX.UPDATE_BY IS '修改人';
+COMMENT ON COLUMN STAT_JOB_REFLUX.UPDATE_TIME IS '更新时间';
+COMMENT ON COLUMN STAT_JOB_REFLUX.SYS_ORG_CODE IS '组织机构编号';
+
+CREATE INDEX IDX_STAT_JOB_REFLUX_UNIT ON STAT_JOB_REFLUX(UNIT_CREDIT_CODE);
+CREATE INDEX IDX_STAT_JOB_REFLUX_DISTRICT ON STAT_JOB_REFLUX(DISTRICT);
+CREATE INDEX IDX_STAT_JOB_REFLUX_INDUSTRY ON STAT_JOB_REFLUX(JOB_INDUSTRY);
+
+
+-- ============================================================
+-- 表2:农民工流动回流明细表
+-- 说明:记录农民工返乡返岗流动的明细数据,支持查询统计导出报表
+-- 数据来源:省平台回流
+-- ============================================================
+CREATE TABLE STAT_WORKER_REFLUX (
+    ID                              VARCHAR(36)     NOT NULL,
+    ID_CARD                         VARCHAR(50),
+    FULL_NAME                       VARCHAR(100),
+    DISTRICT                        VARCHAR(50),
+    RURAL_REGISTER_FLAG             VARCHAR(10),
+    ORIGIN_WORK_AREA                VARCHAR(200),
+    WORK_END_DATE                   DATE,
+    LOCAL_EMPLOY_DATE               DATE,
+    PERSON_CATEGORY_TAG             VARCHAR(100),
+    DATA_REFLUX_TIME                DATE,
+    CREATE_BY                       VARCHAR(50),
+    CREATE_TIME                     DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    UPDATE_BY                       VARCHAR(50),
+    UPDATE_TIME                     DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    SYS_ORG_CODE                    VARCHAR(50),
+    PRIMARY KEY (ID)
+);
+
+COMMENT ON TABLE STAT_WORKER_REFLUX IS '农民工流动回流明细表';
+COMMENT ON COLUMN STAT_WORKER_REFLUX.ID IS '主键ID';
+COMMENT ON COLUMN STAT_WORKER_REFLUX.ID_CARD IS '身份证号码';
+COMMENT ON COLUMN STAT_WORKER_REFLUX.FULL_NAME IS '姓名';
+COMMENT ON COLUMN STAT_WORKER_REFLUX.DISTRICT IS '所属区县';
+COMMENT ON COLUMN STAT_WORKER_REFLUX.RURAL_REGISTER_FLAG IS '乡村户籍标识';
+COMMENT ON COLUMN STAT_WORKER_REFLUX.ORIGIN_WORK_AREA IS '原就业外出地市/省份';
+COMMENT ON COLUMN STAT_WORKER_REFLUX.WORK_END_DATE IS '外出就业结束日期';
+COMMENT ON COLUMN STAT_WORKER_REFLUX.LOCAL_EMPLOY_DATE IS '本地新就业登记日期';
+COMMENT ON COLUMN STAT_WORKER_REFLUX.PERSON_CATEGORY_TAG IS '人员类别标签(脱贫/普通农民工,以回流数据为准)';
+COMMENT ON COLUMN STAT_WORKER_REFLUX.DATA_REFLUX_TIME IS '数据回流时间';
+COMMENT ON COLUMN STAT_WORKER_REFLUX.CREATE_BY IS '创建人';
+COMMENT ON COLUMN STAT_WORKER_REFLUX.CREATE_TIME IS '创建时间';
+COMMENT ON COLUMN STAT_WORKER_REFLUX.UPDATE_BY IS '修改人';
+COMMENT ON COLUMN STAT_WORKER_REFLUX.UPDATE_TIME IS '更新时间';
+COMMENT ON COLUMN STAT_WORKER_REFLUX.SYS_ORG_CODE IS '组织机构编号';
+
+CREATE INDEX IDX_STAT_WORKER_REFLUX_ID_CARD ON STAT_WORKER_REFLUX(ID_CARD);
+CREATE INDEX IDX_STAT_WORKER_REFLUX_DISTRICT ON STAT_WORKER_REFLUX(DISTRICT);
+
+
+-- ============================================================
+-- 表3:重点人群回流明细表
+-- 说明:记录离校未就业大学生等重点人群的明细数据,支持查询统计导出报表
+-- 数据来源:省平台回流
+-- ============================================================
+CREATE TABLE STAT_KEY_PERSON_REFLUX (
+    ID                              VARCHAR(36)     NOT NULL,
+    ID_CARD                         VARCHAR(50),
+    FULL_NAME                       VARCHAR(100),
+    DISTRICT                        VARCHAR(50),
+    KEY_PERSON_CATEGORY             VARCHAR(100),
+    CONFIRM_DATE                    DATE,
+    VALID_DATE                      DATE,
+    CURRENT_EMPLOY_STATUS           VARCHAR(50),
+    DATA_REFLUX_TIME                DATE,
+    CREATE_BY                       VARCHAR(50),
+    CREATE_TIME                     DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    UPDATE_BY                       VARCHAR(50),
+    UPDATE_TIME                     DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    SYS_ORG_CODE                    VARCHAR(50),
+    PRIMARY KEY (ID)
+);
+
+COMMENT ON TABLE STAT_KEY_PERSON_REFLUX IS '重点人群回流明细表';
+COMMENT ON COLUMN STAT_KEY_PERSON_REFLUX.ID IS '主键ID';
+COMMENT ON COLUMN STAT_KEY_PERSON_REFLUX.ID_CARD IS '身份证号码';
+COMMENT ON COLUMN STAT_KEY_PERSON_REFLUX.FULL_NAME IS '姓名';
+COMMENT ON COLUMN STAT_KEY_PERSON_REFLUX.DISTRICT IS '所属区县';
+COMMENT ON COLUMN STAT_KEY_PERSON_REFLUX.KEY_PERSON_CATEGORY IS '重点人群类别';
+COMMENT ON COLUMN STAT_KEY_PERSON_REFLUX.CONFIRM_DATE IS '认定日期';
+COMMENT ON COLUMN STAT_KEY_PERSON_REFLUX.VALID_DATE IS '有效日期';
+COMMENT ON COLUMN STAT_KEY_PERSON_REFLUX.CURRENT_EMPLOY_STATUS IS '当前就业状态';
+COMMENT ON COLUMN STAT_KEY_PERSON_REFLUX.DATA_REFLUX_TIME IS '数据回流时间';
+COMMENT ON COLUMN STAT_KEY_PERSON_REFLUX.CREATE_BY IS '创建人';
+COMMENT ON COLUMN STAT_KEY_PERSON_REFLUX.CREATE_TIME IS '创建时间';
+COMMENT ON COLUMN STAT_KEY_PERSON_REFLUX.UPDATE_BY IS '修改人';
+COMMENT ON COLUMN STAT_KEY_PERSON_REFLUX.UPDATE_TIME IS '更新时间';
+COMMENT ON COLUMN STAT_KEY_PERSON_REFLUX.SYS_ORG_CODE IS '组织机构编号';
+
+CREATE INDEX IDX_STAT_KEY_PERSON_REFLUX_ID_CARD ON STAT_KEY_PERSON_REFLUX(ID_CARD);
+CREATE INDEX IDX_STAT_KEY_PERSON_REFLUX_DISTRICT ON STAT_KEY_PERSON_REFLUX(DISTRICT);
+CREATE INDEX IDX_STAT_KEY_PERSON_REFLUX_CATEGORY ON STAT_KEY_PERSON_REFLUX(KEY_PERSON_CATEGORY);

+ 267 - 0
.docs/sql/测试数据/数据统计3张表测试数据.sql

@@ -0,0 +1,267 @@
+-- ============================================================================
+-- 数据统计3张表测试数据生成脚本
+-- 生成日期:2026-06-11
+-- 数据库:达梦数据库 (DM8)
+-- 说明:每张表生成35条测试数据,DATA_REFLUX_TIME分散在2025-06至2026-06各月份
+-- ============================================================================
+
+-- ============================================================================
+-- 表1: STAT_JOB_REFLUX (岗位数据回流明细表) — 35条
+-- ============================================================================
+
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440803MAE1234001', '湛江市鑫海机械制造有限公司', '霞山区', '数控车床操作工', 8, '制造业', '5000-8000', '大专', '2025-04-15', '招聘中', '2025-06-05', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234002', '广东粤海水务集团', '赤坎区', '水处理工程师', 3, '制造业', '8000-12000', '本科', '2025-05-01', '招聘中', '2025-06-12', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440882MAE1234003', '雷州市绿丰农业科技有限公司', '雷州市', '农业技术员', 5, '农业', '3000-5000', '大专', '2025-05-10', '已结束', '2025-06-25', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234004', '湛江恒兴饲料科技有限公司', '坡头区', '饲料研发专员', 4, '制造业', '5000-8000', '本科', '2025-05-20', '招聘中', '2025-07-03', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234005', '湛江晨鸣浆纸有限公司', '麻章区', '电气维修工程师', 6, '制造业', '5000-8000', '大专', '2025-06-01', '暂停', '2025-07-14', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440881MAE1234006', '廉江市红星陶瓷有限公司', '廉江市', '陶瓷工艺师', 3, '制造业', '5000-8000', '大专', '2025-06-05', '招聘中', '2025-07-22', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234007', '广东金岭糖业集团', '遂溪县', '生产车间主管', 2, '制造业', '8000-12000', '大专', '2025-06-10', '已结束', '2025-08-06', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234008', '湛江华润燃气有限公司', '赤坎区', '燃气管道工程师', 4, '建筑', '8000-12000', '本科', '2025-07-01', '招聘中', '2025-08-18', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234009', '湛江珠江啤酒有限公司', '霞山区', '食品检验员', 3, '制造业', '3000-5000', '大专', '2025-06-20', '已结束', '2025-08-28', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234010', '广东双林生物制药有限公司', '麻章区', '药品注册专员', 2, '医疗', '8000-12000', '本科', '2025-07-05', '招聘中', '2025-09-02', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234011', '湛江国联水产开发股份有限公司', '坡头区', '外贸跟单员', 5, '零售', '5000-8000', '大专', '2025-07-15', '招聘中', '2025-09-15', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234012', '湛江中科炼化有限公司', '经开区', '化工工艺工程师', 10, '制造业', '12000-20000', '本科', '2025-08-01', '招聘中', '2025-09-28', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234013', '广东冠豪高新技术股份有限公司', '经开区', '研发工程师', 3, '制造业', '12000-20000', '硕士', '2025-08-05', '暂停', '2025-10-10', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234014', '湛江市第四建筑工程有限公司', '霞山区', '预算员', 4, '建筑', '5000-8000', '大专', '2025-08-10', '已结束', '2025-10-22', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234015', '湛江市港城中学', '赤坎区', '高中语文教师', 5, '教育', '5000-8000', '本科', '2025-08-15', '招聘中', '2025-11-03', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234016', '湛江中心人民医院', '赤坎区', '临床护士', 15, '医疗', '5000-8000', '大专', '2025-09-01', '招聘中', '2025-11-15', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234017', '湛江市霞山区好客来餐饮有限公司', '霞山区', '餐厅经理', 2, '餐饮', '5000-8000', '大专', '2025-09-05', '招聘中', '2025-11-28', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234018', '湛江港集团', '霞山区', '港口调度员', 6, '物流', '5000-8000', '大专', '2025-09-10', '招聘中', '2025-12-02', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234019', '湛江龙腾物流有限公司', '坡头区', '物流专员', 4, '物流', '3000-5000', '大专', '2025-09-15', '招聘中', '2025-12-14', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234020', '广东海洋大学', '麻章区', '实验室管理员', 1, '教育', '5000-8000', '硕士', '2025-10-01', '已结束', '2025-12-20', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234021', '湛江海滨船厂', '坡头区', '船舶焊工', 12, '制造业', '8000-12000', '高中', '2025-10-05', '暂停', '2026-01-08', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440883MAE1234022', '吴川市第三建筑安装工程公司', '吴川市', '施工员', 8, '建筑', '5000-8000', '大专', '2025-10-10', '招聘中', '2026-01-18', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234023', '湛江万达广场商业管理有限公司', '霞山区', '招商运营经理', 2, '零售', '12000-20000', '本科', '2025-10-15', '招聘中', '2026-01-28', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234024', '湛江市智慧云信息科技有限公司', '经开区', 'Java开发工程师', 5, '信息技术', '8000-12000', '本科', '2025-11-01', '招聘中', '2026-02-05', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234025', '徐闻县通达物流有限公司', '徐闻县', '货运司机', 10, '物流', '5000-8000', '初中', '2025-11-05', '招聘中', '2026-02-18', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234026', '广东南粤银行股份有限公司', '经开区', '客户经理', 6, '金融', '8000-12000', '本科', '2025-11-10', '招聘中', '2026-03-03', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234027', '湛江爱尔眼科医院', '赤坎区', '眼科医生', 3, '医疗', '12000-20000', '硕士', '2025-11-15', '招聘中', '2026-03-15', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234028', '湛江市遂溪县第一中学', '遂溪县', '高中数学教师', 4, '教育', '5000-8000', '本科', '2025-12-01', '招聘中', '2026-03-25', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234029', '湛江市鼎盛餐饮管理有限公司', '霞山区', '厨师长', 2, '餐饮', '8000-12000', '高中', '2025-12-05', '招聘中', '2026-04-02', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234030', '湛江软通动力信息技术有限公司', '经开区', '软件测试工程师', 4, '信息技术', '8000-12000', '本科', '2025-12-10', '暂停', '2026-04-15', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234031', '湛江市麻章区长兴农业合作社', '麻章区', '种植技术员', 6, '农业', '3000-5000', '高中', '2026-01-05', '招聘中', '2026-04-26', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234032', '湛江家家乐超市连锁有限公司', '赤坎区', '采购主管', 2, '零售', '5000-8000', '大专', '2026-01-10', '招聘中', '2026-05-06', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234033', '广东恒福医药有限公司', '霞山区', '医药代表', 8, '医疗', '8000-12000', '大专', '2026-01-15', '招聘中', '2026-05-18', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234034', '湛江市坡头区农村信用合作联社', '坡头区', '柜员', 3, '金融', '5000-8000', '本科', '2026-02-01', '招聘中', '2026-06-02', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_JOB_REFLUX (ID, UNIT_CREDIT_CODE, ENTERPRISE_NAME, DISTRICT, JOB_NAME, PLAN_HIRE_COUNT, JOB_INDUSTRY, SALARY_RANGE, EDUCATION_REQUIRE, JOB_PUBLISH_TIME, JOB_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '91440800MAE1234035', '湛江市康欣餐饮管理有限公司', '霞山区', '餐饮服务员', 20, '餐饮', '3000-5000', '初中', '2026-02-05', '招聘中', '2026-06-18', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+-- ============================================================================
+-- 表2: STAT_WORKER_REFLUX (农民工流动回流明细表) — 35条
+-- ============================================================================
+
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440802199003051234', '陈建国', '霞山区', '是', '广州', '2025-05-01', '2025-06-01', '普通农民工', '2025-06-08', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440803198805122345', '李秀英', '赤坎区', '是', '深圳', '2025-05-15', '2025-06-10', '脱贫农民工', '2025-06-16', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440804199207184567', '王小明', '麻章区', '是', '东莞', '2025-06-01', '2025-06-20', '普通农民工', '2025-06-28', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440825199103256789', '张伟', '徐闻县', '是', '佛山', '2025-06-01', '2025-07-01', '普通农民工', '2025-07-05', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440882198709154321', '刘芳', '廉江市', '是', '珠海', '2025-06-15', '2025-07-10', '脱贫农民工', '2025-07-18', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440883199508216789', '赵强', '吴川市', '是', '广州', '2025-06-20', '2025-07-15', '普通农民工', '2025-07-25', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440802199610053456', '黄丽华', '霞山区', '是', '深圳', '2025-07-01', '2025-08-01', '普通农民工', '2025-08-05', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440811199712156789', '林志强', '麻章区', '是', '中山', '2025-07-10', '2025-08-10', '脱贫农民工', '2025-08-16', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440804198912204567', '杨红梅', '坡头区', '是', '东莞', '2025-07-15', '2025-08-15', '普通农民工', '2025-08-25', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440882199006113456', '周文斌', '廉江市', '是', '上海', '2025-08-01', '2025-09-01', '普通农民工', '2025-09-05', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440825199308156789', '吴秀花', '徐闻县', '是', '北京', '2025-08-05', '2025-09-05', '脱贫农民工', '2025-09-15', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440802199411215678', '郑海', '霞山区', '是', '广州', '2025-08-10', '2025-09-10', '普通农民工', '2025-09-22', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440883199103053456', '何志勇', '吴川市', '是', '江苏', '2025-08-15', '2025-10-01', '普通农民工', '2025-10-08', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440804199507126789', '冯小刚', '坡头区', '是', '珠海', '2025-09-01', '2025-10-10', '脱贫农民工', '2025-10-18', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440802199809094567', '陈秀兰', '赤坎区', '是', '深圳', '2025-09-05', '2025-11-01', '普通农民工', '2025-11-05', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440811199206186789', '罗建国', '麻章区', '是', '佛山', '2025-09-10', '2025-11-10', '普通农民工', '2025-11-15', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440882199710253456', '谢玉珍', '廉江市', '是', '东莞', '2025-09-15', '2025-11-20', '脱贫农民工', '2025-11-28', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440825199408056789', '邓红霞', '徐闻县', '是', '浙江', '2025-10-01', '2025-12-01', '普通农民工', '2025-12-06', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440883199509113456', '钟大伟', '吴川市', '是', '广州', '2025-10-05', '2025-12-10', '普通农民工', '2025-12-15', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440802199601186789', '梁美玲', '霞山区', '是', '中山', '2025-10-10', '2025-12-18', '脱贫农民工', '2025-12-25', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440804199711054567', '胡建军', '坡头区', '是', '福建', '2025-11-01', '2026-01-01', '普通农民工', '2026-01-08', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440802198805126789', '孙秀芳', '赤坎区', '是', '深圳', '2025-11-05', '2026-01-10', '普通农民工', '2026-01-16', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440811199208083456', '朱国平', '麻章区', '是', '东莞', '2025-11-10', '2026-01-20', '脱贫农民工', '2026-01-28', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440882199305156789', '曹德明', '廉江市', '是', '广州', '2025-11-15', '2026-02-01', '普通农民工', '2026-02-05', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440825199609184567', '马海燕', '徐闻县', '是', '佛山', '2025-12-01', '2026-02-10', '普通农民工', '2026-02-18', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440883199112063456', '叶伟强', '吴川市', '是', '珠海', '2025-12-05', '2026-03-01', '脱贫农民工', '2026-03-05', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440802199708156789', '曾玉兰', '霞山区', '是', '江苏', '2025-12-10', '2026-03-10', '普通农民工', '2026-03-15', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440804199410254567', '卢家辉', '坡头区', '是', '深圳', '2026-01-01', '2026-03-20', '普通农民工', '2026-03-25', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440811199504186789', '唐小红', '麻章区', '是', '浙江', '2026-01-05', '2026-04-01', '脱贫农民工', '2026-04-05', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440882199206093456', '彭志华', '廉江市', '是', '上海', '2026-01-10', '2026-04-10', '普通农民工', '2026-04-15', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440802199303116789', '钱小花', '赤坎区', '是', '北京', '2026-01-15', '2026-04-20', '普通农民工', '2026-04-28', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440825199807224567', '姜大民', '徐闻县', '是', '广州', '2026-02-01', '2026-05-01', '普通农民工', '2026-05-06', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440883199609153456', '苏玉霞', '吴川市', '是', '东莞', '2026-02-05', '2026-05-10', '脱贫农民工', '2026-05-18', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440804199105176789', '高志强', '坡头区', '是', '佛山', '2026-03-01', '2026-06-01', '普通农民工', '2026-06-03', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_WORKER_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, RURAL_REGISTER_FLAG, ORIGIN_WORK_AREA, WORK_END_DATE, LOCAL_EMPLOY_DATE, PERSON_CATEGORY_TAG, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440802199408284567', '田桂花', '霞山区', '是', '中山', '2026-03-05', '2026-06-08', '脱贫农民工', '2026-06-15', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+-- ============================================================================
+-- 表3: STAT_KEY_PERSON_REFLUX (重点人群回流明细表) — 35条
+-- ============================================================================
+
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440802199806011234', '李明辉', '赤坎区', '离校未就业高校毕业生', '2024-06-01', '2025-06-01', '已就业', '2025-06-06', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440803199703152345', '张翠花', '霞山区', '退役军人', '2023-09-01', '2024-09-01', '已就业', '2025-06-14', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440804199501094567', '刘国栋', '麻章区', '残疾人', '2024-03-01', '2025-03-01', '未就业', '2025-06-22', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440825199906256789', '王秀珍', '徐闻县', '低保家庭人员', '2024-05-01', '2025-05-01', '未就业', '2025-07-04', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440882199804153456', '陈志强', '廉江市', '脱贫家庭人员', '2024-04-01', '2025-04-01', '已就业', '2025-07-12', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440883199707216789', '林小红', '吴川市', '离校未就业高校毕业生', '2024-07-01', '2025-07-01', '灵活就业', '2025-07-20', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440802199805054567', '赵伟', '坡头区', '退役军人', '2023-12-01', '2024-12-01', '已就业', '2025-08-03', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440811199706183456', '黄晓燕', '经开区', '残疾人', '2024-01-01', '2025-01-01', '未就业', '2025-08-13', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440802199905216789', '吴秀梅', '赤坎区', '低保家庭人员', '2024-06-01', '2025-06-01', '灵活就业', '2025-08-22', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440804199808114567', '郑建平', '坡头区', '脱贫家庭人员', '2024-08-01', '2025-08-01', '已就业', '2025-09-04', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440825199706053456', '杨雪', '徐闻县', '离校未就业高校毕业生', '2024-09-01', '2025-09-01', '未就业', '2025-09-16', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440882199906186789', '卢志明', '廉江市', '退役军人', '2024-02-01', '2025-02-01', '已就业', '2025-09-25', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440883199805093456', '罗春霞', '吴川市', '残疾人', '2024-04-01', '2025-04-01', '未就业', '2025-10-07', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440802199706114567', '孙文杰', '霞山区', '低保家庭人员', '2024-10-01', '2025-10-01', '灵活就业', '2025-10-18', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440804199606155678', '何建华', '麻章区', '脱贫家庭人员', '2024-11-01', '2025-11-01', '已就业', '2025-11-04', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440825199806124567', '唐建设', '徐闻县', '离校未就业高校毕业生', '2024-12-01', '2025-12-01', '未就业', '2025-11-15', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440882199705283456', '冯秀兰', '廉江市', '退役军人', '2024-10-01', '2025-10-01', '已就业', '2025-11-22', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440883199609184567', '曹俊杰', '吴川市', '残疾人', '2024-07-01', '2025-07-01', '灵活就业', '2025-12-03', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440802199808116789', '许美珍', '赤坎区', '低保家庭人员', '2024-08-01', '2025-08-01', '未就业', '2025-12-12', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440804199607204567', '宋国华', '坡头区', '脱贫家庭人员', '2024-09-01', '2025-09-01', '已就业', '2025-12-22', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440811199806256789', '邓浩', '经开区', '离校未就业高校毕业生', '2025-01-01', '2026-01-01', '未就业', '2026-01-06', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440825199705113456', '潘淑华', '徐闻县', '退役军人', '2024-11-01', '2025-11-01', '已就业', '2026-01-14', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440882199908186789', '梁大明', '廉江市', '残疾人', '2024-12-01', '2025-12-01', '灵活就业', '2026-01-22', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440883199707043456', '叶彩霞', '吴川市', '低保家庭人员', '2025-01-01', '2026-01-01', '未就业', '2026-02-05', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440802199706216789', '龙海', '霞山区', '脱贫家庭人员', '2025-02-01', '2026-02-01', '已就业', '2026-02-16', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440804199806154567', '邱志伟', '坡头区', '离校未就业高校毕业生', '2025-03-01', '2026-03-01', '已就业', '2026-03-04', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440811199508286789', '侯美芳', '麻章区', '退役军人', '2024-06-01', '2025-06-01', '已就业', '2026-03-14', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440802199806193456', '蔡文杰', '赤坎区', '残疾人', '2025-01-01', '2026-01-01', '未就业', '2026-03-22', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440825199807114567', '彭海燕', '徐闻县', '低保家庭人员', '2025-02-01', '2026-02-01', '灵活就业', '2026-04-05', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440882199605186789', '韩小明', '廉江市', '脱贫家庭人员', '2025-03-01', '2026-03-01', '已就业', '2026-04-15', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440883199908253456', '沈玉兰', '吴川市', '离校未就业高校毕业生', '2025-04-01', '2026-04-01', '未就业', '2026-04-25', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440804199707156789', '曾伟强', '坡头区', '退役军人', '2024-05-01', '2025-05-01', '已就业', '2026-05-06', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440802199608284567', '蒋丽', '霞山区', '残疾人', '2025-04-01', '2026-04-01', '灵活就业', '2026-05-18', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440811199706093456', '谭文', '麻章区', '低保家庭人员', '2025-05-01', '2026-05-01', '未就业', '2026-06-04', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');
+INSERT INTO STAT_KEY_PERSON_REFLUX (ID, ID_CARD, FULL_NAME, DISTRICT, KEY_PERSON_CATEGORY, CONFIRM_DATE, VALID_DATE, CURRENT_EMPLOY_STATUS, DATA_REFLUX_TIME, CREATE_BY, CREATE_TIME, UPDATE_BY, UPDATE_TIME, SYS_ORG_CODE)
+VALUES (SYS_GUID(), '440802199805116789', '龚雪梅', '赤坎区', '脱贫家庭人员', '2025-05-01', '2026-05-01', '已就业', '2026-06-16', 'admin', '2026-06-11 10:00:00', 'admin', '2026-06-11 10:00:00', 'A01');

Diferenças do arquivo suprimidas por serem muito extensas
+ 92 - 0
.docs/系统需要的数据字典.txt


+ 217 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statJobReflux/controller/StatJobRefluxController.java

@@ -0,0 +1,217 @@
+package org.jeecg.modules.zjrs.dataReflux.statJobReflux.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.zjrs.dataReflux.statJobReflux.entity.StatJobReflux;
+import org.jeecg.modules.zjrs.dataReflux.statJobReflux.entity.StatJobRefluxStatisticsVo;
+import org.jeecg.modules.zjrs.dataReflux.statJobReflux.service.IStatJobRefluxService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.enmus.ExcelType;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+
+import java.util.*;
+
+ /**
+ * @Description: 岗位数据回流明细表
+ * @Author: jeecg-boot
+ * @Date:   2026-06-11
+ * @Version: V1.0
+ */
+@Tag(name="岗位数据回流明细表")
+@RestController
+@RequestMapping("/dataReflux/statJobReflux")
+@Slf4j
+public class StatJobRefluxController extends JeecgController<StatJobReflux, IStatJobRefluxService> {
+	@Autowired
+	private IStatJobRefluxService statJobRefluxService;
+
+	/**
+	 * 导出字段与字典编码的映射关系:entity字段名 → 字典编码
+	 * 用于导出时自动将字典值翻译为中文标签
+	 */
+	private static final Map<String, String> EXPORT_DICT_FIELD_MAP = new LinkedHashMap<>();
+
+	/**
+	 * 分页列表查询
+	 */
+	@Operation(summary="岗位数据回流明细表-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<StatJobReflux>> queryPageList(StatJobReflux statJobReflux,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   HttpServletRequest req) {
+        QueryWrapper<StatJobReflux> queryWrapper = QueryGenerator.initQueryWrapper(statJobReflux, req.getParameterMap());
+		Page<StatJobReflux> page = new Page<StatJobReflux>(pageNo, pageSize);
+		IPage<StatJobReflux> pageList = statJobRefluxService.page(page, queryWrapper);
+		return Result.OK(pageList);
+	}
+
+	/**
+	 *   添加
+	 */
+	@AutoLog(value = "岗位数据回流明细表-添加")
+	@Operation(summary="岗位数据回流明细表-添加")
+	@RequiresPermissions("dataReflux:stat_job_reflux:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody StatJobReflux statJobReflux) {
+		statJobRefluxService.save(statJobReflux);
+		return Result.OK("添加成功!");
+	}
+
+	/**
+	 *  编辑
+	 */
+	@AutoLog(value = "岗位数据回流明细表-编辑")
+	@Operation(summary="岗位数据回流明细表-编辑")
+	@RequiresPermissions("dataReflux:stat_job_reflux:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody StatJobReflux statJobReflux) {
+		statJobRefluxService.updateById(statJobReflux);
+		return Result.OK("编辑成功!");
+	}
+
+	/**
+	 *   通过id删除
+	 */
+	@AutoLog(value = "岗位数据回流明细表-通过id删除")
+	@Operation(summary="岗位数据回流明细表-通过id删除")
+	@RequiresPermissions("dataReflux:stat_job_reflux:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		statJobRefluxService.removeById(id);
+		return Result.OK("删除成功!");
+	}
+
+	/**
+	 *  批量删除
+	 */
+	@AutoLog(value = "岗位数据回流明细表-批量删除")
+	@Operation(summary="岗位数据回流明细表-批量删除")
+	@RequiresPermissions("dataReflux:stat_job_reflux:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.statJobRefluxService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("批量删除成功!");
+	}
+
+	/**
+	 * 通过id查询
+	 */
+	@Operation(summary="岗位数据回流明细表-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<StatJobReflux> queryById(@RequestParam(name="id",required=true) String id) {
+		StatJobReflux statJobReflux = statJobRefluxService.getById(id);
+		if(statJobReflux==null) {
+			return Result.error("未找到对应数据");
+		}
+		return Result.OK(statJobReflux);
+	}
+
+    /**
+    * 导出excel
+    */
+    @RequiresPermissions("dataReflux:stat_job_reflux:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, StatJobReflux statJobReflux) {
+        // Step.1 组装查询条件
+        QueryWrapper<StatJobReflux> queryWrapper = QueryGenerator.initQueryWrapper(statJobReflux, request.getParameterMap());
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+
+        // 过滤选中数据
+        String selections = request.getParameter("selections");
+        if (oConvertUtils.isNotEmpty(selections)) {
+            List<String> selectionList = Arrays.asList(selections.split(","));
+            queryWrapper.in("id", selectionList);
+        }
+
+        // Step.2 获取导出数据并进行字典值→标签内存映射(业务逻辑委托给 Service)
+        List<StatJobReflux> exportList = statJobRefluxService.translateDictFields(
+                service.list(queryWrapper), EXPORT_DICT_FIELD_MAP);
+
+        // Step.3 AutoPoi 导出Excel(此时字典字段已替换为中文标签)
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        String title = "岗位数据回流明细表";
+        mv.addObject(NormalExcelConstants.FILE_NAME, title);
+        mv.addObject(NormalExcelConstants.CLASS, StatJobReflux.class);
+        ExportParams exportParams = new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title, ExcelType.XSSF);
+        mv.addObject(NormalExcelConstants.PARAMS, exportParams);
+        mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
+
+        String exportFields = "unitCreditCode,enterpriseName,district,jobName,planHireCount,jobIndustry,salaryRange,educationRequire,jobPublishTime,jobStatus,dataRefluxTime";
+        mv.addObject(NormalExcelConstants.EXPORT_FIELDS, exportFields);
+        return mv;
+    }
+
+    /**
+      * 通过excel导入数据
+    */
+    @RequiresPermissions("dataReflux:stat_job_reflux:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, StatJobReflux.class);
+    }
+
+    /**
+     * 按月统计查询
+     */
+    @Operation(summary="岗位数据回流明细表-按月统计查询")
+    @GetMapping(value = "/statistics/queryByMonth")
+    public Result<List<StatJobRefluxStatisticsVo>> queryStatisticsByMonth(
+            @RequestParam(name = "year", defaultValue = "2026") Integer year) {
+        List<StatJobRefluxStatisticsVo> list = statJobRefluxService.queryStatisticsByYear(year);
+        // 计算序号
+        int index = 1;
+        for (StatJobRefluxStatisticsVo vo : list) {
+            vo.setId(String.valueOf(index++));
+        }
+        return Result.OK(list);
+    }
+
+    /**
+     * 导出统计报表excel
+     */
+    @RequiresPermissions("dataReflux:stat_job_reflux:statisticsExportXls")
+    @RequestMapping(value = "/statistics/exportXls")
+    public ModelAndView exportStatisticsXls(HttpServletRequest request,
+            @RequestParam(name = "year", defaultValue = "2026") Integer year) {
+        List<StatJobRefluxStatisticsVo> list = statJobRefluxService.queryStatisticsByYear(year);
+        // 计算序号
+        int index = 1;
+        for (StatJobRefluxStatisticsVo vo : list) {
+            vo.setId(String.valueOf(index++));
+        }
+
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        String title = "岗位归集数量统计报表";
+        mv.addObject(NormalExcelConstants.FILE_NAME, title);
+        mv.addObject(NormalExcelConstants.CLASS, StatJobRefluxStatisticsVo.class);
+        ExportParams exportParams = new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title, ExcelType.XSSF);
+        mv.addObject(NormalExcelConstants.PARAMS, exportParams);
+        mv.addObject(NormalExcelConstants.DATA_LIST, list);
+
+        String exportFields = "id,statisticsMonth,district,totalCollectedCount,currentMonthNewCount,currentMonthExpiredCount";
+        mv.addObject(NormalExcelConstants.EXPORT_FIELDS, exportFields);
+        return mv;
+    }
+
+}

+ 101 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statJobReflux/entity/StatJobReflux.java

@@ -0,0 +1,101 @@
+package org.jeecg.modules.zjrs.dataReflux.statJobReflux.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: 岗位数据回流明细表
+ * @Author: jeecg-boot
+ * @Date:   2026-06-11
+ * @Version: V1.0
+ */
+@Data
+@TableName("stat_job_reflux")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description="岗位数据回流明细表")
+public class StatJobReflux implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**主键*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @Schema(description = "主键")
+    private java.lang.String id;
+	/**统一社会信用代码*/
+	@Excel(name = "统一社会信用代码", width = 15)
+    @Schema(description = "统一社会信用代码")
+    private java.lang.String unitCreditCode;
+	/**企业名称*/
+	@Excel(name = "企业名称", width = 15)
+    @Schema(description = "企业名称")
+    private java.lang.String enterpriseName;
+	/**所属区县*/
+	@Excel(name = "所属区县", width = 15)
+    @Schema(description = "所属区县")
+    private java.lang.String district;
+	/**招聘岗位名称*/
+	@Excel(name = "招聘岗位名称", width = 15)
+    @Schema(description = "招聘岗位名称")
+    private java.lang.String jobName;
+	/**计划招聘人数*/
+	@Excel(name = "计划招聘人数", width = 15)
+    @Schema(description = "计划招聘人数")
+    private java.lang.Integer planHireCount;
+	/**岗位所属行业*/
+	@Excel(name = "岗位所属行业", width = 15)
+    @Schema(description = "岗位所属行业")
+    private java.lang.String jobIndustry;
+	/**薪资区间*/
+	@Excel(name = "薪资区间", width = 15)
+    @Schema(description = "薪资区间")
+    private java.lang.String salaryRange;
+	/**学历要求*/
+	@Excel(name = "学历要求", width = 15)
+    @Schema(description = "学历要求")
+    private java.lang.String educationRequire;
+	/**岗位发布时间*/
+	@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 jobPublishTime;
+	/**岗位状态*/
+	@Excel(name = "岗位状态", width = 15)
+    @Schema(description = "岗位状态")
+    private java.lang.String jobStatus;
+	/**数据回流时间*/
+	@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 dataRefluxTime;
+	/**创建人*/
+    @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;
+}

+ 46 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statJobReflux/entity/StatJobRefluxStatisticsVo.java

@@ -0,0 +1,46 @@
+package org.jeecg.modules.zjrs.dataReflux.statJobReflux.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * 岗位数据回流明细表-按月统计报表VO
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@Schema(description="岗位归集数量统计报表")
+public class StatJobRefluxStatisticsVo {
+
+    /**序号*/
+    @Schema(description = "序号")
+    private java.lang.String id;
+
+    /**统计月份*/
+    @Excel(name = "统计月份", width = 15)
+    @Schema(description = "统计月份")
+    private java.lang.String statisticsMonth;
+
+    /**所属区县*/
+    @Excel(name = "所属区县", width = 15)
+    @Schema(description = "所属区县")
+    private java.lang.String district;
+
+    /**归集岗位总数*/
+    @Excel(name = "归集岗位总数", width = 15)
+    @Schema(description = "归集岗位总数")
+    private java.lang.Integer totalCollectedCount;
+
+    /**本期新增岗位数*/
+    @Excel(name = "本期新增岗位数", width = 15)
+    @Schema(description = "本期新增岗位数")
+    private java.lang.Integer currentMonthNewCount;
+
+    /**本期失效下架岗位数*/
+    @Excel(name = "本期失效下架岗位数", width = 15)
+    @Schema(description = "本期失效下架岗位数")
+    private java.lang.Integer currentMonthExpiredCount;
+}

+ 22 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statJobReflux/mapper/StatJobRefluxMapper.java

@@ -0,0 +1,22 @@
+package org.jeecg.modules.zjrs.dataReflux.statJobReflux.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.zjrs.dataReflux.statJobReflux.entity.StatJobReflux;
+import org.jeecg.modules.zjrs.dataReflux.statJobReflux.entity.StatJobRefluxStatisticsVo;
+
+import java.util.List;
+
+/**
+ * @Description: 岗位数据回流明细表
+ * @Author: jeecg-boot
+ * @Date: 2026-06-11
+ * @Version: V1.0
+ */
+public interface StatJobRefluxMapper extends BaseMapper<StatJobReflux> {
+
+    /**
+     * 按年份统计岗位数据(按月、区县维度)
+     */
+    List<StatJobRefluxStatisticsVo> queryStatisticsByYear(@Param("year") int year);
+}

+ 19 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statJobReflux/mapper/xml/StatJobRefluxMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.zjrs.dataReflux.statJobReflux.mapper.StatJobRefluxMapper">
+
+    <!-- 按年份统计岗位数据(按月、区县维度) -->
+    <select id="queryStatisticsByYear" resultType="org.jeecg.modules.zjrs.dataReflux.statJobReflux.entity.StatJobRefluxStatisticsVo">
+        SELECT
+            DATE_FORMAT(t.DATA_REFLUX_TIME, '%Y-%m') AS statisticsMonth,
+            t.DISTRICT AS district,
+            COUNT(*) AS currentMonthNewCount,
+            SUM(CASE WHEN t.JOB_STATUS != '招聘中' THEN 1 ELSE 0 END) AS currentMonthExpiredCount,
+            COUNT(*) AS totalCollectedCount
+        FROM STAT_JOB_REFLUX t
+        WHERE YEAR(t.DATA_REFLUX_TIME) = #{year}
+        GROUP BY DATE_FORMAT(t.DATA_REFLUX_TIME, '%Y-%m'), t.DISTRICT
+        ORDER BY DATE_FORMAT(t.DATA_REFLUX_TIME, '%Y-%m') ASC, t.DISTRICT ASC
+    </select>
+
+</mapper>

+ 31 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statJobReflux/service/IStatJobRefluxService.java

@@ -0,0 +1,31 @@
+package org.jeecg.modules.zjrs.dataReflux.statJobReflux.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.zjrs.dataReflux.statJobReflux.entity.StatJobReflux;
+import org.jeecg.modules.zjrs.dataReflux.statJobReflux.entity.StatJobRefluxStatisticsVo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 岗位数据回流明细表
+ * @Author: jeecg-boot
+ * @Date: 2026-06-11
+ * @Version: V1.0
+ */
+public interface IStatJobRefluxService extends IService<StatJobReflux> {
+
+    /**
+     * 导出时对字典字段进行值→标签的内存映射翻译
+     *
+     * @param list         待导出的数据列表
+     * @param fieldDictMap 字段名→字典编码 的映射关系
+     * @return 字典字段已替换为中文标签的数据列表
+     */
+    List<StatJobReflux> translateDictFields(List<StatJobReflux> list, Map<String, String> fieldDictMap);
+
+    /**
+     * 按年份查询岗位统计报表数据
+     */
+    List<StatJobRefluxStatisticsVo> queryStatisticsByYear(int year);
+}

+ 36 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statJobReflux/service/impl/StatJobRefluxServiceImpl.java

@@ -0,0 +1,36 @@
+package org.jeecg.modules.zjrs.dataReflux.statJobReflux.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.zjrs.dataReflux.statJobReflux.entity.StatJobReflux;
+import org.jeecg.modules.zjrs.dataReflux.statJobReflux.entity.StatJobRefluxStatisticsVo;
+import org.jeecg.modules.zjrs.dataReflux.statJobReflux.mapper.StatJobRefluxMapper;
+import org.jeecg.modules.zjrs.dataReflux.statJobReflux.service.IStatJobRefluxService;
+import org.jeecg.modules.zjrs.dictionary.service.IDictionaryItemService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * @Description: 岗位数据回流明细表
+ * @Author: jeecg-boot
+ * @Date: 2026-06-11
+ * @Version: V1.0
+ */
+@Service
+public class StatJobRefluxServiceImpl extends ServiceImpl<StatJobRefluxMapper, StatJobReflux> implements IStatJobRefluxService {
+
+    @Autowired
+    private IDictionaryItemService dictionaryItemService;
+
+    @Override
+    public List<StatJobReflux> translateDictFields(List<StatJobReflux> list, Map<String, String> fieldDictMap) {
+        // 当前表无字典字段需要翻译,直接返回原列表
+        return list;
+    }
+
+    @Override
+    public List<StatJobRefluxStatisticsVo> queryStatisticsByYear(int year) {
+        return baseMapper.queryStatisticsByYear(year);
+    }
+}

+ 217 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statKeyPersonReflux/controller/StatKeyPersonRefluxController.java

@@ -0,0 +1,217 @@
+package org.jeecg.modules.zjrs.dataReflux.statKeyPersonReflux.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.zjrs.dataReflux.statKeyPersonReflux.entity.StatKeyPersonReflux;
+import org.jeecg.modules.zjrs.dataReflux.statKeyPersonReflux.entity.StatKeyPersonRefluxStatisticsVo;
+import org.jeecg.modules.zjrs.dataReflux.statKeyPersonReflux.service.IStatKeyPersonRefluxService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.enmus.ExcelType;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+
+import java.util.*;
+
+ /**
+ * @Description: 重点人群回流明细表
+ * @Author: jeecg-boot
+ * @Date:   2026-06-11
+ * @Version: V1.0
+ */
+@Tag(name="重点人群回流明细表")
+@RestController
+@RequestMapping("/dataReflux/statKeyPersonReflux")
+@Slf4j
+public class StatKeyPersonRefluxController extends JeecgController<StatKeyPersonReflux, IStatKeyPersonRefluxService> {
+	@Autowired
+	private IStatKeyPersonRefluxService statKeyPersonRefluxService;
+
+	/**
+	 * 导出字段与字典编码的映射关系:entity字段名 → 字典编码
+	 * 用于导出时自动将字典值翻译为中文标签
+	 */
+	private static final Map<String, String> EXPORT_DICT_FIELD_MAP = new LinkedHashMap<>();
+
+	/**
+	 * 分页列表查询
+	 */
+	@Operation(summary="重点人群回流明细表-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<StatKeyPersonReflux>> queryPageList(StatKeyPersonReflux statKeyPersonReflux,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   HttpServletRequest req) {
+        QueryWrapper<StatKeyPersonReflux> queryWrapper = QueryGenerator.initQueryWrapper(statKeyPersonReflux, req.getParameterMap());
+		Page<StatKeyPersonReflux> page = new Page<StatKeyPersonReflux>(pageNo, pageSize);
+		IPage<StatKeyPersonReflux> pageList = statKeyPersonRefluxService.page(page, queryWrapper);
+		return Result.OK(pageList);
+	}
+
+	/**
+	 *   添加
+	 */
+	@AutoLog(value = "重点人群回流明细表-添加")
+	@Operation(summary="重点人群回流明细表-添加")
+	@RequiresPermissions("dataReflux:stat_key_person_reflux:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody StatKeyPersonReflux statKeyPersonReflux) {
+		statKeyPersonRefluxService.save(statKeyPersonReflux);
+		return Result.OK("添加成功!");
+	}
+
+	/**
+	 *  编辑
+	 */
+	@AutoLog(value = "重点人群回流明细表-编辑")
+	@Operation(summary="重点人群回流明细表-编辑")
+	@RequiresPermissions("dataReflux:stat_key_person_reflux:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody StatKeyPersonReflux statKeyPersonReflux) {
+		statKeyPersonRefluxService.updateById(statKeyPersonReflux);
+		return Result.OK("编辑成功!");
+	}
+
+	/**
+	 *   通过id删除
+	 */
+	@AutoLog(value = "重点人群回流明细表-通过id删除")
+	@Operation(summary="重点人群回流明细表-通过id删除")
+	@RequiresPermissions("dataReflux:stat_key_person_reflux:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		statKeyPersonRefluxService.removeById(id);
+		return Result.OK("删除成功!");
+	}
+
+	/**
+	 *  批量删除
+	 */
+	@AutoLog(value = "重点人群回流明细表-批量删除")
+	@Operation(summary="重点人群回流明细表-批量删除")
+	@RequiresPermissions("dataReflux:stat_key_person_reflux:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.statKeyPersonRefluxService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("批量删除成功!");
+	}
+
+	/**
+	 * 通过id查询
+	 */
+	@Operation(summary="重点人群回流明细表-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<StatKeyPersonReflux> queryById(@RequestParam(name="id",required=true) String id) {
+		StatKeyPersonReflux statKeyPersonReflux = statKeyPersonRefluxService.getById(id);
+		if(statKeyPersonReflux==null) {
+			return Result.error("未找到对应数据");
+		}
+		return Result.OK(statKeyPersonReflux);
+	}
+
+    /**
+    * 导出excel
+    */
+    @RequiresPermissions("dataReflux:stat_key_person_reflux:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, StatKeyPersonReflux statKeyPersonReflux) {
+        // Step.1 组装查询条件
+        QueryWrapper<StatKeyPersonReflux> queryWrapper = QueryGenerator.initQueryWrapper(statKeyPersonReflux, request.getParameterMap());
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+
+        // 过滤选中数据
+        String selections = request.getParameter("selections");
+        if (oConvertUtils.isNotEmpty(selections)) {
+            List<String> selectionList = Arrays.asList(selections.split(","));
+            queryWrapper.in("id", selectionList);
+        }
+
+        // Step.2 获取导出数据并进行字典值→标签内存映射(业务逻辑委托给 Service)
+        List<StatKeyPersonReflux> exportList = statKeyPersonRefluxService.translateDictFields(
+                service.list(queryWrapper), EXPORT_DICT_FIELD_MAP);
+
+        // Step.3 AutoPoi 导出Excel(此时字典字段已替换为中文标签)
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        String title = "重点人群回流明细表";
+        mv.addObject(NormalExcelConstants.FILE_NAME, title);
+        mv.addObject(NormalExcelConstants.CLASS, StatKeyPersonReflux.class);
+        ExportParams exportParams = new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title, ExcelType.XSSF);
+        mv.addObject(NormalExcelConstants.PARAMS, exportParams);
+        mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
+
+        String exportFields = "idCard,fullName,district,keyPersonCategory,confirmDate,validDate,currentEmployStatus,dataRefluxTime";
+        mv.addObject(NormalExcelConstants.EXPORT_FIELDS, exportFields);
+        return mv;
+    }
+
+    /**
+      * 通过excel导入数据
+    */
+    @RequiresPermissions("dataReflux:stat_key_person_reflux:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, StatKeyPersonReflux.class);
+    }
+
+    /**
+     * 按月统计查询
+     */
+    @Operation(summary="重点人群回流明细表-按月统计查询")
+    @GetMapping(value = "/statistics/queryByMonth")
+    public Result<List<StatKeyPersonRefluxStatisticsVo>> queryStatisticsByMonth(
+            @RequestParam(name = "year", defaultValue = "2026") Integer year) {
+        List<StatKeyPersonRefluxStatisticsVo> list = statKeyPersonRefluxService.queryStatisticsByYear(year);
+        // 计算序号
+        int index = 1;
+        for (StatKeyPersonRefluxStatisticsVo vo : list) {
+            vo.setId(String.valueOf(index++));
+        }
+        return Result.OK(list);
+    }
+
+    /**
+     * 导出统计报表excel
+     */
+    @RequiresPermissions("dataReflux:stat_key_person_reflux:statisticsExportXls")
+    @RequestMapping(value = "/statistics/exportXls")
+    public ModelAndView exportStatisticsXls(HttpServletRequest request,
+            @RequestParam(name = "year", defaultValue = "2026") Integer year) {
+        List<StatKeyPersonRefluxStatisticsVo> list = statKeyPersonRefluxService.queryStatisticsByYear(year);
+        // 计算序号
+        int index = 1;
+        for (StatKeyPersonRefluxStatisticsVo vo : list) {
+            vo.setId(String.valueOf(index++));
+        }
+
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        String title = "重点人群统计报表";
+        mv.addObject(NormalExcelConstants.FILE_NAME, title);
+        mv.addObject(NormalExcelConstants.CLASS, StatKeyPersonRefluxStatisticsVo.class);
+        ExportParams exportParams = new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title, ExcelType.XSSF);
+        mv.addObject(NormalExcelConstants.PARAMS, exportParams);
+        mv.addObject(NormalExcelConstants.DATA_LIST, list);
+
+        String exportFields = "id,statisticsMonth,district,keyPersonCategory,totalPersonCount,totalExpiredCount,totalUnemployedCount";
+        mv.addObject(NormalExcelConstants.EXPORT_FIELDS, exportFields);
+        return mv;
+    }
+
+}

+ 91 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statKeyPersonReflux/entity/StatKeyPersonReflux.java

@@ -0,0 +1,91 @@
+package org.jeecg.modules.zjrs.dataReflux.statKeyPersonReflux.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: 重点人群回流明细表
+ * @Author: jeecg-boot
+ * @Date:   2026-06-11
+ * @Version: V1.0
+ */
+@Data
+@TableName("stat_key_person_reflux")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description="重点人群回流明细表")
+public class StatKeyPersonReflux implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**主键*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @Schema(description = "主键")
+    private java.lang.String id;
+	/**身份证号码*/
+	@Excel(name = "身份证号码", width = 15)
+    @Schema(description = "身份证号码")
+    private java.lang.String idCard;
+	/**姓名*/
+	@Excel(name = "姓名", width = 15)
+    @Schema(description = "姓名")
+    private java.lang.String fullName;
+	/**所属区县*/
+	@Excel(name = "所属区县", width = 15)
+    @Schema(description = "所属区县")
+    private java.lang.String district;
+	/**重点人群类别*/
+	@Excel(name = "重点人群类别", width = 15)
+    @Schema(description = "重点人群类别")
+    private java.lang.String keyPersonCategory;
+	/**认定日期*/
+	@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 confirmDate;
+	/**有效日期*/
+	@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 validDate;
+	/**当前就业状态*/
+	@Excel(name = "当前就业状态", width = 15)
+    @Schema(description = "当前就业状态")
+    private java.lang.String currentEmployStatus;
+	/**数据回流时间*/
+	@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 dataRefluxTime;
+	/**创建人*/
+    @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;
+}

+ 51 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statKeyPersonReflux/entity/StatKeyPersonRefluxStatisticsVo.java

@@ -0,0 +1,51 @@
+package org.jeecg.modules.zjrs.dataReflux.statKeyPersonReflux.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * 重点人群回流明细表-按月统计报表VO
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@Schema(description="重点人群统计报表")
+public class StatKeyPersonRefluxStatisticsVo {
+
+    /**序号*/
+    @Schema(description = "序号")
+    private java.lang.String id;
+
+    /**统计月份*/
+    @Excel(name = "统计月份", width = 15)
+    @Schema(description = "统计月份")
+    private java.lang.String statisticsMonth;
+
+    /**所属区县*/
+    @Excel(name = "所属区县", width = 15)
+    @Schema(description = "所属区县")
+    private java.lang.String district;
+
+    /**重点人群类别*/
+    @Excel(name = "重点人群类别", width = 20)
+    @Schema(description = "重点人群类别")
+    private java.lang.String keyPersonCategory;
+
+    /**本期本类别总人数*/
+    @Excel(name = "本期本类别总人数", width = 15)
+    @Schema(description = "本期本类别总人数")
+    private java.lang.Integer totalPersonCount;
+
+    /**本期本类别已失效总人数*/
+    @Excel(name = "本期本类别已失效总人数", width = 20)
+    @Schema(description = "本期本类别已失效总人数")
+    private java.lang.Integer totalExpiredCount;
+
+    /**本期本类别未就业总人数*/
+    @Excel(name = "本期本类别未就业总人数", width = 20)
+    @Schema(description = "本期本类别未就业总人数")
+    private java.lang.Integer totalUnemployedCount;
+}

+ 21 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statKeyPersonReflux/mapper/StatKeyPersonRefluxMapper.java

@@ -0,0 +1,21 @@
+package org.jeecg.modules.zjrs.dataReflux.statKeyPersonReflux.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.zjrs.dataReflux.statKeyPersonReflux.entity.StatKeyPersonReflux;
+import org.jeecg.modules.zjrs.dataReflux.statKeyPersonReflux.entity.StatKeyPersonRefluxStatisticsVo;
+
+import java.util.List;
+
+/**
+ * @Description: 重点人群回流明细表
+ * @Author: jeecg-boot
+ * @Date: 2026-06-11
+ * @Version: V1.0
+ */
+public interface StatKeyPersonRefluxMapper extends BaseMapper<StatKeyPersonReflux> {
+
+    /**
+     * 按年份统计重点人群数据
+     */
+    List<StatKeyPersonRefluxStatisticsVo> queryStatisticsByYear(Integer year);
+}

+ 30 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statKeyPersonReflux/mapper/xml/StatKeyPersonRefluxMapper.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.zjrs.dataReflux.statKeyPersonReflux.mapper.StatKeyPersonRefluxMapper">
+
+    <!-- 按年份统计重点人群数据(按月、区县、重点人群类别维度) -->
+    <select id="queryStatisticsByYear" resultType="org.jeecg.modules.zjrs.dataReflux.statKeyPersonReflux.entity.StatKeyPersonRefluxStatisticsVo">
+        SELECT
+            DATE_FORMAT(t.DATA_REFLUX_TIME, '%Y-%m') AS statisticsMonth,
+            t.DISTRICT AS district,
+            t.KEY_PERSON_CATEGORY AS keyPersonCategory,
+            COUNT(*) AS totalPersonCount,
+            SUM(CASE
+                    WHEN t.VALID_DATE IS NOT NULL
+                    AND t.VALID_DATE <![CDATA[ <= ]]> LAST_DAY(t.DATA_REFLUX_TIME)
+                    THEN 1
+                    ELSE 0
+                END) AS totalExpiredCount,
+            SUM(CASE
+                    WHEN t.CURRENT_EMPLOY_STATUS IS NULL
+                    OR t.CURRENT_EMPLOY_STATUS != '已就业'
+                    THEN 1
+                    ELSE 0
+                END) AS totalUnemployedCount
+        FROM STAT_KEY_PERSON_REFLUX t
+        WHERE YEAR(t.DATA_REFLUX_TIME) = #{year}
+        GROUP BY DATE_FORMAT(t.DATA_REFLUX_TIME, '%Y-%m'), t.DISTRICT, t.KEY_PERSON_CATEGORY
+        ORDER BY DATE_FORMAT(t.DATA_REFLUX_TIME, '%Y-%m') ASC, t.DISTRICT ASC, t.KEY_PERSON_CATEGORY ASC
+    </select>
+
+</mapper>

+ 31 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statKeyPersonReflux/service/IStatKeyPersonRefluxService.java

@@ -0,0 +1,31 @@
+package org.jeecg.modules.zjrs.dataReflux.statKeyPersonReflux.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.zjrs.dataReflux.statKeyPersonReflux.entity.StatKeyPersonReflux;
+import org.jeecg.modules.zjrs.dataReflux.statKeyPersonReflux.entity.StatKeyPersonRefluxStatisticsVo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 重点人群回流明细表
+ * @Author: jeecg-boot
+ * @Date: 2026-06-11
+ * @Version: V1.0
+ */
+public interface IStatKeyPersonRefluxService extends IService<StatKeyPersonReflux> {
+
+    /**
+     * 导出时对字典字段进行值→标签的内存映射翻译
+     *
+     * @param list         待导出的数据列表
+     * @param fieldDictMap 字段名→字典编码 的映射关系
+     * @return 字典字段已替换为中文标签的数据列表
+     */
+    List<StatKeyPersonReflux> translateDictFields(List<StatKeyPersonReflux> list, Map<String, String> fieldDictMap);
+
+    /**
+     * 按年份统计重点人群数据
+     */
+    List<StatKeyPersonRefluxStatisticsVo> queryStatisticsByYear(Integer year);
+}

+ 39 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statKeyPersonReflux/service/impl/StatKeyPersonRefluxServiceImpl.java

@@ -0,0 +1,39 @@
+package org.jeecg.modules.zjrs.dataReflux.statKeyPersonReflux.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.zjrs.dataReflux.statKeyPersonReflux.entity.StatKeyPersonReflux;
+import org.jeecg.modules.zjrs.dataReflux.statKeyPersonReflux.entity.StatKeyPersonRefluxStatisticsVo;
+import org.jeecg.modules.zjrs.dataReflux.statKeyPersonReflux.mapper.StatKeyPersonRefluxMapper;
+import org.jeecg.modules.zjrs.dataReflux.statKeyPersonReflux.service.IStatKeyPersonRefluxService;
+import org.jeecg.modules.zjrs.dictionary.service.IDictionaryItemService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * @Description: 重点人群回流明细表
+ * @Author: jeecg-boot
+ * @Date: 2026-06-11
+ * @Version: V1.0
+ */
+@Service
+public class StatKeyPersonRefluxServiceImpl extends ServiceImpl<StatKeyPersonRefluxMapper, StatKeyPersonReflux> implements IStatKeyPersonRefluxService {
+
+    @Autowired
+    private IDictionaryItemService dictionaryItemService;
+
+    @Autowired
+    private StatKeyPersonRefluxMapper statKeyPersonRefluxMapper;
+
+    @Override
+    public List<StatKeyPersonReflux> translateDictFields(List<StatKeyPersonReflux> list, Map<String, String> fieldDictMap) {
+        // 当前表无字典字段需要翻译,直接返回原列表
+        return list;
+    }
+
+    @Override
+    public List<StatKeyPersonRefluxStatisticsVo> queryStatisticsByYear(Integer year) {
+        return statKeyPersonRefluxMapper.queryStatisticsByYear(year);
+    }
+}

+ 217 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statWorkerReflux/controller/StatWorkerRefluxController.java

@@ -0,0 +1,217 @@
+package org.jeecg.modules.zjrs.dataReflux.statWorkerReflux.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.zjrs.dataReflux.statWorkerReflux.entity.StatWorkerReflux;
+import org.jeecg.modules.zjrs.dataReflux.statWorkerReflux.entity.StatWorkerRefluxStatisticsVo;
+import org.jeecg.modules.zjrs.dataReflux.statWorkerReflux.service.IStatWorkerRefluxService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.enmus.ExcelType;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+
+import java.util.*;
+
+ /**
+ * @Description: 农民工流动回流明细表
+ * @Author: jeecg-boot
+ * @Date:   2026-06-11
+ * @Version: V1.0
+ */
+@Tag(name="农民工流动回流明细表")
+@RestController
+@RequestMapping("/dataReflux/statWorkerReflux")
+@Slf4j
+public class StatWorkerRefluxController extends JeecgController<StatWorkerReflux, IStatWorkerRefluxService> {
+	@Autowired
+	private IStatWorkerRefluxService statWorkerRefluxService;
+
+	/**
+	 * 导出字段与字典编码的映射关系:entity字段名 → 字典编码
+	 * 用于导出时自动将字典值翻译为中文标签
+	 */
+	private static final Map<String, String> EXPORT_DICT_FIELD_MAP = new LinkedHashMap<>();
+
+	/**
+	 * 分页列表查询
+	 */
+	@Operation(summary="农民工流动回流明细表-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<StatWorkerReflux>> queryPageList(StatWorkerReflux statWorkerReflux,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   HttpServletRequest req) {
+        QueryWrapper<StatWorkerReflux> queryWrapper = QueryGenerator.initQueryWrapper(statWorkerReflux, req.getParameterMap());
+		Page<StatWorkerReflux> page = new Page<StatWorkerReflux>(pageNo, pageSize);
+		IPage<StatWorkerReflux> pageList = statWorkerRefluxService.page(page, queryWrapper);
+		return Result.OK(pageList);
+	}
+
+	/**
+	 *   添加
+	 */
+	@AutoLog(value = "农民工流动回流明细表-添加")
+	@Operation(summary="农民工流动回流明细表-添加")
+	@RequiresPermissions("dataReflux:stat_worker_reflux:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody StatWorkerReflux statWorkerReflux) {
+		statWorkerRefluxService.save(statWorkerReflux);
+		return Result.OK("添加成功!");
+	}
+
+	/**
+	 *  编辑
+	 */
+	@AutoLog(value = "农民工流动回流明细表-编辑")
+	@Operation(summary="农民工流动回流明细表-编辑")
+	@RequiresPermissions("dataReflux:stat_worker_reflux:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody StatWorkerReflux statWorkerReflux) {
+		statWorkerRefluxService.updateById(statWorkerReflux);
+		return Result.OK("编辑成功!");
+	}
+
+	/**
+	 *   通过id删除
+	 */
+	@AutoLog(value = "农民工流动回流明细表-通过id删除")
+	@Operation(summary="农民工流动回流明细表-通过id删除")
+	@RequiresPermissions("dataReflux:stat_worker_reflux:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		statWorkerRefluxService.removeById(id);
+		return Result.OK("删除成功!");
+	}
+
+	/**
+	 *  批量删除
+	 */
+	@AutoLog(value = "农民工流动回流明细表-批量删除")
+	@Operation(summary="农民工流动回流明细表-批量删除")
+	@RequiresPermissions("dataReflux:stat_worker_reflux:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.statWorkerRefluxService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("批量删除成功!");
+	}
+
+	/**
+	 * 通过id查询
+	 */
+	@Operation(summary="农民工流动回流明细表-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<StatWorkerReflux> queryById(@RequestParam(name="id",required=true) String id) {
+		StatWorkerReflux statWorkerReflux = statWorkerRefluxService.getById(id);
+		if(statWorkerReflux==null) {
+			return Result.error("未找到对应数据");
+		}
+		return Result.OK(statWorkerReflux);
+	}
+
+    /**
+    * 导出excel
+    */
+    @RequiresPermissions("dataReflux:stat_worker_reflux:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, StatWorkerReflux statWorkerReflux) {
+        // Step.1 组装查询条件
+        QueryWrapper<StatWorkerReflux> queryWrapper = QueryGenerator.initQueryWrapper(statWorkerReflux, request.getParameterMap());
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+
+        // 过滤选中数据
+        String selections = request.getParameter("selections");
+        if (oConvertUtils.isNotEmpty(selections)) {
+            List<String> selectionList = Arrays.asList(selections.split(","));
+            queryWrapper.in("id", selectionList);
+        }
+
+        // Step.2 获取导出数据并进行字典值→标签内存映射(业务逻辑委托给 Service)
+        List<StatWorkerReflux> exportList = statWorkerRefluxService.translateDictFields(
+                service.list(queryWrapper), EXPORT_DICT_FIELD_MAP);
+
+        // Step.3 AutoPoi 导出Excel(此时字典字段已替换为中文标签)
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        String title = "农民工流动回流明细表";
+        mv.addObject(NormalExcelConstants.FILE_NAME, title);
+        mv.addObject(NormalExcelConstants.CLASS, StatWorkerReflux.class);
+        ExportParams exportParams = new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title, ExcelType.XSSF);
+        mv.addObject(NormalExcelConstants.PARAMS, exportParams);
+        mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
+
+        String exportFields = "idCard,fullName,district,ruralRegisterFlag,originWorkArea,workEndDate,localEmployDate,personCategoryTag,dataRefluxTime";
+        mv.addObject(NormalExcelConstants.EXPORT_FIELDS, exportFields);
+        return mv;
+    }
+
+    /**
+      * 通过excel导入数据
+    */
+    @RequiresPermissions("dataReflux:stat_worker_reflux:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, StatWorkerReflux.class);
+    }
+
+    /**
+     * 按月统计查询
+     */
+    @Operation(summary="农民工流动回流明细表-按月统计查询")
+    @GetMapping(value = "/statistics/queryByMonth")
+    public Result<List<StatWorkerRefluxStatisticsVo>> queryStatisticsByMonth(
+            @RequestParam(name = "year", defaultValue = "2026") Integer year) {
+        List<StatWorkerRefluxStatisticsVo> list = statWorkerRefluxService.queryStatisticsByYear(year);
+        // 计算序号
+        int index = 1;
+        for (StatWorkerRefluxStatisticsVo vo : list) {
+            vo.setId(String.valueOf(index++));
+        }
+        return Result.OK(list);
+    }
+
+    /**
+     * 导出统计报表excel
+     */
+    @RequiresPermissions("dataReflux:stat_worker_reflux:statisticsExportXls")
+    @RequestMapping(value = "/statistics/exportXls")
+    public ModelAndView exportStatisticsXls(HttpServletRequest request,
+            @RequestParam(name = "year", defaultValue = "2026") Integer year) {
+        List<StatWorkerRefluxStatisticsVo> list = statWorkerRefluxService.queryStatisticsByYear(year);
+        // 计算序号
+        int index = 1;
+        for (StatWorkerRefluxStatisticsVo vo : list) {
+            vo.setId(String.valueOf(index++));
+        }
+
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        String title = "农民工返乡返岗统计报表";
+        mv.addObject(NormalExcelConstants.FILE_NAME, title);
+        mv.addObject(NormalExcelConstants.CLASS, StatWorkerRefluxStatisticsVo.class);
+        ExportParams exportParams = new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title, ExcelType.XSSF);
+        mv.addObject(NormalExcelConstants.PARAMS, exportParams);
+        mv.addObject(NormalExcelConstants.DATA_LIST, list);
+
+        String exportFields = "id,statisticsMonth,district,personCategoryTag,totalReturnCount,totalNewEmployCount";
+        mv.addObject(NormalExcelConstants.EXPORT_FIELDS, exportFields);
+        return mv;
+    }
+
+}

+ 95 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statWorkerReflux/entity/StatWorkerReflux.java

@@ -0,0 +1,95 @@
+package org.jeecg.modules.zjrs.dataReflux.statWorkerReflux.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: 农民工流动回流明细表
+ * @Author: jeecg-boot
+ * @Date:   2026-06-11
+ * @Version: V1.0
+ */
+@Data
+@TableName("stat_worker_reflux")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Schema(description="农民工流动回流明细表")
+public class StatWorkerReflux implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**主键*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @Schema(description = "主键")
+    private java.lang.String id;
+	/**身份证号码*/
+	@Excel(name = "身份证号码", width = 15)
+    @Schema(description = "身份证号码")
+    private java.lang.String idCard;
+	/**姓名*/
+	@Excel(name = "姓名", width = 15)
+    @Schema(description = "姓名")
+    private java.lang.String fullName;
+	/**所属区县*/
+	@Excel(name = "所属区县", width = 15)
+    @Schema(description = "所属区县")
+    private java.lang.String district;
+	/**乡村户籍标识*/
+	@Excel(name = "乡村户籍标识", width = 15)
+    @Schema(description = "乡村户籍标识")
+    private java.lang.String ruralRegisterFlag;
+	/**原就业外出地市/省份*/
+	@Excel(name = "原就业外出地市/省份", width = 15)
+    @Schema(description = "原就业外出地市/省份")
+    private java.lang.String originWorkArea;
+	/**外出就业结束日期*/
+	@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 workEndDate;
+	/**本地新就业登记日期*/
+	@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 localEmployDate;
+	/**人员类别标签*/
+	@Excel(name = "人员类别标签", width = 15)
+    @Schema(description = "人员类别标签")
+    private java.lang.String personCategoryTag;
+	/**数据回流时间*/
+	@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 dataRefluxTime;
+	/**创建人*/
+    @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;
+}

+ 46 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statWorkerReflux/entity/StatWorkerRefluxStatisticsVo.java

@@ -0,0 +1,46 @@
+package org.jeecg.modules.zjrs.dataReflux.statWorkerReflux.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * 农民工流动回流明细表-按月统计报表VO
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@Schema(description="农民工返乡返岗统计报表")
+public class StatWorkerRefluxStatisticsVo {
+
+    /**序号*/
+    @Schema(description = "序号")
+    private java.lang.String id;
+
+    /**统计月份*/
+    @Excel(name = "统计月份", width = 15)
+    @Schema(description = "统计月份")
+    private java.lang.String statisticsMonth;
+
+    /**所属区县*/
+    @Excel(name = "所属区县", width = 15)
+    @Schema(description = "所属区县")
+    private java.lang.String district;
+
+    /**人员类别*/
+    @Excel(name = "人员类别", width = 20)
+    @Schema(description = "人员类别")
+    private java.lang.String personCategoryTag;
+
+    /**本期返乡总人数*/
+    @Excel(name = "本期返乡总人数", width = 15)
+    @Schema(description = "本期返乡总人数")
+    private java.lang.Integer totalReturnCount;
+
+    /**本期新就业登记总人数*/
+    @Excel(name = "本期新就业登记总人数", width = 20)
+    @Schema(description = "本期新就业登记总人数")
+    private java.lang.Integer totalNewEmployCount;
+}

+ 21 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statWorkerReflux/mapper/StatWorkerRefluxMapper.java

@@ -0,0 +1,21 @@
+package org.jeecg.modules.zjrs.dataReflux.statWorkerReflux.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.jeecg.modules.zjrs.dataReflux.statWorkerReflux.entity.StatWorkerReflux;
+import org.jeecg.modules.zjrs.dataReflux.statWorkerReflux.entity.StatWorkerRefluxStatisticsVo;
+
+import java.util.List;
+
+/**
+ * @Description: 农民工流动回流明细表
+ * @Author: jeecg-boot
+ * @Date: 2026-06-11
+ * @Version: V1.0
+ */
+public interface StatWorkerRefluxMapper extends BaseMapper<StatWorkerReflux> {
+
+    /**
+     * 按年份统计农民工返乡返岗数据
+     */
+    List<StatWorkerRefluxStatisticsVo> queryStatisticsByYear(Integer year);
+}

+ 24 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statWorkerReflux/mapper/xml/StatWorkerRefluxMapper.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.zjrs.dataReflux.statWorkerReflux.mapper.StatWorkerRefluxMapper">
+
+    <!-- 按年份统计农民工返乡返岗数据(按月、区县、人员类别维度) -->
+    <select id="queryStatisticsByYear" resultType="org.jeecg.modules.zjrs.dataReflux.statWorkerReflux.entity.StatWorkerRefluxStatisticsVo">
+        SELECT
+            DATE_FORMAT(t.DATA_REFLUX_TIME, '%Y-%m') AS statisticsMonth,
+            t.DISTRICT AS district,
+            t.PERSON_CATEGORY_TAG AS personCategoryTag,
+            COUNT(*) AS totalReturnCount,
+            SUM(CASE
+                    WHEN t.LOCAL_EMPLOY_DATE IS NOT NULL
+                    AND DATE_FORMAT(t.LOCAL_EMPLOY_DATE, '%Y-%m') = DATE_FORMAT(t.DATA_REFLUX_TIME, '%Y-%m')
+                    THEN 1
+                    ELSE 0
+                END) AS totalNewEmployCount
+        FROM STAT_WORKER_REFLUX t
+        WHERE YEAR(t.DATA_REFLUX_TIME) = #{year}
+        GROUP BY DATE_FORMAT(t.DATA_REFLUX_TIME, '%Y-%m'), t.DISTRICT, t.PERSON_CATEGORY_TAG
+        ORDER BY DATE_FORMAT(t.DATA_REFLUX_TIME, '%Y-%m') ASC, t.DISTRICT ASC, t.PERSON_CATEGORY_TAG ASC
+    </select>
+
+</mapper>

+ 31 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statWorkerReflux/service/IStatWorkerRefluxService.java

@@ -0,0 +1,31 @@
+package org.jeecg.modules.zjrs.dataReflux.statWorkerReflux.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.zjrs.dataReflux.statWorkerReflux.entity.StatWorkerReflux;
+import org.jeecg.modules.zjrs.dataReflux.statWorkerReflux.entity.StatWorkerRefluxStatisticsVo;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 农民工流动回流明细表
+ * @Author: jeecg-boot
+ * @Date: 2026-06-11
+ * @Version: V1.0
+ */
+public interface IStatWorkerRefluxService extends IService<StatWorkerReflux> {
+
+    /**
+     * 导出时对字典字段进行值→标签的内存映射翻译
+     *
+     * @param list         待导出的数据列表
+     * @param fieldDictMap 字段名→字典编码 的映射关系
+     * @return 字典字段已替换为中文标签的数据列表
+     */
+    List<StatWorkerReflux> translateDictFields(List<StatWorkerReflux> list, Map<String, String> fieldDictMap);
+
+    /**
+     * 按年份统计农民工返乡返岗数据
+     */
+    List<StatWorkerRefluxStatisticsVo> queryStatisticsByYear(Integer year);
+}

+ 40 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/dataReflux/statWorkerReflux/service/impl/StatWorkerRefluxServiceImpl.java

@@ -0,0 +1,40 @@
+package org.jeecg.modules.zjrs.dataReflux.statWorkerReflux.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.zjrs.dataReflux.statWorkerReflux.entity.StatWorkerReflux;
+import org.jeecg.modules.zjrs.dataReflux.statWorkerReflux.entity.StatWorkerRefluxStatisticsVo;
+import org.jeecg.modules.zjrs.dataReflux.statWorkerReflux.mapper.StatWorkerRefluxMapper;
+import org.jeecg.modules.zjrs.dataReflux.statWorkerReflux.service.IStatWorkerRefluxService;
+import org.jeecg.modules.zjrs.dictionary.service.IDictionaryItemService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * @Description: 农民工流动回流明细表
+ * @Author: jeecg-boot
+ * @Date: 2026-06-11
+ * @Version: V1.0
+ */
+@Service
+public class StatWorkerRefluxServiceImpl extends ServiceImpl<StatWorkerRefluxMapper, StatWorkerReflux> implements IStatWorkerRefluxService {
+
+    @Autowired
+    private IDictionaryItemService dictionaryItemService;
+
+    @Autowired
+    private StatWorkerRefluxMapper statWorkerRefluxMapper;
+
+    @Override
+    public List<StatWorkerReflux> translateDictFields(List<StatWorkerReflux> list, Map<String, String> fieldDictMap) {
+        // 当前表无字典字段需要翻译,直接返回原列表
+        return list;
+    }
+
+    @Override
+    public List<StatWorkerRefluxStatisticsVo> queryStatisticsByYear(Integer year) {
+        return statWorkerRefluxMapper.queryStatisticsByYear(year);
+    }
+
+}

+ 3 - 0
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/personal/entity/PersonalInfo.java

@@ -1,6 +1,7 @@
 package org.jeecg.modules.zjrs.personal.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -203,7 +204,9 @@ public class PersonalInfo implements Serializable {
     private java.lang.String skillLevel;
     /**
      * 个人标签名称(逗号分隔,用于导出展示)
+     * 非数据库字段,由 Service 层动态计算设置
      */
+    @TableField(exist = false)
     @Excel(name = "个人标签", width = 25)
     @Schema(description = "个人标签名称")
     private java.lang.String tagNames;

+ 1 - 7
jeecg-boot/jeecg-boot-module/jeecg-module-zjrs/src/main/java/org/jeecg/modules/zjrs/personal/vo/PersonalInfoVO.java

@@ -22,10 +22,4 @@ public class PersonalInfoVO extends PersonalInfo {
      */
     @Schema(description = "个人标签ID列表")
     private java.lang.String tagIds;
-
-    /**
-     * 个人标签名称列表(逗号分隔,用于详情展示)
-     */
-    @Schema(description = "个人标签名称列表")
-    private java.lang.String tagNames;
-}
+}

+ 421 - 0
jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V20260611_1__menu_dataReflux.sql

@@ -0,0 +1,421 @@
+-- ============================================================
+-- 湛江市智慧人社运营运维(2025-2027年)项目
+-- 就业一湛通服务平台 - 数据统计模块 菜单权限SQL
+--
+-- 依据:《需求规格说明书》第3.11节 - 数据统计
+--   3.11.1 统计岗位归集数量 - 岗位数据回流明细表
+--   3.11.2 农民工返乡返岗统计 - 农民工流动回流明细表
+--   3.11.3 重点人群统计 - 重点人群回流明细表
+-- 
+-- 说明:该页面对应的前台目录为 views/dataReflux 文件夹下
+--       主菜单 parent_id = 2064888275729645570
+-- 数据库:MySQL
+-- 创建日期:2026-06-11
+-- ============================================================
+
+-- ============================================================
+-- 01. 岗位数据回流明细表
+-- ============================================================
+
+-- 主菜单
+INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type,
+                           sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, hide_tab, description,
+                           status, del_flag, rule_flag, create_by, create_time, update_by, update_time,
+                           internal_or_external)
+VALUES ('178061200000101', '2064888275729645570', '岗位回流数据', '/dataReflux/statJobReflux',
+        'dataReflux/statJobReflux/StatJobRefluxList', NULL, NULL, 1, NULL, '1', 1.0, 0, NULL, 1, 0, 0, 0, 0, NULL, '1',
+        0, 0, 'admin', '2026-06-11 00:00:00', NULL, NULL, 0);
+
+-- 添加
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000102', '178061200000101', '添加', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_job_reflux:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00', NULL,
+        NULL, 0, 0, '1', 0);
+
+-- 编辑
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000103', '178061200000101', '编辑', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_job_reflux:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00', NULL,
+        NULL, 0, 0, '1', 0);
+
+-- 删除
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000104', '178061200000101', '删除', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_job_reflux:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00', NULL,
+        NULL, 0, 0, '1', 0);
+
+-- 批量删除
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000105', '178061200000101', '批量删除', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_job_reflux:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00',
+        NULL, NULL, 0, 0, '1', 0);
+
+-- 导出excel
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000106', '178061200000101', '导出excel', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_job_reflux:exportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00', NULL,
+        NULL, 0, 0, '1', 0);
+
+-- 导入excel
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000107', '178061200000101', '导入excel', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_job_reflux:importExcel', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00',
+        NULL, NULL, 0, 0, '1', 0);
+
+-- 角色授权(以 admin 角色为例,role_id 可替换)
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000111', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000101', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000112', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000102', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000113', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000103', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000114', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000104', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000115', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000105', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000116', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000106', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000117', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000107', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+
+
+-- ============================================================
+-- 02. 农民工流动回流明细表
+-- ============================================================
+
+-- 主菜单
+INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type,
+                           sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, hide_tab, description,
+                           status, del_flag, rule_flag, create_by, create_time, update_by, update_time,
+                           internal_or_external)
+VALUES ('178061200000201', '2064888275729645570', '农民工流动回流数据', '/dataReflux/statWorkerReflux',
+        'dataReflux/statWorkerReflux/StatWorkerRefluxList', NULL, NULL, 1, NULL, '1', 2.0, 0, NULL, 1, 0, 0, 0, 0, NULL, '1',
+        0, 0, 'admin', '2026-06-11 00:00:00', NULL, NULL, 0);
+
+-- 添加
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000202', '178061200000201', '添加', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_worker_reflux:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00', NULL,
+        NULL, 0, 0, '1', 0);
+
+-- 编辑
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000203', '178061200000201', '编辑', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_worker_reflux:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00', NULL,
+        NULL, 0, 0, '1', 0);
+
+-- 删除
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000204', '178061200000201', '删除', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_worker_reflux:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00', NULL,
+        NULL, 0, 0, '1', 0);
+
+-- 批量删除
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000205', '178061200000201', '批量删除', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_worker_reflux:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00',
+        NULL, NULL, 0, 0, '1', 0);
+
+-- 导出excel
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000206', '178061200000201', '导出excel', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_worker_reflux:exportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00', NULL,
+        NULL, 0, 0, '1', 0);
+
+-- 导入excel
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000207', '178061200000201', '导入excel', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_worker_reflux:importExcel', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00',
+        NULL, NULL, 0, 0, '1', 0);
+
+-- 角色授权(以 admin 角色为例,role_id 可替换)
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000211', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000201', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000212', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000202', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000213', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000203', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000214', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000204', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000215', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000205', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000216', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000206', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000217', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000207', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+
+
+-- ============================================================
+-- 03. 重点人群回流明细表
+-- ============================================================
+
+-- 主菜单
+INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type,
+                           sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, hide_tab, description,
+                           status, del_flag, rule_flag, create_by, create_time, update_by, update_time,
+                           internal_or_external)
+VALUES ('178061200000301', '2064888275729645570', '重点人群回流数据', '/dataReflux/statKeyPersonReflux',
+        'dataReflux/statKeyPersonReflux/StatKeyPersonRefluxList', NULL, NULL, 1, NULL, '1', 3.0, 0, NULL, 1, 0, 0, 0, 0, NULL, '1',
+        0, 0, 'admin', '2026-06-11 00:00:00', NULL, NULL, 0);
+
+-- 添加
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000302', '178061200000301', '添加', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_key_person_reflux:add', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00', NULL,
+        NULL, 0, 0, '1', 0);
+
+-- 编辑
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000303', '178061200000301', '编辑', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_key_person_reflux:edit', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00', NULL,
+        NULL, 0, 0, '1', 0);
+
+-- 删除
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000304', '178061200000301', '删除', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_key_person_reflux:delete', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00', NULL,
+        NULL, 0, 0, '1', 0);
+
+-- 批量删除
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000305', '178061200000301', '批量删除', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_key_person_reflux:deleteBatch', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00',
+        NULL, NULL, 0, 0, '1', 0);
+
+-- 导出excel
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000306', '178061200000301', '导出excel', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_key_person_reflux:exportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00', NULL,
+        NULL, 0, 0, '1', 0);
+
+-- 导入excel
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000307', '178061200000301', '导入excel', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_key_person_reflux:importExcel', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00',
+        NULL, NULL, 0, 0, '1', 0);
+
+-- 角色授权(以 admin 角色为例,role_id 可替换)
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000311', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000301', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000312', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000302', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000313', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000303', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000314', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000304', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000315', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000305', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000316', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000306', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000317', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000307', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+
+
+-- ============================================================
+-- 04. 岗位归集数量统计报表
+-- 说明:按月份、区县维度统计岗位归集数据
+-- 对应页面:views/statistics/jobReflux/JobRefluxStatisticsList.vue
+-- ============================================================
+
+-- 主菜单
+INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type,
+                           sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, hide_tab, description,
+                           status, del_flag, rule_flag, create_by, create_time, update_by, update_time,
+                           internal_or_external)
+VALUES ('178061200000401', '2064888275729645570', '岗位归集数量统计', '/statistics/jobReflux',
+        'statistics/jobReflux/JobRefluxStatisticsList', NULL, NULL, 1, NULL, '1', 4.0, 0, NULL, 1, 0, 0, 0, 0, NULL, '1',
+        0, 0, 'admin', '2026-06-11 00:00:00', NULL, NULL, 0);
+
+-- 查询
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000402', '178061200000401', '查询', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_job_reflux:statisticsQuery', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00', NULL,
+        NULL, 0, 0, '1', 0);
+
+-- 导出excel
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000403', '178061200000401', '导出excel', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_job_reflux:statisticsExportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00', NULL,
+        NULL, 0, 0, '1', 0);
+
+-- 角色授权(以 admin 角色为例,role_id 可替换)
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000411', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000401', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000412', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000402', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000413', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000403', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+
+
+-- ============================================================
+-- 05. 农民工返乡返岗统计报表
+-- 说明:按月份、区县、人员类别维度统计农民工返乡返岗数据
+-- 对应页面:views/statistics/workerReflux/WorkerRefluxStatisticsList.vue
+-- ============================================================
+
+-- 主菜单
+INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type,
+                           sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, hide_tab, description,
+                           status, del_flag, rule_flag, create_by, create_time, update_by, update_time,
+                           internal_or_external)
+VALUES ('178061200000501', '2064888275729645570', '农民工返乡返岗统计', '/statistics/workerReflux',
+        'statistics/workerReflux/WorkerRefluxStatisticsList', NULL, NULL, 1, NULL, '1', 5.0, 0, NULL, 1, 0, 0, 0, 0, NULL, '1',
+        0, 0, 'admin', '2026-06-11 00:00:00', NULL, NULL, 0);
+
+-- 查询
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000502', '178061200000501', '查询', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_worker_reflux:statisticsQuery', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00', NULL,
+        NULL, 0, 0, '1', 0);
+
+-- 导出excel
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000503', '178061200000501', '导出excel', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_worker_reflux:statisticsExportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00', NULL,
+        NULL, 0, 0, '1', 0);
+
+-- 角色授权(以 admin 角色为例,role_id 可替换)
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000511', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000501', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000512', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000502', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000513', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000503', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+
+
+-- ============================================================
+-- 06. 重点人群统计报表
+-- 说明:按月份、区县、重点人群类别维度统计重点人群数据
+-- 对应页面:views/statistics/keyPersonReflux/KeyPersonRefluxStatisticsList.vue
+-- ============================================================
+
+-- 主菜单
+INSERT INTO sys_permission(id, parent_id, name, url, component, component_name, redirect, menu_type, perms, perms_type,
+                           sort_no, always_show, icon, is_route, is_leaf, keep_alive, hidden, hide_tab, description,
+                           status, del_flag, rule_flag, create_by, create_time, update_by, update_time,
+                           internal_or_external)
+VALUES ('178061200000601', '2064888275729645570', '重点人群统计', '/statistics/keyPersonReflux',
+        'statistics/keyPersonReflux/KeyPersonRefluxStatisticsList', NULL, NULL, 1, NULL, '1', 6.0, 0, NULL, 1, 0, 0, 0, 0, NULL, '1',
+        0, 0, 'admin', '2026-06-11 00:00:00', NULL, NULL, 0);
+
+-- 查询
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000602', '178061200000601', '查询', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_key_person_reflux:statisticsQuery', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00', NULL,
+        NULL, 0, 0, '1', 0);
+
+-- 导出excel
+INSERT INTO sys_permission(id, parent_id, name, url, component, is_route, component_name, redirect, menu_type, perms,
+                           perms_type, sort_no, always_show, icon, is_leaf, keep_alive, hidden, hide_tab, description,
+                           create_by, create_time, update_by, update_time, del_flag, rule_flag, status,
+                           internal_or_external)
+VALUES ('178061200000603', '178061200000601', '导出excel', NULL, NULL, 0, NULL, NULL, 2,
+        'dataReflux:stat_key_person_reflux:statisticsExportXls', '1', NULL, 0, NULL, 1, 0, 0, 0, NULL, 'admin', '2026-06-11 00:00:00', NULL,
+        NULL, 0, 0, '1', 0);
+
+-- 角色授权(以 admin 角色为例,role_id 可替换)
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000611', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000601', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000612', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000602', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');
+INSERT INTO sys_role_permission (id, role_id, permission_id, data_rule_ids, operate_date, operate_ip)
+VALUES ('178061200000613', 'f6817f48af4fb3af11b9e8bf182f618b', '178061200000603', NULL, '2026-06-11 00:00:00',
+        '127.0.0.1');

+ 79 - 0
jeecgboot-vue3/src/views/dataReflux/statJobReflux/StatJobReflux.api.ts

@@ -0,0 +1,79 @@
+import { defHttp } from '/@/utils/http/axios';
+import { useMessage } from '/@/hooks/web/useMessage';
+
+const { createConfirm } = useMessage();
+
+enum Api {
+  list = '/dataReflux/statJobReflux/list',
+  save = '/dataReflux/statJobReflux/add',
+  edit = '/dataReflux/statJobReflux/edit',
+  deleteOne = '/dataReflux/statJobReflux/delete',
+  deleteBatch = '/dataReflux/statJobReflux/deleteBatch',
+  importExcel = '/dataReflux/statJobReflux/importExcel',
+  exportXls = '/dataReflux/statJobReflux/exportXls',
+  queryById = '/dataReflux/statJobReflux/queryById',
+}
+
+/**
+ * 导出api
+ * @param params
+ */
+export const getExportUrl = Api.exportXls;
+
+/**
+ * 导入api
+ */
+export const getImportUrl = Api.importExcel;
+
+/**
+ * 列表接口
+ * @param params
+ */
+export const list = (params) => defHttp.get({ url: Api.list, params });
+
+/**
+ * 删除单个
+ * @param params
+ * @param handleSuccess
+ */
+export const deleteOne = (params, handleSuccess) => {
+  return defHttp.delete({ url: Api.deleteOne, params }, { joinParamsToUrl: true }).then(() => {
+    handleSuccess();
+  });
+};
+
+/**
+ * 批量删除
+ * @param params
+ * @param handleSuccess
+ */
+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();
+      });
+    },
+  });
+};
+
+/**
+ * 通过id查询
+ * @param params
+ */
+export const queryById = (params) => defHttp.get({ url: Api.queryById, params });
+
+/**
+ * 保存或者更新
+ * @param params
+ * @param isUpdate
+ */
+export const saveOrUpdate = (params, isUpdate) => {
+  let url = isUpdate ? Api.edit : Api.save;
+  return defHttp.post({ url: url, params }, { isTransformResponse: false });
+};

+ 77 - 0
jeecgboot-vue3/src/views/dataReflux/statJobReflux/StatJobReflux.data.ts

@@ -0,0 +1,77 @@
+import { BasicColumn } from '/@/components/Table';
+
+//列表数据
+export const columns: BasicColumn[] = [
+  {
+    title: '统一社会信用代码',
+    align: 'center',
+    width: 200,
+    dataIndex: 'unitCreditCode',
+  },
+  {
+    title: '企业名称',
+    align: 'center',
+    width: 200,
+    dataIndex: 'enterpriseName',
+  },
+  {
+    title: '所属区县',
+    align: 'center',
+    dataIndex: 'district',
+  },
+  {
+    title: '招聘岗位名称',
+    align: 'center',
+    dataIndex: 'jobName',
+  },
+  {
+    title: '计划招聘人数',
+    align: 'center',
+    dataIndex: 'planHireCount',
+  },
+  {
+    title: '岗位所属行业',
+    align: 'center',
+    dataIndex: 'jobIndustry',
+  },
+  {
+    title: '薪资区间',
+    align: 'center',
+    dataIndex: 'salaryRange',
+  },
+  {
+    title: '学历要求',
+    align: 'center',
+    dataIndex: 'educationRequire',
+  },
+  {
+    title: '岗位发布时间',
+    align: 'center',
+    dataIndex: 'jobPublishTime',
+  },
+  {
+    title: '岗位状态',
+    align: 'center',
+    dataIndex: 'jobStatus',
+  },
+  {
+    title: '数据回流时间',
+    align: 'center',
+    dataIndex: 'dataRefluxTime',
+  },
+];
+
+// 高级查询数据
+export const superQuerySchema = {
+  unitCreditCode: { title: '统一社会信用代码', order: 0, view: 'text', type: 'string' },
+  enterpriseName: { title: '企业名称', order: 1, view: 'text', type: 'string' },
+  district: { title: '所属区县', order: 2, view: 'text', type: 'string' },
+  jobName: { title: '招聘岗位名称', order: 3, view: 'text', type: 'string' },
+  planHireCount: { title: '计划招聘人数', order: 4, view: 'number', type: 'number' },
+  jobIndustry: { title: '岗位所属行业', order: 5, view: 'text', type: 'string' },
+  salaryRange: { title: '薪资区间', order: 6, view: 'text', type: 'string' },
+  educationRequire: { title: '学历要求', order: 7, view: 'text', type: 'string' },
+  jobPublishTime: { title: '岗位发布时间', order: 8, view: 'date', type: 'string' },
+  jobStatus: { title: '岗位状态', order: 9, view: 'text', type: 'string' },
+  dataRefluxTime: { title: '数据回流时间', order: 10, view: 'date', type: 'string' },
+};

+ 168 - 0
jeecgboot-vue3/src/views/dataReflux/statJobReflux/StatJobRefluxList.vue

@@ -0,0 +1,168 @@
+<template>
+  <div class="p-2">
+    <!--查询区域-->
+    <div class="jeecg-basic-table-form-container">
+      <a-form ref="formRef" @keyup.enter.native="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
+        <a-row :gutter="24">
+          <a-col :span="8">
+            <a-form-item label="企业名称" name="enterpriseName">
+              <a-input v-model:value="queryParam.enterpriseName" placeholder="请输入企业名称" allow-clear></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-item label="岗位名称" name="jobName">
+              <a-input v-model:value="queryParam.jobName" placeholder="请输入招聘岗位名称" allow-clear></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-item label="所属区县" name="district">
+              <a-input v-model:value="queryParam.district" placeholder="请输入所属区县" allow-clear></a-input>
+            </a-form-item>
+          </a-col>
+          <template v-if="toggleSearchStatus">
+          </template>
+          <a-col :span="24" style="text-align: right">
+            <a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
+            <a-button preIcon="ant-design:reload-outlined" style="margin-left: 8px" @click="searchReset">重置</a-button>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!--引用表格-->
+    <BasicTable @register="registerTable">
+      <!--插槽:table标题-->
+      <template #tableTitle>
+        <a-button preIcon="ant-design:export-outlined" type="primary" @click="onExportXls"> 导出</a-button>
+      </template>
+      <!--操作栏-->
+      <template #action="{ record }">
+        <TableAction :actions="getTableAction(record)" />
+      </template>
+    </BasicTable>
+    <!-- 详情弹窗 -->
+    <StatJobRefluxDetailModal ref="registerDetailModal"></StatJobRefluxDetailModal>
+  </div>
+</template>
+
+<script lang="ts" name="dataReflux-statJobReflux" setup>
+  import { reactive, ref } from 'vue';
+  import { BasicTable, TableAction } from '/@/components/Table';
+  import { useListPage } from '/@/hooks/system/useListPage';
+  import { columns, superQuerySchema } from './StatJobReflux.data';
+  import { getExportUrl, list } from './StatJobReflux.api';
+  import StatJobRefluxDetailModal from './components/StatJobRefluxDetailModal.vue';
+
+  const formRef = ref();
+  const queryParam = reactive<any>({});
+  const toggleSearchStatus = ref<boolean>(false);
+  const registerDetailModal = ref();
+
+  // 注册table数据
+  const { prefixCls, tableContext, onExportXls } = useListPage({
+    tableProps: {
+      title: '岗位数据回流明细表',
+      api: list,
+      columns,
+      canResize: true,
+      useSearchForm: false,
+      rowSelection: false,
+      actionColumn: {
+        width: 100,
+        fixed: 'right',
+      },
+      beforeFetch: async (params) => {
+        return Object.assign(params, queryParam);
+      },
+    },
+    exportConfig: {
+      name: '岗位数据回流明细表',
+      url: getExportUrl,
+      params: queryParam,
+    },
+  });
+  const [registerTable, { reload }] = tableContext;
+  const labelCol = reactive({
+    xs: 24,
+    sm: 4,
+    xl: 6,
+    xxl: 4,
+  });
+  const wrapperCol = reactive({
+    xs: 24,
+    sm: 20,
+  });
+
+  // 高级查询配置
+  const superQueryConfig = reactive(superQuerySchema);
+
+  /**
+   * 高级查询事件
+   */
+  function handleSuperQuery(params) {
+    Object.keys(params).map((k) => {
+      queryParam[k] = params[k];
+    });
+    searchQuery();
+  }
+
+  /**
+   * 详情
+   */
+  function handleDetail(record: Recordable) {
+    registerDetailModal.value.open(record);
+  }
+
+  /**
+   * 操作栏
+   */
+  function getTableAction(record) {
+    return [
+      {
+        label: '查看',
+        onClick: handleDetail.bind(null, record),
+      },
+    ];
+  }
+
+  /**
+   * 查询
+   */
+  function searchQuery() {
+    reload();
+  }
+
+  /**
+   * 重置
+   */
+  function searchReset() {
+    formRef.value.resetFields();
+    reload();
+  }
+</script>
+
+<style lang="less" scoped>
+  .jeecg-basic-table-form-container {
+    padding: 0;
+    .table-page-search-submitButtons {
+      display: block;
+      margin-bottom: 24px;
+      white-space: nowrap;
+    }
+    .query-group-cust {
+      min-width: 100px !important;
+    }
+    .query-group-split-cust {
+      width: 30px;
+      display: inline-block;
+      text-align: center;
+    }
+    .ant-form-item:not(.ant-form-item-with-help) {
+      margin-bottom: 16px;
+      height: 32px;
+    }
+    :deep(.ant-picker),
+    :deep(.ant-input-number) {
+      width: 100%;
+    }
+  }
+</style>

+ 95 - 0
jeecgboot-vue3/src/views/dataReflux/statJobReflux/components/StatJobRefluxDetailModal.vue

@@ -0,0 +1,95 @@
+<template>
+  <j-modal :footer="null" title="岗位数据回流明细表详情" :visible="visible" :width="1000" @cancel="handleCancel">
+    <a-spin :spinning="loading">
+      <a-descriptions :column="2" bordered size="middle" style="margin-top: 20px">
+        <a-descriptions-item label="统一社会信用代码" :span="1">
+          {{ detailData.unitCreditCode }}
+        </a-descriptions-item>
+        <a-descriptions-item label="企业名称" :span="1">
+          {{ detailData.enterpriseName }}
+        </a-descriptions-item>
+
+        <a-descriptions-item label="所属区县" :span="1">
+          {{ detailData.district }}
+        </a-descriptions-item>
+        <a-descriptions-item label="招聘岗位名称" :span="1">
+          {{ detailData.jobName }}
+        </a-descriptions-item>
+
+        <a-descriptions-item label="计划招聘人数" :span="1">
+          {{ detailData.planHireCount }}
+        </a-descriptions-item>
+        <a-descriptions-item label="岗位所属行业" :span="1">
+          {{ detailData.jobIndustry }}
+        </a-descriptions-item>
+
+        <a-descriptions-item label="薪资区间" :span="1">
+          {{ detailData.salaryRange }}
+        </a-descriptions-item>
+        <a-descriptions-item label="学历要求" :span="1">
+          {{ detailData.educationRequire }}
+        </a-descriptions-item>
+
+        <a-descriptions-item label="岗位发布时间" :span="1">
+          {{ detailData.jobPublishTime }}
+        </a-descriptions-item>
+        <a-descriptions-item label="岗位状态" :span="1">
+          {{ detailData.jobStatus }}
+        </a-descriptions-item>
+
+        <a-descriptions-item label="数据回流时间" :span="1">
+          {{ detailData.dataRefluxTime }}
+        </a-descriptions-item>
+      </a-descriptions>
+
+      <template #footer>
+        <a-button @click="handleCancel">关闭</a-button>
+      </template>
+    </a-spin>
+  </j-modal>
+</template>
+
+<script lang="ts" setup>
+  import { defineExpose, ref } from 'vue';
+  import JModal from '/@/components/Modal/src/JModal/JModal.vue';
+  import { queryById } from '../StatJobReflux.api';
+
+  const visible = ref<boolean>(false);
+  const loading = ref<boolean>(false);
+  const detailData = ref<Record<string, any>>({});
+
+  /**
+   * 打开详情弹窗,传入要展示的记录数据
+   * @param record 记录数据
+   */
+  async function open(record: Record<string, any>) {
+    visible.value = true;
+    loading.value = true;
+    try {
+      // 通过 queryById 获取完整数据
+      const result = await queryById({ id: record.id });
+      detailData.value = { ...result };
+    } catch {
+      detailData.value = { ...record };
+    } finally {
+      loading.value = false;
+    }
+  }
+
+  /**
+   * 关闭弹窗
+   */
+  function handleCancel() {
+    visible.value = false;
+  }
+
+  defineExpose({
+    open,
+  });
+</script>
+
+<style lang="less" scoped>
+  .ant-descriptions {
+    width: 100%;
+  }
+</style>

+ 201 - 0
jeecgboot-vue3/src/views/dataReflux/statJobReflux/components/StatJobRefluxForm.vue

@@ -0,0 +1,201 @@
+<template>
+  <a-spin :spinning="confirmLoading">
+    <JFormContainer :disabled="disabled">
+      <template #detail>
+        <a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol" name="StatJobRefluxForm">
+          <a-row>
+            <a-col :span="12">
+              <a-form-item label="统一社会信用代码" v-bind="validateInfos.unitCreditCode" id="StatJobRefluxForm-unitCreditCode" name="unitCreditCode">
+                <a-input v-model:value="formData.unitCreditCode" placeholder="请输入统一社会信用代码" allow-clear></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="企业名称" v-bind="validateInfos.enterpriseName" id="StatJobRefluxForm-enterpriseName" name="enterpriseName">
+                <a-input v-model:value="formData.enterpriseName" placeholder="请输入企业名称" allow-clear></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="所属区县" v-bind="validateInfos.district" id="StatJobRefluxForm-district" name="district">
+                <a-input v-model:value="formData.district" placeholder="请输入所属区县" allow-clear></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="招聘岗位名称" v-bind="validateInfos.jobName" id="StatJobRefluxForm-jobName" name="jobName">
+                <a-input v-model:value="formData.jobName" placeholder="请输入招聘岗位名称" allow-clear></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="计划招聘人数" v-bind="validateInfos.planHireCount" id="StatJobRefluxForm-planHireCount" name="planHireCount">
+                <a-input-number v-model:value="formData.planHireCount" placeholder="请输入计划招聘人数" :min="0" style="width: 100%" allow-clear></a-input-number>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="岗位所属行业" v-bind="validateInfos.jobIndustry" id="StatJobRefluxForm-jobIndustry" name="jobIndustry">
+                <a-input v-model:value="formData.jobIndustry" placeholder="请输入岗位所属行业" allow-clear></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="薪资区间" v-bind="validateInfos.salaryRange" id="StatJobRefluxForm-salaryRange" name="salaryRange">
+                <a-input v-model:value="formData.salaryRange" placeholder="请输入薪资区间" allow-clear></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="学历要求" v-bind="validateInfos.educationRequire" id="StatJobRefluxForm-educationRequire" name="educationRequire">
+                <a-input v-model:value="formData.educationRequire" placeholder="请输入学历要求" allow-clear></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="岗位发布时间" v-bind="validateInfos.jobPublishTime" id="StatJobRefluxForm-jobPublishTime" name="jobPublishTime">
+                <a-date-picker v-model:value="formData.jobPublishTime" placeholder="请选择岗位发布时间" value-format="YYYY-MM-DD" style="width: 100%" allow-clear></a-date-picker>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="岗位状态" v-bind="validateInfos.jobStatus" id="StatJobRefluxForm-jobStatus" name="jobStatus">
+                <a-input v-model:value="formData.jobStatus" placeholder="请输入岗位状态" allow-clear></a-input>
+              </a-form-item>
+            </a-col>
+          </a-row>
+        </a-form>
+      </template>
+    </JFormContainer>
+  </a-spin>
+</template>
+
+<script lang="ts" setup>
+  import { computed, defineExpose, defineProps, nextTick, reactive, ref } from 'vue';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { getDateByPicker, getValueType } from '/@/utils';
+  import { saveOrUpdate } from '../StatJobReflux.api';
+  import { Form } from 'ant-design-vue';
+  import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
+
+  const props = defineProps({
+    formDisabled: { type: Boolean, default: false },
+    formData: { type: Object, default: () => ({}) },
+    formBpm: { type: Boolean, default: true },
+  });
+  const formRef = ref();
+  const useForm = Form.useForm;
+  const emit = defineEmits(['register', 'ok']);
+  const formData = reactive<Record<string, any>>({
+    id: '',
+    unitCreditCode: '',
+    enterpriseName: '',
+    district: '',
+    jobName: '',
+    planHireCount: '',
+    jobIndustry: '',
+    salaryRange: '',
+    educationRequire: '',
+    jobPublishTime: '',
+    jobStatus: '',
+    dataRefluxTime: '',
+  });
+  const { createMessage } = useMessage();
+  const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });
+  const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
+  const confirmLoading = ref<boolean>(false);
+  //表单验证
+  const validatorRules = reactive({});
+  const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });
+  //日期个性化选择
+  const fieldPickers = reactive({});
+
+  // 表单禁用
+  const disabled = computed(() => {
+    if (props.formBpm === true) {
+      if (props.formData.disabled === false) {
+        return false;
+      } else {
+        return true;
+      }
+    }
+    return props.formDisabled;
+  });
+
+  /**
+   * 新增
+   */
+  function add() {
+    edit({});
+  }
+
+  /**
+   * 编辑
+   */
+  function edit(record) {
+    nextTick(() => {
+      resetFields();
+      const tmpData = {};
+      Object.keys(formData).forEach((key) => {
+        if (record.hasOwnProperty(key)) {
+          tmpData[key] = record[key];
+        }
+      });
+      //赋值
+      Object.assign(formData, tmpData);
+    });
+  }
+
+  /**
+   * 提交数据
+   */
+  async function submitForm() {
+    try {
+      // 触发表单验证
+      await validate();
+    } catch ({ errorFields }) {
+      if (errorFields) {
+        const firstField = errorFields[0];
+        if (firstField) {
+          formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });
+        }
+      }
+      return Promise.reject(errorFields);
+    }
+    confirmLoading.value = true;
+    const isUpdate = ref<boolean>(false);
+    //时间格式化
+    let model = formData;
+    if (model.id) {
+      isUpdate.value = true;
+    }
+    //循环数据
+    for (let data in model) {
+      // 更新个性化日期选择器的值
+      model[data] = getDateByPicker(model[data], fieldPickers[data]);
+      //如果该数据是数组并且是字符串类型
+      if (model[data] instanceof Array) {
+        let valueType = getValueType(formRef.value.getProps, data);
+        //如果是字符串类型的需要变成以逗号分割的字符串
+        if (valueType === 'string') {
+          model[data] = model[data].join(',');
+        }
+      }
+    }
+    await saveOrUpdate(model, isUpdate.value)
+      .then((res) => {
+        if (res.success) {
+          createMessage.success(res.message);
+          emit('ok');
+        } else {
+          createMessage.warning(res.message);
+        }
+      })
+      .finally(() => {
+        confirmLoading.value = false;
+      });
+  }
+
+  defineExpose({
+    add,
+    edit,
+    submitForm,
+  });
+</script>
+
+<style lang="less" scoped>
+  .antd-modal-form {
+    padding: 14px 20px;
+  }
+</style>

+ 92 - 0
jeecgboot-vue3/src/views/dataReflux/statJobReflux/components/StatJobRefluxModal.vue

@@ -0,0 +1,92 @@
+<template>
+  <j-modal
+    :fullscreen="true"
+    :okButtonProps="{ class: { 'jee-hidden': disableSubmit } }"
+    :title="title"
+    :visible="visible"
+    :width="800"
+    cancelText="关闭"
+    maxHeight="500px"
+    @cancel="handleCancel"
+    @ok="handleOk"
+  >
+    <StatJobRefluxForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"></StatJobRefluxForm>
+    <template #footer>
+      <a-button @click="handleCancel">取消</a-button>
+      <a-button :class="{ 'jee-hidden': disableSubmit }" type="primary" @click="handleOk">确认</a-button>
+    </template>
+  </j-modal>
+</template>
+
+<script lang="ts" setup>
+  import { defineExpose, nextTick, ref } from 'vue';
+  import StatJobRefluxForm from './StatJobRefluxForm.vue';
+  import JModal from '/@/components/Modal/src/JModal/JModal.vue';
+  import { useMessage } from '/@/hooks/web/useMessage';
+
+  const { createMessage } = useMessage();
+  const title = ref<string>('');
+  const width = ref<number>(800);
+  const visible = ref<boolean>(false);
+  const disableSubmit = ref<boolean>(false);
+  const registerForm = ref();
+  const emit = defineEmits(['register', 'success']);
+
+  /**
+   * 新增
+   */
+  function add() {
+    title.value = '新增';
+    visible.value = true;
+    nextTick(() => {
+      registerForm.value.add();
+    });
+  }
+
+  /**
+   * 编辑
+   * @param record
+   */
+  function edit(record) {
+    title.value = disableSubmit.value ? '详情' : '编辑';
+    visible.value = true;
+    nextTick(() => {
+      registerForm.value.edit(record);
+    });
+  }
+
+  /**
+   * 确定按钮点击事件
+   */
+  function handleOk() {
+    registerForm.value.submitForm();
+  }
+
+  /**
+   * form保存回调事件
+   */
+  function submitCallback() {
+    handleCancel();
+    emit('success');
+  }
+
+  /**
+   * 取消按钮回调事件
+   */
+  function handleCancel() {
+    visible.value = false;
+  }
+  defineExpose({
+    add,
+    edit,
+    disableSubmit,
+  });
+</script>
+
+<style lang="less">
+  /**隐藏样式-modal确定按钮 */
+  .jee-hidden {
+    display: none !important;
+  }
+</style>
+<style lang="less" scoped></style>

+ 79 - 0
jeecgboot-vue3/src/views/dataReflux/statKeyPersonReflux/StatKeyPersonReflux.api.ts

@@ -0,0 +1,79 @@
+import { defHttp } from '/@/utils/http/axios';
+import { useMessage } from '/@/hooks/web/useMessage';
+
+const { createConfirm } = useMessage();
+
+enum Api {
+  list = '/dataReflux/statKeyPersonReflux/list',
+  save = '/dataReflux/statKeyPersonReflux/add',
+  edit = '/dataReflux/statKeyPersonReflux/edit',
+  deleteOne = '/dataReflux/statKeyPersonReflux/delete',
+  deleteBatch = '/dataReflux/statKeyPersonReflux/deleteBatch',
+  importExcel = '/dataReflux/statKeyPersonReflux/importExcel',
+  exportXls = '/dataReflux/statKeyPersonReflux/exportXls',
+  queryById = '/dataReflux/statKeyPersonReflux/queryById',
+}
+
+/**
+ * 导出api
+ * @param params
+ */
+export const getExportUrl = Api.exportXls;
+
+/**
+ * 导入api
+ */
+export const getImportUrl = Api.importExcel;
+
+/**
+ * 列表接口
+ * @param params
+ */
+export const list = (params) => defHttp.get({ url: Api.list, params });
+
+/**
+ * 删除单个
+ * @param params
+ * @param handleSuccess
+ */
+export const deleteOne = (params, handleSuccess) => {
+  return defHttp.delete({ url: Api.deleteOne, params }, { joinParamsToUrl: true }).then(() => {
+    handleSuccess();
+  });
+};
+
+/**
+ * 批量删除
+ * @param params
+ * @param handleSuccess
+ */
+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();
+      });
+    },
+  });
+};
+
+/**
+ * 通过id查询
+ * @param params
+ */
+export const queryById = (params) => defHttp.get({ url: Api.queryById, params });
+
+/**
+ * 保存或者更新
+ * @param params
+ * @param isUpdate
+ */
+export const saveOrUpdate = (params, isUpdate) => {
+  let url = isUpdate ? Api.edit : Api.save;
+  return defHttp.post({ url: url, params }, { isTransformResponse: false });
+};

+ 59 - 0
jeecgboot-vue3/src/views/dataReflux/statKeyPersonReflux/StatKeyPersonReflux.data.ts

@@ -0,0 +1,59 @@
+import { BasicColumn } from '/@/components/Table';
+
+//列表数据
+export const columns: BasicColumn[] = [
+  {
+    title: '身份证号码',
+    align: 'center',
+    width: 200,
+    dataIndex: 'idCard',
+  },
+  {
+    title: '姓名',
+    align: 'center',
+    width: 120,
+    dataIndex: 'fullName',
+  },
+  {
+    title: '所属区县',
+    align: 'center',
+    dataIndex: 'district',
+  },
+  {
+    title: '重点人群类别',
+    align: 'center',
+    dataIndex: 'keyPersonCategory',
+  },
+  {
+    title: '认定日期',
+    align: 'center',
+    dataIndex: 'confirmDate',
+  },
+  {
+    title: '有效日期',
+    align: 'center',
+    dataIndex: 'validDate',
+  },
+  {
+    title: '当前就业状态',
+    align: 'center',
+    dataIndex: 'currentEmployStatus',
+  },
+  {
+    title: '数据回流时间',
+    align: 'center',
+    dataIndex: 'dataRefluxTime',
+  },
+];
+
+// 高级查询数据
+export const superQuerySchema = {
+  idCard: { title: '身份证号码', order: 0, view: 'text', type: 'string' },
+  fullName: { title: '姓名', order: 1, view: 'text', type: 'string' },
+  district: { title: '所属区县', order: 2, view: 'text', type: 'string' },
+  keyPersonCategory: { title: '重点人群类别', order: 3, view: 'text', type: 'string' },
+  confirmDate: { title: '认定日期', order: 4, view: 'date', type: 'string' },
+  validDate: { title: '有效日期', order: 5, view: 'date', type: 'string' },
+  currentEmployStatus: { title: '当前就业状态', order: 6, view: 'text', type: 'string' },
+  dataRefluxTime: { title: '数据回流时间', order: 7, view: 'date', type: 'string' },
+};

+ 168 - 0
jeecgboot-vue3/src/views/dataReflux/statKeyPersonReflux/StatKeyPersonRefluxList.vue

@@ -0,0 +1,168 @@
+<template>
+  <div class="p-2">
+    <!--查询区域-->
+    <div class="jeecg-basic-table-form-container">
+      <a-form ref="formRef" @keyup.enter.native="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
+        <a-row :gutter="24">
+          <a-col :span="8">
+            <a-form-item label="姓名" name="fullName">
+              <a-input v-model:value="queryParam.fullName" placeholder="请输入姓名" allow-clear></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-item label="身份证号码" name="idCard">
+              <a-input v-model:value="queryParam.idCard" placeholder="请输入身份证号码" allow-clear></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-item label="所属区县" name="district">
+              <a-input v-model:value="queryParam.district" placeholder="请输入所属区县" allow-clear></a-input>
+            </a-form-item>
+          </a-col>
+          <template v-if="toggleSearchStatus">
+          </template>
+          <a-col :span="24" style="text-align: right">
+            <a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
+            <a-button preIcon="ant-design:reload-outlined" style="margin-left: 8px" @click="searchReset">重置</a-button>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!--引用表格-->
+    <BasicTable @register="registerTable">
+      <!--插槽:table标题-->
+      <template #tableTitle>
+        <a-button preIcon="ant-design:export-outlined" type="primary" @click="onExportXls"> 导出</a-button>
+      </template>
+      <!--操作栏-->
+      <template #action="{ record }">
+        <TableAction :actions="getTableAction(record)" />
+      </template>
+    </BasicTable>
+    <!-- 详情弹窗 -->
+    <StatKeyPersonRefluxDetailModal ref="registerDetailModal"></StatKeyPersonRefluxDetailModal>
+  </div>
+</template>
+
+<script lang="ts" name="dataReflux-statKeyPersonReflux" setup>
+  import { reactive, ref } from 'vue';
+  import { BasicTable, TableAction } from '/@/components/Table';
+  import { useListPage } from '/@/hooks/system/useListPage';
+  import { columns, superQuerySchema } from './StatKeyPersonReflux.data';
+  import { getExportUrl, list } from './StatKeyPersonReflux.api';
+  import StatKeyPersonRefluxDetailModal from './components/StatKeyPersonRefluxDetailModal.vue';
+
+  const formRef = ref();
+  const queryParam = reactive<any>({});
+  const toggleSearchStatus = ref<boolean>(false);
+  const registerDetailModal = ref();
+
+  // 注册table数据
+  const { prefixCls, tableContext, onExportXls } = useListPage({
+    tableProps: {
+      title: '重点人群回流明细表',
+      api: list,
+      columns,
+      canResize: true,
+      useSearchForm: false,
+      rowSelection: false,
+      actionColumn: {
+        width: 100,
+        fixed: 'right',
+      },
+      beforeFetch: async (params) => {
+        return Object.assign(params, queryParam);
+      },
+    },
+    exportConfig: {
+      name: '重点人群回流明细表',
+      url: getExportUrl,
+      params: queryParam,
+    },
+  });
+  const [registerTable, { reload }] = tableContext;
+  const labelCol = reactive({
+    xs: 24,
+    sm: 4,
+    xl: 6,
+    xxl: 4,
+  });
+  const wrapperCol = reactive({
+    xs: 24,
+    sm: 20,
+  });
+
+  // 高级查询配置
+  const superQueryConfig = reactive(superQuerySchema);
+
+  /**
+   * 高级查询事件
+   */
+  function handleSuperQuery(params) {
+    Object.keys(params).map((k) => {
+      queryParam[k] = params[k];
+    });
+    searchQuery();
+  }
+
+  /**
+   * 详情
+   */
+  function handleDetail(record: Recordable) {
+    registerDetailModal.value.open(record);
+  }
+
+  /**
+   * 操作栏
+   */
+  function getTableAction(record) {
+    return [
+      {
+        label: '查看',
+        onClick: handleDetail.bind(null, record),
+      },
+    ];
+  }
+
+  /**
+   * 查询
+   */
+  function searchQuery() {
+    reload();
+  }
+
+  /**
+   * 重置
+   */
+  function searchReset() {
+    formRef.value.resetFields();
+    reload();
+  }
+</script>
+
+<style lang="less" scoped>
+  .jeecg-basic-table-form-container {
+    padding: 0;
+    .table-page-search-submitButtons {
+      display: block;
+      margin-bottom: 24px;
+      white-space: nowrap;
+    }
+    .query-group-cust {
+      min-width: 100px !important;
+    }
+    .query-group-split-cust {
+      width: 30px;
+      display: inline-block;
+      text-align: center;
+    }
+    .ant-form-item:not(.ant-form-item-with-help) {
+      margin-bottom: 16px;
+      height: 32px;
+    }
+    :deep(.ant-picker),
+    :deep(.ant-input-number) {
+      width: 100%;
+    }
+  }
+</style>

+ 84 - 0
jeecgboot-vue3/src/views/dataReflux/statKeyPersonReflux/components/StatKeyPersonRefluxDetailModal.vue

@@ -0,0 +1,84 @@
+<template>
+  <j-modal :footer="null" title="重点人群回流明细表详情" :visible="visible" :width="1000" @cancel="handleCancel">
+    <a-spin :spinning="loading">
+      <a-descriptions :column="2" bordered size="middle" style="margin-top: 20px">
+        <a-descriptions-item label="身份证号码" :span="1">
+          {{ detailData.idCard }}
+        </a-descriptions-item>
+        <a-descriptions-item label="姓名" :span="1">
+          {{ detailData.fullName }}
+        </a-descriptions-item>
+
+        <a-descriptions-item label="所属区县" :span="1">
+          {{ detailData.district }}
+        </a-descriptions-item>
+        <a-descriptions-item label="重点人群类别" :span="1">
+          {{ detailData.keyPersonCategory }}
+        </a-descriptions-item>
+
+        <a-descriptions-item label="认定日期" :span="1">
+          {{ detailData.confirmDate }}
+        </a-descriptions-item>
+        <a-descriptions-item label="有效日期" :span="1">
+          {{ detailData.validDate }}
+        </a-descriptions-item>
+
+        <a-descriptions-item label="当前就业状态" :span="1">
+          {{ detailData.currentEmployStatus }}
+        </a-descriptions-item>
+        <a-descriptions-item label="数据回流时间" :span="1">
+          {{ detailData.dataRefluxTime }}
+        </a-descriptions-item>
+      </a-descriptions>
+
+      <template #footer>
+        <a-button @click="handleCancel">关闭</a-button>
+      </template>
+    </a-spin>
+  </j-modal>
+</template>
+
+<script lang="ts" setup>
+  import { defineExpose, ref } from 'vue';
+  import JModal from '/@/components/Modal/src/JModal/JModal.vue';
+  import { queryById } from '../StatKeyPersonReflux.api';
+
+  const visible = ref<boolean>(false);
+  const loading = ref<boolean>(false);
+  const detailData = ref<Record<string, any>>({});
+
+  /**
+   * 打开详情弹窗,传入要展示的记录数据
+   * @param record 记录数据
+   */
+  async function open(record: Record<string, any>) {
+    visible.value = true;
+    loading.value = true;
+    try {
+      // 通过 queryById 获取完整数据
+      const result = await queryById({ id: record.id });
+      detailData.value = { ...result };
+    } catch {
+      detailData.value = { ...record };
+    } finally {
+      loading.value = false;
+    }
+  }
+
+  /**
+   * 关闭弹窗
+   */
+  function handleCancel() {
+    visible.value = false;
+  }
+
+  defineExpose({
+    open,
+  });
+</script>
+
+<style lang="less" scoped>
+  .ant-descriptions {
+    width: 100%;
+  }
+</style>

+ 183 - 0
jeecgboot-vue3/src/views/dataReflux/statKeyPersonReflux/components/StatKeyPersonRefluxForm.vue

@@ -0,0 +1,183 @@
+<template>
+  <a-spin :spinning="confirmLoading">
+    <JFormContainer :disabled="disabled">
+      <template #detail>
+        <a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol" name="StatKeyPersonRefluxForm">
+          <a-row>
+            <a-col :span="12">
+              <a-form-item label="身份证号码" v-bind="validateInfos.idCard" id="StatKeyPersonRefluxForm-idCard" name="idCard">
+                <a-input v-model:value="formData.idCard" placeholder="请输入身份证号码" allow-clear></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="姓名" v-bind="validateInfos.fullName" id="StatKeyPersonRefluxForm-fullName" name="fullName">
+                <a-input v-model:value="formData.fullName" placeholder="请输入姓名" allow-clear></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="所属区县" v-bind="validateInfos.district" id="StatKeyPersonRefluxForm-district" name="district">
+                <a-input v-model:value="formData.district" placeholder="请输入所属区县" allow-clear></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="重点人群类别" v-bind="validateInfos.keyPersonCategory" id="StatKeyPersonRefluxForm-keyPersonCategory" name="keyPersonCategory">
+                <a-input v-model:value="formData.keyPersonCategory" placeholder="请输入重点人群类别" allow-clear></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="认定日期" v-bind="validateInfos.confirmDate" id="StatKeyPersonRefluxForm-confirmDate" name="confirmDate">
+                <a-date-picker v-model:value="formData.confirmDate" placeholder="请选择认定日期" value-format="YYYY-MM-DD" style="width: 100%" allow-clear></a-date-picker>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="有效日期" v-bind="validateInfos.validDate" id="StatKeyPersonRefluxForm-validDate" name="validDate">
+                <a-date-picker v-model:value="formData.validDate" placeholder="请选择有效日期" value-format="YYYY-MM-DD" style="width: 100%" allow-clear></a-date-picker>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="当前就业状态" v-bind="validateInfos.currentEmployStatus" id="StatKeyPersonRefluxForm-currentEmployStatus" name="currentEmployStatus">
+                <a-input v-model:value="formData.currentEmployStatus" placeholder="请输入当前就业状态" allow-clear></a-input>
+              </a-form-item>
+            </a-col>
+          </a-row>
+        </a-form>
+      </template>
+    </JFormContainer>
+  </a-spin>
+</template>
+
+<script lang="ts" setup>
+  import { computed, defineExpose, defineProps, nextTick, reactive, ref } from 'vue';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { getDateByPicker, getValueType } from '/@/utils';
+  import { saveOrUpdate } from '../StatKeyPersonReflux.api';
+  import { Form } from 'ant-design-vue';
+  import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
+
+  const props = defineProps({
+    formDisabled: { type: Boolean, default: false },
+    formData: { type: Object, default: () => ({}) },
+    formBpm: { type: Boolean, default: true },
+  });
+  const formRef = ref();
+  const useForm = Form.useForm;
+  const emit = defineEmits(['register', 'ok']);
+  const formData = reactive<Record<string, any>>({
+    id: '',
+    idCard: '',
+    fullName: '',
+    district: '',
+    keyPersonCategory: '',
+    confirmDate: '',
+    validDate: '',
+    currentEmployStatus: '',
+    dataRefluxTime: '',
+  });
+  const { createMessage } = useMessage();
+  const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });
+  const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
+  const confirmLoading = ref<boolean>(false);
+  //表单验证
+  const validatorRules = reactive({});
+  const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });
+  //日期个性化选择
+  const fieldPickers = reactive({});
+
+  // 表单禁用
+  const disabled = computed(() => {
+    if (props.formBpm === true) {
+      if (props.formData.disabled === false) {
+        return false;
+      } else {
+        return true;
+      }
+    }
+    return props.formDisabled;
+  });
+
+  /**
+   * 新增
+   */
+  function add() {
+    edit({});
+  }
+
+  /**
+   * 编辑
+   */
+  function edit(record) {
+    nextTick(() => {
+      resetFields();
+      const tmpData = {};
+      Object.keys(formData).forEach((key) => {
+        if (record.hasOwnProperty(key)) {
+          tmpData[key] = record[key];
+        }
+      });
+      //赋值
+      Object.assign(formData, tmpData);
+    });
+  }
+
+  /**
+   * 提交数据
+   */
+  async function submitForm() {
+    try {
+      // 触发表单验证
+      await validate();
+    } catch ({ errorFields }) {
+      if (errorFields) {
+        const firstField = errorFields[0];
+        if (firstField) {
+          formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });
+        }
+      }
+      return Promise.reject(errorFields);
+    }
+    confirmLoading.value = true;
+    const isUpdate = ref<boolean>(false);
+    //时间格式化
+    let model = formData;
+    if (model.id) {
+      isUpdate.value = true;
+    }
+    //循环数据
+    for (let data in model) {
+      // 更新个性化日期选择器的值
+      model[data] = getDateByPicker(model[data], fieldPickers[data]);
+      //如果该数据是数组并且是字符串类型
+      if (model[data] instanceof Array) {
+        let valueType = getValueType(formRef.value.getProps, data);
+        //如果是字符串类型的需要变成以逗号分割的字符串
+        if (valueType === 'string') {
+          model[data] = model[data].join(',');
+        }
+      }
+    }
+    await saveOrUpdate(model, isUpdate.value)
+      .then((res) => {
+        if (res.success) {
+          createMessage.success(res.message);
+          emit('ok');
+        } else {
+          createMessage.warning(res.message);
+        }
+      })
+      .finally(() => {
+        confirmLoading.value = false;
+      });
+  }
+
+  defineExpose({
+    add,
+    edit,
+    submitForm,
+  });
+</script>
+
+<style lang="less" scoped>
+  .antd-modal-form {
+    padding: 14px 20px;
+  }
+</style>

+ 92 - 0
jeecgboot-vue3/src/views/dataReflux/statKeyPersonReflux/components/StatKeyPersonRefluxModal.vue

@@ -0,0 +1,92 @@
+<template>
+  <j-modal
+    :fullscreen="true"
+    :okButtonProps="{ class: { 'jee-hidden': disableSubmit } }"
+    :title="title"
+    :visible="visible"
+    :width="800"
+    cancelText="关闭"
+    maxHeight="500px"
+    @cancel="handleCancel"
+    @ok="handleOk"
+  >
+    <StatKeyPersonRefluxForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"></StatKeyPersonRefluxForm>
+    <template #footer>
+      <a-button @click="handleCancel">取消</a-button>
+      <a-button :class="{ 'jee-hidden': disableSubmit }" type="primary" @click="handleOk">确认</a-button>
+    </template>
+  </j-modal>
+</template>
+
+<script lang="ts" setup>
+  import { defineExpose, nextTick, ref } from 'vue';
+  import StatKeyPersonRefluxForm from './StatKeyPersonRefluxForm.vue';
+  import JModal from '/@/components/Modal/src/JModal/JModal.vue';
+  import { useMessage } from '/@/hooks/web/useMessage';
+
+  const { createMessage } = useMessage();
+  const title = ref<string>('');
+  const width = ref<number>(800);
+  const visible = ref<boolean>(false);
+  const disableSubmit = ref<boolean>(false);
+  const registerForm = ref();
+  const emit = defineEmits(['register', 'success']);
+
+  /**
+   * 新增
+   */
+  function add() {
+    title.value = '新增';
+    visible.value = true;
+    nextTick(() => {
+      registerForm.value.add();
+    });
+  }
+
+  /**
+   * 编辑
+   * @param record
+   */
+  function edit(record) {
+    title.value = disableSubmit.value ? '详情' : '编辑';
+    visible.value = true;
+    nextTick(() => {
+      registerForm.value.edit(record);
+    });
+  }
+
+  /**
+   * 确定按钮点击事件
+   */
+  function handleOk() {
+    registerForm.value.submitForm();
+  }
+
+  /**
+   * form保存回调事件
+   */
+  function submitCallback() {
+    handleCancel();
+    emit('success');
+  }
+
+  /**
+   * 取消按钮回调事件
+   */
+  function handleCancel() {
+    visible.value = false;
+  }
+  defineExpose({
+    add,
+    edit,
+    disableSubmit,
+  });
+</script>
+
+<style lang="less">
+  /**隐藏样式-modal确定按钮 */
+  .jee-hidden {
+    display: none !important;
+  }
+</style>
+<style lang="less" scoped></style>

+ 79 - 0
jeecgboot-vue3/src/views/dataReflux/statWorkerReflux/StatWorkerReflux.api.ts

@@ -0,0 +1,79 @@
+import { defHttp } from '/@/utils/http/axios';
+import { useMessage } from '/@/hooks/web/useMessage';
+
+const { createConfirm } = useMessage();
+
+enum Api {
+  list = '/dataReflux/statWorkerReflux/list',
+  save = '/dataReflux/statWorkerReflux/add',
+  edit = '/dataReflux/statWorkerReflux/edit',
+  deleteOne = '/dataReflux/statWorkerReflux/delete',
+  deleteBatch = '/dataReflux/statWorkerReflux/deleteBatch',
+  importExcel = '/dataReflux/statWorkerReflux/importExcel',
+  exportXls = '/dataReflux/statWorkerReflux/exportXls',
+  queryById = '/dataReflux/statWorkerReflux/queryById',
+}
+
+/**
+ * 导出api
+ * @param params
+ */
+export const getExportUrl = Api.exportXls;
+
+/**
+ * 导入api
+ */
+export const getImportUrl = Api.importExcel;
+
+/**
+ * 列表接口
+ * @param params
+ */
+export const list = (params) => defHttp.get({ url: Api.list, params });
+
+/**
+ * 删除单个
+ * @param params
+ * @param handleSuccess
+ */
+export const deleteOne = (params, handleSuccess) => {
+  return defHttp.delete({ url: Api.deleteOne, params }, { joinParamsToUrl: true }).then(() => {
+    handleSuccess();
+  });
+};
+
+/**
+ * 批量删除
+ * @param params
+ * @param handleSuccess
+ */
+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();
+      });
+    },
+  });
+};
+
+/**
+ * 通过id查询
+ * @param params
+ */
+export const queryById = (params) => defHttp.get({ url: Api.queryById, params });
+
+/**
+ * 保存或者更新
+ * @param params
+ * @param isUpdate
+ */
+export const saveOrUpdate = (params, isUpdate) => {
+  let url = isUpdate ? Api.edit : Api.save;
+  return defHttp.post({ url: url, params }, { isTransformResponse: false });
+};

+ 65 - 0
jeecgboot-vue3/src/views/dataReflux/statWorkerReflux/StatWorkerReflux.data.ts

@@ -0,0 +1,65 @@
+import { BasicColumn } from '/@/components/Table';
+
+//列表数据
+export const columns: BasicColumn[] = [
+  {
+    title: '身份证号码',
+    align: 'center',
+    width: 200,
+    dataIndex: 'idCard',
+  },
+  {
+    title: '姓名',
+    align: 'center',
+    width: 120,
+    dataIndex: 'fullName',
+  },
+  {
+    title: '所属区县',
+    align: 'center',
+    dataIndex: 'district',
+  },
+  {
+    title: '乡村户籍标识',
+    align: 'center',
+    dataIndex: 'ruralRegisterFlag',
+  },
+  {
+    title: '原就业外出地市/省份',
+    align: 'center',
+    dataIndex: 'originWorkArea',
+  },
+  {
+    title: '外出就业结束日期',
+    align: 'center',
+    dataIndex: 'workEndDate',
+  },
+  {
+    title: '本地新就业登记日期',
+    align: 'center',
+    dataIndex: 'localEmployDate',
+  },
+  {
+    title: '人员类别标签',
+    align: 'center',
+    dataIndex: 'personCategoryTag',
+  },
+  {
+    title: '数据回流时间',
+    align: 'center',
+    dataIndex: 'dataRefluxTime',
+  },
+];
+
+// 高级查询数据
+export const superQuerySchema = {
+  idCard: { title: '身份证号码', order: 0, view: 'text', type: 'string' },
+  fullName: { title: '姓名', order: 1, view: 'text', type: 'string' },
+  district: { title: '所属区县', order: 2, view: 'text', type: 'string' },
+  ruralRegisterFlag: { title: '乡村户籍标识', order: 3, view: 'text', type: 'string' },
+  originWorkArea: { title: '原就业外出地市/省份', order: 4, view: 'text', type: 'string' },
+  workEndDate: { title: '外出就业结束日期', order: 5, view: 'date', type: 'string' },
+  localEmployDate: { title: '本地新就业登记日期', order: 6, view: 'date', type: 'string' },
+  personCategoryTag: { title: '人员类别标签', order: 7, view: 'text', type: 'string' },
+  dataRefluxTime: { title: '数据回流时间', order: 8, view: 'date', type: 'string' },
+};

+ 168 - 0
jeecgboot-vue3/src/views/dataReflux/statWorkerReflux/StatWorkerRefluxList.vue

@@ -0,0 +1,168 @@
+<template>
+  <div class="p-2">
+    <!--查询区域-->
+    <div class="jeecg-basic-table-form-container">
+      <a-form ref="formRef" @keyup.enter.native="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
+        <a-row :gutter="24">
+          <a-col :span="8">
+            <a-form-item label="姓名" name="fullName">
+              <a-input v-model:value="queryParam.fullName" placeholder="请输入姓名" allow-clear></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-item label="身份证号码" name="idCard">
+              <a-input v-model:value="queryParam.idCard" placeholder="请输入身份证号码" allow-clear></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :span="8">
+            <a-form-item label="所属区县" name="district">
+              <a-input v-model:value="queryParam.district" placeholder="请输入所属区县" allow-clear></a-input>
+            </a-form-item>
+          </a-col>
+          <template v-if="toggleSearchStatus">
+          </template>
+          <a-col :span="24" style="text-align: right">
+            <a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
+            <a-button preIcon="ant-design:reload-outlined" style="margin-left: 8px" @click="searchReset">重置</a-button>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!--引用表格-->
+    <BasicTable @register="registerTable">
+      <!--插槽:table标题-->
+      <template #tableTitle>
+        <a-button preIcon="ant-design:export-outlined" type="primary" @click="onExportXls"> 导出</a-button>
+      </template>
+      <!--操作栏-->
+      <template #action="{ record }">
+        <TableAction :actions="getTableAction(record)" />
+      </template>
+    </BasicTable>
+    <!-- 详情弹窗 -->
+    <StatWorkerRefluxDetailModal ref="registerDetailModal"></StatWorkerRefluxDetailModal>
+  </div>
+</template>
+
+<script lang="ts" name="dataReflux-statWorkerReflux" setup>
+  import { reactive, ref } from 'vue';
+  import { BasicTable, TableAction } from '/@/components/Table';
+  import { useListPage } from '/@/hooks/system/useListPage';
+  import { columns, superQuerySchema } from './StatWorkerReflux.data';
+  import { getExportUrl, list } from './StatWorkerReflux.api';
+  import StatWorkerRefluxDetailModal from './components/StatWorkerRefluxDetailModal.vue';
+
+  const formRef = ref();
+  const queryParam = reactive<any>({});
+  const toggleSearchStatus = ref<boolean>(false);
+  const registerDetailModal = ref();
+
+  // 注册table数据
+  const { prefixCls, tableContext, onExportXls } = useListPage({
+    tableProps: {
+      title: '农民工流动回流明细表',
+      api: list,
+      columns,
+      canResize: true,
+      useSearchForm: false,
+      rowSelection: false,
+      actionColumn: {
+        width: 100,
+        fixed: 'right',
+      },
+      beforeFetch: async (params) => {
+        return Object.assign(params, queryParam);
+      },
+    },
+    exportConfig: {
+      name: '农民工流动回流明细表',
+      url: getExportUrl,
+      params: queryParam,
+    },
+  });
+  const [registerTable, { reload }] = tableContext;
+  const labelCol = reactive({
+    xs: 24,
+    sm: 4,
+    xl: 6,
+    xxl: 4,
+  });
+  const wrapperCol = reactive({
+    xs: 24,
+    sm: 20,
+  });
+
+  // 高级查询配置
+  const superQueryConfig = reactive(superQuerySchema);
+
+  /**
+   * 高级查询事件
+   */
+  function handleSuperQuery(params) {
+    Object.keys(params).map((k) => {
+      queryParam[k] = params[k];
+    });
+    searchQuery();
+  }
+
+  /**
+   * 详情
+   */
+  function handleDetail(record: Recordable) {
+    registerDetailModal.value.open(record);
+  }
+
+  /**
+   * 操作栏
+   */
+  function getTableAction(record) {
+    return [
+      {
+        label: '查看',
+        onClick: handleDetail.bind(null, record),
+      },
+    ];
+  }
+
+  /**
+   * 查询
+   */
+  function searchQuery() {
+    reload();
+  }
+
+  /**
+   * 重置
+   */
+  function searchReset() {
+    formRef.value.resetFields();
+    reload();
+  }
+</script>
+
+<style lang="less" scoped>
+  .jeecg-basic-table-form-container {
+    padding: 0;
+    .table-page-search-submitButtons {
+      display: block;
+      margin-bottom: 24px;
+      white-space: nowrap;
+    }
+    .query-group-cust {
+      min-width: 100px !important;
+    }
+    .query-group-split-cust {
+      width: 30px;
+      display: inline-block;
+      text-align: center;
+    }
+    .ant-form-item:not(.ant-form-item-with-help) {
+      margin-bottom: 16px;
+      height: 32px;
+    }
+    :deep(.ant-picker),
+    :deep(.ant-input-number) {
+      width: 100%;
+    }
+  }
+</style>

+ 88 - 0
jeecgboot-vue3/src/views/dataReflux/statWorkerReflux/components/StatWorkerRefluxDetailModal.vue

@@ -0,0 +1,88 @@
+<template>
+  <j-modal :footer="null" title="农民工流动回流明细表详情" :visible="visible" :width="1000" @cancel="handleCancel">
+    <a-spin :spinning="loading">
+      <a-descriptions :column="2" bordered size="middle" style="margin-top: 20px">
+        <a-descriptions-item label="身份证号码" :span="1">
+          {{ detailData.idCard }}
+        </a-descriptions-item>
+        <a-descriptions-item label="姓名" :span="1">
+          {{ detailData.fullName }}
+        </a-descriptions-item>
+
+        <a-descriptions-item label="所属区县" :span="1">
+          {{ detailData.district }}
+        </a-descriptions-item>
+        <a-descriptions-item label="乡村户籍标识" :span="1">
+          {{ detailData.ruralRegisterFlag }}
+        </a-descriptions-item>
+
+        <a-descriptions-item label="原就业外出地市/省份" :span="1">
+          {{ detailData.originWorkArea }}
+        </a-descriptions-item>
+        <a-descriptions-item label="外出就业结束日期" :span="1">
+          {{ detailData.workEndDate }}
+        </a-descriptions-item>
+
+        <a-descriptions-item label="本地新就业登记日期" :span="1">
+          {{ detailData.localEmployDate }}
+        </a-descriptions-item>
+        <a-descriptions-item label="人员类别标签" :span="1">
+          {{ detailData.personCategoryTag }}
+        </a-descriptions-item>
+
+        <a-descriptions-item label="数据回流时间" :span="1">
+          {{ detailData.dataRefluxTime }}
+        </a-descriptions-item>
+      </a-descriptions>
+
+      <template #footer>
+        <a-button @click="handleCancel">关闭</a-button>
+      </template>
+    </a-spin>
+  </j-modal>
+</template>
+
+<script lang="ts" setup>
+  import { defineExpose, ref } from 'vue';
+  import JModal from '/@/components/Modal/src/JModal/JModal.vue';
+  import { queryById } from '../StatWorkerReflux.api';
+
+  const visible = ref<boolean>(false);
+  const loading = ref<boolean>(false);
+  const detailData = ref<Record<string, any>>({});
+
+  /**
+   * 打开详情弹窗,传入要展示的记录数据
+   * @param record 记录数据
+   */
+  async function open(record: Record<string, any>) {
+    visible.value = true;
+    loading.value = true;
+    try {
+      // 通过 queryById 获取完整数据
+      const result = await queryById({ id: record.id });
+      detailData.value = { ...result };
+    } catch {
+      detailData.value = { ...record };
+    } finally {
+      loading.value = false;
+    }
+  }
+
+  /**
+   * 关闭弹窗
+   */
+  function handleCancel() {
+    visible.value = false;
+  }
+
+  defineExpose({
+    open,
+  });
+</script>
+
+<style lang="less" scoped>
+  .ant-descriptions {
+    width: 100%;
+  }
+</style>

+ 189 - 0
jeecgboot-vue3/src/views/dataReflux/statWorkerReflux/components/StatWorkerRefluxForm.vue

@@ -0,0 +1,189 @@
+<template>
+  <a-spin :spinning="confirmLoading">
+    <JFormContainer :disabled="disabled">
+      <template #detail>
+        <a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol" name="StatWorkerRefluxForm">
+          <a-row>
+            <a-col :span="12">
+              <a-form-item label="身份证号码" v-bind="validateInfos.idCard" id="StatWorkerRefluxForm-idCard" name="idCard">
+                <a-input v-model:value="formData.idCard" placeholder="请输入身份证号码" allow-clear></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="姓名" v-bind="validateInfos.fullName" id="StatWorkerRefluxForm-fullName" name="fullName">
+                <a-input v-model:value="formData.fullName" placeholder="请输入姓名" allow-clear></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="所属区县" v-bind="validateInfos.district" id="StatWorkerRefluxForm-district" name="district">
+                <a-input v-model:value="formData.district" placeholder="请输入所属区县" allow-clear></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="乡村户籍标识" v-bind="validateInfos.ruralRegisterFlag" id="StatWorkerRefluxForm-ruralRegisterFlag" name="ruralRegisterFlag">
+                <a-input v-model:value="formData.ruralRegisterFlag" placeholder="请输入乡村户籍标识" allow-clear></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="原就业外出地市/省份" v-bind="validateInfos.originWorkArea" id="StatWorkerRefluxForm-originWorkArea" name="originWorkArea">
+                <a-input v-model:value="formData.originWorkArea" placeholder="请输入原就业外出地市/省份" allow-clear></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="外出就业结束日期" v-bind="validateInfos.workEndDate" id="StatWorkerRefluxForm-workEndDate" name="workEndDate">
+                <a-date-picker v-model:value="formData.workEndDate" placeholder="请选择外出就业结束日期" value-format="YYYY-MM-DD" style="width: 100%" allow-clear></a-date-picker>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="本地新就业登记日期" v-bind="validateInfos.localEmployDate" id="StatWorkerRefluxForm-localEmployDate" name="localEmployDate">
+                <a-date-picker v-model:value="formData.localEmployDate" placeholder="请选择本地新就业登记日期" value-format="YYYY-MM-DD" style="width: 100%" allow-clear></a-date-picker>
+              </a-form-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-item label="人员类别标签" v-bind="validateInfos.personCategoryTag" id="StatWorkerRefluxForm-personCategoryTag" name="personCategoryTag">
+                <a-input v-model:value="formData.personCategoryTag" placeholder="请输入人员类别标签" allow-clear></a-input>
+              </a-form-item>
+            </a-col>
+          </a-row>
+        </a-form>
+      </template>
+    </JFormContainer>
+  </a-spin>
+</template>
+
+<script lang="ts" setup>
+  import { computed, defineExpose, defineProps, nextTick, reactive, ref } from 'vue';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { getDateByPicker, getValueType } from '/@/utils';
+  import { saveOrUpdate } from '../StatWorkerReflux.api';
+  import { Form } from 'ant-design-vue';
+  import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
+
+  const props = defineProps({
+    formDisabled: { type: Boolean, default: false },
+    formData: { type: Object, default: () => ({}) },
+    formBpm: { type: Boolean, default: true },
+  });
+  const formRef = ref();
+  const useForm = Form.useForm;
+  const emit = defineEmits(['register', 'ok']);
+  const formData = reactive<Record<string, any>>({
+    id: '',
+    idCard: '',
+    fullName: '',
+    district: '',
+    ruralRegisterFlag: '',
+    originWorkArea: '',
+    workEndDate: '',
+    localEmployDate: '',
+    personCategoryTag: '',
+    dataRefluxTime: '',
+  });
+  const { createMessage } = useMessage();
+  const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });
+  const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
+  const confirmLoading = ref<boolean>(false);
+  //表单验证
+  const validatorRules = reactive({});
+  const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });
+  //日期个性化选择
+  const fieldPickers = reactive({});
+
+  // 表单禁用
+  const disabled = computed(() => {
+    if (props.formBpm === true) {
+      if (props.formData.disabled === false) {
+        return false;
+      } else {
+        return true;
+      }
+    }
+    return props.formDisabled;
+  });
+
+  /**
+   * 新增
+   */
+  function add() {
+    edit({});
+  }
+
+  /**
+   * 编辑
+   */
+  function edit(record) {
+    nextTick(() => {
+      resetFields();
+      const tmpData = {};
+      Object.keys(formData).forEach((key) => {
+        if (record.hasOwnProperty(key)) {
+          tmpData[key] = record[key];
+        }
+      });
+      //赋值
+      Object.assign(formData, tmpData);
+    });
+  }
+
+  /**
+   * 提交数据
+   */
+  async function submitForm() {
+    try {
+      // 触发表单验证
+      await validate();
+    } catch ({ errorFields }) {
+      if (errorFields) {
+        const firstField = errorFields[0];
+        if (firstField) {
+          formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });
+        }
+      }
+      return Promise.reject(errorFields);
+    }
+    confirmLoading.value = true;
+    const isUpdate = ref<boolean>(false);
+    //时间格式化
+    let model = formData;
+    if (model.id) {
+      isUpdate.value = true;
+    }
+    //循环数据
+    for (let data in model) {
+      // 更新个性化日期选择器的值
+      model[data] = getDateByPicker(model[data], fieldPickers[data]);
+      //如果该数据是数组并且是字符串类型
+      if (model[data] instanceof Array) {
+        let valueType = getValueType(formRef.value.getProps, data);
+        //如果是字符串类型的需要变成以逗号分割的字符串
+        if (valueType === 'string') {
+          model[data] = model[data].join(',');
+        }
+      }
+    }
+    await saveOrUpdate(model, isUpdate.value)
+      .then((res) => {
+        if (res.success) {
+          createMessage.success(res.message);
+          emit('ok');
+        } else {
+          createMessage.warning(res.message);
+        }
+      })
+      .finally(() => {
+        confirmLoading.value = false;
+      });
+  }
+
+  defineExpose({
+    add,
+    edit,
+    submitForm,
+  });
+</script>
+
+<style lang="less" scoped>
+  .antd-modal-form {
+    padding: 14px 20px;
+  }
+</style>

+ 92 - 0
jeecgboot-vue3/src/views/dataReflux/statWorkerReflux/components/StatWorkerRefluxModal.vue

@@ -0,0 +1,92 @@
+<template>
+  <j-modal
+    :fullscreen="true"
+    :okButtonProps="{ class: { 'jee-hidden': disableSubmit } }"
+    :title="title"
+    :visible="visible"
+    :width="800"
+    cancelText="关闭"
+    maxHeight="500px"
+    @cancel="handleCancel"
+    @ok="handleOk"
+  >
+    <StatWorkerRefluxForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"></StatWorkerRefluxForm>
+    <template #footer>
+      <a-button @click="handleCancel">取消</a-button>
+      <a-button :class="{ 'jee-hidden': disableSubmit }" type="primary" @click="handleOk">确认</a-button>
+    </template>
+  </j-modal>
+</template>
+
+<script lang="ts" setup>
+  import { defineExpose, nextTick, ref } from 'vue';
+  import StatWorkerRefluxForm from './StatWorkerRefluxForm.vue';
+  import JModal from '/@/components/Modal/src/JModal/JModal.vue';
+  import { useMessage } from '/@/hooks/web/useMessage';
+
+  const { createMessage } = useMessage();
+  const title = ref<string>('');
+  const width = ref<number>(800);
+  const visible = ref<boolean>(false);
+  const disableSubmit = ref<boolean>(false);
+  const registerForm = ref();
+  const emit = defineEmits(['register', 'success']);
+
+  /**
+   * 新增
+   */
+  function add() {
+    title.value = '新增';
+    visible.value = true;
+    nextTick(() => {
+      registerForm.value.add();
+    });
+  }
+
+  /**
+   * 编辑
+   * @param record
+   */
+  function edit(record) {
+    title.value = disableSubmit.value ? '详情' : '编辑';
+    visible.value = true;
+    nextTick(() => {
+      registerForm.value.edit(record);
+    });
+  }
+
+  /**
+   * 确定按钮点击事件
+   */
+  function handleOk() {
+    registerForm.value.submitForm();
+  }
+
+  /**
+   * form保存回调事件
+   */
+  function submitCallback() {
+    handleCancel();
+    emit('success');
+  }
+
+  /**
+   * 取消按钮回调事件
+   */
+  function handleCancel() {
+    visible.value = false;
+  }
+  defineExpose({
+    add,
+    edit,
+    disableSubmit,
+  });
+</script>
+
+<style lang="less">
+  /**隐藏样式-modal确定按钮 */
+  .jee-hidden {
+    display: none !important;
+  }
+</style>
+<style lang="less" scoped></style>

+ 1 - 1
jeecgboot-vue3/src/views/deepAnalysis/absorbDifficultSubsidy/DaAbsorbDifficultSubsidy.data.ts

@@ -15,7 +15,7 @@ export const columns: BasicColumn[] = [
     dataIndex: 'unitName',
   },
   {
-    title: '所属区',
+    title: '所属区',
     align: 'center',
     dataIndex: 'district',
   },

+ 17 - 0
jeecgboot-vue3/src/views/statistics/jobReflux/JobRefluxStatistics.api.ts

@@ -0,0 +1,17 @@
+import { defHttp } from '/@/utils/http/axios';
+
+enum Api {
+  statisticsList = '/dataReflux/statJobReflux/statistics/queryByMonth',
+  statisticsExportXls = '/dataReflux/statJobReflux/statistics/exportXls',
+}
+
+/**
+ * 导出api
+ */
+export const getExportUrl = Api.statisticsExportXls;
+
+/**
+ * 查询统计报表
+ * @param params { year: number }
+ */
+export const queryStatistics = (params) => defHttp.get({ url: Api.statisticsList, params });

+ 55 - 0
jeecgboot-vue3/src/views/statistics/jobReflux/JobRefluxStatistics.data.ts

@@ -0,0 +1,55 @@
+import { BasicColumn } from '/@/components/Table';
+
+/**
+ * 生成单元格合并回调,读取 afterFetch 计算好的 _rowSpanMap
+ */
+function createMergeCell(dataIndex: string) {
+  return (record: any, _rowIndex: number) => {
+    if (record._rowSpanMap && record._rowSpanMap[dataIndex] !== undefined) {
+      return { rowspan: record._rowSpanMap[dataIndex], colspan: 1 };
+    }
+    return {};
+  };
+}
+
+// 统计报表列定义
+export const columns: BasicColumn[] = [
+  {
+    title: '序号',
+    align: 'center',
+    width: 60,
+    dataIndex: 'id',
+    customCell: createMergeCell('id'),
+  },
+  {
+    title: '统计月份',
+    align: 'center',
+    width: 120,
+    dataIndex: 'statisticsMonth',
+    customCell: createMergeCell('statisticsMonth'),
+  },
+  {
+    title: '所属区县',
+    align: 'center',
+    width: 120,
+    dataIndex: 'district',
+  },
+  {
+    title: '归集岗位总数',
+    align: 'center',
+    width: 130,
+    dataIndex: 'totalCollectedCount',
+  },
+  {
+    title: '本期新增岗位数',
+    align: 'center',
+    width: 130,
+    dataIndex: 'currentMonthNewCount',
+  },
+  {
+    title: '本期失效下架岗位数',
+    align: 'center',
+    width: 150,
+    dataIndex: 'currentMonthExpiredCount',
+  },
+];

+ 140 - 0
jeecgboot-vue3/src/views/statistics/jobReflux/JobRefluxStatisticsList.vue

@@ -0,0 +1,140 @@
+<template>
+  <div class="p-2">
+    <!--查询区域-->
+    <div class="jeecg-basic-table-form-container">
+      <a-form ref="formRef" @keyup.enter.native="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
+        <a-row :gutter="24">
+          <a-col :span="8">
+            <a-form-item label="统计年份" name="year">
+              <a-date-picker v-model:value="queryParam.year" picker="year" placeholder="请选择年份" value-format="YYYY" style="width: 100%" allow-clear />
+            </a-form-item>
+          </a-col>
+          <a-col :span="24" style="text-align: right">
+            <a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
+            <a-button preIcon="ant-design:reload-outlined" style="margin-left: 8px" @click="searchReset">重置</a-button>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!--引用表格-->
+    <BasicTable @register="registerTable">
+      <!--插槽:table标题-->
+      <template #tableTitle>
+        <a-button preIcon="ant-design:export-outlined" type="primary" @click="onExportXls"> 导出</a-button>
+      </template>
+    </BasicTable>
+  </div>
+</template>
+
+<script lang="ts" name="statistics-jobRefluxStatistics" setup>
+  import { reactive, ref } from 'vue';
+  import { BasicTable } from '/@/components/Table';
+  import { useListPage } from '/@/hooks/system/useListPage';
+  import { columns } from './JobRefluxStatistics.data';
+  import { getExportUrl, queryStatistics } from './JobRefluxStatistics.api';
+  import dayjs from 'dayjs';
+
+  const formRef = ref();
+  const queryParam = reactive<any>({
+    year: dayjs().format('YYYY'),
+  });
+
+  /** 需要按月份合并的列 key(序号、统计月份) */
+  const mergeColKeys = ['id', 'statisticsMonth'];
+
+  /**
+   * 数据拉取后,计算同月份行的合并信息
+   * 将连续相同 statisticsMonth 的行分组,为 mergeColKeys 设置 rowspan
+   */
+  function afterFetch(data: any[]) {
+    if (!data || data.length === 0) return data;
+    let i = 0;
+    while (i < data.length) {
+      let j = i + 1;
+      while (j < data.length && data[j].statisticsMonth === data[i].statisticsMonth) {
+        j++;
+      }
+      const groupSize = j - i;
+      if (groupSize > 1) {
+        // 分组首行:设置实际 rowspan 值
+        data[i]._rowSpanMap = {};
+        mergeColKeys.forEach((key) => { data[i]._rowSpanMap[key] = groupSize; });
+        // 后续行:rowspan = 0(隐藏,合并到首行)
+        for (let k = i + 1; k < j; k++) {
+          data[k]._rowSpanMap = {};
+          mergeColKeys.forEach((key) => { data[k]._rowSpanMap[key] = 0; });
+        }
+      }
+      i = j;
+    }
+    return data;
+  }
+
+  // 注册table数据
+  const { prefixCls, tableContext, onExportXls } = useListPage({
+    tableProps: {
+      title: '岗位归集数量统计报表',
+      api: queryStatistics,
+      columns,
+      canResize: true,
+      useSearchForm: false,
+      rowSelection: false,
+      showActionColumn: false,
+      pagination: false,
+      afterFetch,
+      beforeFetch: async (params) => {
+        return Object.assign(params, queryParam);
+      },
+    },
+    exportConfig: {
+      name: '岗位归集数量统计报表',
+      url: getExportUrl,
+      params: queryParam,
+    },
+  });
+  const [registerTable, { reload }] = tableContext;
+  const labelCol = reactive({
+    xs: 24,
+    sm: 4,
+    xl: 6,
+    xxl: 4,
+  });
+  const wrapperCol = reactive({
+    xs: 24,
+    sm: 20,
+  });
+
+  /**
+   * 查询
+   */
+  function searchQuery() {
+    reload();
+  }
+
+  /**
+   * 重置
+   */
+  function searchReset() {
+    queryParam.year = dayjs().format('YYYY');
+    reload();
+  }
+</script>
+
+<style lang="less" scoped>
+  .jeecg-basic-table-form-container {
+    padding: 0;
+    .table-page-search-submitButtons {
+      display: block;
+      margin-bottom: 24px;
+      white-space: nowrap;
+    }
+    .ant-form-item:not(.ant-form-item-with-help) {
+      margin-bottom: 16px;
+      height: 32px;
+    }
+    :deep(.ant-picker),
+    :deep(.ant-input-number) {
+      width: 100%;
+    }
+  }
+</style>

+ 17 - 0
jeecgboot-vue3/src/views/statistics/keyPersonReflux/KeyPersonRefluxStatistics.api.ts

@@ -0,0 +1,17 @@
+import { defHttp } from '/@/utils/http/axios';
+
+enum Api {
+  statisticsList = '/dataReflux/statKeyPersonReflux/statistics/queryByMonth',
+  statisticsExportXls = '/dataReflux/statKeyPersonReflux/statistics/exportXls',
+}
+
+/**
+ * 导出api
+ */
+export const getExportUrl = Api.statisticsExportXls;
+
+/**
+ * 查询统计报表
+ * @param params { year: number }
+ */
+export const queryStatistics = (params) => defHttp.get({ url: Api.statisticsList, params });

+ 61 - 0
jeecgboot-vue3/src/views/statistics/keyPersonReflux/KeyPersonRefluxStatistics.data.ts

@@ -0,0 +1,61 @@
+import { BasicColumn } from '/@/components/Table';
+
+/**
+ * 生成单元格合并回调,读取 afterFetch 计算好的 _rowSpanMap
+ */
+function createMergeCell(dataIndex: string) {
+  return (record: any, _rowIndex: number) => {
+    if (record._rowSpanMap && record._rowSpanMap[dataIndex] !== undefined) {
+      return { rowspan: record._rowSpanMap[dataIndex], colspan: 1 };
+    }
+    return {};
+  };
+}
+
+// 统计报表列定义
+export const columns: BasicColumn[] = [
+  {
+    title: '序号',
+    align: 'center',
+    width: 60,
+    dataIndex: 'id',
+    customCell: createMergeCell('id'),
+  },
+  {
+    title: '统计月份',
+    align: 'center',
+    width: 120,
+    dataIndex: 'statisticsMonth',
+    customCell: createMergeCell('statisticsMonth'),
+  },
+  {
+    title: '所属区县',
+    align: 'center',
+    width: 120,
+    dataIndex: 'district',
+  },
+  {
+    title: '重点人群类别',
+    align: 'center',
+    width: 160,
+    dataIndex: 'keyPersonCategory',
+  },
+  {
+    title: '本期本类别总人数',
+    align: 'center',
+    width: 140,
+    dataIndex: 'totalPersonCount',
+  },
+  {
+    title: '本期本类别已失效总人数',
+    align: 'center',
+    width: 170,
+    dataIndex: 'totalExpiredCount',
+  },
+  {
+    title: '本期本类别未就业总人数',
+    align: 'center',
+    width: 170,
+    dataIndex: 'totalUnemployedCount',
+  },
+];

+ 140 - 0
jeecgboot-vue3/src/views/statistics/keyPersonReflux/KeyPersonRefluxStatisticsList.vue

@@ -0,0 +1,140 @@
+<template>
+  <div class="p-2">
+    <!--查询区域-->
+    <div class="jeecg-basic-table-form-container">
+      <a-form ref="formRef" @keyup.enter.native="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
+        <a-row :gutter="24">
+          <a-col :span="8">
+            <a-form-item label="统计年份" name="year">
+              <a-date-picker v-model:value="queryParam.year" picker="year" placeholder="请选择年份" value-format="YYYY" style="width: 100%" allow-clear />
+            </a-form-item>
+          </a-col>
+          <a-col :span="24" style="text-align: right">
+            <a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
+            <a-button preIcon="ant-design:reload-outlined" style="margin-left: 8px" @click="searchReset">重置</a-button>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!--引用表格-->
+    <BasicTable @register="registerTable">
+      <!--插槽:table标题-->
+      <template #tableTitle>
+        <a-button preIcon="ant-design:export-outlined" type="primary" @click="onExportXls"> 导出</a-button>
+      </template>
+    </BasicTable>
+  </div>
+</template>
+
+<script lang="ts" name="statistics-keyPersonRefluxStatistics" setup>
+  import { reactive, ref } from 'vue';
+  import { BasicTable } from '/@/components/Table';
+  import { useListPage } from '/@/hooks/system/useListPage';
+  import { columns } from './KeyPersonRefluxStatistics.data';
+  import { getExportUrl, queryStatistics } from './KeyPersonRefluxStatistics.api';
+  import dayjs from 'dayjs';
+
+  const formRef = ref();
+  const queryParam = reactive<any>({
+    year: dayjs().format('YYYY'),
+  });
+
+  /** 需要按月份合并的列 key(序号、统计月份) */
+  const mergeColKeys = ['id', 'statisticsMonth'];
+
+  /**
+   * 数据拉取后,计算同月份行的合并信息
+   * 将连续相同 statisticsMonth 的行分组,为 mergeColKeys 设置 rowspan
+   */
+  function afterFetch(data: any[]) {
+    if (!data || data.length === 0) return data;
+    let i = 0;
+    while (i < data.length) {
+      let j = i + 1;
+      while (j < data.length && data[j].statisticsMonth === data[i].statisticsMonth) {
+        j++;
+      }
+      const groupSize = j - i;
+      if (groupSize > 1) {
+        // 分组首行:设置实际 rowspan 值
+        data[i]._rowSpanMap = {};
+        mergeColKeys.forEach((key) => { data[i]._rowSpanMap[key] = groupSize; });
+        // 后续行:rowspan = 0(隐藏,合并到首行)
+        for (let k = i + 1; k < j; k++) {
+          data[k]._rowSpanMap = {};
+          mergeColKeys.forEach((key) => { data[k]._rowSpanMap[key] = 0; });
+        }
+      }
+      i = j;
+    }
+    return data;
+  }
+
+  // 注册table数据
+  const { prefixCls, tableContext, onExportXls } = useListPage({
+    tableProps: {
+      title: '重点人群统计报表',
+      api: queryStatistics,
+      columns,
+      canResize: true,
+      useSearchForm: false,
+      rowSelection: false,
+      showActionColumn: false,
+      pagination: false,
+      afterFetch,
+      beforeFetch: async (params) => {
+        return Object.assign(params, queryParam);
+      },
+    },
+    exportConfig: {
+      name: '重点人群统计报表',
+      url: getExportUrl,
+      params: queryParam,
+    },
+  });
+  const [registerTable, { reload }] = tableContext;
+  const labelCol = reactive({
+    xs: 24,
+    sm: 4,
+    xl: 6,
+    xxl: 4,
+  });
+  const wrapperCol = reactive({
+    xs: 24,
+    sm: 20,
+  });
+
+  /**
+   * 查询
+   */
+  function searchQuery() {
+    reload();
+  }
+
+  /**
+   * 重置
+   */
+  function searchReset() {
+    queryParam.year = dayjs().format('YYYY');
+    reload();
+  }
+</script>
+
+<style lang="less" scoped>
+  .jeecg-basic-table-form-container {
+    padding: 0;
+    .table-page-search-submitButtons {
+      display: block;
+      margin-bottom: 24px;
+      white-space: nowrap;
+    }
+    .ant-form-item:not(.ant-form-item-with-help) {
+      margin-bottom: 16px;
+      height: 32px;
+    }
+    :deep(.ant-picker),
+    :deep(.ant-input-number) {
+      width: 100%;
+    }
+  }
+</style>

+ 17 - 0
jeecgboot-vue3/src/views/statistics/workerReflux/WorkerRefluxStatistics.api.ts

@@ -0,0 +1,17 @@
+import { defHttp } from '/@/utils/http/axios';
+
+enum Api {
+  statisticsList = '/dataReflux/statWorkerReflux/statistics/queryByMonth',
+  statisticsExportXls = '/dataReflux/statWorkerReflux/statistics/exportXls',
+}
+
+/**
+ * 导出api
+ */
+export const getExportUrl = Api.statisticsExportXls;
+
+/**
+ * 查询统计报表
+ * @param params { year: number }
+ */
+export const queryStatistics = (params) => defHttp.get({ url: Api.statisticsList, params });

+ 55 - 0
jeecgboot-vue3/src/views/statistics/workerReflux/WorkerRefluxStatistics.data.ts

@@ -0,0 +1,55 @@
+import { BasicColumn } from '/@/components/Table';
+
+/**
+ * 生成单元格合并回调,读取 afterFetch 计算好的 _rowSpanMap
+ */
+function createMergeCell(dataIndex: string) {
+  return (record: any, _rowIndex: number) => {
+    if (record._rowSpanMap && record._rowSpanMap[dataIndex] !== undefined) {
+      return { rowspan: record._rowSpanMap[dataIndex], colspan: 1 };
+    }
+    return {};
+  };
+}
+
+// 统计报表列定义
+export const columns: BasicColumn[] = [
+  {
+    title: '序号',
+    align: 'center',
+    width: 60,
+    dataIndex: 'id',
+    customCell: createMergeCell('id'),
+  },
+  {
+    title: '统计月份',
+    align: 'center',
+    width: 120,
+    dataIndex: 'statisticsMonth',
+    customCell: createMergeCell('statisticsMonth'),
+  },
+  {
+    title: '所属区县',
+    align: 'center',
+    width: 120,
+    dataIndex: 'district',
+  },
+  {
+    title: '人员类别',
+    align: 'center',
+    width: 160,
+    dataIndex: 'personCategoryTag',
+  },
+  {
+    title: '本期返乡总人数',
+    align: 'center',
+    width: 140,
+    dataIndex: 'totalReturnCount',
+  },
+  {
+    title: '本期新就业登记总人数',
+    align: 'center',
+    width: 170,
+    dataIndex: 'totalNewEmployCount',
+  },
+];

+ 140 - 0
jeecgboot-vue3/src/views/statistics/workerReflux/WorkerRefluxStatisticsList.vue

@@ -0,0 +1,140 @@
+<template>
+  <div class="p-2">
+    <!--查询区域-->
+    <div class="jeecg-basic-table-form-container">
+      <a-form ref="formRef" @keyup.enter.native="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
+        <a-row :gutter="24">
+          <a-col :span="8">
+            <a-form-item label="统计年份" name="year">
+              <a-date-picker v-model:value="queryParam.year" picker="year" placeholder="请选择年份" value-format="YYYY" style="width: 100%" allow-clear />
+            </a-form-item>
+          </a-col>
+          <a-col :span="24" style="text-align: right">
+            <a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
+            <a-button preIcon="ant-design:reload-outlined" style="margin-left: 8px" @click="searchReset">重置</a-button>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!--引用表格-->
+    <BasicTable @register="registerTable">
+      <!--插槽:table标题-->
+      <template #tableTitle>
+        <a-button preIcon="ant-design:export-outlined" type="primary" @click="onExportXls"> 导出</a-button>
+      </template>
+    </BasicTable>
+  </div>
+</template>
+
+<script lang="ts" name="statistics-workerRefluxStatistics" setup>
+  import { reactive, ref } from 'vue';
+  import { BasicTable } from '/@/components/Table';
+  import { useListPage } from '/@/hooks/system/useListPage';
+  import { columns } from './WorkerRefluxStatistics.data';
+  import { getExportUrl, queryStatistics } from './WorkerRefluxStatistics.api';
+  import dayjs from 'dayjs';
+
+  const formRef = ref();
+  const queryParam = reactive<any>({
+    year: dayjs().format('YYYY'),
+  });
+
+  /** 需要按月份合并的列 key(序号、统计月份) */
+  const mergeColKeys = ['id', 'statisticsMonth'];
+
+  /**
+   * 数据拉取后,计算同月份行的合并信息
+   * 将连续相同 statisticsMonth 的行分组,为 mergeColKeys 设置 rowspan
+   */
+  function afterFetch(data: any[]) {
+    if (!data || data.length === 0) return data;
+    let i = 0;
+    while (i < data.length) {
+      let j = i + 1;
+      while (j < data.length && data[j].statisticsMonth === data[i].statisticsMonth) {
+        j++;
+      }
+      const groupSize = j - i;
+      if (groupSize > 1) {
+        // 分组首行:设置实际 rowspan 值
+        data[i]._rowSpanMap = {};
+        mergeColKeys.forEach((key) => { data[i]._rowSpanMap[key] = groupSize; });
+        // 后续行:rowspan = 0(隐藏,合并到首行)
+        for (let k = i + 1; k < j; k++) {
+          data[k]._rowSpanMap = {};
+          mergeColKeys.forEach((key) => { data[k]._rowSpanMap[key] = 0; });
+        }
+      }
+      i = j;
+    }
+    return data;
+  }
+
+  // 注册table数据
+  const { prefixCls, tableContext, onExportXls } = useListPage({
+    tableProps: {
+      title: '农民工返乡返岗统计报表',
+      api: queryStatistics,
+      columns,
+      canResize: true,
+      useSearchForm: false,
+      rowSelection: false,
+      showActionColumn: false,
+      pagination: false,
+      afterFetch,
+      beforeFetch: async (params) => {
+        return Object.assign(params, queryParam);
+      },
+    },
+    exportConfig: {
+      name: '农民工返乡返岗统计报表',
+      url: getExportUrl,
+      params: queryParam,
+    },
+  });
+  const [registerTable, { reload }] = tableContext;
+  const labelCol = reactive({
+    xs: 24,
+    sm: 4,
+    xl: 6,
+    xxl: 4,
+  });
+  const wrapperCol = reactive({
+    xs: 24,
+    sm: 20,
+  });
+
+  /**
+   * 查询
+   */
+  function searchQuery() {
+    reload();
+  }
+
+  /**
+   * 重置
+   */
+  function searchReset() {
+    queryParam.year = dayjs().format('YYYY');
+    reload();
+  }
+</script>
+
+<style lang="less" scoped>
+  .jeecg-basic-table-form-container {
+    padding: 0;
+    .table-page-search-submitButtons {
+      display: block;
+      margin-bottom: 24px;
+      white-space: nowrap;
+    }
+    .ant-form-item:not(.ant-form-item-with-help) {
+      margin-bottom: 16px;
+      height: 32px;
+    }
+    :deep(.ant-picker),
+    :deep(.ant-input-number) {
+      width: 100%;
+    }
+  }
+</style>