report-table.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. <template>
  2. <el-card>
  3. <template #header>
  4. <div class="fx-row fx-bet-cen">
  5. <span>选科报名表</span>
  6. <div>
  7. <el-button type="primary" @click="toAiAnalysis">AI分析</el-button>
  8. <el-button>选科历史记录</el-button>
  9. </div>
  10. </div>
  11. </template>
  12. <mx-table :propDefines="formatTable.cols" :rows="formatTable.rows">
  13. <template #temp="{row}">
  14. <span class="btn-blue mr5" @click="toSelectSub(row)">选择</span>
  15. <span class="btn-green">查看记录</span>
  16. <!-- <el-button>查看</el-button>-->
  17. </template>
  18. <template #signUp="{row}">
  19. <span class="btn-red" v-if="row.selected" @click="toUnSelect(row)">取消报名</span>
  20. <span class="btn-green" v-else @click="toSelect(row)">报名</span>
  21. </template>
  22. <template #subjects="{row}">
  23. <el-row>
  24. <el-col :span="8" v-for="subject in row.subjects">
  25. <el-popover
  26. placement="top"
  27. popper-class="zero-padding-popover"
  28. trigger="click">
  29. <div class="fx-column">
  30. <span >{{subject}}</span>
  31. </div>
  32. <el-tag type="success" slot="reference" class="mr10 mb10">{{ subject[0] }}</el-tag>
  33. </el-popover>
  34. </el-col>
  35. </el-row>
  36. </template>
  37. <template #colleges="{row}">
  38. <el-row>
  39. <el-col :span="12" v-for="college in row.colleges">
  40. <el-tag type="success" class="mb10">{{ college.major[0] }}</el-tag>
  41. :
  42. <span>{{ college.college }}</span>
  43. </el-col>
  44. </el-row>
  45. </template>
  46. </mx-table>
  47. <p>您的选科志愿: <span v-for="(item,index) in selectedList">
  48. {{ item.groupName }}{{ index + 1 < selectedList.length ? '、' : '' }}</span>
  49. </p>
  50. <!-- 拖拽 -->
  51. <test-drage ref="drage" :sortList="selectedList"></test-drage>
  52. <el-button @click="commit" type="primary">提交</el-button>
  53. <el-dialog
  54. title="电子签名"
  55. :visible.sync="dialogVisible"
  56. width="70%"
  57. >
  58. <vue-esign></vue-esign>
  59. <span slot="footer" class="dialog-footer">
  60. <el-button @click="dialogVisible = false">取 消</el-button>
  61. <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
  62. </span>
  63. </el-dialog>
  64. <choose-subject-dialog ref="chooseDialog" @chooseReally="toggleSubject"></choose-subject-dialog>
  65. <Ai-dialog ref="aiDialog"></Ai-dialog>
  66. </el-card>
  67. </template>
  68. <script>
  69. import AiDialog from './ai-analysis-dialog'
  70. import MxSelectTranslate from '@/components/Cache/modules/mx-select-translate-mixin.js'
  71. import TestDrage from './test-drage'
  72. import VueEsign from '@/components/VueEsign/index'
  73. import ChooseSubjectDialog from './choose-subject-dialog'
  74. export default {
  75. components: {
  76. TestDrage,
  77. VueEsign,
  78. ChooseSubjectDialog,
  79. AiDialog
  80. },
  81. mixins: [MxSelectTranslate],
  82. data() {
  83. return {
  84. preferenceCount: 3,
  85. optionalMajors: [],
  86. dialogVisible: false,
  87. modelsWrapper: {},
  88. selectedList: []
  89. }
  90. },
  91. computed: {
  92. formatTable() {
  93. if (!this.modelsWrapper.models) return {}
  94. if (!this.optionalMajors) return {}
  95. // 行
  96. const rows = this.modelsWrapper.models.map(item => {
  97. item.allowSelectTips = item.allowSelect ? '报名中' : '无法报名'
  98. item.subjects = this.optionalMajors.filter(college => {
  99. if (college.matchedGroupIds.indexOf(item.groupId) != -1) return college.majorCategoryName
  100. }).map(item => item.majorCategoryName)
  101. item.colleges = this.optionalMajors.filter(college => {
  102. if (college.matchedGroupIds.indexOf(item.groupId) != -1) return college.majorCategoryName
  103. }).map(item => {
  104. return {
  105. college: item.collegeName,
  106. major: item.majorCategoryName
  107. }
  108. })
  109. return item
  110. })
  111. // 列
  112. const statCols = {}
  113. this.modelsWrapper.statColumns.map((column, index) => {
  114. const prop = 'statistic_' + index
  115. statCols[prop] = { label: column.name }
  116. rows.forEach((row) => {
  117. const descriptors = column.groupDescriptors.find(desc => desc.groupId == row.groupId) ?
  118. column.groupDescriptors.find(desc => desc.groupId == row.groupId).descriptors : []
  119. console.log(descriptors)
  120. row[prop] = descriptors.length > 0 ? descriptors.length > 1 ? `${descriptors[0].value}/${descriptors[1].value}` : `${descriptors[0].value}` : ''
  121. })
  122. })
  123. const cols = {
  124. index: {
  125. type: 'index',
  126. label: '编号'
  127. },
  128. groupName: {
  129. label: '选科组合'
  130. },
  131. classCount: {
  132. label: '开设班级数'
  133. },
  134. personCount: {
  135. label: '人数设置'
  136. },
  137. ...statCols,
  138. rankInGroup: {
  139. label: '当前组合实时排名'
  140. },
  141. rankInGrade: {
  142. label: '选科全校排名'
  143. },
  144. allowSelectTips: {
  145. label: '报名状态'
  146. },
  147. temp: {
  148. label: '选择专业',
  149. width: '140',
  150. slot: 'temp'
  151. },
  152. subjects: {
  153. label: '已选专业',
  154. slot: 'subjects',
  155. width: '150'
  156. },
  157. colleges: {
  158. label: '院校',
  159. slot: 'colleges',
  160. width: '250'
  161. },
  162. signUp: {
  163. label: '操作',
  164. slot: 'signUp',
  165. width: '100',
  166. fixed: 'right'
  167. }
  168. }
  169. return {
  170. rows,
  171. cols
  172. }
  173. }
  174. },
  175. methods: {
  176. toAiAnalysis() {
  177. //
  178. const currentGeneration = 1
  179. // AI 分析 跳转
  180. this.$refs.aiDialog.open(this.formatTable,currentGeneration)
  181. },
  182. commit() {
  183. console.log(this.selectedList)
  184. const real = this.selectedList.filter(item => {
  185. return item.selected == true
  186. })
  187. if (real.length < this.preferenceCount) {
  188. this.$message.warning(`初录报名需要选择${this.preferenceCount}个志愿`)
  189. return
  190. }
  191. this.dialogVisible = true
  192. },
  193. toSelect(row) {
  194. const count = this.modelsWrapper.models.reduce((prev, cur) => {
  195. return prev += cur.selected ? 1 : 0
  196. }, 0)
  197. console.log(count)
  198. if (count >= this.preferenceCount) {
  199. this.$message.warning(`最多选择${this.preferenceCount}个志愿`)
  200. return
  201. }
  202. row.selected = true
  203. this.selectedList.push(row)
  204. this.$refs.drage.init(this.selectedList)
  205. },
  206. toUnSelect(row) {
  207. this.$confirm(`是否解除选科组合【${row.groupName}】`, '警告', {
  208. confirmButtonText: '确定',
  209. cancelButtonText: '取消',
  210. type: 'warning'
  211. }).then(() => {
  212. row.selected = false
  213. this.selectedList.splice(
  214. this.selectedList.indexOf(this.selectedList.find((selected) => {
  215. return selected.groupId === row.groupId
  216. }
  217. )
  218. ), 1)
  219. this.$refs.drage.init(this.selectedList)
  220. }).catch(() => {
  221. this.$message({
  222. type: 'info',
  223. message: '已取消'
  224. })
  225. })
  226. },
  227. toSelectSub(row) {
  228. // 打开选科弹窗
  229. const course0 = this.translateCourse0(row.groupId)
  230. const course1 = this.translateCourse1(row.groupId)
  231. this.$refs.chooseDialog.open(course0, course1)
  232. },
  233. init(list) {
  234. console.log(list)
  235. this.modelsWrapper = list
  236. },
  237. initOption(optionalMajors) {
  238. console.log(optionalMajors)
  239. this.optionalMajors = optionalMajors
  240. }
  241. }
  242. }
  243. </script>
  244. <style scoped>
  245. .cell .el-tag {
  246. margin-right: 5px;
  247. }
  248. </style>