File manager - Edit - /var/www/sme-os.tech.cm.in.th/create_report_doc.py
Back
import docx from docx.shared import Inches, Pt, RGBColor from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.enum.table import WD_TABLE_ALIGNMENT from docx.oxml import OxmlElement from docx.oxml.ns import qn import os def set_cell_background(cell, fill_hex): tcPr = cell._element.get_or_add_tcPr() shd = OxmlElement('w:shd') shd.set(qn('w:val'), 'clear') shd.set(qn('w:color'), 'auto') shd.set(qn('w:fill'), fill_hex) tcPr.append(shd) def set_cell_margins(cell, top=120, bottom=120, left=150, right=150): tcPr = cell._element.get_or_add_tcPr() tcMar = OxmlElement('w:tcMar') for m, val in [('top', top), ('bottom', bottom), ('left', left), ('right', right)]: node = OxmlElement(f'w:{m}') node.set(qn('w:w'), str(val)) node.set(qn('w:type'), 'dxa') tcMar.append(node) tcPr.append(tcMar) def create_report(): doc = docx.Document() # ตั้งค่าà¸à¸£à¸°à¸”าษ A4 มาตรà¸à¸²à¸™à¸£à¸²à¸¢à¸‡à¸²à¸™à¸§à¸´à¸Šà¸²à¸à¸²à¸£ (ซ้าย 1.5 นิ้ว, ขวา/บน/ล่าง 1.0 นิ้ว) for section in doc.sections: section.page_width = Inches(8.27) section.page_height = Inches(11.69) section.left_margin = Inches(1.5) section.right_margin = Inches(1.0) section.top_margin = Inches(1.5) section.bottom_margin = Inches(1.0) # Style มาตรà¸à¸²à¸™ TH Sarabun PSK / New (เนื้à¸à¸«à¸² 16 ปà¸à¸•ิ) style = doc.styles['Normal'] font = style.font font.name = 'TH Sarabun PSK' font.size = Pt(16) font.color.rgb = RGBColor(0, 0, 0) style.paragraph_format.line_spacing = 1.15 style.paragraph_format.space_after = Pt(4) # Helper: หัวข้à¸à¹ƒà¸«à¸à¹ˆ 18 ตัวหนา def add_main_header(text, center=False): p = doc.add_paragraph() p.alignment = WD_ALIGN_PARAGRAPH.CENTER if center else WD_ALIGN_PARAGRAPH.LEFT run = p.add_run(text) run.font.name = 'TH Sarabun PSK' run.font.size = Pt(18) run.font.bold = True p.paragraph_format.space_before = Pt(6) p.paragraph_format.space_after = Pt(6) return p # Helper: หัวข้à¸à¸¢à¹ˆà¸à¸¢ 16 ตัวหนา def add_sub_header(text): p = doc.add_paragraph() p.alignment = WD_ALIGN_PARAGRAPH.LEFT run = p.add_run(text) run.font.name = 'TH Sarabun PSK' run.font.size = Pt(16) run.font.bold = True p.paragraph_format.space_before = Pt(4) p.paragraph_format.space_after = Pt(4) return p # Helper: ข้à¸à¸„วามเนื้à¸à¸«à¸² 16 ตัวปà¸à¸•ิ def add_body(text, indent=True): p = doc.add_paragraph() if indent: p.paragraph_format.first_line_indent = Inches(0.5) run = p.add_run(text) run.font.name = 'TH Sarabun PSK' run.font.size = Pt(16) run.font.bold = False p.paragraph_format.space_after = Pt(4) return p # ================= PAGE 1: หน้าปà¸à¸™à¸à¸ ================= p_logo = doc.add_paragraph() p_logo.alignment = WD_ALIGN_PARAGRAPH.CENTER p_logo.paragraph_format.space_before = Pt(30) r_logo = p_logo.add_run("[ พื้นที่สำหรับวางตราสัà¸à¸¥à¸±à¸à¸©à¸“์สถานศึà¸à¸©à¸² ]\n\n") r_logo.font.name = 'TH Sarabun PSK' r_logo.font.size = Pt(14) r_logo.font.italic = True p_title = doc.add_paragraph() p_title.alignment = WD_ALIGN_PARAGRAPH.CENTER r1 = p_title.add_run("รายงานโครงงาน\n") r1.font.name = 'TH Sarabun PSK' r1.font.size = Pt(20) r1.font.bold = True r2 = p_title.add_run("ระบบบริหารจัดà¸à¸²à¸£à¹à¸¥à¸°à¸ªà¸±à¹ˆà¸‡à¸à¸²à¸«à¸²à¸£à¸à¸à¸™à¹„ลน์à¸à¸±à¸ˆà¸‰à¸£à¸´à¸¢à¸°\nSME Restaurant OS (SmartDine Architecture)\n\n\n") r2.font.name = 'TH Sarabun PSK' r2.font.size = Pt(18) r2.font.bold = True p_author = doc.add_paragraph() p_author.alignment = WD_ALIGN_PARAGRAPH.CENTER p_author.paragraph_format.space_before = Pt(50) r_a = p_author.add_run("ผู้จัดทำ\nนาย สิปปà¸à¸£ วงค์พรหม\nรหัสนัà¸à¸¨à¸¶à¸à¸©à¸² 020 ระดับชั้น ปวส.1\n\n\n") r_a.font.name = 'TH Sarabun PSK' r_a.font.size = Pt(16) r_a.font.bold = True p_teach = doc.add_paragraph() p_teach.alignment = WD_ALIGN_PARAGRAPH.CENTER r_t = p_teach.add_run("ครูที่ปรึà¸à¸©à¸²à¹‚ครงงาน\nà¸à¸²à¸ˆà¸²à¸£à¸¢à¹Œ à¸à¸¤à¸©à¸“ะ มีสุข\n\n\n") r_t.font.name = 'TH Sarabun PSK' r_t.font.size = Pt(16) r_t.font.bold = True p_foot = doc.add_paragraph() p_foot.alignment = WD_ALIGN_PARAGRAPH.CENTER r_f = p_foot.add_run("ภาคเรียนที่ 1 ปีà¸à¸²à¸£à¸¨à¸¶à¸à¸©à¸² 2567\nสำนัà¸à¸‡à¸²à¸™à¸„ณะà¸à¸£à¸£à¸¡à¸à¸²à¸£à¸à¸²à¸£à¸à¸²à¸Šà¸µà¸§à¸¨à¸¶à¸à¸©à¸² (สà¸à¸¨.)") r_f.font.name = 'TH Sarabun PSK' r_f.font.size = Pt(16) r_f.font.bold = True doc.add_page_break() # ================= PAGE 2: คำนำ ================= add_main_header("คำนำ", center=True) add_body("โครงงานระบบบริหารจัดà¸à¸²à¸£à¹à¸¥à¸°à¸ªà¸±à¹ˆà¸‡à¸à¸²à¸«à¸²à¸£à¸à¸à¸™à¹„ลน์à¸à¸±à¸ˆà¸‰à¸£à¸´à¸¢à¸°à¸ªà¸³à¸«à¸£à¸±à¸šà¸œà¸¹à¹‰à¸›à¸£à¸°à¸à¸à¸šà¸à¸²à¸£à¸‚นาดย่à¸à¸¡ (SME Restaurant OS) จัดทำขึ้นเพื่à¸à¸žà¸±à¸’นานวัตà¸à¸£à¸£à¸¡à¸£à¸°à¸šà¸šà¸ªà¸²à¸£à¸ªà¸™à¹€à¸—ศในà¸à¸²à¸£à¸šà¸£à¸´à¸«à¸²à¸£à¸ˆà¸±à¸”à¸à¸²à¸£à¸£à¹‰à¸²à¸™à¸à¸²à¸«à¸²à¸£à¸¢à¸¸à¸„ดิจิทัล à¹à¸à¹‰à¹„ขปัà¸à¸«à¸²à¸„วามล่าช้า à¸à¸²à¸£à¸ªà¸¹à¸à¸«à¸²à¸¢à¸‚à¸à¸‡à¸à¸à¹€à¸”à¸à¸£à¹Œ ความผิดพลาดในà¸à¸²à¸£à¸£à¸±à¸šà¸£à¸²à¸¢à¸à¸²à¸£à¸à¸²à¸«à¸²à¸£ à¹à¸¥à¸°à¸à¸²à¸£à¸ˆà¸±à¸”à¸à¸²à¸£à¸„ิวในครัวให้เà¸à¸´à¸”ประสิทธิภาพสูงสุด") add_body("รายงานฉบับนี้ได้รวบรวมรายละเà¸à¸µà¸¢à¸”à¸à¸²à¸£à¸§à¸´à¹€à¸„ราะห์à¹à¸¥à¸°à¸à¸à¸à¹à¸šà¸šà¸£à¸°à¸šà¸šà¸•ามมาตรà¸à¸²à¸™à¸ªà¸²à¸à¸¥ Gane & Sarson ประà¸à¸à¸šà¸”้วย à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸”ับที่ 0 (DFD Level 0 / Context Diagram), à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸”ับที่ 1 (DFD Level 1) à¹à¸ªà¸”ง 7 à¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¸«à¸¥à¸±à¸ à¹à¸¥à¸°à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸”ับที่ 2 (DFD Level 2) ที่à¹à¸•à¸à¸¢à¹ˆà¸à¸¢à¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¹€à¸›à¹‡à¸™à¸‚ั้นตà¸à¸™à¸à¸²à¸£à¸—ำงานระดับโปรà¹à¸à¸£à¸¡à¸à¸¢à¹ˆà¸²à¸‡à¸ªà¸¡à¸šà¸¹à¸£à¸“์ พร้à¸à¸¡à¸—ั้งพจนานุà¸à¸£à¸¡à¸‚้à¸à¸¡à¸¹à¸¥ (Data Dictionary)") p_sign = doc.add_paragraph() p_sign.alignment = WD_ALIGN_PARAGRAPH.RIGHT p_sign.paragraph_format.space_before = Pt(50) r_s = p_sign.add_run("สิปปà¸à¸£ วงค์พรหม\nผู้จัดทำ") r_s.font.name = 'TH Sarabun PSK' r_s.font.size = Pt(16) r_s.font.bold = True doc.add_page_break() # ================= PAGE 3: สารบัภ================= add_main_header("สารบัà¸", center=True) toc_table = doc.add_table(rows=1, cols=2) toc_table.alignment = WD_TABLE_ALIGNMENT.CENTER toc_table.autofit = False toc_table.columns[0].width = Inches(5.0) toc_table.columns[1].width = Inches(0.77) hdr = toc_table.rows[0].cells r_th1 = hdr[0].paragraphs[0].add_run("เรื่à¸à¸‡") r_th1.font.name = 'TH Sarabun PSK' r_th1.font.size = Pt(16) r_th1.font.bold = True r_th2 = hdr[1].paragraphs[0].add_run("หน้า") r_th2.font.name = 'TH Sarabun PSK' r_th2.font.size = Pt(16) r_th2.font.bold = True hdr[1].paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.RIGHT toc_items = [ ("คำนำ", "à¸"), ("สารบัà¸", "ข"), ("บทที่ 1 บทนำà¹à¸¥à¸°à¸ าพรวมระบบ", "1"), (" 1.1 วัตถุประสงค์ขà¸à¸‡à¹‚ครงงาน", "1"), (" 1.2 ขà¸à¸šà¹€à¸‚ตระบบà¹à¸¥à¸°à¸ªà¸–าปัตยà¸à¸£à¸£à¸¡ (7 โมดูลหลัà¸)", "1"), (" 1.3 สัà¸à¸¥à¸±à¸à¸©à¸“์à¹à¸¥à¸°à¸¡à¸²à¸•รà¸à¸²à¸™à¸à¸²à¸£à¸à¸à¸à¹à¸šà¸š (Gane & Sarson Standard)", "2"), ("บทที่ 2 พจนานุà¸à¸£à¸¡à¸‚้à¸à¸¡à¸¹à¸¥ (Data Dictionary D1 - D6)", "3"), ("บทที่ 3 à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥ (Data Flow Diagrams - DFD)", "4"), (" 3.1 à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸”ับที่ 0 (DFD Level 0 / Context Diagram)", "4"), (" 3.2 à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸”ับที่ 1 (DFD Level 1: Process 1.0 - 7.0)", "5"), (" 3.3 à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸”ับที่ 2 (DFD Level 2: ระบบจัดà¸à¸²à¸£à¸à¸±à¹ˆà¸‡à¸œà¸¹à¹‰à¸”ูà¹à¸¥)", "6"), (" 3.4 à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸”ับที่ 2 (DFD Level 2: ระบบลูà¸à¸„้าà¹à¸¥à¸°à¸«à¹‰à¸à¸‡à¸„รัว)", "7"), ("บทที่ 4 สรุปผลà¹à¸¥à¸°à¸à¸²à¸£à¸›à¸£à¸°à¸¢à¸¸à¸à¸•์ใช้งาน", "8"), ("บรรณานุà¸à¸£à¸¡", "9") ] for title, page in toc_items: r_c = toc_table.add_row().cells rt = r_c[0].paragraphs[0].add_run(title) rt.font.name = 'TH Sarabun PSK' rt.font.size = Pt(16) rp = r_c[1].paragraphs[0].add_run(page) rp.font.name = 'TH Sarabun PSK' rp.font.size = Pt(16) r_c[1].paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.RIGHT doc.add_page_break() # ================= PAGE 4: บทที่ 1 บทนำà¹à¸¥à¸°à¸ าพรวมระบบ ================= add_main_header("บทที่ 1\nบทนำà¹à¸¥à¸°à¸ าพรวมระบบ", center=True) add_sub_header("1.1 วัตถุประสงค์ขà¸à¸‡à¹‚ครงงาน") add_body("1. เพื่à¸à¸à¸à¸à¹à¸šà¸šà¹à¸¥à¸°à¸žà¸±à¸’นาระบบบริหารจัดà¸à¸²à¸£à¸£à¹‰à¸²à¸™à¸à¸²à¸«à¸²à¸£à¸à¸±à¸ˆà¸‰à¸£à¸´à¸¢à¸° SME Restaurant OS ที่ทำงานบนเว็บเบราว์เซà¸à¸£à¹Œ 100% โดยไม่ต้à¸à¸‡à¸•ิดตั้งà¹à¸à¸›à¸žà¸¥à¸´à¹€à¸„ชัน") add_body("2. เพื่à¸à¸à¸à¸à¹à¸šà¸šà¸à¸±à¸¥à¸à¸à¸£à¸´à¸—ึมคำนวณเวลารà¸à¸„à¸à¸¢à¸à¸²à¸«à¸²à¸£à¸ˆà¸£à¸´à¸‡ (Kitchen Lead Time Algorithm) à¹à¸ˆà¹‰à¸‡à¹€à¸•ืà¸à¸™à¸ªà¸–านะà¹à¸à¹ˆà¸¥à¸¹à¸à¸„้าà¹à¸šà¸šà¹€à¸£à¸µà¸¢à¸¥à¹„ทม์") add_body("3. เพื่à¸à¸žà¸±à¸’นาระบบจà¸à¸£à¸±à¸šà¸à¸à¹€à¸”à¸à¸£à¹Œà¸„รัว (Kitchen Display System - KDS) ช่วยลดข้à¸à¸œà¸´à¸”พลาดในà¸à¸²à¸£à¹€à¸ªà¸´à¸£à¹Œà¸Ÿà¸à¸²à¸«à¸²à¸£à¹à¸¥à¸°à¹€à¸žà¸´à¹ˆà¸¡à¸£à¸à¸šà¸«à¸¡à¸¸à¸™à¹€à¸§à¸µà¸¢à¸™à¹‚ต๊ะà¸à¸²à¸«à¸²à¸£") add_sub_header("1.2 ขà¸à¸šà¹€à¸‚ตà¸à¸²à¸£à¸”ำเนินงาน (7 โมดูลหลัà¸)") modules = [ "1. โมดูลยืนยันตัวตนà¹à¸¥à¸°à¸ˆà¸±à¸”à¸à¸²à¸£à¸ªà¸´à¸—ธิ์ร้านค้า (Authentication & Super Admin Impersonation)", "2. โมดูลจัดà¸à¸²à¸£à¹‚ต๊ะà¸à¸²à¸«à¸²à¸£à¹à¸¥à¸°à¸ªà¸£à¹‰à¸²à¸‡ Dynamic QR Code ประจำโต๊ะ (Table & Session Token)", "3. โมดูลจัดà¸à¸²à¸£à¸«à¸¡à¸§à¸”หมู่ เมนูà¸à¸²à¸«à¸²à¸£ à¹à¸¥à¸°à¸•ัวเลืà¸à¸à¸žà¸´à¹€à¸¨à¸© (Menu & Custom Options Management)", "4. โมดูลสั่งà¸à¸²à¸«à¸²à¸£à¸à¸à¸™à¹„ลน์ผ่าน Web Browser สำหรับลูà¸à¸„้า (Customer QR Ordering System)", "5. โมดูลจà¸à¸£à¸±à¸šà¸à¸à¹€à¸”à¸à¸£à¹Œà¸«à¹‰à¸à¸‡à¸„รัวเรียลไทม์ (Kitchen Display System - KDS Queue Management)", "6. โมดูลประเมินเวลารà¸à¸„à¸à¸¢à¸à¸²à¸«à¸²à¸£à¹ƒà¸™à¸„รัวà¸à¸±à¸ˆà¸‰à¸£à¸´à¸¢à¸° (Real-time Lead Time Engine)", "7. โมดูลรับชำระเงินà¹à¸¥à¸°à¸à¸à¸à¹ƒà¸šà¹€à¸ªà¸£à¹‡à¸ˆà¸£à¸±à¸šà¹€à¸‡à¸´à¸™à¸à¸´à¹€à¸¥à¹‡à¸à¸—รà¸à¸™à¸´à¸à¸ªà¹Œ (PromptPay QR & Payment Verification)" ] for mod in modules: add_body(mod, indent=False) add_sub_header("1.3 มาตรà¸à¸²à¸™à¸ªà¸±à¸à¸¥à¸±à¸à¸©à¸“์ Gane & Sarson ที่ใช้ในโครงงาน") add_body("ในà¸à¸²à¸£à¸§à¸´à¹€à¸„ราะห์à¹à¸¥à¸°à¸à¸à¸à¹à¸šà¸šà¸£à¸°à¸šà¸šà¸‚à¸à¸‡à¸£à¸²à¸¢à¸‡à¸²à¸™à¸‰à¸šà¸±à¸šà¸™à¸µà¹‰ ได้ยึดตามมาตรà¸à¸²à¸™à¸ªà¸±à¸à¸¥à¸±à¸à¸©à¸“์ Gane & Sarson (1979) à¸à¸¢à¹ˆà¸²à¸‡à¹€à¸„ร่งครัด ประà¸à¸à¸šà¸”้วย 4 à¸à¸‡à¸„์ประà¸à¸à¸šà¸«à¸¥à¸±à¸:") sym_table = doc.add_table(rows=1, cols=3) sym_table.alignment = WD_TABLE_ALIGNMENT.CENTER sym_headers = ["สัà¸à¸¥à¸±à¸à¸©à¸“์ (Gane & Sarson)", "ชื่à¸à¸à¸‡à¸„์ประà¸à¸à¸š", "หน้าที่à¹à¸¥à¸°à¸„วามหมาย"] for i, h in enumerate(sym_headers): cell = sym_table.rows[0].cells[i] set_cell_background(cell, "EAEAEA") p = cell.paragraphs[0] run_h = p.add_run(h) run_h.font.name = 'TH Sarabun PSK' run_h.font.size = Pt(16) run_h.font.bold = True p.alignment = WD_ALIGN_PARAGRAPH.CENTER sym_data = [ ("Process\n(สี่เหลี่ยมขà¸à¸šà¸¡à¸™ มีช่à¸à¸‡ No. ด้านบน)", "Process\n(ขั้นตà¸à¸™à¸à¸²à¸£à¸—ำงาน)", "à¹à¸ªà¸”งฟังà¸à¹Œà¸Šà¸±à¸™à¸«à¸£à¸·à¸à¸à¸²à¸£à¸›à¸£à¸°à¸¡à¸§à¸¥à¸œà¸¥à¸‚้à¸à¸¡à¸¹à¸¥à¸ ายในระบบ"), ("Data Store\n(สี่เหลี่ยมเปิดขวา ปิดซ้ายช่à¸à¸‡ ID)", "Data Store\n(à¹à¸«à¸¥à¹ˆà¸‡à¸ˆà¸±à¸”เà¸à¹‡à¸šà¸‚้à¸à¸¡à¸¹à¸¥)", "à¹à¸«à¸¥à¹ˆà¸‡à¸šà¸±à¸™à¸—ึà¸à¸‚้à¸à¸¡à¸¹à¸¥ Database (MySQL) หรืà¸à¹„ฟล์ข้à¸à¸¡à¸¹à¸¥"), ("External Agent\n(สี่เหลี่ยมผืนผ้าขà¸à¸šà¸—ึบ)", "External Entity\n(ปัจจัยภายนà¸à¸)", "บุคคลหรืà¸à¸£à¸°à¸šà¸šà¸ ายนà¸à¸à¸—ี่ส่งข้à¸à¸¡à¸¹à¸¥à¹€à¸‚้าหรืà¸à¸£à¸±à¸šà¸‚้à¸à¸¡à¸¹à¸¥à¸à¸à¸à¸ˆà¸²à¸à¸£à¸°à¸šà¸š"), ("Data Flow\n(เส้นตรงพร้à¸à¸¡à¸«à¸±à¸§à¸¥à¸¹à¸à¸¨à¸£à¸—ิศทาง)", "Data Flow\n(เส้นทางà¸à¸²à¸£à¹„หลขà¸à¸‡à¸‚้à¸à¸¡à¸¹à¸¥)", "à¹à¸ªà¸”งทิศทางà¸à¸²à¸£à¸ªà¹ˆà¸‡à¸œà¹ˆà¸²à¸™à¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸«à¸§à¹ˆà¸²à¸‡ Entity, Process à¹à¸¥à¸° Data Store") ] for row in sym_data: r_c = sym_table.add_row().cells for i, val in enumerate(row): rv = r_c[i].paragraphs[0].add_run(val) rv.font.name = 'TH Sarabun PSK' rv.font.size = Pt(16) doc.add_page_break() # ================= PAGE 5: บทที่ 2 พจนานุà¸à¸£à¸¡à¸‚้à¸à¸¡à¸¹à¸¥ (Data Dictionary) ================= add_main_header("บทที่ 2\nพจนานุà¸à¸£à¸¡à¸‚้à¸à¸¡à¸¹à¸¥ (Data Dictionary)", center=True) add_body("ตารางà¸à¸³à¸«à¸™à¸”โครงสร้างà¸à¸²à¸™à¸‚้à¸à¸¡à¸¹à¸¥à¹à¸¥à¸°à¹à¸«à¸¥à¹ˆà¸‡à¸ˆà¸±à¸”เà¸à¹‡à¸šà¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸šà¸š SME Restaurant OS (D1 - D6 ตามà¸à¸²à¸™à¸‚้à¸à¸¡à¸¹à¸¥à¸ˆà¸£à¸´à¸‡):") dd_table = doc.add_table(rows=1, cols=4) dd_table.alignment = WD_TABLE_ALIGNMENT.CENTER dd_headers = ["รหัส / ตาราง", "ฟิลด์ข้à¸à¸¡à¸¹à¸¥à¸«à¸¥à¸±à¸ (Key Fields)", "ประเภทข้à¸à¸¡à¸¹à¸¥", "คำà¸à¸˜à¸´à¸šà¸²à¸¢à¸à¸²à¸£à¸ˆà¸±à¸”เà¸à¹‡à¸š"] for i, h in enumerate(dd_headers): cell = dd_table.rows[0].cells[i] set_cell_background(cell, "EAEAEA") p = cell.paragraphs[0] rh = p.add_run(h) rh.font.name = 'TH Sarabun PSK' rh.font.size = Pt(16) rh.font.bold = True p.alignment = WD_ALIGN_PARAGRAPH.CENTER dd_data = [ ("D1: users / tenants", "id, username, password, role, store_name, plan_id, status", "INT, VARCHAR, ENUM", "ข้à¸à¸¡à¸¹à¸¥à¸œà¸¹à¹‰à¸”ูà¹à¸¥à¸£à¸°à¸šà¸š ข้à¸à¸¡à¸¹à¸¥à¸£à¹‰à¸²à¸™à¸„้าผู้เช่าระบบ à¹à¸¥à¸°à¹à¸žà¹‡à¸à¹€à¸à¸ˆ"), ("D2: tables_qr", "table_id, store_id, table_number, qr_token, table_status", "INT, VARCHAR, ENUM", "ข้à¸à¸¡à¸¹à¸¥à¹‚ต๊ะà¸à¸²à¸«à¸²à¸£ รหัส QR Token ประจำโต๊ะ à¹à¸¥à¸°à¸ªà¸–านะเปิดโต๊ะ"), ("D3: menus / categories", "menu_id, store_id, name, price, category, is_available, spice_options", "INT, DECIMAL, VARCHAR, TINYINT", "รายà¸à¸²à¸£à¸à¸²à¸«à¸²à¸£ ราคา หมวดหมู่ à¹à¸¥à¸°à¸ªà¸–านะสต็à¸à¸à¸„วามพร้à¸à¸¡"), ("D4: orders / order_items", "order_id, store_id, table_number, status, payment_method, is_paid", "INT, VARCHAR, ENUM, TINYINT", "ใบสั่งà¸à¸²à¸«à¸²à¸£ รายà¸à¸²à¸£à¸—ี่ลูà¸à¸„้าสั่ง จำนวน à¹à¸¥à¸°à¸¢à¸à¸”รวมเงิน"), ("D5: kitchen_queues", "queue_id, order_id, menu_id, qty, status, prep_time", "INT, ENUM, TIMESTAMP", "คิวà¸à¸²à¸£à¸›à¸£à¸¸à¸‡à¸à¸²à¸«à¸²à¸£à¸‚à¸à¸‡à¸à¹ˆà¸²à¸¢à¸„รัว สถานะ รà¸à¸›à¸£à¸¸à¸‡/à¸à¸³à¸¥à¸±à¸‡à¸—ำ/เสร็จ"), ("D6: payments", "payment_id, store_id, plan_id, amount, slip_url, status", "INT, DECIMAL, VARCHAR, ENUM", "ประวัติà¸à¸²à¸£à¸Šà¸³à¸£à¸°à¹€à¸‡à¸´à¸™ ตรวจสà¸à¸šà¸ªà¸¥à¸´à¸›à¹‚à¸à¸™ à¹à¸¥à¸°à¸ªà¸–านะà¸à¸™à¸¸à¸¡à¸±à¸•ิ") ] for row in dd_data: r_c = dd_table.add_row().cells for i, val in enumerate(row): rv = r_c[i].paragraphs[0].add_run(val) rv.font.name = 'TH Sarabun PSK' rv.font.size = Pt(16) doc.add_page_break() # ================= PAGE 6: บทที่ 3 à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥ (Context / Level 0) ================= add_main_header("บทที่ 3\nà¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥ (Data Flow Diagrams - DFD)", center=True) add_sub_header("3.1 à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸”ับที่ 0 (DFD Level 0 / Context Diagram)") add_body("à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸”ับที่ 0 (DFD Level 0 หรืภContext Diagram) à¹à¸ªà¸”งภาพรวมระดับสูงสุดขà¸à¸‡à¸£à¸°à¸šà¸š SME Restaurant OS (Process 0) à¸à¸±à¸šà¸à¸¥à¸¸à¹ˆà¸¡à¸œà¸¹à¹‰à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸ ายนà¸à¸ 4 à¸à¸¥à¸¸à¹ˆà¸¡à¸«à¸¥à¸±à¸ ได้à¹à¸à¹ˆ ลูà¸à¸„้า, พนัà¸à¸‡à¸²à¸™à¸„รัว, ผู้ดูà¹à¸¥à¸£à¹‰à¸²à¸™à¸„้า à¹à¸¥à¸°à¸œà¸¹à¹‰à¸”ูà¹à¸¥à¸£à¸°à¸šà¸šà¸ªà¹ˆà¸§à¸™à¸à¸¥à¸²à¸‡ ตามมาตรà¸à¸²à¸™à¸ªà¸±à¸à¸¥à¸±à¸à¸©à¸“์ Gane & Sarson:") if os.path.exists("images/dfd_level_0.png"): p_img1 = doc.add_paragraph() p_img1.alignment = WD_ALIGN_PARAGRAPH.CENTER p_img1.add_run().add_picture("images/dfd_level_0.png", width=Inches(5.8)) p_cap1 = doc.add_paragraph() p_cap1.alignment = WD_ALIGN_PARAGRAPH.CENTER rcap1 = p_cap1.add_run("รูปที่ 3.1 à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸”ับที่ 0 (DFD Level 0 / Context Diagram)") rcap1.font.name = 'TH Sarabun PSK' rcap1.font.size = Pt(16) rcap1.font.bold = True doc.add_page_break() # ================= PAGE 7: à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸”ับที่ 1 (DFD Level 1) ================= add_sub_header("3.2 à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸”ับที่ 1 (DFD Level 1: Process 1.0 - 7.0)") add_body("à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸”ับที่ 1 (DFD Level 1) à¹à¸ªà¸”งภาพรวมà¸à¸²à¸£à¸ˆà¸³à¹à¸™à¸à¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¸—ำงานหลัภ7 ขั้นตà¸à¸™ (Process 1.0 - 7.0) สัมพันธ์à¸à¸±à¸šà¹à¸«à¸¥à¹ˆà¸‡à¸ˆà¸±à¸”เà¸à¹‡à¸šà¸‚้à¸à¸¡à¸¹à¸¥ D1 - D6 ครà¸à¸šà¸„ลุมà¸à¸²à¸£à¸—ำงานทั้งระบบ:") if os.path.exists("images/dfd_level_1_overview.png"): p_img2 = doc.add_paragraph() p_img2.alignment = WD_ALIGN_PARAGRAPH.CENTER p_img2.add_run().add_picture("images/dfd_level_1_overview.png", width=Inches(5.8)) p_cap2 = doc.add_paragraph() p_cap2.alignment = WD_ALIGN_PARAGRAPH.CENTER rcap2 = p_cap2.add_run("รูปที่ 3.2 à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸”ับที่ 1 (DFD Level 1) à¹à¸ªà¸”ง 7 à¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¸«à¸¥à¸±à¸") rcap2.font.name = 'TH Sarabun PSK' rcap2.font.size = Pt(16) rcap2.font.bold = True doc.add_page_break() # ================= PAGE 8: à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸”ับที่ 2 (DFD Level 2 - à¸à¸±à¹ˆà¸‡à¸œà¸¹à¹‰à¸”ูà¹à¸¥ 1.0 - 3.0) ================= add_sub_header("3.3 à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸”ับที่ 2: ระบบจัดà¸à¸²à¸£à¸à¸±à¹ˆà¸‡à¸œà¸¹à¹‰à¸”ูà¹à¸¥ (Process 1.0, 2.0, 3.0)") add_body("à¸à¸²à¸£à¹à¸•à¸à¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¸£à¸°à¸”ับที่ 2 (DFD Level 2 Decomposition) ขà¸à¸‡à¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¸à¸±à¹ˆà¸‡à¸œà¸¹à¹‰à¸”ูà¹à¸¥à¸£à¸°à¸šà¸š เพื่à¸à¹à¸ªà¸”งขั้นตà¸à¸™à¸¢à¹ˆà¸à¸¢à¹€à¸Šà¸´à¸‡à¸¥à¸¶à¸ ได้à¹à¸à¹ˆ Process 1.0 (1.1-1.3 ยืนยันตัวตน), Process 2.0 (2.1-2.3 จัดà¸à¸²à¸£à¹‚ต๊ะà¸à¸²à¸«à¸²à¸£à¹à¸¥à¸° QR Token) à¹à¸¥à¸° Process 3.0 (3.1-3.3 จัดà¸à¸²à¸£à¸«à¸¡à¸§à¸”หมู่ เมนู à¹à¸¥à¸°à¸ªà¸•็à¸à¸):") if os.path.exists("images/dfd_level_2_admin.png"): p_img3a = doc.add_paragraph() p_img3a.alignment = WD_ALIGN_PARAGRAPH.CENTER p_img3a.add_run().add_picture("images/dfd_level_2_admin.png", width=Inches(5.8)) p_cap3a = doc.add_paragraph() p_cap3a.alignment = WD_ALIGN_PARAGRAPH.CENTER rcap3a = p_cap3a.add_run("รูปที่ 3.3 à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸”ับที่ 2 (DFD Level 2: Process 1.0, Process 2.0 à¹à¸¥à¸° Process 3.0)") rcap3a.font.name = 'TH Sarabun PSK' rcap3a.font.size = Pt(16) rcap3a.font.bold = True doc.add_page_break() # ================= PAGE 9: à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸”ับที่ 2 (DFD Level 2 - à¸à¸±à¹ˆà¸‡à¸¥à¸¹à¸à¸„้าà¹à¸¥à¸°à¸„รัว 4.0 - 7.0) ================= add_sub_header("3.4 à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸”ับที่ 2: ระบบลูà¸à¸„้าà¹à¸¥à¸°à¸«à¹‰à¸à¸‡à¸„รัว (Process 4.0, 5.0, 6.0, 7.0)") add_body("à¸à¸²à¸£à¹à¸•à¸à¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¸£à¸°à¸”ับที่ 2 (DFD Level 2 Decomposition) ขà¸à¸‡à¸à¸£à¸°à¸šà¸§à¸™à¸à¸²à¸£à¸à¸±à¹ˆà¸‡à¸¥à¸¹à¸à¸„้าà¹à¸¥à¸°à¸«à¹‰à¸à¸‡à¸„รัว ประà¸à¸à¸šà¸”้วย Process 4.0 (4.1-4.3 สั่งà¸à¸²à¸«à¸²à¸£), Process 5.0 (5.1-5.3 คิวครัว KDS), Process 6.0 (6.1-6.3 คำนวณ Lead Time) à¹à¸¥à¸° Process 7.0 (7.1-7.3 ชำระเงิน PromptPay QR):") if os.path.exists("images/dfd_level_2_customer.png"): p_img3b = doc.add_paragraph() p_img3b.alignment = WD_ALIGN_PARAGRAPH.CENTER p_img3b.add_run().add_picture("images/dfd_level_2_customer.png", width=Inches(5.8)) p_cap3b = doc.add_paragraph() p_cap3b.alignment = WD_ALIGN_PARAGRAPH.CENTER rcap3b = p_cap3b.add_run("รูปที่ 3.4 à¹à¸œà¸™à¸ าพà¸à¸£à¸°à¹à¸ªà¸‚้à¸à¸¡à¸¹à¸¥à¸£à¸°à¸”ับที่ 2 (DFD Level 2: Process 4.0, 5.0, 6.0 à¹à¸¥à¸° 7.0)") rcap3b.font.name = 'TH Sarabun PSK' rcap3b.font.size = Pt(16) rcap3b.font.bold = True doc.add_page_break() # ================= PAGE 10: บรรณานุà¸à¸£à¸¡ ================= add_main_header("บรรณานุà¸à¸£à¸¡", center=True) references = [ "à¸à¸´à¸•ติ ภัà¸à¸”ีวัฒนะà¸à¸¸à¸¥. (2561). à¸à¸²à¸£à¸§à¸´à¹€à¸„ราะห์à¹à¸¥à¸°à¸à¸à¸à¹à¸šà¸šà¸£à¸°à¸šà¸š (System Analysis and Design). à¸à¸£à¸¸à¸‡à¹€à¸—พฯ: เคทีพี พับลิชชิ่ง.", "ธวัชชัย งามศิริ. (2563). à¸à¸²à¸£à¸žà¸±à¸’นาระบบเว็บà¹à¸à¸›à¸žà¸¥à¸´à¹€à¸„ชันสำหรับà¸à¸²à¸£à¸ˆà¸±à¸”à¸à¸²à¸£à¸£à¹‰à¸²à¸™à¸à¸²à¸«à¸²à¸£à¹à¸šà¸šà¹€à¸£à¸µà¸¢à¸¥à¹„ทม์. วารสารวิชาà¸à¸²à¸£à¸„à¸à¸¡à¸žà¸´à¸§à¹€à¸•à¸à¸£à¹Œà¹à¸¥à¸°à¹€à¸—คโนโลยี, 12(2), 45-58.", "Gane, C., & Sarson, T. (1979). Structured Systems Analysis: Tools and Techniques. Englewood Cliffs, NJ: Prentice-Hall.", "สำนัà¸à¸‡à¸²à¸™à¸„ณะà¸à¸£à¸£à¸¡à¸à¸²à¸£à¸à¸²à¸£à¸à¸²à¸Šà¸µà¸§à¸¨à¸¶à¸à¸©à¸². (2562). ระเบียบà¹à¸¥à¸°à¸„ู่มืà¸à¸à¸²à¸£à¸ˆà¸±à¸”ทำโครงงานวิชาชีพ. à¸à¸£à¸¸à¸‡à¹€à¸—พฯ: à¸à¸£à¸°à¸—รวงศึà¸à¸©à¸²à¸˜à¸´à¸à¸²à¸£.", "Pressman, R. S. (2014). Software Engineering: A Practitioner's Approach. (8th ed.). New York: McGraw-Hill Education." ] for ref in references: p_ref = doc.add_paragraph() p_ref.paragraph_format.left_indent = Inches(0.5) p_ref.paragraph_format.first_line_indent = Inches(-0.5) p_ref.paragraph_format.space_after = Pt(6) rref = p_ref.add_run(ref) rref.font.name = 'TH Sarabun PSK' rref.font.size = Pt(16) # บันทึà¸à¹€à¸›à¹‡à¸™à¹„ฟล์เดิม SmartDine_OS_Report.docx doc.save("SmartDine_OS_Report.docx") print("Report saved successfully as SmartDine_OS_Report.docx") if __name__ == "__main__": create_report()
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.23 |
proxy
|
phpinfo
|
Settings