Skip to content

Commit 40fb7b8

Browse files
fix(plugins/score): 修复了「均分绩点计算器」与「成绩信息查询」失效的 bug
教务系统接口更换,导致这两个功能,现已修复。 fix #43
1 parent 2b9ae65 commit 40fb7b8

5 files changed

Lines changed: 229 additions & 108 deletions

File tree

‎src/plugins/score/GPACalculator.vue‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import { getSelectedCourses } from '@/plugins/score/utils'
4141
import { convertCourseScoreInfoListToScoreRecords } from '@/helper/converter'
4242
import * as ueip from '@/plugins/user-experience-improvement-program'
4343
import {
44-
requestAllTermsCourseScoreInfoList,
44+
requestAllPassingScores,
4545
requestThisTermCourseScoreInfoList
4646
} from '@/store/actions/request'
4747
import { notifyError } from '@/helper/util'
@@ -102,7 +102,7 @@ export default class GPACalculator extends Vue {
102102
await requestThisTermCourseScoreInfoList()
103103
)
104104
: convertCourseScoreInfoListToScoreRecords(
105-
await requestAllTermsCourseScoreInfoList()
105+
await requestAllPassingScores()
106106
)
107107
this.records = records
108108
this.loadingIsDone = true

‎src/store/actions/request.ts‎

