---
title: "4.1.4、表单数据：FormDataRest"
docId: "954956875793866752"
source: "https://weapp.eteams.cn/build/techdoc/wdoc/index.html#/public/repository/9c2e5f92-03b4-4207-9b22-a0c1dd79ac56/doc/954956875793866752"
---
> 所属包：weaver-common-form-api
> 
> 所属类：com.weaver.common.form.api.rest.layout.FormLayoutRest

#### 1. 新建/更新表单数据

**接口详情：**

```java
    /**
     * 新建/更新表单数据
     *
     * @param formDataDto 数据详情
     * @param employee    操作人
     * @return FormDataDto
     */
    FormDataDto saveFormData(FormDataDto formDataDto, SimpleEmployee employee);
```

**参数说明：**

| 参数名 | 具体属性 | 是否必传 | 类型 | 描述 |
| --- | --- | --- | --- | --- |
| formDataDto |  | 是 | **com.weaver.common.form.dto.data.FormDataDto** | 数据对象 |
|  | dataId | 否 | Long | 数据ID，新增时不传，更新时必传 |
|  | presetDataId | 否 | Long | 预设数据ID<br>传递了此属性时不需要传入dataid，会将此ID作为数据ID进行新增 |
|  | formId | 是 | Long | 表单ID |
|  | layoutMultiId | 否 | Long | 布局ID |
|  | module | 是 | String | 所属模块标识 |
|  | execMonitor | 否 | boolean | 是否执行运算（不支持字段联动） |
|  | execRelate | 否 | boolean | 是否执行钻取（不支持字段联动） |
|  | objectId | 否 | Long | 业务模块事项ID，比如审批ID，数据上报ID 等等<br>涉及到附件上传、事项公共关联操作时必传。 |
|  | dataDetails | 是 | com.weaver.common.form.dto.data.FormDataDetailDto | 数据详情 |
|  | dataDetails的<br>属性说明 | fieldId | 字段id |  |
|  | content | 数据内容 |  |  |
|  | optionId | 选项类字段的选项id |  |  |
|  | dataIndex | 明细表下标 |  |  |
|  | dataDetails的<br>详细示例： | ```json<br>[<br>    {<br>        "content": "单行文本测试内容",<br>        "fieldId": "1153569499311783936"<br>    },<br>    { //日期区间 开始和结束分开传递 这里传开始 如果是datakey作为条件，这里用dataKey_0<br>        "formField": {<br>            "id": "1200637556314857401"//开始的字段id<br>        },<br>        "content": "2025-12-18 12:00",<br>    },<br>    { //日期区间 开始和结束分开传递 这里传结束 如果是datakey作为条件，这里用dataKey_1<br>        "formField": {<br>            "id": "1200637556314857402"//结束的字段id<br>        },<br>        "content": "2025-12-18 16:00",<br>    },<br>    {<br>        "dataOptions": [<br>            {<br>                "optionId": "1153569499311783901",<br>                "content": "浏览按钮或选项类数据1"<br>            },<br>            {<br>                "optionId": "1153569499311783902",<br>                "content": "浏览按钮或选项类数据2"<br>            }<br>        ],<br>        "fieldId": "1153569499311783937"<br>    },<br>    {<br>        "content": "明细表单行文本第1行内容",<br>        "fieldId": "1153569499311783939",<br>        "dataIndex": 1<br>    },<br>    {<br>        "dataOptions": [<br>            {<br>                "optionId": "1153569499311783901",<br>                "content": "明细表的浏览按钮或选项类数据1"<br>            },<br>            {<br>                "optionId": "1153569499311783902",<br>                "content": "明细表的浏览按钮或选项类数据2"<br>            }<br>        ],<br>        "fieldId": "1153569499311783940",<br>        "dataIndex": 1<br>    },<br>    {<br>        "content": "明细表单行文本第2行内容",<br>        "fieldId": "1153569499311783939",<br>        "dataIndex": 2<br>    },<br>    {<br>        "dataOptions": [<br>            {<br>                "optionId": "1153569499311783901",<br>                "content": "明细表的浏览按钮或选项类数据1"<br>            },<br>            {<br>                "optionId": "1153569499311783902",<br>                "content": "明细表的浏览按钮或选项类数据2"<br>            }<br>        ],<br>        "fieldId": "1153569499311783940",<br>        "dataIndex": 2<br>    }<br>]<br>``` |  |  |
|  | delRowIds | 否 | com.weaver.common.form.dto.data.FormDataDelDto | 删除明细行的标识<br>传入时subFormId、rowId必传 |
|  | recordId | 否 | Long |  |
| employee |  | 是 | SimpleEmployee | 用户信息（必须包含id和tenantKey） |

