提交宿舍区去除的业务修改

This commit is contained in:
zlwu committed 2025-09-04 12:29:51 +08:00
1 parent 99b771bb51
commit 2a38245ae2
24 files changed
+1139 -557

No files matched your search

@@ -333,4 +333,83 @@ public interface DormHygieneStudentScoreMapper extends BaseMapperPlus<DormHygien
**文档版本:** v1.0
**创建时间:** 2025-01-28
**维护人员:** 系统开发团队
**维护人员:** 系统开发团队
---
## 修复记录
### 2025-01-29 界面问题修复
#### 修复问题一:新增时个人扣分默认值显示
**问题现象:** 点击新增按钮时,弹窗中房间学生信息列表的个人扣分列显示默认0分placeholder,而不是直接填入0。
**解决方案:** 修改`DormHygieneCheckDialog.vue`中`loadRoomStudents`方法,将新增模式下学生的`student_score`默认值从`null`改为`0`。
```javascript
// 修改前
student_score: student.student_score || null, // 个人得分,默认为空
// 修改后
student_score: 0, // 个人得分,新增时默认为0
```
#### 修复问题二:宿舍扣分变为0时个人扣分不同步更新
**问题现象:** 当宿舍扣分从1改成0时,房间学生信息列表中个人扣分还是1,没有变成0。
**解决方案:** 修改`handleTotalScoreChange`方法,添加对0分的特别处理逻辑。
```javascript
// 修改后的逻辑
const handleTotalScoreChange = () => {
// 验证宿舍总分范围
if (form.totalScore !== null && form.totalScore !== undefined && form.totalScore !== '') {
// 处理非0分情况
const score = parseFloat(form.totalScore.toString());
if (isNaN(score) || score < 0 || score > 100) {
ElMessage.warning('宿舍总分必须在0-100分之间');
form.totalScore = 0;
return;
}
// 自动为所有学生设置相同的个人得分(包括0分)
if (roomStudents.value.length > 0) {
roomStudents.value.forEach((student: any) => {
student.student_score = score;
});
ElMessage.success(`已自动为${roomStudents.value.length}名学生设置个人得分:${score}分`);
}
} else if (form.totalScore === 0 || form.totalScore === '0') {
// 特别处理0分的情况
if (roomStudents.value.length > 0) {
roomStudents.value.forEach((student: any) => {
student.student_score = 0;
});
ElMessage.success(`已自动为${roomStudents.value.length}名学生设置个人得分:0分`);
}
}
};
```
#### 修复问题三:房间排序问题
**问题现象:** 选择宿舍楼名称后,房间名称按照sort序号进行排序返回,但因为每层房间的sort都从0开始编码,导致返回数据把每个楼层的第一个房间先返回。
**解决方案:** 修改后端`XgDormRoomServiceImpl.java`中的`buildQueryWrapper`方法,调整排序逻辑为先按楼层再按sort排序。
```java
// 修改前
lqw.orderByAsc(XgDormRoom::getSort); // 第一优先级:按排序号升序
lqw.orderByAsc(XgDormRoom::getFloorNum); // 第二优先级:按楼层升序
// 修改后
lqw.orderByAsc(XgDormRoom::getFloorNum); // 第一优先级:按楼层升序
lqw.orderByAsc(XgDormRoom::getSort); // 第二优先级:按排序号升序
```
#### 修复效果
1. **问题一**:新增时个人扣分直接显示0,用户体验更好
2. **问题二**:宿舍扣分与个人扣分完全同步,包括0分的情况
3. **问题三**:房间列表按楼层顺序显示,每层内部按sort排序,符合用户期望
#### 涉及文件
- `web/src/views/xg/xgss/dormHygieneCheck/dormHygieneCheck/DormHygieneCheckDialog.vue`
- `backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormRoomServiceImpl.java`
+135 -41
View File
@@ -2,11 +2,13 @@
## 接口说明
本文档描述了获取宿舍楼树形结构数据的API接口,该接口返回校区-宿舍区-宿舍楼的三级树形结构,其中校区和宿舍区节点不可选,只有宿舍楼节点可以选择。
本文档描述了获取宿舍楼树形结构数据的API接口。**重要变更**:根据业务需求调整,主要接口已从 "校区-宿舍区-宿舍楼" 三级结构改为 "校区-宿舍楼" 二级结构,隐藏宿舍区层级,简化用户操作。
## 接口定义
### 获取宿舍楼树形结构
### 🔄 主要接口(二级结构)
#### 1. 获取宿舍楼树形结构(推荐使用)
**请求URL**:`/sslxx/dormBuilding/buildingTree`
@@ -14,6 +16,8 @@
**权限标识**:`sslxx:dormBuilding:list`
**结构说明**:校区-宿舍楼二级结构,校区不可选,只有宿舍楼可以选择
**请求参数**:无
**响应示例**:
@@ -30,24 +34,16 @@
"disabled": true,
"children": [
{
"id": 101,
"label": "东区宿舍区",
"nodeType": "area",
"disabled": true,
"children": [
{
"id": 1001,
"label": "1号楼",
"nodeType": "building",
"disabled": false
},
{
"id": 1002,
"label": "2号楼",
"nodeType": "building",
"disabled": false
}
]
"id": 1001,
"label": "1号楼",
"nodeType": "building",
"disabled": false
},
{
"id": 1002,
"label": "2号楼",
"nodeType": "building",
"disabled": false
}
]
},
@@ -58,22 +54,92 @@
"disabled": true,
"children": [
{
"id": 201,
"label": "西区宿舍区",
"nodeType": "area",
"id": 2001,
"label": "3号楼",
"nodeType": "building",
"disabled": false
},
{
"id": 2002,
"label": "4号楼",
"nodeType": "building",
"disabled": false
}
]
}
]
}
```
#### 2. 获取宿舍楼树形结构(基于权限)
**请求URL**:`/xgss/dormBuildingTree/list`
**请求方式**:`GET`
**权限标识**:`xgss:dormBuildingTree:list`
**结构说明**:校区-宿舍楼二级结构,根据当前用户权限过滤
**请求参数**:
| 参数名 | 类型 | 必填 | 描述 |
|-----------|--------|------|----------------|
| campusId | Long | 否 | 校区ID过滤条件 |
| buildingName | String | 否 | 宿舍楼名称过滤条件 |
**响应格式**:与上述接口相同
#### 3. 获取所有宿舍楼树形结构(不考虑权限)
**请求URL**:`/xgss/dormBuildingTree/listAll`
**请求方式**:`GET`
**权限标识**:`xgss:dormBuildingTree:list`
**结构说明**:校区-宿舍楼二级结构,返回所有数据,不进行权限过滤
**响应格式**:与上述接口相同
### 📋 特殊用途接口(三级结构)
#### 4. 获取完整宿舍楼树形结构(包含宿舍区)
**请求URL**:`/xgss/dormBuildingTree/fullList`
**请求方式**:`GET`
**权限标识**:`xgss:dormBuildingTree:list`
**结构说明**:校区-宿舍区-宿舍楼三级结构,仅用于特殊需求
**响应示例**:
```json
{
"code": 200,
"msg": "操作成功",
"data": [
{
"id": 1,
"label": "东校区",
"type": "campus",
"disabled": true,
"children": [
{
"id": 101,
"label": "东区宿舍区",
"type": "area",
"disabled": true,
"children": [
{
"id": 2001,
"label": "3号楼",
"nodeType": "building",
"disabled": false
},
{
"id": 2002,
"label": "4号楼",
"nodeType": "building",
"disabled": false
"id": 1001,
"label": "1号楼",
"type": "building",
"disabled": false,
"buildingFloors": 6,
"buildingType": "1"
}
]
}
@@ -85,7 +151,7 @@
## 数据结构
### BuildingTreeSelectVo
### BuildingTreeSelectVo(二级结构)
树形结构节点对象:
@@ -93,7 +159,7 @@
|------------|-------------------|----------------------------------------|
| id | Long | 节点ID |
| label | String | 节点名称 |
| nodeType | String | 节点类型:campus(校区)、area(宿舍区)、building(宿舍楼) |
| nodeType | String | 节点类型:campus(校区)、building(宿舍楼) |
| disabled | Boolean | 是否禁用选择 |
| children | List<BuildingTreeSelectVo> | 子节点列表 |
| createBy | Long | 创建者 |
@@ -101,6 +167,20 @@
| updateBy | Long | 更新者 |
| updateTime | Date | 更新时间 |
### DormBuildingTreeVo(完整结构)
完整三级结构节点对象:
| 字段名 | 类型 | 描述 |
|-----------------|-------------------|----------------------------------------|
| id | Long | 节点ID |
| label | String | 节点名称 |
| type | String | 节点类型:campus(校区)、area(宿舍区)、building(宿舍楼) |
| disabled | Boolean | 是否禁用选择 |
| children | List<DormBuildingTreeVo> | 子节点列表 |
| buildingFloors | Integer | 宿舍楼层数(仅宿舍楼节点) |
| buildingType | String | 宿舍楼类型(仅宿舍楼节点) |
## 使用方法
### 前端使用示例
@@ -114,7 +194,7 @@ import type { BuildingTreeSelectVo } from '@/api/sslxx/dormBuilding/types';
// 在组件的setup函数中
const treeData = ref<BuildingTreeSelectVo[]>([]);
// 加载宿舍楼树形数据
// 加载宿舍楼树形数据(推荐使用二级结构)
const loadBuildingTree = async () => {
try {
const res = await getBuildingTree();
@@ -155,20 +235,34 @@ loadBuildingTree();
## 特殊说明
1. 接口返回的树形结构中,校区和宿舍区节点已设置 `disabled=true`,前端无需额外处理即可实现只能选择宿舍楼节点的效果
2. 使用 `check-strictly=true` 可以确保树形选择器的选中状态不会级联影响父子节点
3. 该接口已支持管理员分配宿舍楼管理范围的业务需求
### ⚠️ 重要变更说明
1. **主要接口结构调整**:为简化用户操作,去除宿舍区概念,主要接口已改为二级结构
2. **向后兼容**:保留了 `fullList` 接口供需要完整三级结构的特殊场景使用
3. **业务影响**:前端界面将不再显示宿舍区层级,用户直接在校区下选择宿舍楼
### 📋 使用建议
1. **推荐使用二级结构接口**:适用于绝大多数业务场景
2. **校区节点设置为不可选**:确保用户只能选择宿舍楼
3. **使用权限过滤接口**:根据用户权限显示相应的宿舍楼范围
## 相关API接口
- [宿舍管理员授权API](./宿舍管理员授权API.md)
- [宿舍床位分配管理API](./宿舍床位分配管理API.md)
## 数据库关系
- `xg_dorm_building` 表通过 `campus_id` 字段关联 `xg_dorm_campus` 表
- `xg_dorm_building` 表通过 `area_id` 字段关联 `xg_dorm_area` 表
- `xg_dorm_building` 表通过 `area_id` 字段关联 `xg_dorm_area` 表(数据库保留,UI隐藏)
- `xg_dorm_area` 表通过 `campus_id` 字段关联 `xg_dorm_campus` 表
## 版本历史
- **2025-01-29**: 接口结构重大调整,主要接口从三级改为二级结构
- **2025-07-20**: 初始版本,三级结构
## 最后更新时间
2025-07-20
2025-01-29
+2 -2
View File
@@ -4376,7 +4376,7 @@ CREATE TABLE `xg_dorm_hygiene_check` (
`area_name` varchar(100) DEFAULT NULL COMMENT '宿舍区名称',
`campus_id` bigint(20) DEFAULT NULL COMMENT '校区ID,关联xg_dorm_campus.id',
`campus_name` varchar(100) DEFAULT NULL COMMENT '校区名称',
`total_score` decimal(5,2) DEFAULT NULL COMMENT '宿舍总分(0-100分)',
`total_score` decimal(5,2) DEFAULT NULL COMMENT '宿舍扣分(0-100分)',
`hygiene_grade` char(1) DEFAULT NULL COMMENT '卫生等级(A优秀 B良好 C合格 D不合格)',
`attachment_ids` text COMMENT '附件OSS ID列表,逗号分隔',
`check_summary` text COMMENT '检查总结',
@@ -4422,7 +4422,7 @@ CREATE TABLE `xg_dorm_hygiene_student_score` (
`college_name` varchar(100) DEFAULT NULL COMMENT '学院名称',
`bed_id` bigint(20) DEFAULT NULL COMMENT '床位ID,关联xg_dorm_bed.id',
`bed_code` varchar(50) DEFAULT NULL COMMENT '床位编号',
`student_score` decimal(5,2) DEFAULT NULL COMMENT '学生个人得分(0-100分)',
`student_score` decimal(5,2) DEFAULT NULL COMMENT '学生个人扣分(0-100分)',
`attendance_status` char(1) DEFAULT '1' COMMENT '出勤状态(1在寝 2外出 3请假 4其他)',
`student_grade` char(1) DEFAULT NULL COMMENT '学生评级(A优秀 B良好 C合格 D不合格)',
`is_responsible_person` tinyint(1) DEFAULT '0' COMMENT '是否为寝室长(0否 1是)',