| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- /**
- * 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); });
|