260609-失败诊断模块开发记录.md 24 KB

失败诊断模块开发记录

日期: 2026-06-09

模块概述

失败诊断模块(interviewfail)是就业一湛通服务平台中负责求职失败分析的核心模块。该模块基于 JeecgBoot 前后端分离架构,后端基于 Spring Boot + MyBatis-Plus,前端基于 Vue 3 + TypeScript + Ant Design Vue。

业务关系

根据《需求规格说明书》第3.3节——失败诊断:

  • InterviewFailReason(失败原因明细):主表,记录求职者面试失败的原因明细数据
  • InterviewFailDiagnosis(失败诊断分析):主表,对求职者失败原因进行次数汇总统计分析
  • InterviewFailDiagnosisTag(诊断标签关联):关联表,维护失败诊断分析与失败标签的多对多关系
  • InterviewFailFollowUp(服务跟进):子表,关联失败诊断分析,记录对求职失败人员的服务跟进
  • InterviewFailMessage(发送消息):子表,关联失败诊断分析,记录向求职失败人员发送的消息
  • InterviewFailTag(失败标签配置):配置表,存储失败原因关键字匹配的标签编码映射

数据流向

失败原因明细(InterviewFailReason)
  ├── 新增时自动同步 → 失败诊断分析(InterviewFailDiagnosis) [按personalId聚合,failCount计数]
  │     ├── 关联 ← InterviewFailDiagnosisTag → InterviewFailTag [关键字自动匹配标签]
  │     ├── 1:N → InterviewFailFollowUp [服务跟进子表]
  │     └── 1:N → InterviewFailMessage [发送消息子表]
  └── 列表查询关联 → PersonalInfo [获取姓名、性别、年龄、户口所在地]

主表与Controller对应关系

仅两个主表(失败原因明细、失败诊断分析)编写了 Controller,子表和关联表通过主表的 Controller 暴露查询接口。


模块文件结构

后端(jeecg-boot-module/jeecg-module-zjrs/.../org/jeecg/modules/zjrs/interviewfail/)

层次 文件 说明
Entity InterviewFailReason.java 失败原因明细实体
InterviewFailDiagnosis.java 失败诊断分析实体
InterviewFailDiagnosisTag.java 诊断标签关联实体
InterviewFailFollowUp.java 服务跟进实体(子表)
InterviewFailMessage.java 发送消息实体(子表)
InterviewFailTag.java 失败标签配置实体
VO InterviewFailReasonVO.java 失败原因明细VO(含个人信息关联字段)
InterviewFailDiagnosisVO.java 失败诊断分析VO(含个人信息+标签关联字段)
DTO InterviewFailDiagnosisSaveDTO.java 失败诊断分析保存DTO(含标签ID)
Mapper InterviewFailReasonMapper.java 失败原因明细Mapper
InterviewFailDiagnosisMapper.java 失败诊断分析Mapper
InterviewFailDiagnosisTagMapper.java 诊断标签关联Mapper
InterviewFailFollowUpMapper.java 服务跟进Mapper(含deleteByDiagnosisId/selectByDiagnosisId)
InterviewFailMessageMapper.java 发送消息Mapper(含deleteByDiagnosisId/selectByDiagnosisId)
InterviewFailTagMapper.java 失败标签配置Mapper
Mapper XML 6个XML文件 位于 mapper/xml/ 目录
Service接口 IInterviewFailReasonService.java 失败原因明细服务接口(含VO查询、诊断同步、字典翻译)
IInterviewFailDiagnosisService.java 失败诊断分析服务接口(含VO查询、字典翻译)
IInterviewFailDiagnosisTagService.java 诊断标签关联服务接口
IInterviewFailFollowUpService.java 服务跟进服务接口(含外键查询/删除)
IInterviewFailMessageService.java 发送消息服务接口(含外键查询/删除)
IInterviewFailTagService.java 失败标签配置服务接口
Service实现 InterviewFailReasonServiceImpl.java 失败原因明细Service实现(含诊断同步、标签匹配、VO组装、字典翻译)
InterviewFailDiagnosisServiceImpl.java 失败诊断分析Service实现(含VO组装、标签关联、字典翻译)
InterviewFailDiagnosisTagServiceImpl.java 诊断标签关联Service实现
InterviewFailFollowUpServiceImpl.java 服务跟进Service实现
InterviewFailMessageServiceImpl.java 发送消息Service实现
InterviewFailTagServiceImpl.java 失败标签配置Service实现
Controller InterviewFailReasonController.java 失败原因明细控制器(CRUD + 导入导出 + 诊断同步)
InterviewFailDiagnosisController.java 失败诊断分析控制器(CRUD + 导入导出 + 子表CRUD + 标签查询)

