Browse Source

feat: support to bind drug and quizzes

shc 1 year ago
parent
commit
b4dcf2c465

+ 33 - 0
doc/db/21wm_drug_quiz_rel.sql

@@ -0,0 +1,33 @@
+USE `cnbg_20240511_001`;
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for wm_drug_quiz_rel
+-- ----------------------------
+DROP TABLE IF EXISTS `wm_drug_quiz_rel`;
+CREATE TABLE `wm_drug_quiz_rel`
+(
+    `drug_id`     INT UNSIGNED NOT NULL COMMENT '药品ID',
+    `quiz_id`     INT UNSIGNED NOT NULL COMMENT '试卷ID',
+    `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` (`drug_id`, `quiz_id`) USING BTREE,
+    KEY `idx_qid` (`quiz_id`) USING BTREE
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_general_ci
+  ROW_FORMAT = DYNAMIC COMMENT ='药品试卷关系';
+
+
+-- ----------------------------
+-- Records of wm_drug_quiz_rel
+-- ----------------------------
+BEGIN;
+COMMIT;
+
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 114 - 103
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/WmQuizDTO.java

@@ -15,6 +15,7 @@ import javax.validation.constraints.Min;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.NotNull;
+import java.util.Collection;
 
 
 /**
 /**
  * 试卷dto
  * 试卷dto
@@ -26,151 +27,161 @@ import javax.validation.constraints.NotNull;
 @NoArgsConstructor(access = AccessLevel.NONE)
 @NoArgsConstructor(access = AccessLevel.NONE)
 public final class WmQuizDTO {
 public final class WmQuizDTO {
 
 
-	@Data
-	public static class OnQuizCreate {
+    @Data
+    public static class OnQuizCreate {
 
 
-		/**
-		 * 标题
-		 */
-		@NotBlank(message = "标题必填")
-		@Length(max = 64, message = "标题最大支持字符数{max}")
-		private String title;
+        /**
+         * 标题
+         */
+        @NotBlank(message = "标题必填")
+        @Length(max = 64, message = "标题最大支持字符数{max}")
+        private String title;
 
 
-		/**
-		 * 简介
-		 */
-		private String introduction;
+        /**
+         * 简介
+         */
+        private String introduction;
 
 
-		/**
-		 * 问卷来源类型
-		 */
-		@NotNull(message = "问卷类型必填")
-		private UpmsType.QuizSourceType sourceType;
+        /**
+         * 问卷来源类型
+         */
+        @NotNull(message = "问卷类型必填")
+        private UpmsType.QuizSourceType sourceType;
 
 
-	}
+    }
 
 
-	@Data
-	public static class OnQuizUpdate {
+    @Data
+    public static class OnQuizUpdate {
 
 
-		@NotNull(message = "试卷编号必填")
-		private String sn;
+        @NotNull(message = "试卷编号必填")
+        private String sn;
 
 
-		@Valid
-		private WmQuiz.Expand expand;
+        @Valid
+        private WmQuiz.Expand expand;
 
 
-		/**
-		 * 标题
-		 */
-		@Length(max = 64, message = "标题最大支持字符数{max}")
-		private String title;
+        /**
+         * 标题
+         */
+        @Length(max = 64, message = "标题最大支持字符数{max}")
+        private String title;
 
 
-		/**
-		 * 简介
-		 */
-		private String introduction;
+        /**
+         * 简介
+         */
+        private String introduction;
 
 
-	}
+    }
 
 
-	@Data
-	public static class OnQuizState {
+    @Data
+    public static class OnQuizState {
 
 
-		@NotNull(message = "试卷ID必填")
-		private Integer quizId;
+        @NotNull(message = "试卷ID必填")
+        private Integer quizId;
 
 
-		@NotNull(message = "操作状态必填")
-		private UpmsState.QuizState state;
-	}
+        @NotNull(message = "操作状态必填")
+        private UpmsState.QuizState state;
+    }
 
 
 
 
-	@Data
-	public static class OnItemCreate {
+    @Data
+    public static class OnItemCreate {
 
 
-		@NotBlank(message = "标题必填")
-		private String label;
+        @NotBlank(message = "标题必填")
+        private String label;
 
 
-		@NotBlank(message = "试卷编号")
-		private String quizSerialNum;
+        @NotBlank(message = "试卷编号")
+        private String quizSerialNum;
 
 
-		@NotEmpty(message = "选项不能为空")
-		private WmQuestion.Option[] options;
+        @NotEmpty(message = "选项不能为空")
+        private WmQuestion.Option[] options;
 
 
-		@NotBlank(message = "答案必填")
-		private String answer;
+        @NotBlank(message = "答案必填")
+        private String answer;
 
 
-		@NotNull(message = "排序权重必填")
-		private Long widget;
+        @NotNull(message = "排序权重必填")
+        private Long widget;
 
 
-		@NotNull(message = "分数必填")
-		@Min(value = 0, message = "分数最小为{value}")
-		private Integer mark;
-	}
+        @NotNull(message = "分数必填")
+        @Min(value = 0, message = "分数最小为{value}")
+        private Integer mark;
+    }
 
 
-	@Data
-	public static class OnItemUpdate {
+    @Data
+    public static class OnItemUpdate {
 
 
-		@NotNull(message = "试卷项ID必填")
-		private Integer itemId;
+        @NotNull(message = "试卷项ID必填")
+        private Integer itemId;
 
 
-		private String label;
+        private String label;
 
 
-		private WmQuestion.Option[] options;
+        private WmQuestion.Option[] options;
 
 
-		private String answer;
+        private String answer;
 
 
-		private Long widget;
+        private Long widget;
 
 
-		@Min(value = 0, message = "分数最小为{value}")
-		private Integer mark;
-	}
+        @Min(value = 0, message = "分数最小为{value}")
+        private Integer mark;
+    }
 
 
-	@Data
-	public static class OnItemDelete {
+    @Data
+    public static class OnItemDelete {
 
 
-		@NotNull(message = "试卷项ID必填")
-		private Integer itemId;
-	}
+        @NotNull(message = "试卷项ID必填")
+        private Integer itemId;
+    }
 
 
 
 
-	@Data
-	public static class OnQuestionCreate {
-		@NotBlank(message = "试题标题必填")
-		@Length(max = 64, message = "试卷标题最多{max}个字符")
-		private String label;
+    @Data
+    public static class OnQuestionCreate {
+        @NotBlank(message = "试题标题必填")
+        @Length(max = 64, message = "试卷标题最多{max}个字符")
+        private String label;
 
 
-		@Valid
-		@NotEmpty(message = "试题选项必填")
-		private WmQuestion.Option[] options;
+        @Valid
+        @NotEmpty(message = "试题选项必填")
+        private WmQuestion.Option[] options;
 
 
-		@NotBlank(message = "试题答案必填")
-		@Length(max = 255, message = "试卷标题最多{max}个字符")
-		private String answer;
+        @NotBlank(message = "试题答案必填")
+        @Length(max = 255, message = "试卷标题最多{max}个字符")
+        private String answer;
 
 
-	}
+    }
 
 
-	@Data
-	public static class OnQuestionUpdate {
+    @Data
+    public static class OnQuestionUpdate {
 
 
-		@NotNull(message = "试题ID必填")
-		private Integer questionId;
+        @NotNull(message = "试题ID必填")
+        private Integer questionId;
 
 
-		private String label;
+        private String label;
 
 
-		private WmQuestion.Option[] options;
+        private WmQuestion.Option[] options;
 
 
-		private String answer;
+        private String answer;
 
 
-	}
+    }
 
 
-	@Data
-	public static class OnQuestionDel {
-		@NotNull(message = "试题ID必填")
-		private Integer questionId;
-	}
+    @Data
+    public static class OnQuestionDel {
+        @NotNull(message = "试题ID必填")
+        private Integer questionId;
+    }
 
 
-	@Data
-	public static class OnUserPltTestResultCreate {
-		@NotEmpty(message = "测试结果必填")
-		private WmQuizResultModel[] quizResults;
-	}
+    @Data
+    public static class OnUserPltTestResultCreate {
+        @NotEmpty(message = "测试结果必填")
+        private WmQuizResultModel[] quizResults;
+    }
+
+    @Data
+    public static class OnDrugBind {
+
+        @NotNull(message = "药品ID必填")
+        private Integer drugId;
+
+        @NotEmpty(message = "问卷ID必填")
+        private Collection<Integer> quizIds;
+    }
 
 
 }
 }

