Quellcode durchsuchen

voluntary calc - api structure

abpcoder vor 5 Tagen
Ursprung
Commit
f48cbd5dab

+ 52 - 113
src/pagesOther/pages/skill/index/index.vue

@@ -16,12 +16,12 @@
             <view class="mt-60 mx-30 bg-white rounded-xl p-35">
                 <view class="flex justify-between items-center">
                     <view class="text-lg text-fore-title">报考院校专业</view>
-                    <view class="text-base text-fore-placeholder flex items-center">
-                        <text>更多</text>
+                    <view class="text-base text-fore-placeholder flex items-center" @click="handleSelect">
+                        <text>请选择</text>
                         <uv-icon name="arrow-right" color="info"/>
                     </view>
                 </view>
-                <ie-empty v-if="!data.rules?.length" :image="emptyImg" text="请选择你的报考院校专业~"/>
+                <ie-empty v-if="!rules.length" :image="emptyImg" text="请选择你的报考院校专业~"/>
                 <voluntary-form v-else ref="form" disable-simulate/>
             </view>
         </view>
@@ -35,130 +35,69 @@
 
 <script setup lang="ts">
 import VoluntaryForm from "@/pagesOther/pages/voluntary/index/components/voluntary-form.vue";
-import {SelectedCollegeMajorWithRules, VoluntaryDto, VoluntaryModel, VoluntaryResult} from "@/types/voluntary";
 import {useTransferPage} from "@/hooks/useTransferPage";
 import {routes} from "@/common/routes";
-import {VOLUNTARY_FORM, VOLUNTARY_MODEL} from "@/types/injectionSymbols";
+import {VOLUNTARY_TARGET, VOLUNTARY_RULES, VOLUNTARY_MODEL} from "@/types/injectionSymbols";
+import {EnrollRule, SelectedUniversityMajor, VoluntaryDto, VoluntaryModel, VoluntaryResult} from "@/types/voluntary";
 import config from "@/config";
+import {UniversityPickerPageOptions} from "@/types/transfer";
+import {getSkillRules, postSkillRules} from "@/api/modules/voluntary";
 
 const emptyImg = computed(() => config.ossUrl + '/volunteer/voluntary/index/empty_data.png')
 
-const form = ref<InstanceType<typeof VoluntaryForm> | null>(null)
-const data = ref<SelectedCollegeMajorWithRules>({} as SelectedCollegeMajorWithRules)
+const form = ref<InstanceType<typeof VoluntaryForm>>()
+const target = ref<SelectedUniversityMajor>({} as SelectedUniversityMajor)
+const rules = ref<EnrollRule[]>([])
 const model = ref<VoluntaryModel>({})
-const {transferTo} = useTransferPage<any, VoluntaryDto>()
+const {transferTo} = useTransferPage()
+
+const handleSelect = async () => {
+    const option: UniversityPickerPageOptions = {
+        title: '选择你的报考院校专业',
+        fromVoluntary: true,
+        selectedUniversityId: target.value?.universityId,
+        selectedMajorId: target.value?.majorId
+    }
+    const picked = await transferTo(routes.targetPicker, {data: option})
+    if (!picked) return
+    target.value = picked as SelectedUniversityMajor
+    uni.$ie.showLoading()
+    try {
+        // reset
+        model.value = {}
+        rules.value = []
+        // request render rules
+        const res = await getSkillRules(target.value)
+        rules.value = res.data
+        // init model
+        rules.value.forEach((r) => {
+            r.details.forEach((d) => {
+                if (d.options?.length) {
+                    model.value[d.fieldName] = d.defaultValue ? d.defaultValue : ''
+                    model.value[d.fieldName + 'Total'] = d.options ? d.options[0] : null
+                }
+            })
+        })
+    } catch (e) {
+        console.log('getRenderRules ex', e, target.value)
+        target.value = {} as SelectedUniversityMajor // clear for re-pick
+    } finally {
+        uni.$ie.hideLoading()
+    }
+}
 
 const handleSubmit = async () => {
+    if (!target.value.universityId||!target.value.majorId) return uni.$ie.showToast('请选择院校专业')
+    if (!rules.value.length) return uni.$ie.showToast('由于官方未公布历年录取分数或计划变更,暂时无法计算技能分')
     await form.value?.validate()
     // make request
-    await nextTick()
-    const result: VoluntaryResult = {
-        "universityCode": "12302",
-        "majorCode": "690390",
-        "majorEnrollCode": "68508",
-        "majorGroup": "专业B组",
-        "majorName": "集成电路技术",
-        "majorDirection": "",
-        "enumPickType": "Danger",
-        "enrollRate": 53,
-        "enrollRateText": "风险极高",
-        "tips": null,
-        "histories": [
-            {
-                "year": 2025,
-                "score": "489.0",
-                "plan": 15,
-                "enroll": 15,
-                "diff": -12,
-                "ruleContent": '语数外180(语100*0.6+数100*0.6+外100*0.6)+职业技能420(技能展示300*1.4)',
-                "application": 3.1,
-                "admission": 1
-            },
-            {
-                "year": 2024,
-                "score": "",
-                "plan": null,
-                "enroll": 20
-            },
-            {
-                "year": 2023,
-                "score": "504.0",
-                "plan": null,
-                "enroll": 32
-            }
-        ],
-        "skill": {
-            year: 2025,
-            cultureScore: 230,
-            cultureRule: "语数外",
-            enrollScore: 489,
-            skillScore: 259, // 反向测技能分
-            diff: -23 // 负数表示低于skillScore,正数高于
-        }
-    }
-    const bigData: VoluntaryDto = {data: data.value, model: model.value, result}
+    const {data: result} = await postSkillRules(target.value, model.value)
+    const bigData: VoluntaryDto = {target: target.value, rules: rules.value, model: model.value, result}
     transferTo(routes.skillResult, {bigData})
 }
 
