feat: 交接班报告支持 Confluence/Jira 集成,添加 N/A 记录时间归属功能

- 集成 Confluence API 获取船舶报告数据
- 集成 Jira API 查询故障数量
- 支持船号显示 (462#、463# 等)
- 支持故障次数/故障率、人工介入次数/介入率显示
- 跨班作业使用 Card 69 按时间查询效率
- 不跨班作业使用整船效率(剔除异常)
- N/A 记录根据作业时间归属到对应船舶
- 更新 AGENTS.md 和 README.md 文档
- 删除 daily_report_gui.py
This commit is contained in:
Developer
2026-03-14 02:52:23 +08:00
parent cc989a8ddb
commit 5d0cafac32
13 changed files with 1746 additions and 394 deletions

View File

@@ -339,6 +339,77 @@ class TimeOperationsClient:
"teu": overview.get("teu"),
}
def get_efficiency_by_time(self, start_time: str, end_time: str) -> Optional[float]:
"""
获取指定时间段内的效率(剔除异常)
Args:
start_time: 开始时间,格式 "YYYY-MM-DD HH:MM:SS"
end_time: 结束时间,格式 "YYYY-MM-DD HH:MM:SS"
Returns:
效率值cycle/h如果没有数据则返回 None
"""
time_params = self._build_time_parameters(start_time, end_time)
# 查询剔除异常后的效率指标Card 69
efficiency_response = self._query_card(
self._CARD_IDS["efficiency_filtered"], time_params
)
efficiency_data = self._extract_row_data(efficiency_response) or {}
cycle_h_filtered = efficiency_data.get("cycle/h")
if cycle_h_filtered is not None:
return round(cycle_h_filtered, 2)
return None
def get_vessel_efficiency_by_time(
self, vessel_visit_id: str, start_time: str, end_time: str
) -> Optional[float]:
"""
获取指定船舶在指定时间段内的效率(剔除异常)
Args:
vessel_visit_id: 船舶访问ID格式如 "260313-信荣海"
start_time: 开始时间,格式 "YYYY-MM-DD HH:MM:SS"
end_time: 结束时间,格式 "YYYY-MM-DD HH:MM:SS"
Returns:
效率值cycle/h如果没有数据则返回 None
Example:
>>> client = TimeOperationsClient()
>>> efficiency = client.get_vessel_efficiency_by_time(
... "260313-信荣海",
... "2026-03-13 08:00:00",
... "2026-03-13 20:00:00"
... )
>>> print(f"效率: {efficiency}") # 1.66
"""
# 构建时间参数
time_params = self._build_time_parameters(start_time, end_time)
# 添加船舶参数(使用驼峰命名)
vessel_param = {
"type": "string/=",
"target": ["variable", ["template-tag", "vesselVisitId"]],
"value": vessel_visit_id,
}
# 合并参数
params = time_params + [vessel_param]
# 查询剔除异常后的效率指标Card 69
efficiency_response = self._query_card(
self._CARD_IDS["efficiency_filtered"], params
)
efficiency_data = self._extract_row_data(efficiency_response) or {}
cycle_h_filtered = efficiency_data.get("cycle/h")
if cycle_h_filtered is not None:
return round(cycle_h_filtered, 2)
return None
# 工厂函数(推荐用于简单场景)
def create_time_operations_client(