index.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. <template>
  2. <div class="main_container">
  3. <div class="page_item end_item">
  4. <DefaultBlockSearch @searchChange="HandleSearchChange">
  5. <div v-if="userInfo.roles.includes('Admin')" class="content_right">
  6. <el-button class="button_refresh" @click="OpenBatchImportDialog">批量导入</el-button>
  7. <el-button class="button_background" @click="OpenSchoolFormDialog()">新增学校</el-button>
  8. </div>
  9. </DefaultBlockSearch>
  10. <Table :tableColumns="publicSeasTableColumns" :tableData="tableData"
  11. :currentPage="currentPage" :pageSize="pageSize" :totalNum="totalNum"
  12. :showPageSize="true" @paginationChange="HandlePaginationChange">
  13. <template #num="{row,currentIndex}">
  14. {{ currentIndex + pageSize * (currentPage - 1) }}
  15. </template>
  16. <template #operation="{row}">
  17. <div class="table_row_option">
  18. <span class="button_editor" @click="ClaimCustomer(row)">认领</span>
  19. <span class="button_editor" @click="OpenSchoolFormDialog(row)">编辑</span>
  20. <span class="button_editor" @click="GoToDetail(row)">详情</span>
  21. <span class="el_button_delete" @click="OpenDeleteDialog(row)">删除</span>
  22. </div>
  23. </template>
  24. <template #paginationDesc>
  25. <span>共 {{ totalNum }} 条数据</span>
  26. </template>
  27. </Table>
  28. </div>
  29. <!-- 新增/修改 学校弹窗 -->
  30. <SchoolFormDialog
  31. :schoolTitle="schoolTitle"
  32. v-model:visible="schoolVisible"
  33. v-model:submitLoading="editFormDialogSubmitLoading"
  34. :defaultFormData="schoolDefaultFormData"
  35. @confirm="HandleSchoolDialogConfirm">
  36. </SchoolFormDialog>
  37. <!-- 批量导入 弹窗 -->
  38. <FormDialog class="batch_import_form" width="548px"
  39. title="批量导入" :visible="batchImportVisible"
  40. :submitLoading="batchImportSubmitLoading"
  41. :defaultFormData="defaultImportFormData"
  42. :formItemList="batchImportFormItemList"
  43. @fileUpload="HandleFileUplaod"
  44. @close="CloseBatchImportDialog"
  45. @confirm="HandleBatchImportComfirm">
  46. <template #templateFile>
  47. <el-button class="button_refresh" @click="HandleDownloadTemplate">下载模板</el-button>
  48. </template>
  49. <template #tableTemplate>
  50. <Table :hidePagination="true" :tableColumns="templateTableColumns" :tableData="[{},{}]" />
  51. <div style="font-size: 12px;">用于分析同一份试卷内不同试卷类型的得分、排名等情况。可下载模块进行填写后导入。</div>
  52. </template>
  53. </FormDialog>
  54. <!-- 删除弹窗 -->
  55. <DeleteCustomerDialog
  56. :currentDeleteRow="currentDeleteRow"
  57. v-model:dialogVisible="deleteDialogVisible"
  58. @confirm="HandleDeleteDialogConfirm">
  59. </DeleteCustomerDialog>
  60. </div>
  61. </template>
  62. <script setup lang="ts">
  63. import { computed, onMounted, ref } from 'vue';
  64. import { useRouter } from 'vue-router';
  65. import {ElMessage} from 'element-plus'
  66. import DefaultBlockSearch from '@/components/HighSeasCustomerHeaderSearch/DefaultBlockSearch/index.vue'
  67. import {stageOptions, regionOptions } from '@/components/HighSeasCustomerHeaderSearch/commonVar'
  68. import {defaultPageSearchParams as searchParams} from '@/components/HighSeasCustomerHeaderSearch/commonVar'
  69. import Table from '@/baseComponents/Table.vue';
  70. import {publicSeasTableColumns,templateTableColumns} from './table'
  71. import SchoolFormDialog from '@/components/SchoolFormDialog/index.vue'
  72. import FormDialog from '@/baseComponents/FormDialog.vue';
  73. import DeleteCustomerDialog from './components/DeleteCustomerDialog.vue';
  74. import {batchImportFormItemList} from './formDialog'
  75. import {HandleExportExcel} from '@/utils/exportExcelData'
  76. import { getHeaderSearchParamsApi,
  77. getHighSeasCustomerListApi,
  78. addHighSeasCustomerApi,
  79. importHighSeasCustomerApi,
  80. updateHighSeasCustomerApi,
  81. claimHighSeasCustomerApi,
  82. } from '@/api/highSeasCustomer'
  83. const router = useRouter()
  84. const userInfo = computed(()=>{
  85. return JSON.parse(localStorage.getItem('userInfo') || '{}')
  86. })
  87. // 获取头部筛选数据
  88. const GetHeaderSearchParams = async ()=>{
  89. let res = await getHeaderSearchParamsApi()
  90. const {regionData,stageData} = res.data || {}
  91. // 学段筛选选项
  92. stageOptions.value = stageData?.map(item=>{
  93. return{
  94. label:item.name,
  95. value:JSON.stringify({
  96. label:item.name,
  97. value:item.id,
  98. }),
  99. }
  100. })?.slice(1) || []
  101. // 省份筛选项
  102. regionOptions.value = regionData?.map(item=>{
  103. return{
  104. label:item.name,
  105. value:JSON.stringify({
  106. label:item.name,
  107. value:item.id
  108. }),
  109. subData:item.subData?.map(sub=>{
  110. return {
  111. label:sub.name,
  112. value:JSON.stringify({
  113. label:sub.name,
  114. value:sub.id
  115. }),
  116. }
  117. }).slice(1) || [],
  118. }
  119. })?.slice(1) || []
  120. }
  121. /** 头部筛选 变更 */
  122. const HandleSearchChange = async (params:any,key:string)=>{
  123. searchParams.value = {
  124. ...searchParams.value,
  125. ...params
  126. }
  127. if(key === 'province'){
  128. searchParams.value.area = 'all'
  129. }
  130. await GetTableData()
  131. }
  132. /** 2. 表格数据 有关操作 */
  133. const pageSize = ref(20)
  134. const currentPage = ref(1)
  135. const totalNum = ref(0)
  136. // 表格数据
  137. const tableData = ref([])
  138. const HandlePaginationChange = async (params)=>{
  139. const {type,val} = params
  140. if(type == 'currentPage'){
  141. currentPage.value = val
  142. }else if(type == 'pageSize'){
  143. pageSize.value = val
  144. }
  145. await GetTableData()
  146. }
  147. const GetTableData = async ()=>{
  148. let params = {
  149. queryStr: searchParams.value.queryStr,
  150. stageId: searchParams.value.stage === 'all' ? '' : JSON.parse(searchParams.value.stage || '{}')?.value,
  151. provinceId: searchParams.value.province === 'all' ? '' : JSON.parse(searchParams.value.province || '{}')?.value,
  152. cityId: searchParams.value.area === 'all' ? '' : JSON.parse(searchParams.value.area || '{}')?.value,
  153. pageNum: currentPage.value,
  154. pageSize: pageSize.value
  155. }
  156. let res = await getHighSeasCustomerListApi(params)
  157. tableData.value = res?.data?.records || []
  158. totalNum.value = res.data.total || 0
  159. }
  160. /**
  161. * 3. 新增/修改 学校弹窗有关数据
  162. */
  163. const schoolVisible = ref(false)
  164. const schoolTitle = ref('')
  165. const schoolDefaultFormData = ref({})
  166. const editFormDialogSubmitLoading = ref(false)
  167. const OpenSchoolFormDialog = (row?:any)=>{
  168. if(row){
  169. schoolTitle.value = '编辑学校'
  170. schoolDefaultFormData.value = {
  171. ...row,
  172. schoolStage:JSON.stringify({
  173. label:row.stageName,
  174. value:row.stageId
  175. }),
  176. provinceArea:{
  177. province:JSON.stringify({
  178. label:row.provinceName,
  179. value:row.provinceId
  180. }),
  181. district:JSON.stringify({
  182. label:row.cityName,
  183. value:row.cityId
  184. }),
  185. },
  186. }
  187. }else{
  188. schoolTitle.value = '新增学校'
  189. }
  190. schoolVisible.value = true
  191. }
  192. const CloseSchoolFormDialog = ()=>{
  193. editFormDialogSubmitLoading.value = false
  194. schoolVisible.value = false
  195. schoolDefaultFormData.value = {}
  196. }
  197. const HandleSchoolDialogConfirm = async (params:any)=>{
  198. editFormDialogSubmitLoading.value = true
  199. const {formData,formRef} = params
  200. console.log('表单的提交信息',formData)
  201. let transferParams = {
  202. id: formData.id,
  203. name: formData.name,
  204. stageId: JSON.parse(formData.schoolStage || '{}')?.value,
  205. stageName: JSON.parse(formData.schoolStage || '{}')?.label,
  206. provinceId: JSON.parse(formData.provinceArea.province || '{}')?.value,
  207. provinceName: JSON.parse(formData.provinceArea.province || '{}')?.label,
  208. cityId: JSON.parse(formData.provinceArea.district || '{}')?.value,
  209. cityName: JSON.parse(formData.provinceArea.district || '{}')?.label,
  210. address: formData.address,
  211. }
  212. let res = undefined
  213. try{
  214. if(formData.id){
  215. // 修改
  216. res = await updateHighSeasCustomerApi(transferParams)
  217. }else{
  218. // 新增
  219. res = await addHighSeasCustomerApi(transferParams)
  220. }
  221. }catch{}
  222. if(res?.code == 200){
  223. CloseSchoolFormDialog()
  224. await GetTableData()
  225. }else{
  226. editFormDialogSubmitLoading.value = false
  227. }
  228. }
  229. /**
  230. * 4. 批量导入弹窗有关数据
  231. */
  232. const batchImportVisible = ref(false)
  233. const batchImportSubmitLoading = ref(false)
  234. const defaultImportFormData = ref({})
  235. // 打开弹窗
  236. const OpenBatchImportDialog = ()=>{
  237. batchImportVisible.value = true
  238. }
  239. // 关闭弹窗
  240. const CloseBatchImportDialog = ()=>{
  241. batchImportSubmitLoading.value = false
  242. batchImportVisible.value = false
  243. }
  244. // 导入确认
  245. const HandleBatchImportComfirm = async (params:any)=>{
  246. const {formData,formRef} = params
  247. // console.log('表单信息',formData)
  248. if(!formData?.file?.url){
  249. ElMessage.warning('请先上传文件')
  250. return
  251. }
  252. batchImportSubmitLoading.value = true
  253. let fileFormData = new FormData()
  254. fileFormData.append('file',formData.file.url)
  255. let res = await importHighSeasCustomerApi(fileFormData)
  256. if(res?.code == 200){
  257. ElMessage.success(res?.msg)
  258. CloseBatchImportDialog()
  259. await GetTableData()
  260. }else{
  261. batchImportSubmitLoading.value = false
  262. }
  263. }
  264. // 下载模板
  265. const HandleDownloadTemplate = async ()=>{
  266. await HandleExportExcel(templateTableColumns.value,[],'新增学校_批量导入模板')
  267. }
  268. // 获取上传文件
  269. const HandleFileUplaod = (params)=>{
  270. const {key,file} = params
  271. console.log('file',file)
  272. defaultImportFormData.value.file = {
  273. url:file.raw,
  274. name:file.name
  275. }
  276. }
  277. /**
  278. * 5. 删除弹窗 有关数据
  279. */
  280. const deleteDialogVisible = ref(false)
  281. const currentDeleteRow = ref()
  282. const OpenDeleteDialog = (row)=>{
  283. deleteDialogVisible.value = true
  284. currentDeleteRow.value = row
  285. }
  286. // 删除后执行的操作
  287. const HandleDeleteDialogConfirm = async ()=>{
  288. currentDeleteRow.value = {}
  289. await GetTableData()
  290. }
  291. /**
  292. * 6.认领有关接口调用
  293. */
  294. const ClaimCustomer = async (row)=>{
  295. let res = await claimHighSeasCustomerApi(row.id)
  296. if(res?.code == 200){
  297. ElMessage.success(res?.msg)
  298. await GetTableData()
  299. }
  300. }
  301. /** 7.跳转详情 */
  302. const GoToDetail = (row)=>{
  303. sessionStorage.setItem('customerMsg',JSON.stringify(row))
  304. router.push(`highSeasCustomerDetail?id=${row.id}`)
  305. }
  306. onMounted( async()=>{
  307. await GetHeaderSearchParams()
  308. await GetTableData()
  309. })
  310. </script>
  311. <style lang="scss" scoped>
  312. .end_item{
  313. gap:16px;
  314. }
  315. .batch_import_form{
  316. :deep(.el-dialog__body){
  317. min-height: 345px !important;
  318. }
  319. }
  320. </style>