from pathlib import Path

from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
from docx.shared import Cm, Pt, RGBColor


OUT = Path("/Users/hedy/Desktop/软著-智慧食堂消费终端称重结算系统V1.0/智慧食堂消费终端称重结算系统V1.0_软著产品材料.docx")


def set_east_asia_font(style, font_name: str):
    style.font.name = font_name
    style._element.rPr.rFonts.set(qn("w:eastAsia"), font_name)


BODY_FONT = "Songti SC"
HEAD_FONT = "STHeiti"


def set_run_font(run, font_name=BODY_FONT, size=12, bold=False, color=None):
    run.font.name = font_name
    run._element.rPr.rFonts.set(qn("w:eastAsia"), font_name)
    run.font.size = Pt(size)
    run.bold = bold
    if color:
        run.font.color.rgb = RGBColor(*color)


def set_paragraph_format(p, before=0, after=8, line=1.5, first_line=True):
    p.alignment = WD_ALIGN_PARAGRAPH.LEFT
    fmt = p.paragraph_format
    fmt.space_before = Pt(before)
    fmt.space_after = Pt(after)
    fmt.line_spacing_rule = WD_LINE_SPACING.MULTIPLE
    fmt.line_spacing = line
    if first_line:
        fmt.first_line_indent = Pt(24)


def set_doc_defaults(doc):
    section = doc.sections[0]
    section.page_width = Cm(21)
    section.page_height = Cm(29.7)
    section.top_margin = Cm(2.5)
    section.bottom_margin = Cm(2.5)
    section.left_margin = Cm(2.8)
    section.right_margin = Cm(2.8)

    styles = doc.styles
    normal = styles["Normal"]
    set_east_asia_font(normal, BODY_FONT)
    normal.font.size = Pt(12)
    normal.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT
    normal.paragraph_format.line_spacing_rule = WD_LINE_SPACING.MULTIPLE
    normal.paragraph_format.line_spacing = 1.5
    normal.paragraph_format.space_after = Pt(8)

    for name in ("Heading 1", "Heading 2"):
        style = styles[name]
        set_east_asia_font(style, HEAD_FONT)
        style.font.color.rgb = RGBColor(0, 0, 0)
        style.font.bold = True
    styles["Heading 1"].font.size = Pt(15)
    styles["Heading 2"].font.size = Pt(14)


def add_title(doc):
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    p.paragraph_format.space_after = Pt(18)
    run = p.add_run("智慧食堂消费终端称重结算系统V1.0\n软著产品材料")
    set_run_font(run, HEAD_FONT, 18, True)


def add_section(doc, title, paragraphs):
    p = doc.add_paragraph()
    p.style = doc.styles["Heading 1"]
    p.alignment = WD_ALIGN_PARAGRAPH.LEFT
    p.paragraph_format.space_before = Pt(10)
    p.paragraph_format.space_after = Pt(8)
    run = p.add_run(title)
    set_run_font(run, HEAD_FONT, 15, True)
    for text in paragraphs:
        body = doc.add_paragraph()
        set_paragraph_format(body)
        r = body.add_run(text)
        set_run_font(r, BODY_FONT, 12)


