teacher-manage.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <template>
  2. <div class="app-container">
  3. <el-card :shadow="selectMode?'none':'always'">
  4. <template #header>老师信息</template>
  5. <mx-condition :query-params="queryParams" @query="handleQuery" @invalid="handleInvalidQuery"></mx-condition>
  6. <div v-if="dataList.length" class="mt20 fx-column">
  7. <template v-for="(group,idx) in displayGradeClass">
  8. <el-card shadow="never" :class="{'mt20':idx>0}">
  9. <template #header>{{ group.grade.label }}(共{{ group.grade.children.length }}个班)</template>
  10. <template v-if="group.headteachers.length">
  11. <div class="f14 f-666 mb5">班主任</div>
  12. <el-row :gutter="12">
  13. <el-col :span="6" v-for="(item,index) in group.headteachers" :key="index" class="mb12">
  14. <mx-teacher-info :avatar="item.avatar" :name="item.nickName" content-height="90px"
  15. :select-mode="selectMode" :selected="item.localSelected"
  16. :selected-class-name="getSelectedClassName(item)"
  17. :classes="intersectGradeClass(item.headteacherClassNames, group.grade).toString()"
  18. @click.native="setTeacherSelected(item)">
  19. </mx-teacher-info>
  20. </el-col>
  21. </el-row>
  22. </template>
  23. <template v-if="group.teachers.length">
  24. <div class="f14 f-666 mb5">授课老师</div>
  25. <el-row :gutter="12">
  26. <el-col :span="6" v-for="(item,index) in group.teachers" :key="index" class="mb12">
  27. <mx-teacher-info content-height="90px" :avatar="item.avatar" :name="item.nickName"
  28. :subjects="item.subjectNames.toString()"
  29. :selected-class-name="getSelectedClassName(item)"
  30. :select-mode="selectMode" :selected="item.localSelected"
  31. :classes="intersectGradeClass(item.classNames, group.grade).toString()"
  32. @click.native="setTeacherSelected(item)">
  33. </mx-teacher-info>
  34. </el-col>
  35. </el-row>
  36. </template>
  37. </el-card>
  38. </template>
  39. </div>
  40. <evaluation-empty v-else class="mt20" :shadow="false"></evaluation-empty>
  41. </el-card>
  42. </div>
  43. </template>
  44. <script>
  45. import {
  46. resourcesPerms
  47. } from '@/api/webApi/back.js'
  48. import classTreeMixin from '@/components/Cache/modules/mx-classTree-translate-mixin'
  49. import MxTeacherInfo from './components/mx-teacher-info.vue'
  50. import MxCondition from '@/components/MxCondition/mx-condition'
  51. export default {
  52. mixins: [classTreeMixin],
  53. components: {
  54. MxCondition,
  55. MxTeacherInfo
  56. },
  57. model: {
  58. prop: 'selectedCode',
  59. event: 'change'
  60. },
  61. props: {
  62. selectMode: {
  63. type: Boolean,
  64. default: false
  65. },
  66. headTeacherSettings: {
  67. type: Object,
  68. default: {}
  69. },
  70. selectedCode: {
  71. type: String | Number,
  72. default: ''
  73. }
  74. },
  75. data() {
  76. return {
  77. queryParams: {
  78. classGradeId: '',
  79. classId: '',
  80. userSubjectId: ''
  81. },
  82. dataList: [],
  83. displayGradeClass: []
  84. }
  85. },
  86. computed: {
  87. selectedTeacher() {
  88. return this.dataList.find(item => item['localSelected'])
  89. },
  90. dataListWithSelected() {
  91. if (this.selectMode && this.dataList.length && this.selectedCode) {
  92. this.dataList.forEach(user => {
  93. // 本地字段,强制进入双向绑定
  94. this.$set(user, 'localSelected', user.customerCode == this.selectedCode)
  95. })
  96. }
  97. return this.dataList
  98. }
  99. },
  100. methods: {
  101. getSelectedClassName(row) {
  102. const headTeacherSettings = this.headTeacherSettings
  103. for (const key in headTeacherSettings) {
  104. if (headTeacherSettings[key].customerCode == row.customerCode) {
  105. return this.getClassName(key)
  106. }
  107. }
  108. return ''
  109. },
  110. handleInvalidQuery() {
  111. this.dataList = []
  112. },
  113. handleQuery(model) {
  114. resourcesPerms({
  115. gradeId: model.classGradeId,
  116. classId: model.classId,
  117. subjectId: model.userSubjectId
  118. }).then(res => {
  119. this.dataList = res.data || []
  120. this.resetDisplayTree()
  121. })
  122. },
  123. translateClassTreeReady() {
  124. this.resetDisplayTree()
  125. },
  126. resetDisplayTree() {
  127. if (!this.classTreeReady) return
  128. // 使用standardClassTree结构简单些
  129. const result = []
  130. this.standardClassTree.forEach(grade => {
  131. const classes = grade.children
  132. const matchedTeachers = this.dataListWithSelected
  133. .filter(t => t.classes.some(tc => classes.some(c => c.label == tc.className)))
  134. const matchedHeadteachers = this.dataListWithSelected
  135. .filter(t => t.headteacherClassIds.some(tcId => classes.some(c => c.value == tcId)))
  136. if (matchedTeachers.length || matchedHeadteachers.length) {
  137. const gradeResult = {
  138. grade,
  139. teachers: matchedTeachers,
  140. headteachers: matchedHeadteachers
  141. }
  142. gradeResult.teachers.forEach(t => {
  143. t.classNames = t.classes.map(c => c.className)
  144. t.subjectNames = t.subjects.map(s => s.subjectName)
  145. })
  146. gradeResult.headteachers.forEach(t => {
  147. t.headteacherClassNames = t.headteacherClassIds.map(id => {
  148. return classes.find(c => c.value == id)?.label || '未知班级'
  149. })
  150. })
  151. result.push(gradeResult)
  152. }
  153. })
  154. console.log('formatted grade class teachers', result)
  155. this.displayGradeClass = result
  156. },
  157. intersectGradeClass(classNames, grade) {
  158. return classNames.filter(name => grade.children.some(c => c.label == name))
  159. },
  160. setTeacherSelected(teacher) {
  161. if (!this.selectMode) return
  162. if (teacher.customerCode == this.selectedTeacher?.customerCode) return
  163. if (this.selectedTeacher) this.selectedTeacher.localSelected = false
  164. teacher.localSelected = true // single select mode
  165. this.$emit('change', teacher.customerCode)
  166. console.log('teacher selected:', teacher.customerCode, teacher.nickName)
  167. }
  168. }
  169. }
  170. </script>
  171. <style scoped>
  172. </style>