生成数据库映射代码

crud方法
soul2/mobile_api
soul2 1 year ago
parent 95ab621590
commit c0f08da047
  1. 6
      pom.xml
  2. 33
      src/main/java/cn/soul2/demo/controller/ExternalBackhaulController.java
  3. 53
      src/main/java/cn/soul2/demo/controller/QuestionnaireController.java
  4. 35
      src/main/java/cn/soul2/demo/dto/AnswerDetailsSaveDTO.java
  5. 26
      src/main/java/cn/soul2/demo/dto/AnswerPageQueryDTO.java
  6. 42
      src/main/java/cn/soul2/demo/dto/AnswerSheetSaveDTO.java
  7. 26
      src/main/java/cn/soul2/demo/dto/ExternalBackhaulDTO.java
  8. 27
      src/main/java/cn/soul2/demo/dto/QnSubjectRefDTO.java
  9. 51
      src/main/java/cn/soul2/demo/dto/QuestionnaireDTO.java
  10. 48
      src/main/java/cn/soul2/demo/dto/SubjectDTO.java
  11. 43
      src/main/java/cn/soul2/demo/dto/SubjectItemDTO.java
  12. 27
      src/main/java/cn/soul2/demo/dto/SubjectItemRefDTO.java
  13. 25
      src/main/java/cn/soul2/demo/dto/base/UpdateStatusDTO.java
  14. 87
      src/main/java/cn/soul2/demo/entity/AnswerDetailsDO.java
  15. 81
      src/main/java/cn/soul2/demo/entity/AnswerSheetDO.java
  16. 75
      src/main/java/cn/soul2/demo/entity/ExternalBackhaulDO.java
  17. 7
      src/main/java/cn/soul2/demo/entity/QrDO.java
  18. 75
      src/main/java/cn/soul2/demo/entity/QuestionnaireDO.java
  19. 69
      src/main/java/cn/soul2/demo/entity/RefQuestionnaireSubjectDO.java
  20. 69
      src/main/java/cn/soul2/demo/entity/RefSubjectItemsDO.java
  21. 87
      src/main/java/cn/soul2/demo/entity/SubjectDO.java
  22. 93
      src/main/java/cn/soul2/demo/entity/SubjectItemsDO.java
  23. 16
      src/main/java/cn/soul2/demo/mapper/AnswerDetailsMapper.java
  24. 16
      src/main/java/cn/soul2/demo/mapper/AnswerSheetMapper.java
  25. 16
      src/main/java/cn/soul2/demo/mapper/ExternalBackhaulMapper.java
  26. 16
      src/main/java/cn/soul2/demo/mapper/QuestionnaireMapper.java
  27. 16
      src/main/java/cn/soul2/demo/mapper/RefQuestionnaireSubjectMapper.java
  28. 16
      src/main/java/cn/soul2/demo/mapper/RefSubjectItemsMapper.java
  29. 16
      src/main/java/cn/soul2/demo/mapper/SubjectItemsMapper.java
  30. 16
      src/main/java/cn/soul2/demo/mapper/SubjectMapper.java
  31. 27
      src/main/java/cn/soul2/demo/repository/IAnswerDetailsRepository.java
  32. 39
      src/main/java/cn/soul2/demo/repository/IAnswerSheetRepository.java
  33. 37
      src/main/java/cn/soul2/demo/repository/IExternalBackhaulRepository.java
  34. 26
      src/main/java/cn/soul2/demo/repository/IQuestionnaireRepository.java
  35. 38
      src/main/java/cn/soul2/demo/repository/IRefQuestionnaireSubjectRepository.java
  36. 55
      src/main/java/cn/soul2/demo/repository/IRefSubjectItemsRepository.java
  37. 17
      src/main/java/cn/soul2/demo/repository/ISubjectItemsRepository.java
  38. 19
      src/main/java/cn/soul2/demo/repository/ISubjectRepository.java
  39. 37
      src/main/java/cn/soul2/demo/repository/impl/AnswerDetailsRepositoryImpl.java
  40. 131
      src/main/java/cn/soul2/demo/repository/impl/AnswerSheetRepositoryImpl.java
  41. 54
      src/main/java/cn/soul2/demo/repository/impl/ExternalBackhaulRepositoryImpl.java
  42. 2
      src/main/java/cn/soul2/demo/repository/impl/QrRepositoryImpl.java
  43. 65
      src/main/java/cn/soul2/demo/repository/impl/QuestionnaireRepositoryImpl.java
  44. 60
      src/main/java/cn/soul2/demo/repository/impl/RefQuestionnaireSubjectRepositoryImpl.java
  45. 102
      src/main/java/cn/soul2/demo/repository/impl/RefSubjectItemsRepositoryImpl.java
  46. 20
      src/main/java/cn/soul2/demo/repository/impl/SubjectItemsRepositoryImpl.java
  47. 63
      src/main/java/cn/soul2/demo/repository/impl/SubjectRepositoryImpl.java
  48. 10
      src/main/java/cn/soul2/demo/service/IQrService.java
  49. 12
      src/main/java/cn/soul2/demo/service/QrServiceImpl.java
  50. 28
      src/main/java/cn/soul2/demo/utils/MybatisFastGenerator.java
  51. 45
      src/main/java/cn/soul2/demo/vo/AnswerDetailsVO.java
  52. 52
      src/main/java/cn/soul2/demo/vo/AnswerSheetVO.java
  53. 35
      src/main/java/cn/soul2/demo/vo/ExternalBackhaulVO.java
  54. 42
      src/main/java/cn/soul2/demo/vo/QuestionnaireVO.java
  55. 43
      src/main/java/cn/soul2/demo/vo/SubjectItemVO.java
  56. 48
      src/main/java/cn/soul2/demo/vo/SubjectVO.java

@ -48,17 +48,17 @@
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId> <artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version> <version>3.5.3</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId> <artifactId>mybatis-plus</artifactId>
<version>3.5.1</version> <version>3.5.3</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId> <artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version> <version>3.5.3</version>
</dependency> </dependency>
<!--freemarker模板--> <!--freemarker模板-->
<dependency> <dependency>

@ -0,0 +1,33 @@
package cn.soul2.demo.controller;
import cn.soul2.demo.repository.IExternalBackhaulRepository;
import cn.soul2.demo.utils.base.BackUtils;
import cn.soul2.demo.vo.base.Back;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Soul2
* @date 2024-03-12 10:30
*/
@Slf4j
@RestController
@RequestMapping("/external")
public class ExternalBackhaulController {
@Autowired
private IExternalBackhaulRepository externalBackhaulRepository;
@PostMapping("wjx")
public Back<Boolean> wjx(@RequestBody JSONObject backhaul) {
externalBackhaulRepository.save(backhaul, "wjx", null);
return BackUtils.success(Boolean.TRUE);
}
}

