我正在将Salesforce中的数据集成到另一个API中。源有1个具有相关子对象的对象。但是,目标API需要采取如下形式。子对象中的每个相关Salesforce记录都需要子表单中的节点。下面的POST示例是有效载荷的最终所需形式。
我想我需要使用DataWeave,使用For Each来跟踪Salesforce中的每个子记录。但我不太清楚从哪里开始。
以下是来自Salesforce帖子主题的传入JSON:
{
"LastModifiedDate": "2016-09-22T14:19:08.000+0000",
"Engagement__c": "1234",
"Product_CoC__c": null,
"Name": "Prod-22880",
"Year_1_Approved_Production_Hectares__c": 100.0,
"Year_1_Approved_Production_Volume__c": 1000.0,
"Product_Variety__c": null,
"CreatedById": "1234",
"Year_2_Estimated_Production_Volume__c": 1001.0,
"Product__c": "1234",
"Engagement_Decision_Date__c": null,
"Year_1_Harvest_Period__c": "2016",
"CPH_Number__c": null,
"Product_Type__c": null,
"Certificate_Product__c": "1234",
"IsDeleted": false,
"Crop_Yield__c": 10.0,
"Year_2_Estimated_Production_Hectares__c": 100.0,
"Valid_Period_End_Date__c": null,
"Intercrop__c": false,
"SystemModstamp": "2016-09-22T14:19:08.000+0000",
"Year_2_Harvest_Period__c": null,
"Crop_Production_Unit__c": "kg",
"Certificate__c": "1234",
"Year__c": 1.0,
"Harvest_Frequency__c": "Single",
"CreatedDate": "2016-07-28T15:44:18.000+0000",
"Valid_Period_Start_Date__c": null,
"Id": "1234",
"LastModifiedById": "1234",
"RA_Id__c": null
}
这是我对子对象的转换消息:
%dw 1.0
%output application/java
---
{
acv_crop3:flowVars.ChainpointCropID default "",
acv_cph3:payload.Name default "",
acv_harvest_period2:payload.Year_1_Harvest_Period__c default "",
acv_frequency2:flowVars.frequency default "",
acv_aq2:payload.Year_1_Approved_Production_Volume__c default "",
acv_cph4:payload.Year_1_Approved_Production_Hectares__c default "",
acv_yield2:payload.Crop_Yield__c default "",
acv_start_date2:payload.Valid_Period_Start_Date__c default "",
acv_end_date2:payload.Valid_Period_End_Date__c default "",
acv_uom2:flowVars.uom default ""
}
以下是所需POST有效负载的示例:
{
"ownerId": 24695,
"Q_CERT_SFGUID": "a00G000000WR3xxxxx",
"Q_CERT": "467",
"Q_CERTCROP2": [
"1199"
],
"textId": "auto",
"resultDate": null,
"authorId": null,
"Q_CERTNO": "RA-G-",
"Q_CERTHL": 24695,
"Q_CERTCB": 43986,
"Q_CERTST": "NO_STATUS",
"Q_CERTSUB": "",
"Q_CERTSTDATE": "2016-06-30",
"Q_CERT_expiration_date": "2019-06-29",
"Q_CERTENDATE": "",
"Q_CERT_redate": "2016-06-30",
"Q_CERT_CHA": "8.0",
"Q_CERT_TPH": "8.0",
"Q_CERT_CONTACT_EMAIL": "m@gmail.com",
"Q_CERT_CONTACT_NAME": 1300,
"subforms": [
{
"textId": "acv2",
"rows": [
{
"acv_crop3": "1199",
"acv_cph3": "Prod-22880",
"acv_harvest_period2": "2016",
"acv_frequency2": 668,
"acv_aq2": 1000,
"acv_cph4": 100,
"acv_yield2": 10,
"acv_start_date2": "2099-12-31",
"acv_end_date2": "2099-12-31",
"acv_uom2": 557
},
{
"acv_crop3": "1100",
"acv_cph3": "Prod-22881",
"acv_harvest_period2": "2017",
"acv_frequency2": 668,
"acv_aq2": 1000,
"acv_cph4": 100,
"acv_yield2": 1000,
"acv_start_date2": "2017-12-31",
"acv_end_date2": "2018-12-31",
"acv_uom2": 557
}
]
}
]
}
以下是我目前使用转换消息...
的流程 <flow name="prepareEP">
<set-variable variableName="API_Path" value="v0/forms/FR_CERT" doc:name="engagementProduct API_URL"/>
<set-variable variableName="entityType" value="engagementProduct" doc:name="set Entity"/>
<component class="com.ww.mule.reporting.et.ObjectStoreController" doc:name="load countryDiccionary"/>
<set-variable variableName="originalPayloadEP" value="#[payload]" doc:name="original payload"/>
<json:json-to-object-transformer returnClass="java.util.Map" doc:name="JSON to Object"/>
<set-variable variableName="originalPayloadEPMap" value="#[payload]" doc:name="original payload map"/>
<logger message="#['About to query certificate ' + flowVars.originalPayloadEPMap.Certificate__c + ' with engagement product Id ' + flowVars.originalPayloadEPMap.Id]" level="INFO" doc:name="Logger"/>
<sfdc:query config-ref="Salesforce__Basic_Authentication" doc:name="Get Engagement Products By Cert" query="dsql:SELECT Id,Name,Year_1_Harvest_Period__c,Harvest_Frequency__c,Year_1_Approved_Production_Volume__c,Year_1_Approved_Production_Hectares__c,Crop_Yield__c,Valid_Period_Start_Date__c,Valid_Period_End_Date__c FROM Engagement_Product__c WHERE Certificate__c = '#[flowVars.originalPayloadEPMap.Certificate__c]'"/>
<foreach doc:name="For Each">
<json:object-to-json-transformer doc:name="Object to JSON"/>
<objectstore:retrieve config-ref="CountryStoreObjectStore" key="#[payload.Cert_Country__c == empty?'UNKNOWN_COUNTRY':payload.Cert_Country__c]" targetProperty="countryISO" doc:name="ObjectStore" defaultValue-ref="#['XX']"/>
<set-payload value="#[flowVars.originalPayloadEP]" mimeType="application/json" doc:name="Set Payload"/>
<set-variable variableName="frequency" value="#[originalPayloadEPMap.Harvest_Frequency__c == 'Single' ? 668 : originalPayloadEPMap.Harvest_Frequency__c == 'Multiple' ? 669 : originalPayloadEPMap.Harvest_Frequency__c == 'Permanent/Continuous' ? 667 : originalPayloadEPMap.Harvest_Frequency__c == 'Occasional' ? 1910 : null]" doc:name="Set Harvest Frequency Variable"/>
<set-variable variableName="uom" value="#[originalPayloadEPMap.Crop_Production_Unit__c == 'kg' ? 557 : originalPayloadEPMap.Crop_Production_Unit__c == 'Liters' ? 596 : originalPayloadEPMap.Crop_Production_Unit__c == 'Number of Stems' ? 1802 : originalPayloadEPMap.Crop_Production_Unit__c == 'mts2' ? 556 : null]" doc:name="Set UOM Variable"/>
<!--
<set-payload doc:name="Set Payload"/>
-->
<dw:transform-message doc:name="Transform Message">
<dw:set-payload><![CDATA[%dw 1.0
%output application/java
---
{
acv_crop3:flowVars.ChainpointCropID default "",
acv_cph3:payload.Name default "",
acv_harvest_period2:payload.Year_1_Harvest_Period__c default "",
acv_frequency2:flowVars.frequency default "",
acv_aq2:payload.Year_1_Approved_Production_Volume__c default "",
acv_cph4:payload.Year_1_Approved_Production_Hectares__c default "",
acv_yield2:payload.Crop_Yield__c default "",
acv_start_date2:payload.Valid_Period_Start_Date__c default "",
acv_end_date2:payload.Valid_Period_End_Date__c default "",
acv_uom2:flowVars.uom default ""
}]]>
</dw:set-payload>
</dw:transform-message>
<object-to-string-transformer mimeType="application/json" doc:name="Object to String"/>
<set-variable variableName="acv2_info" value="#[flowVars.acv2_info == null ? payload : flowVars.acv2_info + ',' + payload]" doc:name="acv2_info"/>
<logger message="#['acv2_info = ' + flowVars.acv2_info]" level="INFO" doc:name="Logger"/>
<set-variable variableName="transformedPayload" value="#[payload]" doc:name="save payload"/>
<logger message="#['transformedPayload = ' + flowVars.transformedPayload]" level="INFO" doc:name="Print transformedPayload"/>
</foreach>
<flow-ref name="sendAuthenticatedChainPointRequest" doc:name="sendAuthenticatedChainPointRequest"/>
</flow>