elective-generation-flow-log.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <template>
  2. <mx-table :rows="logTable.rows" :prop-defines="logTable.columns" border class="elective-flow-table">
  3. <template #group-header="{key, label}">
  4. <elective-flow-major v-if="logTable.majors[key]" :icon-classes="['f-fff']"
  5. :matched-majors="logTable.majors[key]"></elective-flow-major>
  6. {{ label }}
  7. </template>
  8. <template #group-flow="{value}">
  9. <span v-if="value.text">{{ value.text }}</span>
  10. <span v-else v-html="'&#12288'"></span>
  11. <elective-flow-rank-descriptor v-if="value.rankDescriptors"
  12. :rank-descriptors="value.rankDescriptors"></elective-flow-rank-descriptor>
  13. </template>
  14. </mx-table>
  15. </template>
  16. <script>
  17. import config from '@/common/mx-config'
  18. import ElectiveFlowMajor from '@/views/elective/generation/components/elective-flow-major'
  19. import ElectiveFlowRankDescriptor from '@/views/elective/generation/components/elective-flow-rank-descriptor'
  20. export default {
  21. name: 'elective-generation-flow-log',
  22. components: { ElectiveFlowRankDescriptor, ElectiveFlowMajor },
  23. props: ['groups', 'matchedMajors', 'histories'],
  24. computed: {
  25. logTable() {
  26. if (!this.histories.length) return {}
  27. const maxGeneration = this.histories.last().generation
  28. const options = Object.values(config.electiveGenerationOptions)
  29. // columns & rows
  30. const rows = []
  31. for (let g = 1; g <= maxGeneration; g++) {
  32. const opt = options.find(opt => opt.value == g)
  33. rows.push({ opt, generation: opt.title })
  34. }
  35. const columns = { generation: { label: '进程' } }
  36. const majors = {}
  37. this.groups.forEach(group => {
  38. const keyPrefix = 'group_'
  39. const key = keyPrefix + group.groupId
  40. columns[key] = { label: group.groupName, minWidth: '160px', slot: 'group-flow', slotHeader: 'group-header' }
  41. // match major
  42. const groupMajors = (this.matchedMajors?.majors
  43. ?.filter(m => m['matchedGroupIds'].some(id => id == group.groupId)) || [])
  44. .groupBy(m => m.collegeName)
  45. if (groupMajors.length) majors[key] = groupMajors
  46. // fill rows
  47. rows.forEach(row => {
  48. const g = row.opt.value
  49. const gHistories = this.histories.filter(h => h.generation == g)
  50. row[key] = {
  51. text: gHistories.map(h => h.description).join('/'),
  52. histories: gHistories,
  53. rankDescriptors: gHistories.last(i => !!i.rankDescriptors?.length)?.rankDescriptors
  54. }
  55. })
  56. })
  57. return {
  58. columns,
  59. rows,
  60. majors
  61. }
  62. }
  63. }
  64. }
  65. </script>
  66. <style>
  67. @import url('./elective-flow-table-style.css');
  68. </style>