前端(jeecgboot-vue3/src/views/interviewfail/)

目录 文件 说明
reason/ InterviewFailReasonList.vue 失败原因明细列表页
InterviewFailReason.api.ts 失败原因明细API封装
InterviewFailReason.data.ts 表格列、搜索表单、弹窗表单配置
components/InterviewFailReasonModal.vue 新增/编辑弹窗容器
components/InterviewFailReasonForm.vue 表单组件(含人员选择器联动)
components/InterviewFailReasonDetailModal.vue 详情弹窗
diagnosis/ InterviewFailDiagnosisList.vue 失败诊断分析列表页
InterviewFailDiagnosis.api.ts 失败诊断分析API封装(含子表接口)
InterviewFailDiagnosis.data.ts 表格列、搜索表单、弹窗表单、子表列配置
components/InterviewFailDiagnosisModal.vue 新增/编辑弹窗容器
components/InterviewFailDiagnosisForm.vue 表单组件(含标签多选下拉)
components/InterviewFailDiagnosisDetailModal.vue 详情弹窗
components/FailReasonListModal.vue 失败明细列表弹窗(按人员ID过滤)
components/FollowUpListModal.vue 服务跟进弹窗(含增删改查)
components/SendMessageModal.vue 发送消息弹窗

开发记录

2026-06-09:失败诊断模块后端代码初始构建

内容: 完成失败诊断模块 6 张表的后端基础 CRUD 代码,包括 Entity、Mapper、Service、Controller 全层代码,以及 VO 关联查询和字典翻译功能。

实现要点:

  1. Entity 层:6 个实体类均实现 Serializable,使用 Lombok 注解(@Data@Accessors(chain=true)@EqualsAndHashCode),使用 @TableName 指定达梦数据库表名,@TableId(type=IdType.ASSIGN_ID) 使用雪花算法生成主键。公共审计字段(createBycreateTimeupdateByupdateTimesysOrgCode)在每个实体中显式定义。需要导入导出的字段使用 @Excel 注解,日期字段使用 @JsonFormat + @DateTimeFormat 进行格式化。

  2. Mapper 层:主表和配置表的 Mapper 仅继承 BaseMapper<T>。子表 Mapper(InterviewFailFollowUpMapperInterviewFailMessageMapper)增加了 deleteByDiagnosisId(通过外键批量删除)和 selectByDiagnosisId(通过外键查询)方法,使用 @Delete@Select 注解实现。

  3. Service 层:接口继承 IService<T>,实现继承 ServiceImpl<Mapper, T>。子表 Service 封装了 selectByDiagnosisIddeleteByDiagnosisId 方法供 Controller 调用。主表 Service 增加了关联查询和字典翻译能力。

  4. VO 层

    • InterviewFailReasonVO:继承 InterviewFailReason,增加 fullName(姓名)、gender(性别)、age(年龄,通过出生日期实时计算,考虑生日是否已过)、householdAreaName(户口所在地完整路径)四个关联字段
    • InterviewFailDiagnosisVO:继承 InterviewFailDiagnosis,增加 fullNamegenderagehouseholdAreaNametagNames(关联标签名称,逗号分隔)、tagIds(关联标签ID,逗号分隔)六个关联字段
  5. DTO 层

    • InterviewFailDiagnosisSaveDTO:继承 InterviewFailDiagnosis,增加 tagIds(逗号分隔的标签ID)字段,用于新增/编辑时保存标签关联关系
  6. Controller 层 - InterviewFailReasonController:继承 JeecgController<InterviewFailReason, IInterviewFailReasonService>,路由前缀 /interviewFail/interviewFailReason,提供:

    • GET /list — 分页列表查询,返回 VO(含个人信息关联字段),支持姓名、户口所在地模糊搜索
    • POST /add — 新增(同时触发诊断分析同步和标签匹配)
    • PUT /edit — 编辑
    • DELETE /delete — 通过id删除
    • DELETE /deleteBatch — 批量删除
    • GET /queryById — 通过id查询,返回 VO
    • GET /exportXls — Excel导出(使用VO类,字段:姓名、性别、年龄、户口所在地、企业名称、应聘岗位、面试方式、投递时间、面试时间、不通过原因、数据来源),自动翻译字典字段
    • POST /importExcel — Excel导入
  7. Controller 层 - InterviewFailDiagnosisController:继承 JeecgController<InterviewFailDiagnosis, IInterviewFailDiagnosisService>,路由前缀 /interviewFail/interviewFailDiagnosis,提供:

