Browse Source

feat: quiz crud

shc 1 year ago
parent
commit
057f7c2e50

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

@@ -6,6 +6,9 @@ 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 com.qunzhixinxi.hnqz.admin.api.entity.WmQuiz;
+import com.qunzhixinxi.hnqz.common.core.constant.enums.UpmsState;
+import com.qunzhixinxi.hnqz.common.core.constant.enums.UpmsType;
 import lombok.AccessLevel;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -27,6 +30,44 @@ import java.time.LocalDateTime;
 @NoArgsConstructor(access = AccessLevel.NONE)
 public final class WmQuizDTO {
 
+	@Data
+	public static class OnQuizCreate {
+
+		/**
+		 * 标题
+		 */
+		@NotBlank(message = "标题必填")
+		@Length(max = 64, message = "标题最大支持字符数{max}")
+		private String title;
+
+		/**
+		 * 简介
+		 */
+		private String introduction;
+
+		/**
+		 * 问卷来源类型
+		 */
+		@NotNull(message = "问卷类型必填")
+		private UpmsType.QuizSourceType sourceType;
+
+	}
+
+	@Data
+	public static class OnQuizUpdate {
+
+	}
+
+	@Data
+	public static class OnQuizState {
+
+		@NotNull(message = "试卷ID必填")
+		private Integer quizId;
+
+		@NotNull(message = "操作状态必填")
+		private UpmsState.QuizState state;
+	}
+
 
 	@Data
 	public static class OnItemCreate {
@@ -34,6 +75,9 @@ public final class WmQuizDTO {
 		@NotBlank(message = "标题必填")
 		private String label;
 
+		@NotBlank(message = "试卷编号")
+		private String quizSerialNum;
+
 		@NotEmpty(message = "选项不能为空")
 		private WmQuestion.Option[] options;
 

+ 136 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmQuizController.java

@@ -1,17 +1,22 @@
 package com.qunzhixinxi.hnqz.admin.controller;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 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.WmQuiz;
 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.constant.enums.UpmsState;
 import com.qunzhixinxi.hnqz.common.core.exception.BizException;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.log.annotation.SysLog;
@@ -26,6 +31,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -51,6 +57,136 @@ public class WmQuizController {
 
 	// ~ QUIZ =========
 
+	/**
+	 * 获取试卷详情
+	 *
+	 * @param quizId 试卷ID
+	 * @return 详情信息
+	 */
+	@GetMapping(value = "/quiz/details")
+	public R<Map<String, Object>> getQuizDetails(@RequestParam(value = "quizId") Integer quizId) {
+
+		Map<String, Object> details = quizService.getDetails(quizId);
+
+		return R.ok(details);
+	}
+
+	/**
+	 * 获取试卷分页
+	 *
+	 * @param current    当前页
+	 * @param size       每页记录数
+	 * @param title      试卷标题
+	 * @param createTime 创建时间范围
+	 * @return 分页结果
+	 */
+	@GetMapping(value = "/quiz/page")
+	public R<Page<?>> pageQuizzes(@RequestParam(value = "current", defaultValue = "1") Integer current,
+								  @RequestParam(value = "size", defaultValue = "20") Integer size,
+								  @RequestParam(value = "title", required = false) String title,
+								  @RequestParam(value = "state", required = false) UpmsState.QuizState state,
+								  @RequestParam(value = "createTime", required = false) LocalDateTime[] createTime) {
+
+		LambdaQueryWrapper<WmQuiz> queryWrapper = Wrappers.<WmQuiz>lambdaQuery()
+				.like(StrUtil.isNotBlank(title), WmQuiz::getTitle, title)
+				.eq(state != null, WmQuiz::getState, state)
+				.eq(WmQuiz::getEnterpriseId, SecurityUtils.getUser().getDeptId())
+				.orderByDesc(WmQuiz::getCreateTime);
+
+		if (ArrayUtil.isNotEmpty(createTime)) {
+			LocalDateTime end;
+			if (createTime.length == 1) {
+				end = LocalDateTime.now();
+			} else {
+				end = createTime[1];
+			}
+			queryWrapper.between(WmQuiz::getCreateTime, createTime[0], end);
+		}
+
+
+		Page<WmQuiz> pages = quizService.page(new Page<>(current, size), queryWrapper);
+
+		return R.ok(pages);
+	}
+
+	/**
+	 * 获取可用的试卷
+	 *
+	 * @return 可用试卷列表
+	 */
+	@GetMapping(value = "/quiz/avail/list")
+	public R<List<WmQuiz>> listQuizzes() {
+
+		List<WmQuiz> quizzes = quizService.list(Wrappers.<WmQuiz>lambdaQuery().eq(WmQuiz::getEnterpriseId, SecurityUtils.getUser().getDeptId()).eq(WmQuiz::getState, UpmsState.QuizState.RELEASE));
+
+		return R.ok(quizzes);
+	}
+
+	/**
+	 * 发布试卷
+	 *
+	 * @param resource 发布试卷
+	 * @return 发布结果
+	 */
+	@SysLog("发布试卷")
+	@PostMapping(value = "/quiz/state/release")
+	public R<Boolean> releaseQuiz(@Valid @RequestBody WmQuizDTO.OnQuizState resource) {
+
+		if (!UpmsState.QuizState.RELEASE.equals(resource.getState())) {
+			log.error("发布请求参数封装错误");
+			throw new BizException("发布请求参数封装错误");
+		}
+
+		Boolean succ = quizService.releaseQuiz(resource.getQuizId(), SecurityUtils.getUser());
+		return succ ? R.ok(true, "发布试卷成功") : R.failed(false, "发布试卷失败");
+	}
+
+	/**
+	 * 创建试卷
+	 *
+	 * @param resource 试卷信息
+	 * @return 创建结果
+	 */
+	@SysLog(value = "创建试卷")
+	@PostMapping(value = "/quiz/create")
+	public R<String> createQuiz(@Valid @RequestBody WmQuizDTO.OnQuizCreate resource) {
+		String sn = quizService.createQuiz(resource, SecurityUtils.getUser());
+		return StrUtil.isNotBlank(sn) ? R.ok(sn, "创建试卷成功") : R.failed("", "创建试卷失败");
+	}
+
+	/**
+	 * 更新试卷
+	 *
+	 * @param resource 试卷信息
+	 * @return 创建结果
+	 */
+	@SysLog("更新试卷")
+	@PostMapping(value = "/quiz/update")
+	public R<Boolean> updateQuiz(@Valid @RequestBody WmQuizDTO.OnQuizUpdate resource) {
+
+		return R.ok();
+	}
+
+	/**
+	 * 中止试卷
+	 *
+	 * @param resource 试卷信息
+	 * @return 中止结果
+	 */
+	@SysLog("中止试卷")
+	@PostMapping(value = "/quiz/state/stop")
+	public R<Boolean> stopQuiz(@Valid @RequestBody WmQuizDTO.OnQuizState resource) {
+
+		if (!UpmsState.QuizState.STOP.equals(resource.getState())) {
+			log.error("中止请求参数封装错误");
+			throw new BizException("中止请求参数封装错误");
+		}
+
+		Boolean succ = quizService.stopQuiz(resource.getQuizId(), SecurityUtils.getUser());
+		return succ ? R.ok(true, "发布试卷成功") : R.failed(false, "发布试卷失败");
+
+	}
+
 
 	// ~ QUIZ ITEM =========
 

+ 39 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmQuizService.java

@@ -1,7 +1,11 @@
 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.WmQuiz;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+
+import java.util.Map;
 
 /**
  * 试卷服务
@@ -11,4 +15,39 @@ import com.qunzhixinxi.hnqz.admin.api.entity.WmQuiz;
  * @date 2023-10-16 15:54
  */
 public interface WmQuizService extends IService<WmQuiz> {
+
+	/**
+	 * 获取试卷详情
+	 *
+	 * @param quizId 试卷ID
+	 * @return 试卷详情
+	 */
+	Map<String, Object> getDetails(Integer quizId);
+
+	/**
+	 * 发布试题
+	 *
+	 * @param quizId   试题ID
+	 * @param operator 操作人
+	 * @return 发布结果
+	 */
+	Boolean releaseQuiz(Integer quizId, HnqzUser operator);
+
+	/**
+	 * 中止试卷
+	 *
+	 * @param quizId   试题ID
+	 * @param operator 操作人
+	 * @return 发布结果
+	 */
+	Boolean stopQuiz(Integer quizId, HnqzUser operator);
+
+	/**
+	 * 创建试卷
+	 *
+	 * @param resource 试卷信息
+	 * @param user     操作人
+	 * @return 试卷编号
+	 */
+	String createQuiz(WmQuizDTO.OnQuizCreate resource, HnqzUser user);
 }

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

@@ -70,7 +70,7 @@ public class WmQuizItemServiceImpl extends ServiceImpl<WmQuizItemMapper, WmQuizI
 
 		List<WmQuizItem> quizItems = resources.stream().map(item -> {
 			WmQuizItem quizItem = new WmQuizItem();
-			quizItem.setQuizSerialNumber(IdUtil.fastSimpleUUID());
+			quizItem.setQuizSerialNumber(item.getQuizSerialNum());
 			quizItem.setLabel(item.getLabel());
 			quizItem.setOptions(item.getOptions());
 			quizItem.setAnswer(item.getAnswer());

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

@@ -1,12 +1,27 @@
 package com.qunzhixinxi.hnqz.admin.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.IdUtil;
+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.WmQuiz;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmQuizItem;
 import com.qunzhixinxi.hnqz.admin.mapper.WmQuizMapper;
+import com.qunzhixinxi.hnqz.admin.service.WmQuizItemService;
 import com.qunzhixinxi.hnqz.admin.service.WmQuizService;
+import com.qunzhixinxi.hnqz.common.core.constant.enums.UpmsState;
+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.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 试卷服务实现
@@ -19,4 +34,94 @@ import org.springframework.stereotype.Service;
 @Service
 @AllArgsConstructor
 public class WmQuizServiceImpl extends ServiceImpl<WmQuizMapper, WmQuiz> implements WmQuizService {
+
+	private final WmQuizItemService quizItemService;
+
+	/**
+	 * 获取试卷详情
+	 *
+	 * @param quizId 试卷ID
+	 * @return 试卷详情
+	 */
+	@Override
+	public Map<String, Object> getDetails(Integer quizId) {
+
+
+		WmQuiz quiz = this.getById(quizId);
+
+		List<WmQuizItem> quizItems = null;
+		if (quiz != null) {
+			quizItems = quizItemService.listItems(quiz.getSerialNumber());
+		}
+
+		Map<String, Object> res = new HashMap<>(2);
+		res.put("quiz", quiz);
+		res.put("items", CollUtil.isEmpty(quizItems) ? Collections.emptyList() : quizItems);
+		return res;
+	}
+
+	/**
+	 * 发布试题
+	 *
+	 * @param quizId   试题ID
+	 * @param operator 操作人
+	 * @return 发布结果
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Boolean releaseQuiz(Integer quizId, HnqzUser operator) {
+		return this.update(Wrappers.<WmQuiz>lambdaUpdate()
+				.set(WmQuiz::getState, UpmsState.QuizState.RELEASE)
+				.set(WmQuiz::getCreateBy, operator.getUsername())
+				.set(WmQuiz::getUpdateTime, LocalDateTime.now())
+				.eq(WmQuiz::getQuizId, quizId)
+		);
+	}
+
+	/**
+	 * 中止试卷
+	 *
+	 * @param quizId   试题ID
+	 * @param operator 操作人
+	 * @return 发布结果
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Boolean stopQuiz(Integer quizId, HnqzUser operator) {
+		return this.update(Wrappers.<WmQuiz>lambdaUpdate()
+				.set(WmQuiz::getState, UpmsState.QuizState.STOP)
+				.set(WmQuiz::getCreateBy, operator.getUsername())
+				.set(WmQuiz::getUpdateTime, LocalDateTime.now())
+				.eq(WmQuiz::getQuizId, quizId)
+		);
+	}
+
+	/**
+	 * 创建试卷
+	 *
+	 * @param resource 试卷信息
+	 * @param user     操作人
+	 * @return 创建结果
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public String createQuiz(WmQuizDTO.OnQuizCreate resource, HnqzUser user) {
+
+		WmQuiz quiz = new WmQuiz();
+		String sn = IdUtil.fastSimpleUUID();
+		quiz.setSerialNumber(sn);
+		quiz.setTitle(resource.getTitle());
+		quiz.setIntroduction(resource.getIntroduction());
+		quiz.setSourceType(resource.getSourceType());
+		quiz.setState(UpmsState.QuizState.CREATE);
+		quiz.setEnterpriseId(user.getDeptId());
+		String username = user.getUsername();
+		quiz.setCreateBy(username);
+		quiz.setUpdateBy(username);
+		LocalDateTime now = LocalDateTime.now();
+		quiz.setCreateTime(now);
+		quiz.setUpdateTime(now);
+
+		return this.save(quiz) ? sn : "";
+	}
 }