**返回值：**

| 类型 | 具体属性 | 类型所属包路径 | 描述 |
| --- | --- | --- | --- |
| formDataDto |  | **com.weaver.common.form.dto.data.FormDataDto** | 保存后的数据对象 |
| 具体属性 | dataId | Long | 保存后的数据ID |
| recordId | Long | 日志记录ID |  |
| presetDataId | Long | 预设数据ID（保持和入参一致） |  |
| formId | Long | 表单ID（保持和入参一致） |  |
| layoutMultiId | Long | 布局ID（保持和入参一致） |  |
| module | String | 所属模块标识（保持和入参一致） |  |
| execMonitor | boolean | 是否执行运算（保持和入参一致） |  |
| execRelate | boolean | 是否执行钻取（保持和入参一致） |  |
| objectId | Long | 业务模块事项ID（保持和入参一致） |  |
| dataDetails | com.weaver.common.form.dto.data.FormDataDetailDto | 数据详情（保持和入参一致） |  |
| delRowIds | com.weaver.common.form.dto.data.FormDataDelDto | 删除明细行的标识（保持和入参一致） |  |

**对接示例：**

```java
import com.weaver.common.form.api.rest.FormRestFactory;
@Autowired
FormRestFactory formRestFactory;

public void Test() {
    String module = "workflow";

    SimpleEmployee employee = new SimpleEmployee();
    employee.setId(918327792617603074L);
    employee.setTenantKey("t82kg113nu");

    FormDataDto formDataDto = new FormDataDto();
    formDataDto.setFormId(1L);
    formDataDto.setModule(module);

    //具体数据可以参考文档的数据格式维护
    List<FormDataDetailDto> dataDetails = new ArrayList<>();
    FormDataDetailDto dto1 = new FormDataDetailDto();
    dto1.setFieldId(1153569499311783936L);
    dto1.setContent("单行文本测试内容");
    dataDetails.add(dto1);

    FormDataDetailDto dto2 = new FormDataDetailDto();
    dto2.setFieldId(1153569499311783937L);
    List<FormDataOptionDto> dataOptions = new ArrayList<>();
    FormDataOptionDto optionDto1 = new FormDataOptionDto();
    optionDto1.setOptionId("1153569499311783901");
    optionDto1.setContent("浏览按钮或选项类数据1");
    dataOptions.add(optionDto1);
    FormDataOptionDto optionDto2 = new FormDataOptionDto();
    optionDto2.setOptionId("1153569499311783902");
    optionDto2.setContent("浏览按钮或选项类数据2");
    dataOptions.add(optionDto2);
    dto2.setDataOptions(dataOptions);
    dataDetails.add(dto2);

    FormDataDetailDto dto3 = new FormDataDetailDto();
    dto3.setFieldId(1153569499311783939L);
    dto3.setContent("明细表单行文本第1行内容");
    dto3.setDataIndex(1L);
    dataDetails.add(dto3);

    formDataDto.setDataDetails(dataDetails);
    FormDataDto saveFormDataDto = formRestFactory.getFormDataRest(module).saveFormData(formDataDto , employee);
}
```

#### 2. 批量新增/更新表单数据

**接口详情：**

```java
    /**
     * 批量局部修改接口
     * 注：
     * 1、不支持多布局数据保存
     * 2、数据必须是同表数据
     * 3、数据id不能为空，此接口只支持修改不支持新增
     * @param param 参数详情
     * @param employee  用户信息
     * @return  数据详情
     */
    List<FormDataDto> saveFormDatas(FormDataDtoParam param, SimpleEmployee employee);
```

**参数说明：**

