Browse Source

Merge branch 'feat-quiz'

# Conflicts:
#	hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/WmScorePackage.java
shc 1 year ago
parent
commit
cde58300b9
48 changed files with 3058 additions and 1855 deletions
  1. 29 0
      db/10wm_quiz_item.sql
  2. 29 0
      db/11wm_question.sql
  3. 27 0
      db/12wm_pkg_quiz.sql
  4. 25 0
      db/13wm_user_plat_quiz_res.sql
  5. 33 0
      db/9wm_quiz.sql
  6. 31 0
      hnqz-common/hnqz-common-core/src/main/java/com/qunzhixinxi/hnqz/common/core/constant/enums/UpmsState.java
  7. 32 0
      hnqz-common/hnqz-common-core/src/main/java/com/qunzhixinxi/hnqz/common/core/constant/enums/UpmsType.java
  8. 29 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/WmPkgDTO.java
  9. 176 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/WmQuizDTO.java
  10. 68 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmPkgQuizRelation.java
  11. 40 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmPlatformQuizTestResult.java
  12. 91 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmQuestion.java
  13. 114 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmQuiz.java
  14. 67 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmQuizItem.java
  15. 51 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/model/WmQuizResultModel.java
  16. 7 57
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/vo/UserVO.java
  17. 36 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/vo/WmQuizVO.java
  18. 5 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/config/UpmsConfig.java
  19. 66 557
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/ApiController.java
  20. 43 570
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysUserController.java
  21. 424 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmQuizController.java
  22. 182 316
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmScorePackageController.java
  23. 103 116
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmScorePackageStatusController.java
  24. 19 17
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/WmScorePackage.java
  25. 12 41
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/WmScorePackageStatus.java
  26. 4 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/input/WmScorePackageApiOutput.java
  27. 1 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysUserMapper.java
  28. 16 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmPkgQuizRelationMapper.java
  29. 16 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmPlatformQuizTestResultMapper.java
  30. 16 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmQuestionMapper.java
  31. 16 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmQuizItemMapper.java
  32. 16 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmQuizMapper.java
  33. 8 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysUserService.java
  34. 40 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmPkgQuizRelationService.java
  35. 45 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmPlatformQuizTestResultService.java
  36. 73 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmQuestionService.java
  37. 69 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmQuizItemService.java
  38. 81 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmQuizService.java
  39. 8 22
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmScorePackageStatusService.java
  40. 18 23
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysUserServiceImpl.java
  41. 128 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmPkgQuizRelationServiceImpl.java
  42. 104 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmPlatformQuizTestResultServiceImpl.java
  43. 161 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmQuestionServiceImpl.java
  44. 161 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmQuizItemServiceImpl.java
  45. 197 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmQuizServiceImpl.java
  46. 70 42
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmScorePackageServiceImpl.java
  47. 1 17
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmScorePackageStatusServiceImpl.java
  48. 70 77
      hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/WmScorePackageStatusMapper.xml

+ 29 - 0
db/10wm_quiz_item.sql

@@ -0,0 +1,29 @@
+USE `hnqzx`;
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for wm_quiz_item
+-- ----------------------------
+DROP TABLE IF EXISTS `wm_quiz_item`;
+CREATE TABLE `wm_quiz_item`
+(
+    `item_id`      INT AUTO_INCREMENT COMMENT 'Id',
+    `quiz_sn`      VARCHAR(64)  NOT NULL COMMENT '试卷序号',
+    `label`        VARCHAR(64)  NOT NULL COMMENT '标题',
+    `quiz_options` JSON COMMENT '选项',
+    `answer`       VARCHAR(255) NULL COMMENT '答案',
+    `widget`       BIGINT       NOT NULL COMMENT '排序权重',
+    `mark`         INT          NOT NULL DEFAULT 0 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,
+    INDEX `idx_quiz_sn` (`quiz_sn`) USING BTREE
+) ENGINE = InnoDB
+    COMMENT ='试卷项表';
+
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 29 - 0
db/11wm_question.sql

@@ -0,0 +1,29 @@
+USE `hnqzx`;
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for wm_question
+-- ----------------------------
+DROP TABLE IF EXISTS `wm_question`;
+CREATE TABLE `wm_question`
+(
+    `qst_id`      INT AUTO_INCREMENT COMMENT 'Id',
+    `serial_num`  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 '企业信息',
+    `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` (`qst_id`) USING BTREE,
+    UNIQUE KEY `uk_sn` (`serial_num`) USING BTREE,
+    INDEX `idx_eid` (`ent_id`) USING BTREE
+) ENGINE = InnoDB
+    COMMENT ='试题表';
+
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 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;

+ 25 - 0
db/13wm_user_plat_quiz_res.sql

@@ -0,0 +1,25 @@
+USE `hnqzx`;
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for wm_user_plat_quiz_res
+-- ----------------------------
+DROP TABLE IF EXISTS `wm_user_plat_quiz_res`;
+CREATE TABLE `wm_user_plat_quiz_res`
+(
+    `res_id`      INT AUTO_INCREMENT COMMENT 'Id',
+    `user_id`     INT      NOT NULL COMMENT '用户ID',
+    `quiz_id`     INT COMMENT '试卷id',
+    `quiz_res`    JSON COMMENT '测试结果',
+    `res_expiry`  DATE     NOT NULL COMMENT '测评有效期',
+    `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    PRIMARY KEY `pk_id` (`res_id`) USING BTREE,
+    INDEX `idx_uid` (`user_id`) USING BTREE,
+    INDEX `idx_qid` (`quiz_id`) USING BTREE
+) ENGINE = InnoDB
+    COMMENT ='用户测评的评判结果';
+
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 33 - 0
db/9wm_quiz.sql

@@ -0,0 +1,33 @@
+USE `hnqzx`;
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for wm_quiz
+-- ----------------------------
+DROP TABLE IF EXISTS `wm_quiz`;
+CREATE TABLE `wm_quiz`
+(
+    `quiz_id`      INT AUTO_INCREMENT COMMENT 'Id',
+    `serial_num`   VARCHAR(64)  NOT NULL COMMENT '序列号',
+    `quiz_title`   VARCHAR(64)  NOT NULL COMMENT '标题',
+    `introduction` VARCHAR(255) NULL COMMENT '简介',
+    `source_type`  VARCHAR(8)   NOT NULL COMMENT '问卷来源类型',
+    `quiz_state`   VARCHAR(8)   NOT NULL COMMENT '问卷状态',
+    `ent_id`       INT UNSIGNED NOT NULL COMMENT '企业信息',
+    `quiz_expand`  JSON 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` (`quiz_id`) USING BTREE,
+    UNIQUE KEY `uk_sn` (`serial_num`) USING BTREE,
+    INDEX `idx_st` (`source_type`) USING BTREE,
+    INDEX `idx_state` (`quiz_state`) USING BTREE,
+    INDEX `idx_eid` (`ent_id`) USING BTREE
+) ENGINE = InnoDB
+    COMMENT ='试卷表';
+
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 31 - 0
hnqz-common/hnqz-common-core/src/main/java/com/qunzhixinxi/hnqz/common/core/constant/enums/UpmsState.java

@@ -0,0 +1,31 @@
+package com.qunzhixinxi.hnqz.common.core.constant.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+/**
+ * UPMS 状态
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-16 14:34
+ */
+@NoArgsConstructor(access = AccessLevel.NONE)
+public final class UpmsState {
+
+	@Getter
+	@AllArgsConstructor
+	public enum QuizState {
+		CREATE("CREATE", "未发布"),
+		RELEASE("RELEASE", "收集中"),
+		STOP("STOP", "停止发布");
+
+
+		@EnumValue
+		private String state;
+		private String description;
+	}
+}

+ 32 - 0
hnqz-common/hnqz-common-core/src/main/java/com/qunzhixinxi/hnqz/common/core/constant/enums/UpmsType.java

@@ -0,0 +1,32 @@
+package com.qunzhixinxi.hnqz.common.core.constant.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+/**
+ * UPMS类型枚举
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-16 14:31
+ */
+@NoArgsConstructor(access = AccessLevel.NONE)
+public final class UpmsType {
+
+	@Getter
+	@AllArgsConstructor
+	public enum QuizSourceType {
+
+		BLANK("BLK", "空白创建"),
+		TEMPLATE("TMP", "模板");
+
+		@EnumValue
+		private String type;
+
+		private String description;
+
+	}
+}

+ 29 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/WmPkgDTO.java

@@ -0,0 +1,29 @@
+package com.qunzhixinxi.hnqz.admin.api.dto;
+
+import com.qunzhixinxi.hnqz.admin.api.model.WmQuizResultModel;
+import lombok.AccessLevel;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 积分包操作dto
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-24 16:08
+ */
+@NoArgsConstructor(access = AccessLevel.NONE)
+public final class WmPkgDTO {
+
+	@Data
+	public static class OnPkgPickup {
+
+		@NotBlank(message = "积分包ID必填")
+		private String pkgId;
+
+		private WmQuizResultModel[] quizResults;
+
+	}
+}

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

@@ -0,0 +1,176 @@
+package com.qunzhixinxi.hnqz.admin.api.dto;
+
+import com.qunzhixinxi.hnqz.admin.api.entity.WmQuestion;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmQuiz;
+import com.qunzhixinxi.hnqz.admin.api.model.WmQuizResultModel;
+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;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.Valid;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 试卷dto
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-16 16:07
+ */
+@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 {
+
+		@NotNull(message = "试卷编号必填")
+		private String sn;
+
+		@Valid
+		private WmQuiz.Expand expand;
+
+		/**
+		 * 标题
+		 */
+		@Length(max = 64, message = "标题最大支持字符数{max}")
+		private String title;
+
+		/**
+		 * 简介
+		 */
+		private String introduction;
+
+	}
+
+	@Data
+	public static class OnQuizState {
+
+		@NotNull(message = "试卷ID必填")
+		private Integer quizId;
+
+		@NotNull(message = "操作状态必填")
+		private UpmsState.QuizState state;
+	}
+
+
+	@Data
+	public static class OnItemCreate {
+
+		@NotBlank(message = "标题必填")
+		private String label;
+
+		@NotBlank(message = "试卷编号")
+		private String quizSerialNum;
+
+		@NotEmpty(message = "选项不能为空")
+		private WmQuestion.Option[] options;
+
+		@NotBlank(message = "答案必填")
+		private String answer;
+
+		@NotNull(message = "排序权重必填")
+		private Long widget;
+
+		@NotNull(message = "分数必填")
+		@Min(value = 0, message = "分数最小为{value}")
+		private Integer mark;
+	}
+
+	@Data
+	public static class OnItemUpdate {
+
+		@NotNull(message = "试卷项ID必填")
+		private Integer itemId;
+
+		private String label;
+
+		private WmQuestion.Option[] options;
+
+		private String answer;
+
+		private Long widget;
+
+		@Min(value = 0, message = "分数最小为{value}")
+		private Integer mark;
+	}
+
+	@Data
+	public static class OnItemDelete {
+
+		@NotNull(message = "试卷项ID必填")
+		private Integer itemId;
+	}
+
+
+	@Data
+	public static class OnQuestionCreate {
+		@NotBlank(message = "试题标题必填")
+		@Length(max = 64, message = "试卷标题最多{max}个字符")
+		private String label;
+
+		@Valid
+		@NotEmpty(message = "试题选项必填")
+		private WmQuestion.Option[] options;
+
+		@NotBlank(message = "试题答案必填")
+		@Length(max = 255, message = "试卷标题最多{max}个字符")
+		private String answer;
+
+	}
+
+	@Data
+	public static class OnQuestionUpdate {
+
+		@NotNull(message = "试题ID必填")
+		private Integer questionId;
+
+		private String label;
+
+		private WmQuestion.Option[] options;
+
+		private String answer;
+
+	}
+
+	@Data
+	public static class OnQuestionDel {
+		@NotNull(message = "试题ID必填")
+		private Integer questionId;
+	}
+
+	@Data
+	public static class OnUserPltTestResultCreate {
+		@NotEmpty(message = "测试结果必填")
+		private WmQuizResultModel[] quizResults;
+	}
+
+}

+ 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;
+
+	}
+}

+ 40 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmPlatformQuizTestResult.java

@@ -0,0 +1,40 @@
+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 com.qunzhixinxi.hnqz.admin.api.model.WmQuizResultModel;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * 用户平台试卷测评结果
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-25 15:39
+ */
+@Data
+@TableName(value = "wm_user_plat_quiz_res", autoResultMap = true)
+public final class WmPlatformQuizTestResult {
+
+
+	@TableId(value = "res_id", type = IdType.AUTO)
+	private Integer resultId;
+
+	private Integer userId;
+
+	private Integer quizId;
+
+	@TableField(value = "quiz_res", typeHandler = JacksonTypeHandler.class)
+	private WmQuizResultModel quizResult;
+
+	@TableField(value = "res_expiry")
+	private LocalDate expiry;
+
+	private LocalDateTime createTime;
+}

+ 91 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmQuestion.java

@@ -0,0 +1,91 @@
+package com.qunzhixinxi.hnqz.admin.api.entity;
+
+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.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 试题实体
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-16 14:58
+ */
+@Data
+@TableName(value = "wm_question", autoResultMap = true)
+public final class WmQuestion {
+
+	@TableId(value = "qst_id", type = IdType.AUTO)
+	private Integer questionId;
+
+	@TableField(value = "serial_num")
+	private String serialNumber;
+
+	private String label;
+
+	@TableField(typeHandler = JacksonTypeHandler.class)
+	private Option[] options;
+
+	private String answer;
+
+	@TableField(value = "ent_id")
+	private Integer enterpriseId;
+
+	/**
+	 * 创建人
+	 */
+	@TableField(fill = FieldFill.INSERT)
+	private String createBy;
+
+	/**
+	 * 修改人
+	 */
+	@TableField(fill = FieldFill.INSERT_UPDATE)
+	private String updateBy;
+
+	/**
+	 * 创建时间
+	 */
+	@TableField(fill = FieldFill.INSERT)
+	private LocalDateTime createTime;
+
+	/**
+	 * 修改时间
+	 */
+	@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 implements Serializable {
+
+		private static final long serialVersionUID = -3212524654632400045L;
+
+		/**
+		 * 选项编号
+		 */
+		@NotBlank(message = "选项编号必填")
+		private String no;
+
+		/**
+		 * 选项文本
+		 */
+		@NotBlank(message = "选项文本必填")
+		private String text;
+
+	}
+}

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

