Fxiaoke Developer Manual Fxiaoke Developer Manual
  • APL Development Manual
  • PWC Development Manual
  • OpenAPI Documentation
APL Code Introduction
API Reference
Development Tools
Release Notes
  • 简体中文
  • English
APL Code Introduction
API Reference
Development Tools
Release Notes
  • 简体中文
  • English
  • Getting Started

  • APL Function Open Scenarios

  • APL Class Open Scenarios

    • Common Library

    • Electronic Signature

    • Authentication Provider

    • Available Business Types

    • Object Controller Plugin

    • Event Listener

    • Object Export Plugin

    • ERP Integration Platform

      • 1.Overview
      • 2.Configuration Steps
      • 3.Groovy Code Examples
      • 4.FAQ
    • Field Service Type Function Validation

    • FMCG Order Business Plugin

    • Object Business Handler

    • Online Documentation

    • Custom Model

    • Environment Deployment

Groovy Code Example

class ERPIntTestVariable implements IntegrationStreamSyncPlugin {

    /**
     * Pre-sync function supporting data filtering
     */
    @Override
    IntegrationStreamSync.BeforeSyncResult executeBeforeSync(FunctionContext context, IntegrationStreamSync.BeforeSyncArg arg) {
        Integer sourceEventType = arg.getSourceEventType() // Source system trigger event - deprecated, do not use

        String tenantId = arg.getSourceTenantId() // Enterprise ID
        String sourceObjectApiName = arg.getSourceObjectApiName() // Source system object apiName
        String destObjectApiName = arg.getDestObjectApiName() // Target system object apiName
        ErpObjectData objectData = arg.getObjectData() // Source system main object field information
        Map<String, List<ErpObjectData>> details = arg.getDetails() // Source system sub-object information key: sub-object apiName value: sub-object field information list
        String sourceDataId = arg.getSourceDataId() // Source system data ID, only available for crm->erp direction

        String name = objectData.getName() // Source system object data primary attribute
        def value = objectData["property"] // Get corresponding property value

        // Return null means no modification
//        return null

        def data = new IntegrationStreamSync.BeforeSyncData();
        data.setIsExec(true) // When false, data will be filtered and not synchronized
        data.setIsCover(true) // When not set or false, source data won't be modified
        data.setObjectData(null) // Replace source data, null means no replacement for main/sub objects. To only replace sub-objects, set data.setObjectData(objectData)
        data.setDetails(null) // Replace sub-object information, null means no replacement key: sub-object apiName value: sub-object information list

        def result = new IntegrationStreamSync.BeforeSyncResult()
        result.setCode("0") // Return status code (0 means success, others mean failure)
        result.setMessage("success") // Error message
        result.setData(data)
        return result
    }

    /**
     * Mid-sync function: before writing to target system
     * After execution, only mapped values modified in the function will change; enterprise ID and object apiName remain unchanged.
     */
    @Override
    IntegrationStreamSync.DuringSyncResult executeDuringSync(FunctionContext context, IntegrationStreamSync.DuringSyncArg arg) {
        String tenantId = arg.getSourceTenantId() // Enterprise ID
        String sourceObjectApiName = arg.getSourceObjectApiName() // Source system object apiName
        String destObjectApiName = arg.getDestObjectApiName() // Target system object apiName
        ErpObjectData objectData = arg.getObjectData() // Target system main object field information
        Map<String, List<ErpObjectData>> details = arg.getDetails()
        // Target system sub-object information, only available for create action key: sub-object apiName value: sub-object field information list
        Integer destEventType = arg.getDestEventType() // Target system action 1: create 2: update 3: invalidate

        // Return null means no modification
//        return null
        String name = objectData.getName() // Target system object data primary attribute
        def value = objectData.get("property") // Get corresponding property value

        ErpObjectData.ErpExtendData masterExtendData = objectData.getOrCretaErpExtendData(); // Add extended values
        masterExtendData.setRemoveFields(["field1","field2"]) // Set fields to be removed
        masterExtendData.setAddData(["field3": "value3", "field4": "value4"]) // Set new data to be added

        def data = new IntegrationStreamSync.DuringSyncData()
        data.setObjectData(arg.getObjectData()) // Replace main object field information, null means no replacement for main/sub objects. To only replace sub-objects, set data.setObjectData(objectData)
        data.setDetails(arg.getDetails()) // Replace sub-object field information, null means no replacement key: sub-object apiName value: sub-object field information list

        data.setDetailCover(true); // When true, returned details will override sub-object data

        def result = new IntegrationStreamSync.DuringSyncResult()
        result.setCode("0") // Return status code (0 means success, others mean failure)
        result.setMessage("success") // Error message
        result.setData(data)
        return result
    }

    /**
     * Post-sync function, data synchronization won't be affected
     */
    @Override
    IntegrationStreamSync.AfterSyncResult executeAfterSync(FunctionContext context, IntegrationStreamSync.AfterSyncArg arg) {
        Integer sourceEventType = arg.getSourceEventType() // Source system trigger event - deprecated, do not use

        String tenantId = arg.getSourceTenantId() // Enterprise ID
        String sourceObjectApiName = arg.getSourceObjectApiName() // Source system object apiName
        String destObjectApiName = arg.getDestObjectApiName() // Target system object apiName
        String sourceDataId = arg.getSourceDataId() // Source system data ID, only available for crm->erp direction
        ErpObjectData objectData = arg.getObjectData() // Target system main object field information
        Map<String, List<ErpObjectData>> details = arg.getDetails()
        // Target system sub-object information, only available for create action key: sub-object apiName value: sub-object field information list
        Integer destEventType = arg.getDestEventType() // Target system action 1: create 2: update 3: invalidate
        CompleteDataWriteMqData writeData = arg.getCompleteDataWriteResult() // Target data synchronization result
        int code = writeData.getErrCode() // 0 means success, others are error codes returned by failed APIs
        String msg = writeData.getErrMsg() // Error message returned by failed APIs
        Integer destTenantType = writeData.getDestTenantType() // Target system 1: Fxiaoke CRM 2: ERP
        CompleteDataWriteMqData.WriteResult writeResult = writeData.getWriteResult() // Main data synchronization result
        int errCode = writeResult.getErrCode() // Main data result (0 means success, others are error codes returned by failed APIs)
        String errMsg = writeResult.getErrMsg() // Error message returned by failed main data operations
        SimpleSyncData simpleSyncData = writeResult.getSimpleSyncData() // Brief synchronization data information
        String destDataId = simpleSyncData.getDestDataId() // Target system data ID
        String destDataName = simpleSyncData.getDestDataName() // Target system data primary attribute
        Map<String, ErpObjectData> destDetailSyncDataIdAndDestDataMap = writeResult.getDestDetailSyncDataIdAndDestDataMap()
        // Target object details
        List<CompleteDataWriteMqData.WriteResult> results = writeData.getDetailWriteResults() // Detail data synchronization results

        String name = objectData.getName() // Target system object data primary attribute
        def value = objectData["property"] // Get corresponding property value

        def result = new IntegrationStreamSync.AfterSyncResult()
        result.setCode("0") // Return status code (0 means success, others mean failure)
        result.setMessage("success") // Error message
        return result
    }

    // Debug entry method
    Object debug(FunctionContext context, Map arg) {
       return executeBeforeSync(context, json.parseObject("{}", IntegrationStreamSync.BeforeSyncArg))
    }
}
2.Configuration Steps
4.FAQ

← 2.Configuration Steps 4.FAQ→

  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式