# 失败诊断模块开发记录 **日期:** 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)` 使用雪花算法生成主键。公共审计字段(`createBy`、`createTime`、`updateBy`、`updateTime`、`sysOrgCode`)在每个实体中显式定义。需要导入导出的字段使用 `@Excel` 注解,日期字段使用 `@JsonFormat` + `@DateTimeFormat` 进行格式化。 2. **Mapper 层**:主表和配置表的 Mapper 仅继承 `BaseMapper`。子表 Mapper(`InterviewFailFollowUpMapper`、`InterviewFailMessageMapper`)增加了 `deleteByDiagnosisId`(通过外键批量删除)和 `selectByDiagnosisId`(通过外键查询)方法,使用 `@Delete` 和 `@Select` 注解实现。 3. **Service 层**:接口继承 `IService`,实现继承 `ServiceImpl`。子表 Service 封装了 `selectByDiagnosisId` 和 `deleteByDiagnosisId` 方法供 Controller 调用。主表 Service 增加了关联查询和字典翻译能力。 4. **VO 层**: - `InterviewFailReasonVO`:继承 `InterviewFailReason`,增加 `fullName`(姓名)、`gender`(性别)、`age`(年龄,通过出生日期实时计算,考虑生日是否已过)、`householdAreaName`(户口所在地完整路径)四个关联字段 - `InterviewFailDiagnosisVO`:继承 `InterviewFailDiagnosis`,增加 `fullName`、`gender`、`age`、`householdAreaName`、`tagNames`(关联标签名称,逗号分隔)、`tagIds`(关联标签ID,逗号分隔)六个关联字段 5. **DTO 层**: - `InterviewFailDiagnosisSaveDTO`:继承 `InterviewFailDiagnosis`,增加 `tagIds`(逗号分隔的标签ID)字段,用于新增/编辑时保存标签关联关系 6. **Controller 层 - InterviewFailReasonController**:继承 `JeecgController`,路由前缀 `/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`,路由前缀 `/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` — 发送消息(同时自动更新主表最后通知时间) 8. **核心业务逻辑——失败原因新增自动同步诊断分析**(`saveWithSyncDiagnosis`): - 保存失败原因明细后,统计该人员的失败原因记录总数 - 若诊断分析表不存在该人员记录,则新建(failCount=统计数,isFollowed=0) - 若已存在,则更新 failCount - 同时根据面试失败原因内容,遍历所有标签配置的关键字匹配规则,自动关联匹配的标签 9. **核心业务逻辑——诊断分析保存标签关联**(`saveTagRelations`): - 采用"先删后插"策略:删除诊断分析原有的所有标签关联,再批量插入新的标签关联 - 标签ID以逗号分隔字符串形式传入(通过 SaveDTO 的 tagIds 字段) 10. **关联查询性能优化——批量查询避免N+1**: - 在 `buildVOList` 方法中,先收集所有记录的 `personalId`,通过 `selectBatchIds` 一次性批量查询 PersonalInfo - 同样,先收集所有诊断记录的 ID,一次性批量查询标签关联和标签名称 - 年龄通过出生日期实时计算(使用 Calendar 计算年份差,考虑生日是否已过) 11. **字典翻译**:导出时通过 `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` | **新增** | 发送消息弹窗(自动填充推送人和推送时间) |