@@ -0,0 +1,114 @@
+package com.qunzhixinxi.hnqz.admin.api.entity;
+
+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.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.qunzhixinxi.hnqz.common.core.constant.enums.UpmsState;
+import com.qunzhixinxi.hnqz.common.core.constant.enums.UpmsType;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 试卷实体
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-16 14:20
+ */
+@Data
+@TableName(value = "wm_quiz", autoResultMap = true)
+public final class WmQuiz implements Serializable {
+
+	private static final long serialVersionUID = -4251199161109646452L;
+
+	/**
+	 * 试卷ID
+	 */
+	@TableId(value = "quiz_id", type = IdType.AUTO)
+	private Integer quizId;
+
+	/**
+	 * 问卷序列号
+	 */
+	@TableField(value = "serial_num")
+	private String serialNumber;
+
+	/**
+	 * 标题
+	 */
+	@TableField(value = "quiz_title")
+	private String title;
+
+	/**
+	 * 简介
+	 */
+	private String introduction;
+
+	/**
+	 * 问卷来源类型
+	 */
+	private UpmsType.QuizSourceType sourceType;
+
+	/**
+	 * 问卷状态
+	 */
+	@TableField(value = "quiz_state")
+	private UpmsState.QuizState state;
+
+	/**
+	 * 企业id
+	 */
+	@TableField(value = "ent_id")
+	private Integer enterpriseId;
+
+	@TableField(value = "quiz_expand", typeHandler = JacksonTypeHandler.class)
+	private Expand expand;
+
+	/**
+	 * 创建人
+	 */
+	@TableField(fill = FieldFill.INSERT)
+	private String createBy;
+
+	/**
+	 * 修改人
+	 */
+	@TableField(fill = FieldFill.INSERT_UPDATE)
+	private String updateBy;
+
+	/**
+	 * 创建时间
+	 */
+	@TableField(fill = FieldFill.INSERT)
+	private LocalDateTime createTime;
+
+	/**
+	 * 修改时间
+	 */
+	@TableField(fill = FieldFill.INSERT_UPDATE)
+	private LocalDateTime updateTime;
+
+	@Data
+	public static class Expand implements Serializable {
+
+		private static final long serialVersionUID = 1637589344595080989L;
+
+		@NotNull(message = "试卷项数量必填")
+		private Integer itemQty;
+
+		@NotNull(message = "试卷总分必填")
+		private Integer totalMark;
+
+		@NotNull(message = "及格分数必填")
+		private Integer passingMark;
+
+	}
+
+
+}

+ 67 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmQuizItem.java

@@ -0,0 +1,67 @@
+package com.qunzhixinxi.hnqz.admin.api.entity;
+
+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.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-16 14:58
+ */
+@Data
+@TableName(value = "wm_quiz_item", autoResultMap = true)
+public final class WmQuizItem implements Serializable {
+
+	private static final long serialVersionUID = -2548220720337564269L;
+
+	@TableId(value = "item_id", type = IdType.AUTO)
+	private Integer itemId;
+
+	@TableField(value = "quiz_sn")
+	private String quizSerialNumber;
+
+	private String label;
+
+	@TableField(value = "quiz_options", typeHandler = JacksonTypeHandler.class)
+	private WmQuestion.Option[] options;
+
+	private String answer;
+
+	private Long widget;
+
+	private Integer mark;
+
+	/**
+	 * 创建人
+	 */
+	@TableField(fill = FieldFill.INSERT)
+	private String createBy;
+
+	/**
+	 * 修改人
+	 */
+	@TableField(fill = FieldFill.INSERT_UPDATE)
+	private String updateBy;
+
+	/**
+	 * 创建时间
+	 */
+	@TableField(fill = FieldFill.INSERT)
+	private LocalDateTime createTime;
+
+	/**
+	 * 修改时间
+	 */
+	@TableField(fill = FieldFill.INSERT_UPDATE)
+	private LocalDateTime updateTime;
+}

+ 51 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/model/WmQuizResultModel.java

@@ -0,0 +1,51 @@
+package com.qunzhixinxi.hnqz.admin.api.model;
+
+import com.qunzhixinxi.hnqz.admin.api.entity.WmQuestion;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 问卷结果模型
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-24 16:10
+ */
+@Data
+public final class WmQuizResultModel implements Serializable {
+	private static final long serialVersionUID = 6211888315171373218L;
+
+
+	private Integer quizId;
+
+	private String title;
+
+	private Integer itemQty;
+
+	private Integer totalMark;
+
+	private Integer passingMark;
+
+	private Integer finalMark;
+
+	private WmQuizResultModel.QuizResultItem[] items;
+
+
+	@Data
+	public static class QuizResultItem implements Serializable {
+
+		private static final long serialVersionUID = 8067658146266706311L;
+
+		private String label;
+
+		private WmQuestion.Option[] options;
+
+		private String answer;
+
+		private Integer mark;
+
+		private String answered;
+
+	}
+}

+ 7 - 57
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/vo/UserVO.java

@@ -1,30 +1,11 @@
-/*
- *
- *      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.api.vo;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysRole;
-import com.qunzhixinxi.hnqz.admin.api.enums.SignatureStatusEnum;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmPlatformQuizTestResult;
+import com.qunzhixinxi.hnqz.admin.api.model.WmQuizResultModel;
 import com.qunzhixinxi.hnqz.common.core.sensitive.Sensitive;
 import com.qunzhixinxi.hnqz.common.core.sensitive.SensitiveTypeEnum;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -37,7 +18,6 @@ import java.util.Map;
  * @date 2017/10/29
  */
 @Data
