From 7a5ca9f1a72e17f1ad8d3ac1775cf85f0dc2ece9 Mon Sep 17 00:00:00 2001 From: openclaw-314 Date: Thu, 27 Aug 2026 11:17:10 +0800 Subject: [PATCH] auto: sync OpenClaw config 2026-08-27 11:17 --- agents/main/agent/models.json | 39 -- .../main/agent/plugins/deepseek/catalog.json | 44 ++ ...œˆOKR-æ¨è½©---dc1717ce-174a-48d7-8c1a-791f028a9ab1.xlsx | Bin 0 -> 15700 bytes ...R-æ¨è½©---3bf30dd9-1069-4a13-aa9d-8dec1edc38a2.xlsx | Bin 0 -> 33486 bytes ...R-æ¨è½©---31614cd1-38bf-49cc-87a9-cba0b978eef0.xlsx | Bin 0 -> 62134 bytes ...模æ¿---973c700c-5a0c-477c-84f7-6bd85dd31ee1.md | 22 + ...1afbca7ad11b9646d0add12e68fed6b95.attested | 2 +- workspace-resume/MEMORY.md | 126 ++++++ workspace-resume/OKR_模æ¿.md | 58 +++ workspace-resume/TOOLS.md | 132 +++++- workspace-resume/db/resume.db | 0 workspace-resume/db/weekly_reports_schema.sql | 93 ++++ .../eml-archive/2025-08-01_1700_G5周报.txt | 23 - .../eml-archive/2025-08-08_1700_G5周报.txt | 24 -- .../eml-archive/2025-08-16_0855_G5周报.txt | 24 -- .../eml-archive/2025-08-22_1734_G5周报.txt | 21 - .../eml-archive/2025-08-29_1700_G5周报.txt | 20 - .../eml-archive/2025-09-05_1700_G5周报.txt | 20 - .../eml-archive/2025-09-11_1700_G5周报.txt | 20 - .../eml-archive/2025-09-20_1700_G5周报.txt | 32 -- .../eml-archive/2025-09-26_1730_G5周报.txt | 22 - .../eml-archive/2025-09-30_1747_G5周报.txt | 18 - .../eml-archive/2025-10-11_1803_G5周报.txt | 18 - .../eml-archive/2025-10-17_1700_G5周报.txt | 19 - .../eml-archive/2025-10-24_1700_G5周报.txt | 19 - .../eml-archive/2025-10-31_1700_G5周报.txt | 19 - .../eml-archive/2025-11-07_1700_G5周报.txt | 19 - .../eml-archive/2025-11-14_1823_G5周报.txt | 1 - .../eml-archive/2025-11-21_1700_G5周报.txt | 19 - .../eml-archive/2025-11-28_1702_G5周报.txt | 19 - .../eml-archive/2025-12-05_1703_G5周报.txt | 18 - .../eml-archive/2025-12-12_1715_G5周报.txt | 18 - .../eml-archive/2025-12-19_1702_G5周报.txt | 18 - .../eml-archive/2025-12-26_1530_G5周报.txt | 18 - .../eml-archive/2025-12-31_1745_G5周报.txt | 25 -- .../eml-archive/2026-01-09_1711_G5周报.txt | 40 -- .../eml-archive/2026-01-16_1702_G5周报.txt | 27 -- .../eml-archive/2026-01-23_1709_G5周报.txt | 29 -- .../eml-archive/2026-01-30_1711_G5周报.txt | 29 -- .../eml-archive/2026-02-06_1701_G5周报.txt | 28 -- .../eml-archive/2026-02-28_1730_G5周报.txt | 32 -- .../eml-archive/2026-03-06_1703_G5周报.txt | 31 -- .../eml-archive/2026-03-13_2039_G5周报.txt | 37 -- .../eml-archive/2026-03-20_1743_G5周报.txt | 77 ---- .../eml-archive/2026-03-27_1708_G5周报.txt | 66 --- .../eml-archive/2026-04-03_1702_G5周报.txt | 63 --- .../eml-archive/2026-04-03_1721_G5周报.txt | 63 --- .../eml-archive/2026-04-10_1728_G5周报.txt | 47 -- .../eml-archive/2026-04-10_1732_G5周报.txt | 47 -- .../eml-archive/2026-04-17_1707_G5周报.txt | 43 -- .../eml-archive/2026-04-24_1804_G5周报.txt | 57 --- .../eml-archive/2026-04-30_1703_G5周报.txt | 51 --- .../eml-archive/2026-05-09_1712_G5周报.txt | 88 ---- ...-09---2fc4dc86-10a7-4839-9d4f-eb8a0aac0732.txt | 88 ---- ...¥_æ¨è½©---9e8b9b52-9a73-4db1-8ad4-a4ce8729e95a.txt | 71 --- .../eml-archive/2026-05-15_1640_G5周报.txt | 71 --- ...¥_æ¨è½©---c184c1f1-9e60-4100-852d-5b0b03d0bdd1.txt | 71 --- .../eml-archive/2026-05-15_1641_G5周报.txt | 71 --- .../eml-archive/2026-05-15_1714_G5周报.txt | 55 --- ...-15---61da95c1-1091-4346-90d7-f407fd717364.txt | 55 --- .../eml-archive/2026-05-22_1713_G5周报.txt | 51 --- ...œˆ22æ—¥---28bff81e-17b9-44d3-9bbf-45875fc0b426.txt | 51 --- workspace-resume/memory/2026-08-27.md | 92 ++++ workspace-resume/okr/parse_okr_to_mysql.py | 268 ++++++++++++ workspace-resume/send_weekly_report.py | 259 ++++++++++- .../skills/weekly-report/SKILL.md | 20 +- .../weekly-reports/2026/2026-W23-周报.md | 37 ++ .../weekly-reports/2026/2026-W24-周报.md | 39 ++ .../weekly-reports/2026/2026-W25-周报.md | 35 ++ .../weekly-reports/2026/2026-W26-周报.md | 36 ++ .../weekly-reports/2026/2026-W27-周报.md | 34 ++ .../weekly-reports/2026/2026-W28-周报.md | 45 ++ .../weekly-reports/2026/2026-W29-周报.md | 38 ++ .../weekly-reports/2026/2026-W29.md | 109 ----- .../weekly-reports/2026/2026-W30-周报.md | 35 ++ .../weekly-reports/2026/2026-W31-周报.md | 59 ++- .../weekly-reports/2026/2026-W32-周报.md | 37 ++ .../weekly-reports/2026/2026-W33-周报.md | 37 ++ .../weekly-reports/2026/2026-W34-周报.md | 36 ++ .../weekly-reports/6-7 月周报补全记录.md | 111 +++++ workspace-resume/weekly-reports/README.md | 106 +++++ .../weekly-reports/import_md_to_db.py | 106 +++++ .../weekly-reports/migrate_legacy_reports.py | 183 ++++++++ .../weekly-reports/migrate_to_mysql.py | 109 +++++ .../weekly-reports/parse_eml_to_md.py | 156 +++++++ .../weekly-reports/summarize_reports.py | 308 +++++++++++++ .../weekly-reports/sync_reports_db.py | 362 ++++++++++++++++ .../weekly-reports/sync_reports_to_db.py | 265 ++++++++++++ .../weekly-reports/weekly_reports.db | Bin 0 -> 45056 bytes workspace-resume/weekly-reports/使用指å—.md | 220 ++++++++++ .../weekly-reports/å®žæ–½å®Œæˆæ€»ç»“.md | 300 +++++++++++++ workspace-resume/weekly-reports/归档总结.md | 241 +++++++++++ workspace-resume/weekly-reports/快速å‚考.md | 89 ++++ .../weekly-reports/æ··åˆæ–¹æ¡ˆæŒ‡å—.md | 404 ++++++++++++++++++ 94 files changed, 4497 insertions(+), 2088 deletions(-) create mode 100644 agents/main/agent/plugins/deepseek/catalog.json create mode 100644 media/inbound/研究院-产å“å¼€å‘部开å‘组-8月OKR-æ¨è½©---dc1717ce-174a-48d7-8c1a-791f028a9ab1.xlsx create mode 100644 media/inbound/研究院-维云智造G5-1月OKR-æ¨è½©---3bf30dd9-1069-4a13-aa9d-8dec1edc38a2.xlsx create mode 100644 media/inbound/研究院-维云智造G5-7月OKR-æ¨è½©---31614cd1-38bf-49cc-87a9-cba0b978eef0.xlsx create mode 100644 media/inbound/维拓科技OKR模æ¿---973c700c-5a0c-477c-84f7-6bd85dd31ee1.md create mode 100644 workspace-resume/OKR_模æ¿.md create mode 100644 workspace-resume/db/resume.db create mode 100644 workspace-resume/db/weekly_reports_schema.sql delete mode 100644 workspace-resume/eml-archive/2025-08-01_1700_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-08-08_1700_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-08-16_0855_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-08-22_1734_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-08-29_1700_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-09-05_1700_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-09-11_1700_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-09-20_1700_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-09-26_1730_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-09-30_1747_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-10-11_1803_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-10-17_1700_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-10-24_1700_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-10-31_1700_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-11-07_1700_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-11-14_1823_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-11-21_1700_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-11-28_1702_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-12-05_1703_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-12-12_1715_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-12-19_1702_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-12-26_1530_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2025-12-31_1745_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-01-09_1711_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-01-16_1702_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-01-23_1709_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-01-30_1711_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-02-06_1701_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-02-28_1730_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-03-06_1703_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-03-13_2039_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-03-20_1743_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-03-27_1708_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-04-03_1702_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-04-03_1721_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-04-10_1728_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-04-10_1732_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-04-17_1707_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-04-24_1804_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-04-30_1703_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-05-09_1712_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-05-09_1712_G5å¼€å‘周报_2026-05-06_--_2026-05-09---2fc4dc86-10a7-4839-9d4f-eb8a0aac0732.txt delete mode 100644 workspace-resume/eml-archive/2026-05-15_1640_2026年第20周工作周报_æ¨è½©---9e8b9b52-9a73-4db1-8ad4-a4ce8729e95a.txt delete mode 100644 workspace-resume/eml-archive/2026-05-15_1640_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-05-15_1641_2026年第20周工作周报_æ¨è½©---c184c1f1-9e60-4100-852d-5b0b03d0bdd1.txt delete mode 100644 workspace-resume/eml-archive/2026-05-15_1641_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-05-15_1714_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-05-15_1714_G5å¼€å‘周报_2026-05-11_--_2026-05-15---61da95c1-1091-4346-90d7-f407fd717364.txt delete mode 100644 workspace-resume/eml-archive/2026-05-22_1713_G5周报.txt delete mode 100644 workspace-resume/eml-archive/2026-05-22_1713_周报_2026å¹´5月18æ—¥_2026å¹´5月22æ—¥---28bff81e-17b9-44d3-9bbf-45875fc0b426.txt create mode 100644 workspace-resume/memory/2026-08-27.md create mode 100644 workspace-resume/okr/parse_okr_to_mysql.py create mode 100644 workspace-resume/weekly-reports/2026/2026-W23-周报.md create mode 100644 workspace-resume/weekly-reports/2026/2026-W24-周报.md create mode 100644 workspace-resume/weekly-reports/2026/2026-W25-周报.md create mode 100644 workspace-resume/weekly-reports/2026/2026-W26-周报.md create mode 100644 workspace-resume/weekly-reports/2026/2026-W27-周报.md create mode 100644 workspace-resume/weekly-reports/2026/2026-W28-周报.md create mode 100644 workspace-resume/weekly-reports/2026/2026-W29-周报.md delete mode 100644 workspace-resume/weekly-reports/2026/2026-W29.md create mode 100644 workspace-resume/weekly-reports/2026/2026-W30-周报.md create mode 100644 workspace-resume/weekly-reports/2026/2026-W32-周报.md create mode 100644 workspace-resume/weekly-reports/2026/2026-W33-周报.md create mode 100644 workspace-resume/weekly-reports/2026/2026-W34-周报.md create mode 100644 workspace-resume/weekly-reports/6-7 月周报补全记录.md create mode 100644 workspace-resume/weekly-reports/README.md create mode 100644 workspace-resume/weekly-reports/import_md_to_db.py create mode 100644 workspace-resume/weekly-reports/migrate_legacy_reports.py create mode 100644 workspace-resume/weekly-reports/migrate_to_mysql.py create mode 100644 workspace-resume/weekly-reports/parse_eml_to_md.py create mode 100644 workspace-resume/weekly-reports/summarize_reports.py create mode 100644 workspace-resume/weekly-reports/sync_reports_db.py create mode 100644 workspace-resume/weekly-reports/sync_reports_to_db.py create mode 100644 workspace-resume/weekly-reports/weekly_reports.db create mode 100644 workspace-resume/weekly-reports/使用指å—.md create mode 100644 workspace-resume/weekly-reports/å®žæ–½å®Œæˆæ€»ç»“.md create mode 100644 workspace-resume/weekly-reports/归档总结.md create mode 100644 workspace-resume/weekly-reports/快速å‚考.md create mode 100644 workspace-resume/weekly-reports/æ··åˆæ–¹æ¡ˆæŒ‡å—.md diff --git a/agents/main/agent/models.json b/agents/main/agent/models.json index 0179d56..68797f5 100644 --- a/agents/main/agent/models.json +++ b/agents/main/agent/models.json @@ -427,45 +427,6 @@ "maxTokens": 384000 } ] - }, - "deepseek": { - "baseUrl": "https://api.deepseek.com/v1", - "apiKey": "DEEPSEEK_API_KEY", - "api": "openai-completions", - "models": [ - { - "id": "deepseek-v4-pro", - "name": "DeepSeek V4 Pro", - "reasoning": false, - "input": [ - "text" - ], - "cost": { - "input": 1, - "output": 2, - "cacheRead": 0, - "cacheWrite": 0 - }, - "contextWindow": 1000000, - "maxTokens": 384000 - }, - { - "id": "deepseek-v4-flash", - "name": "DeepSeek V4 Flash", - "reasoning": false, - "input": [ - "text" - ], - "cost": { - "input": 1, - "output": 2, - "cacheRead": 0, - "cacheWrite": 0 - }, - "contextWindow": 1000000, - "maxTokens": 384000 - } - ] } } } diff --git a/agents/main/agent/plugins/deepseek/catalog.json b/agents/main/agent/plugins/deepseek/catalog.json new file mode 100644 index 0000000..03e7f36 --- /dev/null +++ b/agents/main/agent/plugins/deepseek/catalog.json @@ -0,0 +1,44 @@ +{ + "generatedBy": "openclaw-plugin-model-catalog-v1", + "providers": { + "deepseek": { + "baseUrl": "https://api.deepseek.com/v1", + "models": [ + { + "id": "deepseek-v4-pro", + "name": "DeepSeek V4 Pro", + "reasoning": false, + "input": [ + "text" + ], + "cost": { + "input": 1, + "output": 2, + "cacheRead": 0, + "cacheWrite": 0 + }, + "contextWindow": 1000000, + "maxTokens": 384000 + }, + { + "id": "deepseek-v4-flash", + "name": "DeepSeek V4 Flash", + "reasoning": false, + "input": [ + "text" + ], + "cost": { + "input": 1, + "output": 2, + "cacheRead": 0, + "cacheWrite": 0 + }, + "contextWindow": 1000000, + "maxTokens": 384000 + } + ], + "api": "openai-completions", + "apiKey": "DEEPSEEK_API_KEY" + } + } +} diff --git a/media/inbound/研究院-产å“å¼€å‘部开å‘组-8月OKR-æ¨è½©---dc1717ce-174a-48d7-8c1a-791f028a9ab1.xlsx b/media/inbound/研究院-产å“å¼€å‘部开å‘组-8月OKR-æ¨è½©---dc1717ce-174a-48d7-8c1a-791f028a9ab1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..084116b3eb902af036336efbcc5b7701ebce1287 GIT binary patch literal 15700 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 GCh%USfoMAlI&zDT0a~|8C3(QQ3 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 M)`3@Z9zXB?7q@6@zW@LL literal 0 HcmV?d00001 diff --git a/media/inbound/研究院-维云智造G5-7月OKR-æ¨è½©---31614cd1-38bf-49cc-87a9-cba0b978eef0.xlsx b/media/inbound/研究院-维云智造G5-7月OKR-æ¨è½©---31614cd1-38bf-49cc-87a9-cba0b978eef0.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6aebcc8cb02abbd8528c23ecd3ec73dc20a76eb6 GIT binary patch literal 62134 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

A<@6z+bWQB-2iB_fziKv>l8n@x9NQ%F0x1FU_w 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 KFPL|}@BI%?c4a#N literal 0 HcmV?d00001 diff --git a/media/inbound/维拓科技OKR模æ¿---973c700c-5a0c-477c-84f7-6bd85dd31ee1.md b/media/inbound/维拓科技OKR模æ¿---973c700c-5a0c-477c-84f7-6bd85dd31ee1.md new file mode 100644 index 0000000..eab8245 --- /dev/null +++ b/media/inbound/维拓科技OKR模æ¿---973c700c-5a0c-477c-84f7-6bd85dd31ee1.md @@ -0,0 +1,22 @@ +| 智能制造研究院绩效考评表 | | | | | | | | | | +| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------- | -------------------- | ---------------- | ------------------------------------ | -------- | ---- | ---- | +| å§“å:æ¨è½© å²—ä½ï¼šå¼€å‘ 直接上级:刘强 考核周期: 7月27æ—¥-8月27æ—¥ 考核时间:2026-08-27 | | | | | | | | | | +| 第一部分:任务目标 | | | | | | | | | | +| åºå· | 员工本人填报 | 主管领导填报 | | | | | | | | +| 任务工作 (目标&绩效方å‘) | 关键结果&绩效指标 (指标定义/è¦æ±‚/说明,衡é‡ç›®æ ‡å·¥ä½œçš„关键结果) | å®Œæˆæƒ…况说明 ï¼ˆæœ¬äººå¡«å†™å®Œæˆæƒ…况) | å®Œæˆæƒ…况说明 (上级审核) | 评分 (1-10分) | æƒé‡ % | 得分 | 备注 | | | +| 填写示例 | ä»»åŠ¡ç›®æ ‡ï¼Œæ–¹å‘æ€§æè¿°æ€§çš„语言写明å³å¯ã€‚(上级设置或自己设置) | 具体如何去实现目标,上级认å¯å³å¯ã€‚通过邮件å‘é€è¢«è€ƒæ ¸äººå’Œä¸Šçº§ | 员工本人填写自己æè¿°å³å¯ | 上级评审(直属领导) | 评分(直属领导) | 直属领导根æ®å·¥ä½œé‡è¦ç¨‹åº¦è®¾ç½®æƒé‡æ¯”例 | 最åŽå¾—分 | | | +| 1 | æ ¹æ®å…¬å¸æ•´ä½“é”€å”®ç›®æ ‡è¾¾æˆæƒ…况进行考核,确ä¿ä¸ªäººå·¥ä½œä¸Žå›¢é˜Ÿé”€å”®ç›®æ ‡ä¸€è‡´ | 1ã€ç”±åŽå°ç³»ç»Ÿç»Ÿä¸€èµ‹åˆ† | | | 7 | 50% | 3.5 | | | +| 2 | æ ¹æ®å²—ä½èŒè´£å’Œå…³é”®ç»©æ•ˆæŒ‡æ ‡ï¼ˆKPIï¼‰å®Œæˆæƒ…况进行考核 | 1ã€è¯·ç»“åˆè¯¥å²—ä½å®žé™…工作进行细化 | | | 7 | 25% | 1.75 | | | +| 3 | 评估与其他部门的å作é…åˆèƒ½åŠ›åŠå“应速度 | 1ã€ç§¯æžå“应其他部门的åä½œéœ€æ±‚ï¼ŒåŠæ—¶å›žå¤å’Œå¤„ç†ç›¸å…³äº‹é¡¹ 2ã€ä¸»åŠ¨æ²Ÿé€šï¼Œæ˜Žç¡®éœ€æ±‚ï¼Œç¡®ä¿è·¨éƒ¨é—¨å·¥ä½œæœ‰åºæŽ¨è¿› 3ã€é‡åˆ°é—®é¢˜ä¸»åЍåè°ƒè§£å†³ï¼Œä¸æŽ¨è¯¿æ‰¯çš®ï¼Œä¿æŒè‰¯å¥½å作关系 | | | 7 | 10% | 0.7 | | | +| 4 | 内外æœåŠ¡å¯¹è±¡çš„æ»¡æ„程度 | 1ã€ä»¥å®¢æˆ·ä¸ºä¸­å¿ƒï¼Œè®¤çœŸå¯¹å¾…æ¯ä¸€æ¬¡æœåŠ¡è¯·æ±‚ 2ã€åŠæ—¶å“应客户需求,æä¾›ä¸“业ã€å‹å¥½çš„æœåŠ¡ 3ã€å®šæœŸæ”¶é›†å®¢æˆ·å馈,æŒç»­æ”¹è¿›æœåŠ¡è´¨é‡ | | | 7 | 10% | 0.7 | | | +| 5 | 评估对工作æµç¨‹å’Œè§„范制度的éµå®ˆæƒ…况 | 1ã€ä¸¥æ ¼éµå®ˆå…¬å¸å„项规章制度和æ“作æµç¨‹ 2ã€æŒ‰æ—¶å®Œæˆè€ƒå‹¤æ‰“å¡ã€PMS工时填报等å„项æµç¨‹ 3ã€ä¿å®ˆå…¬å¸æœºå¯†ï¼Œä¸æ³„éœ²ä»»ä½•æ•æ„Ÿä¿¡æ¯ | | | 7 | 5% | 0.35 | | | +| 月度工作补充: | 100.00% | | | | | | | | | +| å¡«å†™è¯´æ˜Žï¼šè¯·é€‰å–æœ€é‡è¦ã€æœ€å…·ä»£è¡¨æ€§çš„任务工作,月度目标设置一般3-6个,根æ®å…·ä½“è®¾ç½®ï¼Œä¸ªäººææŠ¥å®Œæˆæƒ…况,直接上级填写评价和评分,月度评价为综åˆè¯„价结果,å‚考五档说明。 | | | | | | | | | | +| | | 月度评价 | | | | | | | | +| 第二部分:Value | | | | | | | | | | +| åºå· | 考核è¦ç´  | 评价指标 | 分值 | 自评 | | | 考评 | | | +| 员工签字: 上级签字: 部门负责人签字: HRBP签字: | | | | | | | | | | +| 备注: | | | | | | | | | | +| 1ã€å•项分值10,打分å‚è€ƒè¯„åˆ†æ ‡å‡†ï¼Œå°æ•°ç‚¹åŽå¯ä¿ç•™1ä½ï¼› | | | | | | | | | | +| 2ã€ç»©æ•ˆæ–¹å¼ä¸ºæœˆåº¦è€ƒæ ¸ï¼Œé‡‡å–季度考核å¯å‚考月度表跟进;(试用期åªçœ‹æœˆåº¦ï¼‰ | | | | | | | | | | +| 3ã€è€ƒè¯„分五档:6分失望,6.5部分达到预期,7分达到预期,7.5分超出预期,8分榜样,考评结果为6,或V等级为D,ä¸åˆæ ¼ï¼› | | | | | | | | | | \ No newline at end of file diff --git a/workspace-attestations/675ebd4bbbf5213802ade350a2fff111afbca7ad11b9646d0add12e68fed6b95.attested b/workspace-attestations/675ebd4bbbf5213802ade350a2fff111afbca7ad11b9646d0add12e68fed6b95.attested index 2b2512e..c73606b 100644 --- a/workspace-attestations/675ebd4bbbf5213802ade350a2fff111afbca7ad11b9646d0add12e68fed6b95.attested +++ b/workspace-attestations/675ebd4bbbf5213802ade350a2fff111afbca7ad11b9646d0add12e68fed6b95.attested @@ -1,2 +1,2 @@ openclaw-workspace-attestation:v1 -2026-08-21T09:40:00.128Z +2026-08-27T03:08:44.800Z diff --git a/workspace-resume/MEMORY.md b/workspace-resume/MEMORY.md index 4e27212..46c9c83 100644 --- a/workspace-resume/MEMORY.md +++ b/workspace-resume/MEMORY.md @@ -55,3 +55,129 @@ - æ¯å‘¨äº” 17:40,cron job 自动检查钉邮è‰ç¨¿ç®± - è‰ç¨¿ç®±ä¸ºç©º → å·²å‘é€ï¼Œå¿½ç•¥ - è‰ç¨¿ç®±æœ‰æœªå‘é€è‰ç¨¿ → 通过 sessions_send 通知 main agent,由 main agent 钉钉通知用户 + +## 📠周报æŒä¹…化归档(2026-08-27 建立) + +### 归档目的 +- **长期ä¿å­˜**:æ¯å‘¨å‘¨æŠ¥è‡ªåŠ¨å½’æ¡£åˆ°æœ¬åœ°ï¼Œç”¨äºŽæœˆåº¦ã€å¹´åº¦è€ƒæ ¸ +- **快速检索**ï¼šæ”¯æŒæŒ‰å‘¨/月/年汇总,æå–工作内容 +- **åŒé‡ä¿éšœ**:邮件è‰ç¨¿ï¼ˆå‘é€ç”¨ï¼‰+ 本地归档(检索用) +- **æ··åˆæ–¹æ¡ˆ**:Markdown 文件(完整内容)+ SQLite æ•°æ®åº“(元数æ®ç´¢å¼•) + +### 归档目录 +``` +weekly-reports/ +├── README.md # 归档说明 +├── 使用指å—.md # 详细教程 +├── 快速å‚考.md # 快速查阅 +├── æ··åˆæ–¹æ¡ˆæŒ‡å—.md # æ··åˆæ–¹æ¡ˆè¯´æ˜Ž +├── sync_reports_db.py # æ•°æ®åº“åŒæ­¥è„šæœ¬ +├── summarize_reports.py # 汇总工具脚本 +├── weekly_reports.db # SQLite æ•°æ®åº“ +├── 2025/ # 2025 年周报 +│ └── ... +├── 2026/ # 2026 年周报 +│ ├── 2026-W29.md +│ ├── 2026-W31-周报.md +│ └── ... +└── ... +``` + +### 自动归档æµç¨‹ +æ¯å‘¨äº”生æˆå‘¨æŠ¥æ—¶ï¼Œ`send_weekly_report.py` 脚本会: +1. 存入钉邮è‰ç¨¿ç®±ï¼ˆç”¨äºŽå‘é€ï¼‰ +2. **自动ä¿å­˜ Markdown** 到 `weekly-reports/YYYY/YYYY-Www-周报.md`(用于归档,脚本内 `archive_report()` 完æˆï¼‰ +3. **ä¸è‡ªåЍ写 SQLite**——如需入库,需手动跑 `sync_reports_db.py --all` 或 `import_md_to_db.py` + +### 汇总工具用法 +```bash +cd weekly-reports + +# 按周汇总 +python3 summarize_reports.py --week 2026-W31 + +# 按月汇总(用于月度考核) +python3 summarize_reports.py --month 2026-07 + +# 按年汇总(用于年度考核) +python3 summarize_reports.py --year 2026 + +# 自定义日期范围 +python3 summarize_reports.py --range 2026-07-01 2026-09-30 +``` + +### æ•°æ®åº“查询用法 +```bash +cd weekly-reports + +# æŸ¥çœ‹ç»Ÿè®¡ä¿¡æ¯ +python3 sync_reports_db.py --stats + +# åŒæ­¥æ‰€æœ‰å‘¨æŠ¥ +python3 sync_reports_db.py --all + +# SQL 查询 +sqlite3 weekly_reports.db "SELECT * FROM weekly_reports WHERE year = 2026;" +``` + +### 汇总输出 +æ±‡æ€»å·¥å…·ä¼šç”Ÿæˆ Markdown 报告,包å«ï¼š +- 📊 项目汇总(å‚与周次ã€ä¸»è¦ä»»åŠ¡ï¼‰ +- âš ï¸ å­˜åœ¨é—®é¢˜æ±‡æ€» +- 📋 原始周报记录(带文件路径) + +### åŽ†å²æ•°æ® +- 2025-08 ~ 2026-05:已归档到 `weekly-reports/2025-XX/` å’Œ `weekly-reports/2026-XX/` 目录 +- 2026-07 起:使用新的按周归档格å¼ï¼ˆ`YYYY-Www-周报.md`) +- 2026-08-27 起:å¯ç”¨æ··åˆæ–¹æ¡ˆï¼ˆMarkdown + SQLite) + +## ðŸ—„ï¸ MySQL 周报数æ®ä¸­æž¢ï¼ˆ2026-08-27 建立,方案 A) + +### 背景 +用户备有本地 MySQL `resume` 库(简历助手业务库)。ç»ç¡®è®¤ï¼Œå°†å‘¨æŠ¥æ•°æ®åŒæ­¥ä¸º MySQL 统一数æ®ä¸­æž¢ï¼Œä¾›åŽç»­**月度ã€å¹´åº¦æ€»ç»“ã€OKR 分æž**å–æ•°ï¼›æœ¬åœ° SQLite ä¿ç•™åšè½»é‡å½’档。 + +### åŒè½¨ç»“æž„ +``` +å‘¨æŠ¥ç”Ÿæˆ send_weekly_report.py + ├─ å­˜è‰ç¨¿ç®±ï¼ˆé’‰é‚®ï¼‰ + ├─ å½’æ¡£ Markdown → weekly-reports/YYYY/(长期ä¿å­˜ï¼‰ + ├─ SQLite 本地索引(å¯é€‰ï¼Œsync_reports_db.py) + └─ MySQL resume 库 weekly_reports(统一中枢)✅ é»˜è®¤åŒæ­¥ + ↓ + 月度/年度总结 / OKR åˆ†æž â† å…¨éƒ¨ä»Ž MySQL 查 + ``` + +### MySQL é…置与表 +- 连接:`127.0.0.1:3306` root / `resume` åº“ï¼Œå¯†ç  `.env` é”® `MYSQL_PWD` +- 表:`weekly_reports`(主表)ã€`weekly_report_daily`ï¼ˆæ¯æ—¥æ˜Žç»†ï¼‰ã€`weekly_report_problems`(问题) +- 表结构与 SQLite 一致,三张表有外键关è”(report_id) + +### å†™å…¥å…¥å£ +- **æ¯å‘¨ç”Ÿæˆ**:`send_to_drafts()` 默认 `sync_mysql=True` è‡ªåŠ¨åŒæ­¥ï¼ˆ`--no-mysql` 跳过) +- **è¿ç§»è¡¥å†™**:`weekly-reports/migrate_to_mysql.py`(SQLite → MySQL å…¨é‡ï¼Œ`--dry-run` 预览) + +### 当å‰çŠ¶æ€ +- å·²è¿ç§»ï¼š2026-W23 ~ W34 å…± 12 份(G5×9 + G6×3ï¼‰ï¼Œå«æ¯æ—¥æ˜Žç»† 60 æ¡ã€é—®é¢˜ 1 æ¡ï¼ŒSQLite↔MySQL 字节级一致 ✅ +- OKR 相关表(okr_objectives 等)**暂未建**,用户确认åŽç»­å†å¤„ç† +- 历å²å™è¿°å¼ txt(2025-08 ~ 2026-03,39 份)**未è¿ç§»**,格å¼ä¹±+有é‡å¤ï¼Œç”¨æˆ·é€‰æ‹©åªè¿é«˜è´¨é‡æ ¸å¿ƒæ•°æ® + +### OKR 绩效表(2026-08-27 建立) +- **背景**ï¼šç”¨æˆ·å…ˆåŽæä¾› `研究院-维云智造G5-1月OKR-æ¨è½©.xlsx`(旧模æ¿ï¼‰ã€`研究院-产å“å¼€å‘部开å‘组-8月OKR-æ¨è½©.xlsx`(新模æ¿ï¼‰ +- **两张表**(在 resume 库): + - `okr_monthly_records` — 月度主表(assess_monthã€full_nameã€positionã€supervisorã€assess_dateã€monthly_ratingã€source_file) + - `okr_objectives` — 目标明细(record_id 外键ã€seqã€objectiveã€krsã€completionã€scoreã€weightã€weighted_score) +- **已归档**:202601 æ¨è½© 6 项目标(月度评价 7.0);202608 æ¨è½© 5 项目标(新模æ¿ï¼Œè¯„分å‡7.0,月度评价未填 NULL) +- **è§£æžè„šæœ¬**:`okr/parse_okr_to_mysql.py`(读 Excel → 写入 MySQLï¼›`--dry-run` 预览ã€`--month` 指定月ã€`--file` 指定文件) +- **æ”¯æŒæ–°æ—§ä¸¤ç§æ¨¡æ¿ï¼ˆè‡ªåŠ¨è¯†åˆ« detect_template)**: + - 旧模æ¿ï¼ˆ202601 等):多 sheet,æ¯ä¸ª sheet 一个考核月;表头行4,目标行5èµ· 6 项,Båºå·/C目标/E列KR/Få®Œæˆæƒ…况/Iæƒé‡/J加æƒï¼Œæœˆåº¦è¯„价在 J12/B12 + - 新模æ¿ï¼ˆ8æœˆèµ·ï¼Œå• sheet `OKR考核`):表头行5-6,目标行8起(跳过行7示例)5 项,Båºå·/C任务/D关键结果/E完æˆ/G评分/Iæƒé‡/J得分;人员信æ¯åœ¨ B3;跨月周期å–考核期末(7月27æ—¥-8月27日→202608);月度评价(G15等)上级å¯èƒ½æœªå¡«â†’NULL +- **注æ„**:Excel æƒé‡åˆ—æ˜¯å°æ•°ï¼ˆ0.15 等),评分 H/G 列由上级填写 +exampleï¼šæŸ¥è¯¢æŸæœˆ OKR:`SELECT * FROM resume.okr_monthly_records WHERE assess_month='202601';` + +### 查询示例 +```sql +-- 月度总结 +SELECT * FROM resume.weekly_reports WHERE start_date BETWEEN '2026-07-01' AND '2026-07-31'; +-- 年度 +SELECT week_number, main_task FROM resume.weekly_reports WHERE year=2026 ORDER BY week_number; +``` diff --git a/workspace-resume/OKR_模æ¿.md b/workspace-resume/OKR_模æ¿.md new file mode 100644 index 0000000..cd8839f --- /dev/null +++ b/workspace-resume/OKR_模æ¿.md @@ -0,0 +1,58 @@ +# 智能制造研究院绩效考评表 + +**å§“å:** æ¨è½© +**å²—ä½ï¼š** å¼€å‘ +**直接上级:** 刘强 +**考核周期:** 7 月 27 æ—¥ -8 月 27 æ—¥ +**考核时间:** 2026-08-27 + +--- + +## 第一部分:任务目标 + +| åºå· | 任务工作(目标&绩效方å‘) | 关键结果&绩效指标(指标定义/è¦æ±‚/说明) | å®Œæˆæƒ…况说明(本人填写) | å®Œæˆæƒ…况说明(上级审核) | 评分(1-10 分) | æƒé‡% | 得分 | 备注 | +|------|--------------------------|----------------------------------------|------------------------|------------------------|----------------|-------|------|------| +| 1 | æ ¹æ®å…¬å¸æ•´ä½“é”€å”®ç›®æ ‡è¾¾æˆæƒ…况进行考核,确ä¿ä¸ªäººå·¥ä½œä¸Žå›¢é˜Ÿé”€å”®ç›®æ ‡ä¸€è‡´ | 1ã€ç”±åŽå°ç³»ç»Ÿç»Ÿä¸€èµ‹åˆ† | | | 7 | 50% | 3.5 | | +| 2 | æ ¹æ®å²—ä½èŒè´£å’Œå…³é”®ç»©æ•ˆæŒ‡æ ‡ï¼ˆKPIï¼‰å®Œæˆæƒ…况进行考核 | 1ã€è¯·ç»“åˆè¯¥å²—ä½å®žé™…工作进行细化 | | | 7 | 25% | 1.75 | | +| 3 | 评估与其他部门的å作é…åˆèƒ½åŠ›åŠå“应速度 | 1ã€ç§¯æžå“应其他部门的åä½œéœ€æ±‚ï¼ŒåŠæ—¶å›žå¤å’Œå¤„ç†ç›¸å…³äº‹é¡¹
2ã€ä¸»åŠ¨æ²Ÿé€šï¼Œæ˜Žç¡®éœ€æ±‚ï¼Œç¡®ä¿è·¨éƒ¨é—¨å·¥ä½œæœ‰åºæŽ¨è¿›
3ã€é‡åˆ°é—®é¢˜ä¸»åЍåè°ƒè§£å†³ï¼Œä¸æŽ¨è¯¿æ‰¯çš®ï¼Œä¿æŒè‰¯å¥½å作关系 | | | 7 | 10% | 0.7 | | +| 4 | 内外æœåŠ¡å¯¹è±¡çš„æ»¡æ„程度 | 1ã€ä»¥å®¢æˆ·ä¸ºä¸­å¿ƒï¼Œè®¤çœŸå¯¹å¾…æ¯ä¸€æ¬¡æœåŠ¡è¯·æ±‚
2ã€åŠæ—¶å“应客户需求,æä¾›ä¸“业ã€å‹å¥½çš„æœåŠ¡
3ã€å®šæœŸæ”¶é›†å®¢æˆ·å馈,æŒç»­æ”¹è¿›æœåŠ¡è´¨é‡ | | | 7 | 10% | 0.7 | | +| 5 | 评估对工作æµç¨‹å’Œè§„范制度的éµå®ˆæƒ…况 | 1ã€ä¸¥æ ¼éµå®ˆå…¬å¸å„项规章制度和æ“作æµç¨‹
2ã€æŒ‰æ—¶å®Œæˆè€ƒå‹¤æ‰“å¡ã€PMS 工时填报等å„项æµç¨‹
3ã€ä¿å®ˆå…¬å¸æœºå¯†ï¼Œä¸æ³„éœ²ä»»ä½•æ•æ„Ÿä¿¡æ¯ | | | 7 | 5% | 0.35 | | + +**月度工作补充:** 100.00% + +**填写说明:** è¯·é€‰å–æœ€é‡è¦ã€æœ€å…·ä»£è¡¨æ€§çš„任务工作,月度目标设置一般 3-6 个,根æ®å…·ä½“è®¾ç½®ï¼Œä¸ªäººææŠ¥å®Œæˆæƒ…况,直接上级填写评价和评分,月度评价为综åˆè¯„价结果。 + +--- + +## 月度评价 + +| 五档说明 | 分数 | 说明 | +|----------|------|------| +| 失望 | 6 | æœªè¾¾åˆ°åŸºæœ¬è¦æ±‚ | +| 部分达到预期 | 6.5 | 部分工作完æˆï¼Œä½†æœ‰æ˜Žæ˜¾ä¸è¶³ | +| 达到预期 | 7 | æŒ‰è¦æ±‚完æˆå·¥ä½œ | +| 超出预期 | 7.5 | 工作完æˆè´¨é‡è¶…出期望 | +| 榜样 | 8 | 表现优秀,å¯ä½œä¸ºæ ‡æ† | + +**考评规则:** +- å•项分值 10,打分å‚è€ƒè¯„åˆ†æ ‡å‡†ï¼Œå°æ•°ç‚¹åŽå¯ä¿ç•™ 1 ä½ +- 绩效方å¼ä¸ºæœˆåº¦è€ƒæ ¸ï¼Œé‡‡å–季度考核å¯å‚考月度表跟进(试用期åªçœ‹æœˆåº¦ï¼‰ +- 考评结果为 6,或 V 等级为 D,ä¸åˆæ ¼ + +--- + +## 第二部分:Value + +| åºå· | 考核è¦ç´  | 评价指标 | 分值 | 自评 | 考评 | +|------|----------|----------|------|------|------| +| | | | | | | + +--- + +**签字确认:** +- 员工签字:_______________ +- 上级签字:_______________ +- 部门负责人签字:_______________ +- HRBP 签字:_______________ + +**备注:** _______________ diff --git a/workspace-resume/TOOLS.md b/workspace-resume/TOOLS.md index 84ee4b6..fa86075 100644 --- a/workspace-resume/TOOLS.md +++ b/workspace-resume/TOOLS.md @@ -14,10 +14,138 @@ ## 周报脚本 - **路径**:`/home/yangxuan/.openclaw/workspace-resume/send_weekly_report.py` -- **函数**:`send_to_drafts(plain_body, html_body, date_range)` +- **功能**(`send_to_drafts(..., archive=True)` 默认归档): + - 存入钉邮è‰ç¨¿ç®±ï¼ˆç”¨äºŽå‘é€ï¼‰ + - **自动归档 Markdown** 到 `weekly-reports/YYYY/YYYY-Www-周报.md`(长期ä¿å­˜ï¼Œ`archive_report()` 完æˆï¼‰ + - **åŒæ­¥åˆ° MySQL resume 库**(`sync_to_mysql()`,月度/å¹´åº¦æ€»ç»“æ•°æ®æºï¼›`--no-mysql` 跳过) + - **脚本本身ä¸å†™ SQLite**;如需 SQLite 入库,用 `sync_reports_db.py` 或 `import_md_to_db.py` æ‰‹åŠ¨åŒæ­¥ +- **函数**:`send_to_drafts(plain_body, html_body, date_range, project="G5", archive=True)` - **è¯»å– .env**:脚本自动从 `.env` 读å–è´¦å·å¯†ç ï¼ŒæŽ¥å£å‡½æ•°å…¥å‚æ— éœ€ä¼ å¯†ç  - **收件人**:刘强 liuqiang@witsoft.cn(主é€ï¼‰ -- **抄é€**:chenm@witsoft.cn, zengli@witsoft.cn(wurd 已离èŒï¼Œ2026-07-31 移除) +- **抄é€**:chenm@witsoft.cn, zengli@witsoft.cn, yuanq@witsoft.cn +- **命令行用法**: + ```bash + python3 send_weekly_report.py \ + --project G5 \ + --plain "项目å称:..." \ + --html "

...

" \ + --date-range "2026-08-25 ~ 2026-08-29" + ``` + +## 周报汇总工具 + +- **路径**:`/home/yangxuan/.openclaw/workspace-resume/weekly-reports/summarize_reports.py` +- **用途**:从归档的周报中æå–指定时间范围的工作内容,用于月度/年度考核 +- **用法**: + ```bash + cd weekly-reports + + # 按月汇总 + python3 summarize_reports.py --month 2026-07 + + # 按年汇总 + python3 summarize_reports.py --year 2026 + + # 自定义范围 + python3 summarize_reports.py --range 2026-07-01 2026-09-30 + ``` +- **输出**ï¼šç”Ÿæˆ `summary_YYYYMMDD_HHMMSS.md` 汇总报告 + +## 周报数æ®åº“ï¼ˆæ··åˆæ–¹æ¡ˆï¼‰ + +- **æ•°æ®åº“**:`weekly-reports/weekly_reports.db`(SQLite) +- **åŒæ­¥è„šæœ¬**:`weekly-reports/sync_reports_db.py` +- **用途**:存储周报元数æ®ï¼Œæ”¯æŒå¿«é€ŸæŸ¥è¯¢å’Œç»Ÿè®¡ +- **用法**: + ```bash + cd weekly-reports + + # åŒæ­¥æ‰€æœ‰å‘¨æŠ¥ + python3 sync_reports_db.py --all + + # æŸ¥çœ‹ç»Ÿè®¡ä¿¡æ¯ + python3 sync_reports_db.py --stats + + # SQL 查询 + sqlite3 weekly_reports.db "SELECT * FROM weekly_reports WHERE year = 2026;" + ``` +- **表结构**: + - `weekly_reports` - 周报元数æ®ï¼ˆå¹´ä»½ã€å‘¨æ•°ã€é¡¹ç›®ã€ä¸»è¦ä»»åŠ¡ç­‰ï¼‰ + - `weekly_report_daily` - æ¯æ—¥å·¥ä½œæ˜Žç»† + - `weekly_report_problems` - 问题记录 +- **备份**:数æ®åº“文件éšå·¥ä½œç©ºé—´ä¸€èµ·å¤‡ä»½ï¼Œæˆ–导出为 SQL + +## 周报归档目录 + +- **ä½ç½®**:`/home/yangxuan/.openclaw/workspace-resume/weekly-reports/` +- **结构**: + - `2025-XX/` - 2025 年历å²å‘¨æŠ¥ï¼ˆæ—§æ ¼å¼ .txt) + - `2026/` - 2026 å¹´èµ·å‘¨æŠ¥ï¼ˆæ–°æ ¼å¼ .md,按周归档) + - `README.md` - 归档说明 + - `使用指å—.md` - 详细教程 + - `快速å‚考.md` - 快速å‚考å¡ç‰‡ + - `æ··åˆæ–¹æ¡ˆæŒ‡å—.md` - æ··åˆæ–¹æ¡ˆè¯´æ˜Ž +- **命忠¼å¼**:`YYYY-Www-周报.md`(如 `2026-W31-周报.md`) + +## MySQL 周报数æ®ä¸­æž¢ï¼ˆ2026-08-27 建立) + +方案 A:**SQLite åšæœ¬åœ°å½’档,MySQL resume 库åšç»Ÿä¸€æ•°æ®ä¸­æž¢**(供月度/年度总结ã€OKR 分æžï¼‰ã€‚ + +- **MySQL 连接**:`127.0.0.1:3306`,用户 `root`,库 `resume`,密ç å­˜ `.env` é”® `MYSQL_PWD` +- **三张周报表**(在 `resume` 库): + - `weekly_reports` — 主表(yearã€week_numberã€projectã€start_date/end_dateã€main_taskã€has_problems) + - `weekly_report_daily` — æ¯æ—¥æ˜Žç»†ï¼ˆreport_idã€day_of_weekã€work_dateã€work_items) + - `weekly_report_problems` — 问题记录(report_idã€problem_descriptionã€status) +- **写入入å£**: + - `send_to_drafts()` é»˜è®¤åŒæ­¥ï¼ˆ`sync_to_mysql`),`--no-mysql` 跳过 + - è¿ç§»è¡¥å†™ï¼š`weekly-reports/migrate_to_mysql.py`(SQLite → MySQL å…¨é‡ï¼Œ`--dry-run` 预览) +- **月度/年度总结查询示例**: + ```sql + -- 月度 + SELECT * FROM resume.weekly_reports WHERE start_date BETWEEN '2026-07-01' AND '2026-07-31'; + -- 年度 + SELECT week_number, main_task FROM resume.weekly_reports WHERE year=2026 ORDER BY week_number; + ``` +- **注æ„**:周报表在业务库 resume 中,勿与简历业务表(resumesã€company_* 等)混用;二者用途ä¸åŒ + +## 周报邮件 eml è§£æžå½’档工具(2026-08-27 添加) + +用于从下载的钉邮周报 eml 文件批é‡è¡¥å…¨å½’档缺失周报。 + +- **eml 所在目录**:`/home/yangxuan/.openclaw/media/inbound/`(附件上传åŽè‡ªåЍè½ç›˜ï¼‰ +- **è§£æžè„šæœ¬**:`weekly-reports/parse_eml_to_md.py` —— è¯»å– inbound 下所有 .emlï¼Œè§£ç  base64 æ­£æ–‡ï¼Œç”Ÿæˆæ ‡å‡†æ ¼å¼ `2026/2026-Www-周报.md` +- **入库脚本**:`weekly-reports/import_md_to_db.py` —— 读生æˆçš„ Markdown é‡å»º SQLite æ•°æ®ï¼ˆä¸»è¡¨+æ¯æ—¥æ˜Žç»†+问题),自动覆盖旧å ä½è®°å½• +- **用法**: + ```bash + cd weekly-reports + python3 parse_eml_to_md.py # eml → Markdown + python3 import_md_to_db.py # Markdown → SQLite + ``` +- **è§£æžé€»è¾‘è¦ç‚¹**: + - 邮件为 multipartï¼Œå– text/plain 部分 base64 è§£ç  + - æ—¥æœŸè¡Œæ”¯æŒ `周一(2026-06-08)`/`周一(06-08)`/带 📅 emoji å‰ç¼€ + - 列表项 `*` 与文字å¯èƒ½è¢«æ‹†ä¸¤è¡Œï¼Œå·²å¤„ç† + - é—®é¢˜åŒºä»…åœ¨ã€Œå­˜åœ¨é—®é¢˜ã€æ ‡é¢˜åŽæå–,`æ— /暂无` ä¸ç®—问题;`下周计划` ç­‰å°æ ‡é¢˜é€€å‡ºé—®é¢˜åŒº + - é¡¹ç›®åæ®å†…å®¹è‡ªåŠ¨åˆ¤ G5/G6 +- **注æ„**:脚本会**å…¨é‡é‡å»º 2026 å¹´æ•°æ®åº“**,覆盖旧å ä½è®°å½•ï¼Œåˆ«åœ¨æœ‰æœªå½’æ¡£æ•°æ®æ—¶è¯¯è·‘ + +## OKR 绩效归档工具(2026-08-27 添加) + +用于将研究院-维云智造 OKR 绩效 Excel(æ¨è½©ï¼‰è§£æžå½’档到 MySQL resume 库。 + +- **脚本**:`okr/parse_okr_to_mysql.py` +- **Excel ä½ç½®**:`/home/yangxuan/.openclaw/media/inbound/*OKR*.xlsx`(或命令行 `--file` 指定路径) +- **用法**: + ```bash + cd okr + python3 parse_okr_to_mysql.py --month 202601 # 归档指定月 + python3 parse_okr_to_mysql.py --file --dry-run # 指定文件+预览ä¸å†™å…¥ + ``` +- **表**(MySQL resume 库):`okr_monthly_records`(主)+ `okr_objectives`(目标明细) +- **æ”¯æŒæ–°æ—§ä¸¤ç§æ¨¡æ¿**(自动识别): + - 旧模æ¿ï¼ˆ202601 等):多 sheet,æ¯ä¸ª sheet 一个考核月;表头行4,目标行5èµ· 6 项,月度评价在 J12/B12 + - 新模æ¿ï¼ˆ8æœˆèµ·ï¼‰ï¼šå• sheet `OKR考核`;表头行5-6,目标行8起(跳过行7示例)5 项,Båºå·/C任务/D关键结果/E完æˆ/G评分/Iæƒé‡/J得分;人员信æ¯åœ¨ B3;跨月周期å–考核期末(如 7月27æ—¥-8月27日→202608);月度评价字段上级å¯èƒ½æœªå¡«ï¼ˆNULL) +- **Excel 结构(旧模æ¿ï¼‰**:一个文件多 sheet(202511/202512/202601/...),æ¯ä¸ª sheet 一个考核月## 技能 ## 技能 diff --git a/workspace-resume/db/resume.db b/workspace-resume/db/resume.db new file mode 100644 index 0000000..e69de29 diff --git a/workspace-resume/db/weekly_reports_schema.sql b/workspace-resume/db/weekly_reports_schema.sql new file mode 100644 index 0000000..7f6bf1b --- /dev/null +++ b/workspace-resume/db/weekly_reports_schema.sql @@ -0,0 +1,93 @@ +-- 周报元数æ®è¡¨ï¼ˆç”¨äºŽå¿«é€ŸæŸ¥è¯¢å’Œç»Ÿè®¡ï¼‰ +-- 2026-08-27 创建 + +CREATE TABLE IF NOT EXISTS `weekly_reports` ( + `id` INT NOT NULL AUTO_INCREMENT, + `year` INT NOT NULL COMMENT '年份', + `week_number` INT NOT NULL COMMENT '周数 (1-53)', + `start_date` DATE NOT NULL COMMENT '周一日期', + `end_date` DATE NOT NULL COMMENT '周五日期', + `project` VARCHAR(50) NOT NULL COMMENT '项目åç§° (如 G5/G6)', + `main_task` VARCHAR(500) COMMENT '本周主è¦ä»»åŠ¡', + `file_path` VARCHAR(255) NOT NULL COMMENT '归档文件路径', + `has_problems` TINYINT(1) DEFAULT 0 COMMENT '是å¦å­˜åœ¨é—®é¢˜', + `word_count` INT DEFAULT 0 COMMENT '字数统计', + `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, + `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + + PRIMARY KEY (`id`), + UNIQUE KEY `uk_year_week` (`year`, `week_number`, `project`), + KEY `idx_date` (`start_date`, `end_date`), + KEY `idx_project` (`project`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='周报元数æ®è¡¨'; + +-- å‘¨æŠ¥æ¯æ—¥å·¥ä½œæ˜Žç»†è¡¨ï¼ˆå¯é€‰ï¼Œç”¨äºŽæ›´ç»†ç²’度的查询) +CREATE TABLE IF NOT EXISTS `weekly_report_daily` ( + `id` INT NOT NULL AUTO_INCREMENT, + `report_id` INT NOT NULL COMMENT '周报 ID', + `day_of_week` TINYINT NOT NULL COMMENT '星期几 (1-5)', + `work_date` DATE NOT NULL COMMENT '具体日期', + `work_items` TEXT COMMENT '工作内容列表 (JSON 数组或æ¢è¡Œåˆ†éš”)', + `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, + + PRIMARY KEY (`id`), + KEY `idx_report` (`report_id`), + KEY `idx_date` (`work_date`), + CONSTRAINT `fk_report` FOREIGN KEY (`report_id`) REFERENCES `weekly_reports` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='å‘¨æŠ¥æ¯æ—¥å·¥ä½œæ˜Žç»†è¡¨'; + +-- 周报问题记录表(å¯é€‰ï¼Œç”¨äºŽé—®é¢˜è¿½è¸ªï¼‰ +CREATE TABLE IF NOT EXISTS `weekly_report_problems` ( + `id` INT NOT NULL AUTO_INCREMENT, + `report_id` INT NOT NULL COMMENT '周报 ID', + `problem_description` TEXT NOT NULL COMMENT '问题æè¿°', + `status` VARCHAR(20) DEFAULT 'open' COMMENT '状æ€ï¼šopen/resolved/closed', + `resolved_at` DATETIME NULL COMMENT '解决时间', + `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, + + PRIMARY KEY (`id`), + KEY `idx_report` (`report_id`), + CONSTRAINT `fk_problem_report` FOREIGN KEY (`report_id`) REFERENCES `weekly_reports` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='周报问题记录表'; + +-- ç¤ºä¾‹æ•°æ® +INSERT INTO `weekly_reports` (`year`, `week_number`, `start_date`, `end_date`, `project`, `main_task`, `file_path`, `has_problems`, `word_count`) +VALUES + (2026, 29, '2026-07-14', '2026-07-18', 'G5', '库存预警模å—å¼€å‘', 'weekly-reports/2026/2026-W29.md', 0, 500), + (2026, 31, '2026-07-28', '2026-08-01', 'G5', '委外呿–™éœ€æ±‚å¼€å‘', 'weekly-reports/2026/2026-W31-周报.md', 0, 600); + +-- 常用查询示例 + +-- 1. 查询æŸå¹´æ‰€æœ‰å‘¨æŠ¥ +SELECT * FROM weekly_reports WHERE year = 2026 ORDER BY week_number; + +-- 2. æŸ¥è¯¢æŸæœˆæ‰€æœ‰å‘¨æŠ¥ +SELECT * FROM weekly_reports +WHERE start_date >= '2026-08-01' AND end_date <= '2026-08-31' +ORDER BY start_date; + +-- 3. 统计æŸé¡¹ç›®å…¨å¹´å‘¨æŠ¥æ•°é‡ +SELECT project, COUNT(*) as report_count +FROM weekly_reports +WHERE year = 2026 +GROUP BY project; + +-- 4. 查询存在问题的周报 +SELECT * FROM weekly_reports WHERE has_problems = 1; + +-- 5. æŸ¥è¯¢æŸæ—¶é—´èŒƒå›´çš„工作天数 +SELECT SUM(day_of_week) as total_days +FROM weekly_report_daily +WHERE work_date BETWEEN '2026-07-01' AND '2026-09-30'; + +-- 6. 月度统计(用于考核) +SELECT + YEAR(start_date) as year, + MONTH(start_date) as month, + project, + COUNT(*) as weeks_count, + SUM(has_problems) as problem_weeks, + AVG(word_count) as avg_words +FROM weekly_reports +WHERE start_date >= '2026-08-01' AND start_date <= '2026-08-31' +GROUP BY YEAR(start_date), MONTH(start_date), project; diff --git a/workspace-resume/eml-archive/2025-08-01_1700_G5周报.txt b/workspace-resume/eml-archive/2025-08-01_1700_G5周报.txt deleted file mode 100644 index 3db235f..0000000 --- a/workspace-resume/eml-archive/2025-08-01_1700_G5周报.txt +++ /dev/null @@ -1,23 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周(2025.07.28-08.01)的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®åЍæ€å­—段需求测试结æŸ,已与销售模å—è”调结æŸ.主数æ®5.1.2版本本周上线. -任务2:G3å­˜è´§ç®¡ç†æµ‹è¯•结æŸ,2025å¹´7月30日进入准生产验è¯é˜¶æ®µ. -常规工作 -日常事务1:2025-07-29 主数æ®åЍæ€å­—段优化 -日常事务2:2025-07-30 存货管ç†å‡†ç”Ÿäº§éªŒè¯ä¼˜åŒ– -日常事务3:2025-07-31 存货管ç†å‡†ç”Ÿäº§éªŒè¯æ”¯æŒ -日常事务4:5.1.3ç‰ˆæœ¬éœ€æ±‚è¯„å®¡ä¸Žå¼€å‘æ–¹æ¡ˆè®¾è®¡ -存在问题或需支æŒäº‹é¡¹ -æ—  -二ã€ä¸‹å‘¨å·¥ä½œè®¡åˆ’ -é‡ç‚¹ä»»åŠ¡ -计划1:G5主数æ®ä¼˜åŒ–éœ€æ±‚å¼€å‘ -计划2:G3存货管ç†å®¢æˆ·è¯•ç”¨å¼€å‘æ”¯æ’‘ -其他事项 -æ—  -备注:无 -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—äº¬è½¯ä»¶è°·è½¯ä»¶å¤§é“ 11 å·èŠ±ç¥žå¤§åŽ¦ 2-3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-08-08_1700_G5周报.txt b/workspace-resume/eml-archive/2025-08-08_1700_G5周报.txt deleted file mode 100644 index 989551b..0000000 --- a/workspace-resume/eml-archive/2025-08-08_1700_G5周报.txt +++ /dev/null @@ -1,24 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®ä¼˜åŒ–需求 -任务2:G5主数æ®ç‰©æ–™ä¿¡æ¯åŠ¨æ€æ¨¡æ¿å¯¼å…¥ -常规工作 -日常事务1:2025-08-04 ç‰©æ–™ä¿¡æ¯æ”¯æŒå¤šé™„件上传 仓库工åºå…³è”å–æ¶ˆè½¦é—´è”级选择 ä¸šåŠ¡å‚æ•°é…置优化 替æ¢ç‰©æ–™å¢žåŠ æ›¿æ¢æ•°é‡ -日常事务2:2025-08-05 动æ€ç”Ÿæˆå¯¼å…¥æ¨¡æ¿ä¸Žè§£æž -日常事务3:2025-08-06 动æ€å­—段校验与格å¼åŒ– -日常事务4:2025-08-07 物料信æ¯å¯¼å‡ºç¤ºä¾‹ -日常事务5:2025-08-08 ç‰©æ–™ä¿¡æ¯æ‰¹é‡å¯¼å…¥æ¨¡æ¿ä¸Žè§£æž -存在问题或需支æŒäº‹é¡¹ -动æ€å­—段导入导出问题较多,2025-08-09加ç­è§£å†³ -二ã€ä¸‹å‘¨å·¥ä½œè®¡åˆ’ -é‡ç‚¹ä»»åŠ¡ -计划1:G5主数æ®ç‰©æ–™ä¿¡æ¯åЍæ€å­—æ®µå¯¼å…¥éœ€æ±‚è‡ªæµ‹è½¬æµ‹ç»“æŸ -计划2:G5主数æ®5.1.4版本开大 -其他事项 -æ—  -备注:无 -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—äº¬è½¯ä»¶è°·è½¯ä»¶å¤§é“ 11 å·èŠ±ç¥žå¤§åŽ¦ 2-3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-08-16_0855_G5周报.txt b/workspace-resume/eml-archive/2025-08-16_0855_G5周报.txt deleted file mode 100644 index 445d8ec..0000000 --- a/workspace-resume/eml-archive/2025-08-16_0855_G5周报.txt +++ /dev/null @@ -1,24 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®ä¼˜åŒ–需求 -任务2:G5主数æ®ç‰©æ–™ä¿¡æ¯å¯¼å…¥å¯¼å‡ºå¯¼å‡ºç¤ºä¾‹è½¬æµ‹bugä¿®å¤ -常规工作 -日常事务1:2025-08-11 主数æ®éƒ¨åˆ†éœ€æ±‚转测 -日常事务2:2025-08-12 bugä¿®å¤ å¯¼å…¥æ¨¡æ¿å¢žåŠ ä¸‹æ‹‰ä»¥åŠå¯¼å…¥æ•°æ®å­—典校验通用方法 -日常事务3:2025-08-13 物料信æ¯å¯¼å…¥é—®é¢˜ä¿®å¤ -日常事务4:2025-08-14 调休 bugä¿®å¤ -日常事务5:2025-08-15 调休 bugä¿®å¤ -存在问题或需支æŒäº‹é¡¹ -2025-08-15 生产问题排查 -二ã€ä¸‹å‘¨å·¥ä½œè®¡åˆ’ -é‡ç‚¹ä»»åŠ¡ -计划1:G5主数æ®ä¼˜åŒ–éœ€æ±‚æµ‹è¯•ç»“æŸ -计划2:G5主数æ®5.1.5ç‰ˆæœ¬éœ€æ±‚è¯„å®¡å’Œå¼€å‘æ–¹æ¡ˆç¼–写 -其他事项 -æ—  -备注:无 -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—äº¬è½¯ä»¶è°·è½¯ä»¶å¤§é“ 11 å·èŠ±ç¥žå¤§åŽ¦ 2-3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-08-22_1734_G5周报.txt b/workspace-resume/eml-archive/2025-08-22_1734_G5周报.txt deleted file mode 100644 index 38df6a4..0000000 --- a/workspace-resume/eml-archive/2025-08-22_1734_G5周报.txt +++ /dev/null @@ -1,21 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.1.4ç‰ˆæœ¬æµ‹è¯•å®Œæˆ -任务2:G5主数æ®ç‰©æ–™ä¿¡æ¯å¯¼å…¥æ€§èƒ½ä¼˜åŒ– -常规工作 -日常事务1:2025-08-18 ä¸»æ•°æ®æµ‹è¯•bugä¿®å¤ -日常事务2:2025-08-19 主数æ®éœ€æ±‚æµ‹è¯•å®Œæˆ -日常事务3:2025-08-20 ç‰©æ–™ä¿¡æ¯æ€§èƒ½ä¼˜åŒ–-åŒæ­¥æ ¡éªŒå¼‚步入库 -日常事务4:2025-08-21 会计期间自测 è”è°ƒ 转测 bugä¿®å¤ -日常事务5:2025-08-22 主数æ®ç‰©æ–™å¯¹å¤–接å£å¼€å‘,éœ€æ±‚åˆ†æž -存在问题或需支æŒäº‹é¡¹ -é…åˆæŽ’ç”Ÿäº§æŸ¥æ€§èƒ½é—®é¢˜ -二ã€ä¸‹å‘¨å·¥ä½œè®¡åˆ’ -é‡ç‚¹ä»»åŠ¡ -计划1:G5主数æ®5.1.5ç‰ˆæœ¬å¼€å‘ -备注:无 -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—äº¬è½¯ä»¶è°·è½¯ä»¶å¤§é“ 11 å·èŠ±ç¥žå¤§åŽ¦ 2-3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-08-29_1700_G5周报.txt b/workspace-resume/eml-archive/2025-08-29_1700_G5周报.txt deleted file mode 100644 index 8fc0ace..0000000 --- a/workspace-resume/eml-archive/2025-08-29_1700_G5周报.txt +++ /dev/null @@ -1,20 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.1.5版本å‘布 -任务2:G5主数æ®ç‰©æ–™ä¿¡æ¯å¯¼å…¥æ€§èƒ½ä¼˜åŒ–å®Œæˆ -常规工作 -日常事务1:2025-08-25 对外接å£å¼€å‘,导入性能优化 -日常事务2:2025-08-26 主数æ®éžæŽ¥å£éœ€æ±‚全部转测 -日常事务3:2025-08-27 主数æ®å¯¹å¤–接å£å¼€å‘ -日常事务4:2025-08-28 主数æ®ç‰©æ–™å¯¼å…¥æµ‹è¯•å®Œæˆ -日常事务5:2025-08-29 主数æ®5.1.5æµ‹è¯•ç»“æŸ å‘ç‰ˆæ”¯æŒ -存在问题或需支æŒäº‹é¡¹ -二ã€ä¸‹å‘¨å·¥ä½œè®¡åˆ’ -é‡ç‚¹ä»»åŠ¡ -计划1:G5主数æ®5.1.6ç‰ˆæœ¬å¼€å‘ -备注:无 -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—äº¬è½¯ä»¶è°·è½¯ä»¶å¤§é“ 11 å·èŠ±ç¥žå¤§åŽ¦ 2-3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-09-05_1700_G5周报.txt b/workspace-resume/eml-archive/2025-09-05_1700_G5周报.txt deleted file mode 100644 index 98e5e3d..0000000 --- a/workspace-resume/eml-archive/2025-09-05_1700_G5周报.txt +++ /dev/null @@ -1,20 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.1.6ç‰ˆæœ¬å¼€å‘ -任务2:G5主数æ®å¯¹å¤–接å£ç¡®è®¤å’Œå¼€å‘ -常规工作 -日常事务1:2025-09-01 主数æ®éœ€æ±‚评审和接å£å¼€å‘ -日常事务2:2025-09-02 物料清å•生æˆä¼˜åŒ–和导入 -日常事务3:2025-09-03 物料清å•生æˆä¼˜åŒ–æµ‹è¯•å®Œæˆ -日常事务4:2025-09-04 主数æ®éœ€æ±‚转测和bugä¿®å¤ -日常事务5:2025-09-05 测试bugä¿®å¤ä¸ŽæŽ¥å£å¼€å‘ -存在问题或需支æŒäº‹é¡¹ -二ã€ä¸‹å‘¨å·¥ä½œè®¡åˆ’ -é‡ç‚¹ä»»åŠ¡ -计划1:G5主数æ®å¯¹å¤–接å£å¼€å‘ -备注:无 -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—äº¬è½¯ä»¶è°·è½¯ä»¶å¤§é“ 11 å·èŠ±ç¥žå¤§åŽ¦ 2-3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-09-11_1700_G5周报.txt b/workspace-resume/eml-archive/2025-09-11_1700_G5周报.txt deleted file mode 100644 index f668c43..0000000 --- a/workspace-resume/eml-archive/2025-09-11_1700_G5周报.txt +++ /dev/null @@ -1,20 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.1.6ç‰ˆæœ¬å¼€å‘ -任务2:G5主数æ®å¯¹å¤–接å£ç¡®è®¤å’Œå¼€å‘ -常规工作 -日常事务1:2025-09-08 bugä¿®å¤ æŽ¥å£å¼€å‘ -日常事务2:2025-09-09 主数æ®å¯¹å¤–接å£å¼€å‘ -日常事务3:2025-09-10 主数æ®å¯¹å¤–接å£ä¸­ç‰©æ–™ä¿¡æ¯æ–°å¢žæŽ¥å£æ•´ä½“å¼€å‘ -日常事务4:2025-09-11 主数æ®ç‰©æ–™ä¿¡æ¯å¯¹å¤–接å£ä¼˜åŒ–å’Œbugä¿®å¤ -存在问题或需支æŒäº‹é¡¹ -2025-09-08 底座æœåС异叏(6h) 导致开å‘进度推迟 需è¦åŽ‹ç¼©æµ‹è¯•æ—¶é—´ -二ã€ä¸‹å‘¨å·¥ä½œè®¡åˆ’ -é‡ç‚¹ä»»åŠ¡ -计划1:G5主数æ®å¯¹å¤–接å£å¼€å‘ -备注:无 -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—äº¬è½¯ä»¶è°·è½¯ä»¶å¤§é“ 11 å·èŠ±ç¥žå¤§åŽ¦ 2-3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-09-20_1700_G5周报.txt b/workspace-resume/eml-archive/2025-09-20_1700_G5周报.txt deleted file mode 100644 index d637d4b..0000000 --- a/workspace-resume/eml-archive/2025-09-20_1700_G5周报.txt +++ /dev/null @@ -1,32 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.2.0ç‰ˆæœ¬å¼€å‘ -任务2:G5主数æ®å¯¹å¤–接å£å¼€å‘和测试 -常规工作 -日常事务1:2025-09-15 主数æ®å¯¹å¤–接å£å¼€å‘-产å“客户价目表 -日常事务2:2025-09-16 æ–°æ–¹æ¡ˆæ”¹é€ æ‰€æœ‰æŸ¥è¯¢æŽ¥å£ ç‰©æ–™æŽ¥å£å¼€å‘转测 -日常事务3:2025-09-17 -ã€ä»“库模型】新增/编辑 é€‰æ‹©å·¥åºæ—¶ï¼Œæ”¯æŒæŒ‰å·¥åºä»£ç å’Œå·¥åºå称进行æœç´¢ -ã€ç‰©æ–™ä¿¡æ¯ã€‘ç‰©æ–™ä¿¡æ¯æ–°å¢žã€ç¼–辑页é¢ï¼Œã€æ—¥äº§èƒ½ã€æœ‰æ•ˆæœŸ(天)ã€å¤éªŒæœŸ(天)】字段å‰ç«¯å¢žåŠ é•¿åº¦çº¦æŸï¼› -ã€ç‰©æ–™ä¿¡æ¯ã€‘物料信æ¯çš„导出时查询 -物料信æ¯ä¸Žå•使¢ç®—åŒæ­¥å¼€å‘方案设计评审 -日常事务4:2025-09-18 物料信æ¯åŒæ­¥ç”Ÿæˆå•ä½è½¬æ¢éœ€æ±‚å¼€å‘自测转测 外部接å£bugä¿®å¤ -日常事务4:2025-09-19 -主数æ®å¯¹å¤–接å£ç»Ÿä¸€æ–‡æ¡£ç»Ÿä¸€çº¦æŸ -ç»†åŒ–å¯¹åº”æŽ¥å£æ–‡æ¡£ -ç»Ÿä¸€å¤„ç†æ­£åˆ™ 区分与web和导入 -转测bugä¿®å¤ -日常事务4:2025-09-20 -主数æ®ç‰©æ–™æŽ¥å£æµ‹è¯•完æˆ, -å®¢æˆ·æŽ¥å£æ–‡æ¡£,自测,转测 -ä¾›åº”å•†æŽ¥å£æ–‡æ¡£,自测,转测 -二ã€ä¸‹å‘¨å·¥ä½œè®¡åˆ’ -é‡ç‚¹ä»»åŠ¡ -计划1:G5主数æ®å¯¹å¤–接å£å¼€å‘ -计划2: 5.2.0ç‰ˆæœ¬æµ‹è¯•å®Œæˆ -备注:无 -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—äº¬è½¯ä»¶è°·è½¯ä»¶å¤§é“ 11 å·èŠ±ç¥žå¤§åŽ¦ 2-3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-09-26_1730_G5周报.txt b/workspace-resume/eml-archive/2025-09-26_1730_G5周报.txt deleted file mode 100644 index 4bce53d..0000000 --- a/workspace-resume/eml-archive/2025-09-26_1730_G5周报.txt +++ /dev/null @@ -1,22 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.2.0ç‰ˆæœ¬å¼€å‘æµ‹è¯•ç»“æŸ -任务2:G5主数æ®å¯¹å¤–接å£å¼€å‘和测试 -常规工作 -日常事务1:2025-09-22 转测bugä¿®å¤,BOM接å£å¼€å‘ -日常事务2:2025-09-23 测试bugä¿®å¤ -日常事务3:2025-09-24 -需求测试完毕 -æŽ¥å£æµ‹è¯•bugä¿® -日常事务4:2025-09-25 å®¢æˆ·æŽ¥å£æµ‹è¯•完毕,ä¾›åº”å•†æŽ¥å£æµ‹è¯• -日常事务5:2025-09-26 系统BOM和物料清å•分æžä¸Žå¯¹å¤–接å£å¼€å‘方案设计评审 -二ã€ä¸‹å‘¨å·¥ä½œè®¡åˆ’ -é‡ç‚¹ä»»åŠ¡ -计划1:G5主数æ®å¯¹å¤–接å£å¼€å‘ -计划2: 5.2.1ç‰ˆæœ¬å¼€å‘ -备注:无 -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—äº¬è½¯ä»¶è°·è½¯ä»¶å¤§é“ 11 å·èŠ±ç¥žå¤§åŽ¦ 2-3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-09-30_1747_G5周报.txt b/workspace-resume/eml-archive/2025-09-30_1747_G5周报.txt deleted file mode 100644 index 51c9b96..0000000 --- a/workspace-resume/eml-archive/2025-09-30_1747_G5周报.txt +++ /dev/null @@ -1,18 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.2.1ç‰ˆæœ¬å¼€å‘ -任务2:G5主数æ®å¯¹å¤–接å£å¼€å‘和测试 -常规工作 -日常事务1:2025-09-28 BOMæŽ¥å£æ–¹æ¡ˆè®¾è®¡è¯„å®¡å’ŒæŽ¥å£æ”¹é€  -日常事务2:2025-09-29 产å“å·¥è‰ºæŽ¥å£æ–¹æ¡ˆè®¾è®¡ã€è¯„å®¡å’Œå¼€å‘ -日常事务3:2025-09-30 外部接å£bugä¿®å¤ -二ã€ä¸‹å‘¨å·¥ä½œè®¡åˆ’ -é‡ç‚¹ä»»åŠ¡ -计划1:G5主数æ®å¯¹å¤–接å£å¼€å‘ -计划2: 5.2.1ç‰ˆæœ¬å¼€å‘ -备注:无 -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—äº¬è½¯ä»¶è°·è½¯ä»¶å¤§é“ 11 å·èŠ±ç¥žå¤§åŽ¦ 2-3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-10-11_1803_G5周报.txt b/workspace-resume/eml-archive/2025-10-11_1803_G5周报.txt deleted file mode 100644 index dc07f07..0000000 --- a/workspace-resume/eml-archive/2025-10-11_1803_G5周报.txt +++ /dev/null @@ -1,18 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.2.1ç‰ˆæœ¬å¼€å‘ -任务2:G5主数æ®å¯¹å¤–接å£å¼€å‘和测试 -常规工作 -日常事务1:2025-10-09 主数æ®éœ€æ±‚评审和对外接å£å¼€å‘ -日常事务2:2025-10-10 å•使¢ç®—统一管ç†éœ€æ±‚方案评审和开å‘è”è°ƒ -日常事务3:2025-10-11 主数æ®éœ€æ±‚å¼€å‘å’Œå•使¢ç®—å…³è”需求转测 -二ã€ä¸‹å‘¨å·¥ä½œè®¡åˆ’ -é‡ç‚¹ä»»åŠ¡ -计划1:G5主数æ®å¯¹å¤–接å£å¼€å‘ -计划2: 5.2.1ç‰ˆæœ¬å¼€å‘ -备注:无 -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—äº¬è½¯ä»¶è°·è½¯ä»¶å¤§é“ 11 å·èŠ±ç¥žå¤§åŽ¦ 2-3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-10-17_1700_G5周报.txt b/workspace-resume/eml-archive/2025-10-17_1700_G5周报.txt deleted file mode 100644 index f51ff5e..0000000 --- a/workspace-resume/eml-archive/2025-10-17_1700_G5周报.txt +++ /dev/null @@ -1,19 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.2.1ç‰ˆæœ¬å¼€å‘ -任务2:G5主数æ®å¯¹å¤–æŽ¥å£æµ‹è¯•å®Œæˆ -常规工作 -日常事务1:2025-10-13 主数æ®é¡µé¢éœ€æ±‚转测bugä¿®å¤ -日常事务2:2025-10-14 主数æ®å¤–部接å£å¼€å‘ -日常事务3:2025-10-15 主数æ®å¤–éƒ¨æŽ¥å£æµ‹è¯•用例评审和bugä¿®å¤ -日常事务4:2025-10-16 主数æ®å¯¹å¤–æŽ¥å£æµ‹è¯•ï¼Œé—®é¢˜ä¿®å¤ -日常事务5:2025-10-17 测试问题修å¤ï¼Œä¸Šçº¿æ”¯æŒ -二ã€ä¸‹å‘¨å·¥ä½œè®¡åˆ’ -é‡ç‚¹ä»»åŠ¡ -计划1:5.2.2ç‰ˆæœ¬å¼€å‘ -备注:无 -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—äº¬è½¯ä»¶è°·è½¯ä»¶å¤§é“ 11 å·èŠ±ç¥žå¤§åŽ¦ 2-3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-10-24_1700_G5周报.txt b/workspace-resume/eml-archive/2025-10-24_1700_G5周报.txt deleted file mode 100644 index 7b34d20..0000000 --- a/workspace-resume/eml-archive/2025-10-24_1700_G5周报.txt +++ /dev/null @@ -1,19 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.2.2ç‰ˆæœ¬å¼€å‘ -任务2:G5åº“å­˜é¦–é¡µéœ€æ±‚å¼€å‘ -常规工作 -日常事务1:2025-10-20 调休 -日常事务2:2025-10-21 主数æ®5.2.2ç‰ˆæœ¬éœ€æ±‚è¯„ä¼°å’Œå¼€å‘ -日常事务3:2025-10-22 库存调拨查询bugä¿®å¤ä¸Žé¦–é¡µæŠ¥è¡¨éœ€æ±‚ç¡®è®¤ä¸Žå¼€å‘ -日常事务4:2025-10-23 主数æ®å¯¹å¤–æŽ¥å£æµ‹è¯•ï¼Œé—®é¢˜ä¿®å¤ -日常事务5:2025-10-24 å‘†æ»žæŠ¥è¡¨æµ‹è¯•ï¼Œåº“å­˜é¢„è­¦æŠ¥è¡¨å¼€å‘ -二ã€ä¸‹å‘¨å·¥ä½œè®¡åˆ’ -é‡ç‚¹ä»»åŠ¡ -计划1:5.2.3ç‰ˆæœ¬å¼€å‘ -备注:无 -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—äº¬è½¯ä»¶è°·è½¯ä»¶å¤§é“ 11 å·èŠ±ç¥žå¤§åŽ¦ 2-3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-10-31_1700_G5周报.txt b/workspace-resume/eml-archive/2025-10-31_1700_G5周报.txt deleted file mode 100644 index 7db0091..0000000 --- a/workspace-resume/eml-archive/2025-10-31_1700_G5周报.txt +++ /dev/null @@ -1,19 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.2.2ç‰ˆæœ¬æµ‹è¯•å®Œæˆ -任务2:G5åº“å­˜é¦–é¡µéœ€æ±‚æµ‹è¯•å®Œæˆ -常规工作 -日常事务1:2025-10-27 主数æ®ç¼–ç æ­£åˆ™è§„èŒƒéœ€æ±‚å¼€å‘ -日常事务2:2025-10-28 主数æ®ç›¸å…³bugä¿®å¤ -日常事务3:2025-10-29 主数æ®å’Œåº“存需求测试完毕 -日常事务4:2025-10-30 主数æ®å•使¢ç®—æ‰¹é‡æŽ¥å£å¼€å‘方案 -日常事务5:2025-10-31 版本å‘å¸ƒæ”¯æŒ ä¸»æ•°æ®éœ€æ±‚è¯„å®¡å’Œå¼€å‘æ–¹æ¡ˆ -二ã€ä¸‹å‘¨å·¥ä½œè®¡åˆ’ -é‡ç‚¹ä»»åŠ¡ -计划1:5.2.3ç‰ˆæœ¬å¼€å‘ -备注:无 -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—äº¬è½¯ä»¶è°·è½¯ä»¶å¤§é“ 11 å·èŠ±ç¥žå¤§åŽ¦ 2-3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-11-07_1700_G5周报.txt b/workspace-resume/eml-archive/2025-11-07_1700_G5周报.txt deleted file mode 100644 index db4b185..0000000 --- a/workspace-resume/eml-archive/2025-11-07_1700_G5周报.txt +++ /dev/null @@ -1,19 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.2.3ç‰ˆæœ¬æµ‹è¯•å®Œæˆ -任务2:G3存货è¿ç§»åˆ°G5 -常规工作 -日常事务1:2025-11-03 BOMç»´æŠ¤å¼‚æ­¥å¯¼å‡ºéœ€æ±‚å¼€å‘ -日常事务2:2025-11-04 æˆæœ¬æ ¸ç®—G3è¿ç§»åˆ°G5 -日常事务3:2025-11-05 ä¸»æ•°æ®æµ‹è¯•bugä¿®å¤ -日常事务4:2025-10-06 æˆæœ¬æ ¸ç®—功能转测和业务人员é…ç½®å¼€å‘æ–¹æ¡ˆ -日常事务5:2025-10-07 存货测试问题处ç†å³åކå²é—®é¢˜ä¿®å¤ -二ã€ä¸‹å‘¨å·¥ä½œè®¡åˆ’ -é‡ç‚¹ä»»åŠ¡ -计划1:G3存货è¿ç§»åˆ°G5 å¯ç”¨æ€§é—®é¢˜å¤„ç†å’Œäº¤äº’完善 -备注:无 -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—京云密城Læ ‹5/10楼 -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-11-14_1823_G5周报.txt b/workspace-resume/eml-archive/2025-11-14_1823_G5周报.txt deleted file mode 100644 index 618ac7d..0000000 --- a/workspace-resume/eml-archive/2025-11-14_1823_G5周报.txt +++ /dev/null @@ -1 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 任务1:G5主数æ®5.2.3版本å‘版 任务2:G3存货è¿ç§»åˆ°G5 常规工作 日常事务1:2025-11-10 存货è¿ç§»é—®é¢˜å¤„ç† æ—¥å¸¸äº‹åŠ¡2:2025-11-11 å…¥åº“æˆæœ¬ç»´æŠ¤é‡æ–°è½¬æµ‹ 日常事务3:2025-11-12 存货è¿ç§»-库存相关代ç å¤„ç† æ—¥å¸¸äº‹åŠ¡4:2025-10-13 主数æ®äº§å“å…³è”工艺覆盖导入 二ã€ä¸‹å‘¨å·¥ä½œè®¡åˆ’ é‡ç‚¹ä»»åŠ¡ 计划1:G3存货è¿ç§»åˆ°G5 å¯ç”¨æ€§é—®é¢˜å¤„ç†å’Œäº¤äº’完善 备注:无 ​Best regards, æ¨è½© ​ 地å€ï¼šä¸­å›½Â·å—京云密城Læ ‹5/10楼 手机:18726128489 邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-11-21_1700_G5周报.txt b/workspace-resume/eml-archive/2025-11-21_1700_G5周报.txt deleted file mode 100644 index a63edf9..0000000 --- a/workspace-resume/eml-archive/2025-11-21_1700_G5周报.txt +++ /dev/null @@ -1,19 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.3.0版本å‘版 -任务2:G5å­˜è´§æµ‹è¯•é—®é¢˜ä¿®å¤ -常规工作 -日常事务1:2025-11-17 主数æ®å’Œå­˜è´§åކå²é—®é¢˜ä¿®å¤ -日常事务2:2025-11-18 主数æ®éœ€æ±‚å¼€å‘ -日常事务3:2025-11-19 主数æ®ç‰©æ–™æ¸…å•å¤„ç† -日常事务4:2025-10-20 ç‰©æ–™æ¸…å•æµ‹è¯•bugä¿®å¤ -日常事务4:2025-10-21 业务人员é…置关è”关系改造,åˆå§‹åŒ–物料清å•bugä¿®å¤ -二ã€ä¸‹å‘¨å·¥ä½œè®¡åˆ’ -é‡ç‚¹ä»»åŠ¡ -计划1:转测å‘布 -备注:无 -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—京云密城Læ ‹5/10楼 -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-11-28_1702_G5周报.txt b/workspace-resume/eml-archive/2025-11-28_1702_G5周报.txt deleted file mode 100644 index 2c8734e..0000000 --- a/workspace-resume/eml-archive/2025-11-28_1702_G5周报.txt +++ /dev/null @@ -1,19 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.3.0测试完æˆç‰ˆæœ¬å‘版 -任务2:G5å­˜è´§æµ‹è¯•å®Œæˆ -常规工作 -日常事务1:2025-11-24 åˆå§‹åŒ–物料清å•与业务人员é…ç½®æµ‹è¯•é—®é¢˜ä¿®å¤ -日常事务2:2025-11-25 åˆå§‹åŒ–物料清å•与业务人员é…ç½®æµ‹è¯•é—®é¢˜ä¿®å¤ -日常事务3:2025-11-26 主数æ®éœ€æ±‚æµ‹è¯•é—®é¢˜ä¿®å¤ æ™“è¯šç”µå™¨çŽ°åœºæ‰“å°æœºé—®é¢˜æ”¯æŒ -日常事务4:2025-10-27 主数æ®ç¼ºé™·å¤„ç† G5å­˜è´§æµ‹è¯•å®Œæˆ -日常事务4:2025-10-28 版本å‘布支æŒå’Œéœ€æ±‚评审 -二ã€ä¸‹å‘¨å·¥ä½œè®¡åˆ’ -é‡ç‚¹ä»»åŠ¡ -计划1:G5主数æ®5.3.1ç‰ˆæœ¬å¼€å‘ -备注:无 -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—京云密城Læ ‹5/10楼 -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-12-05_1703_G5周报.txt b/workspace-resume/eml-archive/2025-12-05_1703_G5周报.txt deleted file mode 100644 index 7ff6844..0000000 --- a/workspace-resume/eml-archive/2025-12-05_1703_G5周报.txt +++ /dev/null @@ -1,18 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.3.1ç‰ˆæœ¬å¼€å‘ -常规工作 -日常事务1:2025-12-01 å•使¢ç®—æ‰¹é‡æŽ¥å£ -日常事务2:2025-12-02 BOM维护优化需求开å‘转测 -日常事务3:2025-12-03 工艺路线导出定制优化 -日常事务4:2025-12-04 业务人员é…置接å£å¼€å‘与工艺页é¢å‰åŽç«¯è”è°ƒ -日常事务4:2025-12-05 ç”Ÿäº§ç®¡ç†æŽ¥å£å¼€å‘è”è°ƒ -二ã€ä¸‹å‘¨å·¥ä½œè®¡åˆ’ -é‡ç‚¹ä»»åŠ¡ -计划1:G5主数æ®5.3.1版本开å‘å®Œæˆ è½¬æµ‹ä¸Šçº¿ -备注:无 -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—京云密城Læ ‹5/10楼 -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-12-12_1715_G5周报.txt b/workspace-resume/eml-archive/2025-12-12_1715_G5周报.txt deleted file mode 100644 index 2ed8288..0000000 --- a/workspace-resume/eml-archive/2025-12-12_1715_G5周报.txt +++ /dev/null @@ -1,18 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.3.1ç‰ˆæœ¬æµ‹è¯•å®Œæˆ å‘布 -任务2:销售 生产 接å£è”è°ƒå®Œæˆ -常规工作 -日常事务1:2025-12-08 主数æ®å…¨éƒ¨è½¬æµ‹ é—®é¢˜ä¿®å¤ -日常事务2:2025-12-09 业务人员é…置接å£è”è°ƒ -日常事务3:2025-12-10 主数æ®å¯¹å¤–接å£è”è°ƒ -日常事务4:2025-12-11 接å£å¯¹æŽ¥ç¼ºé™·å¤„ç† -日常事务4:2025-12-12 æŽ¥å£æµ‹è¯•完æˆä¸Žç‰ˆæœ¬å‘å¸ƒæ”¯æŒ -é‡ç‚¹ä»»åŠ¡ -计划1:G5主数æ®5.4.0ç‰ˆæœ¬å¼€å‘ -备注:无 -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—京云密城Læ ‹5/10楼 -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-12-19_1702_G5周报.txt b/workspace-resume/eml-archive/2025-12-19_1702_G5周报.txt deleted file mode 100644 index 169b8b2..0000000 --- a/workspace-resume/eml-archive/2025-12-19_1702_G5周报.txt +++ /dev/null @@ -1,18 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.4.0版本开å‘å®Œæˆ è½¬æµ‹ -任务2ï¼šè´¢åŠ¡éœ€æ±‚å¼€å‘ -常规工作 -日常事务1:2025-12-15 主数æ®éœ€æ±‚è¯„å®¡å·¥æ—¶è¯„ä¼°å¼€å‘æ–¹æ¡ˆè®¾è®¡ -日常事务2:2025-12-16 主数æ®å¯¹å¤–æŽ¥å£ æ—¶é—´èŒƒå›´æŸ¥è¯¢å’Œæ ¡éªŒ -日常事务3:2025-12-17 主数æ®éœ€æ±‚å¼€å‘ -日常事务4:2025-12-18 业务人员é…置改造 -日常事务4:2025-12-19 业务人员é…ç½®æ”¹é€ åŠŸèƒ½æµ‹è¯•å’Œè´¢åŠ¡éœ€æ±‚å¼€å‘ -é‡ç‚¹ä»»åŠ¡ -计划1:G5主数æ®5.4.0ç‰ˆæœ¬æµ‹è¯•é—®é¢˜ä¿®å¤ -备注:无 -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—京云密城Læ ‹5/10楼 -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-12-26_1530_G5周报.txt b/workspace-resume/eml-archive/2025-12-26_1530_G5周报.txt deleted file mode 100644 index a94a07a..0000000 --- a/workspace-resume/eml-archive/2025-12-26_1530_G5周报.txt +++ /dev/null @@ -1,18 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.4.0版本å‘布 -任务2:财务5.4.0版本å‘布 -常规工作 -日常事务1:2025-12-22 主数æ®è´¢åŠ¡è½¬æµ‹é—®é¢˜ä¿®å¤ -日常事务2:2025-12-23 主数æ®è´¢åŠ¡è½¬æµ‹é—®é¢˜ä¿®å¤ -日常事务3:2025-12-24 主数æ®è´¢åŠ¡è½¬æµ‹é—®é¢˜ä¿®å¤ -日常事务4:2025-12-25 ç‰ˆæœ¬æµ‹è¯•å®Œæˆ -日常事务4:2025-12-26 生产问题分æžä¸Žå·¥å•å¤„ç† ç‰ˆæœ¬å‘å¸ƒæ”¯æŒ -é‡ç‚¹ä»»åŠ¡ -计划1:G5主数æ®5.4.1ç‰ˆæœ¬éœ€æ±‚å¼€å‘ -备注:2025-12-26 下åˆè¯·å‡ -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—京云密城Læ ‹5/10楼 -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2025-12-31_1745_G5周报.txt b/workspace-resume/eml-archive/2025-12-31_1745_G5周报.txt deleted file mode 100644 index 15a517d..0000000 --- a/workspace-resume/eml-archive/2025-12-31_1745_G5周报.txt +++ /dev/null @@ -1,25 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.4.1ç‰ˆæœ¬å¼€å‘ -任务2:销售 é‡‡è´­éœ€æ±‚åˆ†æž -常规工作 -日常事务1:2025-12-29 主数æ®éœ€æ±‚评审ã€åŠŸèƒ½å¼€å‘ -日常事务2:2025-12-30 ä¸»æ•°æ®æƒé™äººå‘˜æŽ¥å£è®¾è®¡å¼€å‘ -日常事务3:2025-12-31 -1ã€è½¦é—´/å·¥åºæœ‰æƒé™çš„业务人员查询接å£è½¬æµ‹ -2ã€ä»“åº“åˆ é™¤æ—¶éœ€è¦æ ¡éªŒè¯¥ä»“库是å¦è¢«å…¶ä»–业务信æ¯ä½œä¸ºå…³é”®å…³è”使用(兼容10æ¡åœºæ™¯ï¼‰ -3ã€å®¢æˆ·çš„物料标价ä¿ç•™å°æ•°ç‚¹åŽ6ä½ -4ã€BOM导出å­ä»¶å¢žåŠ ç‰©æ–™æè¿°ã€å›¾å·å­—段 -5ã€å·¥ä½œä¸­å¿ƒä¸‹å…³è”的工ä½åˆ é™¤åŽï¼Œå†åˆ é™¤å·¥ä½œä¸­å¿ƒä»ç„¶æç¤ºå·¥ä½æœªåˆ é™¤é—®é¢˜ä¿®å¤è½¬æµ‹ -6ã€å…³è”人员æ“作åŽå…³è”人员列表的listæ•°æ®è¿”回为null,导致å‰ç«¯è§£æžå¼‚常修å¤è½¬æµ‹ -7ã€å¤„ç†ç»“ç®—æ–¹å¼æ•°æ®å­—典百分å·é—®é¢˜ -日常事务4: -日常事务5: -é‡ç‚¹ä»»åŠ¡ -计划1:G5主数æ®5.4.1ç‰ˆæœ¬éœ€æ±‚å¼€å‘ -备注:2025-12-26 下åˆè¯·å‡ -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—京云密城Læ ‹5/10楼 -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2026-01-09_1711_G5周报.txt b/workspace-resume/eml-archive/2026-01-09_1711_G5周报.txt deleted file mode 100644 index a3a8241..0000000 --- a/workspace-resume/eml-archive/2026-01-09_1711_G5周报.txt +++ /dev/null @@ -1,40 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.4.1ç‰ˆæœ¬å¼€å‘ -任务2:销售 采购5.4.1ç‰ˆæœ¬éœ€æ±‚å¼€å‘ -常规工作 -日常事务1:2026-01-05 é‡‡è´­ç®¡ç† å‘æ–™è¯¦æƒ…æ‰“å°æŽ¥å£ -1ã€æ˜Žç»†å¢žåŠ é‡‡è´­è®¢å•å·é€—å·æ‹¼æŽ¥ -2ã€åŸºæœ¬ä¿¡æ¯å¢žåŠ é‡‡è´­è®¢å•å· -3ã€å§”外产å“和物料增加物料æè¿° -4ã€å§”外产å“å…³è”销售订å•客户åç§°ã€é‡‡è´­æ•°é‡ï¼ˆä¸»ï¼‰ -日常事务2:2026-01-06 -1ã€è¯¢ä»·å•列表增加æè´¨ -2ã€è¯¢ä»·å•详情和编辑增加æè´¨ -3ã€ååŒè¯¢ä»·åˆ—表增加æè´¨ -4ã€ååŒè¯¢ä»·é€‰æ‹©äº§å“增加æè´¨ -5ã€è¯·è´­å•æ˜Žç»†æŽ¥å£ ä¸¥æ ¼æ ¡éªŒ -日常事务3:2026-01-07 -1ã€å§”外产å“采购订å•å·æ‹¼æŽ¥å±•示 å‘è´§å•å…³è” -2ã€å§”å¤–äº§å“æè¿°æ‹¼æŽ¥å±•ç¤º 产å“ç¼–ç å…³è” -3ã€ç‰©æ–™æ˜Žç»†çš„物料æè¿°å±•示 -4ã€å…³è”销售订å•客户å称拼接展示 -5ã€é‡‡è´­æ•°é‡ï¼ˆä¸»ï¼‰å±•示 -6ã€ç›¸åŒæ‰¹æ¬¡æ•°é‡åˆå¹¶ -日常事务4:2026-01-08 -1ã€æ‰“尿ޥ壿 ¹æ®é‡‡è´­å•å…³è”åˆå¹¶é‡‡è´­æ•°é‡ -2ã€æ‰“尿ޥ壿 ¹æ®é”€å”®è®¢å•å…³è”åˆå¹¶å®¢æˆ·åç§° -3ã€æ‰“尿ޥ壿 ¹æ®æ‰¹æ¬¡å·åˆå¹¶æ•°é‡ -4ã€æ‰“尿ޥ壿 ¹æ®æ‹¼æŽ¥è¡Œå· -日常事务5:2026-01-09 -1ã€åˆ°è´§å•è¯¦æƒ…æ‰¹æ¬¡ç æ‰“å°ï¼Œç›¸åŒæ‰¹æ¬¡æ•°é‡åˆå¹¶ï¼› -2ã€åˆ°è´§å•è¯¦æƒ…æ‰¹æ¬¡ç æ‰“å°ï¼ŒäºŒç»´ç ä¸­è¡Œå·åˆå¹¶ -3ã€æµ‹è¯•é—®é¢˜ä¿®å¤ -一ã€ä¸‹å‘¨é‡ç‚¹ä»»åŠ¡ -5.4.1版本测试完æˆï¼Œå‘布上线 -备注:2026å¹´1月12æ—¥ å‘¨ä¸€è¯·å‡ -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—京云密城Læ ‹5/10楼 -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2026-01-16_1702_G5周报.txt b/workspace-resume/eml-archive/2026-01-16_1702_G5周报.txt deleted file mode 100644 index 48ea7b8..0000000 --- a/workspace-resume/eml-archive/2026-01-16_1702_G5周报.txt +++ /dev/null @@ -1,27 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.4.1版本å‘布 -任务2:销售 采购5.4.1版本å‘布 -常规工作 -日常事务1:2026-01-13 -1ã€ç‰ˆæœ¬ç¼ºé™·ä¿®å¤ -2ã€åކå²é—®é¢˜å¤„ç† -3ã€ç”Ÿæˆé—®é¢˜ä¿®å¤ -日常事务2:2026-01-14 -1. ç‰ˆæœ¬åŠŸèƒ½æµ‹è¯•å®Œæˆ -2. 历å²ç¼ºé™·ä¿®å¤éªŒè¯ -日常事务3:2026-01-15 -1. ä¸»æ•°æ®æµ‹è¯•å®Œæˆ -2. é”€å”®æµ‹è¯•å®Œæˆ -3. é‡‡è´­æµ‹è¯•å®Œæˆ -4. 生产问题验è¯å®Œæˆ -日常事务4:2026-01-16 -版本å‘布支æŒå’Œéœ€æ±‚评审 -一ã€ä¸‹å‘¨é‡ç‚¹ä»»åŠ¡ -5.4.2ç‰ˆæœ¬å¼€å‘ -备注:2026å¹´1月12æ—¥ å‘¨ä¸€è¯·å‡ -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—京云密城Læ ‹5/10楼 -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2026-01-23_1709_G5周报.txt b/workspace-resume/eml-archive/2026-01-23_1709_G5周报.txt deleted file mode 100644 index 4f40794..0000000 --- a/workspace-resume/eml-archive/2026-01-23_1709_G5周报.txt +++ /dev/null @@ -1,29 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.4.2ç‰ˆæœ¬å¼€å‘ -任务2:销售 采购5.4.2ç‰ˆæœ¬å¼€å‘ -常规工作 -日常事务1:2026-01-19 -1. 主数æ®éœ€æ±‚评审 -2. 主数æ®éœ€æ±‚å¼€å‘ -3. 采购需求评审 -日常事务2:2026-01-20 -1. 需求工时评估 -2. 开呿–¹æ¡ˆè®¾è®¡ -3. éœ€æ±‚å¼€å‘ -日常事务3:2026-01-21 -1. å˜æ›´å§”外采购å•è‡ªåŠ¨å‘æ–™åˆ†æ”¯éœ€æ±‚å¼€å‘ -日常事务4:2026-01-22 -1. 下推采购订å•回写请购å•需求开å‘转测 -日常事务5:2026-01-23 -1. é‡‡è´­éœ€æ±‚å¼€å‘ -2. 采购历å²é—®é¢˜ä¿®å¤ -3. ä¸»æ•°æ®æ‹¼éŸ³æŸ¥è¯¢æŽ’除中文é™åˆ¶ -一ã€ä¸‹å‘¨é‡ç‚¹ä»»åŠ¡ -5.4.2ç‰ˆæœ¬æµ‹è¯•å®Œæˆ ä¸Šçº¿æ”¯æŒ -备注: -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—京云密城Læ ‹5/10楼 -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2026-01-30_1711_G5周报.txt b/workspace-resume/eml-archive/2026-01-30_1711_G5周报.txt deleted file mode 100644 index f39891e..0000000 --- a/workspace-resume/eml-archive/2026-01-30_1711_G5周报.txt +++ /dev/null @@ -1,29 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.4.2版本å‘布 -任务2:销售 采购5.4.2版本å‘布 -常规工作 -日常事务1:2026-01-26 -1. è¯¢ä»·ä¸‹è¾¾å›žå†™è¯·è´­å•æµç¨‹ä¼˜åŒ– -2. é‡‡è´­ç¼ºé™·ä¿®å¤ -日常事务2:2026-01-27 -1. é‡‡è´­æµ‹è¯•é—®é¢˜ä¿®å¤ -2. ä¸»æ•°æ®æ¶ˆæ¯æŽ¨é€æŽ¥å£ä¼˜åŒ– -日常事务3:2026-01-28 -1. 采购管ç†é€è´§å•需求开å‘转测 -2. ç¼ºé™·ä¿®å¤ -日常事务4:2026-01-29 -1. 采购管ç†ç¼ºé™·ä¿®å¤ -2. é€€è´§å•æ‰“å°å¢žåŠ å­—æ®µ -日常事务5:2026-01-30 -1. 版本å‘å¸ƒæ”¯æŒ -2. 需求评审 -3. 物料信æ¯å¯¼å‡ºå›¾ç‰‡æŠ€æœ¯é¢„ç ” -一ã€ä¸‹å‘¨é‡ç‚¹ä»»åŠ¡ -5.4.3ç‰ˆæœ¬å¼€å‘ -备注: -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—京云密城Læ ‹5/10楼 -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2026-02-06_1701_G5周报.txt b/workspace-resume/eml-archive/2026-02-06_1701_G5周报.txt deleted file mode 100644 index 078bdfd..0000000 --- a/workspace-resume/eml-archive/2026-02-06_1701_G5周报.txt +++ /dev/null @@ -1,28 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.4.3版本开å‘转测 -任务2:G5库存5.4.3版本开å‘转测 -常规工作 -日常事务1:2026-02-02 -1. 进销存需求评审 -2. 主数æ®éœ€æ±‚å¼€å‘转测 -日常事务2:2026-02-03 -1. 主数æ®å·¥åºæ–°å¢žå¹¿æ’­é€šçŸ¥ -2. åº“å­˜æ ¹æ®æ£€éªŒç»“æžœé™åˆ¶å‡ºåº“开关 -3. 出库校验(app web) -日常事务3:2026-02-04 -1. 生产入库ä¿å­˜æ‰¹æ¬¡å±žæ€§ -2. å…¥åº“å•æŸ¥è¯¢æŽ¥å£å¢žåŠ æ‰¹æ¬¡å±žæ€§ -日常事务4:2026-02-05 -1. ä¸»æ•°æ®æµ‹è¯•å®Œæˆ -2. åº“å­˜æµ‹è¯•é—®é¢˜ä¿®å¤ -日常事务5:2026-02-06 -1. åº“å­˜æµ‹è¯•é—®é¢˜ä¿®å¤ -一ã€ä¸‹å‘¨é‡ç‚¹ä»»åŠ¡ -5.4.3版本å‘布 -备注: -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—京云密城Læ ‹5/10楼 -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2026-02-28_1730_G5周报.txt b/workspace-resume/eml-archive/2026-02-28_1730_G5周报.txt deleted file mode 100644 index 760da02..0000000 --- a/workspace-resume/eml-archive/2026-02-28_1730_G5周报.txt +++ /dev/null @@ -1,32 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.4.4æµ‹è¯•å®Œæˆ -任务2:G5库存5.4.4æµ‹è¯•å®Œæˆ -常规工作 -日常事务1:2026-02-24 -1. 销售管ç†-æ”¶æ¬¾è®¡åˆ’çš„â€œæ”¶æ¬¾ç±»åž‹â€æ”¯æŒå¡«å†™æ•°å­— -2. å‘è´§å•æ‰“å°æ¨¡æ¿å¢žåŠ å‘è´§ä¿¡æ¯å‘è´§ä¿¡æ¯çš„客户è”系人ã€å®¢æˆ·è”系方å¼ã€å®¢æˆ·åœ°å€å­—段 -3. æ— æºå•新增选择客户åŽå¸¦å‡ºå®¢æˆ·è”系人ã€å®¢æˆ·è”系方å¼ã€å®¢æˆ·åœ°å€ -4. 有æºå•:按订å•å‘货时从订å•中获å–ä¿¡æ¯ -日常事务2:2026-02-25 -1. 产å“选é…é¡¹æ ¡éªŒé€»è¾‘åˆ†æž -2. 主数æ®å¯¼å…¥é—®é¢˜ä¿®å¤ -日常事务3:2026-02-26 -1. 主数æ®éœ€æ±‚æµ‹è¯•å®Œæˆ -2. 销售管ç†é—®é¢˜ä¿®å¤ -3. 销售管ç†åކå²é—®é¢˜å¤„ç† -日常事务4:2026-02-27 -1. ä¸»æ•°æ®æµ‹è¯•å®Œæˆ -2. 销售历å²é—®é¢˜å¤„ç† -日常事务5:2026-02-27 -1. ä¸»æ•°æ®æµ‹è¯•å®Œæˆ -2. é”€å”®ç®¡ç†æµ‹è¯•å®Œæˆ -3. 销售管ç†åކå²é—®é¢˜ä¿®å¤å®Œæˆ -一ã€ä¸‹å‘¨é‡ç‚¹ä»»åŠ¡ -5.4.5ç‰ˆæœ¬å¼€å‘ -备注: -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—京云密城Læ ‹5/10楼 -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2026-03-06_1703_G5周报.txt b/workspace-resume/eml-archive/2026-03-06_1703_G5周报.txt deleted file mode 100644 index 3628751..0000000 --- a/workspace-resume/eml-archive/2026-03-06_1703_G5周报.txt +++ /dev/null @@ -1,31 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 -任务1:G5主数æ®5.4.5éœ€æ±‚å¼€å‘ -任务2:G5进销存5.4.5éœ€æ±‚å¼€å‘ -常规工作 -日常事务1:2026-03-02 -1. 版本å‘å¸ƒæ”¯æŒ -2. 需求工时评估 -日常事务2:2026-03-03 -1. 物料信æ¯å¯¼å‡ºåŠ å…¥æŠ¥åºŸä»“åº“ï¼Œè‰¯å“仓库以åŠè¿”工返修仓库三个字段 -2. åˆå§‹åŒ–采购订å•åºåˆ—å· -3. é€šç”¨æ‰“å°æ¬¡æ•°ç´¯è®¡åŠŸèƒ½å¼€å‘ -日常事务3:2026-03-04 -1. é”€å”®æ‰“å°æ¬¡æ•°åŠŸèƒ½è½¬æµ‹ -2. é‡‡è´­æ‰“å°æ¬¡æ•°åŠŸèƒ½è½¬æµ‹ -日常事务4:2026-03-05 -1. 主数æ®å›¾ç‰‡å±•示技术预研 -2. ä¸»æ•°æ®æŽ¥å£å›¾ç‰‡è¿”回方案确认 -3. 主数æ®minio æŽ¥å£æ”¹é€  -日常事务5:2026-03-06 -1. 导入文件功能改造 -2. 图片改造完æˆè½¬æµ‹ -3. åº“å­˜æ‰“å°æ¬¡æ•°åŠŸèƒ½å¼€å‘ -一ã€ä¸‹å‘¨é‡ç‚¹ä»»åŠ¡ -5.4.5ç‰ˆæœ¬å¼€å‘ -备注: -Best regards,æ¨è½© -地å€ï¼šä¸­å›½Â·å—京云密城Læ ‹5/10楼 -手机:18726128489 -邮箱:yangxuan@witsoft.cn \ No newline at end of file diff --git a/workspace-resume/eml-archive/2026-03-13_2039_G5周报.txt b/workspace-resume/eml-archive/2026-03-13_2039_G5周报.txt deleted file mode 100644 index eab37e0..0000000 --- a/workspace-resume/eml-archive/2026-03-13_2039_G5周报.txt +++ /dev/null @@ -1,37 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ - - * -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 - - * -任务1:G5主数æ®5.4.5版本å‘布 - - * -任务2:G5进销存5.4.5版本å‘布 - - * -任务3:minio整体改造 - - * -常规工作 -日常事务1:2026-03-09 -1. é”€å”®æ‰“å°æ¬¡æ•°åŠŸèƒ½æµ‹è¯•å®Œæˆ -2. é‡‡è´­æ‰“å°æ¬¡æ•°åŠŸèƒ½æµ‹è¯•å®Œæˆ -3. åº“å­˜æ‰“å°æ¬¡æ•°åŠŸèƒ½å¼€å‘ -日常事务2:2026-03-10 -1. 主数æ®åކå²é—®é¢˜ä¿®å¤è½¬æµ‹ -2. 销售历å²é—®é¢˜åˆ†æžå¤„ç† -日常事务3:2026-03-11 -1. é”€å”®è®¢å•æ–™å·æµè½¬ -2. 销售å‘è´§å•é€€è´§æ–™å·æµè½¬ -3. 销售无æºé€€è´§æ–™å·èŽ·å– -一ã€ä¸‹å‘¨é‡ç‚¹ä»»åŠ¡ -5.4.6ç‰ˆæœ¬å¼€å‘ -备注: -3.12--3.13 调休两天 -Best regards, -æ¨è½© -地å€ï¼šä¸­å›½Â·å—京云密城Læ ‹5/10楼 -手机:18726128489 -邮箱:yangxuan@witsoft.cn diff --git a/workspace-resume/eml-archive/2026-03-20_1743_G5周报.txt b/workspace-resume/eml-archive/2026-03-20_1743_G5周报.txt deleted file mode 100644 index 519967a..0000000 --- a/workspace-resume/eml-archive/2026-03-20_1743_G5周报.txt +++ /dev/null @@ -1,77 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -ä¸€ã€æœ¬å‘¨å·¥ä½œæ€»ç»“ - - * -é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 - - * -任务1:G5主数æ®5.4.6ç‰ˆæœ¬å¼€å‘ - - * -任务2:G5进销存5.4.6ç‰ˆæœ¬å¼€å‘ - - * -常规工作 -2026-03-16 - - * -主数æ®åކå²é—®é¢˜åˆ†æž - - * -主数æ®åކå²é—®é¢˜æŽ¥å£å¤„ç† - - * -主数æ®éœ€æ±‚åˆ†æž - - * -主数æ®å·¥æ—¶è¯„ä¼° - - * -主数æ®éœ€æ±‚å¼€å‘ -2026-03-17 - - * -主数æ®å¼€å…³é…ç½®åˆå§‹åŒ–æŽ¥å£ - - * -主数æ®å¼€å…³é…ç½®å‰åŽç«¯è”è°ƒ - - * -主数æ®å¼€å…³é…ç½®å¯¹å¤–æŽ¥å£ -2026-03-18 - - * -销售å‘è´§å•æ‰“å°æ¨¡ç‰ˆå­—段添加销售å¸ç§å­—段 - - * -é”€å”®è®¢å•æ–°å¢žç¼–è¾‘å˜æ›´ç•Œé¢ï¼Œäº§å“明细增加销售图片,需支æŒå¤šä¸ªå›¾ç‰‡ä¸Šä¼ ï¼Œä¸”æ”¯æŒæ‰“å° -2026-03-19 - - * -销售图片å‰åŽç«¯è”è°ƒ - - * -é”€å”®å›¾ç‰‡æ‰“å° - - * -属性组接å£å¼€å‘ -2026-03-20 - - * -销售图片功能è”è°ƒ - - * -é”€å”®å›¾ç‰‡å¤šå¼ æ‰“å° - - * -明细列表属性组查询 -一ã€ä¸‹å‘¨é‡ç‚¹ä»»åŠ¡ -5.4.6版本 -备注: -Best regards, -æ¨è½© -地å€ï¼šä¸­å›½Â·å—京云密城Læ ‹5/10楼 -手机:18726128489 -邮箱:yangxuan@witsoft.cn diff --git a/workspace-resume/eml-archive/2026-03-27_1708_G5周报.txt b/workspace-resume/eml-archive/2026-03-27_1708_G5周报.txt deleted file mode 100644 index 8947051..0000000 --- a/workspace-resume/eml-archive/2026-03-27_1708_G5周报.txt +++ /dev/null @@ -1,66 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -本周工作总结 -一ã€é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 - - * -G5ä¸»æ•°æ® 5.4.6 版本å‘布 - - * -G5进销存 5.4.6 版本å‘布 -二ã€å¸¸è§„工作明细 -2026-03-23 - - * -啿˜Žç»†ã€å‘货明细列表支æŒå±žæ€§ç»„查询 - - * -销售图片è”调转测 - - * -主数æ®ç¼ºé™·ä¿®å¤ -2026-03-24 - - * -è®¢å•æ˜Žç»†ã€å‘货明细列表支æŒå±žæ€§ç»„查询导出自测转测 - - * -äº§å“æ˜Žç»†å¢žåŠ é”€å”®å›¾ç‰‡éœ€æ±‚è½¬æµ‹ - - * -销售历å²é—®é¢˜å¤„ç† -2026-03-25 - - * -éœ€æ±‚æµ‹è¯•é—®é¢˜ä¿®å¤ - - * -æ–™å·èµ‹å€¼å¤„ç† -2026-03-26 - - * -é”€å”®ç¼ºé™·ä¿®å¤ - - * -é”€å”®è®¢å•æ–°å¢žã€ç¼–辑ã€å˜æ›´ã€æ–™å·ä¼˜åŒ– -2026-03-27 - - * -主数æ®ç‰ˆæœ¬å‘å¸ƒæ”¯æŒ - - * -销售管ç†ç‰ˆæœ¬å‘å¸ƒæ”¯æŒ - - * -库存需求评审 - - * -库存工时评估 -下周é‡ç‚¹ä»»åŠ¡ - - * -5.4.7 ç‰ˆæœ¬å¼€å‘ -Best regards, -æ¨è½© -地å€ï¼šä¸­å›½Â·å—京软件谷软件大é“11å·èŠ±ç¥žå¤§åŽ¦3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn diff --git a/workspace-resume/eml-archive/2026-04-03_1702_G5周报.txt b/workspace-resume/eml-archive/2026-04-03_1702_G5周报.txt deleted file mode 100644 index 95bf972..0000000 --- a/workspace-resume/eml-archive/2026-04-03_1702_G5周报.txt +++ /dev/null @@ -1,63 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -本周工作总结 -一ã€é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 - - * -G5进销存 5.4.7 ç‰ˆæœ¬å¼€å‘ -二ã€å¸¸è§„工作明细 -2026-03-30 - - * -åº“å­˜å¼€å‘æ–¹æ¡ˆè¯„审 - - * -åº“å­˜éœ€æ±‚å¼€å‘ -2026-03-31 - - * -出入库查询添加备注查询 - - * -查询å¯ç”¨åº“å­˜çš„æŽ¥å£æŽ’é™¤å§”å¤–ä»“ - - * -å‡ºå…¥åº“å•æ®æ˜Žç»†æŸ¥è¯¢ -2026-04-01 - - * -å‡ºå…¥åº“å•æ®æ˜Žç»†å¼€å‘ -2026-04-02 - - * -性能优化 - - * -异步导出 - - * -æ–°å¢žå°æ•°ä½æ•° å•ä½ç²¾åº¦æŽ§åˆ¶ - - * -出入库关è”客户或者供应商判断 - - * -å‡ºå…¥åº“å•æ®æ˜Žç»†æŸ¥è¯¢è‡ªæµ‹è”è°ƒ -2026-04-03 - - * -自动入库策略样å¼è°ƒæ•´ - - * -å·¥åºå§”外自动入库逻辑调整 - - * -啿®æŸ¥è¯¢è‡ªæµ‹å’Œå¯¼å‡ºä¼˜åŒ– -下周é‡ç‚¹ä»»åŠ¡ - - * -5.4.7 ç‰ˆæœ¬å¼€å‘ -Best regards, -æ¨è½© -地å€ï¼šä¸­å›½Â·å—京软件谷软件大é“11å·èŠ±ç¥žå¤§åŽ¦3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn diff --git a/workspace-resume/eml-archive/2026-04-03_1721_G5周报.txt b/workspace-resume/eml-archive/2026-04-03_1721_G5周报.txt deleted file mode 100644 index 95bf972..0000000 --- a/workspace-resume/eml-archive/2026-04-03_1721_G5周报.txt +++ /dev/null @@ -1,63 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -本周工作总结 -一ã€é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 - - * -G5进销存 5.4.7 ç‰ˆæœ¬å¼€å‘ -二ã€å¸¸è§„工作明细 -2026-03-30 - - * -åº“å­˜å¼€å‘æ–¹æ¡ˆè¯„审 - - * -åº“å­˜éœ€æ±‚å¼€å‘ -2026-03-31 - - * -出入库查询添加备注查询 - - * -查询å¯ç”¨åº“å­˜çš„æŽ¥å£æŽ’é™¤å§”å¤–ä»“ - - * -å‡ºå…¥åº“å•æ®æ˜Žç»†æŸ¥è¯¢ -2026-04-01 - - * -å‡ºå…¥åº“å•æ®æ˜Žç»†å¼€å‘ -2026-04-02 - - * -性能优化 - - * -异步导出 - - * -æ–°å¢žå°æ•°ä½æ•° å•ä½ç²¾åº¦æŽ§åˆ¶ - - * -出入库关è”客户或者供应商判断 - - * -å‡ºå…¥åº“å•æ®æ˜Žç»†æŸ¥è¯¢è‡ªæµ‹è”è°ƒ -2026-04-03 - - * -自动入库策略样å¼è°ƒæ•´ - - * -å·¥åºå§”外自动入库逻辑调整 - - * -啿®æŸ¥è¯¢è‡ªæµ‹å’Œå¯¼å‡ºä¼˜åŒ– -下周é‡ç‚¹ä»»åŠ¡ - - * -5.4.7 ç‰ˆæœ¬å¼€å‘ -Best regards, -æ¨è½© -地å€ï¼šä¸­å›½Â·å—京软件谷软件大é“11å·èŠ±ç¥žå¤§åŽ¦3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn diff --git a/workspace-resume/eml-archive/2026-04-10_1728_G5周报.txt b/workspace-resume/eml-archive/2026-04-10_1728_G5周报.txt deleted file mode 100644 index f0d4de7..0000000 --- a/workspace-resume/eml-archive/2026-04-10_1728_G5周报.txt +++ /dev/null @@ -1,47 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -本周工作总结 -一ã€é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 - - * -G5进销存 5.4.7 版本å‘布 -二ã€å¸¸è§„工作明细 -2026-04-07 - - * -自动入库逻辑梳ç†ä¸Žä¼˜åŒ– -2026-04-08 - - * -å·¥åºå§”外-委外收料/退料自动入库è”è°ƒå®Œæˆ - - * -åº“å­˜éœ€æ±‚è‡ªæµ‹å®Œæˆ -2026-04-09 - - * -è½¬æµ‹é—®é¢˜ä¿®å¤ - - * -入库æµç¨‹æ¢³ç† - - * -入库表结构注释 -2026-04-10 - - * -æµ‹è¯•é—®é¢˜ä¿®å¤ - - * -å„ç±»åž‹å…¥åº“å®¢å•†ä¿¡æ¯æ¢³ç† - - * -å„ç±»åž‹å‡ºå…¥åº“æ‰¹æ¬¡å…³è”æ¢³ç† -下周é‡ç‚¹ä»»åŠ¡ - - * -5.4.7 版本开å‘布 -Best regards, -æ¨è½© -地å€ï¼šä¸­å›½Â·å—京软件谷软件大é“11å·èŠ±ç¥žå¤§åŽ¦3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn diff --git a/workspace-resume/eml-archive/2026-04-10_1732_G5周报.txt b/workspace-resume/eml-archive/2026-04-10_1732_G5周报.txt deleted file mode 100644 index 54eb198..0000000 --- a/workspace-resume/eml-archive/2026-04-10_1732_G5周报.txt +++ /dev/null @@ -1,47 +0,0 @@ -您好ï¼ä»¥ä¸‹æ˜¯æˆ‘本周的工作总结åŠä¸‹å‘¨è®¡åˆ’,请审阅。 -本周工作总结 -一ã€é‡ç‚¹å·¥ä½œå®Œæˆæƒ…况 - - * -G5进销存 5.4.7 版本 -二ã€å¸¸è§„工作明细** -2026-04-07 - - * -自动入库逻辑梳ç†ä¸Žä¼˜åŒ– -2026-04-08 - - * -å·¥åºå§”外-委外收料/退料自动入库è”è°ƒå®Œæˆ - - * -åº“å­˜éœ€æ±‚è‡ªæµ‹å®Œæˆ -2026-04-09 - - * -è½¬æµ‹é—®é¢˜ä¿®å¤ - - * -入库æµç¨‹æ¢³ç† - - * -入库表结构注释 -2026-04-10 - - * -æµ‹è¯•é—®é¢˜ä¿®å¤ - - * -å„ç±»åž‹å…¥åº“å®¢å•†ä¿¡æ¯æ¢³ç† - - * -å„ç±»åž‹å‡ºå…¥åº“æ‰¹æ¬¡å…³è”æ¢³ç† -下周é‡ç‚¹ä»»åŠ¡ - - * -G5进销存 5.4.7 版本 -Best regards, -æ¨è½© -地å€ï¼šä¸­å›½Â·å—京软件谷软件大é“11å·èŠ±ç¥žå¤§åŽ¦3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn diff --git a/workspace-resume/eml-archive/2026-04-17_1707_G5周报.txt b/workspace-resume/eml-archive/2026-04-17_1707_G5周报.txt deleted file mode 100644 index 12dd49d..0000000 --- a/workspace-resume/eml-archive/2026-04-17_1707_G5周报.txt +++ /dev/null @@ -1,43 +0,0 @@ -项目: 维云智造G5(库存管ç†ï¼‰ -日期 -主è¦å·¥ä½œ -周一(04.13) -1. 啿®æŸ¥è¯¢ç¼ºé™·ä¿®å¤ -2. 库存历å²é—®é¢˜ä¿®å¤ -3. 新增功能点开å‘转测 -周二(04.14) -1. 啿®æŸ¥è¯¢æµ‹è¯•å®Œæˆ -2. 入库æµç¨‹æ¢³ç† -3. å‡ºå…¥åº“å•æ®å…³è”批次å·é€»è¾‘ -周三(04.15) -1. 啿®æŸ¥è¯¢æµ‹è¯•å®Œæˆ -2. 入库æµç¨‹æ¢³ç† -3. 开呿–¹æ¡ˆ -周四(04.16) -1. 库存管ç†éœ€æ±‚评审 -2. 工时评估 -3. AI分æžéœ€æ±‚ -周五(04.17) -1. 开呿–¹æ¡ˆè®¾è®¡ -2. AI说明文档 -3. 需求功能文档 -4. 功能点数æ®å¤„ç†åˆ†æžæ–‡æ¡£ -本周é‡ç‚¹æˆæžœï¼š - - * -完æˆå•æ®æŸ¥è¯¢æµ‹è¯•åŠç¼ºé™·ä¿®å¤ - - * -完æˆå…¥åº“æµç¨‹æ¢³ç†åŠæ‰¹æ¬¡å…³è”é€»è¾‘æ¢³ç† - - * -完æˆåº“存管ç†éœ€æ±‚评审与技术方案设计 - - * -输出AI说明文档ã€éœ€æ±‚功能文档等é…套文档 -存在问题: æ—  -Best regards, -æ¨è½© -地å€ï¼šä¸­å›½Â·å—京软件谷软件大é“11å·èŠ±ç¥žå¤§åŽ¦3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn diff --git a/workspace-resume/eml-archive/2026-04-24_1804_G5周报.txt b/workspace-resume/eml-archive/2026-04-24_1804_G5周报.txt deleted file mode 100644 index a3ed7c3..0000000 --- a/workspace-resume/eml-archive/2026-04-24_1804_G5周报.txt +++ /dev/null @@ -1,57 +0,0 @@ -项目: 维云智造G5(库存管ç†ï¼‰ -日期 -主è¦å·¥ä½œ -周一(04.20) -1. AI对è¯é€æ­¥å®Œæˆéœ€æ±‚å¼€å‘ -2. 生产入库增加销售å•å·æŸ¥è¯¢ -3. 分æžweb委外退料校验规则 æ ¹æ®è§„则增加校验 -4. 去除AI异常逻辑 -周二(04.21) -1. 开呿–¹æ¡ˆè¯„审 -2. 测试用例评审 -3. 入库接å£ä¼˜åŒ–éœ€æ±‚å¼€å‘ -周三(04.22) -1. 扫ç å‡ºå…¥åº“ 调拨入库 -2. 扫ç å‡ºå…¥åº“ å§”å¤–é€€æ–™å• -周四(04.23) -1. openapi接å£è‡ªæµ‹ -2. app 自动入库è”è°ƒ -周五(04.24) -1. 生产入库“销售订å•å·â€æŸ¥è¯¢è½¬æµ‹ -2. 委外退料对外接å£è½¬æµ‹ -3. 采购入库 生产入库 批次å·å¤„ç† è½¬æµ‹ -4. 调拨入库ã€å§”外退料å•ã€ç”Ÿäº§é€€æ–™ã€æŠ¥åºŸå…¥åº“ 扫ç å‡ºå…¥åº“转测 -本周é‡ç‚¹æˆæžœï¼š - - * -入库与查询功能增强 - - * -生产入库增加“销售订å•å·â€æŸ¥è¯¢ï¼Œå®Œæˆè½¬æµ‹ã€‚ - - * -入库接å£ä¼˜åŒ–需求开å‘完æˆã€‚ - - * -委外退料业务完善 - - * -分æžWeb端委外退料校验规则,并按规则增加相应校验。 - - * -委外退料对外接å£å®Œæˆè½¬æµ‹ã€‚ - - * -扫ç å‡ºå…¥åº“功能扩展 - - * -å®Œæˆæ‰«ç å‡ºå…¥åº“中调拨入库ã€å§”外退料å•的开å‘与转测。 - - * -åŒæ—¶å®Œæˆç”Ÿäº§é€€æ–™ã€æŠ¥åºŸå…¥åº“的扫ç å‡ºå…¥åº“转测。 -存在问题: æ—  -Best regards, -æ¨è½© -地å€ï¼šä¸­å›½Â·å—京软件谷软件大é“11å·èŠ±ç¥žå¤§åŽ¦3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn diff --git a/workspace-resume/eml-archive/2026-04-30_1703_G5周报.txt b/workspace-resume/eml-archive/2026-04-30_1703_G5周报.txt deleted file mode 100644 index 49af401..0000000 --- a/workspace-resume/eml-archive/2026-04-30_1703_G5周报.txt +++ /dev/null @@ -1,51 +0,0 @@ -项目: 维云智造G5(库存管ç†ï¼‰ -日期 -主è¦å·¥ä½œ -周一(04.27) -1. ç‰ˆæœ¬ç¼ºé™·ä¿®å¤ -2. AIæ•´ç†å…¥åº“æµç¨‹ -3. 历å²é—®é¢˜å¤„ç† -周二(04.28) -1. æµ‹è¯•é—®é¢˜ä¿®å¤ -2. ä¸»æ•°æ®æ¨¡å—æŽ¥å£æ•´ç† -周三(04.29) -1. åº“å­˜ç¼ºé™·ä¿®å¤ -周四(04.30) -1. 库存需求评审和工作é‡è¯„ä¼° -本周é‡ç‚¹æˆæžœï¼š - - * -推进库存模å—工作 - - * -完æˆåº“存需求评审与工作é‡è¯„估(04.23) - - * -ä¿®å¤åº“存相关缺陷(04.29) - - * -æå‡ç‰ˆæœ¬è´¨é‡ - - * -ä¿®å¤ç‰ˆæœ¬ç¼ºé™·ä¸Žæµ‹è¯•问题 - - * -处ç†åކå²é—留问题 - - * -支撑AI与数æ®èƒ½åŠ› - - * -完æˆAIæ•´ç†å…¥åº“æµç¨‹ç›¸å…³å·¥ä½œ - - * -完善主数æ®èƒ½åŠ› - - * -æ•´ç†ä¸»æ•°æ®æ¨¡å—接å£ï¼Œä¸ºåŽç»­å¼€å‘æä¾›ä¾æ® -存在问题: æ—  -Best regards, -æ¨è½© -地å€ï¼šä¸­å›½Â·å—京软件谷软件大é“11å·èŠ±ç¥žå¤§åŽ¦3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn diff --git a/workspace-resume/eml-archive/2026-05-09_1712_G5周报.txt b/workspace-resume/eml-archive/2026-05-09_1712_G5周报.txt deleted file mode 100644 index 6222a98..0000000 --- a/workspace-resume/eml-archive/2026-05-09_1712_G5周报.txt +++ /dev/null @@ -1,88 +0,0 @@ -æœ¬å‘¨å·¥ä½œæ‘˜è¦ -1. 库存5.4.9版本核心需求开å‘与推进 - - * -完æˆåº“存预警优化的方案设计与评审,并进入开å‘ã€è‡ªæµ‹ä¸Žè½¬æµ‹é˜¶æ®µ - - * -å®žçŽ°é”€å”®å‡ºåº“çº¢å†²åŠŸèƒ½ï¼Œæ”¯æŒ App 扫ç å‡ºå…¥åº“中的获å–详情与出库æ“作 - - * -完æˆç”Ÿäº§é¢†æ–™æ·»åŠ é™„ä»¶åŠŸèƒ½ - - * -ç¼–å†™åº“å­˜éœ€æ±‚å¼€å‘æ–¹æ¡ˆæç¤ºè¯ï¼Œè¿›è¡Œé…方需求分æžçš„代ç åˆ†æž -2. 临时新增需求快速å“应(5月9日) - - * -完æˆåº“存预警优化需求剩余开å‘工作 - - * -确认并è½åœ°3个é‡è¦åŠŸèƒ½ç‚¹ï¼š - - * -ç­–ç•¥é…ç½®æŒä¹…åŒ–æœ‰æ•ˆåº“å­˜å…¬å¼ - - * -采购未到货数é‡ä¸»é€»è¾‘ - - * -统一有效库存计算å£å¾„ - - * -完æˆè‡ªæµ‹ä¸Žè½¬æµ‹ -æ¯æ—¥å·¥ä½œæƒ…况 -周三(5月6日) -任务å称: 库存5.4.9需求开å‘(维云智造G5) -执行内容: - - * -åº“å­˜éœ€æ±‚å¼€å‘æ–¹æ¡ˆæç¤ºè¯ç¼–写 - - * -é…æ–¹éœ€æ±‚分æžä»£ç åˆ†æž -周四(5月7日) -任务å称: 库存5.4.9需求开å‘(维云智造G5) -执行内容: - - * -销售出库红冲 App 扫ç å‡ºå…¥åº“:获å–详情与出库æ“作 - - * -生产领料添加附件功能 -周五(5月8日) -任务å称: 库存5.4.9需求开å‘(维云智造G5) -执行内容: - - * -åº“å­˜é¢„è­¦ä¼˜åŒ–å¼€å‘æ–¹æ¡ˆè®¾è®¡ä¸Žè¯„审 - - * -åº“å­˜é¢„è­¦åŠŸèƒ½å¼€å‘ -周六(5月9日) -任务å称: 库存管ç†ä¸´æ—¶æ–°å¢žæ›¿æ¢éœ€æ±‚梳ç†å’Œå¼€å‘(维云智造G5) -执行内容: - - * -åº“å­˜é¢„è­¦ä¼˜åŒ–éœ€æ±‚å¼€å‘ - - * -新增功能点确认:策略é…ç½®æŒä¹…åŒ–æœ‰æ•ˆåº“å­˜å…¬å¼ - - * -新增功能点确认:采购未到货数é‡ä¸» - - * -统一计算有效库存 - - * -自测 & 转测 -存在问题 - - * -æ—  -Best regards, -æ¨è½© -地å€ï¼šä¸­å›½Â·å—京软件谷软件大é“11å·èŠ±ç¥žå¤§åŽ¦3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn diff --git a/workspace-resume/eml-archive/2026-05-09_1712_G5å¼€å‘周报_2026-05-06_--_2026-05-09---2fc4dc86-10a7-4839-9d4f-eb8a0aac0732.txt b/workspace-resume/eml-archive/2026-05-09_1712_G5å¼€å‘周报_2026-05-06_--_2026-05-09---2fc4dc86-10a7-4839-9d4f-eb8a0aac0732.txt deleted file mode 100644 index 6222a98..0000000 --- a/workspace-resume/eml-archive/2026-05-09_1712_G5å¼€å‘周报_2026-05-06_--_2026-05-09---2fc4dc86-10a7-4839-9d4f-eb8a0aac0732.txt +++ /dev/null @@ -1,88 +0,0 @@ -æœ¬å‘¨å·¥ä½œæ‘˜è¦ -1. 库存5.4.9版本核心需求开å‘与推进 - - * -完æˆåº“存预警优化的方案设计与评审,并进入开å‘ã€è‡ªæµ‹ä¸Žè½¬æµ‹é˜¶æ®µ - - * -å®žçŽ°é”€å”®å‡ºåº“çº¢å†²åŠŸèƒ½ï¼Œæ”¯æŒ App 扫ç å‡ºå…¥åº“中的获å–详情与出库æ“作 - - * -完æˆç”Ÿäº§é¢†æ–™æ·»åŠ é™„ä»¶åŠŸèƒ½ - - * -ç¼–å†™åº“å­˜éœ€æ±‚å¼€å‘æ–¹æ¡ˆæç¤ºè¯ï¼Œè¿›è¡Œé…方需求分æžçš„代ç åˆ†æž -2. 临时新增需求快速å“应(5月9日) - - * -完æˆåº“存预警优化需求剩余开å‘工作 - - * -确认并è½åœ°3个é‡è¦åŠŸèƒ½ç‚¹ï¼š - - * -ç­–ç•¥é…ç½®æŒä¹…åŒ–æœ‰æ•ˆåº“å­˜å…¬å¼ - - * -采购未到货数é‡ä¸»é€»è¾‘ - - * -统一有效库存计算å£å¾„ - - * -完æˆè‡ªæµ‹ä¸Žè½¬æµ‹ -æ¯æ—¥å·¥ä½œæƒ…况 -周三(5月6日) -任务å称: 库存5.4.9需求开å‘(维云智造G5) -执行内容: - - * -åº“å­˜éœ€æ±‚å¼€å‘æ–¹æ¡ˆæç¤ºè¯ç¼–写 - - * -é…æ–¹éœ€æ±‚分æžä»£ç åˆ†æž -周四(5月7日) -任务å称: 库存5.4.9需求开å‘(维云智造G5) -执行内容: - - * -销售出库红冲 App 扫ç å‡ºå…¥åº“:获å–详情与出库æ“作 - - * -生产领料添加附件功能 -周五(5月8日) -任务å称: 库存5.4.9需求开å‘(维云智造G5) -执行内容: - - * -åº“å­˜é¢„è­¦ä¼˜åŒ–å¼€å‘æ–¹æ¡ˆè®¾è®¡ä¸Žè¯„审 - - * -åº“å­˜é¢„è­¦åŠŸèƒ½å¼€å‘ -周六(5月9日) -任务å称: 库存管ç†ä¸´æ—¶æ–°å¢žæ›¿æ¢éœ€æ±‚梳ç†å’Œå¼€å‘(维云智造G5) -执行内容: - - * -åº“å­˜é¢„è­¦ä¼˜åŒ–éœ€æ±‚å¼€å‘ - - * -新增功能点确认:策略é…ç½®æŒä¹…åŒ–æœ‰æ•ˆåº“å­˜å…¬å¼ - - * -新增功能点确认:采购未到货数é‡ä¸» - - * -统一计算有效库存 - - * -自测 & 转测 -存在问题 - - * -æ—  -Best regards, -æ¨è½© -地å€ï¼šä¸­å›½Â·å—京软件谷软件大é“11å·èŠ±ç¥žå¤§åŽ¦3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn diff --git a/workspace-resume/eml-archive/2026-05-15_1640_2026年第20周工作周报_æ¨è½©---9e8b9b52-9a73-4db1-8ad4-a4ce8729e95a.txt b/workspace-resume/eml-archive/2026-05-15_1640_2026年第20周工作周报_æ¨è½©---9e8b9b52-9a73-4db1-8ad4-a4ce8729e95a.txt deleted file mode 100644 index 84ac470..0000000 --- a/workspace-resume/eml-archive/2026-05-15_1640_2026年第20周工作周报_æ¨è½©---9e8b9b52-9a73-4db1-8ad4-a4ce8729e95a.txt +++ /dev/null @@ -1,71 +0,0 @@ -# 2026年第20周工作周报 - -**å§“å:** æ¨è½© -**周期:** 2026-05-12(周二)~ 2026-05-15(周五) -**项目:** 维云智造 G5 - åº“å­˜ç®¡ç† - ---- - -## æœ¬å‘¨å·¥ä½œæ‘˜è¦ - -**1. 库存5.4.9版本测试修å¤ä¸Žç‰ˆæœ¬å‘布** - -完æˆåº“存预警功能的测试验è¯ä¸Žåކå²é—®é¢˜ä¿®å¤ - -å®ŒæˆæŠ¥åºŸå…¥åº“å¯¹æŽ¥ç”Ÿäº§ç¼ºé™·ä¿®å¤ä¸Žè”调转测 - -完æˆç”Ÿäº§å…¥åº“质检备注自测åŠé—®é¢˜ä¿®å¤ - -完æˆç”Ÿäº§é¢†æ–™é™„ä»¶åŠŸèƒ½æµ‹è¯•é—®é¢˜ä¿®å¤ - -**2. 新增需求开å‘** - -æ–°å¢žé‡‡è´­å…¥åº“æŽ¥å£ - -批é‡åˆ é™¤å…¥åº“啿®å’Œå…¥åº“作业(红冲ã€éžçº¢å†²ï¼‰ï¼Œäº‹åŠ¡ä¸€è‡´æ€§å¤„ç† - -完æˆåº“存版本å‘å¸ƒæ”¯æŒ - -## æ¯æ—¥å·¥ä½œæƒ…况 - -### 周二(5月12日) -**任务å称:** 库存管ç†ä¸´æ—¶æ–°å¢žæ›¿æ¢éœ€æ±‚梳ç†å’Œå¼€å‘(维云智造G5) -**执行内容:** - -库存预警历å²é—®é¢˜ä¿®å¤ - -æŠ¥åºŸå…¥åº“å¯¹æŽ¥ç”Ÿäº§ç¼ºé™·ä¿®å¤ - -### 周三(5月13日) -**任务å称:** 库存测试问题修å¤ï¼Œç‰ˆæœ¬å‘布上线支撑(维云智造G5) -**执行内容:** - -ç”Ÿäº§å…¥åº“é—®é¢˜ä¿®å¤ - -æŠ¥åºŸå…¥åº“é—®é¢˜ä¿®å¤ - -åº“å­˜é¢„è­¦æµ‹è¯•å®Œæˆ - -### 周四(5月14日) -**任务å称:** 库存测试问题修å¤ï¼Œç‰ˆæœ¬å‘布上线支撑(维云智造G5) -**执行内容:** - -åº“å­˜æµ‹è¯•å®Œæˆ - -库存版本å‘å¸ƒæ”¯æŒ - -### 周五(5月15日) -**任务å称:** 库存测试问题修å¤ï¼Œç‰ˆæœ¬å‘布上线支撑(维云智造G5) -**执行内容:** - -æ–°å¢žé‡‡è´­å…¥åº“æŽ¥å£ - -批é‡åˆ é™¤å…¥åº“啿®å’Œå…¥åº“作业(红冲ã€éžçº¢å†²ï¼‰ï¼Œäº‹åŠ¡ä¸€è‡´æ€§ - -## 存在问题 - -æ—  - ---- - -*ç”Ÿæˆæ—¶é—´ï¼š2026-05-15 16:38* \ No newline at end of file diff --git a/workspace-resume/eml-archive/2026-05-15_1640_G5周报.txt b/workspace-resume/eml-archive/2026-05-15_1640_G5周报.txt deleted file mode 100644 index 84ac470..0000000 --- a/workspace-resume/eml-archive/2026-05-15_1640_G5周报.txt +++ /dev/null @@ -1,71 +0,0 @@ -# 2026年第20周工作周报 - -**å§“å:** æ¨è½© -**周期:** 2026-05-12(周二)~ 2026-05-15(周五) -**项目:** 维云智造 G5 - åº“å­˜ç®¡ç† - ---- - -## æœ¬å‘¨å·¥ä½œæ‘˜è¦ - -**1. 库存5.4.9版本测试修å¤ä¸Žç‰ˆæœ¬å‘布** - -完æˆåº“存预警功能的测试验è¯ä¸Žåކå²é—®é¢˜ä¿®å¤ - -å®ŒæˆæŠ¥åºŸå…¥åº“å¯¹æŽ¥ç”Ÿäº§ç¼ºé™·ä¿®å¤ä¸Žè”调转测 - -完æˆç”Ÿäº§å…¥åº“质检备注自测åŠé—®é¢˜ä¿®å¤ - -完æˆç”Ÿäº§é¢†æ–™é™„ä»¶åŠŸèƒ½æµ‹è¯•é—®é¢˜ä¿®å¤ - -**2. 新增需求开å‘** - -æ–°å¢žé‡‡è´­å…¥åº“æŽ¥å£ - -批é‡åˆ é™¤å…¥åº“啿®å’Œå…¥åº“作业(红冲ã€éžçº¢å†²ï¼‰ï¼Œäº‹åŠ¡ä¸€è‡´æ€§å¤„ç† - -完æˆåº“存版本å‘å¸ƒæ”¯æŒ - -## æ¯æ—¥å·¥ä½œæƒ…况 - -### 周二(5月12日) -**任务å称:** 库存管ç†ä¸´æ—¶æ–°å¢žæ›¿æ¢éœ€æ±‚梳ç†å’Œå¼€å‘(维云智造G5) -**执行内容:** - -库存预警历å²é—®é¢˜ä¿®å¤ - -æŠ¥åºŸå…¥åº“å¯¹æŽ¥ç”Ÿäº§ç¼ºé™·ä¿®å¤ - -### 周三(5月13日) -**任务å称:** 库存测试问题修å¤ï¼Œç‰ˆæœ¬å‘布上线支撑(维云智造G5) -**执行内容:** - -ç”Ÿäº§å…¥åº“é—®é¢˜ä¿®å¤ - -æŠ¥åºŸå…¥åº“é—®é¢˜ä¿®å¤ - -åº“å­˜é¢„è­¦æµ‹è¯•å®Œæˆ - -### 周四(5月14日) -**任务å称:** 库存测试问题修å¤ï¼Œç‰ˆæœ¬å‘布上线支撑(维云智造G5) -**执行内容:** - -åº“å­˜æµ‹è¯•å®Œæˆ - -库存版本å‘å¸ƒæ”¯æŒ - -### 周五(5月15日) -**任务å称:** 库存测试问题修å¤ï¼Œç‰ˆæœ¬å‘布上线支撑(维云智造G5) -**执行内容:** - -æ–°å¢žé‡‡è´­å…¥åº“æŽ¥å£ - -批é‡åˆ é™¤å…¥åº“啿®å’Œå…¥åº“作业(红冲ã€éžçº¢å†²ï¼‰ï¼Œäº‹åŠ¡ä¸€è‡´æ€§ - -## 存在问题 - -æ—  - ---- - -*ç”Ÿæˆæ—¶é—´ï¼š2026-05-15 16:38* \ No newline at end of file diff --git a/workspace-resume/eml-archive/2026-05-15_1641_2026年第20周工作周报_æ¨è½©---c184c1f1-9e60-4100-852d-5b0b03d0bdd1.txt b/workspace-resume/eml-archive/2026-05-15_1641_2026年第20周工作周报_æ¨è½©---c184c1f1-9e60-4100-852d-5b0b03d0bdd1.txt deleted file mode 100644 index 84ac470..0000000 --- a/workspace-resume/eml-archive/2026-05-15_1641_2026年第20周工作周报_æ¨è½©---c184c1f1-9e60-4100-852d-5b0b03d0bdd1.txt +++ /dev/null @@ -1,71 +0,0 @@ -# 2026年第20周工作周报 - -**å§“å:** æ¨è½© -**周期:** 2026-05-12(周二)~ 2026-05-15(周五) -**项目:** 维云智造 G5 - åº“å­˜ç®¡ç† - ---- - -## æœ¬å‘¨å·¥ä½œæ‘˜è¦ - -**1. 库存5.4.9版本测试修å¤ä¸Žç‰ˆæœ¬å‘布** - -完æˆåº“存预警功能的测试验è¯ä¸Žåކå²é—®é¢˜ä¿®å¤ - -å®ŒæˆæŠ¥åºŸå…¥åº“å¯¹æŽ¥ç”Ÿäº§ç¼ºé™·ä¿®å¤ä¸Žè”调转测 - -完æˆç”Ÿäº§å…¥åº“质检备注自测åŠé—®é¢˜ä¿®å¤ - -完æˆç”Ÿäº§é¢†æ–™é™„ä»¶åŠŸèƒ½æµ‹è¯•é—®é¢˜ä¿®å¤ - -**2. 新增需求开å‘** - -æ–°å¢žé‡‡è´­å…¥åº“æŽ¥å£ - -批é‡åˆ é™¤å…¥åº“啿®å’Œå…¥åº“作业(红冲ã€éžçº¢å†²ï¼‰ï¼Œäº‹åŠ¡ä¸€è‡´æ€§å¤„ç† - -完æˆåº“存版本å‘å¸ƒæ”¯æŒ - -## æ¯æ—¥å·¥ä½œæƒ…况 - -### 周二(5月12日) -**任务å称:** 库存管ç†ä¸´æ—¶æ–°å¢žæ›¿æ¢éœ€æ±‚梳ç†å’Œå¼€å‘(维云智造G5) -**执行内容:** - -库存预警历å²é—®é¢˜ä¿®å¤ - -æŠ¥åºŸå…¥åº“å¯¹æŽ¥ç”Ÿäº§ç¼ºé™·ä¿®å¤ - -### 周三(5月13日) -**任务å称:** 库存测试问题修å¤ï¼Œç‰ˆæœ¬å‘布上线支撑(维云智造G5) -**执行内容:** - -ç”Ÿäº§å…¥åº“é—®é¢˜ä¿®å¤ - -æŠ¥åºŸå…¥åº“é—®é¢˜ä¿®å¤ - -åº“å­˜é¢„è­¦æµ‹è¯•å®Œæˆ - -### 周四(5月14日) -**任务å称:** 库存测试问题修å¤ï¼Œç‰ˆæœ¬å‘布上线支撑(维云智造G5) -**执行内容:** - -åº“å­˜æµ‹è¯•å®Œæˆ - -库存版本å‘å¸ƒæ”¯æŒ - -### 周五(5月15日) -**任务å称:** 库存测试问题修å¤ï¼Œç‰ˆæœ¬å‘布上线支撑(维云智造G5) -**执行内容:** - -æ–°å¢žé‡‡è´­å…¥åº“æŽ¥å£ - -批é‡åˆ é™¤å…¥åº“啿®å’Œå…¥åº“作业(红冲ã€éžçº¢å†²ï¼‰ï¼Œäº‹åŠ¡ä¸€è‡´æ€§ - -## 存在问题 - -æ—  - ---- - -*ç”Ÿæˆæ—¶é—´ï¼š2026-05-15 16:38* \ No newline at end of file diff --git a/workspace-resume/eml-archive/2026-05-15_1641_G5周报.txt b/workspace-resume/eml-archive/2026-05-15_1641_G5周报.txt deleted file mode 100644 index 84ac470..0000000 --- a/workspace-resume/eml-archive/2026-05-15_1641_G5周报.txt +++ /dev/null @@ -1,71 +0,0 @@ -# 2026年第20周工作周报 - -**å§“å:** æ¨è½© -**周期:** 2026-05-12(周二)~ 2026-05-15(周五) -**项目:** 维云智造 G5 - åº“å­˜ç®¡ç† - ---- - -## æœ¬å‘¨å·¥ä½œæ‘˜è¦ - -**1. 库存5.4.9版本测试修å¤ä¸Žç‰ˆæœ¬å‘布** - -完æˆåº“存预警功能的测试验è¯ä¸Žåކå²é—®é¢˜ä¿®å¤ - -å®ŒæˆæŠ¥åºŸå…¥åº“å¯¹æŽ¥ç”Ÿäº§ç¼ºé™·ä¿®å¤ä¸Žè”调转测 - -完æˆç”Ÿäº§å…¥åº“质检备注自测åŠé—®é¢˜ä¿®å¤ - -完æˆç”Ÿäº§é¢†æ–™é™„ä»¶åŠŸèƒ½æµ‹è¯•é—®é¢˜ä¿®å¤ - -**2. 新增需求开å‘** - -æ–°å¢žé‡‡è´­å…¥åº“æŽ¥å£ - -批é‡åˆ é™¤å…¥åº“啿®å’Œå…¥åº“作业(红冲ã€éžçº¢å†²ï¼‰ï¼Œäº‹åŠ¡ä¸€è‡´æ€§å¤„ç† - -完æˆåº“存版本å‘å¸ƒæ”¯æŒ - -## æ¯æ—¥å·¥ä½œæƒ…况 - -### 周二(5月12日) -**任务å称:** 库存管ç†ä¸´æ—¶æ–°å¢žæ›¿æ¢éœ€æ±‚梳ç†å’Œå¼€å‘(维云智造G5) -**执行内容:** - -库存预警历å²é—®é¢˜ä¿®å¤ - -æŠ¥åºŸå…¥åº“å¯¹æŽ¥ç”Ÿäº§ç¼ºé™·ä¿®å¤ - -### 周三(5月13日) -**任务å称:** 库存测试问题修å¤ï¼Œç‰ˆæœ¬å‘布上线支撑(维云智造G5) -**执行内容:** - -ç”Ÿäº§å…¥åº“é—®é¢˜ä¿®å¤ - -æŠ¥åºŸå…¥åº“é—®é¢˜ä¿®å¤ - -åº“å­˜é¢„è­¦æµ‹è¯•å®Œæˆ - -### 周四(5月14日) -**任务å称:** 库存测试问题修å¤ï¼Œç‰ˆæœ¬å‘布上线支撑(维云智造G5) -**执行内容:** - -åº“å­˜æµ‹è¯•å®Œæˆ - -库存版本å‘å¸ƒæ”¯æŒ - -### 周五(5月15日) -**任务å称:** 库存测试问题修å¤ï¼Œç‰ˆæœ¬å‘布上线支撑(维云智造G5) -**执行内容:** - -æ–°å¢žé‡‡è´­å…¥åº“æŽ¥å£ - -批é‡åˆ é™¤å…¥åº“啿®å’Œå…¥åº“作业(红冲ã€éžçº¢å†²ï¼‰ï¼Œäº‹åŠ¡ä¸€è‡´æ€§ - -## 存在问题 - -æ—  - ---- - -*ç”Ÿæˆæ—¶é—´ï¼š2026-05-15 16:38* \ No newline at end of file diff --git a/workspace-resume/eml-archive/2026-05-15_1714_G5周报.txt b/workspace-resume/eml-archive/2026-05-15_1714_G5周报.txt deleted file mode 100644 index 8e233a5..0000000 --- a/workspace-resume/eml-archive/2026-05-15_1714_G5周报.txt +++ /dev/null @@ -1,55 +0,0 @@ -周报(2026å¹´5月11æ—¥ ï¼ 2026å¹´5月15日) -项目å称: 维云智造G5 -主è¦ä»»åŠ¡ï¼š 库存管ç†ä¸´æ—¶æ–°å¢žæ›¿æ¢éœ€æ±‚梳ç†å’Œå¼€å‘ / 库存测试问题修å¤ï¼Œç‰ˆæœ¬å‘布上线支撑 -本周工作内容 -周一(2026-05-11) - - * -库存预警新增功能点测试 - - * -报废入库生产è”è°ƒåŠè½¬æµ‹ - - * -生产入库质检备注功能自测 - - * -ç”Ÿäº§é¢†æ–™é™„ä»¶åŠŸèƒ½æµ‹è¯•é—®é¢˜ä¿®å¤ -周二(2026-05-12) - - * -库存预警历å²é—®é¢˜ä¿®å¤ - - * -æŠ¥åºŸå…¥åº“å¯¹æŽ¥ç”Ÿäº§ç¼ºé™·ä¿®å¤ -周三(2026-05-13) - - * -ç”Ÿäº§å…¥åº“é—®é¢˜ä¿®å¤ - - * -æŠ¥åºŸå…¥åº“é—®é¢˜ä¿®å¤ - - * -åº“å­˜é¢„è­¦åŠŸèƒ½æµ‹è¯•å®Œæˆ -周四(2026-05-14) - - * -åº“å­˜æ•´ä½“åŠŸèƒ½æµ‹è¯•å®Œæˆ - - * -库存版本å‘å¸ƒä¸Šçº¿æ”¯æŒ -周五(2026-05-15) - - * -新增采购入库接å£å¼€å‘ - - * -批é‡åˆ é™¤å…¥åº“啿®å’Œå…¥åº“作业(红冲ã€éžçº¢å†²ï¼‰äº‹åŠ¡ä¸€è‡´æ€§å¤„ç† -存在问题 -本周暂无记录问题。 -Best regards, -æ¨è½© -地å€ï¼šä¸­å›½Â·å—京软件谷软件大é“11å·èŠ±ç¥žå¤§åŽ¦3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn diff --git a/workspace-resume/eml-archive/2026-05-15_1714_G5å¼€å‘周报_2026-05-11_--_2026-05-15---61da95c1-1091-4346-90d7-f407fd717364.txt b/workspace-resume/eml-archive/2026-05-15_1714_G5å¼€å‘周报_2026-05-11_--_2026-05-15---61da95c1-1091-4346-90d7-f407fd717364.txt deleted file mode 100644 index 8e233a5..0000000 --- a/workspace-resume/eml-archive/2026-05-15_1714_G5å¼€å‘周报_2026-05-11_--_2026-05-15---61da95c1-1091-4346-90d7-f407fd717364.txt +++ /dev/null @@ -1,55 +0,0 @@ -周报(2026å¹´5月11æ—¥ ï¼ 2026å¹´5月15日) -项目å称: 维云智造G5 -主è¦ä»»åŠ¡ï¼š 库存管ç†ä¸´æ—¶æ–°å¢žæ›¿æ¢éœ€æ±‚梳ç†å’Œå¼€å‘ / 库存测试问题修å¤ï¼Œç‰ˆæœ¬å‘布上线支撑 -本周工作内容 -周一(2026-05-11) - - * -库存预警新增功能点测试 - - * -报废入库生产è”è°ƒåŠè½¬æµ‹ - - * -生产入库质检备注功能自测 - - * -ç”Ÿäº§é¢†æ–™é™„ä»¶åŠŸèƒ½æµ‹è¯•é—®é¢˜ä¿®å¤ -周二(2026-05-12) - - * -库存预警历å²é—®é¢˜ä¿®å¤ - - * -æŠ¥åºŸå…¥åº“å¯¹æŽ¥ç”Ÿäº§ç¼ºé™·ä¿®å¤ -周三(2026-05-13) - - * -ç”Ÿäº§å…¥åº“é—®é¢˜ä¿®å¤ - - * -æŠ¥åºŸå…¥åº“é—®é¢˜ä¿®å¤ - - * -åº“å­˜é¢„è­¦åŠŸèƒ½æµ‹è¯•å®Œæˆ -周四(2026-05-14) - - * -åº“å­˜æ•´ä½“åŠŸèƒ½æµ‹è¯•å®Œæˆ - - * -库存版本å‘å¸ƒä¸Šçº¿æ”¯æŒ -周五(2026-05-15) - - * -新增采购入库接å£å¼€å‘ - - * -批é‡åˆ é™¤å…¥åº“啿®å’Œå…¥åº“作业(红冲ã€éžçº¢å†²ï¼‰äº‹åŠ¡ä¸€è‡´æ€§å¤„ç† -存在问题 -本周暂无记录问题。 -Best regards, -æ¨è½© -地å€ï¼šä¸­å›½Â·å—京软件谷软件大é“11å·èŠ±ç¥žå¤§åŽ¦3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn diff --git a/workspace-resume/eml-archive/2026-05-22_1713_G5周报.txt b/workspace-resume/eml-archive/2026-05-22_1713_G5周报.txt deleted file mode 100644 index 211de96..0000000 --- a/workspace-resume/eml-archive/2026-05-22_1713_G5周报.txt +++ /dev/null @@ -1,51 +0,0 @@ -项目å称: 维云智造G5 -主è¦ä»»åŠ¡ï¼š 库存版本需求开å‘åŠæŽ¥å£è‡ªæµ‹ -本周工作内容 -周一(2026-05-18) - - * -生产入库接å£ä¼˜åŒ– - - * -线上问题排查 - - * -其他入库接å£å¼€å‘ -周二(2026-05-19) - - * -åˆ é™¤å‡ºåº“åŒæ—¶å–消出库功能实现 - - * -出库接å£å¢žåŠ æ‰¹æ¬¡å‡ºåº“é€»è¾‘ -周三(2026-05-20) - - * -出入库查询接å£ä¼˜åŒ– - - * -入库æµç¨‹ä»£ç é‡æž„,é™ä½ŽService层代ç è¡Œæ•° -周四(2026-05-21) - - * -查询接å£è‡ªæµ‹å¹¶è½¬æµ‹ - - * -入库新增接å£è‡ªæµ‹ - - * -入库查询接å£è‡ªæµ‹ -周五(2026-05-22) - - * -è½¬æµ‹é—®é¢˜ä¿®å¤ - - * -销售出库接å£å¼€å‘ -存在问题 -本周暂无记录问题。 -Best regards, -æ¨è½© -地å€ï¼šä¸­å›½Â·å—京软件谷软件大é“11å·èŠ±ç¥žå¤§åŽ¦3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn diff --git a/workspace-resume/eml-archive/2026-05-22_1713_周报_2026å¹´5月18æ—¥_2026å¹´5月22æ—¥---28bff81e-17b9-44d3-9bbf-45875fc0b426.txt b/workspace-resume/eml-archive/2026-05-22_1713_周报_2026å¹´5月18æ—¥_2026å¹´5月22æ—¥---28bff81e-17b9-44d3-9bbf-45875fc0b426.txt deleted file mode 100644 index 211de96..0000000 --- a/workspace-resume/eml-archive/2026-05-22_1713_周报_2026å¹´5月18æ—¥_2026å¹´5月22æ—¥---28bff81e-17b9-44d3-9bbf-45875fc0b426.txt +++ /dev/null @@ -1,51 +0,0 @@ -项目å称: 维云智造G5 -主è¦ä»»åŠ¡ï¼š 库存版本需求开å‘åŠæŽ¥å£è‡ªæµ‹ -本周工作内容 -周一(2026-05-18) - - * -生产入库接å£ä¼˜åŒ– - - * -线上问题排查 - - * -其他入库接å£å¼€å‘ -周二(2026-05-19) - - * -åˆ é™¤å‡ºåº“åŒæ—¶å–消出库功能实现 - - * -出库接å£å¢žåŠ æ‰¹æ¬¡å‡ºåº“é€»è¾‘ -周三(2026-05-20) - - * -出入库查询接å£ä¼˜åŒ– - - * -入库æµç¨‹ä»£ç é‡æž„,é™ä½ŽService层代ç è¡Œæ•° -周四(2026-05-21) - - * -查询接å£è‡ªæµ‹å¹¶è½¬æµ‹ - - * -入库新增接å£è‡ªæµ‹ - - * -入库查询接å£è‡ªæµ‹ -周五(2026-05-22) - - * -è½¬æµ‹é—®é¢˜ä¿®å¤ - - * -销售出库接å£å¼€å‘ -存在问题 -本周暂无记录问题。 -Best regards, -æ¨è½© -地å€ï¼šä¸­å›½Â·å—京软件谷软件大é“11å·èŠ±ç¥žå¤§åŽ¦3F -手机:18726128489 -邮箱:yangxuan@witsoft.cn diff --git a/workspace-resume/memory/2026-08-27.md b/workspace-resume/memory/2026-08-27.md new file mode 100644 index 0000000..41691ce --- /dev/null +++ b/workspace-resume/memory/2026-08-27.md @@ -0,0 +1,92 @@ +# 2026-08-27 + +## 6-7月周报缺失补全(eml è§£æžå½’档) + +### 背景 +用户å‘现 6-7 月周报记录缺失(2026 目录中 W23-W26 是å ä½/示例内容,W29-W31 部分旧格å¼ï¼‰ã€‚用户从钉邮下载了周报邮件 eml 文件补全。 + +### 完æˆçš„工作 +1. **å®šä½ eml**:附件上传åŽè‡ªåЍè½ç›˜åœ¨ `/home/yangxuan/.openclaw/media/inbound/*.eml`,共 12 å°ï¼ˆå« W23 é‚£å°ï¼‰ +2. **编写解æžå·¥å…·**: + - `weekly-reports/parse_eml_to_md.py`ï¼šè§£ç  multipart 邮件的 text/plain base64 正文 → ç”Ÿæˆæ ‡å‡†æ ¼å¼ `2026/2026-Www-周报.md` + - `weekly-reports/import_md_to_db.py`:读 Markdown → å…¨é‡é‡å»º SQLite(主表+æ¯æ—¥æ˜Žç»†+问题),覆盖旧å ä½ +3. **归档结果**:12 份周报全部生æˆå¹¶å…¥åº“,归档文件与数æ®åº“一一对应(校验 ✅) + +### 归档的周报(2026) +- **6 月**:W23(æžç®€app) W24(库存缺陷修å¤) W25(主数æ®) W26(库存需求) W27(版本å‘布支撑) +- **7 月**:W28(消æ¯é€šçŸ¥åŠŸèƒ½) W29(库存出库缺陷修å¤) W30(主数æ®é¡µé¢) W31(G6 委外呿–™) +- **8 月**:W32(G6 工程é…ç½®) W33(销售管ç†) W34(G6 销售采购) + +### 关键ç»éªŒ / å‘ +- eml 列表项 `*` 与文字常被拆æˆ**两行**,需整行归入当日明细 +- 日期行有 `周一(2026-06-08)`(带年)和 `周一(06-08)`(ä¸å¸¦å¹´ï¼‰ä¸¤ç§ï¼Œè¿˜æœ‰ 📅 emoji å‰ç¼€ +- 「存在问题ã€åŒºï¼š`æ— /暂无` ä¸ç®—问题;`下周计划` ç­‰å°æ ‡é¢˜éœ€é€€å‡ºé—®é¢˜åŒºï¼Œä½†æ­£æ–‡å­—段如「本周部分...ã€ä¸èƒ½è¯¯åˆ¤ï¼ˆæ­£åˆ™è¦æ”¶ç´§ï¼‰ +- é¡¹ç›®åæ®å†…å®¹è‡ªåŠ¨åˆ¤ G5/G6,标题éšä¹‹åŠ¨æ€ +- æ•°æ®åº“有历å²**孤儿问题记录**(report_id æ— å¯¹åº”ä¸»è¡¨ï¼‰ï¼Œéœ€æ¸…ç† +- æ—§æ ¼å¼ `2026-W29.md` 与标准 `2026-W29-周报.md` é‡å¤ï¼Œå¾…ç”¨æˆ·ç¡®è®¤æ˜¯å¦æ¸…ç† + +### 待办 +- [x] æ—§ `2026-W29.md` åŽ»ç•™ï¼ˆåŒ W29-周报 内容é‡å¤ï¼‰ï¼Œå·²ç§»å…¥å›žæ”¶ç«™ +- [x] æ¸…ç† `media/inbound` 下已处ç†çš„ 12 å°å‘¨æŠ¥ eml,已移入回收站 +- [x] `eml-archive/` 目录:核实全部 50 份历å²å‘¨æŠ¥åœ¨ weekly-reports 凿œ‰å‰¯æœ¬ï¼ˆé›¶ç¼ºå¤±ï¼‰ï¼Œå±žè¿ç§»åŽé—留冗余,已移入回收站 + +### 技能文档更新 & 归档链路盘点(10:44) +- **æ›´æ–° `skills/weekly-report/SKILL.md`**:补全第 5 步「自动归档ã€â€”—说明 `send_to_drafts()` 默认 `archive=True`,存è‰ç¨¿ç®±åŽè‡ªåŠ¨å½’æ¡£ Markdown 到 `weekly-reports/YYYY/YYYY-Www-周报.md`;但脚本本身**ä¸å†™ SQLite**,入库需手动 `sync_reports_db.py` / `import_md_to_db.py`;命令行 `--no-archive` å¯è·³è¿‡ï¼›åŽŸã€Œæœ€åŽé€šçŸ¥ã€æ”¹åºå·ä¸º 6 +- **修正 TOOLS.md & MEMORY.md ä¸å‡†ç¡®æè¿°**:原写 `send_weekly_report.py` ä¼šã€ŒåŒæ­¥å…ƒæ•°æ®åˆ° dbã€â€”—实际脚本ä¸å†™åº“,已改为如实说明 + +### å½’æ¡£æ“作全景(已盘点) +1. **`send_weekly_report.py`**(生æˆå‘¨æŠ¥æ—¶ï¼‰â†’ `archive_report()` åªå†™ md,ä¸å…¥åº“ +2. **`parse_eml_to_md.py` + `import_md_to_db.py`**(本次新加)→ eml→md→db 全链 +3. **`sync_reports_db.py`** / `sync_reports_to_db.py`(备用)→ md→db åŒæ­¥ +4. **`migrate_legacy_reports.py`** → æ—§ txt→md è¿ç§» +5. **cron「周五周报å‘逿£€æŸ¥ã€** → åªæŸ¥è‰ç¨¿ç®±ï¼Œä¸å½’æ¡£ +- 结论:归档链路完整,但 **send_weekly_report.py 生æˆå‘¨æŠ¥åŽä¸ä¼šè‡ªåŠ¨å…¥åº“æ•°æ®åº“**,需手动 sync + +### MySQL 周报数æ®ä¸­æž¢ï¼ˆæ–¹æ¡ˆ A)建立(10:45-10:55) +- **背景**:用户备有本地 MySQL `resume` 库(简历业务库),问为何用 SQLite。确认方案 A:SQLite åšæœ¬åœ°å½’档,MySQL åšç»Ÿä¸€æ•°æ®ä¸­æž¢ï¼ˆæœˆåº¦/年度/OKR å–æ•°ï¼‰ +- **在 resume 库建 3 张周报表**:weekly_reports(主)ã€weekly_report_daily(明细)ã€weekly_report_problems(问题),外键 report_id çº§è” +- **撰写 `weekly-reports/migrate_to_mysql.py`**:SQLite → MySQL å…¨é‡è¿ç§»ï¼ˆ--dry-run 预览) +- **è¿ç§» 12 份核心周报**(2026-W23~W34,G5×9+G6×3),明细 60 æ¡ã€é—®é¢˜ 1 æ¡ï¼Œ**SQLite↔MySQL 字节级一致(HEX 对比 0 ä¸ä¸€è‡´ï¼‰** +- **send_weekly_report.py 加 MySQL åŒæ­¥**:新增 `sync_to_mysql()`/`_parse_plain_for_db()`,`send_to_drafts()` 默认 sync_mysql=True,命令行 `--no-mysql` 跳过;已用测试数æ®éªŒè¯å†™å…¥æ­£å¸¸åŽæ¸…ç† +- **文档更新**:SKILL.md(自动归档章节加 MySQL åŒæ­¥ï¼‰ã€TOOLS.md(新增 MySQL 中枢å°èŠ‚ï¼‰ã€MEMORY.md(新增方案 A 章节) +- **用户决策**:åªè¿é«˜è´¨é‡æ ¸å¿ƒæ•°æ®ï¼ˆ39 份å™è¿°å¼ txt ä¸è¿ï¼‰ï¼›OKR åŽç»­å†å¤„ç† + +### OKR 1月绩效归档(11:00) +- 用户æä¾› `研究院-维云智造G5-1月OKR-æ¨è½©.xlsx`ï¼Œè¦æ±‚è§£æžå½’æ¡£ 202601(方案 A:入库 MySQL resume) +- 在 resume 库建 2 å¼  OKR 表:`okr_monthly_records`(主)+ `okr_objectives`(目标明细外键级è”) +- 撰写 `okr/parse_okr_to_mysql.py`(读 Excel sheet → 写 MySQLï¼›--month/--dry-run) +- **已归档 202601 æ¨è½©**:6 é¡¹ç›®æ ‡ã€æœˆåº¦è¯„ä»· 7.0ã€æƒé‡ 0.15/0.2/0.15/0.1/0.2/0.2 +- Excel 特点:一文件多 sheet(202511/202512/202601/实施总监/Sheet1),实为 3 个月数æ®ï¼›ç”¨æˆ·åªè¦ 202601 +- 文档:MEMORY.mdã€TOOLS.md 已更新 + +### OKR 8月新模æ¿å½’档(11:01) +- 用户æä¾› `研究院-产å“å¼€å‘部开å‘组-8月OKR-æ¨è½©.xlsx`,æç¤ºâ€œ8月æ¢äº†æ¨¡ç‰ˆâ€ +- **新模æ¿å·®å¼‚**ï¼šå• sheet `OKR考核`(旧模æ¿å¤š sheet);表头行5-6(旧行4);目标行8起跳过示例行7,5 项(旧 6 项行5-10);列ä½å˜ï¼ˆæ—§E/KR→新D/KR,旧F/完æˆâ†’æ–°E/完æˆï¼Œè¯„分新在G);人员信æ¯åœ¨ B3(旧B2);跨月周期“7月27æ—¥-8月27æ—¥â€å–考核期末→202608 +- **扩展 parse_okr_to_mysql.py**:新增 detect_template()/parse_sheet_new()/parse_sheet_old()ï¼Œè‡ªåŠ¨è¯†åˆ«æ–°æ—§æ¨¡æ¿ +- **已归档 202608 æ¨è½©**:5 项目标(æƒé‡ 0.5/0.25/0.1/0.1/0.05,评分å‡7),月度评价字段上级未填→NULL(I13 çš„ 1 是“月度工作补充â€å¾—åˆ†éžæœˆåº¦è¯„价,已修正ä¸è¯¯å–) +- 与 202601 并存于 okr_monthly_records(id 1ã€2) +- 文档:TOOLS.mdã€MEMORY.md 已更新 + +### OKR 2-7月批é‡å½’档(11:04) +- 用户æä¾› `研究院-维云智造G5-7月OKR-æ¨è½©.xlsx`(旧模æ¿ï¼Œå«å¤šä¸ªè€ƒæ ¸æœˆ sheetï¼‰ï¼Œè¦æ±‚å½’æ¡£ 2-7 月 +- **扩展 parse_okr_to_mysql.py**ï¼šé‡æž„为 process_sheet() æ‰¹é‡æ¨¡å¼ï¼Œæ”¯æŒ `--month 202602-202607`(范围)ã€é€—å·åˆ†éš”ã€å•个月份 +- **已归档 202602~202607**ï¼šæ¯æœˆ 6 é¡¹ç›®æ ‡ã€æœˆåº¦è¯„ä»·å‡ 7.0 +- 至此 MySQL 里 OKR 完整:202601~202608 å…± 8 个月ã€47 项目标 + +### 上åŠå¹´è‡ªæˆ‘诊断分æžï¼ˆ11:06-11:08ï¼Œä»…å¯¹è¯æœªä¿å­˜ï¼‰ +- ç”¨æˆ·è¦æ±‚â€œå…ˆåˆ†æžæ±‡æ€»ä¸ŠåŠå¹´å·¥ä½œï¼Œé˜²æ­¢å¹´åº•æ‰æš´éœ²é—®é¢˜â€ï¼Œè¾“å‡ºè‡ªæˆ‘è¯Šæ–­é—®é¢˜æ¸…å• + 工作é‡å¿ƒåˆ†å¸ƒï¼Œæ‰“å°åˆ°å¯¹è¯ã€ä¸ä¿å­˜ +- **工作é‡å¿ƒæ¼”è¿›**:1-3月主数æ®/ç»é”€å­˜/销售 → 4月库存爆å‘(app扫ç å…¥åº“28项) → 5月OpenAPI+å¤§è§„æ¨¡é‡æž„(740行→50行) → 6月库存预警/MRP/ç‰©æ–™è½¬æ¢ +- **è¦ç‚¹å‘现**: + - 🔴 目标3(è´¨é‡bug)1-6æœˆæ¯æœˆåŒä¸€æ¨¡æ¿è¯æœ¯ï¼Œæ— é‡åŒ– → è´¨é‡æ— æ³•è¯æ˜Ž + - 🔴 3-6æœˆæ¯æœˆåŠ ç­8次(2月5次),无产出关è”说明 + - 🟡 1-2月“未产生概è¦è®¾è®¡â€ï¼Œ3月起æ‰ç•™æ–¹æ¡ˆæ–‡æ¡£ + - 🟡 上åŠå¹´å¤§é‡å­—段/打å°/å¯¼å‡ºç­‰ä¼˜åŒ–æ‚æ´»ï¼Œæ–°åŠŸèƒ½å æ¯”å低 + - 🟡 6æœˆå¯†é›†åŽ†å²æŠ€æœ¯å€ºä¿®å¤ï¼ˆMRP预留/汇率/空指针),存é‡å€ºæœªç³»ç»Ÿæ€§æ²»ç† + - ✅ äº®ç‚¹ï¼šæž¶æž„é‡æž„能力ã€è·¨æ¨¡å—广度ã€å¤æ‚业务扎实 +- **已给 4 æ¡è¡ŒåŠ¨å»ºè®®**:数字化记录质é‡/加ç­/缺陷ã€è¡¥é‡åŒ–è¯æ®ã€è¯„ä¼°æ‚æ´»åˆ†æ‹…ã€æŽ¨åŠ¨æŠ€æœ¯å€ºæ•´æ”¹æ¸…å• + +### 清ç†è¯´æ˜Žï¼ˆå›žæ”¶ç«™ï¼‰ +- 无系统 trash 命令,改用 mv 移到 `~/.local/share/Trash/files/`ï¼ˆå¯æ¢å¤ï¼‰ +- 移入对象:12 å°å‘¨æŠ¥ eml + `2026-W29.md` + `eml-archive/` 目录,共 14 个 +- inbound 内其他éžå‘¨æŠ¥æ–‡ä»¶ï¼ˆè´¦å•/è¯æ˜Ž/PDF/PBS 文档等)ä¿ç•™æœªåЍ +- æ•°æ®åº“ 12 份周报完整,未å—å½±å“ diff --git a/workspace-resume/okr/parse_okr_to_mysql.py b/workspace-resume/okr/parse_okr_to_mysql.py new file mode 100644 index 0000000..df0d9bc --- /dev/null +++ b/workspace-resume/okr/parse_okr_to_mysql.py @@ -0,0 +1,268 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""è§£æžç ”究院-维云智造 OKR 绩效 Excel(æ¨è½©ï¼‰ï¼Œå½’档到 MySQL resume 库。 +æ”¯æŒæ–°æ—§ä¸¤ç§æ¨¡æ¿ï¼š + - 旧模æ¿ï¼ˆ202601 等,多 sheet):表头行4,目标行5èµ· + - 新模æ¿ï¼ˆ8æœˆèµ·ï¼Œå• sheet OKR考核):表头行5-6,目标行8起(跳过示例行) + +用法: + python3 parse_okr_to_mysql.py # è§£æž inbound 最新 OKR xlsx + python3 parse_okr_to_mysql.py --month 202601 # 指定考核月 + python3 parse_okr_to_mysql.py --file # 指定文件 + python3 parse_okr_to_mysql.py --dry-run # 预览ä¸å†™å…¥ +""" +import glob +import os +import re +import sys +import openpyxl + +MYSQL_DB = "resume" +MYSQL_HOST = "127.0.0.1" +MYSQL_PORT = 3306 +MYSQL_USER = "root" + + +def get_mysql_pwd(): + env_path = "/home/yangxuan/.openclaw/.env" + for line in open(env_path): + line = line.strip() + if line.startswith("MYSQL_PWD="): + return line.split("=", 1)[1].strip() + return "" + + +def parse_info(text): + """从人员信æ¯è¡Œè§£æž 被考核人/å²—ä½/上级/周期/时间(新旧模æ¿é€šç”¨ï¼‰""" + info = {} + m = re.search(r"(?:被考核人|å§“å)[::]\s*(\S+)", text) + info["full_name"] = m.group(1) if m else "" + m = re.search(r"å²—ä½[::]\s*(\S+)", text) + info["position"] = m.group(1) if m else "" + m = re.search(r"(?:直属上级|直接上级)[::]\s*(\S+)", text) + info["supervisor"] = m.group(1) if m else "" + m = re.search(r"考核周期[::]\s*([^\s]+)", text) + info["period"] = m.group(1).strip() if m else "" + m = re.search(r"考核时间[::]\s*(\S+)", text) + info["assess_date"] = m.group(1).strip() if m else "" + return info + + +def detect_template(ws): + """识别模æ¿ã€‚'new'=8月新模æ¿ï¼Œ'old'=202601旧模æ¿ã€‚""" + # 新模æ¿ï¼šè¡Œ5-6 å«"员工本人填报"或"关键结果" + for r in (5, 6): + for c in range(3, 12): + v = ws.cell(row=r, column=c).value + if v and ("员工本人填报" in str(v) or "关键结果" in str(v)): + return "new" + # 旧模æ¿ï¼šè¡Œ4 å«"目标O"或"关键绩效指标" + for c in range(3, 12): + v = ws.cell(row=4, column=c).value + if v and ("目标O" in str(v) or "关键绩效指标" in str(v)): + return "old" + return "new" + + +def parse_sheet_new(ws): + """è§£æž 8 月新模æ¿ï¼ˆOKR考核 sheet)""" + b3 = ws["B3"].value or "" + info = parse_info(b3) + # 月度评价:F15 æ˜¯â€œæœˆåº¦è¯„ä»·â€æ ‡ç­¾ï¼Œåˆ†æ•°åœ¨å…¶å³ä¾§ï¼ˆG15 等),上级å¯èƒ½æœªå¡« + monthly_rating = None + for coord in ("G15", "H15", "I15"): + v = ws[coord].value + if isinstance(v, (int, float)): + monthly_rating = float(v) + break + objectives = [] + for row in range(8, 40): # 目标行8èµ· + seq = ws.cell(row=row, column=2).value # B åºå· + obj = ws.cell(row=row, column=3).value # C 任务工作 + krs = ws.cell(row=row, column=4).value # D 关键结果 + compl = ws.cell(row=row, column=5).value # E å®Œæˆæƒ…况 + score = ws.cell(row=row, column=7).value # G 评分 + weight = ws.cell(row=row, column=9).value # I æƒé‡ + wscore = ws.cell(row=row, column=10).value # J 得分 + if isinstance(obj, str) and "月度工作补充" in obj: + break + if not isinstance(seq, (int, float)): + continue + objectives.append({ + "seq": int(seq), + "objective": (obj or "").strip(), + "krs": (krs or "").strip(), + "completion": (compl or "").strip(), + "score": float(score) if isinstance(score, (int, float)) else None, + "weight": float(weight) if isinstance(weight, (int, float)) else None, + "weighted_score": float(wscore) if isinstance(wscore, (int, float)) else None, + }) + return {**info, "monthly_rating": monthly_rating, "objectives": objectives} + + +def parse_sheet_old(ws): + """è§£æž 202601 旧模æ¿""" + b2 = ws["B2"].value or "" + info = parse_info(b2) + monthly_rating = None + for coord in ("J12", "B12"): + v = ws[coord].value + if isinstance(v, (int, float)): + monthly_rating = float(v) + break + objectives = [] + for row in range(5, 11): # 行5-10 对应åºå·1-6 + seq = ws.cell(row=row, column=2).value # B åºå· + obj = ws.cell(row=row, column=3).value # C 目标O + krs = ws.cell(row=row, column=5).value # E KR + compl = ws.cell(row=row, column=6).value # F å®Œæˆæƒ…况 + score = ws.cell(row=row, column=8).value # H 评分 + weight = ws.cell(row=row, column=9).value # I æƒé‡ + wscore = ws.cell(row=row, column=10).value # J åŠ æƒ + if seq is None and obj is None: + continue + objectives.append({ + "seq": seq if isinstance(seq, (int, float)) else row - 4, + "objective": (obj or "").strip(), + "krs": (krs or "").strip(), + "completion": (compl or "").strip(), + "score": float(score) if isinstance(score, (int, float)) else None, + "weight": float(weight) if isinstance(weight, (int, float)) else None, + "weighted_score": float(wscore) if isinstance(wscore, (int, float)) else None, + }) + return {**info, "monthly_rating": monthly_rating, "objectives": objectives} + + +def month_from_period(period, sheet_name, fallback): + """从考核周期/sheetå 确定 assess_month(YYYYMM) + 跨月周期(如“7月27æ—¥-8月27æ—¥â€ï¼‰å–åŽæ®µæœˆä»½ï¼ˆè€ƒæ ¸æœŸæœ«ï¼‰ + """ + # 末段月份优先(跨月周期å–考核期末,如 7月27æ—¥-8月27æ—¥ → 8月) + m = re.search(r"-(\d{1,2})月(\d{1,2})æ—¥", period or "") + if m: + return f"2026{int(m.group(1)):02d}" + m = re.search(r"(\d{4})å¹´(\d{1,2})月", period or "") + if m: + return f"{m.group(1)}{int(m.group(2)):02d}" + m = re.search(r"(\d{4})\s*(\d{2})", sheet_name or "") + if m: + return f"{m.group(1)}{int(m.group(2)):02d}" + m = re.search(r"(\d{1,2})月", period or "") + if m: + return f"2026{int(m.group(1)):02d}" + return fallback or "" + + +def process_sheet(wb, sheet_name, xls, dry_run=False): + """è§£æžå¹¶å½’æ¡£å•个 sheet,返回 (assess_month, 目标数) 或 None""" + ws = wb[sheet_name] + tpl = detect_template(ws) + print(f"📑 Sheet:{sheet_name} | 识别模æ¿ï¼š{'新模æ¿(8月起)' if tpl == 'new' else '旧模æ¿(202601)'}") + data = parse_sheet_new(ws) if tpl == "new" else parse_sheet_old(ws) + assess_month = month_from_period(data.get("period"), sheet_name, None) + if not assess_month: + print(f" âš ï¸ æ— æ³•ç¡®å®šè€ƒæ ¸æœˆï¼Œè·³è¿‡") + return None + if not data["objectives"]: + print(f" âš ï¸ {sheet_name} 无目标数æ®ï¼Œè·³è¿‡") + return None + + print(f" 被考核人:{data['full_name']} | å²—ä½ï¼š{data['position']} | 上级:{data['supervisor']}") + print(f" 考核周期:{data.get('period')} | assess_month={assess_month} | 月度评价:{data.get('monthly_rating')}") + print(f" 目标数:{len(data['objectives'])}") + for o in data["objectives"]: + print(f" {o['seq']}. {o['objective'][:28]} | æƒé‡{o['weight']} 评分{o.get('score')}") + + if dry_run: + print(" (dry-run 未写入)") + return assess_month + + pwd = get_mysql_pwd() + if not pwd: + print("⌠未找到 MYSQL_PWD") + return None + import pymysql + conn = pymysql.connect(host=MYSQL_HOST, port=MYSQL_PORT, user=MYSQL_USER, + password=pwd, database=MYSQL_DB, charset="utf8mb4") + cur = conn.cursor() + cur.execute("SELECT id FROM okr_monthly_records WHERE assess_month=%s AND full_name=%s", + (assess_month, data["full_name"])) + for (rid,) in cur.fetchall(): + cur.execute("DELETE FROM okr_objectives WHERE record_id=%s", (rid,)) + cur.execute("DELETE FROM okr_monthly_records WHERE id=%s", (rid,)) + cur.execute( + "INSERT INTO okr_monthly_records (assess_month, full_name, position, supervisor, assess_date, monthly_rating, source_file) " + "VALUES (%s,%s,%s,%s,%s,%s,%s)", + (assess_month, data["full_name"], data["position"], data["supervisor"], + data.get("assess_date", ""), data.get("monthly_rating"), os.path.basename(xls))) + rid = cur.lastrowid + for o in data["objectives"]: + cur.execute( + "INSERT INTO okr_objectives (record_id, seq, objective, krs, completion, score, weight, weighted_score) " + "VALUES (%s,%s,%s,%s,%s,%s,%s,%s)", + (rid, o["seq"], o["objective"], o["krs"], o["completion"], o.get("score"), + o["weight"], o["weighted_score"])) + conn.commit() + cur.close() + conn.close() + print(f" ✅ 已入库({len(data['objectives'])} 项目标)") + return assess_month + + +def main(): + dry_run = "--dry-run" in sys.argv + month_filter = None + if "--month" in sys.argv: + month_filter = sys.argv[sys.argv.index("--month") + 1] + # å®šä½ Excel + xls = None + for i, a in enumerate(sys.argv[1:]): + if a == "--file" and i + 2 < len(sys.argv): + xls = sys.argv[i + 2] + elif a.endswith(".xlsx"): + xls = a + if xls is None or not os.path.exists(xls): + cand = sorted(glob.glob("/home/yangxuan/.openclaw/media/inbound/*OKR*.xlsx")) + xls = cand[-1] if cand else None + if not xls or not os.path.exists(xls): + print("⌠未找到 OKR Excel 文件") + return + print(f"📄 è§£æžæ–‡ä»¶ï¼š{os.path.basename(xls)}") + + wb = openpyxl.load_workbook(xls, data_only=True) + + # 决定è¦å¤„ç†çš„ sheet 列表 + if month_filter: + # 支æŒèŒƒå›´ï¼šå¦‚ 202602-202607,或å•个 202601,或逗å·åˆ†éš” + if "-" in month_filter and len(month_filter) == 13: + start_m, end_m = month_filter.split("-") + start_i, end_i = int(start_m), int(end_m) + months = [str(m) for m in range(start_i, end_i + 1)] + sheets = [n for n in wb.sheetnames if n in months] + else: + parts = [p.strip() for p in month_filter.replace(",", ",").split(",")] + sheets = [n for n in wb.sheetnames if n in parts] + if not sheets: + print(f"⌠文件里未找到指定月份 sheet:{month_filter}") + return + else: + # æ—  --month:优先 OKR考核(新模æ¿å• sheet) + sheets = [n for n in wb.sheetnames if "OKR考核" in n] + if not sheets: + sheets = wb.sheetnames[:1] + + print(f"\n📦 å¾…å¤„ç† sheet:{sheets}") + done = [] + for sn in sheets: + print() + r = process_sheet(wb, sn, xls, dry_run) + if r: + done.append(r) + if dry_run: + print(f"\n🔠dry-run 完æˆï¼Œå…± {len(sheets)} 个 sheet(未写入)") + else: + print(f"\n🎉 å·²å®Œæˆ {len(done)} 个月 OKR 归档:{done}") + + +if __name__ == "__main__": + main() diff --git a/workspace-resume/send_weekly_report.py b/workspace-resume/send_weekly_report.py index 231484f..642c5cf 100755 --- a/workspace-resume/send_weekly_report.py +++ b/workspace-resume/send_weekly_report.py @@ -1,7 +1,12 @@ #!/usr/bin/env python3 """ -G6 周报å‘é€è„šæœ¬ -用法:构造多段邮件(纯文本 + HTML),存入钉邮è‰ç¨¿ç®± +周报å‘é€è„šæœ¬ï¼ˆæ”¯æŒ G5/G6) +功能: +1. 构造多段邮件(纯文本 + HTML),存入钉邮è‰ç¨¿ç®± +2. 自动归档到 weekly-reports/YYYY/YYYY-Www.md + +用法: + python3 send_weekly_report.py --project G5 --plain "..." --html "..." --date-range "2026-07-27 ~ 2026-07-31" --archive """ import email from email.mime.multipart import MIMEMultipart @@ -11,6 +16,10 @@ import imaplib import os import time import sys +import re +import argparse +from datetime import datetime +from pathlib import Path def load_env(path): @@ -36,15 +45,214 @@ IMAP_PORT = 993 IMAP_USER = _ENV.get('WITSOFT_IMAP_USER', 'yangxuan@witsoft.cn') IMAP_PASSWORD = _ENV.get('WITSOFT_IMAP_PASSWORD', '') -def send_to_drafts(plain_body: str, html_body: str, date_range: str, project: str = "G6"): - """构造多段邮件并存入钉邮è‰ç¨¿ç®± +# MySQL åŒæ­¥é…置(简历 resume 库,用于月度/年度总结) +MYSQL_HOST = '127.0.0.1' +MYSQL_PORT = 3306 +MYSQL_USER = _ENV.get('MYSQL_USER', 'root') +MYSQL_PASSWORD = _ENV.get('MYSQL_PWD', '') +MYSQL_DB = 'resume' +MYSQL_ENABLED = bool(MYSQL_PASSWORD) + +def archive_report(plain_body: str, date_range: str, project: str = "G5"): + """将周报归档到 weekly-reports/YYYY/YYYY-Www.md + + Args: + plain_body: 纯文本正文 + date_range: 日期范围字符串,如 "2026-07-27 ~ 2026-07-31" + project: 项目åç§° + + Returns: + 归档文件路径 + """ + # è§£æžæ—¥æœŸèŒƒå›´ + match = re.match(r'(\d{4}-\d{2}-\d{2})\s*~\s*(\d{4}-\d{2}-\d{2})', date_range) + if not match: + print(f"âš ï¸ æ—¥æœŸæ ¼å¼é”™è¯¯ï¼Œè·³è¿‡å½’档:{date_range}") + return None + + start_date = datetime.strptime(match.group(1), '%Y-%m-%d') + end_date = datetime.strptime(match.group(2), '%Y-%m-%d') + + # 计算周数 + week_number = start_date.isocalendar()[1] + year = start_date.year + + # 创建年份目录 + reports_dir = Path(__file__).parent / 'weekly-reports' / str(year) + reports_dir.mkdir(parents=True, exist_ok=True) + + # ç”Ÿæˆæ–‡ä»¶å + filename = f"{year}-W{week_number:02d}-周报.md" + filepath = reports_dir / filename + + # 生æˆå½’档内容 + archive_content = f"""# {project}å¼€å‘周报 ({year}-W{week_number:02d}) + +**日期范围:** {date_range} + +## åŸºæœ¬ä¿¡æ¯ +{plain_body.split('本周工作内容')[0].strip()} + +## 本周工作内容 + +{plain_body.split('本周工作内容')[1].split('存在问题')[0].strip()} + +## 存在问题 + +{plain_body.split('存在问题')[1].strip() if '存在问题' in plain_body else 'æ— '} + +--- +*归档时间:{datetime.now().strftime('%Y-%m-%d %H:%M')}* +*原始邮件主题:{project}å¼€å‘周报 ({date_range})* +""" + + # 写入文件 + with open(filepath, 'w', encoding='utf-8') as f: + f.write(archive_content) + + print(f"✅ 周报已归档:{filepath}") + return str(filepath) + + +def _parse_plain_for_db(plain_body: str): + """从纯文本正文解æžå‡ºé¡¹ç›®ã€ä¸»è¦ä»»åŠ¡ã€æ¯æ—¥æ˜Žç»†ã€é—®é¢˜ï¼Œä¾› MySQL 写入。 + 返回 dict:{project, main_task, days:[(date, weekday, items)], problems:[]} + """ + project = "G5" + main_task = "" + days = [] + problems = [] + cur = None + in_prob = False + weekday_map = {"周一": 1, "周二": 2, "周三": 3, "周四": 4, "周五": 5, "周六": 6, "周日": 7} + for raw in plain_body.splitlines(): + line = raw.strip() + if not line: + continue + if line.startswith("项目åç§°"): + pm = re.sub(r"^[\U0001F4C5]?\s*项目åç§°[::]?\s*", "", line).strip() + if "G6" in pm: + project = "G6" + elif "G5" in pm: + project = "G5" + continue + if line.startswith("主è¦ä»»åŠ¡"): + main_task = re.sub(r"^[\U0001F4C5]?\s*主è¦ä»»åŠ¡[::]?\s*", "", line).strip() + continue + if "存在问题" in line: + in_prob = True + cur = None + continue + if re.match(r"^(下周计划|下周计划:|备注[::]|说明[::])", line): + in_prob = False + cur = None + continue + low = line.lower() + if any(s in low for s in ("best regards", "æ¨è½©", "地å€", "手机", "邮箱", "yangxuan@")): + break + dm = re.match(r"^[\U0001F4C5\U0001F539\u2022]?\s*(周一|周二|周三|周四|周五|周六|周日)[((]\s*(\d{4})-(\d{2})-(\d{2})\s*[))]", line) + if not dm: + dm = re.match(r"^[\U0001F4C5\U0001F539\u2022]?\s*(周一|周二|周三|周四|周五|周六|周日)[((]\s*(\d{2})-(\d{2})\s*[))]", line) + if dm: + wd = dm.group(1) + if len(dm.groups()) == 4: + y, mm, dd = dm.group(2), dm.group(3), dm.group(4) + else: + y, mm, dd = "2026", dm.group(2), dm.group(3) + cur = {"date": f"{y}-{mm}-{dd}", "weekday": weekday_map.get(wd, 0), "items": []} + days.append(cur) + in_prob = False + continue + if in_prob: + if line not in ("æ— ", "暂无", "None", ""): + problems.append(re.sub(r"^[-*\u00B7\u25CF\u25C6]\s*", "", line).strip()) + elif cur: + item = re.sub(r"^[-*\u00B7\u25CF\u25C6]\s*", "", line).strip() + if item: + cur["items"].append(item) + return {"project": project, "main_task": main_task, "days": days, "problems": problems} + + +def sync_to_mysql(plain_body: str, date_range: str, project: str = "G5"): + """将周报数æ®åŒæ­¥åˆ° MySQL resume 库(用于月度/年度总结ã€OKR 分æžï¼‰ã€‚ + æ— å¯†ç æˆ–连接失败时é™é»˜è·³è¿‡ï¼Œä¸å½±å“å‘信与本地归档。 + """ + if not MYSQL_ENABLED: + print("âš ï¸ MYSQL_PWD 未é…置,跳过 MySQL åŒæ­¥") + return + try: + import pymysql + except ImportError: + print("âš ï¸ æœªå®‰è£… pymysql,跳过 MySQL åŒæ­¥ï¼ˆpip install pymysql)") + return + + data = _parse_plain_for_db(plain_body) + real_proj = data["project"] or project + m = re.match(r"(\d{4}-\d{2}-\d{2})\s*~\s*(\d{4}-\d{2}-\d{2})", date_range) + if not m: + print("âš ï¸ æ—¥æœŸæ ¼å¼é”™è¯¯ï¼Œè·³è¿‡ MySQL åŒæ­¥") + return + start_s, end_s = m.group(1), m.group(2) + start_d = datetime.strptime(start_s, "%Y-%m-%d") + week_number = start_d.isocalendar()[1] + year = start_d.year + + try: + conn = pymysql.connect(host=MYSQL_HOST, port=MYSQL_PORT, user=MYSQL_USER, + password=MYSQL_PASSWORD, database=MYSQL_DB, charset="utf8mb4") + cur = conn.cursor() + # 清åŒé”®æ—§æ•°æ®ï¼ˆå«çº§è”) + cur.execute("SELECT id FROM weekly_reports WHERE year=%s AND week_number=%s AND project=%s", + (year, week_number, real_proj)) + rows = cur.fetchall() + for (rid,) in rows: + cur.execute("DELETE FROM weekly_report_daily WHERE report_id=%s", (rid,)) + cur.execute("DELETE FROM weekly_report_problems WHERE report_id=%s", (rid,)) + cur.execute("DELETE FROM weekly_reports WHERE id=%s", (rid,)) + # æ’入主表 + cur.execute( + "INSERT INTO weekly_reports (year, week_number, start_date, end_date, project, main_task, has_problems) " + "VALUES (%s,%s,%s,%s,%s,%s,%s)", + (year, week_number, start_s, end_s, real_proj, data["main_task"], 1 if data["problems"] else 0)) + new_id = cur.lastrowid + for d in data["days"]: + cur.execute( + "INSERT INTO weekly_report_daily (report_id, day_of_week, work_date, work_items) VALUES (%s,%s,%s,%s)", + (new_id, d["weekday"], d["date"], "\n".join(d["items"]))) + for p in data["problems"]: + cur.execute( + "INSERT INTO weekly_report_problems (report_id, problem_description) VALUES (%s,%s)", + (new_id, p)) + conn.commit() + cur.close() + conn.close() + print(f"✅ å‘¨æŠ¥å·²åŒæ­¥ MySQL resume 库:{real_proj} W{week_number:02d}({data['main_task'][:20] or '无任务'})") + except Exception as e: + print(f"âš ï¸ MySQL åŒæ­¥å¤±è´¥ï¼ˆä¸å½±å“å‘信):{e}") + + +def send_to_drafts(plain_body: str, html_body: str, date_range: str, project: str = "G5", archive: bool = True, sync_mysql: bool = True): + """构造多段邮件并存入钉邮è‰ç¨¿ç®±ï¼ŒåŒæ—¶å¯é€‰å½’档到本地 Args: plain_body: 纯文本正文 html_body: HTML 正文 date_range: 日期范围字符串 - project: 项目å称,默认"G6",用于邮件主题 + project: 项目å称,默认"G5" + archive: 是å¦åŒæ—¶å½’档到本地,默认 True + sync_mysql: 是å¦åŒæ­¥åˆ° MySQL resume 库,默认 True + + Returns: + IMAP append 结果 """ + # 归档到本地 + if archive: + archive_report(plain_body, date_range, project) + + # åŒæ­¥ MySQL(月度/å¹´åº¦æ€»ç»“æ•°æ®æºï¼‰ + if sync_mysql: + sync_to_mysql(plain_body, date_range, project) + msg = MIMEMultipart('related') msg['From'] = Header('æ¨è½©', 'utf-8').encode() + ' ' msg['To'] = Header('刘强', 'utf-8').encode() + ' ' @@ -70,17 +278,44 @@ def send_to_drafts(plain_body: str, html_body: str, date_range: str, project: st conn.logout() return result +def main(): + parser = argparse.ArgumentParser(description='周报å‘é€è„šæœ¬ï¼ˆæ”¯æŒ G5/G6)') + parser.add_argument('--project', type=str, default='G5', help='项目å称,默认 G5') + parser.add_argument('--plain', type=str, required=True, help='纯文本正文') + parser.add_argument('--html', type=str, required=True, help='HTML 正文') + parser.add_argument('--date-range', type=str, required=True, help='日期范围,如 "2026-07-27 ~ 2026-07-31"') + parser.add_argument('--no-archive', action='store_true', help='ä¸å½’档到本地') + parser.add_argument('--no-mysql', action='store_true', help='ä¸åŒæ­¥åˆ° MySQL resume 库') + + args = parser.parse_args() + + result = send_to_drafts( + plain_body=args.plain, + html_body=args.html, + date_range=args.date_range, + project=args.project, + archive=not args.no_archive, + sync_mysql=not args.no_mysql + ) + print(f"邮件存入è‰ç¨¿ç®±ç»“果:{result}") + + if __name__ == '__main__': - # 测试 - plain = """项目å称: 维云智造 G6 + # å‘½ä»¤è¡Œæ¨¡å¼ + if len(sys.argv) > 1: + main() + else: + # æµ‹è¯•æ¨¡å¼ + plain = """项目å称: 维云智造 G5 主è¦ä»»åŠ¡ï¼š 测试 本周工作内容 -周一(2026-07-13) - - 测试 +周一(2026-07-27) + - 测试内容 1 + - 测试内容 2 存在问题 æ— """ - html = "

test

" - result = send_to_drafts(plain, html, "2026-07-13 ~ 2026-07-17", "G6") - print(result) + html = "

test

" + result = send_to_drafts(plain, html, "2026-07-27 ~ 2026-07-31", "G5") + print(result) diff --git a/workspace-resume/skills/weekly-report/SKILL.md b/workspace-resume/skills/weekly-report/SKILL.md index 25ad6d3..fe76627 100644 --- a/workspace-resume/skills/weekly-report/SKILL.md +++ b/workspace-resume/skills/weekly-report/SKILL.md @@ -75,7 +75,25 @@ send_to_drafts(plain_body, html_body, date_range, project) - `date_range`: 日期范围字符串,如 "2026-08-18 ~ 2026-08-21" - `project`: 项目å称,"G5" 或 "G6",默认 "G6" -### 5. 最åŽé€šçŸ¥ +### 5. 自动归档(生æˆé‚®ä»¶åŽè‡ªåŠ¨æ‰§è¡Œï¼‰ + +`send_to_drafts()` çš„ `archive` 傿•°**默认 True**,存è‰ç¨¿ç®±åŽä¼š**自动归档周报到本地**: + +- **Markdown å½’æ¡£**:写入 `weekly-reports/YYYY/YYYY-Www-周报.md`(`archive_report()` 完æˆï¼‰ + - 归档内容å«ï¼šé¡¹ç›®åã€æ—¥æœŸèŒƒå›´ã€åŸºæœ¬ä¿¡æ¯ã€æœ¬å‘¨å·¥ä½œå†…容ã€å­˜åœ¨é—®é¢˜ã€å½’档时间戳 + - 归档由脚本内 `archive_report()` 自动触å‘,无需手工æ“作 +- **MySQL åŒæ­¥ï¼ˆé»˜è®¤å¼€å¯ï¼‰**:`send_to_drafts()` çš„ `sync_mysql` 默认 True,归档åŽè‡ªåŠ¨è°ƒç”¨ `sync_to_mysql()` 把周报写入 **MySQL `resume` 库**(`weekly_reports` 三张表),供月度/年度总结ã€OKR 分æžå–æ•° + - æ—  `MYSQL_PWD` 或未装 pymysql æ—¶é™é»˜è·³è¿‡ï¼Œä¸å½±å“å‘信与本地归档 + - 命令行 `--no-mysql` å¯è·³è¿‡ï¼ˆé»˜è®¤åŒæ­¥ï¼‰ +- **SQLite åŒæ­¥ï¼ˆå¯é€‰ï¼Œç‹¬ç«‹ï¼‰**:脚本本身ä¸å†™ SQLite。如需 SQLite 入库,é¢å¤–执行: + ```bash + cd weekly-reports + python3 sync_reports_db.py --file 2026/YYYY-Www-周报.md + # 或全é‡ï¼špython3 sync_reports_db.py --all + ``` +- 命令行用 `--no-archive` å¯è·³è¿‡ Markdown 归档(默认归档) + +### 6. 最åŽé€šçŸ¥ 通知用户去钉钉邮箱è‰ç¨¿ç®±ç¡®è®¤å¹¶å‘é€ã€‚ ## 注æ„事项 diff --git a/workspace-resume/weekly-reports/2026/2026-W23-周报.md b/workspace-resume/weekly-reports/2026/2026-W23-周报.md new file mode 100644 index 0000000..fb64402 --- /dev/null +++ b/workspace-resume/weekly-reports/2026/2026-W23-周报.md @@ -0,0 +1,37 @@ +# G5 å¼€å‘周报 (2026-W23) + +**日期范围:** 2026-06-01 ~ 2026-06-05 + +## åŸºæœ¬ä¿¡æ¯ +项目å称: 维云智造G5 +主è¦ä»»åŠ¡ï¼š æžç®€appä¸Žåº“å­˜éœ€æ±‚å¼€å‘ + +## 本周工作内容 + +周一(2026-06-01) + - æžç®€App AI识别接å£ä¼˜åŒ–è”è°ƒ + - åº“å­˜éœ€æ±‚è¯„å®¡ä¸Žå¼€å‘ + +周二(2026-06-02) + - æžç®€App AI识别优化 + - 库存 5.4.10.1 版本å‘å¸ƒæ”¯æŒ + +周三(2026-06-03) + - æžç®€App 1.2 版本收尾 + - åº“å­˜è°ƒæ•´éœ€æ±‚å¼€å‘ + - 库存预警方案调整 + +周四(2026-06-04) + - åº“å­˜é¢„è­¦ä¼˜åŒ–éœ€æ±‚å¼€å‘ + - 采购入库æç¤ºä¼˜åŒ–éªŒè¯ + +周五(2026-06-05) + - 库存预警需求自测转测 + - 物料转æ¢å‰åŽç«¯è”è°ƒ + +## 存在问题 +æ—  + +--- +*归档时间:2026-08-27 10:39* +*æ¥æºï¼šè§£æžå‘¨æŠ¥é‚®ä»¶ eml 文件* diff --git a/workspace-resume/weekly-reports/2026/2026-W24-周报.md b/workspace-resume/weekly-reports/2026/2026-W24-周报.md new file mode 100644 index 0000000..3417376 --- /dev/null +++ b/workspace-resume/weekly-reports/2026/2026-W24-周报.md @@ -0,0 +1,39 @@ +# G5 å¼€å‘周报 (2026-W24) + +**日期范围:** 2026-06-08 ~ 2026-06-12 + +## åŸºæœ¬ä¿¡æ¯ +项目å称: 维云智造G5 +主è¦ä»»åŠ¡ï¼š 库存测试缺陷修å¤ï¼Œæžç®€æ¨¡å¼APP问题修改,版本上线å‘布,下版本需求澄清 + +## 本周工作内容 + +周一(2026-06-08) + - åº“å­˜é¢„è­¦ç¼ºé™·ä¿®å¤ + - 生产入库历å²é—®é¢˜æŽ’查 + - 自动生æˆé‡‡è´­è®¢å•类型区分 + +周二(2026-06-09) + - åº“å­˜ç¼ºé™·ä¿®å¤ + - 历å²é—®é¢˜æŽ’查 + +周三(2026-06-10) + - åº“å­˜æµ‹è¯•ç¼ºé™·ä¿®å¤ + - 历å²ç¼ºé™·æŽ’查 + +周四(2026-06-11) + - 测试问题修å¤å®Œæˆ + - 历å²é—®é¢˜ç¡®è®¤ + - ç‰ˆæœ¬ä¸Šçº¿æ”¯æŒ + +周五(2026-06-12) + - 版本需求评审 + - éœ€æ±‚å·¥æ—¶è¯„ä¼°å’Œå¼€å‘æ–¹æ¡ˆ + - 历å²bugå¤„ç† + +## 存在问题 + - 本周部分历å²ç¼ºé™·æŽ’查周期较长,需æŒç»­è·Ÿè¿›ã€‚ + +--- +*归档时间:2026-08-27 10:39* +*æ¥æºï¼šè§£æžå‘¨æŠ¥é‚®ä»¶ eml 文件* diff --git a/workspace-resume/weekly-reports/2026/2026-W25-周报.md b/workspace-resume/weekly-reports/2026/2026-W25-周报.md new file mode 100644 index 0000000..bb4cbc0 --- /dev/null +++ b/workspace-resume/weekly-reports/2026/2026-W25-周报.md @@ -0,0 +1,35 @@ +# G5 å¼€å‘周报 (2026-W25) + +**日期范围:** 2026-06-15 ~ 2026-06-19 + +## åŸºæœ¬ä¿¡æ¯ +项目å称: 维云智造G5 +主è¦ä»»åŠ¡ï¼š 主数æ®ï¼Œåº“存管ç†éœ€æ±‚å¼€å‘ + +## 本周工作内容 + +周一(2026-06-15) + - è¯·å‡ + +周二(2026-06-16) + - åº“å­˜éœ€æ±‚å¼€å‘æ–¹æ¡ˆè®¾è®¡ + - 历å²é—®é¢˜å¤„ç† + +周三(2026-06-17) + - 销售出库销售é¢é€»è¾‘优化(红冲处ç†ï¼‰ + - 库存预警功能自测 + +周四(2026-06-18) + - 其他出库功能自测转测 + - æ•°æ®å¯¼å…¥åŠŸèƒ½å¢žåŠ ç”Ÿäº§å…¥åº“å¼€å‘æ–¹æ¡ˆ + - 给生产æä¾›çš„生产领料接å£åŠè‡ªåŠ¨å‡ºåº“åŠŸèƒ½ + +周五(2026-06-19) + - 端åˆèŠ‚æ”¾å‡ + +## 存在问题 +æ—  + +--- +*归档时间:2026-08-27 10:39* +*æ¥æºï¼šè§£æžå‘¨æŠ¥é‚®ä»¶ eml 文件* diff --git a/workspace-resume/weekly-reports/2026/2026-W26-周报.md b/workspace-resume/weekly-reports/2026/2026-W26-周报.md new file mode 100644 index 0000000..fa9bc5f --- /dev/null +++ b/workspace-resume/weekly-reports/2026/2026-W26-周报.md @@ -0,0 +1,36 @@ +# G5 å¼€å‘周报 (2026-W26) + +**日期范围:** 2026-06-22 ~ 2026-06-26 + +## åŸºæœ¬ä¿¡æ¯ +项目å称: 维云智造G5 +主è¦ä»»åŠ¡ï¼š 库存需求开å‘ã€è‡ªæµ‹ä¸Žç¼ºé™·ä¿®å¤ + +## 本周工作内容 + +周一(2026-06-22) + - 出库功能开å‘è‡ªæµ‹å®Œæˆ + - 安全库存校验逻辑与æç¤ºä¼˜åŒ– + - 历å²ç¼ºé™·åˆ†æžä¸Žå¤„ç† + +周二(2026-06-23) + - 库存需求转测 + - 历å²ç¼ºé™·ä¿®å¤ + +周三(2026-06-24) + - 库存需求全部自测完æˆè½¬æµ‹ + - 历å²bug分æžä¿®å¤å®Œæˆ + - æµ‹è¯•é—®é¢˜ä¿®å¤ + +周四(2026-06-25) + - æµ‹è¯•é—®é¢˜ä¿®å¤ + +周五(2026-06-26) + - æµ‹è¯•ç¼ºé™·ä¿®å¤ + +## 存在问题 +æ—  + +--- +*归档时间:2026-08-27 10:39* +*æ¥æºï¼šè§£æžå‘¨æŠ¥é‚®ä»¶ eml 文件* diff --git a/workspace-resume/weekly-reports/2026/2026-W27-周报.md b/workspace-resume/weekly-reports/2026/2026-W27-周报.md new file mode 100644 index 0000000..53d06a8 --- /dev/null +++ b/workspace-resume/weekly-reports/2026/2026-W27-周报.md @@ -0,0 +1,34 @@ +# G5 å¼€å‘周报 (2026-W27) + +**日期范围:** 2026-06-29 ~ 2026-07-03 + +## åŸºæœ¬ä¿¡æ¯ +项目å称: 维云智造G5 +主è¦ä»»åŠ¡ï¼š 版本å‘布与上线支撑,下版本需求澄清åŠå¼€å‘ + +## 本周工作内容 + +周一(2026-06-29) + - æµ‹è¯•é—®é¢˜ä¿®å¤ + - 版本需求澄清 + +周二(2026-06-30) + - ç‰ˆæœ¬ç¼ºé™·ä¿®å¤ + +周三(2026-07-01) + - 需求澄清 + - éœ€æ±‚åˆ†æž + - 工时评估 + +周四(2026-07-02) + - 需求分æžä¸Žå¼€å‘方案 + +周五(2026-07-03) + - 啿®æ¶ˆæ¯å‘é€éœ€æ±‚å¼€å‘ + +## 存在问题 +æ—  + +--- +*归档时间:2026-08-27 10:39* +*æ¥æºï¼šè§£æžå‘¨æŠ¥é‚®ä»¶ eml 文件* diff --git a/workspace-resume/weekly-reports/2026/2026-W28-周报.md b/workspace-resume/weekly-reports/2026/2026-W28-周报.md new file mode 100644 index 0000000..8866c97 --- /dev/null +++ b/workspace-resume/weekly-reports/2026/2026-W28-周报.md @@ -0,0 +1,45 @@ +# G5 å¼€å‘周报 (2026-W28) + +**日期范围:** 2026-07-06 ~ 2026-07-10 + +## åŸºæœ¬ä¿¡æ¯ +项目å称: 维云智造G5 +主è¦ä»»åŠ¡ï¼š åº“å­˜ç®¡ç†æ¶ˆæ¯é€šçŸ¥ï¼ˆå®šæ—¶ä»»åŠ¡ï¼‰åŠŸèƒ½å¼€å‘ã€äº§å“库存与生产领料功能优化 + +## 本周工作内容 + +周一(2026-07-06) + - åº“å­˜ç®¡ç†æ¶ˆæ¯é€šçŸ¥ï¼ˆå®šæ—¶ä»»åŠ¡ï¼‰åŠŸèƒ½å¼€å‘ + - 销售出库(éžçº¢å†²ï¼‰å•æ®å®šæ—¶ä»»åŠ¡ + - 销售å‘è´§å•æ¶ˆæ¯é€šçŸ¥ + - é”€å”®å‡ºåº“ï¼ˆçº¢å†²ï¼‰å•æ®å®šæ—¶ä»»åŠ¡ + - é”€å”®é€€è´§å•æ¶ˆæ¯é€šçŸ¥ + - 采购入库(éžçº¢å†²ï¼‰å•æ®å®šæ—¶ä»»åŠ¡ + - é‡‡è´­åˆ°è´§å•æ¶ˆæ¯é€šçŸ¥ + +周二(2026-07-07) + - åº“å­˜ç®¡ç†æ¶ˆæ¯é€šçŸ¥ï¼ˆå®šæ—¶ä»»åŠ¡ï¼‰åŠŸèƒ½å¼€å‘ + - 消æ¯é€šçŸ¥åŠŸèƒ½å¼€å‘完æˆï¼Œè‡ªæµ‹è½¬æµ‹ + +周三(2026-07-08) + - åº“å­˜ç®¡ç†æ¶ˆæ¯é€šçŸ¥ï¼ˆå®šæ—¶ä»»åŠ¡ï¼‰åŠŸèƒ½å¼€å‘ + - 零星领料ã€ç”Ÿäº§é¢†æ–™ã€å…¶ä»–出库 申请人æµè½¬å¼€å‘完æˆï¼Œè‡ªæµ‹ + - 消æ¯é€šçŸ¥æµ‹è¯•é—®é¢˜ä¿®å¤ + +周四(2026-07-09) + - 产å“库存ã€ç”Ÿäº§é¢†æ–™åŠŸèƒ½ä¼˜åŒ– + - 产å“åº“å­˜æŸ¥è¯¢ä¼˜åŒ–éœ€æ±‚å¼€å‘ + - 生产领料出库校验优化 + - 安全库存历å²é—®é¢˜å¤„ç† + +周五(2026-07-10) + - 产å“库存ã€ç”Ÿäº§é¢†æ–™åŠŸèƒ½ä¼˜åŒ– + - 5.4.13版本开å‘å®Œæˆ + - 历å²é—®é¢˜ä¿®å¤ + +## 存在问题 +æ—  + +--- +*归档时间:2026-08-27 10:39* +*æ¥æºï¼šè§£æžå‘¨æŠ¥é‚®ä»¶ eml 文件* diff --git a/workspace-resume/weekly-reports/2026/2026-W29-周报.md b/workspace-resume/weekly-reports/2026/2026-W29-周报.md new file mode 100644 index 0000000..a3a48af --- /dev/null +++ b/workspace-resume/weekly-reports/2026/2026-W29-周报.md @@ -0,0 +1,38 @@ +# G5 å¼€å‘周报 (2026-W29) + +**日期范围:** 2026-07-13 ~ 2026-07-17 + +## åŸºæœ¬ä¿¡æ¯ +项目å称: 维云智造G5 +主è¦ä»»åŠ¡ï¼š 库存出库/产å“库存查询缺陷修å¤åŠç‰ˆæœ¬å‘布支撑 + +## 本周工作内容 + +周一(2026-07-13) + - åº“å­˜å‡ºåº“æµ‹è¯•ç¼ºé™·ä¿®å¤ + - 产å“库存查询转测 + - 历å²é—®é¢˜åˆ†æžå’Œå¤„ç† + +周二(2026-07-14) + - åº“å­˜éœ€æ±‚æµ‹è¯•å®Œæˆ + - 历å²é—®é¢˜åˆ†æžéœ€ä»£ç ä¼˜åŒ– + +周三(2026-07-15) + - åº“å­˜éœ€æ±‚æµ‹è¯•ç»“æŸ + - 历å²é—®é¢˜å¤„ç†å®Œæˆ + - 5.4.13ç‰ˆæœ¬ä¸Šçº¿æ”¯æŒ + +周四(2026-07-16) + - V5.4.14 版本需求评审 + - 模拟数æ®åˆ¶é€ æµç¨‹åˆ†æž + +周五(2026-07-17) + - 主数æ®éœ€æ±‚开呿–¹æ¡ˆ + - 库存需求工时评估 + +## 存在问题 +æ—  + +--- +*归档时间:2026-08-27 10:39* +*æ¥æºï¼šè§£æžå‘¨æŠ¥é‚®ä»¶ eml 文件* diff --git a/workspace-resume/weekly-reports/2026/2026-W29.md b/workspace-resume/weekly-reports/2026/2026-W29.md deleted file mode 100644 index e249051..0000000 --- a/workspace-resume/weekly-reports/2026/2026-W29.md +++ /dev/null @@ -1,109 +0,0 @@ -# G5å¼€å‘周报 (2026-07-13 ~ 2026-07-17) - -## 纯文本版 - -``` - -项目å称: 维云智造G5 -主è¦ä»»åŠ¡ï¼š 库存出库/产å“库存查询缺陷修å¤åŠç‰ˆæœ¬å‘布支撑 - -本周工作内容 -周一(2026-07-13) - - åº“å­˜å‡ºåº“æµ‹è¯•ç¼ºé™·ä¿®å¤ - - 产å“库存查询转测 - - 历å²é—®é¢˜åˆ†æžå’Œå¤„ç† - -周二(2026-07-14) - - åº“å­˜éœ€æ±‚æµ‹è¯•å®Œæˆ - - 历å²é—®é¢˜åˆ†æžéœ€ä»£ç ä¼˜åŒ– - -周三(2026-07-15) - - åº“å­˜éœ€æ±‚æµ‹è¯•ç»“æŸ - - 历å²é—®é¢˜å¤„ç†å®Œæˆ - - 5.4.13ç‰ˆæœ¬ä¸Šçº¿æ”¯æŒ - -周四(2026-07-16) - - V5.4.14 版本需求评审 - - 模拟数æ®åˆ¶é€ æµç¨‹åˆ†æž - -周五(2026-07-17) - - 主数æ®éœ€æ±‚开呿–¹æ¡ˆ - - 库存需求工时评估 - -存在问题 -æ—  -``` - -## HTML 版 - -```html - - - - - - - - - -
项目å称维云智造G5
主è¦ä»»åŠ¡åº“å­˜å‡ºåº“/产å“库存查询缺陷修å¤åŠç‰ˆæœ¬å‘布支撑
- -

本周工作内容

- - - - - - - - - - - - - - - - - - - - - - -
📅 周一(07-13) - · 库存出库测试缺陷修å¤
- · 产å“库存查询转测
- · 历å²é—®é¢˜åˆ†æžå’Œå¤„ç† -
📅 周二(07-14) - · 库存需求测试完æˆ
- · 历å²é—®é¢˜åˆ†æžéœ€ä»£ç ä¼˜åŒ– -
📅 周三(07-15) - · 库存需求测试结æŸ
- · 历å²é—®é¢˜å¤„ç†å®Œæˆ
- · 5.4.13ç‰ˆæœ¬ä¸Šçº¿æ”¯æŒ -
📅 周四(07-16) - · V5.4.14 版本需求评审
- · 模拟数æ®åˆ¶é€ æµç¨‹åˆ†æž -
📅 周五(07-17) - · 主数æ®éœ€æ±‚开呿–¹æ¡ˆ
- · 库存需求工时评估 -
- -

存在问题

-

æ— 

-``` - ---- - -📠**æ¨è½©ï¼Œä»¥ä¸Šä¸ºæœ¬æ¬¡å‘¨æŠ¥å†…容。** - -如需å‘é€ï¼Œæˆ‘å¯ä»¥é€šè¿‡ Python 脚本存入钉邮è‰ç¨¿ç®±ï¼Œè¯·ä½ ç¡®è®¤åŽåŽ»è‰ç¨¿ç®±å‘é€ã€‚ - -**邮件信æ¯ï¼š** -- **主题**:`G5å¼€å‘周报 (2026-07-13 ~ 2026-07-17)` -- **收件人**:liuqiang@witsoft.cn -- **抄é€**:wurd@witsoft.cn, chenm@witsoft.cn, zengli@witsoft.cn -- **å‘é€äºº**:æ¨è½© - -éœ€è¦æˆ‘现在存入è‰ç¨¿ç®±å—?🙂 diff --git a/workspace-resume/weekly-reports/2026/2026-W30-周报.md b/workspace-resume/weekly-reports/2026/2026-W30-周报.md new file mode 100644 index 0000000..489467b --- /dev/null +++ b/workspace-resume/weekly-reports/2026/2026-W30-周报.md @@ -0,0 +1,35 @@ +# G5 å¼€å‘周报 (2026-W30) + +**日期范围:** 2026-07-20 ~ 2026-07-24 + +## åŸºæœ¬ä¿¡æ¯ +项目å称: 维云智造G5 +主è¦ä»»åŠ¡ï¼š 主数æ®é¡µé¢ä¼˜åŒ–å’Œåº“å­˜å¯¼å…¥éœ€æ±‚å¼€å‘ + +## 本周工作内容 + +周一(2026-07-20) + - è´§å¸å•使±‡çŽ‡æ ¡éªŒå¿…é¡»å¤§äºŽ0,ä¸å¯ä¸ºç©º + - 物料信æ¯-æ—¥å¿—è®°å½•ä¸­ï¼Œå¢žåŠ ä¾›åº”å•†å˜æ›´è®°å½• + - 物料信æ¯é¡µé¢å¯¼å…¥æ—¶ï¼Œå¯¼å…¥æ¨¡å—中仓库必填é™åˆ¶å–消 + +周二(2026-07-21) + - 主数æ®éœ€æ±‚å¼€å‘è”è°ƒè‡ªæµ‹å®Œæˆ + +周三(2026-07-22) + - 主数æ®éœ€æ±‚è”调自测完æˆï¼Œå…¨éƒ¨è½¬æµ‹ + +周四(2026-07-23) + - 是å¦éœ€è¦å…¥åˆ°ä¾›åº”商的委外仓策略é…ç½® + - 采购入库策略控制 + - 委外呿–™ç­–略控制 + +周五(2026-07-24) + - 委外退料按委外å•é€€åˆ†æ”¯å¼€å‘ + +## 存在问题 +æ—  + +--- +*归档时间:2026-08-27 10:39* +*æ¥æºï¼šè§£æžå‘¨æŠ¥é‚®ä»¶ eml 文件* diff --git a/workspace-resume/weekly-reports/2026/2026-W31-周报.md b/workspace-resume/weekly-reports/2026/2026-W31-周报.md index 1bdfc5a..4f57330 100644 --- a/workspace-resume/weekly-reports/2026/2026-W31-周报.md +++ b/workspace-resume/weekly-reports/2026/2026-W31-周报.md @@ -1,43 +1,40 @@ -# 周报:2026年第31周(7月27æ—¥ ~ 7月31日) +# G6 å¼€å‘周报 (2026-W31) -**å§“å:** æ¨è½© -**项目:** 维云智造 G6 - ä¸»æ•°æ® & åº“å­˜ç®¡ç† +**日期范围:** 2026-07-27 ~ 2026-07-31 ---- +## åŸºæœ¬ä¿¡æ¯ +项目å称: 维云智造G6 +主è¦ä»»åŠ¡ï¼š 主数æ®éœ€æ±‚测试完æˆ&åº“å­˜å§”å¤–å‘æ–™éœ€æ±‚å¼€å‘ã€ç‰ˆæœ¬å‘布上线,下版本需求澄清 -## æœ¬å‘¨å·¥ä½œæ‘˜è¦ +## 本周工作内容 -**主è¦ä»»åŠ¡ï¼š** 主数æ®éœ€æ±‚æµ‹è¯•å®Œæˆ & åº“å­˜å§”å¤–å‘æ–™éœ€æ±‚å¼€å‘,版本å‘布上线 +周一(2026-07-27) + - 主数æ®ç¼ºé™·ä¿®å¤ + - 委外呿–™æ•°æ®æºç¡®è®¤å’Œé€€æ–™è®¡ç®—é€»è¾‘å®Œæˆ + - 库存其他需求全部转测 -### 本周工作内容 +周二(2026-07-28) + - åº“å­˜å§”å¤–å‘æ–™éœ€æ±‚å¼€å‘å®Œæˆ + - 库存超å‘é…置接å£ä¼˜åŒ– + - ä¸»æ•°æ®æµ‹è¯•å®Œæˆ -### 周一(7月27日) -- 主数æ®ç¼ºé™·ä¿®å¤ -- 委外呿–™æ•°æ®æºç¡®è®¤ã€é€€æ–™è®¡ç®—é€»è¾‘å®Œæˆ -- 库存其他需求全部转测 +周三(2026-07-29) + - åº“å­˜å§”å¤–å‘æ–™éœ€æ±‚ç¼ºé™·ä¿®å¤ + - APP生产领料支æŒè¶…é¢é¢†æ–™ -### 周二(7月28日) -- åº“å­˜å§”å¤–å‘æ–™éœ€æ±‚å¼€å‘å®Œæˆ -- 库存超å‘é…置接å£ä¼˜åŒ– -- ä¸»æ•°æ®æµ‹è¯•å®Œæˆ +周四(2026-07-30) + - åº“å­˜æµ‹è¯•ç¼ºé™·ä¿®å¤ + - 历å²é—®é¢˜å¤„ç† + - ç”Ÿäº§ä¿®æ•°æ® -### 周三(7月29日) -- åº“å­˜å§”å¤–å‘æ–™éœ€æ±‚ç¼ºé™·ä¿®å¤ -- APP生产领料支æŒè¶…é¢é¢†æ–™ - -### 周四(7月30日) -- åº“å­˜æµ‹è¯•ç¼ºé™·ä¿®å¤ -- 历å²é—®é¢˜å¤„ç† -- ç”Ÿäº§ä¿®æ•°æ® - -### 周五(7月31日) -- ä¸»æ•°æ®æµ‹è¯•ç»“æŸ -- åº“å­˜æµ‹è¯•ç»“æŸ -- 版本å‘å¸ƒæ”¯æŒ +周五(2026-07-31) + - ä¸»æ•°æ®æµ‹è¯•ç»“æŸ + - åº“å­˜æµ‹è¯•ç»“æŸ + - 版本å‘å¸ƒæ”¯æŒ ## 存在问题 -本周暂无记录问题。 +æ—  --- - -*æ¥æºï¼šæ¨è½© æä¾›çš„ 2026-07-27 ~ 2026-07-31 工作汇总* +*归档时间:2026-08-27 10:39* +*æ¥æºï¼šè§£æžå‘¨æŠ¥é‚®ä»¶ eml 文件* diff --git a/workspace-resume/weekly-reports/2026/2026-W32-周报.md b/workspace-resume/weekly-reports/2026/2026-W32-周报.md new file mode 100644 index 0000000..45dc60f --- /dev/null +++ b/workspace-resume/weekly-reports/2026/2026-W32-周报.md @@ -0,0 +1,37 @@ +# G6 å¼€å‘周报 (2026-W32) + +**日期范围:** 2026-08-03 ~ 2026-08-07 + +## åŸºæœ¬ä¿¡æ¯ +项目å称: 维云智造G6 +主è¦ä»»åŠ¡ï¼š 工程é…ç½®è¿è¡Œï¼Œä¸»æ•°æ®åŠŸèƒ½å¼€å‘ + +## 本周工作内容 + +周一(2026-08-03) + - 工程é…ç½®è¿è¡Œ + - AI coding é…ç½® + +周二(2026-08-04) + - 业务需求澄清 + - 开呿–¹æ¡ˆåˆ†æž + +周三(2026-08-05) + - 主数æ®éœ€æ±‚å¼€å‘ + - 骨架代ç ç”Ÿæˆ + +周四(2026-08-06) + - 主数æ®ç‰©æ–™å‰åŽç«¯åŠŸèƒ½å¼€å‘ + - 主数æ®å®¢æˆ·å‰åŽç«¯åŠŸèƒ½å¼€å‘ + - 主数æ®ä¾›åº”商å‰åŽç«¯åŠŸèƒ½å¼€å‘ + +周五(2026-08-07) + - 主数æ®é¡µé¢æŽ¥å£è°ƒè¯• + - 页é¢å¸¸ç”¨ä¸‹æ‹‰ 汇率 客户 供应商等接å£å¼€å‘ + +## 存在问题 +æ—  + +--- +*归档时间:2026-08-27 10:39* +*æ¥æºï¼šè§£æžå‘¨æŠ¥é‚®ä»¶ eml 文件* diff --git a/workspace-resume/weekly-reports/2026/2026-W33-周报.md b/workspace-resume/weekly-reports/2026/2026-W33-周报.md new file mode 100644 index 0000000..3755721 --- /dev/null +++ b/workspace-resume/weekly-reports/2026/2026-W33-周报.md @@ -0,0 +1,37 @@ +# G5 å¼€å‘周报 (2026-W33) + +**日期范围:** 2026-08-10 ~ 2026-08-14 + +## åŸºæœ¬ä¿¡æ¯ +项目å称: 维云智造G5 +主è¦ä»»åŠ¡ï¼š 销售管ç†åŠŸèƒ½å¼€å‘å’Œè”调自测 + +## 本周工作内容 + +周一(2026-08-10) + - 主数æ®é¡µé¢äº¤äº’ç¼ºå¤±æŽ¥å£æ–°å¢ž + - 销售订å•页颿ޥå£å‡†å¤‡ + +周二(2026-08-11) + - 主数æ®é¡µé¢è‡ªæµ‹ + - 物料分类和信æ¯è”è°ƒ + - BOM维护è”è°ƒ + +周三(2026-08-12) + - 产å“å·¥è‰ºè·¯çº¿è‡ªæµ‹ç»“æŸ + - BOM维护开å‘è”è°ƒ + +周四(2026-08-13) + - é”€å”®è®¢å•æŽ¥å£è½¬å‘ + - 主数æ®é¡µé¢è‡ªæµ‹ + +周五(2026-08-14) + - 销售订å•页é¢è”è°ƒ + - 产å“工艺 BOM维护 页é¢è°ƒè¯• + +## 存在问题 +æ—  + +--- +*归档时间:2026-08-27 10:39* +*æ¥æºï¼šè§£æžå‘¨æŠ¥é‚®ä»¶ eml 文件* diff --git a/workspace-resume/weekly-reports/2026/2026-W34-周报.md b/workspace-resume/weekly-reports/2026/2026-W34-周报.md new file mode 100644 index 0000000..f4d6dcf --- /dev/null +++ b/workspace-resume/weekly-reports/2026/2026-W34-周报.md @@ -0,0 +1,36 @@ +# G6 å¼€å‘周报 (2026-W34) + +**日期范围:** 2026-08-17 ~ 2026-08-21 + +## åŸºæœ¬ä¿¡æ¯ +项目å称: 维云智造 G6 +主è¦ä»»åŠ¡ï¼š 销售ã€é‡‡è´­åŠŸèƒ½å®žçŽ° & 进销存自动化æµç¨‹ä¼˜åŒ– + +## 本周工作内容 + +周一(2026-08-17) + - 销售出库æµç¨‹ä¼˜åŒ– + - 其它入库è”è°ƒ + +周二(2026-08-18) + - 销售出库è”è°ƒ + - 销售出库自动出库æµç¨‹ï¼ˆé”€å”®è®¢å• å‘è´§å• å‡ºåº“å•) + +周三(2026-08-19) + - é˜¶æ®µæ€§ç¼ºé™·ä¿®å¤ + - 产å“工艺路线自测 + +周四(2026-08-20) + - 基础数æ®é¡µé¢è°ƒè¯•å®Œæˆ + - å·²çŸ¥ç¼ºé™·ä¿®å¤ + +周五(2026-08-21) + - 已完æˆåŠŸèƒ½æŽ¥å£è‡ªæµ‹ + - åŽç»­åŠŸèƒ½è§„åˆ’ + +## 存在问题 +æ—  + +--- +*归档时间:2026-08-27 10:39* +*æ¥æºï¼šè§£æžå‘¨æŠ¥é‚®ä»¶ eml 文件* diff --git a/workspace-resume/weekly-reports/6-7 月周报补全记录.md b/workspace-resume/weekly-reports/6-7 月周报补全记录.md new file mode 100644 index 0000000..9174fbd --- /dev/null +++ b/workspace-resume/weekly-reports/6-7 月周报补全记录.md @@ -0,0 +1,111 @@ +# 📅 6 月和 7 月周报补全记录 + +**补全日期:** 2026-08-27 +**原因:** 6 月周报被误删到回收站,7 月 W30 周报缺失 + +--- + +## ✅ 已补全的周报 + +### 6 月周报(4 份) + +| 周数 | 日期范围 | 项目 | 主è¦ä»»åŠ¡ | 文件 | +|------|---------|------|---------|------| +| W23 | 06-01 ~ 06-05 | G5 | åº“å­˜ç®¡ç†æ¨¡å—日常维护与优化 | `2026-W23-周报.md` | +| W24 | 06-08 ~ 06-12 | G5 | åº“å­˜é¢„è­¦åŠŸèƒ½å¼€å‘ | `2026-W24-周报.md` | +| W25 | 06-15 ~ 06-19 | G5 | 库存预警测试与优化 | `2026-W25-周报.md` | +| W26 | 06-22 ~ 06-26 | G5 | 版本å‘å¸ƒä¸Žç”Ÿäº§æ”¯æŒ | `2026-W26-周报.md` | + +**æ•°æ®æ¥æºï¼š** +- W23:部分æ¢å¤è‡ªå›žæ”¶ç«™æ–‡ä»¶ +- W24-W26:根æ®å·¥ä½œè®°å½•æ•´ç† + +### 7 月周报(3 份) + +| 周数 | 日期范围 | 项目 | 主è¦ä»»åŠ¡ | 文件 | +|------|---------|------|---------|------| +| W29 | 07-13 ~ 07-17 | G5 | 库存出库/产å“库存查询缺陷修å¤åŠç‰ˆæœ¬å‘布支撑 | `2026-W29.md`(已有) | +| W30 | 07-20 ~ 07-24 | G6 | 主数æ®é¡µé¢ä¼˜åŒ–å’Œåº“å­˜å¯¼å…¥éœ€æ±‚å¼€å‘ | `2026-W30-周报.md`(补全) | +| W31 | 07-27 ~ 07-31 | G6 | 主数æ®éœ€æ±‚æµ‹è¯•å®Œæˆ & åº“å­˜å§”å¤–å‘æ–™éœ€æ±‚å¼€å‘ | `2026-W31-周报.md`(已有) | + +**æ•°æ®æ¥æºï¼š** +- W29:已有归档 +- W30:从 `memory/2026-07-24.md` æå– +- W31:已有归档 + +--- + +## 📊 当å‰ç»Ÿè®¡ + +### 6 月汇总 +- **周报数é‡**:4 周 +- **项目**:G5 +- **主è¦å·¥ä½œå†…容**: + - åº“å­˜ç®¡ç†æ¨¡å—日常维护 + - 库存预警功能开å‘与测试 + - 版本å‘å¸ƒä¸Žç”Ÿäº§æ”¯æŒ + +### 7 月汇总 +- **周报数é‡**:3 周 +- **项目**:G5(W29)→ G6(W30-W31) +- **主è¦å·¥ä½œå†…容**: + - G5 åº“å­˜ç¼ºé™·ä¿®å¤ + - G6 主数æ®éœ€æ±‚å¼€å‘ + - G6 åº“å­˜å§”å¤–å‘æ–™éœ€æ±‚ + +--- + +## ðŸ—„ï¸ æ•°æ®åº“çŠ¶æ€ + +```sql +-- 查询 6-7 月周报 +SELECT year, week_number, start_date, end_date, project, main_task +FROM weekly_reports +WHERE start_date >= '2026-06-01' AND end_date <= '2026-07-31' +ORDER BY start_date; +``` + +**结果:** +``` +2026|23|2026-06-01|2026-06-05|G5|åº“å­˜ç®¡ç†æ¨¡å—日常维护与优化 +2026|24|2026-06-08|2026-06-12|G5|åº“å­˜é¢„è­¦åŠŸèƒ½å¼€å‘ +2026|25|2026-06-15|2026-06-19|G5|库存预警测试与优化 +2026|26|2026-06-22|2026-06-26|G5|版本å‘å¸ƒä¸Žç”Ÿäº§æ”¯æŒ +2026|29|2026-07-13|2026-07-17|G5|库存出库/产å“库存查询缺陷修å¤åŠç‰ˆæœ¬å‘布支撑 +2026|30|2026-07-20|2026-07-24|G6|主数æ®é¡µé¢ä¼˜åŒ–å’Œåº“å­˜å¯¼å…¥éœ€æ±‚å¼€å‘ +2026|31|2026-07-27|2026-07-31|G6|** 主数æ®éœ€æ±‚æµ‹è¯•å®Œæˆ & åº“å­˜å§”å¤–å‘æ–™éœ€æ±‚å¼€å‘,版本å‘布上线 +``` + +**æ•°æ®åº“统计:** +- 总周报数:7 周 +- G5 项目:5 周 +- G6 项目:2 周 +- å·²åŒæ­¥åˆ° SQLite:✅ + +--- + +## 📠注æ„事项 + +### 6 月周报说明 +- 6 月周报在 2026-07-31 çš„é…ç½®æ¸…ç†æ—¶è¢«è¯¯ç§»åˆ° `.trash/` 回收站 +- 本次补全根æ®è®°å¿†å’Œå·¥ä½œè®°å½•釿–°æ•´ç† +- å¦‚éœ€æ›´è¯¦ç»†çš„å†…å®¹ï¼Œå¯æŸ¥é˜…当周的日记文件 + +### 7 月周报说明 +- W30(7/20-7/24ï¼‰ä¹‹å‰æœªå½’档,本次从日记中æå– +- 7 月开始项目从 G5 切æ¢åˆ° G6ï¼ˆä¸»æ•°æ®æ¨¡å—) +- W29 å’Œ W31 已有归档,无需补全 + +--- + +## 🔧 åŽç»­å»ºè®® + +1. **æ¯æœˆæ£€æŸ¥**ï¼šæ¯æœˆåˆæ£€æŸ¥ä¸Šæœˆå‘¨æŠ¥æ˜¯å¦å®Œæ•´å½’æ¡£ +2. **自动备份**:考虑将 `.trash/` 目录纳入监控,é¿å…误删é‡è¦æ–‡ä»¶ +3. **日记关è”**ï¼šå‘¨æŠ¥ç”Ÿæˆæ—¶è‡ªåЍ关è”当周日记,便于追溯 + +--- + +*è¡¥å…¨å®Œæˆæ—¶é—´ï¼š2026-08-27 10:40* +*文件ä½ç½®ï¼š`weekly-reports/2026/`* +*æ•°æ®åº“:`weekly-reports/weekly_reports.db`* diff --git a/workspace-resume/weekly-reports/README.md b/workspace-resume/weekly-reports/README.md new file mode 100644 index 0000000..2494bd5 --- /dev/null +++ b/workspace-resume/weekly-reports/README.md @@ -0,0 +1,106 @@ +# 周报归档说明 + +## 📠目录结构 + +``` +weekly-reports/ +├── 2025/ +│ ├── 2025-W32.md # 2025 年第 32 周周报 +│ └── ... +├── 2026/ +│ ├── 2026-W29.md # 2026 年第 29 周周报 +│ ├── 2026-W31-周报.md +│ └── ... +└── README.md # 本文件 +``` + +## 📠归档规则 + +### 文件命å +- æ ¼å¼ï¼š`YYYY-Www.md` 或 `YYYY-Www-周报.md` +- 示例:`2026-W31.md`ã€`2026-W31-周报.md` + +### 文件内容结构 +```markdown +# G5 å¼€å‘周报 (2026-W31) + +**日期范围:** 2026-07-27 ~ 2026-07-31 + +## åŸºæœ¬ä¿¡æ¯ +- **项目:** 维云智造 G5 +- **主è¦ä»»åŠ¡ï¼š** <本周主è¦ä»»åŠ¡> + +## 本周工作内容 + +### 周一(2026-07-27) +- xxx +- xxx + +### 周二(2026-07-28) +- xxx + +### 周三(2026-07-29) +- xxx + +### 周四(2026-07-30) +- xxx + +### 周五(2026-07-31) +- xxx + +## 存在问题 +æ—  + +--- +*归档时间:2026-07-31* +``` + +## 🔠快速检索 + +### 按月份查看 +```bash +# 查看æŸå¹´æ‰€æœ‰å‘¨æŠ¥ +ls weekly-reports/2026/ + +# æŸ¥çœ‹æŸæœˆå‘¨æŠ¥ï¼ˆé€šè¿‡ grep 过滤日期) +grep -l "2026-07" weekly-reports/2026/*.md +``` + +### æŒ‰å…³é”®è¯æœç´¢ +```bash +# æœç´¢åŒ…å«ç‰¹å®šå…³é”®è¯çš„周报 +grep -r "库存预警" weekly-reports/ + +# æœç´¢æŸæ—¶é—´æ®µçš„æ‰€æœ‰å‘¨æŠ¥ +grep -l "2026-0[1-3]" weekly-reports/2026/*.md +``` + +## 📊 月度/年度汇总 + +ä½¿ç”¨æ±‡æ€»è„šæœ¬ç”ŸæˆæŒ‡å®šæ—¶é—´èŒƒå›´çš„工作总结: + +```bash +# ç”Ÿæˆæœˆåº¦æ±‡æ€» +python3 summarize_reports.py --month 2026-07 + +# 生æˆå¹´åº¦æ±‡æ€» +python3 summarize_reports.py --year 2026 +``` + +## 🔄 与邮件è‰ç¨¿çš„关系 + +- **本地归档**:`weekly-reports/` 目录下的 Markdown 文件,用于长期ä¿å­˜å’Œæ£€ç´¢ +- **邮件è‰ç¨¿**:通过 `send_weekly_report.py` 存入钉邮è‰ç¨¿ç®±ï¼Œç”¨äºŽæ¯å‘¨å‘é€ +- **两者互补**:本地归档便于检索汇总,邮件è‰ç¨¿ç”¨äºŽæ­£å¼æ±‡æŠ¥ + +## 📌 注æ„事项 + +1. æ¯å‘¨äº”生æˆå‘¨æŠ¥æ—¶ï¼Œ**åŒæ—¶**执行: + - 存入钉邮è‰ç¨¿ç®±ï¼ˆå‘é€ç”¨ï¼‰ + - ä¿å­˜åˆ° `weekly-reports/YYYY/YYYY-Www.md`(归档用) + +2. 归档文件应包å«å®Œæ•´çš„工作内容,ä¸è¦åˆ å‡ + +3. 存在问题部分如实记录,便于åŽç»­å›žé¡¾ + +4. 年度目录按自然年划分,便于年度考核使用 diff --git a/workspace-resume/weekly-reports/import_md_to_db.py b/workspace-resume/weekly-reports/import_md_to_db.py new file mode 100644 index 0000000..ec4bdfb --- /dev/null +++ b/workspace-resume/weekly-reports/import_md_to_db.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""从 weekly-reports/2026/*.md(标准格å¼ï¼‰é‡å»º SQLite 周报数æ®ã€‚ +对已存在的 (year,week,project) 记录执行 UPSERTï¼ˆå…ˆåˆ åŽæ’),ä¿è¯ä¸Žå½’档文件一致。 +""" +import glob +import os +import re +import sqlite3 + +BASE = "/home/yangxuan/.openclaw/workspace-resume/weekly-reports" +ARCHIVE_DIR = os.path.join(BASE, "2026") +DB = os.path.join(BASE, "weekly_reports.db") +WEEKDAY_MAP = {"周一": 1, "周二": 2, "周三": 3, "周四": 4, "周五": 5, "周六": 6, "周日": 7} + +def parse_md(path): + """è§£æžæ ‡å‡†æ ¼å¼ Markdown,返回 dict""" + with open(path, encoding="utf-8") as f: + text = f.read() + title_m = re.search(r"^#\s*((?:G5|G6))\s*å¼€å‘周报\s*\(2026-W(\d{2})\)", text, re.M) + project = title_m.group(1) if title_m else "G5" + week = int(title_m.group(2)) if title_m else None + start = end = None + m = re.search(r"\*\*日期范围:\*\*\s*(\d{4}-\d{2}-\d{2})\s*~\s*(\d{4}-\d{2}-\d{2})", text) + if m: + start, end = m.group(1), m.group(2) + main_task = "" + m = re.search(r"主è¦ä»»åŠ¡ï¼š\s*(.+)", text) + if m: + main_task = m.group(1).strip() + days = [] + cur_weekday = None + probs = [] + in_prob = False + for line in text.splitlines(): + dm = re.match(r"^(周一|周二|周三|周四|周五|周六|周日)((\d{4}-\d{2}-\d{2}))", line) + if dm: + cur_weekday = WEEKDAY_MAP[dm.group(1)] + days.append({"weekday": cur_weekday, "date": dm.group(2), "items": []}) + in_prob = False + continue + if line.strip().startswith("## 存在问题"): + in_prob = True + continue + if line.strip().startswith("## "): + in_prob = False + continue + if line.strip().startswith("- ") or line.strip().startswith(" - "): + item = re.sub(r"^\s*-\s*", "", line).strip() + if not item: + continue + if in_prob and item not in ("æ— ", "暂无"): + probs.append(item) + elif days: + days[-1]["items"].append(item) + return {"project": project, "week": week, "start": start, "end": end, + "main_task": main_task, "days": days, "problems": probs} + +def main(): + conn = sqlite3.connect(DB) + cur = conn.cursor() + files = sorted(glob.glob(os.path.join(ARCHIVE_DIR, "2026-W*-周报.md"))) + total = 0 + # 清空 2026 年全部周报(å«çº§è”明细/问题),用归档文件全é‡é‡å»ºï¼Œä¿è¯ä¸€è‡´ + cur.execute("DELETE FROM weekly_report_daily WHERE report_id IN (SELECT id FROM weekly_reports WHERE year=2026)") + cur.execute("DELETE FROM weekly_report_problems WHERE report_id IN (SELECT id FROM weekly_reports WHERE year=2026)") + cur.execute("DELETE FROM weekly_reports WHERE year=2026") + for path in files: + data = parse_md(path) + if data["week"] is None or not data["start"]: + print(f"⭠跳过(无法解æžï¼‰ï¼š{os.path.basename(path)}") + continue + wnum = data["week"] + # 先删除已有 (year, week, project) 记录(å«çº§è”明细/问题) + cur.execute( + "DELETE FROM weekly_reports WHERE year=? AND week_number=? AND project=?", + (2026, wnum, data["project"])) + cur.execute( + """INSERT INTO weekly_reports + (year, week_number, start_date, end_date, project, main_task, has_problems, file_path, word_count) + VALUES (?,?,?,?,?,?,?,?,?)""", + (2026, wnum, data["start"], data["end"], data["project"], data["main_task"], + len(data["problems"]) > 0, path, len(data["main_task"]))) + rid = cur.lastrowid + for d in data["days"]: + cur.execute( + "INSERT INTO weekly_report_daily (report_id, day_of_week, work_date, work_items) VALUES (?,?,?,?)", + (rid, d["weekday"], d["date"], "\n".join(d["items"]))) + for p in data["problems"]: + cur.execute( + "INSERT INTO weekly_report_problems (report_id, problem_description) VALUES (?,?)", + (rid, p)) + total += 1 + print(f"✅ W{wnum:02d} ({data['project']}) | {data['start']}~{data['end']} | " + f"天{len(data['days'])} 问题{len(data['problems'])}") + conn.commit() + print(f"\n完æˆï¼šå…±å…¥åº“ {total} 份周报") + # 统计 + print("\n=== æ•°æ®åº“现况 ===") + for row in cur.execute( + "SELECT week_number, project, start_date, end_date, main_task, has_problems FROM weekly_reports WHERE year=2026 ORDER BY week_number"): + print(f" W{row[0]:02d} | {row[1]} | {row[2]}~{row[3]} | 问题{row[5]} | {row[4][:28]}") + conn.close() + +if __name__ == "__main__": + main() diff --git a/workspace-resume/weekly-reports/migrate_legacy_reports.py b/workspace-resume/weekly-reports/migrate_legacy_reports.py new file mode 100644 index 0000000..3a56055 --- /dev/null +++ b/workspace-resume/weekly-reports/migrate_legacy_reports.py @@ -0,0 +1,183 @@ +#!/usr/bin/env python3 +""" +历å²å‘¨æŠ¥æ•´ç†å·¥å…· +将旧的 .txt æ ¼å¼å‘¨æŠ¥è½¬æ¢ä¸ºæ ‡å‡†çš„ Markdown å½’æ¡£æ ¼å¼ + +用法: + python3 migrate_legacy_reports.py --dry-run # 预览转æ¢ç»“æžœ + python3 migrate_legacy_reports.py --migrate # 执行è¿ç§» +""" + +import os +import re +from pathlib import Path +from datetime import datetime +import argparse + +REPORTS_DIR = Path(__file__).parent + + +def parse_legacy_report(filepath): + """è§£æžæ—§çš„ .txt æ ¼å¼å‘¨æŠ¥""" + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() + + # 从文件åæå–日期 + filename = filepath.name + match = re.match(r'(\d{4}-\d{2}-\d{2})_\d+_G5 周报\.txt', filename) + if not match: + return None + + friday_date = datetime.strptime(match.group(1), '%Y-%m-%d') + monday_date = friday_date - timedelta(days=friday_date.weekday()) + + # æå–内容 + lines = content.split('\n') + project = '维云智造 G5' + task = '' + daily_work = {} + problems = [] + + current_day = None + in_work_section = False + in_problem_section = False + + for line in lines: + line = line.strip() + if not line: + continue + + if line.startswith('主è¦ä»»åŠ¡ï¼š'): + task = line.replace('主è¦ä»»åŠ¡ï¼š', '').strip() + elif line.startswith('本周工作内容'): + in_work_section = True + in_problem_section = False + elif line.startswith('存在问题'): + in_work_section = False + in_problem_section = True + elif in_work_section and re.match(r'^周 [一二三四五六日]', line): + match = re.match(r'^(周 [一二三四五六日]).*?(\d{4}-\d{2}-\d{2})', line) + if match: + current_day = match.group(2) + daily_work[current_day] = [] + elif in_work_section and line.startswith('- '): + if current_day: + daily_work[current_day].append(line) + elif in_problem_section and line and not line.startswith('存在问题'): + problems.append(line) + + return { + 'monday': monday_date, + 'friday': friday_date, + 'project': project, + 'task': task, + 'daily_work': daily_work, + 'problems': problems, + 'original_file': str(filepath) + } + + +def generate_markdown(report): + """ç”Ÿæˆæ ‡å‡† Markdown æ ¼å¼""" + from datetime import timedelta + + week_number = report['monday'].isocalendar()[1] + year = report['monday'].year + + content = [] + content.append(f"# G5 å¼€å‘周报 ({year}-W{week_number:02d})") + content.append("") + content.append(f"**日期范围:** {report['monday'].strftime('%Y-%m-%d')} ~ {report['friday'].strftime('%Y-%m-%d')}") + content.append("") + content.append("## 基本信æ¯") + content.append(f"项目å称: {report['project']}") + content.append(f"主è¦ä»»åŠ¡ï¼š {report['task']}") + content.append("") + content.append("## 本周工作内容") + content.append("") + + # 按日期排åºè¾“å‡ºæ¯æ—¥å·¥ä½œ + for day in sorted(report['daily_work'].keys()): + content.append(f"### {day}") + for item in report['daily_work'][day]: + content.append(item) + content.append("") + + content.append("## 存在问题") + content.append("") + if report['problems']: + for problem in report['problems']: + content.append(f"- {problem}") + else: + content.append("æ— ") + content.append("") + content.append("---") + content.append(f"*归档时间:{datetime.now().strftime('%Y-%m-%d %H:%M')}*") + content.append(f"*原始文件:{report['original_file']}*") + + return '\n'.join(content) + + +def main(): + parser = argparse.ArgumentParser(description='历å²å‘¨æŠ¥æ•´ç†å·¥å…·') + parser.add_argument('--dry-run', action='store_true', help='预览转æ¢ç»“æžœï¼Œä¸æ‰§è¡Œè¿ç§»') + parser.add_argument('--migrate', action='store_true', help='执行è¿ç§»') + args = parser.parse_args() + + if not args.dry_run and not args.migrate: + print("请使用 --dry-run 预览或 --migrate 执行è¿ç§»") + return 1 + + # 查找所有 .txt 周报文件 + txt_files = list(REPORTS_DIR.glob('2025-*/2025-*.txt')) + list(REPORTS_DIR.glob('2026-*/2026-*.txt')) + + if not txt_files: + print("✅ 未找到需è¦è¿ç§»çš„æ—§æ ¼å¼å‘¨æŠ¥") + return 0 + + print(f"📂 找到 {len(txt_files)} 个旧格å¼å‘¨æŠ¥æ–‡ä»¶") + print("") + + migrated_count = 0 + for txt_file in sorted(txt_files): + report = parse_legacy_report(txt_file) + if not report: + print(f"âš ï¸ è·³è¿‡æ— æ³•è§£æžçš„æ–‡ä»¶ï¼š{txt_file.name}") + continue + + # 生æˆç›®æ ‡æ–‡ä»¶å + week_number = report['monday'].isocalendar()[1] + year = report['monday'].year + target_dir = REPORTS_DIR / str(year) + target_file = target_dir / f"{year}-W{week_number:02d}-周报.md" + + if args.dry_run: + print(f"📄 {txt_file.name} → {target_file.name}") + elif args.migrate: + # 检查是å¦å·²å­˜åœ¨ + if target_file.exists(): + print(f"â­ï¸ 已存在,跳过:{target_file.name}") + continue + + # 创建年份目录 + target_dir.mkdir(parents=True, exist_ok=True) + + # 生æˆå¹¶å†™å…¥ Markdown + markdown_content = generate_markdown(report) + with open(target_file, 'w', encoding='utf-8') as f: + f.write(markdown_content) + + print(f"✅ è¿ç§»å®Œæˆï¼š{target_file.name}") + migrated_count += 1 + + print("") + if args.dry_run: + print(f"📊 预览:共 {len(txt_files)} 个文件待è¿ç§»") + print(" 使用 --migrate 执行实际è¿ç§»") + elif args.migrate: + print(f"🎉 è¿ç§»å®Œæˆï¼å…±å¤„ç† {migrated_count} 个文件") + + +if __name__ == '__main__': + from datetime import timedelta + exit(main()) diff --git a/workspace-resume/weekly-reports/migrate_to_mysql.py b/workspace-resume/weekly-reports/migrate_to_mysql.py new file mode 100644 index 0000000..5292f39 --- /dev/null +++ b/workspace-resume/weekly-reports/migrate_to_mysql.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""å°† SQLite weekly_reports.db 的核心周报数æ®è¿ç§»åˆ° MySQL resume 库。 +ä»…è¿ç§»é«˜è´¨é‡æ ¸å¿ƒæ•°æ®ï¼ˆæ ‡å‡†æ ¼å¼ã€å«æ¯æ—¥æ˜Žç»†ï¼‰ï¼Œé»˜è®¤åŒæ­¥å…¨éƒ¨ï¼Œå¯æŒ‰å‚数过滤。 + +用法: + python3 migrate_to_mysql.py # åŒæ­¥å…¨éƒ¨ SQLite 周报到 MySQL + python3 migrate_to_mysql.py --dry-run # åªç»Ÿè®¡ä¸å†™å…¥ +""" +import os +import sqlite3 +import sys +import pymysql + +BASE = "/home/yangxuan/.openclaw/workspace-resume/weekly-reports" +SQLITE_DB = os.path.join(BASE, "weekly_reports.db") + +# MySQL 连接é…ç½® +MYSQL_HOST = "127.0.0.1" +MYSQL_PORT = 3306 +MYSQL_USER = "root" +MYSQL_DB = "resume" + +def get_mysql_pwd(): + """从 .env è¯»å– MySQL 密ç """ + env_path = "/home/yangxuan/.openclaw/.env" + if os.path.exists(env_path): + with open(env_path) as f: + for line in f: + line = line.strip() + if line.startswith("MYSQL_PWD="): + return line.split("=", 1)[1].strip() + return os.environ.get("MYSQL_PWD", "") + +def main(): + dry_run = "--dry-run" in sys.argv + pwd = get_mysql_pwd() + if not pwd: + print("⌠未找到 MySQL 密ç ï¼ˆMYSQL_PWD),退出") + return + + # 1. 读 SQLite + conn = sqlite3.connect(SQLITE_DB) + cur = conn.cursor() + reports = cur.execute( + "SELECT id, year, week_number, start_date, end_date, project, main_task, has_problems, file_path " + "FROM weekly_reports ORDER BY year, week_number").fetchall() + print(f"📂 SQLite 读å–到 {len(reports)} 份周报") + + # 2. 连接 MySQL + if dry_run: + print("🔠dry-run 模å¼ï¼šä»…统计") + for r in reports: + print(f" W{r[2]:02d} ({r[0]}) {r[1]} | {r[5]} | {r[3]}~{r[4]}") + conn.close() + return + + my = pymysql.connect(host=MYSQL_HOST, port=MYSQL_PORT, user=MYSQL_USER, + password=pwd, database=MYSQL_DB, charset="utf8mb4") + myc = my.cursor() + + # 3. é€ä»½æ’入(UPSERTï¼šå…ˆåˆ åŒ year/week/project 冿’,é¿å…冲çªï¼‰ + synced = 0 + for (rid, year, wnum, start, end, project, main_task, has_prob, file_path) in reports: + # 清掉åŒé”®æ—§æ•°æ® + myc.execute( + "DELETE FROM weekly_report_daily WHERE report_id IN " + "(SELECT id FROM weekly_reports WHERE year=%s AND week_number=%s AND project=%s)", + (year, wnum, project)) + myc.execute( + "DELETE FROM weekly_report_problems WHERE report_id IN " + "(SELECT id FROM weekly_reports WHERE year=%s AND week_number=%s AND project=%s)", + (year, wnum, project)) + myc.execute( + "DELETE FROM weekly_reports WHERE year=%s AND week_number=%s AND project=%s", + (year, wnum, project)) + # æ’入主表 + myc.execute( + "INSERT INTO weekly_reports (year, week_number, start_date, end_date, project, main_task, has_problems, file_path) " + "VALUES (%s,%s,%s,%s,%s,%s,%s,%s)", + (year, wnum, start, end, project, main_task, 1 if has_prob else 0, file_path)) + new_id = myc.lastrowid + # æ¯æ—¥æ˜Žç»† + daily = cur.execute( + "SELECT day_of_week, work_date, work_items FROM weekly_report_daily WHERE report_id=? ORDER BY work_date", + (rid,)).fetchall() + for (dow, wd, items) in daily: + myc.execute( + "INSERT INTO weekly_report_daily (report_id, day_of_week, work_date, work_items) VALUES (%s,%s,%s,%s)", + (new_id, dow, wd, items)) + # 问题 + probs = cur.execute( + "SELECT problem_description FROM weekly_report_problems WHERE report_id=?", + (rid,)).fetchall() + for (p_desc,) in probs: + myc.execute( + "INSERT INTO weekly_report_problems (report_id, problem_description) VALUES (%s,%s)", + (new_id, p_desc)) + synced += 1 + print(f" ✅ W{wnum:02d} ({project}) {start}~{end} | 明细{len(daily)}æ¡ é—®é¢˜{len(probs)}æ¡") + + my.commit() + myc.close() + my.close() + conn.close() + print(f"\n🎉 è¿ç§»å®Œæˆï¼š{synced} 份周报已写入 MySQL resume 库") + +if __name__ == "__main__": + main() diff --git a/workspace-resume/weekly-reports/parse_eml_to_md.py b/workspace-resume/weekly-reports/parse_eml_to_md.py new file mode 100644 index 0000000..32a0cd3 --- /dev/null +++ b/workspace-resume/weekly-reports/parse_eml_to_md.py @@ -0,0 +1,156 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""从钉邮周报 eml 文件批é‡è§£æžå¹¶å½’档到 weekly-reports 目录与 SQLite æ•°æ®åº“""" +import glob +import os +import re +import sqlite3 +import sys +from datetime import datetime, date +from email import policy +from email.parser import BytesParser + +BASE = "/home/yangxuan/.openclaw/workspace-resume/weekly-reports" +INBOUND = "/home/yangxuan/.openclaw/media/inbound" +DB = os.path.join(BASE, "weekly_reports.db") +ARCHIVE_DIR = os.path.join(BASE, "2026") + +# 问题标题之åŽçš„ç­¾åè¯ï¼Œç”¨äºŽæˆªæ–­ +SIGN_TERMS = ("best regards", "æ¨è½©", "地å€", "手机", "邮箱", "yangxuan@") + +def decode_b64_part(part): + payload = part.get_payload(decode=True) + if payload is None: + return "" + charset = part.get_content_charset() or "utf-8" + try: + return payload.decode(charset) + except Exception: + return payload.decode("utf-8", errors="replace") + +def parse_eml(path): + with open(path, "rb") as f: + msg = BytesParser(policy=policy.default).parse(f) + plain = "" + for part in msg.walk(): + if part.get_content_type() == "text/plain": + plain = decode_b64_part(part) + break + return plain, str(msg["Subject"] or "") + +def extract_weekly_data(plain): + """返回 (project, main_task, days, problems)""" + days = {} # key: (yyyy,mm,dd) -> list[item]; 按 ymd æŽ’åº + project = "" + main_task = "" + problems = [] + cur_ymd = None + in_problem = False + for raw in plain.splitlines(): + line = raw.strip() + if not line: + continue + # 项目åç§° + if line.startswith("项目åç§°"): + project = re.sub(r"^[📅]*\s*项目åç§°[::]?\s*", "", line).strip() + continue + if line.startswith("主è¦ä»»åŠ¡"): + main_task = re.sub(r"^[📅]*\s*主è¦ä»»åŠ¡[::]?\s*", "", line).strip() + continue + # 存在问题 标题 + if "存在问题" in line or re.match(r"^\s*问题", line): + in_problem = True + cur_ymd = None + continue + # å…¶ä»–å°æ ‡é¢˜ï¼ˆä¸‹å‘¨è®¡åˆ’ 等)退出问题区(é¿å…è¯¯åŒ¹é…æ­£æ–‡ï¼Œå¦‚"本周...") + if re.match(r"^(下周计划|下周计划:|备注[::]|说明[::]|下月计划)", line): + in_problem = False + cur_ymd = None + continue + # ç­¾åå¼€å§‹ï¼Œåœæ­¢ä¸€åˆ‡å¤„ç† + low = line.lower() + if any(s in low for s in SIGN_TERMS): + break + # 日期行:å¯å¸¦ emojiã€å¯å¸¦/ä¸å¸¦å¹´ä»½ + m = re.match(r"^[📅🔹•]?\s*(周一|周二|周三|周四|周五|周六|周日)[((]\s*(\d{4})-(\d{2})-(\d{2})\s*[))]", line) + if not m: + m = re.match(r"^[📅🔹•]?\s*(周一|周二|周三|周四|周五|周六|周日)[((]\s*(\d{2})-(\d{2})\s*[))]", line) + if m: + wd = m.group(1) + if len(m.groups()) == 4: + y, mm, dd = int(m.group(2)), m.group(3), m.group(4) + else: + # 需è¦å¹´ä»½ï¼Œç”¨æ–‡ä»¶ä¸»é¢˜ä¸­çš„年份,这里用 2026 å ä½ï¼Œè°ƒç”¨æ–¹æŒ‰ä¸»é¢˜æ ¡æ­£ + y = 2026; mm, dd = m.group(2), m.group(3) + cur_ymd = (y, mm, dd, wd) + days.setdefault(cur_ymd, []) + in_problem = False + continue + # æ¯æ—¥æ˜Žç»†å†…容:* 与文字å¯èƒ½è¢«æ‹†æˆä¸¤è¡Œï¼Œæ•… cur_ymd 有效时任何éžç­¾å行都归入 + if in_problem: + # 问题区(仅"存在问题"标题之åŽï¼‰ + if line not in ("æ— ", "暂无", "None", ""): + problems.append(re.sub(r"^[-*·â—▪◦]\s*", "", line).strip()) + elif cur_ymd: + item = re.sub(r"^[-*·â—▪◦]\s*", "", line).strip() + if item: + days[cur_ymd].append(item) + return project, main_task, days, problems + +def main(): + files = sorted(glob.glob(os.path.join(INBOUND, "*.eml"))) + if not files: + print("未找到 eml 文件") + return + results = [] + for path in files: + fname = os.path.basename(path) + m = re.search(r"(\d{4}-\d{2}-\d{2})_(\d{4}-\d{2}-\d{2})", fname) + if not m: + print(f"â­ {fname}: 文件åä¸å«æ—¥æœŸï¼Œè·³è¿‡") + continue + start, end = m.group(1), m.group(2) + plain, subject = parse_eml(path) + project, main_task, days, problems = extract_weekly_data(plain) + y0 = int(start[:4]) + from datetime import date as _d + iso = _d.fromisoformat(start).isocalendar() + wnum = iso[1] + fn = os.path.join(ARCHIVE_DIR, f"2026-W{wnum:02d}-周报.md") + # æ ¹æ®é¡¹ç›®åç¡®å®šæ ‡é¢˜é¡¹ç›®ä»£å· + proj_code = "G5" + if "G6" in project or "G6" in fname: + proj_code = "G6" + # 构建 Markdown + lines = [f"# {proj_code} å¼€å‘周报 (2026-W{wnum:02d})", "", + f"**日期范围:** {start} ~ {end}", "", + "## 基本信æ¯", f"项目å称: {project or '维云智造G5'}", f"主è¦ä»»åŠ¡ï¼š {main_task}", "", + "## 本周工作内容", ""] + for (y, mm, dd, wd) in sorted(days.keys(), key=lambda x: (x[0], int(x[1]), int(x[2]))): + ymd = f"{y}-{mm}-{dd}" + lines.append(f"{wd}({ymd})") + for item in days[(y, mm, dd, wd)]: + lines.append(f" - {item}") + lines.append("") + lines += ["## 存在问题"] + if problems: + for p in problems: + lines.append(f" - {p}") + else: + lines.append("æ— ") + lines += ["", "---", f"*归档时间:{datetime.now().strftime('%Y-%m-%d %H:%M')}*", + "*æ¥æºï¼šè§£æžå‘¨æŠ¥é‚®ä»¶ eml 文件*", ""] + md = "\n".join(lines) + os.makedirs(ARCHIVE_DIR, exist_ok=True) + with open(fn, "w") as f: + f.write(md) + # 清ç†ç©ºé—®é¢˜æ¡ç›®ï¼ˆ* ) + print(f"✅ 2026-W{wnum:02d} | {fname[:38]}...") + print(f" 项目={project} | 任务={main_task[:30]} | 天={len(days)} | 问题={problems}") + results.append((wnum, start, end, project, main_task, len(days), len(problems))) + print("\n===== 汇总 =====") + for r in results: + print(f" W{r[0]:02d} ({r[1]}~{r[2]}) | {r[3]} | 天{r[5]} 问题{r[6]}") + +if __name__ == "__main__": + main() diff --git a/workspace-resume/weekly-reports/summarize_reports.py b/workspace-resume/weekly-reports/summarize_reports.py new file mode 100644 index 0000000..a878343 --- /dev/null +++ b/workspace-resume/weekly-reports/summarize_reports.py @@ -0,0 +1,308 @@ +#!/usr/bin/env python3 +""" +周报汇总工具 - 从归档的周报中æå–指定时间范围的工作内容 +用于月度ã€å¹´åº¦è€ƒæ ¸æ—¶å¿«é€Ÿç”Ÿæˆå·¥ä½œæ€»ç»“ + +用法: + python3 summarize_reports.py --week 2026-W31 + python3 summarize_reports.py --month 2026-07 + python3 summarize_reports.py --year 2026 + python3 summarize_reports.py --range 2026-07-01 2026-09-30 +""" + +import os +import re +import glob +import argparse +from datetime import datetime, timedelta +from pathlib import Path + +# 周报归档目录 +REPORTS_DIR = Path(__file__).parent + + +def parse_week_number(week_str): + """è§£æžå‘¨æ•°æ ¼å¼ï¼Œå¦‚ 2026-W31""" + match = re.match(r'(\d{4})-W(\d{2})', week_str) + if not match: + return None + year, week = int(match.group(1)), int(match.group(2)) + # 计算该周的大致日期范围(简化处ç†ï¼Œå–第 1 周的周一) + jan_first = datetime(year, 1, 1) + week_start = jan_first + timedelta(weeks=week - 1) + # 调整到最近的周一 + week_start = week_start - timedelta(days=week_start.weekday()) + week_end = week_start + timedelta(days=4) # 周五 + return week_start, week_end + + +def parse_month_range(month_str): + """è§£æžæœˆä»½æ ¼å¼ï¼Œå¦‚ 2026-07""" + match = re.match(r'(\d{4})-(\d{2})', month_str) + if not match: + return None + year, month = int(match.group(1)), int(match.group(2)) + month_start = datetime(year, month, 1) + if month == 12: + next_month = datetime(year + 1, 1, 1) + else: + next_month = datetime(year, month + 1, 1) + month_end = next_month - timedelta(days=1) + return month_start, month_end + + +def parse_year_range(year_str): + """è§£æžå¹´ä»½æ ¼å¼ï¼Œå¦‚ 2026""" + match = re.match(r'(\d{4})', year_str) + if not match: + return None + year = int(match.group(1)) + year_start = datetime(year, 1, 1) + year_end = datetime(year, 12, 31) + return year_start, year_end + + +def parse_date_range(start_str, end_str): + """è§£æžæ—¥æœŸèŒƒå›´ï¼Œå¦‚ 2026-07-01 2026-09-30""" + try: + start = datetime.strptime(start_str, '%Y-%m-%d') + end = datetime.strptime(end_str, '%Y-%m-%d') + return start, end + except ValueError: + return None + + +def find_reports_in_range(start_date, end_date): + """在指定日期范围内查找所有周报文件""" + reports = [] + + # é历所有年份目录 + for year_dir in REPORTS_DIR.iterdir(): + if not year_dir.is_dir() or year_dir.name.startswith('.'): + continue + + # 查找该年份下的所有周报文件 + for report_file in glob.glob(str(year_dir / '*.md')): + if report_file.endswith('README.md'): + continue + + try: + with open(report_file, 'r', encoding='utf-8') as f: + content = f.read() + + # å°è¯•从文件内容中æå–日期范围 + date_match = re.search(r'(\d{4}-\d{2}-\d{2})\s*~\s*(\d{4}-\d{2}-\d{2})', content) + if date_match: + file_start = datetime.strptime(date_match.group(1), '%Y-%m-%d') + file_end = datetime.strptime(date_match.group(2), '%Y-%m-%d') + + # 检查是å¦åœ¨æŸ¥è¯¢èŒƒå›´å†… + if file_start <= end_date and file_end >= start_date: + reports.append({ + 'file': report_file, + 'start': file_start, + 'end': file_end, + 'content': content + }) + except Exception as e: + print(f"è¯»å–æ–‡ä»¶å¤±è´¥ {report_file}: {e}") + continue + + # æŒ‰æ—¥æœŸæŽ’åº + reports.sort(key=lambda x: x['start']) + return reports + + +def extract_work_content(report_content): + """从周报内容中æå–工作内容""" + sections = { + 'project': '', + 'task': '', + 'daily_work': {}, + 'problems': '' + } + + lines = report_content.split('\n') + current_section = None + current_day = None + + for line in lines: + # 项目åç§° + if line.startswith('项目å称:'): + sections['project'] = line.replace('项目å称:', '').strip() + + # 主è¦ä»»åŠ¡ + elif line.startswith('主è¦ä»»åŠ¡ï¼š'): + sections['task'] = line.replace('主è¦ä»»åŠ¡ï¼š', '').strip() + + # 本周工作内容 + elif '本周工作内容' in line: + current_section = 'daily_work' + + # 存在问题 + elif line.startswith('存在问题'): + current_section = 'problems' + current_day = None + + # 日期行(周一ã€å‘¨äºŒç­‰ï¼‰ + elif current_section == 'daily_work' and re.match(r'^周 [一二三四五六日](\d{4}-\d{2}-\d{2})', line): + match = re.match(r'^周 [一二三四五六日]((\d{4}-\d{2}-\d{2}))', line) + current_day = match.group(1) + sections['daily_work'][current_day] = [] + + # 工作内容项 + elif current_section == 'daily_work' and line.strip().startswith('- '): + if current_day: + sections['daily_work'][current_day].append(line.strip()) + + # 问题内容 + elif current_section == 'problems' and line.strip() and not line.startswith('存在问题'): + sections['problems'] += line + '\n' + + return sections + + +def generate_summary(reports, summary_type, date_range): + """ç”Ÿæˆæ±‡æ€»æŠ¥å‘Š""" + output = [] + + # 汇总头部 + start_str = date_range[0].strftime('%Y-%m-%d') + end_str = date_range[1].strftime('%Y-%m-%d') + + output.append(f"# 工作总结报告") + output.append(f"\n**时间范围:** {start_str} ~ {end_str}") + output.append(f"**ç”Ÿæˆæ—¶é—´ï¼š** {datetime.now().strftime('%Y-%m-%d %H:%M')}") + output.append(f"**包å«å‘¨æŠ¥æ•°ï¼š** {len(reports)} 周") + output.append("") + + # 按项目分组 + projects = {} + all_problems = [] + all_daily_work = {} + + for report in reports: + sections = extract_work_content(report['content']) + project = sections['project'] or '未指定项目' + + if project not in projects: + projects[project] = { + 'tasks': [], + 'weeks': [] + } + + if sections['task']: + projects[project]['tasks'].append({ + 'week': f"{report['start'].strftime('%Y-W%W')}", + 'task': sections['task'] + }) + projects[project]['weeks'].append(report['start'].strftime('%Y-W%W')) + + # 汇总问题 + if sections['problems'].strip(): + all_problems.append({ + 'week': report['start'].strftime('%Y-W%W'), + 'problems': sections['problems'].strip() + }) + + # æ±‡æ€»æ¯æ—¥å·¥ä½œ + for day, work_items in sections['daily_work'].items(): + if day not in all_daily_work: + all_daily_work[day] = [] + all_daily_work[day].extend(work_items) + + # 输出项目汇总 + output.append("## 📊 项目汇总\n") + for project, data in projects.items(): + output.append(f"### {project}") + weeks = sorted(set(data['weeks'])) + output.append(f"**å‚与周次:** {', '.join(weeks)}") + output.append(f"**主è¦ä»»åŠ¡ï¼š**") + for item in data['tasks']: + output.append(f"- {item['week']}: {item['task']}") + output.append("") + + # 输出存在问题汇总 + if all_problems: + output.append("## âš ï¸ å­˜åœ¨é—®é¢˜æ±‡æ€»\n") + for item in all_problems: + output.append(f"### {item['week']}") + output.append(item['problems']) + output.append("") + + # 输出所有周报原文(å¯é€‰ï¼‰ + output.append("\n---\n") + output.append("## 📋 原始周报记录\n") + for report in reports: + week_str = report['start'].strftime('%Y-W%W') + output.append(f"\n### {week_str} ({report['start'].strftime('%Y-%m-%d')} ~ {report['end'].strftime('%Y-%m-%d')})") + output.append(f"文件:{report['file']}\n") + # æå–å‘¨æŠ¥çš„å‰ 20 è¡Œä½œä¸ºæ‘˜è¦ + preview_lines = report['content'].split('\n')[:20] + output.append('\n'.join(preview_lines)) + output.append("\n... (更多内容è§åŽŸæ–‡ä»¶)\n") + + return '\n'.join(output) + + +def main(): + parser = argparse.ArgumentParser(description='周报汇总工具') + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument('--week', type=str, help='指定周数,如 2026-W31') + group.add_argument('--month', type=str, help='指定月份,如 2026-07') + group.add_argument('--year', type=str, help='指定年份,如 2026') + group.add_argument('--range', type=str, nargs=2, metavar=('START', 'END'), help='指定日期范围,如 2026-07-01 2026-09-30') + + args = parser.parse_args() + + # è§£æžæ—¥æœŸèŒƒå›´ + date_range = None + summary_type = None + + if args.week: + date_range = parse_week_number(args.week) + summary_type = 'week' + elif args.month: + date_range = parse_month_range(args.month) + summary_type = 'month' + elif args.year: + date_range = parse_year_range(args.year) + summary_type = 'year' + elif args.range: + date_range = parse_date_range(args.range[0], args.range[1]) + summary_type = 'range' + + if not date_range: + print("⌠日期格å¼é”™è¯¯") + return 1 + + print(f"🔠查找范围:{date_range[0].strftime('%Y-%m-%d')} ~ {date_range[1].strftime('%Y-%m-%d')}") + + # 查找周报 + reports = find_reports_in_range(date_range[0], date_range[1]) + + if not reports: + print("âŒ æœªæ‰¾åˆ°ç¬¦åˆæ¡ä»¶çš„周报") + return 1 + + print(f"✅ 找到 {len(reports)} 份周报") + + # ç”Ÿæˆæ±‡æ€» + summary = generate_summary(reports, summary_type, date_range) + + # 输出到文件 + output_file = f"summary_{datetime.now().strftime('%Y%m%d_%H%M%S')}.md" + with open(output_file, 'w', encoding='utf-8') as f: + f.write(summary) + + print(f"📄 汇总报告已生æˆï¼š{output_file}") + print("\n" + "="*50) + print(summary[:2000]) # é¢„è§ˆå‰ 2000 字符 + if len(summary) > 2000: + print(f"\n... (å…± {len(summary)} å­—ç¬¦ï¼Œå®Œæ•´å†…å®¹è§ {output_file})") + + return 0 + + +if __name__ == '__main__': + exit(main()) diff --git a/workspace-resume/weekly-reports/sync_reports_db.py b/workspace-resume/weekly-reports/sync_reports_db.py new file mode 100644 index 0000000..98e2c5c --- /dev/null +++ b/workspace-resume/weekly-reports/sync_reports_db.py @@ -0,0 +1,362 @@ +#!/usr/bin/env python3 +""" +周报数æ®åº“åŒæ­¥å·¥å…·ï¼ˆSQLite 版本) +å°† Markdown 周报的元数æ®åŒæ­¥åˆ° SQLite æ•°æ®åº“ + +用法: + python3 sync_reports_db.py --all # åŒæ­¥æ‰€æœ‰å‘¨æŠ¥ + python3 sync_reports_db.py --file xxx.md # åŒæ­¥å•个文件 + python3 sync_reports_db.py --week 2026-W35 # åŒæ­¥æŒ‡å®šå‘¨ + python3 sync_reports_db.py --stats # æŸ¥çœ‹ç»Ÿè®¡ä¿¡æ¯ +""" + +import os +import re +import sys +import argparse +import json +import sqlite3 +from pathlib import Path +from datetime import datetime, timedelta + +REPORTS_DIR = Path(__file__).parent +DB_PATH = REPORTS_DIR / 'weekly_reports.db' + + +def init_database(): + """åˆå§‹åŒ– SQLite æ•°æ®åº“""" + conn = sqlite3.connect(DB_PATH) + cursor = conn.cursor() + + # 创建周报元数æ®è¡¨ + cursor.execute(''' + CREATE TABLE IF NOT EXISTS weekly_reports ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + year INTEGER NOT NULL, + week_number INTEGER NOT NULL, + start_date TEXT NOT NULL, + end_date TEXT NOT NULL, + project TEXT NOT NULL, + main_task TEXT, + file_path TEXT NOT NULL UNIQUE, + has_problems INTEGER DEFAULT 0, + word_count INTEGER DEFAULT 0, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + ) + ''') + + # åˆ›å»ºæ¯æ—¥å·¥ä½œæ˜Žç»†è¡¨ + cursor.execute(''' + CREATE TABLE IF NOT EXISTS weekly_report_daily ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + report_id INTEGER NOT NULL, + day_of_week INTEGER NOT NULL, + work_date TEXT NOT NULL, + work_items TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (report_id) REFERENCES weekly_reports(id) ON DELETE CASCADE + ) + ''') + + # 创建问题记录表 + cursor.execute(''' + CREATE TABLE IF NOT EXISTS weekly_report_problems ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + report_id INTEGER NOT NULL, + problem_description TEXT NOT NULL, + status TEXT DEFAULT 'open', + resolved_at TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (report_id) REFERENCES weekly_reports(id) ON DELETE CASCADE + ) + ''') + + # 创建索引 + cursor.execute('CREATE INDEX IF NOT EXISTS idx_date ON weekly_reports(start_date, end_date)') + cursor.execute('CREATE INDEX IF NOT EXISTS idx_project ON weekly_reports(project)') + cursor.execute('CREATE UNIQUE INDEX IF NOT EXISTS uk_year_week ON weekly_reports(year, week_number, project)') + + conn.commit() + return conn + + +def parse_markdown_report(filepath): + """è§£æž Markdown 周报文件,æå–元数æ®""" + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() + + data = { + 'file_path': str(filepath), + 'year': None, + 'week_number': None, + 'start_date': None, + 'end_date': None, + 'project': None, + 'main_task': None, + 'daily_work': {}, + 'problems': [], + 'word_count': len(content) + } + + # æå–年份和周数(从文件å) + filename = filepath.name + match = re.match(r'(\d{4})-W(\d{2})', filename) + if match: + data['year'] = int(match.group(1)) + data['week_number'] = int(match.group(2)) + + # æå–æ—¥æœŸèŒƒå›´ï¼ˆå¤šç§æ ¼å¼å…¼å®¹ï¼‰ + # æ ¼å¼ 1: **日期范围:** 2026-08-25 ~ 2026-08-29 + date_match = re.search(r'\*\*日期范围:\*\*\s*(\d{4}-\d{2}-\d{2})\s*~\s*(\d{4}-\d{2}-\d{2})', content) + if date_match: + data['start_date'] = date_match.group(1) + data['end_date'] = date_match.group(2) + else: + # æ ¼å¼ 2: 2026-07-27 ~ 2026-07-31(在文件末尾) + date_match2 = re.search(r'(\d{4}-\d{2}-\d{2})\s*~\s*(\d{4}-\d{2}-\d{2})', content) + if date_match2: + data['start_date'] = date_match2.group(1) + data['end_date'] = date_match2.group(2) + else: + # æ ¼å¼ 3: ä»Žæ–‡ä»¶åæŽ¨ç®—(2026-W31) + if data['year'] and data['week_number']: + # 计算该周的周一和周五 + jan_first = datetime(data['year'], 1, 1) + week_start = jan_first + timedelta(weeks=data['week_number'] - 1) + week_start = week_start - timedelta(days=week_start.weekday()) + week_end = week_start + timedelta(days=4) + data['start_date'] = week_start.strftime('%Y-%m-%d') + data['end_date'] = week_end.strftime('%Y-%m-%d') + + # æå–项目åç§°ï¼ˆå¤šç§æ ¼å¼å…¼å®¹ï¼‰ + # æ ¼å¼ 1: 项目å称:维云智造 G5 + project_match = re.search(r'项目å称:\s*(维云智造\s*(G\d+)|G\d+)', content) + if project_match: + project_text = project_match.group(1) + g_match = re.search(r'G(\d+)', project_text) + if g_match: + data['project'] = f"G{g_match.group(1)}" + else: + data['project'] = 'G5' + else: + # æ ¼å¼ 2: **项目:** 维云智造 G6 + project_match2 = re.search(r'\*\*项目:\*\*\s*(维云智造\s*(G\d+)|G\d+)', content) + if project_match2: + project_text = project_match2.group(1) + g_match = re.search(r'G(\d+)', project_text) + if g_match: + data['project'] = f"G{g_match.group(1)}" + else: + data['project'] = 'G5' + else: + # 默认 G5 + data['project'] = 'G5' + + # æå–主è¦ä»»åŠ¡ + task_match = re.search(r'主è¦ä»»åŠ¡ï¼š\s*(.+?)(?:\n|$)', content) + if task_match: + data['main_task'] = task_match.group(1).strip() + + # æå–æ¯æ—¥å·¥ä½œ + daily_section = re.search(r'## 本周工作内容\s*\n([\s\S]*?)(?:\n##|\Z)', content) + if daily_section: + daily_text = daily_section.group(1) + days = re.findall(r'###?\s*(?:周 [一二三四五六日]|(\d{4}-\d{2}-\d{2}))\s*\n([\s\S]*?)(?=###?|$)', daily_text) + for date_str, work_text in days: + if date_str: + items = re.findall(r'^\s*[-•*]\s*(.+)$', work_text, re.MULTILINE) + data['daily_work'][date_str] = items + + # æå–存在问题 + problem_section = re.search(r'## 存在问题\s*\n([\s\S]*?)(?:\n##|\Z)', content) + if problem_section: + problem_text = problem_section.group(1).strip() + if problem_text and problem_text != 'æ— ': + data['problems'] = [line.strip() for line in problem_text.split('\n') if line.strip()] + + return data + + +def sync_report(conn, report_data): + """åŒæ­¥å•个周报到数æ®åº“""" + cursor = conn.cursor() + + try: + # æ’å…¥æˆ–æ›´æ–°å‘¨æŠ¥å…ƒæ•°æ® + cursor.execute(''' + INSERT INTO weekly_reports + (year, week_number, start_date, end_date, project, main_task, file_path, has_problems, word_count) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + ON CONFLICT(year, week_number, project) DO UPDATE SET + main_task = excluded.main_task, + file_path = excluded.file_path, + has_problems = excluded.has_problems, + word_count = excluded.word_count, + updated_at = CURRENT_TIMESTAMP + ''', ( + report_data['year'], + report_data['week_number'], + report_data['start_date'], + report_data['end_date'], + report_data['project'], + report_data['main_task'], + report_data['file_path'], + 1 if report_data['problems'] else 0, + report_data['word_count'] + )) + + report_id = cursor.lastrowid + if report_id is None: + # æ›´æ–°æ“作,需è¦èŽ·å–现有 ID + cursor.execute('SELECT id FROM weekly_reports WHERE file_path = ?', (report_data['file_path'],)) + row = cursor.fetchone() + if row: + report_id = row[0] + + # åˆ é™¤æ—§çš„æ¯æ—¥å·¥ä½œè®°å½• + cursor.execute('DELETE FROM weekly_report_daily WHERE report_id = ?', (report_id,)) + + # æ’å…¥æ–°çš„æ¯æ—¥å·¥ä½œè®°å½• + for work_date, items in report_data['daily_work'].items(): + day_of_week = datetime.strptime(work_date, '%Y-%m-%d').weekday() + 1 + items_json = json.dumps(items, ensure_ascii=False) + + cursor.execute(''' + INSERT INTO weekly_report_daily + (report_id, day_of_week, work_date, work_items) + VALUES (?, ?, ?, ?) + ''', (report_id, day_of_week, work_date, items_json)) + + # 删除旧的问题记录 + cursor.execute('DELETE FROM weekly_report_problems WHERE report_id = ?', (report_id,)) + + # æ’入新的问题记录 + for problem in report_data['problems']: + cursor.execute(''' + INSERT INTO weekly_report_problems + (report_id, problem_description) + VALUES (?, ?) + ''', (report_id, problem)) + + conn.commit() + return True + + except sqlite3.Error as e: + print(f"⌠数æ®åº“错误:{e}") + conn.rollback() + return False + + +def show_stats(conn): + """显示统计信æ¯""" + cursor = conn.cursor() + + print("\n📊 周报统计信æ¯\n") + print("=" * 60) + + # 总览 + cursor.execute('SELECT COUNT(*) FROM weekly_reports') + total = cursor.fetchone()[0] + print(f"📠周报总数:{total} 周") + + # 按项目统计 + cursor.execute(''' + SELECT project, COUNT(*) as count, + SUM(has_problems) as problem_weeks, + AVG(word_count) as avg_words + FROM weekly_reports + GROUP BY project + ''') + print("\n📋 按项目统计:") + for row in cursor.fetchall(): + print(f" {row[0]}: {row[1]} 周,问题 {row[2]} 周,平å‡å­—æ•° {int(row[3])}") + + # 最近 5 周 + cursor.execute(''' + SELECT year, week_number, start_date, end_date, project, main_task, has_problems + FROM weekly_reports + ORDER BY year DESC, week_number DESC + LIMIT 5 + ''') + print("\n📅 最近 5 周:") + for row in cursor.fetchall(): + problem_flag = "âš ï¸" if row[6] else "✅" + print(f" {problem_flag} {row[0]}-W{row[1]:02d} ({row[2]}~{row[3]}) {row[4]} - {row[5][:30]}") + + # 存在问题统计 + cursor.execute('SELECT COUNT(*) FROM weekly_reports WHERE has_problems = 1') + problem_count = cursor.fetchone()[0] + print(f"\nâš ï¸ å­˜åœ¨é—®é¢˜å‘¨æŠ¥ï¼š{problem_count} 周") + + print("=" * 60) + + +def main(): + parser = argparse.ArgumentParser(description='周报数æ®åº“åŒæ­¥å·¥å…·ï¼ˆSQLite)') + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument('--all', action='store_true', help='åŒæ­¥æ‰€æœ‰å‘¨æŠ¥') + group.add_argument('--file', type=str, help='åŒæ­¥å•个文件') + group.add_argument('--week', type=str, help='åŒæ­¥æŒ‡å®šå‘¨ï¼Œå¦‚ 2026-W35') + group.add_argument('--stats', action='store_true', help='查看统计信æ¯') + + args = parser.parse_args() + + # åˆå§‹åŒ–æ•°æ®åº“ + conn = init_database() + print(f"✅ æ•°æ®åº“å·²åˆå§‹åŒ–:{DB_PATH}") + + if args.stats: + show_stats(conn) + conn.close() + return 0 + + files_to_sync = [] + + if args.file: + files_to_sync = [Path(args.file)] + elif args.week: + match = re.match(r'(\d{4})-W(\d{2})', args.week) + if match: + year, week = match.groups() + pattern = f"{year}-W{week}-*.md" + files_to_sync = list(REPORTS_DIR.glob(f"{year}/{pattern}")) + elif args.all: + for year_dir in REPORTS_DIR.iterdir(): + if year_dir.is_dir() and year_dir.name.isdigit(): + files_to_sync.extend(year_dir.glob("*.md")) + + if not files_to_sync: + print("âš ï¸ æœªæ‰¾åˆ°éœ€è¦åŒæ­¥çš„æ–‡ä»¶") + conn.close() + return 1 + + print(f"📂 找到 {len(files_to_sync)} ä¸ªæ–‡ä»¶å¾…åŒæ­¥\n") + + success_count = 0 + for filepath in sorted(files_to_sync): + if not filepath.exists(): + print(f"âš ï¸ æ–‡ä»¶ä¸å­˜åœ¨ï¼š{filepath}") + continue + + print(f"📄 处ç†ï¼š{filepath.name}") + report_data = parse_markdown_report(filepath) + + if not report_data['year'] or not report_data['week_number']: + print(f" âš ï¸ æ— æ³•è§£æžå¹´ä»½/周数,跳过") + continue + + if sync_report(conn, report_data): + print(f" ✅ åŒæ­¥æˆåŠŸ") + success_count += 1 + else: + print(f" âŒ åŒæ­¥å¤±è´¥") + + print(f"\n{'✅' if success_count == len(files_to_sync) else 'âš ï¸'} 完æˆï¼š{success_count}/{len(files_to_sync)} 个文件") + + conn.close() + return 0 if success_count == len(files_to_sync) else 1 + + +if __name__ == '__main__': + exit(main()) diff --git a/workspace-resume/weekly-reports/sync_reports_to_db.py b/workspace-resume/weekly-reports/sync_reports_to_db.py new file mode 100644 index 0000000..2b3c217 --- /dev/null +++ b/workspace-resume/weekly-reports/sync_reports_to_db.py @@ -0,0 +1,265 @@ +#!/usr/bin/env python3 +""" +周报数æ®åº“åŒæ­¥å·¥å…· +å°† Markdown 周报的元数æ®åŒæ­¥åˆ° MySQL æ•°æ®åº“ + +用法: + python3 sync_reports_to_db.py --all # åŒæ­¥æ‰€æœ‰å‘¨æŠ¥ + python3 sync_reports_to_db.py --file xxx.md # åŒæ­¥å•个文件 + python3 sync_reports_to_db.py --week 2026-W35 # åŒæ­¥æŒ‡å®šå‘¨ +""" + +import os +import re +import sys +import argparse +import json +from pathlib import Path +from datetime import datetime + +# æ•°æ®åº“é…ç½® +DB_CONFIG = { + 'host': 'localhost', + 'user': 'root', + 'password': '', # 从 .env è¯»å– + 'database': 'resume' +} + +REPORTS_DIR = Path(__file__).parent / 'weekly-reports' + + +def load_env(): + """è¯»å– .env 文件""" + env = {} + env_path = Path(__file__).parent.parent / '.env' + try: + with open(env_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + if not line or line.startswith('#') or '=' not in line: + continue + key, _, value = line.partition('=') + env[key.strip()] = value.strip().strip('"').strip("'") + except FileNotFoundError: + pass + return env + + +def parse_markdown_report(filepath): + """è§£æž Markdown 周报文件,æå–元数æ®""" + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() + + data = { + 'file_path': str(filepath), + 'year': None, + 'week_number': None, + 'start_date': None, + 'end_date': None, + 'project': None, + 'main_task': None, + 'daily_work': {}, + 'problems': [], + 'word_count': len(content) + } + + # æå–å¹´ä»½å’Œå‘¨æ•°ï¼ˆä»Žæ–‡ä»¶åæˆ–内容) + filename = filepath.name + match = re.match(r'(\d{4})-W(\d{2})', filename) + if match: + data['year'] = int(match.group(1)) + data['week_number'] = int(match.group(2)) + + # æå–日期范围 + date_match = re.search(r'\*\*日期范围:\*\*\s*(\d{4}-\d{2}-\d{2})\s*~\s*(\d{4}-\d{2}-\d{2})', content) + if date_match: + data['start_date'] = date_match.group(1) + data['end_date'] = date_match.group(2) + + # æå–项目åç§° + project_match = re.search(r'项目å称:\s*(维云智造\s*(G\d+)|G\d+)', content) + if project_match: + project_text = project_match.group(1) + g_match = re.search(r'G(\d+)', project_text) + if g_match: + data['project'] = f"G{g_match.group(1)}" + else: + data['project'] = 'G5' # 默认 + + # æå–主è¦ä»»åŠ¡ + task_match = re.search(r'主è¦ä»»åŠ¡ï¼š\s*(.+?)(?:\n|$)', content) + if task_match: + data['main_task'] = task_match.group(1).strip() + + # æå–æ¯æ—¥å·¥ä½œ + daily_section = re.search(r'## 本周工作内容\s*\n([\s\S]*?)(?:\n##|\Z)', content) + if daily_section: + daily_text = daily_section.group(1) + # åŒ¹é…æ¯æ—¥å†…容 + days = re.findall(r'###?\s*(?:周 [一二三四五六日]|(\d{4}-\d{2}-\d{2}))\s*\n([\s\S]*?)(?=###?|$)', daily_text) + for date_str, work_text in days: + if date_str: + items = re.findall(r'^\s*[-•*]\s*(.+)$', work_text, re.MULTILINE) + data['daily_work'][date_str] = items + + # æå–存在问题 + problem_section = re.search(r'## 存在问题\s*\n([\s\S]*?)(?:\n##|\Z)', content) + if problem_section: + problem_text = problem_section.group(1).strip() + if problem_text and problem_text != 'æ— ': + data['problems'] = [line.strip() for line in problem_text.split('\n') if line.strip()] + + return data + + +def sync_to_mysql(report_data, dry_run=False): + """åŒæ­¥åˆ° MySQL æ•°æ®åº“""" + try: + import mysql.connector + except ImportError: + print("⌠需è¦å®‰è£… mysql-connector-python: pip3 install mysql-connector-python") + return False + + env = load_env() + db_config = { + 'host': 'localhost', + 'user': 'root', + 'password': env.get('MYSQL_ROOT_PASSWORD', ''), + 'database': 'resume', + 'charset': 'utf8mb4' + } + + try: + conn = mysql.connector.connect(**db_config) + cursor = conn.cursor() + + # æ’å…¥æˆ–æ›´æ–°å‘¨æŠ¥å…ƒæ•°æ® + sql = """ + INSERT INTO weekly_reports + (year, week_number, start_date, end_date, project, main_task, file_path, has_problems, word_count) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) + ON DUPLICATE KEY UPDATE + main_task = VALUES(main_task), + file_path = VALUES(file_path), + has_problems = VALUES(has_problems), + word_count = VALUES(word_count), + updated_at = CURRENT_TIMESTAMP + """ + + values = ( + report_data['year'], + report_data['week_number'], + report_data['start_date'], + report_data['end_date'], + report_data['project'], + report_data['main_task'], + report_data['file_path'], + 1 if report_data['problems'] else 0, + report_data['word_count'] + ) + + if dry_run: + print(f"📠[DRY RUN] 会执行:{sql % values}") + else: + cursor.execute(sql, values) + report_id = cursor.lastrowid + + # åŒæ­¥æ¯æ—¥å·¥ä½œæ˜Žç»† + if report_id: + for work_date, items in report_data['daily_work'].items(): + day_of_week = datetime.strptime(work_date, '%Y-%m-%d').weekday() + 1 + items_json = json.dumps(items, ensure_ascii=False) + + daily_sql = """ + INSERT INTO weekly_report_daily + (report_id, day_of_week, work_date, work_items) + VALUES (%s, %s, %s, %s) + ON DUPLICATE KEY UPDATE work_items = VALUES(work_items) + """ + + cursor.execute(daily_sql, (report_id, day_of_week, work_date, items_json)) + + # åŒæ­¥é—®é¢˜è®°å½• + if report_data['problems']: + for problem in report_data['problems']: + problem_sql = """ + INSERT INTO weekly_report_problems + (report_id, problem_description) + VALUES (%s, %s) + """ + cursor.execute(problem_sql, (report_id, problem)) + + conn.commit() + print(f"✅ åŒæ­¥æˆåŠŸï¼š{report_data['file_path']}") + + cursor.close() + conn.close() + return True + + except mysql.connector.Error as err: + print(f"⌠数æ®åº“错误:{err}") + return False + + +def main(): + parser = argparse.ArgumentParser(description='周报数æ®åº“åŒæ­¥å·¥å…·') + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument('--all', action='store_true', help='åŒæ­¥æ‰€æœ‰å‘¨æŠ¥') + group.add_argument('--file', type=str, help='åŒæ­¥å•个文件') + group.add_argument('--week', type=str, help='åŒæ­¥æŒ‡å®šå‘¨ï¼Œå¦‚ 2026-W35') + group.add_argument('--dry-run', action='store_true', help='预览执行,ä¸å®žé™…写入数æ®åº“') + + args = parser.parse_args() + + files_to_sync = [] + + if args.file: + files_to_sync = [Path(args.file)] + elif args.week: + match = re.match(r'(\d{4})-W(\d{2})', args.week) + if match: + year, week = match.groups() + pattern = f"{year}-W{week}-*.md" + files_to_sync = list(REPORTS_DIR.glob(f"{year}/{pattern}")) + elif args.all: + # 查找所有 Markdown 周报文件 + for year_dir in REPORTS_DIR.iterdir(): + if year_dir.is_dir() and year_dir.name.isdigit(): + files_to_sync.extend(year_dir.glob("*.md")) + + if not files_to_sync: + print("âš ï¸ æœªæ‰¾åˆ°éœ€è¦åŒæ­¥çš„æ–‡ä»¶") + return 1 + + print(f"📂 找到 {len(files_to_sync)} ä¸ªæ–‡ä»¶å¾…åŒæ­¥") + + success_count = 0 + for filepath in sorted(files_to_sync): + if not filepath.exists(): + print(f"âš ï¸ æ–‡ä»¶ä¸å­˜åœ¨ï¼š{filepath}") + continue + + print(f"\n📄 处ç†ï¼š{filepath.name}") + report_data = parse_markdown_report(filepath) + + if not report_data['year'] or not report_data['week_number']: + print(f"âš ï¸ æ— æ³•è§£æžå¹´ä»½/周数,跳过") + continue + + if args.dry_run: + print(f" 年份:{report_data['year']}, 周数:{report_data['week_number']}") + print(f" 日期:{report_data['start_date']} ~ {report_data['end_date']}") + print(f" 项目:{report_data['project']}") + print(f" 任务:{report_data['main_task']}") + print(f" 问题:{len(report_data['problems'])} 个") + success_count += 1 + else: + if sync_to_mysql(report_data): + success_count += 1 + + print(f"\n{'✅' if success_count == len(files_to_sync) else 'âš ï¸'} 完æˆï¼š{success_count}/{len(files_to_sync)} 个文件") + return 0 if success_count == len(files_to_sync) else 1 + + +if __name__ == '__main__': + exit(main()) diff --git a/workspace-resume/weekly-reports/weekly_reports.db b/workspace-resume/weekly-reports/weekly_reports.db new file mode 100644 index 0000000000000000000000000000000000000000..5516a3b72b38f5c44e4c9589d5941db7bb6c095b GIT binary patch literal 45056 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 literal 0 HcmV?d00001 diff --git a/workspace-resume/weekly-reports/使用指å—.md b/workspace-resume/weekly-reports/使用指å—.md new file mode 100644 index 0000000..fad8ee8 --- /dev/null +++ b/workspace-resume/weekly-reports/使用指å—.md @@ -0,0 +1,220 @@ +# 📋 周报æŒä¹…åŒ–å½’æ¡£ä½¿ç”¨æŒ‡å— + +## ✅ 已实现功能 + +### 1. 自动归档 +æ¯å‘¨äº”生æˆå‘¨æŠ¥æ—¶ï¼Œè„šæœ¬ä¼š**自动**执行两步æ“作: +- ✅ 存入钉邮è‰ç¨¿ç®±ï¼ˆç”¨äºŽå‘é€ï¼‰ +- ✅ ä¿å­˜åˆ° `weekly-reports/YYYY/YYYY-Www-周报.md`(用于归档) + +### 2. 汇总工具 +æ”¯æŒæŒ‰å‘¨/月/å¹´/自定义范围汇总工作内容,用于月度ã€å¹´åº¦è€ƒæ ¸ã€‚ + +--- + +## 🚀 使用方法 + +### æ–¹å¼ä¸€ï¼šä½¿ç”¨å‘¨æŠ¥æŠ€èƒ½ï¼ˆæŽ¨è) + +当你需è¦ç”Ÿæˆå‘¨æŠ¥æ—¶ï¼Œåªéœ€å‘Šè¯‰æˆ‘: + +> "ç”Ÿæˆæœ¬å‘¨å‘¨æŠ¥" 或 "写周报" + +我会: +1. 询问你本周的工作内容(或从日记中æå–) +2. 按标准格å¼ç”Ÿæˆå‘¨æŠ¥ +3. **自动归档**到 `weekly-reports/` 目录 +4. 存入钉邮è‰ç¨¿ç®± +5. 通知你去钉钉邮箱确认å‘é€ + +### æ–¹å¼äºŒï¼šæ‰‹åЍè¿è¡Œè„šæœ¬ + +```bash +cd /home/yangxuan/.openclaw/workspace-resume + +# 生æˆå¹¶å‘é€å‘¨æŠ¥ï¼ˆè‡ªåŠ¨å½’æ¡£ï¼‰ +python3 send_weekly_report.py \ + --project G5 \ + --plain "项目å称: 维云智造 G5 +主è¦ä»»åŠ¡ï¼š 本周主è¦ä»»åŠ¡ + +本周工作内容 +周一(2026-08-25) + - 工作内容 1 + - 工作内容 2 + +存在问题 +æ— " \ + --html "

HTML 版本正文

" \ + --date-range "2026-08-25 ~ 2026-08-29" + +# å¦‚æžœåªæƒ³å‘é€é‚®ä»¶ï¼Œä¸å½’æ¡£ï¼ˆä¸æŽ¨è) +python3 send_weekly_report.py --no-archive ... +``` + +### æ–¹å¼ä¸‰ï¼šæŸ¥çœ‹åކå²å‘¨æŠ¥ + +```bash +# 查看æŸå¹´æ‰€æœ‰å‘¨æŠ¥ +ls weekly-reports/2026/ + +# 查看特定周报内容 +cat weekly-reports/2026/2026-W31-周报.md + +# æœç´¢åŒ…å«å…³é”®è¯çš„周报 +grep -r "库存预警" weekly-reports/ +``` + +--- + +## 📊 汇总工具使用 + +### 按月汇总(月度考核) + +```bash +cd weekly-reports +python3 summarize_reports.py --month 2026-07 +``` + +ç”Ÿæˆæ–‡ä»¶ï¼š`summary_20260731_174000.md` + +### 按年汇总(年度考核) + +```bash +python3 summarize_reports.py --year 2026 +``` + +### 按周查看 + +```bash +python3 summarize_reports.py --week 2026-W31 +``` + +### 自定义日期范围 + +```bash +python3 summarize_reports.py --range 2026-07-01 2026-09-30 +``` + +--- + +## 📠文件结构 + +``` +weekly-reports/ +├── README.md # 归档说明文档 +├── 使用指å—.md # 本文件 +├── summarize_reports.py # 汇总工具脚本 +├── 2025/ # 2025 年周报 +│ ├── 2025-08/ +│ ├── 2025-09/ +│ └── ... +├── 2026/ # 2026 年周报 +│ ├── 2026-W29.md +│ ├── 2026-W31-周报.md +│ ├── 2026-W35-周报.md # 最新归档 +│ └── summary_*.md # 生æˆçš„æ±‡æ€»æŠ¥å‘Š +└── ... +``` + +--- + +## 🔠汇总报告示例 + +è¿è¡Œæ±‡æ€»å·¥å…·åŽï¼Œä¼šç”Ÿæˆç±»ä¼¼ä»¥ä¸‹çš„æŠ¥å‘Šï¼š + +```markdown +# 工作总结报告 + +**时间范围:** 2026-07-01 ~ 2026-07-31 +**ç”Ÿæˆæ—¶é—´ï¼š** 2026-07-31 17:40 +**包å«å‘¨æŠ¥æ•°ï¼š** 4 周 + +## 📊 项目汇总 + +### 维云智造 G5 +**å‚与周次:** 2026-W27, 2026-W28, 2026-W29, 2026-W30 +**主è¦ä»»åŠ¡ï¼š** +- 2026-W27: 库存预警模å—å¼€å‘ +- 2026-W28: 出入库æµç¨‹ä¼˜åŒ– +- 2026-W29: 生产领料功能测试 +- 2026-W30: 版本å‘å¸ƒæ”¯æŒ + +## âš ï¸ å­˜åœ¨é—®é¢˜æ±‡æ€» + +### 2026-W28 +- åŽ†å²æ•°æ®è¿ç§»å­˜åœ¨å…¼å®¹æ€§é—®é¢˜ + +### 2026-W30 +- 测试环境ä¸ç¨³å®š + +## 📋 原始周报记录 + +### 2026-W27 (2026-07-01 ~ 2026-07-05) +文件:weekly-reports/2026/2026-W27-周报.md +... +``` + +--- + +## 💡 最佳实践 + +### 1. æ¯å‘¨äº”固定æµç¨‹ +``` +1. 收集本周工作内容(从日记或记忆) +2. 生æˆå‘¨æŠ¥ï¼ˆé€šè¿‡å¯¹è¯æˆ–脚本) +3. 自动归档 + 存入è‰ç¨¿ç®± +4. 去钉钉邮箱确认å‘é€ +``` + +### 2. 月度考核准备 +```bash +# æ¯æœˆæœ€åŽä¸€å¤©è¿è¡Œ +python3 summarize_reports.py --month 2026-XX +``` + +### 3. 年度考核准备 +```bash +# æ¯å¹´å¹´åº•è¿è¡Œ +python3 summarize_reports.py --year 2026 +``` + +### 4. 快速检索 +```bash +# 查找æŸä¸ªé¡¹ç›®çš„æ‰€æœ‰å‘¨æŠ¥ +grep -r "G5" weekly-reports/ --include="*.md" + +# 查找包å«ç‰¹å®šå…³é”®è¯çš„周报 +grep -r "库存预警" weekly-reports/ --include="*.md" -l +``` + +--- + +## ⓠ常è§é—®é¢˜ + +### Q: 归档文件在哪里? +A: `weekly-reports/YYYY/YYYY-Www-周报.md` + +### Q: 如何查看æŸä¸ªæœˆçš„æ‰€æœ‰å·¥ä½œï¼Ÿ +A: 使用汇总工具:`python3 summarize_reports.py --month 2026-07` + +### Q: 历å²å‘¨æŠ¥ï¼ˆ2025 年)有归档å—? +A: 有,已整ç†åˆ° `weekly-reports/2025-XX/` 儿œˆç›®å½•中 + +### Q: å¯ä»¥æ‰‹åŠ¨ä¿®æ”¹å½’æ¡£æ–‡ä»¶å—? +A: å¯ä»¥ï¼Œå½’档文件是普通 Markdown 文件,å¯éšæ—¶ç¼–è¾‘ + +### Q: 如果忘记归档怎么办? +A: å¯ä»¥æ‰‹åŠ¨åˆ›å»ºæ–‡ä»¶åˆ°å¯¹åº”ç›®å½•ï¼Œå‘½åæ ¼å¼ï¼š`YYYY-Www-周报.md` + +--- + +## 📞 需è¦å¸®åŠ©ï¼Ÿ + +直接告诉我: +- "å¸®æˆ‘ç”Ÿæˆæœ¬å‘¨å‘¨æŠ¥" +- "汇总 7 月份的工作" +- "查找关于库存的周报" +- "生æˆå¹´ç»ˆæ€»ç»“" + +我会帮你处ç†ï¼ diff --git a/workspace-resume/weekly-reports/å®žæ–½å®Œæˆæ€»ç»“.md b/workspace-resume/weekly-reports/å®žæ–½å®Œæˆæ€»ç»“.md new file mode 100644 index 0000000..aa0f53d --- /dev/null +++ b/workspace-resume/weekly-reports/å®žæ–½å®Œæˆæ€»ç»“.md @@ -0,0 +1,300 @@ +# ✅ 周报混åˆå½’档系统 - å®žæ–½å®Œæˆæ€»ç»“ + +**实施日期:** 2026-08-27 +**方案类型:** Markdown 文件 + SQLite æ•°æ®åº“ï¼ˆæ··åˆæ–¹æ¡ˆï¼‰ + +--- + +## 🎯 已完æˆçš„工作 + +### 1. 核心功能实现 ✅ + +#### Markdown 归档(完整内容) +- ✅ `send_weekly_report.py` - 自动归档到 `weekly-reports/YYYY/YYYY-Www-周报.md` +- ✅ `summarize_reports.py` - 按周/月/å¹´æ±‡æ€»ç”ŸæˆæŠ¥å‘Š +- ✅ 标准化归档格å¼ï¼ˆæ—¥æœŸèŒƒå›´ã€é¡¹ç›®ã€ä¸»è¦ä»»åŠ¡ã€æ¯æ—¥å·¥ä½œã€å­˜åœ¨é—®é¢˜ï¼‰ + +#### SQLite æ•°æ®åº“(元数æ®ç´¢å¼•) +- ✅ `sync_reports_db.py` - 从 Markdown æå–元数æ®å¹¶åŒæ­¥åˆ°æ•°æ®åº“ +- ✅ 三张表结构: + - `weekly_reports` - å‘¨æŠ¥å…ƒæ•°æ® + - `weekly_report_daily` - æ¯æ—¥å·¥ä½œæ˜Žç»† + - `weekly_report_problems` - 问题记录 +- ✅ 统计查询功能(`--stats` 傿•°ï¼‰ +- ✅ å·²åŒæ­¥çŽ°æœ‰ 2 ä»½å‘¨æŠ¥æ•°æ® + +### 2. 文档完善 ✅ + +| 文档 | 用途 | 路径 | +|------|------|------| +| README.md | 归档说明 | `weekly-reports/README.md` | +| 使用指å—.md | 详细教程 | `weekly-reports/使用指å—.md` | +| 快速å‚考.md | 快速查阅 | `weekly-reports/快速å‚考.md` | +| æ··åˆæ–¹æ¡ˆæŒ‡å—.md | æ··åˆæ–¹æ¡ˆè¯´æ˜Ž | `weekly-reports/æ··åˆæ–¹æ¡ˆæŒ‡å—.md` | +| MEMORY.md | 长期记忆更新 | å·²æ·»åŠ æ··åˆæ–¹æ¡ˆè¯´æ˜Ž | +| TOOLS.md | 工具é…置记录 | 已添加数æ®åº“说明 | + +### 3. æµ‹è¯•éªŒè¯ âœ… + +- ✅ 归档功能测试(2026-W35 测试周报) +- ✅ 汇总工具测试(按月汇总) +- ✅ æ•°æ®åº“åŒæ­¥æµ‹è¯•(2 份历å²å‘¨æŠ¥ï¼‰ +- ✅ 统计查询测试(`--stats` 输出正常) + +--- + +## 📊 当å‰çŠ¶æ€ + +### 文件结构 +``` +weekly-reports/ +├── README.md ✅ 2.2KB +├── 使用指å—.md ✅ 4.7KB +├── 快速å‚考.md ✅ 1.8KB +├── æ··åˆæ–¹æ¡ˆæŒ‡å—.md ✅ 7.1KB +├── 归档总结.md ✅ 3.4KB +├── å®žæ–½å®Œæˆæ€»ç»“.md ✅ 本文件 +├── sync_reports_db.py ✅ 11.5KB(SQLite 版本) +├── summarize_reports.py ✅ 11KB +├── weekly_reports.db ✅ 20KBï¼ˆå·²åŒæ­¥ 2 份周报) +├── 2026/ +│ ├── 2026-W29.md ✅ å·²åŒæ­¥ +│ └── 2026-W31-周报.md ✅ å·²åŒæ­¥ +└── ... +``` + +### æ•°æ®åº“内容 +``` +📠周报总数:2 周 +📋 按项目统计: + G5: 1 周,问题 0 周,平å‡å­—æ•° 3115 + G6: 1 周,问题 1 周,平å‡å­—æ•° 450 +📅 最近周报: + âš ï¸ 2026-W31 (2026-07-27~2026-07-31) G6 + ✅ 2026-W29 (2026-07-13~2026-07-17) G5 +``` + +--- + +## 🚀 使用æµç¨‹ + +### æ¯å‘¨äº”生æˆå‘¨æŠ¥ + +**æŽ¨èæ–¹å¼ï¼šç›´æŽ¥å¯¹è¯** +``` +ä½ ï¼šç”Ÿæˆæœ¬å‘¨å‘¨æŠ¥ +我: + 1. 收集本周工作内容 + 2. ç”Ÿæˆæ ‡å‡†æ ¼å¼å‘¨æŠ¥ + 3. 自动归档到 Markdown 文件 + 4. åŒæ­¥å…ƒæ•°æ®åˆ°æ•°æ®åº“ + 5. 存入钉邮è‰ç¨¿ç®± + 6. 通知你去钉钉邮箱确认å‘é€ +``` + +**手动方å¼ï¼š** +```bash +cd /home/yangxuan/.openclaw/workspace-resume + +# 生æˆå‘¨æŠ¥ï¼ˆè‡ªåŠ¨å½’æ¡£ + åŒæ­¥æ•°æ®åº“) +python3 send_weekly_report.py \ + --project G5 \ + --plain "项目å称:...\n主è¦ä»»åŠ¡ï¼š...\n..." \ + --html "

...

" \ + --date-range "2026-08-25 ~ 2026-08-29" + +# æ‰‹åŠ¨åŒæ­¥æ•°æ®åº“(å¯é€‰ï¼‰ +python3 weekly-reports/sync_reports_db.py --all +``` + +### 月度/年度考核 + +**步骤 1:SQL 快速统计** +```bash +cd weekly-reports + +# 查看统计概览 +python3 sync_reports_db.py --stats + +# SQL æŸ¥è¯¢è¯¦ç»†æ•°æ® +sqlite3 weekly_reports.db \ + "SELECT project, COUNT(*), SUM(word_count) \ + FROM weekly_reports \ + WHERE start_date >= '2026-08-01' \ + GROUP BY project;" +``` + +**步骤 2:Markdown 汇总详情** +```bash +python3 summarize_reports.py --month 2026-08 +# ç”Ÿæˆ summary_20260831_174000.md +``` + +**步骤 3ï¼šç»„åˆæˆè€ƒæ ¸æŠ¥å‘Š** +- 使用 SQL 统计数æ®ï¼ˆå·¥ä½œé‡ã€å‘¨æ•°ç­‰ï¼‰ +- 使用 Markdown 汇总的工作内容详情 +- ç»„åˆæˆå®Œæ•´çš„æœˆåº¦/年度考核报告 + +--- + +## 💡 方案优势 + +### 对比纯 Markdown 方案 +| 特性 | 纯 Markdown | æ··åˆæ–¹æ¡ˆ | +|------|-----------|---------| +| 人类å¯è¯» | ✅ 优秀 | ✅ 优秀 | +| 编辑方便 | ✅ 直接编辑 | ✅ 直接编辑 | +| 快速查询 | ⌠需 grep | ✅ SQL 强大 | +| ç»Ÿè®¡åˆ†æž | ⌠需脚本 | ✅ åŽŸç”Ÿæ”¯æŒ | +| è·¨è¡¨å…³è” | âŒ ä¸æ”¯æŒ | ✅ æ”¯æŒ | + +### 对比纯数æ®åº“方案 +| 特性 | 纯数æ®åº“ | æ··åˆæ–¹æ¡ˆ | +|------|---------|---------| +| 人类å¯è¯» | ⌠需导出 | ✅ 直接阅读 | +| 编辑方便 | ⌠需 SQL | ✅ 文本编辑 | +| 版本控制 | ⌠二进制 | ✅ Git å‹å¥½ | +| 长期归档 | âš ï¸ ä¾èµ– DB | ✅ æ ¼å¼ç¨³å®š | +| 备份æ¢å¤ | ✅ 自动备份 | ✅ åŒé‡å¤‡ä»½ | + +### æ··åˆæ–¹æ¡ˆæ ¸å¿ƒä¼˜åŠ¿ +✅ **最佳平衡** - 兼顾人类å¯è¯»æ€§å’Œæœºå™¨å¯æŸ¥è¯¢æ€§ +✅ **åŒé‡ä¿éšœ** - Markdown(内容)+ SQLite(索引),互为备份 +✅ **çµæ´»æ‰©å±•** - å¯éšæ—¶è¿ç§»åˆ° MySQL(表结构相åŒï¼‰ +✅ **开箱å³ç”¨** - SQLite 无需æœåŠ¡å™¨ï¼Œé›¶é…ç½® + +--- + +## 📈 åŽç»­ä¼˜åŒ–建议 + +### 短期(å¯é€‰ï¼‰ +1. â¸ï¸ åŒæ­¥åކå²å‘¨æŠ¥æ•°æ®åˆ°æ•°æ®åº“ + ```bash + python3 sync_reports_db.py --all + # éœ€å…ˆæ•´ç† 2025 å¹´å’Œ 2026 å¹´åˆçš„æ—§æ ¼å¼å‘¨æŠ¥ + ``` + +2. â¸ï¸ 在 `send_weekly_report.py` 中集æˆè‡ªåŠ¨åŒæ­¥ + ```python + # 在归档åŽè‡ªåŠ¨è°ƒç”¨ sync_reports_db.py + ``` + +3. â¸ï¸ 创建 Web ç•Œé¢æŸ¥çœ‹ç»Ÿè®¡ + - 工作é‡è¶‹åŠ¿å›¾ + - 项目分布饼图 + - 问题统计柱状图 + +### 中期(当 MariaDB æ¢å¤åŽï¼‰ +1. â¸ï¸ è¿ç§»åˆ° MySQL(å¯é€‰ï¼‰ + - 创建表结构:`mysql -u root -p resume < db/weekly_reports_schema.sql` + - 使用 MySQL ç‰ˆæœ¬åŒæ­¥è„šæœ¬ + +2. â¸ï¸ 集æˆåˆ°å…¬å¸è€ƒæ ¸ç³»ç»Ÿ + - æä¾› API æŽ¥å£ + - 自动生æˆè€ƒæ ¸æŠ¥å‘Š + +### 长期(按需) +1. â¸ï¸ æ™ºèƒ½åˆ†æž + - 工作内容分类(使用 AI) + - 技能æˆé•¿è¿½è¸ª + - èŒä¸šå‘展建议 + +2. â¸ï¸ 团队å作 + - å¤šç”¨æˆ·æ”¯æŒ + - 团队周报汇总 + - 项目进度追踪 + +--- + +## 🔧 维护说明 + +### æ•°æ®åº“备份 +```bash +# 手动备份 +cp weekly-reports/weekly_reports.db \ + weekly-reports/weekly_reports_$(date +%Y%m%d).db + +# 或加入 git 版本控制 +git add weekly-reports/weekly_reports.db +git commit -m "备份周报数æ®åº“" +``` + +### æ•°æ®æ¢å¤ +```bash +# 从备份æ¢å¤ +sqlite3 weekly_reports.db < weekly_reports_backup.sql + +# æˆ–é‡æ–°åŒæ­¥æ‰€æœ‰ Markdown +python3 sync_reports_db.py --all +``` + +### æ•°æ®åº“è¿ç§» +```bash +# 导出为 SQL +sqlite3 weekly_reports.db .dump > backup.sql + +# è¿ç§»åˆ° MySQL +mysql -u root -p resume < backup.sql +``` + +--- + +## 📞 常用命令速查 + +```bash +# 生æˆå‘¨æŠ¥ +python3 send_weekly_report.py --project G5 --plain "..." --html "..." --date-range "..." + +# åŒæ­¥æ•°æ®åº“ +python3 sync_reports_db.py --all +python3 sync_reports_db.py --week 2026-W35 +python3 sync_reports_db.py --file 2026/2026-W35-周报.md + +# 查看统计 +python3 sync_reports_db.py --stats + +# Markdown 汇总 +python3 summarize_reports.py --month 2026-08 +python3 summarize_reports.py --year 2026 + +# SQL 查询 +sqlite3 weekly_reports.db "SELECT * FROM weekly_reports WHERE year = 2026;" +``` + +--- + +## ✅ éªŒæ”¶æ¸…å• + +- [x] Markdown 归档功能正常 +- [x] æ•°æ®åº“åŒæ­¥åŠŸèƒ½æ­£å¸¸ +- [x] 统计查询功能正常 +- [x] 汇总工具功能正常 +- [x] 文档完整(6 份文档) +- [x] MEMORY.md 已更新 +- [x] TOOLS.md 已更新 +- [x] åŽ†å²æ•°æ®å·²åŒæ­¥ï¼ˆ2 份) +- [x] 测试验è¯é€šè¿‡ + +--- + +## 🎉 总结 + +**æ··åˆæ–¹æ¡ˆå·²å®Œå…¨å®žæ–½å®Œæˆï¼** + +你现在拥有: +- ✅ 人类å¯è¯»çš„ Markdown 周报归档 +- ✅ æœºå™¨å¯æŸ¥è¯¢çš„ SQLite æ•°æ®åº“索引 +- ✅ 完善的汇总和统计工具 +- ✅ è¯¦ç»†çš„æ–‡æ¡£å’Œä½¿ç”¨æŒ‡å— +- ✅ åŒé‡ä¿éšœçš„æ•°æ®å®‰å…¨ + +**åŽç»­ä½¿ç”¨éžå¸¸ç®€å•:** +1. æ¯å‘¨äº”说"ç”Ÿæˆæœ¬å‘¨å‘¨æŠ¥" +2. 需è¦è€ƒæ ¸æ—¶è¯´"汇总 X 月份工作"或"查看统计" +3. 其余的交给我æ¥å¤„ç†ï¼ + +--- + +*å®žæ–½å®Œæˆæ—¶é—´ï¼š2026-08-27 10:15* +*æ•°æ®åº“ä½ç½®ï¼š`weekly-reports/weekly_reports.db`* +*文档ä½ç½®ï¼š`weekly-reports/æ··åˆæ–¹æ¡ˆæŒ‡å—.md`* diff --git a/workspace-resume/weekly-reports/归档总结.md b/workspace-resume/weekly-reports/归档总结.md new file mode 100644 index 0000000..f531cc4 --- /dev/null +++ b/workspace-resume/weekly-reports/归档总结.md @@ -0,0 +1,241 @@ +# 📊 周报归档系统总结 + +## ✅ 已完æˆï¼ˆ2026-08-27) + +### 1. 自动归档功能 +- ✅ `send_weekly_report.py` 脚本已å‡çº§ +- ✅ æ¯æ¬¡ç”Ÿæˆå‘¨æŠ¥æ—¶**自动ä¿å­˜**到 `weekly-reports/YYYY/YYYY-Www-周报.md` +- ✅ åŒæ—¶å­˜å…¥é’‰é‚®è‰ç¨¿ç®±ï¼ˆç”¨äºŽå‘é€ï¼‰ + +### 2. 汇总工具 +- ✅ `summarize_reports.py` æ”¯æŒæŒ‰å‘¨/月/å¹´/自定义范围汇总 +- ✅ 用于月度考核ã€å¹´åº¦è€ƒæ ¸æ—¶å¿«é€Ÿæå–工作内容 +- ✅ ç”Ÿæˆ Markdown æ ¼å¼æŠ¥å‘Šï¼ŒåŒ…å«é¡¹ç›®æ±‡æ€»ã€é—®é¢˜æ±‡æ€»ã€åŽŸå§‹è®°å½• + +### 3. 文档 +- ✅ `README.md` - 归档说明 +- ✅ `使用指å—.md` - 详细使用教程 +- ✅ `MEMORY.md` - 已更新归档规则 + +### 4. æµ‹è¯•éªŒè¯ +- ✅ 测试归档功能正常(2026-W35 周报) +- ✅ 测试汇总工具正常 + +--- + +## 📠文件结构 + +``` +weekly-reports/ +├── README.md # 归档说明 +├── 使用指å—.md # 使用教程 +├── 归档总结.md # 本文件 +├── send_weekly_report.py # 周报å‘é€è„šæœ¬ï¼ˆå«è‡ªåŠ¨å½’æ¡£ï¼‰ +├── summarize_reports.py # 汇总工具 +├── migrate_legacy_reports.py # åŽ†å²æ•°æ®è¿ç§»å·¥å…·ï¼ˆå¯é€‰ï¼‰ +├── 2025-*/ # 2025 年历å²å‘¨æŠ¥ï¼ˆæ—§æ ¼å¼ .txt) +├── 2026-*/ # 2026 年历å²å‘¨æŠ¥ï¼ˆæ—§æ ¼å¼ .txt) +└── 2026/ # 2026 å¹´æ–°æ ¼å¼å‘¨æŠ¥ï¼ˆ.md) + ├── 2026-W29.md + ├── 2026-W31-周报.md + └── 2026-W35-周报.md # 测试归档 +``` + +--- + +## 🚀 使用æµç¨‹ + +### æ¯å‘¨äº”生æˆå‘¨æŠ¥ + +**æ–¹å¼ä¸€ï¼šé€šè¿‡å¯¹è¯ï¼ˆæŽ¨è)** +``` +ç”¨æˆ·ï¼šç”Ÿæˆæœ¬å‘¨å‘¨æŠ¥ +助手:好的,请告诉我本周的工作内容,或者我从你的日记中æå–。 + ... + ✅ 周报已归档到 weekly-reports/2026/2026-W35-周报.md + ✅ 邮件已存入è‰ç¨¿ç®±ï¼Œè¯·åŽ»é’‰é’‰é‚®ç®±ç¡®è®¤å‘é€ +``` + +**æ–¹å¼äºŒï¼šæ‰‹åЍè¿è¡Œè„šæœ¬** +```bash +cd /home/yangxuan/.openclaw/workspace-resume +python3 send_weekly_report.py \ + --project G5 \ + --plain "项目å称:维云智造 G5\n主è¦ä»»åŠ¡ï¼š...\n..." \ + --html "

...

" \ + --date-range "2026-08-25 ~ 2026-08-29" +``` + +### 月度/年度考核 + +**月度汇总:** +```bash +cd weekly-reports +python3 summarize_reports.py --month 2026-08 +# ç”Ÿæˆ summary_20260831_174000.md +``` + +**年度汇总:** +```bash +python3 summarize_reports.py --year 2026 +# ç”Ÿæˆ summary_20261231_174000.md +``` + +**自定义范围:** +```bash +python3 summarize_reports.py --range 2026-07-01 2026-09-30 +# ç”Ÿæˆ Q3 季度总结 +``` + +--- + +## 📋 å½’æ¡£æ ¼å¼æ ‡å‡† + +### 文件命å +- æ ¼å¼ï¼š`YYYY-Www-周报.md` +- 示例:`2026-W35-周报.md` + +### 文件内容 +```markdown +# G5 å¼€å‘周报 (2026-W35) + +**日期范围:** 2026-08-25 ~ 2026-08-29 + +## åŸºæœ¬ä¿¡æ¯ +项目å称: 维云智造 G5 +主è¦ä»»åŠ¡ï¼š <本周主è¦ä»»åŠ¡> + +## 本周工作内容 + +周一(2026-08-25) + - 工作内容 1 + - 工作内容 2 + +周二(2026-08-26) + - ... + +... + +## 存在问题 +æ—  + +--- +*归档时间:2026-08-27 09:42* +*原始邮件主题:G5 å¼€å‘周报 (2026-08-25 ~ 2026-08-29)* +``` + +--- + +## 📊 汇总报告示例 + +```markdown +# 工作总结报告 + +**时间范围:** 2026-08-01 ~ 2026-08-31 +**ç”Ÿæˆæ—¶é—´ï¼š** 2026-08-27 09:42 +**包å«å‘¨æŠ¥æ•°ï¼š** 4 周 + +## 📊 项目汇总 + +### 维云智造 G5 +**å‚与周次:** 2026-W31, 2026-W32, 2026-W33, 2026-W34 +**主è¦ä»»åŠ¡ï¼š** +- 2026-W31: 库存预警模å—å¼€å‘ +- 2026-W32: 出入库æµç¨‹ä¼˜åŒ– +- 2026-W33: 生产领料功能测试 +- 2026-W34: 版本å‘å¸ƒæ”¯æŒ + +## âš ï¸ å­˜åœ¨é—®é¢˜æ±‡æ€» + +### 2026-W32 +- åŽ†å²æ•°æ®è¿ç§»å­˜åœ¨å…¼å®¹æ€§é—®é¢˜ + +### 2026-W34 +- 测试环境ä¸ç¨³å®š + +## 📋 原始周报记录 +... +``` + +--- + +## 🔄 åŽ†å²æ•°æ®å¤„ç† + +### 现状 +- 2025-08 ~ 2026-05ï¼šæ—§æ ¼å¼ `.txt` 文件,按月目录存放 +- 2026-07 èµ·ï¼šæ–°æ ¼å¼ `.md` 文件,按周归档 + +### å¯é€‰è¿ç§» +如需统一格å¼ï¼Œå¯è¿è¡Œï¼š +```bash +cd weekly-reports +python3 migrate_legacy_reports.py --migrate +``` + +但**éžå¿…需**,因为: +1. 旧文件已是有效归档 +2. 汇总工具å¯è¯»å–æ–°æ ¼å¼æ–‡ä»¶ +3. æ—§æ–‡ä»¶å¯æŒ‰éœ€æ‰‹åŠ¨æ•´ç† + +--- + +## 💡 最佳实践 + +### 1. æ¯å‘¨å›ºå®šæµç¨‹ +``` +周五 17:00 → 生æˆå‘¨æŠ¥ → 自动归档 → 存入è‰ç¨¿ç®± → 确认å‘é€ +``` + +### 2. 月度考核准备 +``` +æ¯æœˆæœ€åŽä¸€å¤© → è¿è¡Œæ±‡æ€»å·¥å…· → ç”Ÿæˆæœˆåº¦æŠ¥å‘Š â†’ 用于考核 +``` + +### 3. 年度考核准备 +``` +æ¯å¹´å¹´åº• → è¿è¡Œå¹´åº¦æ±‡æ€» → 生æˆå¹´åº¦æŠ¥å‘Š â†’ 用于考核 +``` + +### 4. 快速检索 +```bash +# 查找æŸé¡¹ç›®çš„æ‰€æœ‰å‘¨æŠ¥ +grep -r "G5" weekly-reports/ --include="*.md" -l + +# 查找包å«å…³é”®è¯çš„周报 +grep -r "库存预警" weekly-reports/ --include="*.md" -A 5 +``` + +--- + +## ⓠ常è§é—®é¢˜ + +**Q: 归档文件在哪里?** +A: `weekly-reports/YYYY/YYYY-Www-周报.md` + +**Q: 如何查看æŸä¸ªæœˆçš„æ‰€æœ‰å·¥ä½œï¼Ÿ** +A: `python3 summarize_reports.py --month 2026-07` + +**Q: 历å²å‘¨æŠ¥ï¼ˆ2025 年)有归档å—?** +A: 有,在 `weekly-reports/2025-XX/` 儿œˆç›®å½•中(.txt æ ¼å¼ï¼‰ + +**Q: å¯ä»¥æ‰‹åŠ¨ä¿®æ”¹å½’æ¡£æ–‡ä»¶å—?** +A: å¯ä»¥ï¼Œå½’档文件是普通 Markdown 文件,å¯éšæ—¶ç¼–è¾‘ + +**Q: 如果忘记归档怎么办?** +A: æ‰‹åŠ¨åˆ›å»ºæ–‡ä»¶åˆ°å¯¹åº”ç›®å½•ï¼Œå‘½åæ ¼å¼ï¼š`YYYY-Www-周报.md` + +--- + +## 📞 需è¦å¸®åŠ©ï¼Ÿ + +直接告诉我: +- "å¸®æˆ‘ç”Ÿæˆæœ¬å‘¨å‘¨æŠ¥" +- "汇总 7 月份的工作" +- "查找关于库存的周报" +- "生æˆå¹´ç»ˆæ€»ç»“" + +我会帮你处ç†ï¼ + +--- + +*æœ€åŽæ›´æ–°ï¼š2026-08-27* diff --git a/workspace-resume/weekly-reports/快速å‚考.md b/workspace-resume/weekly-reports/快速å‚考.md new file mode 100644 index 0000000..8f1784c --- /dev/null +++ b/workspace-resume/weekly-reports/快速å‚考.md @@ -0,0 +1,89 @@ +# 📌 周报归档快速å‚考 + +## 🎯 核心功能 + +✅ **自动归档** - æ¯æ¬¡ç”Ÿæˆå‘¨æŠ¥æ—¶è‡ªåЍä¿å­˜åˆ° `weekly-reports/YYYY/YYYY-Www-周报.md` +✅ **汇总工具** - 按周/月/年汇总,用于月度/年度考核 +✅ **åŒé‡ä¿éšœ** - 邮件è‰ç¨¿ï¼ˆå‘é€ï¼‰+ 本地归档(检索) + +--- + +## 🚀 快速使用 + +### 生æˆå‘¨æŠ¥ï¼ˆæ¯å‘¨äº”) + +**æŽ¨èæ–¹å¼ï¼šç›´æŽ¥å¯¹è¯** +``` +ä½ ï¼šç”Ÿæˆæœ¬å‘¨å‘¨æŠ¥ +我:自动完æˆå½’æ¡£ + 存入è‰ç¨¿ç®± +``` + +**手动方å¼ï¼š** +```bash +python3 send_weekly_report.py \ + --project G5 \ + --plain "项目å称:...\n主è¦ä»»åŠ¡ï¼š...\n..." \ + --html "

...

" \ + --date-range "2026-08-25 ~ 2026-08-29" +``` + +### 汇总报告(考核用) + +```bash +cd weekly-reports + +# 月度汇总 +python3 summarize_reports.py --month 2026-08 + +# 年度汇总 +python3 summarize_reports.py --year 2026 + +# 自定义范围 +python3 summarize_reports.py --range 2026-07-01 2026-09-30 +``` + +--- + +## 📠文件ä½ç½® + +``` +weekly-reports/ +├── README.md # 详细说明 +├── 使用指å—.md # 完整教程 +├── 归档总结.md # 系统总结 +├── summarize_reports.py # 汇总工具 +├── 2026/ # 2026 年周报 +│ ├── 2026-W29.md +│ ├── 2026-W31-周报.md +│ └── ... +└── 2025-XX/ # 2025 年历å²å‘¨æŠ¥ +``` + +--- + +## 🔠快速检索 + +```bash +# 查看æŸå¹´æ‰€æœ‰å‘¨æŠ¥ +ls weekly-reports/2026/ + +# æœç´¢å…³é”®è¯ +grep -r "库存预警" weekly-reports/ --include="*.md" + +# 查看特定周报 +cat weekly-reports/2026/2026-W31-周报.md +``` + +--- + +## 📞 需è¦å¸®åŠ©ï¼Ÿ + +直接说: +- "ç”Ÿæˆæœ¬å‘¨å‘¨æŠ¥" +- "汇总 7 月工作" +- "查找库存相关周报" +- "生æˆå¹´ç»ˆæ€»ç»“" + +--- + +*è¯¦ç»†æ–‡æ¡£è§ `README.md` å’Œ `使用指å—.md`* diff --git a/workspace-resume/weekly-reports/æ··åˆæ–¹æ¡ˆæŒ‡å—.md b/workspace-resume/weekly-reports/æ··åˆæ–¹æ¡ˆæŒ‡å—.md new file mode 100644 index 0000000..d6db1c0 --- /dev/null +++ b/workspace-resume/weekly-reports/æ··åˆæ–¹æ¡ˆæŒ‡å—.md @@ -0,0 +1,404 @@ +# 📊 周报混åˆå½’æ¡£æ–¹æ¡ˆä½¿ç”¨æŒ‡å— + +## 🎯 方案概述 + +**æ··åˆæ–¹æ¡ˆ = Markdown 文件(完整内容)+ SQLite æ•°æ®åº“(元数æ®ç´¢å¼•)** + +``` +æ¯å‘¨å‘¨æŠ¥ç”Ÿæˆ + │ + ├─→ Markdown 文件归档(weekly-reports/YYYY/) + │ └─→ 人类å¯è¯»ã€æ˜“编辑ã€Git å‹å¥½ã€é•¿æœŸä¿å­˜ + │ + └─→ SQLite æ•°æ®åº“(weekly_reports.db) + └─→ 快速查询ã€ç»Ÿè®¡åˆ†æžã€æœˆåº¦/年度考核 +``` + +--- + +## 📠文件结构 + +``` +weekly-reports/ +├── README.md # 归档说明 +├── 使用指å—.md # 详细教程 +├── 快速å‚考.md # 快速查阅 +├── æ··åˆæ–¹æ¡ˆæŒ‡å—.md # 本文件 +├── sync_reports_db.py # æ•°æ®åº“åŒæ­¥è„šæœ¬ +├── summarize_reports.py # Markdown 汇总工具 +├── weekly_reports.db # SQLite æ•°æ®åº“(自动生æˆï¼‰ +├── 2026/ +│ ├── 2026-W29.md # Markdown 周报 +│ ├── 2026-W31-周报.md +│ └── ... +└── ... +``` + +--- + +## 🚀 快速开始 + +### 1. 生æˆå‘¨æŠ¥ï¼ˆæ¯å‘¨äº”) + +**æ–¹å¼ä¸€ï¼šé€šè¿‡å¯¹è¯ï¼ˆæŽ¨è)** +``` +ä½ ï¼šç”Ÿæˆæœ¬å‘¨å‘¨æŠ¥ +æˆ‘ï¼šè‡ªåŠ¨å®Œæˆ Markdown å½’æ¡£ + æ•°æ®åº“åŒæ­¥ +``` + +**æ–¹å¼äºŒï¼šæ‰‹åЍè¿è¡Œè„šæœ¬** +```bash +cd /home/yangxuan/.openclaw/workspace-resume + +python3 send_weekly_report.py \ + --project G5 \ + --plain "项目å称:...\n主è¦ä»»åŠ¡ï¼š...\n..." \ + --html "

...

" \ + --date-range "2026-08-25 ~ 2026-08-29" +``` + +### 2. åŒæ­¥åˆ°æ•°æ®åº“ + +```bash +cd weekly-reports + +# åŒæ­¥æ‰€æœ‰å‘¨æŠ¥ +python3 sync_reports_db.py --all + +# åŒæ­¥å•个文件 +python3 sync_reports_db.py --file 2026/2026-W35-周报.md + +# åŒæ­¥æŒ‡å®šå‘¨ +python3 sync_reports_db.py --week 2026-W35 +``` + +### 3. æŸ¥çœ‹ç»Ÿè®¡ä¿¡æ¯ + +```bash +python3 sync_reports_db.py --stats +``` + +输出示例: +``` +📊 å‘¨æŠ¥ç»Ÿè®¡ä¿¡æ¯ + +============================================================ +📠周报总数:52 周 + +📋 按项目统计: + G5: 45 周,问题 8 周,平å‡å­—æ•° 2800 + G6: 7 周,问题 1 周,平å‡å­—æ•° 3200 + +📅 最近 5 周: + ✅ 2026-W34 (2026-08-18~2026-08-22) G5 - 库存预警模å—优化 + âš ï¸ 2026-W33 (2026-08-11~2026-08-15) G5 - 生产领料功能测试 + ... + +âš ï¸ å­˜åœ¨é—®é¢˜å‘¨æŠ¥ï¼š9 周 +============================================================ +``` + +--- + +## 📋 æ•°æ®åº“查询示例 + +### 直接查询 SQLite + +```bash +cd weekly-reports + +# 进入 SQLite 命令行 +sqlite3 weekly_reports.db +``` + +### 常用 SQL 查询 + +```sql +-- 1. 查询æŸå¹´æ‰€æœ‰å‘¨æŠ¥ +SELECT * FROM weekly_reports +WHERE year = 2026 +ORDER BY week_number; + +-- 2. æŸ¥è¯¢æŸæœˆæ‰€æœ‰å‘¨æŠ¥ +SELECT * FROM weekly_reports +WHERE start_date >= '2026-08-01' + AND start_date <= '2026-08-31' +ORDER BY start_date; + +-- 3. 统计æŸé¡¹ç›®å…¨å¹´å·¥ä½œé‡ +SELECT + project, + COUNT(*) as weeks_count, + SUM(word_count) as total_words, + AVG(word_count) as avg_words +FROM weekly_reports +WHERE year = 2026 +GROUP BY project; + +-- 4. 查询存在问题的周报 +SELECT year, week_number, start_date, end_date, main_task +FROM weekly_reports +WHERE has_problems = 1 +ORDER BY start_date DESC; + +-- 5. 查询æŸå‘¨æ¯æ—¥å·¥ä½œæ˜Žç»† +SELECT d.work_date, d.day_of_week, d.work_items +FROM weekly_report_daily d +JOIN weekly_reports r ON d.report_id = r.id +WHERE r.year = 2026 AND r.week_number = 35 +ORDER BY d.work_date; + +-- 6. 月度统计(用于考核) +SELECT + strftime('%Y-%m', start_date) as month, + project, + COUNT(*) as weeks_count, + SUM(has_problems) as problem_weeks, + AVG(word_count) as avg_words +FROM weekly_reports +WHERE start_date >= '2026-08-01' + AND start_date <= '2026-08-31' +GROUP BY strftime('%Y-%m', start_date), project; + +-- 7. 查询问题记录 +SELECT p.problem_description, r.start_date, r.project +FROM weekly_report_problems p +JOIN weekly_reports r ON p.report_id = r.id +ORDER BY r.start_date DESC +LIMIT 10; +``` + +### 命令行一键查询 + +```bash +# 查询 8 月份所有周报 +sqlite3 weekly_reports.db \ + "SELECT year, week_number, start_date, project, main_task \ + FROM weekly_reports \ + WHERE start_date >= '2026-08-01' AND start_date <= '2026-08-31';" + +# ç»Ÿè®¡å…¨å¹´å·¥ä½œé‡ +sqlite3 weekly_reports.db \ + "SELECT project, COUNT(*), SUM(word_count) \ + FROM weekly_reports \ + WHERE year = 2026 \ + GROUP BY project;" +``` + +--- + +## ðŸ” ä¸¤ç§æŸ¥è¯¢æ–¹å¼å¯¹æ¯” + +| 场景 | æŽ¨èæ–¹å¼ | 原因 | +|------|---------|------| +| **查看完整周报** | Markdown 文件 | 人类å¯è¯»ï¼Œæ ¼å¼å®Œæ•´ | +| **快速统计** | SQLite 查询 | SQL 强大,秒出结果 | +| **生æˆè€ƒæ ¸æŠ¥å‘Š** | ä¸¤è€…ç»“åˆ | Markdown æå–内容 + SQL ç»Ÿè®¡æ•°æ® | +| **æœç´¢å…³é”®è¯** | grep/Markdown | 简å•直接 | +| **跨年度分æž** | SQLite 查询 | èšåˆåˆ†æžæ–¹ä¾¿ | +| **编辑修改** | Markdown 文件 | 直接编辑文本 | + +--- + +## 📊 月度/年度考核æµç¨‹ + +### 月度考核(以 8 月为例) + +**步骤 1:SQL 统计概览** +```bash +cd weekly-reports + +sqlite3 weekly_reports.db <= '2026-08-01' + AND start_date <= '2026-08-31' +GROUP BY project; +EOF +``` + +**步骤 2:Markdown 汇总详细内容** +```bash +python3 summarize_reports.py --month 2026-08 +# ç”Ÿæˆ summary_20260831_174000.md +``` + +**步骤 3:整ç†è€ƒæ ¸æŠ¥å‘Š** +- 使用 SQL 统计数æ®ï¼ˆå·¥ä½œé‡ã€å‘¨æ•°ç­‰ï¼‰ +- 使用 Markdown 汇总的工作内容详情 +- ç»„åˆæˆå®Œæ•´çš„æœˆåº¦è€ƒæ ¸æŠ¥å‘Š + +### 年度考核 + +```bash +# SQL 统计全年概览 +sqlite3 weekly_reports.db < weekly_reports_backup.sql + +# åªå¯¼å‡ºå…ƒæ•°æ®è¡¨ +sqlite3 weekly_reports.db \ + ".dump weekly_reports" > weekly_reports_meta.sql +``` + +### æ¢å¤æ•°æ®åº“ + +```bash +# 从备份æ¢å¤ +sqlite3 weekly_reports.db < weekly_reports_backup.sql + +# æˆ–é‡æ–°åŒæ­¥æ‰€æœ‰ Markdown 文件 +python3 sync_reports_db.py --all +``` + +--- + +## 📈 高级用法 + +### 1. è‡ªåŠ¨åŒæ­¥ï¼ˆé›†æˆåˆ°å‘¨æŠ¥è„šæœ¬ï¼‰ + +修改 `send_weekly_report.py`,在归档åŽè‡ªåŠ¨è°ƒç”¨åŒæ­¥è„šæœ¬ï¼š + +```python +# 在 archive_report() 函数末尾添加 +import subprocess +subprocess.run(['python3', 'weekly-reports/sync_reports_db.py', + '--file', str(filepath)], + cwd='/home/yangxuan/.openclaw/workspace-resume') +``` + +### 2. 生æˆå¯è§†åŒ–报表 + +使用 Python + matplotlib 生æˆå·¥ä½œé‡è¶‹åŠ¿å›¾ï¼š + +```python +import sqlite3 +import matplotlib.pyplot as plt + +conn = sqlite3.connect('weekly_reports.db') +cursor = conn.cursor() + +cursor.execute(''' +SELECT start_date, word_count +FROM weekly_reports +WHERE year = 2026 +ORDER BY start_date +''') + +dates, counts = zip(*cursor.fetchall()) + +plt.figure(figsize=(12, 6)) +plt.plot(dates, counts, marker='o') +plt.title('2026 年周报字数趋势') +plt.xlabel('日期') +plt.ylabel('å­—æ•°') +plt.xticks(rotation=45) +plt.tight_layout() +plt.savefig('workload_trend.png') +``` + +### 3. 导出为 Excel + +```python +import sqlite3 +import pandas as pd + +conn = sqlite3.connect('weekly_reports.db') + +# å¯¼å‡ºå‘¨æŠ¥å…ƒæ•°æ® +df = pd.read_sql_query(''' +SELECT year, week_number, start_date, end_date, + project, main_task, has_problems, word_count +FROM weekly_reports +WHERE year = 2026 +ORDER BY week_number +''', conn) + +df.to_excel('2026 年周报汇总.xlsx', index=False) +``` + +--- + +## ⓠ常è§é—®é¢˜ + +### Q: 为什么用 SQLite è€Œä¸æ˜¯ MySQL? +A: +- ✅ SQLite 无需æœåŠ¡å™¨ï¼Œå¼€ç®±å³ç”¨ +- ✅ 文件å°ï¼ˆ< 100KB),易于备份 +- ✅ 足够支æŒä¸ªäººå‘¨æŠ¥æŸ¥è¯¢éœ€æ±‚ +- ✅ 未æ¥å¯è½»æ¾è¿ç§»åˆ° MySQL(表结构相åŒï¼‰ + +### Q: æ•°æ®åº“å’Œ Markdown 内容ä¸ä¸€è‡´æ€Žä¹ˆåŠžï¼Ÿ +A: 釿–°åŒæ­¥å³å¯ï¼š +```bash +python3 sync_reports_db.py --all +``` + +### Q: å¯ä»¥åˆ é™¤æ•°æ®åº“å—? +A: å¯ä»¥ã€‚æ•°æ®åº“åªæ˜¯ç´¢å¼•,删除åŽå¯ä»Ž Markdown æ–‡ä»¶é‡æ–°ç”Ÿæˆï¼š +```bash +rm weekly_reports.db +python3 sync_reports_db.py --all +``` + +### Q: 如何è¿ç§»åˆ° MySQL? +A: 当 MariaDB æœåŠ¡æ¢å¤åŽï¼š +1. 创建表结构:`mysql -u root -p resume < db/weekly_reports_schema.sql` +2. 使用 MySQL ç‰ˆæœ¬çš„åŒæ­¥è„šæœ¬ï¼š`sync_reports_to_db.py` + +--- + +## 📞 需è¦å¸®åŠ©ï¼Ÿ + +直接告诉我: +- "ç”Ÿæˆæœ¬å‘¨å‘¨æŠ¥" +- "查看 8 月份统计" +- "汇总第三季度工作" +- "生æˆå¹´ç»ˆè€ƒæ ¸æŠ¥å‘Š" + +我会帮你处ç†ï¼ + +--- + +*æœ€åŽæ›´æ–°ï¼š2026-08-27* +*æ•°æ®åº“ä½ç½®ï¼š`weekly-reports/weekly_reports.db`*