电子组装行业——金蝶云星空ERP与新核云MES集成案例

1. 方案场景

1.1 业务背景描述

某电子组装企业,采用 “多品种、小批量” 的生产模式,对物料追溯、BOM管理及业财一体化有极高要求。其生产执行层深度使用新核云 MES 进行精细化管理,企业资源计划层则使用金蝶云星空 ERP。

1.2 客户痛点

数据不同源,维护成本高: 物料、BOM等基础数据需在ERP和MES中分别维护,重复录入工作量大,且>极易出现两地数据不一致的情况,IT部门疲于奔命。
业务协同滞后: 工单、用料计划等业务单据依赖人工从ERP同步至MES,信息传递延迟且易出错,无法实现生产计划的快速下达与调整。
追溯链条断裂: ERP的批次/序列号管理策略无法直接穿透到生产现场,MES的丰富追溯数据(如供应商暗码、组件号)也难以回传至ERP,形成信息孤岛,质量追溯效率低下。

1.3 目标愿景

企业旨在通过系统集成,构建一套无缝衔接的数字化生产管理体系:
主数据统一:​ 实现物料、BOM等核心数据“一次创建,双向同步”,确保数据源唯一。
业务流自动:​ 生产工单及用料清单自动同步至MES,触发生产执行,打通计划与执行层。
追溯体系贯通:​ 建立从ERP到MES的完整正向与反向追溯链条,提升质量管控与客户响应能力。

2. 解决方案

2.1 方案总览

基于新核云开放平台,该方案为客户搭建了一条从金蝶云星空ERP到新核云MES的 自动化数据通道。通过>标准API接口实现基础数据同步,利用Webhook机制完成业务状态回传,构建了完整的双向数据流。该方案
完美实现了主数据的单向同步与业务单据的双向实时联动.

具体数据流如下图所示:

:red_exclamation_mark:注意:集成的时候 ERP 和 MES 的角色要分开。

2.2 方案优势

开箱即用,高效集成: 利用新核云开放平台提供的标准API与Webhook,无需从零开发,大幅降低集成复杂度和开发成本,缩短项目周期。
业务可配,灵活适配: 通过开放平台的配置能力,支持PE工程师、IT工程师、质量工程师等多角色协同参与MES生产基础数据维护,可灵活配置仓库、工序、质量方案等同步规则,轻松满足客户个性化的业务流程需求。
数据深度穿透,追溯无忧: 成功将ERP的物料追溯属性(批次/序列号)及行业特色字段(物料暗码、供应商暗码等)映射至MES自定义字段,构建了业界领先的深度追溯体系。
复杂业务处理能力强: 完美支持在制品改制单等复杂业务场景,能够处理多工序、多状态的在制品流转与改制需求,确保业务逻辑的完整性和准确性。

3. 集成方式

3.1 核心集成点

基础数据同步 业务单据流转
物料分类与库存单位 普通生产单全流程自动化(从创建到齐套分析再到计划排产)
物料信息库与物料编码 返工单特殊处理流程
BOM数据(从PLM到ERP再到MES) 在制品改制单复杂业务逻辑处理
仓库信息 生产工单状态同步与回传
供应商暗码与物料暗码

3.2 集成步骤

基础数据同步;