主表CRUD:

  • GET /list — 分页列表查询,返回VO(含个人信息+标签关联字段),支持姓名、户口所在地、本地标签、失败次数范围、是否已跟进搜索
  • POST /add — 新增(使用 SaveDTO,含标签关联保存)
  • PUT /edit — 编辑(使用 SaveDTO,含标签关联保存)
  • DELETE /delete — 通过id删除(级联删除标签关联+服务跟进+发送消息)
  • DELETE /deleteBatch — 批量删除(级联删除标签关联+服务跟进+发送消息)
  • GET /queryById — 通过id查询,返回 VO
  • GET /exportXls — Excel导出(使用VO类,字段:姓名、性别、年龄、户口所在地、失败次数、关联标签、是否已跟进、最后通知时间),自动翻译字典字段
  • POST /importExcel — Excel导入

标签下拉:

  • GET /queryTagList — 查询所有标签,用于前端下拉选择

子表查询:

  • GET /queryFollowUpList — 查询指定诊断分析的服务跟进记录列表
  • GET /queryMessageList — 查询指定诊断分析的发送消息记录列表

子表CRUD:

  • POST /followUp/add — 添加服务跟进记录
  • PUT /followUp/edit — 编辑服务跟进记录
  • DELETE /followUp/delete — 删除服务跟进记录
  • POST /message/add — 发送消息(同时自动更新主表最后通知时间)
  1. 核心业务逻辑——失败原因新增自动同步诊断分析saveWithSyncDiagnosis):

    • 保存失败原因明细后,统计该人员的失败原因记录总数
    • 若诊断分析表不存在该人员记录,则新建(failCount=统计数,isFollowed=0)
    • 若已存在,则更新 failCount
    • 同时根据面试失败原因内容,遍历所有标签配置的关键字匹配规则,自动关联匹配的标签
  2. 核心业务逻辑——诊断分析保存标签关联saveTagRelations):

    • 采用"先删后插"策略:删除诊断分析原有的所有标签关联,再批量插入新的标签关联
    • 标签ID以逗号分隔字符串形式传入(通过 SaveDTO 的 tagIds 字段)
  3. 关联查询性能优化——批量查询避免N+1

    • buildVOList 方法中,先收集所有记录的 personalId,通过 selectBatchIds 一次性批量查询 PersonalInfo
    • 同样,先收集所有诊断记录的 ID,一次性批量查询标签关联和标签名称
    • 年龄通过出生日期实时计算(使用 Calendar 计算年份差,考虑生日是否已过)
  4. 字典翻译:导出时通过 translateDictFields 方法对字典字段(如性别、数据来源)进行值→标签的内存映射翻译,避免导出数据库原始编码值

