ModifyExamStudent.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. <template>
  2. <el-dialog
  3. class="modify-exam-student"
  4. :visible.sync="modalIsShow"
  5. title="选择考试对象"
  6. top="10px"
  7. width="600px"
  8. :close-on-click-modal="false"
  9. :close-on-press-escape="false"
  10. append-to-body
  11. @opened="visibleChange"
  12. >
  13. <div class="mb-4 tab-btns">
  14. <el-button
  15. v-for="(val, key) in EXAM_OBJECT_TYPE"
  16. :key="key"
  17. size="medium"
  18. :type="examObjectType === key ? 'primary' : 'default'"
  19. @click="selectMenu(key)"
  20. >{{ val }}
  21. </el-button>
  22. </div>
  23. <div v-if="isExportType">
  24. <el-button type="success" icon="el-icon-download"
  25. ><a :href="downloadUrl" :download="dfilename">模板下载</a></el-button
  26. >
  27. <upload-button
  28. btn-icon="el-icon-circle-plus-outline"
  29. btn-content="批量导入"
  30. btn-type="success"
  31. :upload-url="uploadUrl"
  32. :format="['xls', 'xlsx']"
  33. accept=".xls,.xlsx"
  34. @valid-error="validError"
  35. @upload-success="uploadSuccess"
  36. >
  37. </upload-button>
  38. </div>
  39. <el-row v-else type="flex" :gutter="10">
  40. <el-col :span="12">
  41. <h3 class="user-part-title">班级/学生</h3>
  42. <el-tree
  43. ref="UserTree"
  44. :data="userTree"
  45. node-key="id"
  46. show-checkbox
  47. highlight-current
  48. :props="defaultProps"
  49. @check-change="checkChange"
  50. >
  51. </el-tree>
  52. </el-col>
  53. <el-col :span="12">
  54. <div class="user-part-title">已选范围</div>
  55. <el-tree
  56. ref="UserSelectedTree"
  57. :data="selectedUsers"
  58. node-key="id"
  59. show-checkbox
  60. highlight-current
  61. :props="defaultProps"
  62. >
  63. <span class="custom-tree-node" slot-scope="{ node, data }">
  64. <el-button
  65. v-if="data.isUser"
  66. type="text"
  67. icon="el-icon-remove"
  68. @click="removeSelectStudent(node, data)"
  69. >
  70. {{ data.label }}
  71. </el-button>
  72. </span>
  73. </el-tree>
  74. </el-col>
  75. </el-row>
  76. <p v-show="!selectValid" class="tips-info tips-error"></p>
  77. <div slot="footer">
  78. <el-button type="primary" :disabled="!selectValid" @click="submit"
  79. >确认</el-button
  80. >
  81. <el-button @click="cancel">取消</el-button>
  82. </div>
  83. </el-dialog>
  84. </template>
  85. <script>
  86. import { uploadOrFindExamTaskStudent } from "../../api";
  87. import UploadButton from "@/components/UploadButton";
  88. const EXAM_OBJECT_TYPE = {
  89. TEACH_CLAZZ_STUDENT: "我教课程选择",
  90. BASIC_CLAZZ_STUDENT: "学生库选择",
  91. IMPORT_STUDENT: "批量导入"
  92. };
  93. export default {
  94. name: "modify-exam-student",
  95. props: {
  96. selectedIds: {
  97. type: Array,
  98. default() {
  99. return [];
  100. }
  101. },
  102. courseId: {
  103. type: String,
  104. default: ""
  105. }
  106. },
  107. components: { UploadButton },
  108. data() {
  109. return {
  110. modalIsShow: false,
  111. examObjectType: "TEACH_CLAZZ_STUDENT",
  112. EXAM_OBJECT_TYPE,
  113. dataTree: {
  114. TEACH_CLAZZ_STUDENT: [],
  115. BASIC_CLAZZ_STUDENT: []
  116. },
  117. userTree: [],
  118. selectedUsers: [],
  119. selectedUserIds: [],
  120. selectValid: true,
  121. defaultProps: {
  122. children: "children",
  123. label: "label"
  124. },
  125. // import
  126. uploadUrl: "/api/admin/exam/task/find_exam_task_student_object",
  127. downloadUrl: "/temps/studentTemplate.xlsx",
  128. dfilename: "学生导入模板.xlsx"
  129. };
  130. },
  131. computed: {
  132. isExportType() {
  133. return this.examObjectType === "IMPORT_STUDENT";
  134. }
  135. },
  136. methods: {
  137. async getStudents(examObjectType) {
  138. let datas = {
  139. examObjectType: examObjectType || this.examObjectType
  140. };
  141. if (this.examObjectType === "TEACH_CLAZZ_STUDENT")
  142. datas.basicCourseId = this.courseId;
  143. const data = await uploadOrFindExamTaskStudent(datas);
  144. this.userTree = this.dataTree[
  145. this.examObjectType
  146. ] = this.parseStudentData(data);
  147. },
  148. parseStudentData(data) {
  149. return data.map(item => {
  150. let nitem = {
  151. id: item.clazzId,
  152. label: item.clazzName,
  153. classId: item.clazzId,
  154. className: item.clazzName,
  155. studentClazzType: item.studentClazzType,
  156. children: []
  157. };
  158. nitem.children = item.studentInfoList.map(elem => {
  159. return {
  160. ...elem,
  161. isUser: true,
  162. id: elem.studentId,
  163. label: elem.studentName,
  164. studentClazzType: item.studentClazzType
  165. };
  166. });
  167. return nitem;
  168. });
  169. },
  170. selectMenu(val) {
  171. this.examObjectType = val;
  172. if (val === "IMPORT_STUDENT") return;
  173. this.selectedUserIds = [];
  174. this.selectedUsers = [];
  175. if (this.dataTree[val].length) {
  176. this.userTree = this.dataTree[val];
  177. } else {
  178. this.getStudents();
  179. }
  180. },
  181. checkChange() {
  182. let selectedNode = this.$refs.UserTree.getCheckedNodes(false, true);
  183. console.log(selectedNode);
  184. },
  185. removeSelectStudent(node) {
  186. console.log(node);
  187. this.$refs.UserSelectedTree.remove(node);
  188. },
  189. async visibleChange() {
  190. if (this.examObjectType === "TEACH_CLAZZ_STUDENT") {
  191. await this.getStudents();
  192. }
  193. this.$refs.UserTree.setCheckedKeys(this.selectedIds);
  194. this.$nextTick(() => {
  195. this.checkChange();
  196. });
  197. },
  198. cancel() {
  199. this.modalIsShow = false;
  200. },
  201. open() {
  202. this.modalIsShow = true;
  203. },
  204. // import
  205. validError(errorData) {
  206. this.$message.error(errorData.message);
  207. },
  208. uploadSuccess(res) {
  209. console.log(res);
  210. },
  211. submit() {
  212. if (!this.selectedUsers.length) {
  213. this.$message.error("请选择考试对象");
  214. return;
  215. }
  216. this.$emit("modified", this.selectedUsers);
  217. this.cancel();
  218. }
  219. }
  220. };
  221. </script>