edit.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <script setup lang="ts">
  2. import BasicModal from '/@/components/Modal/src/BasicModal.vue';
  3. import { useModalInner } from '/@/components/Modal';
  4. import { reactive, ref } from 'vue';
  5. import BasicTable from '/@/components/Table/src/BasicTable.vue';
  6. import { BasicColumn, useTable } from '/@/components/Table';
  7. import {
  8. getBaseClassCourseGetAllCoursesAndTextbooks,
  9. getBaseClassCourseGetAllSelectedCoursesAndTextbooks,
  10. postBaseClassCourseUpdateAddCoursesAndTextbooks,
  11. } from '/@/services/apis/BaseClassCourseController';
  12. import { requestMagicApi } from '/@/api/magicApi';
  13. import { useMessage } from '/@/hooks/web/useMessage';
  14. const rightSelectedRowKeys = ref<any>([]);
  15. const selectedKey = ref<any>([]);
  16. const semesterId = ref('');
  17. const classIds = ref<any>([]);
  18. const selectedRow = ref<any>([]);
  19. const emits = defineEmits(['success', 'register']);
  20. const isLoading = ref(false);
  21. const tableColumns = ref<BasicColumn[]>([
  22. {
  23. title: '课程名称',
  24. dataIndex: 'courseName',
  25. align: 'left',
  26. },
  27. {
  28. title: '教材名称',
  29. dataIndex: 'bookName',
  30. align: 'left',
  31. },
  32. ]);
  33. const [allTable] = useTable({
  34. title: '可选课程',
  35. bordered: true,
  36. rowKey: 'id',
  37. columns: tableColumns as any,
  38. api: getBaseClassCourseGetAllCoursesAndTextbooks,
  39. useSearchForm: true,
  40. showTableSetting: true,
  41. resizeHeightOffset: 200,
  42. rowSelection: {
  43. type: 'checkbox',
  44. onChange: (selectedRowKeys, selectedRows) => {
  45. selectedKey.value = selectedRowKeys;
  46. selectedRow.value = selectedRows;
  47. setSelectedRowKeys([]);
  48. const data = getDataSource();
  49. const addList: any[] = [];
  50. selectedRow.value.forEach((item: any) => {
  51. if (!data.find((i: any) => i.id === item.id)) {
  52. addList.push(item);
  53. }
  54. });
  55. setTableData(data.concat(addList));
  56. // 筛选出data里面没有的
  57. },
  58. },
  59. formConfig: {
  60. labelWidth: 120,
  61. schemas: [
  62. {
  63. label: '学科组',
  64. field: 'subjectGroupId',
  65. component: 'ApiSelect',
  66. componentProps: {
  67. getPopupContainer: () => document.body,
  68. api: requestMagicApi,
  69. params: { url: '/educational/subjectGroup/list' },
  70. },
  71. colProps: { span: 12 },
  72. },
  73. ],
  74. },
  75. beforeFetch: (params) => {
  76. return {
  77. ...params,
  78. textbookType: searchForm.textbookType,
  79. bookName: searchForm.bookName,
  80. baseSemesterId: searchForm.baseSemesterId,
  81. };
  82. },
  83. });
  84. const [selectTable, { setTableData, getDataSource, setSelectedRowKeys }] = useTable({
  85. title: '已选课程',
  86. bordered: true,
  87. rowKey: 'id',
  88. columns: tableColumns as any,
  89. showTableSetting: true,
  90. resizeHeightOffset: 200,
  91. pagination: false,
  92. rowSelection: {
  93. type: 'checkbox',
  94. onChange: (selectedRowKeys) => {
  95. rightSelectedRowKeys.value = selectedRowKeys;
  96. },
  97. },
  98. });
  99. const searchForm = reactive({
  100. textbookType: undefined,
  101. bookName: '',
  102. baseSemesterId: undefined,
  103. });
  104. const [modalRegister, { closeModal }] = useModalInner(async (data) => {
  105. const ids = data.list.map((item) => item.classId);
  106. semesterId.value = data.selectId;
  107. classIds.value = ids;
  108. searchForm.baseSemesterId = data.baseSemesterId;
  109. const dataInfo = await getBaseClassCourseGetAllSelectedCoursesAndTextbooks({
  110. classIds: ids.join(','),
  111. semester: data.selectId,
  112. });
  113. setTableData(dataInfo);
  114. });
  115. const handleCancel = () => {
  116. searchForm.textbookType = undefined;
  117. searchForm.bookName = '';
  118. closeModal();
  119. };
  120. const handleClear = () => {
  121. setTableData(
  122. getDataSource().filter((item: any) => !rightSelectedRowKeys.value.includes(item.id)),
  123. );
  124. rightSelectedRowKeys.value = getDataSource().map((item: any) => item.id);
  125. setSelectedRowKeys(rightSelectedRowKeys.value);
  126. };
  127. const { createMessage } = useMessage();
  128. const handleSubmit = async () => {
  129. const data = getDataSource();
  130. const params = {
  131. baseSemesterId: semesterId.value,
  132. classIds: classIds.value,
  133. ids: data.map((item: any) => item.id),
  134. };
  135. try {
  136. isLoading.value = true;
  137. await postBaseClassCourseUpdateAddCoursesAndTextbooks(params as any);
  138. createMessage.success('添加成功');
  139. setTableData([]);
  140. setSelectedRowKeys([]);
  141. emits('success');
  142. closeModal();
  143. } catch {
  144. createMessage.error('添加失败');
  145. } finally {
  146. isLoading.value = false;
  147. }
  148. };
  149. </script>
  150. <template>
  151. <BasicModal
  152. destroyOnClose
  153. @ok="handleSubmit"
  154. @cancel="handleCancel"
  155. width="1400px"
  156. @register="modalRegister"
  157. title="课程选择"
  158. >
  159. <div class="flex flex-row">
  160. <BasicTable class="w-1/2" @register="allTable" />
  161. <BasicTable class="w-1/2" @register="selectTable">
  162. <template #toolbar>
  163. <a-button @loading="isLoading" type="primary" @click="handleClear">批量移出</a-button>
  164. </template>
  165. </BasicTable>
  166. </div>
  167. </BasicModal>
  168. </template>
  169. <style scoped lang="less"></style>