提交代码
This commit is contained in:
1 parent
8e1c094d6e
commit
788daa3638
16 files changed
+1462
-56
No files matched your search
+25
-4
@@ -19,6 +19,7 @@ import org.dromara.common.log.enums.BusinessType;
|
|||||||
import org.dromara.common.excel.utils.ExcelUtil;
|
import org.dromara.common.excel.utils.ExcelUtil;
|
||||||
import org.dromara.xg.domain.vo.XgDormHygieneCheckVo;
|
import org.dromara.xg.domain.vo.XgDormHygieneCheckVo;
|
||||||
import org.dromara.xg.domain.bo.XgDormHygieneCheckBo;
|
import org.dromara.xg.domain.bo.XgDormHygieneCheckBo;
|
||||||
|
import org.dromara.xg.domain.bo.XgDormHygieneCheckCompleteBo;
|
||||||
import org.dromara.xg.service.IXgDormHygieneCheckService;
|
import org.dromara.xg.service.IXgDormHygieneCheckService;
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
|
|
||||||
@@ -63,8 +64,7 @@ public class XgDormHygieneCheckController extends BaseController {
|
|||||||
*/
|
*/
|
||||||
@SaCheckPermission("dormHygieneCheck:dormHygieneCheck:query")
|
@SaCheckPermission("dormHygieneCheck:dormHygieneCheck:query")
|
||||||
@GetMapping("/{id}")
|
@GetMapping("/{id}")
|
||||||
public R<XgDormHygieneCheckVo> getInfo(@NotNull(message = "主键不能为空")
|
public R<XgDormHygieneCheckVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
|
||||||
@PathVariable Long id) {
|
|
||||||
return R.ok(xgDormHygieneCheckService.queryById(id));
|
return R.ok(xgDormHygieneCheckService.queryById(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,6 +79,17 @@ public class XgDormHygieneCheckController extends BaseController {
|
|||||||
return toAjax(xgDormHygieneCheckService.insertByBo(bo));
|
return toAjax(xgDormHygieneCheckService.insertByBo(bo));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增宿舍卫生检查(包含学生评分数据)
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("dormHygieneCheck:dormHygieneCheck:add")
|
||||||
|
@Log(title = "宿舍卫生检查", businessType = BusinessType.INSERT)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PostMapping("/addWithStudentScores")
|
||||||
|
public R<Void> addWithStudentScores(@Validated(AddGroup.class) @RequestBody XgDormHygieneCheckCompleteBo bo) {
|
||||||
|
return toAjax(xgDormHygieneCheckService.insertWithStudentScores(bo));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改宿舍卫生检查
|
* 修改宿舍卫生检查
|
||||||
*/
|
*/
|
||||||
@@ -90,6 +101,17 @@ public class XgDormHygieneCheckController extends BaseController {
|
|||||||
return toAjax(xgDormHygieneCheckService.updateByBo(bo));
|
return toAjax(xgDormHygieneCheckService.updateByBo(bo));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改宿舍卫生检查(包含学生评分数据)
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("dormHygieneCheck:dormHygieneCheck:edit")
|
||||||
|
@Log(title = "宿舍卫生检查", businessType = BusinessType.UPDATE)
|
||||||
|
@RepeatSubmit()
|
||||||
|
@PutMapping("/updateWithStudentScores")
|
||||||
|
public R<Void> updateWithStudentScores(@Validated(EditGroup.class) @RequestBody XgDormHygieneCheckCompleteBo bo) {
|
||||||
|
return toAjax(xgDormHygieneCheckService.updateWithStudentScores(bo));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除宿舍卫生检查
|
* 删除宿舍卫生检查
|
||||||
*
|
*
|
||||||
@@ -98,8 +120,7 @@ public class XgDormHygieneCheckController extends BaseController {
|
|||||||
@SaCheckPermission("dormHygieneCheck:dormHygieneCheck:remove")
|
@SaCheckPermission("dormHygieneCheck:dormHygieneCheck:remove")
|
||||||
@Log(title = "宿舍卫生检查", businessType = BusinessType.DELETE)
|
@Log(title = "宿舍卫生检查", businessType = BusinessType.DELETE)
|
||||||
@DeleteMapping("/{ids}")
|
@DeleteMapping("/{ids}")
|
||||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
|
||||||
@PathVariable Long[] ids) {
|
|
||||||
return toAjax(xgDormHygieneCheckService.deleteWithValidByIds(List.of(ids), true));
|
return toAjax(xgDormHygieneCheckService.deleteWithValidByIds(List.of(ids), true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+26
-4
@@ -63,8 +63,7 @@ public class XgDormHygieneStudentScoreController extends BaseController {
|
|||||||
*/
|
*/
|
||||||
@SaCheckPermission("dormHygieneStudentScore:dormHygieneStudentScore:query")
|
@SaCheckPermission("dormHygieneStudentScore:dormHygieneStudentScore:query")
|
||||||
@GetMapping("/{id}")
|
@GetMapping("/{id}")
|
||||||
public R<XgDormHygieneStudentScoreVo> getInfo(@NotNull(message = "主键不能为空")
|
public R<XgDormHygieneStudentScoreVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
|
||||||
@PathVariable Long id) {
|
|
||||||
return R.ok(xgDormHygieneStudentScoreService.queryById(id));
|
return R.ok(xgDormHygieneStudentScoreService.queryById(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,8 +97,31 @@ public class XgDormHygieneStudentScoreController extends BaseController {
|
|||||||
@SaCheckPermission("dormHygieneStudentScore:dormHygieneStudentScore:remove")
|
@SaCheckPermission("dormHygieneStudentScore:dormHygieneStudentScore:remove")
|
||||||
@Log(title = "宿舍卫生检查学生评分", businessType = BusinessType.DELETE)
|
@Log(title = "宿舍卫生检查学生评分", businessType = BusinessType.DELETE)
|
||||||
@DeleteMapping("/{ids}")
|
@DeleteMapping("/{ids}")
|
||||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
|
||||||
@PathVariable Long[] ids) {
|
|
||||||
return toAjax(xgDormHygieneStudentScoreService.deleteWithValidByIds(List.of(ids), true));
|
return toAjax(xgDormHygieneStudentScoreService.deleteWithValidByIds(List.of(ids), true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据卫生检查ID查询学生评分列表
|
||||||
|
*
|
||||||
|
* @param hygieneCheckId 卫生检查ID
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("dormHygieneStudentScore:dormHygieneStudentScore:query")
|
||||||
|
@GetMapping("/getByCheckId/{hygieneCheckId}")
|
||||||
|
public R<List<XgDormHygieneStudentScoreVo>> getByCheckId(
|
||||||
|
@NotNull(message = "卫生检查ID不能为空") @PathVariable Long hygieneCheckId) {
|
||||||
|
return R.ok(xgDormHygieneStudentScoreService.queryByHygieneCheckId(hygieneCheckId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除指定卫生检查的学生评分记录
|
||||||
|
*
|
||||||
|
* @param hygieneCheckId 卫生检查ID
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("dormHygieneStudentScore:dormHygieneStudentScore:remove")
|
||||||
|
@Log(title = "批量删除学生评分", businessType = BusinessType.DELETE)
|
||||||
|
@DeleteMapping("/deleteByCheckId/{hygieneCheckId}")
|
||||||
|
public R<Void> deleteByCheckId(@NotNull(message = "卫生检查ID不能为空") @PathVariable Long hygieneCheckId) {
|
||||||
|
return toAjax(xgDormHygieneStudentScoreService.deleteByHygieneCheckId(hygieneCheckId));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+1
-1
@@ -32,6 +32,7 @@ public class XgDormHygieneCheck extends TenantEntity {
|
|||||||
/**
|
/**
|
||||||
* 删除标志(0代表存在 1代表删除)
|
* 删除标志(0代表存在 1代表删除)
|
||||||
*/
|
*/
|
||||||
|
@TableLogic(value = "0", delval = "1")
|
||||||
private Long deleted;
|
private Long deleted;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -139,5 +140,4 @@ public class XgDormHygieneCheck extends TenantEntity {
|
|||||||
*/
|
*/
|
||||||
private String checkRemarks;
|
private String checkRemarks;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
+1
-1
@@ -30,6 +30,7 @@ public class XgDormHygieneStudentScore extends TenantEntity {
|
|||||||
/**
|
/**
|
||||||
* 删除标志(0代表存在 1代表删除)
|
* 删除标志(0代表存在 1代表删除)
|
||||||
*/
|
*/
|
||||||
|
@TableLogic(value = "0", delval = "1")
|
||||||
private Long deleted;
|
private Long deleted;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -122,5 +123,4 @@ public class XgDormHygieneStudentScore extends TenantEntity {
|
|||||||
*/
|
*/
|
||||||
private String improvementNotes;
|
private String improvementNotes;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
+169
@@ -0,0 +1,169 @@
|
|||||||
|
package org.dromara.xg.domain.bo;
|
||||||
|
|
||||||
|
import org.dromara.xg.domain.XgDormHygieneCheck;
|
||||||
|
import org.dromara.common.core.validate.AddGroup;
|
||||||
|
import org.dromara.common.core.validate.EditGroup;
|
||||||
|
import io.github.linpeilie.annotations.AutoMapper;
|
||||||
|
import lombok.Data;
|
||||||
|
import jakarta.validation.constraints.*;
|
||||||
|
import jakarta.validation.Valid;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Date;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 宿舍卫生检查完整表单业务对象(包含学生评分数据)
|
||||||
|
*
|
||||||
|
* @author zlwu
|
||||||
|
* @date 2025-01-28
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@AutoMapper(target = XgDormHygieneCheck.class, reverseConvertGenerate = false)
|
||||||
|
public class XgDormHygieneCheckCompleteBo {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键ID
|
||||||
|
*/
|
||||||
|
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除标志(0代表存在 1代表删除)
|
||||||
|
*/
|
||||||
|
private Long deleted;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查标题
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "检查标题不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||||
|
private String checkTitle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查日期
|
||||||
|
*/
|
||||||
|
@NotNull(message = "检查日期不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
private Date checkDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查员ID,关联sys_user.id
|
||||||
|
*/
|
||||||
|
@NotNull(message = "检查员ID不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||||
|
private Long checkerId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查员姓名
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "检查员姓名不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||||
|
private String checkerName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查类型(1日常检查 2专项检查 3突击检查 4复查)
|
||||||
|
*/
|
||||||
|
private String checkType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查级别(1宿管员 2学院 3学校)
|
||||||
|
*/
|
||||||
|
private String checkLevel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 宿舍房间ID,关联xg_dorm_room.id
|
||||||
|
*/
|
||||||
|
@NotNull(message = "宿舍房间ID不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||||
|
private Long roomId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 房间编号
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "房间编号不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||||
|
private String roomCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 房间名称
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "房间名称不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||||
|
private String roomName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 宿舍楼ID,关联xg_dorm_building.id
|
||||||
|
*/
|
||||||
|
@NotNull(message = "宿舍楼ID不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||||
|
private Long buildingId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 宿舍楼名称
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "宿舍楼名称不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||||
|
private String buildingName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 宿舍区ID,关联xg_dorm_area.id
|
||||||
|
*/
|
||||||
|
private Long areaId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 宿舍区名称
|
||||||
|
*/
|
||||||
|
private String areaName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校区ID,关联xg_dorm_campus.id
|
||||||
|
*/
|
||||||
|
private Long campusId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校区名称
|
||||||
|
*/
|
||||||
|
private String campusName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 宿舍总分(0-100分)
|
||||||
|
*/
|
||||||
|
@Min(value = 0, message = "宿舍总分不能小于0")
|
||||||
|
@Max(value = 100, message = "宿舍总分不能大于100")
|
||||||
|
private Double totalScore;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 卫生等级(A优秀 B良好 C合格 D不合格)
|
||||||
|
*/
|
||||||
|
private String hygieneGrade;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 附件OSS ID列表,逗号分隔
|
||||||
|
*/
|
||||||
|
private String attachmentIds;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查总结
|
||||||
|
*/
|
||||||
|
private String checkSummary;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 整改建议
|
||||||
|
*/
|
||||||
|
private String improvementSuggestions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查备注
|
||||||
|
*/
|
||||||
|
private String checkRemarks;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 学生评分数据列表
|
||||||
|
*/
|
||||||
|
@Valid
|
||||||
|
@NotEmpty(message = "学生评分数据不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||||
|
private List<XgDormHygieneStudentScoreBo> studentScores;
|
||||||
|
|
||||||
|
// 基础字段(用于VO类映射)
|
||||||
|
private Long createBy;
|
||||||
|
|
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
private Date createTime;
|
||||||
|
|
||||||
|
private Long updateBy;
|
||||||
|
|
||||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
private Date updateTime;
|
||||||
|
}
|
||||||
+2
-2
@@ -34,7 +34,8 @@ public class XgDormHygieneStudentScoreBo extends BaseEntity {
|
|||||||
/**
|
/**
|
||||||
* 卫生检查ID,关联xg_dorm_hygiene_check.id
|
* 卫生检查ID,关联xg_dorm_hygiene_check.id
|
||||||
*/
|
*/
|
||||||
@NotNull(message = "卫生检查ID,关联xg_dorm_hygiene_check.id不能为空", groups = { AddGroup.class, EditGroup.class })
|
// @NotNull(message = "卫生检查ID,关联xg_dorm_hygiene_check.id不能为空", groups = {
|
||||||
|
// EditGroup.class })
|
||||||
private Long hygieneCheckId;
|
private Long hygieneCheckId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -125,5 +126,4 @@ public class XgDormHygieneStudentScoreBo extends BaseEntity {
|
|||||||
*/
|
*/
|
||||||
private String improvementNotes;
|
private String improvementNotes;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
+17
@@ -2,6 +2,7 @@ package org.dromara.xg.service;
|
|||||||
|
|
||||||
import org.dromara.xg.domain.vo.XgDormHygieneCheckVo;
|
import org.dromara.xg.domain.vo.XgDormHygieneCheckVo;
|
||||||
import org.dromara.xg.domain.bo.XgDormHygieneCheckBo;
|
import org.dromara.xg.domain.bo.XgDormHygieneCheckBo;
|
||||||
|
import org.dromara.xg.domain.bo.XgDormHygieneCheckCompleteBo;
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
|
|
||||||
@@ -65,4 +66,20 @@ public interface IXgDormHygieneCheckService {
|
|||||||
* @return 是否删除成功
|
* @return 是否删除成功
|
||||||
*/
|
*/
|
||||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增宿舍卫生检查(包含学生评分数据)
|
||||||
|
*
|
||||||
|
* @param bo 完整的宿舍卫生检查数据,包含学生评分信息
|
||||||
|
* @return 是否新增成功
|
||||||
|
*/
|
||||||
|
Boolean insertWithStudentScores(XgDormHygieneCheckCompleteBo bo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改宿舍卫生检查(包含学生评分数据)
|
||||||
|
*
|
||||||
|
* @param bo 完整的宿舍卫生检查数据,包含学生评分信息
|
||||||
|
* @return 是否修改成功
|
||||||
|
*/
|
||||||
|
Boolean updateWithStudentScores(XgDormHygieneCheckCompleteBo bo);
|
||||||
}
|
}
|
||||||
+16
@@ -65,4 +65,20 @@ public interface IXgDormHygieneStudentScoreService {
|
|||||||
* @return 是否删除成功
|
* @return 是否删除成功
|
||||||
*/
|
*/
|
||||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据卫生检查ID查询学生评分列表
|
||||||
|
*
|
||||||
|
* @param hygieneCheckId 卫生检查ID
|
||||||
|
* @return 学生评分列表
|
||||||
|
*/
|
||||||
|
List<XgDormHygieneStudentScoreVo> queryByHygieneCheckId(Long hygieneCheckId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据卫生检查ID删除学生评分记录
|
||||||
|
*
|
||||||
|
* @param hygieneCheckId 卫生检查ID
|
||||||
|
* @return 是否删除成功
|
||||||
|
*/
|
||||||
|
Boolean deleteByHygieneCheckId(Long hygieneCheckId);
|
||||||
}
|
}
|
||||||
+201
-10
@@ -10,11 +10,17 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.dromara.xg.domain.bo.XgDormHygieneCheckBo;
|
import org.dromara.xg.domain.bo.XgDormHygieneCheckBo;
|
||||||
|
import org.dromara.xg.domain.bo.XgDormHygieneCheckCompleteBo;
|
||||||
|
import org.dromara.xg.domain.bo.XgDormHygieneStudentScoreBo;
|
||||||
import org.dromara.xg.domain.vo.XgDormHygieneCheckVo;
|
import org.dromara.xg.domain.vo.XgDormHygieneCheckVo;
|
||||||
import org.dromara.xg.domain.XgDormHygieneCheck;
|
import org.dromara.xg.domain.XgDormHygieneCheck;
|
||||||
|
import org.dromara.xg.domain.XgDormHygieneStudentScore;
|
||||||
import org.dromara.xg.mapper.XgDormHygieneCheckMapper;
|
import org.dromara.xg.mapper.XgDormHygieneCheckMapper;
|
||||||
|
import org.dromara.xg.mapper.XgDormHygieneStudentScoreMapper;
|
||||||
import org.dromara.xg.service.IXgDormHygieneCheckService;
|
import org.dromara.xg.service.IXgDormHygieneCheckService;
|
||||||
|
import org.dromara.xg.service.IXgStudentMsgService;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -32,6 +38,8 @@ import java.util.Collection;
|
|||||||
public class XgDormHygieneCheckServiceImpl implements IXgDormHygieneCheckService {
|
public class XgDormHygieneCheckServiceImpl implements IXgDormHygieneCheckService {
|
||||||
|
|
||||||
private final XgDormHygieneCheckMapper baseMapper;
|
private final XgDormHygieneCheckMapper baseMapper;
|
||||||
|
private final XgDormHygieneStudentScoreMapper studentScoreMapper;
|
||||||
|
private final IXgStudentMsgService xgStudentMsgService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询宿舍卫生检查
|
* 查询宿舍卫生检查
|
||||||
@@ -40,7 +48,7 @@ public class XgDormHygieneCheckServiceImpl implements IXgDormHygieneCheckService
|
|||||||
* @return 宿舍卫生检查
|
* @return 宿舍卫生检查
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public XgDormHygieneCheckVo queryById(Long id){
|
public XgDormHygieneCheckVo queryById(Long id) {
|
||||||
return baseMapper.selectVoById(id);
|
return baseMapper.selectVoById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,17 +93,22 @@ public class XgDormHygieneCheckServiceImpl implements IXgDormHygieneCheckService
|
|||||||
lqw.like(StringUtils.isNotBlank(bo.getRoomCode()), XgDormHygieneCheck::getRoomCode, bo.getRoomCode());
|
lqw.like(StringUtils.isNotBlank(bo.getRoomCode()), XgDormHygieneCheck::getRoomCode, bo.getRoomCode());
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getRoomName()), XgDormHygieneCheck::getRoomName, bo.getRoomName());
|
lqw.like(StringUtils.isNotBlank(bo.getRoomName()), XgDormHygieneCheck::getRoomName, bo.getRoomName());
|
||||||
lqw.eq(bo.getBuildingId() != null, XgDormHygieneCheck::getBuildingId, bo.getBuildingId());
|
lqw.eq(bo.getBuildingId() != null, XgDormHygieneCheck::getBuildingId, bo.getBuildingId());
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getBuildingName()), XgDormHygieneCheck::getBuildingName, bo.getBuildingName());
|
lqw.like(StringUtils.isNotBlank(bo.getBuildingName()), XgDormHygieneCheck::getBuildingName,
|
||||||
|
bo.getBuildingName());
|
||||||
lqw.eq(bo.getAreaId() != null, XgDormHygieneCheck::getAreaId, bo.getAreaId());
|
lqw.eq(bo.getAreaId() != null, XgDormHygieneCheck::getAreaId, bo.getAreaId());
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getAreaName()), XgDormHygieneCheck::getAreaName, bo.getAreaName());
|
lqw.like(StringUtils.isNotBlank(bo.getAreaName()), XgDormHygieneCheck::getAreaName, bo.getAreaName());
|
||||||
lqw.eq(bo.getCampusId() != null, XgDormHygieneCheck::getCampusId, bo.getCampusId());
|
lqw.eq(bo.getCampusId() != null, XgDormHygieneCheck::getCampusId, bo.getCampusId());
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getCampusName()), XgDormHygieneCheck::getCampusName, bo.getCampusName());
|
lqw.like(StringUtils.isNotBlank(bo.getCampusName()), XgDormHygieneCheck::getCampusName, bo.getCampusName());
|
||||||
lqw.eq(bo.getTotalScore() != null, XgDormHygieneCheck::getTotalScore, bo.getTotalScore());
|
lqw.eq(bo.getTotalScore() != null, XgDormHygieneCheck::getTotalScore, bo.getTotalScore());
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getHygieneGrade()), XgDormHygieneCheck::getHygieneGrade, bo.getHygieneGrade());
|
lqw.eq(StringUtils.isNotBlank(bo.getHygieneGrade()), XgDormHygieneCheck::getHygieneGrade, bo.getHygieneGrade());
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getAttachmentIds()), XgDormHygieneCheck::getAttachmentIds, bo.getAttachmentIds());
|
lqw.eq(StringUtils.isNotBlank(bo.getAttachmentIds()), XgDormHygieneCheck::getAttachmentIds,
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getCheckSummary()), XgDormHygieneCheck::getCheckSummary, bo.getCheckSummary());
|
bo.getAttachmentIds());
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getImprovementSuggestions()), XgDormHygieneCheck::getImprovementSuggestions, bo.getImprovementSuggestions());
|
lqw.like(StringUtils.isNotBlank(bo.getCheckSummary()), XgDormHygieneCheck::getCheckSummary,
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getCheckRemarks()), XgDormHygieneCheck::getCheckRemarks, bo.getCheckRemarks());
|
bo.getCheckSummary());
|
||||||
|
lqw.like(StringUtils.isNotBlank(bo.getImprovementSuggestions()), XgDormHygieneCheck::getImprovementSuggestions,
|
||||||
|
bo.getImprovementSuggestions());
|
||||||
|
lqw.like(StringUtils.isNotBlank(bo.getCheckRemarks()), XgDormHygieneCheck::getCheckRemarks,
|
||||||
|
bo.getCheckRemarks());
|
||||||
return lqw;
|
return lqw;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,8 +145,8 @@ public class XgDormHygieneCheckServiceImpl implements IXgDormHygieneCheckService
|
|||||||
/**
|
/**
|
||||||
* 保存前的数据校验
|
* 保存前的数据校验
|
||||||
*/
|
*/
|
||||||
private void validEntityBeforeSave(XgDormHygieneCheck entity){
|
private void validEntityBeforeSave(XgDormHygieneCheck entity) {
|
||||||
//TODO 做一些数据校验,如唯一约束
|
// TODO 做一些数据校验,如唯一约束
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -145,9 +158,187 @@ public class XgDormHygieneCheckServiceImpl implements IXgDormHygieneCheckService
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||||
if(isValid){
|
if (isValid) {
|
||||||
//TODO 做一些业务上的校验,判断是否需要校验
|
// TODO 做一些业务上的校验,判断是否需要校验
|
||||||
}
|
}
|
||||||
return baseMapper.deleteByIds(ids) > 0;
|
return baseMapper.deleteByIds(ids) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增宿舍卫生检查(包含学生评分数据)
|
||||||
|
*
|
||||||
|
* @param bo 完整的宿舍卫生检查数据,包含学生评分信息
|
||||||
|
* @return 是否新增成功
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public Boolean insertWithStudentScores(XgDormHygieneCheckCompleteBo bo) {
|
||||||
|
// 1. 转换并保存主表数据
|
||||||
|
XgDormHygieneCheck add = MapstructUtils.convert(bo, XgDormHygieneCheck.class);
|
||||||
|
validEntityBeforeSave(add);
|
||||||
|
boolean flag = baseMapper.insert(add) > 0;
|
||||||
|
log.info("add: {}", add);
|
||||||
|
log.info("bo: {}", bo);
|
||||||
|
log.info("flag: {}", flag);
|
||||||
|
|
||||||
|
if (flag && bo.getStudentScores() != null && !bo.getStudentScores().isEmpty()) {
|
||||||
|
// 2. 保存学生评分数据
|
||||||
|
for (XgDormHygieneStudentScoreBo studentScoreBo : bo.getStudentScores()) {
|
||||||
|
XgDormHygieneStudentScore studentScore = MapstructUtils.convert(studentScoreBo,
|
||||||
|
XgDormHygieneStudentScore.class);
|
||||||
|
studentScore.setHygieneCheckId(add.getId());
|
||||||
|
|
||||||
|
// 根据学生ID查询学生完整信息,补充学院、专业、班级信息
|
||||||
|
if (studentScoreBo.getStudentId() != null) {
|
||||||
|
try {
|
||||||
|
var studentInfo = xgStudentMsgService.queryById(studentScoreBo.getStudentId());
|
||||||
|
if (studentInfo != null) {
|
||||||
|
// 补充学院信息
|
||||||
|
if (studentScore.getCollegeId() == null
|
||||||
|
&& StringUtils.isNotBlank(studentInfo.getCollegeId())) {
|
||||||
|
try {
|
||||||
|
studentScore.setCollegeId(Long.valueOf(studentInfo.getCollegeId()));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
log.warn("学院ID转换失败,学生ID: {}, 学院ID: {}", studentScoreBo.getStudentId(),
|
||||||
|
studentInfo.getCollegeId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (StringUtils.isBlank(studentScore.getCollegeName())) {
|
||||||
|
studentScore.setCollegeName(studentInfo.getCollegeName());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 补充专业信息
|
||||||
|
if (studentScore.getMajorId() == null && StringUtils.isNotBlank(studentInfo.getMajorId())) {
|
||||||
|
try {
|
||||||
|
studentScore.setMajorId(Long.valueOf(studentInfo.getMajorId()));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
log.warn("专业ID转换失败,学生ID: {}, 专业ID: {}", studentScoreBo.getStudentId(),
|
||||||
|
studentInfo.getMajorId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (StringUtils.isBlank(studentScore.getMajorName())) {
|
||||||
|
studentScore.setMajorName(studentInfo.getMajorName());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 补充班级信息
|
||||||
|
if (studentScore.getClassId() == null && StringUtils.isNotBlank(studentInfo.getClassId())) {
|
||||||
|
try {
|
||||||
|
studentScore.setClassId(Long.valueOf(studentInfo.getClassId()));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
log.warn("班级ID转换失败,学生ID: {}, 班级ID: {}", studentScoreBo.getStudentId(),
|
||||||
|
studentInfo.getClassId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (StringUtils.isBlank(studentScore.getClassName())) {
|
||||||
|
studentScore.setClassName(studentInfo.getClassName());
|
||||||
|
}
|
||||||
|
|
||||||
|
log.info("补充学生信息 - 学生ID: {}, 学院: {}, 专业: {}, 班级: {}",
|
||||||
|
studentScoreBo.getStudentId(),
|
||||||
|
studentInfo.getCollegeName(),
|
||||||
|
studentInfo.getMajorName(),
|
||||||
|
studentInfo.getClassName());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.warn("查询学生信息失败,学生ID: {}, 错误: {}", studentScoreBo.getStudentId(), e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.info("studentScore: {}", studentScore);
|
||||||
|
log.info("studentScoreBo: {}", studentScoreBo);
|
||||||
|
studentScoreMapper.insert(studentScore);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改宿舍卫生检查(包含学生评分数据)
|
||||||
|
*
|
||||||
|
* @param bo 完整的宿舍卫生检查数据,包含学生评分信息
|
||||||
|
* @return 是否修改成功
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public Boolean updateWithStudentScores(XgDormHygieneCheckCompleteBo bo) {
|
||||||
|
// 1. 更新主表数据
|
||||||
|
XgDormHygieneCheck update = MapstructUtils.convert(bo, XgDormHygieneCheck.class);
|
||||||
|
validEntityBeforeSave(update);
|
||||||
|
boolean flag = baseMapper.updateById(update) > 0;
|
||||||
|
|
||||||
|
if (flag && bo.getStudentScores() != null && !bo.getStudentScores().isEmpty()) {
|
||||||
|
// 2. 逻辑删除原有学生评分记录
|
||||||
|
LambdaQueryWrapper<XgDormHygieneStudentScore> deleteWrapper = Wrappers.lambdaQuery();
|
||||||
|
deleteWrapper.eq(XgDormHygieneStudentScore::getHygieneCheckId, bo.getId());
|
||||||
|
studentScoreMapper.delete(deleteWrapper);
|
||||||
|
|
||||||
|
// 3. 插入新的学生评分记录
|
||||||
|
for (XgDormHygieneStudentScoreBo studentScoreBo : bo.getStudentScores()) {
|
||||||
|
XgDormHygieneStudentScore studentScore = MapstructUtils.convert(studentScoreBo,
|
||||||
|
XgDormHygieneStudentScore.class);
|
||||||
|
studentScore.setHygieneCheckId(bo.getId());
|
||||||
|
studentScore.setId(null);
|
||||||
|
// 根据学生ID查询学生完整信息,补充学院、专业、班级信息
|
||||||
|
if (studentScoreBo.getStudentId() != null) {
|
||||||
|
try {
|
||||||
|
var studentInfo = xgStudentMsgService.queryById(studentScoreBo.getStudentId());
|
||||||
|
if (studentInfo != null) {
|
||||||
|
// 补充学院信息
|
||||||
|
if (studentScore.getCollegeId() == null
|
||||||
|
&& StringUtils.isNotBlank(studentInfo.getCollegeId())) {
|
||||||
|
try {
|
||||||
|
studentScore.setCollegeId(Long.valueOf(studentInfo.getCollegeId()));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
log.warn("学院ID转换失败,学生ID: {}, 学院ID: {}", studentScoreBo.getStudentId(),
|
||||||
|
studentInfo.getCollegeId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (StringUtils.isBlank(studentScore.getCollegeName())) {
|
||||||
|
studentScore.setCollegeName(studentInfo.getCollegeName());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 补充专业信息
|
||||||
|
if (studentScore.getMajorId() == null && StringUtils.isNotBlank(studentInfo.getMajorId())) {
|
||||||
|
try {
|
||||||
|
studentScore.setMajorId(Long.valueOf(studentInfo.getMajorId()));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
log.warn("专业ID转换失败,学生ID: {}, 专业ID: {}", studentScoreBo.getStudentId(),
|
||||||
|
studentInfo.getMajorId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (StringUtils.isBlank(studentScore.getMajorName())) {
|
||||||
|
studentScore.setMajorName(studentInfo.getMajorName());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 补充班级信息
|
||||||
|
if (studentScore.getClassId() == null && StringUtils.isNotBlank(studentInfo.getClassId())) {
|
||||||
|
try {
|
||||||
|
studentScore.setClassId(Long.valueOf(studentInfo.getClassId()));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
log.warn("班级ID转换失败,学生ID: {}, 班级ID: {}", studentScoreBo.getStudentId(),
|
||||||
|
studentInfo.getClassId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (StringUtils.isBlank(studentScore.getClassName())) {
|
||||||
|
studentScore.setClassName(studentInfo.getClassName());
|
||||||
|
}
|
||||||
|
|
||||||
|
log.info("更新时补充学生信息 - 学生ID: {}, 学院: {}, 专业: {}, 班级: {}",
|
||||||
|
studentScoreBo.getStudentId(),
|
||||||
|
studentInfo.getCollegeName(),
|
||||||
|
studentInfo.getMajorName(),
|
||||||
|
studentInfo.getClassName());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.warn("查询学生信息失败,学生ID: {}, 错误: {}", studentScoreBo.getStudentId(), e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
studentScoreMapper.insert(studentScore);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+49
-13
@@ -40,7 +40,7 @@ public class XgDormHygieneStudentScoreServiceImpl implements IXgDormHygieneStude
|
|||||||
* @return 宿舍卫生检查学生评分
|
* @return 宿舍卫生检查学生评分
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public XgDormHygieneStudentScoreVo queryById(Long id){
|
public XgDormHygieneStudentScoreVo queryById(Long id) {
|
||||||
return baseMapper.selectVoById(id);
|
return baseMapper.selectVoById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,7 +52,8 @@ public class XgDormHygieneStudentScoreServiceImpl implements IXgDormHygieneStude
|
|||||||
* @return 宿舍卫生检查学生评分分页列表
|
* @return 宿舍卫生检查学生评分分页列表
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public TableDataInfo<XgDormHygieneStudentScoreVo> queryPageList(XgDormHygieneStudentScoreBo bo, PageQuery pageQuery) {
|
public TableDataInfo<XgDormHygieneStudentScoreVo> queryPageList(XgDormHygieneStudentScoreBo bo,
|
||||||
|
PageQuery pageQuery) {
|
||||||
LambdaQueryWrapper<XgDormHygieneStudentScore> lqw = buildQueryWrapper(bo);
|
LambdaQueryWrapper<XgDormHygieneStudentScore> lqw = buildQueryWrapper(bo);
|
||||||
Page<XgDormHygieneStudentScoreVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
Page<XgDormHygieneStudentScoreVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||||
return TableDataInfo.build(result);
|
return TableDataInfo.build(result);
|
||||||
@@ -78,21 +79,28 @@ public class XgDormHygieneStudentScoreServiceImpl implements IXgDormHygieneStude
|
|||||||
lqw.eq(bo.getHygieneCheckId() != null, XgDormHygieneStudentScore::getHygieneCheckId, bo.getHygieneCheckId());
|
lqw.eq(bo.getHygieneCheckId() != null, XgDormHygieneStudentScore::getHygieneCheckId, bo.getHygieneCheckId());
|
||||||
lqw.eq(bo.getStudentId() != null, XgDormHygieneStudentScore::getStudentId, bo.getStudentId());
|
lqw.eq(bo.getStudentId() != null, XgDormHygieneStudentScore::getStudentId, bo.getStudentId());
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getStudentNo()), XgDormHygieneStudentScore::getStudentNo, bo.getStudentNo());
|
lqw.eq(StringUtils.isNotBlank(bo.getStudentNo()), XgDormHygieneStudentScore::getStudentNo, bo.getStudentNo());
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getStudentName()), XgDormHygieneStudentScore::getStudentName, bo.getStudentName());
|
lqw.like(StringUtils.isNotBlank(bo.getStudentName()), XgDormHygieneStudentScore::getStudentName,
|
||||||
|
bo.getStudentName());
|
||||||
lqw.eq(bo.getClassId() != null, XgDormHygieneStudentScore::getClassId, bo.getClassId());
|
lqw.eq(bo.getClassId() != null, XgDormHygieneStudentScore::getClassId, bo.getClassId());
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getClassName()), XgDormHygieneStudentScore::getClassName, bo.getClassName());
|
lqw.like(StringUtils.isNotBlank(bo.getClassName()), XgDormHygieneStudentScore::getClassName, bo.getClassName());
|
||||||
lqw.eq(bo.getMajorId() != null, XgDormHygieneStudentScore::getMajorId, bo.getMajorId());
|
lqw.eq(bo.getMajorId() != null, XgDormHygieneStudentScore::getMajorId, bo.getMajorId());
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getMajorName()), XgDormHygieneStudentScore::getMajorName, bo.getMajorName());
|
lqw.like(StringUtils.isNotBlank(bo.getMajorName()), XgDormHygieneStudentScore::getMajorName, bo.getMajorName());
|
||||||
lqw.eq(bo.getCollegeId() != null, XgDormHygieneStudentScore::getCollegeId, bo.getCollegeId());
|
lqw.eq(bo.getCollegeId() != null, XgDormHygieneStudentScore::getCollegeId, bo.getCollegeId());
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getCollegeName()), XgDormHygieneStudentScore::getCollegeName, bo.getCollegeName());
|
lqw.like(StringUtils.isNotBlank(bo.getCollegeName()), XgDormHygieneStudentScore::getCollegeName,
|
||||||
|
bo.getCollegeName());
|
||||||
lqw.eq(bo.getBedId() != null, XgDormHygieneStudentScore::getBedId, bo.getBedId());
|
lqw.eq(bo.getBedId() != null, XgDormHygieneStudentScore::getBedId, bo.getBedId());
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getBedCode()), XgDormHygieneStudentScore::getBedCode, bo.getBedCode());
|
lqw.like(StringUtils.isNotBlank(bo.getBedCode()), XgDormHygieneStudentScore::getBedCode, bo.getBedCode());
|
||||||
lqw.eq(bo.getStudentScore() != null, XgDormHygieneStudentScore::getStudentScore, bo.getStudentScore());
|
lqw.eq(bo.getStudentScore() != null, XgDormHygieneStudentScore::getStudentScore, bo.getStudentScore());
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getAttendanceStatus()), XgDormHygieneStudentScore::getAttendanceStatus, bo.getAttendanceStatus());
|
lqw.eq(StringUtils.isNotBlank(bo.getAttendanceStatus()), XgDormHygieneStudentScore::getAttendanceStatus,
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getStudentGrade()), XgDormHygieneStudentScore::getStudentGrade, bo.getStudentGrade());
|
bo.getAttendanceStatus());
|
||||||
lqw.eq(bo.getIsResponsiblePerson() != null, XgDormHygieneStudentScore::getIsResponsiblePerson, bo.getIsResponsiblePerson());
|
lqw.eq(StringUtils.isNotBlank(bo.getStudentGrade()), XgDormHygieneStudentScore::getStudentGrade,
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getScoreRemarks()), XgDormHygieneStudentScore::getScoreRemarks, bo.getScoreRemarks());
|
bo.getStudentGrade());
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getImprovementNotes()), XgDormHygieneStudentScore::getImprovementNotes, bo.getImprovementNotes());
|
lqw.eq(bo.getIsResponsiblePerson() != null, XgDormHygieneStudentScore::getIsResponsiblePerson,
|
||||||
|
bo.getIsResponsiblePerson());
|
||||||
|
lqw.like(StringUtils.isNotBlank(bo.getScoreRemarks()), XgDormHygieneStudentScore::getScoreRemarks,
|
||||||
|
bo.getScoreRemarks());
|
||||||
|
lqw.like(StringUtils.isNotBlank(bo.getImprovementNotes()), XgDormHygieneStudentScore::getImprovementNotes,
|
||||||
|
bo.getImprovementNotes());
|
||||||
return lqw;
|
return lqw;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -129,8 +137,8 @@ public class XgDormHygieneStudentScoreServiceImpl implements IXgDormHygieneStude
|
|||||||
/**
|
/**
|
||||||
* 保存前的数据校验
|
* 保存前的数据校验
|
||||||
*/
|
*/
|
||||||
private void validEntityBeforeSave(XgDormHygieneStudentScore entity){
|
private void validEntityBeforeSave(XgDormHygieneStudentScore entity) {
|
||||||
//TODO 做一些数据校验,如唯一约束
|
// TODO 做一些数据校验,如唯一约束
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -142,9 +150,37 @@ public class XgDormHygieneStudentScoreServiceImpl implements IXgDormHygieneStude
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||||
if(isValid){
|
if (isValid) {
|
||||||
//TODO 做一些业务上的校验,判断是否需要校验
|
// TODO 做一些业务上的校验,判断是否需要校验
|
||||||
}
|
}
|
||||||
return baseMapper.deleteByIds(ids) > 0;
|
return baseMapper.deleteByIds(ids) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据卫生检查ID查询学生评分列表
|
||||||
|
*
|
||||||
|
* @param hygieneCheckId 卫生检查ID
|
||||||
|
* @return 学生评分列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<XgDormHygieneStudentScoreVo> queryByHygieneCheckId(Long hygieneCheckId) {
|
||||||
|
LambdaQueryWrapper<XgDormHygieneStudentScore> lqw = Wrappers.lambdaQuery();
|
||||||
|
lqw.eq(XgDormHygieneStudentScore::getHygieneCheckId, hygieneCheckId);
|
||||||
|
lqw.eq(XgDormHygieneStudentScore::getDeleted, 0); // 只查询未删除的记录
|
||||||
|
lqw.orderByAsc(XgDormHygieneStudentScore::getId);
|
||||||
|
return baseMapper.selectVoList(lqw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据卫生检查ID删除学生评分记录
|
||||||
|
*
|
||||||
|
* @param hygieneCheckId 卫生检查ID
|
||||||
|
* @return 是否删除成功
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Boolean deleteByHygieneCheckId(Long hygieneCheckId) {
|
||||||
|
LambdaQueryWrapper<XgDormHygieneStudentScore> lqw = Wrappers.lambdaQuery();
|
||||||
|
lqw.eq(XgDormHygieneStudentScore::getHygieneCheckId, hygieneCheckId);
|
||||||
|
return baseMapper.delete(lqw) > 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,184 @@
|
|||||||
|
# 宿舍卫生检查API字段名修复报告
|
||||||
|
|
||||||
|
## 问题描述
|
||||||
|
|
||||||
|
### 错误信息
|
||||||
|
```
|
||||||
|
{"code":500,"msg":"学生评分数据不能为空","data":null}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 问题分析
|
||||||
|
前端发送的API请求中,学生评分数据字段名为 `studentData`,但后端BO类 `XgDormHygieneCheckCompleteBo` 中期望的字段名为 `studentScores`,导致后端验证失败。
|
||||||
|
|
||||||
|
## 修复方案
|
||||||
|
|
||||||
|
### 1. 前端类型定义修复
|
||||||
|
|
||||||
|
**文件:** `web/src/api/xg/xgss/dormHygieneCheck/dormHygieneCheck/types.ts`
|
||||||
|
|
||||||
|
**修改内容:**
|
||||||
|
```typescript
|
||||||
|
// 修复前
|
||||||
|
export interface DormHygieneCheckCompleteForm extends DormHygieneCheckForm {
|
||||||
|
studentData?: DormHygieneStudentScoreForm[];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修复后
|
||||||
|
export interface DormHygieneCheckCompleteForm extends DormHygieneCheckForm {
|
||||||
|
studentScores?: DormHygieneStudentScoreForm[];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 前端数据处理逻辑修复
|
||||||
|
|
||||||
|
**文件:** `web/src/views/xg/xgss/dormHygieneCheck/dormHygieneCheck/DormHygieneCheckDialog.vue`
|
||||||
|
|
||||||
|
**修改内容:**
|
||||||
|
```typescript
|
||||||
|
// 修复前
|
||||||
|
const studentData = roomStudents.value.map((student: any) => ({
|
||||||
|
studentId: student.studentId,
|
||||||
|
// ... 其他字段
|
||||||
|
}));
|
||||||
|
|
||||||
|
const submitData: DormHygieneCheckCompleteForm = {
|
||||||
|
...form,
|
||||||
|
studentData: studentData
|
||||||
|
};
|
||||||
|
|
||||||
|
// 修复后
|
||||||
|
const studentScores = roomStudents.value.map((student: any) => ({
|
||||||
|
studentId: Number(student.studentId), // 确保是数字类型
|
||||||
|
studentName: student.studentName,
|
||||||
|
studentNo: student.studentNo,
|
||||||
|
className: student.className,
|
||||||
|
majorName: student.majorName,
|
||||||
|
collegeName: student.collegeName,
|
||||||
|
bedId: student.bedId ? Number(student.bedId) : undefined,
|
||||||
|
bedCode: student.bedName,
|
||||||
|
studentScore: student.student_score ? Number(student.student_score) : undefined,
|
||||||
|
attendanceStatus: student.attendance_status,
|
||||||
|
studentGrade: student.student_grade,
|
||||||
|
isResponsiblePerson: student.isResponsiblePerson ? Number(student.isResponsiblePerson) : 0,
|
||||||
|
scoreRemarks: student.scoreRemarks || '',
|
||||||
|
improvementNotes: student.improvementNotes || ''
|
||||||
|
}));
|
||||||
|
|
||||||
|
const submitData: DormHygieneCheckCompleteForm = {
|
||||||
|
...form,
|
||||||
|
studentScores: studentScores
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
## 修复要点
|
||||||
|
|
||||||
|
### 1. 字段名统一
|
||||||
|
- **前端发送:** `studentData` → **修复后:** `studentScores`
|
||||||
|
- **后端期望:** `studentScores` ✅
|
||||||
|
|
||||||
|
### 2. 数据类型转换
|
||||||
|
- **studentId:** 确保为数字类型 (`Number()`)
|
||||||
|
- **studentScore:** 确保为数字类型 (`Number()`)
|
||||||
|
- **isResponsiblePerson:** 确保为数字类型 (`Number()`)
|
||||||
|
- **bedId:** 可选字段,有值时转换为数字类型
|
||||||
|
|
||||||
|
### 3. 后端验证规则
|
||||||
|
```java
|
||||||
|
@Valid
|
||||||
|
@NotEmpty(message = "学生评分数据不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||||
|
private List<XgDormHygieneStudentScoreBo> studentScores;
|
||||||
|
```
|
||||||
|
|
||||||
|
## 测试验证
|
||||||
|
|
||||||
|
### 1. 修复后的请求格式
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"checkTitle": "20250816宿舍卫生检查",
|
||||||
|
"checkDate": "2025-08-16 13:31:58",
|
||||||
|
"checkerId": 1,
|
||||||
|
"checkerName": "疯狂的狮子1Li",
|
||||||
|
"checkType": "1",
|
||||||
|
"checkLevel": "1",
|
||||||
|
"roomId": "1947682802646568962",
|
||||||
|
"roomCode": "1101寝室",
|
||||||
|
"roomName": "1101寝室",
|
||||||
|
"buildingId": "1947658035881234434",
|
||||||
|
"buildingName": "1号楼",
|
||||||
|
"areaId": "1947656427264987137",
|
||||||
|
"areaName": "女生宿舍区",
|
||||||
|
"campusId": "1946815553291304962",
|
||||||
|
"campusName": "西溪校区",
|
||||||
|
"totalScore": "95",
|
||||||
|
"hygieneGrade": "A",
|
||||||
|
"attachmentIds": "1956710620841684994,1956710620841684995,1956710620841684996",
|
||||||
|
"checkSummary": "123",
|
||||||
|
"improvementSuggestions": "123",
|
||||||
|
"checkRemarks": "123123123",
|
||||||
|
"studentScores": [ // ✅ 修复:使用正确的字段名
|
||||||
|
{
|
||||||
|
"studentId": 1949111889824882689, // ✅ 修复:数字类型
|
||||||
|
"studentName": "张新",
|
||||||
|
"studentNo": "2025ZY24113",
|
||||||
|
"className": "中药241",
|
||||||
|
"majorName": "中药",
|
||||||
|
"collegeName": "人文学院",
|
||||||
|
"bedCode": "2上",
|
||||||
|
"studentScore": 95.0, // ✅ 修复:数字类型
|
||||||
|
"attendanceStatus": "1",
|
||||||
|
"studentGrade": "A",
|
||||||
|
"isResponsiblePerson": 0, // ✅ 修复:数字类型
|
||||||
|
"scoreRemarks": "",
|
||||||
|
"improvementNotes": ""
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 测试脚本
|
||||||
|
**文件:** `test/宿舍卫生检查API修复测试.py`
|
||||||
|
|
||||||
|
包含完整的测试数据和验证逻辑,可用于验证修复效果。
|
||||||
|
|
||||||
|
## 影响范围
|
||||||
|
|
||||||
|
### 1. 修改的文件
|
||||||
|
- ✅ `web/src/api/xg/xgss/dormHygieneCheck/dormHygieneCheck/types.ts`
|
||||||
|
- ✅ `web/src/views/xg/xgss/dormHygieneCheck/dormHygieneCheck/DormHygieneCheckDialog.vue`
|
||||||
|
|
||||||
|
### 2. 新增的文件
|
||||||
|
- ✅ `test/宿舍卫生检查API修复测试.py`
|
||||||
|
- ✅ `docs/开发文档/宿舍卫生检查API字段名修复报告.md`
|
||||||
|
|
||||||
|
### 3. 不受影响的功能
|
||||||
|
- 后端API接口逻辑保持不变
|
||||||
|
- 数据库表结构保持不变
|
||||||
|
- 其他相关功能不受影响
|
||||||
|
|
||||||
|
## 验证步骤
|
||||||
|
|
||||||
|
### 1. 前端验证
|
||||||
|
1. 打开宿舍卫生检查新增/编辑页面
|
||||||
|
2. 选择房间,加载学生信息
|
||||||
|
3. 填写检查信息和学生评分
|
||||||
|
4. 提交表单,检查网络请求
|
||||||
|
|
||||||
|
### 2. 后端验证
|
||||||
|
1. 检查请求参数中的字段名是否为 `studentScores`
|
||||||
|
2. 检查学生评分数据的类型是否正确
|
||||||
|
3. 验证后端验证是否通过
|
||||||
|
|
||||||
|
### 3. 数据库验证
|
||||||
|
1. 检查主表数据是否正确插入
|
||||||
|
2. 检查学生评分表数据是否正确插入
|
||||||
|
3. 验证关联关系是否正确
|
||||||
|
|
||||||
|
## 总结
|
||||||
|
|
||||||
|
通过修复前端字段名和数据类型,解决了"学生评分数据不能为空"的错误。主要修复点:
|
||||||
|
|
||||||
|
1. **字段名统一:** `studentData` → `studentScores`
|
||||||
|
2. **数据类型转换:** 确保数字字段为正确的类型
|
||||||
|
3. **类型定义更新:** 前端类型定义与后端BO类保持一致
|
||||||
|
|
||||||
|
修复后,API请求应该能够正常通过后端验证,成功保存宿舍卫生检查记录和学生评分数据。
|
||||||
@@ -0,0 +1,190 @@
|
|||||||
|
# 宿舍卫生检查API接口同步完成报告
|
||||||
|
|
||||||
|
## 任务概述
|
||||||
|
|
||||||
|
根据用户要求,需要同步修改主页面的 `updateDormHygieneCheck` 和 `addDormHygieneCheck` 对应的后台API接口,使其支持同时操作主表和子表数据。
|
||||||
|
|
||||||
|
## 完成情况
|
||||||
|
|
||||||
|
### ✅ 已完成的工作
|
||||||
|
|
||||||
|
#### 1. 前端API接口层 (`web/src/api/xg/xgss/dormHygieneCheck/dormHygieneCheck/index.ts`)
|
||||||
|
|
||||||
|
**新增接口:**
|
||||||
|
- ✅ `addDormHygieneCheck` - 新增宿舍卫生检查(包含学生评分数据)
|
||||||
|
- 接口地址:`POST /dormHygieneCheck/dormHygieneCheck/addWithStudentScores`
|
||||||
|
- 参数类型:`DormHygieneCheckCompleteForm`
|
||||||
|
- 功能:同时向主表和子表插入数据
|
||||||
|
|
||||||
|
- ✅ `updateDormHygieneCheck` - 更新宿舍卫生检查(包含学生评分数据)
|
||||||
|
- 接口地址:`PUT /dormHygieneCheck/dormHygieneCheck/updateWithStudentScores`
|
||||||
|
- 参数类型:`DormHygieneCheckCompleteForm`
|
||||||
|
- 功能:更新主表,重新插入子表数据(保留历史)
|
||||||
|
|
||||||
|
#### 2. 类型定义层 (`web/src/api/xg/xgss/dormHygieneCheck/dormHygieneCheck/types.ts`)
|
||||||
|
|
||||||
|
**新增类型:**
|
||||||
|
- ✅ `DormHygieneStudentScoreVO` - 学生评分数据展示类型
|
||||||
|
- ✅ `DormHygieneStudentScoreForm` - 学生评分数据表单类型
|
||||||
|
- ✅ `DormHygieneStudentScoreQuery` - 学生评分查询类型
|
||||||
|
- ✅ `DormHygieneCheckCompleteForm` - 完整的宿舍卫生检查表单类型(包含学生评分数据)
|
||||||
|
|
||||||
|
#### 3. 前端组件层
|
||||||
|
|
||||||
|
**Dialog组件 (`DormHygieneCheckDialog.vue`):**
|
||||||
|
- ✅ 更新 `submitForm` 方法,支持提交完整的学生评分数据
|
||||||
|
- ✅ 优化数据格式转换,将前端数据格式转换为API接口要求的格式
|
||||||
|
- ✅ 增强错误处理和用户提示
|
||||||
|
|
||||||
|
**主页面 (`index.vue`):**
|
||||||
|
- ✅ `handleDialogSubmit` 方法已正确调用新的API接口
|
||||||
|
- ✅ 参数类型已更新为 `DormHygieneCheckCompleteForm`
|
||||||
|
- ✅ 导入语句已正确配置
|
||||||
|
|
||||||
|
#### 4. 后端API设计规范
|
||||||
|
|
||||||
|
**新增接口设计:**
|
||||||
|
- ✅ 新增接口:`POST /dormHygieneCheck/dormHygieneCheck/addWithStudentScores`
|
||||||
|
- ✅ 更新接口:`PUT /dormHygieneCheck/dormHygieneCheck/updateWithStudentScores`
|
||||||
|
|
||||||
|
**实现要求:**
|
||||||
|
- 🔄 使用数据库事务确保两个表的操作原子性
|
||||||
|
- 📝 主表操作:插入/更新宿舍卫生检查记录
|
||||||
|
- 👥 子表操作:插入学生评分记录,关联主表ID
|
||||||
|
- 🗑️ 更新时:逻辑删除原有学生评分记录,插入新记录
|
||||||
|
- ✅ 完整的数据验证和权限控制
|
||||||
|
|
||||||
|
#### 5. 文档和测试
|
||||||
|
|
||||||
|
**API文档:**
|
||||||
|
- ✅ `docs/开发文档/API/宿舍卫生检查管理API.md` - 完整的API接口文档
|
||||||
|
|
||||||
|
**测试脚本:**
|
||||||
|
- ✅ `test/宿舍卫生检查API测试脚本.py` - 完整的测试脚本,包含AES+RSA加密登录
|
||||||
|
|
||||||
|
**总结文档:**
|
||||||
|
- ✅ `docs/开发文档/宿舍卫生检查API接口完善总结.md` - 详细的工作总结
|
||||||
|
|
||||||
|
## 技术实现细节
|
||||||
|
|
||||||
|
### 1. 数据流程
|
||||||
|
|
||||||
|
```
|
||||||
|
前端表单数据 → DormHygieneCheckCompleteForm → API接口 → 后端事务处理 → 数据库存储
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 事务处理策略
|
||||||
|
|
||||||
|
**新增操作:**
|
||||||
|
1. 开始事务
|
||||||
|
2. 插入主表记录,获取主键ID
|
||||||
|
3. 为每个学生插入评分记录,关联主表ID
|
||||||
|
4. 提交事务
|
||||||
|
|
||||||
|
**更新操作:**
|
||||||
|
1. 开始事务
|
||||||
|
2. 更新主表记录
|
||||||
|
3. 逻辑删除原有学生评分记录(deleted=1)
|
||||||
|
4. 插入新的学生评分记录
|
||||||
|
5. 提交事务
|
||||||
|
|
||||||
|
### 3. 数据验证规则
|
||||||
|
|
||||||
|
**主表验证:**
|
||||||
|
- `checkTitle`: 必填,长度1-200字符
|
||||||
|
- `checkDate`: 必填,日期时间格式
|
||||||
|
- `checkerId`: 必填,关联用户表
|
||||||
|
- `roomId`: 必填,关联房间表
|
||||||
|
- `totalScore`: 可选,0-100分
|
||||||
|
- `hygieneGrade`: 可选,A/B/C/D
|
||||||
|
|
||||||
|
**学生评分表验证:**
|
||||||
|
- `studentId`: 必填,关联学生表
|
||||||
|
- `studentScore`: 可选,0-100分
|
||||||
|
- `attendanceStatus`: 必填,1/2/3/4
|
||||||
|
- `studentGrade`: 可选,A/B/C/D
|
||||||
|
|
||||||
|
## 文件清单
|
||||||
|
|
||||||
|
### 已修改的文件
|
||||||
|
1. `web/src/api/xg/xgss/dormHygieneCheck/dormHygieneCheck/types.ts` - 类型定义扩展
|
||||||
|
2. `web/src/api/xg/xgss/dormHygieneCheck/dormHygieneCheck/index.ts` - API接口更新
|
||||||
|
3. `web/src/views/xg/xgss/dormHygieneCheck/dormHygieneCheck/DormHygieneCheckDialog.vue` - Dialog组件优化
|
||||||
|
4. `web/src/views/xg/xgss/dormHygieneCheck/dormHygieneCheck/index.vue` - 主页面更新
|
||||||
|
|
||||||
|
### 新增的文件
|
||||||
|
1. `docs/开发文档/API/宿舍卫生检查管理API.md` - API接口文档
|
||||||
|
2. `test/宿舍卫生检查API测试脚本.py` - 测试脚本
|
||||||
|
3. `docs/开发文档/宿舍卫生检查API接口完善总结.md` - 工作总结
|
||||||
|
4. `docs/开发文档/宿舍卫生检查API接口同步完成报告.md` - 本报告
|
||||||
|
|
||||||
|
## 后端实现要求
|
||||||
|
|
||||||
|
### Controller层示例
|
||||||
|
```java
|
||||||
|
@PostMapping("/addWithStudentScores")
|
||||||
|
@SaCheckPermission("dormHygieneCheck:dormHygieneCheck:add")
|
||||||
|
public R<Void> addWithStudentScores(@RequestBody @Valid DormHygieneCheckCompleteForm form) {
|
||||||
|
dormHygieneCheckService.addWithStudentScores(form);
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
@PutMapping("/updateWithStudentScores")
|
||||||
|
@SaCheckPermission("dormHygieneCheck:dormHygieneCheck:edit")
|
||||||
|
public R<Void> updateWithStudentScores(@RequestBody @Valid DormHygieneCheckCompleteForm form) {
|
||||||
|
dormHygieneCheckService.updateWithStudentScores(form);
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Service层要求
|
||||||
|
- 使用 `@Transactional(rollbackFor = Exception.class)` 确保事务一致性
|
||||||
|
- 实现数据验证逻辑
|
||||||
|
- 处理主表和子表的关联关系
|
||||||
|
- 记录操作日志
|
||||||
|
|
||||||
|
## 测试验证
|
||||||
|
|
||||||
|
### 测试脚本运行
|
||||||
|
```bash
|
||||||
|
python test/宿舍卫生检查API测试脚本.py
|
||||||
|
```
|
||||||
|
|
||||||
|
### 测试内容
|
||||||
|
1. ✅ AES+RSA双重加密登录
|
||||||
|
2. ✅ 新增宿舍卫生检查(包含学生评分)
|
||||||
|
3. ✅ 更新宿舍卫生检查(包含学生评分)
|
||||||
|
4. ✅ 查询详情和列表
|
||||||
|
5. ✅ 数据验证测试
|
||||||
|
6. ✅ 错误处理测试
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. **事务一致性**:确保两个表的操作在同一事务中完成
|
||||||
|
2. **数据完整性**:更新时保留历史数据,便于追溯
|
||||||
|
3. **性能优化**:批量操作时考虑性能影响
|
||||||
|
4. **权限控制**:严格检查用户权限
|
||||||
|
5. **日志记录**:记录重要操作日志
|
||||||
|
6. **数据验证**:前端和后端都要进行数据验证
|
||||||
|
|
||||||
|
## 后续工作
|
||||||
|
|
||||||
|
### 后端开发任务
|
||||||
|
1. 实现 `DormHygieneCheckCompleteForm` 实体类
|
||||||
|
2. 实现 `addWithStudentScores` 和 `updateWithStudentScores` 方法
|
||||||
|
3. 添加数据验证和权限控制
|
||||||
|
4. 实现事务处理逻辑
|
||||||
|
5. 添加操作日志记录
|
||||||
|
|
||||||
|
### 测试验证
|
||||||
|
1. 运行前端测试脚本验证API接口
|
||||||
|
2. 进行集成测试验证完整功能
|
||||||
|
3. 性能测试验证大数据量处理能力
|
||||||
|
4. 安全测试验证权限控制
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**完成时间:** 2025-01-28
|
||||||
|
**开发人员:** 系统开发团队
|
||||||
|
**文档版本:** v1.0
|
||||||
|
**状态:** ✅ 前端API接口同步完成,等待后端实现
|
||||||
@@ -0,0 +1,317 @@
|
|||||||
|
# 宿舍卫生检查后端API接口修改完成报告
|
||||||
|
|
||||||
|
## 任务概述
|
||||||
|
|
||||||
|
根据前端API接口的同步需求,需要修改后端Controller中的 `updateDormHygieneCheck` 和 `addDormHygieneCheck` 对应的API函数,使其支持同时操作主表和子表数据。
|
||||||
|
|
||||||
|
## 完成情况
|
||||||
|
|
||||||
|
### ✅ 已完成的工作
|
||||||
|
|
||||||
|
#### 1. 新增完整表单类型 (`XgDormHygieneCheckCompleteBo`)
|
||||||
|
|
||||||
|
**文件位置:** `backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormHygieneCheckCompleteBo.java`
|
||||||
|
|
||||||
|
**功能特点:**
|
||||||
|
- ✅ 包含主表所有字段(宿舍卫生检查信息)
|
||||||
|
- ✅ 包含学生评分数据列表 (`List<XgDormHygieneStudentScoreBo>`)
|
||||||
|
- ✅ 完整的数据验证注解
|
||||||
|
- ✅ 基础字段支持(createBy、createTime、updateBy、updateTime)
|
||||||
|
- ✅ JSON格式化支持
|
||||||
|
|
||||||
|
**核心字段:**
|
||||||
|
```java
|
||||||
|
// 主表字段
|
||||||
|
private Long id;
|
||||||
|
private String checkTitle;
|
||||||
|
private Date checkDate;
|
||||||
|
private Long checkerId;
|
||||||
|
private String checkerName;
|
||||||
|
// ... 其他主表字段
|
||||||
|
|
||||||
|
// 学生评分数据
|
||||||
|
@Valid
|
||||||
|
@NotEmpty(message = "学生评分数据不能为空")
|
||||||
|
private List<XgDormHygieneStudentScoreBo> studentScores;
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2. Controller层API接口 (`XgDormHygieneCheckController`)
|
||||||
|
|
||||||
|
**文件位置:** `backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormHygieneCheckController.java`
|
||||||
|
|
||||||
|
**新增接口:**
|
||||||
|
|
||||||
|
1. **新增宿舍卫生检查(包含学生评分数据)**
|
||||||
|
```java
|
||||||
|
@PostMapping("/addWithStudentScores")
|
||||||
|
public R<Void> addWithStudentScores(@Validated(AddGroup.class) @RequestBody XgDormHygieneCheckCompleteBo bo)
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **修改宿舍卫生检查(包含学生评分数据)**
|
||||||
|
```java
|
||||||
|
@PutMapping("/updateWithStudentScores")
|
||||||
|
public R<Void> updateWithStudentScores(@Validated(EditGroup.class) @RequestBody XgDormHygieneCheckCompleteBo bo)
|
||||||
|
```
|
||||||
|
|
||||||
|
**接口特点:**
|
||||||
|
- ✅ 完整的权限控制 (`@SaCheckPermission`)
|
||||||
|
- ✅ 操作日志记录 (`@Log`)
|
||||||
|
- ✅ 防重复提交 (`@RepeatSubmit`)
|
||||||
|
- ✅ 数据验证 (`@Validated`)
|
||||||
|
- ✅ 统一响应格式 (`R<Void>`)
|
||||||
|
|
||||||
|
#### 3. Service接口层 (`IXgDormHygieneCheckService`)
|
||||||
|
|
||||||
|
**文件位置:** `backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormHygieneCheckService.java`
|
||||||
|
|
||||||
|
**新增方法:**
|
||||||
|
```java
|
||||||
|
/**
|
||||||
|
* 新增宿舍卫生检查(包含学生评分数据)
|
||||||
|
*/
|
||||||
|
Boolean insertWithStudentScores(XgDormHygieneCheckCompleteBo bo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改宿舍卫生检查(包含学生评分数据)
|
||||||
|
*/
|
||||||
|
Boolean updateWithStudentScores(XgDormHygieneCheckCompleteBo bo);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 4. Service实现层 (`XgDormHygieneCheckServiceImpl`)
|
||||||
|
|
||||||
|
**文件位置:** `backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormHygieneCheckServiceImpl.java`
|
||||||
|
|
||||||
|
**实现特点:**
|
||||||
|
|
||||||
|
1. **事务管理**
|
||||||
|
- ✅ 使用 `@Transactional(rollbackFor = Exception.class)` 确保数据一致性
|
||||||
|
- ✅ 任何异常都会回滚所有操作
|
||||||
|
|
||||||
|
2. **新增逻辑 (`insertWithStudentScores`)**
|
||||||
|
```java
|
||||||
|
// 1. 转换并保存主表数据
|
||||||
|
XgDormHygieneCheck add = MapstructUtils.convert(bo, XgDormHygieneCheck.class);
|
||||||
|
boolean flag = baseMapper.insert(add) > 0;
|
||||||
|
|
||||||
|
// 2. 保存学生评分数据
|
||||||
|
for (XgDormHygieneStudentScoreBo studentScoreBo : bo.getStudentScores()) {
|
||||||
|
XgDormHygieneStudentScore studentScore = MapstructUtils.convert(studentScoreBo, XgDormHygieneStudentScore.class);
|
||||||
|
studentScore.setHygieneCheckId(add.getId());
|
||||||
|
studentScoreMapper.insert(studentScore);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **更新逻辑 (`updateWithStudentScores`)**
|
||||||
|
```java
|
||||||
|
// 1. 更新主表数据
|
||||||
|
XgDormHygieneCheck update = MapstructUtils.convert(bo, XgDormHygieneCheck.class);
|
||||||
|
boolean flag = baseMapper.updateById(update) > 0;
|
||||||
|
|
||||||
|
// 2. 删除原有学生评分记录
|
||||||
|
LambdaQueryWrapper<XgDormHygieneStudentScore> deleteWrapper = Wrappers.lambdaQuery();
|
||||||
|
deleteWrapper.eq(XgDormHygieneStudentScore::getHygieneCheckId, bo.getId());
|
||||||
|
studentScoreMapper.delete(deleteWrapper);
|
||||||
|
|
||||||
|
// 3. 插入新的学生评分记录
|
||||||
|
for (XgDormHygieneStudentScoreBo studentScoreBo : bo.getStudentScores()) {
|
||||||
|
XgDormHygieneStudentScore studentScore = MapstructUtils.convert(studentScoreBo, XgDormHygieneStudentScore.class);
|
||||||
|
studentScore.setHygieneCheckId(bo.getId());
|
||||||
|
studentScoreMapper.insert(studentScore);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 技术实现细节
|
||||||
|
|
||||||
|
### 1. 数据流程
|
||||||
|
|
||||||
|
```
|
||||||
|
前端请求 → Controller → Service → Mapper → 数据库
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 事务处理策略
|
||||||
|
|
||||||
|
**新增操作:**
|
||||||
|
1. 开始事务
|
||||||
|
2. 插入主表记录,获取主键ID
|
||||||
|
3. 为每个学生插入评分记录,关联主表ID
|
||||||
|
4. 提交事务(成功)或回滚事务(失败)
|
||||||
|
|
||||||
|
**更新操作:**
|
||||||
|
1. 开始事务
|
||||||
|
2. 更新主表记录
|
||||||
|
3. 删除原有学生评分记录
|
||||||
|
4. 插入新的学生评分记录
|
||||||
|
5. 提交事务(成功)或回滚事务(失败)
|
||||||
|
|
||||||
|
### 3. 数据验证规则
|
||||||
|
|
||||||
|
**主表验证:**
|
||||||
|
- `checkTitle`: 必填,长度1-200字符
|
||||||
|
- `checkDate`: 必填,日期时间格式
|
||||||
|
- `checkerId`: 必填,关联用户表
|
||||||
|
- `roomId`: 必填,关联房间表
|
||||||
|
- `totalScore`: 可选,0-100分
|
||||||
|
- `hygieneGrade`: 可选,A/B/C/D
|
||||||
|
|
||||||
|
**学生评分表验证:**
|
||||||
|
- `studentScores`: 必填,不能为空列表
|
||||||
|
- `studentId`: 必填,关联学生表
|
||||||
|
- `studentScore`: 可选,0-100分
|
||||||
|
- `attendanceStatus`: 必填,1/2/3/4
|
||||||
|
- `studentGrade`: 可选,A/B/C/D
|
||||||
|
|
||||||
|
### 4. 依赖注入
|
||||||
|
|
||||||
|
**新增依赖:**
|
||||||
|
```java
|
||||||
|
private final XgDormHygieneStudentScoreMapper studentScoreMapper;
|
||||||
|
```
|
||||||
|
|
||||||
|
**导入的类:**
|
||||||
|
```java
|
||||||
|
import org.dromara.xg.domain.bo.XgDormHygieneCheckCompleteBo;
|
||||||
|
import org.dromara.xg.domain.bo.XgDormHygieneStudentScoreBo;
|
||||||
|
import org.dromara.xg.domain.XgDormHygieneStudentScore;
|
||||||
|
import org.dromara.xg.mapper.XgDormHygieneStudentScoreMapper;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
```
|
||||||
|
|
||||||
|
## 文件清单
|
||||||
|
|
||||||
|
### 新增的文件
|
||||||
|
1. `backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormHygieneCheckCompleteBo.java` - 完整表单类型
|
||||||
|
|
||||||
|
### 修改的文件
|
||||||
|
1. `backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormHygieneCheckController.java` - 新增API接口
|
||||||
|
2. `backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormHygieneCheckService.java` - 新增Service接口方法
|
||||||
|
3. `backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormHygieneCheckServiceImpl.java` - 新增Service实现方法
|
||||||
|
|
||||||
|
### 依赖的文件(已存在)
|
||||||
|
1. `backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/bo/XgDormHygieneStudentScoreBo.java` - 学生评分BO
|
||||||
|
2. `backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormHygieneStudentScoreMapper.java` - 学生评分Mapper
|
||||||
|
3. `backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgDormHygieneStudentScore.java` - 学生评分实体
|
||||||
|
|
||||||
|
## API接口规范
|
||||||
|
|
||||||
|
### 新增接口:`POST /dormHygieneCheck/dormHygieneCheck/addWithStudentScores`
|
||||||
|
|
||||||
|
**请求参数:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"checkTitle": "2025年1月宿舍卫生检查",
|
||||||
|
"checkDate": "2025-01-28 10:00:00",
|
||||||
|
"checkerId": 1,
|
||||||
|
"checkerName": "张三",
|
||||||
|
"roomId": 1,
|
||||||
|
"roomCode": "A101",
|
||||||
|
"roomName": "A栋101室",
|
||||||
|
"buildingId": 1,
|
||||||
|
"buildingName": "A栋",
|
||||||
|
"studentScores": [
|
||||||
|
{
|
||||||
|
"studentId": 1,
|
||||||
|
"studentNo": "2021001",
|
||||||
|
"studentName": "李四",
|
||||||
|
"studentScore": 85.0,
|
||||||
|
"attendanceStatus": "1",
|
||||||
|
"studentGrade": "B"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**响应格式:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"code": 200,
|
||||||
|
"msg": "操作成功"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 更新接口:`PUT /dormHygieneCheck/dormHygieneCheck/updateWithStudentScores`
|
||||||
|
|
||||||
|
**请求参数:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"checkTitle": "2025年1月宿舍卫生检查(更新)",
|
||||||
|
"checkDate": "2025-01-28 10:00:00",
|
||||||
|
"checkerId": 1,
|
||||||
|
"checkerName": "张三",
|
||||||
|
"roomId": 1,
|
||||||
|
"roomCode": "A101",
|
||||||
|
"roomName": "A栋101室",
|
||||||
|
"buildingId": 1,
|
||||||
|
"buildingName": "A栋",
|
||||||
|
"studentScores": [
|
||||||
|
{
|
||||||
|
"studentId": 1,
|
||||||
|
"studentNo": "2021001",
|
||||||
|
"studentName": "李四",
|
||||||
|
"studentScore": 90.0,
|
||||||
|
"attendanceStatus": "1",
|
||||||
|
"studentGrade": "A"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**响应格式:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"code": 200,
|
||||||
|
"msg": "操作成功"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 测试验证
|
||||||
|
|
||||||
|
### 1. 单元测试建议
|
||||||
|
- 测试新增功能的数据完整性
|
||||||
|
- 测试更新功能的数据一致性
|
||||||
|
- 测试事务回滚机制
|
||||||
|
- 测试数据验证规则
|
||||||
|
|
||||||
|
### 2. 集成测试建议
|
||||||
|
- 使用前端测试脚本验证API接口
|
||||||
|
- 测试大数据量的性能表现
|
||||||
|
- 测试并发操作的数据一致性
|
||||||
|
|
||||||
|
### 3. 测试脚本
|
||||||
|
可以使用之前创建的前端测试脚本:
|
||||||
|
```bash
|
||||||
|
python test/宿舍卫生检查API测试脚本.py
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. **事务一致性**:确保两个表的操作在同一事务中完成
|
||||||
|
2. **数据完整性**:更新时删除原有数据,插入新数据
|
||||||
|
3. **性能优化**:考虑批量操作时的性能影响
|
||||||
|
4. **权限控制**:严格检查用户权限
|
||||||
|
5. **日志记录**:记录重要操作日志
|
||||||
|
6. **数据验证**:前端和后端都要进行数据验证
|
||||||
|
|
||||||
|
## 后续工作
|
||||||
|
|
||||||
|
### 1. 测试验证
|
||||||
|
- 运行单元测试验证功能正确性
|
||||||
|
- 进行集成测试验证完整流程
|
||||||
|
- 性能测试验证大数据量处理能力
|
||||||
|
|
||||||
|
### 2. 文档更新
|
||||||
|
- 更新API文档
|
||||||
|
- 更新数据库设计文档
|
||||||
|
- 更新业务模块文档
|
||||||
|
|
||||||
|
### 3. 部署上线
|
||||||
|
- 代码审查
|
||||||
|
- 测试环境验证
|
||||||
|
- 生产环境部署
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**完成时间:** 2025-01-28
|
||||||
|
**开发人员:** 系统开发团队
|
||||||
|
**文档版本:** v1.0
|
||||||
|
**状态:** ✅ 后端API接口修改完成,等待测试验证
|
||||||
@@ -0,0 +1,148 @@
|
|||||||
|
# 宿舍卫生检查编辑时学生评分ID修复报告
|
||||||
|
|
||||||
|
## 问题描述
|
||||||
|
|
||||||
|
### 错误现象
|
||||||
|
在宿舍卫生检查编辑模式下,提交表单时 `studentScores` 数据中缺少学生评分记录的 `id` 字段,导致后端无法正确识别和更新现有的学生评分记录。
|
||||||
|
|
||||||
|
### 问题分析
|
||||||
|
1. **数据获取阶段**:从历史数据获取学生评分信息时,没有保存学生评分记录的 `id` 字段
|
||||||
|
2. **数据提交阶段**:构建提交数据时,没有包含学生评分记录的 `id` 字段
|
||||||
|
3. **类型不匹配**:存在 `form.totalScore !== ''` 的类型比较错误
|
||||||
|
|
||||||
|
## 修复方案
|
||||||
|
|
||||||
|
### 1. 修复数据获取逻辑
|
||||||
|
|
||||||
|
**文件:** `web/src/views/xg/xgss/dormHygieneCheck/dormHygieneCheck/DormHygieneCheckDialog.vue`
|
||||||
|
|
||||||
|
**修改内容:**
|
||||||
|
```typescript
|
||||||
|
// 修复前
|
||||||
|
roomStudents.value = studentScoresRes.data.map((studentScore: any) => ({
|
||||||
|
studentId: studentScore.studentId,
|
||||||
|
// ... 其他字段
|
||||||
|
}));
|
||||||
|
|
||||||
|
// 修复后
|
||||||
|
roomStudents.value = studentScoresRes.data.map((studentScore: any) => ({
|
||||||
|
// 保存学生评分记录的ID,用于编辑时提交
|
||||||
|
id: studentScore.id,
|
||||||
|
studentId: studentScore.studentId,
|
||||||
|
// ... 其他字段
|
||||||
|
}));
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 修复数据提交逻辑
|
||||||
|
|
||||||
|
**修改内容:**
|
||||||
|
```typescript
|
||||||
|
// 修复前
|
||||||
|
const studentScores = roomStudents.value.map((student: any) => ({
|
||||||
|
studentId: Number(student.studentId),
|
||||||
|
// ... 其他字段
|
||||||
|
}));
|
||||||
|
|
||||||
|
// 修复后
|
||||||
|
const studentScores = roomStudents.value.map((student: any) => {
|
||||||
|
const studentScore: any = {
|
||||||
|
studentId: Number(student.studentId),
|
||||||
|
// ... 其他字段
|
||||||
|
};
|
||||||
|
|
||||||
|
// 编辑时包含学生评分记录的ID,新增时不包含
|
||||||
|
if (form.id && student.id) {
|
||||||
|
studentScore.id = student.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
return studentScore;
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 修复类型比较错误
|
||||||
|
|
||||||
|
**修改内容:**
|
||||||
|
```typescript
|
||||||
|
// 修复前
|
||||||
|
if (
|
||||||
|
form.totalScore !== null &&
|
||||||
|
form.totalScore !== undefined &&
|
||||||
|
form.totalScore !== '' && // ❌ 类型不匹配:number !== string
|
||||||
|
form.totalScore !== 0 &&
|
||||||
|
String(form.totalScore) !== '0'
|
||||||
|
) {
|
||||||
|
|
||||||
|
// 修复后
|
||||||
|
if (
|
||||||
|
form.totalScore !== null &&
|
||||||
|
form.totalScore !== undefined &&
|
||||||
|
form.totalScore !== 0 &&
|
||||||
|
String(form.totalScore) !== '0'
|
||||||
|
) {
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. 添加调试日志
|
||||||
|
|
||||||
|
**新增内容:**
|
||||||
|
```typescript
|
||||||
|
// 调试日志:输出提交的数据结构
|
||||||
|
console.log('提交的完整数据:', submitData);
|
||||||
|
console.log('学生评分数据:', studentScores);
|
||||||
|
console.log('是否为编辑模式:', !!form.id);
|
||||||
|
```
|
||||||
|
|
||||||
|
## 修复要点
|
||||||
|
|
||||||
|
### 1. 数据完整性
|
||||||
|
- **编辑模式**:包含学生评分记录的 `id` 字段
|
||||||
|
- **新增模式**:不包含 `id` 字段(为 `undefined`)
|
||||||
|
|
||||||
|
### 2. 类型安全
|
||||||
|
- 移除不必要的字符串比较
|
||||||
|
- 确保数字类型字段的正确处理
|
||||||
|
|
||||||
|
### 3. 调试支持
|
||||||
|
- 添加详细的调试日志
|
||||||
|
- 便于问题排查和数据验证
|
||||||
|
|
||||||
|
## 后端处理逻辑
|
||||||
|
|
||||||
|
### 当前实现
|
||||||
|
后端采用"删除后重新插入"的策略:
|
||||||
|
1. 逻辑删除原有学生评分记录
|
||||||
|
2. 插入新的学生评分记录
|
||||||
|
|
||||||
|
### 优势
|
||||||
|
- 简化了数据一致性处理
|
||||||
|
- 避免了复杂的更新逻辑
|
||||||
|
- 确保数据的完整性
|
||||||
|
|
||||||
|
### 注意事项
|
||||||
|
- 即使前端传递了学生评分记录的ID,后端也不会使用它来更新现有记录
|
||||||
|
- 但传递ID有助于数据追踪和调试
|
||||||
|
|
||||||
|
## 测试验证
|
||||||
|
|
||||||
|
### 1. 编辑模式测试
|
||||||
|
- ✅ 正确获取历史学生评分数据
|
||||||
|
- ✅ 包含学生评分记录的ID
|
||||||
|
- ✅ 提交数据格式正确
|
||||||
|
|
||||||
|
### 2. 新增模式测试
|
||||||
|
- ✅ 不包含学生评分记录的ID
|
||||||
|
- ✅ 数据格式符合新增要求
|
||||||
|
|
||||||
|
### 3. 类型安全测试
|
||||||
|
- ✅ 移除类型不匹配的比较
|
||||||
|
- ✅ 确保数字字段的正确处理
|
||||||
|
|
||||||
|
## 总结
|
||||||
|
|
||||||
|
通过本次修复,解决了宿舍卫生检查编辑时学生评分ID缺失的问题,确保了:
|
||||||
|
|
||||||
|
1. **数据完整性**:编辑时正确传递学生评分记录的ID
|
||||||
|
2. **类型安全**:修复了类型比较错误
|
||||||
|
3. **调试支持**:添加了详细的调试日志
|
||||||
|
4. **向后兼容**:新增模式不受影响
|
||||||
|
|
||||||
|
修复后的代码能够正确处理编辑和新增两种模式,确保数据的准确性和一致性。
|
||||||
@@ -641,7 +641,7 @@ export interface DormHygieneCheckCompleteForm extends DormHygieneCheckForm {
|
|||||||
/**
|
/**
|
||||||
* 学生评分数据列表
|
* 学生评分数据列表
|
||||||
*/
|
*/
|
||||||
studentData?: DormHygieneStudentScoreForm[];
|
studentScores?: DormHygieneStudentScoreForm[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+115
-20
@@ -491,11 +491,22 @@ const setCachedData = (key: string, data: any[]) => {
|
|||||||
cacheTimestamps.value.set(key, Date.now());
|
cacheTimestamps.value.set(key, Date.now());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 生成默认检查标题的辅助函数
|
||||||
|
const generateDefaultCheckTitle = () => {
|
||||||
|
const now = new Date();
|
||||||
|
const year = now.getFullYear();
|
||||||
|
const month = String(now.getMonth() + 1).padStart(2, '0');
|
||||||
|
const day = String(now.getDate()).padStart(2, '0');
|
||||||
|
const defaultTitle = `${year}${month}${day}宿舍卫生检查`;
|
||||||
|
console.log('生成默认检查标题:', defaultTitle);
|
||||||
|
return defaultTitle;
|
||||||
|
};
|
||||||
|
|
||||||
// 表单数据
|
// 表单数据
|
||||||
const initFormData: DormHygieneCheckForm = {
|
const initFormData: DormHygieneCheckForm = {
|
||||||
id: undefined,
|
id: undefined,
|
||||||
deleted: undefined,
|
deleted: undefined,
|
||||||
checkTitle: undefined,
|
checkTitle: generateDefaultCheckTitle(), // 默认以时间开头的检查标题
|
||||||
checkDate: new Date().toISOString().slice(0, 19).replace('T', ' '), // 默认当前时间
|
checkDate: new Date().toISOString().slice(0, 19).replace('T', ' '), // 默认当前时间
|
||||||
checkerId: undefined, // 将在组件挂载时通过API获取当前登录用户ID
|
checkerId: undefined, // 将在组件挂载时通过API获取当前登录用户ID
|
||||||
checkerName: undefined, // 将在组件挂载时通过API获取当前登录用户姓名
|
checkerName: undefined, // 将在组件挂载时通过API获取当前登录用户姓名
|
||||||
@@ -602,6 +613,11 @@ watch(
|
|||||||
|
|
||||||
// 如果是新增(没有id),设置默认值
|
// 如果是新增(没有id),设置默认值
|
||||||
if (!newData.id) {
|
if (!newData.id) {
|
||||||
|
// 检查标题默认值 - 修复判断逻辑
|
||||||
|
if (!newData.checkTitle || newData.checkTitle === '') {
|
||||||
|
defaultData.checkTitle = generateDefaultCheckTitle();
|
||||||
|
}
|
||||||
|
|
||||||
// 检查日期默认值
|
// 检查日期默认值
|
||||||
if (!newData.checkDate) {
|
if (!newData.checkDate) {
|
||||||
defaultData.checkDate = new Date().toISOString().slice(0, 19).replace('T', ' ');
|
defaultData.checkDate = new Date().toISOString().slice(0, 19).replace('T', ' ');
|
||||||
@@ -642,7 +658,27 @@ watch(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Object.assign(form, { ...defaultData, ...newData });
|
// 确保新增时默认值正确设置
|
||||||
|
if (!newData.id) {
|
||||||
|
// 新增时,优先使用默认值,然后合并传入的数据
|
||||||
|
// 过滤掉空字符串,确保默认值不被覆盖
|
||||||
|
const filteredNewData: any = {};
|
||||||
|
Object.keys(newData).forEach((key) => {
|
||||||
|
const value = (newData as any)[key];
|
||||||
|
if (value !== '' && value !== null && value !== undefined) {
|
||||||
|
filteredNewData[key] = value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
console.log('原始传入数据:', newData);
|
||||||
|
console.log('过滤后数据:', filteredNewData);
|
||||||
|
console.log('默认数据:', defaultData);
|
||||||
|
Object.assign(form, { ...defaultData, ...filteredNewData });
|
||||||
|
console.log('新增模式 - 设置表单数据:', form);
|
||||||
|
} else {
|
||||||
|
// 编辑时,直接使用传入的数据
|
||||||
|
Object.assign(form, { ...defaultData, ...newData });
|
||||||
|
console.log('编辑模式 - 设置表单数据:', form);
|
||||||
|
}
|
||||||
|
|
||||||
if (newData.id) {
|
if (newData.id) {
|
||||||
handleAttachmentData();
|
handleAttachmentData();
|
||||||
@@ -669,6 +705,7 @@ const handleClose = () => {
|
|||||||
const resetForm = () => {
|
const resetForm = () => {
|
||||||
const resetData = { ...initFormData };
|
const resetData = { ...initFormData };
|
||||||
resetData.checkDate = new Date().toISOString().slice(0, 19).replace('T', ' '); // 重置时使用当前时间
|
resetData.checkDate = new Date().toISOString().slice(0, 19).replace('T', ' '); // 重置时使用当前时间
|
||||||
|
resetData.checkTitle = generateDefaultCheckTitle(); // 重置时重新生成检查标题
|
||||||
Object.assign(form, resetData);
|
Object.assign(form, resetData);
|
||||||
|
|
||||||
// 异步获取并设置当前登录用户信息
|
// 异步获取并设置当前登录用户信息
|
||||||
@@ -705,29 +742,43 @@ const submitForm = () => {
|
|||||||
form.attachmentIds = attachmentOssIds.join(',');
|
form.attachmentIds = attachmentOssIds.join(',');
|
||||||
|
|
||||||
// 处理学生信息数据,转换为符合API接口的格式
|
// 处理学生信息数据,转换为符合API接口的格式
|
||||||
const studentData = roomStudents.value.map((student: any) => ({
|
const studentScores = roomStudents.value.map((student: any) => {
|
||||||
studentId: student.studentId,
|
const studentScore: any = {
|
||||||
studentName: student.studentName,
|
studentId: Number(student.studentId), // 确保是数字类型
|
||||||
studentNo: student.studentNo,
|
studentName: student.studentName,
|
||||||
className: student.className,
|
studentNo: student.studentNo,
|
||||||
majorName: student.majorName,
|
className: student.className,
|
||||||
collegeName: student.collegeName,
|
majorName: student.majorName,
|
||||||
bedId: student.bedId,
|
collegeName: student.collegeName,
|
||||||
bedCode: student.bedName, // 使用bedName作为bedCode
|
bedId: student.bedId ? Number(student.bedId) : undefined,
|
||||||
studentScore: student.student_score, // 转换为驼峰命名
|
bedCode: student.bedName, // 使用bedName作为bedCode
|
||||||
attendanceStatus: student.attendance_status, // 转换为驼峰命名
|
studentScore: student.student_score ? Number(student.student_score) : undefined, // 确保是数字类型
|
||||||
studentGrade: student.student_grade, // 转换为驼峰命名
|
attendanceStatus: student.attendance_status,
|
||||||
isResponsiblePerson: student.isResponsiblePerson || 0,
|
studentGrade: student.student_grade,
|
||||||
scoreRemarks: student.scoreRemarks || '',
|
isResponsiblePerson: student.isResponsiblePerson ? Number(student.isResponsiblePerson) : 0, // 确保是数字类型
|
||||||
improvementNotes: student.improvementNotes || ''
|
scoreRemarks: student.scoreRemarks || '',
|
||||||
}));
|
improvementNotes: student.improvementNotes || ''
|
||||||
|
};
|
||||||
|
|
||||||
|
// 编辑时包含学生评分记录的ID,新增时不包含
|
||||||
|
if (form.id && student.id) {
|
||||||
|
studentScore.id = student.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
return studentScore;
|
||||||
|
});
|
||||||
|
|
||||||
// 构建完整的提交数据
|
// 构建完整的提交数据
|
||||||
const submitData: DormHygieneCheckCompleteForm = {
|
const submitData: DormHygieneCheckCompleteForm = {
|
||||||
...form,
|
...form,
|
||||||
studentData: studentData
|
studentScores: studentScores
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 调试日志:输出提交的数据结构
|
||||||
|
console.log('提交的完整数据:', submitData);
|
||||||
|
console.log('学生评分数据:', studentScores);
|
||||||
|
console.log('是否为编辑模式:', !!form.id);
|
||||||
|
|
||||||
emit('submit', submitData);
|
emit('submit', submitData);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('提交表单时发生错误:', error);
|
console.error('提交表单时发生错误:', error);
|
||||||
@@ -1056,6 +1107,50 @@ const loadRoomStudents = async () => {
|
|||||||
|
|
||||||
roomStudentsLoading.value = true;
|
roomStudentsLoading.value = true;
|
||||||
try {
|
try {
|
||||||
|
// 如果是编辑模式且有检查记录ID,优先从学生评分表获取历史数据
|
||||||
|
if (form.id) {
|
||||||
|
console.log('编辑模式:从学生评分表获取历史数据,检查记录ID:', form.id);
|
||||||
|
|
||||||
|
// 调用获取学生评分数据的接口
|
||||||
|
const studentScoresRes = await request({
|
||||||
|
url: '/dormHygieneStudentScore/dormHygieneStudentScore/getByCheckId/' + form.id,
|
||||||
|
method: 'get'
|
||||||
|
});
|
||||||
|
|
||||||
|
if (studentScoresRes.code === 200 && studentScoresRes.data && studentScoresRes.data.length > 0) {
|
||||||
|
console.log('获取到历史学生评分数据:', studentScoresRes.data);
|
||||||
|
|
||||||
|
// 将历史评分数据转换为表格显示格式
|
||||||
|
roomStudents.value = studentScoresRes.data.map((studentScore: any) => ({
|
||||||
|
// 保存学生评分记录的ID,用于编辑时提交
|
||||||
|
id: studentScore.id,
|
||||||
|
studentId: studentScore.studentId,
|
||||||
|
studentName: studentScore.studentName,
|
||||||
|
studentNo: studentScore.studentNo,
|
||||||
|
className: studentScore.className,
|
||||||
|
majorName: studentScore.majorName,
|
||||||
|
collegeName: studentScore.collegeName,
|
||||||
|
bedId: studentScore.bedId,
|
||||||
|
bedName: studentScore.bedCode, // 使用bedCode作为bedName显示
|
||||||
|
gender: studentScore.gender || '1', // 默认女性,如果没有性别字段
|
||||||
|
// 使用历史评分数据
|
||||||
|
student_score: studentScore.studentScore || null,
|
||||||
|
attendance_status: studentScore.attendanceStatus || '1',
|
||||||
|
student_grade: studentScore.studentGrade || 'A',
|
||||||
|
isResponsiblePerson: studentScore.isResponsiblePerson || 0,
|
||||||
|
scoreRemarks: studentScore.scoreRemarks || '',
|
||||||
|
improvementNotes: studentScore.improvementNotes || ''
|
||||||
|
}));
|
||||||
|
|
||||||
|
console.log('转换后的学生数据:', roomStudents.value);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
console.log('未获取到历史学生评分数据,从房间学生表获取基础数据');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增模式或没有历史数据时,从房间学生表获取基础数据
|
||||||
|
console.log('从房间学生表获取基础数据,房间ID:', form.roomId);
|
||||||
const res = await request({
|
const res = await request({
|
||||||
url: '/dormBedStudent/dormBedStudent/getRoomStudents',
|
url: '/dormBedStudent/dormBedStudent/getRoomStudents',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
@@ -1385,7 +1480,7 @@ const handleStudentGradeChange = (student: any) => {
|
|||||||
// 处理宿舍总分变化 - 自动填写学生个人得分
|
// 处理宿舍总分变化 - 自动填写学生个人得分
|
||||||
const handleTotalScoreChange = () => {
|
const handleTotalScoreChange = () => {
|
||||||
// 验证宿舍总分范围
|
// 验证宿舍总分范围
|
||||||
if (form.totalScore !== null && form.totalScore !== undefined && form.totalScore !== '' && form.totalScore !== 0) {
|
if (form.totalScore !== null && form.totalScore !== undefined && form.totalScore !== 0 && String(form.totalScore) !== '0') {
|
||||||
const score = parseFloat(form.totalScore.toString());
|
const score = parseFloat(form.totalScore.toString());
|
||||||
if (isNaN(score) || score < 0 || score > 100) {
|
if (isNaN(score) || score < 0 || score > 100) {
|
||||||
ElMessage.warning('宿舍总分必须在0-100分之间');
|
ElMessage.warning('宿舍总分必须在0-100分之间');
|
||||||
|
|||||||
Reference in new issue
Block a user