index.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. <template>
  2. <ContentWrap>
  3. <!-- 搜索工作栏 -->
  4. <el-form
  5. class="-mb-15px"
  6. :model="queryParams"
  7. ref="queryFormRef"
  8. :inline="true"
  9. label-width="68px"
  10. >
  11. <el-form-item label="参与导师" prop="supervisorIds">
  12. <el-select
  13. v-model="queryParams.supervisorId"
  14. placeholder="请选择参与导师"
  15. clearable
  16. filterable
  17. class="!w-240px"
  18. >
  19. <el-option
  20. v-for="supervisor in supervisors"
  21. :key="supervisor.id"
  22. :label="supervisor.nickname"
  23. :value="supervisor.id"
  24. />
  25. </el-select>
  26. </el-form-item>
  27. <!-- <el-form-item label="学硕名额" prop="academicSlots">-->
  28. <!-- <el-input-->
  29. <!-- v-model="queryParams.academicSlots"-->
  30. <!-- placeholder="请输入学硕名额"-->
  31. <!-- clearable-->
  32. <!-- @keyup.enter="handleQuery"-->
  33. <!-- class="!w-240px"-->
  34. <!-- />-->
  35. <!-- </el-form-item>-->
  36. <!-- <el-form-item label="专硕名额" prop="professionalSlots">-->
  37. <!-- <el-input-->
  38. <!-- v-model="queryParams.professionalSlots"-->
  39. <!-- placeholder="请输入专硕名额"-->
  40. <!-- clearable-->
  41. <!-- @keyup.enter="handleQuery"-->
  42. <!-- class="!w-240px"-->
  43. <!-- />-->
  44. <!-- </el-form-item>-->
  45. <el-form-item>
  46. <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
  47. <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
  48. <!--
  49. <el-button
  50. plain
  51. type="primary"
  52. @click="openForm('update', scope.row.id)"
  53. v-hasPermi="['system:student-select-supervisor-record:update']"
  54. v-if="userInfo?.userType === '1'"
  55. >
  56. 志愿编辑
  57. </el-button> -->
  58. <!-- <el-button-->
  59. <!-- type="primary"-->
  60. <!-- plain-->
  61. <!-- @click="openForm('create')"-->
  62. <!-- v-hasPermi="['system:supervisor-selection-setting:create']"-->
  63. <!-- >-->
  64. <!-- <Icon icon="ep:plus" class="mr-5px" /> 新增-->
  65. <!-- </el-button>-->
  66. <!-- <el-button-->
  67. <!-- type="success"-->
  68. <!-- plain-->
  69. <!-- @click="handleExport"-->
  70. <!-- :loading="exportLoading"-->
  71. <!-- v-hasPermi="['system:supervisor-selection-setting:export']"-->
  72. <!-- >-->
  73. <!-- <Icon icon="ep:download" class="mr-5px" /> 导出-->
  74. <!-- </el-button>-->
  75. </el-form-item>
  76. </el-form>
  77. </ContentWrap>
  78. <!-- 列表 -->
  79. <ContentWrap>
  80. <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
  81. <el-table-column type="index" />
  82. <!-- <el-table-column label="项目名称" align="center" prop="projectId" />-->
  83. <el-table-column label="导师姓名" align="center" prop="supervisorName" />
  84. <el-table-column
  85. label="导师类型"
  86. align="center"
  87. prop="userType"
  88. :formatter="userTypeFormatter"
  89. />
  90. <el-table-column label="招生指标" align="center">
  91. <template #default="scope">
  92. 学硕/{{ scope.row.academicSlots }} 专硕/{{ scope.row.professionalSlots }}
  93. </template>
  94. </el-table-column>
  95. <!-- <el-table-column label="学硕名额" align="center" prop="academicSlots" />-->
  96. <!-- <el-table-column label="专硕名额" align="center" prop="professionalSlots" />-->
  97. <el-table-column label="已招生名额" align="center" min-width="90px">
  98. <template #default="scope">
  99. <span>
  100. <span v-if="scope.row.occupiedAcademicSlots">
  101. 学硕/{{ scope.row.occupiedAcademicSlots }}
  102. </span>
  103. <span v-if="scope.row.occupiedProfessionalSlots">
  104. 专硕/{{ scope.row.occupiedProfessionalSlots }}
  105. </span>
  106. <span v-if="!scope.row.occupiedAcademicSlots && !scope.row.occupiedProfessionalSlots">
  107. 暂无
  108. </span>
  109. </span>
  110. </template>
  111. </el-table-column>
  112. <el-table-column label="剩余名额" align="center" min-width="100px">
  113. <template #default="scope">
  114. 学硕/{{ scope.row.academicSlots - scope.row.occupiedAcademicSlots }} 专硕/{{ scope.row.professionalSlots - scope.row.occupiedProfessionalSlots }}
  115. </template>
  116. </el-table-column>
  117. <el-table-column
  118. label="更新时间"
  119. align="center"
  120. prop="updateTime"
  121. :formatter="dateFormatter"
  122. width="180px"
  123. />
  124. <el-table-column label="导师详情" align="center" v-if="userInfo?.userType === '4' || userInfo?.userType === '1'">
  125. <template #default="scope">
  126. <el-button
  127. link
  128. type="primary"
  129. @click="openTeacherRequireForm( scope.row.supervisorId, scope.row.userType)"
  130. v-hasPermi="['system:user:query']"
  131. >
  132. <Icon icon="ep:bell" />
  133. 查看
  134. </el-button>
  135. </template>
  136. </el-table-column>
  137. <!-- 学生志愿填报-->
  138. <el-table-column label="志愿填报" align="center" min-width="120px" v-if=" userInfo?.userType === '1'">
  139. <template #default="scope">
  140. <el-button
  141. type="primary"
  142. link
  143. @click="openStudentSelectSupervisorPop('create', scope.row.projectId,scope.row.supervisorId)"
  144. v-hasPermi="['system:student-select-supervisor-record:create']"
  145. v-if="userInfo?.userType === '1'"
  146. >
  147. <Icon icon="ep:bell" />
  148. 选择
  149. </el-button>
  150. </template>
  151. </el-table-column>
  152. <el-table-column label="操作" align="center" min-width="120px" v-if="userInfo?.userType === '4'" >
  153. <template #default="scope">
  154. <!--学院查看招生详情-->
  155. <el-button
  156. type="text"
  157. v-if="userInfo?.userType === '4'"
  158. @click="openStudentSelectSupervisorRecord(scope.row.projectId,scope.row.supervisorId)"
  159. v-hasPermi="['system:student-select-supervisor-record:query']"
  160. >
  161. <Icon icon="ep:bell" />
  162. 招生详情
  163. </el-button>
  164. <!--志愿填报修改-->
  165. <!-- <el-button
  166. link
  167. type="primary"
  168. @click="handelWithdraw( scope.row.supervisorId)"
  169. v-hasPermi="['system:student-select-supervisor-record:withdraw']"
  170. v-if="userInfo?.userType === '1' && scope.row.selectType ==1"
  171. >
  172. 撤回
  173. </el-button> -->
  174. <!--名额设置-->
  175. <el-button
  176. link
  177. type="primary"
  178. @click="openForm('update', scope.row.supervisorId,scope.row.userType,scope.row.studentAchievementRequirement)"
  179. v-hasPermi="['system:supervisor-selection-setting:update']"
  180. v-if="userInfo?.userType === '4'"
  181. >
  182. 编辑
  183. </el-button>
  184. <!-- <el-button-->
  185. <!-- link-->
  186. <!-- type="danger"-->
  187. <!-- @click="handleDelete(scope.row.id)"-->
  188. <!-- v-hasPermi="['system:supervisor-selection-setting:delete']"-->
  189. <!-- >-->
  190. <!-- 删除-->
  191. <!-- </el-button>-->
  192. </template>
  193. </el-table-column>
  194. </el-table>
  195. <!-- 分页 -->
  196. <Pagination
  197. :total="total"
  198. v-model:page="queryParams.pageNo"
  199. v-model:limit="queryParams.pageSize"
  200. @pagination="getList"
  201. />
  202. </ContentWrap>
  203. <!-- 是学生-->
  204. <!-- <ContentWrap v-if="userInfo.userType==='1' ||userInfo.userType==='4'" >
  205. <el-table
  206. v-loading="loading"
  207. :data="selectionList"
  208. row-key="id"
  209. >
  210. <el-table-column type="index" width="50" />
  211. <el-table-column label="学生姓名" align="center" prop="studentName" />
  212. <el-table-column label="硕士类型" align="center" prop="masterType" >
  213. <template #default="scope">
  214. <dict-tag :type="DICT_TYPE.SYSTEM_STUDENT_MASTER_TYPE" :value="scope.row.masterType" />
  215. </template>
  216. </el-table-column>
  217. <el-table-column label="导师姓名" align="center" prop="supervisor" />
  218. <el-table-column
  219. label="导师类型"
  220. align="center"
  221. prop="supervisorType"
  222. :formatter="userTypeFormatter"
  223. />
  224. <el-table-column label="专业" align="center" prop="major" />
  225. <el-table-column label="简历" align="center" prop="introduction" />
  226. <el-table-column label="申请状态" align="center" prop="selectType" >
  227. <template #default="scope">
  228. <dict-tag :type="DICT_TYPE.SYSTEM_STUDENT_SELECT_RECORD_SELECT_TYPE" :value="scope.row.selectType" />
  229. </template>
  230. </el-table-column>
  231. <el-table-column label="学生电子签名" align="center" prop="studentSignature" />
  232. <el-table-column label="导师电子签名" align="center" prop="supervisorSignature" />
  233. <el-table-column
  234. label="提交时间"
  235. align="center"
  236. prop="createTime"
  237. :formatter="dateFormatter"
  238. width="180px"
  239. />
  240. <el-table-column
  241. label="导师审批时间"
  242. align="center"
  243. prop="supervisorApproveTime"
  244. :formatter="dateFormatter"
  245. width="180px"
  246. />
  247. </el-table>
  248. </ContentWrap> -->
  249. <!-- 表单弹窗:添加/修改 -->
  250. <supervisorSelectionSettingForm ref="formRef" @success="getList" />
  251. <!-- 导师详情弹窗-->
  252. <teacherRequireForm ref="teacherRequireFormRef" @success="getList"/>
  253. <studentSelectSupervisorRecordForm ref="studentSelectSupervisorPop" @success="getList"/>
  254. </template>
  255. <script setup lang="ts">
  256. import { ref } from 'vue'
  257. import { dateFormatter } from '@/utils/formatTime'
  258. import download from '@/utils/download'
  259. import { supervisorSelectionSettingApi, supervisorSelectionSettingVO } from '@/api/system/supervisorSelectionSetting'
  260. import supervisorSelectionSettingForm from './supervisorSelectionSettingForm.vue'
  261. import teacherRequireForm from '../userDetail/teacher.vue'
  262. import studentSelectSupervisorRecordForm from '../studentSelection/studentSelectSupervisorRecord/studentSelectSupervisorRecordForm.vue'
  263. import * as UserApi from '@/api/system/user'
  264. import { getUserProfile, ProfileVO } from '@/api/system/user/profile'
  265. import {
  266. studentSelectSupervisorRecordApi,
  267. studentSelectSupervisorRecordVO
  268. } from "@/api/system/studentSelectSupervisorRecord";
  269. import {DICT_TYPE} from "@/utils/dict";
  270. import { useRoute, useRouter } from 'vue-router';
  271. /** 导师学硕专硕名额设置 列表 */
  272. defineOptions({ name: 'SupervisorSelectionSetting' })
  273. const route = useRoute()
  274. const projectId = ref(route.query.projectId);
  275. const message = useMessage() // 消息弹窗
  276. const { t } = useI18n() // 国际化
  277. const loading = ref(true) // 列表的加载中
  278. const list = ref<supervisorSelectionSettingVO[]>([]) // 列表的数据
  279. const total = ref(0) // 列表的总页数
  280. const queryParams = reactive({
  281. pageNo: 1,
  282. pageSize: 10,
  283. projectId: projectId.value,
  284. supervisorId: undefined,
  285. academicSlots: undefined,
  286. professionalSlots: undefined,
  287. supervisorName:undefined,
  288. userType:undefined,
  289. createTime: [],
  290. })
  291. const queryFormRef = ref() // 搜索的表单
  292. const exportLoading = ref(false) // 导出的加载中
  293. //记录页面
  294. const router = useRouter();
  295. const openStudentSelectSupervisorRecord = (projectId,supervisorId) => {
  296. router.push({ name: 'studentSelectSupervisorRecord', query: { projectId: projectId ,supervisorId :supervisorId} });
  297. }
  298. //导师类型
  299. const userTypeFormatter = (row, column, cellValue, index) => {
  300. switch (cellValue) {
  301. case "3":
  302. return '校内导师';
  303. case "5":
  304. return '校外导师';
  305. default:
  306. return '未知';
  307. }
  308. };
  309. /** 查询列表 */
  310. const getList = async () => {
  311. loading.value = true
  312. try {
  313. const data = await supervisorSelectionSettingApi.getSupervisorSelectionSettingPage(queryParams)
  314. list.value = data.list
  315. console.log("list",list.value);
  316. total.value = data.total
  317. } finally {
  318. loading.value = false
  319. }
  320. }
  321. //获取登录人员信息
  322. const userInfo = ref({} as ProfileVO)
  323. const getUserInfo = async () => {
  324. const users = await getUserProfile()
  325. userInfo.value = users
  326. // console.log("userInfo",userInfo.value);
  327. }
  328. /** 搜索按钮操作 */
  329. const handleQuery = () => {
  330. queryParams.pageNo = 1
  331. getList()
  332. }
  333. /** 重置按钮操作 */
  334. const resetQuery = () => {
  335. queryFormRef.value.resetFields()
  336. handleQuery()
  337. }
  338. /** 添加/修改操作 */
  339. const formRef = ref()
  340. const openForm = (type: string, id?: number, userType?: string, studentAchievementRequirement?: string) => {
  341. formRef.value.open(type, id, userType, studentAchievementRequirement)
  342. }
  343. /** 删除按钮操作 */
  344. const handleDelete = async (id: number) => {
  345. try {
  346. // 删除的二次确认
  347. await message.delConfirm()
  348. // 发起删除
  349. await supervisorSelectionSettingApi.deleteSupervisorSelectionSetting(id)
  350. message.success(t('common.delSuccess'))
  351. // 刷新列表
  352. await getList()
  353. } catch {}
  354. }
  355. /** 导出按钮操作 */
  356. const handleExport = async () => {
  357. try {
  358. // 导出的二次确认
  359. await message.exportConfirm()
  360. // 发起导出
  361. exportLoading.value = true
  362. const data = await supervisorSelectionSettingApi.exportSupervisorSelectionSetting(queryParams)
  363. download.excel(data, '导师学硕专硕名额设置.xls')
  364. } catch {
  365. } finally {
  366. exportLoading.value = false
  367. }
  368. }
  369. //获取所有导师
  370. const supervisors = ref()
  371. const getSupervisor= async () => {
  372. try {
  373. const result = await UserApi.getSupervisor()
  374. supervisors.value = result
  375. } catch (error) {
  376. console.error('未获取到导师', error)
  377. }
  378. }
  379. //传supervisorId给formData.supervisorId
  380. const teacherRequireFormRef = ref()
  381. const openTeacherRequireForm = (supervisorId?: number, userType?: string) => {
  382. teacherRequireFormRef.value.open("detail",supervisorId,userType)
  383. }
  384. const selectStatus = ref()
  385. const getUser = async () => {
  386. const result = await UserApi.getUser(userInfo.value.id)
  387. selectStatus.value = result.selectStatus
  388. // console.log("selectStatus",selectStatus.value);
  389. }
  390. //志愿填报弹窗
  391. const studentSelectSupervisorPop= ref()
  392. const openStudentSelectSupervisorPop = async (type: string,id:number,studentId:number,projectId?: number,supervisorId? :number) => {
  393. await getUser();
  394. if(selectStatus.value !== 0){
  395. message.error("已存在申请")
  396. }else{
  397. studentSelectSupervisorPop.value.open(type,id,studentId,projectId ,supervisorId)
  398. }
  399. }
  400. const recordData = ref({
  401. id: undefined,
  402. projectId: undefined,
  403. studentId: undefined,
  404. supervisorId: undefined,
  405. selectType: undefined,
  406. studentSignature: "",
  407. supervisorApproveTime: undefined,
  408. supervisorSignature: "",
  409. externalSupervisorId: undefined,
  410. masterType:undefined,
  411. studentSignDate:[],
  412. supervisorSignDate:[],
  413. })
  414. const handelWithdraw = async (projectId:number,supervisorId:number) => {
  415. try {
  416. await message.confirm('是否确定撤回申请?')
  417. recordData.value.supervisorId=supervisorId
  418. recordData.value.projectId=projectId
  419. const data =recordData.value as unknown as studentSelectSupervisorRecordVO
  420. await studentSelectSupervisorRecordApi.withdrawStudentSelectSupervisorRecord(data)
  421. message.success("撤回了申请")
  422. await getList()
  423. } catch {}
  424. }
  425. const selectionList = ref<studentSelectSupervisorRecordVO[]>([]) //下面的选择记录列表
  426. /** 查询互选记录列表 */
  427. const getRecordList = async () => {
  428. loading.value = true
  429. try {
  430. const data = await studentSelectSupervisorRecordApi.getSelectSupervisorRecordList()
  431. selectionList.value = data
  432. } finally {
  433. loading.value = false
  434. }
  435. }
  436. /** 初始化 **/
  437. onMounted(async () => {
  438. getList()
  439. await getUserInfo()
  440. getSupervisor()
  441. await getRecordList()
  442. getUser()
  443. })
  444. </script>