修复:调查问卷查看题目后,新增的题目看不到了

This commit is contained in:
2026-10-27 10:55:28 +08:00
parent f9f112104d
commit 986faea6b3
3 changed files with 62 additions and 0 deletions
@@ -13,6 +13,8 @@ import com.budwk.app.zhgh.dayofficework.qsv.param.QsvAnswerParam;
import com.budwk.app.zhgh.dayofficework.qsv.service.QsvUserAnswerRecordService;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
@@ -45,7 +47,12 @@ public class H5QsvSurveyController {
public void index() {
}
/**
* activityId 为当前调查活动ID;返回 Result,data 包含 activity、subjects、answerRecordId。
* 未提交答卷由 service 同步当前题目及新增答案结构,再加载题目供手机端显示。
*/
@At
@Aop(TransAop.READ_COMMITTED)
public Result subjects(String activityId) {
QsvActivity activity = dao.fetch(QsvActivity.class, activityId);
@@ -68,6 +75,7 @@ public class H5QsvSurveyController {
Cnd.where("activityId", "=", activityId)
.and("userId", "=", SecurityUtil.getUserId()));
answerRecord2 = qsvUserAnswerRecordService.syncSurveySubjects(answerRecord2.getId());
answerRecordId = answerRecord2.getId();
List<QsvSubject> subjects = dao.query(QsvSubject.class, Cnd.where("id", "in", answerRecord2.getSubjectIds()).asc("sortNum"));
@@ -12,6 +12,13 @@ public interface QsvUserAnswerRecordService extends BaseService<QsvUserAnswerRec
QsvUserAnswerRecord insertRecord(String activityId, List<String> subjectIds);
/**
* 同步未提交调查问卷的当前题目,保留已有答案并补齐新增题目的答案结构。
* @param answerRecordId 已通过参与范围校验的当前用户答题记录ID
* @return 答题记录,subjectIds 为同步后的题目ID列表,extJson 按题目ID保存答案;已提交或非调查记录原样返回
*/
QsvUserAnswerRecord syncSurveySubjects(String answerRecordId);
/**
* 计算得分
*/
@@ -17,6 +17,7 @@ import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import java.util.*;
@@ -27,6 +28,7 @@ public class QsvUserAnswerRecordServiceImpl extends BaseServiceImpl<QsvUserAnswe
}
@Override
@Aop(TransAop.READ_COMMITTED)
public QsvUserAnswerRecord insertRecord(String activityId, List<String> subjectIds) {
QsvActivity activity = dao().fetch(QsvActivity.class, activityId);
String category = activity.getCategory();
@@ -85,6 +87,51 @@ public class QsvUserAnswerRecordServiceImpl extends BaseServiceImpl<QsvUserAnswe
}
/**
* 按记录ID同步未提交的调查问卷,返回包含当前题目列表及答案结构的记录。
* 仅补齐缺失答案,不清除已有答案;已提交记录及考试抽题记录不参与同步。
*/
@Override
@Aop(TransAop.READ_COMMITTED)
public QsvUserAnswerRecord syncSurveySubjects(String answerRecordId) {
QsvUserAnswerRecord record = dao().fetch(QsvUserAnswerRecord.class, answerRecordId);
if (record == null) {
throw new IllegalArgumentException("答题记录不存在");
}
if (Boolean.TRUE.equals(record.getIsFinish())) {
return record;
}
QsvActivity activity = dao().fetch(QsvActivity.class, record.getActivityId());
if (activity == null || !"SURVEY".equals(activity.getCategory())) {
return record;
}
List<QsvSubject> subjects = dao().query(QsvSubject.class,
Cnd.where("activityId", "=", record.getActivityId()).asc("sortNum"));
List<String> subjectIds = subjects.stream().map(QsvSubject::getId).toList();
JSONObject extJson = record.getExtJson() == null ? new JSONObject() : record.getExtJson();
boolean changed = !Objects.equals(subjectIds, record.getSubjectIds());
for (String subjectId : subjectIds) {
// 提交接口只更新已存在的答案对象,新增题目必须同时补齐结构才能保存答案。
JSONObject answer = extJson.get(subjectId, JSONObject.class);
if (answer == null || answer.isEmpty()) {
extJson.set(subjectId, Dict.create()
.set("optionIds", new ArrayList<>())
.set("text", null)
.set("isCorrect", null));
changed = true;
}
}
if (changed) {
// 只更新题目和答案字段,并再次限制未提交状态,避免并发提交后覆盖已完成的答卷。
dao().update(QsvUserAnswerRecord.class,
Chain.make("subjectIds", Json.toJson(subjectIds)).add("extJson", extJson.toString()),
Cnd.where("id", "=", answerRecordId)
.and(Cnd.exps("isFinish", "=", false).or("isFinish", "is", null)));
return dao().fetch(QsvUserAnswerRecord.class, answerRecordId);
}
return record;
}
@Override
public float calcScore(QsvAnswerParam qsvAnswerParam) {
List<String> subjectIds = qsvAnswerParam.getSubjects().stream().map(QsvAnswerParam.Subject::getId).toList();