解决方法
一、关于试卷展示试题的顺序引发的问题
关于新增数据时数据顺序的问题引发的理解list、map是否是有序的查询及新增数据时id自增和uuid的是否是按照顺序存储的问题
1、查询:
List是有序查询的,hashMap是无序的,linkedHashMap是有序的。
2、新增:
自增是可以依次按照传入数据是顺序新增每条数据,UUID的形式是无法按照顺序依次新增的。
3、解决办法:由于自定义表单是封装的未通过实体形式新增数据,所以单独接口的编写是通过jdbc的形式编写的,根据同事的帮助有三种解决办法
(1)查询时通过试题序号order by 排序。
(2)新增时不使用UUID 使用自增的id进行保存,但由于框架封装的原因,暂不考虑。
(3)根据创建时间查询,但由于创建时间会出现并发的问题,不考虑。
4、代码部分:
js传参
questIds=1,2,3,4,5,3,
questIdsSort =[{"id":"1","sort":"1"},{"id":"2","sort":"2"}]
逻辑层
@Transactional(readOnly = false)
public String dataAdd(String newTableName,String oldTableName,String taskId,String paperId,String questIds,String questIdsSort){
//TODO 记录试卷表新增
if(Func.isNotEmpty(paperId)){
//根据试卷id获取原始试卷表数据
String paperSql = "select * from "+ oldTableName +" where id = '"
+paperId + "' order by create_time" ;
List<Map<String,Object>> paperMapList = jdbcTemplate.queryForList(paperSql);
for(Map jData : paperMapList){
//任务id
jData.put("input_124444444444",taskId);
//试卷id
jData.put("input_153322222222",paperId);
Iterator iterator = jData.keySet().iterator();
while(iterator.hasNext()){
String key = (String)iterator.next();
if(key.equals("id")){
iterator.remove();
}
}
form.setTableName(newTableName);
iQuestionService.dataAdd(form,jData);
}
}
//TODO 试卷管理及看考试任务都需要传入6个参数 - 记录试题表新增
if(Func.isNotEmpty(questIds) && Func.isNotEmpty(questIdsSort)){
String questSql = "select * from " + oldTableName + " where id IN ( " + questIds + " ) ORDER BY create_time " ;
//jdbc的queryForLsit方法是无序的
List<Map<String,Object>> questMapList = jdbcTemplate.queryForList(questSql);
for(Map jData: questMapList){
List<Map<String,Object>> list = (List<Map<String,Object>>) JSONArray.parse(questIdsSort);
for(Map d : list){
if(jData.get("id").equals(d.get("id")){
jData.put("counter_163627277373",d.get("sort"));
}
}
//任务id
jData.put("input_124444444444",taskId);
//试卷id
jData.put("input_153322222222",paperId);
//试题id
jData.put("input_162122323242",jData.get("id"));
Iterator iterator = jData.keySet().iterator();
while(iterator.hasNext()){
String key = (String) iterator.next();
if(key.equals("id")){
iterator.remove();
}
}
form.setTableName(newTableName);
iQusetionService.dataAdd(form,jData);
}
}
//根据试题ids添加试题答案记录表-新增
String questOptionSql = "select * from exam_question_option where quest_id IN (" + questIds + ") ordery by create_time ";
List<Map<String,Object>> questOptionMapList = jdbcTemplate.queryForList(questOptionSql);
for(Map jData: questOptionMapList){
//任务id
jData.put("input_124444444444",taskId);
//试卷id
jData.put("input_153322222222",paperId);
QuestionOptionRecord questionOptionRecord = JSON.parseObject(JSON.toJSONString(jData),QuestionOptionRecord.Class);
questionOptionRecord.setId(null);
questionOptionRecordMapper.insert(questionOptionRecord);
}
return taskId;
}
保存表单方法
package com.example.demo123.controller;
import com.example.demo123.core.launch.constant.Func;
import com.example.demo123.modules.system.entity.Form;
import org.apache.commons.lang3.StringUtils;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.Map;
import java.util.UUID;
/**
* @program: demo
* @description:
* @author: lxq
* @create: 2021-05-08 14:07
* @Version: 1.0
**/
public class qusetionServiceImpl {
private JdbcTemplate jdbcTemplate;
@Transactional(readOnly = false)
public String dataAdd(Form form, Map data){
//保存表单数据
String uuid = "";
try{
if(StringUtils.isNotBlank(form.getTableName())){
//遍历参数,组装sql语句
String insertSql = "INSERT INTO " + form.getTableName() + "(";
String insertValueSql = " values(";
Date date = new Date();
for(Object name : data.keySet()){
insertSql += "" + name + ",";
if(name.equals("create_user") || name.equals("create_dept")||name.equals("update_user") || name.equals("status")||name.equals("is_deleted") || name.equals("instance_status")||name.equals("instance_result_state") || name.equals("old_process_state")){
insertValueSql += "" + data.get(name) + ",";
continue;
}
if(name.toString().indexOf("fileupload") != -1){
if(data.get(name).toString().indexOf("[]") != -1){
insertValueSql += "" + null + ",";
continue;
}
}
if(name.equals("create_time") || name.equals("update_time")){
insertValueSql = "'" + (date.getTime()) + "',";
// insertValueSql = "'" + new Timestamp(date.getTime()) + "',";
continue;
}
if(name.equals("process_instance_id") || name.equals("pid")|| name.equals("old_proc_ins_id")){
insertValueSql += "'" + data.get(name) + "',";
continue;
}
String value = data.get(name) + "";
if(name.equals("input") || name.equals("textarea")){
if(value.indexOf("'") != -1){
value = value.replaceAll("'","''");
}else if(value.indexOf("\\") != -1){
value = loadValue(value,'\\');
}
}
insertValueSql += "'" + value + "',";
}
uuid = uuid();
insertSql += "id)" +insertValueSql + "'" + uuid + "')";
data.put("id",uuid);
jdbcTemplate.execute(insertSql);
}
}catch(Exception e){
throw new RuntimeException("当前业务数据存在异常,清凉西管理员处理");
}
return uuid;
}
public String loadValue(String value, char c) {
char[] chars = value.toCharArray();
StringBuilder strValue = new StringBuilder();
for(char c1 : chars){
if(Func.equals(c,c1)){
strValue.append('\\').append(c1);
}else{
strValue.append(c1);
}
}
return strValue.toString();
}
/**
* 封装jdk自带的UUID,通过random数字生成,中间无-分割
* @return
*/
public static String uuid() {
return UUID.randomUUID().toString().replaceAll("-","");
}
}