| 参数名 | 具体属性 | 是否必传 | 类型 | 描述 |
| --- | --- | --- | --- | --- |
| FormDataDtoParam |  | 是 | com.weaver.common.form.dto.data.FormDataDtoParam | 数据对象 |
|  | formDataDtos | 是 | List<com.weaver.common.form.dto.data.FormDataDto> | 数据集合<br>具体属性参考上面第1个接口 |
| fieldIds | 否 | List | 过滤条件字段 ID，根据 ID 匹配数据中的 dataId |  |
| fixFieldIds | 否 | List | 固定字段 ID 集合 |  |
| matchMore | 否 | DataUpdatePolicy | 匹配到多行时的更新策略 |  |
| noMatch | 否 | DataUpdatePolicy | 没有匹配到数据时的更新策略 |  |
| subFormMatchFields | 否 | Map<Long, SubFormMatchDto> | 明细表根据fieldId更新rowId的条件集合，键为subFormId |  |
| subFormDataKeyMatchFields | 否 | Map<String, SubFormMatchDto> | 明细表根据fieldId更新rowId的条件集合，键为subFormDataKey |  |
| errorDatas | 否 | List | 数据匹配异常的数据集合 |  |
| relationId | 否 | Long | 外部模块指定 ID |  |
| refType | 否 | String | 外部指定rowId更新匹配不到时的处理类型 |  |
| fieldList | 否 | List | 数据相关所有字段 |  |
| needDefaultValue | 否 | Boolean | 是否需要默认值，true且新建数据时生效 |  |
| checkEntities | 否 | List | 错误数据提示信息 |  |
| needCheckData | 否 | Boolean | 是否需要预校验并返回具体错误信息 |  |
| checkResult | 否 | List<Map<String, Object>> | 预校验的错误信息 |  |
| shardingValue | 否 | String | 分表字段值 |  |
| singleDataMaxRows | 否 | Integer | 匹配到多行时更新的最大行数 |  |
| allDataMaxRows | 否 | Integer | 总更新行数限制，不能超过 10000 行 |  |
| needValidateInfo | 否 | Boolean | 查重结果是否需要具体信息 |  |
| employee |  | 是 | SimpleEmployee | 用户信息（必须包含id和tenantKey） |

**返回值：**

| 类型 | 具体属性 | 类型所属包路径 | 描述 |
| --- | --- | --- | --- |
| formDataDto |  | **List<com.weaver.common.form.dto.data.FormDataDto>** | 保存后的数据对象 |
| 具体属性 | dataId | Long | 保存后的数据ID |
| recordId | Long | 日志记录ID |  |
| presetDataId | Long | 预设数据ID（保持和入参一致） |  |
| formId | Long | 表单ID（保持和入参一致） |  |
| layoutMultiId | Long | 布局ID（保持和入参一致） |  |
| module | String | 所属模块标识（保持和入参一致） |  |
| objectId | Long | 业务模块事项ID（保持和入参一致） |  |
| dataDetails | com.weaver.common.form.dto.data.FormDataDetailDto | 数据详情（保持和入参一致） |  |
| delRowIds | com.weaver.common.form.dto.data.FormDataDelDto | 删除明细行的标识（保持和入参一致） |  |

**对接示例：**

```java
import com.weaver.common.form.api.rest.FormRestFactory;
@Autowired
FormRestFactory formRestFactory;

public void Test() {
    String module = "workflow";

    SimpleEmployee employee = new SimpleEmployee();
    employee.setId(918327792617603074L);
    employee.setTenantKey("t82kg113nu");

    FormDataDto formDataDto = new FormDataDto();
    formDataDto.setFormId(1L);
    formDataDto.setModule(module);

    //参考文档的数据格式维护
    List<FormDataDetailDto> dataDetails = new ArrayList<>();
    FormDataDetailDto dto1 = new FormDataDetailDto();
    dto1.setFieldId(1153569499311783936L);
    dto1.setContent("单行文本测试内容");
    dataDetails.add(dto1);

    FormDataDetailDto dto2 = new FormDataDetailDto();
    dto2.setFieldId(1153569499311783937L);
    List<FormDataOptionDto> dataOptions = new ArrayList<>();
    FormDataOptionDto optionDto1 = new FormDataOptionDto();
    optionDto1.setOptionId("1153569499311783901");
    optionDto1.setContent("浏览按钮或选项类数据1");
    dataOptions.add(optionDto1);
    FormDataOptionDto optionDto2 = new FormDataOptionDto();
    optionDto2.setOptionId("1153569499311783902");
    optionDto2.setContent("浏览按钮或选项类数据2");
    dataOptions.add(optionDto2);
    dto2.setDataOptions(dataOptions);
    dataDetails.add(dto2);

    FormDataDetailDto dto3 = new FormDataDetailDto();
    dto3.setFieldId(1153569499311783939L);
    dto3.setContent("明细表单行文本第1行内容");
    dto3.setDataIndex(1L);
    dataDetails.add(dto3);

    formDataDto.setDataDetails(dataDetails);
    
    FormDataDtoParam formDataDtoParam = new FormDataDtoParam();
    List<FormDataDto> formDataDtos = new ArrayList<>();
    formDataDtos.add(formDataDto);
    formDataDtoParam.setFormDataDtos(formDataDtos);
    List<FormDataDto> saveFormDataDtoList = formRestFactory.getFormDataRest(module).saveFormDatas(formDataDtoParam , employee);
}
```

