feat: 设备模具统计按归属日期汇总
This commit is contained in:
@@ -1,9 +1,11 @@
|
||||
from datetime import date
|
||||
from io import BytesIO
|
||||
from types import SimpleNamespace
|
||||
import json
|
||||
|
||||
from openpyxl import load_workbook
|
||||
|
||||
from app.routers import usage_stats as usage_stats_router
|
||||
from app.routers.usage_stats import (
|
||||
_build_usage_stats_export_response,
|
||||
_filter_usage_rows,
|
||||
@@ -13,6 +15,7 @@ from app.routers.usage_stats import (
|
||||
_to_schema_row,
|
||||
)
|
||||
from app.schemas import UsageStatsDetailOut, UsageStatsRow
|
||||
from app.services import usage_stats as usage_stats_service
|
||||
from app.services.usage_stats import UsageStatRow
|
||||
from app.services.usage_stats import build_usage_stats, split_cleaning_device_nos
|
||||
from app.services.usage_stats_export import export_usage_stats_rows
|
||||
@@ -314,6 +317,31 @@ def test_build_usage_stats_for_cleaning_device_defaults_object_type_to_cleaning_
|
||||
assert rows[0].object_type == "清洗设备"
|
||||
|
||||
|
||||
def test_usage_stats_dedupes_report_count_for_split_allocations():
|
||||
allocation_a = SimpleNamespace(
|
||||
report_id=1,
|
||||
effective_minutes=350,
|
||||
good_qty=350,
|
||||
item=_item(device_no="28#", allocated_minutes=0, good_qty=0),
|
||||
)
|
||||
allocation_b = SimpleNamespace(
|
||||
report_id=1,
|
||||
effective_minutes=300,
|
||||
good_qty=300,
|
||||
item=_item(device_no="28#", allocated_minutes=0, good_qty=0),
|
||||
)
|
||||
|
||||
rows = usage_stats_service.build_usage_stats_from_allocations(
|
||||
allocations=[allocation_a, allocation_b],
|
||||
category="device",
|
||||
equipment_type_by_key={("嘉恒", "28#"): "冲压设备"},
|
||||
)
|
||||
|
||||
assert len(rows) == 1
|
||||
assert rows[0].value == 650
|
||||
assert rows[0].report_count == 1
|
||||
|
||||
|
||||
def test_filter_usage_rows_searches_all_visible_fields():
|
||||
rows = [
|
||||
UsageStatRow(
|
||||
@@ -646,3 +674,57 @@ def test_matches_target_uses_id_before_ambiguous_device_fields():
|
||||
|
||||
assert _matches_target(minutes_row, **target_args)
|
||||
assert not _matches_target(quantity_row, **target_args)
|
||||
|
||||
|
||||
def test_usage_stats_detail_rows_use_allocation_date_and_dedupe_daily_report_count():
|
||||
report = SimpleNamespace(
|
||||
id=7,
|
||||
report_date=date(2026, 7, 24),
|
||||
employee_phone="13800000000",
|
||||
employee=SimpleNamespace(name="张三"),
|
||||
)
|
||||
item = _item(device_no="28#", allocated_minutes=0, good_qty=0)
|
||||
allocations = [
|
||||
SimpleNamespace(
|
||||
report_id=7,
|
||||
allocation_date=date(2026, 7, 25),
|
||||
effective_minutes=350,
|
||||
good_qty=350,
|
||||
report=report,
|
||||
item=item,
|
||||
),
|
||||
SimpleNamespace(
|
||||
report_id=7,
|
||||
allocation_date=date(2026, 7, 25),
|
||||
effective_minutes=300,
|
||||
good_qty=300,
|
||||
report=report,
|
||||
item=item,
|
||||
),
|
||||
]
|
||||
|
||||
detail = usage_stats_router._build_usage_stats_detail_from_allocations(
|
||||
allocations=allocations,
|
||||
category="device",
|
||||
target_args={
|
||||
"id": "",
|
||||
"category": "device",
|
||||
"attendance_point_name": "",
|
||||
"name": "28#",
|
||||
"product_name": "",
|
||||
"process_name": "",
|
||||
"stamping_method": "",
|
||||
"metric_kind": "minutes",
|
||||
},
|
||||
equipment_type_by_key={("嘉恒", "28#"): "冲压设备"},
|
||||
)
|
||||
|
||||
assert detail.value == 650
|
||||
assert detail.report_count == 1
|
||||
assert [(row.report_date, row.value, row.report_count) for row in detail.daily_rows] == [
|
||||
(date(2026, 7, 25), 650, 1)
|
||||
]
|
||||
assert [
|
||||
(row.report_id, row.report_date, row.value, row.report_count)
|
||||
for row in detail.report_rows
|
||||
] == [(7, date(2026, 7, 25), 650, 1)]
|
||||
|
||||
Reference in New Issue
Block a user