@ -0,0 +1,53 @@
package cn.soul2.demo.controller;
import cn.soul2.demo.dto.QuestionnaireDTO;
import cn.soul2.demo.dto.base.UpdateStatusDTO;
import cn.soul2.demo.repository.IQuestionnaireRepository;
import cn.soul2.demo.utils.base.BackUtils;
import cn.soul2.demo.vo.QuestionnaireVO;
import cn.soul2.demo.vo.base.Back;
import cn.soul2.demo.vo.base.VPage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author Soul2
* @date 2024-03-12 12:28
*/
@Slf4j
@RestController
@RequestMapping("/questionnaire")
public class QuestionnaireController {
@Autowired
private IQuestionnaireRepository questionnaireRepository;
@PostMapping("saveOrUpdate")
public Back<Boolean> saveOrUpdate(@RequestBody QuestionnaireDTO dto) {
return BackUtils.success(questionnaireRepository.saveOrUpdate(dto));
}
@PostMapping("page")
public Back<VPage<QuestionnaireVO>> page(@RequestBody QuestionnaireDTO dto) {
return BackUtils.success(questionnaireRepository.page(dto));
}
@PostMapping("remove")
public Back<Boolean> remove(@RequestBody List<String> ids) {
return BackUtils.success(questionnaireRepository.removeByIds(ids));
}
@PostMapping("status")
public Back<Boolean> status(@RequestBody UpdateStatusDTO dto) {
return BackUtils.success(questionnaireRepository.updateStatus(dto));
}
}

@ -0,0 +1,35 @@
package cn.soul2.demo.dto;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author Soul2
* @date 2024-03-13 10:55
*/
@Data
@Accessors(chain = true)
public class AnswerDetailsSaveDTO {
/**
* 答卷id
*/
private String answerSheetId;
/**
* 题目id
*/
private String subjectId;
/**
* 回答内容(文字/选项id)
*/
private String answerContent;
/**
* 得分
*/
private Integer points;
}

@ -0,0 +1,26 @@
package cn.soul2.demo.dto;
import cn.soul2.demo.dto.base.PageParams;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author Soul2
* @date 2024-03-13 13:42
*/
@Data
@Accessors(chain = true)
public class AnswerPageQueryDTO extends PageParams {
/**
* 状态
*/
private Integer status;
/**
* 答卷人
*/
private String respondent;
}

@ -0,0 +1,42 @@
package cn.soul2.demo.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
/**
* @author Soul2
* @date 2024-03-13 10:39
*/
@Data
@Accessors(chain = true)
public class AnswerSheetSaveDTO {
/**
* 问卷id
*/
private String qnId;
/**
* 二维码id
*/
private String qrId;
/**
* 状态
*/
private Integer status;
/**
* 答题详情
*/
private List<AnswerDetailsSaveDTO> details;
/**
* 答卷人
*/
private String respondent;
}

@ -0,0 +1,26 @@
package cn.soul2.demo.dto;
import cn.soul2.demo.dto.base.PageParams;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author Soul2
* @date 2024-03-12 11:28
*/
@Data
@Accessors(chain = true)
public class ExternalBackhaulDTO extends PageParams {
/**
* 来自谁
*/
private String originalBy;
/**
* 回传来源平台
*/
private String externalName;
}

@ -0,0 +1,27 @@
package cn.soul2.demo.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Collection;
/**
* @author Soul2
* @date 2024-03-13 15:21
*/
@Data
@Accessors(chain = true)
public class QnSubjectRefDTO {
/**
* 问卷Id
*/
private String qnId;
/**
* 题目id
*/
private Collection<String> subjectIds;
}

