/** * Generate S1 产销协同业务需求描述.docx * 严格按照模板 产销协同业务需求描述.docx 的格式: * 标题 → 文档信息 → (一)模块功能说明+业务描述 → ... */ const fs = require('fs'); const { Document, Packer, Paragraph, TextRun, HeadingLevel, AlignmentType, PageBreak, TableOfContents, convertInchesToTwip, TabStopType, TabStopPosition, BorderStyle, WidthType, ShadingType, Table, TableRow, TableCell } = 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, }); } function boldPara(text) { return normalPara(text, { bold: true }); } function bulletPara(text, opts = {}) { return new Paragraph({ children: [ new TextRun({ text: '• ', size: 21, font: FONT }), new TextRun({ text, size: 21, font: FONT, ...opts }), ], spacing: { after: 60, line: 340 }, indent: { left: convertInchesToTwip(0.3) }, }); } // 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 }, }); } // H5: 功能说明 / 业务描述 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 }, }); } // Image placeholder paragraph function imagePlaceholder(label) { return new Paragraph({ children: [new TextRun({ text: `【${label}截图】`, size: 18, font: FONT, italics: true, color: '999999' })], spacing: { before: 80, after: 80 }, alignment: AlignmentType.CENTER, }); } // 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: [ '产品设计管理模块用于在线管理新产品开发过程中的产品设计BOM(物料清单)和工艺路线信息。', '设计员可在系统中新建产品设计任务,录入BOM子表(子物料编码、单位用量、损耗率等)和工艺子表(产线选择、路线编码等),保存即生效。', '该模块采用直接保存模式,无审批流环节,简化设计操作流程,提升设计效率。', '产品设计数据通过MDP同步至数据中台,纳入KPI考核体系,监控设计周期、满足率和人效指标。', ], bizDesc: [ '设计员登录DOP系统,进入"产品设计管理"菜单,点击"添加"按钮新建产品设计任务。', '在任务主表中填写产品设计基本信息:选择成品物料编码,填写任务名称、计划完成日期、设计要求等必填字段。', '在BOM子表中逐行新增子物料信息:选择子物料编码后系统自动填入物料名称;填写单位用量和固定损耗率;支持多行物料录入。', '在工艺子表中逐行新增工艺路线信息:通过下拉框远程搜索选择产线(显示格式为"Line|Describe"),手动输入路线编码。', '填写完整后点击"保存"按钮,系统自动生成单据编号,数据即时生效,无需经过审批流程。', '已保存的设计记录可在列表中查看、编辑和删除;删除时关联的BOM和工艺子表数据同步删除。', ], }, { title: '订单评审管理', funcDesc: [ '订单评审管理模块实现销售订单的在线录入、查询、编辑和删除操作,是产销协同的订单入口。', '订单主流程(录入→评审→交期确认)无审批流,直接操作即可完成;仅当交期确认后需要修改时触发变更审批流。', '系统根据成品库存、在制工单和物料齐套等约束条件,对订单进行交期评估,给出预计交付日期。', '订单变更记录可追溯,变更次数自动累计,变更历史在订单交付Tab2(评审信息)中查看。', ], bizDesc: [ '销售/计划员登录DOP系统,进入"订单评审管理"菜单,点击"添加"按钮新建销售订单。', '在订单表单中录入客户信息、物料编码、订单数量、需求交期等基本信息,订单编号保存时自动生成。', '订单保存后进入"待评审"状态,计划员对订单执行交期评估:系统根据成品库存、在制工单和物料约束给出建议交期。', '计划员确认交期结果后执行"交期确认"操作,调用外部交期确认接口,确认成功后订单状态更新为"已确认",产能和物料资源同步锁定。', '交期确认后如需修改订单,必须发起变更申请并经过审批流;变更记录自动归档,变更次数累计。', '列表支持按订单号、客户、日期范围等条件筛选,支持对订单进行编辑和删除操作。', ], }, { title: '订单交付管理', funcDesc: [ '订单交付管理模块以订单行(明细)为粒度,集中展示每笔销售订单的交付状态。', '通过8个Tab页签实现从"订单接收"到"成品发运"的全链路履约追踪:订单信息(Tab1)、评审与变更(Tab2)、排程(Tab3)、物料需求(Tab4)、采购(Tab5)、备料(Tab6)、生产(Tab7)、入库发运(Tab8)。', '交付列表数据来源于数据中台宽表层dwd_ship_trans,确保与看板KPI数据口径一致。', '跨模块Tab(排程/采购/备料/报工IQC/FQC入库)结构已就绪,待S2/S3/S4/S5/S6/S7模块补齐后自动填充数据。', ], bizDesc: [ '计划员/物流人员进入"订单交付管理"菜单,查看交付列表,支持按订单号、客户、交付状态、日期范围等条件筛选。', '点击列表中的订单行,进入交付详情页面,通过8个Tab页签查看该订单的全链路履约状态。', 'Tab1展示订单基础档案信息(订单编号、客户、物料、状态、审核人等),数据来源mdp_std_so标准层。', 'Tab2展示交期评估结果和订单变更历史记录,数据来源dwd_requirement_examine_detail及mdp_stg_so变更数据。', 'Tab4展示BOM需求展开、库存占用、缺料分析和替代料信息,数据来源dwd_requirement_examine_detail。', 'Tab8展示成品入库和发运记录,数据来源mdp_std_ship_trans。', '交付状态实时反映订单从"待评审→已评审→排产中→采购中→生产中→已入库→已发运"的完整流转过程。', ], }, { title: '订单发货管理', funcDesc: [ '订单发货管理模块实现发货单和ASN(预先发货通知)的在线录入、查询、编辑和删除管理。', '通过销售单号关联将发货单与销售订单联动,发货计划覆盖率和发货达成率自动计算并纳入KPI考核。', '发货单号保存时自动生成(格式为SH+日期+流水号),客户和销售单号支持远程搜索选择。', '发货计划和ASN发货数据通过MDP同步至数据中台dwd_ship_trans宽表,与订单交付数据联动。', ], bizDesc: [ '物流/仓管人员进入"订单发货管理"菜单,查看发货单列表,支持按发货单号、销售单号、客户、日期范围筛选。', '点击"新建发货单"按钮,选择关联的销售单号(下拉搜索,回显格式为"BillNo|客户名"),选择客户,填写发货基本信息。', '在发货明细子表中逐行新增物料信息:选择物料编码后自动填入物料名称,填写发货数量和批次信息;至少保留一行。', '保存后发货单号自动生成,数据进入运行时表ShippingPlan,通过MDP同步至数据中台。', 'ASN发货记录单独管理:录入ASN发货单号、物料、发货数量和发货日期,数据同步至mdp_std_ship_trans。', '已发货的发货单不可删除,防止数据丢失;发货计划覆盖率和发货达成率自动纳入KPI统计。', ], }, { title: '合同评审管理', funcDesc: [ '合同评审管理模块实现客户合同的在线评审管理,与销售订单评审协同运作。', '通过审批流(审批流类型:CONTRACT_REVIEW)管控合同评审的多级审核流程,支持同意和驳回操作。', '合同评审数据纳入KPI考核体系,自动计算合同评审周期(S1_L2_001)、满足率(S1_L2_002)、人效(S1_L2_003)及各审批节点耗时(L3/L4)。', ], bizDesc: [ '商务人员进入"合同评审管理"菜单,查看合同评审列表,支持多条件筛选查询。', '点击"新建合同评审"按钮,录入合同基本信息:合同编号、客户名称、签订日期、合同金额等。', '填写完整后点击"提交审批",合同进入审批流(CONTRACT_REVIEW类型),由配置的审批人进行多级审核。', '审批人在审批列表中查看待审合同,可查看合同详情后执行"同意"或"驳回"操作。', '审批通过后合同状态更新,KPI数据自动计算:评审周期(从提交到通过的总耗时)、满足率(通过占比)、各节点耗时。', '合同评审数据通过MDP作业同步至数据中台贴源层mdp_stg_so,KPI计算直接消费贴源层数据。', ], }, { title: '计划联动', funcDesc: [ '计划联动模块实现销售订单、发货计划、ASN发货等业务数据的联动整合。', '通过MDP作业(S1_MDP_SYNC_TRANSFORM)将多源数据汇聚到dwd_ship_trans宽表,确保各页面数据口径一致。', '提供手动刷新机制,业务人员可随时触发全量同步转换,立即获取最新联动数据。', '联动数据覆盖订单(crm_seorder)、发货计划(ShippingPlan)、ASN(ASNBOLShipper)和计划联动(LinkagePlan)四类业务对象。', ], bizDesc: [ '计划员进入"计划联动"菜单,查看各业务对象的联动状态列表(联动成功/未联动/数据异常三种状态)。', '点击"刷新"按钮,触发S1_MDP_SYNC_TRANSFORM全量同步转换作业,批次格式为S1_MDP_FULL_yyyyMMddHHmmss。', 'MDP作业依次执行:STG贴源层同步→STD标准化转换→DWD宽表构建→KPI指标计算,全链路自动完成。', '刷新完成后返回最新联动结果:联动达成率、数据一致性状态及各环节处理行数和耗时。', '系统管理员可通过MDP监控页面查看作业日志(mdp_transform_run_log)和同步日志(mdp_sync_log),定位异常。', '计划联动达成率(S1_L2_015)自动计算,反映联动成功的业务对象占比。', ], }, { title: '需求明细核验', funcDesc: [ '需求明细核验模块展示销售订单的BOM需求展开与核验结果,帮助计划人员确认物料需求数量和到货时间的准确性。', '核验数据来源于运行时表b_examine_result,通过MDP标准化后进入dwd_requirement_examine_detail,只取最新成功批次数据。', '核验内容包括:物料编码、BOM编码、需求数量、缺料数量、替代料方案、物料满足时间等。', '核验结果同时服务于订单交付Tab2(评审信息)和Tab4(物料需求),实现跨页面数据共享。', ], bizDesc: [ '计划员进入"需求明细核验"菜单,通过订单号、物料编码、核验状态等条件筛选查询核验列表。', '在核验列表中查看每条订单行的BOM需求展开结果:对应BOM编码下的子物料需求明细。', '重点关注缺料数量和物料满足时间:系统自动计算当前库存与需求的差额,给出预计满足日期。', '如存在替代料方案,可在核验明细中查看建议替代物料信息。', '核验数据自动同步至订单交付详情页的Tab2和Tab4,无需重复查询。', ], }, { title: '工单下达', funcDesc: [ '工单下达模块管理生产工单的下达操作,是产销协同到制造执行(MES)的衔接环节。', '工单逐单下达(非批量),每行操作列独立"工单下达"按钮,弹出下达表单填写开工日期和生产批号后确认。', '下达前必须执行物料齐套检查(调用外部资源审查服务)和物料需求同步(生成MRP物料需求计划),确保物料准备到位。', '工单下达后MES系统可见,进入S6生产执行阶段;工单状态支持全程跟踪(待下达→已下达→生产中→已完成→已关闭)。', ], bizDesc: [ '计划员/调度人员进入"工单下达"菜单,通过工单号、物料编码、开工日期、状态等条件筛选查询工单池列表。', '点击工具栏"物料齐套检查"按钮,调用外部资源审查服务,检查各工单的物料齐套状态,齐套结果更新到列表的"物料齐套"列。', '点击工具栏"生成物料需求"按钮,同步生成MRP物料需求计划,确保工单所需物料已纳入供应计划。', '物料齐套检查和MRP生成通过后,在列表中点击目标工单行的"工单下达"按钮,弹出下达表单。', '在下达表单中填写开工日期和生产批号(系统自动获取下一批次编号),点击确认后工单状态变更为"已下达"。', '已下达工单不可重复下达(前端按钮置灰+后端校验双重保障);工单下达后自动同步至MES系统。', ], }, { title: '产销协同看板与KPI', funcDesc: [ '产销协同看板为管理层和业务人员提供S1模块的核心KPI可视化监控面板。', '采用DynamicModuleDashboard动态看板组件(module-code="S1"),通过L1/L2/L3/L4多层级指标体系全面监控产销协同健康度。', 'L1核心指标:订单及时交付率、订单交付周期、订单评审完成率、成品库存周转天数。', 'L2分解指标:覆盖合同评审(3项)、产品设计(3项)、交期评审(3项)、发货联动(3项)共12项。', 'L3/L4节点指标:合同评审各审批节点的周期和通过率,支持逐层下钻分析。', '支持按客户维度筛选过滤,灵活下钻分析,趋势图表展示周期变化规律。', ], bizDesc: [ '管理层/计划员进入"S1产销协同看板"菜单,系统自动加载L1核心KPI指标卡片(4项),直观展示当前产销协同健康度。', '通过客户下拉框选择特定客户维度,看板所有指标数据自动按该客户过滤刷新。', '点击L1指标卡片可下钻至L2分解指标详情,进一步点击L2指标可查看L3节点指标分布。', 'L4层级为审批节点明细指标(如合同评审各节点通过率和耗时),支持流程优化分析。', '趋势图表展示各指标的历史变化规律,支持按日/周/月周期切换查看。', 'KPI数据通过MDP作业S1_MDP_SYNC_TRANSFORM定时或手动刷新,指标定义存储在ado_smart_ops_kpi_master,计算结果存储在ado_s9_kpi_value_l1~l4_day。', ], }, { title: '数据中台架构', funcDesc: [ 'S1产销协同模块采用Ai-DOP统一数据中台分层架构(STG→STD→DWD→KPI),确保前端页面、看板展示和KPI考核的数据口径一致。', '贴源层(STG/mdp_stg_*)保留源系统原始数据;标准层(STD/mdp_std_*)统一字段口径并清洗脏数据;宽表层(DWD/dwd_*)构建面向页面和KPI的主题事实表;指标层(KPI/ado_s9_kpi_value_*)按天存储L1-L4指标值。', 'MDP作业(S1_MDP_SYNC_TRANSFORM)负责全链路同步转换,支持手动触发和未来扩展定时调度,作业日志可观测、异常可追溯。', ], bizDesc: [ 'S1模块的业务数据(销售订单、合同评审、产品设计、发货计划、ASN发货、计划联动、需求核验等)通过MDP作业自动同步至数据中台各层。', '订单/评审/设计链路:crm_seorder等运行表→mdp_stg_so贴源→mdp_std_so标准→dwd_ship_trans/dwd_requirement_examine_detail宽表→KPI计算。', '发货/ASN/联动链路:ShippingPlan等运行表→mdp_stg_ship_trans贴源→mdp_std_ship_trans标准→dwd_ship_trans宽表→KPI计算。', '计划员可通过计划联动页面的"刷新"按钮手动触发全量同步;系统管理员通过MDP监控页面查看作业执行状态和处理日志。', '页面查询统一消费DWD/KPI层数据,避免直接访问运行时表,确保数据口径一致和查询性能优化。', ], }, { title: '权限管理汇总', funcDesc: [ 'S1产销协同模块涉及以下核心角色和权限:', '销售/客服专员:查看销售订单列表和订单交付列表;新建/编辑/删除订单;发起订单变更申请。', '计划工程师:查看和操作订单评审、工单下达、计划联动、需求核验;执行交期确认;查看KPI看板。', '商务人员:新建/编辑合同评审;提交审批;查看订单交付。', '设计员:新建/编辑/删除产品设计任务;录入BOM和工艺子表;保存操作。', '物流/仓管:新建/编辑/删除发货单和ASN发货单;管理发货明细行;查看订单交付。', '审批人:审核订单变更申请和合同评审的审批流。', '管理层:查看S1看板全部指标。', '系统管理员:管理用户角色权限;监控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-S1-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\\S1产销协同业务需求描述.docx'; const tempPath = 'd:\\DEMONET\\doc\\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); });