zlwu 1 år sedan
förälder
incheckning
49a16d130e

+ 8 - 0
backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgHygieneCheckViolationService.java

@@ -82,4 +82,12 @@ public interface IXgHygieneCheckViolationService {
      */
     List<XgHygieneCheckViolationVo> queryByHygieneCheckId(Long hygieneCheckId);
 
+    /**
+     * 根据卫生检查ID删除违纪关联记录
+     *
+     * @param hygieneCheckId 卫生检查ID
+     * @return 是否删除成功
+     */
+    Boolean deleteByHygieneCheckId(Long hygieneCheckId);
+
 }

+ 46 - 2
backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormHygieneCheckServiceImpl.java

@@ -25,6 +25,7 @@ import org.dromara.xg.mapper.XgDormHygieneStudentScoreMapper;
 import org.dromara.xg.service.IXgDormHygieneCheckService;
 import org.dromara.xg.service.IXgStudentMsgService;
 import org.dromara.xg.service.IXgHygieneCheckViolationService;
+import org.dromara.xg.service.IXgDormHygieneStudentScoreService;
 import org.dromara.xg.mapper.XgHygieneCheckViolationMapper;
 import org.dromara.system.service.ISysDictDataService;
 import org.springframework.context.ApplicationContext;
@@ -57,6 +58,7 @@ public class XgDormHygieneCheckServiceImpl implements IXgDormHygieneCheckService
     private final IXgStudentMsgService xgStudentMsgService;
     private final ISysDictDataService sysDictDataService;
     private final IXgHygieneCheckViolationService violationService;
+    private final IXgDormHygieneStudentScoreService studentScoreService;
     private final XgHygieneCheckViolationMapper violationMapper;
     private final ApplicationContext applicationContext;
 