@ -0,0 +1,51 @@
package cn.soul2.demo.dto;
import cn.soul2.demo.dto.base.PageParams;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
/**
* @author Soul2
* @date 2024-03-12 12:29
*/
@Data
@Accessors(chain = true)
public class QuestionnaireDTO extends PageParams {
/**
* id
*/
private String id;
/**
* 名称
*/
private String name;
/**
* 二维码id
*/
private String qrId;
/**
* 状态0禁用1启用
*/
private Short status;
/**
* 开始时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;
/**
* 结束时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;
}

@ -0,0 +1,48 @@
package cn.soul2.demo.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
/**
* @author Soul2
* @date 2024-03-13 13:03
*/
@Data
@Accessors(chain = true)
public class SubjectDTO {
/**
* id
*/
private String id;
/**
* 题目标题
*/
private String title;
/**
* 题目内容
*/
private String content;
/**
* 排列序号
*/
private Short sort;
/**
* 题目类型:0-单选;1-多选;2-文字
*/
private Short type;
/**
* 选项
*/
private List<SubjectItemDTO> items;
}

@ -0,0 +1,43 @@
package cn.soul2.demo.dto;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author Soul2
* @date 2024-03-13 13:04
*/
@Data
@Accessors(chain = true)
public class SubjectItemDTO {
/**
* id
*/
private String itemId;
/**
* 选项内容
*/
private String content;
/**
* 排列序号
*/
private Short sort;
/**
* 权重
*/
private Object weights;
/**
* 分值
*/
private Integer points;
/**
* 是正确答案
*/
private Short isRight;
}

@ -0,0 +1,27 @@
package cn.soul2.demo.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Collection;
/**
* @author Soul2
* @date 2024-03-13 15:21
*/
@Data
@Accessors(chain = true)
public class SubjectItemRefDTO {
/**
* 题目id
*/
private String subjectId;
/**
* 选项id
*/
private Collection<String> itemIds;
}

@ -0,0 +1,25 @@
package cn.soul2.demo.dto.base;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author Soul2
* @date 2024-03-12 12:39
*/
@Data
@Accessors(chain = true)
public class UpdateStatusDTO {
/**
* id
*/
private String id;
/**
* status
*/
private String status;
}

@ -0,0 +1,87 @@
package cn.soul2.demo.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 答卷详情表
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("tb_answer_details")
public class AnswerDetailsDO extends Model<AnswerDetailsDO> {
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(value = "id", type = IdType.ASSIGN_UUID)
private String id;
/**
* 状态0禁用1启用
*/
@TableField("status")
private Short status;
/**
* 更新时间
*/
@TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updatedTime;
/**
* 创建时间
*/
@TableField(value = "created_time", fill = FieldFill.INSERT)
private LocalDateTime createdTime;
/**
* 删除标识: 0-存在; 1-删除
*/
@TableField("removed")
@TableLogic
private Short removed;
/**
* 答卷id
*/
@TableField("answer_sheet_id")
private String answerSheetId;
/**
* 题目id
*/
@TableField("subject_id")
private String subjectId;
/**
* 回答内容(文字/选项id)
*/
@TableField("answer_content")
private String answerContent;
/**
* 得分
*/
@TableField("points")
private Integer points;
@Override
public Serializable pkVal() {
return this.id;
}
}

@ -0,0 +1,81 @@
package cn.soul2.demo.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 答卷表
* </p>
*
* @author Soul2
* @since 2024-03-13 12:36:58
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("tb_answer_sheet")
public class AnswerSheetDO extends Model<AnswerSheetDO> {
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(value = "id", type = IdType.ASSIGN_UUID)
private String id;
/**
* 状态0未提交1已提交
*/
@TableField("status")
private Short status;
/**
* 更新时间
*/
@TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updatedTime;
/**
* 创建时间
*/
@TableField(value = "created_time", fill = FieldFill.INSERT)
private LocalDateTime createdTime;
/**
* 删除标识: 0-存在; 1-删除
*/
@TableField("removed")
@TableLogic
private Short removed;
/**
* 问卷id
*/
@TableField("qn_id")
private String qnId;
/**
* 二维码id
*/
@TableField("qr_id")
private String qrId;
/**
* 答卷人
*/
@TableField("respondent")
private String respondent;
@Override
public Serializable pkVal() {
return this.id;
}
}

@ -0,0 +1,75 @@
package cn.soul2.demo.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 第三方结果回传表
* </p>
*
* @author Soul2
* @since 2024-03-12 10:29:17
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("tb_external_backhaul")
public class ExternalBackhaulDO extends Model<ExternalBackhaulDO> {
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(value = "id", type = IdType.ASSIGN_UUID)
private String id;
/**
* 原始信息
*/
@TableField("original_backhaul")
private String originalBackhaul;
/**
* 来自谁
*/
@TableField("original_by")
private String originalBy;
/**
* 回传来源平台
*/
@TableField("external_name")
private String externalName;
/**
* 更新时间
*/
@TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updatedTime;
/**
* 创建时间
*/
@TableField(value = "created_time", fill = FieldFill.INSERT)
private LocalDateTime createdTime;
/**
* 删除标识: 0-存在; 1-删除
*/
@TableField("removed")
@TableLogic
private Short removed;
@Override
public Serializable pkVal() {
return this.id;
}
}

@ -1,9 +1,6 @@
package cn.soul2.demo.entity; package cn.soul2.demo.entity;
import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model; import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@ -31,7 +28,7 @@ public class QrDO extends Model<QrDO> {
/** /**
* 二维码id * 二维码id
*/ */
@TableField("id") @TableId(value = "id", type = IdType.ASSIGN_UUID)
private String id; private String id;
/** /**

@ -0,0 +1,75 @@
package cn.soul2.demo.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 问卷表
* </p>
*
* @author Soul2
* @since 2024-03-11 23:11:45
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("tb_questionnaire")
public class QuestionnaireDO extends Model<QuestionnaireDO> {
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(value = "id", type = IdType.ASSIGN_UUID)
private String id;
/**
* 名称
*/
@TableField("name")
private String name;
/**
* 二维码id
*/
@TableField("qr_id")
private String qrId;
/**
* 状态0禁用1启用
*/
@TableField("status")
private Short status;
/**
* 更新时间
*/
@TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updatedTime;
/**
* 创建时间
*/
@TableField(value = "created_time", fill = FieldFill.INSERT)
private LocalDateTime createdTime;
/**
* 删除标识: 0-存在; 1-删除
*/
@TableField("removed")
@TableLogic
private Short removed;
@Override
public Serializable pkVal() {
return this.id;
}
}

@ -0,0 +1,69 @@
package cn.soul2.demo.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 题目-问卷连接表
* </p>
*
* @author Soul2
* @since 2024-03-13 15:35:52
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("tb_ref_questionnaire_subject")
public class RefQuestionnaireSubjectDO extends Model<RefQuestionnaireSubjectDO> {
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(value = "id", type = IdType.ASSIGN_UUID)
private String id;
/**
* 问卷id
*/
@TableField("qn_id")
private String qnId;
/**
* 题目id
*/
@TableField("subject_id")
private String subjectId;
/**
* 更新时间
*/
@TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updatedTime;
/**
* 创建时间
*/
@TableField(value = "created_time", fill = FieldFill.INSERT)
private LocalDateTime createdTime;
/**
* 删除标识: 0-存在; 1-删除
*/
@TableField("removed")
@TableLogic
private Short removed;
@Override
public Serializable pkVal() {
return this.id;
}
}

@ -0,0 +1,69 @@
package cn.soul2.demo.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 题目-选项连接表
* </p>
*
* @author Soul2
* @since 2024-03-13 15:35:52
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("tb_ref_subject_items")
public class RefSubjectItemsDO extends Model<RefSubjectItemsDO> {
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(value = "id", type = IdType.ASSIGN_UUID)
private String id;
/**
* 更新时间
*/
@TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updatedTime;
/**
* 创建时间
*/
@TableField(value = "created_time", fill = FieldFill.INSERT)
private LocalDateTime createdTime;
/**
* 删除标识: 0-存在; 1-删除
*/
@TableField("removed")
@TableLogic
private Short removed;
/**
* 题目id
*/
@TableField("subject_id")
private String subjectId;
/**
* 选项id
*/
@TableField("item_id")
private String itemId;
@Override
public Serializable pkVal() {
return this.id;
}
}

@ -0,0 +1,87 @@
package cn.soul2.demo.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 题目表
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("tb_subject")
public class SubjectDO extends Model<SubjectDO> {
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(value = "id", type = IdType.ASSIGN_UUID)
private String id;
/**
* 题目标题
*/
@TableField("title")
private String title;
/**
* 题目内容
*/
@TableField("content")
private String content;
/**
* 排列序号
*/
@TableField("sort")
private Short sort;
/**
* 状态0禁用1启用
*/
@TableField("status")
private Short status;
/**
* 更新时间
*/
@TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updatedTime;
/**
* 创建时间
*/
@TableField(value = "created_time", fill = FieldFill.INSERT)
private LocalDateTime createdTime;
/**
* 删除标识: 0-存在; 1-删除
*/
@TableField("removed")
@TableLogic
private Short removed;
/**
* 题目类型:0-单选;1-多选;2-文字
*/
@TableField("type")
private Short type;
@Override
public Serializable pkVal() {
return null;
}
}

@ -0,0 +1,93 @@
package cn.soul2.demo.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 题选项表
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("tb_subject_items")
public class SubjectItemsDO extends Model<SubjectItemsDO> {
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(value = "id", type = IdType.ASSIGN_UUID)
private String id;
/**
* 选项内容
*/
@TableField("content")
private String content;
/**
* 排列序号
*/
@TableField("sort")
private Short sort;
/**
* 状态0禁用1启用
*/
@TableField("status")
private Short status;
/**
* 更新时间
*/
@TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updatedTime;
/**
* 创建时间
*/
@TableField(value = "created_time", fill = FieldFill.INSERT)
private LocalDateTime createdTime;
/**
* 删除标识: 0-存在; 1-删除
*/
@TableField("removed")
@TableLogic
private Short removed;
/**
* 权重
*/
@TableField("weights")
private Object weights;
/**
* 分值
*/
@TableField("points")
private Integer points;
/**
* 是正确答案
*/
@TableField("is_right")
private Short isRight;
@Override
public Serializable pkVal() {
return this.id;
}
}

@ -0,0 +1,16 @@
package cn.soul2.demo.mapper;
import cn.soul2.demo.entity.AnswerDetailsDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 答卷详情表 Mapper 接口
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
*/
public interface AnswerDetailsMapper extends BaseMapper<AnswerDetailsDO> {
}

@ -0,0 +1,16 @@
package cn.soul2.demo.mapper;
import cn.soul2.demo.entity.AnswerSheetDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 答卷表 Mapper 接口
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
*/
public interface AnswerSheetMapper extends BaseMapper<AnswerSheetDO> {
}

@ -0,0 +1,16 @@
package cn.soul2.demo.mapper;
import cn.soul2.demo.entity.ExternalBackhaulDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 第三方结果回传表 Mapper 接口
* </p>
*
* @author Soul2
* @since 2024-03-12 10:29:17
*/
public interface ExternalBackhaulMapper extends BaseMapper<ExternalBackhaulDO> {
}

@ -0,0 +1,16 @@
package cn.soul2.demo.mapper;
import cn.soul2.demo.entity.QuestionnaireDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 问卷表 Mapper 接口
* </p>
*
* @author Soul2
* @since 2024-03-11 23:11:45
*/
public interface QuestionnaireMapper extends BaseMapper<QuestionnaireDO> {
}

@ -0,0 +1,16 @@
package cn.soul2.demo.mapper;
import cn.soul2.demo.entity.RefQuestionnaireSubjectDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 题目-问卷连接表 Mapper 接口
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
*/
public interface RefQuestionnaireSubjectMapper extends BaseMapper<RefQuestionnaireSubjectDO> {
}

@ -0,0 +1,16 @@
package cn.soul2.demo.mapper;
import cn.soul2.demo.entity.RefSubjectItemsDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 题目-选项连接表 Mapper 接口
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
*/
public interface RefSubjectItemsMapper extends BaseMapper<RefSubjectItemsDO> {
}

@ -0,0 +1,16 @@
package cn.soul2.demo.mapper;
import cn.soul2.demo.entity.SubjectItemsDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 题选项表 Mapper 接口
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
*/
public interface SubjectItemsMapper extends BaseMapper<SubjectItemsDO> {
}

@ -0,0 +1,16 @@
package cn.soul2.demo.mapper;
import cn.soul2.demo.entity.SubjectDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 题目表 Mapper 接口
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
*/
public interface SubjectMapper extends BaseMapper<SubjectDO> {
}

@ -0,0 +1,27 @@
package cn.soul2.demo.repository;
import cn.soul2.demo.entity.AnswerDetailsDO;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
import java.util.List;
/**
* <p>
* 答卷详情表 服务类
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
*/
public interface IAnswerDetailsRepository extends IService<AnswerDetailsDO> {
/**
* 根据答卷id查找答题记录
*
* @param sheetIds sheet ids
* @return {@link List}<{@link AnswerDetailsDO}>
*/
List<AnswerDetailsDO> listBySheetIds(Collection<String> sheetIds);
}

@ -0,0 +1,39 @@
package cn.soul2.demo.repository;
import cn.soul2.demo.dto.AnswerPageQueryDTO;
import cn.soul2.demo.entity.AnswerSheetDO;
import cn.soul2.demo.vo.AnswerSheetVO;
import cn.soul2.demo.vo.base.VPage;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
/**
* <p>
* 答卷表 服务类
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
*/
public interface IAnswerSheetRepository extends IService<AnswerSheetDO> {
/**
* 分页查询答题详情
*
* @param dto 查询条件
* @return {@link VPage}<{@link AnswerSheetVO}>
*/
VPage<AnswerSheetVO> page(AnswerPageQueryDTO dto);
/**
* 保存答卷
*
* @param sheet 答卷
* @return {@link Boolean}
*/
Boolean saveSheet(AnswerSheetVO sheet);
Boolean removeSheetByIds(Collection<String> sheetIds);
}

@ -0,0 +1,37 @@
package cn.soul2.demo.repository;
import cn.soul2.demo.dto.ExternalBackhaulDTO;
import cn.soul2.demo.entity.ExternalBackhaulDO;
import cn.soul2.demo.vo.ExternalBackhaulVO;
import cn.soul2.demo.vo.base.VPage;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 第三方结果回传表 服务类
* </p>
*
* @author Soul2
* @since 2024-03-12 10:29:17
*/
public interface IExternalBackhaulRepository extends IService<ExternalBackhaulDO> {
/**
* 保存第三方平台返回的问卷结果
*
* @param jo 问卷结果
* @param externalName 第三方平台名称
* @param originalBy 问卷填写者
* @return {@link Boolean}
*/
Boolean save(JSONObject jo, String externalName, String originalBy);
/**
* 分页查询
*
* @param dto 查询条件
* @return {@link VPage}<{@link ExternalBackhaulVO}>
*/
VPage<ExternalBackhaulVO> page(ExternalBackhaulDTO dto);
}

@ -0,0 +1,26 @@
package cn.soul2.demo.repository;
import cn.soul2.demo.dto.QuestionnaireDTO;
import cn.soul2.demo.dto.base.UpdateStatusDTO;
import cn.soul2.demo.entity.QuestionnaireDO;
import cn.soul2.demo.vo.QuestionnaireVO;
import cn.soul2.demo.vo.base.VPage;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 问卷表 服务类
* </p>
*
* @author Soul2
* @since 2024-03-11 23:11:45
*/
public interface IQuestionnaireRepository extends IService<QuestionnaireDO> {
VPage<QuestionnaireVO> page(QuestionnaireDTO dto);
Boolean saveOrUpdate(QuestionnaireDTO dto);
Boolean updateStatus(UpdateStatusDTO dto);
}

@ -0,0 +1,38 @@
package cn.soul2.demo.repository;
import cn.soul2.demo.dto.QnSubjectRefDTO;
import cn.soul2.demo.entity.RefQuestionnaireSubjectDO;
import cn.soul2.demo.entity.SubjectDO;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
import java.util.List;
/**
* <p>
* 题目-问卷连接表 服务类
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
*/
public interface IRefQuestionnaireSubjectRepository extends IService<RefQuestionnaireSubjectDO> {
/**
* 根据问卷id查询所有题目
*
* @param qnIds 问卷id
* @return {@link List}<{@link SubjectDO}>
*/
List<SubjectDO> getSubjects(Collection<String> qnIds);
/**
* 连接问卷-题目
*
* @param dto QnId and subjectIds
* @return {@link Boolean}
*/
Boolean connectSubjects(QnSubjectRefDTO dto);
}

@ -0,0 +1,55 @@
package cn.soul2.demo.repository;
import cn.soul2.demo.dto.SubjectItemRefDTO;
import cn.soul2.demo.entity.RefSubjectItemsDO;
import cn.soul2.demo.entity.SubjectItemsDO;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
import java.util.List;
/**
* <p>
* 题目-选项连接表 服务类
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
*/
public interface IRefSubjectItemsRepository extends IService<RefSubjectItemsDO> {
/**
* 通过题目id查询选项
*
* @param subjectIds 题目id
* @return {@link List}<{@link SubjectItemsDO}>
*/
List<SubjectItemsDO> getSubjectItems(Collection<String> subjectIds);
/**
* 连接题目-选项
*
* @param dto SubjectId and Subject items Id
* @return {@link Boolean}
*/
Boolean connectItems(SubjectItemRefDTO dto);
/**
* 解除连接
*
* @param itemIds 选项id
* @param andDestroy 同时删除选项记录
* @return {@link Boolean}
*/
Boolean disConnectItems(Collection<String> itemIds, Boolean andDestroy);
/**
* 解除连接
*
* @param subjectId 题目id
* @param andDestroy 同时删除选项记录
* @return {@link Boolean}
*/
Boolean disConnectItems(String subjectId, Boolean andDestroy);
}

@ -0,0 +1,17 @@
package cn.soul2.demo.repository;
import cn.soul2.demo.entity.SubjectItemsDO;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 题选项表 服务类
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
*/
public interface ISubjectItemsRepository extends IService<SubjectItemsDO> {
}

@ -0,0 +1,19 @@
package cn.soul2.demo.repository;
import cn.soul2.demo.dto.SubjectDTO;
import cn.soul2.demo.entity.SubjectDO;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 题目表 服务类
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
*/
public interface ISubjectRepository extends IService<SubjectDO> {
Boolean saveOrUpdate(SubjectDTO dto);
}

@ -0,0 +1,37 @@
package cn.soul2.demo.repository.impl;
import cn.soul2.demo.entity.AnswerDetailsDO;
import cn.soul2.demo.mapper.AnswerDetailsMapper;
import cn.soul2.demo.repository.IAnswerDetailsRepository;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* <p>
* 答卷详情表 服务实现类
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
*/
@Service
public class AnswerDetailsRepositoryImpl extends ServiceImpl<AnswerDetailsMapper, AnswerDetailsDO> implements IAnswerDetailsRepository {
@Override
public List<AnswerDetailsDO> listBySheetIds(Collection<String> sheetIds) {
if (CollectionUtils.isNotEmpty(sheetIds)) {
LambdaQueryWrapper<AnswerDetailsDO> query = Wrappers.lambdaQuery();
query.in(AnswerDetailsDO::getAnswerSheetId, sheetIds);
return super.list(query);
} else {
return new ArrayList<>();
}
}
}

@ -0,0 +1,131 @@
package cn.soul2.demo.repository.impl;
import cn.soul2.demo.dto.AnswerPageQueryDTO;
import cn.soul2.demo.entity.AnswerDetailsDO;
import cn.soul2.demo.entity.AnswerSheetDO;
import cn.soul2.demo.entity.QrDO;
import cn.soul2.demo.entity.QuestionnaireDO;
import cn.soul2.demo.mapper.AnswerSheetMapper;
import cn.soul2.demo.repository.IAnswerDetailsRepository;
import cn.soul2.demo.repository.IAnswerSheetRepository;
import cn.soul2.demo.repository.IQrRepository;
import cn.soul2.demo.repository.IQuestionnaireRepository;
import cn.soul2.demo.utils.base.PageUtils;
import cn.soul2.demo.vo.AnswerDetailsVO;
import cn.soul2.demo.vo.AnswerSheetVO;
import cn.soul2.demo.vo.base.VPage;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import javax.transaction.Transactional;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* <p>
* 答卷表 服务实现类
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
*/
@Service
public class AnswerSheetRepositoryImpl extends ServiceImpl<AnswerSheetMapper, AnswerSheetDO> implements IAnswerSheetRepository {
@Autowired
private IQuestionnaireRepository questionnaireRepository;
@Autowired
private IQrRepository qrRepository;
@Autowired
private IAnswerDetailsRepository detailsRepository;
@Override
public VPage<AnswerSheetVO> page(AnswerPageQueryDTO dto) {
LambdaQueryWrapper<AnswerSheetDO> query = Wrappers.lambdaQuery();
query.eq(StringUtils.isNotBlank(dto.getRespondent()), AnswerSheetDO::getRespondent, dto.getRespondent())
.eq(dto.getStatus() != null, AnswerSheetDO::getStatus, dto.getStatus())
.orderByDesc(AnswerSheetDO::getUpdatedTime).orderByDesc(AnswerSheetDO::getCreatedTime);
VPage<AnswerSheetDO> page = PageUtils.to(super.page(PageUtils.build(dto), query));
List<AnswerSheetDO> rows = page.getRows();
Set<String> qnSet = rows.stream().map(AnswerSheetDO::getQnId).collect(Collectors.toSet());
Set<String> qrSet = rows.stream().map(AnswerSheetDO::getQrId).collect(Collectors.toSet());
Map<String, QuestionnaireDO> qnMap = questionnaireRepository.listByIds(qnSet).stream().collect(Collectors.toMap(QuestionnaireDO::getId, o -> o, (o1, o2) -> o1));
Map<String, QrDO> qrMap = qrRepository.listByIds(qrSet).stream().collect(Collectors.toMap(QrDO::getId, o -> o, (o1, o2) -> o1));
List<AnswerDetailsDO> detailsDOList = detailsRepository.listBySheetIds(rows.stream().map(AnswerSheetDO::getId).collect(Collectors.toList()));
return PageUtils.to(page, rows.stream().map(row -> {
AnswerSheetVO vo = new AnswerSheetVO();
BeanUtils.copyProperties(row, vo);
if (qnMap.containsKey(row.getQnId())) {
vo.setQnName(qnMap.get(row.getQnId()).getName());
}
if (qrMap.containsKey(row.getQrId())) {
vo.setQnName(qrMap.get(row.getQrId()).getTip());
}
vo.setDetails(detailsDOList.stream().filter(d -> d.getAnswerSheetId().equals(row.getId())).map(d -> {
AnswerDetailsVO detailsVO = new AnswerDetailsVO();
BeanUtils.copyProperties(d, detailsVO);
return detailsVO;
}).collect(Collectors.toList()));
return vo;
}).collect(Collectors.toList()));
}
@Override
@Transactional
public Boolean saveSheet(AnswerSheetVO sheet) {
AnswerSheetDO sheetDO = new AnswerSheetDO();
BeanUtils.copyProperties(sheet, sheetDO);
boolean saved = super.save(sheetDO);
if (saved) {
List<AnswerDetailsDO> details = sheet.getDetails().stream().map(d -> {
AnswerDetailsDO detail = new AnswerDetailsDO();
BeanUtils.copyProperties(d, detail);
detail.setAnswerSheetId(sheetDO.getId());
return detail;
}).collect(Collectors.toList());
if (!detailsRepository.saveBatch(details)) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return Boolean.FALSE;
}
} else {
return Boolean.FALSE;
}
return Boolean.TRUE;
}
@Override
@Transactional
public Boolean removeSheetByIds(Collection<String> sheetIds) {
LambdaUpdateWrapper<AnswerDetailsDO> update = Wrappers.lambdaUpdate();
update.in(AnswerDetailsDO::getAnswerSheetId, sheetIds);
boolean removed = detailsRepository.remove(update);
if (removed) {
try {
super.removeByIds(sheetIds);
return Boolean.TRUE;
} catch (Exception e) {
// 如果删除失败,可以记录日志或进行其他处理
throw new RuntimeException("删除答题详情失败 | ", e);
}
}
return Boolean.FALSE;
}
}

