瀏覽代碼

feat: quiz item crud2

shc 1 年之前
父節點
當前提交
50f5828cbf

+ 3 - 4
db/10wm_quiz_item.sql

@@ -10,18 +10,17 @@ DROP TABLE IF EXISTS `wm_quiz_item`;
 CREATE TABLE `wm_quiz_item`
 (
     `item_id`     INT AUTO_INCREMENT COMMENT 'Id',
-    `serial_num`  VARCHAR(64)  NOT NULL COMMENT '序列号',
+    `quiz_sn`     VARCHAR(64)  NOT NULL COMMENT '试卷序号',
     `label`       VARCHAR(64)  NOT NULL COMMENT '标题',
     `options`     JSON COMMENT '选项',
     `answer`      VARCHAR(255) NULL COMMENT '答案',
-    `ent_id`      INT UNSIGNED NOT NULL COMMENT '企业信息',
+    `widget`      BIGINT       NOT NULL COMMENT '排序权重',
     `create_by`   VARCHAR(64)  NOT NULL COMMENT '创建人',
     `update_by`   VARCHAR(64)  NOT NULL COMMENT '修改人',
     `create_time` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     `update_time` DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
     PRIMARY KEY `pk_id` (`item_id`) USING BTREE,
-    UNIQUE KEY `uk_sn` (`serial_num`) USING BTREE,
-    INDEX `idx_eid` (`ent_id`) USING BTREE
+    INDEX `idx_quiz_sn` (`quiz_sn`) USING BTREE
 ) ENGINE = InnoDB
     COMMENT ='试卷项表';
 

+ 0 - 0
db/11wm_quiz_item.sql → db/11wm_question.sql


+ 0 - 1
db/9wm_quiz.sql

@@ -16,7 +16,6 @@ CREATE TABLE `wm_quiz`
     `source_type`  VARCHAR(8)   NOT NULL COMMENT '问卷来源类型',
     `quiz_state`   VARCHAR(8)   NOT NULL COMMENT '问卷状态',
     `ent_id`       INT UNSIGNED NOT NULL COMMENT '企业信息',
-    `quiz_item`    JSON COMMENT '试卷项',
     `quiz_expand`  JSON COMMENT '试卷统计',
     `create_by`    VARCHAR(64)  NOT NULL COMMENT '创建人',
     `update_by`    VARCHAR(64)  NOT NULL COMMENT '修改人',

+ 46 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/WmQuizDTO.java

@@ -1,5 +1,10 @@
 package com.qunzhixinxi.hnqz.admin.api.dto;
 
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmQuestion;
 import lombok.AccessLevel;
 import lombok.Data;
@@ -10,6 +15,7 @@ import javax.validation.Valid;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
 
 /**
  * 试卷dto
@@ -21,6 +27,46 @@ import javax.validation.constraints.NotNull;
 @NoArgsConstructor(access = AccessLevel.NONE)
 public final class WmQuizDTO {
 
+
+	@Data
+	public static class OnItemCreate {
+
+		@NotBlank(message = "标题必填")
+		private String label;
+
+		@NotEmpty(message = "选项不能为空")
+		private WmQuestion.Option[] options;
+
+		@NotBlank(message = "答案必填")
+		private String answer;
+
+		@NotNull(message = "排序权重必填")
+		private Long widget;
+	}
+
+	@Data
+	public static class OnItemUpdate {
+
+		@NotNull(message = "试卷项ID必填")
+		private Integer itemId;
+
+		private String label;
+
+		private WmQuestion.Option[] options;
+
+		private String answer;
+
+		private Long widget;
+	}
+
+	@Data
+	public static class OnItemDelete {
+
+		@NotNull(message = "试卷项ID必填")
+		private Integer itemId;
+	}
+
+
 	@Data
 	public static class OnQuestionCreate {
 		@NotBlank(message = "试题标题必填")

+ 0 - 3
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmQuiz.java

@@ -63,9 +63,6 @@ public final class WmQuiz {
 	@TableField(value = "ent_id")
 	private Integer enterpriseId;
 
-	@TableField(value = "quiz_item", typeHandler = JacksonTypeHandler.class)
-	private WmQuizItem1[] items;
-
 	@TableField(value = "quiz_expand", typeHandler = JacksonTypeHandler.class)
 	private Expand expand;
 

+ 7 - 31
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmQuizItem1.java → hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmQuizItem.java

@@ -5,9 +5,9 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
 import lombok.Data;
 
-import javax.validation.constraints.NotBlank;
 import java.time.LocalDateTime;
 
 /**
@@ -19,22 +19,22 @@ import java.time.LocalDateTime;
  */
 @Data
 @TableName(value = "wm_quiz_item", autoResultMap = true)
