Selaa lähdekoodia

Merge branch 'feat-quiz' into temp-pre

# Conflicts:
#	hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/WmScorePackage.java
shc 1 vuosi sitten
vanhempi
commit
dbdd1814ce

+ 27 - 0
db/12wm_pkg_quiz.sql

@@ -0,0 +1,27 @@
+USE `hnqzx`;
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for wm_pkg_quiz_rel
+-- ----------------------------
+DROP TABLE IF EXISTS `wm_pkg_quiz_rel`;
+CREATE TABLE `wm_pkg_quiz_rel`
+(
+    `rel_id`       INT AUTO_INCREMENT COMMENT 'Id',
+    `pkg_id`       INT          NOT NULL COMMENT '积分包ID',
+    `quiz_id`      INT COMMENT '试卷id',
+    `quiz_title`   VARCHAR(64)  NOT NULL COMMENT '标题',
+    `item_qty`     INT UNSIGNED NOT NULL COMMENT '试卷项数量',
+    `total_mark`   INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '总分',
+    `passing_mark` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '及格分',
+    `quiz_items`   JSON COMMENT '试卷项',
+    `avail`        TINYINT(1)   NOT NULL DEFAULT TRUE COMMENT '可视化',
+    `create_time`  DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    PRIMARY KEY `pk_id` (`rel_id`) USING BTREE
+) ENGINE = InnoDB
+    COMMENT ='积分包试卷表';
+
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 68 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmPkgQuizRelation.java

@@ -0,0 +1,68 @@
+package com.qunzhixinxi.hnqz.admin.api.entity;
+
+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 java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 积分包的试卷
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-19 11:51
+ */
+@Data
+@TableName(value = "wm_pkg_quiz_rel", autoResultMap = true)
+public final class WmPkgQuizRelation {
+
+	@TableId(value = "rel_id", type = IdType.AUTO)
+	private Integer relationId;
+
+	private Integer pkgId;
+
+	private Integer quizId;
+
+	@TableField(value = "quiz_title")
+	private String title;
+
+	private Integer itemQty;
+
+	private Integer totalMark;
+
+	private Integer passingMark;
+
+	@TableField(value = "quiz_items", typeHandler = JacksonTypeHandler.class)
+	private Item[] items;
+
+	/**
+	 * 是否可用
+	 */
+	@TableField(value = "avail")
+	private Boolean available;
+
+	/**
+	 * 创建时间
+	 */
+	private LocalDateTime createTime;
+
+	@Data
+	public static class Item implements Serializable{
+
+		private static final long serialVersionUID = 8067658146266706311L;
+
+		private String label;
+
+		private WmQuestion.Option[] options;
+
+		private String answer;
+
+		private Integer mark;
+
+	}
+}

+ 4 - 1
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmQuestion.java

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
 import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
 import java.time.LocalDateTime;
 
 /**
@@ -70,7 +71,9 @@ public final class WmQuestion {
 	 * @date 2023-10-16 15:13
 	 */
 	@Data