@ -0,0 +1,54 @@
package cn.soul2.demo.repository.impl;
import cn.soul2.demo.dto.ExternalBackhaulDTO;
import cn.soul2.demo.entity.ExternalBackhaulDO;
import cn.soul2.demo.mapper.ExternalBackhaulMapper;
import cn.soul2.demo.repository.IExternalBackhaulRepository;
import cn.soul2.demo.utils.base.PageUtils;
import cn.soul2.demo.vo.ExternalBackhaulVO;
import cn.soul2.demo.vo.base.VPage;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.stream.Collectors;
/**
* <p>
* 第三方结果回传表 服务实现类
* </p>
*
* @author Soul2
* @since 2024-03-12 10:29:17
*/
@Service
public class ExternalBackhaulRepositoryImpl extends ServiceImpl<ExternalBackhaulMapper, ExternalBackhaulDO> implements IExternalBackhaulRepository {
@Override
public VPage<ExternalBackhaulVO> page(ExternalBackhaulDTO dto) {
LambdaQueryWrapper<ExternalBackhaulDO> query = Wrappers.lambdaQuery();
query.eq(ExternalBackhaulDO::getExternalName, dto.getExternalName())
.likeRight(ExternalBackhaulDO::getOriginalBy, dto.getOriginalBy());
VPage<ExternalBackhaulDO> page = PageUtils.to(super.page(PageUtils.build(dto), query));
return PageUtils.to(page, page.getRows().stream().map(e -> {
ExternalBackhaulVO vo = new ExternalBackhaulVO();
BeanUtils.copyProperties(e, vo);
return vo;
}).collect(Collectors.toList()));
}
@Override
public Boolean save(JSONObject jo, String externalName, String originalBy) {
ExternalBackhaulDO backhaul = new ExternalBackhaulDO();
backhaul.setExternalName(externalName)
.setOriginalBackhaul(jo.toJSONString());
if (StringUtils.isNotBlank(originalBy)) {
backhaul.setOriginalBy(originalBy);
}
return super.save(backhaul);
}
}