设计说明:

  • 失败标签配置表(InterviewFailTag)作为独立的配置表,只创建了 Entity/Mapper/Service,不创建 Controller(通过诊断分析 Controller 的 /queryTagList 接口暴露下拉数据)
  • 诊断标签关联表(InterviewFailDiagnosisTag)为诊断分析和标签的多对多关联表,不创建独立 Controller
  • 服务跟进表和发送消息表作为失败诊断分析的子表,不独立创建 Controller,通过诊断分析 Controller 的子表路由暴露查询和CRUD能力
  • 诊断分析删除时采用级联删除策略:先删标签关联 → 再删服务跟进 → 再删发送消息 → 最后删主表,保证数据一致性

2026-06-09:失败原因明细前端页面创建

需求描述: 为失败原因明细模块创建前端列表页、API、数据配置和弹窗组件,提供标准 CRUD 操作界面。

实现方案:

  • 遵循 JeecgBoot 前端模式,使用自定义表单组件替代传统的 data.ts 驱动表单:
    • InterviewFailReasonList.vue:列表主页,使用 useListPage + BasicTable,搜索表单包含姓名、户口所在地、企业名称、数据来源(字典下拉);包含新增、导出、批量删除按钮;操作列提供编辑、详情、删除三个操作;字典字段(性别、数据来源)通过 useDict 翻译
    • InterviewFailReason.api.ts:API 集中管理,enum Api 定义 8 个接口路径;提供 list/queryById/saveOrUpdate/deleteOne/batchDelete 函数,getExportUrl/getImportUrl 供导入导出组件使用
    • InterviewFailReason.data.ts:定义 11 列表格配置(姓名、性别、年龄、户口所在地、企业名称、应聘岗位、面试方式、投递时间、面试时间、面试不通过原因、数据来源);搜索表单 4 个字段(姓名、应聘岗位、面试方式、数据来源);弹窗表单配置(含隐藏ID字段)
    • InterviewFailReasonModal.vue:弹窗容器,使用 JModal,复用 InterviewFailReasonForm 实现新增/编辑/详情三种模式
    • InterviewFailReasonForm.vue:表单组件,集成 PersonalInfoSelector 人员选择器,选择人员后自动联动填充姓名、性别(字典翻译)、年龄(根据出生日期计算)、户口所在地;编辑/详情时通过 queryById 获取含VO字段的完整数据回填
    • InterviewFailReasonDetailModal.vue:详情弹窗,使用 a-descriptions 以三列布局展示所有字段,字典字段通过 useDict 翻译

2026-06-09:失败诊断分析前端页面创建

需求描述: 为失败诊断分析模块创建前端列表页、API、数据配置、弹窗组件及子表弹窗,提供主表 CRUD + 子表管理操作界面。