-onMounted(async () => {
-    // api get rules
-    await nextTick()
-    data.value = {
-        // code: "20949",
-        majorAncestors: "交通运输大类>铁道运输类",
-        majorId: "68526",
-        majorName: "铁道交通运营管理",
-        majorGroup: '专业组一',
-        // notice: "",
-        universityId: "20949",
-        universityLogo: "https://mingxuejingbang.oss-cn-beijing.aliyuncs.com/ie/universityLog/23b6da550a584ea6b60886c6ae97b610.jpg",
-        universityName: "湖南铁道职业技术学院",
-        rules: [{
-            category: '文化素质',
-            content: '语(100分)+数(100分)+外(100分)',
-            details: [{
-                enumRuleCategory: 'Enroll',
-                enumInputType: 'Score',
-                label: '语文',
-                options: ["100"],
-                fieldName: '语文',
-                required: true,
-                defaultValue: 80
-            }, {
-                enumRuleCategory: 'Enroll',
-                enumInputType: 'Score',
-                label: '数学',
-                options: ["100"],
-                fieldName: '数学',
-                required: true,
-                defaultValue: 84
-            }, {
-                enumRuleCategory: 'Enroll',
-                enumInputType: 'Score',
-                label: '外语',
-                options: ["100"],
-                fieldName: '外语',
-                required: true,
-                defaultValue: 88
-            }]
-        }, {
-            category: '职业技能',
-            content: '机试(200分)+ 技能展示(100分)',
-            details: []
-        }]
-    }
-    // init model
-    data.value.rules.forEach((r) => {
-        r.details.forEach((d) => {
-            if (d.options?.length) {
-                model.value[d.fieldName] = d.defaultValue ? d.defaultValue : ''
-                model.value[d.fieldName + 'Total'] = d.options ? d.options[0] : null
-            }
-        })
-    })
-})
-
-provide(VOLUNTARY_FORM, data)
+provide(VOLUNTARY_TARGET, target)
+provide(VOLUNTARY_RULES, rules)
 provide(VOLUNTARY_MODEL, model)
 
 // 为了让子组件触发页面滚动

+ 2 - 0
src/pagesOther/pages/voluntary/index/index.vue

