report-table.vue 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  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" v-if="generation > 0">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 #rankInGroup="{label, key}">
  14. <div class="fx-column" >
  15. <span>{{ label }}</span>
  16. <el-popover
  17. placement="bottom"
  18. trigger="click">
  19. <span>组合成绩在填报组合的排名</span>
  20. <i slot="reference" class="pointer el-icon-question el-icon"></i>
  21. </el-popover>
  22. </div>
  23. </template>
  24. <template #rankInGrade="{label, key}">
  25. <div class="fx-column" >
  26. <span>{{ label }}</span>
  27. <el-popover
  28. placement="bottom"
  29. trigger="click"
  30. >
  31. <span>组合成绩在全校的排名</span>
  32. <i slot="reference" class="pointer el-icon-question el-icon"></i>
  33. </el-popover>
  34. </div>
  35. </template>
  36. <template #temp="{row}">
  37. <span class="btn-blue mr5" @click="toSelectSub(row)">选择</span>
  38. <span class="btn-green" @click="toReport">查看记录</span>
  39. <!-- <el-button>查看</el-button>-->
  40. </template>
  41. <template #signUp="{row}">
  42. <span class="f-red" v-if="!row.allowSelect">无法报名</span>
  43. <div v-else>
  44. <span v-if="generation > 0">可报名</span>
  45. <div v-else>
  46. <span class="f-red btn-red" v-if="row.selected" @click="toUnSelect(row)">取消报名</span>
  47. <span class="btn-green" v-else @click="toSelect(row)">报名</span>
  48. </div>
  49. </div>
  50. </template>
  51. <template #subjects="{row}">
  52. <el-row>
  53. <el-col :span="8" v-for="subject in row.subjects">
  54. <el-popover
  55. placement="top"
  56. popper-class="zero-padding-popover"
  57. trigger="hover">
  58. <div class="fx-column">
  59. <el-button plain type="text">{{ subject }}</el-button>
  60. </div>
  61. <el-tag type="success" slot="reference" class="mr10 mb10">{{ subject[0] }}</el-tag>
  62. </el-popover>
  63. </el-col>
  64. </el-row>
  65. </template>
  66. <template #colleges="{row}">
  67. <el-row>
  68. <el-col :span="12" v-for="college in row.colleges">
  69. <el-tag type="success" class="mb10">{{ college.major[0] }}</el-tag>
  70. :
  71. <span>{{ college.college }}</span>
  72. </el-col>
  73. </el-row>
  74. </template>
  75. </mx-table>
  76. <!-- 初录 多志愿拖拽 -->
  77. <div v-if="generation == 0">
  78. <p>您的选科志愿: <span v-for="(item,index) in selectedList">
  79. {{ item.groupName }}{{ index + 1 < selectedList.length ? '、' : '' }}</span>
  80. </p>
  81. <test-drage ref="drage" :sortList="selectedList"></test-drage>
  82. <el-button @click="commit" type="primary">提交</el-button>
  83. </div>
  84. <!-- 补录报名和二次补录报名 -->
  85. <div v-else >
  86. <div v-for="item in singleList" class="mb5 mt5">
  87. <el-button @click="commit" type="primary">{{`${item.groupName} : 报名`}}</el-button>
  88. </div>
  89. <div class="mb5 mt5">
  90. <el-button type="danger">不同意</el-button>
  91. </div>
  92. </div>
  93. <esign-dialog ref="esignDialog"></esign-dialog>
  94. <choose-subject-dialog ref="chooseDialog"></choose-subject-dialog>
  95. <select-subject-report-dialog ref="reportDialog" ></select-subject-report-dialog>
  96. <Ai-dialog ref="aiDialog" :prevPreferences="prevPreferences"></Ai-dialog>
  97. </el-card>
  98. </template>
  99. <script>
  100. import AiDialog from './ai-analysis-dialog'
  101. import MxSelectTranslate from '@/components/Cache/modules/mx-select-translate-mixin.js'
  102. import TestDrage from './test-drage'
  103. import ChooseSubjectDialog from './choose-subject-dialog'
  104. import SelectSubjectReportDialog from '@/views/system/user/profile/components/select-subject-report-dialog'
  105. import EsignDialog from '@/views/system/user/profile/components/esign-dialog'
  106. export default {
  107. props:{
  108. generation:{
  109. type: Number,
  110. default: 1 // 模拟报名所处状态, 0为初录
  111. },
  112. preferenceCount: {
  113. type: Number,
  114. default: 3 // 多志愿个数
  115. }
  116. },
  117. components: {
  118. SelectSubjectReportDialog,
  119. EsignDialog,
  120. TestDrage,
  121. ChooseSubjectDialog,
  122. AiDialog
  123. },
  124. mixins: [MxSelectTranslate],
  125. data() {
  126. return {
  127. prevPreferences:[1], // 选科前一轮报名的group
  128. optionalMajors: [],
  129. dialogVisible: false,
  130. modelsWrapper: {},
  131. selectedList: [],
  132. singleList: [] // 单志愿列表
  133. }
  134. },
  135. mounted() {
  136. // this.$refs.drage.init(this.selectedList)
  137. },
  138. computed: {
  139. formatTable() {
  140. if (!this.modelsWrapper.models) return {}
  141. if (!this.optionalMajors) return {}
  142. // 行
  143. const rows = this.modelsWrapper.models.map(item => {
  144. item.allowSelectTips = item.allowSelect ? '报名中' : '无法报名'
  145. item.subjects = this.optionalMajors.filter(college => {
  146. if (college.matchedGroupIds.indexOf(item.groupId) != -1) return college.majorCategoryName
  147. }).map(item => item.majorCategoryName)
  148. item.colleges = this.optionalMajors.filter(college => {
  149. if (college.matchedGroupIds.indexOf(item.groupId) != -1) return college.majorCategoryName
  150. }).map(item => {
  151. return {
  152. college: item.collegeName,
  153. major: item.majorCategoryName
  154. }
  155. })
  156. return item
  157. })
  158. // 列
  159. const statCols = {}
  160. this.modelsWrapper.statColumns.map((column, index) => {
  161. const prop = 'statistic_' + index
  162. statCols[prop] = { label: column.name }
  163. rows.forEach((row) => {
  164. const descriptors = column.groupDescriptors.find(desc => desc.groupId == row.groupId) ?
  165. column.groupDescriptors.find(desc => desc.groupId == row.groupId).descriptors : []
  166. row[prop] = descriptors.length > 0 ? descriptors.length > 1 ? `${descriptors[0].value}/${descriptors[1].value}` : `${descriptors[0].value}` : ''
  167. })
  168. })
  169. const cols = {
  170. index: {
  171. type: 'index',
  172. label: '编号'
  173. },
  174. groupName: {
  175. label: '选科组合'
  176. },
  177. classCount: {
  178. label: '开设班级数'
  179. },
  180. personCount: {
  181. label: '人数设置'
  182. },
  183. ...statCols,
  184. rankInGroup: {
  185. label: '当前组合实时排名',
  186. slotHeader: 'rankInGroup'
  187. },
  188. rankInGrade: {
  189. label: '选科全校排名',
  190. slotHeader: 'rankInGrade'
  191. },
  192. allowSelectTips: {
  193. label: '报名状态'
  194. },
  195. temp: {
  196. label: '选择专业',
  197. width: '140',
  198. slot: 'temp'
  199. },
  200. subjects: {
  201. label: '已选专业',
  202. slot: 'subjects',
  203. width: '150'
  204. },
  205. colleges: {
  206. label: '院校',
  207. slot: 'colleges',
  208. width: '250'
  209. },
  210. signUp: {
  211. label: '操作',
  212. slot: 'signUp',
  213. width: '100',
  214. fixed: 'right'
  215. }
  216. }
  217. return {
  218. rows,
  219. cols
  220. }
  221. }
  222. },
  223. methods: {
  224. toReport() {
  225. this.$refs.reportDialog.open()
  226. },
  227. toAiAnalysis() {
  228. //
  229. const currentGeneration = 1
  230. // AI 分析 跳转
  231. this.$refs.aiDialog.open(this.formatTable,currentGeneration)
  232. },
  233. commit() {
  234. console.log(this.selectedList)
  235. if (this.generation == 0) {
  236. const real = this.selectedList.filter(item => {
  237. return item.selected == true
  238. })
  239. if (real.length < this.preferenceCount) {
  240. this.$message.warning(`初录报名需要选择${this.preferenceCount}个志愿`)
  241. return
  242. }
  243. }
  244. this.$refs.esignDialog.open()
  245. },
  246. toSelect(row) {
  247. const count = this.modelsWrapper.models.reduce((prev,cur) => {
  248. return prev += cur.selected ? 1 : 0
  249. })
  250. if (count >= this.preferenceCount) {
  251. this.$message.warning(`最多选择${this.preferenceCount}个志愿`)
  252. return
  253. }
  254. row.selected = true
  255. this.selectedList.push(row)
  256. },
  257. toUnSelect(row) {
  258. this.$confirm(`是否解除选科组合【${row.groupName}】`, '警告', {
  259. confirmButtonText: '确定',
  260. cancelButtonText: '取消',
  261. type: 'warning'
  262. }).then(() => {
  263. row.selected = false
  264. const start = this.selectedList.indexOf(this.selectedList.find((selected)=> {
  265. return selected.groupId == row.groupId
  266. }))
  267. console.log(start)
  268. this.selectedList.splice(start,1)
  269. }).catch(() => {
  270. this.$message({
  271. type: 'info',
  272. message: '已取消'
  273. })
  274. })
  275. },
  276. toSelectSub(row) {
  277. // 打开选科弹窗
  278. const course0 = this.translateCourse0(row.groupId)
  279. const course1 = this.translateCourse1(row.groupId)
  280. this.$refs.chooseDialog.open(course0, course1)
  281. },
  282. init(list) {
  283. console.log(list)
  284. this.modelsWrapper = list
  285. this.selectedList = this.modelsWrapper.models.filter(item => {
  286. return item.selected
  287. })
  288. // generation > 0 时 是单志愿报名
  289. this.singleList = this.modelsWrapper.models.filter(item => {
  290. return item.allowSelect
  291. })
  292. this.$nextTick(()=>this.$refs.drage.init(this.selectedList))
  293. },
  294. initOption(optionalMajors) {
  295. console.log(optionalMajors)
  296. this.optionalMajors = optionalMajors
  297. }
  298. }
  299. }
  300. </script>
  301. <style scoped>
  302. .cell .el-tag {
  303. margin-right: 5px;
  304. }
  305. </style>