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

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

@ -343,8 +343,12 @@ public class QuestionVo {
private int lineNums;
@ApiModelProperty("最长笔画长度")
private double longLine;
@ApiModelProperty("最长笔画速度")
private double longSpeed;
@ApiModelProperty("最短笔画长度")
private double shortLine;
@ApiModelProperty("最短笔画速度")
private double shortSpeed;
@ApiModelProperty("笔画中间值")
private double centre;
@ApiModelProperty("平均每分钟画几笔")
@ -356,16 +360,24 @@ public class QuestionVo {
/*20210112新加统计数据*/
@ApiModelProperty("思考总时间(所有笔画间隔时间)")
private Long reflectOnTime;
@ApiModelProperty("落笔总时间(所有笔画绘图时间)")
private long paintTime;
@ApiModelProperty("中心 暂定为坐标:X,Y")
private String centreCoordinate;
@ApiModelProperty("面积 暂定均为最小外接长方形 单位为px")
private double acreage;
@ApiModelProperty("平均笔画长度")
private double aveLength;
@ApiModelProperty("平均笔画长度")
private double aveReflectOnTime;
@ApiModelProperty("长笔画数量")
private int longNums;
@ApiModelProperty("长笔画数量")
private int shortNums;
@ApiModelProperty("快速思考数量")
private int quickNums;
@ApiModelProperty("长久思考数量")
private int slowNums;
}
@Data
@ -379,5 +391,10 @@ public class QuestionVo {
private double speed;
@ApiModelProperty("时间间隔,和上一笔比较")
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.util.*;
import com.ccsens.util.exception.BaseException;
import io.swagger.annotations.ApiModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -571,7 +572,7 @@ public class QuestionService implements IQuestionService {
List<QuestionVo.Point> canvasPoints = getCanvasPoints(htPatientCanvas);
patientCanvas.setPoints(canvasPoints);
//计算参数
QuestionVo.Parameter parameter = getParameter(htPatientCanvas);
QuestionVo.Parameter parameter = getParameter(htPatientCanvas, param);
patientCanvas.setParameters(parameter);
canvasList.add(patientCanvas);
});
@ -614,9 +615,10 @@ public class QuestionService implements IQuestionService {
/**
* 统计画图的参数
* @param htPatientCanvas 画板信息
* @param param 请求参数 参考长度 参考思考时间
* @return 返回此次画图的参数
*/
private QuestionVo.Parameter getParameter(HtPatientCanvas htPatientCanvas) {
private QuestionVo.Parameter getParameter(HtPatientCanvas htPatientCanvas, QuestionDto.QueryPatientCanvas param) {
QuestionVo.Parameter parameter = new QuestionVo.Parameter();
//开始画图时长:打开画板到第一笔画图时长
parameter.setStartDuration(htPatientCanvas.getBeginTime() - htPatientCanvas.getOpenCanvasTime());
@ -654,6 +656,8 @@ public class QuestionService implements IQuestionService {
double shortLine = 0;
//思考总时间 每笔间隔相加
long reflectOnTime = 0;
// 落笔总时间(所有笔画绘图时间)
long paintTime = 0;
//X最小值
int minX = 0;
//X最大值
@ -664,6 +668,7 @@ public class QuestionService implements IQuestionService {
int maxY = 0;
//总长度
double totalLength = 0;
for(QuestionVo.Point canvas : canvasPoints){
//时间
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();
}
lineParameter.setSpeed(speed);
// 落笔总时间
paintTime += Long.parseLong(e[e.length - 1]) - Long.parseLong(a[a.length - 1]);
//和上一笔的间隔 & 思考总时长
if(Long.parseLong(e[e.length - 1]) == 0){
lineParameter.setIntervalDuration(htPatientCanvas.getBeginTime() - htPatientCanvas.getOpenCanvasTime());
@ -723,6 +730,8 @@ public class QuestionService implements IQuestionService {
lineParameterList.add(lineParameter);
}
parameter.setLineParameterList(lineParameterList);
//最长笔画
parameter.setLongLine(longLine);
@ -730,6 +739,8 @@ public class QuestionService implements IQuestionService {
parameter.setShortLine(shortLine);
//思考总时长
parameter.setReflectOnTime(reflectOnTime);
// 落笔总时长
parameter.setPaintTime(paintTime);
//计算中心
int x = minX + ((maxX - minX) / 2);
int y = minY + ((maxY - minY) / 2);
@ -739,36 +750,62 @@ public class QuestionService implements IQuestionService {
double acreage = (maxX - minX) * (maxY - minY);
parameter.setAcreage(acreage);
//平均长度
double aveLength = BigDecimal.valueOf(totalLength / canvasPoints.size()).setScale(2, RoundingMode.HALF_UP).doubleValue();
parameter.setAveLength(aveLength);
BigDecimal aveLength = BigDecimal.valueOf(totalLength / canvasPoints.size()).setScale(2, RoundingMode.HALF_UP);
BigDecimal aveReflectOnTime = BigDecimal.valueOf(reflectOnTime / canvasPoints.size()).setScale(2, RoundingMode.HALF_UP);
parameter.setAveLength(aveLength.doubleValue());
//短笔画数量
double coefficient = 1.00;
int shortNums = getShortNums(aveLength,coefficient,lineParameterList);
parameter.setShortNums(shortNums);
// double coefficient = 1.00;
BigDecimal referenceLength = param.getReferenceLength() != null && param.getReferenceLength().compareTo(new BigDecimal(0)) > 0 ? param.getReferenceLength() : aveLength;
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);
//TODO 笔画中间值
parameter.setLongNums(lineParameterList.size() - nums.shortNums);
parameter.setQuickNums(nums.quickNums);
parameter.setSlowNums(lineParameterList.size() - nums.quickNums);
return parameter;
}
@ApiModel("短线和短时间思考数目")
private static class Nums{
public int shortNums;
public int quickNums;
}
/**
* 获取短笔画的数量
* @param aveLength 平均长度
* @param coefficient 自定义系数
*
*
* @param aveLength 参考长度
* @param referenceReflectOnTime 参考思考时间
* @param lineParameterList 所有笔画的参数
* @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;
double a = aveLength * coefficient;
int quickNums = 0;
// double a = aveLength * coefficient;
if(CollectionUtil.isNotEmpty(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++;
} 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) {

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

@ -25,6 +25,12 @@ public class Constant {
/**病友画图轨迹颜色*/
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<>();
static {
COLOUR.add(0);

Loading…
Cancel
Save