
# 配置FDI映射规则
#### 概述
本节主要提供数据集成任务映射规则的配置说明。可以通过配置ROMA Connect源端数据字段到目标端数据字段的映射规则，把获取到的源端数据转换成写入目标端的数据。规则映射有映射模式和脚本模式两种模式，其中映射模式包含自动配置和手动配置两种方式。
#### 约束与限制
源端与目标端字段名请勿使用对应数据库的关键字，否则可能导致任务运行异常。
在映射模式下，源端或目标端数据类型为API时，数据字段不支持自动Mapping，需要手动配置Mapping。
#### 映射模式
- **自动配置Mapping**
  若源端信息与目标端信息中都定义了元数据，可使用"自动Mapping"方式配置Mapping信息。
  单击"自动Mapping"，源端和目标端数据字段间的映射规则自动建立。
  图1自动Mapping   
  ![](https://support.huaweicloud.com/usermanual-roma/zh-cn_image_0000001133849172.png "点击放大") 
- **手动配置Mapping**
  如果两端的数据表字段不一致，可单击下方的"添加mapping映射"，配置源端数据字段到目标端数据字段的映射关系。
  用户可以手动添加源端数据字段与目标端数据字段的映射规则，该方式适用于所有数据类型的集成场景。可以通过键值对输入或文本框输入两种方式配置Mapping映射规则。
  
 
#### 脚本模式
可通过编辑JavaScript脚本来配置源端数据（sourceObj指源表的字段集合对象）和目标端数据（targetObj指目标表的字段集合对象）的Mapping映射关系信息，增强复杂对象的Mapping处理能力。
**脚本映射样例**：
- 样例模板。
  ```
  function excute(sourceObj){
   //请在此处编写脚本内容， 注意大小写敏感。
   //定义目标端数据对象
   targetObj = {};
    //支持普通的加减乘除运算
   targetObj.a= (sourceObj.id * 3 + 1) % 5;
   //支持js的Math函数
   targetObj.b= Math.sqrt(100); 
   //支持类型转换
   targetObj.c = Number("3.14");
   //支持调用系统的时间函数
   targetObj.date = new Date().toLocaleString();
   //支持正则表达式
   targetObj.fdi = sourceObj.name.replace(/world/i,"fdi");
   //支持json转换
   var json = JSON.parse(sourceObj.infoJson);
   targetObj.address = json.address;
   targetObj.age = json.age;
   targetObj.sex = json.other.sex;
   targetObj.hobby = json.other.hobby;
   //支持条件语句
   if(targetObj.hobby == "rap"){ 
    targetObj.ikun = true;
   }else{
    targetObj.ikun = false;
   }
   return targetObj;
   }
  ```
  
- 仅字段映射。
  ```
  function execute(sourceObject) {//sourceObject即源端传送的数据对象
   //请在此处编写脚本内容；
   var targetObject = {};
   targetObject.mqs_id = sourceObject.id;//映射源端数据表中的id字段至目标端字段mqs_id
   targetObject.mqs_name = sourceObject.name;
   targetObject.mqs_date = sourceObject.date;
   targetObject.mqs_date = sourceObject['customized-outdutydate'];//属性带中划线的字段，需要使用中括号进行引用
   return targetObject; //targetObject即返回给目标端的数据对象
   }
  ```
  
- 目标端数据源类型为API。 API数据类型的目标端需要分别使用三个对象进行传递，对象包含params、headers和body。
  ```
  function excute(sourceObj) {
   print("execute js");
   print(sourceObj);
   var targetObj = {};
   targetObj.params = {};
   targetObj.params.id = sourceObj.uid
   targetObj.headers = {};
   targetObj.headers['X-HW-ID'] = "应用ID";
   targetObj.headers['X-HW-APPKEY'] = "应用密钥";
   targetObj.body = {};
   return obj;
   }
  ```
  如果转换的数据存在时间类型。则JS脚本中需参考以下加黑字段修改：
  ![](https://support.huaweicloud.com/usermanual-roma/public_sys-resources/note_3.0-zh-cn.png)
  编排模式下，目标端数据源类型为API，且使用JS脚本进行数据转换时，会自动先将源端类型为Date的数据类型转换为yyyy-MM-dd HH:mm:ss的字符串类型。例如，源端时间数据为19:55:20，通过JS脚本转换后会变为1970-01-01 19:55:20，而不是预期的19:55:20。其中1970-01-01为系统统一添加的默认值。
  如果要目标端要获得指定格式的数据，需要参考下述示例在JS脚本中对时间数据进行转换。
  ```
  function excute(sourceObj) {
  /**
   * 自定义时间格式函数
   * @param {format} 时间显示格式
   */
  Date.prototype.format = function (format) {
      var date = {
          "M+": this.getMonth() + 1,
          "d+": this.getDate(),
          "h+": this.getHours(),
          "m+": this.getMinutes(),
          "s+": this.getSeconds(),
          "q+": Math.floor((this.getMonth() + 3) / 3),
          "S": this.getMilliseconds()
      };
      if (/(y+)/i.test(format)) {
          format = format.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length));
      }
      for (var k in date) {
          if (new RegExp("(" + k + ")").test(format)) {
              format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? date[k] : ("00" + date[k]).substr(("" + date[k]).length));
          }
      }
      return format;
  };
   print("execute js");
   print(sourceObj);
   var targetObj = {};
   targetObj.params = {};
   targetObj.params.id = sourceObj.uid
  //对时间格式的数据进行转换时，调用上述自定义的函数进行处理， 抽取时、分、秒部分的数据给目标字段。
  //其中下述代码中的HH:mm:ss为时分秒时间的显示格式。如果写为hhmmss，则返回给目标字段的格式不带冒号。
   targetObj.params.time = (new Date(sourceObj.time)).format("hh:mm:ss");
   targetObj.headers = {};
   targetObj.headers['X-HW-ID'] = "应用ID";
   targetObj.headers['X-HW-APPKEY'] = "应用密钥";
   targetObj.body = {};
   return obj;
   }
  ```
  
- 数据库字段涉及多层json解析。 如果源端数据对象包含的字段涉及多层json对象嵌套，则需要对每一个解析出来的字段使用"\[\]"引用。
  例如如下脚本表示root字段包含id、name、double等多层对象嵌套，则每一个解析的字段需要单独引用。
  ```
  function excute(sourceObject) {
   //请在此处编写脚本内容；
   var targetObject = {};
   targetObject.mqs_id = sourceObject["root.id"];
   targetObject.mqs_name = sourceObject["root.name"];
   targetObject.mqs_double = sourceObject["root.double"];
   targetObject.mqs_date = sourceObject["root.date"];
   targetObject.mqs_boolean = sourceObject["root.boolean"];
   targetObject.mqs_timestamp = sourceObject["root.timestamp"];
   targetObject.mqs_time = sourceObject["root.time"];
   targetObject.mqs_long = sourceObject["root.long"];
   return targetObject; 
   }
  ```
  
 