+ 32 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmDrugQuizRelation.java

@@ -0,0 +1,32 @@
+package com.qunzhixinxi.hnqz.admin.api.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 药品试卷关系
+ *
+ * @author jimmy
+ * @date 07/07/2024 15:34
+ */
+@Data
+@TableName(value = "wm_drug_quiz_rel")
+public class WmDrugQuizRelation implements Serializable {
+
+    private static final long serialVersionUID = 8155202747309692397L;
+
+    private Integer drugId;
+
+    private Integer quizId;
+
+    private String createBy;
+
+    private String updateBy;
+
+    private LocalDateTime createTime;
+
+    private LocalDateTime updateTime;
+}

+ 33 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmDrugQuizController.java

@@ -0,0 +1,33 @@
+package com.qunzhixinxi.hnqz.admin.controller;
+
+import com.qunzhixinxi.hnqz.admin.api.dto.WmQuizDTO;
+import com.qunzhixinxi.hnqz.admin.service.WmDrugQuizRelationService;
+import com.qunzhixinxi.hnqz.common.core.util.R;
+import com.qunzhixinxi.hnqz.common.log.annotation.SysLog;
+import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 药品试卷前端控制器
+ *
+ * @author jimmy
+ * @date 07/07/2024 15:41
+ */
+@RestController
+@AllArgsConstructor
+public class WmDrugQuizController {
+
+    private final WmDrugQuizRelationService drugQuizRelationService;
+
+    @SysLog("药品问卷绑定")
+    @PostMapping(value = "/drug/quiz/bind")
+    private R<Boolean> bind(@Validated @RequestBody WmQuizDTO.OnDrugBind resource) {
+        return R.ok(drugQuizRelationService.bind(resource, SecurityUtils.getUser()));
+    }
+
+
+}