@ -43,7 +43,7 @@ public class QrRepositoryImpl extends ServiceImpl<QrMapper, QrDO> implements IQr
.le(dto.getEndTime() != null, QrDO::getUpdatedTime, dto.getEndTime()); .le(dto.getEndTime() != null, QrDO::getUpdatedTime, dto.getEndTime());
} }
query.orderByDesc(QrDO::getUpdatedTime).orderByDesc(QrDO::getCreatedTime); query.orderByDesc(QrDO::getUpdatedTime).orderByDesc(QrDO::getCreatedTime);
return PageUtils.to(super.page(PageUtils.build(dto))); return PageUtils.to(super.page(PageUtils.build(dto), query));
} }
@Override @Override

@ -0,0 +1,65 @@
package cn.soul2.demo.repository.impl;
import cn.soul2.demo.dto.QuestionnaireDTO;
import cn.soul2.demo.dto.base.UpdateStatusDTO;
import cn.soul2.demo.entity.QuestionnaireDO;
import cn.soul2.demo.mapper.QuestionnaireMapper;
import cn.soul2.demo.repository.IQuestionnaireRepository;
import cn.soul2.demo.utils.base.PageUtils;
import cn.soul2.demo.vo.QuestionnaireVO;
import cn.soul2.demo.vo.base.VPage;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.stream.Collectors;
/**
* <p>
* 问卷表 服务实现类
* </p>
*
* @author Soul2
* @since 2024-03-11 23:11:45
*/
@Service
public class QuestionnaireRepositoryImpl extends ServiceImpl<QuestionnaireMapper, QuestionnaireDO> implements IQuestionnaireRepository {
@Override
public VPage<QuestionnaireVO> page(QuestionnaireDTO dto) {
LambdaQueryWrapper<QuestionnaireDO> query = Wrappers.lambdaQuery();
query.likeRight(StringUtils.isNotBlank(dto.getName()), QuestionnaireDO::getName, dto.getName())
.eq(StringUtils.isNotBlank(dto.getId()), QuestionnaireDO::getId, dto.getId());
if (dto.getStartTime() != null && dto.getEndTime() != null) {
query.between(QuestionnaireDO::getUpdatedTime, dto.getStartTime(), dto.getEndTime());
} else {
query.ge(dto.getStartTime() != null, QuestionnaireDO::getUpdatedTime, dto.getStartTime())
.le(dto.getEndTime() != null, QuestionnaireDO::getUpdatedTime, dto.getEndTime());
}
query.orderByDesc(QuestionnaireDO::getUpdatedTime).orderByDesc(QuestionnaireDO::getCreatedTime);
VPage<QuestionnaireDO> page = PageUtils.to(super.page(PageUtils.build(dto), query));
return PageUtils.to(page, page.getRows().stream().map(e -> {
QuestionnaireVO vo = new QuestionnaireVO();
BeanUtils.copyProperties(e, vo);
return vo;
}).collect(Collectors.toList()));
}
@Override
public Boolean saveOrUpdate(QuestionnaireDTO dto) {
QuestionnaireDO entity = new QuestionnaireDO();
BeanUtils.copyProperties(dto, entity);
return super.save(entity);
}
@Override
public Boolean updateStatus(UpdateStatusDTO dto) {
LambdaUpdateWrapper<QuestionnaireDO> update = Wrappers.lambdaUpdate();
update.set(QuestionnaireDO::getStatus, dto.getStatus()).eq(QuestionnaireDO::getId, dto.getId());
return super.update(update);
}
}

