test-report.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <template>
  2. <div class="app-container">
  3. <slot name="select">
  4. <el-card shadow="hover">
  5. <template #header v-if="majorTree.length">
  6. <div class="fx-row fx-bet-cen">
  7. <span class="f-999 f12">
  8. 请从推荐专业门类中选择{{ reportConfig.selectMajorLimit }}个你喜欢的专业类
  9. </span>
  10. <el-button v-if="!readonly" type="primary" size="small" plain @click="majorPickerDisabled=false">
  11. {{ selectMajorText }}
  12. </el-button>
  13. </div>
  14. </template>
  15. <test-major-picker :major-tree="majorTree" :selected-codes="selectedCodes"
  16. :select-limit="reportConfig.selectMajorLimit" :disabled="disabled"
  17. @submit="handleMajorSubmit" @cancel="majorPickerDisabled=true"></test-major-picker>
  18. </el-card>
  19. </slot>
  20. <slot name="table">
  21. <el-card shadow="hover" class="mt20">
  22. <template #header>{{ reportConfig.category }}类型计分表</template>
  23. <el-row>
  24. <el-col :span="8">
  25. <mx-table-dynamic :local-data="dynamicTableData"></mx-table-dynamic>
  26. </el-col>
  27. <el-col :span="16">
  28. <mx-chart v-if="dynamicTableData.rows.length" :options="chartOptions" class="fx-1"
  29. :height="chartHeight"></mx-chart>
  30. </el-col>
  31. </el-row>
  32. </el-card>
  33. </slot>
  34. <slot>
  35. <el-card shadow="hover" class="mt20" v-if="reportConfig.resolveConfig">
  36. <template #header>
  37. {{ reportConfig.category }}解读
  38. <div class="f-999 f12">
  39. {{ reportConfig.categoryDescription }}
  40. </div>
  41. </template>
  42. <el-collapse v-model="defaultActives">
  43. <el-collapse-item v-for="(item,idx) in sortedMergedData" :key="idx" :name="item.key">
  44. <template #title>
  45. <span class="f16 bold">{{ reportConfig.resolveConfig[item.key].title }}</span>
  46. <span class="f16 bold" :class="{'f-red': topOfMergedData.includes(item)}">{{
  47. reportConfig.resolveConfig[item.key].code
  48. }}</span>
  49. </template>
  50. <div class="fx-column">
  51. <div>
  52. <span class="f14 bold i">类型解读:</span>
  53. <span>{{ reportConfig.resolveConfig[item.key].description }}</span></div>
  54. <div v-if="reportConfig.resolveConfig[item.key].matchedMajor.length">
  55. <span class="f14 bold i">推荐专业门类:</span>
  56. <span class="light" :class="{'f-red': topOfMergedData.includes(item)}">
  57. {{ reportConfig.resolveConfig[item.key].matchedMajor.join('、') }}
  58. </span>
  59. </div>
  60. </div>
  61. </el-collapse-item>
  62. </el-collapse>
  63. </el-card>
  64. </slot>
  65. </div>
  66. </template>
  67. <script>
  68. import MxTableDynamic from '@/components/MxTableDynamic/index'
  69. import MxChart from '@/components/MxChart/index'
  70. import ReportMixin from './test-report-mixin'
  71. import consts from '@/common/mx-const'
  72. import { getMatchCategoryTree, saveUserSelectedCategory } from '@/api/webApi/test-major'
  73. import TestMajorPicker from '@/views/elective/test/components/test-major-picker'
  74. export default {
  75. mixins: [ReportMixin],
  76. name: 'test-report',
  77. components: { TestMajorPicker, MxTableDynamic, MxChart },
  78. props: {
  79. readonly: {
  80. type: Boolean,
  81. default: false
  82. }
  83. },
  84. data() {
  85. return {
  86. majorTree: [],
  87. majorPickerDisabled: false
  88. }
  89. },
  90. computed: {
  91. selectMajorText() {
  92. return this.selectedCodes.length ? '更换专业类' : '选择专业类'
  93. },
  94. testType() {
  95. return consts.enum.selectTestType[this.category] || ''
  96. },
  97. selectedCodes() {
  98. return this.source?.selectedList?.map(s => s.majorCategoryCode) || []
  99. },
  100. disabled() {
  101. return this.majorPickerDisabled || this.readonly
  102. }
  103. },
  104. watch: {
  105. source: {
  106. immediate: true,
  107. handler: function(val) {
  108. this.majorPickerDisabled = !!val?.selectedList?.length
  109. }
  110. }
  111. },
  112. mounted() {
  113. this.loadMajorCategoryTree()
  114. },
  115. methods: {
  116. loadMajorCategoryTree() {
  117. if (!this.source.matchedCode) {
  118. console.log('Prevent `getMatchCategoryTree` request caused by no-matchedCode', this.source)
  119. return
  120. }
  121. getMatchCategoryTree({
  122. matchCode: this.source.matchedCode,
  123. testType: this.testType
  124. }).then(res => {
  125. this.majorTree = res.data
  126. })
  127. },
  128. handleMajorSubmit(commit) {
  129. saveUserSelectedCategory({
  130. majorCategoryCode: commit.toString(),
  131. examineeId: this.source.examineeId || '',
  132. testType: this.testType
  133. }).then(() => {
  134. this.msgSuccess('保存成功')
  135. this.majorPickerDisabled = true
  136. }).finally(() => {
  137. // 无论成功与否都外抛事件进行刷新
  138. this.$emit('changed')
  139. })
  140. }
  141. }
  142. }
  143. </script>
  144. <style scoped>
  145. </style>