Add README and monthly unaccounted data feature

This commit is contained in:
2025-12-29 01:03:54 +08:00
parent 3b60ae9ecf
commit 283a035ab1
7 changed files with 1363 additions and 17 deletions

View File

@@ -46,6 +46,10 @@ OrbitIn/
- `query_all(limit)` - 查询所有 - `query_all(limit)` - 查询所有
- `get_stats()` - 获取统计信息 - `get_stats()` - 获取统计信息
### [`DailyReportGenerator`](src/report.py:15)
- `generate_report(date)` - 生成日报
- `print_report(date)` - 打印日报
## 文本格式约定 ## 文本格式约定
- 列表前缀:`•` 用于 `ul`,数字+点用于 `ol` - 列表前缀:`•` 用于 `ul`,数字+点用于 `ol`
@@ -56,11 +60,14 @@ OrbitIn/
## 命令 ## 命令
```bash ```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])" python3 -c "from src.parser import HandoverLogParser; p = HandoverLogParser(); print(p.parse(open('layout_output.txt').read())[:3])"

127
README.md Normal file
View File

@@ -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

958
layout_output.txt Normal file
View File

@@ -0,0 +1,958 @@
### 每个班次到场相关事项:
1. 当面交接,确认交接日志完成并更新
车辆状态:
车号 状态 车号 状态
001 右前激光故障 005 可作业
002 可作业 006 可作业
003 可作业 007 可作业
1. 24小时内新bug确认
———————————————————————————————————————————————
日期2025.12.28
班次及人员:
白班:杨俊豪 汪钦良 武大学
实船作业246#  学友洋山
上场车辆数5
作业量/效率246TEU3.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
作业量/效率14TEU5.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. 002007地图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. 002007地图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.osmDevops地图版本号: 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
作业量/效率150TEU3.09循环/车/小时
故障次数/故障率0次0%
人工介入次数/介入率0次0%
实船作业199# 东方祥
上场车辆数6
作业量/效率82TEU3.43循环/车/小时
故障次数/故障率1次2.4%
人工介入次数/介入率0次0%
实船作业200# 鑫源永顺
上场车辆数6
作业量/效率6TEU2.24循环/车/小时
故障次数/故障率0次0%
人工介入次数/介入率0次0%
夜班:杨俊豪 刘炜彬
实船作业200# 鑫源永顺
上场车辆数6
作业量/效率158TEU2.47循环/车/小时
故障次数/故障率1次1%
人工介入次数/介入率0次0%
实船作业201# 嘉洋16
上场车辆数6
作业量/效率20TEU2.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效率统计异常上传数据未正常剔除
———————————————————————————————————————————————

View File

@@ -49,31 +49,80 @@ class DailyLogsDatabase:
efficiency REAL, efficiency REAL,
vehicles INTEGER, vehicles INTEGER,
created_at TEXT DEFAULT CURRENT_TIMESTAMP, 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_date ON daily_handover_logs(date)')
cursor.execute('CREATE INDEX IF NOT EXISTS idx_ship ON daily_handover_logs(ship_name)') 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() self.conn.commit()
def insert(self, log: Dict) -> bool: def insert(self, log: Dict) -> bool:
"""插入单条记录""" """插入记录(存在则更新,不存在则插入)"""
try: try:
cursor = self.conn.cursor() cursor = self.conn.cursor()
cursor.execute(''' cursor.execute('''
INSERT OR REPLACE INTO daily_handover_logs INSERT OR REPLACE INTO daily_handover_logs
(date, shift, ship_name, teu, efficiency, vehicles) (date, shift, ship_name, teu, efficiency, vehicles, created_at)
VALUES (?, ?, ?, ?, ?, ?) VALUES (?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
''', ( ''', (
log['date'], log['shift'], log['ship_name'], log['date'], log['shift'], log['ship_name'],
log.get('teu'), log.get('efficiency'), log.get('vehicles') log.get('teu'), log.get('efficiency'), log.get('vehicles')
)) ))
self.conn.commit() self.conn.commit()
return True return True
except sqlite3.Error: except sqlite3.Error as e:
print(f"数据库错误: {e}")
return False return False
def insert_many(self, logs: List[Dict]) -> int: def insert_many(self, logs: List[Dict]) -> int:
@@ -130,6 +179,31 @@ class DailyLogsDatabase:
'date_range': {'start': date_range[0], 'end': date_range[1]} '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): def close(self):
"""关闭连接""" """关闭连接"""
if self.conn: if self.conn:

View File

@@ -85,7 +85,7 @@ class HandoverLogParser:
shift_start = block.find(shift_pattern) + len(shift_pattern) shift_start = block.find(shift_pattern) + len(shift_pattern)
# 找到下一个班次注意事项 # 找到下一个班次作为边界,不限制"注意事项"
next_pos = len(block) next_pos = len(block)
for next_shift in ['白班', '夜班']: for next_shift in ['白班', '夜班']:
if next_shift != shift: if next_shift != shift:
@@ -93,10 +93,6 @@ class HandoverLogParser:
if pos != -1 and pos < next_pos: if pos != -1 and pos < next_pos:
next_pos = 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] shift_content = block[shift_start:next_pos]
self._parse_ships(shift_content, date, shift, logs) self._parse_ships(shift_content, date, shift, logs)
@@ -109,15 +105,17 @@ class HandoverLogParser:
continue continue
cleaned = part.replace('\xa0', ' ').strip() 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: if not ship_match:
continue 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) vehicles_match = re.search(r'上场车辆数:(\d+)', cleaned)
teu_eff_match = re.search( teu_eff_match = re.search(
r'作业量/效率:(\d+)TEU[,\s]+([\d.]+)循环/车/小时', cleaned r'作业量/效率:(\d+)TEU[,\s]*', cleaned
) )
log = ShipLog( log = ShipLog(
@@ -125,7 +123,7 @@ class HandoverLogParser:
shift=shift, shift=shift,
ship_name=ship_name, ship_name=ship_name,
teu=int(teu_eff_match.group(1)) if teu_eff_match else None, 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 vehicles=int(vehicles_match.group(1)) if vehicles_match else None
) )
logs.append(log) logs.append(log)

182
src/report.py Normal file
View File

@@ -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()