@ -0,0 +1,60 @@
package cn.soul2.demo.repository.impl;
import cn.soul2.demo.dto.QnSubjectRefDTO;
import cn.soul2.demo.entity.RefQuestionnaireSubjectDO;
import cn.soul2.demo.entity.SubjectDO;
import cn.soul2.demo.mapper.RefQuestionnaireSubjectMapper;
import cn.soul2.demo.repository.IRefQuestionnaireSubjectRepository;
import cn.soul2.demo.repository.ISubjectRepository;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* <p>
* 题目-问卷连接表 服务实现类
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
*/
@Service
public class RefQuestionnaireSubjectRepositoryImpl extends ServiceImpl<RefQuestionnaireSubjectMapper, RefQuestionnaireSubjectDO> implements IRefQuestionnaireSubjectRepository {
@Autowired
private ISubjectRepository subjectRepository;
@Override
public List<SubjectDO> getSubjects(Collection<String> qnIds) {
if (CollectionUtils.isNotEmpty(qnIds)) {
LambdaQueryWrapper<RefQuestionnaireSubjectDO> query = Wrappers.lambdaQuery();
query.in(RefQuestionnaireSubjectDO::getQnId, qnIds);
Set<String> set = super.list(query).stream().map(RefQuestionnaireSubjectDO::getSubjectId).collect(Collectors.toSet());
if (CollectionUtils.isNotEmpty(set)) {
return subjectRepository.listByIds(set);
} else {
return new ArrayList<>();
}
} else {
return new ArrayList<>();
}
}
@Override
public Boolean connectSubjects(QnSubjectRefDTO dto) {
return super.saveBatch(dto.getSubjectIds().stream().map(s -> {
RefQuestionnaireSubjectDO ref = new RefQuestionnaireSubjectDO();
ref.setSubjectId(s).setQnId(dto.getQnId());
return ref;
}).collect(Collectors.toList()));
}
}

