# 政策推送和岗位信息变动推送模块 - 开发设计文档 > 依据:《需求规格说明书》第3.10节 > 设计日期:2026-06-09 > 设计模式:目录树 + 文件管理 / 纯视图分页查询 --- ## 一、菜单层级 ``` 政策推送和岗位信息变动推送 (顶级菜单, sort_no: 2.10, icon: notification-outlined) ├── 政策公开文件 (子菜单, sort_no: 1.00) └── 画像变动管理 (子菜单, sort_no: 2.00) ``` --- ## 二、子模块1:政策公开文件 ### 2.1 功能说明 用于政策公开文件(PDF格式)的上传和宣传,用户登录系统能够在线预览和下载政策文件。 ### 2.2 查询字段 文件名称 ### 2.3 列表字段 文件名称,排序 ### 2.4 支持功能 目录管理,增删改查 ### 2.5 数据库设计 #### 表1:政策文件目录表(policy_category) ```sql CREATE TABLE POLICY_CATEGORY ( ID VARCHAR(36) NOT NULL, PARENT_ID VARCHAR(36) COMMENT '父级目录ID', NAME VARCHAR(200) NOT NULL COMMENT '目录名称', SORT_NO INTEGER COMMENT '排序', 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 POLICY_CATEGORY IS '政策文件目录表'; ``` #### 表2:政策文件表(policy_file) ```sql CREATE TABLE POLICY_FILE ( ID VARCHAR(36) NOT NULL, CATEGORY_ID VARCHAR(36) COMMENT '关联目录ID', NAME VARCHAR(200) NOT NULL COMMENT '文件名称', FILE_URL VARCHAR(500) COMMENT '文件路径', SORT_NO INTEGER COMMENT '排序', 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 POLICY_FILE IS '政策文件表'; ``` ### 2.6 文件清单 #### 后端(jeecg-module-zjrs/org/jeecg/modules/zjrs/policyfile/) | 文件 | 说明 | |------|------| | entity/PolicyCategory.java | 目录实体 | | entity/PolicyFile.java | 文件实体 | | mapper/PolicyCategoryMapper.java | 目录Mapper | | mapper/PolicyFileMapper.java | 文件Mapper | | service/IPolicyCategoryService.java | 目录服务接口 | | service/IPolicyFileService.java | 文件服务接口 | | service/impl/PolicyCategoryServiceImpl.java | 目录服务实现 | | service/impl/PolicyFileServiceImpl.java | 文件服务实现 | | controller/PolicyCategoryController.java | 目录Controller(支持树查+CRUD) | | controller/PolicyFileController.java | 文件Controller(CRUD) | #### 前端(jeecgboot-vue3/src/views/policyfile/) | 文件 | 说明 | |------|------| | PolicyFileList.vue | 左树右表页面 | | PolicyFile.data.ts | 表格列+表单配置 | | PolicyFile.api.ts | API接口 | | components/PolicyFileForm.vue | 文件表单组件 | | components/PolicyFileModal.vue | 文件弹窗组件 | | components/PolicyCategoryForm.vue | 目录表单组件 | | components/PolicyCategoryModal.vue | 目录弹窗组件 | ### 2.7 UI布局 左右布局:左侧目录树(可搜索、新增、编辑、删除)+ 右侧文件列表(按选中目录过滤) --- ## 三、子模块2:画像变动管理 ### 3.1 功能说明 个人画像状态分为(1)求职信息不完善(2)求职失败(3)就业登记(4)失业登记 ### 3.2 查询字段 户口所属区域,姓名,学历,性别,年龄,画像状态 ### 3.3 列表字段 证件号码,姓名,户口所属区县,性别,学历,年龄,画像状态,情况说明,数据日期,自定义标签,最后通知时间 ### 3.4 支持功能 数据刷新,查看,发送消息,修改自定义标签 ### 3.5 数据库设计 #### 无独立物理表 画像变动模块**不创建独立物理表**,所有数据通过视图从现有表计算得出: | 数据项 | 来源 | |--------|------| | 个人信息 | PERSONAL_INFO | | 简历情况 | RESUME_INFO(is_default=是) | | 求职失败 | INTERVIEW_FAIL_DIAGNOSIS | | 就业登记 | EMPLOYMENT_RECORD | | 失业登记 | UNEMPLOYMENT_RECORD | | 自定义标签/通知时间 | PERSONAL_STATUS_LOCAL(与个人就业状态感知共用) | #### 视图:v_profile_change ```sql CREATE OR REPLACE VIEW V_PROFILE_CHANGE AS SELECT pi.ID AS PERSONAL_ID, pi.ID_NUMBER, pi.FULL_NAME, pi.HOUSEHOLD_LOCATION AS HOUSEHOLD_DISTRICT, pi.GENDER, pi.EDUCATION, FLOOR(MONTHS_BETWEEN(SYSDATE, pi.BIRTH_DATE) / 12) AS AGE, CASE WHEN pi.JOB_SEARCH_STATUS IN ('离职-随时到岗','在职-月内到岗','在职-考虑机会','应届毕业生') AND (r.ID IS NULL OR (r.VALID_DATE IS NOT NULL AND r.VALID_DATE < SYSDATE)) THEN '求职信息不完善' WHEN fd.ID IS NOT NULL THEN '求职失败' WHEN er.PERSONAL_ID IS NOT NULL THEN '就业登记' WHEN ur.PERSONAL_ID IS NOT NULL THEN '失业登记' ELSE '求职信息不完善' END AS PROFILE_STATUS, CASE WHEN pi.JOB_SEARCH_STATUS IN ('离职-随时到岗','在职-月内到岗','在职-考虑机会','应届毕业生') AND r.ID IS NULL THEN '无简历' WHEN pi.JOB_SEARCH_STATUS IN ('离职-随时到岗','在职-月内到岗','在职-考虑机会','应届毕业生') AND r.VALID_DATE IS NOT NULL AND r.VALID_DATE < SYSDATE THEN '简历过期' WHEN fd.ID IS NOT NULL THEN fd.LOCAL_TAGS WHEN er.PERSONAL_ID IS NOT NULL THEN '就业中' WHEN ur.PERSONAL_ID IS NOT NULL THEN '失业中' ELSE '' END AS STATUS_DESC, COALESCE(fd.UPDATE_TIME, er.CREATE_TIME, ur.CREATE_TIME, pi.UPDATE_TIME) AS DATA_DATE, psl.CUSTOM_TAGS, psl.LAST_NOTICE_TIME FROM PERSONAL_INFO pi LEFT JOIN RESUME_INFO r ON pi.ID = r.PERSONAL_ID AND (r.IS_DEFAULT IS NULL OR r.IS_DEFAULT = '是') LEFT JOIN INTERVIEW_FAIL_DIAGNOSIS fd ON pi.ID = fd.PERSONAL_ID LEFT JOIN (SELECT PERSONAL_ID, COUNT(*) AS EMPLOY_COUNT, MIN(CREATE_TIME) AS CREATE_TIME FROM EMPLOYMENT_RECORD GROUP BY PERSONAL_ID) er ON pi.ID = er.PERSONAL_ID LEFT JOIN (SELECT PERSONAL_ID, COUNT(*) AS UNEMPLOY_COUNT, MIN(CREATE_TIME) AS CREATE_TIME FROM UNEMPLOYMENT_RECORD GROUP BY PERSONAL_ID) ur ON pi.ID = ur.PERSONAL_ID LEFT JOIN PERSONAL_STATUS_LOCAL psl ON pi.ID = psl.PERSONAL_ID; ``` ### 3.6 画像状态判断规则 | 画像状态 | 判断条件 | 情况说明 | |---------|---------|---------| | 求职信息不完善 | 求职状态为求职中,但简历为空或已过期 | 无简历 / 简历过期 | | 求职失败 | 有面试失败记录 | 显示失败原因标签 | | 就业登记 | 有有效就业登记 | 就业中 | | 失业登记 | 有有效失业登记 | 失业中 | ### 3.7 文件清单 #### 后端(jeecg-module-zjrs/org/jeecg/modules/zjrs/profilechange/) | 文件 | 说明 | |------|------| | entity/ProfileChangePageVo.java | 列表页VO | | mapper/ProfileChangeMapper.java | Mapper(queryPageList) | | mapper/xml/ProfileChangeMapper.xml | 视图查询SQL | | service/IProfileChangeService.java | 服务接口 | | service/impl/ProfileChangeServiceImpl.java | 服务实现 | | controller/ProfileChangeController.java | REST控制器(列表+标签保存) | #### 前端(jeecgboot-vue3/src/views/profilechange/) | 文件 | 说明 | |------|------| | ProfileChangeList.vue | 列表页面(含查询表单) | | ProfileChange.data.ts | 表格列+搜索配置 | | ProfileChange.api.ts | API接口(含saveTag/getTag) | ### 3.8 数据刷新 "数据刷新"功能即重新执行视图查询,获取最新数据(无需额外逻辑,reload()即可)。 --- ## 四、2026-06-10 修复与优化记录 ### 编译修复 - `ProfileChangeController.java` / `PolicyCategoryController.java` / `PolicyFileController.java` — `javax.servlet` → `jakarta.servlet` - `ProfileChangeServiceImpl.java` — `javax.annotation.Resource` → `jakarta.annotation.Resource` - 移除不存在的 `org.jeecg.common.util.ParamUtils` 引用 ### 后端新增 - `ProfileChangeController.java` — 新增 `saveTag`/`getTag` 端点(共用 `PersonalStatusLocal` 表) - `ProfileChangeController.java` — 新增 `/exportXls` 导出端点,支持 `selections` 勾选过滤 - `ProfileChangePageVo.java` — 新增 `householdAreaName`(户口区县名称)、`@Excel` 注解 - `ProfileChangeMapper.xml` — 新增 `age` 查询条件 ### 前端修复 **政策公开文件:** - `PolicyFile.data.ts` — formSchema 新增隐藏 `categoryId` 字段,修复新增文件分类关联丢失 - `PolicyFileList.vue` — 新增文件名称搜索框 **画像变动管理:** - 性别/学历/画像状态搜索框 → `` 下拉(Gender/Education/profile_status 字典) - 表格列翻译:gender/education/profileStatus - 户口所属区县列 → `householdAreaName` 去"广东省湛江市"前缀 - `rowKey` 设为 `personalId`(修复勾选一个全选的bug) - 新增导出按钮 + `exportConfig` - 新增 `ProfileChangeModal.vue` + `ProfileChangeDetail.vue` 详情弹窗(j-modal 模式) ### DM8 数据库 - 建表:`POLICY_CATEGORY`、`POLICY_FILE` - 建视图:`V_PROFILE_CHANGE`(含 household_area_name) - 建字典:`profile_status`(画像状态) - 菜单权限:`政策推送和岗位信息变动推送`(178060400000010) → `政策公开文件`(178060400000011) → `画像变动管理`(178060400000012),含 admin 授权 - policy_category:9条(3一级+6二级目录) - policy_file:14条测试数据