Files
hzdyjs/docs/变更管理/code-adjust-record-2025-07-23-wuzilong.md
T
2025-07-23 20:42:31 +08:00

14 KiB
Raw Blame History

代码调整记录

2025-07-23 14:30:00 - 修复XgSysDept实体类表名配置

修复问题

问题描述

在班级信息管理模块中,XgClassMsgServiceImpl.insertByBo() 方法中插入部门信息时报错,系统尝试向 hzdyjs_xg.xg_sys_dept 表插入数据,但实际上正确的表名应该是 hzdyjs_xg.sys_dept。

问题原因

XgSysDept 实体类没有添加 @TableName 注解来明确指定表名,导致MyBatis-Plus默认按照类名生成表名(类名为 XgSysDept,生成的表名为 xg_sys_dept)。

解决方案

在 XgSysDept 实体类上添加 @TableName("sys_dept") 注解,指定正确的数据库表名。

@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@TableName("sys_dept")
public class XgSysDept extends BaseEntity {
    // 类定义内容
}

修改文件

  • /Users/wuzilong/work/00code/hzdyjs_xg/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgSysDept.java

测试验证

  • 重新构建项目,确认编译通过
  • 测试班级创建功能,确认部门信息成功插入到 sys_dept 表

经验教训与最佳实践

  1. 所有实体类应该明确使用 @TableName 注解指定表名,即使表名遵循了默认命名规则
  2. 跨模块使用表时(如 xg 模块使用 system 模块的表),尤其需要注意正确指定表名
  3. 命名规范:尽量保持类名与表名的对应关系,避免混淆

后续优化建议

  • 考虑将系统表的操作封装在原模块中,通过服务调用而非直接数据库操作来管理数据
  • 完善单元测试,覆盖跨模块表操作的场景

2025-07-23 16:15:20 - 修改班级信息时同步更新部门表数据

修复问题

问题描述

在班级信息管理模块中,使用XgClassMsgServiceImpl.updateByBo()方法修改班级信息时,只更新了班级表(xg_class_msg)中的数据,没有同步更新系统部门表(sys_dept)中对应的部门信息,导致班级信息与部门信息不一致。

问题原因

updateByBo()方法原先的实现只关注了xg_class_msg表的更新,而忽略了在创建班级时同时创建的部门信息的维护。当班级信息(如班级名称、负责人、联系方式等)发生变化时,应同步更新对应的部门信息。

解决方案

修改XgClassMsgServiceImpl.updateByBo()方法,在更新班级信息成功后,同步更新sys_dept表中对应的部门信息:

  1. 使用班级ID查询对应的部门信息
  2. 如果部门存在,则更新部门信息:
    • 更新部门名称为班级名称
    • 如果专业(父部门)发生变化,更新部门的父部门ID和祖级列表
    • 更新部门的联系电话和邮箱
    • 更新部门负责人为班主任
  3. 如果部门不存在(异常情况),则创建新的部门记录
@Override
public Boolean updateByBo(XgClassMsgBo bo) {
    XgClassMsg update = MapstructUtils.convert(bo, XgClassMsg.class);
    validEntityBeforeSave(update);
    boolean result = baseMapper.updateById(update) > 0;
    
    // 更新成功后,同步更新部门表信息
    if (result) {
        // 查询部门信息
        XgSysDept dept = deptMapper.selectById(update.getId());
        if (dept != null) {
            // 更新部门基本信息
            dept.setDeptName(update.getClassName()); // 使用班级名称作为部门名称
            
            // 如果班级的父部门(专业)发生变化,需要更新祖级列表
            if (!dept.getParentId().equals(update.getMajorId())) {
                dept.setParentId(update.getMajorId()); // 设置新的父部门ID
                
                // 查询父部门信息,构建新的祖级列表
                XgSysDept parentDept = deptMapper.selectById(update.getMajorId());
                if (parentDept != null) {
                    dept.setAncestors(parentDept.getAncestors() + "," + parentDept.getDeptId());
                }
            }
            
            // 更新联系信息
            dept.setPhone(update.getContactPhone());
            dept.setEmail(update.getEmail());
            
            // 更新负责人(班主任)
            if (update.getClassTeacherId() != null && StringUtils.isNotEmpty(update.getClassTeacherName())) {
                dept.setLeader(update.getClassTeacherName());
            }
            
            // 更新部门表
            deptMapper.updateById(dept);
            log.info("成功更新班级对应的部门信息,班级ID:{},部门ID:{}", update.getId(), dept.getDeptId());
        } else {
            // 如果部门不存在,则创建新的部门记录
            // 处理异常情况的代码...
        }
    }
    
    return result;
}

