const fs = require('fs');
const path = require('path');
const { Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell,
        Header, Footer, AlignmentType, PageOrientation, LevelFormat,
        HeadingLevel, BorderStyle, WidthType, ShadingType, PageNumber, PageBreak } = require('docx');

const border = { style: BorderStyle.SINGLE, size: 1, color: "CCCCCC" };
const borders = { top: border, bottom: border, left: border, right: border };

function cell(text, width, options = {}) {
  return new TableCell({
    borders,
    width: { size: width, type: WidthType.DXA },
    shading: options.shading ? { fill: options.shading, type: ShadingType.CLEAR } : undefined,
    margins: { top: 80, bottom: 80, left: 120, right: 120 },
    verticalAlign: options.center ? "center" : undefined,
    children: [new Paragraph({
      alignment: options.center ? AlignmentType.CENTER : undefined,
      children: [new TextRun({ text, bold: options.bold, size: 21 })]
    })]
  });
}

function h1(text) {
  return new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun(text)] });
}

function h2(text) {
  return new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun(text)] });
}

function h3(text) {
  return new Paragraph({ heading: HeadingLevel.HEADING_3, children: [new TextRun(text)] });
}

function p(text, options = {}) {
  return new Paragraph({
    spacing: options.spacing ? { before: options.spacing[0], after: options.spacing[1] } : undefined,
    children: [new TextRun({ text, size: 21, bold: options.bold })]
  });
}

function bullet(text, ref) {
  return new Paragraph({
    numbering: { reference: ref, level: 0 },
    children: [new TextRun({ text, size: 21 })]
  });
}