+ 15 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmDrugQuizRelationMapper.java

@@ -0,0 +1,15 @@
+package com.qunzhixinxi.hnqz.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmDrugQuizRelation;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 药品关联关系mapper
+ *
+ * @author jimmy
+ * @date 07/07/2024 15:37
+ */
+@Mapper
+public interface WmDrugQuizRelationMapper extends BaseMapper<WmDrugQuizRelation> {
+}

+ 24 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmDrugQuizRelationService.java

@@ -0,0 +1,24 @@
+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.WmDrugQuizRelation;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+
+/**
+ * 药品问卷关系服务
+ *
+ * @author jimmy
+ * @date 07/07/2024 15:38
+ */
+public interface WmDrugQuizRelationService extends IService<WmDrugQuizRelation> {
+
+    /**
+     * 药品绑定问卷
+     *
+     * @param resource 绑定信息
+     * @param user     操作人
+     * @return 绑定结果
+     */
+    Boolean bind(WmQuizDTO.OnDrugBind resource, HnqzUser user);
+}

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

@@ -0,0 +1,64 @@
+package com.qunzhixinxi.hnqz.admin.service.impl;
+
+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.WmDrugQuizRelation;
+import com.qunzhixinxi.hnqz.admin.mapper.WmDrugQuizRelationMapper;
+import com.qunzhixinxi.hnqz.admin.service.WmDrugQuizRelationService;
+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.List;
+import java.util.stream.Collectors;
+
+/**
+ * 药品问卷服务实现
+ *
+ * @author jimmy
+ * @date 07/07/2024 15:39
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class WmDrugQuizRelationServiceImpl extends ServiceImpl<WmDrugQuizRelationMapper, WmDrugQuizRelation> implements WmDrugQuizRelationService {
+
+
+    /**
+     * 药品绑定问卷
+     *
+     * @param resource 绑定信息
+     * @param user     操作人
+     * @return 绑定结果
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean bind(WmQuizDTO.OnDrugBind resource, HnqzUser user) {
+
+        LocalDateTime now = LocalDateTime.now();
+        String username = user.getUsername();
+        Integer drugId = resource.getDrugId();
+        // 删除旧的绑定关系
+        this.remove(Wrappers.<WmDrugQuizRelation>lambdaQuery().eq(WmDrugQuizRelation::getDrugId, drugId));
+
+        // 插入新的绑定关系
+
+        List<WmDrugQuizRelation> collect = resource.getQuizIds().stream().distinct().map(quizId -> {
+            WmDrugQuizRelation relation = new WmDrugQuizRelation();
+            relation.setDrugId(drugId);
+            relation.setQuizId(quizId);
+            relation.setCreateBy(username);
+            relation.setUpdateBy(username);
+            relation.setCreateTime(now);
+            relation.setUpdateTime(now);
+            return relation;
+        }).collect(Collectors.toList());
+
+
+        return this.saveBatch(collect);
+    }
+}