查看 Application Integration 支援的連接器。
電子商務整合範例
這個範例整合功能可執行電子商務後端情境的使用案例。
深入探索
如需包含這個程式碼範例的詳細說明文件,請參閱下列內容:
程式碼範例
{
"description": "The integration mimics the back office e-commerce order processing. The request is expected to contain order with one or more line items as json object with sku, quantity, price, vendor etc. If the total price of the order goes beyond $100 then there will be an email sent to approve the order else the order will be processed successfully. For all the items which have vendor as external, there will be an external order created by making a rest call to the external server. The response of the integration will be total order value, filtered list of external items and list of http response status received for each rest call made per external line_item.",
"triggerConfigs": [{
"label": "OrderProcessApiTrigger",
"startTasks": [{
"taskId": "1"
}],
"properties": {
"Trigger name": "ecom-order-processing_API_1"
},
"triggerType": "API",
"triggerNumber": "1",
"triggerId": "api_trigger/ecom-order-processing_API_1",
"position": {
"x": -294,
"y": -252
}
}, {
"label": "ReportExternalOrders",
"startTasks": [{
"taskId": "6"
}],
"properties": {
"Trigger name": "ecom-order-processing_API_2"
},
"triggerType": "API",
"triggerNumber": "2",
"triggerId": "api_trigger/ecom-order-processing_API_2",
"position": {
"x": 210,
"y": -84
}
}],
"taskConfigs": [{
"task": "SuspensionTask",
"taskId": "2",
"parameters": {
"customMessage": {
"key": "customMessage",
"value": {
"stringValue": "Hello user, approval request from EcomOrderProcessing integration."
}
},
"isApproved": {
"key": "isApproved",
"value": {
"stringArray": {
"stringValues": ["$`Task_2_isApproved`$"]
}
}
},
"suspensionExpiration": {
"key": "suspensionExpiration",
"value": {
"jsonValue": "{\n \"@type\": \"type.googleapis.com/enterprise.crm.eventbus.proto.SuspensionExpiration\",\n \"remindAfterMs\": 86400000,\n \"expireAfterMs\": 172800000\n}"
}
},
"notifications": {
"key": "notifications",
"value": {
"jsonValue": "{\n \"protoValues\": [{\n \"@type\": \"type.googleapis.com/enterprise.crm.eventbus.proto.Notification\",\n \"emailAddress\": {\n \"email\": \"\\u003cchange-this-to-email-id\\u003e\"\n }\n }]\n}"
}
}
},
"nextTasks": [{
"taskId": "3",
"condition": "$`Task_2_isApproved`$ \u003d true",
"displayName": "Proceed if approved"
}],
"taskExecutionStrategy": "WHEN_ALL_SUCCEED",
"displayName": "Approval",
"successPolicy": {
"finalState": "SUSPENDED"
},
"externalTaskType": "NORMAL_TASK",
"position": {
"x": -42
}
}, {
"task": "FieldMappingTask",
"taskId": "1",
"parameters": {
"FieldMappingConfigTaskParameterKey": {
"key": "FieldMappingConfigTaskParameterKey",
"value": {
"jsonValue": "{\n \"@type\": \"type.googleapis.com/enterprise.crm.eventbus.proto.FieldMappingConfig\",\n \"mappedFields\": [{\n \"inputField\": {\n \"fieldType\": \"DOUBLE_VALUE\",\n \"transformExpression\": {\n \"initialValue\": {\n \"referenceValue\": \"$orders_request$\"\n },\n \"transformationFunctions\": [{\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"GET_PROPERTY\"\n }\n },\n \"parameters\": [{\n \"initialValue\": {\n \"literalValue\": {\n \"stringValue\": \"line_items\"\n }\n }\n }]\n }, {\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"FOR_EACH\"\n }\n },\n \"parameters\": [{\n \"initialValue\": {\n \"literalValue\": {\n \"protoValue\": {\n \"@type\": \"type.googleapis.com/enterprise.crm.eventbus.proto.TransformExpression\",\n \"initialValue\": {\n \"referenceValue\": \"~x\"\n },\n \"transformationFunctions\": [{\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"GET_PROPERTY\"\n }\n },\n \"parameters\": [{\n \"initialValue\": {\n \"literalValue\": {\n \"stringValue\": \"quantity\"\n }\n }\n }]\n }, {\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"TO_DOUBLE\"\n }\n }\n }, {\n \"functionType\": {\n \"doubleFunction\": {\n \"functionName\": \"MULTIPLY\"\n }\n },\n \"parameters\": [{\n \"initialValue\": {\n \"referenceValue\": \"~x\"\n },\n \"transformationFunctions\": [{\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"GET_PROPERTY\"\n }\n },\n \"parameters\": [{\n \"initialValue\": {\n \"literalValue\": {\n \"stringValue\": \"price_per_unit\"\n }\n }\n }]\n }, {\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"TO_DOUBLE\"\n }\n }\n }]\n }]\n }]\n }\n }\n }\n }]\n }, {\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"TO_DOUBLE_ARRAY\"\n }\n }\n }, {\n \"functionType\": {\n \"doubleArrayFunction\": {\n \"functionName\": \"SUM\"\n }\n }\n }]\n }\n },\n \"outputField\": {\n \"referenceKey\": \"$total_order_value$\",\n \"fieldType\": \"DOUBLE_VALUE\",\n \"cardinality\": \"OPTIONAL\"\n }\n }]\n}"
}
}
},
"nextTasks": [{
"taskId": "2",
"condition": "$total_order_value$ \u003e\u003d $threshold_order_value$",
"displayName": "TotalOrderValue Above Threshold ",
"description": "Checks if the total order value is greater than or equal to $100"
}, {
"taskId": "3",
"condition": "$total_order_value$ \u003c $threshold_order_value$",
"displayName": "TotalOrderValue Below Threshold",
"description": "Checks if the total order value is less than $100"
}],
"taskExecutionStrategy": "WHEN_ALL_SUCCEED",
"displayName": "Find Total Order Price",
"externalTaskType": "NORMAL_TASK",
"position": {
"x": -294,
"y": -126
}
}, {
"task": "FieldMappingTask",
"taskId": "5",
"parameters": {
"FieldMappingConfigTaskParameterKey": {
"key": "FieldMappingConfigTaskParameterKey",
"value": {
"jsonValue": "{\n \"@type\": \"type.googleapis.com/enterprise.crm.eventbus.proto.FieldMappingConfig\",\n \"mappedFields\": [{\n \"inputField\": {\n \"fieldType\": \"JSON_VALUE\",\n \"transformExpression\": {\n \"initialValue\": {\n \"literalValue\": {\n \"stringValue\": \"{\\\"STATUS\\\" : \\\"PROCESSING_COMPLETE\\\"}\"\n }\n },\n \"transformationFunctions\": [{\n \"functionType\": {\n \"stringFunction\": {\n \"functionName\": \"TO_JSON\"\n }\n }\n }]\n }\n },\n \"outputField\": {\n \"referenceKey\": \"$orders_response$\",\n \"fieldType\": \"JSON_VALUE\",\n \"cardinality\": \"OPTIONAL\"\n }\n }]\n}"
}
}
},
"taskExecutionStrategy": "WHEN_ALL_SUCCEED",
"displayName": "Build Response",
"externalTaskType": "NORMAL_TASK",
"position": {
"x": -294,
"y": 378
}
}, {
"task": "SubWorkflowForEachLoopV2Task",
"taskId": "4",
"parameters": {
"iterationElementMapping": {
"key": "iterationElementMapping",
"value": {
"stringValue": "sub_integration_input"
}
},
"aggregatorParameterMapping": {
"key": "aggregatorParameterMapping",
"value": {
"jsonValue": "{\n \"@type\": \"type.googleapis.com/enterprise.crm.eventbus.proto.ParameterMap\",\n \"entries\": [{\n \"key\": {\n \"literalValue\": {\n \"stringValue\": \"`Task_6_responseStatus`\"\n }\n },\n \"value\": {\n \"literalValue\": {\n \"stringValue\": \"rest_call_response_status\"\n }\n }\n }]\n}"
}
},
"triggerId": {
"key": "triggerId",
"value": {
"stringValue": "api_trigger/ecom-order-processing_API_2"
}
},
"loopMetadata": {
"key": "loopMetadata",
"value": {
"stringArray": {
"stringValues": ["$`Task_4_loopMetadata`$"]
}
}
},
"disableEucPropagation": {
"key": "disableEucPropagation",
"value": {
"booleanValue": false
}
},
"listToIterate": {
"key": "listToIterate",
"value": {
"stringValue": "$filtered_external_items$"
}
},
"workflowName": {
"key": "workflowName",
"value": {
"stringValue": "ExampleIntegration-EcomOrderProcessing"
}
},
"requestParameterMapping": {
"key": "requestParameterMapping"
},
"overrideParameterMapping": {
"key": "overrideParameterMapping"
}
},
"nextTasks": [{
"taskId": "5"
}],
"taskExecutionStrategy": "WHEN_ALL_SUCCEED",
"displayName": "For Each Loop",
"externalTaskType": "NORMAL_TASK",
"position": {
"x": -294,
"y": 252
}
}, {
"task": "FieldMappingTask",
"taskId": "3",
"parameters": {
"FieldMappingConfigTaskParameterKey": {
"key": "FieldMappingConfigTaskParameterKey",
"value": {
"jsonValue": "{\n \"@type\": \"type.googleapis.com/enterprise.crm.eventbus.proto.FieldMappingConfig\",\n \"mappedFields\": [{\n \"inputField\": {\n \"fieldType\": \"JSON_VALUE\",\n \"transformExpression\": {\n \"initialValue\": {\n \"referenceValue\": \"$orders_request$\"\n },\n \"transformationFunctions\": [{\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"GET_PROPERTY\"\n }\n },\n \"parameters\": [{\n \"initialValue\": {\n \"literalValue\": {\n \"stringValue\": \"line_items\"\n }\n }\n }]\n }, {\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"FILTER_ELEMENTS\"\n }\n },\n \"parameters\": [{\n \"initialValue\": {\n \"literalValue\": {\n \"protoValue\": {\n \"@type\": \"type.googleapis.com/enterprise.crm.eventbus.proto.TransformExpression\",\n \"initialValue\": {\n \"referenceValue\": \"~x\"\n },\n \"transformationFunctions\": [{\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"GET_PROPERTY\"\n }\n },\n \"parameters\": [{\n \"initialValue\": {\n \"literalValue\": {\n \"stringValue\": \"vendor\"\n }\n }\n }]\n }, {\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"TO_STRING\"\n }\n }\n }, {\n \"functionType\": {\n \"stringFunction\": {\n \"functionName\": \"EQUALS\"\n }\n },\n \"parameters\": [{\n \"initialValue\": {\n \"literalValue\": {\n \"stringValue\": \"External\"\n }\n }\n }]\n }]\n }\n }\n }\n }]\n }]\n }\n },\n \"outputField\": {\n \"referenceKey\": \"$filtered_external_items$\",\n \"fieldType\": \"JSON_VALUE\",\n \"cardinality\": \"OPTIONAL\"\n }\n }]\n}"
}
}
},
"nextTasks": [{
"taskId": "4"
}],
"taskExecutionStrategy": "WHEN_ANY_SUCCEED",
"displayName": "Filter External Items",
"description": "Filtering out line_items which have vendor as \"External\" so that we can place order request to the vendor",
"externalTaskType": "NORMAL_TASK",
"position": {
"x": -294,
"y": 126
}
}, {
"task": "GenericRestV2Task",
"taskId": "6",
"parameters": {
"throwError": {
"key": "throwError",
"value": {
"booleanValue": false
}
},
"responseBody": {
"key": "responseBody",
"value": {
"stringArray": {
"stringValues": ["$`Task_6_responseBody`$"]
}
}
},
"disableSSLValidation": {
"key": "disableSSLValidation",
"value": {
"booleanValue": false
}
},
"httpParams": {
"key": "httpParams"
},
"responseHeader": {
"key": "responseHeader",
"value": {
"stringArray": {
"stringValues": ["$`Task_6_responseHeader`$"]
}
}
},
"userAgent": {
"key": "userAgent",
"value": {
"stringValue": ""
}
},
"httpMethod": {
"key": "httpMethod",
"value": {
"stringValue": "POST"
}
},
"responseStatus": {
"key": "responseStatus",
"value": {
"stringArray": {
"stringValues": ["$`Task_6_responseStatus`$"]
}
}
},
"url": {
"key": "url",
"value": {
"stringValue": "https://mocktarget.apigee.net/echo"
}
},
"urlFetchingService": {
"key": "urlFetchingService",
"value": {
"stringValue": "HARPOON"
}
},
"useSSL": {
"key": "useSSL",
"value": {
"booleanValue": false
}
},
"requestorId": {
"key": "requestorId",
"value": {
"stringValue": ""
}
},
"urlQueryStrings": {
"key": "urlQueryStrings"
},
"requestBody": {
"key": "requestBody",
"value": {
"stringValue": "$sub_integration_input$"
}
},
"followRedirects": {
"key": "followRedirects",
"value": {
"booleanValue": true
}
},
"additionalHeaders": {
"key": "additionalHeaders"
}
},
"taskExecutionStrategy": "WHEN_ALL_SUCCEED",
"displayName": "Call REST Endpoint",
"externalTaskType": "NORMAL_TASK",
"position": {
"x": 210,
"y": 42
}
}],
"integrationParameters": [{
"key": "total_order_value",
"dataType": "DOUBLE_VALUE",
"displayName": "total_order_value",
"inputOutputType": "OUT"
}, {
"key": "`Task_4_loopMetadata`",
"dataType": "JSON_VALUE",
"displayName": "`Task_4_loopMetadata`",
"isTransient": true,
"producer": "1_4"
}, {
"key": "threshold_order_value",
"dataType": "DOUBLE_VALUE",
"defaultValue": {
"doubleValue": 100.0
},
"displayName": "threshold_order_value"
}, {
"key": "filtered_external_items",
"dataType": "JSON_VALUE",
"displayName": "filtered_external_items",
"inputOutputType": "OUT"
}, {
"key": "orders_request",
"dataType": "JSON_VALUE",
"defaultValue": {
"jsonValue": "{\n \"order_no\": \"12345\",\n \"buyer_id\": \"raambo\",\n \"line_items\": [{\n \"line\": 1.0,\n \"sku\": \"tr100\",\n \"vendor\": \"Internal\",\n \"quantity\": 1.0,\n \"price_per_unit\": 10.0\n }, {\n \"line\": 2.0,\n \"sku\": \"tbz\",\n \"vendor\": \"External\",\n \"quantity\": 24.0,\n \"price_per_unit\": 1.0\n }]\n}"
},
"displayName": "orders_request",
"inputOutputType": "IN",
"jsonSchema": "{\n \"properties\": {\n \"buyer_id\": {\n \"type\": \"string\"\n },\n \"line_items\": {\n \"items\": {\n \"properties\": {\n \"price_per_unit\": {\n \"type\": \"number\"\n },\n \"sku\": {\n \"type\": \"string\"\n },\n \"vendor\": {\n \"type\": \"string\"\n },\n \"line\": {\n \"type\": \"number\"\n },\n \"quantity\": {\n \"type\": \"number\"\n }\n },\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"order_no\": {\n \"type\": \"string\"\n }\n },\n \"type\": \"object\",\n \"$schema\": \"http://json-schema.org/draft-04/schema#\"\n}"
}, {
"key": "rest_call_response_status",
"dataType": "STRING_ARRAY",
"displayName": "rest_call_response_status",
"inputOutputType": "OUT"
}, {
"key": "`Task_2_isApproved`",
"dataType": "BOOLEAN_VALUE",
"displayName": "`Task_2_isApproved`",
"isTransient": true,
"producer": "1_2"
}, {
"key": "`Task_6_responseHeader`",
"dataType": "STRING_VALUE",
"displayName": "`Task_6_responseHeader`",
"isTransient": true,
"producer": "1_6"
}, {
"key": "`Task_6_responseBody`",
"dataType": "STRING_VALUE",
"displayName": "`Task_6_responseBody`",
"isTransient": true,
"producer": "1_6"
}, {
"key": "`Task_6_responseStatus`",
"dataType": "STRING_VALUE",
"defaultValue": {
"stringValue": ""
},
"displayName": "`Task_6_responseStatus`",
"inputOutputType": "OUT",
"isTransient": true,
"producer": "1_6"
}, {
"key": "orders_response",
"dataType": "JSON_VALUE",
"displayName": "orders_response",
"inputOutputType": "OUT"
}, {
"key": "sub_integration_input",
"dataType": "JSON_VALUE",
"defaultValue": {
"jsonValue": "{\n}"
},
"displayName": "sub_integration_input",
"inputOutputType": "IN"
}]
}
整合流程範例
下圖顯示這個整合程式碼範例的整合編輯器範例版面配置。
上傳並執行範例整合功能
如要上傳及執行範例整合,請按照下列步驟操作:
- 將整合範例儲存為系統中的 .json 檔案。
- 前往 Google Cloud 控制台的「Application Integration」頁面。
- 按一下左側導覽選單中的「整合」,開啟「整合」頁面。
- 選取現有整合,或按一下「建立整合」建立新整合。
如要建立新的整合項目:
- 在「建立整合」對話方塊中輸入名稱和說明。
- 選取整合作業的區域。
- 選取整合的服務帳戶。如要變更或更新整合的服務帳戶詳細資料,請隨時前往整合工具列的「整合摘要」info窗格。
- 點選「建立」。
系統會在整合編輯器中開啟整合服務。
- 在整合服務編輯器中,按一下「上傳/下載」選單 publish,然後選取「上傳整合服務」。
- 在檔案瀏覽器對話方塊中,選取您在步驟 1 中儲存的檔案,然後按一下「開啟」。
系統會使用上傳的檔案建立新的整合版本。
- 在整合服務編輯器中,按一下「測試」。
- 按一下「測試整合」。系統會執行整合項目,並在「Test Integration」(測試整合項目) 窗格中顯示執行結果。