addSchool.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <template>
  2. <el-dialog v-model="schoolData.showDialog" :title="`${schoolData.tenantName} 新增学校`" width="800px">
  3. <div class="page_search">
  4. <div class="search_content">
  5. <div class="content_left">
  6. <el-select v-model="provinceSelect" placeholder="全部省份" clearable>
  7. <el-option v-for="province in provincesList" :key="province.provinceCode" :label="province.provinceName" :value="province.provinceCode"></el-option>
  8. </el-select>
  9. <el-input v-model="schooltName" placeholder="请输入学校名称或编号" @input="SearchChange">
  10. <template #append>
  11. <el-button :icon="Search" @click="SearchChange" />
  12. </template>
  13. </el-input>
  14. </div>
  15. </div>
  16. </div>
  17. <div class="page_jg_20"></div>
  18. <div class="page_table">
  19. <el-table :data="tableData" stripe v-loading="tableLoading" element-loading-text="拼命加载中……" height="500px" ref="tableDataRef"
  20. element-loading-spinner="el-icon-loading" element-loading-background="#ffffff" @selection-change="handleSelectionChange">
  21. <el-table-column type="selection" align="center" />
  22. <el-table-column type="index" label="序号" align="center" />
  23. <el-table-column prop="tenantCode" label="账号" align="center" />
  24. <el-table-column prop="tenantName" label="学校名称" align="center" />
  25. <el-table-column prop="cityAndAreaName" label="区域" align="center">
  26. <template #default="{ row }">
  27. {{ row.cityAndAreaName || '-' }}
  28. </template>
  29. </el-table-column>
  30. <el-table-column prop="schoolType" label="账号类型" align="center">
  31. <template #default="{ row }">
  32. {{ row.schoolType == 0 ? '单校版' : row.schoolType == 1 ? '联考版' : '-' }}
  33. </template>
  34. </el-table-column>
  35. <el-table-column prop="status" label="状态" align="center">
  36. <template #default="{ row }">
  37. <div class="table_row_status">
  38. <!-- 正式 -->
  39. <div class="need_summary_icon" v-if="row.status === 1 && row.type === 1"></div>
  40. <!-- 试用 -->
  41. <div class="yes_release_icon" v-else-if="row.status === 1 && row.type === 0"></div>
  42. <!-- 冻结 -->
  43. <div class="no_release_icon" v-else-if="row.status === 0"></div>
  44. <!-- 状态文本 -->
  45. {{ row.status === 1 ? (row.type === 1 ? '正式' : row.type === 0 ? '体验' : '-') : row.status === 0 ? '冻结' : '-' }}
  46. </div>
  47. </template>
  48. </el-table-column>
  49. </el-table>
  50. </div>
  51. <template #footer>
  52. <el-button class="button_border_gray cancel" @click="schoolData.showDialog = false">取消</el-button>
  53. <el-button class="button_background" :loading="submitLoading" @click="AddComfirm">确定</el-button>
  54. </template>
  55. </el-dialog>
  56. </template>
  57. <script lang="ts">
  58. export default {
  59. name: 'AddSchool',
  60. }
  61. </script>
  62. <script lang="ts" setup>
  63. import { Search } from '@element-plus/icons-vue'
  64. import { ElMessage, ElTable } from 'element-plus'
  65. import { ref, inject, onMounted, nextTick } from 'vue'
  66. import { getSingleExamList, addSingleSchool } from '@/api/examination'
  67. import { provinceTree } from '@/api/school'
  68. interface SchoolDataItem {
  69. id: string
  70. }
  71. interface SchoolData {
  72. showDialog: boolean
  73. tenantName: string
  74. id: string
  75. }
  76. const schoolData = inject<SchoolData>('schoolData', {
  77. showDialog: false,
  78. tenantName: '',
  79. id: ''
  80. })
  81. interface Province {
  82. provinceCode: string
  83. provinceName: string
  84. children?: any[] // 可选字段
  85. }
  86. const provincesList = ref<Province[]>([])
  87. const provinceSelect = ref('')
  88. const schooltName = ref('')
  89. const tableData = ref([])
  90. const selUserList = ref([])
  91. const selectListId = inject<any>('selectListId', [])
  92. const tableDataRef = ref<InstanceType<typeof ElTable>>()
  93. // 提交按钮loading
  94. const submitLoading = ref(false)
  95. onMounted(() => {
  96. GetProvinceTree()
  97. GetSingleExamList()
  98. })
  99. // 获取省市区树列表
  100. const GetProvinceTree = async () => {
  101. const res = await provinceTree()
  102. if(res.code == 200 && res.data) {
  103. const { data } = res
  104. provincesList.value = data
  105. }
  106. }
  107. const tableLoading = ref(false)
  108. const GetSingleExamList = async () => {
  109. try {
  110. tableLoading.value = true
  111. const res = await getSingleExamList({
  112. queryStr: schooltName.value,
  113. provinceCode: provinceSelect.value,
  114. // cityCode: '',
  115. // areaCode: '',
  116. })
  117. if (res.code === 200) {
  118. tableData.value = res.data
  119. nextTick(() => {
  120. tableData.value.forEach((item: any) => {
  121. if(selectListId.value.includes(item.tenantCode)) {
  122. tableDataRef.value?.toggleRowSelection(item, true)
  123. }
  124. })
  125. })
  126. }
  127. }catch {} finally {
  128. tableLoading.value = false
  129. }
  130. }
  131. const SearchChange = () => {
  132. GetSingleExamList()
  133. }
  134. const handleSelectionChange = (val: any) => {
  135. selUserList.value = val.map((item: any) => item.id)
  136. }
  137. const emit = defineEmits(['RefTable'])
  138. const AddComfirm = async () => {
  139. submitLoading.value = true
  140. try {
  141. const res = await addSingleSchool({
  142. schoolParentId: schoolData.id,
  143. schoolChildId: selUserList.value
  144. })
  145. if(res.code == 200) {
  146. ElMessage.success(res.msg)
  147. schoolData.showDialog = false
  148. emit('RefTable', false)
  149. }else {
  150. ElMessage.error(res.msg)
  151. }
  152. submitLoading.value = false
  153. } catch (error) {
  154. console.log(error)
  155. submitLoading.value = false
  156. }
  157. }
  158. </script>
  159. <style lang="scss" scoped>
  160. .page_search {
  161. display: flex;
  162. }
  163. </style>