基础数据从金蝶云星空ERP向新核云MES单向同步,确保MES以ERP为唯一数据源头。同步过程由ERP端事件触发,通过调用新核云开放平台API完成。

  1. 物料同步:​

    • 触发条件:​ 金蝶云星空ERP中物料主数据发生创建、修改或审核通过事件。

    • 动作描述:​ ERP系统监听物料变化事件,自动调用新核云开放平台的物料相关 API,将物料信息(包括物料编码、名称、规格型号、库存单位、分类等)同步至MES。同步时需处理字段映射(如ERP的“物料编码”映射至MES的“物料号”)和单位换算。

    • 实现要点:​ 确保数据唯一性,避免重复同步;支持增量同步,通过时间戳或版本号管理变更。

  2. BOM(物料清单)同步:​

    • 触发条件:​ 金蝶云星空ERP中BOM数据审核通过或发生变更(BOM通常从PLM系统流转至ERP)。

    • 动作描述:​ ERP调用新核云开放平台的BOM API(如POST /api/boms),将BOM数据(包括父项物料、子项物料、用量、替代料信息等)同步至MES。同步时需处理多级BOM结构和版本控制。

    • 实现要点:​ 字段映射包括BOM编号、物料关系、损耗率;递归同步子项BOM,确保结构完整。

    以下是BOM数据同步的代码示例:

    // BOM数据校验和重复物料合并
    const itemMap = new Map();
    itemList.forEach((item) => {
      if (itemMap.has(item.code)) {
        itemMap.get(item.code).quantity += item.quantity;
      } else {
        itemMap.set(item.code, item);
      }
    });
    
    // 调用新核云BOM同步API
    const resp = await this.openApiService.request({
      url: '/api/open/v2/boms/sync',
      method: 'post',
      data: { body: { bomComponents: components } }
    });
    
  3. 其他基础数据同步:

    • 仓库信息同步: ERP中仓库创建或变更时,通过API同步至MES,确保仓库主数据一致。

    以下是仓库信息同步代码示例:

    // 获取车间仓库列表
    async getSystemWorkshopWarehouseList() {
      return await this.getWarehouseList({
        conditions: [
          { conditionType: 'FILTER', key: 'type', filter: ['WORK_SHOP'] }
        ]
      });
    }
    

业务单据流转;

业务单据涉及双向数据流,确保ERP与MES之间的业务协同。以下步骤覆盖生产单同步、状态回传及辅助单据集成,提供两种生产单同步方案以适应不同业务场景。

  1. 生产单同步:

    • 生产单同步支持两种方案,企业可根据业务实时性要求选择其一或组合使用。

    • 方案一:分步同步(先工单后用料清单)

      • 步骤1: 生产订单同步

        • 触发条件: 金蝶云星空ERP中生产订单创建。

        • 动作描述: ERP调用新核云开放平台的生产工单API,将生产订单基础数据(如单号、产品、计划数量、计划时间)首次同步至MES,在MES中生成对应的生产任务。

        • 实现要点: 工单同步后,MES自动进行齐套分析预备;字段映射需确保工单状态对应(如ERP的“已发布”映射至MES的“待生产”)。

        // 核心代码:创建/更新生产工单
        async upsert(data: WorkOrderCreateDto) {
          // 获取主工艺路线
          const routingList = await this.openApiService.request({
            url: '/api/public/basedata/routing/pageQuery',
            method: 'POST',
            data: { itemCodes: [data.itemCode] }
          });
          
          const masterRouting = routingList.data?.list?.find(v => !!v?.masterRouting);
          if (!masterRouting) {
            throw new BusinessException(`物料【${data.itemCode}】没有维护主工艺路线`);
          }
        
          // 构建工单参数
          const params = {
            ...data,
            routingCode: masterRouting.routingCode,
            planMaterials: data.planMaterials.map(item => {
              const planMaterial = planMaterialDict?.[item.itemCode];
              return {
                itemCode: item.itemCode,
                quantity: item.quantity,
                procedureCode: planMaterial?.procedureCode,
                // ...其他字段映射
              };
            })
          };
        
          // 调用新核云API创建工单
          await this.openApiService.request({
            url: '/api/open/v2/workOrders/upsert',
            method: 'POST',
            data: { body: params }
          });
        }
        
      • 步骤2: 用料清单同步

        • 触发条件: ERP中为上述生产订单生成详细的用料清单(领料计划)。

        • 动作描述: ERP再次调用新核云API(如工单更新接口),用用料清单明细(包括物料、用量、替代料)更新MES中已存在的对应生产任务,完善齐套信息。

        • 实现要点: 通过工单号关联两次调用,确保数据一致性;用料清单同步可触发MES的领料任务生成。

      • 适用场景: 适用于生产订单和用料清单分阶段生成的业务,实时性要求高,但需两次API调用。

      以下是示例代码:

      // 核心代码:计算物料消耗并创建领料/补料单
      async computeMaterial({ quantity, workOrderDetail }) {
        // 计算ERP需要的物料数量
        const mesPlanMaterial = workOrderDetail.planMaterials.map(v => ({
          ...v,
          erpQuantity: round((v.planQuantity / workOrderDetail.baseUnitPlanQty) * quantity, 6)
        }));
      
        // 获取ERP用料清单
        const erpPlanMaterial = await this.getPlanMaterial(workOrderDetail.number);
        
        // 区分领料单和补料单
        const feedRecords = mesPlanMaterial.filter(v => 
          erpPlanMaterialDict[v.item.code] && 
          !erpPlanMaterialDict[v.item.code]?.SelRePickedQty
        );
        
        const pickRecords = mesPlanMaterial.filter(v => 
          !erpPlanMaterialDict[v.item.code] || 
          erpPlanMaterialDict[v.item.code]?.SelRePickedQty
        );
      
        // 创建领料单
        if (feedRecords.length > 0) {
          const { params } = await this.getParams({
            records: feedRecords,
            type: 'SCLLD01_SYS' // 生产领料
          });
          await this.erpService.create({ formId: 'PRD_PickMtrl', data: params });
        }
      }
      
    • 方案二:一次性同步(工单与用料清单整合)​

      • 触发条件:​ ERP中生产订单及用料清单均已就绪。

      • 动作描述:​ ERP将生产单信息与用料清单整合为一个完整的数据包,通过一次API调用同步至MES,直接生成带齐套明细的生产任务。

      • 实现要点:​ 数据包需包含工单基本信息和用料明细;MES侧一次性处理齐套分析,减少交互次数。

      • 适用场景:​ 适用于生产数据准备完整的场景,简化流程,提升效率。

      // 核心代码:一次性同步工单和用料清单
      async upsert(data: WorkOrderCreateDto) {
        // 获取完整的工艺路线和物料信息
        const routingList = await this.openApiService.request(...);
        const masterRouting = routingList.data?.list?.find(v => !!v?.masterRouting);
        
        // 构建包含完整用料信息的数据包
        const params = {
          ...data,
          routingCode: masterRouting.routingCode,
          planMaterials: data.planMaterials.map(item => ({
            itemCode: item.itemCode,
            quantity: item.quantity,
            // 包含所有必要的用料信息
            consumeMaterialLimitType: planMaterial?.consumeMaterialLimitType === 'WORK_ORDER' ? 0 : 1,
            workOrderMaterialConsumeType: planMaterial?.consumeType === 'SCAN' ? 1 : 0,
            // ...其他完整字段
          }))
        };
      
        // 一次性API调用
        await this.openApiService.request({
          url: '/api/open/v2/workOrders/upsert',
          method: 'POST',
          data: { body: params }
        });
      }
      
