# 2026-04-20 工作日志 ## 后端代码生成模板修正 ### 问题 用户反馈代码生成模板文件不对,对照 `ruoyi-backstage/basics/PtParameter` 实际代码分析发现多处差异。 ### 修正内容 **模板文件修正(3个):** 1. **ServiceImpl.java.template** — 最大改动 - ❌ 旧:`baseMapper.selectVoList(bo)` / `baseMapper.selectVoPageList(bo, pageQuery)` — 编译不通过的方法签名 - ✅ 新:`LambdaQueryWrapper` + `buildQueryWrapper` 私有方法 - 新增 `validEntityBeforeSave` 保存前校验方法 - `insertByBo` 增加主键回填 + `Objects.requireNonNull` 校验 - `updateByBo` 增加 null 检查 + `validEntityBeforeSave` - `deleteWithValidByIds` 增加 `isValid` 校验预留位置 - 分页查询默认 `orderByDesc(createTime)` - 新增模板变量 `${queryWrapperConditions}` 和 `${PkCapField}` 2. **Mapper.java.template** — 删除多余的 `Bo` import(Mapper 不需要引入 Bo) 3. **Service.java.template** — 删除多余的 `Domain` import(Service 接口不引入实体类) **已生成代码修正(3个 ServiceImpl + 3个 Service 接口 + 3个 Mapper):** - `EcsTermServiceImpl` — 完整 CRUD + buildQueryWrapper(termName like, termNumb like, termType eq, roomId eq) - `EcsAttendServiceImpl` — 完整 CRUD + 保留手工考勤特殊逻辑 + buildQueryWrapper - `EcsSectionServiceImpl` — 完整 CRUD + buildQueryWrapper(含日期范围查询) - `IEcsAttendService` — 补充 updateByBo / deleteWithValidByIds 接口 - `IEcsSectionService` — 补充 insertByBo / updateByBo / deleteWithValidByIds 接口 - 3个 Mapper 文件删除多余 Bo import **SKILL.md 更新:** - 新增「模板变量说明」表格 - 新增「ServiceImpl 查询规范」章节,明确 LambdaQueryWrapper 模式 **MEMORY.md 更新:** - 新增 ServiceImpl 查询规范和模板变量说明 ## 前端代码生成 — ECS 课表管理(/dev ecs section --frontend-only) ### 需求特点 - 只读模式:无新增/编辑/删除,只有列表查询和导出 - lockRule:dataSource=1 时禁止编辑删除(当前接口无编辑删除,预留) - 日期范围查询:courseDate 支持 between 查询 - 字典字段:`ecs_time_slot`(上课时段) ### 生成文件 | 文件 | 路径 | 说明 | |------|------|------| | types.ts | `src/api/ecs/section/types.ts` | VO/Query 类型定义 | | index.ts | `src/api/ecs/section/index.ts` | 仅 listSection + getSection | | index.vue | `src/views/ecs/section/index.vue` | 列表页(搜索+表格+导出,无增删改form) | ### 设计要点 - 无 form.vue(只读模式不需要表单页) - 学期字典前端本地定义(非系统字典),`ecs_time_slot` 使用 useDict - 星期使用前端映射表 weekdayMap 转换显示 - 日期范围使用 el-date-picker type="daterange",查询时拆分为 courseDateBegin/courseDateEnd - 是否考勤使用 el-tag 标签展示 - 默认隐藏低频列(连课节次/占用节次/占用列表/开始时间/结束时间) ## 前端代码生成 — ECS 设备管理(/dev ecs term --frontend-only) ### 需求特点 - 完整 CRUD:新增/编辑/删除/导入/导出 - 字典字段:`term_type`(设备类型)、`term_brand`(设备品牌) - 教室关联选择:通过弹窗选择教室,选择后回填 roomId 和 roomName - 管理密码:不在列表显示,不在 Excel 导出,仅在表单中可编辑(show-password) - 双列表单布局:el-row + el-col :span="12" 排列 ### 生成文件 | 文件 | 路径 | 说明 | |------|------|------| | types.ts | `src/api/ecs/term/types.ts` | VO/Form/Query 类型定义 | | index.ts | `src/api/ecs/term/index.ts` | 完整 CRUD API | | index.vue | `src/views/ecs/term/index.vue` | 列表页(搜索+表格+增删改+导入导出) | | form.vue | `src/views/ecs/term/form.vue` | 表单页(双列布局+教室选择弹窗) | ### 设计要点 - 列表页使用 `min-width` 替代 `width`(遵循前端表格列宽规范) - 教室选择:点击输入框弹窗 → `listClassroom` 分页查询 → 单选高亮 → 确认回填 roomId/roomName - 新增时字典字段(termType)默认选中第一个选项 - form.vue 使用双列布局提升空间利用率 - 操作列固定 `width="120"`(包含编辑+删除两个按钮) ### 修正记录 - ClassroomVO 主键是 `roomId`(非 `ptRoomId`),已修正 form.vue 中的教室选择确认逻辑 - ClassroomVO 无 `floorName` 字段,教室选择表格改为 roomCode 列 ## 前端代码生成 — ECS 考勤管理(/dev ecs attend --frontend-only) ### 需求特点 - 只读模式 + 手工考勤补签:无编辑/删除/导入,仅新增(手工考勤)+导出 - 级联选择:教室(弹窗选择)→ 班级(下拉)→ 学员(下拉,依赖班级过滤) - 字典字段:`check_type`(考勤方式)、`push_status`(推送状态) - 冗余回填:选择学员后自动回填 realName/userNumb,选择班级后回填 className ### 生成文件 | 文件 | 路径 | 说明 | |------|------|------| | types.ts | `src/api/ecs/attend/types.ts` | AttendVO / AttendForm / AttendQuery 类型定义 | | index.ts | `src/api/ecs/attend/index.ts` | listAttend / getAttend / addAttend(无 update/del) | | index.vue | `src/views/ecs/attend/index.vue` | 列表页(搜索+表格+手工考勤按钮+导出) | | form.vue | `src/views/ecs/attend/form.vue` | 手工考勤表单(级联选择+教室弹窗) | ### 设计要点 - 列表页无 selection 列、无编辑/删除/导入按钮,仅「手工考勤」和「导出」 - form.vue 核心逻辑:教室(弹窗选择,同 term)→ 班级(getClassOptions 下拉)→ 学员(listTrainee 按 deptId 过滤,级联清空) - 选班级后自动清空已选学员并重新加载学员列表 - 选学员后自动回填 realName 和 userNumb - 考勤方式默认选中字典第一项,考勤时间默认当前时间 - 推送状态列使用 dict-tag 组件展示 ## 字典字段类型规范 — 全局更新 ### 规范内容 数据字典(dictType)对应的数据库表字段类型为 `varchar(16)`,Java 实体/Bo/Vo 中对应类型为 `String`(而非 `Integer`)。字典值虽然常为数字,但存储和传输统一使用字符串。 ### 更新文件 | 文件 | 更新内容 | |------|----------| | MEMORY.md | 技术规范新增「字典字段类型规范」条目 | | require/SKILL.md | 字段解析规则:`fieldType=Integer` → `fieldType=String`(4处);字段类型映射表新增 `String(字典字段)` 行 `varchar(16)`;DDL生成逻辑新增字典字段说明 | | ruoyi-backend/SKILL.md | A.5 映射表新增字典字段行 `private String xxxType`;注意事项新增第7条;buildQueryWrapper 规则拆分出字典字段的 `StringUtils.isNotBlank` 判断 | | ykt-web-dev/SKILL.md | A.4.1 类型定义注释中标注字典字段类型;注意事项新增第10条 | ## 主键不导出 Excel — 规范更新 ### 规范内容 主键字段(Long 类型)不加 `@ExcelProperty` 注解,不参与 Excel 导出。Vo 中主键仅作为标识字段,需求文档中主键默认 `excelExport: false`。 ### 更新文件 | 文件 | 更新内容 | |------|----------| | Vo.java.template | 去掉主键字段的 `@ExcelProperty(value = "${pkComment}")` 注解 | | ruoyi-backend/SKILL.md | A.5 映射表主键行:`@ExcelProperty("ID")` → `不导出`;注意事项新增第8条 | | require/references/requirements-template.md | 主键字段模板增加 `excelExport: false` | | require/SKILL.md | 字段生成规则主键增加 `excelExport=false`;注意事项新增第9条 | | MEMORY.md | 技术规范新增「主键不导出 Excel」条目 | ## 日期类型规范修正:LocalDateTime → Date ### 规范内容 日期和时间字段 Java 类型统一使用 `java.util.Date`(而非 `LocalDateTime`),与 BaseEntity 基类保持一致。ServiceImpl 中使用 `new Date()` 而非 `LocalDateTime.now()`。 ### 更新文件 | 文件 | 更新内容 | |------|----------| | EcsAttend.java / Bo / Vo | `LocalDateTime` → `Date`(checkTime/uploadTime/pushTime) | | EcsAttendServiceImpl.java | `LocalDateTime.now()` → `new Date()`,import 改为 `java.util.Date` | | EcsSection.java / Bo / Vo | `LocalDateTime` → `Date`(courseDate/startTime/endTime + 范围字段) | | EcsCourseVo.java | `createTime` 从 `LocalDateTime` → `Date`,删除多余 import | | EcsCourseTeacherVo.java | `createTime` 从 `LocalDateTime` → `Date`,删除多余 import | | EcsTermVo.java | 删除多余的 `import java.time.LocalDateTime` | | require/SKILL.md | 日期映射 `fieldType=LocalDateTime` → `Date`;通用字段表 `LocalDateTime` → `Date`;字段类型映射表 `LocalDateTime` → `Date` | | ruoyi-backend/SKILL.md | A.5 映射表新增 `fieldType=Date` 行 | | 4个需求文档(term/attend/section/course) | 所有 `LocalDateTime` → `Date` | | MEMORY.md | 新增「日期类型规范」条目 |