@ -0,0 +1,102 @@
package cn.soul2.demo.repository.impl;
import cn.soul2.demo.dto.SubjectItemRefDTO;
import cn.soul2.demo.entity.RefSubjectItemsDO;
import cn.soul2.demo.entity.SubjectItemsDO;
import cn.soul2.demo.mapper.RefSubjectItemsMapper;
import cn.soul2.demo.repository.IRefSubjectItemsRepository;
import cn.soul2.demo.repository.ISubjectItemsRepository;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* <p>
* 题目-选项连接表 服务实现类
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
*/
@Service
public class RefSubjectItemsRepositoryImpl extends ServiceImpl<RefSubjectItemsMapper, RefSubjectItemsDO> implements IRefSubjectItemsRepository {
@Autowired
private ISubjectItemsRepository itemsRepository;
@Override
public List<SubjectItemsDO> getSubjectItems(Collection<String> subjectIds) {
if (CollectionUtils.isNotEmpty(subjectIds)) {
LambdaQueryWrapper<RefSubjectItemsDO> query = Wrappers.lambdaQuery();
query.in(RefSubjectItemsDO::getSubjectId, subjectIds);
Set<String> set = super.list(query).stream().map(RefSubjectItemsDO::getItemId).collect(Collectors.toSet());
if (CollectionUtils.isNotEmpty(set)) {
return itemsRepository.listByIds(set);
} else {
return new ArrayList<>();
}
}
return new ArrayList<>();
}
@Override
public Boolean connectItems(SubjectItemRefDTO dto) {
return super.saveBatch(dto.getItemIds().stream().map(s -> {
RefSubjectItemsDO ref = new RefSubjectItemsDO();
ref.setSubjectId(s).setSubjectId(dto.getSubjectId());
return ref;
}).collect(Collectors.toList()));
}
@Override
@Transactional
public Boolean disConnectItems(Collection<String> itemIds, Boolean andDestroy) {
if (CollectionUtils.isNotEmpty(itemIds)) {
LambdaUpdateWrapper<RefSubjectItemsDO> update = Wrappers.lambdaUpdate();
update.in(RefSubjectItemsDO::getItemId, itemIds);
if (andDestroy) {
boolean itemRemoved = itemsRepository.removeByIds(itemIds);
if (!itemRemoved) {
return Boolean.FALSE;
}
}
boolean removed = super.remove(update);
if (!removed) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return removed;
}
return Boolean.TRUE;
}
@Override
public Boolean disConnectItems(String subjectId, Boolean andDestroy) {
LambdaUpdateWrapper<RefSubjectItemsDO> update = Wrappers.lambdaUpdate();
update.eq(RefSubjectItemsDO::getSubjectId, subjectId);
if (andDestroy) {
LambdaQueryWrapper<RefSubjectItemsDO> query = Wrappers.lambdaQuery();
query.eq(RefSubjectItemsDO::getSubjectId, subjectId);
boolean itemsRemoved = itemsRepository.removeByIds(super.list(query).stream().map(RefSubjectItemsDO::getItemId).collect(Collectors.toList()));
if (!itemsRemoved) {
return Boolean.FALSE;
}
}
boolean removed = super.remove(update);
if (!removed) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return removed;
}
}

@ -0,0 +1,20 @@
package cn.soul2.demo.repository.impl;
import cn.soul2.demo.entity.SubjectItemsDO;
import cn.soul2.demo.mapper.SubjectItemsMapper;
import cn.soul2.demo.repository.ISubjectItemsRepository;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 题选项表 服务实现类
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
*/
@Service
public class SubjectItemsRepositoryImpl extends ServiceImpl<SubjectItemsMapper, SubjectItemsDO> implements ISubjectItemsRepository {
}

@ -0,0 +1,63 @@
package cn.soul2.demo.repository.impl;
import cn.soul2.demo.dto.SubjectDTO;
import cn.soul2.demo.entity.SubjectDO;
import cn.soul2.demo.entity.SubjectItemsDO;
import cn.soul2.demo.mapper.SubjectMapper;
import cn.soul2.demo.repository.IRefSubjectItemsRepository;
import cn.soul2.demo.repository.ISubjectItemsRepository;
import cn.soul2.demo.repository.ISubjectRepository;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.util.stream.Collectors;
/**
* <p>
* 题目表 服务实现类
* </p>
*
* @author Soul2
* @since 2024-03-12 10:10:24
*/
@Service
public class SubjectRepositoryImpl extends ServiceImpl<SubjectMapper, SubjectDO> implements ISubjectRepository {
@Autowired
private ISubjectItemsRepository itemsRepository;
@Autowired
private IRefSubjectItemsRepository refSubjectItemsRepository;
@Override
@Transactional
public Boolean saveOrUpdate(SubjectDTO dto) {
SubjectDO entity = new SubjectDO();
BeanUtils.copyProperties(dto, entity);
if (StringUtils.isNotBlank(entity.getId())) {
// delete old connections when updating
refSubjectItemsRepository.disConnectItems(entity.getId(), true);
}
if (super.saveOrUpdate(entity)) {
boolean itemsSaved = itemsRepository.saveBatch(dto.getItems().stream().map(e -> {
SubjectItemsDO item = new SubjectItemsDO();
BeanUtils.copyProperties(e, item);
if (StringUtils.isNotEmpty(item.getId())) {
item.setId(item.getId());
}
return item;
}).collect(Collectors.toList()));
if (!itemsSaved) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return Boolean.FALSE;
}
return Boolean.TRUE;
}
return Boolean.FALSE;
}
}

@ -1,10 +0,0 @@
package cn.soul2.demo.service;
/**
* @author Soul2
* @date 2024-03-11 15:20
*/
public interface IQrService {
}

@ -1,12 +0,0 @@
package cn.soul2.demo.service;
import org.springframework.stereotype.Service;
/**
* @author Soul2
* @date 2024-03-11 15:20
*/
@Service
public class QrServiceImpl implements IQrService {
}

