fix: 修正共享报工段工时归属拆分

This commit is contained in:
souplearn
2026-07-25 03:05:53 +08:00
parent b0be660999
commit e4dd01bc72
3 changed files with 78 additions and 7 deletions
+58 -3
View File
@@ -47,7 +47,26 @@ def _item(
)
def _report(start_at: datetime, end_at: datetime, item, *, id: int = 1, report_date: date | None = None):
def _device(scanned_at: datetime):
return SimpleNamespace(
device_no="23#",
process_name="冲压",
scanned_at=scanned_at,
released_at=None,
release_reason=None,
sort_order=0,
)
def _report(
start_at: datetime,
end_at: datetime,
item,
*,
id: int = 1,
report_date: date | None = None,
devices: list | None = None,
):
return SimpleNamespace(
id=id,
attendance_point_name="总厂",
@@ -55,8 +74,8 @@ def _report(start_at: datetime, end_at: datetime, item, *, id: int = 1, report_d
report_date=report_date or start_at.date(),
start_at=start_at,
end_at=end_at,
items=[item],
session=SimpleNamespace(devices=[]),
items=item if isinstance(item, list) else [item],
session=SimpleNamespace(devices=devices or []),
)
@@ -113,6 +132,42 @@ def test_one_minute_before_night_end_allocates_to_previous_date():
assert rows[1].reference_wage == 600
def test_no_device_shared_full_report_splits_effective_minutes_between_items():
first_item = _item(id=1, good_qty=10)
second_item = _item(id=2, good_qty=20)
report = _report(
datetime(2026, 7, 25, 8, 0),
datetime(2026, 7, 25, 11, 0),
[first_item, second_item],
)
rows = build_report_allocation_drafts(report)
assert [(row.report_item_id, row.effective_minutes, row.day_minutes) for row in rows] == [
(1, 90, 90),
(2, 90, 90),
]
def test_items_sharing_same_started_at_split_the_segment_minutes():
started_at = datetime(2026, 7, 25, 8, 0)
first_item = _item(id=1, good_qty=10, started_at=started_at)
second_item = _item(id=2, good_qty=20, started_at=started_at)
report = _report(
started_at,
datetime(2026, 7, 25, 11, 0),
[first_item, second_item],
devices=[_device(started_at)],
)
rows = build_report_allocation_drafts(report)
assert [(row.report_item_id, row.effective_minutes, row.day_minutes) for row in rows] == [
(1, 90, 90),
(2, 90, 90),
]
def test_zero_effective_minutes_falls_back_to_original_report_date():
item = _item(good_qty=5, defect_qty=1, scrap_qty=0.5, changeover_count=2, process_unit_price_yuan=3)
report = _report(