fix: 对齐报工归属有效工时分配
This commit is contained in:
+14
-2
@@ -461,9 +461,11 @@ def item_time_ranges(
|
||||
|
||||
ranges: list[ItemTimeRange] = []
|
||||
allocated_item_ids: set[int] = set()
|
||||
unassigned_ranges: list[tuple[datetime, datetime]] = []
|
||||
for device_no, device_ranges in segment_ranges.items():
|
||||
device_items = items_by_device.get(device_no, [])
|
||||
if not device_items:
|
||||
unassigned_ranges.extend(device_ranges)
|
||||
continue
|
||||
for segment_start, segment_end in device_ranges:
|
||||
ranges.extend(_device_item_time_ranges(device_items, segment_start, segment_end))
|
||||
@@ -471,8 +473,18 @@ def item_time_ranges(
|
||||
allocated_item_ids.add(id(item))
|
||||
|
||||
unmatched_items = [item for item in items if id(item) not in allocated_item_ids]
|
||||
if unmatched_items:
|
||||
ranges.extend(ItemTimeRange(item=item, start_at=start_at, end_at=end_at) for item in unmatched_items)
|
||||
if unmatched_items and unassigned_ranges:
|
||||
allocation_weight = 1 / len(unmatched_items)
|
||||
for segment_start, segment_end in unassigned_ranges:
|
||||
ranges.extend(
|
||||
ItemTimeRange(
|
||||
item=item,
|
||||
start_at=segment_start,
|
||||
end_at=segment_end,
|
||||
allocation_weight=allocation_weight,
|
||||
)
|
||||
for item in unmatched_items
|
||||
)
|
||||
return ranges
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from collections import defaultdict
|
||||
from dataclasses import dataclass
|
||||
from datetime import date, datetime, time, timedelta
|
||||
from datetime import date, datetime, timedelta
|
||||
|
||||
from sqlalchemy import delete
|
||||
from sqlalchemy.orm import Session
|
||||
@@ -40,10 +40,6 @@ class ReportAllocationDraft:
|
||||
reference_wage: float = 0
|
||||
|
||||
|
||||
def _midnight(value: date) -> datetime:
|
||||
return datetime.combine(value, time.min)
|
||||
|
||||
|
||||
def _add_minutes(
|
||||
rows: dict[date, dict[str, float]],
|
||||
allocation_date: date,
|
||||
@@ -55,18 +51,6 @@ def _add_minutes(
|
||||
rows[allocation_date][bucket] += minutes
|
||||
|
||||
|
||||
def _add_night_minutes(
|
||||
rows: dict[date, dict[str, float]],
|
||||
start_at: datetime,
|
||||
end_at: datetime,
|
||||
base_date: date,
|
||||
) -> None:
|
||||
midnight = _midnight(base_date + timedelta(days=1))
|
||||
before_midnight = _overlap_minutes(start_at, end_at, _midnight(base_date), midnight)
|
||||
after_midnight = _overlap_minutes(start_at, end_at, midnight, midnight + timedelta(days=1))
|
||||
_add_minutes(rows, base_date, "night", before_midnight + after_midnight)
|
||||
|
||||
|
||||
def _range_allocation_minutes(
|
||||
start_at: datetime,
|
||||
end_at: datetime,
|
||||
@@ -107,7 +91,7 @@ def _range_allocation_minutes(
|
||||
)
|
||||
minutes = max(0.0, minutes_between(overlap_start, overlap_end) - meal_minutes)
|
||||
if bucket == "night":
|
||||
_add_night_minutes(rows, overlap_start, overlap_end, current_date)
|
||||
_add_minutes(rows, current_date, "night", minutes)
|
||||
else:
|
||||
_add_minutes(rows, overlap_start.date(), bucket, minutes)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user