修改文件

  • /Users/wuzilong/work/00code/hzdyjs_xg/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgClassMsgServiceImpl.java

测试验证

  • 修改班级名称,验证对应部门名称是否同步更新
  • 修改班级所属专业,验证部门的父部门ID和祖级列表是否正确更新
  • 修改班主任信息,验证部门负责人是否同步更新
  • 修改班级联系方式,验证部门联系电话和邮箱是否同步更新
  • 测试边界情况:当班级存在但对应部门不存在时,是否正确创建部门信息

经验教训与最佳实践

  1. 在涉及多表关联的业务逻辑中,修改主表数据时应考虑同步更新关联表数据
  2. 对于班级-部门这类一一对应的数据,应保持其信息的一致性
  3. 在更新关联表数据时,需要特别注意树形结构数据(如部门的祖级列表)的正确维护
  4. 使用日志记录重要操作,便于问题排查

后续优化建议

  • 考虑将班级-部门的同步逻辑封装到单独的方法中,提高代码复用性
  • 在业务层面明确规定班级表与部门表的关联关系,避免数据不一致
  • 对班级-部门同步逻辑添加单元测试,确保逻辑的正确性和稳定性

2025-07-23 16:35:10 - 修复XgSysDept类中leader字段类型

修复问题

问题描述

在修改班级信息同步更新部门表时发现,XgSysDept类中的leader字段类型为String,而实际数据库表sys_dept中对应的字段类型为bigint(20)。在系统标准实现中,SysDept类的leader字段类型为Long,与数据库类型对应,导致无法正确保存班主任ID信息。

问题原因

XgSysDept类的定义与标准SysDept类不一致,可能是在创建类时误将leader字段定义为String类型。实际上,leader字段应该存储的是用户的ID(Long类型),而不是姓名(String类型)。

解决方案

修改XgSysDept类中leader字段的类型,从String改为Long,与标准SysDept类保持一致。

/**
 * 负责人
 */
private Long leader;

修改文件

  • /Users/wuzilong/work/00code/hzdyjs_xg/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgSysDept.java

测试验证

  • 确认XgSysDept类能够正确编译
  • 验证修改班级信息时,能够正确同步更新部门表中的负责人ID
  • 检查数据库中班级对应的部门记录,确认leader字段值为班主任的用户ID

经验教训与最佳实践

  1. 创建实体类时,应确保字段类型与数据库表定义一致
  2. 使用跨模块的数据库表时,应参考原模块的实体类定义,确保字段定义一致
  3. 关联字段(如leader对应用户ID)应使用对应的数据类型(Long),而不是展示值的类型(String)

后续优化建议

  • 考虑使用代码生成工具生成实体类,确保字段类型与数据库一致
  • 添加字段校验逻辑,确保插入数据库前数据类型正确
  • 统一各模块中对同一数据库表的实体类定义,避免不一致

2025-07-23 16:45:30 - 修复班级删除时未同步删除部门的问题

修复问题

问题描述

在班级信息管理模块中,使用XgClassMsgServiceImpl.deleteWithValidByIds()方法删除班级信息时,只删除了班级表(xg_class_msg)中的数据,没有同步标记系统部门表(sys_dept)中对应的部门记录为删除状态,导致部门信息残留。

问题原因

deleteWithValidByIds()方法原先的实现只关注了xg_class_msg表的删除,而忽略了在班级删除时同步处理部门信息。这导致班级被删除后,对应的部门记录仍然存在于系统中。

解决方案

修改XgClassMsgServiceImpl.deleteWithValidByIds()方法,在删除班级信息之前,先将对应的部门记录标记为删除状态:

@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
    if (isValid) {
        // TODO 做一些业务上的校验,判断是否需要校验
    }
    
    // 删除班级的同时,标记对应的部门为删除状态
    for (Long id : ids) {
        XgSysDept dept = deptMapper.selectById(id);
        if (dept != null) {
            dept.setDelFlag("1"); // 设置删除标志(1代表删除)
            deptMapper.updateById(dept);
            log.info("成功标记班级对应的部门为删除状态,班级ID:{},部门ID:{}", id, dept.getDeptId());
        }
    }
    
    return baseMapper.deleteByIds(ids) > 0;
}

