浏览代码

feat:add pkg with quiz

shc 1 年之前
父节点
当前提交
9c79b2027c

+ 1 - 0
db/12wm_pkg_quiz.sql

@@ -10,6 +10,7 @@ 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 '试卷项数量',

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

@@ -24,6 +24,8 @@ public final class WmPkgQuizRelation {
 	@TableId(value = "rel_id", type = IdType.AUTO)
 	private Integer relationId;
 
+	private Integer pkgId;
+
 	private Integer quizId;
 
 	@TableField(value = "quiz_title")

+ 24 - 15
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmScorePackageController.java

@@ -104,6 +104,7 @@ public class WmScorePackageController {
 	private final SysDeptRechargeRecordMapper sysDeptRechargeRecordMapper;
 	private final SysDeptRechargeMapper sysDeptRechargeMapper;
 	private final StringRedisTemplate redisTemplate;
+	private final WmPkgQuizRelationService pkgQuizRelationService;
 	private final Sequence pkgSequence;
 
 	/**
@@ -1342,11 +1343,11 @@ public class WmScorePackageController {
 	 */
 	@GetMapping("/selectWmScorePackageLists")
 	public R<?> selectWmScorePackageList(@RequestParam(value = "current") Integer current,
-									  @RequestParam(value = "size") Integer size,
-									  @RequestParam(value = "scorePackageName", required = false) String scorePackageName,
-									  @RequestParam(value = "acceptSug", required = false) String acceptSug,
-									  @RequestParam(value = "allocationDate", required = false) LocalDate allocationDate,
-									  @RequestParam(value = "endLabelDate", required = false) LocalDate endLabelDate) {
+										 @RequestParam(value = "size") Integer size,
+										 @RequestParam(value = "scorePackageName", required = false) String scorePackageName,
+										 @RequestParam(value = "acceptSug", required = false) String acceptSug,
+										 @RequestParam(value = "allocationDate", required = false) LocalDate allocationDate,
+										 @RequestParam(value = "endLabelDate", required = false) LocalDate endLabelDate) {
 
 		Page<WmScorePackage> pageAnswer = wmScorePackageService.selectWmScorePackageLists(new Page<>(current, size),
 				scorePackageName, acceptSug, allocationDate, endLabelDate);
@@ -1862,6 +1863,16 @@ public class WmScorePackageController {
 			sysDeptRechargeRecordMapper.insert(rechargeRecord);
 		}
 
+		// 保存关联的试卷
+		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();
 	}
 
@@ -2517,14 +2528,14 @@ public class WmScorePackageController {
 	@ApiOperation(value = "分页查询", notes = "分页查询")
 	@GetMapping("/page-settle-package")
 	public R<?> pageSettlePackage(@RequestParam(value = "current") Integer current,
-							   @RequestParam(value = "size") Integer size,
-							   @RequestParam(value = "packageType1") String packageType1,
-							   @RequestParam(value = "packageType2") Integer packageType2,
-							   @RequestParam(value = "scorePackageName", required = false) String scorePackageName,
-							   @RequestParam(value = "scorePackageStatus", required = false) Integer scorePackageStatus,
-							   @RequestParam(value = "typeid", required = false) String typeId,
-							   @RequestParam(value = "monthStart", required = false) String monthStart,
-							   @RequestParam(value = "monthEnd", required = false) String monthEnd
+								  @RequestParam(value = "size") Integer size,
+								  @RequestParam(value = "packageType1") String packageType1,
+								  @RequestParam(value = "packageType2") Integer packageType2,
+								  @RequestParam(value = "scorePackageName", required = false) String scorePackageName,
+								  @RequestParam(value = "scorePackageStatus", required = false) Integer scorePackageStatus,
+								  @RequestParam(value = "typeid", required = false) String typeId,
+								  @RequestParam(value = "monthStart", required = false) String monthStart,
+								  @RequestParam(value = "monthEnd", required = false) String monthEnd
 	) {
 
 		Integer sendDeptId = SecurityUtils.getUser().getDeptId();
@@ -2719,7 +2730,6 @@ public class WmScorePackageController {
 	 * @param wmScorePackage 积分包
 	 * @return R
 	 */
-	@ApiOperation(value = "新增积分包", notes = "新增积分包")
 	@SysLog("新增积分包(小包)")
 	@PostMapping("/addWmScorePackage")
 	public R<?> addWmScorePackage(@RequestBody WmScorePackage wmScorePackage) {
@@ -2741,7 +2751,6 @@ public class WmScorePackageController {
 			wmScorePackage.setSubType(String.valueOf(location.getGigType().getCode()));
 		}
 
-
 		return wmScorePackageService.addWmScorePackage(wmScorePackage);
 	}
 

+ 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;
@@ -22,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 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.entity.WmPkgQuizRelation;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmReportOpt;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import io.swagger.annotations.ApiModel;
@@ -564,6 +548,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, "不能操作"),

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

@@ -3,6 +3,8 @@ 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;
+
 /**
  * 积分包问卷关系服务
  *
@@ -11,4 +13,28 @@ import com.qunzhixinxi.hnqz.admin.api.entity.WmPkgQuizRelation;
  * @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);
 }

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

@@ -1,12 +1,24 @@
 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;
 
 /**
  * 积分包试卷服务实现
@@ -19,4 +31,98 @@ import org.springframework.stereotype.Service;
 @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) {
@@ -591,6 +593,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);
@@ -938,7 +956,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(), "新增成功");
 	}
 
 	/**