@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.TemplateType; import com.baomidou.mybatisplus.generator.config.TemplateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine; import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column; import com.baomidou.mybatisplus.generator.fill.Column;
import com.baomidou.mybatisplus.generator.fill.Property; import com.baomidou.mybatisplus.generator.fill.Property;
import lombok.Data; import lombok.Data;
@ -27,16 +27,17 @@ public class MybatisFastGenerator {
* 设置需要生成的表名 * 设置需要生成的表名
*/ */
private static final String[] TABLE_NAMES = { private static final String[] TABLE_NAMES = {
"tb_qr" "tb_ref_questionnaire_subject",
"tb_ref_subject_items",
}; };
/**
* 模块名称
*/
private static final String MODULE_NAME = "demo";
/** /**
* 是否为表更新 * 是否为表更新
*/ */
private static final Boolean TABLE_UPDATE = true; private static final Boolean TABLE_UPDATE = true;
/**
* 模块名称
*/
private static final String MODULE_NAME = "demo";
/** /**
* 设置过滤表前缀 * 设置过滤表前缀
@ -53,7 +54,6 @@ public class MybatisFastGenerator {
.globalConfig(builder -> { .globalConfig(builder -> {
builder.author(DATASOURCE_CONFIG.getAuthor()) // 设置作者 builder.author(DATASOURCE_CONFIG.getAuthor()) // 设置作者
// .enableSwagger() // 开启 swagger 模式 // .enableSwagger() // 开启 swagger 模式
.fileOverride() // 覆盖已生成文件
// 注解日期的格式 // 注解日期的格式
.commentDate("yyyy-MM-dd HH:mm:ss") .commentDate("yyyy-MM-dd HH:mm:ss")
// 文件输出目录 // 文件输出目录
@ -82,9 +82,12 @@ public class MybatisFastGenerator {
.addTablePrefix(TABLE_PREFIX) .addTablePrefix(TABLE_PREFIX)
// 实体映射设置 // 实体映射设置
.entityBuilder() .entityBuilder()
.enableChainModel()
// id生成策略启用UUID // id生成策略启用UUID
.idType(IdType.ASSIGN_UUID) .idType(IdType.ASSIGN_UUID)
.enableFileOverride()
.enableChainModel()
// 父类公共字段,使用后导致DO的id属性上移到父类,不建议使用
// .addSuperEntityColumns("id", "created_time", "updated_time")
// 启用Lombok // 启用Lombok
.enableLombok() .enableLombok()
// 添加名称后缀 // 添加名称后缀
@ -103,17 +106,18 @@ public class MybatisFastGenerator {
.enableTableFieldAnnotation() .enableTableFieldAnnotation()
.mapperBuilder() .mapperBuilder()
.enableMapperAnnotation() .enableFileOverride()
.formatMapperFileName("%sMapper") .formatMapperFileName("%sMapper")
.serviceBuilder() .serviceBuilder()
.enableFileOverride()
.formatServiceFileName("I%sRepository") .formatServiceFileName("I%sRepository")
.formatServiceImplFileName("%sRepositoryImpl"); .formatServiceImplFileName("%sRepositoryImpl");
}) })
// 使用Freemarker引擎模板,默认的是Velocity引擎模板 // 使用Freemarker引擎模板,默认的是Velocity引擎模板
// .templateEngine(new FreemarkerTemplateEngine()) .templateEngine(new FreemarkerTemplateEngine())
// 默认的Velocity引擎模板 // 默认的Velocity引擎模板
.templateEngine(new VelocityTemplateEngine()) // .templateEngine(new VelocityTemplateEngine())
.templateConfig(builder -> { .templateConfig(builder -> {
builder builder
.disable(TemplateType.CONTROLLER) .disable(TemplateType.CONTROLLER)
@ -129,7 +133,7 @@ public class MybatisFastGenerator {
return autoGenerator.templateConfig(builder -> { return autoGenerator.templateConfig(builder -> {
builder builder
.disable(TemplateType.SERVICE) .disable(TemplateType.SERVICE)
.disable(TemplateType.SERVICEIMPL) .disable(TemplateType.SERVICE_IMPL)
.disable(TemplateType.MAPPER); .disable(TemplateType.MAPPER);
}); });
} }

@ -0,0 +1,45 @@
package cn.soul2.demo.vo;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author Soul2
* @date 2024-03-13 11:35
*/
@Data
@Accessors(chain = true)
public class AnswerDetailsVO {
/**
* 题目id
*/
private String subjectId;
/**
* 题目标题
*/
private String title;
/**
* 题目内容
*/
private String content;
/**
* 题目类型:0-单选;1-多选;2-文字
*/
private Short type;
/**
* 回答内容(文字/选项)
*/
private String answerContent;
/**
* 得分, 分数0时为答对
*/
private Integer points;
}

@ -0,0 +1,52 @@
package cn.soul2.demo.vo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
/**
* @author Soul2
* @date 2024-03-13 11:34
*/
@Data
@Accessors(chain = true)
public class AnswerSheetVO {
/**
* 问卷id
*/
private String qnId;
/**
* 问卷名称
*/
private String qnName;
/**
* 二维码id
*/
private String qrId;
/**
* 二维码注释
*/
private String qrTip;
/**
* 提交状态
*/
private Integer status;
/**
* 答题详情
*/
private List<AnswerDetailsVO> details;
/**
* 答卷人
*/
private String respondent;
}

@ -0,0 +1,35 @@
package cn.soul2.demo.vo;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author Soul2
* @date 2024-03-12 11:22
*/
@Data
@Accessors(chain = true)
public class ExternalBackhaulVO {
/**
* id
*/
private String id;
/**
* 原始信息
*/
private String originalBackhaul;
/**
* 来自谁
*/
private String originalBy;
/**
* 回传来源平台
*/
private String externalName;
}

@ -0,0 +1,42 @@
package cn.soul2.demo.vo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
/**
* @author Soul2
* @date 2024-03-12 12:29
*/
@Data
@Accessors(chain = true)
public class QuestionnaireVO {
/**
* id
*/
private String id;
/**
* 名称
*/
private String name;
/**
* 二维码id
*/
private String qrId;
/**
* 状态0禁用1启用
*/
private Short status;
/**
* 更新时间
*/
private LocalDateTime updatedTime;
}

@ -0,0 +1,43 @@
package cn.soul2.demo.vo;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author Soul2
* @date 2024-03-13 13:04
*/
@Data
@Accessors(chain = true)
public class SubjectItemVO {
/**
* id
*/
private String itemId;
/**
* 选项内容
*/
private String content;
/**
* 排列序号
*/
private Short sort;
/**
* 权重
*/
private Object weights;
/**
* 分值
*/
private Integer points;
/**
* 是正确答案
*/
private Short isRight;
}

@ -0,0 +1,48 @@
package cn.soul2.demo.vo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
/**
* @author Soul2
* @date 2024-03-13 13:03
*/
@Data
@Accessors(chain = true)
public class SubjectVO {
/**
* id
*/
private String id;
/**
* 题目标题
*/
private String title;
/**
* 题目内容
*/
private String content;
/**
* 排列序号
*/
private Short sort;
/**
* 题目类型:0-单选;1-多选;2-文字
*/
private Short type;
/**
* 选项
*/
private List<SubjectItemVO> items;
}
Loading…
Cancel
Save