Skip to content

Commit 46deaf4

Browse files
fix(plugins/score): 修复了如果课程没有等级成绩,绩点计算器中等级成绩会留空的 bug
fix #40
1 parent b495d65 commit 46deaf4

File tree

2 files changed

+180
-45
lines changed

2 files changed

+180
-45
lines changed

src/plugins/score/utils.ts

Lines changed: 137 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,11 @@ function getWeightedAverage(
3434
* @param {CourseScoreRecord[]} arr 一个课程数组
3535
* @returns 一个只包含gpa作为数值,学分作为权值的对象数组
3636
*/
37-
function mapGPA(
38-
arr: CourseScoreRecord[]
39-
): {
37+
function mapGPA(arr: CourseScoreRecord[]): {
4038
value: number
4139
weight: number
4240
}[] {
43-
return arr.map(v => ({ value: v.gradePoint || 0, weight: v.credit }))
41+
return arr.map((v) => ({ value: v.gradePoint || 0, weight: v.credit }))
4442
}
4543

4644
/**
@@ -49,13 +47,11 @@ function mapGPA(
4947
* @param {CourseScoreRecord[]} arr 一个课程数组
5048
* @returns 一个只包含分数作为数值,学分作为权值的对象数组
5149
*/
52-
function mapScore(
53-
arr: CourseScoreRecord[]
54-
): {
50+
function mapScore(arr: CourseScoreRecord[]): {
5551
value: number
5652
weight: number
5753
}[] {
58-
return arr.map(v => ({ value: v.courseScore || 0, weight: v.credit }))
54+
return arr.map((v) => ({ value: v.courseScore || 0, weight: v.credit }))
5955
}
6056

6157
/**
@@ -65,7 +61,7 @@ function mapScore(
6561
* @returns 筛选出的只包括必修课程的数组
6662
*/
6763
function getCompulsoryCourses(arr: CourseScoreRecord[]): CourseScoreRecord[] {
68-
return arr.filter(v => v.coursePropertyName === '必修')
64+
return arr.filter((v) => v.coursePropertyName === '必修')
6965
}
7066

7167
/**
@@ -75,7 +71,7 @@ function getCompulsoryCourses(arr: CourseScoreRecord[]): CourseScoreRecord[] {
7571
* @returns 筛选出的被选中的课程的数组
7672
*/
7773
function getSelectedCourses(arr: CourseScoreRecord[]): CourseScoreRecord[] {
78-
return arr.filter(v => v.selected)
74+
return arr.filter((v) => v.selected)
7975
}
8076

8177
/**
@@ -195,7 +191,7 @@ function getPointByScore(
195191
// 2017年起,川大修改了绩点政策,因此要检测学期的年份
196192
const r = semester.match(/^\d+/)
197193
if (!r) {
198-
return 0
194+
return undefined
199195
}
200196
const enrollmentYear = Number(r[0])
201197
if (enrollmentYear >= 2017) {
@@ -247,6 +243,136 @@ function getPointByScore(
247243
}
248244
}
249245

246+
type LevelName =
247+
| 'A'
248+
| 'A-'
249+
| 'B+'
250+
| 'B'
251+
| 'B-'
252+
| 'C+'
253+
| 'C'
254+
| 'C-'
255+
| 'D+'
256+
| 'D'
257+
| 'F'
258+
259+
/**
260+
* 根据分数返回对应的等级成绩
261+
*
262+
* @param {number} score 分数
263+
* @param {string} semester 学期
264+
* @returns {LevelName|undefined} 等级成绩
265+
*/
266+
export function getLevelNameByScore(
267+
score: number | undefined,
268+
semester: string
269+
): LevelName | undefined {
270+
if (!score) {
271+
return undefined
272+
}
273+
// 2017年起,川大修改了绩点政策,因此要检测学期的年份
274+
const r = semester.match(/^\d+/)
275+
if (!r) {
276+
return undefined
277+
}
278+
const enrollmentYear = Number(r[0])
279+
if (enrollmentYear >= 2017) {
280+
// 2017-2018秋季学期起使用如下标准(Fall Term 2017-2018~Present)
281+
if (score >= 90) {
282+
return 'A'
283+
} else if (score >= 85) {
284+
return 'A-'
285+
} else if (score >= 80) {
286+
return 'B+'
287+
} else if (score >= 76) {
288+
return 'B'
289+
} else if (score >= 73) {
290+
return 'B-'
291+
} else if (score >= 70) {
292+
return 'C+'
293+
} else if (score >= 66) {
294+
return 'C'
295+
} else if (score >= 63) {
296+
return 'C-'
297+
} else if (score >= 61) {
298+
return 'D+'
299+
} else if (score >= 60) {
300+
return 'D'
301+
} else {
302+
return 'F'
303+
}
304+
} else {
305+
// 2017-2018秋季学期以前使用如下标准(Before Fall Term 2017-2018)
306+
// 这时还没有「等级成绩」的概念
307+
return undefined
308+
}
309+
}
310+
311+
type LevelCode =
312+
| '-20'
313+
| '-21'
314+
| '-22'
315+
| '-23'
316+
| '-24'
317+
| '-25'
318+
| '-26'
319+
| '-27'
320+
| '-28'
321+
| '-29'
322+
| '-30'
323+
324+
/**
325+
* 根据分数返回对应的等级成绩代码
326+
*
327+
* @param {number} score 分数
328+
* @param {string} semester 学期
329+
* @returns {LevelName|undefined} 等级成绩代码
330+
*/
331+
export function getLevelCodeByScore(
332+
score: number | undefined,
333+
semester: string
334+
): LevelCode | undefined {
335+
if (!score) {
336+
return undefined
337+
}
338+
// 2017年起,川大修改了绩点政策,因此要检测学期的年份
339+
const r = semester.match(/^\d+/)
340+
if (!r) {
341+
return undefined
342+
}
343+
const enrollmentYear = Number(r[0])
344+
if (enrollmentYear >= 2017) {
345+
// 2017-2018秋季学期起使用如下标准(Fall Term 2017-2018~Present)
346+
if (score >= 90) {
347+
return '-20'
348+
} else if (score >= 85) {
349+
return '-21'
350+
} else if (score >= 80) {
351+
return '-22'
352+
} else if (score >= 76) {
353+
return '-23'
354+
} else if (score >= 73) {
355+
return '-24'
356+
} else if (score >= 70) {
357+
return '-25'
358+
} else if (score >= 66) {
359+
return '-26'
360+
} else if (score >= 63) {
361+
return '-27'
362+
} else if (score >= 61) {
363+
return '-28'
364+
} else if (score >= 60) {
365+
return '-29'
366+
} else {
367+
return '-30'
368+
}
369+
} else {
370+
// 2017-2018秋季学期以前使用如下标准(Before Fall Term 2017-2018)
371+
// 这时还没有「等级成绩」的概念
372+
return undefined
373+
}
374+
}
375+
250376
export {
251377
getCompulsoryCoursesGPA,
252378
getCompulsoryCoursesScore,

src/store/actions/request.ts

Lines changed: 43 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,25 @@ import {
2323
SubitemScoreRecord,
2424
TermScoresData
2525
} from './result.interface'
26-
import { getPointByScore } from '@/plugins/score/utils'
26+
import {
27+
getLevelCodeByScore,
28+
getLevelNameByScore,
29+
getPointByScore
30+
} from '@/plugins/score/utils'
2731
import { sleep, http } from '@/helper/util'
2832
import { getChineseNumber } from '@/helper/getter'
2933
import { Logger } from '@/helper/logger'
3034

3135
function getPageHTML(url: string): Promise<string> {
32-
return ($.get({
36+
return $.get({
3337
url,
34-
beforeSend: xhr =>
38+
beforeSend: (xhr) =>
3539
xhr.setRequestHeader('X-Requested-With', {
3640
toString() {
3741
return ''
3842
}
3943
} as string)
40-
}) as unknown) as Promise<string>
44+
}) as unknown as Promise<string>
4145
}
4246

4347
async function LoadHTMLToDealWithError(
@@ -56,7 +60,7 @@ async function requestStudentSemesterNumberList(): Promise<string[]> {
5660
const url = '/student/courseSelect/calendarSemesterCurriculum/index'
5761
const rawHTML = await getPageHTML(url)
5862
const codeList = Array.from($('#planCode', rawHTML).find('option')).map(
59-
v => $(v).val() as string
63+
(v) => $(v).val() as string
6064
)
6165
return codeList
6266
}
@@ -65,10 +69,7 @@ async function requestStudentInfo(): Promise<Map<string, string>> {
6569
const url = '/student/rollManagement/rollInfo/index'
6670
const rawHTML = await getPageHTML(url)
6771
const programPlanNumber = $('#zx', rawHTML).val() as string
68-
const programPlanName = $('#zx', rawHTML)
69-
.parent()
70-
.text()
71-
.trim()
72+
const programPlanName = $('#zx', rawHTML).parent().text().trim()
7273
const infos = Array.from($('.profile-info-row', rawHTML))
7374
.map((v): HTMLElement[][] => {
7475
const num = $(v).children('.profile-info-name').length
@@ -94,15 +95,9 @@ async function requestStudentInfo(): Promise<Map<string, string>> {
9495
return [[]]
9596
})
9697
.flat(1)
97-
.filter(v => v.length)
98-
.map(v =>
99-
v.map(element =>
100-
$(element)
101-
.text()
102-
.trim()
103-
)
104-
)
105-
.filter(v => v[0])
98+
.filter((v) => v.length)
99+
.map((v) => v.map((element) => $(element).text().trim()))
100+
.filter((v) => v[0])
106101
.concat([
107102
['培养方案名称', programPlanName],
108103
['培养方案代码', programPlanNumber]
@@ -233,9 +228,7 @@ async function requestCourseSchedule(
233228
}
234229
}
235230

236-
function requestTrainingScheme(
237-
num: number
238-
): Promise<{
231+
function requestTrainingScheme(num: number): Promise<{
239232
info: TrainingSchemeBaseInfo
240233
list: TrainingSchemeYearInfo[]
241234
}> {
@@ -351,12 +344,12 @@ function requestTrainingScheme(
351344
)
352345
]).then(([{ info, list }, table]) => ({
353346
info,
354-
list: list.map(year => ({
347+
list: list.map((year) => ({
355348
name: year.name,
356-
children: year.children.map(semester => ({
349+
children: year.children.map((semester) => ({
357350
name: semester.name,
358351
children: semester.children
359-
.map(v =>
352+
.map((v) =>
360353
Object.assign(v, table[v.courseNumber], {
361354
courseMajor: `${info.zym}${info.njmc})`
362355
})
@@ -451,9 +444,7 @@ async function requestScuUietpList(queryStr: string): Promise<ScuUietpDTO> {
451444
}
452445
}
453446

454-
async function requestCurrentSemesterStudentAcademicInfo(): Promise<
455-
CurrentSemesterStudentAcademicInfo
456-
> {
447+
async function requestCurrentSemesterStudentAcademicInfo(): Promise<CurrentSemesterStudentAcademicInfo> {
457448
// 加载本学期基本信息
458449
const [
459450
{
@@ -491,9 +482,9 @@ function filterCourseScoreInfoList(list: CourseScoreInfo[]): CourseScoreInfo[] {
491482
// 教师「暂存」的成绩学生不应看到
492483
// 因此为了和教务处成绩显示保持一致,这里只显示「已提交」的成绩
493484
// TODO: 考虑做开关,让用户决定看不看
494-
.filter(v => v.inputStatusCode === '05')
485+
.filter((v) => v.inputStatusCode === '05')
495486
// 分数可能为null,必须分数不为null才显示
496-
.filter(v => v.courseScore)
487+
.filter((v) => v.courseScore)
497488
)
498489
}
499490

@@ -563,15 +554,21 @@ async function requestAllTermsCourseScoreInfoList(): Promise<
563554
inputMethodCode,
564555
courseScore,
565556
// levelCode 在本学期成绩信息接口里是 string,在全部成绩信息接口里却是 number
566-
levelCode: levelCode?.toString(),
557+
levelCode:
558+
levelCode?.toString() ||
559+
getLevelCodeByScore(courseScore, executiveEducationPlanNumber) ||
560+
'',
567561
unpassedReasonCode,
568562
courseName,
569563
englishCourseName,
570564
credit,
571565
studyHour,
572566
coursePropertyName,
573567
examTypeName,
574-
levelName,
568+
levelName:
569+
levelName ||
570+
getLevelNameByScore(courseScore, executiveEducationPlanNumber) ||
571+
'',
575572
unpassedReasonExplain,
576573
gradePoint: getPointByScore(courseScore, executiveEducationPlanNumber)
577574
})
@@ -594,7 +591,7 @@ async function requestThisTermCourseScoreInfoList(): Promise<
594591
// console.log(`state: ${state}`)
595592
const res = filterCourseScoreInfoList(
596593
list.map(
597-
v =>
594+
(v) =>
598595
({
599596
courseName: v.courseName || '',
600597
englishCourseName: v.englishCourseName || '',
@@ -609,8 +606,20 @@ async function requestThisTermCourseScoreInfoList(): Promise<
609606
minScore: Number(v.mincj) || 0,
610607
courseScore: Number(v.courseScore) || 0,
611608
// 对,你没看错,这个地方教务处接口是错别字,把level打成了levle
612-
levelCode: v.levlePoint || '',
613-
levelName: v.levelName || '',
609+
levelCode:
610+
v.levlePoint ||
611+
getLevelCodeByScore(
612+
Number(v.courseScore) || 0,
613+
v.id.executiveEducationPlanNumber || ''
614+
) ||
615+
'',
616+
levelName:
617+
v.levelName ||
618+
getLevelNameByScore(
619+
Number(v.courseScore) || 0,
620+
v.id.executiveEducationPlanNumber || ''
621+
) ||
622+
'',
614623
gradePoint: Number(v.gradePoint) || 0,
615624
rank: Number(v.rank) || 0,
616625
examTime: v.id.examtime || '',

0 commit comments

Comments
 (0)