依据:《需求规格说明书》第3.9节
设计日期:2026-06-09
设计模式:视图分页查询 + 轻量本地标签表
就业状态自动感知 (顶级菜单, sort_no: 2.00, icon: eye-outlined)
├── 企业就业状态感知 (子菜单, sort_no: 1.00)
└── 个人就业状态感知 (子菜单, sort_no: 2.00)
企业就业状态自动感知,监测企业在岗员工总数、用工工种分布、用工稳定性、薪酬待遇等数据。通过对这些数据的分析,准确掌握就业失业状况及其变化趋势。
所属区县,所属行业,企业名称,企业状态,自定义标签
企业名称,所属区县,企业规模,企业状态,所属行业,企业已发布岗位总数,当前在招岗位数量,备案在岗总人数,平均薪酬,自定义标签,最后通知时间
查看,发送消息,修改标签
CREATE TABLE ENTERPRISE_STATUS_LOCAL (
ID VARCHAR(36) NOT NULL,
ENTERPRISE_ID VARCHAR(36) NOT NULL COMMENT '企业ID(关联ENTERPRISE_INFO.ID)',
CUSTOM_TAGS VARCHAR(500) COMMENT '自定义标签',
LAST_NOTICE_TIME DATETIME 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 ENTERPRISE_STATUS_LOCAL IS '企业就业状态本地信息表';
CREATE UNIQUE INDEX IDX_ESL_ENTERPRISE ON ENTERPRISE_STATUS_LOCAL(ENTERPRISE_ID);
从 ENTERPRISE_INFO + POST_INFO + ENTERPRISE_STATUS_LOCAL 聚合:
CREATE OR REPLACE VIEW V_ENTERPRISE_EMPLOYMENT_STATUS AS
SELECT ei.ID, ei.UNIFIED_CREDIT_CODE, ei.COMPANY_NAME,
ei.REG_ADDR_DISTRICT AS DISTRICT, ei.INDUSTRY,
ei.STAFF_SIZE AS ENTERPRISE_SCALE, ei.BUSINESS_STATUS AS ENTERPRISE_STATUS,
(SELECT COUNT(*) FROM POST_INFO pi WHERE pi.ENTERPRISE_ID = ei.ID) AS TOTAL_POST_COUNT,
(SELECT COUNT(*) FROM POST_INFO pi WHERE pi.ENTERPRISE_ID = ei.ID
AND (pi.POST_VALID_DATE IS NULL OR pi.POST_VALID_DATE >= SYSDATE)) AS ACTIVE_POST_COUNT,
(SELECT COUNT(*) FROM POST_INFO pi WHERE pi.ENTERPRISE_ID = ei.ID
AND pi.POST_VALID_DATE IS NOT NULL AND pi.POST_VALID_DATE < SYSDATE) AS EXPIRED_POST_COUNT,
NULL AS REGISTERED_EMPLOYEE_COUNT,
(SELECT AVG((pi2.SALARY_MIN + pi2.SALARY_MAX) / 2) FROM POST_INFO pi2
WHERE pi2.ENTERPRISE_ID = ei.ID
AND (pi2.POST_VALID_DATE IS NULL OR pi2.POST_VALID_DATE >= SYSDATE)
AND pi2.SALARY_MIN IS NOT NULL AND pi2.SALARY_MAX IS NOT NULL) AS AVERAGE_SALARY,
esl.CUSTOM_TAGS, esl.LAST_NOTICE_TIME
FROM ENTERPRISE_INFO ei
LEFT JOIN ENTERPRISE_STATUS_LOCAL esl ON ei.ID = esl.ENTERPRISE_ID;
| 文件 | 说明 |
|---|---|
| entity/EnterpriseStatusLocal.java | 本地信息实体 |
| entity/EnterpriseStatusPageVo.java | 列表页VO(视图字段) |
| mapper/EnterpriseStatusLocalMapper.java | Mapper(含queryPageList) |
| mapper/xml/EnterpriseStatusLocalMapper.xml | 视图查询SQL |
| service/IEnterpriseStatusService.java | 服务接口 |
| service/impl/EnterpriseStatusServiceImpl.java | 服务实现(含queryPageList) |
| controller/EnterpriseStatusController.java | REST控制器(列表+标签保存) |
| 文件 | 说明 |
|---|---|
| EnterpriseStatusList.vue | 列表页面(含查询表单) |
| EnterpriseStatus.data.ts | 表格列+搜索配置 |
| EnterpriseStatus.api.ts | API接口 |
个人就业状态自动感知,监控求职人员就业情况。
户口所属区域,姓名,学历,性别,年龄,求职状态,就业状态
证件号码,姓名,户口所属区县,性别,学历,年龄,求职状态,就业状态,就业登记累计次数,失业登记累计次数,社保情况,自定义标签,最后通知时间
查看,发送消息,修改标签
CREATE TABLE PERSONAL_STATUS_LOCAL (
ID VARCHAR(36) NOT NULL,
PERSONAL_ID VARCHAR(36) NOT NULL COMMENT '个人ID(关联PERSONAL_INFO.ID)',
CUSTOM_TAGS VARCHAR(500) COMMENT '自定义标签',
LAST_NOTICE_TIME DATETIME 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 PERSONAL_STATUS_LOCAL IS '个人就业状态本地信息表';
CREATE UNIQUE INDEX IDX_PSL_PERSONAL ON PERSONAL_STATUS_LOCAL(PERSONAL_ID);
从 PERSONAL_INFO + EMPLOYMENT_RECORD + UNEMPLOYMENT_RECORD 聚合:
CREATE OR REPLACE VIEW V_PERSONAL_EMPLOYMENT_STATUS AS
SELECT pi.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,
pi.JOB_SEARCH_STATUS,
CASE WHEN er.PERSONAL_ID IS NOT NULL AND er.EMPLOY_COUNT > 0 THEN '就业中'
WHEN ur.PERSONAL_ID IS NOT NULL AND ur.UNEMPLOY_COUNT > 0 THEN '失业中'
ELSE '未就业'
END AS EMPLOYMENT_STATUS,
NVL(er.EMPLOY_COUNT, 0) AS EMPLOY_REG_COUNT,
NVL(ur.UNEMPLOY_COUNT, 0) AS UNEMPLOY_REG_COUNT,
NULL AS SOCIAL_INSURANCE_STATUS,
psl.CUSTOM_TAGS, psl.LAST_NOTICE_TIME
FROM PERSONAL_INFO pi
LEFT JOIN PERSONAL_STATUS_LOCAL psl ON pi.ID = psl.PERSONAL_ID
LEFT JOIN (SELECT PERSONAL_ID, COUNT(*) AS EMPLOY_COUNT FROM EMPLOYMENT_RECORD GROUP BY PERSONAL_ID) er ON pi.ID = er.PERSONAL_ID
LEFT JOIN (SELECT PERSONAL_ID, COUNT(*) AS UNEMPLOY_COUNT FROM UNEMPLOYMENT_RECORD GROUP BY PERSONAL_ID) ur ON pi.ID = ur.PERSONAL_ID;
| 文件 | 说明 |
|---|---|
| entity/PersonalStatusLocal.java | 本地信息实体 |
| entity/PersonalStatusPageVo.java | 列表页VO(视图字段) |
| mapper/PersonalStatusLocalMapper.java | Mapper(含queryPageList) |
| mapper/xml/PersonalStatusLocalMapper.xml | 视图查询SQL |
| service/IPersonalStatusService.java | 服务接口 |
| service/impl/PersonalStatusServiceImpl.java | 服务实现(含queryPageList) |
| controller/PersonalStatusController.java | REST控制器(列表+标签保存) |
| 文件 | 说明 |
|---|---|
| PersonalStatusList.vue | 列表页面(含查询表单) |
| PersonalStatus.data.ts | 表格列+搜索配置 |
| PersonalStatus.api.ts | API接口 |
EnterpriseStatusController.java / PersonalStatusController.java — javax.servlet → jakarta.servletEnterpriseStatusServiceImpl.java / PersonalStatusServiceImpl.java — javax.annotation.Resource → jakarta.annotation.Resourceorg.jeecg.common.util.ParamUtils 引用,改为手动 req.getParameter() 提取参数IEnterpriseStatusService.java / IPersonalStatusService.java — 补充 queryPageList 方法声明EnterpriseStatusController.java / PersonalStatusController.java — 新增 /exportXls 导出端点,支持 selections 勾选过滤EnterpriseStatusPageVo.java — 新增 registeredEmployeeCount(备案在岗总人数)、averageSalary(平均薪酬)、@Excel 注解PersonalStatusPageVo.java — 新增 socialInsuranceStatus(社保情况)、householdAreaName(户口区县名称)、@Excel 注解EnterpriseStatusLocalMapper.xml — 新增 customTags 查询条件PersonalStatusLocalMapper.xml — 新增 age 查询条件企业就业状态感知:
<a-select> 下拉(BusinessStatus 字典)enterpriseStatus(BusinessStatus)、enterpriseScale(enterprise_scale)、district(XZQH)exportConfigEnterpriseStatusModal.vue + EnterpriseStatusDetail.vue 详情弹窗(j-modal 模式,与重点关注人员一致)已发布岗位总数 → 企业已发布岗位总数个人就业状态感知:
<a-select> 下拉(Gender/Education/JobSeekerStatus/employment_status 字典)householdAreaName 去"广东省湛江市"前缀显示区名exportConfigPersonalStatusModal.vue + PersonalStatusDetail.vue 详情弹窗ENTERPRISE_STATUS_LOCAL、PERSONAL_STATUS_LOCALV_ENTERPRISE_EMPLOYMENT_STATUS、V_PERSONAL_EMPLOYMENT_STATUSemployment_status(就业状态)、enterprise_scale(企业规模)就业状态自动感知(178060400000000) → 企业就业状态感知(178060400000001) → 个人就业状态感知(178060400000002),含 admin 授权企业就业状态感知:
<a-select> 下拉(EconomicIndustry 字典,value 使用 label 文本匹配 DB)<a-select> 下拉(BusinessStatus 字典,与企业基本信息模块经营状态保持一致)enterpriseStatus 去掉 || text 回退(字典未匹配时显示空白)= 改为 LIKE 模糊匹配个人就业状态感知:
ageBegin ~ ageEnd,后端同步改造)<a-select> 下拉(employment_status 字典,value 使用 label 文本匹配)householdDistrict 搜索从 = 改为 LIKE 模糊匹配EnterpriseStatusList.vue / PersonalStatusList.vue — "修改标签"按钮弹出模态框,使用 <a-textarea> 编辑逗号分隔标签saveTag/getTag API 读写 enterprise_status_local/personal_status_local 表的 custom_tags 字段共用消息表: notification_record,支持多模块复用
| 字段 | 说明 |
|---|---|
| MODULE_TYPE | 模块类型(enterprise_status/personal_status/profile_change 等) |
| TARGET_ID | 目标ID(企业ID或个人ID) |
| TARGET_NAME | 目标名称(冗余展示) |
| SUBJECT | 消息主题 |
| CONTENT | 消息内容 |
| SENDER | 推送人(自动绑定当前登录用户) |
| SEND_TIME | 推送时间(自动记录) |
后端新增:
notification/entity/NotificationRecord.java — 消息记录实体notification/mapper/NotificationRecordMapper.java + XMLnotification/service/INotificationRecordService.java + Implnotification/controller/NotificationController.java — 统一接口:
POST /notification/send — 发送消息(写记录 + 更新 local 表 last_notice_time)GET /notification/list — 分页查询消息记录GET /notification/myList — 查询当前用户发送的消息(支持关键字/模块/日期筛选)前端新增:
notification/SentMessagesList.vue — 已发送消息列表页(搜索:关键字、来源模块、推送时间范围;详情弹窗)notification/SentMessages.data.ts — 列定义notification/SentMessages.api.ts — API企业/个人就业状态感知:
/notification/send,自动更新 last_notice_time菜单:
字典:
notification_module(消息通知来源模块):企业就业状态感知、个人就业状态感知、画像变动管理、重点关注人员管理、就业援助、初步符合人员数据库表:
notification_record(含索引 idx_notice_target、idx_notice_time)V20260611_1__create_notification_record.sql、V20260611_2__menu_insert_SentMessages.sql将原有 notification_record 重构为消息主表 + 接收人关联表:
notification_record notification_target
┌──────────────┐ ┌────────────────────┐
│ id │◄───1:N────│ notification_id │
│ module_type │ │ target_type │ (personal/enterprise)
│ subject │ │ target_id │
│ content │ └────────────────────┘
│ sender │
│ send_time │
└──────────────┘
target_name 不存储,查询时从 PERSONAL_INFO/ENTERPRISE_INFO 批量关联获取 resolveTargetNames()/notification/send 端点,接收 targets: [{targetType, targetId}] 数组,单条传 1 个元素,批量传多个NotificationTarget 实体(mapper: NotificationTargetMapper)NotificationTarget.targetName 为 @TableField(exist = false) 瞬态字段ProfileChangeList.vue — "修改标签"和"发送消息"功能实现,与个人就业状态感知共用 personal_status_local 表ProfileChange.api.ts — saveTag 修复为 data 请求体DICTIONARY 新增 notification_module(消息通知来源模块)DICTIONARY_ITEM 写入 6 项:enterprise_status / personal_status / profile_change / focus_personnel / employment_assistance / preliminary_eligibleSentMessagesList.vue 通过 useDict('notification_module') 加载,moduleTypeMap 动态映射 code→labelhouseholdDistrict 改用 XZQH 树形下拉(程序化定位湛江市区县)PersonalStatusLocalMapper.xml — household_district 从 = 改为 LIKEPersonalStatusController.java — 年龄从单值 age 改为范围 ageBegin/ageEndFocusPersonnelList.vue / InternshipPersonnelList.vue — "推送消息"按钮替换为模态框(显示已选N条,富文本内容,自动推送人/时间)getDataSource() 提取 personalId → 调用 /notification/send,targets 数组批量发送FocusPersonnel.data.ts / InternshipPersonnel.data.ts — 新增隐藏列 personalId(ifShow: false)确保数据可用DICTIONARY_ITEM 补充 internship_personnel 字典项notification_record 新增 SENDER_ID VARCHAR(36)(关联 sys_user.id),sender 存姓名冗余展示create_by 为 JeecgBoot 标准字段(存 sys_user.username)