/** * Generate S4 采购执行业务需求描述.docx * 严格按照 S1 产销协同业务需求描述.docx 的格式: * 标题 → 文档信息 → 目录 → (一)模块功能说明+业务描述 → ... */ const fs = require('fs'); const { Document, Packer, Paragraph, TextRun, HeadingLevel, AlignmentType, PageBreak, TableOfContents, convertInchesToTwip, } = require('docx'); const FONT = '微软雅黑'; // ── 辅助函数 ── function empty() { return new Paragraph({ spacing: { after: 80 }, children: [] }); } function pageBreak() { return new Paragraph({ children: [new PageBreak()] }); } function normalPara(text, opts = {}) { return new Paragraph({ children: [new TextRun({ text, size: 21, font: FONT, ...opts })], spacing: { after: 100, line: 360 }, indent: opts.indent ? { left: convertInchesToTwip(opts.indent) } : undefined, }); } // H2: (一) 供应商交货管理 function sectionHeading(text) { return new Paragraph({ children: [new TextRun({ text, bold: true, size: 28, font: FONT })], heading: HeadingLevel.HEADING_2, spacing: { before: 400, after: 200 }, }); } // H3: 功能说明 / 业务描述 function subHeading(text) { return new Paragraph({ children: [new TextRun({ text, bold: true, size: 22, font: FONT })], heading: HeadingLevel.HEADING_3, spacing: { before: 200, after: 100 }, }); } // Title paragraph function titlePara(text) { return new Paragraph({ children: [new TextRun({ text, bold: true, size: 36, font: FONT, color: '1F4E79' })], alignment: AlignmentType.CENTER, spacing: { after: 300 }, }); } function docInfoPara(text) { return new Paragraph({ children: [new TextRun({ text, size: 21, font: FONT })], spacing: { after: 40 }, bullet: { level: 0 }, }); } // ═══════════════════════════════════════════════════ // 各模块业务需求描述数据 // ═══════════════════════════════════════════════════ const CN_NUM = ['', '一', '二', '三', '四', '五', '六', '七', '八']; const modules = [ { title: '供应商交货管理', funcDesc: [ '供应商交货管理模块管理采购订单下达后的供应商交货执行过程,通过交货计划发布驱动供应商交期回复和发货单生成。', '采购跟单员可从MDP同步的交货计划中勾选发布至供应商,要求所选记录属于同一供应商,支持"按计划日期回复"(批量)和"回复交期"(手动)两种交期回复方式。', '支持基于交货记录在弹窗中嵌入发货单表单,一键生成发货单,实现"发布→回复→发货单"全流程在单个页面内完成。', '全链路状态跟踪覆盖在途、在检、入库各阶段,支持多维度筛选、排序和列设置(20个字段自定义显示)。', ], bizDesc: [ '采购跟单员登录DOP系统,进入"S4采购执行→供应商交货管理"菜单,查看交货计划列表。', '从MDP同步的交货计划中勾选目标记录(须属同一供应商),点击"发布"按钮将交货计划发布至供应商。', '供应商收到交货计划后进行交期回复:采购跟单员可选择"按计划日期回复"进行批量快速回复,或选择"回复交期"手动指定单个日期。', '交期回复完成后,采购跟单员勾选已回复的交货记录,点击"生成发货单",在嵌入式弹窗中填写发货单信息并确认生成。', '系统自动同步在途/在检/入库状态,采购跟单员可在列表中实时跟踪每条交货记录的当前状态。', '列表支持按供应商、物料、日期范围等多条件筛选,支持CSV导出;交货数据通过MDP同步至SRM系统供供应商查看。', ], }, { title: '供应商发货单', funcDesc: [ '供应商发货单模块管理从交货管理生成的发货单,覆盖从发货单生成到供应商发货、入库关联的全链路操作。', '发货单仅由交货管理的"生成发货单"操作产生,不支持手动独立创建,确保数据来源的一致性和可追溯性。', '支持标签生成和打印功能,基于发货单信息自动生成物流标签(含物料编码、数量、供应商等关键信息),打印后粘贴于货物外包装用于物流识别。', '发货单数据通过SupplierShipment表与ERP/SRM双向同步,入库数据自动关联发货单并更新状态。', ], bizDesc: [ '采购跟单员在交货管理页面勾选交货记录后一键生成发货单,发货单自动进入供应商发货单列表。', '采购跟单员进入"S4采购执行→供应商发货单"菜单,查看发货单列表,支持按供应商、物料、日期等条件筛选。', '基于发货单信息点击"生成标签"按钮,系统自动生成包含物料编码、数量、供应商等关键信息的物流标签。', '上传发货单相关附件(签收单、运输单、质检报告等),支持多格式附件上传。', '打印物流标签粘贴于货物外包装,供应商按发货单要求进行实物发货。', '采购跟单员打印正式发货单据作为运输和收货凭证;收货数据入库后系统自动关联发货单并更新状态。', ], }, { title: '采购退货单', funcDesc: [ '采购退货单模块处理来料检验不合格后的退货流程,管理退货单据的创建、出库和状态跟踪。', '退货单必须关联原始采购订单和不合格IQC检验记录,确保退货流程的可追溯性。', '退货单状态生命周期管理:新建→已出库→已完成,顺序流转不可跳转,已出库的退货单不可删除。', '退货出库时自动校验库存数量充足,出库后自动扣减库存并同步至ERP系统。', ], bizDesc: [ '质量管理员在IQC来料检验中判定不合格,触发退货流程。', '质量管理员进入"S4采购执行→采购退货单"菜单,点击"新建退货单",基于不合格判定创建退货单,系统自动关联原始采购订单和检验记录。', '退货单创建后状态为"新建",质量管理员填写退货原因、退货数量等信息后保存。', '仓库管理员在退货单列表中执行"退货出库"操作,系统校验库存数量充足后执行出库,自动扣减库存数据,退货单状态更新为"已出库"。', '退货处理完成后,退货单状态自动更新为"已完成";退货数据可关联至供应商绩效评估。', '采购经理可在列表中查看所有退货单记录,支持按供应商、物料、退货原因、日期范围等条件筛选。', ], }, { title: 'IQC退货查询', funcDesc: [ 'IQC退货查询模块提供只读的退货历史查询功能,面向质量管理人员查看IQC检验不合格后的退货处理记录。', '展示退货详情,包括检验结果、不合格原因、处理方式等完整信息,支持按检验单号、物料编码、日期范围检索。', '该页面为只读查询视图,不支持增删改操作,确保质量记录的完整性和不可篡改性。', '每条退货记录可关联到原始IQC检验单和采购订单,实现完整的质量追溯链路。', ], bizDesc: [ '质量管理员进入"S4采购执行→IQC退货查询"菜单,查看IQC退货查询列表。', '通过检验单号、物料编码、日期范围等条件筛选查询退货记录。', '在列表中查看每条退货记录的详情:IQC检验结果、不合格原因、退货处理方式、退货数量等。', '退货记录自动关联原始采购订单和供应商信息,支持供应商质量评级分析。', '采购经理和仓库管理员可查看退货查询记录,了解退货处理进度和结果。', ], }, { title: '采购执行看板主页', funcDesc: [ '采购执行看板主页通过可视化看板展示S4采购执行四大L1核心指标:物料交货周期(S4-L1-A)、物料交货满足率(S4-L1-B)、物料采购人效(S4-L1-C)、采购在途周转(S4-L1-D)。', '采用"双面板"设计——左侧"物料采购执行"按单品项展示KPI明细,右侧"供应商交付绩效"按供应商维度展示交付表现。', '每个指标配有达成等级标签(优秀/良好/关注/预警),直观反映绩效水平,帮助管理层快速识别问题。', '支持按日期、产品、订单号、产线、供应商、采购单号、物料等多维度筛选,左右面板联动更新;支持导出报告和运营指标建模。', ], bizDesc: [ '采购经理登录DOP系统,进入"S4采购执行→采购执行看板主页"菜单,系统自动加载四大L1核心KPI指标卡片。', '左侧"物料采购执行"面板按单品项展示KPI明细,包含指标名称、计算公式和达成等级标签。', '右侧"供应商交付绩效"面板按供应商维度展示交付表现,帮助识别优质和问题供应商。', '通过日期、产品、订单号、产线、供应商等筛选条件进行多维分析,左面板筛选条件变更时右面板数据同步更新。', '点击"导出报告"按钮将看板当前筛选条件下的分析结果导出为报告文件。', 'KPI数据通过MDP作业S4_MDP_SYNC_TRANSFORM定时或手动刷新,指标定义存储在ado_smart_ops_kpi_master,计算结果存储在ado_s9_kpi_value_l1~l4_day。', ], }, { title: '供应商欠料看板', funcDesc: [ '供应商欠料看板提供未来15天(含当日D0)的供应商欠料滚动预测视图,帮助采购团队提前识别和应对缺料风险。', '基于WorkOrdDetailTotalKB宽表通过MRP计算工单物料齐套情况,预测未来D0~D14共15天各周期的供应缺口。', '15天日期列自动计算生成,日期变化时列自动滚动更新;右侧展示每日欠料数量,直观反映缺料趋势。', '支持手动刷新执行实时缺料计算,页面不自动刷新;支持按供应商维度筛选,快速定位责任供应商。', ], bizDesc: [ '采购跟单员进入"S4采购执行→供应商欠料看板"菜单,系统从WorkOrdDetailTotalKB宽表加载工单需求/BOM/库存/在途数据。', '系统自动计算D0(今日)~D14共15天的滚动欠料预测,15天日期列自动生成显示。', '在看板列表中查看各物料在未来15天内的每日欠料数量,重点关注欠料严重的物料和供应商。', '通过供应商维度筛选,快速定位责任供应商的欠料情况;支持自定义显示/隐藏15天日期列及基础信息列。', '点击"刷新"按钮执行实时欠料计算,获取最新的工单需求、库存和在途数据后重新计算欠料预测。', '采购经理可查看和导出欠料预测日报,按供应商统计历史欠料趋势,为供应商管理决策提供数据支持。', ], }, { title: '数据中台架构', funcDesc: [ 'S4采购执行模块的数据基础依赖于MDP数据中台,采用统一分层架构(STG→STD→DWD→KPI),负责从ERP、SRM和IQC等外部系统抽取、清洗和转换采购订单、交货计划、收货数据和检验记录。', '贴源层(STG/mdp_stg_*)保留源系统原始数据;标准层(STD/mdp_std_*)统一字段口径并清洗脏数据;宽表层(DWD/dwd_*)构建面向页面和KPI的主题事实表;指标层(KPI/ado_s9_kpi_value_*)按天存储L1-L4指标值。', 'MDP作业(S4_MDP_SYNC_TRANSFORM)负责全链路同步转换,支持Cron定时调度和手动触发,作业日志可观测、异常可追溯。', '核心数据表包括:srm_polist_ds(采购订单交付计划)、SupplierShipment(发货单)、PurchaseReturnOrder(退货单)、IQCReturnQuery(退货查询视图)、WorkOrdDetailTotalKB(欠料宽表)。', ], bizDesc: [ 'S4模块的业务数据(交货计划、发货单、退货单、IQC检验记录等)通过MDP作业自动同步至数据中台各层。', '交货管理链路:ERP采购订单→mdp_stg_po贴源→mdp_std_po标准→srm_polist_ds/SupplierShipment宽表→交货页面。', '退货管理链路:IQC检验结果→mdp_stg_iqc贴源→mdp_std_iqc标准→PurchaseReturnOrder/IQCReturnQuery宽表→退货页面。', '看板/KPI链路:srm_polist_ds/ReceivingData/WorkOrdDetailTotalKB→DWD关联计算→ado_s9_kpi_value_*指标层→看板消费。', '页面查询统一消费DWD/KPI层数据,避免直接访问运行时表,确保数据口径一致和查询性能优化。', ], }, { title: '权限管理汇总', funcDesc: [ 'S4采购执行模块涉及以下核心角色和权限:', '采购跟单员:增删改查交货管理、发货单;发布/交期回复/生成发货单/关闭/导出;查看欠料看板。', '采购经理:查看所有模块;查看采购执行看板和管理KPI;导出报告;指标建模。', '质量管理员:增删改查采购退货单;查看IQC退货查询全部记录。', '仓库管理员:查看交货管理、发货单、退货单;执行退货出库操作。', '物料计划员:查看供应商欠料看板(了解缺料预测)。', '供应链经理:查看采购执行看板和供应商欠料看板。', 'IT运维人员:查看MDP运行监控;监控同步任务状态。', '工厂厂长/总经理:查看采购执行看板全部指标。', ], }, ]; // ═══════════════════════════════════════════════════ // 生成文档 // ═══════════════════════════════════════════════════ function buildDocument() { const sections = []; // ── 封面/标题 ── sections.push(empty(), empty(), empty(), empty()); sections.push(titlePara('采购执行业务需求描述')); sections.push(empty()); // ── 文档信息 ── const infoItems = [ '文档作者:彭熙玉', '创建日期:2026-06-08', '更新日期:2026-06-08', '文档编号:DOP-S4-REQ-001', '当前版本:V1.0', ]; infoItems.forEach(item => sections.push(docInfoPara(item))); sections.push(empty(), empty()); // ── 目录 ── sections.push(pageBreak()); sections.push(new Paragraph({ children: [new TextRun({ text: '目录', bold: true, size: 28, font: FONT })], heading: HeadingLevel.HEADING_2, spacing: { before: 200, after: 300 }, })); sections.push(new TableOfContents('目录', { headingStyleRange: '2-3', hyperlink: true, })); sections.push(new Paragraph({ children: [new TextRun({ text: '(如目录未显示,请在 Word 中右键此处 → 更新域)', size: 18, font: FONT, italics: true, color: '888888' })], spacing: { before: 40, after: 200 }, })); // ── 各功能模块 ── for (let i = 0; i < modules.length; i++) { const mod = modules[i]; sections.push(pageBreak()); // 章节标题:(一) 供应商交货管理 sections.push(sectionHeading(`(${CN_NUM[i + 1]})${mod.title}`)); // 功能说明 sections.push(subHeading('功能说明')); (mod.funcDesc || []).forEach(desc => sections.push(normalPara(desc))); // 业务描述 if (mod.bizDesc && mod.bizDesc.length) { sections.push(subHeading('业务描述')); mod.bizDesc.forEach(desc => sections.push(normalPara(desc))); } } return sections; } // ═══════════════════════════════════════════════════ // 主流程 // ═══════════════════════════════════════════════════ async function main() { const sections = buildDocument(); const doc = new Document({ styles: { default: { document: { run: { font: FONT, size: 21 } } } }, sections: [{ properties: { page: { margin: { top: convertInchesToTwip(0.8), bottom: convertInchesToTwip(0.8), left: convertInchesToTwip(1.2), right: convertInchesToTwip(1.2) } } }, children: sections, }], }); const buffer = await Packer.toBuffer(doc); const outPath = 'd:\\DEMONET\\doc\\S4采购执行业务需求描述.docx'; const tempPath = 'd:\\DEMONET\\doc\\s4_req_temp.docx'; fs.writeFileSync(tempPath, buffer); try { fs.unlinkSync(outPath); } catch(e) {} try { fs.renameSync(tempPath, outPath); console.log(`Renamed to: ${outPath}`); } catch(e) { console.log(`Generated: ${tempPath}`); } console.log(`Size: ${(buffer.length / 1024).toFixed(1)} KB`); } main().catch(err => { console.error('Error:', err); process.exit(1); });