实现方案:

  • InterviewFailDiagnosisList.vue:列表主页,搜索表单包含姓名、户口所在地、面试失败次数(范围输入)、本地标签(下拉多选)、是否已跟进;表格失败次数列渲染为可点击链接(点击打开失败明细弹窗);操作栏提供编辑、服务跟进、发送消息三个按钮,下拉菜单提供详情、删除;字典字段(性别、是否已跟进)通过 useDict/自定义函数翻译
  • InterviewFailDiagnosis.api.ts:API 集中管理,enum Api 定义 15 个接口路径(主表 CRUD 8个 + 子表查询 2个 + 标签下拉 1个 + 子表 CRUD 4个)
  • InterviewFailDiagnosis.data.ts:定义 8 列表格配置、6 个搜索表单配置、10 个弹窗表单配置、服务跟进子表 4 列配置、发送消息子表 4 列配置
  • InterviewFailDiagnosisModal.vue:弹窗容器,复用 InterviewFailDiagnosisForm 实现新增/编辑/详情三种模式
  • InterviewFailDiagnosisForm.vue:表单组件,姓名、性别、年龄、面试失败次数为只读展示;本地标签为多选下拉(数据从 /queryTagList 获取);编辑/详情时通过 queryById 获取含标签ID的完整数据回填多选
  • InterviewFailDiagnosisDetailModal.vue:详情弹窗,展示姓名、性别、年龄、面试失败次数、是否已跟进、最后通知时间、本地标签
  • FailReasonListModal.vue:失败明细弹窗,按人员ID过滤展示该人员的所有失败记录,内嵌搜索表单(企业名称、数据来源),操作栏提供详情按钮
  • FollowUpListModal.vue:服务跟进弹窗,展示诊断分析关联的服务跟进记录列表,支持新增(自动填充当前用户和服务时间)、编辑、删除操作
  • SendMessageModal.vue:发送消息弹窗,包含消息主题(必填)、消息内容(必填)、推送人(自动填充当前用户,只读)、推送时间(自动填充当前时间,只读)四个字段,提交后自动更新主表最后通知时间

涉及的文件清单

后端文件