def main():
    doc = Document()
    set_doc_defaults(doc)
    add_title(doc)

    add_section(
        doc,
        "一、开发目的",
        [
            "智慧食堂消费终端称重结算系统V1.0的开发目的，是为食堂档口称重售卖和现场消费结算提供一套稳定、便捷、可配置的软件工具。传统称重售卖通常需要人工查看重量、手工计算金额、再另行记录订单，容易出现计价不及时、金额核对慢、订单记录不完整等问题。本软件将商品选择、称重读数、单价计算、金额确认、支付处理和订单记录集中到消费终端中完成，使档口人员能够在同一页面完成称重计价和结算确认，减少重复录入和人工计算，提高售卖效率，降低现场差错。",
            "系统同时面向日常运营维护需要，提供商品、汤底、支付方式、设备编号、接口地址、称量参数等配置能力，便于不同档口按照实际售卖品类和设备环境进行调整。通过本软件，食堂可以对称重结算过程形成清晰记录，对订单金额、支付状态和营业数据进行查询，为餐厅档口管理、对账统计和设备运维提供基础数据支持。"
        ],
    )

    add_section(
        doc,
        "二、面向领域 / 行业",
        [
            "本软件主要面向餐饮服务、团餐食堂、企事业单位食堂、学校食堂、园区餐厅、档口称重售卖、自助称重结算和智慧食堂运营管理等领域，适用于按重量销售菜品、汤品、饮品或其他散装食品的消费终端结算场景。"
        ],
    )

    add_section(
        doc,
        "三、软件的主要功能",
        [
            "智慧食堂消费终端称重结算系统V1.0以档口现场称重售卖为核心，提供首页入口、称重结算、手动金额补录、订单管理和系统设置等功能。系统首页用于展示并进入主要业务模块，操作人员可以从首页快速进入称重结算、订单查询、称量设置及系统配置页面。首页功能入口按照现场收银和设备维护的实际操作顺序组织，便于档口人员在营业过程中快速切换业务，不需要在多个系统之间反复跳转。",
            "称重结算功能用于完成商品或菜品的现场称重计价。操作人员在称重结算页面选择对应商品或菜品后，将商品放置在称重台上，系统读取稳定后的重量数据，并结合商品单价自动计算应收金额。页面可展示当前商品、重量、单价、金额等结算信息，操作人员核对无误后进入支付或结算流程。对于汤底、饮品或需要加价选配的商品，系统支持按照预设参数进行选配和金额叠加，满足称重售卖中常见的组合计价需求。系统在称重前要求确认秤盘为空且完成归零，若出现重量异常，操作人员可根据提示检查秤台遮挡、残留物或称量状态，保证计价结果与实际称量情况一致。",
            "手动输入金额与补录功能用于处理特殊售卖或临时调整场景。当实际业务中存在固定金额、临时折算、称量设备异常或需要人工确认金额的情况时，操作人员可点击金额输入区域，使用数字键盘录入实际应收金额，并在与消费者确认后进入支付流程。手动补录完成后，系统仍会生成对应结算记录，保证现场销售数据可以留痕，避免出现只收款不记账、金额无法追溯等问题。",
            "订单管理功能用于查询和核对消费终端生成的订单记录。系统可展示订单编号、消费人、消费时间、订单金额、实付金额、支付方式、支付状态等信息，支持按日期筛选查看当日订单明细、总单数和总金额。通过订单管理，管理人员可以在营业过程中及时查看订单是否支付成功，核对不同时间段的销售情况，并为后续对账、统计和异常处理提供依据。该功能既服务于现场营业查询，也服务于日终核账和运营统计。",
            "系统设置功能用于维护消费终端运行所需的基础参数。称重设置支持秤台校准、归零、精度等参数配置，保证设备读数满足现场计价要求；汤底设置支持维护汤底选项和加价规则，便于称重菜品与配套选项组合结算；商品设置支持维护菜品或商品名称、单价、分类等基础资料，为称重结算提供计价依据；支付设置支持刷卡、扫码、人脸支付等支付方式开关及相关参数配置；系统配置支持维护设备编号、接口地址、语音提示等运行信息，使消费终端可以与后台服务和现场硬件保持一致。"
        ],
    )

    add_section(
        doc,
        "四、软件的技术特点",
        [
            "本软件采用称重数据与商品价格联动的处理方式，将商品选择、重量稳定判断、单价读取和金额计算集中在终端页面完成，减少人工换算步骤。系统支持按业务参数配置称重精度、归零、支付方式、商品分类和汤底加价规则，可适配不同档口的售卖方式。订单数据在结算完成后自动生成并可查询，便于形成连续的消费记录和营业统计。",
            "系统在设计上兼顾现场操作效率和维护便利性。前端页面围绕档口人员的高频操作组织，核心按钮和输入区域集中展示，便于快速完成称重、核对和结算；后台参数以设备和商品为基础进行维护，减少终端重复配置。通过设备编号、接口地址、支付参数和语音提示等配置项，系统可以根据现场设备环境进行部署调整，适合在多档口、多终端的智慧食堂场景中使用。"
        ],
    )

    OUT.parent.mkdir(parents=True, exist_ok=True)
    doc.save(OUT)
    print(OUT)


if __name__ == "__main__":
    main()
