|
|
|
|
@ -64,15 +64,14 @@
|
|
|
|
|
<span>{{ formatDate(row.createTime) }}</span>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="操作" align="center" width="320">
|
|
|
|
|
<el-table-column label="操作" align="center" width="360">
|
|
|
|
|
<template #default="{ row }">
|
|
|
|
|
<template v-if="canOperateStudent(row)">
|
|
|
|
|
<div class="student-action-group">
|
|
|
|
|
<el-button type="info" text @click="editSchool(row)">编辑</el-button>
|
|
|
|
|
<el-button type="danger" text @click="delSchool(row)">删除</el-button>
|
|
|
|
|
<el-button type="success" text @click="initPassword(row, 0)">密码初始化</el-button>
|
|
|
|
|
<el-button type="warning" text @click="initPassword(row, 1)">数据初始化</el-button>
|
|
|
|
|
</template>
|
|
|
|
|
<el-tag v-else type="info">仅查看</el-tag>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
</el-table>
|
|
|
|
|
@ -130,6 +129,7 @@ const userStore = useUserStore();
|
|
|
|
|
const currentUserId = computed(() => userStore.userInfo.userId);
|
|
|
|
|
const currentSchoolId = computed(() => userStore.userInfo.schoolId);
|
|
|
|
|
const isTeacherRosterMode = computed(() => userStore.schoolProductConfig?.studentRosterOwner === "TEACHER");
|
|
|
|
|
const isManagerTeacher = computed(() => userStore.userInfo.teacherAdmin === true);
|
|
|
|
|
import * as indexApi from "@/api/teacher";
|
|
|
|
|
const dialogVisible = ref(false);
|
|
|
|
|
const loading = ref(false);
|
|
|
|
|
@ -194,7 +194,7 @@ const getList = () => {
|
|
|
|
|
};
|
|
|
|
|
// 删除院校
|
|
|
|
|
const delSchool = (id) => {
|
|
|
|
|
indexApi.deleteStudent({ userId: id.userId, operatorId: currentUserId.value, teachingClassId: currentTeachingClassId() }).then((res) => {
|
|
|
|
|
indexApi.deleteStudent({ userId: id.userId, operatorId: currentUserId.value, teachingClassId: resolveRowTeachingClassId(id) }).then((res) => {
|
|
|
|
|
proxy.$message.success("删除成功");
|
|
|
|
|
getList();
|
|
|
|
|
});
|
|
|
|
|
@ -412,36 +412,20 @@ const canUseAdminClassForStudent = (schoolClass) => {
|
|
|
|
|
return !schoolClass?.schoolId || sameValue(schoolClass.schoolId, currentSchoolId.value);
|
|
|
|
|
};
|
|
|
|
|
const classMap = computed(() => new Map(classList.value.map((item) => [item.schoolClassId, item])));
|
|
|
|
|
const adminClassList = computed(() => classList.value.filter((item) => canUseAdminClassForStudent(item)));
|
|
|
|
|
const studentClassOptions = computed(() =>
|
|
|
|
|
isTeacherRosterMode.value ? teachingClassOptions.value : adminClassList.value
|
|
|
|
|
);
|
|
|
|
|
const teachingClassOptions = computed(() =>
|
|
|
|
|
classList.value.filter(
|
|
|
|
|
(schoolClass) =>
|
|
|
|
|
normalizeClassType(schoolClass) === "TEACHING" &&
|
|
|
|
|
sameValue(schoolClass.schoolId, currentSchoolId.value) &&
|
|
|
|
|
sameValue(schoolClass.createdBy, currentUserId.value)
|
|
|
|
|
(isManagerTeacher.value || sameValue(schoolClass.createdBy, currentUserId.value))
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
const canOperateStudent = (row) => {
|
|
|
|
|
const selectedClass = classMap.value.get(paramsquery.value.schoolClassId);
|
|
|
|
|
if (isTeacherRosterMode.value) {
|
|
|
|
|
return Boolean(selectedClass)
|
|
|
|
|
&& normalizeClassType(selectedClass) === "TEACHING"
|
|
|
|
|
&& sameValue(selectedClass.createdBy, currentUserId.value);
|
|
|
|
|
}
|
|
|
|
|
if (selectedClass && normalizeClassType(selectedClass) === "TEACHING") {
|
|
|
|
|
return sameValue(selectedClass.createdBy, currentUserId.value);
|
|
|
|
|
}
|
|
|
|
|
const adminClass = classMap.value.get(row.schoolClassId);
|
|
|
|
|
return normalizeClassType(adminClass) === "ADMIN"
|
|
|
|
|
&& (!adminClass?.schoolId || sameValue(adminClass.schoolId, currentSchoolId.value));
|
|
|
|
|
};
|
|
|
|
|
const studentClassOptions = computed(() => teachingClassOptions.value);
|
|
|
|
|
const currentTeachingClassId = () => {
|
|
|
|
|
const selectedClass = classMap.value.get(paramsquery.value.schoolClassId);
|
|
|
|
|
return selectedClass && normalizeClassType(selectedClass) === "TEACHING" ? selectedClass.schoolClassId : "";
|
|
|
|
|
};
|
|
|
|
|
const resolveRowTeachingClassId = (row) => currentTeachingClassId() || row?.teachingClassId || "";
|
|
|
|
|
const beforeImportStudents = (file) => {
|
|
|
|
|
if (!/\.(xls|xlsx)$/i.test(file.name)) {
|
|
|
|
|
proxy.$message.warning("请选择xls或xlsx格式文件");
|
|
|
|
|
@ -472,7 +456,7 @@ const initPassword = (row, status) => {
|
|
|
|
|
type: "warning",
|
|
|
|
|
})
|
|
|
|
|
.then(() => {
|
|
|
|
|
indexApi.initStudentPassword({ userId: row.userId, operatorId: currentUserId.value, teachingClassId: currentTeachingClassId() }).then((res) => {
|
|
|
|
|
indexApi.initStudentPassword({ userId: row.userId, operatorId: currentUserId.value, teachingClassId: resolveRowTeachingClassId(row) }).then((res) => {
|
|
|
|
|
proxy.$message.success("密码初始化成功");
|
|
|
|
|
getList();
|
|
|
|
|
});
|
|
|
|
|
@ -485,12 +469,13 @@ const initPassword = (row, status) => {
|
|
|
|
|
type: "warning",
|
|
|
|
|
})
|
|
|
|
|
.then(() => {
|
|
|
|
|
if (!paramsquery.value.schoolClassId) {
|
|
|
|
|
const teachingClassId = resolveRowTeachingClassId(row);
|
|
|
|
|
if (!teachingClassId) {
|
|
|
|
|
proxy.$message.warning("请先选择教学班");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
indexApi.initializeTeachingClassStudentTrainingData({
|
|
|
|
|
teachingClassId: paramsquery.value.schoolClassId,
|
|
|
|
|
teachingClassId,
|
|
|
|
|
studentUserId: row.userId,
|
|
|
|
|
operatorId: currentUserId.value,
|
|
|
|
|
}).then((res) => {
|
|
|
|
|
@ -525,5 +510,16 @@ onMounted(async () => {
|
|
|
|
|
position: sticky !important;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.student-action-group {
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
gap: 6px;
|
|
|
|
|
flex-wrap: nowrap;
|
|
|
|
|
white-space: nowrap;
|
|
|
|
|
:deep(.el-button + .el-button) {
|
|
|
|
|
margin-left: 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</style>
|
|
|
|
|
|