#### 3. 批量更新表单数据(非新增)

**接口详情：**

```java
    /**
     * 批量保存、覆盖接口
     * 支持批量新增 、批量覆盖
     * 注：
     * 1、不支持多布局数据保存
     * 2、数据必须是同表数据
     *
     * @param param 参数详情
     * @param employee  用户信息
     * @return java.util.List<com.weaver.common.form.dto.data.FormDataDto>
     */
    List<FormDataDto> saveFieldDatas(FormDataDtoParam param,SimpleEmployee employee);
```

**参数说明：**

| 参数名 | 具体属性 | 是否必传 | 类型 | 描述 |
| --- | --- | --- | --- | --- |
| FormDataDtoParam |  | 是 | com.weaver.common.form.dto.data.FormDataDtoParam | 数据对象 |
|  | formDataDtos | 是 | List<com.weaver.common.form.dto.data.FormDataDto> | 数据集合<br>具体属性参考上面第1个接口 |
| fieldIds | 否 | List | 过滤条件字段 ID，根据 ID 匹配数据中的 dataId |  |
| fixFieldIds | 否 | List | 固定字段 ID 集合 |  |
| matchMore | 否 | DataUpdatePolicy | 匹配到多行时的更新策略 |  |
| noMatch | 否 | DataUpdatePolicy | 没有匹配到数据时的更新策略 |  |
| subFormMatchFields | 否 | Map<Long, SubFormMatchDto> | 明细表根据fieldId更新rowId的条件集合，键为subFormId |  |
| subFormDataKeyMatchFields | 否 | Map<String, SubFormMatchDto> | 明细表根据fieldId更新rowId的条件集合，键为subFormDataKey |  |
| errorDatas | 否 | List | 数据匹配异常的数据集合 |  |
| relationId | 否 | Long | 外部模块指定 ID |  |
| refType | 否 | String | 外部指定rowId更新匹配不到时的处理类型 |  |
| fieldList | 否 | List | 数据相关所有字段 |  |
| needDefaultValue | 否 | Boolean | 是否需要默认值，true且新建数据时生效 |  |
| checkEntities | 否 | List | 错误数据提示信息 |  |
| needCheckData | 否 | Boolean | 是否需要预校验并返回具体错误信息 |  |
| checkResult | 否 | List<Map<String, Object>> | 预校验的错误信息 |  |
| shardingValue | 否 | String | 分表字段值 |  |
| singleDataMaxRows | 否 | Integer | 匹配到多行时更新的最大行数 |  |
| allDataMaxRows | 否 | Integer | 总更新行数限制，不能超过 10000 行 |  |
| needValidateInfo | 否 | Boolean | 查重结果是否需要具体信息 |  |
| employee |  | 是 | SimpleEmployee | 用户信息（必须包含id和tenantKey） |

**返回值：**

| 类型 | 具体属性 | 类型所属包路径 | 描述 |
| --- | --- | --- | --- |
| formDataDto |  | **List<com.weaver.common.form.dto.data.FormDataDto>** | 保存后的数据对象 |
| 具体属性 | dataId | Long | 保存后的数据ID |
| recordId | Long | 日志记录ID |  |
| presetDataId | Long | 预设数据ID（保持和入参一致） |  |
| formId | Long | 表单ID（保持和入参一致） |  |
| layoutMultiId | Long | 布局ID（保持和入参一致） |  |
| module | String | 所属模块标识（保持和入参一致） |  |
| objectId | Long | 业务模块事项ID（保持和入参一致） |  |
| dataDetails | com.weaver.common.form.dto.data.FormDataDetailDto | 数据详情（保持和入参一致） |  |
| delRowIds | com.weaver.common.form.dto.data.FormDataDelDto | 删除明细行的标识（保持和入参一致） |  |

**对接示例：**

