diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvSurveyController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvSurveyController.java index d10371e..d9e6142 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvSurveyController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/h5controller/H5QsvSurveyController.java @@ -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 subjects = dao.query(QsvSubject.class, Cnd.where("id", "in", answerRecord2.getSubjectIds()).asc("sortNum")); diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/service/QsvUserAnswerRecordService.java b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/service/QsvUserAnswerRecordService.java index bb2ae45..22f9a75 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/service/QsvUserAnswerRecordService.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/service/QsvUserAnswerRecordService.java @@ -12,6 +12,13 @@ public interface QsvUserAnswerRecordService extends BaseService subjectIds); + /** + * 同步未提交调查问卷的当前题目,保留已有答案并补齐新增题目的答案结构。 + * @param answerRecordId 已通过参与范围校验的当前用户答题记录ID + * @return 答题记录,subjectIds 为同步后的题目ID列表,extJson 按题目ID保存答案;已提交或非调查记录原样返回 + */ + QsvUserAnswerRecord syncSurveySubjects(String answerRecordId); + /** * 计算得分 */ diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/service/impl/QsvUserAnswerRecordServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/service/impl/QsvUserAnswerRecordServiceImpl.java index e22005c..fe0ba83 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/service/impl/QsvUserAnswerRecordServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/qsv/service/impl/QsvUserAnswerRecordServiceImpl.java @@ -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 subjectIds) { QsvActivity activity = dao().fetch(QsvActivity.class, activityId); String category = activity.getCategory(); @@ -85,6 +87,51 @@ public class QsvUserAnswerRecordServiceImpl extends BaseServiceImpl subjects = dao().query(QsvSubject.class, + Cnd.where("activityId", "=", record.getActivityId()).asc("sortNum")); + List 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 subjectIds = qsvAnswerParam.getSubjects().stream().map(QsvAnswerParam.Subject::getId).toList();