index.vue 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848
  1. <template>
  2. <div class="app-container">
  3. <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
  4. <!-- <el-form-item label="用户ID" prop="userId">-->
  5. <!-- <el-input-->
  6. <!-- v-model="queryParams.userId"-->
  7. <!-- placeholder="请输入用户ID"-->
  8. <!-- clearable-->
  9. <!-- @keyup.enter="handleQuery"-->
  10. <!-- />-->
  11. <!-- </el-form-item>-->
  12. <el-form-item label="代理商" prop="agentId">
  13. <IeAgentSelect v-model="queryParams.agentId" placeholder="请选择代理商" filterable clearable style="width: 240px" />
  14. </el-form-item>
  15. <el-form-item label="教师姓名" prop="name">
  16. <el-input
  17. v-model="queryParams.name"
  18. placeholder="请输入教师姓名"
  19. clearable
  20. @keyup.enter="handleQuery"
  21. />
  22. </el-form-item>
  23. <el-form-item label="所在学校" prop="schoolId">
  24. <el-select
  25. v-model="queryParams.schoolId"
  26. placeholder="请选择或输入学校名称"
  27. filterable
  28. clearable
  29. style="width: 240px"
  30. @keyup.enter="handleQuery"
  31. >
  32. <el-option
  33. v-for="item in schoolOptions"
  34. :key="item.id"
  35. :label="item.name"
  36. :value="item.id"
  37. />
  38. </el-select>
  39. </el-form-item>
  40. <el-form-item label="培训校区" prop="campusId">
  41. <el-select
  42. v-model="queryParams.campusId"
  43. placeholder="请选择或输入校区名称"
  44. filterable
  45. clearable
  46. style="width: 240px"
  47. @keyup.enter="handleQuery"
  48. >
  49. <el-option
  50. v-for="item in campusOptions"
  51. :key="item.id"
  52. :label="item.name"
  53. :value="item.id"
  54. />
  55. </el-select>
  56. </el-form-item>
  57. <el-form-item>
  58. <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
  59. <el-button icon="Refresh" @click="resetQuery">重置</el-button>
  60. </el-form-item>
  61. </el-form>
  62. <el-row :gutter="10" class="mb8">
  63. <el-col :span="1.5">
  64. <el-button
  65. type="primary"
  66. plain
  67. icon="Plus"
  68. @click="handleAdd"
  69. v-hasPermi="['dz:teacher:add']"
  70. >新增</el-button>
  71. </el-col>
  72. <!-- <el-col :span="1.5">
  73. <el-button
  74. type="success"
  75. plain
  76. icon="Edit"
  77. :disabled="single"
  78. @click="handleUpdate"
  79. v-hasPermi="['dz:teacher:edit']"
  80. >修改</el-button>
  81. </el-col> -->
  82. <!-- <el-col :span="1.5">
  83. <el-button
  84. type="danger"
  85. plain
  86. icon="Delete"
  87. :disabled="multiple"
  88. @click="handleDelete"
  89. v-hasPermi="['dz:teacher:remove']"
  90. >删除</el-button>
  91. </el-col> -->
  92. <el-col :span="1.5">
  93. <el-button
  94. type="warning"
  95. plain
  96. icon="Download"
  97. @click="handleExport"
  98. v-hasPermi="['dz:teacher:export']"
  99. >导出</el-button>
  100. </el-col>
  101. <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
  102. </el-row>
  103. <el-table v-loading="loading" :data="teacherList" @selection-change="handleSelectionChange">
  104. <el-table-column type="selection" width="55" align="center" />
  105. <el-table-column label="教师ID/账号" align="center" prop="teacherId" />
  106. <el-table-column label="密码" align="center" prop="password2" />
  107. <el-table-column label="教师姓名" align="center" prop="name" />
  108. <el-table-column label="代理商" align="center" prop="agentName" />
  109. <el-table-column label="所在学校" align="center" prop="schoolName" />
  110. <el-table-column label="所在学校班级" align="center" prop="schoolClass" />
  111. <el-table-column label="培训校区" align="center" prop="campusName" />
  112. <el-table-column label="培训校区班级" align="center" prop="campusClass" />
  113. <el-table-column label="所在机构" align="center" prop="deptName" />
  114. <el-table-column label="用户ID" align="center" prop="userId" />
  115. <el-table-column label="禁用状态" align="center" key="status">
  116. <template #default="scope">
  117. <el-switch
  118. v-model="scope.row.status"
  119. active-value="0"
  120. inactive-value="1"
  121. @change="handleStatusChange(scope.row)"
  122. ></el-switch>
  123. </template>
  124. </el-table-column>
  125. <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  126. <template #default="scope">
  127. <!-- <el-button link type="primary" icon="" @click="handleUpdateTeacherClass(scope.row)" v-hasPermi="['dz:teacher:edit']">学校班级</el-button> -->
  128. <!-- <el-button link type="primary" icon="" @click="handleUpdateCampusClass(scope.row)" v-hasPermi="['dz:teacher:edit']">校区班级</el-button> -->
  129. <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['dz:teacher:edit']">修改</el-button>
  130. <!-- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['dz:teacher:remove']">删除</el-button> -->
  131. </template>
  132. </el-table-column>
  133. </el-table>
  134. <pagination
  135. v-show="total>0"
  136. :total="total"
  137. v-model:page="queryParams.pageNum"
  138. v-model:limit="queryParams.pageSize"
  139. @pagination="getList"
  140. />
  141. <!-- 添加或修改老师对话框 -->
  142. <el-dialog :title="title" v-model="open" width="500px" append-to-body>
  143. <el-form ref="teacherRef" :model="form" :rules="rules" label-width="80px">
  144. <!-- <el-form-item label="用户ID" prop="userId">-->
  145. <!-- <el-input v-model="form.userId" placeholder="请输入用户ID" />-->
  146. <!-- </el-form-item>-->
  147. <el-form-item label="代理商" prop="agentId">
  148. <IeAgentSelect v-model="form.agentId" placeholder="请选择代理商" filterable clearable style="width: 100%" />
  149. </el-form-item>
  150. <el-form-item label="教师姓名" prop="name">
  151. <el-input v-model="form.name" placeholder="请输入教师姓名" />
  152. </el-form-item>
  153. <el-form-item label="所在学校" prop="schoolId">
  154. <el-select v-model="form.schoolId" placeholder="请选择所在学校" style="width: 100%" filterable clearable :disabled="!form.teacherId && !!form.campusId" @change="handleSchoolChange">
  155. <el-option
  156. v-for="item in schoolOptions"
  157. :key="item.id"
  158. :label="item.name"
  159. :value="item.id"
  160. />
  161. </el-select>
  162. </el-form-item>
  163. <el-form-item label="学校班级" prop="schoolClassIds">
  164. <el-select v-model="form.schoolClassIds" multiple placeholder="请选择学校班级" style="width: 100%" filterable clearable :disabled="!form.schoolId">
  165. <el-option
  166. v-for="item in schoolClassOptions"
  167. :key="item.classId"
  168. :label="item.name"
  169. :value="item.classId"
  170. />
  171. </el-select>
  172. </el-form-item>
  173. <el-form-item label="培训校区" prop="campusId">
  174. <el-select v-model="form.campusId" placeholder="请选择培训校区" style="width: 100%" filterable clearable :disabled="!form.teacherId && !!form.schoolId" @change="handleCampusChange">
  175. <el-option
  176. v-for="item in campusOptions"
  177. :key="item.id"
  178. :label="item.name"
  179. :value="item.id"
  180. />
  181. </el-select>
  182. </el-form-item>
  183. <el-form-item label="校区班级" prop="campusClassIds">
  184. <el-select v-model="form.campusClassIds" multiple placeholder="请选择校区班级" style="width: 100%" filterable clearable :disabled="!form.campusId">
  185. <el-option
  186. v-for="item in campusClassOptions"
  187. :key="item.classId"
  188. :label="item.name"
  189. :value="item.classId"
  190. />
  191. </el-select>
  192. </el-form-item>
  193. </el-form>
  194. <template #footer>
  195. <div class="dialog-footer">
  196. <el-button type="primary" @click="submitForm">确 定</el-button>
  197. <el-button @click="cancel">取 消</el-button>
  198. </div>
  199. </template>
  200. </el-dialog>
  201. <!-- 关联班级 -->
  202. <el-dialog :title="titleTeacherClass" v-model="openTeacherClass" width="500px" append-to-body>
  203. <el-form ref="teacherClassRef" :model="formTeacherClass" :rules="rulesTeacherClass" label-width="80px">
  204. <!-- <el-form-item label="教师ID" v-show="false" prop="teacherId">-->
  205. <!-- <el-input v-model="formTeacherClass.teacherId" placeholder="请输入教师ID" disabled/>-->
  206. <!-- </el-form-item>-->
  207. <el-form-item label="教师姓名" prop="name">
  208. <el-input v-model="formTeacherClass.name" placeholder="请输入教师姓名" disabled/>
  209. </el-form-item>
  210. <el-form-item label="学校校区" prop="name">
  211. <el-input v-model="formTeacherClass.schoolName" placeholder="请输入教师姓名" disabled/>
  212. </el-form-item>
  213. <el-form-item label="关联班级" prop="classIds">
  214. <el-select v-model="formTeacherClass.classIds" multiple placeholder="请选择班级" style="width: 100%">
  215. <el-option
  216. v-for="item in classOptions"
  217. :key="item.classId"
  218. :label="item.name"
  219. :value="item.classId"
  220. />
  221. </el-select>
  222. </el-form-item>
  223. </el-form>
  224. <template #footer>
  225. <div class="dialog-footer">
  226. <el-button type="primary" @click="submitFormTeacherClass">确 定</el-button>
  227. <el-button @click="cancelTeacherClass">取 消</el-button>
  228. </div>
  229. </template>
  230. </el-dialog>
  231. <!-- 关联校区班级 -->
  232. <!-- <el-dialog :title="titleCampusClass" v-model="openCampusClass" width="500px" append-to-body>
  233. <el-form ref="campusClassRef" :model="formCampusClass" :rules="rulesCampusClass" label-width="80px">
  234. <el-form-item label="教师姓名" prop="name">
  235. <el-input v-model="formCampusClass.name" placeholder="请输入教师姓名" disabled/>
  236. </el-form-item>
  237. <el-form-item label="培训校区" prop="campusId">
  238. <el-select
  239. v-model="formCampusClass.campusId"
  240. placeholder="请选择培训校区"
  241. style="width: 100%"
  242. @change="handleCampusClassChange"
  243. >
  244. <el-option
  245. v-for="item in campusOptions"
  246. :key="item.id"
  247. :label="item.name"
  248. :value="item.id"
  249. />
  250. </el-select>
  251. </el-form-item>
  252. <el-form-item label="关联班级" prop="classIds">
  253. <el-select
  254. v-model="formCampusClass.classIds"
  255. multiple
  256. placeholder="请选择班级"
  257. style="width: 100%"
  258. :disabled="!formCampusClass.campusId"
  259. >
  260. <el-option
  261. v-for="item in campusClassOptions"
  262. :key="item.classId"
  263. :label="item.name"
  264. :value="item.classId"
  265. />
  266. </el-select>
  267. </el-form-item>
  268. </el-form>
  269. <template #footer>
  270. <div class="dialog-footer">
  271. <el-button type="primary" @click="submitFormCampusClass">确 定</el-button>
  272. <el-button @click="cancelCampusClass">取 消</el-button>
  273. </div>
  274. </template>
  275. </el-dialog> -->
  276. </div>
  277. </template>
  278. <script setup name="Teacher">
  279. import { listTeacher, getTeacher, delTeacher, addTeacher, updateTeacher } from "@/api/dz/teacher"
  280. import {listAllSchool} from "@/api/dz/school"
  281. import {listCampus} from "@/api/dz/campus"
  282. import { listAllClass, getClassesBySchoolId, getClassesByCampusId } from "@/api/dz/classes"
  283. import { batchBindTeacherClass,listAllTeacherClass } from "@/api/dz/teacherclass"
  284. import {getCampusSchoolList} from "@/api/dz/cards.js";
  285. import { changeUserStatus } from "@/api/system/user"
  286. import IeAgentSelect from '@/components/IeAgentSelect/index.vue'
  287. const { proxy } = getCurrentInstance()
  288. const teacherList = ref([])
  289. const schoolOptions = ref([])
  290. const campusOptions = ref([])
  291. const classOptions = ref([])
  292. const campusClassOptions = ref([])
  293. const schoolClassOptions = ref([])
  294. const open = ref(false)
  295. const openTeacherClass = ref(false)
  296. const openCampusClass = ref(false)
  297. const loading = ref(true)
  298. const showSearch = ref(true)
  299. const ids = ref([])
  300. const single = ref(true)
  301. const multiple = ref(true)
  302. const total = ref(0)
  303. const title = ref("")
  304. const titleTeacherClass = ref("")
  305. const titleCampusClass = ref("")
  306. const data = reactive({
  307. form: {},
  308. formTeacherClass: {
  309. teacherId: null,
  310. schoolId: null,
  311. schoolName: null,
  312. name: null,
  313. classIds: []
  314. },
  315. formCampusClass: {
  316. teacherId: null,
  317. schoolId: null,
  318. campusId: null,
  319. name: null,
  320. classIds: []
  321. },
  322. queryParams: {
  323. pageNum: 1,
  324. pageSize: 10,
  325. userId: null,
  326. agentId: null,
  327. schoolId: null,
  328. campusId: null,
  329. name: null
  330. },
  331. rules: {
  332. },
  333. rulesTeacherClass: {
  334. // 可以添加验证规则
  335. classIds: [
  336. { required: true, message: "请选择至少一个班级", trigger: "change" }
  337. ]
  338. },
  339. rulesCampusClass: {
  340. campusId: [
  341. { required: true, message: "请选择培训校区", trigger: "change" }
  342. ],
  343. classIds: [
  344. { required: true, message: "请选择至少一个班级", trigger: "change" }
  345. ]
  346. }
  347. })
  348. const { queryParams, form, formTeacherClass, formCampusClass, rules, rulesTeacherClass, rulesCampusClass } = toRefs(data)
  349. /** 查询老师列表 */
  350. function getList() {
  351. loading.value = true
  352. listTeacher(queryParams.value).then(response => {
  353. teacherList.value = response.rows
  354. total.value = response.total
  355. loading.value = false
  356. })
  357. }
  358. /** 查询校区列表 */
  359. function getSchoolList() {
  360. listAllSchool({
  361. pageNum: 1,
  362. pageSize: 9999,
  363. }).then(response => {
  364. schoolOptions.value = response.data || []
  365. })
  366. }
  367. /** 查询校区列表 */
  368. function getCampusList() {
  369. listCampus().then(response => {
  370. campusOptions.value = response.rows || []
  371. })
  372. }
  373. // function getClassListBySchool() {
  374. // listAll().then(response => {
  375. // classOptions.value = response.data || []
  376. // })
  377. // }
  378. // 取消按钮
  379. function cancel() {
  380. open.value = false
  381. reset()
  382. }
  383. // 表单重置
  384. function reset() {
  385. form.value = {
  386. teacherId: null,
  387. userId: null,
  388. deptId: null,
  389. agentId: null,
  390. schoolId: null,
  391. campusId: null,
  392. name: null,
  393. schoolClassIds: [],
  394. campusClassIds: []
  395. }
  396. schoolClassOptions.value = []
  397. campusClassOptions.value = []
  398. proxy.resetForm("teacherRef")
  399. }
  400. // 取消按钮
  401. function cancelTeacherClass() {
  402. openTeacherClass.value = false
  403. resetTeacherClass()
  404. }
  405. // 表单重置
  406. function resetTeacherClass() {
  407. formTeacherClass.value = {
  408. teacherId: null,
  409. schoolId: null,
  410. schoolName: null,
  411. classIds: [],
  412. name: null
  413. }
  414. classOptions.value = []
  415. proxy.resetForm("teacherClassRef")
  416. }
  417. /** 搜索按钮操作 */
  418. function handleQuery() {
  419. queryParams.value.pageNum = 1
  420. getList()
  421. }
  422. /** 重置按钮操作 */
  423. function resetQuery() {
  424. proxy.resetForm("queryRef")
  425. handleQuery()
  426. }
  427. // 多选框选中数据
  428. function handleSelectionChange(selection) {
  429. ids.value = selection.map(item => item.teacherId)
  430. single.value = selection.length != 1
  431. multiple.value = !selection.length
  432. }
  433. /** 新增按钮操作 */
  434. function handleAdd() {
  435. reset()
  436. getSchoolList()
  437. getCampusList()
  438. open.value = true
  439. title.value = "添加老师"
  440. }
  441. /** 修改按钮操作 */
  442. function handleUpdate(row) {
  443. reset()
  444. getSchoolList()
  445. getCampusList()
  446. const _teacherId = row.teacherId || ids.value
  447. getTeacher(_teacherId).then(response => {
  448. form.value = response.data
  449. // 初始化班级ID数组
  450. form.value.schoolClassIds = []
  451. form.value.campusClassIds = []
  452. // 先加载班级列表,然后获取已关联的班级并回显
  453. const loadPromises = []
  454. if (form.value.schoolId) {
  455. loadPromises.push(
  456. getClassesBySchoolId({ schoolId: form.value.schoolId }).then(response => {
  457. schoolClassOptions.value = response.data || []
  458. })
  459. )
  460. }
  461. if (form.value.campusId) {
  462. loadPromises.push(
  463. getClassesByCampusId({ campusId: form.value.campusId }).then(response => {
  464. campusClassOptions.value = response.data || []
  465. })
  466. )
  467. }
  468. // 获取该老师已关联的所有班级
  469. Promise.all([
  470. ...loadPromises,
  471. listAllTeacherClass({ teacherId: _teacherId })
  472. ]).then((results) => {
  473. const teacherClassResponse = results[results.length - 1]
  474. const teacherClasses = teacherClassResponse.data || []
  475. // 根据班级所属的学校/校区,分别设置到对应的数组中
  476. teacherClasses.forEach(tc => {
  477. if (tc.classId) {
  478. // 检查该班级是否属于学校
  479. const schoolClass = schoolClassOptions.value.find(c => c.classId === tc.classId)
  480. if (schoolClass && form.value.schoolId && schoolClass.schoolId === form.value.schoolId) {
  481. if (!form.value.schoolClassIds) {
  482. form.value.schoolClassIds = []
  483. }
  484. if (!form.value.schoolClassIds.includes(tc.classId)) {
  485. form.value.schoolClassIds.push(tc.classId)
  486. }
  487. }
  488. // 检查该班级是否属于校区(校区班级的schoolId等于campusId)
  489. const campusClass = campusClassOptions.value.find(c => c.classId === tc.classId)
  490. if (campusClass && form.value.campusId && campusClass.schoolId === form.value.campusId) {
  491. if (!form.value.campusClassIds) {
  492. form.value.campusClassIds = []
  493. }
  494. if (!form.value.campusClassIds.includes(tc.classId)) {
  495. form.value.campusClassIds.push(tc.classId)
  496. }
  497. }
  498. }
  499. })
  500. })
  501. open.value = true
  502. title.value = "修改老师"
  503. })
  504. }
  505. /** 学校变化处理 */
  506. function handleSchoolChange() {
  507. // 如果选择了学校,清空校区
  508. if (form.value.schoolId) {
  509. form.value.campusId = null
  510. form.value.campusClassIds = []
  511. campusClassOptions.value = []
  512. } else {
  513. // 如果清空了学校,清空学校班级
  514. form.value.schoolClassIds = []
  515. schoolClassOptions.value = []
  516. return
  517. }
  518. // 如果是编辑模式,不清空已选班级,只更新选项列表
  519. if (!form.value.teacherId) {
  520. form.value.schoolClassIds = []
  521. }
  522. schoolClassOptions.value = []
  523. if (form.value.schoolId) {
  524. getClassesBySchoolId({ schoolId: form.value.schoolId }).then(response => {
  525. schoolClassOptions.value = response.data || []
  526. // 如果是编辑模式,需要重新匹配已关联的班级
  527. if (form.value.teacherId) {
  528. loadTeacherClassesForEdit()
  529. }
  530. })
  531. }
  532. }
  533. /** 校区变化处理 */
  534. function handleCampusChange() {
  535. // 如果选择了校区,清空学校
  536. if (form.value.campusId) {
  537. form.value.schoolId = null
  538. form.value.schoolClassIds = []
  539. schoolClassOptions.value = []
  540. } else {
  541. // 如果清空了校区,清空校区班级
  542. form.value.campusClassIds = []
  543. campusClassOptions.value = []
  544. return
  545. }
  546. // 如果是编辑模式,不清空已选班级,只更新选项列表
  547. if (!form.value.teacherId) {
  548. form.value.campusClassIds = []
  549. }
  550. campusClassOptions.value = []
  551. if (form.value.campusId) {
  552. getClassesByCampusId({ campusId: form.value.campusId }).then(response => {
  553. campusClassOptions.value = response.data || []
  554. // 如果是编辑模式,需要重新匹配已关联的班级
  555. if (form.value.teacherId) {
  556. loadTeacherClassesForEdit()
  557. }
  558. })
  559. }
  560. }
  561. /** 编辑模式下加载已关联的班级 */
  562. function loadTeacherClassesForEdit() {
  563. if (!form.value.teacherId) return
  564. listAllTeacherClass({ teacherId: form.value.teacherId }).then(response => {
  565. const teacherClasses = response.data || []
  566. // 重置班级ID数组
  567. form.value.schoolClassIds = []
  568. form.value.campusClassIds = []
  569. // 根据班级所属的学校/校区,分别设置到对应的数组中
  570. teacherClasses.forEach(tc => {
  571. if (tc.classId) {
  572. // 检查该班级是否属于学校
  573. const schoolClass = schoolClassOptions.value.find(c => c.classId === tc.classId)
  574. if (schoolClass && form.value.schoolId && schoolClass.schoolId === form.value.schoolId) {
  575. if (!form.value.schoolClassIds) {
  576. form.value.schoolClassIds = []
  577. }
  578. if (!form.value.schoolClassIds.includes(tc.classId)) {
  579. form.value.schoolClassIds.push(tc.classId)
  580. }
  581. }
  582. // 检查该班级是否属于校区(校区班级的schoolId等于campusId)
  583. const campusClass = campusClassOptions.value.find(c => c.classId === tc.classId)
  584. if (campusClass && form.value.campusId && campusClass.schoolId === form.value.campusId) {
  585. if (!form.value.campusClassIds) {
  586. form.value.campusClassIds = []
  587. }
  588. if (!form.value.campusClassIds.includes(tc.classId)) {
  589. form.value.campusClassIds.push(tc.classId)
  590. }
  591. }
  592. }
  593. })
  594. })
  595. }
  596. /** 提交按钮 */
  597. function submitForm() {
  598. proxy.$refs["teacherRef"].validate(valid => {
  599. if (valid) {
  600. if (form.value.teacherId != null) {
  601. updateTeacher(form.value).then(response => {
  602. proxy.$modal.msgSuccess("修改成功")
  603. open.value = false
  604. getList()
  605. })
  606. } else {
  607. addTeacher(form.value).then(response => {
  608. proxy.$modal.msgSuccess("新增成功")
  609. open.value = false
  610. getList()
  611. })
  612. }
  613. }
  614. })
  615. }
  616. /** 删除按钮操作 */
  617. function handleDelete(row) {
  618. const _teacherIds = row.teacherId || ids.value
  619. proxy.$modal.confirm('是否确认删除老师编号为"' + _teacherIds + '"的数据项?').then(function() {
  620. return delTeacher(_teacherIds)
  621. }).then(() => {
  622. getList()
  623. proxy.$modal.msgSuccess("删除成功")
  624. }).catch(() => {})
  625. }
  626. /** 导出按钮操作 */
  627. function handleExport() {
  628. proxy.download('dz/teacher/export', {
  629. ...queryParams.value
  630. }, `teacher_${new Date().getTime()}.xlsx`)
  631. }
  632. /** 用户状态修改 */
  633. function handleStatusChange(row) {
  634. let text = row.status === "0" ? "启用" : "禁用"
  635. proxy.$modal.confirm('确认要"' + text + '""' + row.name + '"用户吗?').then(function () {
  636. return changeUserStatus(row.userId, row.status)
  637. }).then(() => {
  638. proxy.$modal.msgSuccess(text + "成功")
  639. }).catch(function () {
  640. row.status = row.status === "0" ? "1" : "0"
  641. })
  642. }
  643. /** 关联老师班级,按钮操作 */
  644. function handleUpdateTeacherClass(row) {
  645. resetTeacherClass()
  646. // 先清空班级选项和已选班级
  647. classOptions.value = []
  648. formTeacherClass.value.classIds = []
  649. // const _schoolId = row.schoolId
  650. const submitData = {
  651. schoolId: row.schoolId,
  652. teacherId: row.teacherId
  653. }
  654. // 设置基本数据
  655. formTeacherClass.value.teacherId = row.teacherId
  656. formTeacherClass.value.schoolId = row.schoolId
  657. formTeacherClass.value.name = row.name
  658. formTeacherClass.value.schoolName = row.schoolName
  659. // 先打开弹窗
  660. openTeacherClass.value = true
  661. titleTeacherClass.value = "关联班级"
  662. // 加载班级列表和已关联的班级
  663. Promise.all([
  664. listAllClass(submitData),
  665. listAllTeacherClass(submitData)
  666. ]).then(([classResponse, teacherClassResponse]) => {
  667. classOptions.value = classResponse.data || []
  668. formTeacherClass.value.classIds = (teacherClassResponse.data || []).map(item => item.classId)
  669. })
  670. }
  671. /** 关联老师班级,提交按钮 */
  672. function submitFormTeacherClass() {
  673. proxy.$refs["teacherClassRef"].validate(valid => {
  674. if (valid) {
  675. // 构建提交参数
  676. const submitData = {
  677. teacherId: formTeacherClass.value.teacherId,
  678. schoolId: formTeacherClass.value.schoolId,
  679. classIds: formTeacherClass.value.classIds
  680. }
  681. // console.log("submitData"+submitData)
  682. // 调用关联班级的API
  683. // 假设API函数名为 updateTeacherClassRelation
  684. batchBindTeacherClass(submitData).then(response => {
  685. proxy.$modal.msgSuccess("关联成功")
  686. openTeacherClass.value = false
  687. getList()
  688. }).catch(() => {
  689. proxy.$modal.msgError("关联失败")
  690. })
  691. }
  692. })
  693. }
  694. /** 关联校区班级,按钮操作 */
  695. function handleUpdateCampusClass(row) {
  696. resetCampusClass()
  697. // 先清空班级选项和已选班级
  698. campusClassOptions.value = []
  699. formCampusClass.value.classIds = []
  700. // 设置数据
  701. formCampusClass.value.teacherId = row.teacherId
  702. formCampusClass.value.schoolId = row.campusId
  703. formCampusClass.value.name = row.name
  704. // 先打开弹窗
  705. openCampusClass.value = true
  706. titleCampusClass.value = "关联校区班级"
  707. // 如果有培训校区,默认选中并加载该校区的班级列表
  708. if (row.campusId) {
  709. formCampusClass.value.campusId = row.campusId
  710. // 加载该校区的班级列表
  711. loadCampusClasses(row.campusId, row.teacherId)
  712. }
  713. }
  714. /** 校区班级弹窗中校区选择变化时,加载该校区的班级列表 */
  715. function handleCampusClassChange(campusId) {
  716. if (campusId) {
  717. loadCampusClasses(campusId, formCampusClass.value.teacherId)
  718. // 清空已选择的班级
  719. formCampusClass.value.classIds = []
  720. } else {
  721. campusClassOptions.value = []
  722. formCampusClass.value.classIds = []
  723. }
  724. }
  725. /** 加载校区的班级列表 */
  726. function loadCampusClasses(campusId, teacherId) {
  727. const submitData = {
  728. schoolId: campusId,
  729. teacherId: teacherId
  730. }
  731. // 使用Promise.all确保两个请求都完成后再设置数据
  732. Promise.all([
  733. listAllClass(submitData),
  734. listAllTeacherClass(submitData)
  735. ]).then(([classResponse, teacherClassResponse]) => {
  736. campusClassOptions.value = classResponse.data || []
  737. formCampusClass.value.classIds = (teacherClassResponse.data || []).map(item => item.classId)
  738. })
  739. }
  740. /** 关联校区班级,提交按钮 */
  741. function submitFormCampusClass() {
  742. proxy.$refs["campusClassRef"].validate(valid => {
  743. if (valid) {
  744. // 构建提交参数
  745. const submitData = {
  746. teacherId: formCampusClass.value.teacherId,
  747. schoolId: formCampusClass.value.schoolId,
  748. classIds: formCampusClass.value.classIds
  749. }
  750. // 调用关联班级的API
  751. batchBindTeacherClass(submitData).then(response => {
  752. proxy.$modal.msgSuccess("关联成功")
  753. openCampusClass.value = false
  754. getList()
  755. }).catch(() => {
  756. proxy.$modal.msgError("关联失败")
  757. })
  758. }
  759. })
  760. }
  761. // 取消按钮
  762. function cancelCampusClass() {
  763. openCampusClass.value = false
  764. resetCampusClass()
  765. }
  766. // 表单重置
  767. function resetCampusClass() {
  768. formCampusClass.value = {
  769. teacherId: null,
  770. schoolId: null,
  771. campusId: null,
  772. name: null,
  773. classIds: []
  774. }
  775. campusClassOptions.value = []
  776. if (proxy.$refs["campusClassRef"]) {
  777. proxy.$refs["campusClassRef"].resetFields()
  778. }
  779. }
  780. onMounted(() => {
  781. getSchoolList()
  782. getCampusList()
  783. getList()
  784. // getClassListBySchool()
  785. })
  786. </script>