```java
import com.weaver.common.form.api.rest.FormRestFactory;
@Autowired
FormRestFactory formRestFactory;

public void Test() {
    String module = "workflow";

    SimpleEmployee employee = new SimpleEmployee();
    employee.setId(918327792617603074L);
    employee.setTenantKey("t82kg113nu");

    FormDataDto formDataDto = new FormDataDto();
    formDataDto.setFormId(1L);
    formDataDto.setModule(module);

    //参考文档的数据格式维护
    List<FormDataDetailDto> dataDetails = new ArrayList<>();
    FormDataDetailDto dto1 = new FormDataDetailDto();
    dto1.setFieldId(1153569499311783936L);
    dto1.setContent("单行文本测试内容");
    dataDetails.add(dto1);

    FormDataDetailDto dto2 = new FormDataDetailDto();
    dto2.setFieldId(1153569499311783937L);
    List<FormDataOptionDto> dataOptions = new ArrayList<>();
    FormDataOptionDto optionDto1 = new FormDataOptionDto();
    optionDto1.setOptionId("1153569499311783901");
    optionDto1.setContent("浏览按钮或选项类数据1");
    dataOptions.add(optionDto1);
    FormDataOptionDto optionDto2 = new FormDataOptionDto();
    optionDto2.setOptionId("1153569499311783902");
    optionDto2.setContent("浏览按钮或选项类数据2");
    dataOptions.add(optionDto2);
    dto2.setDataOptions(dataOptions);
    dataDetails.add(dto2);

    FormDataDetailDto dto3 = new FormDataDetailDto();
    dto3.setFieldId(1153569499311783939L);
    dto3.setContent("明细表单行文本第1行内容");
    dto3.setDataIndex(1L);
    dataDetails.add(dto3);

    formDataDto.setDataDetails(dataDetails);
    
    FormDataDtoParam formDataDtoParam = new FormDataDtoParam();
    List<FormDataDto> formDataDtos = new ArrayList<>();
    formDataDtos.add(formDataDto);
    formDataDtoParam.setFormDataDtos(formDataDtos);
    List<FormDataDto> saveFormDataDtoList = formRestFactory.getFormDataRest(module).saveFieldDatas(formDataDtoParam , employee);
}
```

#### 4. 查询表单数据

**接口详情：**

```java
      /**
     * 批量数据查询
     * @param formId 表单Id
     * @param dataIds 数据Id集合
     * @param employee 人员信息
     * @return 数据列表
     */
    List<FormDataDto> getFormDataByIds(Long formId, List<Long> dataIds, SimpleEmployee employee);
```

**参数说明：**

| 参数名 | 是否必传 | 类型 | 描述 |
| --- | --- | --- | --- |
| formId | 是 | Long | 表单Id |
| dataIds | 是 | List<Long> | 数据Id集合 |
| employee | 是 | SimpleEmployee | 用户信息（必须包含id和tenantKey） |

**返回值：**

| 类型 | 具体属性 | 类型所属包路径 | 描述 |
| --- | --- | --- | --- |
| formDataDto |  | **List<com.weaver.common.form.dto.data.FormDataDto>** | 保存后的数据对象 |
| 具体属性 | dataId | Long | 保存后的数据ID |
| recordId | Long | 日志记录ID |  |
| formId | Long | 表单ID |  |
| layoutMultiId | Long | 布局ID |  |
| module | String | 所属模块标识 |  |
| dataDetails | com.weaver.common.form.dto.data.FormDataDetailDto | 数据详情 |  |

**对接示例：**

```java
import com.weaver.common.form.api.rest.FormRestFactory;
@Autowired
FormRestFactory formRestFactory;

public void Test() {
    String module = "workflow";

    SimpleEmployee employee = new SimpleEmployee();
    employee.setId(918327792617603074L);
    employee.setTenantKey("t82kg113nu");

    List<Long> dataIds = new ArrayList<>();
    Long formId = 1152742013871702016L;
    dataIds.add(4775159378942784394L);
    dataIds.add(4775211768020004915L);
    List<FormDataDto> formDataList = formRestFactory.getFormDataRest(module).getFormDataByIds(formId ,dataIds, employee);
}
```

#### 5. 查询明细表最大行数

**接口详情：**

```java
    /**
     * 获取明细表最大行
     *
     * @param formId    表单ID
     * @param formDataId    数据Id
     * @param user          用户信息
     * @return  明细表最大行
     */
    List<Map<String, String>> getMaxSubFormIndex(Long formId, Long formDataId, SimpleEmployee user);
```

**参数说明：**

| 参数名 | 是否必传 | 类型 | 描述 |
| --- | --- | --- | --- |
| formId | 是 | Long | 表单Id |
| formDataId | 是 | Long | 数据Id |
| employee | 是 | SimpleEmployee | 用户信息（必须包含id和tenantKey） |

**返回值：**

| 类型 | 具体属性 | 类型所属包路径 | 描述 |
| --- | --- | --- | --- |
| List<Map<String, String>> |  | List<Map<String, String>> | 保存后的数据对象 |
| Map的属性说明 | subFormId | String | 明细表ID |
| maxIndex | String | 最大行数 |  |

**对接示例：**

