PrevShiftLine.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <template>
  2. <div v-loading="loading" class="fx-column">
  3. <mx-condition :query-params="queryParams" :require-fields="requireFields" use-alias-mapping tiny-margin-bottom label-width="80px" @query="handleQuery" />
  4. <div v-if="!pureMode" class="text-right mb8">
  5. <el-input v-model="query.keyword" placeholder="请输入院校/专业名称" suffix-icon="el-icon-search" style="width: 250px" clearable @keyup.enter.native="handleSearch" />
  6. <el-button type="primary" class="ml10" @click="handleSearch">搜索</el-button>
  7. </div>
  8. <template v-if="subMajorMode">
  9. <sub-major-table v-for="row in rows" :key="row.id" :row="row" :is-new-gaokao="isNewGaokao" :custom-cols-length="getShiftCols(row).length" @university="toDetail(row)">
  10. <template #default="scope">
  11. <el-descriptions-item v-for="c in getShiftCols(row)" :key="c.prop" :label="c.label">{{ scope[c.prop] || '-' }}</el-descriptions-item>
  12. </template>
  13. </sub-major-table>
  14. </template>
  15. <dynamic-table v-else :rows="rows" :columns="columns" border>
  16. <template #university="{row, display}">
  17. <div class="pointer hover-primary" @click="toDetail(row)">{{ display }}</div>
  18. </template>
  19. <template #groupsName="{row, display}">
  20. <div v-if="display">{{ display }}</div>
  21. <div>{{ row.premark }}</div>
  22. </template>
  23. <template #marjorDirection="{row, display}">
  24. <template v-if="row.marjorName">
  25. <div v-for="item in row.marjorName.split(',')" :key="item" class="f13 mb3">{{ item }}</div>
  26. </template>
  27. <el-tooltip :disabled="!display||display.length<100" placement="top">
  28. <div slot="content" style="max-width: 60vw">{{ display }}</div>
  29. <div class="text-ellipsis-5 f12 f-999">{{ display }}</div>
  30. </el-tooltip>
  31. </template>
  32. <template #tag="{display}">
  33. <div v-for="(item, idx) in display.split('>')" :key="idx" :style="{marginLeft: (idx*10)+'px'}" class="tag-item f13 rel">{{ item }}
  34. </div>
  35. </template>
  36. </dynamic-table>
  37. <evaluation-empty v-if="!rows.length&&subMajorMode" title="暂无数据" />
  38. <vip-guide-more v-if="total>1&&!isBind" />
  39. <pagination :total="total" :page.sync="query.pageNum" :limit.sync="query.pageSize" @pagination="getList" />
  40. </div>
  41. </template>
  42. <script>
  43. import { getPreEnroll } from '@/api/webApi/prev-batch'
  44. import DynamicTable from '@/components/dynamic-table/index.vue'
  45. import transferMixin from '@/components/TransferMixin'
  46. import { mapGetters } from 'vuex'
  47. import MxCondition from '@/components/MxCondition/mx-condition.vue'
  48. import GlobalVoluntaryDataMixin from '@/views/career/GlobalVoluntaryDataMixin'
  49. import SubMajorTable from '@/views/career/PrevBatch/components/SubMajorTable.vue'
  50. import PlanShiftColumns from '@/views/career/PrevBatch/components/PlanShiftColumns'
  51. const formatter = (row, column, cellValue) => {
  52. return cellValue || '-'
  53. }
  54. export default {
  55. name: 'PrevShiftLine',
  56. components: { SubMajorTable, MxCondition, DynamicTable },
  57. mixins: [transferMixin, GlobalVoluntaryDataMixin, PlanShiftColumns],
  58. props: {
  59. category: {
  60. type: String | Number,
  61. default: ''
  62. },
  63. universityCode: {
  64. type: String | Number,
  65. default: ''
  66. }
  67. },
  68. data() {
  69. return {
  70. subMajorMode: false,
  71. loading: false,
  72. query: {
  73. pageNum: 1,
  74. pageSize: 10,
  75. keyword: ''
  76. },
  77. firedParams: null,
  78. requireFields: ['preEnrollYear'],
  79. total: 0,
  80. rows: []
  81. }
  82. },
  83. computed: {
  84. ...mapGetters(['isLogin', 'isBind', 'isPreEnrollAsYzy']),
  85. pureMode() {
  86. return !!this.universityCode // now work in university detail page.
  87. },
  88. queryParams() {
  89. if (!this.isLogin) return null
  90. const category = this.category || this.$route.meta.category
  91. // 现在不需要 preCategory 了
  92. const categoryParams = { category }
  93. return this.pureMode || this.isPreEnrollAsYzy ? {
  94. ...categoryParams,
  95. preEnrollYear: '',
  96. universityCode: this.universityCode
  97. } : {
  98. ...categoryParams,
  99. preEnrollYear: '',
  100. preEnrollTag: '',
  101. preEnrollSubTag: '',
  102. preEnrollCourse0: '',
  103. preEnrollCourse1: '',
  104. universityCode: this.universityCode
  105. }
  106. },
  107. columns() {
  108. return [{
  109. label: '年份',
  110. prop: 'year',
  111. width: '60px'
  112. }, {
  113. label: '院校名称',
  114. prop: 'universityName',
  115. slotBody: 'university',
  116. width: '140px'
  117. }, {
  118. label: '招生代码',
  119. prop: 'collegeCode',
  120. width: '80px'
  121. }, {
  122. hidden: !this.isNewGaokao,
  123. label: '专业组',
  124. prop: 'groupsName',
  125. slotBody: 'groupsName',
  126. width: '120px'
  127. }, {
  128. label: '计划类别',
  129. prop: 'tags',
  130. align: 'left',
  131. slotBody: 'tag',
  132. width: '250px'
  133. }, {
  134. hidden: !this.isNewGaokao,
  135. label: '选考科目',
  136. prop: 'course',
  137. width: '140px',
  138. formatter
  139. }, {
  140. label: '录取人数',
  141. prop: 'numReal',
  142. width: '80px',
  143. formatter
  144. }, {
  145. label: '最低分',
  146. prop: 'score',
  147. width: '80px',
  148. formatter
  149. }, {
  150. label: '位次',
  151. prop: 'seat',
  152. width: '80px',
  153. formatter
  154. }, {
  155. label: '专业/备注',
  156. prop: 'marjorDirection',
  157. slotBody: 'marjorDirection',
  158. align: 'left',
  159. formatter
  160. }]
  161. }
  162. },
  163. watch: {
  164. 'firedParams.year': function(val) {
  165. if (val) this.ensureVoluntaryData({ year: val })
  166. }
  167. },
  168. mounted() {
  169. this.loading = true // 防止页面闪烁
  170. },
  171. methods: {
  172. handleSearch() {
  173. this.query.pageNum = 1
  174. this.getList()
  175. },
  176. handleQuery(model) {
  177. this.firedParams = model
  178. this.handleSearch()
  179. },
  180. async getList() {
  181. this.loading = true
  182. try {
  183. const res = await getPreEnroll({ ...this.query, ...this.firedParams })
  184. // noinspection JSUnresolvedVariable
  185. res.rows.forEach(r => r.tags = r.subTag ? r.tag + '>' + r.subTag : r.tag)
  186. this.rows = res.rows
  187. this.total = res.total
  188. } finally {
  189. this.loading = false
  190. }
  191. },
  192. toDetail(row) {
  193. this.transferTo('/career/plan/UniversityDetail', { code: row.universityCode })
  194. }
  195. }
  196. }
  197. </script>
  198. <style scoped>
  199. .tag-item::before {
  200. /* a little dot before each item */
  201. content: '•';
  202. position: absolute;
  203. left: -10px;
  204. }
  205. </style>