report-table.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. <template>
  2. <div>
  3. <div class="mb10 fx-row fx-end-base">
  4. <div>
  5. <el-button type="primary" @click="toAiAnalysis" v-if="generation > 0">AI分析</el-button>
  6. <el-button>选科历史记录</el-button>
  7. </div>
  8. </div>
  9. <mx-table :propDefines="formatCols" :rows="formatRows">
  10. <template #temp="{row}">
  11. <span class="btn-blue mr5" @click="toSelectSub(row)">选择</span>
  12. <span class="btn-green" @click="toReport">查看记录</span>
  13. <!-- <el-button>查看</el-button>-->
  14. </template>
  15. <template #signUp="{row}">
  16. <span class="f-red" v-if="!row.allowSelect">无法报名</span>
  17. <div v-else>
  18. <span v-if="generation > 0">可报名</span>
  19. <div v-else>
  20. <span class="f-red btn-red" v-if="row.selected" @click="toUnSelect(row)">取消报名</span>
  21. <span class="btn-green" v-else @click="toSelect(row)">报名</span>
  22. </div>
  23. </div>
  24. </template>
  25. <template #subjects="{row}">
  26. <el-row>
  27. <el-col :span="8" v-for="subject in row.subjects">
  28. <el-popover
  29. placement="top"
  30. popper-class="zero-padding-popover"
  31. trigger="hover"
  32. >
  33. <div class="fx-column">
  34. <el-button plain type="text">{{ subject }}</el-button>
  35. </div>
  36. <el-tag type="success" slot="reference" class="mr10 mb10">{{ subject[0] }}</el-tag>
  37. </el-popover>
  38. </el-col>
  39. </el-row>
  40. </template>
  41. <template #colleges="{row}">
  42. <el-row>
  43. <el-col :span="12" v-for="college in row.colleges">
  44. <el-tag type="success" class="mb10">{{ college.major[0] }}</el-tag>
  45. :
  46. <span>{{ college.college }}</span>
  47. </el-col>
  48. </el-row>
  49. </template>
  50. </mx-table>
  51. <!-- 初录 多志愿拖拽 -->
  52. <div v-if="generation == 0">
  53. <p>您的选科志愿: <span v-for="(item,index) in selectedList">
  54. {{ item.groupName }}{{ index + 1 < selectedList.length ? '、' : '' }}</span>
  55. </p>
  56. <test-drage ref="drage" :sortList="selectedList"></test-drage>
  57. <el-button @click="commit" type="primary">提交</el-button>
  58. </div>
  59. <!-- 补录报名和二次补录报名 -->
  60. <div v-else>
  61. <div v-for="item in singleList" class="mb5 mt5">
  62. <el-button @click="commit" type="primary">{{ `${item.groupName} : 报名` }}</el-button>
  63. </div>
  64. <div class="mb5 mt5">
  65. <el-popover
  66. placement="right"
  67. width="300"
  68. v-model="popoShow"
  69. trigger="click"
  70. >
  71. <div>
  72. <el-input
  73. type="textarea"
  74. :rows="4"
  75. placeholder="请输入原因"
  76. v-model="regInfo"
  77. >
  78. </el-input>
  79. <p class="fx-row jc-between mt10">
  80. <el-button type="primary" size="mini" @click="popoShow = false">取消</el-button>
  81. <el-button type="danger" size="mini">提交</el-button>
  82. </p>
  83. </div>
  84. <el-button slot="reference" type="danger">不同意</el-button>
  85. </el-popover>
  86. </div>
  87. {{ resolveDynamicTable }}
  88. </div>
  89. <esign-dialog ref="esignDialog"></esign-dialog>
  90. <choose-subject-dialog ref="chooseDialog"></choose-subject-dialog>
  91. <select-subject-report-dialog ref="reportDialog"></select-subject-report-dialog>
  92. <!-- <Ai-dialog ref="aiDialog" :prevPreferences="prevPreferences"></Ai-dialog>-->
  93. </div>
  94. </template>
  95. <script>
  96. import AiDialog from './ai-analysis-dialog'
  97. import MxSelectTranslate from '@/components/Cache/modules/mx-select-translate-mixin.js'
  98. import TestDrage from './test-drage'
  99. import ChooseSubjectDialog from './choose-subject-dialog'
  100. import SelectSubjectReportDialog from '@/views/system/user/profile/components/select-subject-report-dialog'
  101. import EsignDialog from '@/views/system/user/profile/components/esign-dialog'
  102. import ReportStep from './report-step'
  103. import PrimaryResolverMixins
  104. from '@/views/system/user/profile/components/round-select-resolvers/primary-resolver-mixins'
  105. import PrimaryDMResolverMixins
  106. from '@/views/system/user/profile/components/round-select-resolvers/primaryDM-resolver-mixins'
  107. import BackTrackingResolverMixins
  108. from '@/views/system/user/profile/components/round-select-resolvers/backTracking-resolver-mixins'
  109. import BackTrackingDMResolverMixins
  110. from '@/views/system/user/profile/components/round-select-resolvers/backTrackingDM-resolver-mixins'
  111. import FinalAdjustResolverMixins
  112. from '@/views/system/user/profile/components/round-select-resolvers/finalAdjust-resolver-mixins'
  113. import FinalAdjustDMResolverMixins
  114. from '@/views/system/user/profile/components/round-select-resolvers/finalAdjustDM-resolver-mixins'
  115. import ForceAdjustResolverMixins
  116. from '@/views/system/user/profile/components/round-select-resolvers/forceAdjust-resolver-mixins'
  117. export default {
  118. props: {
  119. generation: Object
  120. },
  121. components: {
  122. SelectSubjectReportDialog,
  123. ReportStep,
  124. EsignDialog,
  125. TestDrage,
  126. ChooseSubjectDialog,
  127. AiDialog
  128. },
  129. mixins: [
  130. MxSelectTranslate,
  131. PrimaryResolverMixins,
  132. PrimaryDMResolverMixins,
  133. BackTrackingResolverMixins,
  134. BackTrackingDMResolverMixins,
  135. FinalAdjustDMResolverMixins,
  136. FinalAdjustResolverMixins,
  137. ForceAdjustResolverMixins
  138. ],
  139. data() {
  140. return {
  141. popoShow: false,
  142. activeStep: '',
  143. regInfo: '',
  144. prevPreferences: [1], // 选科前一轮报名的group
  145. optionalMajors: [],
  146. dialogVisible: false,
  147. modelsWrapper: {},
  148. selectedList: [],
  149. singleList: [], // 单志愿列表
  150. formatRows: []
  151. }
  152. },
  153. mounted() {
  154. // this.$refs.drage.init(this.selectedList)
  155. },
  156. computed: {
  157. resolveTablePrefix() {
  158. return {
  159. index: {
  160. type: 'index',
  161. label: '编号'
  162. },
  163. groupName: {
  164. label: '选科组合'
  165. },
  166. scoreSumGroup:{
  167. label:'组合成绩'
  168. },
  169. classCount: {
  170. label: '开设班级数'
  171. },
  172. personCount: {
  173. label: '人数设置'
  174. }
  175. }
  176. },
  177. resolveTableSuffix() {
  178. return {
  179. allowSelectTips: {
  180. label: '报名状态'
  181. },
  182. temp: {
  183. label: '选择专业',
  184. width: '140',
  185. slot: 'temp'
  186. },
  187. subjects: {
  188. label: '自选专业',
  189. slot: 'subjects',
  190. width: '150'
  191. },
  192. colleges: {
  193. label: '院校',
  194. slot: 'colleges',
  195. width: '250'
  196. },
  197. signUp: {
  198. label: '操作',
  199. slot: 'signUp',
  200. width: '100',
  201. fixed: 'right'
  202. }
  203. }
  204. },
  205. resolveDynamicTable() {
  206. const options = this.generation.options
  207. if (!options || !this.generation.active) return {}
  208. const optValues = Object.values(options)
  209. const dynamicColumns = {}
  210. for (let gen = options.primary.value; gen <= this.generation.active ; gen++) {
  211. const opt = optValues.find(opt => opt.value == gen)
  212. const resolverKey = opt.key + 'Resolver'
  213. const resolver = this[resolverKey]
  214. if (typeof resolver === 'function') {
  215. const genColumns = resolver(gen)
  216. Object.assign(dynamicColumns, genColumns)
  217. }
  218. }
  219. console.log('resolveDynamicTable',dynamicColumns)
  220. return dynamicColumns
  221. },
  222. formatRows() {
  223. if(!this.selectObj?.groupIds) return []
  224. return this.selectObj.groupIds.split(',').map(item => {
  225. groupId: item
  226. })
  227. },
  228. formatCols() {
  229. return {
  230. ...this.resolveTablePrefix,
  231. ...this.resolveDynamicTable,
  232. ...this.resolveTableSuffix
  233. }
  234. }
  235. // formatTable() {
  236. // // if (!this.models.length) return {}
  237. // // if (!this.optionalMajors) return {}
  238. // return {}
  239. // // 初始化 rows cols
  240. // // let rows = this.models[0].models.map(item => {
  241. // // item.allowSelectTips = item.allowSelect ? '报名中' : '无法报名'
  242. // // item.subjects = this.optionalMajors.filter(college => {
  243. // // if (college.matchedGroupIds.indexOf(item.groupId) != -1) return college.majorCategoryName
  244. // // }).map(item => item.majorCategoryName)
  245. // // item.colleges = this.optionalMajors.filter(college => {
  246. // // if (college.matchedGroupIds.indexOf(item.groupId) != -1) return college.majorCategoryName
  247. // // }).map(item => {
  248. // // return {
  249. // // college: item.collegeName,
  250. // // major: item.majorCategoryName
  251. // // }
  252. // // })
  253. // // return item
  254. // // })
  255. // // let formatCols = this.formatCols({})
  256. // // let stateCol = {}
  257. // // // 判断当前步骤
  258. // // const step = this.models.length
  259. // // // step = 1 reutrn cols 选科人数比 组合实时排名 学校实时排名
  260. // // console.log(this.activeOpt)
  261. // // switch (this.activeOpt) {
  262. // // // 初录报名
  263. // // case config.electiveGenerationOptions.primary:
  264. // // console.log(2222222222222)
  265. // // // cols
  266. // // stateCol = {
  267. // // applyCount: {
  268. // // label: '选科人数比'
  269. // // },
  270. // // rankInGroup: {
  271. // // label: '当前组合实时排名',
  272. // // },
  273. // // rankInGrade: {
  274. // // label: '选科全校排名',
  275. // // }
  276. // // }
  277. // // formatCols = this.formatCols(stateCol)
  278. // // // rows
  279. // // console.log(rows)
  280. // // rows = rows.map(item => {
  281. // // item.applyCount = `${item.actualCount}/${item.personCount}`
  282. // // return item
  283. // // })
  284. // // break
  285. // // // 初录结果
  286. // // case config.electiveGenerationOptions.primaryDM:
  287. // // stateCol = {
  288. // // applyCount: {
  289. // // label: '选科人数比'
  290. // // },
  291. // // groupIndicator: {
  292. // // label: '超/缺'
  293. // // },
  294. // // rankInGroup: {
  295. // // label: '当前组合实时排名',
  296. // // },
  297. // // rankInGrade: {
  298. // // label: '选科全校排名',
  299. // // }
  300. // // }
  301. // // rows = rows.map(item => {
  302. // // item.applyCount = `${item.actualCount}/${item.personCount}`
  303. // // item.groupIndicator = item.groupIndicator
  304. // // return item
  305. // // })
  306. // // formatCols = this.formatCols(stateCol)
  307. // // }
  308. // //
  309. // // return {
  310. // // rows,
  311. // // formatCols
  312. // // }
  313. // }
  314. },
  315. methods: {
  316. getModelsByStep() {
  317. return this.models.findIndex()
  318. },
  319. toReport() {
  320. this.$refs.reportDialog.open()
  321. },
  322. toAiAnalysis() {
  323. //
  324. const currentGeneration = 1
  325. // AI 分析 跳转
  326. this.$refs.aiDialog.open(this.formatTable, currentGeneration)
  327. },
  328. commit() {
  329. console.log(this.selectedList)
  330. if (this.generation == 0) {
  331. const real = this.selectedList.filter(item => {
  332. return item.selected == true
  333. })
  334. if (real.length < this.preferenceCount) {
  335. this.$message.warning(`初录报名需要选择${this.preferenceCount}个志愿`)
  336. return
  337. }
  338. }
  339. this.$refs.esignDialog.open()
  340. },
  341. toSelect(row) {
  342. const count = this.modelsWrapper.models.reduce((prev, cur) => {
  343. return prev += cur.selected ? 1 : 0
  344. })
  345. if (count >= this.preferenceCount) {
  346. this.$message.warning(`最多选择${this.preferenceCount}个志愿`)
  347. return
  348. }
  349. row.selected = true
  350. this.selectedList.push(row)
  351. },
  352. toUnSelect(row) {
  353. this.$confirm(`是否解除选科组合【${row.groupName}】`, '警告', {
  354. confirmButtonText: '确定',
  355. cancelButtonText: '取消',
  356. type: 'warning'
  357. }).then(() => {
  358. row.selected = false
  359. const start = this.selectedList.indexOf(this.selectedList.find((selected) => {
  360. return selected.groupId == row.groupId
  361. }))
  362. console.log(start)
  363. this.selectedList.splice(start, 1)
  364. }).catch(() => {
  365. this.$message({
  366. type: 'info',
  367. message: '已取消'
  368. })
  369. })
  370. },
  371. toSelectSub(row) {
  372. // 打开选科弹窗
  373. const course0 = this.translateCourse0(row.groupId)
  374. const course1 = this.translateCourse1(row.groupId)
  375. this.$refs.chooseDialog.open(course0, course1)
  376. },
  377. initOption(optionalMajors) {
  378. console.log(optionalMajors)
  379. this.optionalMajors = optionalMajors
  380. }
  381. }
  382. }
  383. </script>
  384. <style scoped>
  385. .cell .el-tag {
  386. margin-right: 5px;
  387. }
  388. </style>