liusheng
2026-11-03 7191c6d38f03f2e1baf39f959227ce9c038e4e96
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java
@@ -518,8 +518,29 @@
        }
    }
    /**
     * 同一份问卷的保存锁:按「任务+患者+子任务」加锁,
     * 前端重复点击 / 并发请求进来时串行执行,避免同一份问卷被写两遍。
     * 注意:只是串行化,不阻止再次保存——问卷仍然允许修改后再保存(走更新逻辑)。
     */
    private static final java.util.concurrent.ConcurrentHashMap<String, Object> SAVE_LOCKS =
            new java.util.concurrent.ConcurrentHashMap<>();
    @Override
    public Integer saveQuestionDetail(ServiceSubTaskCacheReq serviceSubTaskCacheReq, Long flag) {
        String lockKey = serviceSubTaskCacheReq.getParam1() + "_"
                + serviceSubTaskCacheReq.getParam2() + "_"
                + serviceSubTaskCacheReq.getParam6();
        Object lock = SAVE_LOCKS.computeIfAbsent(lockKey, k -> new Object());
        if (SAVE_LOCKS.size() > 20000) {
            SAVE_LOCKS.clear();
        }
        synchronized (lock) {
            return doSaveQuestionDetail(serviceSubTaskCacheReq, flag);
        }
    }
    private Integer doSaveQuestionDetail(ServiceSubTaskCacheReq serviceSubTaskCacheReq, Long flag) {
        Long tid = Long.valueOf(serviceSubTaskCacheReq.getParam1());
        Long pid = Long.valueOf(serviceSubTaskCacheReq.getParam2());
        Long subid = Long.valueOf(serviceSubTaskCacheReq.getParam6());