84 lines
2.6 KiB
Python
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
|