Lines changed: 47 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import {
2-
AllTermScoresDTO,
32
CourseScoreInfo,
43
CurrentSemesterStudentAcademicInfo,
54
TrainingSchemeYearInfo,
@@ -17,6 +16,8 @@ import {
1716
import { pipe, map } from 'ramda'
1817
import state from '../state'
1918
import {
19+
APIAllPassingScoresDTO,
20+
APIAllPassingScoresDTOLnCj,
2021
APISubitemScoreFxcjDTO,
2122
APISubitemScoreLookDTO,
2223
Result,
@@ -31,30 +32,12 @@ import {
3132
import { sleep, http } from '@/helper/util'
3233
import { getChineseNumber } from '@/helper/getter'
3334
import { Logger } from '@/helper/logger'
34-
35-
function getPageHTML(url: string): Promise<string> {
36-
return $.get({
37-
url,
38-
beforeSend: (xhr) =>
39-
xhr.setRequestHeader('X-Requested-With', {
40-
toString() {
41-
return ''
42-
}
43-
} as string)
44-
}) as unknown as Promise<string>
45-
}
46-
47-
async function LoadHTMLToDealWithError(
48-
url: string
49-
): Promise<{ title: string; message: string; html: string }> {
50-
const html = await getPageHTML(url)
51-
const title = $('title', html).text()
52-
const message = $('.main-content .page-content', html)
53-
.text()
54-
.replace(/×/g, '')
55-
.trim()
56-
return { title, message, html }
57-
}
35+
import {
36+
getExamTypeNameByCode,
37+
getPageHTML,
38+
getThisTermScoresDataURL,
39+
LoadHTMLToDealWithError
40+
} from './utils'
5841

5942
async function requestStudentSemesterNumberList(): Promise<string[]> {
6043
const url = '/student/courseSelect/calendarSemesterCurriculum/index'
@@ -488,59 +471,38 @@ function filterCourseScoreInfoList(list: CourseScoreInfo[]): CourseScoreInfo[] {
488471
)
489472
}
490473

491-
async function requestAllTermsCourseScoreInfoList(): Promise<
492-
CourseScoreInfo[]
493-
> {
494-
const url = '/student/integratedQuery/scoreQuery/allTermScores/data'
474+
export async function requestAllPassingScores(): Promise<CourseScoreInfo[]> {
475+
const url = '/student/integratedQuery/scoreQuery/allPassingScores/callback'
495476
try {
496-
const {
497-
list: {
498-
pageContext: { totalCount }
499-
}
500-
} = (await $.post(url, {
501-
zxjxjhh: '',
502-
kch: '',
503-
kcm: '',
504-
pageNum: 1,
505-
pageSize: 1
506-
})) as AllTermScoresDTO
507-
508-
const {
509-
list: { records }
510-
} = (await $.post(
511-
'/student/integratedQuery/scoreQuery/allTermScores/data',
512-
{
513-
zxjxjhh: '',
514-
kch: '',
515-
kcm: '',
516-
pageNum: 1,
517-
pageSize: totalCount
518-
}
519-
)) as AllTermScoresDTO
520-
type recordType = typeof records[0]
521-
const formatRecord = ([
522-
executiveEducationPlanNumber,
523-
courseNumber,
524-
courseSequenceNumber,
477+
const { lnList } = (await $.get(url)) as APIAllPassingScoresDTO
478+
const records = lnList.reduce(
479+
(acc, cur) => acc.concat(cur.cjList),
480+
[] as APIAllPassingScoresDTOLnCj[]
481+
)
482+
const formatRecord = ({
483+
id: {
484+
executiveEducationPlanNumber,
485+
courseNumber,
486+
// 对,你没看错,教务系统把 course 打成 coure 了
487+
coureSequenceNumber: courseSequenceNumber
488+
},
525489
examTime,
526-
inputStatusCode,
527-
coursePropertyCode,
490+
entryStatusCode: inputStatusCode,
491+
courseAttributeCode: coursePropertyCode,
528492
examTypeCode,
529-
inputMethodCode,
493+
scoreEntryModeCode: inputMethodCode,
530494
courseScore,
531-
levelCode,
532-
// 缓考是 '00'
533-
unpassedReasonCode,
495+
gradeScore: levelCode,
496+
notByReasonCode: unpassedReasonCode,
497+
notByReasonName: unpassedReasonExplain,
534498
courseName,
535499
englishCourseName,
536500
credit,
537-
studyHour,
538-
coursePropertyName,
539-
examTypeName,
540-
levelName,
541-
// 缓考是 '申请缓考'
542-
unpassedReasonExplain
543-
]: recordType): CourseScoreInfo => ({
501+
cycle: studyHour,
502+
gradeName: levelName,
503+
courseAttributeName: coursePropertyName,
504+
gradePointScore
505+
}: APIAllPassingScoresDTOLnCj): CourseScoreInfo => ({
544506
executiveEducationPlanNumber,
545507
executiveEducationPlanName: convertSemesterNumberToText(
546508
executiveEducationPlanNumber
@@ -556,35 +518,37 @@ async function requestAllTermsCourseScoreInfoList(): Promise<
556518
// levelCode 在本学期成绩信息接口里是 string,在全部成绩信息接口里却是 number
557519
levelCode:
558520
levelCode?.toString() ||
559-
getLevelCodeByScore(courseScore, executiveEducationPlanNumber) ||
560-
'',
521+
getLevelCodeByScore(courseScore, executiveEducationPlanNumber),
561522
unpassedReasonCode,
562523
courseName,
563524
englishCourseName,
564-
credit,
565-
studyHour,
525+
credit: Number(credit),
526+
studyHour: Number(studyHour),
566527
coursePropertyName,
567-
examTypeName,
528+
examTypeName: getExamTypeNameByCode(examTypeCode),
568529
levelName:
569530
levelName ||
570-
getLevelNameByScore(courseScore, executiveEducationPlanNumber) ||
571-
'',
531+
getLevelNameByScore(courseScore, executiveEducationPlanNumber),
572532
unpassedReasonExplain,
573-
gradePoint: getPointByScore(courseScore, executiveEducationPlanNumber)
533+
gradePoint:
534+
gradePointScore ||
535+
getPointByScore(courseScore, executiveEducationPlanNumber)
574536
})
575537

576538
return pipe(map(formatRecord), filterCourseScoreInfoList)(records)
577539
} catch (error) {
578-
const { title, message, html } = await LoadHTMLToDealWithError(url)
579-
Logger.error({ title, message, html })
580-
throw new Error(`${title}: ${message}`)
540+
console.log(error)
541+
// const { title, message, html } = await LoadHTMLToDealWithError(url)
542+
// Logger.error({ title, message, html })
543+
// throw new Error(`${title}: ${message}`)
544+
throw new Error(error)
581545
}
582546
}
583547

584548
async function requestThisTermCourseScoreInfoList(): Promise<
585549
CourseScoreInfo[]
586550
> {
587-
const url = '/student/integratedQuery/scoreQuery/thisTermScores/data'
551+
const url = await getThisTermScoresDataURL()
588552
try {
589553
const data = await $.get(url)
590554
const [{ list }]: TermScoresData[] = data
@@ -723,7 +687,6 @@ export async function requestAccessToken(): Promise<LoginResultData> {
723687

724688
export {
725689
requestThisTermCourseScoreInfoList,
726-
requestAllTermsCourseScoreInfoList,
727690
requestCurrentSemesterStudentAcademicInfo,
728691
requestTrainingSchemeList,
729692
requestTrainingScheme,

‎src/store/actions/result.interface.ts‎

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,98 @@ export interface APISubitemScoreFxcjDTO {
145145
}
146146
records: SubitemScoreRecord[]
147147
}
148+
149+
export interface APIAllPassingScoresDTO {
150+
lnList: APIAllPassingScoresDTOLn[]
151+
state: string
152+
zxjxjhh: string
153+
}
154+
155+
export interface APIAllPassingScoresDTOLn {
156+
cjList: APIAllPassingScoresDTOLnCj[]
157+
xqwtg: number
158+
xqzms: number
159+
xqtgms: number
160+
xqzxs: number
161+
xqzxf: number
162+
zxf: number
163+
zxs: number
164+
yqzxf: number
165+
yqxf: number
166+
yxxf: number
167+
tgms: number
168+
wtgms: number
169+
zms: number
170+
cjlx: string
171+
cjbh: string
172+
fajhwkcms: number
173+
kznzms: number
174+
fajhnkcms: number
175+
kzxdms: number
176+
kzwtgms: number
177+
kztgms: number
178+
fajhzxf: number
179+
fajhzxs: number
180+
fajhzms: number
181+
famc: undefined
182+
zxjxjhh: string
183+
}
184+
185+
export interface APIAllPassingScoresDTOLnCj {
186+
id: APIAllPassingScoresDTOLnCjId
187+
classNo: string
188+
entryStatusCode: string
189+
scoreEntryModeCode: string
190+
gradePointScore?: number
191+
standardScore?: number
192+
percentileRankScore?: number
193+
gradeScore?: number
194+
planNO: string
195+
courseAttributeName: string
196+
courseAttributeCode: string
197+
payableMoney: undefined
198+
examTypeCode?: string
199+
examTime: string
200+
electiveTypeCode?: string
201+
studyModeCode: string
202+
courseScore: number
203+
operator?: string
204+
operatingTime?: string
205+
makeupExaminationTypeCode?: string
206+
notByReasonCode: undefined
207+
notByReasonName: undefined
208+
remark?: string
209+
cycle?: string
210+
courseName: string
211+
englishCourseName: string
212+
planName: string
213+
planName2: string
214+
academicYearCode: string
215+
termTypeCode: string
216+
termTypeName: string
217+
termCode: string
218+
termName: string
219+
gradeName?: string
220+
cj: string
221+
xkcsxdm: undefined
222+
xkcsxmc: undefined
223+
tdkcm: undefined
224+
cjlrfsdm: undefined
225+
bm: undefined
226+
kzlbmc: undefined
227+
avgcj: undefined
228+
rank: undefined
229+
xkkzm: undefined
230+
credit: string
231+
tscore?: number
232+
substituteCourseNo?: string
233+
}
234+
235+
export interface APIAllPassingScoresDTOLnCjId {
236+
executiveEducationPlanNumber: string
237+
courseNumber: string
238+
startTime: string
239+
studentId: string
240+
coureSequenceNumber: string
241+
kch_zj: string
242+
}

‎src/store/actions/utils.ts‎

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import { notifyError } from '@/helper/util'
2+
3+
export function getPageHTML(url: string): Promise<string> {
4+
return $.get({
5+
url,
6+
beforeSend: (xhr) =>
7+
xhr.setRequestHeader('X-Requested-With', {
8+
toString() {
9+
return ''
10+
}
11+
} as string)
12+
}) as unknown as Promise<string>
13+
}
14+
15+
export async function LoadHTMLToDealWithError(
16+
url: string
17+
): Promise<{ title: string; message: string; html: string }> {
18+
const html = await getPageHTML(url)
19+
const title = $('title', html).text()
20+
const message = $('.main-content .page-content', html)
21+
.text()
22+
.replace(/×/g, '')
23+
.trim()
24+
return { title, message, html }
25+
}
26+
27+
export async function getAllTermScoresDataURL(): Promise<string> {
28+
const referralUrl = '/student/integratedQuery/scoreQuery/allTermScores/index'
29+
const referralPageHTML = await getPageHTML(referralUrl)
30+
const r = /scoreQuery\/(.+?)\/allTermScores\/data/.exec(referralPageHTML)
31+
if (!r) {
32+
const msg = '无法获取 allTermScores 接口的完整地址。'
33+
notifyError(msg, '[均分绩点计算器] 获取数据接口地址失败')
34+
throw new Error(msg)
35+
} else {
36+
return `/student/integratedQuery/scoreQuery/${r[1]}/allTermScores/index`
37+
}
38+
}
39+
40+
export async function getThisTermScoresDataURL(): Promise<string> {
41+
const referralUrl = '/student/integratedQuery/scoreQuery/thisTermScores/index'
42+
const referralPageHTML = await getPageHTML(referralUrl)
43+
const r = /scoreQuery\/(.+?)\/thisTermScores\/data/.exec(referralPageHTML)
44+
if (!r) {
45+
const msg = '无法获取 thisTermScores 接口的完整地址。'
46+
notifyError(msg, '[成绩信息查询] 获取数据接口地址失败')
47+
throw new Error(msg)
48+
} else {
49+
return `/student/integratedQuery/scoreQuery/${r[1]}/thisTermScores/data`
50+
}
51+
}
52+
53+
export function getExamTypeNameByCode(
54+
examTypeCode: string | undefined
55+
): string | undefined {
56+
if (!examTypeCode) {
57+
return undefined
58+
}
59+
switch (examTypeCode) {
60+
case '01':
61+
return '考试'
62+
case '02':
63+
return '考查'
64+
default:
65+
return undefined
66+
}
67+
}

0 commit comments

Comments
 (0)