@@ -79,6 +79,8 @@ const handleSelect = async () => {
 }
 
 const handleSubmit = async () => {
+    if (!target.value.universityId||!target.value.majorId) return uni.$ie.showToast('请选择院校专业')
+    if (!rules.value.length) return uni.$ie.showToast('由于官方未公布历年录取分数或计划变更,暂时无法计算录取概率')
     await form.value?.validate()
     // make request
     const {data: result} = await postRenderRules(target.value, model.value)

+ 6 - 134
src/pagesOther/pages/voluntary/list/list.vue

@@ -19,146 +19,18 @@
 <script setup lang="ts">
 import {VoluntaryRecord} from "@/types/voluntary";
 import VoluntaryItem from "@/pagesOther/pages/voluntary/list/components/voluntary-item.vue";
-import {sleep} from "@/uni_modules/uv-ui-tools/libs/function";
 import {ApiResponseList} from "@/types";
 import {VOLUNTARY_SORTING} from "@/types/injectionSymbols";
+import {getVoluntaryList} from "@/api/modules/voluntary";
 
-const list = ref<VoluntaryRecord>([])
+const list = ref<VoluntaryRecord[]>([])
 const paging = ref<ZPagingInstance>()
 const isSorting = ref<boolean>(false)
 
-const handleQuery = async () => {
-    await sleep()
-    const res: ApiResponseList<VoluntaryRecord> = {
-        code: 200,
-        msg: '',
-        total: 2,
-        rows: [{
-            id: 1,
-            universityId: "20949",
-            universityLogo: "https://mingxuejingbang.oss-cn-beijing.aliyuncs.com/ie/universityLog/23b6da550a584ea6b60886c6ae97b610.jpg",
-            universityName: "湖南铁道职业技术学院",
-            majors: [{
-                majorAncestors: "交通运输大类>铁道运输类",
-                majorId: "68526",
-                majorName: "铁道交通运营管理1",
-                majorGroup: '专业组一',
-            }, {
-                majorAncestors: "交通运输大类>铁道运输类",
-                majorId: "68527",
-                majorName: "铁道交通运营管理2",
-                majorGroup: '专业组一',
-            }, {
-                majorAncestors: "交通运输大类>铁道运输类",
-                majorId: "68528",
-                majorName: "铁道交通运营管理3",
-                majorGroup: '专业组一',
-            }, {
-                majorAncestors: "交通运输大类>铁道运输类",
-                majorId: "68529",
-                majorName: "铁道交通运营管理4",
-                majorGroup: '专业组一',
-            }, {
-                majorAncestors: "交通运输大类>铁道运输类",
-                majorId: "68530",
-                majorName: "铁道交通运营管理5",
-                majorGroup: '专业组一',
-            }, {
-                majorAncestors: "交通运输大类>铁道运输类",
-                majorId: "68531",
-                majorName: "铁道交通运营管理6",
-                majorGroup: '专业组一',
-            }, {
-                majorAncestors: "交通运输大类>铁道运输类",
-                majorId: "68532",
-                majorName: "铁道交通运营管理7",
-                majorGroup: '专业组一',
-            }]
-        }, {
-            id: 2,
-            universityId: "20949",
-            universityLogo: "https://mingxuejingbang.oss-cn-beijing.aliyuncs.com/ie/universityLog/23b6da550a584ea6b60886c6ae97b610.jpg",
-            universityName: "湖南铁道职业技术学院",
-            majors: [{
-                majorAncestors: "交通运输大类>铁道运输类",
-                majorId: "68526",
-                majorName: "铁道交通运营管理1",
-                majorGroup: '专业组一',
-            }, {
-                majorAncestors: "交通运输大类>铁道运输类",
-                majorId: "68527",
-                majorName: "铁道交通运营管理2",
-                majorGroup: '专业组一',
-            }, {
-                majorAncestors: "交通运输大类>铁道运输类",
-                majorId: "68528",
-                majorName: "铁道交通运营管理3",
-                majorGroup: '专业组一',
-            }, {
-                majorAncestors: "交通运输大类>铁道运输类",
-                majorId: "68529",
-                majorName: "铁道交通运营管理4",
-                majorGroup: '专业组一',
-            }, {
-                majorAncestors: "交通运输大类>铁道运输类",
-                majorId: "68530",
-                majorName: "铁道交通运营管理5",
-                majorGroup: '专业组一',
-            }, {
-                majorAncestors: "交通运输大类>铁道运输类",
-                majorId: "68531",
-                majorName: "铁道交通运营管理6",
-                majorGroup: '专业组一',
-            }, {
-                majorAncestors: "交通运输大类>铁道运输类",
-                majorId: "68532",
-                majorName: "铁道交通运营管理7",
-                majorGroup: '专业组一',
-            }]
-        }, {
-            id: 3,
-            universityId: "20949",
-            universityLogo: "https://mingxuejingbang.oss-cn-beijing.aliyuncs.com/ie/universityLog/23b6da550a584ea6b60886c6ae97b610.jpg",
-            universityName: "湖南铁道职业技术学院",
-            majors: [{
-                majorAncestors: "交通运输大类>铁道运输类",
-                majorId: "68526",
-                majorName: "铁道交通运营管理1",
-                majorGroup: '专业组一',
-            }, {
-                majorAncestors: "交通运输大类>铁道运输类",
-                majorId: "68527",
-                majorName: "铁道交通运营管理2",
-                majorGroup: '专业组一',
-            }, {
-                majorAncestors: "交通运输大类>铁道运输类",
-                majorId: "68528",
-                majorName: "铁道交通运营管理3",
-                majorGroup: '专业组一',
-            }, {
-                majorAncestors: "交通运输大类>铁道运输类",
-                majorId: "68529",
-                majorName: "铁道交通运营管理4",
-                majorGroup: '专业组一',
-            }, {
-                majorAncestors: "交通运输大类>铁道运输类",
-                majorId: "68530",
-                majorName: "铁道交通运营管理5",
-                majorGroup: '专业组一',
-            }, {
-                majorAncestors: "交通运输大类>铁道运输类",
-                majorId: "68531",
-                majorName: "铁道交通运营管理6",
-                majorGroup: '专业组一',
-            }, {
-                majorAncestors: "交通运输大类>铁道运输类",
-                majorId: "68532",
-                majorName: "铁道交通运营管理7",
-                majorGroup: '专业组一',
-            }]
-        }]
-    }
-    paging.value?.completeByTotal(res.rows, res.total)
+const handleQuery = () => {
+    getVoluntaryList().then(res => {
+        paging.value?.completeByNoMore(res.data, true)
+    }).catch(e => paging.value?.completeByError(e))
 }
 
 provide(VOLUNTARY_SORTING, isSorting)

+ 9 - 9
src/pagesOther/pages/voluntary/result/components/voluntary-result-score.vue

@@ -24,12 +24,12 @@
 import VoluntaryResultTitle from "@/pagesOther/pages/voluntary/result/components/plus/voluntary-result-title.vue";
 import VoluntaryResultProgress from "@/pagesOther/pages/voluntary/result/components/plus/voluntary-result-progress.vue";
 import VoluntaryResultCard from "@/pagesOther/pages/voluntary/result/components/plus/voluntary-result-card.vue";
-import {VOLUNTARY_FORM, VOLUNTARY_MODEL, VOLUNTARY_RESULT} from "@/types/injectionSymbols";
+import {VOLUNTARY_RULES, VOLUNTARY_MODEL, VOLUNTARY_RESULT} from "@/types/injectionSymbols";
 import {VoluntaryResultHistory, VoluntaryScoreItem} from "@/types/voluntary";
 import _ from "lodash";
 
 const model = inject(VOLUNTARY_MODEL)
-const data = inject(VOLUNTARY_FORM)
+const rules = inject(VOLUNTARY_RULES)
 const result = inject(VOLUNTARY_RESULT)
 
 interface RichText {
@@ -43,11 +43,11 @@ const emptyRichText: RichText = {prefix: '', middle: '', middleClass: '', suffix
 
 const progressList = computed(() => {
     const scores = model?.value
-    const form = data?.value
-    if (!scores || !form) return []
+    const renderRules = rules?.value
+    if (!scores || !renderRules) return []
     const results: VoluntaryScoreItem[] = []
 
-    form.rules?.forEach(i => {
+    renderRules?.forEach(i => {
         i.details?.forEach(r => {
             results.push({
                 label: r.label,
@@ -82,16 +82,16 @@ const tip = computed(() => {
         suffix: '分即可达标!'
     }
     if (diff > 0) return {
-        prefix: '预估已经超过',
+        prefix: '您已超过往年录取分数',
         middle: Math.abs(diff) + '',
         middleClass: 'text-success',
-        suffix: '分,已达标!'
+        suffix: '分,请继续保持!'
     }
     if (diff === 0) return {
-        prefix: '预估已经与之',
+        prefix: '您刚好达到往年录取分',
         middle: '持平',
         middleClass: 'text-primary',
-        suffix: ',继续努力!'
+        suffix: ',继续努力!'
     }
     return emptyRichText
 })

+ 5 - 3
src/pagesOther/pages/voluntary/result/result.vue

@@ -26,7 +26,7 @@
 
 import {useTransferPage} from "@/hooks/useTransferPage";
 import {VoluntaryDto} from "@/types/voluntary";
-import {VOLUNTARY_FORM, VOLUNTARY_MODEL, VOLUNTARY_RESULT} from "@/types/injectionSymbols";
+import {VOLUNTARY_TARGET, VOLUNTARY_RULES, VOLUNTARY_MODEL, VOLUNTARY_RESULT} from "@/types/injectionSymbols";
 import VoluntaryFormMajor from "@/pagesOther/pages/voluntary/index/components/voluntary-form-major.vue";
 import VoluntaryResultAnalysis from "@/pagesOther/pages/voluntary/result/components/voluntary-result-analysis.vue";
 import VoluntaryResultScore from "@/pagesOther/pages/voluntary/result/components/voluntary-result-score.vue";
@@ -36,7 +36,8 @@ import VoluntaryResultSkill from "@/pagesOther/pages/voluntary/result/components
 import VoluntaryResultDisclaimer from "@/pagesOther/pages/voluntary/result/components/voluntary-result-disclaimer.vue";
 
 const {prevData} = useTransferPage<VoluntaryDto, any>()
-const data = computed(() => prevData.value.data || {})
+const target = computed(() => prevData.value.target || {})
+const rules = computed(() => prevData.value.rules || {})
 const model = computed(() => prevData.value.model || {})
 const result = computed(() => prevData.value.result || {})
 
@@ -44,7 +45,8 @@ const handleSubmit = async () => {
 
 }
 
-provide(VOLUNTARY_FORM, data)
+provide(VOLUNTARY_TARGET, target)
+provide(VOLUNTARY_RULES, rules)
 provide(VOLUNTARY_MODEL, model)
 provide(VOLUNTARY_RESULT, result)
 // 为了让子组件触发页面滚动