summary_rs/parse/
assign.rs

1use crate::parse::regex::match_project_no;
2use crate::types::SummaryModelDocx;
3use std::collections::HashMap;
4
5pub fn parse_docx_table(content: Vec<String>) -> SummaryModelDocx {
6    let mut summary = SummaryModelDocx::default();
7    for (index, item) in content.iter().enumerate() {
8        // 标题
9        if item.contains("概要") && item.contains("Test Summary")
10        {
11            summary.title = item.clone().split("项目编号").next().unwrap().to_string();
12        }
13        // 项目编号
14        if item.contains("项目编号")
15        {
16            summary.project_no = match_project_no(&item);
17        }
18        // 测试报告签发日期
19        if item.contains("测试标准")
20        {
21            summary.base.test_date = content[index - 1].clone();
22        }
23        let field_mappings = HashMap::from([
24            ("委托单位", &mut summary.base.consignor),
25            ("生产单位", &mut summary.base.manufacturer),
26            ("测试单位", &mut summary.base.test_lab),
27            ("名称", &mut summary.base.cn_name),
28            ("电芯类别", &mut summary.base.classification),
29            ("型号", &mut summary.base.model),
30            ("商标", &mut summary.base.trademark),
31            ("额定电压", &mut summary.base.voltage),
32            ("额定容量", &mut summary.base.capacity),
33            ("额定能量", &mut summary.base.watt),
34            ("外观", &mut summary.base.shape),
35            ("质量", &mut summary.base.mass),
36            ("锂含量", &mut summary.base.li_content),
37            ("测试报告编号", &mut summary.base.test_report_no),
38            ("测试标准", &mut summary.base.test_manual),
39            ("高度模拟", &mut summary.base.test1),
40            ("温度试验", &mut summary.base.test2),
41            ("振动", &mut summary.base.test3),
42            ("冲击", &mut summary.base.test4),
43            ("外部短路", &mut summary.base.test5),
44            ("撞击/挤压", &mut summary.base.test6),
45            ("过度充电", &mut summary.base.test7),
46            ("强制放电", &mut summary.base.test8),
47            ("UN38.3.3.1(f)", &mut summary.base.un38_f),
48            ("UN38.3.3.1(g)", &mut summary.base.un38_g),
49            ("备注", &mut summary.base.note),
50        ]);
51
52        for (key, field) in field_mappings {
53            if item.contains(key) {
54                *field = content[index + 1].clone();
55            }
56        }
57    }
58    // 签发日期
59    summary.issue_date = content[content.len() - 1].clone();
60    summary
61}
62
63#[cfg(test)]
64mod tests {
65    use super::*;
66    use crate::{parse::read::parse_docx_text, reader::read_docx_content};
67
68    #[test]
69    fn test_parse_docx() {
70        let text = read_docx_content(
71            // r"C:\Users\29115\RustroverProjects\docx-rs\tests\test.docx",
72            r"C:\Users\29115\Downloads\PEKGZ202412167637 概要.docx",
73            vec!["word/document.xml".to_string()],
74        );
75        let content = parse_docx_text(&text.unwrap()[0].clone());
76        println!("{}", content.clone().join("\n"));
77        let summary = parse_docx_table(content);
78        std::fs::write("test2.json", serde_json::to_string(&summary).unwrap()).unwrap();
79    }
80}