Skip to main content

lnu_elytra/method/
fetch_course.rs

1use serde::{Deserialize, Serialize};
2
3use crate::{
4    Client,
5    course::{Course, Jxb},
6    error::{Error, R},
7};
8
9impl Client {
10    /// 查询教学班参数,需要精确的搜索
11    pub async fn fetch_courses(&self, q: &str) -> R<Course> {
12        #[derive(Serialize, Debug)]
13        struct PartDisplayRequestData<'a> {
14            #[serde(rename = "filter_list[0]")]
15            filter_list: &'a str,
16            xbm: &'a str,
17            ccdm: &'a str,
18            kklxdm: &'a str,
19            xkxnm: &'a str, //选课学年:如 “2024”
20            xkxqm: &'a str, //选课学期名,如第二学期为 “2”
21            jg_id: &'a str, // 二级学院 id
22            xsbj: &'a str,  //学生班级(推测)
23            mzm: &'a str,
24            xz: &'a str,      //可能是学制
25            bh_id: &'a str,   //学生班级号id,值为完整学号去除后两位
26            xqh_id: &'a str,  //学区号id(推测)
27            zyfx_id: &'a str, //与专业有关
28            xslbdm: &'a str,
29            kspage: &'a str,
30            jspage: &'a str,
31        }
32
33        let part_display_data = PartDisplayRequestData {
34            filter_list: q.into(),
35            xbm: self.use_store("xbm"),
36            ccdm: self.use_store("ccdm"),
37            kklxdm: self.use_store("firstKklxdm"),
38            xkxnm: self.use_store("xkxnm"),
39            xkxqm: self.use_store("xkxqm"),
40            jg_id: self.use_store("jg_id_1"),
41            xsbj: self.use_store("xsbj"),
42            mzm: self.use_store("mzm"),
43            xz: self.use_store("xz"),
44            bh_id: self.use_store("bh_id"),
45            xqh_id: self.use_store("xqh_id"),
46            zyfx_id: self.use_store("zyfx_id"),
47            xslbdm: self.use_store("xslbdm"),
48            kspage: "1",
49            jspage: "10",
50        };
51
52        #[derive(Deserialize, Debug)]
53        struct PartDisplayResponseData {
54            #[serde(rename = "tmpList")]
55            tmp_list: Vec<PartDisplayResponseInnerData>,
56        }
57
58        impl PartDisplayResponseData {
59            fn use_first_kch_id(&self) -> R<&String> {
60                Ok(&self
61                    .tmp_list
62                    .get(0)
63                    .ok_or(Error::JxbNotFound("~.tmp_list.0"))?
64                    .kch_id)
65            }
66        }
67
68        #[derive(Deserialize, Debug)]
69        struct PartDisplayResponseInnerData {
70            // jxb_id: String, //教学班id
71            // jxbmc: String,  //教学班名称 (2024-2025-2)-40190004-25
72            // kcmc: String,   //课程名称
73            kch_id: String, //课程号
74        }
75
76        let part_display_res = self
77            .post(&Client::SELECT_COURSE_PART_DISPLAY_URL)
78            .form(&part_display_data)
79            .send()
80            .await?
81            .json::<PartDisplayResponseData>()
82            .await?;
83
84        #[derive(Serialize, Debug)]
85        struct QueryDoWithCouresIdRequestData<'a> {
86            #[serde(rename = "filter_list[0]")]
87            filter_list: &'a str,
88            xkxqm: &'a str,
89            xkxnm: &'a str,
90            xkkz_id: &'a str,
91            bklx_id: &'a str,
92            kch_id: &'a str,  // 课程号
93            njdm_id: &'a str, //年级名称
94            xsbj: &'a str,
95            xz: &'a str, //学制
96            mzm: &'a str,
97            kklxdm: &'a str,
98            bh_id: &'a str,
99            xqh_id: &'a str,
100            xslbdm: &'a str,
101            zyfx_id: &'a str,
102            jg_id: &'a str,
103            ccdm: &'a str,
104            xbm: &'a str,
105        }
106
107        let query_do_data = QueryDoWithCouresIdRequestData {
108            filter_list: q.into(),
109            xkxqm: self.use_store("xkxqm"),
110            xkxnm: self.use_store("xkxnm"),
111            xkkz_id: self.use_store("firstXkkzId"),
112            bklx_id: self.use_store("bklx_id"),
113            kch_id: &part_display_res.use_first_kch_id()?,
114            njdm_id: self.use_store("njdm_id"),
115            xsbj: self.use_store("xsbj"),
116            xz: self.use_store("xz"),
117            mzm: self.use_store("mzm"),
118            kklxdm: self.use_store("firstKklxdm"),
119            bh_id: self.use_store("bh_id"),
120            xqh_id: self.use_store("xqh_id"),
121            xslbdm: self.use_store("xslbdm"),
122            zyfx_id: self.use_store("zyfx_id"),
123            jg_id: self.use_store("jg_id_1"),
124            ccdm: self.use_store("ccdm"),
125            xbm: self.use_store("xbm"),
126        };
127
128        // #[allow(unused)]
129        #[derive(Deserialize, Debug)]
130        struct SelectCourseQueryDoWithCourseIdResponseInnerData {
131            //返回值是一个列表
132            do_jxb_id: String, //执行id
133            jsxx: String,      //教师信息
134            jxb_id: String,    //教学班id
135            // jxdd: String,      //教学地点
136            sksj: String, //上课时间  星期四第9-10节{9-16周}
137                          // xqumc: String,     //校区名称
138        }
139
140        let query_do_res = self
141            .post(&Client::SELECT_COURSE_QUERY_DO_WITH_COURSE_ID_URL)
142            .form(&query_do_data)
143            .send()
144            .await?
145            .json::<Vec<SelectCourseQueryDoWithCourseIdResponseInnerData>>()
146            .await?;
147
148        let mut returndta = Course {
149            xkkz_id: self
150                .stores
151                .get("firstXkkzId")
152                .ok_or(Error::Missing("[firstXkkzId] when fetch_courses".into()))?
153                .into(),
154
155            kch_id: part_display_res.use_first_kch_id()?.into(),
156            jxb: vec![],
157        };
158
159        for item in query_do_res {
160            returndta.jxb.push(Jxb {
161                jxb_id: item.jxb_id,
162                do_id: item.do_jxb_id,
163                jsxx: item.jsxx,
164                sksj: item.sksj,
165            });
166        }
167
168        Ok(returndta)
169    }
170}