文件 操作 原因
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/entity/InterviewFailReason.java 新增 失败原因明细表实体类(personalId、enterpriseName、jobName、interviewMethod、deliveryTime、interviewTime、failReason、dataSource)
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/entity/InterviewFailDiagnosis.java 新增 失败诊断分析表实体类(personalId、provincePersonalId、failCount、localTags、isFollowed、lastNotifyTime)
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/entity/InterviewFailDiagnosisTag.java 新增 诊断标签关联表实体类(diagnosisId、tagId,无主键,多对多关联)
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/entity/InterviewFailFollowUp.java 新增 服务跟进表实体类(diagnosisId、fullName、serviceContent、serviceTime、servicePerson)
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/entity/InterviewFailMessage.java 新增 发送消息表实体类(diagnosisId、messageSubject、messageContent、sender、sendTime)
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/entity/InterviewFailTag.java 新增 失败标签配置表实体类(tagCode、tagName、tagDescription、matchKeywords、sortOrder)
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/vo/InterviewFailReasonVO.java 新增 失败原因明细VO,继承InterviewFailReason,增加fullName、gender、age、householdAreaName四个关联字段
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/vo/InterviewFailDiagnosisVO.java 新增 失败诊断分析VO,继承InterviewFailDiagnosis,增加fullName、gender、age、householdAreaName、tagNames、tagIds六个关联字段
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/dto/InterviewFailDiagnosisSaveDTO.java 新增 失败诊断分析保存DTO,继承InterviewFailDiagnosis,增加tagIds字段用于保存标签关联
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/mapper/InterviewFailReasonMapper.java 新增 失败原因明细Mapper,继承BaseMapper
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/mapper/InterviewFailDiagnosisMapper.java 新增 失败诊断分析Mapper,继承BaseMapper
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/mapper/InterviewFailDiagnosisTagMapper.java 新增 诊断标签关联Mapper,继承BaseMapper
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/mapper/InterviewFailFollowUpMapper.java 新增 服务跟进Mapper,含外键查询/删除方法
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/mapper/InterviewFailMessageMapper.java 新增 发送消息Mapper,含外键查询/删除方法
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/mapper/InterviewFailTagMapper.java 新增 失败标签配置Mapper,继承BaseMapper
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/mapper/xml/*.xml(6个) 新增 MyBatis XML映射文件
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/service/IInterviewFailReasonService.java 新增 失败原因明细Service接口,含saveWithSyncDiagnosis、VO查询、字典翻译方法
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/service/IInterviewFailDiagnosisService.java 新增 失败诊断分析Service接口,含VO查询、字典翻译方法
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/service/IInterviewFailDiagnosisTagService.java 新增 诊断标签关联Service接口
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/service/IInterviewFailFollowUpService.java 新增 服务跟进Service接口,含外键查询/删除方法
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/service/IInterviewFailMessageService.java 新增 发送消息Service接口,含外键查询/删除方法
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/service/IInterviewFailTagService.java 新增 失败标签配置Service接口
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/service/impl/InterviewFailReasonServiceImpl.java 新增 失败原因明细Service实现,含saveWithSyncDiagnosis(诊断同步+标签匹配)、buildVOList(批量关联查询)、translateDictFields(字典翻译)
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/service/impl/InterviewFailDiagnosisServiceImpl.java 新增 失败诊断分析Service实现,含buildVOList(标签关联查询+个人信息查询)、translateDictFields
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/service/impl/InterviewFailDiagnosisTagServiceImpl.java 新增 诊断标签关联Service实现
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/service/impl/InterviewFailFollowUpServiceImpl.java 新增 服务跟进Service实现
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/service/impl/InterviewFailMessageServiceImpl.java 新增 发送消息Service实现
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/service/impl/InterviewFailTagServiceImpl.java 新增 失败标签配置Service实现
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/controller/InterviewFailReasonController.java 新增 失败原因明细Controller(主表,含CRUD+导入导出+诊断同步)
jeecg-boot-module/jeecg-module-zjrs/.../interviewfail/controller/InterviewFailDiagnosisController.java 新增 失败诊断分析Controller(主表,含CRUD+导入导出+标签查询+子表CRUD+级联删除)

前端文件

文件 操作 原因
jeecgboot-vue3/src/views/interviewfail/reason/InterviewFailReasonList.vue 新增 失败原因明细列表主页,含搜索、表格、操作栏
jeecgboot-vue3/src/views/interviewfail/reason/InterviewFailReason.api.ts 新增 失败原因明细 API 封装(8个接口)
jeecgboot-vue3/src/views/interviewfail/reason/InterviewFailReason.data.ts 新增 表格列配置(11列)、搜索表单、弹窗表单定义
jeecgboot-vue3/src/views/interviewfail/reason/components/InterviewFailReasonModal.vue 新增 新增/编辑弹窗容器
jeecgboot-vue3/src/views/interviewfail/reason/components/InterviewFailReasonForm.vue 新增 表单组件,集成人员选择器联动填充
jeecgboot-vue3/src/views/interviewfail/reason/components/InterviewFailReasonDetailModal.vue 新增 详情弹窗,a-descriptions展示
jeecgboot-vue3/src/views/interviewfail/diagnosis/InterviewFailDiagnosisList.vue 新增 失败诊断分析列表主页,含搜索、表格、操作栏、多弹窗
jeecgboot-vue3/src/views/interviewfail/diagnosis/InterviewFailDiagnosis.api.ts 新增 失败诊断分析 API 封装(15个接口,含子表CRUD)
jeecgboot-vue3/src/views/interviewfail/diagnosis/InterviewFailDiagnosis.data.ts 新增 表格列配置(8列)、搜索表单、弹窗表单、子表列配置
jeecgboot-vue3/src/views/interviewfail/diagnosis/components/InterviewFailDiagnosisModal.vue 新增 新增/编辑弹窗容器
jeecgboot-vue3/src/views/interviewfail/diagnosis/components/InterviewFailDiagnosisForm.vue 新增 表单组件,含标签多选下拉
jeecgboot-vue3/src/views/interviewfail/diagnosis/components/InterviewFailDiagnosisDetailModal.vue 新增 详情弹窗
jeecgboot-vue3/src/views/interviewfail/diagnosis/components/FailReasonListModal.vue 新增 失败明细列表弹窗(按人员过滤)
jeecgboot-vue3/src/views/interviewfail/diagnosis/components/FollowUpListModal.vue 新增 服务跟进弹窗(含内嵌增删改查)
jeecgboot-vue3/src/views/interviewfail/diagnosis/components/SendMessageModal.vue 新增 发送消息弹窗(自动填充推送人和推送时间)