企业可结合方案一和方案二,例如初始化时使用方案二批量同步,日常变更使用方案一实时同步。
  1. 生产工单状态同步与回传:
  • 触发条件: 新核云MES中生产工单状态发生变化(如开始生产、完工、暂停)。

  • 动作描述: 通过新核云开放平台的Webhook机制,订阅MES工单状态事件。当状态变化时,自动将状态信息(工单号、当前状态、更新时间)推送至金蝶云星空ERP,更新ERP工单状态。

  • 实现要点: 配置Webhook回调URL指向ERP系统;处理状态映射(如MES的“完工”对应ERP的“已完成”);支持复杂状态(如返工单)。

// 核心代码:Webhook事件处理
@Post('/node/datasync/webhook/handler')
async webhookHandler(@Body() body: WebhookDto) {
  let resp = { code: 200, message: '不在对接范围内' };
  
  // 生产入库事件(工单状态变更)
  if (body.businessType === 13 && 
      (body.data?.operationType === 'PRODUCE_IN' || 
       body.data?.operationType === 'PROCEDURE_QC_IN')) {
    resp = await this.appService.productionInHandler(body.data);
  }
  
  // 返回标准化响应
  res.status(resp?.code).send({
    status: resp?.code === 200 ? 1 : 0,
    code: resp?.code,
    message: resp?.message
  });
}
  1. 入库任务同步:

    • 触发条件: 新核云MES中生产完成,执行入库操作(如成品入库)。

    • 动作描述: MES调用新核云开放平台的API(如POST /api/inbound-tasks),将入库结果(入库单号、物料、数量、批次号)实时同步回ERP,更新ERP库存。

    • 实现要点: 确保入库单与ERP单据匹配;支持序列号或批次追溯。

    // 核心代码:生产入库处理
    async productionInHandler(data: InventoryTaskDto) {
      const { records = [] } = data;
      
      // 按生产单分组处理
      const groupProduction = values(groupBy(records, v => v.relativeOrderNumber));
      
      // 批量处理入库任务
      await this.openApiService.batchRequest(
        groupProduction.map((v, index) => () => 
          this.erpHandler(v, `${data.code}_${index + 1}`)
        )
      );
    }
    
    // ERP入库单创建
    async syncERPProductionIn({ records, code }) {
      const FDate = moment().format('YYYY-MM-DD HH:mm:ss');
      
      const newOrder = {
        formId: 'PRD_INSTOCK',
        data: {
          Model: {
            FBillNo: `${code}_${erpWorkOrderCode}`,
            FDate,
            FEntity: records.map(record => ({
              FMaterialId: { FNumber: record.itemCode },
              FRealQty: record.quantity,
              FLot: record.batchNumber ? { FNumber: record.batchNumber } : undefined,
              FSerialSubEntity: record.snRecords?.map(sn => ({
                FSerialNo: sn.snNumber
              }))
            }))
          }
        }
      };
      
      await this.erpService.create(newOrder);
    }
    
  2. 领料单集成:

    • 触发条件: 金蝶云星空ERP中生成领料单(基于生产工单),或新核云MES中生成生产领料任务。

    • 动作描述: 领料单从ERP同步至MES,但需确保MES中对应生产领料任务已存在。通常,在MES领料任务生成时,调用ERP API获取领料单信息;或ERP在领料单创建时调用MES API,但先验证任务存在。

    • 实现要点: 前提是MES生产工单已创建且齐套;字段映射包括领料单号、物料、数量;处理物料短缺异常。

    // 核心代码:领料单创建和同步
    async createTransferOrder({ inWarehouse, outWarehouse, records }, FBillNo?) {
      const params = {
        formId: 'STK_TransferDirect',
        data: {
          Model: {
            FBillNo,
            FBillTypeID: { FNUMBER: 'ZJDB01_SYS' },
            FDate: moment().format('YYYY-MM-DD HH:mm:ss'),
            FBillEntry: records.map(record => ({
              FMaterialId: { FNumber: record.itemCode },
              FUnitID: { FNumber: record.unit },
              FQty: record.quantity,
              FSrcStockId: { FNumber: record.outWarehouse },
              FDestStockId: { FNumber: record.inWarehouse }
            }))
          }
        }
      };
      
      await this.erpService.draft(params);
    }
    
  3. 其他业务单据集成:

    • 其他入库单同步: ERP端的采购入库等单据,通过API同步至MES的“其他入库”单据,逻辑类似入库任务同步。

    • 复杂业务处理: 对于在制品改制单等复杂场景,通过定制API调用处理多工序流转,确保业务逻辑完整。

    // 核心代码:复杂业务处理(如在制品改制)
    async handleComplexBusiness(data) {
      // 处理多工序流转
      const procedures = await this.getProcedures(data.workOrderId);
      
      // 确保改制前后物料批次关联
      const batchMapping = await this.createBatchAssociation(data);
      
      // 回传改制结果
      await this.syncModificationResult(data, batchMapping);
    }
    

