Browse Source

试题分析

sd
zhizhi wu 4 years ago
parent
commit
17a14e0c49
  1. 5
      ht/src/main/java/com/ccsens/ht/bean/dto/QuestionDto.java
  2. 17
      ht/src/main/java/com/ccsens/ht/bean/vo/QuestionVo.java
  3. 67
      ht/src/main/java/com/ccsens/ht/service/QuestionService.java
  4. 6
      ht/src/main/java/com/ccsens/ht/uitl/Constant.java

5
ht/src/main/java/com/ccsens/ht/bean/dto/QuestionDto.java

@ -7,6 +7,7 @@ import lombok.Data;
import javax.servlet.http.Part; import javax.servlet.http.Part;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.io.File; import java.io.File;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
/** /**
@ -101,6 +102,10 @@ public class QuestionDto {
@NotNull(message = "测评试题id不能为空") @NotNull(message = "测评试题id不能为空")
@ApiModelProperty("测评试题id") @ApiModelProperty("测评试题id")
private Long questionId; private Long questionId;
@ApiModelProperty("参考长度")
private BigDecimal referenceLength;
@ApiModelProperty("参考思考时间")
private BigDecimal referenceReflectOnTime;
} }
@Data @Data

17
ht/src/main/java/com/ccsens/ht/bean/vo/QuestionVo.java

@ -343,8 +343,12 @@ public class QuestionVo {
private int lineNums; private int lineNums;
@ApiModelProperty("最长笔画长度") @ApiModelProperty("最长笔画长度")
private double longLine; private double longLine;
@ApiModelProperty("最长笔画速度")
private double longSpeed;
@ApiModelProperty("最短笔画长度") @ApiModelProperty("最短笔画长度")
private double shortLine; private double shortLine;
@ApiModelProperty("最短笔画速度")
private double shortSpeed;
@ApiModelProperty("笔画中间值") @ApiModelProperty("笔画中间值")
private double centre; private double centre;
@ApiModelProperty("平均每分钟画几笔") @ApiModelProperty("平均每分钟画几笔")
@ -356,16 +360,24 @@ public class QuestionVo {
/*20210112新加统计数据*/ /*20210112新加统计数据*/
@ApiModelProperty("思考总时间(所有笔画间隔时间)") @ApiModelProperty("思考总时间(所有笔画间隔时间)")
private Long reflectOnTime; private Long reflectOnTime;
@ApiModelProperty("落笔总时间(所有笔画绘图时间)")
private long paintTime;
@ApiModelProperty("中心 暂定为坐标:X,Y") @ApiModelProperty("中心 暂定为坐标:X,Y")
private String centreCoordinate; private String centreCoordinate;
@ApiModelProperty("面积 暂定均为最小外接长方形 单位为px") @ApiModelProperty("面积 暂定均为最小外接长方形 单位为px")
private double acreage; private double acreage;
@ApiModelProperty("平均笔画长度") @ApiModelProperty("平均笔画长度")
private double aveLength; private double aveLength;
@ApiModelProperty("平均笔画长度")
private double aveReflectOnTime;
@ApiModelProperty("长笔画数量") @ApiModelProperty("长笔画数量")
private int longNums; private int longNums;
@ApiModelProperty("长笔画数量") @ApiModelProperty("长笔画数量")
private int shortNums; private int shortNums;
@ApiModelProperty("快速思考数量")
private int quickNums;
@ApiModelProperty("长久思考数量")
private int slowNums;
} }
@Data @Data
@ -379,5 +391,10 @@ public class QuestionVo {
private double speed; private double speed;
@ApiModelProperty("时间间隔,和上一笔比较") @ApiModelProperty("时间间隔,和上一笔比较")
private long intervalDuration; private long intervalDuration;
@ApiModelProperty("长度状态 0:短笔画 1:长笔画 ")
private byte lengthStatus;
@ApiModelProperty("思考时间状态 0:快速 1:迟疑")
private byte reflectOnStatus;
} }
} }

67
ht/src/main/java/com/ccsens/ht/service/QuestionService.java

