JhHardwareWRS_BackPoint/app/services/usage_stats_export.py
2026-06-24 15:19:14 +08:00

84 lines
2.6 KiB
Python

from io import BytesIO
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill
DEVICE_HEADERS = ["考勤点", "设备号", "设备类型", "使用时长(分钟)", "使用时长(小时)", "使用时长(天)", "清洗数量", "报工次数"]
MOLD_HEADERS = ["考勤点", "产品名称", "工序", "冲压方式", "使用时长(分钟)", "使用时长(小时)", "使用时长(天)", "清洗数量", "报工次数"]
def export_usage_stats_rows(device_rows: list, mold_rows: list) -> bytes:
workbook = Workbook()
device_sheet = workbook.active
device_sheet.title = "设备统计"
mold_sheet = workbook.create_sheet("模具统计")
_write_device_sheet(device_sheet, device_rows)
_write_mold_sheet(mold_sheet, mold_rows)
output = BytesIO()
workbook.save(output)
return output.getvalue()
def _write_device_sheet(sheet, rows: list) -> None:
_append_headers(sheet, DEVICE_HEADERS)
for row in rows:
minutes, hours, days, quantity = _metric_values(row)
sheet.append(
[
row.attendance_point_name,
row.name,
row.object_type,
minutes,
hours,
days,
quantity,
row.report_count,
]
)
_set_widths(sheet, [16, 16, 16, 16, 16, 14, 12, 12])
def _write_mold_sheet(sheet, rows: list) -> None:
_append_headers(sheet, MOLD_HEADERS)
for row in rows:
minutes, hours, days, quantity = _metric_values(row)
sheet.append(
[
row.attendance_point_name,
row.product_name,
row.process_name,
row.stamping_method,
minutes,
hours,
days,
quantity,
row.report_count,
]
)
_set_widths(sheet, [16, 24, 12, 16, 16, 16, 14, 12, 12])
def _metric_values(row) -> tuple[float, float, float, float]:
if row.metric_kind == "quantity":
return 0, 0, 0, row.value
minutes = row.value
return minutes, round(minutes / 60, 2), round(minutes / 1440, 2), 0
def _append_headers(sheet, headers: list[str]) -> None:
sheet.append(headers)
fill = PatternFill(fill_type="solid", fgColor="FFEFEFEF")
font = Font(bold=True)
for cell in sheet[1]:
cell.fill = fill
cell.font = font
def _set_widths(sheet, widths: list[int]) -> None:
for index, width in enumerate(widths, start=1):
column_letter = sheet.cell(row=1, column=index).column_letter
sheet.column_dimensions[column_letter].width = width