123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- import {computed} from 'vue';
- import {createEventHook, injectLocal, provideLocal, toValue} from "@vueuse/core";
- import {sleep, toast} from "@/uni_modules/uv-ui-tools/libs/function";
- import MxConst from "@/common/mxConst";
- import {empty} from "@/uni_modules/uv-ui-tools/libs/function/test";
- import {saveZhiyuan} from "@/api/webApi/volunteer";
- const key = Symbol('VOLUNTARY_ASSISTANT')
- export const useProvideVoluntaryAssistant = function (stepSvc, dataSvc, formSvc, cartSvc, highlightSvc, scrollHeight) {
- const {title, currentStep} = stepSvc
- const {id, name, locking, selectedList, resetCart} = cartSvc
- const {voluntaryData} = dataSvc
- const {batch, model, mode, batchesList} = formSvc
- const {formedMajors, resetHighlight} = highlightSvc
- const beforeBack = createEventHook()
- const afterBack = createEventHook()
- const beforeForward = createEventHook()
- const afterForward = createEventHook()
- const complete = createEventHook()
- const handleBack = async function () {
- if (currentStep.value == 0) return
- await beforeBack.trigger()
- currentStep.value -= 1
- await afterBack.trigger()
- }
- const handleForward = async function () {
- if (currentStep.value == 2) return
- await beforeForward.trigger()
- currentStep.value += 1
- await afterForward.trigger()
- }
- const navBinding = computed(() => ({
- title: title.value,
- subTitle: name.value,
- leftIcon: currentStep.value > 0 ? 'arrow-left' : '',
- onLeftClick: handleBack
- }))
- const voluntaryDataCalculate = computed(() => {
- // NOTE: will override by history voluntary data in edit mode
- const param = toValue(voluntaryData) || {}
- const {batch: batchId} = toValue(batch)
- const defaultLimit = {groups: 9999, profession: 9999}
- // noinspection JSUnresolvedVariable
- const firedLimit = param.batches?.find(i => i.batch == batchId) || defaultLimit
- return {
- ...param,
- firedLimit
- }
- })
- const calculateScoreBatchRange = computed(() => {
- // for re-use
- const vData = toValue(voluntaryData)
- const vBatch = toValue(batch)
- if (empty(vData) || vBatch.batch) return [0, 0]
- const maxScore = vData.maxScore
- const minBatch = vBatch.score2 || vBatch.score1
- let maxBatch = maxScore
- const batchIndex = batchesList.value.indexOf(this.batch)
- if (batchIndex > 0) {
- const upBatch = batchesList.value[batchIndex - 1]
- maxBatch = upBatch.score2 || upBatch.score1
- }
- return [minBatch, Math.min(maxScore, maxBatch)]
- })
- const save = async (isMockHeader) => {
- if (toValue(id) && !toValue(name)) {
- toast('请设置志愿表名称')
- return Promise.reject(false)
- }
- const wishes = selectedList.value.map(item => ({
- uniqueCode: item.uniqueCode,
- universityId: item.university.id,
- collegeCode: item.recruitPlan.collegeCode,
- code: item.university.code,
- jCode: item.jCode,
- name: item.university.name,
- pickType: item.pickType,
- enrollRatio: item.enrollRatio,
- enrollRatioText: item.enrollRatioText,
- ranking: item.university.ranking,
- rankingOfEdu: item.university.rankingOfEdu,
- seat: item.history?.seat,
- marjors: item.majors
- .filter(major => major.selected)
- .sort(MxConst.recommendMajorSortFn)
- .map(major => ({
- id: major.id,
- code: major.marjorBelongs,
- name: major.marjorName,
- pickType: item.pickType,
- submitMajorId: major.history?.id,
- enrollRatio: major.enrollRatio,
- enrollRatioText: major.enrollRatioText,
- enrollFluctuate: major.enrollFluctuate
- }))
- }))
- if (wishes.length < 1) {
- // NOTE: 职高对口院校较少,降低填报限制
- toast('至少选择1个志愿组')
- return Promise.reject(false)
- }
- locking.value = true
- uni.showLoading()
- const vBatch = toValue(batch)
- const vModel = toValue(model)
- const vMode = toValue(mode)
- const data = {
- batch: vBatch.batch,
- detail: {
- batch: {
- batch: vBatch.batch,
- name: vBatch.name,
- score1: vBatch.score1 || '',
- score2: vBatch.score2 || '',
- scoreBatchLimit: calculateScoreBatchRange.value[1],
- recommand: true,
- scores: [],
- wishes: wishes,
- sort: voluntaryDataCalculate.value.sort,
- paramBatches: [voluntaryDataCalculate.value.firedLimit],
- highlightMajorIds: Object.keys(formedMajors.value)
- },
- mode: vMode,
- score: vModel.score,
- seatInput: vModel.seatInput,
- year: vBatch.year,
- isMock: isMockHeader
- },
- id: id.value,
- name: name.value
- }
- let res = null
- try {
- res = await saveZhiyuan(data)
- toast('保存成功,即将跳转3')
- await sleep(1000)
- toast('保存成功,即将跳转2')
- await sleep(1000)
- toast('保存成功,即将跳转1')
- await sleep(500)
- await complete.trigger(res.data)
- } finally {
- locking.value = false
- uni.hideLoading()
- }
- }
- const resetAll = () => {
- resetCart()
- resetHighlight()
- }
- const options = {
- navBinding,
- handleBack,
- handleForward,
- voluntaryDataCalculate,
- save,
- resetAll,
- scrollHeight,
- onBeforeBack: beforeBack.on,
- onAfterBack: afterBack.on,
- onBeforeForward: beforeForward.on,
- onAfterForward: afterForward.on,
- onComplete: complete.on
- }
- provideLocal(key, options)
- return options
- }
- export const useInjectVoluntaryAssistant = function (useDefaultVal) {
- return injectLocal(key, useDefaultVal ? {voluntaryDataCalculate: {}} : undefined)
- }
|