-	public static class Option {
+	public static class Option implements Serializable {
+
+		private static final long serialVersionUID = -3212524654632400045L;
 
 		/**
 		 * 选项编号

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

@@ -23,7 +23,9 @@ import java.time.LocalDateTime;
  */
 @Data
 @TableName(value = "wm_quiz", autoResultMap = true)
-public final class WmQuiz {
+public final class WmQuiz implements Serializable {
+
+	private static final long serialVersionUID = -4251199161109646452L;
 
 	/**
 	 * 试卷ID

+ 4 - 1
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmQuizItem.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
 import lombok.Data;
 
+import java.io.Serializable;
 import java.time.LocalDateTime;
 
 /**
@@ -19,7 +20,9 @@ import java.time.LocalDateTime;
  */
 @Data
 @TableName(value = "wm_quiz_item", autoResultMap = true)
-public final class WmQuizItem {
+public final class WmQuizItem implements Serializable {
+
+	private static final long serialVersionUID = -2548220720337564269L;
 
 	@TableId(value = "item_id", type = IdType.AUTO)
 	private Integer itemId;

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 179 - 351
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmScorePackageController.java


+ 19 - 17
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/WmScorePackage.java

@@ -1,20 +1,3 @@
-/*
- *    Copyright (c) 2018-2025, hnqz All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * Neither the name of the pig4cloud.com developer nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- * Author: hnqz
- */
-
 package com.qunzhixinxi.hnqz.admin.entity;
 
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
@@ -23,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.qunzhixinxi.hnqz.admin.api.constant.UpmsType;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmPkgQuizRelation;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmReportOpt;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import io.swagger.annotations.ApiModel;
@@ -570,6 +554,24 @@ public class WmScorePackage extends Model<WmScorePackage> {
 	 */
 	private BigDecimal entTaskLimit;
 
+	/**
+	 * 获取积分包的关联试卷
+	 */
+	@TableField(exist = false)
+	private List<WmPkgQuizRelation> quizRelations;
+
+	/**
+	 * 积分包关联的试卷列表
+	 */
+	@TableField(exist = false)
+	private List<Integer> quizIds;
+
+	/**
+	 * 父级积分包关联的关系
+	 */
+	@TableField(exist = false)
+	private List<Integer> quizRelationIds;
+
 	@AllArgsConstructor
 	public enum PackageStopStatus {
 		NOTHING(0, "不能操作"),

+ 16 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmPkgQuizRelationMapper.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.WmPkgQuizRelation;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 积分包问卷关系mapper
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-19 13:21
+ */
+@Mapper
+public interface WmPkgQuizRelationMapper extends BaseMapper<WmPkgQuizRelation> {
+}

+ 40 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmPkgQuizRelationService.java

@@ -0,0 +1,40 @@
+package com.qunzhixinxi.hnqz.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmPkgQuizRelation;
+
+import java.util.List;
+
+/**
+ * 积分包问卷关系服务
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-19 13:22
+ */
+public interface WmPkgQuizRelationService extends IService<WmPkgQuizRelation> {
+
+	/**
+	 * 创建积分包关联的试卷
+	 *
+	 * @param quizIds 试卷ID
+	 * @param pkgId   积分包ID
+	 */
+	void createPkgQuizzes(List<Integer> quizIds, Integer pkgId);
+
+	/**
+	 * 复制关联关系
+	 *
+	 * @param pkgId           积分包ID
+	 * @param quizRelationIds 关联关系列表
+	 */
+	void copyQuizRelations(List<Integer> quizRelationIds, Integer pkgId);
+
+	/**
+	 * 获取积分包的关联试卷
+	 *
+	 * @param pkgIds 积分包id
+	 * @return 关联试卷集合
+	 */
+	List<WmPkgQuizRelation> listQuizRelationsByPkgIds(List<Integer> pkgIds);
+}

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

@@ -0,0 +1,128 @@
+package com.qunzhixinxi.hnqz.admin.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmPkgQuizRelation;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmQuiz;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmQuizItem;
+import com.qunzhixinxi.hnqz.admin.mapper.WmPkgQuizRelationMapper;
+import com.qunzhixinxi.hnqz.admin.service.WmPkgQuizRelationService;
+import com.qunzhixinxi.hnqz.admin.service.WmQuizService;
+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-19 13:22
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class WmPkgQuizRelationServiceImpl extends ServiceImpl<WmPkgQuizRelationMapper, WmPkgQuizRelation> implements WmPkgQuizRelationService {
+
+	private final WmQuizService quizService;
+
+	/**
+	 * 创建积分包关联的试卷
+	 *
+	 * @param quizIds  试卷ID
+	 * @param pkgId    积分包ID
+	 */
+	@Override
+	@SuppressWarnings("unchecked")
+	@Transactional(rollbackFor = Exception.class)
+	public void createPkgQuizzes(List<Integer> quizIds, Integer pkgId) {
+
+		List<WmPkgQuizRelation> relations = quizIds.stream().distinct().map(quizService::getDetails)
+				.filter(details -> details.get("quiz") != null && CollUtil.isNotEmpty((List<WmQuizItem>) details.get("items"))).map(detailMap -> {
+					WmQuiz quiz = (WmQuiz) detailMap.get("quiz");
+					List<WmQuizItem> quizItems = (List<WmQuizItem>) detailMap.get("items");
+					WmPkgQuizRelation relation = new WmPkgQuizRelation();
+					relation.setQuizId(quiz.getQuizId());
+					relation.setTitle(quiz.getTitle());
+					WmQuiz.Expand expand = quiz.getExpand();
+					relation.setItemQty(expand.getItemQty());
+					relation.setTotalMark(expand.getTotalMark());
+					relation.setPassingMark(expand.getPassingMark());
+					relation.setAvailable(Boolean.TRUE);
+					relation.setPkgId(pkgId);
+					relation.setCreateTime(LocalDateTime.now());
+
+					WmPkgQuizRelation.Item[] array = quizItems.stream().map(qi -> {
+						WmPkgQuizRelation.Item item = new WmPkgQuizRelation.Item();
+						item.setLabel(qi.getLabel());
+						item.setOptions(qi.getOptions());
+						item.setAnswer(qi.getAnswer());
+						item.setMark(qi.getMark());
+						return item;
+					}).toArray(WmPkgQuizRelation.Item[]::new);
+
+					relation.setItems(array);
+
+					return relation;
+				}).collect(Collectors.toList());
+
+		this.saveBatch(relations);
+
+	}
+
+	/**
+	 * 复制关联关系
+	 *
+	 * @param pkgId           积分包ID
+	 * @param quizRelationIds 关联关系列表
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void copyQuizRelations(List<Integer> quizRelationIds, Integer pkgId) {
+		List<WmPkgQuizRelation> quizRelations = this.listByIds(quizRelationIds);
+
+		List<WmPkgQuizRelation> relations = quizRelations.stream().map(qr -> {
+
+			WmPkgQuizRelation relation = new WmPkgQuizRelation();
+			relation.setQuizId(qr.getQuizId());
+			relation.setTitle(qr.getTitle());
+			relation.setItemQty(qr.getItemQty());
+			relation.setTotalMark(qr.getTotalMark());
+			relation.setPassingMark(qr.getPassingMark());
+			relation.setItems(qr.getItems());
+			relation.setPkgId(pkgId);
+			relation.setAvailable(qr.getAvailable());
+			relation.setCreateTime(LocalDateTime.now());
+
+			return relation;
+
+		}).collect(Collectors.toList());
+
+		this.saveBatch(relations);
+	}
+
+	/**
+	 * 获取积分包的关联试卷
+	 *
+	 * @param pkgIds 积分包id
+	 * @return 关联试卷集合
+	 */
+	@Override
+	public List<WmPkgQuizRelation> listQuizRelationsByPkgIds(List<Integer> pkgIds) {
+
+		List<WmPkgQuizRelation> relations = null;
+		if (CollUtil.isNotEmpty(pkgIds)) {
+			relations = this.list(Wrappers.<WmPkgQuizRelation>lambdaQuery().in(WmPkgQuizRelation::getPkgId, pkgIds));
+		}
+
+		return CollUtil.isNotEmpty(relations) ? relations : Collections.emptyList();
+	}
+}

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

@@ -39,6 +39,7 @@ import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDeptRelation;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDictItem;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmPkgQuizRelation;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmReportOpt;
 import com.qunzhixinxi.hnqz.admin.api.vo.UserVO;
 import com.qunzhixinxi.hnqz.admin.api.vo.WmScorePackageVO;
@@ -118,6 +119,7 @@ public class WmScorePackageServiceImpl extends ServiceImpl<WmScorePackageMapper,
 	private final SysDeptRechargeMapper sysDeptRechargeMapper;
 	private final SysDeptRechargeRecordMapper sysDeptRechargeRecordMapper;
 	private final RedisTemplate<String, String> redisTemplate;
+	private final WmPkgQuizRelationService pkgQuizRelationService;
 
 	@Override
 	public List<WmScorePackage> listWmScorePackageAndTask(WmScorePackage wmScorePackage) {
@@ -594,6 +596,22 @@ public class WmScorePackageServiceImpl extends ServiceImpl<WmScorePackageMapper,
 			wmScorePackage1.setScorePackageName("无");
 			packageList.add(wmScorePackage1);
 		}
+
+		// 获取积分包的试卷
+		List<Integer> pkgIds = packageList.stream().map(pkg -> Integer.parseInt(pkg.getId())).collect(Collectors.toList());
+		List<WmPkgQuizRelation> quizRelations = pkgQuizRelationService.listQuizRelationsByPkgIds(pkgIds);
+
+		if (CollUtil.isNotEmpty(quizRelations)){
+			Map<Integer, List<WmPkgQuizRelation>> map = quizRelations.stream().collect(Collectors.groupingBy(WmPkgQuizRelation::getPkgId));
+
+			packageList.forEach(pkg -> {
+				List<WmPkgQuizRelation> relations = map.get(Integer.parseInt(pkg.getId()));
+				pkg.setQuizRelations(CollUtil.isNotEmpty(relations) ? relations : Collections.emptyList());
+			});
+
+		}
+
+
 		log.info("查询关联积分包值+拼装参数总耗时:{}ms", System.currentTimeMillis() - start);
 
 		return R.ok(packageList);
@@ -941,7 +959,17 @@ public class WmScorePackageServiceImpl extends ServiceImpl<WmScorePackageMapper,
 			sysDeptRechargeRecordMapper.insert(rechargeRecord);
 		}
 
-		return R.ok("新增成功");
+		// 保存关联的试卷
+		if (CollUtil.isNotEmpty(wmScorePackage.getQuizIds())) {
+			pkgQuizRelationService.createPkgQuizzes(wmScorePackage.getQuizIds(), Integer.parseInt(wmScorePackage.getId()));
+		}
+
+		// 判断是否有关联关系
+		if (CollUtil.isNotEmpty(wmScorePackage.getQuizRelationIds())) {
+			pkgQuizRelationService.copyQuizRelations(wmScorePackage.getQuizRelationIds(), Integer.parseInt(wmScorePackage.getId()));
+		}
+
+		return R.ok(wmScorePackage.getId(), "新增成功");
 	}
 
 	/**

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä