You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

REDCap嵌套重复仪器中复制DRUGS实例数据的方案咨询

解决REDCap嵌套重复仪器自动复制数据的问题

针对你在嵌套重复仪器(VISIT下嵌套DRUGS)场景中自动复制上一访视药物数据的需求,以下是三种可行解决方案:


方案1:项目钩子(Project Hooks)+ REDCap API(最可靠的自动方案)

Copy Data on Save模块对嵌套重复仪器的支持有限,用项目钩子配合API可以实现精准的自动复制逻辑。

实现步骤:

  1. 在项目的hooks目录下创建hooks.php文件(如果没有hooks目录,联系管理员创建)
  2. 插入以下代码(替换占位符为你的项目实际信息):
<?php
function redcap_save_record($project_id, $record, $instrument, $event_id, $group_id, $survey_hash, $response_id, $repeat_instance) {
    // 仅处理VISIT仪器的新建实例(第一个实例无需复制)
    if ($instrument !== 'visit' || $repeat_instance == 1) return;

    // 获取上一个VISIT实例编号
    $prev_visit_instance = $repeat_instance - 1;
    $api_url = APP_PATH_WEBROOT_FULL . 'api/';
    $api_token = 'YOUR_PROJECT_API_TOKEN'; // 替换为你的项目API令牌
    $target_drug_instrument = 'drugs'; // 替换为DRUGS仪器的内部名称

    // 调用API导出上一VISIT下的所有DRUGS数据
    $export_params = array(
        'token' => $api_token,
        'content' => 'record',
        'action' => 'export',
        'format' => 'json',
        'records' => $record,
        'events' => $event_id,
        'instruments' => $target_drug_instrument,
        'repeat_instance' => $prev_visit_instance,
        'returnFormat' => 'json'
    );

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $api_url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($export_params));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $drug_data = json_decode(curl_exec($ch), true);
    curl_close($ch);

    if (empty($drug_data)) return;

    // 修改DRUGS数据的关联VISIT实例编号为当前新建的实例
    foreach ($drug_data as &$drug_entry) {
        $drug_entry['redcap_repeat_instance'] = $repeat_instance;
        $drug_entry['redcap_repeat_instrument'] = $target_drug_instrument;
    }

    // 调用API批量导入新的DRUGS实例
    $import_params = array(
        'token' => $api_token,
        'content' => 'record',
        'action' => 'import',
        'format' => 'json',
        'type' => 'flat',
        'overwriteBehavior' => 'normal',
        'forceAutoNumber' => false,
        'data' => json_encode($drug_data),
        'returnFormat' => 'json'
    );

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $api_url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($import_params));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_exec($ch);
    curl_close($ch);
}
?>

注意事项:

  • 确保API令牌拥有项目的读写权限
  • 替换visit、drugs为仪器的内部名称(不是显示名称,可在仪器设置页查看)
  • 先在测试项目中验证逻辑,避免影响正式数据

方案2:自定义JavaScript + REDCap API(前端触发方案)

如果无法使用项目钩子,可以在前端通过JS监听VISIT保存事件,自动调用API复制数据。

实现步骤:

在项目的「自定义HTML/JS」设置中,添加以下代码:

// 监听VISIT仪器保存完成事件
$(document).on('submitComplete', function(event, data) {
    // 仅处理VISIT仪器的非第一个实例
    if (data.instrument !== 'visit' || data.repeatInstance === 1) return;

    const recordId = $('input[name="record"]').val();
    const eventId = $('input[name="event_id"]').val();
    const currentInstance = data.repeatInstance;
    const prevInstance = currentInstance - 1;
    const apiToken = 'YOUR_PROJECT_API_TOKEN';
    const apiUrl = REDCapAPI_URL;

    // 导出上一VISIT的DRUGS数据
    $.ajax({
        url: apiUrl,
        method: 'POST',
        data: {
            token: apiToken,
            content: 'record',
            action: 'export',
            format: 'json',
            records: recordId,
            events: eventId,
            instruments: 'drugs',
            repeat_instance: prevInstance,
            returnFormat: 'json'
        },
        success: function(drugData) {
            if (drugData.length === 0) return;

            // 更新DRUGS数据的关联实例编号
            drugData.forEach(drug => {
                drug.redcap_repeat_instance = currentInstance;
            });

            // 导入新的DRUGS实例
            $.ajax({
                url: apiUrl,
                method: 'POST',
                data: {
                    token: apiToken,
                    content: 'record',
                    action: 'import',
                    format: 'json',
                    type: 'flat',
                    overwriteBehavior: 'normal',
                    forceAutoNumber: false,
                    data: JSON.stringify(drugData),
                    returnFormat: 'json'
                },
                success: function() {
                    // 刷新页面显示新复制的DRUGS实例
                    location.reload();
                }
            });
        }
    });
});

注意事项:

  • 依赖前端JS,若用户禁用JS则失效
  • 同样需要替换API令牌和仪器内部名称

方案3:排查Copy Data on Save模块配置(快速尝试)

如果之前配置失败,可能是参数设置错误,重新检查:

  • 确保模块为最新版本(旧版本不支持嵌套重复仪器)
  • 配置页中:
    • 源仪器选择VISIT,源实例设置为「上一个实例」
    • 目标仪器选择DRUGS,目标实例设置为「新建实例」
    • 勾选所有需要复制的DRUGS字段
  • 测试新建VISIT实例,若仍无法复制,说明模块确实不支持嵌套场景,改用前两种方案

内容的提问来源于stack exchange,提问作者STEFANO CALZA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 06:31:03