3.4 开发者资源

本方案为新核云开放平台与主流ERP集成的典范,您可参考以下资源快速启动开发:

4. 客户价值总结

该集成方案的成功落地,为电子组装行业提供了系统集成的标准范式:
对客户而言: 实现了 “ERP计划- MES执行” 的高效闭环,消除了信息孤岛,提升了生产效率和数据准确性,为精益管理和数字化升级奠定了坚实基础。
对新核云开放平台而言: 验证了平台作为 “制造业系统连接器” 的强大能力,积累了与金蝶等国内头部ERP集成的宝贵经验,该方案可快速复用于同类客户。
对行业而言: 为多品种、小批量的离散制造企业提供了 低成本、高效益、快交付 的业财一体化最佳实践,极具借鉴和推广价值。

5. 方案咨询

:telephone_receiver: 如果您也正面临金蝶ERP与新核云MES集成,或与其他系统打通的挑战,新核云开放平台为您提供了成熟、可靠 的解决方案。

您是业务负责人/企业管理者?

  • 欢迎联系我们的解决方案专家,为您量身定制集成方案,评估业务价值。
  • 联系电话: +(86) 400-164-1521 | 邮箱: contact@xinheyun.com

您是开发者、技术经理或系统集成商?

  • 立即免费注册为新核云开发者,获取API密钥,探索所有开放能力,快速启动您的集成项目!
  • 欢迎前往 新核云社区——开放平台板块交流技术问题、分享集成心得!