修改文件

  • /Users/wuzilong/work/00code/hzdyjs_xg/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgClassMsgServiceImpl.java

测试验证

  • 删除班级信息,验证对应的部门记录是否被标记为删除状态
  • 检查系统部门树中,确认已删除班级对应的部门不再显示
  • 测试批量删除多个班级,确认所有对应的部门都被正确标记为删除状态

经验教训与最佳实践

  1. 在涉及多表关联的业务逻辑中,删除主表数据时应考虑同步处理关联表数据
  2. 使用逻辑删除而非物理删除,保留数据完整性和可恢复性
  3. 同步操作应添加日志记录,便于问题排查

后续优化建议

  • 考虑使用事务确保班级删除和部门标记删除的原子性
  • 完善校验逻辑,检查部门是否有关联的用户、角色等数据,避免删除带来的数据不一致
  • 添加数据恢复功能,支持恢复误删的班级及其对应的部门信息

2025-07-23 16:55:15 - 为班级信息管理相关方法添加事务注解

优化内容

优化描述

为XgClassMsgServiceImpl类的insertByBo、updateByBo和deleteWithValidByIds方法添加@Transactional事务注解,确保班级信息和部门信息的同步操作在一个事务中执行,保证数据一致性。

优化原因

班级信息管理涉及班级表(xg_class_msg)和部门表(sys_dept)的同步操作,需要确保这些操作要么全部成功,要么全部失败,避免出现班级信息与部门信息不一致的情况。

实现方案

在相关方法上添加@Transactional(rollbackFor = Exception.class)注解,指定任何异常都会触发事务回滚:

/**
 * 新增班级信息-新版
 */
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(XgClassMsgBo bo) {
    // 方法实现...
}

/**
 * 修改班级信息-新版
 */
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateByBo(XgClassMsgBo bo) {
    // 方法实现...
}

/**
 * 校验并批量删除班级信息-新版信息
 */
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
    // 方法实现...
}

修改文件

  • /Users/wuzilong/work/00code/hzdyjs_xg/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgClassMsgServiceImpl.java

测试验证

  • 新增班级时,如果部门信息创建失败,验证班级信息是否也回滚
  • 修改班级时,如果部门信息更新失败,验证班级信息是否也回滚
  • 删除班级时,如果部门标记删除失败,验证班级信息是否也回滚

最佳实践

  1. 在涉及多表操作的业务方法上使用@Transactional注解
  2. 指定rollbackFor = Exception.class确保任何异常都触发回滚
  3. 确保事务覆盖所有需要保持一致性的数据库操作

后续优化建议

  • 考虑调整事务隔离级别,根据具体业务需求选择合适的隔离级别
  • 监控事务执行情况,确保事务不会因为执行时间过长而影响系统性能
  • 针对事务操作添加专门的单元测试,验证事务回滚功能

班级信息模块代码变更记录

修复时间:2025-07-23 16:45:30

修复问题:XgSysDeptMapper updateById方法未找到导致的班级信息删除错误

错误信息

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): org.dromara.xg.mapper.XgSysDeptMapper.updateById

问题分析

在 XgClassMsgServiceImpl 类的 deleteWithValidByIds 方法中,通过 deptMapper.updateById(dept) 调用来更新部门信息的删除标志,但是由于 XgSysDeptMapper 接口继承的是 BaseMapperPlus<XgSysDept, XgSysDeptVo> 而不是直接的 BaseMapper<XgSysDept>,虽然 BaseMapperPlus 也继承了 BaseMapper,但是可能由于MyBatis的配置问题,找不到 updateById 方法的实现。

解决方案

使用 update 方法配合 LambdaQueryWrapper 替代 updateById 方法,具体如下:

  1. 将 deptMapper.updateById(dept) 替换为:
LambdaQueryWrapper<XgSysDept> deleteUpdateWrapper = Wrappers.lambdaQuery();
deleteUpdateWrapper.eq(XgSysDept::getDeptId, dept.getDeptId());
deptMapper.update(dept, deleteUpdateWrapper);
  1. 同时修复了 updateByBo 方法中类似的问题。

修改文件

  • /Users/wuzilong/work/00code/hzdyjs_xg/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgClassMsgServiceImpl.java

修改人员

  • wuzilong