陈昶聿
2 天以前 cf8712a9c0816559f50644f15672e7359028c4c4
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java
@@ -64,6 +64,7 @@
import com.ruoyi.task.domain.ServiceSubtaskPreachform;
import com.ruoyi.task.service.IServiceTaskService;
import com.ruoyi.task.mapper.ServiceSubtaskPreachformMapper;
import com.ruoyi.task.event.FollowupCompletedEventPublisher;
import com.ruoyi.patarchive.mapper.PatArchiveMapper;
/**
 * 任务问卷问题选项Service业务层处理
@@ -91,6 +92,9 @@
    @Autowired
    private ServiceSubtaskMapper serviceSubtaskMapper;
    @Autowired
    private FollowupCompletedEventPublisher followupCompletedEventPublisher;
    @Autowired
    private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper;
@@ -476,6 +480,7 @@
                log.error("将该key和value从redis中,serviceSubtask的值为--------:{}", serviceSubtask);
                serviceSubtask.setScore(formatScore(scoreTotal));
                serviceSubtaskMapper.updateServiceSubtaskByCondition(serviceSubtask);
                followupCompletedEventPublisher.publish(serviceSubtask.getId());
                //将当前发送状态改成 9 完成(缓存 preachform 查询)
                String currentPreachform = serviceSubtask.getCurrentPreachform();
@@ -518,8 +523,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());
@@ -643,6 +669,7 @@
            serviceSubtask.setUpdateTime(new Date());
            serviceSubtask.setScore(formatScore(scoreTotal));
            serviceSubtaskMapper.updateServiceSubtaskByCondition(serviceSubtask);
            followupCompletedEventPublisher.publish(serviceSubtask.getId());
            //将当前发送状态改成9完成
            ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
@@ -802,6 +829,7 @@
                serviceSubtask.setVisitTime(new Date());
                serviceSubtask.setScore(formatScore(scoreTotal));
                serviceSubtaskMapper.insertServiceSubtask(serviceSubtask);
                followupCompletedEventPublisher.publish(serviceSubtask.getId());
                //将当前发送状态改成9完成
                ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
                serviceSubtaskPreachform.setPreachform(serviceSubtask.getCurrentPreachform());