```java
import com.weaver.common.form.api.rest.FormRestFactory;
@Autowired
FormRestFactory formRestFactory;

public void Test() {
    String module = "workflow";

    SimpleEmployee employee = new SimpleEmployee();
    employee.setId(918327792617603074L);
    employee.setTenantKey("t82kg113nu");

    List<Long> dataIds = new ArrayList<>();
    Long formId = 1L;
    Long dataId= 2L;
    List<Map<String, String>> maps = formRestFactory.getFormDataRest(module).getMaxSubFormIndex(formId ,dataId, employee);
}
```

#### 6. 根据rowid更新明细表数据

**接口详情：**

```java
     /**
     * 跟rowId 進行修改、新增、刪除明細表行
     * 刪除行需要傳 formDataDelDto對象
     * formDataDto 需要傳 對應的formId、DataId(修改)、layoutId
     *
     * @param formDataDto 數據信息
     * @param employee  用户信息
     * @return  数据详情
     */
    FormDataDto saveFormDataByRowIds(FormDataDto formDataDto, SimpleEmployee employee);
```

**参数说明：**

| 参数名 | 具体属性 | 是否必传 | 类型 | 描述 |
| --- | --- | --- | --- | --- |
| formDataDto |  | 是 | **com.weaver.common.form.dto.data.FormDataDto** | 数据对象 |
|  | dataId | 否 | Long | 数据ID，新增时不传，更新时必传 |
|  | presetDataId | 否 | Long | 预设数据ID<br>传递了此属性时不需要传入dataid，会将此ID作为数据ID进行新增 |
|  | formId | 是 | Long | 表单ID |
|  | layoutMultiId | 否 | Long | 布局ID |
|  | module | 是 | String | 所属模块标识 |
|  | execMonitor | 否 | boolean | 是否执行运算（不支持字段联动） |
|  | execRelate | 否 | boolean | 是否执行钻取（不支持字段联动） |
|  | objectId | 否 | Long | 业务模块事项ID，比如审批ID，数据上报ID 等等<br>涉及到附件上传、事项公共关联操作时必传。 |
|  | dataDetails | 是 | com.weaver.common.form.dto.data.FormDataDetailDto | 数据详情<br>**此接口必传rowId属性** |
|  | dataDetails的<br>属性说明 | fieldId | 字段id |  |
|  | content | 数据内容 |  |  |
|  | optionId | 选项类字段的选项id |  |  |
|  | dataIndex | 明细表下标 |  |  |
|  | rowId | 明细表行Id |  |  |
|  | delRowIds | 否 | com.weaver.common.form.dto.data.FormDataDelDto | 删除明细行的标识<br>传入时subFormId、rowId必传 |
|  | recordId | 否 | Long |  |
| employee |  | 是 | SimpleEmployee | 用户信息（必须包含id和tenantKey） |

**返回值：**

| 类型 | 具体属性 | 类型所属包路径 | 描述 |
| --- | --- | --- | --- |
| formDataDto |  | **com.weaver.common.form.dto.data.FormDataDto** | 保存后的数据对象 |
| 具体属性 | dataId | Long | 保存后的数据ID |
| recordId | Long | 日志记录ID |  |
| presetDataId | Long | 预设数据ID（保持和入参一致） |  |
| formId | Long | 表单ID（保持和入参一致） |  |
| layoutMultiId | Long | 布局ID（保持和入参一致） |  |
| module | String | 所属模块标识（保持和入参一致） |  |
| execMonitor | boolean | 是否执行运算（保持和入参一致） |  |
| execRelate | boolean | 是否执行钻取（保持和入参一致） |  |
| objectId | Long | 业务模块事项ID（保持和入参一致） |  |
| dataDetails | com.weaver.common.form.dto.data.FormDataDetailDto | 数据详情（保持和入参一致） |  |
| delRowIds | com.weaver.common.form.dto.data.FormDataDelDto | 删除明细行的标识（保持和入参一致） |  |

**对接示例：**