@ -15,6 +15,7 @@ import com.ccsens.ht.persist.mapper.*;
import com.ccsens.ht.uitl.Constant; import com.ccsens.ht.uitl.Constant;
import com.ccsens.util.*; import com.ccsens.util.*;
import com.ccsens.util.exception.BaseException; import com.ccsens.util.exception.BaseException;
import io.swagger.annotations.ApiModel;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -571,7 +572,7 @@ public class QuestionService implements IQuestionService {
List<QuestionVo.Point> canvasPoints = getCanvasPoints(htPatientCanvas); List<QuestionVo.Point> canvasPoints = getCanvasPoints(htPatientCanvas);
patientCanvas.setPoints(canvasPoints); patientCanvas.setPoints(canvasPoints);
//计算参数 //计算参数
QuestionVo.Parameter parameter = getParameter(htPatientCanvas); QuestionVo.Parameter parameter = getParameter(htPatientCanvas, param);
patientCanvas.setParameters(parameter); patientCanvas.setParameters(parameter);
canvasList.add(patientCanvas); canvasList.add(patientCanvas);
}); });
@ -614,9 +615,10 @@ public class QuestionService implements IQuestionService {
/** /**
* 统计画图的参数 * 统计画图的参数
* @param htPatientCanvas 画板信息 * @param htPatientCanvas 画板信息
* @param param 请求参数 参考长度 参考思考时间
* @return 返回此次画图的参数 * @return 返回此次画图的参数
*/ */
private QuestionVo.Parameter getParameter(HtPatientCanvas htPatientCanvas) { private QuestionVo.Parameter getParameter(HtPatientCanvas htPatientCanvas, QuestionDto.QueryPatientCanvas param) {
QuestionVo.Parameter parameter = new QuestionVo.Parameter(); QuestionVo.Parameter parameter = new QuestionVo.Parameter();
//开始画图时长:打开画板到第一笔画图时长 //开始画图时长:打开画板到第一笔画图时长
parameter.setStartDuration(htPatientCanvas.getBeginTime() - htPatientCanvas.getOpenCanvasTime()); parameter.setStartDuration(htPatientCanvas.getBeginTime() - htPatientCanvas.getOpenCanvasTime());
@ -654,6 +656,8 @@ public class QuestionService implements IQuestionService {
double shortLine = 0; double shortLine = 0;
//思考总时间 每笔间隔相加 //思考总时间 每笔间隔相加
long reflectOnTime = 0; long reflectOnTime = 0;
// 落笔总时间(所有笔画绘图时间)
long paintTime = 0;
//X最小值 //X最小值
int minX = 0; int minX = 0;
//X最大值 //X最大值
@ -664,6 +668,7 @@ public class QuestionService implements IQuestionService {
int maxY = 0; int maxY = 0;
//总长度 //总长度
double totalLength = 0; double totalLength = 0;
for(QuestionVo.Point canvas : canvasPoints){ for(QuestionVo.Point canvas : canvasPoints){
//时间 //时间
QuestionVo.LineParameter lineParameter = new QuestionVo.LineParameter(); QuestionVo.LineParameter lineParameter = new QuestionVo.LineParameter();
@ -711,6 +716,8 @@ public class QuestionService implements IQuestionService {
speed = BigDecimal.valueOf(length / duration).setScale(2, RoundingMode.HALF_UP).doubleValue(); speed = BigDecimal.valueOf(length / duration).setScale(2, RoundingMode.HALF_UP).doubleValue();
} }
lineParameter.setSpeed(speed); lineParameter.setSpeed(speed);
// 落笔总时间
paintTime += Long.parseLong(e[e.length - 1]) - Long.parseLong(a[a.length - 1]);
//和上一笔的间隔 & 思考总时长 //和上一笔的间隔 & 思考总时长
if(Long.parseLong(e[e.length - 1]) == 0){ if(Long.parseLong(e[e.length - 1]) == 0){
lineParameter.setIntervalDuration(htPatientCanvas.getBeginTime() - htPatientCanvas.getOpenCanvasTime()); lineParameter.setIntervalDuration(htPatientCanvas.getBeginTime() - htPatientCanvas.getOpenCanvasTime());
@ -723,6 +730,8 @@ public class QuestionService implements IQuestionService {
lineParameterList.add(lineParameter); lineParameterList.add(lineParameter);
} }
parameter.setLineParameterList(lineParameterList); parameter.setLineParameterList(lineParameterList);
//最长笔画 //最长笔画
parameter.setLongLine(longLine); parameter.setLongLine(longLine);
@ -730,6 +739,8 @@ public class QuestionService implements IQuestionService {
parameter.setShortLine(shortLine); parameter.setShortLine(shortLine);
//思考总时长 //思考总时长
parameter.setReflectOnTime(reflectOnTime); parameter.setReflectOnTime(reflectOnTime);
// 落笔总时长
parameter.setPaintTime(paintTime);
//计算中心 //计算中心
int x = minX + ((maxX - minX) / 2); int x = minX + ((maxX - minX) / 2);
int y = minY + ((maxY - minY) / 2); int y = minY + ((maxY - minY) / 2);
@ -739,36 +750,62 @@ public class QuestionService implements IQuestionService {
double acreage = (maxX - minX) * (maxY - minY); double acreage = (maxX - minX) * (maxY - minY);
parameter.setAcreage(acreage); parameter.setAcreage(acreage);
//平均长度 //平均长度
double aveLength = BigDecimal.valueOf(totalLength / canvasPoints.size()).setScale(2, RoundingMode.HALF_UP).doubleValue(); BigDecimal aveLength = BigDecimal.valueOf(totalLength / canvasPoints.size()).setScale(2, RoundingMode.HALF_UP);
parameter.setAveLength(aveLength); BigDecimal aveReflectOnTime = BigDecimal.valueOf(reflectOnTime / canvasPoints.size()).setScale(2, RoundingMode.HALF_UP);
parameter.setAveLength(aveLength.doubleValue());
//短笔画数量 //短笔画数量
double coefficient = 1.00; // double coefficient = 1.00;
int shortNums = getShortNums(aveLength,coefficient,lineParameterList); BigDecimal referenceLength = param.getReferenceLength() != null && param.getReferenceLength().compareTo(new BigDecimal(0)) > 0 ? param.getReferenceLength() : aveLength;
parameter.setShortNums(shortNums); BigDecimal referenceReflectOnTime = param.getReferenceReflectOnTime() != null && param.getReferenceReflectOnTime().compareTo(new BigDecimal(0)) > 0 ? param.getReferenceReflectOnTime() : aveReflectOnTime;
Nums nums = getShortNums( referenceLength, referenceReflectOnTime, lineParameterList);
parameter.setShortNums(nums.shortNums);
//长笔画数量,等于总笔画减去短笔画的数量 //长笔画数量,等于总笔画减去短笔画的数量
parameter.setLongNums(lineParameterList.size() - shortNums); parameter.setLongNums(lineParameterList.size() - nums.shortNums);
//TODO 笔画中间值 parameter.setQuickNums(nums.quickNums);
parameter.setSlowNums(lineParameterList.size() - nums.quickNums);
return parameter; return parameter;
} }
@ApiModel("短线和短时间思考数目")
private static class Nums{
public int shortNums;
public int quickNums;
}
/** /**
* 获取短笔画的数量 * 获取短笔画的数量
* @param aveLength 平均长度 *
* @param coefficient 自定义系数 *
* @param aveLength 参考长度
* @param referenceReflectOnTime 参考思考时间
* @param lineParameterList 所有笔画的参数 * @param lineParameterList 所有笔画的参数
* @return 返回短笔画的数量 * @return 返回短笔画的数量
*/ */
private int getShortNums(double aveLength, double coefficient, List<QuestionVo.LineParameter> lineParameterList) { private Nums getShortNums(BigDecimal aveLength, BigDecimal referenceReflectOnTime, List<QuestionVo.LineParameter> lineParameterList) {
Nums nums = new Nums();
int shortNums = 0; int shortNums = 0;
double a = aveLength * coefficient; int quickNums = 0;
// double a = aveLength * coefficient;
if(CollectionUtil.isNotEmpty(lineParameterList)){ if(CollectionUtil.isNotEmpty(lineParameterList)){
for(QuestionVo.LineParameter lineParameter : lineParameterList){ for(QuestionVo.LineParameter lineParameter : lineParameterList){
if(lineParameter.getLength() <= a){ if(aveLength.compareTo(new BigDecimal(lineParameter.getLength())) >= 0){
lineParameter.setLengthStatus(Constant.LineColour.LENGTH_STATUS_SHORT);
shortNums++; shortNums++;
} else {
lineParameter.setLengthStatus(Constant.LineColour.LENGTH_STATUS_LONG);
}
if(referenceReflectOnTime.compareTo(new BigDecimal(lineParameter.getIntervalDuration())) >= 0){
lineParameter.setLengthStatus(Constant.LineColour.REFLECT_ON_STATUS_QUICK);
quickNums++;
} else {
lineParameter.setLengthStatus(Constant.LineColour.REFLECT_ON_STATUS_SLOW);
} }
} }
} }
return shortNums; nums.shortNums = shortNums;
nums.quickNums = quickNums;
return nums;
} }
private double getLengthByCanvas(String[] canvas) { private double getLengthByCanvas(String[] canvas) {

6
ht/src/main/java/com/ccsens/ht/uitl/Constant.java

@ -25,6 +25,12 @@ public class Constant {
/**病友画图轨迹颜色*/ /**病友画图轨迹颜色*/
public static final class LineColour { public static final class LineColour {
public final static byte LENGTH_STATUS_SHORT = 0;
public final static byte LENGTH_STATUS_LONG = 1;
public final static byte REFLECT_ON_STATUS_QUICK = 0;
public final static byte REFLECT_ON_STATUS_SLOW = 1;
public final static List<Integer> COLOUR = new ArrayList<>(); public final static List<Integer> COLOUR = new ArrayList<>();
static { static {
COLOUR.add(0); COLOUR.add(0);

Loading…
Cancel
Save