diff --git a/src/main/java/com/ccsens/yanyuan/api/FamilyController.java b/src/main/java/com/ccsens/yanyuan/api/FamilyController.java index d73767c..fe5898f 100644 --- a/src/main/java/com/ccsens/yanyuan/api/FamilyController.java +++ b/src/main/java/com/ccsens/yanyuan/api/FamilyController.java @@ -39,7 +39,7 @@ public class FamilyController { @MustLogin @ApiOperation(value = "查询用户是否是项目成员") @RequestMapping(value = "/isMember", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) - public JsonResponse isMember(@ApiParam @Validated @RequestBody QueryDto params) throws Exception{ + public JsonResponse isMember(@ApiParam @Validated @RequestBody QueryDto params) { log.info("查询用户是否是项目成员:{}",params); FamilyVo.Member personal = familyService.isMember(params.getParam(), params.getUserId()); log.info("查询用户是否是项目成员结束:{}",personal); @@ -49,7 +49,7 @@ public class FamilyController { @MustLogin @ApiOperation(value = "查询个人信息") @RequestMapping(value = "/personal", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) - public JsonResponse personal(@ApiParam @Validated @RequestBody QueryDto params) throws Exception{ + public JsonResponse personal(@ApiParam @Validated @RequestBody QueryDto params) { log.info("个人信息是否填写:{}",params); FamilyVo.Personal personal = familyService.personal(params.getUserId()); log.info("个人信息是否填写结束{}",personal); @@ -59,7 +59,7 @@ public class FamilyController { @MustLogin @ApiOperation(value = "申请成为家属", notes = "申请成为家属") @RequestMapping(value = "/apply", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) - public JsonResponse apply(@ApiParam @Validated @RequestBody QueryDto params) throws Exception{ + public JsonResponse apply(@ApiParam @Validated @RequestBody QueryDto params) { log.info("申请成为家属:{}",params); CodeError.Code code = familyService.apply(params.getParam(),params.getUserId()); log.info("申请成为家属结束{}",code); @@ -69,7 +69,7 @@ public class FamilyController { @MustLogin @ApiOperation(value = "查询家属成员列表", notes = "查询家属成员列表") @RequestMapping(value = "/queryList", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) - public JsonResponse> queryList(@ApiParam @Validated @RequestBody QueryDto params) throws Exception{ + public JsonResponse> queryList(@ApiParam @Validated @RequestBody QueryDto params) { log.info("查询家属成员列表:{}",params); List familyInfoList = familyService.queryList(params.getParam(),params.getUserId()); log.info("查询家属成员列表结束{}",familyInfoList); @@ -79,7 +79,7 @@ public class FamilyController { @MustLogin @ApiOperation(value = "查询待审核家属成员数量", notes = "查询待审核家属成员数量") @RequestMapping(value = "/queryAuditNum", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) - public JsonResponse queryAuditNum(@ApiParam @Validated @RequestBody QueryDto params) throws Exception{ + public JsonResponse queryAuditNum(@ApiParam @Validated @RequestBody QueryDto params) { log.info("查询待审核家属成员数量:{}",params); FamilyVo.NeedAuditNum auditNum = familyService.queryAuditNum(params.getParam(),params.getUserId()); log.info("查询待审核家属成员数量结束{}",auditNum); @@ -89,7 +89,7 @@ public class FamilyController { @MustLogin @ApiOperation(value = "审核家属成员", notes = "审核家属成员") @RequestMapping(value = "/auditFamily", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) - public JsonResponse auditFamily(@ApiParam @Validated @RequestBody QueryDto params) throws Exception{ + public JsonResponse auditFamily(@ApiParam @Validated @RequestBody QueryDto params) { log.info("查询待审核家属成员数量:{}",params); CodeError.Code code = familyService.auditFamily(params.getParam(),params.getUserId()); log.info("查询待审核家属成员数量结束{}",code); diff --git a/src/main/java/com/ccsens/yanyuan/api/ToolController.java b/src/main/java/com/ccsens/yanyuan/api/ToolController.java index d5ac826..aa2aff8 100644 --- a/src/main/java/com/ccsens/yanyuan/api/ToolController.java +++ b/src/main/java/com/ccsens/yanyuan/api/ToolController.java @@ -4,9 +4,8 @@ import com.ccsens.cloudutil.annotation.MustLogin; import com.ccsens.util.JsonResponse; import com.ccsens.util.bean.dto.QueryDto; import com.ccsens.yanyuan.bean.dto.ToolDto; -import com.ccsens.yanyuan.bean.po.Tool; import com.ccsens.yanyuan.bean.vo.ToolVo; -import com.ccsens.yanyuan.bean.vo.UserPowerVo; +import com.ccsens.yanyuan.service.ITalkingPenService; import com.ccsens.yanyuan.service.IToolService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -24,7 +23,7 @@ import java.util.List; /** * @author AUSU */ -@Api(tags = "工具箱" , description = "工具箱相关接口 | ") +@Api(tags = "工具箱") @Slf4j @RestController @RequestMapping(value = "/tool") @@ -32,11 +31,13 @@ public class ToolController { @Resource private IToolService toolService; + @Resource + private ITalkingPenService talkingPenService; @MustLogin @ApiOperation(value = "绑定工具箱", notes = "绑定工具箱") @RequestMapping(value = "/bind", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) - public JsonResponse bindTool(@ApiParam @Validated @RequestBody QueryDto params) throws Exception{ + public JsonResponse bindTool(@ApiParam @Validated @RequestBody QueryDto params) { log.info("绑定工具箱:{}",params); ToolVo.BindTool bindTool = toolService.bindTool(params.getParam(),params.getPhone(), params.getUserId()); log.info("绑定工具箱结束{}",bindTool); @@ -46,7 +47,7 @@ public class ToolController { @MustLogin @ApiOperation(value = "查询指定工具箱二维码", notes = "查询指定工具箱二维码") @RequestMapping(value = "/qrCode", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) - public JsonResponse qrCode(@ApiParam @Validated @RequestBody QueryDto params) throws Exception{ + public JsonResponse qrCode(@ApiParam @Validated @RequestBody QueryDto params) throws Exception { log.info("查询指定工具箱二维码:{}",params); ToolVo.QrCode qrCode = toolService.generateQrCode(params.getParam(), params.getUserId()); log.info("查询指定工具箱二维码结束{}",qrCode); @@ -57,10 +58,20 @@ public class ToolController { @MustLogin @ApiOperation(value = "查询工具箱列表", notes = "查询工具箱列表") @RequestMapping(value = "/queryToolList", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) - public JsonResponse> queryToolList(@ApiParam @Validated @RequestBody QueryDto params) throws Exception{ + public JsonResponse> queryToolList(@ApiParam @Validated @RequestBody QueryDto params) { log.info("查询工具箱列表:{}",params); List toolInfoList = toolService.queryToolList(params.getUserId()); log.info("查询工具箱列表结束{}",toolInfoList); return JsonResponse.newInstance().ok(toolInfoList); } + + @MustLogin + @ApiOperation(value = "查询使用者姓名", notes = "查询使用者姓名") + @RequestMapping(value = "/getUserName", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) + public JsonResponse getUserName(@ApiParam @Validated @RequestBody QueryDto params) { + log.info("查询使用者姓名:{}",params); + ToolVo.UserInfoSimple simple = talkingPenService.getUserName(params.getParam(), params.getUserId()); + log.info("查询使用者姓名结束:{}",simple); + return JsonResponse.newInstance().ok(simple); + } } diff --git a/src/main/java/com/ccsens/yanyuan/bean/dto/ToolDto.java b/src/main/java/com/ccsens/yanyuan/bean/dto/ToolDto.java index a9d58e1..1c8bfa3 100644 --- a/src/main/java/com/ccsens/yanyuan/bean/dto/ToolDto.java +++ b/src/main/java/com/ccsens/yanyuan/bean/dto/ToolDto.java @@ -22,4 +22,11 @@ public class ToolDto { @ApiModelProperty("工具箱ID") private Long id; } + + @Data + @ApiModel("查询使用者-请求") + public static class GetUser { + @ApiModelProperty("设备id") + private Long equipmentId; + } } diff --git a/src/main/java/com/ccsens/yanyuan/bean/dto/message/CoordinateDto.java b/src/main/java/com/ccsens/yanyuan/bean/dto/message/CoordinateDto.java new file mode 100644 index 0000000..6a29a05 --- /dev/null +++ b/src/main/java/com/ccsens/yanyuan/bean/dto/message/CoordinateDto.java @@ -0,0 +1,24 @@ +package com.ccsens.yanyuan.bean.dto.message; + +import lombok.Data; + +/** + * @description: + * @author: whj + * @time: 2021/12/20 14:28 + */ +public class CoordinateDto { + @Data + public static class Point{ + private long x; + private long y; + + public Point() { + } + + public Point(long x, long y) { + this.x = x; + this.y = y; + } + } +} diff --git a/src/main/java/com/ccsens/yanyuan/bean/dto/message/TalkingPenDto.java b/src/main/java/com/ccsens/yanyuan/bean/dto/message/TalkingPenDto.java index b3c057c..f692c13 100644 --- a/src/main/java/com/ccsens/yanyuan/bean/dto/message/TalkingPenDto.java +++ b/src/main/java/com/ccsens/yanyuan/bean/dto/message/TalkingPenDto.java @@ -121,15 +121,15 @@ public class TalkingPenDto { /** * 包序号 */ - public static final int PACKAGE = 7; + public static final int PACKAGE = 32; /** * 帧序号 */ - public static final int FRAME = 8; + public static final int FRAME = 33; /** * 过程起始坐标时间 */ - public static final int PROCESS_START = 9; + public static final int PROCESS_START = 34; /** * 过程一组寄存器数量 */ diff --git a/src/main/java/com/ccsens/yanyuan/bean/po/TrainCorrect.java b/src/main/java/com/ccsens/yanyuan/bean/po/TrainCorrect.java new file mode 100644 index 0000000..d94a5f8 --- /dev/null +++ b/src/main/java/com/ccsens/yanyuan/bean/po/TrainCorrect.java @@ -0,0 +1,95 @@ +package com.ccsens.yanyuan.bean.po; + +import java.io.Serializable; +import java.util.Date; + +public class TrainCorrect implements Serializable { + private Long id; + + private Long cardId; + + private Byte whichPlace; + + private Long operator; + + private Date createdAt; + + private Date updatedAt; + + private Byte recStatus; + + private static final long serialVersionUID = 1L; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getCardId() { + return cardId; + } + + public void setCardId(Long cardId) { + this.cardId = cardId; + } + + public Byte getWhichPlace() { + return whichPlace; + } + + public void setWhichPlace(Byte whichPlace) { + this.whichPlace = whichPlace; + } + + public Long getOperator() { + return operator; + } + + public void setOperator(Long operator) { + this.operator = operator; + } + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + public Byte getRecStatus() { + return recStatus; + } + + public void setRecStatus(Byte recStatus) { + this.recStatus = recStatus; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append(" ["); + sb.append("Hash = ").append(hashCode()); + sb.append(", id=").append(id); + sb.append(", cardId=").append(cardId); + sb.append(", whichPlace=").append(whichPlace); + sb.append(", operator=").append(operator); + sb.append(", createdAt=").append(createdAt); + sb.append(", updatedAt=").append(updatedAt); + sb.append(", recStatus=").append(recStatus); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/com/ccsens/yanyuan/bean/po/TrainCorrectExample.java b/src/main/java/com/ccsens/yanyuan/bean/po/TrainCorrectExample.java new file mode 100644 index 0000000..30d9b15 --- /dev/null +++ b/src/main/java/com/ccsens/yanyuan/bean/po/TrainCorrectExample.java @@ -0,0 +1,621 @@ +package com.ccsens.yanyuan.bean.po; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class TrainCorrectExample { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + public TrainCorrectExample() { + oredCriteria = new ArrayList(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andCardIdIsNull() { + addCriterion("card_id is null"); + return (Criteria) this; + } + + public Criteria andCardIdIsNotNull() { + addCriterion("card_id is not null"); + return (Criteria) this; + } + + public Criteria andCardIdEqualTo(Long value) { + addCriterion("card_id =", value, "cardId"); + return (Criteria) this; + } + + public Criteria andCardIdNotEqualTo(Long value) { + addCriterion("card_id <>", value, "cardId"); + return (Criteria) this; + } + + public Criteria andCardIdGreaterThan(Long value) { + addCriterion("card_id >", value, "cardId"); + return (Criteria) this; + } + + public Criteria andCardIdGreaterThanOrEqualTo(Long value) { + addCriterion("card_id >=", value, "cardId"); + return (Criteria) this; + } + + public Criteria andCardIdLessThan(Long value) { + addCriterion("card_id <", value, "cardId"); + return (Criteria) this; + } + + public Criteria andCardIdLessThanOrEqualTo(Long value) { + addCriterion("card_id <=", value, "cardId"); + return (Criteria) this; + } + + public Criteria andCardIdIn(List values) { + addCriterion("card_id in", values, "cardId"); + return (Criteria) this; + } + + public Criteria andCardIdNotIn(List values) { + addCriterion("card_id not in", values, "cardId"); + return (Criteria) this; + } + + public Criteria andCardIdBetween(Long value1, Long value2) { + addCriterion("card_id between", value1, value2, "cardId"); + return (Criteria) this; + } + + public Criteria andCardIdNotBetween(Long value1, Long value2) { + addCriterion("card_id not between", value1, value2, "cardId"); + return (Criteria) this; + } + + public Criteria andWhichPlaceIsNull() { + addCriterion("which_place is null"); + return (Criteria) this; + } + + public Criteria andWhichPlaceIsNotNull() { + addCriterion("which_place is not null"); + return (Criteria) this; + } + + public Criteria andWhichPlaceEqualTo(Byte value) { + addCriterion("which_place =", value, "whichPlace"); + return (Criteria) this; + } + + public Criteria andWhichPlaceNotEqualTo(Byte value) { + addCriterion("which_place <>", value, "whichPlace"); + return (Criteria) this; + } + + public Criteria andWhichPlaceGreaterThan(Byte value) { + addCriterion("which_place >", value, "whichPlace"); + return (Criteria) this; + } + + public Criteria andWhichPlaceGreaterThanOrEqualTo(Byte value) { + addCriterion("which_place >=", value, "whichPlace"); + return (Criteria) this; + } + + public Criteria andWhichPlaceLessThan(Byte value) { + addCriterion("which_place <", value, "whichPlace"); + return (Criteria) this; + } + + public Criteria andWhichPlaceLessThanOrEqualTo(Byte value) { + addCriterion("which_place <=", value, "whichPlace"); + return (Criteria) this; + } + + public Criteria andWhichPlaceIn(List values) { + addCriterion("which_place in", values, "whichPlace"); + return (Criteria) this; + } + + public Criteria andWhichPlaceNotIn(List values) { + addCriterion("which_place not in", values, "whichPlace"); + return (Criteria) this; + } + + public Criteria andWhichPlaceBetween(Byte value1, Byte value2) { + addCriterion("which_place between", value1, value2, "whichPlace"); + return (Criteria) this; + } + + public Criteria andWhichPlaceNotBetween(Byte value1, Byte value2) { + addCriterion("which_place not between", value1, value2, "whichPlace"); + return (Criteria) this; + } + + public Criteria andOperatorIsNull() { + addCriterion("operator is null"); + return (Criteria) this; + } + + public Criteria andOperatorIsNotNull() { + addCriterion("operator is not null"); + return (Criteria) this; + } + + public Criteria andOperatorEqualTo(Long value) { + addCriterion("operator =", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorNotEqualTo(Long value) { + addCriterion("operator <>", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorGreaterThan(Long value) { + addCriterion("operator >", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorGreaterThanOrEqualTo(Long value) { + addCriterion("operator >=", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorLessThan(Long value) { + addCriterion("operator <", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorLessThanOrEqualTo(Long value) { + addCriterion("operator <=", value, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorIn(List values) { + addCriterion("operator in", values, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorNotIn(List values) { + addCriterion("operator not in", values, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorBetween(Long value1, Long value2) { + addCriterion("operator between", value1, value2, "operator"); + return (Criteria) this; + } + + public Criteria andOperatorNotBetween(Long value1, Long value2) { + addCriterion("operator not between", value1, value2, "operator"); + return (Criteria) this; + } + + public Criteria andCreatedAtIsNull() { + addCriterion("created_at is null"); + return (Criteria) this; + } + + public Criteria andCreatedAtIsNotNull() { + addCriterion("created_at is not null"); + return (Criteria) this; + } + + public Criteria andCreatedAtEqualTo(Date value) { + addCriterion("created_at =", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotEqualTo(Date value) { + addCriterion("created_at <>", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtGreaterThan(Date value) { + addCriterion("created_at >", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtGreaterThanOrEqualTo(Date value) { + addCriterion("created_at >=", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtLessThan(Date value) { + addCriterion("created_at <", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtLessThanOrEqualTo(Date value) { + addCriterion("created_at <=", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtIn(List values) { + addCriterion("created_at in", values, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotIn(List values) { + addCriterion("created_at not in", values, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtBetween(Date value1, Date value2) { + addCriterion("created_at between", value1, value2, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotBetween(Date value1, Date value2) { + addCriterion("created_at not between", value1, value2, "createdAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIsNull() { + addCriterion("updated_at is null"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIsNotNull() { + addCriterion("updated_at is not null"); + return (Criteria) this; + } + + public Criteria andUpdatedAtEqualTo(Date value) { + addCriterion("updated_at =", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotEqualTo(Date value) { + addCriterion("updated_at <>", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtGreaterThan(Date value) { + addCriterion("updated_at >", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtGreaterThanOrEqualTo(Date value) { + addCriterion("updated_at >=", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtLessThan(Date value) { + addCriterion("updated_at <", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtLessThanOrEqualTo(Date value) { + addCriterion("updated_at <=", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIn(List values) { + addCriterion("updated_at in", values, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotIn(List values) { + addCriterion("updated_at not in", values, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtBetween(Date value1, Date value2) { + addCriterion("updated_at between", value1, value2, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotBetween(Date value1, Date value2) { + addCriterion("updated_at not between", value1, value2, "updatedAt"); + return (Criteria) this; + } + + public Criteria andRecStatusIsNull() { + addCriterion("rec_status is null"); + return (Criteria) this; + } + + public Criteria andRecStatusIsNotNull() { + addCriterion("rec_status is not null"); + return (Criteria) this; + } + + public Criteria andRecStatusEqualTo(Byte value) { + addCriterion("rec_status =", value, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusNotEqualTo(Byte value) { + addCriterion("rec_status <>", value, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusGreaterThan(Byte value) { + addCriterion("rec_status >", value, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusGreaterThanOrEqualTo(Byte value) { + addCriterion("rec_status >=", value, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusLessThan(Byte value) { + addCriterion("rec_status <", value, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusLessThanOrEqualTo(Byte value) { + addCriterion("rec_status <=", value, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusIn(List values) { + addCriterion("rec_status in", values, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusNotIn(List values) { + addCriterion("rec_status not in", values, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusBetween(Byte value1, Byte value2) { + addCriterion("rec_status between", value1, value2, "recStatus"); + return (Criteria) this; + } + + public Criteria andRecStatusNotBetween(Byte value1, Byte value2) { + addCriterion("rec_status not between", value1, value2, "recStatus"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/ccsens/yanyuan/bean/po/TrainProcessCard.java b/src/main/java/com/ccsens/yanyuan/bean/po/TrainProcessCard.java index d11ddf2..bc53214 100644 --- a/src/main/java/com/ccsens/yanyuan/bean/po/TrainProcessCard.java +++ b/src/main/java/com/ccsens/yanyuan/bean/po/TrainProcessCard.java @@ -8,6 +8,10 @@ public class TrainProcessCard implements Serializable { private Long cardId; + private Integer frameIndex; + + private Integer packageIndex; + private Long operateTime; private Long operator; @@ -38,6 +42,22 @@ public class TrainProcessCard implements Serializable { this.cardId = cardId; } + public Integer getFrameIndex() { + return frameIndex; + } + + public void setFrameIndex(Integer frameIndex) { + this.frameIndex = frameIndex; + } + + public Integer getPackageIndex() { + return packageIndex; + } + + public void setPackageIndex(Integer packageIndex) { + this.packageIndex = packageIndex; + } + public Long getOperateTime() { return operateTime; } @@ -94,6 +114,8 @@ public class TrainProcessCard implements Serializable { sb.append("Hash = ").append(hashCode()); sb.append(", id=").append(id); sb.append(", cardId=").append(cardId); + sb.append(", frameIndex=").append(frameIndex); + sb.append(", packageIndex=").append(packageIndex); sb.append(", operateTime=").append(operateTime); sb.append(", operator=").append(operator); sb.append(", createdAt=").append(createdAt); diff --git a/src/main/java/com/ccsens/yanyuan/bean/po/TrainProcessCardExample.java b/src/main/java/com/ccsens/yanyuan/bean/po/TrainProcessCardExample.java index 069dceb..21cb922 100644 --- a/src/main/java/com/ccsens/yanyuan/bean/po/TrainProcessCardExample.java +++ b/src/main/java/com/ccsens/yanyuan/bean/po/TrainProcessCardExample.java @@ -225,6 +225,126 @@ public class TrainProcessCardExample { return (Criteria) this; } + public Criteria andFrameIndexIsNull() { + addCriterion("frame_index is null"); + return (Criteria) this; + } + + public Criteria andFrameIndexIsNotNull() { + addCriterion("frame_index is not null"); + return (Criteria) this; + } + + public Criteria andFrameIndexEqualTo(Integer value) { + addCriterion("frame_index =", value, "frameIndex"); + return (Criteria) this; + } + + public Criteria andFrameIndexNotEqualTo(Integer value) { + addCriterion("frame_index <>", value, "frameIndex"); + return (Criteria) this; + } + + public Criteria andFrameIndexGreaterThan(Integer value) { + addCriterion("frame_index >", value, "frameIndex"); + return (Criteria) this; + } + + public Criteria andFrameIndexGreaterThanOrEqualTo(Integer value) { + addCriterion("frame_index >=", value, "frameIndex"); + return (Criteria) this; + } + + public Criteria andFrameIndexLessThan(Integer value) { + addCriterion("frame_index <", value, "frameIndex"); + return (Criteria) this; + } + + public Criteria andFrameIndexLessThanOrEqualTo(Integer value) { + addCriterion("frame_index <=", value, "frameIndex"); + return (Criteria) this; + } + + public Criteria andFrameIndexIn(List values) { + addCriterion("frame_index in", values, "frameIndex"); + return (Criteria) this; + } + + public Criteria andFrameIndexNotIn(List values) { + addCriterion("frame_index not in", values, "frameIndex"); + return (Criteria) this; + } + + public Criteria andFrameIndexBetween(Integer value1, Integer value2) { + addCriterion("frame_index between", value1, value2, "frameIndex"); + return (Criteria) this; + } + + public Criteria andFrameIndexNotBetween(Integer value1, Integer value2) { + addCriterion("frame_index not between", value1, value2, "frameIndex"); + return (Criteria) this; + } + + public Criteria andPackageIndexIsNull() { + addCriterion("package_index is null"); + return (Criteria) this; + } + + public Criteria andPackageIndexIsNotNull() { + addCriterion("package_index is not null"); + return (Criteria) this; + } + + public Criteria andPackageIndexEqualTo(Integer value) { + addCriterion("package_index =", value, "packageIndex"); + return (Criteria) this; + } + + public Criteria andPackageIndexNotEqualTo(Integer value) { + addCriterion("package_index <>", value, "packageIndex"); + return (Criteria) this; + } + + public Criteria andPackageIndexGreaterThan(Integer value) { + addCriterion("package_index >", value, "packageIndex"); + return (Criteria) this; + } + + public Criteria andPackageIndexGreaterThanOrEqualTo(Integer value) { + addCriterion("package_index >=", value, "packageIndex"); + return (Criteria) this; + } + + public Criteria andPackageIndexLessThan(Integer value) { + addCriterion("package_index <", value, "packageIndex"); + return (Criteria) this; + } + + public Criteria andPackageIndexLessThanOrEqualTo(Integer value) { + addCriterion("package_index <=", value, "packageIndex"); + return (Criteria) this; + } + + public Criteria andPackageIndexIn(List values) { + addCriterion("package_index in", values, "packageIndex"); + return (Criteria) this; + } + + public Criteria andPackageIndexNotIn(List values) { + addCriterion("package_index not in", values, "packageIndex"); + return (Criteria) this; + } + + public Criteria andPackageIndexBetween(Integer value1, Integer value2) { + addCriterion("package_index between", value1, value2, "packageIndex"); + return (Criteria) this; + } + + public Criteria andPackageIndexNotBetween(Integer value1, Integer value2) { + addCriterion("package_index not between", value1, value2, "packageIndex"); + return (Criteria) this; + } + public Criteria andOperateTimeIsNull() { addCriterion("operate_time is null"); return (Criteria) this; diff --git a/src/main/java/com/ccsens/yanyuan/bean/vo/RoleVo.java b/src/main/java/com/ccsens/yanyuan/bean/vo/RoleVo.java index 659bd39..1976600 100644 --- a/src/main/java/com/ccsens/yanyuan/bean/vo/RoleVo.java +++ b/src/main/java/com/ccsens/yanyuan/bean/vo/RoleVo.java @@ -2,6 +2,7 @@ package com.ccsens.yanyuan.bean.vo; import com.ccsens.common.bean.vo.CRoleVo; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** @@ -16,6 +17,9 @@ public class RoleVo { @Data @ApiModel("角色详细信息") public static class RoleInfo extends CRoleVo.RoleInfo { + @ApiModelProperty("角色类型,燕园用户:Drill:训练, Setting:设置") public String code; + @ApiModelProperty("提醒数量,大于0时,显示数字") + public int remindNum = 0; } } diff --git a/src/main/java/com/ccsens/yanyuan/bean/vo/ToolVo.java b/src/main/java/com/ccsens/yanyuan/bean/vo/ToolVo.java index 1696892..9e11212 100644 --- a/src/main/java/com/ccsens/yanyuan/bean/vo/ToolVo.java +++ b/src/main/java/com/ccsens/yanyuan/bean/vo/ToolVo.java @@ -6,6 +6,9 @@ import lombok.Data; import java.util.List; +/** + * @author whj + */ public class ToolVo { @Data @@ -58,11 +61,24 @@ public class ToolVo { private String code; // @ApiModelProperty("wifi名称") // private String wifiName; - @ApiModelProperty("wifi状态(0未设置,1wifi未连接,2wifi已连接)") + @ApiModelProperty("wifi状态(0未设置,1:wifi连接成功,2:wifi连接失败)") private Byte wifiStatus; @ApiModelProperty("电量") private Integer electricQuantity; - @ApiModelProperty("设备状态(0开机,1休眠,2断电,3正常)") + @ApiModelProperty("设备状态(0未设置,1开机,2休眠,3关机)") private Byte equipmentStatus; } + + @Data + @ApiModel("查询点读笔当前用户-响应") + public static class UserInfoSimple { + @ApiModelProperty("使用者userID") + private Long keyUserId; + @ApiModelProperty("用户姓名") + private String userName; + @ApiModelProperty("性别 1:男 2:女 0:未知") + private Integer sex; + @ApiModelProperty("用户状态 -2:有多个用户(使用前请先选择长者) -1:未绑定用户 0:绑定用户") + private byte status = 0; + } } diff --git a/src/main/java/com/ccsens/yanyuan/bean/vo/ZaritVo.java b/src/main/java/com/ccsens/yanyuan/bean/vo/ZaritVo.java index e803906..3517997 100644 --- a/src/main/java/com/ccsens/yanyuan/bean/vo/ZaritVo.java +++ b/src/main/java/com/ccsens/yanyuan/bean/vo/ZaritVo.java @@ -13,7 +13,7 @@ public class ZaritVo { @ApiModel("zarit信息列表-返参") public static class ZaritInfo{ @ApiModelProperty("照顾者负担量表id") - private String id; + private Long id; @ApiModelProperty("用户ID") private Long keyUserId; @ApiModelProperty("填写人userId") diff --git a/src/main/java/com/ccsens/yanyuan/config/SpringConfig.java b/src/main/java/com/ccsens/yanyuan/config/SpringConfig.java index 157152d..791f6ac 100644 --- a/src/main/java/com/ccsens/yanyuan/config/SpringConfig.java +++ b/src/main/java/com/ccsens/yanyuan/config/SpringConfig.java @@ -20,8 +20,11 @@ import org.springframework.web.servlet.config.annotation.*; import javax.annotation.Resource; import javax.sql.DataSource; import java.nio.charset.Charset; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; +import java.util.TimeZone; @Configuration public class SpringConfig implements WebMvcConfigurer { @@ -57,6 +60,7 @@ public class SpringConfig implements WebMvcConfigurer { simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); objectMapper.registerModule(simpleModule); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8")); converter.setObjectMapper(objectMapper); return converter; diff --git a/src/main/java/com/ccsens/yanyuan/mq/MentalTestGenerateReceive.java b/src/main/java/com/ccsens/yanyuan/mq/MentalTestGenerateReceive.java index df341ee..4aeed18 100644 --- a/src/main/java/com/ccsens/yanyuan/mq/MentalTestGenerateReceive.java +++ b/src/main/java/com/ccsens/yanyuan/mq/MentalTestGenerateReceive.java @@ -9,7 +9,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; - import javax.annotation.Resource; /** diff --git a/src/main/java/com/ccsens/yanyuan/mq/MentalTestReceive.java b/src/main/java/com/ccsens/yanyuan/mq/MentalTestReceive.java index be266fb..74511b8 100644 --- a/src/main/java/com/ccsens/yanyuan/mq/MentalTestReceive.java +++ b/src/main/java/com/ccsens/yanyuan/mq/MentalTestReceive.java @@ -2,11 +2,8 @@ package com.ccsens.yanyuan.mq; import com.alibaba.fastjson.JSONObject; import com.ccsens.util.DateUtil; -import com.ccsens.util.JacksonUtil; -import com.ccsens.util.config.RabbitMQConfig; import com.ccsens.yanyuan.bean.vo.TraineeVo; import com.ccsens.yanyuan.persist.dao.MentalTestDao; -import com.ccsens.yanyuan.service.IMentalTestService; import com.ccsens.yanyuan.util.YanYuanConstant; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.core.AmqpTemplate; diff --git a/src/main/java/com/ccsens/yanyuan/mq/TalkingPenReceive.java b/src/main/java/com/ccsens/yanyuan/mq/TalkingPenReceive.java index a6cb3aa..5da44b4 100644 --- a/src/main/java/com/ccsens/yanyuan/mq/TalkingPenReceive.java +++ b/src/main/java/com/ccsens/yanyuan/mq/TalkingPenReceive.java @@ -1,32 +1,20 @@ package com.ccsens.yanyuan.mq; import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.lang.Snowflake; -import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; -import com.ccsens.common.service.IMessageService; -import com.ccsens.util.CRCUtil; -import com.ccsens.util.DateUtil; -import com.ccsens.util.RedisUtil; import com.ccsens.util.bean.message.common.*; import com.ccsens.yanyuan.bean.dto.message.TalkingPenDto; -import com.ccsens.yanyuan.bean.po.*; -import com.ccsens.yanyuan.bean.vo.TrainContentVo; -import com.ccsens.yanyuan.persist.dao.*; -import com.ccsens.yanyuan.persist.mapper.EquipmentLogMapper; -import com.ccsens.yanyuan.persist.mapper.ToolCardMapper; -import com.ccsens.yanyuan.persist.mapper.ToolEquipmentMapper; -import com.ccsens.yanyuan.service.IConstantService; +import com.ccsens.yanyuan.service.ITalkingPenService; import com.ccsens.yanyuan.util.YanYuanConstant; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.math.BigDecimal; import java.util.*; /** @@ -36,35 +24,11 @@ import java.util.*; */ @Slf4j @Component +@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) @RabbitListener(queues = YanYuanConstant.Mq.TALKING_PEN) public class TalkingPenReceive { - - @Resource - private RedisUtil redisUtil; - @Resource - private IMessageService messageService; - @Resource - private Snowflake snowflake; - @Resource - private TrainEquipmentDao trainEquipmentDao; - @Resource - private ToolEquipmentMapper toolEquipmentMapper; - @Resource - private IConstantService constantService; - @Resource - private UserRelationDao userRelationDao; - @Resource - private TrainContentDao trainContentDao; - @Resource - private EquipmentLogMapper equipmentLogMapper; - @Resource - private TrainResultDao trainResultDao; - @Resource - private ToolCardMapper toolCardMapper; - @Resource - private TrainCardDao trainCardDao; @Resource - private TrainRecordDao trainRecordDao; + private ITalkingPenService talkingPenService; @RabbitHandler public void process(String messageJson) throws Exception { @@ -84,350 +48,33 @@ public class TalkingPenReceive { for (Byte type: messageMap.keySet()) { switch (type) { case TalkingPenDto.Type.STATUS: - dealStatus(messageMap.get(type).get(0)); + talkingPenService.dealStatus(messageMap.get(type).get(0)); break; case TalkingPenDto.Type.WIFI: - dealWifi(messageMap.get(type).get(0)); + talkingPenService.dealWifi(messageMap.get(type).get(0)); break; case TalkingPenDto.Type.ELECTRIC: - dealElectric(messageMap.get(type).get(0)); + talkingPenService.dealElectric(messageMap.get(type).get(0)); break; case TalkingPenDto.Type.QUESTION: - dealQuestion(messageMap.get(type).get(0)); + talkingPenService.dealQuestion(messageMap.get(type).get(0)); break; case TalkingPenDto.Type.INDEX: - dealIndex(messageMap.get(type).get(0)); + talkingPenService.dealIndex(messageMap.get(type).get(0)); break; default: // 处理过程 - dealProcess(messageMap.get(TalkingPenDto.Type.PACKAGE).get(0), messageMap.get(TalkingPenDto.Type.FRAME).get(0), messageMap.get(TalkingPenDto.Type.PROCESS)); + talkingPenService.dealProcess(messageMap.get(TalkingPenDto.Type.PACKAGE).get(0), messageMap.get(TalkingPenDto.Type.FRAME).get(0), messageMap.get(TalkingPenDto.Type.PROCESS)); break; } } // 存储日志表 log.info("点读笔消息处理完成"); - saveLog(messageMap); + talkingPenService.saveLog(messageMap); log.info("保存日志"); } - /** - * 处理序号 - * @param talkingPen 序号或结果 - */ - private void dealIndex(TalkingPenDto talkingPen) throws Exception { - YanYuanConstant.Card card = YanYuanConstant.Card.getByCardIndex(talkingPen.getValue()); - byte type = card == null ? YanYuanConstant.CardType.INDEX : card.getType(); - Long value = card == null ? talkingPen.getValue() : card.getRealIndex(); - // 查找点读笔 - ToolEquipment toolEquipment = getToolEquipment(talkingPen.getAuthId()); - if (toolEquipment == null) { - return; - } - Long equipmentId = toolEquipment.getId(); - // 查找使用者 - Long keyUserId = getUser(equipmentId, talkingPen.getAuthId()); - if (keyUserId < 0) { - // 未找到题目 - saveResult(type, 0L, toolEquipment.getId(), value); - return; - } - // 如果是序号,查找卡片对应题目code - ToolCard toolCard = null; - if (type == YanYuanConstant.CardType.INDEX) { - ToolCardExample cardExample = new ToolCardExample(); - cardExample.createCriteria().andRealNumEqualTo(Math.toIntExact(value)); - cardExample.setOrderByClause(" id desc limit 1"); - List toolCards = toolCardMapper.selectByExample(cardExample); - log.info("卡片对应类型:{}", toolCards); - if (CollectionUtil.isEmpty(toolCards)) { - saveResult(type, 0L, toolEquipment.getId(), value); - return; - } - toolCard = toolCards.get(0); - } - // 查询点读笔正在读的题目 - String key = StrUtil.format(YanYuanConstant.Equipment.TALKING_PEN_QUESTION, toolEquipment.getId(), keyUserId); - Object o = redisUtil.get(key); - log.info("点读笔{}正在读的题目:{}", key, o); - // 有正在读的题目,结果直接保存,序号判断类型一致保存 - if (o!=null) { - TrainContentVo.Audio audioRedis = (TrainContentVo.Audio) o; - // - boolean save = type == YanYuanConstant.CardType.RESULT || - (type == YanYuanConstant.CardType.INDEX && toolCard.getType().equals(audioRedis.getCode())); - if (save) { - // 结果 或 序号,判断类型是否一致 - saveResult(type, audioRedis.getRecordId(), toolEquipment.getId(), value); - return; - } - } - long today = DateUtil.beginOfDay(new Date()).getTime(); - // 点读笔没有正在进行的题目 - if (type == YanYuanConstant.CardType.RESULT) { - // 查询今天的训练计划和结果 - saveTrainResult(value, toolEquipment.getId(), keyUserId, today); - } else { - // 查询前后一周的、同类型的训练计划 - saveCard(toolCard, toolEquipment.getId(), keyUserId, today); - } - } - - /** - * 保存卡片序号 - * @param toolCard 卡片 - * @param toolEquipmentId 设备ID - * @param keyUserId 使用者 - * @param today 今天 - */ - private void saveCard(ToolCard toolCard, Long toolEquipmentId, Long keyUserId, long today) { - long startTime = today - YanYuanConstant.MentalTest.PERIOD / 2 * YanYuanConstant.DAY_TIME; - long endTime = today + YanYuanConstant.MentalTest.PERIOD / 2 * YanYuanConstant.DAY_TIME; - List times = trainRecordDao.queryTime(keyUserId, startTime, endTime, toolCard.getType()); - if (CollectionUtil.isEmpty(times)) { - saveCard(toolCard, 0L, keyUserId, today); - return; - } - Long recordId = null; - Long subTime = null; - for (TrainContentVo.RecordTime time: times) { - if (subTime == null || subTime > Math.abs(today - time.getStartTime())) { - recordId = time.getRecordId(); - subTime = Math.abs(today - time.getStartTime()); - } - } - saveResult(YanYuanConstant.CardType.INDEX, recordId, toolEquipmentId, toolCard.getRealNum()); - } - - /** - * 保存答案 - * @param value 答案 - * @param toolEquipmentId 设备ID - * @param keyUserId 用户ID - * @param today 时间 - */ - private void saveTrainResult(Long value, Long toolEquipmentId, Long keyUserId, long today) { - List records = trainRecordDao.queryCount(keyUserId, today); - log.info("{}今天{}的训练计划:{}", keyUserId, today, records); - if (CollectionUtil.isEmpty(records)) { - saveResult(YanYuanConstant.CardType.RESULT, 0L, toolEquipmentId, value); - } else if (records.size() == 1) { - saveResult(YanYuanConstant.CardType.RESULT, records.get(0).getRecordId(), toolEquipmentId, value); - } else { - // 找到第一个没有答案的进行记录 - for (TrainContentVo.RecordResultCount record: records) { - if (record.getCount() == 0) { - saveResult(YanYuanConstant.CardType.RESULT, record.getRecordId(), toolEquipmentId, value); - return; - } - } - // 都有答案,记录在最后一道题下 - saveResult(YanYuanConstant.CardType.RESULT, records.get(records.size()).getRecordId(), toolEquipmentId, value); - } - } - - private void saveResult(Byte type, Long recordId, Long equipmentId, long value) { - log.info("保存类型为:{}的结果,recordId:{}, equipmentId:{}, value:{}", type, recordId, equipmentId, value); - if (type == null || type == YanYuanConstant.CardType.INDEX) { - // 序号 - // 根据序号查询卡片 - ToolCardExample example = new ToolCardExample(); - example.createCriteria().andRealNumEqualTo((int)value); - example.setOrderByClause("id desc limit 1"); - List cards = toolCardMapper.selectByExample(example); - // 存储训练结果 - TrainCard trainCard = new TrainCard(); - trainCard.setId(snowflake.nextId()); - trainCard.setRecordId(recordId); - trainCard.setAssistId(CollectionUtil.isEmpty(cards) ? 0 : cards.get(0).getId()); - trainCard.setEquipmentId(equipmentId); - trainCardDao.insertSelective(trainCard); - } else if (type == YanYuanConstant.CardType.RESULT) { - // 结果 - TrainResult result = new TrainResult(); - result.setId(snowflake.nextId()); - result.setRecordId(recordId); - result.setEquipmentId(equipmentId); - result.setFinishResult(new BigDecimal(value)); - trainResultDao.insertSelective(result); - } - } - - /** - * 存储日志 - * @param messageMap 数据信息 - */ - private void saveLog(Map> messageMap) { - List keys = CollectionUtil.sort(messageMap.keySet(), Byte::compare); - StringBuilder builder = new StringBuilder(); - TalkingPenDto first = new TalkingPenDto(); - keys.forEach(key -> CollectionUtil.sort(messageMap.get(key), - Comparator.comparingInt(TalkingPenDto::getAddr)) - .forEach(dto->{ - if (first.getAuthId() == null) { - first.setAuthId(dto.getAuthId()); - first.setAddr(dto.getAddr()); - } - builder.append(dto.getValue()).append(","); - })); - EquipmentLog log = new EquipmentLog(); - log.setId(snowflake.nextId()); - log.setSerial(Long.parseLong(first.getAuthId())); - log.setAddr(first.getAddr()); - log.setValue(builder.toString()); - equipmentLogMapper.insertSelective(log); - } - - /** - * 处理过程日志 - * @param packageDto 包 - * @param frameDto 诊 - * @param processList 坐标数据 - */ - private void dealProcess(TalkingPenDto packageDto, TalkingPenDto frameDto, List processList) { - String indexTime = constantService.getValue(YanYuanConstant.Equipment.VALID_INDEX_TIME_KEY); - // 查询点读笔对应的序号 - TrainCard trainCard = trainCardDao.getRecent(packageDto.getAuthId(), System.currentTimeMillis() - Long.parseLong(indexTime) * 3600 * 1000); - //校验是否已经存在 - } - - /** - * 处理查询试题 - * @param talkingPen 试题 - */ - private void dealQuestion(TalkingPenDto talkingPen) throws Exception { - // 查找点读笔 - ToolEquipment toolEquipment = getToolEquipment(talkingPen.getAuthId()); - if (toolEquipment == null) { - return; - } - // 查找使用者 - Long keyUserId = getUser(toolEquipment.getId(), talkingPen.getAuthId()); - if (keyUserId < 0) { - return; - } - // 查找题目 - TrainContentVo.Audio nextPlan = getNextPlan(talkingPen, toolEquipment.getId(), keyUserId, talkingPen.getAuthId()); - log.info("{}的下一个训练计划:{}", toolEquipment.getId(), nextPlan); - if (nextPlan == null) { - return; - } - String key = StrUtil.format(YanYuanConstant.Equipment.TALKING_PEN_QUESTION, toolEquipment.getId(), keyUserId); - redisUtil.set(key, nextPlan, YanYuanConstant.Train.TALKING_PEN_WRITE_TIME); - //通知点读笔 - sendAudio(nextPlan.getAudioPosition() == null ? YanYuanConstant.Equipment.AUDIO_DEFAULT : nextPlan.getAudioPosition(), talkingPen.getAuthId()); - } - - private TrainContentVo.Audio getNextPlan(TalkingPenDto talkingPen, Long equipmentId, Long keyUserId, String serial) throws Exception { - String key = StrUtil.format(YanYuanConstant.Equipment.TALKING_PEN_QUESTION, equipmentId, keyUserId); - Object o = redisUtil.get(key); - log.info("{}的缓存对象:{}", key, o); - // 今天开始的时间 - Date now = new Date(); - long todayBegin = DateUtil.beginOfDay(now).getTime(); - TrainContentVo.Audio audio; - if (ObjectUtil.isNull(o)) { - // 查询今天的第一个训练计划 - audio = trainContentDao.getFirst(keyUserId, todayBegin); - if (audio == null) { - // 提醒登录小程序进行脑力测评 - sendAudio(YanYuanConstant.Equipment.AUDIO_MENTAL, serial); - return null; - } else { - return audio; - } - } - TrainContentVo.Audio audioRedis = (TrainContentVo.Audio) o; - audio = trainContentDao.getNext(audioRedis.getRecordId(), talkingPen.getValue()); - if (audio == null) { - if (talkingPen.getValue() != YanYuanConstant.Equipment.NEXT) { - // 上一道为空 提醒没有更多题目 - sendAudio(YanYuanConstant.Equipment.AUDIO_TRAIN_PLAN_NO, serial); - } else { - // 下一道为空 - //当前题目日期小于今天 提醒登录小程序进行脑力测评, 否则 提醒没有更多题目 - int audioIndex = audioRedis.getStartTime() < todayBegin ? YanYuanConstant.Equipment.AUDIO_MENTAL : YanYuanConstant.Equipment.AUDIO_TRAIN_PLAN_NO; - sendAudio(audioIndex, serial); - } - return null; - } - return audio; - } - - /** - * 查询设备的使用者ID - * @param equipmentId 设备ID - * @return 使用者ID - */ - private Long getUser(Long equipmentId, String authId) throws Exception { - // 查询时间 - String key = YanYuanConstant.Equipment.VALID_TIME_KEY; - String value = constantService.getValue(key); - long time = System.currentTimeMillis() - Long.parseLong(value) * YanYuanConstant.DAY_TIME; - Date date = new Date(); - date.setTime(time); - Long keyUserId = trainEquipmentDao.queryRecentUserId(equipmentId, date); - log.info("{}有效期内选择的用户:{}", equipmentId, keyUserId); - if (keyUserId != null) { - return keyUserId; - } - // 查询购买者关联的用户 - List userIds = userRelationDao.countUserByEquipment(equipmentId); - log.info("{}关联的使用者:{}", equipmentId, userIds); - // TODO 记录一下点读笔发送的语音,时长1分钟,若1分钟内发送过相同的内容,则不再发送(仅限用户未绑定,时长待定) - if (CollectionUtil.isEmpty(userIds)) { - sendAudio(YanYuanConstant.Equipment.AUDIO_NO_TRAINEE, authId); - return YanYuanConstant.Equipment.BIND_USER_NUM_ZERO; - } else if (userIds.size() == 1) { - return userIds.get(0); - } else { - sendAudio(YanYuanConstant.Equipment.AUDIO_MORE_TRAINEE, authId); - return YanYuanConstant.Equipment.BIND_USER_NUM_MORE; - } - } - - /** - * 查询设备信息 - * @param authId 授权ID - * @return 设备 - */ - private ToolEquipment getToolEquipment(String authId) { - long serial = Long.parseLong(authId); - ToolEquipmentExample toolEquipmentExample = new ToolEquipmentExample(); - toolEquipmentExample.createCriteria().andSerialEqualTo(serial); - List toolEquipments = toolEquipmentMapper.selectByExample(toolEquipmentExample); - if (CollectionUtil.isEmpty(toolEquipments)) { - return null; - } - return toolEquipments.get(0); - } - - /** - * 处理电量状态 - * @param talkingPen 电量状态 - */ - private void dealElectric(TalkingPenDto talkingPen) { - // TODO - System.out.println(talkingPen); - } - - /** - * 处理wifi - * @param talkingPen wifi - */ - private void dealWifi(TalkingPenDto talkingPen) { - // TODO - System.out.println(talkingPen); - } - - /** - * 处理点读笔状态 - * @param talkingPen 状态 - */ - private void dealStatus(TalkingPenDto talkingPen) { - // TODO - System.out.println(talkingPen); - } /** * 计算寄存器的值,并按照类型分类 @@ -531,50 +178,7 @@ public class TalkingPenReceive { penMap.get(low.getAddr()).used = true; } - /** - * 通知点读笔,应该播放什么语音 - * @param value 语音位置 - * @param talkingPenSerial 点读笔序列号(标识ID) - * @throws Exception 异常 - */ - private void sendAudio(int value, String talkingPenSerial) throws Exception { - MessageRule messageRule = MessageRule.defaultRule(MessageConstant.DomainType.User); - messageRule.setAckRule(MessageRule.AckRule.NONE); - messageRule.setOfflineDiscard((byte) 1); - - Set userIdSet = new HashSet<>(); - userIdSet.add(talkingPenSerial); - // 开始标志 - byte[] data = new byte[14]; - System.arraycopy(YanYuanConstant.ModBus.START, 0 , data, 0, YanYuanConstant.ModBus.START.length); - // 寄存器数量 - data[2] = 11; - // 点读笔地址 - data[3] = YanYuanConstant.ModBus.TALKING_PEN_ADDR; - // 功能码(1) 10:写多个 - data[4] = YanYuanConstant.ModBus.WRITE_MORE; - // 寄存器起始地址(2) - System.arraycopy(YanYuanConstant.ModBus.AUDIO_ADDR, 0 , data, 5, YanYuanConstant.ModBus.AUDIO_ADDR.length); - // 寄存器数量(2) - data[7] = 0X00; - data[8] = 0X01; - // 寄存器长度(1) 2*寄存器数量 - data[9] = 2; - // 音频顺序 - data[10] = (byte) (value >> 8); - data[11] = (byte) (value & 0xFF); - // crc - byte[] crc = new byte[2]; - CRCUtil.crc16(crc,data,3, data[2] - crc.length); - data[12] = crc[0]; - data[13] = crc[1]; - String join = ArrayUtil.join(data, ","); - InMessage inMessage = InMessage.newToUserMessage(null, userIdSet, null, messageRule, join); - log.info("给点读笔发送消息:{}", inMessage); - //发送消息 - messageService.sendTo(inMessage); - } public static class ValueUse{ TalkingPenDto talkingPen; @@ -586,4 +190,6 @@ public class TalkingPenReceive { this.talkingPen = talkingPen; } } + + } diff --git a/src/main/java/com/ccsens/yanyuan/persist/dao/ToolFindDifferenceDao.java b/src/main/java/com/ccsens/yanyuan/persist/dao/ToolFindDifferenceDao.java new file mode 100644 index 0000000..2dd7320 --- /dev/null +++ b/src/main/java/com/ccsens/yanyuan/persist/dao/ToolFindDifferenceDao.java @@ -0,0 +1,16 @@ +package com.ccsens.yanyuan.persist.dao; + +import com.ccsens.yanyuan.persist.mapper.ToolFindDifferenceMapper; +import org.apache.ibatis.annotations.Param; + +/** + * @author whj + */ +public interface ToolFindDifferenceDao extends ToolFindDifferenceMapper { + /** + * 查找几处不同 + * @param cardId 卡片ID + * @return 不同数量 + */ + int getDifferenceNum(@Param("cardId") Long cardId); +} diff --git a/src/main/java/com/ccsens/yanyuan/persist/dao/TrainCardDao.java b/src/main/java/com/ccsens/yanyuan/persist/dao/TrainCardDao.java index 7d3411f..0249b91 100644 --- a/src/main/java/com/ccsens/yanyuan/persist/dao/TrainCardDao.java +++ b/src/main/java/com/ccsens/yanyuan/persist/dao/TrainCardDao.java @@ -30,7 +30,7 @@ public interface TrainCardDao extends TrainCardMapper { /** * 查询点读笔指定时间内最新的选择序号的记录 * @param serial 点读笔编号 - * @param startTime 开始时间 + * @param startTime 开始时间 ,单位:秒 * @return 最新的记录 */ TrainCard getRecent(@Param("serial") String serial, @Param("startTime") long startTime); diff --git a/src/main/java/com/ccsens/yanyuan/persist/dao/TrainCorrectDao.java b/src/main/java/com/ccsens/yanyuan/persist/dao/TrainCorrectDao.java new file mode 100644 index 0000000..d03a79e --- /dev/null +++ b/src/main/java/com/ccsens/yanyuan/persist/dao/TrainCorrectDao.java @@ -0,0 +1,18 @@ +package com.ccsens.yanyuan.persist.dao; + +import com.ccsens.yanyuan.persist.mapper.TrainCorrectMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author whj + */ +public interface TrainCorrectDao extends TrainCorrectMapper { + /** + * 查询某次找不同正确的位置 + * @param cardId 点读笔选择的卡片ID + * @return 正确位置 + */ + List queryPlace(@Param("cardId") Long cardId); +} diff --git a/src/main/java/com/ccsens/yanyuan/persist/dao/TrainProcessCardDao.java b/src/main/java/com/ccsens/yanyuan/persist/dao/TrainProcessCardDao.java index e7d3637..a1ee3c1 100644 --- a/src/main/java/com/ccsens/yanyuan/persist/dao/TrainProcessCardDao.java +++ b/src/main/java/com/ccsens/yanyuan/persist/dao/TrainProcessCardDao.java @@ -1,18 +1,29 @@ package com.ccsens.yanyuan.persist.dao; +import com.ccsens.yanyuan.bean.dto.message.CoordinateDto; import com.ccsens.yanyuan.bean.vo.TrainBelongVo; +import com.ccsens.yanyuan.persist.mapper.TrainProcessCardMapper; import org.apache.ibatis.annotations.Param; import java.util.List; +import java.util.Set; /** * @author whj */ -public interface TrainProcessCardDao { +public interface TrainProcessCardDao extends TrainProcessCardMapper { /** * 查询线条 * @param recordIds 点读笔卡片ID * @return */ List queryLines(@Param("recordIds") List recordIds); + + /** + * 统计正确点的数量 + * @param cardId 卡片ID + * @param coordinates 上传坐标 + * @return 统计数量 + */ + List count(@Param("cardId") Long cardId, @Param("coordinates") List coordinates); } diff --git a/src/main/java/com/ccsens/yanyuan/persist/dao/TraineeDao.java b/src/main/java/com/ccsens/yanyuan/persist/dao/TraineeDao.java index 02a04ac..38d5d68 100644 --- a/src/main/java/com/ccsens/yanyuan/persist/dao/TraineeDao.java +++ b/src/main/java/com/ccsens/yanyuan/persist/dao/TraineeDao.java @@ -2,6 +2,7 @@ package com.ccsens.yanyuan.persist.dao; import com.ccsens.yanyuan.bean.po.User; import com.ccsens.yanyuan.bean.vo.FamilyVo; +import com.ccsens.yanyuan.bean.vo.ToolVo; import com.ccsens.yanyuan.bean.vo.TraineeVo; import com.ccsens.yanyuan.persist.mapper.UserMapper; import org.apache.ibatis.annotations.Param; @@ -51,4 +52,11 @@ public interface TraineeDao extends UserMapper { * @return 使用者信息 + 用户和使用者关系 */ FamilyVo.Member getMember(@Param("keyUserId") Long keyUserId, @Param("userId") Long userId); + + /** + * 根据key_id查询基本信息 + * @param keyId keyId + * @return 基本信息 + */ + ToolVo.UserInfoSimple getSimpleByKeyId(@Param("keyId") long keyId); } diff --git a/src/main/java/com/ccsens/yanyuan/persist/dao/UserRelationDao.java b/src/main/java/com/ccsens/yanyuan/persist/dao/UserRelationDao.java index 14b0533..4603451 100644 --- a/src/main/java/com/ccsens/yanyuan/persist/dao/UserRelationDao.java +++ b/src/main/java/com/ccsens/yanyuan/persist/dao/UserRelationDao.java @@ -55,4 +55,12 @@ public interface UserRelationDao extends UserRelationMapper { * @return 使用者数量 */ List countUserByEquipment(@Param("equipmentId") Long equipmentId); + + /** + * 查询当前用户关于老人的待审核的用户数 + * @param keyUserId 老人keyId + * @param userId 用户ID + * @return 待审核数 + */ + int getWaitAuditNum(@Param("keyUserId") Long keyUserId, @Param("userId") Long userId); } diff --git a/src/main/java/com/ccsens/yanyuan/persist/mapper/TrainCorrectMapper.java b/src/main/java/com/ccsens/yanyuan/persist/mapper/TrainCorrectMapper.java new file mode 100644 index 0000000..e3266c1 --- /dev/null +++ b/src/main/java/com/ccsens/yanyuan/persist/mapper/TrainCorrectMapper.java @@ -0,0 +1,30 @@ +package com.ccsens.yanyuan.persist.mapper; + +import com.ccsens.yanyuan.bean.po.TrainCorrect; +import com.ccsens.yanyuan.bean.po.TrainCorrectExample; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +public interface TrainCorrectMapper { + long countByExample(TrainCorrectExample example); + + int deleteByExample(TrainCorrectExample example); + + int deleteByPrimaryKey(Long id); + + int insert(TrainCorrect record); + + int insertSelective(TrainCorrect record); + + List selectByExample(TrainCorrectExample example); + + TrainCorrect selectByPrimaryKey(Long id); + + int updateByExampleSelective(@Param("record") TrainCorrect record, @Param("example") TrainCorrectExample example); + + int updateByExample(@Param("record") TrainCorrect record, @Param("example") TrainCorrectExample example); + + int updateByPrimaryKeySelective(TrainCorrect record); + + int updateByPrimaryKey(TrainCorrect record); +} \ No newline at end of file diff --git a/src/main/java/com/ccsens/yanyuan/service/FamilyService.java b/src/main/java/com/ccsens/yanyuan/service/FamilyService.java index b1a5ada..c6e8de5 100644 --- a/src/main/java/com/ccsens/yanyuan/service/FamilyService.java +++ b/src/main/java/com/ccsens/yanyuan/service/FamilyService.java @@ -129,9 +129,10 @@ public class FamilyService implements IFamilyService { @Override public FamilyVo.NeedAuditNum queryAuditNum(FamilyDto.QueryFamily param, Long userId) { - FamilyVo.NeedAuditNum auditNum = familyDao.queryAuditNum(param.getProjectId()); + int num = userRelationDao.getWaitAuditNum(param.getProjectId(), userId); FamilyVo.NeedAuditNum otherInfo = familyDao.queryOtherInfo(param.getProjectId(),userId); - otherInfo.setAuditNum(auditNum.getAuditNum()); + log.info("用戶信息:{},待审核用户数:{}", otherInfo, num); + otherInfo.setAuditNum(num); return otherInfo; } diff --git a/src/main/java/com/ccsens/yanyuan/service/ITalkingPenService.java b/src/main/java/com/ccsens/yanyuan/service/ITalkingPenService.java new file mode 100644 index 0000000..90bc9a9 --- /dev/null +++ b/src/main/java/com/ccsens/yanyuan/service/ITalkingPenService.java @@ -0,0 +1,66 @@ +package com.ccsens.yanyuan.service; + +import com.ccsens.yanyuan.bean.dto.ToolDto; +import com.ccsens.yanyuan.bean.dto.message.TalkingPenDto; +import com.ccsens.yanyuan.bean.vo.ToolVo; + +import java.util.List; +import java.util.Map; + +/** + * @author whj + */ +public interface ITalkingPenService { + /** + * 处理点读笔状态 + * @param talkingPen 状态 + * @throws Exception Exception + */ + void dealStatus(TalkingPenDto talkingPen) throws Exception; + /** + * 处理wifi + * @param talkingPen wifi + * @throws Exception Exception + */ + void dealWifi(TalkingPenDto talkingPen) throws Exception; + /** + * 处理电量状态 + * @param talkingPen 电量状态 + * @throws Exception Exception + */ + void dealElectric(TalkingPenDto talkingPen) throws Exception; + /** + * 处理查询试题 + * @param talkingPen 试题 + * @throws Exception Exception + */ + void dealQuestion(TalkingPenDto talkingPen) throws Exception; + /** + * 处理序号 + * @param talkingPen 序号或结果 + * @throws Exception Exception + */ + void dealIndex(TalkingPenDto talkingPen) throws Exception; + /** + * 处理过程日志 + * @param packageDto 包 + * @param frameDto 诊 + * @param processList 坐标数据 + * @throws Exception Exception + */ + void dealProcess(TalkingPenDto packageDto, TalkingPenDto frameDto, List processList) throws Exception; + /** + * 存储日志 + * @param messageMap 数据信息 + * @throws Exception Exception + */ + void saveLog(Map> messageMap); + + /** + * 获取正在使用设备的使用者信息 + * @param param 点读笔信息 + * @param userId 操作者ID + * @return 使用者信息 + */ + ToolVo.UserInfoSimple getUserName(ToolDto.GetUser param, Long userId); +} diff --git a/src/main/java/com/ccsens/yanyuan/service/RoleService.java b/src/main/java/com/ccsens/yanyuan/service/RoleService.java index 47392d7..9f55e65 100644 --- a/src/main/java/com/ccsens/yanyuan/service/RoleService.java +++ b/src/main/java/com/ccsens/yanyuan/service/RoleService.java @@ -4,6 +4,7 @@ import com.ccsens.common.bean.dto.CRoleDto; import com.ccsens.common.bean.vo.CRoleVo; import com.ccsens.yanyuan.bean.dto.RoleDto; import com.ccsens.yanyuan.bean.vo.RoleVo; +import com.ccsens.yanyuan.persist.dao.UserRelationDao; import com.ccsens.yanyuan.util.YanYuanConstant; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -11,23 +12,26 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; @Slf4j @Service @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public class RoleService implements IYRoleService { + @Resource + private UserRelationDao userRelationDao; @Override public RoleVo.QueryRole queryShowRole(RoleDto.QueryRoleById param, Long userId) { switch (param.getTemplateCode()) { - case YanYuanConstant.Project.TEMPLATE_USER: return getUserRole(); + case YanYuanConstant.Project.TEMPLATE_USER: return getUserRole(param.getProjectId(), userId); } return new RoleVo.QueryRole(); } - private RoleVo.QueryRole getUserRole() { + private RoleVo.QueryRole getUserRole(Long projectId, Long userId) { RoleVo.QueryRole queryRole = new RoleVo.QueryRole(); List visibleList = new ArrayList<>(); List invisibleList = new ArrayList<>(); @@ -36,6 +40,9 @@ public class RoleService implements IYRoleService { visibleList.add(drill); RoleVo.RoleInfo setting = new RoleVo.RoleInfo(); BeanUtils.copyProperties(YanYuanConstant.YanYuanRole.Setting, setting); + // 查询待审核的用户信息 + int num = userRelationDao.getWaitAuditNum(projectId, userId); + setting.setRemindNum(num); visibleList.add(setting); queryRole.setVisibleList(visibleList); queryRole.setInvisibleList(invisibleList); diff --git a/src/main/java/com/ccsens/yanyuan/service/TalkingPenService.java b/src/main/java/com/ccsens/yanyuan/service/TalkingPenService.java new file mode 100644 index 0000000..e479645 --- /dev/null +++ b/src/main/java/com/ccsens/yanyuan/service/TalkingPenService.java @@ -0,0 +1,634 @@ +package com.ccsens.yanyuan.service; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.Snowflake; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.ccsens.common.service.IMessageService; +import com.ccsens.util.CRCUtil; +import com.ccsens.util.DateUtil; +import com.ccsens.util.RedisUtil; +import com.ccsens.util.bean.message.common.InMessage; +import com.ccsens.util.bean.message.common.MessageConstant; +import com.ccsens.util.bean.message.common.MessageRule; +import com.ccsens.yanyuan.bean.dto.ToolDto; +import com.ccsens.yanyuan.bean.dto.message.CoordinateDto; +import com.ccsens.yanyuan.bean.dto.message.TalkingPenDto; +import com.ccsens.yanyuan.bean.po.*; +import com.ccsens.yanyuan.bean.vo.ToolVo; +import com.ccsens.yanyuan.bean.vo.TrainContentVo; +import com.ccsens.yanyuan.persist.dao.*; +import com.ccsens.yanyuan.persist.mapper.EquipmentLogMapper; +import com.ccsens.yanyuan.persist.mapper.ToolCardMapper; +import com.ccsens.yanyuan.persist.mapper.ToolEquipmentMapper; +import com.ccsens.yanyuan.util.YanYuanConstant; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; + +/** + * @description: + * @author: whj + * @time: 2021/12/21 16:31 + */ +@Slf4j +@Service +@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) +public class TalkingPenService implements ITalkingPenService { + @Resource + private RedisUtil redisUtil; + @Resource + private IMessageService messageService; + @Resource + private Snowflake snowflake; + @Resource + private TrainEquipmentDao trainEquipmentDao; + @Resource + private ToolEquipmentMapper toolEquipmentMapper; + @Resource + private IConstantService constantService; + @Resource + private UserRelationDao userRelationDao; + @Resource + private TrainContentDao trainContentDao; + @Resource + private EquipmentLogMapper equipmentLogMapper; + @Resource + private TrainResultDao trainResultDao; + @Resource + private ToolCardMapper toolCardMapper; + @Resource + private TrainCardDao trainCardDao; + @Resource + private TrainRecordDao trainRecordDao; + @Resource + private TrainProcessCardDao trainProcessCardDao; + @Resource + private ToolFindDifferenceDao toolFindDifferenceDao; + @Resource + private TrainCorrectDao trainCorrectDao; + @Resource + private TraineeDao traineeDao; + + /** + * 处理序号 + * @param talkingPen 序号或结果 + */ + @Override + public void dealIndex(TalkingPenDto talkingPen) throws Exception { + YanYuanConstant.Card card = YanYuanConstant.Card.getByCardIndex(talkingPen.getValue()); + byte type = card == null ? YanYuanConstant.CardType.INDEX : card.getType(); + long value = card == null ? talkingPen.getValue() : card.getRealIndex(); + // 查找点读笔 + ToolEquipment toolEquipment = getToolEquipment(talkingPen.getAuthId()); + if (toolEquipment == null) { + return; + } + Long equipmentId = toolEquipment.getId(); + // 查找使用者 + Long keyUserId = getUser(equipmentId, talkingPen.getAuthId()); + if (keyUserId < 0) { + // 未找到题目 + saveResult(type, 0L, toolEquipment.getId(), value); + return; + } + // 如果是序号,查找卡片对应题目code + ToolCard toolCard = null; + if (type == YanYuanConstant.CardType.INDEX) { + ToolCardExample cardExample = new ToolCardExample(); + cardExample.createCriteria().andRealNumEqualTo(Math.toIntExact(value)); + cardExample.setOrderByClause(" id desc limit 1"); + List toolCards = toolCardMapper.selectByExample(cardExample); + log.info("卡片对应类型:{}", toolCards); + if (CollectionUtil.isEmpty(toolCards)) { + saveResult(type, 0L, toolEquipment.getId(), value); + return; + } + toolCard = toolCards.get(0); + } + // 查询点读笔正在读的题目 + String key = StrUtil.format(YanYuanConstant.Equipment.TALKING_PEN_QUESTION, toolEquipment.getId(), keyUserId); + Object o = redisUtil.get(key); + log.info("点读笔{}正在读的题目:{}", key, o); + // 有正在读的题目,结果直接保存,序号判断类型一致保存 + if (o!=null) { + TrainContentVo.Audio audioRedis = (TrainContentVo.Audio) o; + // + boolean save = type == YanYuanConstant.CardType.RESULT || + (type == YanYuanConstant.CardType.INDEX && toolCard.getType().equals(audioRedis.getCode())); + if (save) { + // 结果 或 序号,判断类型是否一致 + saveResult(type, audioRedis.getRecordId(), toolEquipment.getId(), value); + return; + } + } + long today = DateUtil.beginOfDay(new Date()).getTime(); + // 点读笔没有正在进行的题目 + if (type == YanYuanConstant.CardType.INDEX) { + // 查询前后一周的、同类型的训练计划 + saveCard(toolCard, toolEquipment.getId(), keyUserId, today); + } else { + // 查询今天的训练计划和结果 + saveTrainResult(value, toolEquipment.getId(), keyUserId, today); + } + } + + /** + * 保存卡片序号 + * @param toolCard 卡片 + * @param toolEquipmentId 设备ID + * @param keyUserId 使用者 + * @param today 今天 + */ + private void saveCard(ToolCard toolCard, Long toolEquipmentId, Long keyUserId, long today) { + long startTime = today - YanYuanConstant.MentalTest.PERIOD / 2 * YanYuanConstant.DAY_TIME; + long endTime = today + YanYuanConstant.MentalTest.PERIOD / 2 * YanYuanConstant.DAY_TIME; + List times = trainRecordDao.queryTime(keyUserId, startTime, endTime, toolCard.getType()); + if (CollectionUtil.isEmpty(times)) { + saveCard(toolCard, 0L, keyUserId, today); + return; + } + Long recordId = null; + Long subTime = null; + for (TrainContentVo.RecordTime time: times) { + if (subTime == null || subTime > Math.abs(today - time.getStartTime())) { + recordId = time.getRecordId(); + subTime = Math.abs(today - time.getStartTime()); + } + } + saveResult(YanYuanConstant.CardType.INDEX, recordId, toolEquipmentId, toolCard.getRealNum()); + } + + /** + * 保存答案 + * @param value 答案 + * @param toolEquipmentId 设备ID + * @param keyUserId 用户ID + * @param today 时间 + */ + private void saveTrainResult(Long value, Long toolEquipmentId, Long keyUserId, long today) { + List records = trainRecordDao.queryCount(keyUserId, today); + log.info("{}今天{}的训练计划:{}", keyUserId, today, records); + if (CollectionUtil.isEmpty(records)) { + saveResult(YanYuanConstant.CardType.RESULT, 0L, toolEquipmentId, value); + } else if (records.size() == 1) { + saveResult(YanYuanConstant.CardType.RESULT, records.get(0).getRecordId(), toolEquipmentId, value); + } else { + // 找到第一个没有答案的进行记录 + for (TrainContentVo.RecordResultCount record: records) { + if (record.getCount() == 0) { + saveResult(YanYuanConstant.CardType.RESULT, record.getRecordId(), toolEquipmentId, value); + return; + } + } + // 都有答案,记录在最后一道题下 + saveResult(YanYuanConstant.CardType.RESULT, records.get(records.size()-1).getRecordId(), toolEquipmentId, value); + } + } + + private void saveResult(Byte type, Long recordId, Long equipmentId, long value) { + log.info("保存类型为:{}的结果,recordId:{}, equipmentId:{}, value:{}", type, recordId, equipmentId, value); + if (type == null || type == YanYuanConstant.CardType.INDEX) { + // 序号 + // 根据序号查询卡片 + ToolCardExample example = new ToolCardExample(); + example.createCriteria().andRealNumEqualTo((int)value); + example.setOrderByClause("id desc limit 1"); + List cards = toolCardMapper.selectByExample(example); + // 存储训练结果 + TrainCard trainCard = new TrainCard(); + trainCard.setId(snowflake.nextId()); + trainCard.setRecordId(recordId); + trainCard.setAssistId(CollectionUtil.isEmpty(cards) ? 0 : cards.get(0).getId()); + trainCard.setEquipmentId(equipmentId); + trainCardDao.insertSelective(trainCard); + } else if (type == YanYuanConstant.CardType.RESULT) { + // 结果 + TrainResult result = new TrainResult(); + result.setId(snowflake.nextId()); + result.setRecordId(recordId); + result.setEquipmentId(equipmentId); + result.setFinishResult(new BigDecimal(value)); + trainResultDao.insertSelective(result); + } + } + + /** + * 存储日志 + * @param messageMap 数据信息 + */ + @Override + public void saveLog(Map> messageMap) { + List keys = CollectionUtil.sort(messageMap.keySet(), Byte::compare); + StringBuilder builder = new StringBuilder(); + TalkingPenDto first = new TalkingPenDto(); + keys.forEach(key -> CollectionUtil.sort(messageMap.get(key), + Comparator.comparingInt(TalkingPenDto::getAddr)) + .forEach(dto->{ + if (first.getAuthId() == null) { + first.setAuthId(dto.getAuthId()); + first.setAddr(dto.getAddr()); + } + builder.append(dto.getValue()).append(","); + })); + EquipmentLog log = new EquipmentLog(); + log.setId(snowflake.nextId()); + log.setSerial(Long.parseLong(first.getAuthId())); + log.setAddr(first.getAddr()); + log.setValue(builder.toString()); + equipmentLogMapper.insertSelective(log); + } + + @Override + public ToolVo.UserInfoSimple getUserName(ToolDto.GetUser param, Long userId) { + long traineeId = getUserId(param.getEquipmentId()); + if (traineeId == YanYuanConstant.Equipment.BIND_USER_NUM_ZERO + || traineeId == YanYuanConstant.Equipment.BIND_USER_NUM_MORE) { + ToolVo.UserInfoSimple simple = new ToolVo.UserInfoSimple(); + simple.setStatus((byte)traineeId); + return simple; + } else { + return traineeDao.getSimpleByKeyId(traineeId); + } + + } + + /** + * 处理过程日志 + * @param packageDto 包 + * @param frameDto 诊 + * @param processList 坐标数据 + */ + @Override + public void dealProcess(TalkingPenDto packageDto, TalkingPenDto frameDto, List processList) throws Exception { + // 判断点读笔坐标位数是不是3的倍数 + int group = 3; + if (CollectionUtil.isEmpty(processList) || processList.size() % group != 0) { + log.info("点读笔过程坐标码位数不正确:{}", processList); + return; + } + String indexTime = constantService.getValue(YanYuanConstant.Equipment.VALID_INDEX_TIME_KEY); + // 查询点读笔对应的序号 + TrainCard trainCard = trainCardDao.getRecent(packageDto.getAuthId(), (System.currentTimeMillis()/1000 - Long.parseLong(indexTime)* 3600 ) ); + log.info("trainCard:{}", trainCard); + // 重新整理数据,存储过程 + List points = CollectionUtil.sort(processList, Comparator.comparingInt(TalkingPenDto::getAddr)); + List coordinates = new ArrayList<>(); + StringBuilder builder = new StringBuilder(); + + for (int i = 0; i < points.size() ; i+=group) { + builder.append(points.get(i).getValue()).append(",") + .append(points.get(i + 1).getValue()).append(",") + .append(points.get(i + 2).getValue()).append(";"); + coordinates.add(new CoordinateDto.Point(points.get(i).getValue(), points.get(i + 1).getValue())); + } + // 保存过程 + TrainProcessCard process = new TrainProcessCard(); + process.setId(snowflake.nextId()); + process.setCardId(trainCard == null ? 0 : trainCard.getId()); + process.setOperateTime(packageDto.getTime()); + process.setPackageIndex(packageDto.getValue().intValue()); + process.setFrameIndex(frameDto.getValue().intValue()); + process.setPoints(builder.toString()); + trainProcessCardDao.insertSelective(process); + log.info("保存点读笔训练过程记录:{}", process); + // 判断正误 + judgeProcess(trainCard, coordinates, packageDto.getAuthId()); + } + + /** + * 判断过程的正确错误 + * @param trainCard 训练卡片 + * @param coordinates 点坐标 + * @param authId 授权ID + */ + private void judgeProcess(TrainCard trainCard, List coordinates, String authId) throws Exception { + // 判断有无卡片序号 + if (trainCard == null || trainCard.getAssistId() == null || trainCard.getAssistId() == 0) { + log.info("没有先点击卡片序号,不判断正误"); + return; + } + // 查询 + // 查找核心点,无则不判断 + ToolFindDifferenceExample differenceExample = new ToolFindDifferenceExample(); + differenceExample.createCriteria().andCardIdEqualTo(trainCard.getAssistId()) + .andPositionEqualTo(YanYuanConstant.Coordinate.POSITION_CENTER); + List differences = toolFindDifferenceDao.selectByExample(differenceExample); + if (CollectionUtil.isEmpty(differences)) { + log.info("没有找到卡片对应的正确点,不判断正误"); + return; + } + // 查找卡片共几处不同 + int max = toolFindDifferenceDao.getDifferenceNum(trainCard.getAssistId()); + // 判断有无正确的点 + List curPointPlaces = trainProcessCardDao.count(trainCard.getAssistId(), coordinates); + if (CollectionUtil.isNotEmpty(curPointPlaces)) { + // 正确, 判断找到了几个,发送对应语音 + saveCurrentPoint(trainCard.getId(), curPointPlaces.get(0), max, authId); + return; + } + //计算正确的数和错误的数 + int current = 0; + int error = 0; + int percentNum = 0; + int maxDistance = Integer.parseInt(constantService.getValue(YanYuanConstant.Coordinate.MAX_DISTANCE)); + int minPercent = Integer.parseInt(constantService.getValue(YanYuanConstant.Coordinate.MIN_PERCENT)); + double pow = Math.pow((double) maxDistance * YanYuanConstant.Coordinate.MAX_X / YanYuanConstant.Coordinate.REAL_WIDTH, 2); + int curPlace = -1; + for (ToolFindDifference d : differences) { + for (CoordinateDto.Point p : coordinates) { + // 计算点到距离的平方和 + double supplier = Math.pow(p.getX() - d.getCoordinatesX().intValue(), 2) + Math.pow(p.getX() - d.getCoordinatesX().intValue(), 2); + if (supplier <= pow) { + current++; + } else { + error++; + } + } + int currentRate = current * 100 / (current + error); + if (currentRate > percentNum) { + percentNum = currentRate; + curPlace = d.getWhichPlace(); + } + current = 0; + error = 0; + } + // 比较比例 + if (percentNum >= minPercent) { + // 大于标准比例 + saveCurrentPoint(trainCard.getId(), curPlace, max, authId); + } else { + // 小于比例 + sendAudio(YanYuanConstant.Equipment.AUDIO_DIFFERENCE_ERROR, authId); + } + } + + /** + * 存储正确的结点,并根据正确的个数等发送语音 + * @param trainCardId 训练卡片ID + * @param curPointPlace 正确的位置 + * @param max 卡片对应的正确个数 + * @param authId 点读笔编码(授权ID) + */ + private void saveCurrentPoint(Long trainCardId, int curPointPlace, int max, String authId) throws Exception { + // 判断当前共几个,是否大等于最大正确个数 + List currents = trainCorrectDao.queryPlace(trainCardId); + if (currents.size() >= max) { + log.info("{}正确数量已经大等于最大正确数:{}", trainCardId, max); + sendAudio(YanYuanConstant.Equipment.AUDIO_DIFFERENCE_COMPLETE, authId); + return; + } + if (!currents.contains(curPointPlace)) { + // 若未存储,则存储 + TrainCorrect correct = new TrainCorrect(); + correct.setId(snowflake.nextId()); + correct.setWhichPlace((byte) curPointPlace); + correct.setCardId(trainCardId); + trainCorrectDao.insertSelective(correct); + currents.add(curPointPlace); + } + int audioIndex = currents.size() >= max ? YanYuanConstant.Equipment.AUDIO_DIFFERENCE_COMPLETE : + YanYuanConstant.Equipment.AUDIO_DIFFERENCE_CURRENT; + sendAudio(audioIndex, authId); + log.info("{}继续找下一个,播放语音:{}", trainCardId, audioIndex); + } + + /** + * 处理查询试题 + * @param talkingPen 试题 + */ + @Override + public void dealQuestion(TalkingPenDto talkingPen) throws Exception { + // 查找点读笔 + ToolEquipment toolEquipment = getToolEquipment(talkingPen.getAuthId()); + if (toolEquipment == null) { + return; + } + // 查找使用者 + Long keyUserId = getUser(toolEquipment.getId(), talkingPen.getAuthId()); + if (keyUserId < 0) { + return; + } + // 查找题目 + TrainContentVo.Audio nextPlan = getNextPlan(talkingPen, toolEquipment.getId(), keyUserId, talkingPen.getAuthId()); + log.info("{}的下一个训练计划:{}", toolEquipment.getId(), nextPlan); + if (nextPlan == null) { + return; + } + String key = StrUtil.format(YanYuanConstant.Equipment.TALKING_PEN_QUESTION, toolEquipment.getId(), keyUserId); + redisUtil.set(key, nextPlan, YanYuanConstant.Train.TALKING_PEN_WRITE_TIME); + //通知点读笔 + sendAudio(nextPlan.getAudioPosition() == null ? YanYuanConstant.Equipment.AUDIO_DEFAULT : nextPlan.getAudioPosition(), talkingPen.getAuthId()); + } + + /** + * 获取下一个训练计划 + * @param talkingPen 点读笔上传信息 + * @param equipmentId 设备ID + * @param keyUserId 使用者ID + * @param serial 点读笔序号 + * @return 语音信息 + * @throws Exception exception + */ + private TrainContentVo.Audio getNextPlan(TalkingPenDto talkingPen, Long equipmentId, Long keyUserId, String serial) throws Exception { + String key = StrUtil.format(YanYuanConstant.Equipment.TALKING_PEN_QUESTION, equipmentId, keyUserId); + Object o = redisUtil.get(key); + log.info("{}的缓存对象:{}", key, o); + // 今天开始的时间 + Date now = new Date(); + long todayBegin = DateUtil.beginOfDay(now).getTime(); + TrainContentVo.Audio audio; + if (ObjectUtil.isNull(o)) { + // 查询今天的第一个训练计划 + audio = trainContentDao.getFirst(keyUserId, todayBegin); + if (audio == null) { + // 提醒登录小程序进行脑力测评 + sendAudio(YanYuanConstant.Equipment.AUDIO_MENTAL, serial); + return null; + } else { + return audio; + } + } + TrainContentVo.Audio audioRedis = (TrainContentVo.Audio) o; + audio = trainContentDao.getNext(audioRedis.getRecordId(), talkingPen.getValue()); + if (audio == null) { + if (talkingPen.getValue() != YanYuanConstant.Equipment.NEXT) { + // 上一道为空 提醒没有更多题目 + sendAudio(YanYuanConstant.Equipment.AUDIO_TRAIN_PLAN_NO, serial); + } else { + // 下一道为空 + //当前题目日期小于今天 提醒登录小程序进行脑力测评, 否则 提醒没有更多题目 + int audioIndex = audioRedis.getStartTime() < todayBegin ? YanYuanConstant.Equipment.AUDIO_MENTAL : YanYuanConstant.Equipment.AUDIO_TRAIN_PLAN_NO; + sendAudio(audioIndex, serial); + } + return null; + } + return audio; + } + + /** + * 查询设备的使用者ID + * @param equipmentId 设备ID + * @return 使用者ID + */ + private Long getUser(Long equipmentId, String authId) throws Exception { + // 查询时间 + long userId = getUserId(equipmentId); + log.info("{}关联的使用者:{}", equipmentId, userId); + if (userId == YanYuanConstant.Equipment.BIND_USER_NUM_ZERO) { + sendAudio(YanYuanConstant.Equipment.AUDIO_NO_TRAINEE, authId); + } else if (userId == YanYuanConstant.Equipment.BIND_USER_NUM_MORE) { + sendAudio(YanYuanConstant.Equipment.AUDIO_MORE_TRAINEE, authId); + } + return userId; + } + + /** + * 获取正在使用设备的使用者ID + * @param equipmentId 点读笔ID + * @return 使用者ID + */ + private long getUserId(Long equipmentId) { + // 查询时间 + String key = YanYuanConstant.Equipment.VALID_TIME_KEY; + String value = constantService.getValue(key); + long time = System.currentTimeMillis() - Long.parseLong(value) * YanYuanConstant.DAY_TIME; + Date date = new Date(); + date.setTime(time); + Long keyUserId = trainEquipmentDao.queryRecentUserId(equipmentId, date); + log.info("{}有效期内选择的用户:{}", equipmentId, keyUserId); + if (keyUserId != null) { + return keyUserId; + } + // 查询购买者关联的用户 + List userIds = userRelationDao.countUserByEquipment(equipmentId); + log.info("{}关联的使用者:{}", equipmentId, userIds); + if (CollectionUtil.isEmpty(userIds)) { + return YanYuanConstant.Equipment.BIND_USER_NUM_ZERO; + } else if (userIds.size() == 1) { + return userIds.get(0); + } else { + return YanYuanConstant.Equipment.BIND_USER_NUM_MORE; + } + } + + /** + * 查询设备信息 + * @param authId 授权ID + * @return 设备 + */ + private ToolEquipment getToolEquipment(String authId) { + long serial = Long.parseLong(authId); + ToolEquipmentExample toolEquipmentExample = new ToolEquipmentExample(); + toolEquipmentExample.createCriteria().andSerialEqualTo(serial); + List toolEquipments = toolEquipmentMapper.selectByExample(toolEquipmentExample); + if (CollectionUtil.isEmpty(toolEquipments)) { + return null; + } + return toolEquipments.get(0); + } + + /** + * 处理电量状态 + * @param talkingPen 电量状态 + */ + @Override + public void dealElectric(TalkingPenDto talkingPen) { + log.info("更新电量:{}", talkingPen); + ToolEquipmentExample example = new ToolEquipmentExample(); + example.createCriteria().andSerialEqualTo(Long.parseLong(talkingPen.getAuthId())); + ToolEquipment equipment = new ToolEquipment(); + equipment.setElectricQuantity(talkingPen.getValue().intValue()); + toolEquipmentMapper.updateByExampleSelective(equipment, example); + } + + /** + * 处理wifi + * @param talkingPen wifi + */ + @Override + public void dealWifi(TalkingPenDto talkingPen) { + log.info("更新wifi状态:{}", talkingPen); + ToolEquipmentExample example = new ToolEquipmentExample(); + example.createCriteria().andSerialEqualTo(Long.parseLong(talkingPen.getAuthId())); + ToolEquipment equipment = new ToolEquipment(); + equipment.setWifiStatus(talkingPen.getValue().byteValue()); + toolEquipmentMapper.updateByExampleSelective(equipment, example); + } + + + /** + * 处理点读笔状态 + * @param talkingPen 状态 + */ + @Override + public void dealStatus(TalkingPenDto talkingPen) { + log.info("更新处理点读笔状态:{}", talkingPen); + ToolEquipmentExample example = new ToolEquipmentExample(); + example.createCriteria().andSerialEqualTo(Long.parseLong(talkingPen.getAuthId())); + ToolEquipment equipment = new ToolEquipment(); + equipment.setEquipmentStatus(talkingPen.getValue().byteValue()); + toolEquipmentMapper.updateByExampleSelective(equipment, example); + } + + + /** + * 通知点读笔,应该播放什么语音 + * @param value 语音位置 + * @param talkingPenSerial 点读笔序列号(标识ID) + * @throws Exception 异常 + */ + private void sendAudio(int value, String talkingPenSerial) throws Exception { + //记录一下点读笔发送的语音,时长1分钟,若1分钟内发送过相同的内容,则不再发送(时长待定,该判断待讨论) + String key = StrUtil.format(YanYuanConstant.Equipment.TALKING_PEN_AUDIO_KEY, talkingPenSerial); + Object o = redisUtil.get(key); + if (o != null) { + int oldValue = (Integer) o; + if (oldValue == YanYuanConstant.Equipment.AUDIO_NO_TRAINEE) { + log.info("给{}发送的语音:{}在一分钟内已经发送过,不再重复发送。", talkingPenSerial, value); + } + } + MessageRule messageRule = MessageRule.defaultRule(MessageConstant.DomainType.User); + messageRule.setAckRule(MessageRule.AckRule.NONE); + messageRule.setOfflineDiscard((byte) 1); + Set userIdSet = new HashSet<>(); + userIdSet.add(talkingPenSerial); + // 开始标志 + byte[] data = new byte[14]; + System.arraycopy(YanYuanConstant.ModBus.START, 0 , data, 0, YanYuanConstant.ModBus.START.length); + // 寄存器数量 + data[2] = 11; + // 点读笔地址 + data[3] = YanYuanConstant.ModBus.TALKING_PEN_ADDR; + // 功能码(1) 10:写多个 + data[4] = YanYuanConstant.ModBus.WRITE_MORE; + // 寄存器起始地址(2) + System.arraycopy(YanYuanConstant.ModBus.AUDIO_ADDR, 0 , data, 5, YanYuanConstant.ModBus.AUDIO_ADDR.length); + // 寄存器数量(2) + data[7] = 0X00; + data[8] = 0X01; + // 寄存器长度(1) 2*寄存器数量 + data[9] = 2; + // 音频顺序 + data[10] = (byte) (value >> 8); + data[11] = (byte) (value & 0xFF); + // crc + byte[] crc = new byte[2]; + CRCUtil.crc16(crc,data,3, data[2] - crc.length); + data[12] = crc[0]; + data[13] = crc[1]; + String join = ArrayUtil.join(data, ","); + InMessage inMessage = InMessage.newToUserMessage(null, userIdSet, null, messageRule, join); + log.info("给点读笔发送消息:{}", inMessage); + //发送消息 + messageService.sendTo(inMessage); + } + + +} diff --git a/src/main/java/com/ccsens/yanyuan/util/YanYuanConstant.java b/src/main/java/com/ccsens/yanyuan/util/YanYuanConstant.java index 58aaeba..eda7d2b 100644 --- a/src/main/java/com/ccsens/yanyuan/util/YanYuanConstant.java +++ b/src/main/java/com/ccsens/yanyuan/util/YanYuanConstant.java @@ -27,6 +27,35 @@ public class YanYuanConstant { public static final long DAY_TIME = 24 * 3600 * 1000; public static final String CONSTANT = "constant_"; + public static class Coordinate{ + /** + * 坐标位置:核心坐标 + */ + public static final byte POSITION_CENTER = 1; + /** + * 坐标距离核心点的最大距离,单位:mm + */ + public static final String MAX_DISTANCE = "max_distance"; + /** + * 正确点数百分比 + */ + public static final String MIN_PERCENT = "min_percent"; + /** + * 卡片实际宽度 210 - 39 + */ + public static final int REAL_WIDTH = 171; + /** + * 卡片最大横坐标 + */ + public static final int MAX_X = 155; + /** + * 卡片最大纵坐标 + */ + public static final int MAX_Y = 194; + + + } + public static class CardType { /** * 序号 @@ -105,7 +134,7 @@ public class YanYuanConstant { */ public final static String VALID_TIME_KEY = "talking_pen_choose"; /** - * 选择卡片的有效时长 + * 选择卡片的有效时长,单位:h */ public final static String VALID_INDEX_TIME_KEY = "talking_pen_card_index"; /** @@ -120,6 +149,7 @@ public class YanYuanConstant { * 点读笔读题信息使用的redis_key talking_pen_点读笔ID_user_使用者ID */ public final static String TALKING_PEN_QUESTION = "talking_pen_{}_user_{}"; + public final static String TALKING_PEN_AUDIO_KEY = "talking_pen_{}_audio"; /** * 点读笔试题查询,下一个 */ @@ -144,6 +174,18 @@ public class YanYuanConstant { * 绑定多个用户 */ public final static int AUDIO_MORE_TRAINEE = 4; + /** + * 找不同错误 + */ + public final static int AUDIO_DIFFERENCE_ERROR = 5; + /** + * 找不同正确 + */ + public final static int AUDIO_DIFFERENCE_CURRENT = 6; + /** + * 找不同完成 + */ + public final static int AUDIO_DIFFERENCE_COMPLETE = 7; } public static final class ModBus { @@ -230,7 +272,7 @@ public class YanYuanConstant { static { noSuccess.add(NO_DEAL); - noSuccess.add(FAIL); + noSuccess.add(SUCCESS); } } public static class Tool { diff --git a/src/main/resources/mapper_dao/CareDao.xml b/src/main/resources/mapper_dao/CareDao.xml index 15a2acb..82d9704 100644 --- a/src/main/resources/mapper_dao/CareDao.xml +++ b/src/main/resources/mapper_dao/CareDao.xml @@ -5,7 +5,7 @@ SELECT - id, + key_id as id, key_user_id, record_user_id, care_name, diff --git a/src/main/resources/mapper_dao/FamilyDao.xml b/src/main/resources/mapper_dao/FamilyDao.xml index c8467b0..c0491ee 100644 --- a/src/main/resources/mapper_dao/FamilyDao.xml +++ b/src/main/resources/mapper_dao/FamilyDao.xml @@ -61,16 +61,15 @@ diff --git a/src/main/resources/mapper_dao/ToolFindDifferenceDao.xml b/src/main/resources/mapper_dao/ToolFindDifferenceDao.xml new file mode 100644 index 0000000..9db20ab --- /dev/null +++ b/src/main/resources/mapper_dao/ToolFindDifferenceDao.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper_dao/TrainCardDao.xml b/src/main/resources/mapper_dao/TrainCardDao.xml index b29776c..75c013e 100644 --- a/src/main/resources/mapper_dao/TrainCardDao.xml +++ b/src/main/resources/mapper_dao/TrainCardDao.xml @@ -105,6 +105,16 @@ order by createTime desc, trainRecordId desc \ No newline at end of file diff --git a/src/main/resources/mapper_dao/TrainCorrectDao.xml b/src/main/resources/mapper_dao/TrainCorrectDao.xml new file mode 100644 index 0000000..666a51d --- /dev/null +++ b/src/main/resources/mapper_dao/TrainCorrectDao.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper_dao/TrainProcessCardDao.xml b/src/main/resources/mapper_dao/TrainProcessCardDao.xml index 85b5351..d8aa298 100644 --- a/src/main/resources/mapper_dao/TrainProcessCardDao.xml +++ b/src/main/resources/mapper_dao/TrainProcessCardDao.xml @@ -27,4 +27,11 @@ card_id, operate_time + \ No newline at end of file diff --git a/src/main/resources/mapper_dao/TraineeDao.xml b/src/main/resources/mapper_dao/TraineeDao.xml index 88515e1..9dce2e5 100644 --- a/src/main/resources/mapper_dao/TraineeDao.xml +++ b/src/main/resources/mapper_dao/TraineeDao.xml @@ -80,4 +80,7 @@ r.id DESC LIMIT 1 + \ No newline at end of file diff --git a/src/main/resources/mapper_dao/UserModifyDao.xml b/src/main/resources/mapper_dao/UserModifyDao.xml index 2b44fd3..de27739 100644 --- a/src/main/resources/mapper_dao/UserModifyDao.xml +++ b/src/main/resources/mapper_dao/UserModifyDao.xml @@ -68,7 +68,7 @@ update u_train_process_card set operator = #{newUserId} where operator = #{oldUserId} and rec_status = 0 - update u_train_record set operator = #{newUserId} where operator = #{oldUserId} and rec_status = 0 + update u_train_record set user_id = #{newUserId} where user_id = #{oldUserId} and rec_status = 0 update u_train_result set operator = #{newUserId} where operator = #{oldUserId} and rec_status = 0 diff --git a/src/main/resources/mapper_dao/UserRelationDao.xml b/src/main/resources/mapper_dao/UserRelationDao.xml index 50c2c10..90411e4 100644 --- a/src/main/resources/mapper_dao/UserRelationDao.xml +++ b/src/main/resources/mapper_dao/UserRelationDao.xml @@ -101,4 +101,20 @@ and t.rec_status = 0 and r.rec_status = 0 + \ No newline at end of file diff --git a/src/main/resources/mapper_raw/TrainCorrectMapper.xml b/src/main/resources/mapper_raw/TrainCorrectMapper.xml new file mode 100644 index 0000000..4cc3bdb --- /dev/null +++ b/src/main/resources/mapper_raw/TrainCorrectMapper.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, card_id, which_place, operator, created_at, updated_at, rec_status + + + + + delete from u_train_correct + where id = #{id,jdbcType=BIGINT} + + + delete from u_train_correct + + + + + + insert into u_train_correct (id, card_id, which_place, + operator, created_at, updated_at, + rec_status) + values (#{id,jdbcType=BIGINT}, #{cardId,jdbcType=BIGINT}, #{whichPlace,jdbcType=TINYINT}, + #{operator,jdbcType=BIGINT}, #{createdAt,jdbcType=TIMESTAMP}, #{updatedAt,jdbcType=TIMESTAMP}, + #{recStatus,jdbcType=TINYINT}) + + + insert into u_train_correct + + + id, + + + card_id, + + + which_place, + + + operator, + + + created_at, + + + updated_at, + + + rec_status, + + + + + #{id,jdbcType=BIGINT}, + + + #{cardId,jdbcType=BIGINT}, + + + #{whichPlace,jdbcType=TINYINT}, + + + #{operator,jdbcType=BIGINT}, + + + #{createdAt,jdbcType=TIMESTAMP}, + + + #{updatedAt,jdbcType=TIMESTAMP}, + + + #{recStatus,jdbcType=TINYINT}, + + + + + + update u_train_correct + + + id = #{record.id,jdbcType=BIGINT}, + + + card_id = #{record.cardId,jdbcType=BIGINT}, + + + which_place = #{record.whichPlace,jdbcType=TINYINT}, + + + operator = #{record.operator,jdbcType=BIGINT}, + + + created_at = #{record.createdAt,jdbcType=TIMESTAMP}, + + + updated_at = #{record.updatedAt,jdbcType=TIMESTAMP}, + + + rec_status = #{record.recStatus,jdbcType=TINYINT}, + + + + + + + + update u_train_correct + set id = #{record.id,jdbcType=BIGINT}, + card_id = #{record.cardId,jdbcType=BIGINT}, + which_place = #{record.whichPlace,jdbcType=TINYINT}, + operator = #{record.operator,jdbcType=BIGINT}, + created_at = #{record.createdAt,jdbcType=TIMESTAMP}, + updated_at = #{record.updatedAt,jdbcType=TIMESTAMP}, + rec_status = #{record.recStatus,jdbcType=TINYINT} + + + + + + update u_train_correct + + + card_id = #{cardId,jdbcType=BIGINT}, + + + which_place = #{whichPlace,jdbcType=TINYINT}, + + + operator = #{operator,jdbcType=BIGINT}, + + + created_at = #{createdAt,jdbcType=TIMESTAMP}, + + + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + + + rec_status = #{recStatus,jdbcType=TINYINT}, + + + where id = #{id,jdbcType=BIGINT} + + + update u_train_correct + set card_id = #{cardId,jdbcType=BIGINT}, + which_place = #{whichPlace,jdbcType=TINYINT}, + operator = #{operator,jdbcType=BIGINT}, + created_at = #{createdAt,jdbcType=TIMESTAMP}, + updated_at = #{updatedAt,jdbcType=TIMESTAMP}, + rec_status = #{recStatus,jdbcType=TINYINT} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/src/main/resources/mapper_raw/TrainProcessCardMapper.xml b/src/main/resources/mapper_raw/TrainProcessCardMapper.xml index e9c2854..32e041b 100644 --- a/src/main/resources/mapper_raw/TrainProcessCardMapper.xml +++ b/src/main/resources/mapper_raw/TrainProcessCardMapper.xml @@ -4,6 +4,8 @@ + + @@ -72,7 +74,8 @@ - id, card_id, operate_time, operator, created_at, updated_at, rec_status + id, card_id, frame_index, package_index, operate_time, operator, created_at, updated_at, + rec_status points @@ -126,12 +129,14 @@ - insert into u_train_process_card (id, card_id, operate_time, - operator, created_at, updated_at, - rec_status, points) - values (#{id,jdbcType=BIGINT}, #{cardId,jdbcType=BIGINT}, #{operateTime,jdbcType=BIGINT}, - #{operator,jdbcType=BIGINT}, #{createdAt,jdbcType=TIMESTAMP}, #{updatedAt,jdbcType=TIMESTAMP}, - #{recStatus,jdbcType=TINYINT}, #{points,jdbcType=LONGVARCHAR}) + insert into u_train_process_card (id, card_id, frame_index, + package_index, operate_time, operator, + created_at, updated_at, rec_status, + points) + values (#{id,jdbcType=BIGINT}, #{cardId,jdbcType=BIGINT}, #{frameIndex,jdbcType=INTEGER}, + #{packageIndex,jdbcType=INTEGER}, #{operateTime,jdbcType=BIGINT}, #{operator,jdbcType=BIGINT}, + #{createdAt,jdbcType=TIMESTAMP}, #{updatedAt,jdbcType=TIMESTAMP}, #{recStatus,jdbcType=TINYINT}, + #{points,jdbcType=LONGVARCHAR}) insert into u_train_process_card @@ -142,6 +147,12 @@ card_id, + + frame_index, + + + package_index, + operate_time, @@ -168,6 +179,12 @@ #{cardId,jdbcType=BIGINT}, + + #{frameIndex,jdbcType=INTEGER}, + + + #{packageIndex,jdbcType=INTEGER}, + #{operateTime,jdbcType=BIGINT}, @@ -203,6 +220,12 @@ card_id = #{record.cardId,jdbcType=BIGINT}, + + frame_index = #{record.frameIndex,jdbcType=INTEGER}, + + + package_index = #{record.packageIndex,jdbcType=INTEGER}, + operate_time = #{record.operateTime,jdbcType=BIGINT}, @@ -230,6 +253,8 @@ update u_train_process_card set id = #{record.id,jdbcType=BIGINT}, card_id = #{record.cardId,jdbcType=BIGINT}, + frame_index = #{record.frameIndex,jdbcType=INTEGER}, + package_index = #{record.packageIndex,jdbcType=INTEGER}, operate_time = #{record.operateTime,jdbcType=BIGINT}, operator = #{record.operator,jdbcType=BIGINT}, created_at = #{record.createdAt,jdbcType=TIMESTAMP}, @@ -244,6 +269,8 @@ update u_train_process_card set id = #{record.id,jdbcType=BIGINT}, card_id = #{record.cardId,jdbcType=BIGINT}, + frame_index = #{record.frameIndex,jdbcType=INTEGER}, + package_index = #{record.packageIndex,jdbcType=INTEGER}, operate_time = #{record.operateTime,jdbcType=BIGINT}, operator = #{record.operator,jdbcType=BIGINT}, created_at = #{record.createdAt,jdbcType=TIMESTAMP}, @@ -259,6 +286,12 @@ card_id = #{cardId,jdbcType=BIGINT}, + + frame_index = #{frameIndex,jdbcType=INTEGER}, + + + package_index = #{packageIndex,jdbcType=INTEGER}, + operate_time = #{operateTime,jdbcType=BIGINT}, @@ -283,6 +316,8 @@ update u_train_process_card set card_id = #{cardId,jdbcType=BIGINT}, + frame_index = #{frameIndex,jdbcType=INTEGER}, + package_index = #{packageIndex,jdbcType=INTEGER}, operate_time = #{operateTime,jdbcType=BIGINT}, operator = #{operator,jdbcType=BIGINT}, created_at = #{createdAt,jdbcType=TIMESTAMP}, @@ -294,6 +329,8 @@ update u_train_process_card set card_id = #{cardId,jdbcType=BIGINT}, + frame_index = #{frameIndex,jdbcType=INTEGER}, + package_index = #{packageIndex,jdbcType=INTEGER}, operate_time = #{operateTime,jdbcType=BIGINT}, operator = #{operator,jdbcType=BIGINT}, created_at = #{createdAt,jdbcType=TIMESTAMP}, diff --git a/src/main/resources/mbg.xml b/src/main/resources/mbg.xml index 6677b6e..5d28f86 100644 --- a/src/main/resources/mbg.xml +++ b/src/main/resources/mbg.xml @@ -55,7 +55,7 @@ -
+