dev #8

Merged
hy merged 45 commits from dev into master 2025-08-26 19:03:29 +08:00
7 changed files with 184 additions and 260 deletions
Showing only changes of commit 10b9a5caed - Show all commits

1
.gitignore vendored
View File

@ -21,3 +21,4 @@ tests/**/coverage/
*.sln
tsconfig.tsbuildinfo
.vscode
.vscode/settings.json

View File

@ -7,7 +7,8 @@
"editor.tabSize": 2,
"editor.formatOnPaste": true,
"editor.guides.bracketPairs": "active",
"files.autoSave": "afterDelay",
// "files.autoSave": "afterDelay",
"files.autoSave": "off",
"git.confirmSync": false,
"workbench.startupEditor": "newUntitledFile",
"editor.suggestSelection": "first",

View File

@ -62,7 +62,7 @@ const tableData: TableConfig = {
grade: {
label: "年级",
width: "120px",
custom: (s) => `${s.gradeYear}${s.gradeLevel}`,
// custom: (s) => `${s.gradeLevel}${s.gradeYear}`,
search: true,
add: false, //
edit: false, //

View File

@ -133,6 +133,15 @@ const tableData: TableConfig = {
add: true, //
edit: true, //
},
baseSchoolScore: {
label: "资源校平均分",
// rules: ruleRequiredNumber,
search: true,
width: "150px",
setting: {},
add: true, //
edit: true, //
},
startTime: {
label: "考试时间",
width: "210px",

View File

@ -1,32 +1,12 @@
<template>
<div>
<el-form
ref="userEditForm"
:model="form"
:label-width="formLabelWidth"
clearable
>
<el-form ref="userEditForm" :model="form" :label-width="formLabelWidth" clearable>
<el-row>
<el-col :span="12">
<el-form-item label="账号:" prop="Account">
<el-input
type="text"
v-model="form.account"
autocomplete="off"
minlength="6"
maxlength="33"
:show-word-limit="true"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="电话号码" :rules="rulePhone" prop="phone">
<el-input type="text" v-model="form.phone" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="姓名:" prop="realName" :rules="ruleRequired">
<el-input
@ -38,7 +18,10 @@
/>
</el-form-item>
</el-col>
<el-col :span="12">
</el-row>
<el-row>
<!-- <el-col :span="12">
<el-form-item label="所属云校" prop="cloudSchoolId">
<el-select
v-model="form.cloudSchoolId"
@ -55,7 +38,7 @@
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-col> -->
</el-row>
<el-row v-show="form.userType === 1">
@ -119,12 +102,9 @@
<el-col :span="24">
<el-form-item label="学生层次:" prop="level">
<el-radio-group v-model="form.subjectLevel.Level">
<el-radio
v-for="(item, i) in userLevelList"
:key="i"
:label="item.value"
>{{ item.text }}</el-radio
>
<el-radio v-for="(item, i) in userLevelList" :key="i" :label="item.value">{{
item.text
}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
@ -134,10 +114,7 @@
<el-col :span="24">
<el-form-item label="科目层次:">
<ul class="userform_ul">
<li
v-for="(value, i) in getUserSubjectLevel(form.subjectLevel)"
:key="i"
>
<li v-for="(value, i) in getUserSubjectLevel(form.subjectLevel)" :key="i">
{{ userLevel2subject(value[0]) }}:
<el-radio-group v-model="form.subjectLevel[value[0]]">
<el-radio
@ -158,43 +135,42 @@
<el-row>
<el-col :span="24">
<el-form-item label="职位:" prop="positionIds" :rules="ruleRequired">
<el-button type="success" @click="CheckPosition()"
>分配职位</el-button
>
<el-button type="success" @click="CheckPosition()">分配职位</el-button>
</el-form-item>
</el-col>
</el-row>
<div
v-for="(position, index) in positionList"
:key="index"
style="padding-left: 120px; padding-bottom: 20px"
>
<div class="subjectTagEnableDiv" v-if="position.enable === false">
<el-tag type="info">{{ "禁用" }}</el-tag>
<el-tag type="info">{{ position.schoolName || "-" }}</el-tag>
<el-tag type="info">{{
position.graduationYear ? position.graduationYear + "届" : "-"
}}</el-tag>
<el-tag type="info">{{ position.grade || "-" }}</el-tag>
<el-tag type="info">{{ position.className || "-" }}</el-tag>
<el-tag type="info">{{ position.subjectName || "-" }}</el-tag>
<el-tag type="info">{{ position.name || "-" }}</el-tag>
<el-tag type="info">{{ position.endTime }}</el-tag>
</div>
<div class="subjectTagEnableDiv" v-else>
<el-tag>{{ position.schoolName || "-" }}</el-tag>
<el-tag type="warning">{{
position.graduationYear ? position.graduationYear + "届" : "-"
}}</el-tag>
<el-tag type="success">{{ position.grade || "-" }}</el-tag>
<el-tag type="primary" class="classTag">{{
position.className || "-"
}}</el-tag>
<el-tag type="info" class="subjectTag">{{
position.subjectName || "-"
}}</el-tag>
<el-tag type="danger">{{ position.name || "-" }}</el-tag>
<div class="max-h-[400px] overflow-auto pb-1">
<div
v-for="(position, index) in positionList"
:key="index"
style="padding-left: 120px; padding-bottom: 20px"
>
<div class="subjectTagEnableDiv" v-if="position.enable === false">
<el-tag type="info">{{ "禁用" }}</el-tag>
<el-tag type="info">{{ position.schoolName || "-" }}</el-tag>
<el-tag type="info">{{
position.graduationYear ? position.graduationYear + "届" : "-"
}}</el-tag>
<el-tag type="info">{{ position.grade || "-" }}</el-tag>
<el-tag type="info">{{ position.className || "-" }}</el-tag>
<el-tag type="info">{{ position.subjectName || "-" }}</el-tag>
<el-tag type="info">{{ position.name || "-" }}</el-tag>
<el-tag type="info">{{ position.endTime }}</el-tag>
</div>
<div class="subjectTagEnableDiv" v-else>
<el-tag>{{ position.schoolName || "-" }}</el-tag>
<el-tag type="warning">{{
position.graduationYear ? position.graduationYear + "届" : "-"
}}</el-tag>
<el-tag type="success">{{ position.grade || "-" }}</el-tag>
<el-tag type="primary" class="classTag">{{
position.className || "-"
}}</el-tag>
<el-tag type="info" class="subjectTag">{{
position.subjectName || "-"
}}</el-tag>
<el-tag type="danger">{{ position.name || "-" }}</el-tag>
</div>
</div>
</div>
<el-form-item>
@ -227,17 +203,13 @@
<script setup lang="ts">
import { ref, reactive, onMounted } from "vue";
import {} from "@/api/user";
import {
cloudSchoolCombo,
getUserInfo,
editUser,
Position
} from "@/api/userCenter";
import { cloudSchoolCombo, getUserInfo, editUser, Position } from "@/api/userCenter";
import PositionForm from "./positionForm.vue";
import { getenum, getenumDic } from "@/api/enum";
import { ruleRequired, rulePhone } from "@/utils/rules";
import { ElMessage } from "element-plus";
import { ElMessage, FormInstance } from "element-plus";
import { ComboModel } from "@/components/hTable/hTable";
import { InformationEvent } from "http";
interface FormData {
id: number;
@ -268,7 +240,7 @@ interface DialogConfig {
width: string;
}
defineOptions({
name: "UserEditForm"
name: "UserEditForm",
});
const props = defineProps<{
@ -281,14 +253,14 @@ const loading = ref(false);
const subject1 = ref<ComboModel[]>([
{ value: 4, text: "物理" },
{ value: 8, text: "历史" }
{ value: 8, text: "历史" },
]);
const subject2 = ref<ComboModel[]>([
{ value: 5, text: "化学" },
{ value: 6, text: "生物" },
{ value: 9, text: "地理" },
{ value: 7, text: "政治" }
{ value: 7, text: "政治" },
]);
const userTypeList = ref<ComboModel[]>([]);
@ -311,7 +283,7 @@ const defaultSubjectLevel = reactive({
Subject7: 0,
Subject8: 0,
Subject9: 0,
CreatePositionId: 1
CreatePositionId: 1,
});
const form = ref<FormData>({
@ -328,14 +300,14 @@ const form = ref<FormData>({
subjectLevels: [],
subjectLevel: { ...defaultSubjectLevel },
positionIds: [],
positionFormIds: []
positionFormIds: [],
});
const dialog = reactive<DialogConfig>({
close: false,
title: "",
visible: false,
width: "1200px"
width: "1200px",
});
const customeRules = reactive({
@ -344,9 +316,9 @@ const customeRules = reactive({
{
pattern: /^1[3456789]\d{9}$/,
message: "手机号码格式不正确",
trigger: "blur"
}
]
trigger: "blur",
},
],
});
const getUserSubjectLevel = (obj: Record<string, any>) => {
@ -354,7 +326,7 @@ const getUserSubjectLevel = (obj: Record<string, any>) => {
form.value.subjectLevel = { ...defaultSubjectLevel };
obj = form.value.subjectLevel;
}
return Object.entries(obj).filter(s => s[0].includes("Subject"));
return Object.entries(obj).filter((s) => s[0].includes("Subject"));
};
const userLevel2subject = (str: string) => {
@ -365,40 +337,31 @@ const userLevel2subject = (str: string) => {
const handlePagedCallback = () => {
// Emit event to parent if needed
};
const userEditForm = ref<FormInstance>();
const handleSubmitForm = () => {
// Form validation and submission logic
loading.value = true;
const formData = {
id: form.value.id || 0,
userType: form.value.userType || 1,
level: form.value.level || 0,
account: form.value.account || "",
// PassWord: form.value.id === 0 ? md5(form.value.PassWord).toUpperCase() : "",
realName: form.value.realName || "",
studentId: form.value.studentId || "",
templateId: form.value.templateId || 0,
subjectLevels: form.value.subjectLevels || [],
subjectLevel: form.value.subjectLevel || { ...defaultSubjectLevel },
positionIds: form.value.positionIds || [],
gLSubject: form.value.gLSubject,
gSubject1: form.value.gSubject1,
gSubject2: form.value.gSubject2,
idCard: form.value.idCard,
cloudSchoolId: form.value.cloudSchoolId,
phone: form.value.phone,
pointPenSN: form.value.pointPenSN
};
userEditForm.value.validate((valid) => {
if (valid) {
loading.value = true;
const formData = {
...form.value,
account: form.value.phone || "",
subjectLevels: form.value.subjectLevels || [],
subjectLevel: form.value.subjectLevel || { ...defaultSubjectLevel },
positionIds: form.value.positionIds || [],
};
editUser(formData).then(res => {
loading.value = false;
if (res.code === 200) {
ElMessage.success("操作成功");
handlePagedCallback();
} else {
ElMessage.error(res.message);
editUser(formData).then((res) => {
loading.value = false;
if (res.code === 200) {
ElMessage.success("操作成功");
handlePagedCallback();
} else {
ElMessage.error(res.message);
}
});
}
});
// Form validation and submission logic
};
const handleResetForm = () => {
@ -416,7 +379,7 @@ const handleResetForm = () => {
idCard: "",
phone: "",
cloudSchoolId: "",
pointPenSN: ""
pointPenSN: "",
});
positionList.value = [];
};
@ -429,11 +392,11 @@ const fetchInitData = async () => {
const typeRes = await getenum("UserTypeEnum");
userTypeList.value = typeRes.data;
//
const schoolRes = await cloudSchoolCombo();
if (schoolRes.code === 200) {
CloudSchoolArr.value = schoolRes.data;
}
// //
// const schoolRes = await cloudSchoolCombo();
// if (schoolRes.code === 200) {
// CloudSchoolArr.value = schoolRes.data;
// }
const enumDicRes = await getenumDic("SubjectEnum");
subjectLEnum.value = enumDicRes.data;
@ -442,7 +405,7 @@ const fetchInitData = async () => {
const fetchFormData = () => {
handleResetForm();
if (props.id !== 0) {
getUserInfo(props.id).then(res => {
getUserInfo(props.id).then((res) => {
if (res.code === 200) {
if (res.data.SubjectLevel && res.data.SubjectLevel.CreatePositionId) {
delete res.data.SubjectLevel.CreatePositionId;
@ -468,7 +431,7 @@ const fetchFormData = () => {
idCard: res.data.idCard,
phone: res.data.phone,
cloudSchoolId: res.data.cloudSchoolId,
pointPenSN: res.data.pointPenSN
pointPenSN: res.data.pointPenSN,
});
positionList.value = res.data.positions;
@ -491,14 +454,14 @@ const CheckPosition = () => {
dialog.title = "选择职位";
dialog.visible = true;
PositionFormIds.value = positionList.value
.filter(s => s.enable !== false)
.map(s => s.id);
.filter((s) => s.enable !== false)
.map((s) => s.id);
};
const handleCheckCallback = (checkPosition: Position[]) => {
dialog.visible = false;
positionList.value = checkPosition;
form.value.positionIds = positionList.value.map(w => w.id);
form.value.positionIds = positionList.value.map((w) => w.id);
};
onMounted(async () => {

View File

@ -25,12 +25,7 @@
</el-form-item> -->
<el-form-item v-show="search.userType === 1" style="width: 100px">
<el-select
v-model="search.level"
placeholder="学生层次"
clearable
filterable
>
<el-select v-model="search.level" placeholder="学生层次" clearable filterable>
<el-option
v-for="item in userLevelList"
:key="item.value"
@ -78,12 +73,7 @@
</el-form-item>
<el-form-item style="width: 100px">
<el-select
v-model="search.classId"
placeholder="班级"
clearable
filterable
>
<el-select v-model="search.classId" placeholder="班级" clearable filterable>
<el-option
v-for="item in classList"
:key="item.value"
@ -95,12 +85,7 @@
</el-form-item>
<el-form-item style="width: 100px">
<el-select
v-model="search.subjectId"
placeholder="科目"
clearable
filterable
>
<el-select v-model="search.subjectId" placeholder="科目" clearable filterable>
<el-option
v-for="item in subjectList"
:key="item.value"
@ -117,10 +102,7 @@
>
</el-form-item>
<el-form-item v-show="selectUser">
<el-button
type="success"
@click="selectUserCallBack()"
icon="el-icon-check"
<el-button type="success" @click="selectUserCallBack()" icon="el-icon-check"
>选择用户</el-button
>
</el-form-item>
@ -161,13 +143,9 @@
<el-table-column prop="id" label="用户Id" width="100" />
<el-table-column label="用户信息" width="200">
<template #default="scope">
<el-tag
:type="getUserTypeTag(scope.row.userType)"
style="margin-right: 5px"
>{{
userTypeList.find(s => s.value == scope.row.userType)?.text
}}</el-tag
>
<el-tag :type="getUserTypeTag(scope.row.userType)" style="margin-right: 5px">{{
userTypeList.find((s) => s.value == scope.row.userType)?.text
}}</el-tag>
<span>{{ scope.row.realName }} </span>
</template>
</el-table-column>
@ -183,9 +161,7 @@
<div
v-for="(position, index) in scope.row.positions"
:key="'Position' + index"
v-show="
index < 3 || (index >= 3 && showAllPosition.includes(scope.row))
"
v-show="index < 3 || (index >= 3 && showAllPosition.includes(scope.row))"
>
<div v-if="position.enable === false">
<el-tag type="info">{{ position.schoolName || "-" }}</el-tag>
@ -213,9 +189,7 @@
</div>
</div>
<div
v-if="
scope.row.positions != undefined && scope.row.positions.length > 3
"
v-if="scope.row.positions != undefined && scope.row.positions.length > 3"
@click="showPosition(scope.row)"
class="userTagRow"
>
@ -268,7 +242,7 @@ import {
getSubjectData,
getPageUserList,
UserDetail,
Position
Position,
} from "@/api/userCenter";
import { getenum } from "@/api/enum";
import { hTableAPI } from "@/api/hTable";
@ -280,7 +254,7 @@ import {
Message,
ArrowDownBold,
Search,
Star
Star,
} from "@element-plus/icons-vue";
import { ComboModel } from "@/components/hTable/hTable";
@ -348,20 +322,20 @@ interface DialogData {
const props = defineProps({
selectUser: {
type: Boolean,
default: false
default: false,
},
selectCallBack: {
type: Function,
default: () => {}
default: () => {},
},
maxTableHeight: {
type: Number,
default: 580
default: 580,
},
searchData: {
type: Object as () => SearchParams,
default: undefined
}
default: undefined,
},
});
const baseUrl = import.meta.env.VITE_API_USERCENTER_URL;
@ -382,13 +356,13 @@ const search = reactive<SearchParams>({
grade: "",
classId: "",
subjectId: "",
positionId: ""
positionId: "",
});
const userTypeList = ref<ComboModel[]>([
{ value: 1, text: "学生" },
{ value: 2, text: "教师" },
{ value: 3, text: "管理员" }
{ value: 3, text: "管理员" },
]);
const userLevelList = ref<ComboModel[]>([]);
@ -399,7 +373,7 @@ const gradeList = ref<ComboModel[]>([
{ value: "初三", text: "初三" },
{ value: "高一", text: "高一" },
{ value: "高二", text: "高二" },
{ value: "高三", text: "高三" }
{ value: "高三", text: "高三" },
]);
const classList = ref<ComboModel[]>([]);
const subjectList = ref<ComboModel[]>([]);
@ -409,13 +383,13 @@ const table = reactive<TableData>({
data: [],
selectRows: [],
sort: "",
border: true
border: true,
});
const pagination = reactive<PaginationData>({
index: 1,
size: 10,
total: 0
total: 0,
});
const dialog = reactive<DialogData>({
@ -423,32 +397,32 @@ const dialog = reactive<DialogData>({
update: {
title: "",
visible: false,
width: "800px"
width: "1000px",
},
editLevel: {
userIds: [],
title: "",
visible: false,
width: "400px"
width: "400px",
},
editSubjectLevel: {
userIds: [],
title: "",
visible: false,
width: "450px"
width: "450px",
},
bindUser: {
title: "分配权限码",
visible: false,
width: "1150px",
height: ""
height: "",
},
userBindInfo: {
title: "用户权限码",
visible: false,
width: "1150px",
height: ""
}
height: "",
},
});
const checkUserBindInfo = () => {
@ -511,7 +485,7 @@ const exportUser = async () => {
SubjectId: search.subjectId || 0,
PositionId: search.positionId || 0,
PageIndex: pagination.index,
PageSize: pagination.size
PageSize: pagination.size,
};
// const res = await exportUserApi(data);
@ -563,9 +537,9 @@ const getClass = () => {
const data = {
schoolId: search.schoolId || 0,
graduationYear: search.graduationYear || 0,
grade: search.grade
grade: search.grade,
};
getClassCombo(data).then(res => {
getClassCombo(data).then((res) => {
if (res.code === 200) {
classList.value = res.data;
}
@ -585,12 +559,12 @@ const fetchPagedData = (searchUnUse = false) => {
PositionId: search.positionId || 0,
PageIndex: pagination.index,
PageSize: pagination.size,
UnUsed: searchUnUse
UnUsed: searchUnUse,
};
getPageUserList(data).then(res => {
getPageUserList(data).then((res) => {
if (res.code === 200) {
pagination.total = res.data.total;
res.data.data.forEach(item => {
res.data.data.forEach((item) => {
if (item.positions) {
item.positions = PositionsSort(item.positions);
}
@ -663,14 +637,14 @@ const getUserLevelTag = (level: number) => {
return level === 0
? "info"
: level === 1
? "success"
: level === 2
? "warning"
: "error";
? "success"
: level === 2
? "warning"
: "error";
};
const getUserLevelText = (level: number) => {
const r = userLevelList.value.filter(w => w.value === level);
const r = userLevelList.value.filter((w) => w.value === level);
if (r.length > 0) {
return r[0].text;
}
@ -707,7 +681,7 @@ function pageIndexChange(o) {
const AddDialog = () => {
editId.value = 0;
dialog.update.title = "添加用户";
dialog.update.title = "添加教师";
dialog.update.visible = true;
};
@ -732,7 +706,7 @@ const handleEditLevel = () => {
return;
}
dialog.editLevel.title = "修改学生层次";
dialog.editLevel.userIds = table.selectRows.map(w => w.id);
dialog.editLevel.userIds = table.selectRows.map((w) => w.id);
dialog.editLevel.visible = true;
};
@ -747,7 +721,7 @@ const handleEditSubjectLevel = () => {
return;
}
dialog.editSubjectLevel.title = "修改学生科目层次";
dialog.editSubjectLevel.userIds = table.selectRows.map(w => w.id);
dialog.editSubjectLevel.userIds = table.selectRows.map((w) => w.id);
dialog.editSubjectLevel.visible = true;
};
@ -791,7 +765,7 @@ const importData = () => {
};
const readerBlob = (data: Blob): Promise<any> => {
return new Promise(resolve => {
return new Promise((resolve) => {
const reader = new FileReader();
reader.readAsText(data, "utf-8");
reader.onload = function () {

View File

@ -62,12 +62,7 @@
</el-form-item>
<el-form-item>
<el-select
v-model="search.classId"
placeholder="班级"
clearable
filterable
>
<el-select v-model="search.classId" placeholder="班级" clearable filterable>
<el-option
v-for="item in classList"
:key="item.value"
@ -78,12 +73,7 @@
</el-form-item>
<el-form-item>
<el-select
v-model="search.subjectId"
placeholder="科目"
clearable
filterable
>
<el-select v-model="search.subjectId" placeholder="科目" clearable filterable>
<el-option
v-for="item in subjectList"
:key="item.value"
@ -93,7 +83,7 @@
</el-select>
</el-form-item>
<el-form-item>
<!-- <el-form-item>
<el-select
v-model="search.status"
placeholder="状态"
@ -107,21 +97,16 @@
:value="item.value"
/>
</el-select>
</el-form-item>
</el-form-item> -->
<el-form-item>
<el-button
type="primary"
@click="handleReloadPaged"
icon="el-icon-search"
<el-button type="primary" @click="handleReloadPaged" :icon="Search"
>查询</el-button
>
</el-form-item>
<el-form-item>
<el-button type="success" @click="asyncPosition"
>选择勾选职位</el-button
>
<el-button type="success" @click="asyncPosition">选择勾选职位</el-button>
</el-form-item>
</el-form>
</div>
@ -147,15 +132,11 @@
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="40" />
<el-table-column
prop="name"
label="职位名称[双击行快速选择]"
width="220"
>
<el-table-column prop="name" label="职位名称[双击行快速选择]" width="220">
<template #default="scope">
<span
>{{ scope.row.name }}
<el-tag v-show="selectPositions.find(s => scope.row.Id == s.id)"
<el-tag v-show="selectPositions.find((s) => scope.row.Id == s.id)"
>已选</el-tag
>
</span>
@ -163,29 +144,19 @@
</el-table-column>
<el-table-column prop="positionLevel" label="职级" width="80">
<template #default="scope">
<el-tag v-if="scope.row.positionLevel === 1" type="danger"
>教委</el-tag
>
<el-tag v-else-if="scope.row.positionLevel === 2" type="warning"
>校级</el-tag
>
<el-tag v-if="scope.row.positionLevel === 1" type="danger">教委</el-tag>
<el-tag v-else-if="scope.row.positionLevel === 2" type="warning">校级</el-tag>
<el-tag v-else-if="scope.row.positionLevel === 3">年级</el-tag>
<el-tag v-else-if="scope.row.positionLevel === 4" type="success"
>班级</el-tag
>
<el-tag v-else-if="scope.row.positionLevel === 5" type="info"
>教师</el-tag
>
<el-tag v-else-if="scope.row.positionType === 1" type="info"
>学生</el-tag
>
<el-tag v-else-if="scope.row.positionLevel === 4" type="success">班级</el-tag>
<el-tag v-else-if="scope.row.positionLevel === 5" type="info">教师</el-tag>
<el-tag v-else-if="scope.row.positionType === 1" type="info">学生</el-tag>
</template>
</el-table-column>
<el-table-column label="学校 - 年级 - 班级 - 学科">
<template #default="scope">
<el-tag v-if="!scope.row.status" type="danger">锁定</el-tag>
{{ scope.row.schoolName }} {{ scope.row.grade }}
{{ scope.row.className }} {{ scope.row.subjectName }}
{{ scope.row.schoolName }} {{ scope.row.grade }} {{ scope.row.className }}
{{ scope.row.subjectName }}
</template>
</el-table-column>
</el-table>
@ -198,7 +169,7 @@
style="float: right"
type="success"
@click="handleConfirm"
icon="el-icon-check"
:icon="Check"
>提交分配职位</el-button
>
</div>
@ -217,7 +188,6 @@
</div>
</div>
</template>
<script setup lang="ts">
import { ref, reactive, onMounted } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
@ -228,9 +198,10 @@ import {
getSubjectData,
getPositionList,
getPositions,
Position
Position,
} from "@/api/userCenter";
import { ComboModel } from "@/components/hTable/hTable";
import { Check, Search } from "@element-plus/icons-vue";
interface SearchParams {
schoolId: string | number;
@ -259,16 +230,16 @@ interface Dialog {
const props = defineProps({
userType: {
type: Number,
default: 0
default: 0,
},
positions: {
type: Array as () => number[],
default: () => []
default: () => [],
},
selectionCount: {
type: Number,
default: 999
}
default: 999,
},
});
const emit = defineEmits(["handleCheckCallback", "handleCheckCallback"]);
@ -279,7 +250,7 @@ const search = reactive<SearchParams>({
grade: "",
classId: "",
subjectId: "",
status: ""
status: 1,
});
const selectPositions = ref<Position[]>([]);
@ -290,7 +261,7 @@ const gradeList = ref<ComboModel[]>([
{ value: "初三", text: "初三" },
{ value: "高一", text: "高一" },
{ value: "高二", text: "高二" },
{ value: "高三", text: "高三" }
{ value: "高三", text: "高三" },
]);
const classList = ref<ComboModel[]>([]);
const subjectList = ref<ComboModel[]>([]);
@ -298,17 +269,17 @@ const tableExpandRowKeys = ref<string[]>([]);
const positionList = ref<ComboModel[]>([
{ text: "学生", value: 1 },
{ text: "教师", value: 2 },
{ text: "管理员", value: 3 }
{ text: "管理员", value: 3 },
]);
const statusList = ref<ComboModel[]>([
{ text: "正常", value: 1 },
{ text: "锁定", value: 2 }
{ text: "锁定", value: 2 },
]);
const table = reactive<TableData>({
data: [],
selectRows: [],
border: true
border: true,
});
const dialog = reactive<Dialog>({
@ -317,7 +288,7 @@ const dialog = reactive<Dialog>({
close: false,
title: "编辑职位",
visible: false,
width: "800px"
width: "800px",
});
const authDialog = reactive<Dialog>({
@ -326,7 +297,7 @@ const authDialog = reactive<Dialog>({
close: false,
title: "职位授权",
visible: false,
width: "400px"
width: "400px",
});
const positionTb = ref<FormInstance>();
@ -430,7 +401,7 @@ const gradeChange = () => {
const getClass = async () => {
const data = {
schoolId: search.schoolId || 0,
grade: search.grade
grade: search.grade,
};
const res = await getClassCombo(data);
if (res.code === 200) {
@ -445,12 +416,17 @@ const fetchPagedData = async () => {
ClassId: search.classId || 0,
SubjectId: search.subjectId || 0,
PositionType: search.positionType || 0,
Status: search.status || 0
Status: search.status || 0,
};
const res = await getPositionList(data);
if (res.code === 200) {
table.data = res.data;
tableExpandRowKeys.value = table.data.map(s => s.id.toString());
tableExpandRowKeys.value = [];
tableExpandRowKeys.value = table.data.map((s) => s.id.toString());
debugger;
tableExpandRowKeys.value.push(
res.data.find((s) => s.id == 1).children.map((s) => s.id.toString())
);
}
};
@ -463,7 +439,7 @@ const handleConfirm = () => {
};
const tagClose = (p: Position) => {
selectPositions.value = selectPositions.value.filter(s => s !== p);
selectPositions.value = selectPositions.value.filter((s) => s !== p);
};
const asyncPosition = (event: Event | null, rows?: Position[]) => {
@ -472,9 +448,9 @@ const asyncPosition = (event: Event | null, rows?: Position[]) => {
ElMessage.warning("请选择要分配的职位");
return;
}
const pIds = selectPositions.value.map(s => s.id);
const pIds = selectPositions.value.map((s) => s.id);
selectPositions.value = selectPositions.value.concat(
datas.filter(s => !pIds.includes(s.id))
datas.filter((s) => !pIds.includes(s.id))
);
};
@ -482,7 +458,7 @@ onMounted(async () => {
userTypeToPosition();
if (props.positions && props.positions.length > 0) {
const res = await getPositions(props.positions);
selectPositions.value = res.data.map(s => ({ ...s }));
selectPositions.value = res.data.map((s) => ({ ...s }));
}
fetchInitData();
});