const doc = new Document({
  styles: {
    default: { document: { run: { font: "Microsoft YaHei", size: 21 } } },
    paragraphStyles: [
      { id: "Heading1", name: "Heading 1", basedOn: "Normal", next: "Normal", quickFormat: true,
        run: { size: 36, bold: true, font: "Microsoft YaHei", color: "1F4E78" },
        paragraph: { spacing: { before: 400, after: 240 }, outlineLevel: 0 } },
      { id: "Heading2", name: "Heading 2", basedOn: "Normal", next: "Normal", quickFormat: true,
        run: { size: 28, bold: true, font: "Microsoft YaHei", color: "2E75B6" },
        paragraph: { spacing: { before: 320, after: 160 }, outlineLevel: 1 } },
      { id: "Heading3", name: "Heading 3", basedOn: "Normal", next: "Normal", quickFormat: true,
        run: { size: 24, bold: true, font: "Microsoft YaHei" },
        paragraph: { spacing: { before: 240, after: 120 }, outlineLevel: 2 } },
    ]
  },
  numbering: {
    config: [
      { reference: "bullets",
        levels: [{ level: 0, format: LevelFormat.BULLET, text: "•", alignment: AlignmentType.LEFT,
          style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] },
      { reference: "numbers",
        levels: [{ level: 0, format: LevelFormat.DECIMAL, text: "%1.", alignment: AlignmentType.LEFT,
          style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] },
    ]
  },
  sections: [{
    properties: {
      page: {
        size: { width: 12240, height: 15840 },
        margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 }
      }
    },
    headers: {
      default: new Header({ children: [new Paragraph({
        alignment: AlignmentType.RIGHT,
        children: [new TextRun({ text: "清道夫系统操作说明书", size: 18, color: "888888" })]
      })] })
    },
    footers: {
      default: new Footer({ children: [new Paragraph({
        alignment: AlignmentType.CENTER,
        children: [
          new TextRun({ text: "第 ", size: 18 }),
          new TextRun({ children: [PageNumber.CURRENT], size: 18 }),
          new TextRun({ text: " 页", size: 18 })
        ]
      })] })
    },
    children: [
      new Paragraph({
        alignment: AlignmentType.CENTER,
        spacing: { before: 2400, after: 400 },
        children: [new TextRun({ text: "清道夫系统", size: 72, bold: true, color: "1F4E78", font: "Microsoft YaHei" })]
      }),
      new Paragraph({
        alignment: AlignmentType.CENTER,
        spacing: { after: 600 },
        children: [new TextRun({ text: "小程序端操作说明书", size: 48, color: "2E75B6", font: "Microsoft YaHei" })]
      }),
      new Paragraph({
        alignment: AlignmentType.CENTER,
        spacing: { before: 1200 },
        children: [new TextRun({ text: "版本号：V1.0.0", size: 24, font: "Microsoft YaHei" })]
      }),
      new Paragraph({
        alignment: AlignmentType.CENTER,
        children: [new TextRun({ text: "编制日期：2026年7月", size: 24, font: "Microsoft YaHei" })]
      }),
      new Paragraph({ children: [new PageBreak()] }),

      h1("目录"),
      new Paragraph({
        spacing: { before: 200, after: 100 },
        children: [new TextRun({ text: "1. 产品概述", size: 22 })]
      }),
      new Paragraph({
        spacing: { after: 100 },
        children: [new TextRun({ text: "2. 登录与账号", size: 22 })]
      }),
      new Paragraph({
        spacing: { after: 100 },
        children: [new TextRun({ text: "3. 通用界面说明", size: 22 })]
      }),
      new Paragraph({
        spacing: { after: 100 },
        children: [new TextRun({ text: "4. 销售端操作指南", size: 22 })]
      }),
      new Paragraph({
        spacing: { after: 100 },
        children: [new TextRun({ text: "5. 调度端操作指南", size: 22 })]
      }),
      new Paragraph({
        spacing: { after: 100 },
        children: [new TextRun({ text: "6. 施工端操作指南", size: 22 })]
      }),
      new Paragraph({
        spacing: { after: 100 },
        children: [new TextRun({ text: "7. 任务全流程说明", size: 22 })]
      }),
      new Paragraph({
        spacing: { after: 100 },
        children: [new TextRun({ text: "8. 通知公告与知识库", size: 22 })]
      }),
      new Paragraph({
        spacing: { after: 100 },
        children: [new TextRun({ text: "9. 常见问题", size: 22 })]
      }),
      new Paragraph({ children: [new PageBreak()] }),

      h1("1. 产品概述"),
      h2("1.1 应用简介"),
      p("清道夫系统是一款面向环境服务/市政管道疏通/化粪池清掏等业务场景的移动端作业管理平台。系统通过微信小程序为载体，实现从任务发布、审核调度、现场执行到完工确认的全流程闭环管理。"),
      h2("1.2 适用对象"),
      new Table({
        width: { size: 9360, type: WidthType.DXA },
        columnWidths: [2340, 2340, 4680],
        rows: [
          new TableRow({ children: [cell("角色", 2340, { bold: true, shading: "D5E8F0", center: true }), cell("登录端点", 2340, { bold: true, shading: "D5E8F0", center: true }), cell("核心职责", 4680, { bold: true, shading: "D5E8F0", center: true })] }),
          new TableRow({ children: [cell("销售/业务员", 2340), cell("mp-sales", 2340), cell("项目库管理、客户管理、合同管理、任务发布、任务跟踪、催单", 4680)] }),
          new TableRow({ children: [cell("调度员", 2340), cell("mp-dispatch", 2340), cell("任务审核、班组/车辆调度、排班管理、车辆管理、可视化数据、应急管理", 4680)] }),
          new TableRow({ children: [cell("施工人员/班组", 2340), cell("mp-construction", 2340), cell("接收任务、执行SOP标准流程、每日车辆检查、现场拍照、完工确认", 4680)] }),
        ]
      }),
      h2("1.3 运行环境"),
      bullet("支持平台：微信小程序（主要）、H5兼容", "bullets"),
      bullet("前端框架：uni-app + Vue3 + Pinia", "bullets"),
      bullet("网络要求：需要联网使用，建议使用4G/5G或Wi-Fi", "bullets"),
      new Paragraph({ children: [new PageBreak()] }),

      h1("2. 登录与账号"),
      h2("2.1 首次登录"),
      bullet("打开微信小程序，进入登录页面。", "numbers"),
      bullet("在账号输入框中输入管理员分配的账号。", "numbers"),
      bullet("在密码输入框中输入对应密码，可点击眼睛图标切换显示/隐藏。", "numbers"),
      bullet("如需记住密码，勾选“记住密码”选项。", "numbers"),
      bullet("点击“登录”按钮。", "numbers"),
      bullet("系统后端自动识别账号角色，跳转至对应首页。", "numbers"),
      h2("2.2 角色说明"),
      p("系统采用后端按账号识别角色的方式，用户无需手动选择角色。登录后根据账号绑定的可登录端点自动进入对应角色首页。不同角色看到的界面、功能菜单和操作权限均不同。"),
      h2("2.3 退出登录"),
      bullet("进入“我的”页面。", "bullets"),
      bullet("点击“退出登录”。", "bullets"),
      bullet("确认后返回登录页面。", "bullets"),
      new Paragraph({ children: [new PageBreak()] }),

      h1("3. 通用界面说明"),
      h2("3.1 底部导航栏"),
      p("系统采用自定义底部导航栏，根据角色显示不同内容："),
      new Table({
        width: { size: 9360, type: WidthType.DXA },
        columnWidths: [1560, 2340, 2340, 3120],
        rows: [
          new TableRow({ children: [cell("索引", 1560, { bold: true, shading: "D5E8F0", center: true }), cell("页面", 2340, { bold: true, shading: "D5E8F0", center: true }), cell("文字", 2340, { bold: true, shading: "D5E8F0", center: true }), cell("说明", 3120, { bold: true, shading: "D5E8F0", center: true })] }),
          new TableRow({ children: [cell("0", 1560, { center: true }), cell("pages/home/home", 2340), cell("首页", 2340), cell("所有角色共用，内容按角色区分", 3120)] }),
          new TableRow({ children: [cell("1", 1560, { center: true }), cell("pages/task/task", 2340), cell("任务", 2340), cell("所有角色共用，列表按角色区分", 3120)] }),
          new TableRow({ children: [cell("2", 1560, { center: true }), cell("pages/schedule/schedule", 2340), cell("排班", 2340), cell("主要供调度端使用", 3120)] }),
          new TableRow({ children: [cell("3", 1560, { center: true }), cell("pages/my/my", 2340), cell("我的", 2340), cell("所有角色共用", 3120)] }),
        ]
      }),
      p("注：调度员角色的Tab顺序为首页、排班、任务、我的。"),
      h2("3.2 通用操作"),
      bullet("搜索框：在任务、项目、客户、合同等列表页顶部，输入关键词可快速检索。", "bullets"),
      bullet("筛选器：点击状态下拉框，可按状态筛选列表内容。", "bullets"),
      bullet("左滑操作：部分列表项支持左滑显示编辑、删除等快捷操作。", "bullets"),
      bullet("拨打电话：详情页点击联系电话可直接拨号。", "bullets"),
      bullet("地图定位：任务详情中点击地理位置可唤起导航。", "bullets"),
      new Paragraph({ children: [new PageBreak()] }),

      h1("4. 销售端操作指南"),
      h2("4.1 销售端首页"),
      p("销售登录后进入首页，可查看："),
      bullet("统计卡片：本月项目数、待确认任务数、进行中任务数。", "bullets"),
      bullet("快捷入口：项目库、客户管理、合同管理。", "bullets"),
      bullet("任务提醒入口与最新任务列表。", "bullets"),
      bullet("通知公告列表与行业知识列表。", "bullets"),
      h2("4.2 发布任务"),
      bullet("进入“任务”页面，点击右上角“+”按钮。", "numbers"),
      bullet("填写项目基本信息：任务名称、任务类型、选择项目、主联系人姓名、电话。", "numbers"),
      bullet("填写服务信息：故障位置、地理位置、故障类型、客户原话、故障描述、首次出现时间、近期反复情况、影响范围、故障图片/视频、施工类型。", "numbers"),
      bullet("填写服务与结算数据：期望到达时间、最晚处理时限、验收标准、结算方式、堵点个数、清淤方量。", "numbers"),
      bullet("确认工单生成数据：施工指令、风险提示、派单结果判定、施工设施、服务方式、建议出车、取水距离、化粪池排口是否正常。", "numbers"),
      bullet("填写施工助力信息：预计作业量、预计工时、验收要求、是否有前期施工关联、验收方式、甲方当事人、备注。", "numbers"),
      bullet("点击提交，任务状态变为“待审核”。", "numbers"),
      h2("4.3 任务跟踪与催单"),
      bullet("在“任务”列表中查看已发布任务的状态。", "bullets"),
      bullet("点击任务卡片进入任务详情。", "bullets"),
      bullet("点击“催单”按钮，填写催单原因后提交。", "bullets"),
      h2("4.4 项目库、客户、合同管理"),
      bullet("项目库：查看、新增、编辑、删除项目信息，支持按合作类型筛选。", "bullets"),
      bullet("客户管理：维护客户资料，支持按状态筛选。", "bullets"),
      bullet("合同管理：维护合同信息，支持按状态筛选。", "bullets"),
      new Paragraph({ children: [new PageBreak()] }),

      h1("5. 调度端操作指南"),
      h2("5.1 调度端首页"),
      p("调度员登录后进入首页，可查看："),
      bullet("统计卡片：今日任务总数、待排班数量、应急中任务数量。", "bullets"),
      bullet("快捷入口：排班管理、任务列表、车辆管理、可视化。", "bullets"),
      bullet("待审核任务列表与消息通知铃铛（显示未读数）。", "bullets"),
      h2("5.2 审核任务"),
      bullet("在首页或任务列表查看“待审核”任务。", "numbers"),
      bullet("点击任务进入详情页。", "numbers"),
      bullet("查看任务基本信息、项目信息、故障详情、施工信息等。", "numbers"),
      bullet("点击“审核通过”，任务进入待安排状态；点击“驳回”，填写驳回原因。", "numbers"),
      h2("5.3 安排班组与车辆"),
      bullet("审核通过后，在任务详情中点击“安排”。", "numbers"),
      bullet("选择执行班组。", "numbers"),
      bullet("选择调度车辆（可多选）。", "numbers"),
      bullet("确认后任务状态变为“已安排/待确认”。", "numbers"),
      h2("5.4 排班管理"),
      bullet("进入底部“排班”Tab。", "numbers"),
      bullet("使用左右箭头切换月份，点击“今天”快速回到当前日期。", "numbers"),
      bullet("点击“新增排班”。", "numbers"),
      bullet("选择班组、工作日期、排班类型（月计划/应急）、车辆，填写备注。", "numbers"),
      bullet("确认保存后，日历上对应日期显示排班标记。", "numbers"),
      h2("5.5 车辆管理"),
      bullet("通过首页快捷入口进入车辆列表。", "bullets"),
      bullet("可按状态筛选：全部、可用、使用中、维修中。", "bullets"),
      bullet("点击车辆卡片查看车辆详情弹窗，包含车牌号、类型、尺寸、载重、容积、驾驶员、电话、购车日期、里程、状态等。", "bullets"),
      new Paragraph({ children: [new PageBreak()] }),

      h1("6. 施工端操作指南"),
      h2("6.1 施工端首页"),
      p("施工人员登录后进入首页，可查看："),
      bullet("统计卡片：已完成任务数、进行中任务数、明日任务数。", "bullets"),
      bullet("快捷入口：我的任务、车辆检查、帮助中心。", "bullets"),
      bullet("每日任务入口（带红点提醒）、当前任务列表、通知公告列表。", "bullets"),
      h2("6.2 接收与确认任务"),
      bullet("在首页或任务列表查看分配的任务。", "numbers"),
      bullet("点击任务进入任务详情。", "numbers"),
      bullet("在“确认任务”步骤选择：确认任务、反馈问题或拒绝任务。", "numbers"),
      h2("6.3 SOP八步执行流程"),
      p("施工端任务详情内置标准SOP流程，共8步："),
      new Table({
        width: { size: 9360, type: WidthType.DXA },
        columnWidths: [1200, 2160, 6000],
        rows: [
          new TableRow({ children: [cell("步骤", 1200, { bold: true, shading: "D5E8F0", center: true }), cell("节点", 2160, { bold: true, shading: "D5E8F0", center: true }), cell("操作说明", 6000, { bold: true, shading: "D5E8F0", center: true })] }),
          new TableRow({ children: [cell("1", 1200, { center: true }), cell("确认任务", 2160), cell("确认/反馈问题/拒绝任务", 6000)] }),
          new TableRow({ children: [cell("2", 1200, { center: true }), cell("出车准备", 2160), cell("完成车辆点检：机油、轮胎、灯光、水管、工具", 6000)] }),
          new TableRow({ children: [cell("3", 1200, { center: true }), cell("到达现场", 2160), cell("现场踏勘：对接人是否到位、现场是否一致、客户是否同意施工", 6000)] }),
          new TableRow({ children: [cell("4", 1200, { center: true }), cell("开始施工", 2160), cell("填写堵塞物情况描述", 6000)] }),
          new TableRow({ children: [cell("5", 1200, { center: true }), cell("施工完成", 2160), cell("填写设施反馈描述", 6000)] }),
          new TableRow({ children: [cell("6", 1200, { center: true }), cell("现场清洗", 2160), cell("推进流程，可上传照片", 6000)] }),
          new TableRow({ children: [cell("7", 1200, { center: true }), cell("验收签字", 2160), cell("推进流程，可上传照片", 6000)] }),
          new TableRow({ children: [cell("8", 1200, { center: true }), cell("完工确认", 2160), cell("完成任务，状态变为已完成", 6000)] }),
        ]
      }),
      p("每步均可上传现场照片（最多6张）和填写备注。"),
      h2("6.4 每日车辆检查"),
      bullet("通过首页“车辆检查”或“每日任务”入口进入。", "numbers"),
      bullet("查看今日排班信息和分配车辆。", "numbers"),
      bullet("选择检查车辆。", "numbers"),
      bullet("逐项完成常规检查（7项）、设备检查（6项）、三大系统检查（GPS/视频监控/对讲系统）。", "numbers"),
      bullet("填写备注，点击提交。", "numbers"),
      new Paragraph({ children: [new PageBreak()] }),

      h1("7. 任务全流程说明"),
      h2("7.1 日常维保任务流程"),
      bullet("销售根据合同项目发起定期清掏/疏通任务。", "numbers"),
      bullet("任务提交后状态为“待审核”。", "numbers"),
      bullet("调度员审核任务，通过后安排班组和车辆。", "numbers"),
      bullet("施工班组接收任务并按SOP八步流程执行。", "numbers"),
      bullet("施工完成后进行验收签字与完工确认。", "numbers"),
      h2("7.2 应急抢修任务流程"),
      bullet("销售或调度发起应急任务。", "numbers"),
      bullet("调度快速安排应急班组和车辆。", "numbers"),
      bullet("施工人员立即出车，按简化流程或完整SOP执行。", "numbers"),
      bullet("现场施工完成后进行验收与完工确认。", "numbers"),
      h2("7.3 状态流转说明"),
      new Table({
        width: { size: 9360, type: WidthType.DXA },
        columnWidths: [3120, 6240],
        rows: [
          new TableRow({ children: [cell("状态", 3120, { bold: true, shading: "D5E8F0", center: true }), cell("含义", 6240, { bold: true, shading: "D5E8F0", center: true })] }),
          new TableRow({ children: [cell("待审核", 3120), cell("销售提交任务后等待调度审核", 6240)] }),
          new TableRow({ children: [cell("已驳回", 3120), cell("调度审核未通过，需销售修改后重新提交", 6240)] }),
          new TableRow({ children: [cell("已安排/待确认", 3120), cell("调度已安排班组车辆，等待施工确认", 6240)] }),
          new TableRow({ children: [cell("进行中", 3120), cell("施工班组已确认并正在执行SOP流程", 6240)] }),
          new TableRow({ children: [cell("已完成", 3120), cell("任务全部流程执行完毕", 6240)] }),
          new TableRow({ children: [cell("已取消", 3120), cell("任务被取消", 6240)] }),
        ]
      }),
      new Paragraph({ children: [new PageBreak()] }),

      h1("8. 通知公告与知识库"),
      h2("8.1 通知公告"),
      bullet("入口：首页通知列表或“我的”页面“通知公告”。", "bullets"),
      bullet("可按类型筛选：全部、系统、应急、任务。", "bullets"),
      bullet("列表显示标题、发布人、发布时间、类型标签。", "bullets"),
      bullet("左滑可标记已读，点击进入详情。", "bullets"),
      h2("8.2 行业知识库"),
      bullet("入口：首页行业知识列表。", "bullets"),
      bullet("显示知识标题、摘要、创建时间。", "bullets"),
      bullet("点击进入知识详情查看完整内容。", "bullets"),
      h2("8.3 帮助中心"),
      bullet("入口：首页或“我的”页面“帮助中心”。", "bullets"),
      bullet("按当前角色展示常见问题FAQ。", "bullets"),
      bullet("提供客服热线、电子邮箱、服务时间。", "bullets"),
      new Paragraph({ children: [new PageBreak()] }),

      h1("9. 常见问题"),
      h2("9.1 登录问题"),
      bullet("忘记密码：请联系管理员重置密码。", "bullets"),
      bullet("登录失败：请确认账号密码输入正确，区分大小写。", "bullets"),
      bullet("角色错误：请确认账号已绑定正确的登录端点。", "bullets"),
      h2("9.2 任务问题"),
      bullet("任务提交后无状态：请检查网络连接，或联系调度确认是否收到。", "bullets"),
      bullet("无法上传图片：请检查相册/相机权限是否已开启。", "bullets"),
      bullet("定位不准确：请检查手机定位服务是否开启。", "bullets"),
      h2("9.3 操作提示"),
      bullet("提交表单前请确认必填项已填写完整。", "bullets"),
      bullet("施工现场照片建议清晰、真实，便于后续验收和追溯。", "bullets"),
      bullet("任务执行过程中如遇异常，可通过“反馈问题”或电话联系调度。", "bullets"),
      h2("9.4 技术支持"),
      p("如遇到系统故障或其他问题，请联系技术支持团队获取帮助。"),
    ]
  }]
});

const outputDir = path.join(__dirname);
if (!fs.existsSync(outputDir)) fs.mkdirSync(outputDir, { recursive: true });

Packer.toBuffer(doc).then(buffer => {
  fs.writeFileSync(path.join(outputDir, "清道夫系统小程序操作说明书.docx"), buffer);
  console.log("文档生成成功：清道夫系统小程序操作说明书.docx");
});