```java
import com.weaver.common.form.api.rest.FormRestFactory;
@Autowired
FormRestFactory formRestFactory;

public void Test() {
    String module = "workflow";

    SimpleEmployee employee = new SimpleEmployee();
    employee.setId(918327792617603074L);
    employee.setTenantKey("t82kg113nu");

    FormDataDto formDataDto = new FormDataDto();
    formDataDto.setFormId(1L);
    formDataDto.setModule(module);

    //具体数据可以参考文档的数据格式维护
    List<FormDataDetailDto> dataDetails = new ArrayList<>();

    FormDataDetailDto dto1 = new FormDataDetailDto();
    dto1.setFieldId(1153569499311783937L);
    List<FormDataOptionDto> dataOptions = new ArrayList<>();
    FormDataOptionDto optionDto1 = new FormDataOptionDto();
    optionDto1.setOptionId("1153569499311783901");
    optionDto1.setContent("浏览按钮或选项类数据1");
    dataOptions.add(optionDto1);
    FormDataOptionDto optionDto2 = new FormDataOptionDto();
    optionDto2.setOptionId("1153569499311783902");
    optionDto2.setContent("浏览按钮或选项类数据2");
    dataOptions.add(optionDto2);
    dto1.setDataOptions(dataOptions);
    dto1.setRowId(1125279782485803008L);
    dataDetails.add(dto1);

    FormDataDetailDto dto2 = new FormDataDetailDto();
    dto2.setFieldId(1153569499311783939L);
    dto2.setContent("明细表单行文本第1行内容");
    dto2.setDataIndex(1L);
    dto2.setRowId(1125279782485803008L);
    dataDetails.add(dto2);

    formDataDto.setDataDetails(dataDetails);
    FormDataDto saveFormDataDto = formRestFactory.getFormDataRest(module).saveFormDataByRowIds(formDataDto , employee);
}
```

#### 7. 根据不同条件更新数据接口

**接口详情：**

```java
    /**
     * 根据条件进行修改、新增
     * 支持根据条件批量修改、局部修改、批量新增
     * 注：
     * 1、不支持多布局数据保存
     * 2、数据必须是同表数据
     * @param  param    参数详情
     * @param employee  用户信息
     * @return 数据详情
     */
    List<FormDataDto> saveFormDatasByCondition(FormDataDtoParam param,SimpleEmployee employee);
```

**参数说明：**

| 参数名 | 具体属性 | 是否必传 | 类型 | 描述 |
| --- | --- | --- | --- | --- |
| FormDataDtoParam |  | 是 | com.weaver.common.form.dto.data.FormDataDtoParam | 数据对象 |
|  | formDataDtos | 是 | List<com.weaver.common.form.dto.data.FormDataDto> | 数据集合<br>具体属性参考上面第1个接口 |
| fieldIds | 否 | List | 过滤条件字段 ID，根据 ID 匹配数据中的 dataId |  |
| fixFieldIds | 否 | List | 固定字段 ID 集合 |  |
| matchMore | 否 | DataUpdatePolicy | 匹配到多行时的更新策略 |  |
| noMatch | 否 | DataUpdatePolicy | 没有匹配到数据时的更新策略 |  |
| subFormMatchFields | 否 | Map<Long, SubFormMatchDto> | 明细表根据fieldId更新rowId的条件集合，键为subFormId |  |
| subFormDataKeyMatchFields | 否 | Map<String, SubFormMatchDto> | 明细表根据fieldId更新rowId的条件集合，键为subFormDataKey |  |
| errorDatas | 否 | List | 数据匹配异常的数据集合 |  |
| relationId | 否 | Long | 外部模块指定 ID |  |
| refType | 否 | String | 外部指定rowId更新匹配不到时的处理类型 |  |
| fieldList | 否 | List | 数据相关所有字段 |  |
| needDefaultValue | 否 | Boolean | 是否需要默认值，true且新建数据时生效 |  |
| checkEntities | 否 | List | 错误数据提示信息 |  |
| needCheckData | 否 | Boolean | 是否需要预校验并返回具体错误信息 |  |
| checkResult | 否 | List<Map<String, Object>> | 预校验的错误信息 |  |
| shardingValue | 否 | String | 分表字段值 |  |
| singleDataMaxRows | 否 | Integer | 匹配到多行时更新的最大行数 |  |
| allDataMaxRows | 否 | Integer | 总更新行数限制，不能超过 10000 行 |  |
| needValidateInfo | 否 | Boolean | 查重结果是否需要具体信息 |  |
| formId | 是 | Long | 表单ID |  |
| layoutMultiId | 否 | Long | 布局ID |  |
| module | 是 | String | 所属模块 |  |
| customParams | 否 | Map<String, Object> | 自定义参数 |  |
| newLayout | 否 | boolean | 是否使用最新布局，默认true |  |
| optionNoFindIgnore | 否 | boolean | 浏览按钮选项未找到时是否忽略 |  |
| dataKeyNoFindIgnore | 否 | Boolean | 根据dataKey匹配时未找到时是否忽略 |  |
| execIgnoreParam | 否 | boolean | 是否忽略运算入参（配置了运算函数） |  |
| execMonitor | 否 | boolean | 是否执行运算 |  |
| execRelate | 否 | boolean | 是否执行数据钻取 |  |
| validate | 否 | boolean | 是否开启数据查重校验 |  |
| validateExecuted | 否 | Boolean | 是否已经执行过数据查重校验 |  |
| client | 否 | String | 客户端来源 |  |
| simpleFormDataLog | 否 | SimpleFormDataLog | 表单修改日志相关信息 |  |
| name | 否 | String | 名称 |  |
| moneyTypeUseDefault | 否 | boolean | 金额启用币种时如果没有传递币种是否传递默认币种 |  |
| moneyTypeIgnore | 否 | Boolean | 是否忽略币种 |  |
| getOptionNewName | 否 | boolean | 是否获取最新名称 |  |
| needUpdateDataIndex | 否 | Boolean | 是否更新dataIndex |  |
| needUpdateDataUpdateTime | 否 | Boolean | 是否需要更新数据更新时间 |  |
| employee |  | 是 | SimpleEmployee | 用户信息（必须包含id和tenantKey） |