-public final class WmQuizItem1 {
+public final class WmQuizItem {
 
 	@TableId(value = "item_id", type = IdType.AUTO)
 	private Integer itemId;
 
-	@TableField(value = "serial_num")
-	private String serialNumber;
+	@TableField(value = "quiz_sn")
+	private String quizSerialNumber;
 
 	private String label;
 
-	private Option[] options;
+	@TableField(typeHandler = JacksonTypeHandler.class)
+	private WmQuestion.Option[] options;
 
 	private String answer;
 
-	@TableField(value = "ent_id")
-	private Integer enterpriseId;
+	private Long widget;
 
 	/**
 	 * 创建人
@@ -59,28 +59,4 @@ public final class WmQuizItem1 {
 	 */
 	@TableField(fill = FieldFill.INSERT_UPDATE)
 	private LocalDateTime updateTime;
-
-	/**
-	 * 选项实体
-	 *
-	 * @author jimmy
-	 * @version 1.0.0
-	 * @date 2023-10-16 15:13
-	 */
-	@Data
-	public static class Option {
-
-		/**
-		 * 选项编号
-		 */
-		@NotBlank(message = "选项编号必填")
-		private String no;
-
-		/**
-		 * 选项文本
-		 */
-		@NotBlank(message = "选项文本必填")
-		private String text;
-
-	}
 }

+ 88 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmQuizController.java

@@ -6,9 +6,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qunzhixinxi.hnqz.admin.api.dto.WmQuizDTO;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmQuestion;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmQuizItem;
 import com.qunzhixinxi.hnqz.admin.api.vo.WmQuizVO;
 import com.qunzhixinxi.hnqz.admin.service.SysUserService;
 import com.qunzhixinxi.hnqz.admin.service.WmQuestionService;
+import com.qunzhixinxi.hnqz.admin.service.WmQuizItemService;
 import com.qunzhixinxi.hnqz.admin.service.WmQuizService;
 import com.qunzhixinxi.hnqz.common.core.exception.BizException;
 import com.qunzhixinxi.hnqz.common.core.util.R;
@@ -44,8 +46,93 @@ public class WmQuizController {
 	private final SysUserService userService;
 
 	private final WmQuizService quizService;
+	private final WmQuizItemService quizItemService;
 	private final WmQuestionService questionService;
 
+	// ~ QUIZ =========
+
+
+	// ~ QUIZ ITEM =========
+
+	/**
+	 * 获取试卷项信息
+	 *
+	 * @param itemId 试卷项ID
+	 * @return 试卷项详情
+	 */
+	@GetMapping(value = "/quiz/item/details")
+	public R<WmQuizItem> getItemDetails(@RequestParam(value = "itemId") Integer itemId) {
+		WmQuizItem item = quizItemService.getItemDetails(itemId);
+		return R.ok(item);
+	}
+
+	/**
+	 * 获取试卷的试卷项列表
+	 *
+	 * @param sn 试卷编号
+	 * @return 试卷项链表
+	 */
+	@GetMapping(value = "/quiz/item/list")
+	public R<List<WmQuizItem>> listItems(@RequestParam(value = "quizSerialNum") String sn) {
+		List<WmQuizItem> items = quizItemService.listItems(sn);
+		return R.ok(items);
+	}
+
+	/**
+	 * 创建试卷项(添加试题)
+	 *
+	 * @param resource 试卷项信息
+	 * @return 创建结果
+	 */
+	@SysLog("创建试卷项(添加试题)")
+	@PostMapping(value = "/quiz/item/create")
+	public R<Boolean> createQuizItem(@Valid @RequestBody WmQuizDTO.OnItemCreate resource) {
+
+		Boolean succ = quizItemService.createItem(resource, SecurityUtils.getUser());
+
+		return succ ? R.ok(true, "添加试卷项成功") : R.failed(false, "添加试卷项失败");
+	}
+
+	/**
+	 * 批量创建试卷项(添加试题)
+	 *
+	 * @param resources 试卷项信息
+	 * @return 创建结果
+	 */
+	@SysLog("批量创建试卷项(添加试题)")
+	@PostMapping(value = "/quiz/item/batch/create")
+	public R<Boolean> createQuizItems(@Valid @RequestBody List<WmQuizDTO.OnItemCreate> resources) {
+
+		Boolean succ = quizItemService.createItems(resources, SecurityUtils.getUser());
+
+		return succ ? R.ok(true, "批量添加试卷项成功") : R.failed(false, "批量添加试卷项失败");
+	}
+
+	/**
+	 * 更新试卷项
+	 *
+	 * @param resource 试卷项信息
+	 * @return 更新结果
+	 */
+	@SysLog("更新试卷项")
+	@PostMapping(value = "/quiz/item/update")
+	public R<Boolean> updateQuizItem(@Valid @RequestBody WmQuizDTO.OnItemUpdate resource) {
+
+		Boolean succ = quizItemService.updateItem(resource, SecurityUtils.getUser());
+
+		return succ ? R.ok(true, "更新试卷项成功") : R.failed(false, "更新试卷项失败");
+	}
+
+	@SysLog("删除试卷项")
+	@PostMapping(value = "/quiz/item/del")
+	public R<Boolean> delQuizItem(@Valid @RequestBody WmQuizDTO.OnItemDelete resource) {
+
+		Boolean deleted = quizItemService.delQuizItem(resource.getItemId());
+
+		return deleted ? R.ok(true, "删除试卷项成功") : R.failed(false, "删除试卷项失败");
+	}
+
+	// ~ QUESTION =========
 
 	/**
 	 * 获取试题详情
@@ -158,7 +245,7 @@ public class WmQuizController {
 			throw new BizException(errorMsg);
 		}
 		Boolean succ = questionService.updateQuestion(resource, operator);
-		return succ ? R.ok(succ, "更新试题成功") : R.failed(succ, "更新试题失败");
+		return succ ? R.ok(true, "更新试题成功") : R.failed(false, "更新试题失败");
 
 	}
 

+ 16 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmQuizItemMapper.java

@@ -0,0 +1,16 @@
+package com.qunzhixinxi.hnqz.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmQuizItem;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 试卷项Mapper
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-16 22:29
+ */
+@Mapper
+public interface WmQuizItemMapper extends BaseMapper<WmQuizItem> {
+}

+ 69 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmQuizItemService.java

@@ -0,0 +1,69 @@
+package com.qunzhixinxi.hnqz.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qunzhixinxi.hnqz.admin.api.dto.WmQuizDTO;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmQuizItem;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+
+import java.util.List;
+
+/**
+ * 试卷项服务
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-16 22:30
+ */
+public interface WmQuizItemService extends IService<WmQuizItem> {
+
+	/**
+	 * 删除试卷项
+	 *
+	 * @param itemId 试卷项ID
+	 * @return 删除结果
+	 */
+	Boolean delQuizItem(Integer itemId);
+
+	/**
+	 * 创建试卷项
+	 *
+	 * @param resource 试卷项信息
+	 * @param user     操作人
+	 * @return 创建结果
+	 */
+	Boolean createItem(WmQuizDTO.OnItemCreate resource, HnqzUser user);
+
+	/**
+	 * 批量创建试卷项
+	 *
+	 * @param resources 试卷项集合
+	 * @param user      操作人
+	 * @return 创建结果
+	 */
+	Boolean createItems(List<WmQuizDTO.OnItemCreate> resources, HnqzUser user);
+
+	/**
+	 * 更新试卷项
+	 *
+	 * @param resource 试卷信息
+	 * @param user     操作人
+	 * @return 更新结果
+	 */
+	Boolean updateItem(WmQuizDTO.OnItemUpdate resource, HnqzUser user);
+
+	/**
+	 * 获取试卷项详情
+	 *
+	 * @param itemId 试卷项ID
+	 * @return 试卷项详情
+	 */
+	WmQuizItem getItemDetails(Integer itemId);
+
+	/**
+	 * 获取试卷的试卷项
+	 *
+	 * @param sn 试卷编号
+	 * @return 试卷项集合
+	 */
+	List<WmQuizItem> listItems(String sn);
+}

+ 152 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmQuizItemServiceImpl.java

@@ -0,0 +1,152 @@
+package com.qunzhixinxi.hnqz.admin.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qunzhixinxi.hnqz.admin.api.dto.WmQuizDTO;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmQuizItem;
+import com.qunzhixinxi.hnqz.admin.mapper.WmQuizItemMapper;
+import com.qunzhixinxi.hnqz.admin.service.WmQuizItemService;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 试卷项服务实现
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-16 22:31
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class WmQuizItemServiceImpl extends ServiceImpl<WmQuizItemMapper, WmQuizItem> implements WmQuizItemService {
+
+	/**
+	 * 删除试卷项
+	 *
+	 * @param itemId 试卷项ID
+	 * @return 删除结果
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Boolean delQuizItem(Integer itemId) {
+		return this.removeById(itemId);
+	}
+
+	/**
+	 * 创建试卷项
+	 *
+	 * @param resource 试卷项信息
+	 * @param user     操作人
+	 * @return 创建结果
+	 */
+	@Override
+	public Boolean createItem(WmQuizDTO.OnItemCreate resource, HnqzUser user) {
+		return this.createItems(Collections.singletonList(resource), user);
+	}
+
+	/**
+	 * 批量创建试卷项
+	 *
+	 * @param resources 试卷项集合
+	 * @param user      操作人
+	 * @return 创建结果
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Boolean createItems(List<WmQuizDTO.OnItemCreate> resources, HnqzUser user) {
+
+		List<WmQuizItem> quizItems = resources.stream().map(item -> {
+			WmQuizItem quizItem = new WmQuizItem();
+			quizItem.setQuizSerialNumber(IdUtil.fastSimpleUUID());
+			quizItem.setLabel(item.getLabel());
+			quizItem.setOptions(item.getOptions());
+			quizItem.setAnswer(item.getAnswer());
+			quizItem.setWidget(item.getWidget());
+			String username = user.getUsername();
+			quizItem.setCreateBy(username);
+			quizItem.setUpdateBy(username);
+			LocalDateTime now = LocalDateTime.now();
+			quizItem.setCreateTime(now);
+			quizItem.setUpdateTime(now);
+
+			return quizItem;
+		}).collect(Collectors.toList());
+
+
+		return this.saveBatch(quizItems);
+	}
+
+	/**
+	 * 更新试卷项
+	 *
+	 * @param resource 试卷信息
+	 * @param user     操作人
+	 * @return 更新结果
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Boolean updateItem(WmQuizDTO.OnItemUpdate resource, HnqzUser user) {
+
+		WmQuizItem quizItem = new WmQuizItem();
+		quizItem.setItemId(resource.getItemId());
+		quizItem.setUpdateBy(user.getUsername());
+		quizItem.setUpdateTime(LocalDateTime.now());
+
+		if (StrUtil.isNotBlank(resource.getLabel())) {
+			quizItem.setLabel(resource.getLabel());
+		}
+
+		if (ArrayUtil.isNotEmpty(resource.getOptions())) {
+			quizItem.setOptions(resource.getOptions());
+		}
+
+		if (StrUtil.isNotBlank(resource.getAnswer())) {
+			quizItem.setAnswer(resource.getAnswer());
+		}
+
+		if (resource.getWidget() != null) {
+			quizItem.setWidget(resource.getWidget());
+		}
+
+
+		return this.updateById(quizItem);
+	}
+
+	/**
+	 * 获取试卷项详情
+	 *
+	 * @param itemId 试卷项ID
+	 * @return 试卷项详情
+	 */
+	@Override
+	public WmQuizItem getItemDetails(Integer itemId) {
+		return this.getById(itemId);
+	}
+
+	/**
+	 * 获取试卷的试卷项
+	 *
+	 * @param sn 试卷编号
+	 * @return 试卷项集合
+	 */
+	@Override
+	public List<WmQuizItem> listItems(String sn) {
+		List<WmQuizItem> quizItems =
+				this.list(Wrappers.<WmQuizItem>lambdaQuery().eq(WmQuizItem::getQuizSerialNumber, sn).orderByAsc(WmQuizItem::getWidget, WmQuizItem::getCreateTime));
+
+		return CollUtil.isEmpty(quizItems) ? Collections.emptyList() : quizItems;
+	}
+}