# 2026-04-15 工作日志 ## 通用字段规范化 - 用户明确了所有表的通用字段定义,与实际 DDL 对齐 - 修正了通用字段类型:`create_by`/`update_by` 为 BIGINT(非 varchar),`del_flag` 为 character(1 char)/char(1)(非 integer),新增 `create_dept` BIGINT - 多租户表额外包含 `tenant_id`(BIGINT),非多租户表不含 - 更新了三个文件:需求模板、require SKILL.md、ecs-course-requirements.md - 建表 DDL 中从表也需包含完整的通用字段(之前缺失) ## 课程管理前端代码生成(/dev ecs course --frontend-only) - 基于需求规格说明书 `doc/ecs-course-requirements.md` 生成前端代码 - 替换已有旧版课程前端代码(旧版为单教师关联,新版为多教师关联从表) - 生成4个文件: - `src/api/ecs/course/types.ts`:新增 CourseTeacherVO 从表类型、teacherNames 字段、courseType/dataSource 查询条件 - `src/api/ecs/course/index.ts`:新增导入导出接口(exportTemplate/importData/exportCourse) - `src/views/ecs/course/index.vue`:完整列表页,含 course_type/data_source 双字典、导入导出按钮、dataSource 第三方数据锁定 - `src/views/ecs/course/form.vue`:新增表单页(替代旧 detail.vue),含从表教师多选表格、字典下拉、必填校验 - 旧文件 detail.vue 需手工删除(在 ykt_web 项目下,非当前 workspace) ## 课程管理前端导入导出Bug修复 - **问题**:下载模板时报 `relativeURL.replace is not a function` - **原因**:`proxy?.download(url, params, fileName)` 的第一个参数期望是 URL 字符串,但生成代码把 axios response 对象传了进去 - 错误写法:`const res = await exportTemplate(); proxy?.download(res, 'xxx.xlsx')` - RuoYi 框架的 `download` 函数(来自 `@/utils/request`)会内部调用 `service.post(url, ...)`,所以不需要先发请求再传结果 - **修复**:改为直接传 URL 字符串给 `proxy?.download` - 下载模板:`proxy?.download('ecs/course/exportTemplate', {}, '课程导入模板_xxx.xlsx')` - 导出数据:`proxy?.download('ecs/course/export', { ...queryParams }, '课程数据_xxx.xlsx')` - **API清理**:删除 `api/ecs/course/index.ts` 中的 `exportTemplate`、`importData`、`exportCourse` 三个函数(导入用 el-upload 的 action 方式,导出/模板用 proxy.download 方式) ## 后端技能 SKILL.md 从表 VO 映射修复 - **问题**:A.4 代码生成模板节只列了主表 VO 映射,从表 VO 未列出,导致从表生成的 Vo 类缺少 `@AutoMapper` 注解 - **修复**:A.4 节拆分为「主表」和「从表」两部分,明确从表复用 `Vo.java.template`(含 `@AutoMapper`),并加了 ⚠️ 强调说明 - **模板本身无需修改**:`Vo.java.template` 第5行已有 `import io.github.linpeilie.annotations.AutoMapper`,第22行已有 `@AutoMapper(target = ${ClassName}.class)`,只需按正确类名填充即可 ## 从表关联字段命名统一(teacherList → courseTeacherList) - **问题**:后端生成 `EcsCourseBo`/`EcsCourseVo` 中从表字段名为 `teacherList`,前端 `types.ts` 中为 `courseTeacherList`,JSON 序列化/反序列化不一致 - **原因**:SKILL.md A.5 字段映射表缺少从表关联字段的命名规则,导致生成时随意命名 - **修复**:SKILL.md A.5 新增一行 `从表关联字段(Bo/Vo)→ private List<{SubName}Vo> {Name}{Sub}List;` - **已修改3个文件**: - `EcsCourseVo.java`:`teacherList` → `courseTeacherList` - `EcsCourseBo.java`:`teacherList` → `courseTeacherList` - `EcsCourseServiceImpl.java`:5处引用全部更新为 `setCourseTeacherList`/`getCourseTeacherList` - **命名规则**:`{Name}{Sub}List`(主表名首字母小写 + 从表名 + List),例如 `EcsCourse` + `Teacher` = `courseTeacherList` ## 后端代码验证(/dev ecs course) - **已修正** `EcsCourseTeacherVo.java`:第21行新增 `@AutoMapper(target = EcsCourseTeacher.class)`,第7行导入 `EcsCourseTeacher` - 对比主表 `EcsCourseVo.java` 第25行 `@AutoMapper(target = EcsCourse.class)` → 结构完全一致 - **结论**:技能已修复,下次 `/dev` 生成从表 VO 时会用 `Vo.java.template` 正确填充 `@AutoMapper(target = {SubName}.class)` ## 前端技能模板导入导出规范化 - 按 ptRoom 模式统一了导入导出写法,更新了4个文件: - `templates/view-list.vue`:新增"更多"下拉菜单(下载模板/导入数据/导出数据)+ upload reactive + 导入弹窗 + 所有处理方法 - `SKILL.md`:api/index.ts 示例去掉 export 函数,新增导入导出说明块 - `references/api-style.md`:导出改为 `proxy?.download()`,新增完整的导出导入规范章节 - `references/vue-style.md`:列表页工具栏增加"更多"下拉,script 增加 upload + 导入导出方法 - 核心变更:api/index.ts 不再有 exportTemplate/importData/exportCourse 函数 - 导出/下载模板:`proxy?.download(url, params, fileName)` 方式 - 导入:`el-upload` action 属性 + `globalHeaders()` + `ImportOption` reactive ## 需求模板增加 lockRule 操作锁定规则 - 新增字段属性 `lockRule`:当某字段值决定行级操作权限时使用 - lockRule 格式:`{ lockValue: 值, lockActions: [edit, delete], tip: 提示文案 }` - 典型场景:`dataSource=1`(第三方同步)时禁止编辑和删除 - 更新了3个文件: - `references/requirements-template.md`:字段属性速查表增加 lockRule 行 + lockRule 格式说明 + 示例字段 - `SKILL.md`:字段通用默认值增加 lockRule、解析规则"来源"增加 lockRule 推断、VO结构说明增加"有lockRule的字段必须加入VO"、注意事项第8条 - `doc/ecs-course-requirements.md`:dataSource 字段改为 `inTable=false`/`inQuery=false`,增加 lockRule 配置,备注增加锁定规则说明 ## 课程前端代码重新生成(对齐 lockRule) - 基于 lockRule 规范,dataSource 字段 `inQuery=false`/`inTable=false` - 修改3个前端文件对齐需求文档: - `index.vue`:删除搜索栏 dataSource 下拉、删除 `data_source` 字典引用、删除 queryParams.dataSource - `types.ts`:删除 CourseQuery.dataSource 字段 - `form.vue`:保留 dataSource 字段和 `data_source` 字典(表单仍需要) - 操作列的 lockRule 判断逻辑(v-if="scope.row.dataSource != '1'")保持不变 ## dataSource 字段 inForm=false 更新 - 用户确认:dataSource 不需要在表单中录入和显示,默认值由后台处理 - 需求文档:`dataSource.inForm=false`/`inAdd=false`/`inEdit=false`,删除 `required`/`dictType`/`component` - 前端代码变更: - `form.vue`:删除 dataSource 表单项、删除 data_source 字典引用、删除 formData.dataSource、删除 formRules.dataSource - `types.ts`:CourseForm 中删除 dataSource 字段(CourseVO 保留,供列表页操作列判断) - 前端技能模板更新: - `SKILL.md`:types.ts 映射增加 lockRule 注释、注意事项第6条 - `references/vue-style.md`:操作列增加 lockRule 注释示例 + 新增完整的 lockRule 规范章节