report-table.vue 7.3 KB

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