4.21.1ERP集成平台当前支持三种类型的自定义函数介绍
1.固定入参:Map syncArg
2.固定返回:return syncArg;
3.自定义函数校验:只要自定义函数代码中含有 Fx.object.create 、Fx.object.batchCreate 、Fx.object.update 、 Fx.object.batchUpdate 等其中一个字符串即表明函数body处于更新/新增/作废的调用。
场景:在自定义函数中加入上述字符串(字符串注释无效,同样会检测)并且含有与绑定字段apiName相同的字符串(注释也会检测),策略将无法开启,并报异常函数校验失败。
4.数据新增时:syncArg.objectData是对象主数据,syncArg.details是对象明细数据
5.数据更新时:syncArg.objectData有可能是主对象数据有可能是从对象数据,具体得通过objApiName来判断
4.21.2同步前自定义函数执行支持数据过滤:
即函中返回结果中包含"isExec":"false",即该次同步将不再往后执行,目标数据将不会做出相应的更改。
测试场景:在自定义函数返回的Map中加入"isExec":"false",或"isExec":false目标数据将不会发生更改。
函数代码:
Map map = ["details":syncArg.details, "objectData":syncArg.objectData, "isExec":"false" ]; return map;
4.21.3同步中执行自定义函数:
函数执行后,在函数中编写的映射值修改,企业id和对象apiName不会更改。
测试场景:只有新增数据,才会携带从对象;更新时会更新对象映射值,因此如果没有对从对象做出特殊鉴别,更新的对象将不区分主从对象,一律更新,主从对象名称都会更新为自定义函数赋值
函数代码:
log.info("事件类型:" + syncArg.destEventType); log.info(syncArg.objectData); log.info(syncArg.details); Map objectData = syncArg.objectData as Map; objectData.name = "自定义函数修改" Map map = ["details":syncArg.details, "objectData":syncArg.objectData]; log.info(map); return map;
4.21.4同步后执行自定义函数:
函数执行后,在函数中编写的映射值修改,企业id和对象apiName不会更改。
测试场景:数据同步不会受到影响,只是将数据传给自定义函数即可,需要通过查看日志进行判断
函数代码:
Map map = ["details":context.details, "objectData":context.data, "afterSync" : "yes001"]; return map;
具体入参字段(如果不清楚入参有什么字段就先把函数写好,然后打印入参看一下,注意新增和更新入参不一样)和函数例子如下
同步前:通过数据范围的校验之后
主要入参字段:
{ "destObjectApiName": "",//目标对象apiName "sourceData": {"字段apiName":"字段值"}//对象字段信息 }
简单例子:
log.info(syncArg); String destObjApiName=syncArg["destObjectApiName"] as String; log.info("destObjectApiName:"+destObjApiName); if("object_xo21i__c"==destObjApiName){ return syncArg; } Map objectData=syncArg["objectData"] as Map; String customerCode=objectData["customerCodeHead"] as String; syncArg["isExec"]=false;//把这个字段设置为false,会过滤掉这条数据不同步 return syncArg;
同步中:写入目标系统之前
主要入参字段:
`{ "destDetailSyncDataIdAndDestDataMap": {"":{"字段apiName":"字段值"}},//目标对象明细 "destData": {"字段apiName":"字段值"}//目标对象字段信息 //如果新增主对象在destData,明细数据在destDetailSyncDataIdAndDestDataMap,如果是更新主从数据都在destData(更新是单独更新的) }
简单例子:
//修改customerShortName字段值 log.info(syncArg); syncArg["objectData"]["customerShortName"]="dddddd" log.info(syncArg); return syncArg;
同步后:写入目标系统之后
主要入参字段:
{ "sourceDataId": "5fead1146660700001170e3d",//源数据id,只有crm->erp方向有这个字段 "sourceObjectApiName": "AccountObj",//源对象apiName "completeDataWriteResult": {//写入目标数据的结果 "detailWriteResults": [],//明细数据结果 "errCode": 0, "success": true, "destEventType": 1, "errMsg": "success", "writeResult": {//主数据结果,errCode为s106240000成功,其他的失败接口返回的错误码 "errCode": 5001, "success": false, "syncDataId": "3ab1c2c2ffe04111b3e713632d5a4f76", "errMsg": "预处理服务调用错误:调用外部http接口失败,错误信息:100,SAP系统BP名称已创建,不允许重复创建。::errCode=s306240003", "destDetailSyncDataIdAndDestDataMap": {} } }, "destObjectApiName": "AccountObj_1el03su6s",//目标数据对象apiName "objectData": {//目标数据 "tenant_id": "706089",//企业ei "object_describe_api_name": "AccountObj_1el03su6s",//对象apiName "_id": "5fead2696532bf0001e524e4" }, "details": {},//明细数据 }
简单例子:
//crm->erp,把目标对象的id写到crm源对象 log.info(syncArg) if(syncArg["objectData"]["id"]!=null&&syncArg["objectData"][" id"]!="" &&syncArg["sourceDataId"]!=null&&syncArg["sourceDataId"]!=""){ String destDataId=syncArg["objectData"]["_id"] as String;//目标数据id String sourceDataId=syncArg["sourceDataId"] as String;//源数据id String errCode=syncArg["completeDataWriteResult"]["writeResult"]["errCode"]as String; log.info("--"+errCode) if (errCode =="0"){//&&destDataId.length()<11 def (Boolean error,Map data,String errorMessage) = Fx.object.update("AccountObj",sourceDataId, ["field_b25i7__c":destDataId],true); log.info(errorMessage) } } return syncArg;