-@ApiModel(value = "前端用户展示对象")
 public class UserVO implements Serializable {
 
 	private static final long serialVersionUID = 1L;
@@ -45,183 +25,152 @@ public class UserVO implements Serializable {
 	/**
 	 * 主键ID
 	 */
-	@ApiModelProperty(value = "主键")
 	private Integer userId;
 
 	/**
 	 * 用户名
 	 */
-	@ApiModelProperty(value = "用户名")
 	private String username;
 
 	/**
 	 * 身份证号
 	 */
-	@ApiModelProperty(value = "身份证号")
 	private String idCardNumber;
 
 	/**
 	 * 密码
 	 */
-	@ApiModelProperty(value = "密码")
 	private String password;
 
 	/**
 	 * 随机盐
 	 */
-	@ApiModelProperty(value = "随机盐")
 	private String salt;
 
 	/**
 	 * 微信openid
 	 */
-	@ApiModelProperty(value = "微信open id")
 	private String wxOpenid;
 
 	/**
 	 * QQ openid
 	 */
-	@ApiModelProperty(value = "qq open id")
 	private String qqOpenid;
 
 	/**
 	 * 创建时间
 	 */
-	@ApiModelProperty(value = "创建时间")
 	private LocalDateTime createTime;
 
 	/**
 	 * 修改时间
 	 */
-	@ApiModelProperty(value = "修改时间")
 	private LocalDateTime updateTime;
 
 	/**
 	 * 0-正常,1-删除
 	 */
-	@ApiModelProperty(value = "删除标记,1:已删除,0:正常")
 	private String delFlag;
 
 	/**
 	 * 锁定标记
 	 */
-	@ApiModelProperty(value = "锁定标记,0:正常,9:已锁定")
 	private String lockFlag;
 
 	/**
 	 * 手机号
 	 */
 	@Sensitive(type = SensitiveTypeEnum.MOBILE_PHONE)
-	@ApiModelProperty(value = "手机号")
 	private String phone;
 
 	/**
 	 * 头像
 	 */
-	@ApiModelProperty(value = "头像")
 	private String avatar;
 
 	/**
 	 * 部门ID
 	 */
-	@ApiModelProperty(value = "所属部门")
 	private Integer deptId;
 
 	/**
 	 * 租户ID
 	 */
-	@ApiModelProperty(value = "所属租户")
 	private Integer tenantId;
 
 	/**
 	 * 部门名称
 	 */
-	@ApiModelProperty(value = "所属部门名称")
 	private String deptName;
 
 
 	/**
 	 * 用户姓名
 	 */
-	@ApiModelProperty(value="用户姓名")
 	private String realname;
 	/**
 	 * 省
 	 */
-	@ApiModelProperty(value="省")
 	private String province;
 	private String provinceCode;
 	/**
 	 * 市
 	 */
-	@ApiModelProperty(value="市")
 	private String city;
 	private String cityCode;
 	/**
 	 * 区
 	 */
-	@ApiModelProperty(value="区")
 	private String area;
 	/**
 	 * 地址
 	 */
-	@ApiModelProperty(value="地址")
 	private String address;
 	/**
 	 * 备用字段1
 	 */
-	@ApiModelProperty(value="备用字段1")
 	private String temp1;
 	/**
 	 * 备用字段2
 	 */
-	@ApiModelProperty(value="备用字段2")
 	private String temp2;
 	/**
 	 * 备用字段3
 	 */
-	@ApiModelProperty(value="备用字段3")
 	private String temp3;
 	/**
 	 * 备用字段4
 	 */
-	@ApiModelProperty(value="备用字段4")
 	private String temp4;
 	/**
 	 * 备用字段5
 	 */
-	@ApiModelProperty(value="备用字段5")
 	private String temp5;
 
 	/**
 	 * 备用字段5
 	 */
-	@ApiModelProperty(value="平台ID")
 	private String platId;
 
 
 	/**
 	 * 备用字段5
 	 */
-	@ApiModelProperty(value="药企ID")
 	private String drugEntId;
 
 	/**
 	 * 角色列表
 	 */
-	@ApiModelProperty(value = "拥有的角色列表")
 	private List<SysRole> roleList;
 
 	/**
 	 * 备用字段5
 	 */
-	@ApiModelProperty(value="w1")
 	private String w1;
 
 	/**
 	 * 人力家认证状态
 	 */
-	@ApiModelProperty(value="税邦云认证状态")
 	private Integer certStatus;
 
 	private String certRemark;
@@ -245,19 +194,16 @@ public class UserVO implements Serializable {
 	/**
 	 * 人力家认证状态
 	 */
-	@ApiModelProperty(value="人力家认证状态")
 	private Integer rljCertStatus;
 
 	/**
 	 * 税邦云协议签署,0->未签署,1->已签署 2-> 需补签
 	 */
-	@ApiModelProperty(value="税邦云协议签署")
 	private Integer taxHelperAgreementSignature;
 
 	/**
 	 * 结算主体和通道
 	 */
-	@ApiModelProperty(value="结算主体类型")
 	private Map<String, Integer> subjectTypeAndChannel;
 
 	/**
@@ -280,4 +226,8 @@ public class UserVO implements Serializable {
 	 */
 	private Boolean ageReminder;
 
+
+	@TableField(exist = false)
+	private List<WmQuizResultModel> quizResult;
+
 }

+ 36 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/vo/WmQuizVO.java

@@ -0,0 +1,36 @@
+package com.qunzhixinxi.hnqz.admin.api.vo;
+
+import com.qunzhixinxi.hnqz.admin.api.entity.WmQuestion;
+import lombok.AccessLevel;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 试卷模块vo
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-16 17:01
+ */
+@NoArgsConstructor(access = AccessLevel.NONE)
+public final class WmQuizVO {
+
+	@Data
+	public static class ToQuestionPageVO{
+		private String label;
+		private LocalDateTime createTime;
+		private String createBy;
+		private WmQuestion details;
+	}
+
+	@Data
+	public static class ToPltQuizTestVO{
+		private Boolean required;
+		private List<Map<String, Object>> testResults;
+
+	}
+}

+ 5 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/config/UpmsConfig.java

@@ -57,4 +57,9 @@ public class UpmsConfig {
 
 	private Integer eachDurationLimit;
 
+	/**
+	 * 平台企业ID
+	 */
+	private Integer pltEntId;
+
 }

File diff suppressed because it is too large
+ 66 - 557
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/ApiController.java


+ 43 - 570
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysUserController.java

@@ -1,27 +1,7 @@
-/*
- *
- *      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.controller;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ArrayUtil;
-import cn.hutool.core.util.EnumUtil;
 import cn.hutool.core.util.IdcardUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.bean.BeanUtil;
@@ -41,6 +21,8 @@ import com.qunzhixinxi.hnqz.admin.api.entity.SysDictItem;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysRole;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysUserRole;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmPlatformQuizTestResult;
+import com.qunzhixinxi.hnqz.admin.api.model.WmQuizResultModel;
 import com.qunzhixinxi.hnqz.admin.api.vo.UserVO;
 import com.qunzhixinxi.hnqz.admin.entity.SysDeptSub;
 import com.qunzhixinxi.hnqz.admin.entity.SysUserSub;
@@ -49,18 +31,15 @@ import com.qunzhixinxi.hnqz.admin.entity.input.UserCertificationInput;
 import com.qunzhixinxi.hnqz.admin.entity.model.excel.CommonUserExcelModel;
 import com.qunzhixinxi.hnqz.admin.entity.vo.SysUserSubVO;
 import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
-import com.qunzhixinxi.hnqz.admin.enums.OladingCertStatus;
-import com.qunzhixinxi.hnqz.admin.enums.RenlijiaCertStatus;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectTypeEnum;
-import com.qunzhixinxi.hnqz.admin.enums.YeeCertStatus;
-import com.qunzhixinxi.hnqz.admin.enums.ZhengQiZhiXingCertStatus;
 import com.qunzhixinxi.hnqz.admin.mapper.*;
 import com.qunzhixinxi.hnqz.admin.service.SysDeptService;
 import com.qunzhixinxi.hnqz.admin.service.SysDeptSubService;
 import com.qunzhixinxi.hnqz.admin.service.SysDictItemService;
 import com.qunzhixinxi.hnqz.admin.service.SysUserService;
 import com.qunzhixinxi.hnqz.admin.service.SysUserSubService;
+import com.qunzhixinxi.hnqz.admin.service.WmPlatformQuizTestResultService;
 import com.qunzhixinxi.hnqz.common.core.constant.CommonConstants;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.log.annotation.SysLog;
@@ -71,9 +50,6 @@ import com.qunzhixinxi.hnqz.common.qcc.service.QccService;
 import com.qunzhixinxi.hnqz.common.security.annotation.Inner;
 import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
 import com.qunzhixinxi.hnqz.common.taxhelper.enums.TaxHelperCertStatus;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
@@ -84,19 +60,22 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 /**
- * @author hnqz
- * @date 2018/12/16
+ * 用户管理
+ *
+ * @version 1.0.0
+ * @date 2023-10-26 15:32
  */
 @Slf4j
 @RestController
 @AllArgsConstructor
 @RequestMapping("/user")
-@Api(value = "user", tags = "用户管理模块")
 public class SysUserController {
 
 	private final SysUserService userService;
@@ -108,6 +87,7 @@ public class SysUserController {
 	private final QccService qccService;
 	private final SysUserSubService sysUserSubService;
 	private final SysDictItemService sysDictItemService;
+	private final WmPlatformQuizTestResultService platformQuizTestResultService;
 
 
 	private boolean isZbOrDbUsers(Integer[] roles) {
@@ -131,7 +111,6 @@ public class SysUserController {
 	 * @param input
 	 * @return R
 	 */
-	@ApiOperation(value = "用户管理-认证", notes = "用户管理-认证")
 	@SysLog("用户管理-认证")
 	@GetMapping("/getAuthInfo")
 	public R getAuthInfo(UserCertificationInput input) {
@@ -145,7 +124,6 @@ public class SysUserController {
 	 * @param input
 	 * @return R
 	 */
-	@ApiOperation(value = "用户管理-认证-确定", notes = "用户管理-认证-确定")
 	@SysLog("用户管理-认证-确定")
 	@PostMapping("/batchChannelCert")
 	public R batchChannelCert(@RequestBody UserCertificationInput input) {
@@ -163,24 +141,6 @@ public class SysUserController {
 	@GetMapping("/info/{username}")
 	public R info(@PathVariable String username) {
 
-		// //排除众包用户
-		// List<Integer> roleList=new ArrayList<>();
-		// roleList.add(5); //医药代表
-		// roleList.add(6); //众包代表
-		// QueryWrapper<SysUserRole> wrappers=Wrappers.query();
-		//
-		// List<SysUserRole>
-		// list=sysUserRoleService.list(wrappers.lambda().notIn(SysUserRole::getRoleId,roleList));
-		// List<Integer> listZbUserList=new ArrayList<>();
-		// for (SysUserRole sysUserRole:list) {
-		// listZbUserList.add(sysUserRole.getUserId());
-		// }
-		//
-		// if(null==listZbUserList)
-		// {
-		// return R.failed(null, String.format("用户信息为空 %s", username));
-		// }
-
 		// 根据用户名查询用户时,过滤掉已删除和已禁用的用户
 		List<SysUser> user = userService.list(Wrappers.<SysUser>query().lambda().eq(SysUser::getUsername, username)
 				.eq(SysUser::getDelFlag, 0).eq(SysUser::getLockFlag, 0));
@@ -265,8 +225,6 @@ public class SysUserController {
 	@SysLog("删除用户信息")
 	@DeleteMapping("/{id}")
 	@PreAuthorize("@pms.hasPermission('sys_user_del')")
-	@ApiOperation(value = "删除用户", notes = "根据ID删除用户")
-	@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "int", paramType = "path")
 	public R userDel(@PathVariable Integer id) {
 		SysUser sysUser = userService.getById(id);
 		return R.ok(userService.deleteUserById(sysUser));
@@ -698,489 +656,6 @@ public class SysUserController {
 		}
 	}
 
-// 	/**
-// 	 * 批量导入用户
-// 	 *
-// 	 * @param file 用户信息文件
-// 	 * @return success/false
-// 	 */
-// 	@SysLog("批量导入用户")
-// 	@PostMapping(value = "/batch")
-// 	@PreAuthorize("@pms.hasPermission('sys_user_add')")
-// 	public R batchUser(@RequestPart("file") MultipartFile file) {
-//
-// 		// 获取操作员和操作员所在的结算主体
-// 		HnqzUser operator = SecurityUtils.getUser();
-// 		SysDept sysDept = sysDeptService.getById(operator.getDeptId());
-//
-// 		// 读取excel
-// 		try {
-// 			String fileName = file.getOriginalFilename().toLowerCase();
-// 			InputStream inputStream = file.getInputStream();
-//
-// 			// 校验文件信息
-// 			Workbook wbs = null;
-// 			if (fileName.endsWith("xls")) {
-// 				//2003
-// 				wbs = new HSSFWorkbook(inputStream);
-// 			} else if (fileName.endsWith("xlsx")) {
-// 				//2007
-// 				wbs = new XSSFWorkbook(inputStream);
-// 			} else {
-// 				return R.failed("上传文件格式错误!");
-// 			}
-// 			if (wbs.isSheetHidden(0)) {
-// 				return R.failed("导入表中有隐藏列");
-// 			}
-//
-// 			// 校验页(数据页)
-// 			Sheet sheet = wbs.getSheetAt(1);
-//
-// 			// 校验模板
-// 			Row row0 = sheet.getRow(0);
-// 			if (row0 == null) {
-// 				return R.failed("导入模版错误!");
-// 			}
-//
-// 			// 校验记录数
-// 			int rowNum = sheet.getLastRowNum();
-// 			if (rowNum < 1) {
-// 				return R.failed("导入表中缺少数据!");
-// 			} else if (rowNum > 1000) {
-// 				return R.failed("单次批量导入最大支持1000行数据!");
-// 			}
-//
-// 			// 校验列信息
-// 			String name = row0.getCell(0).getStringCellValue();
-// 			if (!"姓名".equals(name)) {
-// 				return R.failed("导入模版第一列错误!");
-// 			}
-// 			String phone = row0.getCell(1).getStringCellValue();
-// 			if (!"手机号".equals(phone)) {
-// 				return R.failed("导入模版第二列错误!");
-// 			}
-// 			String prov = row0.getCell(2).getStringCellValue();
-// 			if (!"省".equals(prov)) {
-// 				return R.failed("导入模版第三列错误!");
-// 			}
-// 			String city = row0.getCell(3).getStringCellValue();
-// 			if (!"市".equals(city)) {
-// 				return R.failed("导入模版第四列错误!");
-// 			}
-// 			String role = row0.getCell(4).getStringCellValue();
-// 			if (!"角色".equals(role)) {
-// 				return R.failed("导入模版第五列错误!");
-// 			}
-// 			String userStatus = row0.getCell(5).getStringCellValue();
-// 			if (!"状态".equals(userStatus)) {
-// 				return R.failed("导入模版第六列错误!");
-// 			}
-// 			String provinceCode = row0.getCell(6).getStringCellValue();
-// 			if (!"省份编码".equals(provinceCode)) {
-// 				return R.failed("导入模版第七列错误!");
-// 			}
-// 			String cityCode = row0.getCell(7).getStringCellValue();
-// 			if (!"城市编码".equals(cityCode)) {
-// 				return R.failed("导入模版第八列错误!");
-// 			}
-//
-// 			//数据
-// 			List<UserDTO> userDTOList = new ArrayList<>();
-// 			List<ErrorInfoVo> errorList = new ArrayList<>();
-// 			log.info(">>> 通过excel批量创建用户开始 <<<");
-// 			// 行数据
-// 			for (int i = 1; i <= rowNum; i++) {
-//
-// 				// 行编号
-// 				int rNum = i;
-// 				Row row = sheet.getRow(i);
-// 				log.info(">>>当前导入第{}行<<<", i);
-//
-// 				if (row == null) {
-// 					ErrorInfoVo errorInfoVo = new ErrorInfoVo();
-// 					errorInfoVo.setRowNum(rNum);
-// 					errorInfoVo.setColumnName(null);
-// 					errorInfoVo.setContent(null);
-// 					errorInfoVo.setReason("当前行没有数据信息");
-// 					errorList.add(errorInfoVo);
-// 					continue;
-// 				}
-//
-// 				int colNum = row.getLastCellNum();
-// 				UserDTO userDTO = new UserDTO();
-//
-// 				userDTO.setDeptId(sysDept.getDeptId());
-// 				if(ArrayUtils.contains(sysDept.getSubjectType(),SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode())){
-// 					userDTO.setCertStatus(TaxHelperCertStatus.UN_CERT.getCode());
-// 				}
-// //				if(ArrayUtils.contains(sysDept.getSubjectType(),SubjectTypeEnum.TYPE_RENLIJIA.getCode())){
-// //					userDTO.setRljCertStatus(DingEnum.CER_STATUS_4.getType());
-// //				}
-// //				if ("1".equals(sysDept.getSubjectType())) {
-// //					userDTO.setCertStatus(TaxHelperCertStatus.UN_CERT.getCode());
-// //					userDTO.setUserType("1");
-// //				} else {
-// //					userDTO.setUserType("0");
-// //				}
-// 				userDTO.setCreateTime(LocalDateTime.now());
-//
-// 				for (int j = 0; j < colNum; j++) {//列数据
-//
-// 					// 获取列名称
-// 					String columnName = row0.getCell(j).getStringCellValue();
-// 					int columnNum = j + 1;
-//
-// 					if (null == row.getCell(j)) {
-// 						ErrorInfoVo errorInfoVo = new ErrorInfoVo();
-// 						errorInfoVo.setRowNum(rNum);
-// 						errorInfoVo.setColumnNum(columnNum);
-// 						errorInfoVo.setColumnName(columnName);
-// 						errorInfoVo.setContent(null);
-// 						errorInfoVo.setReason("列数据为空");
-// 						errorList.add(errorInfoVo);
-// 						continue;
-// 					}
-//
-// 					// 格式化字符串
-// 					row.getCell(j).setCellType(CellType.STRING);
-// 					String value = row.getCell(j).getStringCellValue()
-// 							.replaceAll(" ", "")
-// 							.replaceAll(",", "")
-// 							.replaceAll("\\u00A0", "")
-// 							.replaceAll((char) 12288 + "", "")
-// 							.replace("+", "·");
-//
-// 					// 校验value
-// 					if (StringUtil.isEmpty(value)) {
-// 						ErrorInfoVo errorInfoVo = new ErrorInfoVo();
-// 						errorInfoVo.setRowNum(rNum);
-// 						errorInfoVo.setColumnNum(columnNum);
-// 						errorInfoVo.setColumnName(columnName);
-// 						errorInfoVo.setContent(value);
-// 						errorInfoVo.setReason("数据为空");
-// 						errorList.add(errorInfoVo);
-// 						continue;
-// 					}
-//
-// 					if (j == 0) {
-// 						userDTO.setRealname(value);
-// 					} else if (j == 1) {
-// 						// 记录错误说明
-// 						String errorInfo = null;
-// 						// 正则校验手机号
-// 						if (ValidateUtils.validPhoneNum("0", value)) {
-// 							// 判断同一个dept下用户是否重复
-// 							SysUser query = new SysUser();
-// 							query.setUsername(value);
-// 							query.setDeptId(userDTO.getDeptId());
-// 							SysUser sysUser = sysUserMapper.selectUserByName(query);
-// 							if (sysUser != null) {
-// 								errorInfo = "手机号已被占用";
-// 							}
-// 						} else {
-// 							errorInfo = "不是手机号";
-// 						}
-//
-// 						// 封装错误信息
-// 						if (StringUtils.isNotEmpty(errorInfo)) {
-// 							ErrorInfoVo errorInfoVo = new ErrorInfoVo();
-// 							errorInfoVo.setRowNum(rNum);
-// 							errorInfoVo.setColumnNum(columnNum);
-// 							errorInfoVo.setColumnName(columnName);
-// 							errorInfoVo.setContent(value);
-// 							errorInfoVo.setReason(errorInfo);
-// 							errorList.add(errorInfoVo);
-// 							continue;
-// 						}
-//
-// 						userDTO.setPlatId(value);
-// 						userDTO.setPhone(value);
-// 						userDTO.setUsername(value);
-// 					} else if (j == 2) {
-// 						if ("全国".equals(value)) {
-// 							userDTO.setProvince("");
-// 						} else {
-// 							userDTO.setProvince(value);
-// 						}
-// 					} else if (j == 3) {
-// 						if (StringUtils.isEmpty(userDTO.getProvince())) {
-// 							userDTO.setCity("");
-// 						} else {
-// 							userDTO.setCity(value);
-// 						}
-// 					} else if (j == 4) {
-// 						// 声明错误信息记录
-// 						String errorInfo = "";
-//
-// 						// 根据角色名称获取角色
-// 						SysRole sysRole = sysRoleMapper.selectOne(Wrappers.<SysRole>query().eq("role_name", value));
-// 						if (sysRole != null) {
-// 							userDTO.setRole(Arrays.asList(sysRole.getRoleId()));
-// 							if (userDTO.getRole().contains(2)) {
-// 								UserDTO tmp = new UserDTO();
-// 								tmp.setUsername(userDTO.getUsername());
-// 								tmp.setDelFlag("0");
-// 								List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
-// 								if (userVoList.size() > 0) {
-// 									for (UserVO userVO : userVoList) {
-// 										if (null != userVO.getRoleList()) {
-// 											for (SysRole r : userVO.getRoleList()) {
-// 												if (r.getRoleId() == 3) {
-// 													errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为药企管理员!";
-// 													continue;
-// 												}
-// 												if (r.getRoleId() == 4) {
-// 													errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为CSO管理员!";
-// 													continue;
-// 												}
-// 												if (r.getRoleId() == 5) {
-// 													errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为全职学术推广员!";
-// 													continue;
-// 												}
-// 												if (r.getRoleId() == 6) {
-// 													errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为兼职学术推广员!";
-// 													continue;
-// 												}
-// 												if (r.getRoleId() == 7) {
-// 													errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为财务管理员!";
-// 													continue;
-// 												}
-// 											}
-// 										}
-// 									}
-// 								}
-//
-// 							} else if (userDTO.getRole().contains(3)) {
-// 								UserDTO tmp = new UserDTO();
-// 								tmp.setUsername(userDTO.getUsername());
-// 								tmp.setDelFlag("0");
-// 								List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
-// 								if (userVoList.size() > 0) {
-// 									for (UserVO userVO : userVoList) {
-// 										if (null != userVO.getRoleList()) {
-// 											for (SysRole r : userVO.getRoleList()) {
-// 												if (r.getRoleId() == 2) {
-// 													errorInfo = errorInfo + "用户已存在药企管理员角色,不能同时为平台管理员!";
-// 													continue;
-// 												}
-// 												if (r.getRoleId() == 4) {
-// 													errorInfo = errorInfo + "用户已存在药企管理员角色,不能同时为CSO管理员!";
-// 													continue;
-// 												}
-// 												if (sysDept.getLevel() == 3 || sysDept.getLevel() == 4) {
-// 													if (r.getRoleId() == 5) {
-// 														errorInfo = errorInfo + "用户已存在CSO关系角色,不能同时为药企管理员!";
-// 														continue;
-// 													}
-// 												}
-// 											}
-// 										}
-// 									}
-// 								}
-//
-// 							} else if (userDTO.getRole().contains(4)) {
-// 								UserDTO tmp = new UserDTO();
-// 								tmp.setUsername(userDTO.getUsername());
-// 								tmp.setDelFlag("0");
-// 								List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
-// 								if (userVoList.size() > 0) {
-// 									for (UserVO userVO : userVoList) {
-// 										if (null != userVO.getRoleList()) {
-// 											for (SysRole r : userVO.getRoleList()) {
-// 												if (sysRole.getRoleId() == 2) {
-// 													errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为!";
-// 													continue;
-// 												}
-//
-// 												if (r.getRoleId() == 3) {
-// 													errorInfo = errorInfo + "用户已存在药企管理员角色,不能同时为CSO管理员!";
-// 													continue;
-// 												}
-// 												if (r.getRoleId() == 5) {
-// 													SysUserRole sysUserRole = new SysUserRole();
-// 													sysUserRole.setUserId(userVO.getUserId());
-// 													List<SysUserRole> sysUserRoleList = sysUserRoleMapper.selectById(sysUserRole);
-// 													for (int k = 0; k < sysUserRoleList.size(); k++) {
-// 														SysUser sysUser = userService.getById(sysUserRoleList.get(k).getUserId());
-// 														if (!sysUser.getDeptId().equals(userDTO.getDeptId())) {
-// 															errorInfo = errorInfo + "用户已存在全职学术推广员角色,不能为其他机构CSO管理员!";
-// 															continue;
-// 														}
-// 													}
-// 												}
-// 											}
-// 										}
-// 									}
-// 								}
-//
-// 							} else if (userDTO.getRole().contains(7)) {
-// 								UserDTO tmp = new UserDTO();
-// 								tmp.setUsername(userDTO.getUsername());
-// 								tmp.setDelFlag("0");
-// 								List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
-// 								if (userVoList.size() > 0) {
-// 									for (UserVO userVO : userVoList) {
-// 										if (null != userVO.getRoleList()) {
-// 											for (SysRole r : userVO.getRoleList()) {
-// 												if (r.getRoleId() == 2) {
-// 													errorInfo = errorInfo + "用户已存在平台管理员,不能同时为财务管理员!";
-// 													continue;
-// 												}
-// 												if (sysDept.getLevel() == 3 || sysDept.getLevel() == 4) {
-// 													if (r.getRoleId() == 3) {
-// 														errorInfo = errorInfo + "用户已存在药企管理员,不能同时为CSO机构财务管理员!";
-// 														continue;
-// 													}
-// 												}
-// 											}
-// 										}
-// 									}
-// 								}
-//
-// 							} else if (userDTO.getRole().contains(5)) {
-// 								UserDTO tmp = new UserDTO();
-// 								tmp.setUsername(userDTO.getUsername());
-// 								tmp.setDelFlag("0");
-// 								List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
-// 								if (userVoList.size() > 0) {
-// 									for (UserVO userVO : userVoList) {
-// 										if (null != userVO.getRoleList()) {
-// 											for (SysRole r : userVO.getRoleList()) {
-// 												if (r.getRoleId() == 2) {
-// 													errorInfo = errorInfo + "用户已存在平台管理员,不能同时为全职学术推广员!";
-// 													continue;
-// 												}
-// 												if (r.getRoleId() == 3) {
-// 													if (sysDept.getLevel() == 3 || sysDept.getLevel() == 4) {
-// 														errorInfo = errorInfo + "用户已存在药企管理员,不能为CSO的全职学术推广员!";
-// 														continue;
-// 													}
-// 												}
-// 												if (r.getRoleId() == 4) {
-// 													if (sysDept.getLevel() == 3 || sysDept.getLevel() == 4) {
-// 														errorInfo = errorInfo + "用户已存在CSO管理员,不能为其他CSO的全职学术推广员!";
-// 														continue;
-// 													}
-// 												}
-//
-// 											}
-// 										}
-// 									}
-// 								}
-//
-// 							} else if (userDTO.getRole().contains(6)) {
-// 								UserDTO tmp = new UserDTO();
-// 								tmp.setUsername(userDTO.getUsername());
-// 								tmp.setDelFlag("0");
-// 								List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
-// 								if (userVoList.size() > 0) {
-// 									for (UserVO userVO : userVoList) {
-// 										if (null != userVO.getRoleList()) {
-// 											for (SysRole r : userVO.getRoleList()) {
-// 												if (r.getRoleId() == 2) {
-// 													errorInfo = errorInfo + "用户已存在平台管理员,不能同时为兼职学术推广员!";
-// 													continue;
-// 												}
-// 												SysUserRole sysUserRole = new SysUserRole();
-// 												sysUserRole.setUserId(userVO.getUserId());
-// 												List<SysUserRole> sysUserRoleList = sysUserRoleMapper.selectById(sysUserRole);
-// 												for (int k = 0; k < sysUserRoleList.size(); k++) {
-// 													if (sysUserRoleList.get(k).getRoleId().equals(7)) {
-// 														SysUser sysUser = userService.getById(sysUserRoleList.get(k).getUserId());
-// 														if (sysUser.getDeptId().equals(userDTO.getDeptId())) {
-// 															errorInfo = errorInfo + "用户已存在财务管理员角色,不能同时为兼职学术推广员!";
-// 															continue;
-// 														}
-// 													}
-// 												}
-// 											}
-// 										}
-// 									}
-// 								}
-//
-// 							} else if (userDTO.getRole().contains(9)) {
-// 								UserDTO tmp = new UserDTO();
-// 								tmp.setUsername(userDTO.getUsername());
-// 								tmp.setDelFlag("0");
-// 								List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
-// 								if (userVoList.size() > 0) {
-// 									for (UserVO userVO : userVoList) {
-// 										if (null != userVO.getRoleList()) {
-// 											for (SysRole r : userVO.getRoleList()) {
-// 												if (sysRole.getRoleId() == 2) {
-// 													errorInfo = errorInfo + "用户已存在平台管理员,不能同时为CRO管理员!";
-// 													continue;
-// 												}
-// 												if (r.getRoleId() == 3) {
-// 													errorInfo = errorInfo + "用户已存在药企管理员,不能同时为CRO管理员!";
-// 													continue;
-// 												}
-// 											}
-// 										}
-// 									}
-// 								}
-// 							}
-// 							if (userDTO.getRole().contains(3)) {
-// 								if (sysDept.getLevel() != 2) {
-// 									errorInfo = errorInfo + "角色选为药企管理员时,组织架构必须为药企!";
-// 								}
-// 							}
-// 							if (!userDTO.getDeptId().equals(SecurityUtils.getUser().getDeptId())) {
-// 								if (userDTO.getRole().contains(5) || userDTO.getRole().contains(6)) {
-// 									errorInfo = errorInfo + "不能跨机构维护学术推广员!";
-// 								}
-// 							}
-// 						}
-//
-// 						// 存在错误
-// 						if (StringUtils.isNotEmpty(errorInfo) || sysRole == null) {
-// 							ErrorInfoVo errorInfoVo = new ErrorInfoVo();
-// 							errorInfoVo.setRowNum(rNum);
-// 							errorInfoVo.setColumnNum(columnNum);
-// 							errorInfoVo.setColumnName(columnName);
-// 							errorInfoVo.setContent(errorInfo);
-// 							errorInfoVo.setReason("角色信息有误");
-// 							errorList.add(errorInfoVo);
-// 							continue;
-// 						}
-// 					} else if (j == 5) {
-// 						if (!"活跃".equals(value) && !"休眠".equals(value)) {
-// 							ErrorInfoVo errorInfoVo = new ErrorInfoVo();
-// 							errorInfoVo.setRowNum(rNum);
-// 							errorInfoVo.setColumnNum(columnNum);
-// 							errorInfoVo.setColumnName(columnName);
-// 							errorInfoVo.setContent(value);
-// 							errorInfoVo.setReason("角色状态有误");
-// 							errorList.add(errorInfoVo);
-// 							continue;
-// 						}
-// 						userDTO.setLockFlag("活跃".equals(value) ? "0" : "9");
-// 					} else if (j == 6) {
-// 						userDTO.setProvinceCode(value);
-// 					} else if (j == 7) {
-// 						userDTO.setCityCode(value);
-// 					}
-// 				}
-//
-// 				// 记录争取额的信息
-// 				userDTOList.add(userDTO);
-// 			}
-//
-// 			// 判断是否有错误的数据行,如果没有,执行入库操作
-// 			if (CollectionUtils.isEmpty(errorList)) {
-// 				userDTOList.forEach(userDTO -> {
-// 					userService.saveUser(userDTO);
-// 				});
-// 			}
-// 			return R.ok(errorList);
-//
-// 		} catch (Exception e) {
-// 			log.error("批量创建用户失败:{}",e.getMessage());
-// 			e.printStackTrace();
-// 			return R.failed("批量创建用户失败");
-// 		}
-// 	}
-
 	/**
 	 * 更新用户信息
 	 *
@@ -1192,13 +667,7 @@ public class SysUserController {
 	@PreAuthorize("@pms.hasPermission('sys_user_edit')")
 	public R updateUser(@Valid @RequestBody UserDTO userDto) {
 
-		// TODO qcc调用企查查查询是否为主要人员
-		/**
-		 * @Modify: start qcc调用企查查查询是否为主要人员
-		 * @Version: v2021.4.16
-		 * @Author: ryz
-		 * @Date: 2021/5/6
-		 */
+		// qcc调用企查查查询是否为主要人员
 		SysDept sysDept = sysDeptService.getById(userDto.getDeptId());
 
 		if (null != userDto.getUserId()) {
@@ -1491,7 +960,7 @@ public class SysUserController {
 	 * @return 用户集合
 	 */
 	@GetMapping("/selectUserList")
-	public R selectUserList(Page page, UserDTO userDTO) {
+	public R<?> selectUserList(Page page, UserDTO userDTO) {
 
 		userDTO.setSubType(null);
 		if (StrUtil.isNotBlank(userDTO.getSubjectLocation())) {
@@ -1506,14 +975,42 @@ public class SysUserController {
 
 		IPage<UserVO> userVosPage = userService.selectUserList(page, userDTO);
 
+		Set<Integer> userIds = userVosPage.getRecords().stream().map(UserVO::getUserId).collect(Collectors.toSet());
+
+		if (CollUtil.isNotEmpty(userIds)) {
+
+			List<WmPlatformQuizTestResult> quizTestResults = platformQuizTestResultService.listPltQuizResults(userIds);
+
+			LocalDate today = LocalDate.now();
+			Map<Integer, List<WmPlatformQuizTestResult>> quizTestResult = quizTestResults.stream().filter(res -> res.getExpiry().isAfter(today)).collect(Collectors.groupingBy(WmPlatformQuizTestResult::getUserId));
+
+			userVosPage.getRecords().forEach(vo -> {
+				List<WmPlatformQuizTestResult> testResults = quizTestResult.get(vo.getUserId());
+				List<WmQuizResultModel> pure = null;
+				if (CollUtil.isNotEmpty(testResults)) {
+					Map<Integer, List<WmPlatformQuizTestResult>> collect = testResults.stream().collect(Collectors.groupingBy(WmPlatformQuizTestResult::getQuizId));
+					pure = new ArrayList<>(collect.size());
+
+					for (Map.Entry<Integer, List<WmPlatformQuizTestResult>> entry : collect.entrySet()) {
+						pure.add(entry.getValue().get(0).getQuizResult());
+					}
+				}
+
+				vo.setQuizResult(CollUtil.isEmpty(pure) ? Collections.emptyList() : pure);
+			});
+
+
+		}
+
+
 		// 封装结算通道
 		Set<Integer> deptIds = userVosPage.getRecords().stream().map(UserVO::getDeptId).collect(Collectors.toSet());
 
 		if (CollUtil.isNotEmpty(deptIds)) {
 			// 税源地
 			Map<Integer, Map<String, Integer>> coll = sysDeptSubService.list(Wrappers.<SysDeptSub>lambdaQuery()
-					.eq(SysDeptSub::getEnableFlag, SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode())
-					.in(SysDeptSub::getDeptId, deptIds))
+							.eq(SysDeptSub::getEnableFlag, SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode())
+							.in(SysDeptSub::getDeptId, deptIds))
 					.stream()
 					.collect(Collectors.groupingBy(SysDeptSub::getDeptId,
 							Collectors.toMap(sysDeptSub -> sysDeptSub.getSubjectLocation().name(), SysDeptSub::getSubjectChannel)));
@@ -1548,7 +1045,7 @@ public class SysUserController {
 		// 平台管理员和admin获取全部
 		else {
 			List<SysDictItem> list = sysDictItemService.list(Wrappers.<SysDictItem>query().lambda().eq(SysDictItem::getType, "subject_location"));
-			locations = list.stream().map( item -> Enum.valueOf(SubjectLocation.class, item.getValue())).collect(Collectors.toList());
+			locations = list.stream().map(item -> Enum.valueOf(SubjectLocation.class, item.getValue())).collect(Collectors.toList());
 		}
 
 		userVosPage.getRecords().forEach(userVO -> {
@@ -1565,16 +1062,6 @@ public class SysUserController {
 						.eq(SysUserSub::getUserId, userVO.getUserId()));
 
 				if (CollUtil.isNotEmpty(userSubList) && CollUtil.isNotEmpty(locations)) {
-					// 不同渠道认证信息列表
-					List<SysUserSubVO> certList = new ArrayList<>();
-//					userSubList.stream()
-//							.filter(userSub -> locations.contains(userSub.getSubjectLocation()))
-//							.forEach(sysUserSub -> {
-//						SysUserSubVO userSubVO = BeanUtil.copyProperties(sysUserSub, SysUserSubVO.class, "certStatus");
-//						userSubVO.setCertStatus(GigTypeEnum.getCertStatusByCode(sysUserSub.getGigType(), sysUserSub.getCertStatus()));
-//						userSubVO.setCertStatusDisplay(String.format("%s:%s", sysUserSub.getSubjectLocation().getDescription(),GigTypeEnum.getCertStatusNameByCode(sysUserSub.getGigType(), sysUserSub.getCertStatus())));
-//						certList.add(userSubVO);
-//					});
 
 					// 不同渠道认证名称,封装成中文名称数组格式
 					Map<SubjectLocation, SysUserSub> certStatusMap = userSubList.stream()
@@ -1606,20 +1093,6 @@ public class SysUserController {
 					).collect(Collectors.toList());
 					userVO.setCertList(subVOS);
 
-//					List<SubjectLocation> collect = certList.stream().map(SysUserSubVO::getSubjectLocation).collect(Collectors.toList());
-
-//					List<SysUserSubVO> subVOS = locations.stream().filter(loc -> !collect.contains(loc)).map(loc -> {
-//								SysUserSubVO userSubVO = new SysUserSubVO();
-//								userSubVO.setUserId(userVO.getUserId());
-//								userSubVO.setGigType(loc.getGigType());
-//								userSubVO.setSubjectLocation(loc);
-//								userSubVO.setCertStatus(GigTypeEnum.getCertStatusByCode(userSubVO.getGigType(), 0));
-//								userSubVO.setCertStatusDisplay(String.format("%s:%s", userSubVO.getSubjectLocation().getDescription(), GigTypeEnum.getCertStatusNameByCode(userSubVO.getGigType(), 0)));
-//								return userSubVO;
-//							}
-//					).collect(Collectors.toList());
-//					certList.addAll(subVOS);
-
 					// 该企业配置的所有税源地
 					List<SubjectLocation> subjectLocationList = subList.stream().map(SysDeptSub::getSubjectLocation).collect(Collectors.toList());
 

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

@@ -0,0 +1,424 @@
+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.config.UpmsConfig;
+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;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+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;
+import java.util.stream.Collectors;
+
+/**
+ * 试卷前端控制器
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-16 16:03
+ */
+@Slf4j
+@RestController
+@AllArgsConstructor
+public class WmQuizController {
+
+	private final SysUserService userService;
+	private final WmQuizService quizService;
+	private final WmQuizItemService quizItemService;
+	private final WmQuestionService questionService;
+	private final UpmsConfig upmsConfig;
+
+	// ~ 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() {
+
+		return R.ok(quizService.listEntQuizzes(SecurityUtils.getUser().getDeptId(), UpmsState.QuizState.RELEASE));
+	}
+
+	/**
+	 * 获取平台可用的试卷
+	 *
+	 * @return 可用试卷列表
+	 */
+	@GetMapping(value = "/quiz/plt/avail/list")
+	public R<List<WmQuiz>> listPltQuizzes() {
+
+		return R.ok(quizService.listEntQuizzes(upmsConfig.getPltEntId(), UpmsState.QuizState.RELEASE));
+	}
+
+	/**
+	 * 发布试卷
+	 *
+	 * @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) {
+
+		WmQuiz.Expand expand = resource.getExpand();
+
+		if (expand != null) {
+			quizService.checkQuizExpand(expand, resource.getSn());
+		}
+
+
+		Boolean succ = quizService.updateQuiz(resource, SecurityUtils.getUser());
+
+		return succ ? R.ok(true, "更新试卷信息成功") : R.failed(false, "更新试卷信息失败");
+	}
+
+	/**
+	 * 中止试卷
+	 *
+	 * @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 =========
+
+	/**
+	 * 获取试卷项信息
+	 *
+	 * @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<WmQuizItem> createQuizItem(@Valid @RequestBody WmQuizDTO.OnItemCreate resource) {
+
+		WmQuizItem item = quizItemService.createItem(resource, SecurityUtils.getUser());
+
+		return item != null ? R.ok(item, "添加试卷项成功") : R.failed(null, "添加试卷项失败");
+	}
+
+	/**
+	 * 批量创建试卷项(添加试题)
+	 *
+	 * @param resources 试卷项信息
+	 * @return 创建结果
+	 */
+	@SysLog("批量创建试卷项(添加试题)")
+	@PostMapping(value = "/quiz/item/batch/create")
+	public R<List<WmQuizItem>> createQuizItems(@Valid @RequestBody List<WmQuizDTO.OnItemCreate> resources) {
+
+		List<WmQuizItem> items = quizItemService.createItems(resources, SecurityUtils.getUser());
+
+		return CollUtil.isNotEmpty(items) ? R.ok(items, "批量添加试卷项成功") : R.failed(items, "批量添加试卷项失败");
+	}
+
+	/**
+	 * 更新试卷项
+	 *
+	 * @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 =========
+
+	/**
+	 * 获取试题详情
+	 *
+	 * @param questionId 试题ID
+	 * @param sn         试题编号
+	 * @return 详情
+	 */
+	@GetMapping(value = "/quiz/question/details")
+	public R<WmQuestion> getQuestionDetails(@RequestParam(value = "questionId", required = false) Integer questionId,
+											@RequestParam(value = "sn", required = false) String sn) {
+
+		if (questionId == null && StrUtil.isBlank(sn)) {
+			log.error("试题编号或者ID缺失");
+			throw new BizException("试题编号或者ID缺失");
+		}
+
+		WmQuestion item = questionService.getQuestionDetails(questionId, sn);
+		return R.ok(item);
+
+	}
+
+	/**
+	 * 获取试题分页
+	 *
+	 * @param current 当前页
+	 * @param size    每页记录数
+	 * @param label   试题标题
+	 * @return 分页结果
+	 */
+	@GetMapping(value = "/quiz/question/page")
+	public R<Page<?>> pageQuestions(@RequestParam(value = "current", defaultValue = "1") Integer current,
+									@RequestParam(value = "size", defaultValue = "20") Integer size,
+									@RequestParam(value = "label", required = false) String label) {
+
+		HnqzUser operator = SecurityUtils.getUser();
+
+		// 获取试题信息
+		Page<WmQuestion> itemPage = questionService.pageQuestions(current, size, operator.getDeptId(), label);
+
+		List<WmQuestion> records = itemPage.getRecords();
+
+		// 不存在试题的情况
+		if (CollUtil.isEmpty(records)) {
+			return R.ok(itemPage);
+		}
+		// 封装包含创建人的实体信息
+		else {
+			Set<String> usernames = records.stream().map(WmQuestion::getCreateBy).collect(Collectors.toSet());
+
+			Map<String, List<SysUser>> users = userService.mapUsersByUsername(usernames);
+
+			List<WmQuizVO.ToQuestionPageVO> vos = records.stream().map(item -> {
+				WmQuizVO.ToQuestionPageVO vo = new WmQuizVO.ToQuestionPageVO();
+				vo.setLabel(item.getLabel());
+				vo.setCreateTime(item.getCreateTime());
+				vo.setDetails(item);
+				SysUser sysUser = users.get(item.getCreateBy()).get(0);
+				vo.setCreateBy(sysUser == null ? "" : sysUser.getRealname());
+				return vo;
+			}).collect(Collectors.toList());
+
+			Page<WmQuizVO.ToQuestionPageVO> pages = new Page<>();
+			pages.setCurrent(current);
+			pages.setSize(size);
+			pages.setPages(itemPage.getPages());
+			pages.setRecords(vos);
+			pages.setTotal(itemPage.getTotal());
+
+			return R.ok(pages);
+		}
+
+	}
+
+	/**
+	 * 创建试题
+	 *
+	 * @param resource 试卷项内容
+	 * @return 创建结果
+	 */
+	@SysLog("创建试题")
+	@PostMapping(value = "/quiz/question/create")
+	public R<Boolean> createQuestion(@Valid @RequestBody WmQuizDTO.OnQuestionCreate resource) {
+
+		HnqzUser operator = SecurityUtils.getUser();
+		Boolean passed = questionService.checkQuestion(operator, resource.getLabel(), null);
+
+		if (!passed) {
+			String errorMsg = String.format("存在标题重复的试题,[%s]", resource.getLabel());
+			log.error(errorMsg);
+			throw new BizException(errorMsg);
+		}
+
+		Boolean succ = questionService.createQuestion(resource, operator);
+		return succ ? R.ok(true, "添加试题成功") : R.failed(false, "添加试题失败");
+	}
+
+	/**
+	 * 更新试题
+	 *
+	 * @param resource 试卷项
+	 * @return 更新结果
+	 */
+	@SysLog("更新试题")
+	@PostMapping(value = "/quiz/question/update")
+	public R<Boolean> updateQuestion(@Valid @RequestBody WmQuizDTO.OnQuestionUpdate resource) {
+
+		HnqzUser operator = SecurityUtils.getUser();
+		Boolean passed = questionService.checkQuestion(operator, resource.getLabel(), resource.getQuestionId());
+		if (!passed) {
+			String errorMsg = String.format("存在标题重复的试题,[%s]", resource.getLabel());
+			log.error(errorMsg);
+			throw new BizException(errorMsg);
+		}
+		Boolean succ = questionService.updateQuestion(resource, operator);
+		return succ ? R.ok(true, "更新试题成功") : R.failed(false, "更新试题失败");
+
+	}
+
+	/**
+	 * 删除问题
+	 *
+	 * @param resource 问题信息
+	 * @return 删除结果
+	 */
+	@SysLog(value = "删除问题")
+	@PostMapping(value = "/quiz/question/del")
+	public R<Boolean> deleteQuestion(@Valid @RequestBody WmQuizDTO.OnQuestionDel resource) {
+		Boolean deleted = questionService.deleteQuestion(resource);
+		return deleted ? R.ok(true, "删除试题成功") : R.failed(false, "删除试题失败");
+	}
+
+}

File diff suppressed because it is too large
+ 182 - 316
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmScorePackageController.java


+ 103 - 116
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmScorePackageStatusController.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.controller;
 
 import cn.hutool.core.collection.CollectionUtil;
@@ -53,35 +36,32 @@ import java.util.stream.Collectors;
 /**
  * 积分包状态
  *
- * @author pigx code generator
  * @date 2020-07-17 23:32:01
  */
 @RestController
 @AllArgsConstructor
-@RequestMapping("/wmscorepackagestatus" )
-@Api(value = "wmscorepackagestatus", tags = "积分包状态管理")
+@RequestMapping("/wmscorepackagestatus")
 public class WmScorePackageStatusController {
 
-    private final  WmScorePackageStatusService wmScorePackageStatusService;
+	private final WmScorePackageStatusService wmScorePackageStatusService;
 	private final WmScorePackageService wmScorePackageService;
 	private final WmTeamService wmTeamService;
 
 	/**
-     * 分页查询
-     * @param page 分页对象
-     * @param wmScorePackageStatus 积分包状态
-     * @return
-     */
-    @ApiOperation(value = "分页查询", notes = "分页查询")
-    @GetMapping("/page" )
-    public R getWmScorePackageStatusPage(Page page, WmScorePackageStatus wmScorePackageStatus) {
-		OrderItem orderItem=new OrderItem();
+	 * 分页查询
+	 *
+	 * @param page                 分页对象
+	 * @param wmScorePackageStatus 积分包状态
+	 * @return 领包记录分页
+	 */
+	@GetMapping("/page")
+	public R<?> getWmScorePackageStatusPage(Page page, WmScorePackageStatus wmScorePackageStatus) {
+		OrderItem orderItem = new OrderItem();
 		orderItem.setColumn("create_time");
 		orderItem.setAsc(false);
 		page.addOrder(orderItem);
 		Integer userId = SecurityUtils.getUser().getId();
 		Integer deptId = SecurityUtils.getUser().getDeptId();
-//		wmScorePackageStatus.setUserId(String.valueOf(userId));
 		wmScorePackageStatus.setDeptId(String.valueOf(deptId));
 		// 判断当前用户是否配置了团队负责人
 		List<WmTeam> teamList = wmTeamService.list(Wrappers.<WmTeam>lambdaQuery()
@@ -94,86 +74,90 @@ public class WmScorePackageStatusController {
 			List<String> teamIdList = teamList.stream().map(wmTeam -> String.valueOf(wmTeam.getId())).collect(Collectors.toList());
 			wmScorePackageStatus.setTeamIdList(teamIdList);
 		}
-        return R.ok(wmScorePackageStatusService.getWmScorePackageStatusPage(page, wmScorePackageStatus));
-    }
-
-
-    /**
-     * 通过id查询积分包状态
-     * @param id id
-     * @return R
-     */
-    @ApiOperation(value = "通过id查询", notes = "通过id查询")
-    @GetMapping("/{id}" )
-    public R getById(@PathVariable("id" ) Integer id) {
-        return R.ok(wmScorePackageStatusService.getById(id));
-    }
-
-    /**
-     * 新增积分包状态
-     * @param wmScorePackageStatus 积分包状态
-     * @return R
-     */
-    @ApiOperation(value = "新增积分包状态", notes = "新增积分包状态")
-    @SysLog("新增积分包状态" )
-    @PostMapping
-    public R save(@RequestBody WmScorePackageStatus wmScorePackageStatus) {
+		return R.ok(wmScorePackageStatusService.getWmScorePackageStatusPage(page, wmScorePackageStatus));
+	}
+
+
+	/**
+	 * 通过id查询积分包状态
+	 *
+	 * @param id id
+	 * @return R
+	 */
+	@ApiOperation(value = "通过id查询", notes = "通过id查询")
+	@GetMapping("/{id}")
+	public R getById(@PathVariable("id") Integer id) {
+		return R.ok(wmScorePackageStatusService.getById(id));
+	}
+
+	/**
+	 * 新增积分包状态
+	 *
+	 * @param wmScorePackageStatus 积分包状态
+	 * @return R
+	 */
+	@ApiOperation(value = "新增积分包状态", notes = "新增积分包状态")
+	@SysLog("新增积分包状态")
+	@PostMapping
+	public R save(@RequestBody WmScorePackageStatus wmScorePackageStatus) {
 		wmScorePackageStatus.setCreateTime(LocalDateTime.now());
-        return R.ok(wmScorePackageStatusService.save(wmScorePackageStatus));
-    }
-
-    /**
-     * 修改积分包状态
-     * @param wmScorePackageStatus 积分包状态
-     * @return R
-     */
-    @ApiOperation(value = "修改积分包状态", notes = "修改积分包状态")
-    @SysLog("修改积分包状态" )
-    @PutMapping
-    public R updateById(@RequestBody WmScorePackageStatus wmScorePackageStatus) {
-			boolean answer=wmScorePackageStatusService.updateById(wmScorePackageStatus);
-			if(answer)
-			{
-				WmScorePackage wmScorePackage=wmScorePackageService.getById(wmScorePackageStatus.getPackageId());
-				if("2".equals(wmScorePackageStatus.getStatus())) {
-					wmScorePackage.setZbId(wmScorePackageStatus.getUserId());
-					wmScorePackage.setPackageStatus("2");
-					wmScorePackage.setUpdateTime(LocalDateTime.now());
-					wmScorePackage.setReceiveDate(LocalDateTime.now());
-					wmScorePackage.setIsConduct("1");
-				}else{
-					wmScorePackage.setPackageStatus(null);
-					wmScorePackage.setIsConduct(null);
-				}
-				wmScorePackageService.updateById(wmScorePackage);
+		return R.ok(wmScorePackageStatusService.save(wmScorePackageStatus));
+	}
 
+	/**
+	 * 修改积分包状态
+	 *
+	 * @param wmScorePackageStatus 积分包状态
+	 * @return R
+	 */
+	@ApiOperation(value = "修改积分包状态", notes = "修改积分包状态")
+	@SysLog("修改积分包状态")
+	@PutMapping
+	public R updateById(@RequestBody WmScorePackageStatus wmScorePackageStatus) {
+		boolean answer = wmScorePackageStatusService.updateById(wmScorePackageStatus);
+		if (answer) {
+			WmScorePackage wmScorePackage = wmScorePackageService.getById(wmScorePackageStatus.getPackageId());
+			if ("2".equals(wmScorePackageStatus.getStatus())) {
+				wmScorePackage.setZbId(wmScorePackageStatus.getUserId());
+				wmScorePackage.setPackageStatus("2");
+				wmScorePackage.setUpdateTime(LocalDateTime.now());
+				wmScorePackage.setReceiveDate(LocalDateTime.now());
+				wmScorePackage.setIsConduct("1");
+			} else {
+				wmScorePackage.setPackageStatus(null);
+				wmScorePackage.setIsConduct(null);
 			}
-        return R.ok();
-    }
-
-    /**
-     * 通过id删除积分包状态
-     * @param id id
-     * @return R
-     */
-    @ApiOperation(value = "通过id删除积分包状态", notes = "通过id删除积分包状态")
-    @SysLog("通过id删除积分包状态" )
-    @DeleteMapping("/{id}" )
-    public R removeById(@PathVariable Integer id) {
-        return R.ok(wmScorePackageStatusService.removeById(id));
-    }
+			wmScorePackageService.updateById(wmScorePackage);
+
+		}
+		return R.ok();
+	}
+
+	/**
+	 * 通过id删除积分包状态
+	 *
+	 * @param id id
+	 * @return R
+	 */
+	@ApiOperation(value = "通过id删除积分包状态", notes = "通过id删除积分包状态")
+	@SysLog("通过id删除积分包状态")
+	@DeleteMapping("/{id}")
+	public R removeById(@PathVariable Integer id) {
+		return R.ok(wmScorePackageStatusService.removeById(id));
+	}
 
 
 	/**
 	 * 接单审核--分页查询
-	 * @param page 分页对象
+	 *
+	 * @param page                 分页对象
 	 * @param wmScorePackageStatus 积分包状态
-	 * @return
+	 * @return 分页结果
 	 */
 	@ApiOperation(value = "分页查询", notes = "分页查询")
-	@GetMapping("/getPage" )
-	public R getPage(Page page, WmScorePackageStatus wmScorePackageStatus){
-		if(StringUtil.isEmpty(wmScorePackageStatus.getPackageId())){
+	@GetMapping("/getPage")
+	public R<?> getPage(Page page, WmScorePackageStatus wmScorePackageStatus) {
+		if (StringUtil.isEmpty(wmScorePackageStatus.getPackageId())) {
 			return R.failed("未查询到积分包id");
 		}
 		return wmScorePackageStatusService.getPage(page, wmScorePackageStatus);
@@ -181,30 +165,32 @@ public class WmScorePackageStatusController {
 
 	/**
 	 * 接单审核--同意
+	 *
 	 * @param wmScorePackageStatus
 	 * @return
 	 */
 	@PostMapping("/approvalStatus")
-	public R approvalStatus(@RequestBody WmScorePackageStatus wmScorePackageStatus){
-		if(wmScorePackageStatus.getId()==null){
+	public R approvalStatus(@RequestBody WmScorePackageStatus wmScorePackageStatus) {
+		if (wmScorePackageStatus.getId() == null) {
 			return R.failed("缺少参数ID");
 		}
-		if(StringUtil.isEmpty(wmScorePackageStatus.getStatus())){
+		if (StringUtil.isEmpty(wmScorePackageStatus.getStatus())) {
 			return R.failed("缺少参数:审批意见");
 		}
-		return wmScorePackageStatusService.approvalStatus( wmScorePackageStatus);
+		return wmScorePackageStatusService.approvalStatus(wmScorePackageStatus);
 	}
 
 	/**
 	 * 批量接单审核
+	 *
 	 * @param statusBatch 批量审批信息
 	 */
 	@PutMapping("/approvalStatus/batch")
-	public R approvalStatusBatch(@RequestBody WmScorePackageStatusBatch statusBatch){
-		if(StrUtil.isEmpty(statusBatch.getBatchIds())){
+	public R approvalStatusBatch(@RequestBody WmScorePackageStatusBatch statusBatch) {
+		if (StrUtil.isEmpty(statusBatch.getBatchIds())) {
 			return R.failed("缺少参数ID");
 		}
-		if(statusBatch.getStatus() == null){
+		if (statusBatch.getStatus() == null) {
 			return R.failed("缺少参数:审批意见");
 		}
 		return R.ok(wmScorePackageStatusService.approvalStatusBatch(statusBatch));
@@ -212,11 +198,12 @@ public class WmScorePackageStatusController {
 
 	/**
 	 * 获取批量审核的校验信息
+	 *
 	 * @param ids
 	 * @return
 	 */
 	@GetMapping(value = "/approvalStatus/checkout")
-	public R approvalStatusCheckout(@RequestParam(value = "ids") String ids){
+	public R approvalStatusCheckout(@RequestParam(value = "ids") String ids) {
 
 		// 获取id
 		List<String> idList = StrUtil.split(ids, StrUtil.COMMA);
@@ -249,7 +236,7 @@ public class WmScorePackageStatusController {
 
 		int operation = 0;
 		int remain = 0;
-		for (Map.Entry<String,List<WmScorePackageStatus>>entry : map.entrySet()){
+		for (Map.Entry<String, List<WmScorePackageStatus>> entry : map.entrySet()) {
 
 			String packageId = entry.getKey();
 			Set<Integer> tempIds = entry.getValue().stream().mapToInt(WmScorePackageStatus::getId).boxed().collect(Collectors.toSet());
@@ -257,7 +244,7 @@ public class WmScorePackageStatusController {
 			tempIds.retainAll(idSet);
 			Integer userNum = userNumMap.get(packageId) == null ? 1 : userNumMap.get(packageId);
 
-			if (entry.getValue().size() <= userNum){
+			if (entry.getValue().size() <= userNum) {
 
 				operation += tempIds.size();
 
@@ -269,7 +256,7 @@ public class WmScorePackageStatusController {
 
 		Map<String, Integer> result = new HashMap<>(2);
 		result.put("operation", operation);
-		result.put("remain",remain);
+		result.put("remain", remain);
 
 		return R.ok(result);
 
@@ -279,14 +266,14 @@ public class WmScorePackageStatusController {
 	 * 终止接单--区分全部收回,和部分收回
 	 *
 	 * @param wmScorePackageStatus 终止接单
-	 * enableType 1全部收回,2部分收回
+	 *                             enableType 1全部收回,2部分收回
 	 * @return R
 	 */
 	@ApiOperation(value = "终止接单", notes = "终止接单")
-	@SysLog("终止接单" )
+	@SysLog("终止接单")
 	@GetMapping("updateZZ")
-	public R updateZZ( WmScorePackageStatus wmScorePackageStatus) {
-		if(StringUtil.isEmpty(wmScorePackageStatus.getId()+"")){
+	public R updateZZ(WmScorePackageStatus wmScorePackageStatus) {
+		if (StringUtil.isEmpty(wmScorePackageStatus.getId() + "")) {
 			return R.failed("缺少参数");
 		}
 		return wmScorePackageStatusService.updateZZ(wmScorePackageStatus);

+ 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.constant.UpmsType;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmReportOpt;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
@@ -575,6 +559,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, "不能操作"),

+ 12 - 41
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/WmScorePackageStatus.java

@@ -1,120 +1,88 @@
-/*
- *    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.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.qunzhixinxi.hnqz.admin.api.model.WmQuizResultModel;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
-import java.io.Serializable;
 import java.time.LocalDateTime;
 import java.util.List;
 
 /**
- * 积分包状态
+ * 领包记录
  *
- * @author pigx code generator
  * @date 2020-07-17 23:32:01
  */
 @Data
-@TableName("wm_score_package_status")
 @EqualsAndHashCode(callSuper = true)
-@ApiModel(value = "积分包状态")
+@TableName(value = "wm_score_package_status", autoResultMap = true)
 public class WmScorePackageStatus extends Model<WmScorePackageStatus> {
+
 	private static final long serialVersionUID = 1L;
 
 	/**
 	 * id
 	 */
 	@TableId
-	@ApiModelProperty(value = "id")
 	private Integer id;
 
 	/**
 	 * 用户id
 	 */
-	@ApiModelProperty(value = "用户id")
 	private String userId;
 
 	/**
 	 * 积分包id
 	 */
-	@ApiModelProperty(value = "积分包id")
 	private String packageId;
 
 	/**
 	 * 积分包状态
 	 */
-	@ApiModelProperty(value = "领取后的审核状态")
 	private String status;
 
-
 	/**
 	 * 组织机构ID
 	 */
-	@ApiModelProperty(value = "组织机构ID")
 	private String deptId;
 
 	/**
 	 * 是否删除
 	 */
-	@ApiModelProperty(value = "是否删除")
 	private String delFlag;
 
 	/**
 	 * 是否禁用
 	 */
-	@ApiModelProperty(value = "是否禁用")
 	private String enableFlag;
 
 	/**
 	 * 所属租户
 	 */
-	@ApiModelProperty(value = "所属租户", hidden = true)
 	private Integer tenantId;
 
 	/**
 	 * 创建时间
 	 */
-	@ApiModelProperty(value = "创建时间")
 	private LocalDateTime createTime;
 
 	/**
 	 * 创建人
 	 */
-	@ApiModelProperty(value = "创建人")
 	private Integer createUser;
 
 	/**
 	 * 更新时间
 	 */
-	@ApiModelProperty(value = "更新时间")
 	private LocalDateTime updateTime;
 
 	/**
 	 * 更新人
 	 */
-	@ApiModelProperty(value = "更新人")
 	private Integer updateUser;
 
 	/**
@@ -132,25 +100,21 @@ public class WmScorePackageStatus extends Model<WmScorePackageStatus> {
 	/**
 	 * 个人预计包值
 	 */
-	@ApiModelProperty(value = "个人预计包值")
 	private String userScore;
 
 	/**
 	 * 终止方式
 	 */
-	@ApiModelProperty(value = "终止方式")
 	private String enableType;
 
 	/**
 	 * 是否可以继续添加任务,0:不可添加任务,1:可以添加任务
 	 */
-	@ApiModelProperty(value = "是否可以继续添加任务")
 	private String taskAddFlag;
 
 	/**
 	 * 任务数量
 	 */
-	@ApiModelProperty(value = "任务数量")
 	private Integer taskNum;
 
 	/**
@@ -182,4 +146,11 @@ public class WmScorePackageStatus extends Model<WmScorePackageStatus> {
 	 */
 	@TableField(exist = false)
 	private String packageSn;
+
+	/**
+	 * 试卷结果
+	 */
+	@TableField(value = "quiz_res", typeHandler = JacksonTypeHandler.class)
+	private WmQuizResultModel[] quizResult;
+
 }

+ 4 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/input/WmScorePackageApiOutput.java

@@ -1,8 +1,10 @@
 package com.qunzhixinxi.hnqz.admin.entity.input;
 
+import com.qunzhixinxi.hnqz.admin.api.entity.WmPkgQuizRelation;
 import lombok.Data;
 
 import java.time.LocalDateTime;
+import java.util.List;
 
 /**
  *
@@ -68,4 +70,6 @@ public class WmScorePackageApiOutput {
 
 	private String packageSn;
 
+	List<WmPkgQuizRelation> quizRelations;
+
 }

+ 1 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysUserMapper.java

@@ -31,6 +31,7 @@ import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * <p>

+ 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> {
+}

+ 16 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmPlatformQuizTestResultMapper.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.WmPlatformQuizTestResult;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * WmPlatformQuizTestResultMapper
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-25 15:43
+ */
+@Mapper
+public interface WmPlatformQuizTestResultMapper extends BaseMapper<WmPlatformQuizTestResult> {
+}

+ 16 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmQuestionMapper.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.WmQuestion;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 试卷项Mapper
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-16 15:49
+ */
+@Mapper
+public interface WmQuestionMapper extends BaseMapper<WmQuestion> {
+}

+ 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> {
+}

+ 16 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmQuizMapper.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.WmQuiz;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 试卷Mapper
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-16 15:51
+ */
+@Mapper
+public interface WmQuizMapper extends BaseMapper<WmQuiz> {
+}

+ 8 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysUserService.java

@@ -162,4 +162,12 @@ public interface SysUserService extends IService<SysUser> {
 	 * @return 结果
 	 */
 	Map<String, String> checkSixtyYearsOld(UserVO userVO);
+
+	/**
+	 * 根据用户名获取用户信息
+	 *
+	 * @param usernames 用户名
+	 * @return 用户信息map
+	 */
+	Map<String, List<SysUser>> mapUsersByUsername(Collection<String> usernames);
 }

+ 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);
+}

+ 45 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmPlatformQuizTestResultService.java

@@ -0,0 +1,45 @@
+package com.qunzhixinxi.hnqz.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmPlatformQuizTestResult;
+import com.qunzhixinxi.hnqz.admin.api.model.WmQuizResultModel;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * WmPlatformQuizTestResultService
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-25 15:44
+ */
+public interface WmPlatformQuizTestResultService extends IService<WmPlatformQuizTestResult> {
+
+	/**
+	 * 获取平台试卷结果
+	 *
+	 * @param userId  用户ID
+	 * @param quizIds 试卷ID
+	 * @return 答题结果
+	 */
+	List<WmPlatformQuizTestResult> listPltQuizResults(Integer userId, List<Integer> quizIds);
+
+	/**
+	 * 获取平台试卷结果
+	 *
+	 * @param userIds  用户ID
+	 * @return 答题结果
+	 */
+	List<WmPlatformQuizTestResult> listPltQuizResults(Collection<Integer> userIds);
+
+	/**
+	 * 用户保存平台试卷测试结果
+	 *
+	 * @param quizResults 试卷结果
+	 * @param user        用户信息
+	 * @return 保存结果
+	 */
+	Boolean createQuizTestResult(WmQuizResultModel[] quizResults, HnqzUser user);
+}

+ 73 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmQuestionService.java

@@ -0,0 +1,73 @@
+package com.qunzhixinxi.hnqz.admin.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qunzhixinxi.hnqz.admin.api.dto.WmQuizDTO;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmQuestion;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+
+/**
+ * 试卷项服务
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-16 15:59
+ */
+public interface WmQuestionService extends IService<WmQuestion> {
+
+	/**
+	 * 校验试卷项
+	 *
+	 * @param operator 操作人
+	 * @param label    标题
+	 * @param itemId   试卷项ID
+	 * @return 校验结果
+	 */
+	Boolean checkQuestion(HnqzUser operator, String label, Integer itemId);
+
+	/**
+	 * 创建试题
+	 *
+	 * @param resource 试题信息
+	 * @param operator 操作人
+	 * @return 创建结果
+	 */
+	Boolean createQuestion(WmQuizDTO.OnQuestionCreate resource, HnqzUser operator);
+
+	/**
+	 * 创建试题
+	 *
+	 * @param resource 试题信息
+	 * @param operator 操作人
+	 * @return 创建结果
+	 */
+	Boolean updateQuestion(WmQuizDTO.OnQuestionUpdate resource, HnqzUser operator);
+
+	/**
+	 * 获取试题分页
+	 *
+	 * @param current 当前页
+	 * @param size    每页记录数
+	 * @param label   标题
+	 * @param entId   企业ID
+	 * @return 分页结果
+	 */
+	Page<WmQuestion> pageQuestions(Integer current, Integer size, Integer entId, String label);
+
+	/**
+	 * 获取试题详情
+	 *
+	 * @param itemId 试题ID
+	 * @param sn     试题唯一序列号
+	 * @return 试题信息
+	 */
+	WmQuestion getQuestionDetails(Integer itemId, String sn);
+
+	/**
+	 * 删除试题
+	 *
+	 * @param resource 试题信息
+	 * @return 删除结果
+	 */
+	Boolean deleteQuestion(WmQuizDTO.OnQuestionDel resource);
+}

+ 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 试卷项
+	 */
+	WmQuizItem createItem(WmQuizDTO.OnItemCreate resource, HnqzUser user);
+
+	/**
+	 * 批量创建试卷项
+	 *
+	 * @param resources 试卷项集合
+	 * @param user      操作人
+	 * @return 试卷项列表
+	 */
+	List<WmQuizItem> 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);
+}

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

@@ -0,0 +1,81 @@
+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.core.constant.enums.UpmsState;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 试卷服务
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @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);
+
+	/**
+	 * 更新试卷
+	 *
+	 * @param resource 试卷信息
+	 * @param user     操作人
+	 * @return 更新结果
+	 */
+	Boolean updateQuiz(WmQuizDTO.OnQuizUpdate resource, HnqzUser user);
+
+	/**
+	 * 校验试卷信息
+	 *
+	 * @param expand    试卷统计信息
+	 * @param serialNum 序列号
+	 */
+	void checkQuizExpand(WmQuiz.Expand expand, String serialNum);
+
+	/**
+	 * 获取企业的试卷
+	 *
+	 * @param entId     企业ID
+	 * @param quizState 试卷状态
+	 * @return 试卷列表
+	 */
+	List<WmQuiz> listEntQuizzes(Integer entId, UpmsState.QuizState quizState);
+}

+ 8 - 22
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmScorePackageStatusService.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.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -39,9 +22,11 @@ import java.util.Map;
  */
 public interface WmScorePackageStatusService extends IService<WmScorePackageStatus> {
 
-	R getPage(Page page, WmScorePackageStatus wmScorePackageStatus);
-	R approvalStatus(WmScorePackageStatus wmScorePackageStatus);
-	R updateZZ(WmScorePackageStatus wmScorePackageStatus);
+	R<?> getPage(Page page, WmScorePackageStatus wmScorePackageStatus);
+
+	R<?> approvalStatus(WmScorePackageStatus wmScorePackageStatus);
+
+	R<?> updateZZ(WmScorePackageStatus wmScorePackageStatus);
 
 	List<WmScorePackageStatus> getByPackageId(WmScorePackageStatus wmScorePackageStatus);
 
@@ -58,7 +43,7 @@ public interface WmScorePackageStatusService extends IService<WmScorePackageStat
 	/**
 	 * 获取当前部门已接单人的列表
 	 *
-	 * @param deptId 部门id
+	 * @param deptId       部门id
 	 * @param packageType1 积分包任务类型1
 	 * @param packageType2 积分包任务类型2
 	 * @return
@@ -67,8 +52,9 @@ public interface WmScorePackageStatusService extends IService<WmScorePackageStat
 
 	/**
 	 * 批量审核
+	 *
 	 * @param statusBatch 批量审核
 	 * @return 批量审核结果
 	 */
-	Map<String,Integer> approvalStatusBatch(WmScorePackageStatusBatch statusBatch);
+	Map<String, Integer> approvalStatusBatch(WmScorePackageStatusBatch statusBatch);
 }

+ 18 - 23
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysUserServiceImpl.java

@@ -1,22 +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.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
@@ -127,10 +108,6 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
 	private final TaxHelperService taxHelperService;
 
-	private final WmDaAgentMapper wmDaAgentMapper;
-
-	private final WmDaDrugEntMapper wmDaDrugEntMapper;
-
 	private final SysCertResultRecordMapper sysCertResultRecordMapper;
 
 	private final SysUserSubMapper sysUserSubMapper;
@@ -273,6 +250,24 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 		return result;
 	}
 
+	/**
+	 * 根据用户名获取用户信息
+	 *
+	 * @param usernames 用户名
+	 * @return 用户信息map
+	 */
+	@Override
+	public Map<String, List<SysUser>> mapUsersByUsername(Collection<String> usernames) {
+
+		if (CollUtil.isEmpty(usernames)){
+			return Collections.emptyMap();
+		}
+
+		List<SysUser> sysUsers = this.list(Wrappers.<SysUser>lambdaQuery().in(SysUser::getUsername, usernames));
+
+		return sysUsers.stream().collect(Collectors.groupingBy(SysUser::getUsername));
+	}
+
 	/**
 	 * 封装错误信息
 	 *

+ 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();
+	}
+}

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

@@ -0,0 +1,104 @@
+package com.qunzhixinxi.hnqz.admin.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ArrayUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmPlatformQuizTestResult;
+import com.qunzhixinxi.hnqz.admin.api.model.WmQuizResultModel;
+import com.qunzhixinxi.hnqz.admin.mapper.WmPlatformQuizTestResultMapper;
+import com.qunzhixinxi.hnqz.admin.service.WmPlatformQuizTestResultService;
+import com.qunzhixinxi.hnqz.common.core.exception.BizException;
+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.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * WmPlatformQuizTestResultServiceImpl
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-25 15:44
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class WmPlatformQuizTestResultServiceImpl extends ServiceImpl<WmPlatformQuizTestResultMapper, WmPlatformQuizTestResult> implements WmPlatformQuizTestResultService {
+
+	/**
+	 * 获取平台试卷结果
+	 *
+	 * @param userId  用户ID
+	 * @param quizIds 试卷ID
+	 * @return 答题结果
+	 */
+	@Override
+	public List<WmPlatformQuizTestResult> listPltQuizResults(Integer userId, List<Integer> quizIds) {
+
+		List<WmPlatformQuizTestResult> results = this.list(Wrappers.<WmPlatformQuizTestResult>lambdaQuery()
+				.eq(userId != null, WmPlatformQuizTestResult::getUserId, userId)
+				.in(CollUtil.isNotEmpty(quizIds), WmPlatformQuizTestResult::getQuizId, quizIds)
+				.orderByDesc(WmPlatformQuizTestResult::getCreateTime)
+		);
+
+		return CollUtil.isNotEmpty(results) ? results : Collections.emptyList();
+	}
+
+	/**
+	 * 获取平台试卷结果
+	 *
+	 * @param userIds 用户ID
+	 * @return 答题结果
+	 */
+	@Override
+	public List<WmPlatformQuizTestResult> listPltQuizResults(Collection<Integer> userIds) {
+		List<WmPlatformQuizTestResult> results = this.list(Wrappers.<WmPlatformQuizTestResult>lambdaQuery()
+				.in(CollUtil.isNotEmpty(userIds), WmPlatformQuizTestResult::getUserId, userIds)
+				.orderByDesc(WmPlatformQuizTestResult::getCreateTime)
+		);
+
+		return CollUtil.isNotEmpty(results) ? results : Collections.emptyList();
+	}
+
+	/**
+	 * 用户保存平台试卷测试结果
+	 *
+	 * @param quizResults 试卷结果
+	 * @param user        用户信息
+	 * @return 保存结果
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Boolean createQuizTestResult(WmQuizResultModel[] quizResults, HnqzUser user) {
+
+		if (ArrayUtil.isEmpty(quizResults)) {
+			log.error("问卷测试结果缺失");
+			throw new BizException("问卷测试结果缺失");
+		}
+		Integer userId = user.getId();
+		LocalDateTime now = LocalDateTime.now();
+
+		List<WmPlatformQuizTestResult> results = Stream.of(quizResults).map(qr -> {
+			WmPlatformQuizTestResult result = new WmPlatformQuizTestResult();
+			result.setUserId(userId);
+			result.setQuizId(qr.getQuizId());
+			result.setQuizResult(qr);
+			result.setExpiry(now.plusYears(1L).toLocalDate());
+			result.setCreateTime(now);
+
+			return result;
+		}).collect(Collectors.toList());
+
+		return this.saveBatch(results);
+	}
+}

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

@@ -0,0 +1,161 @@
+package com.qunzhixinxi.hnqz.admin.service.impl;
+
+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.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qunzhixinxi.hnqz.admin.api.dto.WmQuizDTO;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmQuestion;
+import com.qunzhixinxi.hnqz.admin.mapper.WmQuestionMapper;
+import com.qunzhixinxi.hnqz.admin.service.WmQuestionService;
+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;
+
+/**
+ * 试题服务实现
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-16 16:01
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class WmQuestionServiceImpl extends ServiceImpl<WmQuestionMapper, WmQuestion> implements WmQuestionService {
+
+	/**
+	 * 校验试题
+	 *
+	 * @param operator   操作人
+	 * @param label      标题
+	 * @param questionId 试题ID
+	 * @return 校验结果
+	 */
+	@Override
+	public Boolean checkQuestion(HnqzUser operator, String label, Integer questionId) {
+
+		int count = this.count(Wrappers.<WmQuestion>lambdaQuery()
+				.eq(WmQuestion::getLabel, label)
+				.eq(WmQuestion::getEnterpriseId, operator.getDeptId())
+				.ne(questionId != null, WmQuestion::getQuestionId, questionId)
+		);
+
+		return count == 0;
+	}
+
+	/**
+	 * 创建试题
+	 *
+	 * @param resource 试题信息
+	 * @param operator 操作人
+	 * @return 创建结果
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Boolean createQuestion(WmQuizDTO.OnQuestionCreate resource, HnqzUser operator) {
+
+		WmQuestion question = new WmQuestion();
+		question.setSerialNumber(IdUtil.fastSimpleUUID());
+		question.setLabel(resource.getLabel());
+		question.setOptions(resource.getOptions());
+		question.setAnswer(resource.getAnswer());
+		question.setEnterpriseId(operator.getDeptId());
+		String username = operator.getUsername();
+		question.setCreateBy(username);
+		question.setUpdateBy(username);
+		LocalDateTime now = LocalDateTime.now();
+		question.setCreateTime(now);
+		question.setUpdateTime(now);
+
+		return this.save(question);
+	}
+
+	/**
+	 * 创建试题
+	 *
+	 * @param resource 试题信息
+	 * @param operator 操作人
+	 * @return 创建结果
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Boolean updateQuestion(WmQuizDTO.OnQuestionUpdate resource, HnqzUser operator) {
+
+		WmQuestion question = new WmQuestion();
+		question.setQuestionId(resource.getQuestionId());
+		question.setUpdateBy(operator.getUsername());
+		question.setUpdateTime(LocalDateTime.now());
+
+		if (StrUtil.isNotBlank(resource.getLabel())) {
+			question.setLabel(resource.getLabel());
+		}
+
+		if (ArrayUtil.isNotEmpty(resource.getOptions())) {
+			question.setOptions(resource.getOptions());
+		}
+
+		if (StrUtil.isNotBlank(resource.getAnswer())) {
+			question.setAnswer(resource.getAnswer());
+		}
+
+		return this.updateById(question);
+	}
+
+	/**
+	 * 获取试题分页
+	 *
+	 * @param current 当前页
+	 * @param size    每页记录数
+	 * @param entId   企业ID
+	 * @param label   标题
+	 * @return 分页结果
+	 */
+	@Override
+	public Page<WmQuestion> pageQuestions(Integer current, Integer size, Integer entId, String label) {
+
+		return this.page(new Page<>(current, size),
+				Wrappers.<WmQuestion>lambdaQuery()
+						.like(StrUtil.isNotBlank(label), WmQuestion::getLabel, label)
+						.eq(entId != null, WmQuestion::getEnterpriseId, entId)
+						.orderByDesc(WmQuestion::getUpdateTime)
+		);
+	}
+
+	/**
+	 * 获取试题详情
+	 *
+	 * @param questionId 试题ID
+	 * @param sn         试题唯一序列号
+	 * @return 试题信息
+	 */
+	@Override
+	public WmQuestion getQuestionDetails(Integer questionId, String sn) {
+
+		if (questionId != null) {
+			return this.getById(questionId);
+		} else if (StrUtil.isNotBlank(sn)) {
+			return this.getOne(Wrappers.<WmQuestion>lambdaQuery().eq(WmQuestion::getSerialNumber, sn));
+		} else {
+			return null;
+		}
+	}
+
+	/**
+	 * 删除试题
+	 *
+	 * @param resource 试题信息
+	 * @return 删除结果
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Boolean deleteQuestion(WmQuizDTO.OnQuestionDel resource) {
+		return this.removeById(resource.getQuestionId());
+	}
+}

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

@@ -0,0 +1,161 @@
+package com.qunzhixinxi.hnqz.admin.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ArrayUtil;
+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 WmQuizItem createItem(WmQuizDTO.OnItemCreate resource, HnqzUser user) {
+		List<WmQuizItem> quizItems = this.createItems(Collections.singletonList(resource), user);
+
+		return CollUtil.isEmpty(quizItems) ? null : quizItems.get(0);
+
+	}
+
+	/**
+	 * 批量创建试卷项
+	 *
+	 * @param resources 试卷项集合
+	 * @param user      操作人
+	 * @return 试卷项列表
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public List<WmQuizItem> createItems(List<WmQuizDTO.OnItemCreate> resources, HnqzUser user) {
+
+		List<WmQuizItem> quizItems = resources.stream().map(item -> {
+			WmQuizItem quizItem = new WmQuizItem();
+			quizItem.setQuizSerialNumber(item.getQuizSerialNum());
+			quizItem.setLabel(item.getLabel());
+			quizItem.setOptions(item.getOptions());
+			quizItem.setAnswer(item.getAnswer());
+			quizItem.setWidget(item.getWidget());
+
+			int mark = item.getMark() == null ? 0 : item.getMark();
+
+			quizItem.setMark(mark);
+			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());
+
+		boolean saved = this.saveBatch(quizItems);
+		return saved ? quizItems : Collections.emptyList();
+	}
+
+	/**
+	 * 更新试卷项
+	 *
+	 * @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());
+		}
+
+		if (resource.getMark() != null) {
+			quizItem.setMark(resource.getMark());
+		}
+
+		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;
+	}
+}

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

@@ -0,0 +1,197 @@
+package com.qunzhixinxi.hnqz.admin.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+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.core.exception.BizException;
+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;
+
+/**
+ * 试卷服务实现
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2023-10-16 15:55
+ */
+@Slf4j
+@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 : "";
+	}
+
+	/**
+	 * 更新试卷
+	 *
+	 * @param resource 试卷信息
+	 * @param user     操作人
+	 * @return 更新结果
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Boolean updateQuiz(WmQuizDTO.OnQuizUpdate resource, HnqzUser user) {
+
+		return this.update(Wrappers.<WmQuiz>lambdaUpdate()
+				.set(StrUtil.isNotBlank(resource.getTitle()), WmQuiz::getTitle, resource.getTitle())
+				.set(StrUtil.isNotBlank(resource.getIntroduction()), WmQuiz::getIntroduction, resource.getIntroduction())
+				.set(resource.getExpand() != null, WmQuiz::getExpand, JSONUtil.toJsonStr(resource.getExpand()))
+				.set(WmQuiz::getUpdateBy, user.getUsername())
+				.set(WmQuiz::getUpdateTime, LocalDateTime.now())
+				.eq(WmQuiz::getSerialNumber, resource.getSn())
+		);
+	}
+
+	/**
+	 * 校验试卷信息
+	 *
+	 * @param serialNum 序列号
+	 * @param expand    试卷统计信息
+	 */
+	@Override
+	public void checkQuizExpand(WmQuiz.Expand expand, String serialNum) {
+		if (expand.getPassingMark() > expand.getTotalMark()) {
+			log.error("通过分数不能大于总分");
+			throw new BizException("通过分数不能大于总分");
+		}
+
+		List<WmQuizItem> items = quizItemService.listItems(serialNum);
+
+		if (expand.getItemQty() != items.size()) {
+			log.error("试卷项和参数值不符");
+			throw new BizException("试卷项和参数值不符");
+		}
+
+		int sum = items.stream().mapToInt(WmQuizItem::getMark).sum();
+
+		if (expand.getTotalMark() != sum) {
+			log.error("总分和参数值不符");
+			throw new BizException("总分和参数值不符");
+		}
+
+	}
+
+	/**
+	 * 获取企业的试卷
+	 *
+	 * @param entId     企业ID
+	 * @param quizState 试卷状态
+	 * @return 试卷列表
+	 */
+	@Override
+	public List<WmQuiz> listEntQuizzes(Integer entId, UpmsState.QuizState quizState) {
+
+		List<WmQuiz> quizzes = this.list(Wrappers.<WmQuiz>lambdaQuery()
+				.eq(WmQuiz::getEnterpriseId, entId)
+				.eq(WmQuiz::getState, quizState));
+
+		return CollUtil.isNotEmpty(quizzes) ? quizzes : Collections.emptyList();
+	}
+}

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

@@ -1,19 +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.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
@@ -39,6 +23,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 +103,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) {
@@ -464,34 +450,38 @@ public class WmScorePackageServiceImpl extends ServiceImpl<WmScorePackageMapper,
 
 	@Override
 	public WmScorePackage selectWmScorePackage(WmScorePackage wmScorePackage) {
+
+		String pkgId = wmScorePackage.getScoreId();
 		wmScorePackage = wmScorePackageMapper.selectByScoreId(wmScorePackage.getScoreId());
-		if (wmScorePackage.getRelationScoreId() == null || wmScorePackage.getRelationScoreId().equals("")) {
+
+		if (StrUtil.isBlank(wmScorePackage.getRelationScoreId())) {
 			wmScorePackage.setRelationScoreId("-1");
 		}
+
 		WmScoreTaskType wmScoreTaskType = new WmScoreTaskType();
-		if (wmScorePackage.getRelationScoreId().equals("-1")) {
-			wmScoreTaskType.setScoreId(wmScorePackage.getId());
-		} else {
-			wmScoreTaskType.setScoreId(wmScorePackage.getRelationScoreId());
-		}
+		wmScoreTaskType.setScoreId("-1".equals(wmScorePackage.getRelationScoreId()) ? wmScorePackage.getId() : wmScorePackage.getRelationScoreId());
 		List<WmScoreTaskType> taskTypeList = wmScoreTaskTypeMapper.listWmScoreTaskType(wmScoreTaskType);
-		Set taskTypeSet = taskTypeList.stream().map(WmScoreTaskType::getTaskTypeId).collect(Collectors.toSet());
+		Set<String> taskTypeSet = taskTypeList.stream().map(WmScoreTaskType::getTaskTypeId).collect(Collectors.toSet());
 		wmScorePackage.setTaskTypeSet(taskTypeSet);
+
+
+		// 查询关联的试卷
+		List<WmPkgQuizRelation> quizRelations = pkgQuizRelationService.listQuizRelationsByPkgIds(Collections.singletonList(Integer.parseInt(pkgId)));
+
+		if (CollUtil.isNotEmpty(quizRelations)){
+
+			List<Integer> quizIds = quizRelations.stream().map(WmPkgQuizRelation::getQuizId).collect(Collectors.toList());
+			List<Integer> relIds = quizRelations.stream().map(WmPkgQuizRelation::getRelationId).collect(Collectors.toList());
+			wmScorePackage.setQuizIds(quizIds);
+			wmScorePackage.setQuizRelationIds(relIds);
+
+		}
+
+		wmScorePackage.setQuizRelations(quizRelations);
+
 		return wmScorePackage;
 	}
 
-	// @Override
-	// public IPage<WmScorePackage> selectWmScorePackageLists(Page page, WmScorePackage wmScorePackage) {
-	// 	OrderItem orderItem = new OrderItem();
-	// 	orderItem.setColumn("create_time");
-	// 	orderItem.setAsc(false);
-	// 	page.addOrder(orderItem);
-	//
-	// 	SysDept sysDept = sysDeptService.getById(SecurityUtils.getUser().getDeptId());
-	// 	wmScorePackage.setSendPackageDeptId(String.valueOf(sysDept.getDeptId()));
-	// 	return wmScorePackageMapper.selectWmScorePackageLists(page, wmScorePackage);
-	// }
-
 	@Override
 	public IPage<WmScorePackage> selectWmScorePackageLists(Page page, WmScorePackage wmScorePackage) {
 		OrderItem orderItem = new OrderItem();
@@ -594,6 +584,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 +947,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(), "新增成功");
 	}
 
 	/**
@@ -1386,14 +1402,11 @@ public class WmScorePackageServiceImpl extends ServiceImpl<WmScorePackageMapper,
 	}
 
 	@Override
-	public R getScorePackagePageById(WmScorePackage wmScorePackage) {
-
-		wmScorePackage = getRemainScore(wmScorePackage.getId());
+	public R<?> getScorePackagePageById(WmScorePackage wmScorePackage) {
 
-		// wmScorePackage = wmScorePackageMapper.getScorePackagePageById(wmScorePackage.getId());
-		//
+		String pkgId = wmScorePackage.getId();
+		wmScorePackage = getRemainScore(pkgId);
 
-		//wmScorePackage=this.getById(wmScorePackage.getId());
 		if (StringUtil.isEmpty(wmScorePackage.getRelationScoreId())) {
 			wmScorePackage.setRelationScoreId("-1");
 		}
@@ -1422,6 +1435,21 @@ public class WmScorePackageServiceImpl extends ServiceImpl<WmScorePackageMapper,
 				wmScorePackage.setUserScore(String.format("%.2f", Integer.parseInt(userScore) / 100.0));
 			}
 		}
+
+		// 查询关联的试卷
+		List<WmPkgQuizRelation> quizRelations = pkgQuizRelationService.listQuizRelationsByPkgIds(Collections.singletonList(Integer.parseInt(pkgId)));
+
+		if (CollUtil.isNotEmpty(quizRelations)){
+
+			List<Integer> quizIds = quizRelations.stream().map(WmPkgQuizRelation::getQuizId).collect(Collectors.toList());
+			List<Integer> relIds = quizRelations.stream().map(WmPkgQuizRelation::getRelationId).collect(Collectors.toList());
+			wmScorePackage.setQuizIds(quizIds);
+			wmScorePackage.setQuizRelationIds(relIds);
+
+		}
+
+		wmScorePackage.setQuizRelations(quizRelations);
+		
 		return R.ok(wmScorePackage);
 	}
 

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

@@ -1,19 +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.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
@@ -69,7 +53,7 @@ public class WmScorePackageStatusServiceImpl extends ServiceImpl<WmScorePackageS
 	private final WmTaskMapper wmTaskMapper;
 
 	@Override
-	public R getPage(Page page, WmScorePackageStatus wmScorePackageStatus) {
+	public R<?> getPage(Page page, WmScorePackageStatus wmScorePackageStatus) {
 		IPage<WmScorePackageStatus> pages=wmScorePackageStatusMapper.getPage(page, wmScorePackageStatus);
 		return R.ok(pages);
 	}

+ 70 - 77
hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/WmScorePackageStatusMapper.xml

@@ -1,56 +1,46 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
-<!--
-  ~
-  ~      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
-  ~
-  -->
-
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
 <mapper namespace="com.qunzhixinxi.hnqz.admin.mapper.WmScorePackageStatusMapper">
 
-  <resultMap id="wmScorePackageStatusMap" type="com.qunzhixinxi.hnqz.admin.entity.WmScorePackageStatus">
-                  <id property="id" column="id"/>
-                        <result property="userId" column="user_id"/>
-                        <result property="packageId" column="package_id"/>
-                        <result property="status" column="status"/>
-                        <result property="deptId" column="dept_id"/>
-                        <result property="delFlag" column="del_flag"/>
-                        <result property="enableFlag" column="enable_flag"/>
-                        <result property="tenantId" column="tenant_id"/>
-                        <result property="createTime" column="create_time"/>
-                        <result property="createUser" column="create_user"/>
-                        <result property="updateTime" column="update_time"/>
-                        <result property="updateUser" column="update_user"/>
-	  					<result property="phone" column="phone"/>
-	  					<result property="userScore" column="user_score"/>
-	 				 	<result property="enableType" column="enable_type"/>
-	 				 	<result property="packageSn" column="package_sn"/>
-	  <result property="taskAddFlag" column="task_add_flag"/>
-	  <result property="taskNum" column="task_num"/>
-
-            </resultMap>
+	<resultMap id="wmScorePackageStatusMap" type="com.qunzhixinxi.hnqz.admin.entity.WmScorePackageStatus">
+		<id property="id" column="id"/>
+		<result property="userId" column="user_id"/>
+		<result property="packageId" column="package_id"/>
+		<result property="status" column="status"/>
+		<result property="deptId" column="dept_id"/>
+		<result property="delFlag" column="del_flag"/>
+		<result property="enableFlag" column="enable_flag"/>
+		<result property="tenantId" column="tenant_id"/>
+		<result property="createTime" column="create_time"/>
+		<result property="createUser" column="create_user"/>
+		<result property="updateTime" column="update_time"/>
+		<result property="updateUser" column="update_user"/>
+		<result property="phone" column="phone"/>
+		<result property="userScore" column="user_score"/>
+		<result property="enableType" column="enable_type"/>
+		<result property="packageSn" column="package_sn"/>
+		<result property="quizResult" column="quiz_res" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
+		<result property="taskAddFlag" column="task_add_flag"/>
+		<result property="taskNum" column="task_num"/>
+	</resultMap>
 
 	<select id="getPage" resultMap="wmScorePackageStatusMap">
-		select u.realname as user_id,u.phone as phone,
+		select u.realname as user_id,
+		u.phone as phone,
 		CONCAT(u.province,'-',u.city ) as address,
 		p.score_package_name as package_id,
-		s.id,s.`status`,s.dept_id,s.del_flag,s.enable_flag,s.create_time
-		,s.enable_type,s.user_id as task_user_id, s.task_num
+		s.id,
+		s.`status`,
+		s.dept_id,
+		s.del_flag,
+		s.enable_flag,
+		s.create_time,
+		s.enable_type,
+		s.user_id as task_user_id,
+		s.quiz_res,
+		s.task_num
 		from wm_score_package_status s
 		left join sys_user u on u.user_id=s.user_id
 		left join wm_score_package p on p.id=s.package_id
@@ -80,7 +70,11 @@
 
 
 	<select id="getByPackageId" resultMap="wmScorePackageStatusMap">
-		select s.id, s.task_num, s.user_score, u.realname as user_id, s.user_id as task_user_id
+		select s.id,
+		s.task_num,
+		s.user_score,
+		u.realname as user_id,
+		s.user_id as task_user_id
 		from wm_score_package_status s
 		left join sys_user u on u.user_id=s.user_id
 		where s.del_flag = '0' and s.enable_flag = '0'
@@ -101,24 +95,24 @@
 
 	<select id="getReceivedPackageList" resultType="com.qunzhixinxi.hnqz.admin.entity.input.WmScorePackageApiOutput">
 		SELECT s.enable_flag,
-		       s.id statusId,
-		       p.id,
-		       p.score_package_name,
-		       p.send_package_dept_id,
-		       s.task_add_flag,
-			   p.create_time,
-		       p.package_type1,
-		       p.user_num,
-		       p.task_num,
-		       p.description,
-		       p.belong_date,
-		       p.pkg_sn as `packageSn`,
-			   p.score,
-		       s.enable_type,
-		       s.status,
-		       s.task_num taskNum2 ,
-		       s.create_time receiveTime,
-		       d.name packageEntName
+		s.id statusId,
+		p.id,
+		p.score_package_name,
+		p.send_package_dept_id,
+		s.task_add_flag,
+		p.create_time,
+		p.package_type1,
+		p.user_num,
+		p.task_num,
+		p.description,
+		p.belong_date,
+		p.pkg_sn as `packageSn`,
+		p.score,
+		s.enable_type,
+		s.status,
+		s.task_num taskNum2 ,
+		s.create_time receiveTime,
+		d.name packageEntName
 		FROM
 		wm_score_package_status s, wm_score_package p , sys_dept d
 		WHERE s.package_id = p.id AND p.send_package_dept_id = d.dept_id
@@ -148,15 +142,17 @@
 	</select>
 
 
-
 	<select id="getWmScorePackageStatusPage" resultMap="wmScorePackageStatusMap">
-		select distinct s.*,p.score_package_name, p.pkg_sn as package_sn, u1.username as phone from wm_score_package_status s
-		left join  wm_score_package p on p.id=s.package_id
+		select distinct s.*,
+		p.score_package_name,
+		p.pkg_sn as package_sn,
+		u1.username as phone from wm_score_package_status s
+		left join wm_score_package p on p.id=s.package_id
 		left join sys_user u on u.dept_id=p.send_package_dept_id
 		left join sys_user u1 on u1.user_id = s.user_id
-		where  s.del_flag=0  and p.del_flag=0
-		  and p.typeid=4
-		  and (p.source_type = '0' or p.source_type is null)
+		where s.del_flag=0 and p.del_flag=0
+		and p.typeid=4
+		and (p.source_type = '0' or p.source_type is null)
 		<if test="query.id!=null and query.id!=''">
 			and s.id=#{query.id}
 		</if>
@@ -189,15 +185,12 @@
 
 	<!-- 获取当前部门已接单人的列表 -->
 	<select id="getDeptReceiveUserList" resultType="java.util.Map">
-		SELECT DISTINCT
-			s.user_id as userId,
-			u.realname as realName
-		FROM
-			wm_score_package_status s
-				LEFT JOIN wm_score_package p ON p.id = s.package_id
-				LEFT JOIN sys_user u ON u.user_id = s.user_id
-		WHERE
-			s.del_flag = 0
+		SELECT DISTINCT s.user_id  AS userid,
+						u.realname AS realname
+		FROM wm_score_package_status s
+				 LEFT JOIN wm_score_package p ON p.id = s.package_id
+				 LEFT JOIN sys_user u ON u.user_id = s.user_id
+		WHERE s.del_flag = 0
 		  AND s.enable_flag = 0
 		  AND s.dept_id = #{deptId}
 		  AND p.package_type1 = #{packageType1}

Some files were not shown because too many files changed in this diff