@@ -170,18 +172,60 @@ public class XgDormHygieneCheckServiceImpl implements IXgDormHygieneCheckService
     }
 
     /**
-     * 校验并批量删除宿舍卫生检查信息
+     * 校验并批量删除宿舍卫生检查信息(级联删除四个表)
      *
      * @param ids     待删除的主键集合
      * @param isValid 是否进行有效性校验
      * @return 是否删除成功
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
         if (isValid) {
             // TODO 做一些业务上的校验,判断是否需要校验
         }
-        return baseMapper.deleteByIds(ids) > 0;
+
+        try {
+            // 逐个处理每个卫生检查记录的级联删除
+            for (Long checkId : ids) {
+                log.info("开始级联删除宿舍卫生检查记录,检查ID: {}", checkId);
+
+                // 1. 查询并删除关联的违纪记录
+                List<XgHygieneCheckViolationVo> violations = violationService.queryByHygieneCheckId(checkId);
+                if (!violations.isEmpty()) {
+                    log.info("发现 {} 条违纪关联记录需要删除,检查ID: {}", violations.size(), checkId);
+
+                    // 1.1 删除统一违纪记录 (xskh_discipline_record)
+                    for (XgHygieneCheckViolationVo violation : violations) {
+                        if (violation.getDisciplineRecordId() != null) {
+                            deleteDisciplineRecord(violation.getDisciplineRecordId());
+                        }
+                    }
+
+                    // 1.2 删除违纪关联记录 (xg_hygiene_check_violation)
+                    violationService.deleteByHygieneCheckId(checkId);
+                    log.info("删除违纪关联记录完成,检查ID: {}", checkId);
+                }
+
+                // 2. 删除学生评分记录 (xg_dorm_hygiene_student_score)
+                Boolean studentScoreDeleted = studentScoreService.deleteByHygieneCheckId(checkId);
+                if (studentScoreDeleted) {
+                    log.info("删除学生评分记录完成,检查ID: {}", checkId);
+                }
+            }
+
+            // 3. 删除主检查记录 (xg_dorm_hygiene_check)
+            Boolean mainDeleted = baseMapper.deleteByIds(ids) > 0;
+            if (mainDeleted) {
+                log.info("删除宿舍卫生检查主记录完成,删除数量: {}", ids.size());
+            }
+
+            return mainDeleted;
+
+        } catch (Exception e) {
+            log.error("级联删除宿舍卫生检查记录失败,检查IDs: {}, 错误: {}", ids, e.getMessage(), e);
+            throw new RuntimeException("删除宿舍卫生检查记录失败: " + e.getMessage(), e);
+        }
     }
 
     /**

+ 13 - 0
backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgHygieneCheckViolationServiceImpl.java

@@ -177,4 +177,17 @@ public class XgHygieneCheckViolationServiceImpl implements IXgHygieneCheckViolat
         lqw.eq(XgHygieneCheckViolation::getHygieneCheckId, hygieneCheckId);
         return baseMapper.selectVoList(lqw);
     }
+
+    /**
+     * 根据卫生检查ID删除违纪关联记录
+     *
+     * @param hygieneCheckId 卫生检查ID
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteByHygieneCheckId(Long hygieneCheckId) {
+        LambdaQueryWrapper<XgHygieneCheckViolation> lqw = Wrappers.lambdaQuery();
+        lqw.eq(XgHygieneCheckViolation::getHygieneCheckId, hygieneCheckId);
+        return baseMapper.delete(lqw) > 0;
+    }
 }

+ 69 - 0
docs/开发文档/API/宿舍卫生检查管理API.md

@@ -329,6 +329,75 @@ public interface DormHygieneStudentScoreMapper extends BaseMapperPlus<DormHygien
 3. 学生数据变更:测试学生数据的增删改
 4. 历史数据:验证历史数据保留
 
+### 3. 删除宿舍卫生检查(四表级联删除)
+
+**接口地址:** `DELETE /dormHygieneCheck/dormHygieneCheck/{ids}`
+
+**接口描述:** 删除宿舍卫生检查记录,自动级联删除四个相关表的数据
+
+**涉及表结构:**
+1. `xg_dorm_hygiene_check` - 宿舍卫生检查主表
+2. `xg_dorm_hygiene_student_score` - 学生卫生评分表
+3. `xg_hygiene_check_violation` - 卫生检查违纪关联表
+4. `xskh_discipline_record` - 学生违纪处分记录表(统一违纪表)
+
+**请求参数:**
+- `ids`: 待删除的检查记录ID,支持单个或多个,用逗号分隔
+
+**请求示例:**
+```http
+DELETE /dormHygieneCheck/dormHygieneCheck/1
+DELETE /dormHygieneCheck/dormHygieneCheck/1,2,3
+```
+
+**删除逻辑顺序:**
+1. **查询关联违纪记录** - 根据检查ID查询 `xg_hygiene_check_violation` 表
+2. **删除统一违纪记录** - 逻辑删除 `xskh_discipline_record` 表中的违纪处分记录
+3. **删除违纪关联记录** - 逻辑删除 `xg_hygiene_check_violation` 表中的关联记录
+4. **删除学生评分记录** - 逻辑删除 `xg_dorm_hygiene_student_score` 表中的评分记录
+5. **删除主检查记录** - 逻辑删除 `xg_dorm_hygiene_check` 主表记录
+
+**技术实现要点:**
+- ✅ **事务管理**: 使用 `@Transactional` 确保四表删除的原子性
+- ✅ **逻辑删除**: 所有表都使用逻辑删除(`deleted = 1`),不物理删除数据
+- ✅ **跨模块调用**: 通过反射动态调用学生考核管理模块的删除方法
+- ✅ **异常处理**: 优雅处理学生考核管理模块未启用的情况
+- ✅ **日志记录**: 详细记录每个步骤的删除过程和结果
+
+**响应格式:**
+```json
+{
+  "code": 200,
+  "msg": "删除成功",
+  "data": null
+}
+```
+
+**错误响应:**
+```json
+{
+  "code": 500,
+  "msg": "删除宿舍卫生检查记录失败: 具体错误信息",
+  "data": null
+}
+```
+
+**权限要求:**
+- 需要 `dormHygieneCheck:dormHygieneCheck:remove` 权限
+
+**注意事项:**
+1. **数据完整性**: 删除操作会级联删除所有相关数据,请谨慎操作
+2. **跨模块依赖**: 需要确保学生考核管理模块(xskh)正常运行
+3. **事务回滚**: 任何一个表删除失败都会导致整个操作回滚
+4. **日志追踪**: 所有删除操作都有详细日志记录,便于问题排查
+
+### 删除测试
+1. **正常删除**: 删除存在关联数据的检查记录
+2. **级联验证**: 验证四个表的数据都已正确删除
+3. **事务测试**: 测试删除过程中的异常回滚
+4. **权限测试**: 测试不同用户的删除权限
+5. **跨模块测试**: 测试学生考核管理模块未启用时的降级处理
+
 ---
 
 **文档版本:** v1.0