From 283a035ab17590f70cebef7512f2de2293c25c80 Mon Sep 17 00:00:00 2001 From: "qichi.liang" Date: Mon, 29 Dec 2025 01:03:54 +0800 Subject: [PATCH] Add README and monthly unaccounted data feature --- AGENTS.md | 13 +- README.md | 127 +++++ layout_output.txt | 958 ++++++++++++++++++++++++++++++++ fetch_and_process.py => main.py | 0 src/database.py | 84 ++- src/parser.py | 16 +- src/report.py | 182 ++++++ 7 files changed, 1363 insertions(+), 17 deletions(-) create mode 100644 README.md create mode 100644 layout_output.txt rename fetch_and_process.py => main.py (100%) create mode 100644 src/report.py diff --git a/AGENTS.md b/AGENTS.md index af6bcdd..eefd151 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -46,6 +46,10 @@ OrbitIn/ - `query_all(limit)` - 查询所有 - `get_stats()` - 获取统计信息 +### [`DailyReportGenerator`](src/report.py:15) +- `generate_report(date)` - 生成日报 +- `print_report(date)` - 打印日报 + ## 文本格式约定 - 列表前缀:`•` 用于 `ul`,数字+点用于 `ol` @@ -56,11 +60,14 @@ OrbitIn/ ## 命令 ```bash -# 带数据库存储运行(默认) -python3 fetch_and_process.py +# 获取并处理数据(带数据库存储) +python3 main.py # 不存储到数据库 -python3 fetch_and_process.py --no-db +python3 main.py --no-db + +# 生成日报 +python3 -c "from src.report import DailyReportGenerator; g = DailyReportGenerator(); g.print_report('2025-12-28'); g.close()" # 测试解析模块 python3 -c "from src.parser import HandoverLogParser; p = HandoverLogParser(); print(p.parse(open('layout_output.txt').read())[:3])" diff --git a/README.md b/README.md new file mode 100644 index 0000000..dc2c522 --- /dev/null +++ b/README.md @@ -0,0 +1,127 @@ +# OrbitIn - 码头作业日志管理系统 + +从 Confluence API 获取交接班日志,提取作业数据并生成统计报表。 + +## 功能特性 + +- 📥 从 Confluence 获取交接班日志 HTML +- 📄 提取保留布局的文本内容 +- 🗄️ SQLite3 数据库存储 +- 📊 生成日报和月度统计 +- 📈 支持未统计数据手动录入 + +## 项目结构 + +``` +OrbitIn/ +├── main.py # CLI 入口 +├── README.md # 项目说明 +├── AGENTS.md # AI助手开发文档 +├── layout_output.txt # 缓存的布局文本 +├── data/ # 数据目录 +│ └── daily_logs.db # SQLite3 数据库 +└── src/ # 代码模块 + ├── __init__.py + ├── confluence.py # Confluence API 客户端 + ├── extractor.py # HTML 文本提取器 + ├── parser.py # 日志解析器 + ├── database.py # 数据库操作 + └── report.py # 报表生成器 +``` + +## 快速开始 + +### 安装依赖 + +```bash +pip install requests beautifulsoup4 +``` + +### 配置 Confluence + +在 `main.py` 中配置: + +```python +CONFLUENCE_URL = "https://your-confluence.atlassian.net" +CONFLUENCE_USER = "your-email@example.com" +CONFLUENCE_API_TOKEN = "your-api-token" +``` + +### 使用方法 + +```bash +# 获取并处理数据(带数据库存储) +python3 main.py + +# 不存储到数据库 +python3 main.py --no-db + +# 生成日报(指定日期) +python3 -c "from src.report import DailyReportGenerator; g = DailyReportGenerator(); g.print_report('2025-12-28'); g.close()" + +# 测试解析模块 +python3 -c "from src.parser import HandoverLogParser; p = HandoverLogParser(); print(p.parse(open('layout_output.txt').read())[:3])" +``` + +## 数据格式 + +### 日报表 (daily_handover_logs) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | INTEGER | 主键 | +| date | TEXT | 日期 YYYY-MM-DD | +| shift | TEXT | 班次 (白班/夜班) | +| ship_name | TEXT | 船名 | +| teu | INTEGER | 作业量 TEU | +| efficiency | REAL | 效率 | +| vehicles | INTEGER | 上场车辆数 | +| created_at | TEXT | 创建时间 | + +### 未统计表 (monthly_unaccounted) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | INTEGER | 主键 | +| year_month | TEXT | 年月 YYYY-MM | +| teu | INTEGER | 未统计的 TEU | +| note | TEXT | 备注 | +| created_at | TEXT | 创建时间 | + +## 文本格式约定 + +- 列表前缀:`•` 用于 `ul`,数字+点用于 `ol` +- 粗体使用 `**text**`,斜体使用 `*text*` +- 水平线使用 `─` (U+2500) 字符 +- 链接渲染为 `text (url)` + +## 示例输出 + +``` +日期:12/28 + +船名:246#学友洋山 +作业量:246TEU + +当日实际作业量:246TEU + +当月计划作业量:8400TEU (用天数*300TEU) +当月未统计数据:118TEU +当月实际作业量:12750TEU +当月完成比例:151.79% + +12/29 白班人员: +12/29 夜班人员: +24小时值班手机:13107662315 +``` + +## 技术栈 + +- Python 3.7+ +- SQLite3 +- Requests (HTTP 客户端) +- HTMLParser (标准库) + +## License + +MIT diff --git a/layout_output.txt b/layout_output.txt new file mode 100644 index 0000000..a605c92 --- /dev/null +++ b/layout_output.txt @@ -0,0 +1,958 @@ +### 每个班次到场相关事项: +1. 当面交接,确认交接日志完成并更新 +车辆状态: +车号 状态 车号 状态 +001 右前激光故障 005 可作业 +002 可作业 006 可作业 +003 可作业 007 可作业 + +1. 24小时内新bug确认: +——————————————————————————————————————————————— +日期:2025.12.28 +班次及人员: +白班:杨俊豪 汪钦良 武大学 +实船作业:246#  学友洋山 +上场车辆数:5 +作业量/效率:246TEU,3.12循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +夜班:梁启迟 刘炜彬 +实船作业:246#  学友洋山 +上场车辆数:5 +作业量/效率:TEU,循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +——————————————————————————————————————————————— +日期:2025.12.27 +班次及人员: +白班:杨俊豪 汪钦良 +实船作业:244#  德盛6 +上场车辆数:6 +作业量/效率:114TEU  ,2.09循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:245#  学友洋山 +上场车辆数:6 +作业量/效率:64TEU  ,4.39循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +班次及人员: +夜班:刘炜彬  梁启迟 +实船作业:245#  学友洋山 +上场车辆数:6 +作业量/效率:273TEU  ,4.55循环/车/小时 +故障次数/故障率:4次,3% +人工介入次数/介入率:4次,3% +实船作业:246#  学友洋山(二次靠泊) +上场车辆数:6 +作业量/效率:14TEU,5.38循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +注意事项: + 002报“**前部驱动器硬件故障报警**”需要检查下 +——————————————————————————————————————————————— +日期:2025.12.26 +班次及人员: +白班:杨俊豪 江唯 汪钦良 武大学 +实船作业:241#  美成811 +上场车辆数:6 +作业量/效率:66TEU  ,3.24循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:242#  嘉洋16 +上场车辆数:6 +作业量/效率:116TEU  ,2.55循环/车/小时 +故障次数/故障率:3次,5% +人工介入次数/介入率:1次,1% +实船作业:243#  华鑫858 +上场车辆数:6 +作业量/效率:32TEU  ,1.9循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +夜班: 刘炜彬   梁启迟 +实船作业:243#  华鑫858 +上场车辆数:6 +作业量/效率:162TEU  ,2.08循环/车/小时 +故障次数/故障率:1次,1% +人工介入次数/介入率:1次,1% +实船作业:244#  德盛6 +上场车辆数:5 +作业量/效率:38TEU  ,1.78循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +——————————————————————————————————————————————— +日期:2025.12.25 +班次及人员: +白班: 江唯 汪钦良 武大学 张勤 +实船作业:239#  华鑫858 +上场车辆数:6 +作业量/效率:203TEU  ,2.65循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +注意事项: +1、空闲时间更新江唯小群里发的王涛的聊天记录(12-24 20:21:31发的)(6车已完成) +实船作业:240#  嘉洋17 +上场车辆数:5 +作业量/效率:10TEU  ,3.15循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +夜班: 刘炜彬   梁启迟 +实船作业:239#  华鑫858 +上场车辆数:6 +作业量/效率:55TEU  ,2.57循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:241#  美成811 +上场车辆数:6 +作业量/效率:282TEU  ,3.43循环/车/小时 +故障次数/故障率:4次,3% +人工介入次数/介入率:2次,1% +注意事项: + 空闲时间更新江唯小群里发的王涛的聊天记录(12-24 20:21:31发的)(001、002、003、005、007车已完成)询问下@盛永霞AdaOps3.28的版本更新情况,是否能够更新到现场。 +——————————————————————————————————————————————— +日期:2025.12.24 +班次及人员: +白班: 江唯 汪钦良 武大学  张勤 +实船作业:237#  卓美23 +上场车辆数:6 +作业量/效率:266TEU  ,3.01循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +注意事项: +1、6泊闸机路已经修好 +2、空闲时间更新江唯小群里发的王涛的聊天记录(12-24 20:21:31发的) +夜班:梁启迟 杨俊豪 +实船作业:238#  华信长和 +上场车辆数:6 +作业量/效率:236TEU  ,3.02循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +余留任务: + 空闲时间更新江唯小群里发的王涛的聊天记录(12-24 20:21:31发的) +注意事项: +1. 白天生产会说明一下C区拖车经常不按规定走与IGV在作业道对向行驶,导致双方无法作业 +——————————————————————————————————————————————— +日期:2025.12.23 +班次及人员: +白班: 刘炜彬 汪钦良 武大学  张勤 +实船作业:237#  卓美23 +上场车辆数:6 +作业量/效率:281TEU  ,3.81循环/车/小时 +故障次数/故障率:3次,2% +人工介入次数/介入率:3次,2% +班次及人员: +夜班: 杨俊豪 梁启池 +实船作业:237#  卓美23 +上场车辆数:6 +作业量/效率:333TEU  ,3.31循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +注意事项: +1. 6泊闸机口前修复,前沿路测进入6泊的路走不了,明天作业的时候需要手拉通过或平行模式通过,持续1天。 +2. 007前脸已恢复 +——————————————————————————————————————————————— +日期:2025.12.22 +班次及人员: +白班: 刘炜彬 汪钦良 武大学 +实船作业:234#  华鑫858 +上场车辆数:6 +作业量/效率:58TEU  ,1.81循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:235#  美成811 +上场车辆数:6 +作业量/效率:64TEU  ,1.76循环/车/小时 +故障次数/故障率:1次,3% +人工介入次数/介入率:0次,0% +现场任务: + 集成软件更新,版本号:qomolo-compose-tidb=0.1.24-881309 + 001-007单车qos-group版本更新至0.1.67 +注意事项: +1. 001的95-0故障码为正常提示,下个版本修复故障类型 +2. 底盘故障为目前故障类型会显示为fatal +日期:2025.12.21 +班次及人员: +夜班: 江唯 杨俊豪 +实船作业:236#  鑫源永顺 +上场车辆数:6 +作业量/效率:104TEU  ,2.23循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:237#  卓美23 +上场车辆数:6 +作业量/效率:126TEU  ,3.68循环/车/小时 +故障次数/故障率:1次,1.5% +人工介入次数/介入率:1次,1.5% +——————————————————————————————————————————————— +日期:2025.12.21 +班次及人员: +白班: 刘炜彬 汪钦良 武大学 +实船作业:232#  华信长和 +上场车辆数:6 +作业量/效率:100TEU  ,2.51循环/车/小时 +故障次数/故障率:1次,2% +人工介入次数/介入率:1次,2% +实船作业:233#  恒盛65 +上场车辆数:6 +作业量/效率:51TEU  ,3.48循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +注意事项: +1. 所有车pcd地图版本都更新2.2.11完成 +日期:2025.12.21 +班次及人员: +夜班: 江唯 杨俊豪 +实船作业:233#  恒盛65 +上场车辆数:6 +作业量/效率:88TEU  ,2.23循环/车/小时 +故障次数/故障率:1次,2.2% +人工介入次数/介入率:0次,0% +实船作业:234#  华鑫858 +上场车辆数:6 +作业量/效率:147TEU  ,2.23循环/车/小时 +故障次数/故障率:2次,2.7% +人工介入次数/介入率:0次,0% +——————————————————————————————————————————————— +日期:2025.12.20 +班次及人员: +白班: 刘炜彬 汪钦良 武大学 +实船作业:230#  卓美23 +上场车辆数:6 +作业量/效率:182TEU  ,3.56循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:231#  华鑫858 +上场车辆数:6 +作业量/效率:124TEU  ,3.69循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +注意事项: +1. 002,007地图PCD更新至2.2.11 +日期:2025.12.20 +班次及人员: +夜班: 江唯 杨俊豪 +实船作业:231#  华鑫858 +上场车辆数:6 +作业量/效率:188TEU  ,3.15循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:232#  华信长和 +上场车辆数:6 +作业量/效率:48TEU  ,2.19循环/车/小时 +故障次数/故障率:2次,8.3% +人工介入次数/介入率:2次,8.3% +注意事项: +1. 002,007地图PCD更新至2.2.11 +——————————————————————————————————————————————— +日期:2025.12.19 +班次及人员: +白班: 梁启迟 汪钦良 张勤 武大学 +实船作业:228#  华信长和 +上场车辆数:6 +作业量/效率:220TEU  ,3.12循环/车/小时 +故障次数/故障率:1次,1% +人工介入次数/介入率:0次,0% +重点问题: +1. FZ-1715 (https://jira.westwell-lab.com/browse/FZ-1715) : + 002车在E01定位跳变,无法合控制 +实船作业:229#  合海安邦 +上场车辆数:5 +作业量/效率:14TEU  ,1.57循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:230#  卓美23 +上场车辆数:6 +作业量/效率:16TEU  ,1.47循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +注意事项: +1. FZ-1697 (https://jira.westwell-lab.com/browse/FZ-1697) :18号更换正后16线激光时已重标,观察后续是否仍存在无法超车情况 +2. FZ-1715 (https://jira.westwell-lab.com/browse/FZ-1715) :数据需上传 +班次及人员: +夜班: 江唯 杨俊豪 +实船作业:230#  卓美23 +上场车辆数:6 +作业量/效率:281TEU  ,2.79循环/车/小时 +故障次数/故障率:1次,0.6% +人工介入次数/介入率:0.6次,0.6% +——————————————————————————————————————————————— +日期:2025.12.18 +班次及人员: +白班: 梁启迟 汪钦良 张勤 武大学 +实船作业:226#  恒盛65 +上场车辆数:6 +作业量/效率:21TEU  ,1.61循环/车/小时 +故障次数/故障率:1次,1% +人工介入次数/介入率:1次,1% +重点问题: +1. FZ-1711 (https://jira.westwell-lab.com/browse/FZ-1711) : + 车辆与服务器通信频繁断联,期间无法连接到FMS、AdaOps +实船作业:227#  美成811 +上场车辆数:6 +作业量/效率:184TEU  ,4.08循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +现场任务: +1. 005车正后激光更换 +日期:2025.12.18 +班次及人员: +夜班: 江唯 刘炜彬 +实船作业:227#  美成811 +上场车辆数:6 +作业量/效率:32TEU  ,3.79循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:228#  华信长和 +上场车辆数:5 +作业量/效率:231TEU  ,3.23循环/车/小时 +故障次数/故障率:1次,0.8% +人工介入次数/介入率:0次,0% +——————————————————————————————————————————————— +日期:2025.12.17 +班次及人员: +白班: 梁启迟 汪钦良 张勤 +实船作业:224#  锦钰物流 +上场车辆数:6 +作业量/效率:44TEU  ,4.46循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:225#  嘉洋17 +上场车辆数:6 +作业量/效率:175TEU  ,2.3循环/车/小时 +故障次数/故障率:1次,1% +人工介入次数/介入率:1次,1% +重点问题: +1. FZ-1702 (https://jira.westwell-lab.com/browse/FZ-1702) : + 006在I01W掉线删掉幽灵车后没有回收路径,影响后车作业 +班次及人员: +夜班: 江唯 刘炜彬 +实船作业:225#  嘉洋17 +上场车辆数:6 +作业量/效率:217TEU  ,3.48循环/车/小时 +故障次数/故障率:1次,0.09% +人工介入次数/介入率:0次,0% +实船作业:226#  恒盛65 +上场车辆数:6 +作业量/效率:56TEU  ,2.89循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +——————————————————————————————————————————————— +日期:2025.12.16 +班次及人员: +白班: 武大学 梁启迟 汪钦良 张勤 +实船作业:223#  华鑫858 +上场车辆数:6 +作业量/效率:295TEU  ,3.11循环/车/小时 +重点问题: +1. FZ-1699 (https://jira.westwell-lab.com/browse/FZ-1699) : + AdaOps故障,打开页面报Request failed with status code 502无法正常使用 +故障次数/故障率:1次,1% +人工介入次数/介入率:1次,1% +日期:2025.12.16 +班次及人员: +夜班: 刘炜彬  杨俊豪 +实船作业:223#  华鑫858 +上场车辆数:6 +作业量/效率:182TEU  ,2.95循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +——————————————————————————————————————————————— +日期:2025.12.15 +班次及人员: +白班: 武大学 梁启迟 江唯 张勤 +实船作业:220# 卓美23 +上场车辆数:6 +作业量/效率:102TEU  ,2.84循环/车/小时 +故障次数/故障率:2次,3.9% +人工介入次数/介入率:0次,0% +实船作业:221# 学友洋山 +上场车辆数:6 +作业量/效率:152TEU  ,3.05循环/车/小时 +故障次数/故障率:3次,3.9% +人工介入次数/介入率:0次,0% +班次及人员: +夜班: 刘炜彬  杨俊豪 +实船作业:221# 学友洋山 +上场车辆数:6 +作业量/效率:42TEU  ,2.31循环/车/小时 +故障次数/故障率:1次,5% +人工介入次数/介入率:1次,5% +实船作业:222#  海顺丰7 +上场车辆数:6 +作业量/效率:68TEU  ,1.7循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:223#  华鑫858 +上场车辆数:6 +作业量/效率:190TEU  ,3.4循环/车/小时 +故障次数/故障率:2次,2% +人工介入次数/介入率:2次,2% +重点问题: +1. FZ-1697 (https://jira.westwell-lab.com/browse/FZ-1697) : + 002车在I01W场头出现自动驾驶保持驻车,停止行驶2. FZ-1698 (https://jira.westwell-lab.com/browse/FZ-1698) : + 005在I01W超车道无法超过作业道的人工集卡 +注意事项: +1. AdaOps地图需要更新与FMS地图保持一致,FMS地图目前版本号:fuzhoujiangyin_20251212V1.0.osm,Devops地图版本号: 0.0.50-1746842926 到福州江阴港IGV-Adaops现场群找@赵 + + 靖怡找人帮忙更新下fuzhouPoints1215.json 任务点位已更新FZ-1530 (https://jira.westwell-lab.com/browse/FZ-1530):问问解涛车宽配置上线持久化没,上线的话可以帮忙修改下车宽配置 +——————————————————————————————————————————————— +日期:2025.12.14 +班次及人员: +白班: 武大学 梁启迟 江唯 张勤 汪钦良 +实船作业:218# 蓝海启航 +上场车辆数:6 +作业量/效率:58TEU  ,2.29循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:219# 华信长和 +上场车辆数:6 +作业量/效率:246TEU  ,4.2循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +班次及人员: +夜班: 刘炜彬  杨俊豪 +实船作业:219# 华信长和 +上场车辆数:6 +作业量/效率:128TEU  ,3.93循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:220# 卓美23 +上场车辆数:6 +作业量/效率:168TEU  ,2.75循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +——————————————————————————————————————————————— +日期:2025.12.13 +班次及人员: +白班: 武大学 梁启迟 江唯 张勤 +实船作业:214# 华鑫858 +上场车辆数:6 +作业量/效率:180TEU  ,2.63循环/车/小时 +故障次数/故障率:1次,1% +人工介入次数/介入率:0次,0% +重点问题: +1. FZ-1687 (https://jira.westwell-lab.com/browse/FZ-1687) : + 006车在F09作业时,先执行后箱23贝,司机完车后车辆往前一段距离,此时车辆位置超出前箱33贝位置,需要绕圈 +实船作业:215# 鑫源永顺 +上场车辆数:6 +作业量/效率:76TEU  ,2.61循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +班次及人员: +夜班: 刘炜彬  杨俊豪 +实船作业:215# 鑫源永顺 +上场车辆数:6 +作业量/效率:149TEU  ,2.61循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:216# 钱海83 +上场车辆数:6 +作业量/效率:24TEU  ,1.76循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:217# 天锦河 +上场车辆数:6 +作业量/效率:58TEU  ,1.76循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:218# 蓝海启航 +上场车辆数:6 +作业量/效率:8TEU  ,1.1循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +——————————————————————————————————————————————— +日期:2025.12.12 +班次及人员: +白班: 武大学 梁启迟 江唯 张勤 +实船作业:213# 海顺丰7 +上场车辆数:6 +作业量/效率:182TEU  ,2.14循环/车/小时 +故障次数/故障率:3次,2.3% +人工介入次数/介入率:0次,0% +日期:2025.12.12 +班次及人员: +夜班: 刘炜彬  杨俊豪 +实船作业:213# 海顺丰7 +上场车辆数:6 +作业量/效率:135TEU  ,2.2循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:214# 华鑫858 +上场车辆数:6 +作业量/效率:52TEU  ,2.6循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +注意事项: + 002车充电时重启一下,如果有问题直接拉集成王涛(很有可能会出问题FZ-1685 (https://jira.westwell-lab.com/browse/FZ-1685):联系刘子豪他说他手动重试回放,全局视频还是只有最后一分钟数据(可能他忘记了,联系问一下吧) +——————————————————————————————————————————————— +日期:2025.12.11 +班次及人员: +白班: 汪钦良 武大学 梁启迟 江唯 张勤 +实船作业:210# 华信长和 +上场车辆数:6 +作业量/效率:70TEU  ,2.87循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:211# 卓美23 +上场车辆数:6 +作业量/效率:138TEU  ,3.09循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:212# 弘旭968 +上场车辆数:6 +作业量/效率:38TEU  ,1.59循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +现场任务: +1. 002、007baize镜像刷写完成 +注意事项: +1. 001无特殊情况这两天不要下电,要收集足够数据排查内存溢出异常 +班次及人员: +夜班: 刘炜彬  杨俊豪 +实船作业:212# 弘旭968 +上场车辆数:6 +作业量/效率:135TEU  ,1.91循环/车/小时 +故障次数/故障率:4次,6% +人工介入次数/介入率:8次,12% +重点问题: +1. FZ-1678 (https://jira.westwell-lab.com/browse/FZ-1678) : + 002车A05作业时因轮胎吊天线触发一层安全无法行驶FZ-1679 (https://jira.westwell-lab.com/browse/FZ-1679):005车A05作业时因箱区箱子鼓包影响对位作业FZ-1680 (https://jira.westwell-lab.com/browse/FZ-1680):003车作业过程中105米文与网关断联,dcu1模块全挂 +实船作业:213# 海顺丰7 +上场车辆数:6 +作业量/效率:76TEU  ,2.32循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +——————————————————————————————————————————————— +日期:2025.12.10 +班次及人员: +白班: 汪钦良 武大学 梁启迟 江唯 +实船作业:207# 华鑫858 +上场车辆数:6 +作业量/效率:31TEU  ,2.45循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:208# 华信长和 +上场车辆数:6 +作业量/效率:236TEU  ,2.88循环/车/小时 +故障次数/故障率:1次,1% +人工介入次数/介入率:0次,0% +重点问题: +1. FZ-1636 (https://jira.westwell-lab.com/browse/FZ-1636) : + 在堆高机堆场作业时,前车生成阻拦后车的禁行区对于俩车的距离跨度过大 +现场任务: +1. 001、006、003、005baize镜像刷写完成 +余留任务: +1. 剩余车辆在充电时刷写baize镜像 +日期:2025.12.10 +夜班: 杨俊豪 刘炜彬 +实船作业:208# 华信长和 +上场车辆数:6 +作业量/效率:74TEU  ,3.1循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:209# 东方祥 +上场车辆数:6 +作业量/效率:104TEU  ,3.56循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:210# 华信长和 +上场车辆数:6 +作业量/效率:92TEU  ,3.47循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +——————————————————————————————————————————————— +日期:2025.12.09 +班次及人员: +白班: 汪钦良 武大学 梁启迟 +实船作业:202# 新海明 +上场车辆数:6 +作业量/效率:168TEU  ,2.72循环/车/小时 +故障次数/故障率:1次,1% +人工介入次数/介入率:1次,0% +重点问题: +1. FZ-1633 (https://jira.westwell-lab.com/browse/FZ-1633) : + 002在QC01往岸桥101方向下档时频繁跳变FZ-1634 (https://jira.westwell-lab.com/browse/FZ-1634):FMS框选的禁停区若包含场头贝位区域,车辆到达禁停区前短路径会丢失 +实船作业:203# 弘旭968 +上场车辆数:6 +作业量/效率:14TEU  ,2.55循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:204# 海顺丰7 +上场车辆数:6 +作业量/效率:30TEU  ,2.53循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +班次及人员: +夜班: 杨俊豪 刘炜彬 +实船作业:204# 海顺丰7 +上场车辆数:6 +作业量/效率:16TEU  ,2.76循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:205# 中外运马尼拉 +上场车辆数:6 +作业量/效率:33TEU  ,3.39循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:206# 广星978 +上场车辆数:6 +作业量/效率:256TEU  ,4.79循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:207# 华鑫858 +上场车辆数:6 +作业量/效率:6TEU  ,1.12循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +注意事项: +1. FZ-1614 (https://jira.westwell-lab.com/browse/FZ-1614) :数据已上传 +2. 001前脸需加固 +——————————————————————————————————————————————— +日期:2025.12.08 +班次及人员: +白班: 汪钦良 武大学 江唯 +实船作业:198# 卓美23 +上场车辆数:6 +作业量/效率:150TEU,3.09循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:199# 东方祥 +上场车辆数:6 +作业量/效率:82TEU,3.43循环/车/小时 +故障次数/故障率:1次,2.4% +人工介入次数/介入率:0次,0% +实船作业:200# 鑫源永顺 +上场车辆数:6 +作业量/效率:6TEU,2.24循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +夜班:杨俊豪 刘炜彬 +实船作业:200# 鑫源永顺 +上场车辆数:6 +作业量/效率:158TEU,2.47循环/车/小时 +故障次数/故障率:1次,1% +人工介入次数/介入率:0次,0% +实船作业:201# 嘉洋16 +上场车辆数:6 +作业量/效率:20TEU,2.74循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +现场任务: + 001车LED显示屏ip重新配置后显示正常 +注意事项: + 下艘作业船舶新海明计划在F09、G10预计09:30靠泊 +——————————————————————————————————————————————— +日期:2025.12.07 +班次及人员: +白班: 汪钦良 武大学 江唯 +实船作业:193# 美成811 +上场车辆数:6 +作业量/效率:60TEU  ,2.57循环/车/小时 +故障次数/故障率:1次,3% +人工介入次数/介入率:1次,1.7% +实船作业:194# 德盛6 +上场车辆数:6 +作业量/效率:41TEU  ,2.9循环/车/小时 +故障次数/故障率:2次,10.5% +人工介入次数/介入率:0次,0% +实船作业:195# 学友洋山 +上场车辆数:6 +作业量/效率:56TEU  ,4.37循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +夜班:梁启迟 刘炜彬 +实船作业:196# 华鑫858 +上场车辆数:6 +作业量/效率:92TEU  ,2.06循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:197# 广星978 +上场车辆数:6 +作业量/效率:88TEU  ,2.79循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:198# 卓美23 +上场车辆数:6 +作业量/效率:43TEU  ,1.96循环/车/小时 +故障次数/故障率:1次,5% +人工介入次数/介入率:0次,0% +重点问题: +1. FZ-1619 (https://jira.westwell-lab.com/browse/FZ-1619) : + 006行驶过程中出现点云数据显示异常,触发二层无法行驶 +注意事项: +1. FZ-1607 (https://jira.westwell-lab.com/browse/FZ-1607) : + 002在G09无法进入对位中,找自动驾驶对位值班的看下2. FZ-1619 (https://jira.westwell-lab.com/browse/FZ-1619) : + 006行驶过程中出现点云数据显示异常,触发二层无法行驶,联系毛丽雅确认下是否是基准参数问题 +——————————————————————————————————————————————— +日期:2025.12.06 +班次及人员: +白班: 杨俊豪 武大学 江唯 +实船作业:188# 华信长和 +上场车辆数:4 +作业量/效率:2TEU  ,3.05循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:189# 金祥源 +上场车辆数:4 +作业量/效率:60TEU  ,1.55循环/车/小时 +故障次数/故障率:2次,6.6% +人工介入次数/介入率:0次,0% +实船作业:190# 海顺丰7 +上场车辆数:5 +作业量/效率:20TEU  ,2.81循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +夜班:梁启迟 刘炜彬 +实船作业:191# 恒盛65 +上场车辆数:5 +作业量/效率:46TEU  ,2.12循环/车/小时 +故障次数/故障率:2次,8% +人工介入次数/介入率:0次,0% +实船作业:192# 弘旭968 +上场车辆数:6 +作业量/效率:84TEU  ,1.5循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:193# 美成811 +上场车辆数:6 +作业量/效率:53TEU  ,2.03循环/车/小时 +故障次数/故障率:2次,3% +人工介入次数/介入率:1次,1% +重点问题: +1. FZ-1613 (https://jira.westwell-lab.com/browse/FZ-1613) : + QC006岸桥断联,FMS无法生成到达该岸桥的路径FZ-1614 (https://jira.westwell-lab.com/browse/FZ-1614):005后箱收箱作业完成,箱子已放到后箱位置,fms的任务流程还未结束 +——————————————————————————————————————————————— +日期:2025.12.05 +班次及人员: +白班: 杨俊豪 汪钦良 张勤 武大学 江唯 陈天博 +实船作业:186# 华信长和 +上场车辆数:5 +作业量/效率:62TEU  ,3.45循环/车/小时 +故障次数/故障率:1次,2% +人工介入次数/介入率:0次,0% +实船作业:187# 东方吉 +上场车辆数:5 +作业量/效率:156TEU  ,2.68循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +班次及人员: +夜班: 刘炜彬  梁启迟 +实船作业:187# 东方吉 +上场车辆数:5 +作业量/效率:14TEU  ,1.74循环/车/小时 +故障次数/故障率:1次,14% +人工介入次数/介入率:0次,0% +重点问题: +FZ-1606 (https://jira.westwell-lab.com/browse/FZ-1606):003车前后箱指令与轨道吊接收指令不同,收箱异常无法正常完成 +实船作业:188# 东方祥 +上场车辆数:5 +作业量/效率:206TEU  ,3.03循环/车/小时 +故障次数/故障率:3次,3% +人工介入次数/介入率:10次,9% +重点问题: +1. FZ-1608 (https://jira.westwell-lab.com/browse/FZ-1608) : + 006车正前激光故障2. FZ-1609 (https://jira.westwell-lab.com/browse/FZ-1609) : + 005车下电重启后连接不上网关服务器3. FZ-1607 (https://jira.westwell-lab.com/browse/FZ-1607) : + 002在G09无法进入对位中 +注意事项: +1. 003车自动驾驶已更新至3.6.728p1 +2. 001车前脸要加固下 +3. FZ-1608 (https://jira.westwell-lab.com/browse/FZ-1608) 临时用007车正前激光替换 +——————————————————————————————————————————————— +日期:2025.12.04 +班次及人员: +白班: 杨俊豪 汪钦良 张勤 武大学 江唯 陈天博 +实船作业:183# 海顺丰7 +上场车辆数:5 +作业量/效率:84TEU  ,2.38循环/车/小时 +故障次数/故障率:2次,3% +人工介入次数/介入率:1次,2% +实船作业:184# 学友洋山 +上场车辆数:5 +作业量/效率:38TEU  ,1.59循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:185# 卓美23 +上场车辆数:5 +作业量/效率:26TEU  ,3.5循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +注意事项: +FZ-1602 (https://jira.westwell-lab.com/browse/FZ-1602):数据在拷贝待上传 +夜班:梁启迟 刘炜彬 +实船作业:185# 卓美23 +上场车辆数:5 +作业量/效率:173TEU  ,2.56循环/车/小时 +故障次数/故障率:2次,2% +人工介入次数/介入率:2次,2% +重点问题: +1. FZ-1603 (https://jira.westwell-lab.com/browse/FZ-1603) : + 002车行驶过程中出现LIDAR CPS激光数据丢失,停止行驶FZ-1604 (https://jira.westwell-lab.com/browse/FZ-1604):006车作业途中报2号计算单元无法连接dcu1、交换机断开连接,车辆无法合控制 +实船作业:186# 华信长和 +上场车辆数:3 +作业量/效率:28TEU  ,2.54循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +现场任务: +1. 更换002车左后激光(WIFI模块连不上,无法自动标定激光,需要找人排查) +2. FZ-1602数据已上传 +注意事项: + 两份 qomolo-miivii-apex-ad10-l4t 文件已上传至1~6车105、106的 /data/ 中 +2. G10场尾围栏会阻挡车辆出场以及临时车道拐弯 +——————————————————————————————————————————————— +日期:2025.12.03 +班次及人员: +白班: 杨俊豪 汪钦良 张勤 武大学 +实船作业:180# 美成811 +上场车辆数:6 +作业量/效率:126TEU  ,2.7循环/车/小时 +故障次数/故障率:2次,3% +人工介入次数/介入率:3次,4% +重点问题: +FZ-1593 (https://jira.westwell-lab.com/browse/FZ-1593):六台车在轮胎吊区域A05.002贝作业时,触发一层无法到达作业贝位FZ-1591 (https://jira.westwell-lab.com/browse/FZ-1591):单车的箱子已经装到船上,单车卡片的任务进程卡在对位完成阶段,任务未结束 +实船作业:181# 晟杰平安 +上场车辆数:6 +作业量/效率:41TEU  ,2.28循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:182# 东方祥 +上场车辆数:6 +作业量/效率:18TEU  ,2.01循环/车/小时 +故障次数/故障率:1次,11% +人工介入次数/介入率:1次,11% +重点问题: +FZ-1594 (https://jira.westwell-lab.com/browse/FZ-1594):单车在G09作业时对位位置不准确,轮胎吊无法放箱 +残留任务: +FZ-1587 (https://jira.westwell-lab.com/browse/FZ-1587):7278p1数据上传007整车重启FZ-1594 (https://jira.westwell-lab.com/browse/FZ-1594):数据上传,经办人分配 + +日期:2025.12.03 +班次及人员: +夜班: 刘炜彬  梁启迟 +实船作业:182# 东方祥 +上场车辆数:6 +作业量/效率:150TEU  ,2.64循环/车/小时 +故障次数/故障率:4次,5% +人工介入次数/介入率:8次,10% +重点问题: +1. FZ-1595 (https://jira.westwell-lab.com/browse/FZ-1595) : + 006车行驶过程中出现LIDAR CPS激光数据丢失,停止行驶FZ-1596 (https://jira.westwell-lab.com/browse/FZ-1596):007车充电cc2口断开,充电枪无法插上FZ-1598 (https://jira.westwell-lab.com/browse/FZ-1598):003在G09没有进入对位状态FZ-1597 (https://jira.westwell-lab.com/browse/FZ-1597):001车行驶过程中会频繁触发二层,停止行驶后自行恢复 + +实船作业:183# 海顺丰7 +上场车辆数:4 +作业量/效率:42TEU  ,3.06循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +注意事项: +1. F10场尾石墩需要移走,目前IGV从FG之间道路走中间车道,无法从F10场尾出去 +2. G09还是无法对位 +3. 007充电cc2口断了,充电枪插不进去,可以让汪工再试试 +4. 001左前三色灯掉落 +——————————————————————————————————————————————— +日期:2025.12.02 +班次及人员: +白班: 杨俊豪 汪钦良 张勤 武大学 +实船作业:177# 丰信达27 +上场车辆数:6 +作业量/效率:32TEU  ,2.28循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:178# 德盛6 +上场车辆数:6 +作业量/效率:84TEU  ,2.08循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:179# 嘉洋16 +上场车辆数:6 +作业量/效率:97TEU  ,2.29循环/车/小时 +故障次数/故障率:1次,2% +人工介入次数/介入率:0次,0% +重点问题: +FZ-1584 (https://jira.westwell-lab.com/browse/FZ-1584):车辆在QC08与QC09之间频繁定位跳变 +残留任务: +1. sudo vim /opt/qomolo/qpilot/temp/parameter/profile/planning/cnfzhjyg/cnfzhjyg_areas.yaml + 在车辆没有作业时,登录单车105与106: +找到id为166的内容修改为如下内容(修改完毕后重启单车) +- description: {alignment_heading: 2.6929240226745605} +id: 166 +type: kAlignmentArea +vertices: +- [-369.5056, 457.314972] +- [-527.766968, 533.3679] +- [-526.279053, 536.531433] +- [-367.979675, 460.317963] +日期:2025.12.02 +班次及人员: +夜班:梁启迟 陈天博 +实船作业:179# 嘉洋16 +上场车辆数:6 +作业量/效率:92TEU  ,2.48循环/车/小时 +故障次数/故障率:1次,2% +人工介入次数/介入率:0次,0% +重点问题: +1. FZ-1588 (https://jira.westwell-lab.com/browse/FZ-1588) : + 港区换班更换桥吊作业,QC7号岸桥实际移动到嘉洋16这个位置,RTK上报坐标不对,收到的就是和QC6挨着的位置,导致无法作业 +实船作业:180# 美成811 +上场车辆数:6 +作业量/效率:128TEU  ,2.5循环/车/小时 +故障次数/故障率:1次,% +人工介入次数/介入率:0次,0% +重点问题: +FZ-1589 (https://jira.westwell-lab.com/browse/FZ-1589):006车在C02轮胎吊进入对位,师傅正常放吊具未检测到吊具,不移动,Adaops报QC或RTGC未到达 +注意事项: +1. FZ-1588 (https://jira.westwell-lab.com/browse/FZ-1588) :需要找集成看看问题。 +2. 002车id166 的sudo vim /opt/qomolo/qpilot/temp/parameter/profile/planning/cnfzhjyg/cnfzhjyg_areas.yaml这个还未改 +——————————————————————————————————————————————— +日期:2025.12.01 +班次及人员: +白班: 刘炜彬  杨俊豪 汪钦良 张勤 +实船作业:170# 鑫源永顺 +上场车辆数:4 +作业量/效率:16TEU  ,2.25循环/车/小时 +故障次数/故障率:1次,12.5% +人工介入次数/介入率:0次,0% +实船作业:172#卓美23 +上场车辆数:5 +作业量/效率:49TEU  ,1.88循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:173# 信荣海 +上场车辆数:5 +作业量/效率:33TEU  ,4.74循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:174# 鑫源永顺 +上场车辆数:5 +作业量/效率:9TEU  ,2.16循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:175# 华信长和 +上场车辆数:6 +作业量/效率:80TEU  ,2.27循环/车/小时 +故障次数/故障率:1次,2% +人工介入次数/介入率:0次,0% +现场任务: +FZ-1580 (https://jira.westwell-lab.com/browse/FZ-1580):3.6.739版本耐久测试数据已回传 +注意事项: + QC05下电检修,FMS服务器配置里cms_conf.json删除了QC05,作业时添加回来 +夜班:梁启迟 陈天博 +实船作业:175# 华信长和 +上场车辆数:6 +作业量/效率:50TEU  ,2.72循环/车/小时 +故障次数/故障率:1次,2% +人工介入次数/介入率:0次,0% +重点问题: +1. FZ-1583 (https://jira.westwell-lab.com/browse/FZ-1583) : + F09作业时误检堆高机防堵,此时堆高机在箱区外侧 +实船作业:176# 弘旭968 +上场车辆数:6 +作业量/效率:132TEU  ,1.84循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +实船作业:177# 丰信达27 +上场车辆数:6 +作业量/效率:31TEU  ,2.53循环/车/小时 +故障次数/故障率:0次,0% +人工介入次数/介入率:0次,0% +注意事项: +1. 华信长和、弘旭968、丰信达27效率统计异常,上传数据未正常剔除 +——————————————————————————————————————————————— \ No newline at end of file diff --git a/fetch_and_process.py b/main.py similarity index 100% rename from fetch_and_process.py rename to main.py diff --git a/src/database.py b/src/database.py index f7895fa..667460a 100644 --- a/src/database.py +++ b/src/database.py @@ -49,31 +49,80 @@ class DailyLogsDatabase: efficiency REAL, vehicles INTEGER, created_at TEXT DEFAULT CURRENT_TIMESTAMP, - UNIQUE(date, shift, ship_name) + UNIQUE(date, shift, ship_name) ON CONFLICT REPLACE ) ''') + # 检查是否需要迁移旧表结构 + cursor.execute("SELECT sql FROM sqlite_master WHERE type='table' AND name='daily_handover_logs'") + table_sql = cursor.fetchone()[0] + if 'UNIQUE' not in table_sql: + # 旧表结构,需要迁移 + print("检测到旧表结构,正在迁移...") + + # 重命名旧表 + cursor.execute('ALTER TABLE daily_handover_logs RENAME TO daily_handover_logs_old') + + # 创建新表 + cursor.execute(''' + CREATE TABLE daily_handover_logs ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + date TEXT NOT NULL, + shift TEXT NOT NULL, + ship_name TEXT NOT NULL, + teu INTEGER, + efficiency REAL, + vehicles INTEGER, + created_at TEXT DEFAULT CURRENT_TIMESTAMP, + UNIQUE(date, shift, ship_name) ON CONFLICT REPLACE + ) + ''') + + # 复制数据(忽略重复) + cursor.execute(''' + INSERT OR IGNORE INTO daily_handover_logs + (date, shift, ship_name, teu, efficiency, vehicles, created_at) + SELECT date, shift, ship_name, teu, efficiency, vehicles, created_at + FROM daily_handover_logs_old + ''') + + # 删除旧表 + cursor.execute('DROP TABLE daily_handover_logs_old') + print("迁移完成!") + # 索引 cursor.execute('CREATE INDEX IF NOT EXISTS idx_date ON daily_handover_logs(date)') cursor.execute('CREATE INDEX IF NOT EXISTS idx_ship ON daily_handover_logs(ship_name)') + # 创建未统计月报数据表 + cursor.execute(''' + CREATE TABLE IF NOT EXISTS monthly_unaccounted ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + year_month TEXT NOT NULL UNIQUE, + teu INTEGER NOT NULL, + note TEXT, + created_at TEXT DEFAULT CURRENT_TIMESTAMP + ) + ''') + self.conn.commit() def insert(self, log: Dict) -> bool: - """插入单条记录""" + """插入记录(存在则更新,不存在则插入)""" try: cursor = self.conn.cursor() cursor.execute(''' INSERT OR REPLACE INTO daily_handover_logs - (date, shift, ship_name, teu, efficiency, vehicles) - VALUES (?, ?, ?, ?, ?, ?) + (date, shift, ship_name, teu, efficiency, vehicles, created_at) + VALUES (?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP) ''', ( log['date'], log['shift'], log['ship_name'], log.get('teu'), log.get('efficiency'), log.get('vehicles') )) self.conn.commit() return True - except sqlite3.Error: + except sqlite3.Error as e: + print(f"数据库错误: {e}") return False def insert_many(self, logs: List[Dict]) -> int: @@ -130,6 +179,31 @@ class DailyLogsDatabase: 'date_range': {'start': date_range[0], 'end': date_range[1]} } + def insert_unaccounted(self, year_month: str, teu: int, note: str = '') -> bool: + """插入未统计数据""" + try: + cursor = self.conn.cursor() + cursor.execute(''' + INSERT OR REPLACE INTO monthly_unaccounted + (year_month, teu, note, created_at) + VALUES (?, ?, ?, CURRENT_TIMESTAMP) + ''', (year_month, teu, note)) + self.conn.commit() + return True + except sqlite3.Error as e: + print(f"数据库错误: {e}") + return False + + def get_unaccounted(self, year_month: str) -> int: + """获取指定月份的未统计数据""" + cursor = self.conn.cursor() + cursor.execute( + 'SELECT teu FROM monthly_unaccounted WHERE year_month = ?', + (year_month,) + ) + result = cursor.fetchone() + return result[0] if result else 0 + def close(self): """关闭连接""" if self.conn: diff --git a/src/parser.py b/src/parser.py index da12737..922bc0e 100644 --- a/src/parser.py +++ b/src/parser.py @@ -85,7 +85,7 @@ class HandoverLogParser: shift_start = block.find(shift_pattern) + len(shift_pattern) - # 找到下一个班次或注意事项 + # 只找到下一个班次作为边界,不限制"注意事项:" next_pos = len(block) for next_shift in ['白班', '夜班']: if next_shift != shift: @@ -93,10 +93,6 @@ class HandoverLogParser: if pos != -1 and pos < next_pos: next_pos = pos - notes_pos = block.find('注意事项:', shift_start) - if notes_pos != -1 and notes_pos < next_pos: - next_pos = notes_pos - shift_content = block[shift_start:next_pos] self._parse_ships(shift_content, date, shift, logs) @@ -109,15 +105,17 @@ class HandoverLogParser: continue cleaned = part.replace('\xa0', ' ').strip() - ship_match = re.search(r'#\s+(\S+)', cleaned) + # 匹配 "xxx# 船名" 格式(船号和船名分开) + ship_match = re.search(r'(\d+)#\s*(\S+)', cleaned) if not ship_match: continue - ship_name = ship_match.group(1) + ship_name = f"{ship_match.group(1)}#{ship_match.group(2)}" + vehicles_match = re.search(r'上场车辆数:(\d+)', cleaned) teu_eff_match = re.search( - r'作业量/效率:(\d+)TEU[,,\s]+([\d.]+)循环/车/小时', cleaned + r'作业量/效率:(\d+)TEU[,,\s]*', cleaned ) log = ShipLog( @@ -125,7 +123,7 @@ class HandoverLogParser: shift=shift, ship_name=ship_name, teu=int(teu_eff_match.group(1)) if teu_eff_match else None, - efficiency=float(teu_eff_match.group(2)) if teu_eff_match else None, + efficiency=None, vehicles=int(vehicles_match.group(1)) if vehicles_match else None ) logs.append(log) diff --git a/src/report.py b/src/report.py new file mode 100644 index 0000000..05edd8e --- /dev/null +++ b/src/report.py @@ -0,0 +1,182 @@ +#!/usr/bin/env python3 +""" +日报生成模块 +""" +from datetime import datetime, timedelta +from typing import Dict, List, Optional +import sys +import os + +# 添加项目根目录到 Python 路径 +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from src.database import DailyLogsDatabase + + +class DailyReportGenerator: + """每日作业报告生成器""" + + DAILY_TARGET = 300 # 每日目标作业量 + + def __init__(self, db_path: str = 'data/daily_logs.db'): + """初始化""" + self.db = DailyLogsDatabase(db_path) + + def get_latest_date(self) -> str: + """获取数据库中最新的日期""" + logs = self.db.query_all(limit=1) + if logs: + return logs[0]['date'] + return datetime.now().strftime('%Y-%m-%d') + + def get_daily_data(self, date: str) -> Dict: + """获取指定日期的数据""" + logs = self.db.query_by_date(date) + + # 按船名汇总 + ships = {} + for log in logs: + ship = log['ship_name'] + if ship not in ships: + ships[ship] = 0 + if log.get('teu'): + ships[ship] += log['teu'] + + return { + 'date': date, + 'ships': ships, + 'total_teu': sum(ships.values()), + 'ship_count': len(ships) + } + + def get_monthly_stats(self, date: str) -> Dict: + """获取月度统计(截止到指定日期)""" + year_month = date[:7] # YYYY-MM + target_date = datetime.strptime(date, '%Y-%m-%d').date() + + logs = self.db.query_all(limit=10000) + + # 只统计当月且在指定日期之前的数据 + monthly_logs = [ + log for log in logs + if log['date'].startswith(year_month) + and datetime.strptime(log['date'], '%Y-%m-%d').date() <= target_date + ] + + # 按日期汇总 + daily_totals = {} + for log in monthly_logs: + d = log['date'] + if d not in daily_totals: + daily_totals[d] = 0 + if log.get('teu'): + daily_totals[d] += log['teu'] + + # 计算当月天数(已过的天数) + current_date = datetime.strptime(date, '%Y-%m-%d') + if current_date.day == 1: + days_passed = 1 + else: + days_passed = current_date.day + + # 获取未统计数据 + unaccounted = self.db.get_unaccounted(year_month) + + planned = days_passed * self.DAILY_TARGET + actual = sum(daily_totals.values()) + unaccounted + + return { + 'year_month': year_month, + 'days_passed': days_passed, + 'planned': planned, + 'actual': actual, + 'unaccounted': unaccounted, + 'completion': round(actual / planned * 100, 2) if planned > 0 else 0, + 'daily_totals': daily_totals + } + + def get_shift_personnel(self, date: str) -> Dict: + """获取班次人员(从日志文本中解析,需要配合 parser 使用)""" + # 目前数据库中没有人员信息,返回空 + # 可以后续扩展添加人员追踪功能 + return { + 'day_shift': '', + 'night_shift': '', + 'duty_phone': '13107662315' + } + + def generate_report(self, date: str = None) -> str: + """生成日报""" + if not date: + date = self.get_latest_date() + + # 转换日期格式 2025-12-28 -> 12/28,同时确保查询格式正确 + try: + # 尝试解析各种日期格式 + parsed = datetime.strptime(date, '%Y-%m-%d') + display_date = parsed.strftime('%m/%d') + query_date = parsed.strftime('%Y-%m-%d') # 标准化为双数字格式 + except ValueError: + # 如果已经是标准格式,直接使用 + display_date = datetime.strptime(date, '%Y-%m-%d').strftime('%m/%d') + query_date = date + + daily_data = self.get_daily_data(query_date) + monthly_data = self.get_monthly_stats(query_date) + personnel = self.get_shift_personnel(query_date) + + # 月度统计 + month_display = date[5:7] + '/' + date[:4] # MM/YYYY + + lines = [] + lines.append(f"日期:{display_date}") + lines.append("") + + # 船次信息(紧凑格式,不留空行) + ship_lines = [] + for ship, teu in sorted(daily_data['ships'].items(), key=lambda x: -x[1]): + ship_lines.append(f"船名:{ship}") + ship_lines.append(f"作业量:{teu}TEU") + lines.extend(ship_lines) + lines.append("") + + # 当日实际作业量 + lines.append(f"当日实际作业量:{daily_data['total_teu']}TEU") + lines.append("") + + # 月度统计 + lines.append(f"当月计划作业量:{monthly_data['planned']}TEU (用天数*{self.DAILY_TARGET}TEU)") + if monthly_data.get('unaccounted', 0) > 0: + lines.append(f"当月未统计数据:{monthly_data['unaccounted']}TEU") + lines.append(f"当月实际作业量:{monthly_data['actual']}TEU") + lines.append(f"当月完成比例:{monthly_data['completion']}%") + lines.append("") + + # 人员信息(需要配合 Confluence 日志中的班次人员信息) + day_personnel = personnel['day_shift'] + night_personnel = personnel['night_shift'] + duty_phone = personnel['duty_phone'] + + # 班次日期使用次日 + next_day = (parsed + timedelta(days=1)).strftime('%m/%d') + lines.append(f"{next_day} 白班人员:{day_personnel}") + lines.append(f"{next_day} 夜班人员:{night_personnel}") + lines.append(f"24小时值班手机:{duty_phone}") + + return "\n".join(lines) + + def print_report(self, date: str = None): + """打印日报""" + report = self.generate_report(date) + print(report) + return report + + def close(self): + """关闭数据库连接""" + self.db.close() + + +if __name__ == '__main__': + generator = DailyReportGenerator() + generator.print_report() + generator.close()