**返回值：**

| 类型 | 具体属性 | 类型所属包路径 | 描述 |
| --- | --- | --- | --- |
| formDataDto |  | **com.weaver.common.form.dto.data.FormDataDto** | 保存后的数据对象 |
| 具体属性 | dataId | Long | 保存后的数据ID |
| recordId | Long | 日志记录ID |  |
| presetDataId | Long | 预设数据ID（保持和入参一致） |  |
| formId | Long | 表单ID（保持和入参一致） |  |
| layoutMultiId | Long | 布局ID（保持和入参一致） |  |
| module | String | 所属模块标识（保持和入参一致） |  |
| execMonitor | boolean | 是否执行运算（保持和入参一致） |  |
| execRelate | boolean | 是否执行钻取（保持和入参一致） |  |
| objectId | Long | 业务模块事项ID（保持和入参一致） |  |
| dataDetails | com.weaver.common.form.dto.data.FormDataDetailDto | 数据详情（保持和入参一致） |  |
| delRowIds | com.weaver.common.form.dto.data.FormDataDelDto | 删除明细行的标识（保持和入参一致） |  |

**对接示例：**

```java
import com.weaver.common.form.api.rest.FormRestFactory;
@Autowired
FormRestFactory formRestFactory;

public void Test() {
    String module = "workflow";

    SimpleEmployee employee = new SimpleEmployee();
    employee.setId(918327792617603074L);
    employee.setTenantKey("t82kg113nu");

    FormDataDto formDataDto = new FormDataDto();
    formDataDto.setFormId(1L);
    formDataDto.setModule(module);

    //参考文档的数据格式维护
    List<FormDataDetailDto> dataDetails = new ArrayList<>();
    FormDataDetailDto dto1 = new FormDataDetailDto();
    dto1.setFieldId(1153569499311783936L);
    dto1.setContent("单行文本测试内容");
    dataDetails.add(dto1);

    FormDataDetailDto dto2 = new FormDataDetailDto();
    dto2.setFieldId(1153569499311783937L);
    List<FormDataOptionDto> dataOptions = new ArrayList<>();
    FormDataOptionDto optionDto1 = new FormDataOptionDto();
    optionDto1.setOptionId("1153569499311783901");
    optionDto1.setContent("浏览按钮或选项类数据1");
    dataOptions.add(optionDto1);
    FormDataOptionDto optionDto2 = new FormDataOptionDto();
    optionDto2.setOptionId("1153569499311783902");
    optionDto2.setContent("浏览按钮或选项类数据2");
    dataOptions.add(optionDto2);
    dto2.setDataOptions(dataOptions);
    dataDetails.add(dto2);

    FormDataDetailDto dto3 = new FormDataDetailDto();
    dto3.setFieldId(1153569499311783939L);
    dto3.setContent("明细表单行文本第1行内容");
    dto3.setDataIndex(1L);
    dataDetails.add(dto3);

    formDataDto.setDataDetails(dataDetails);
    
    FormDataDtoParam formDataDtoParam = new FormDataDtoParam();
    List<FormDataDto> formDataDtos = new ArrayList<>();
    formDataDtos.add(formDataDto);
    formDataDtoParam.setFormDataDtos(formDataDtos);

    //如果需要按照字段值匹配更新，则这里维护匹配条件的字段ID
    List<Long> updateFieldId= new ArrayList<>();
    updateFieldId.add(1153569499311783936L);
    formDataDtoParam.setFieldIds(updateFieldId);

    List<FormDataDto> saveFormDataDtoList = formRestFactory.getFormDataRest(module).saveFormDatasByCondition(formDataDtoParam , employee);
}
```

####
