Browse Source

feat: 医院拜访科室支持精细化

lixuesong 1 năm trước cách đây
mục cha
commit
2ad66a0d03

+ 6 - 0
db/v2.0/20231114.sql

@@ -0,0 +1,6 @@
+alter table wm_dept_task_type_template
+    add detail json null comment '规则详情' after template;
+
+alter table wm_user_sign_detail
+    add detail json null comment '详情数据';
+

+ 2 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/ApiController.java

@@ -1752,7 +1752,8 @@ public class ApiController {
 	 */
 	@SysLog("新增用户签到表")
 	@PostMapping("/saveSignInfo")
-	public R<?> save(@RequestBody WmUserSign wmUserSign) {
+	public R<?> saveSignInfo(@RequestBody WmUserSign wmUserSign) {
+		log.info("精细化拜访(医院/药店/商业公司打卡)参数:{}", wmUserSign);
 
 		// 重置打卡时间,以系统为准,规避端设备时间不准的问题
 		LocalDateTime now = LocalDateTime.now().plusMinutes(5L);

+ 9 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/WmDeptTaskTypeTemplate.java

@@ -4,6 +4,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.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
 import com.qunzhixinxi.hnqz.admin.entity.base.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -11,6 +12,7 @@ import lombok.EqualsAndHashCode;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import java.time.LocalDateTime;
+import java.util.Map;
 
 /**
  * 部门任务类型模板实体
@@ -20,7 +22,7 @@ import java.time.LocalDateTime;
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
-@TableName("wm_dept_task_type_template")
+@TableName(value = "wm_dept_task_type_template", autoResultMap = true)
 public class WmDeptTaskTypeTemplate extends Model<WmDeptTaskTypeTemplate> {
 
 	/**
@@ -60,6 +62,12 @@ public class WmDeptTaskTypeTemplate extends Model<WmDeptTaskTypeTemplate> {
 	@NotBlank(message = "模板不能为空", groups = {BaseEntity.Create.class, BaseEntity.Update.class})
 	private String template;
 
+	/**
+	 * 规则详情
+	 */
+	@TableField(typeHandler = FastjsonTypeHandler.class)
+	private Map<String, Object> detail;
+
 	/**
 	 * 创建时间
 	 */

+ 14 - 3
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/WmUserSignDetail.java

@@ -4,9 +4,13 @@ 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.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * 用户签到详情实体
  *
@@ -14,9 +18,10 @@ import lombok.EqualsAndHashCode;
  * @date 2022年01月18日 17:45
  */
 @Data
-@TableName("wm_user_sign_detail")
+@TableName(value = "wm_user_sign_detail", autoResultMap = true)
 @EqualsAndHashCode(callSuper = true)
 public class WmUserSignDetail extends Model<WmUserSignDetail> {
+	private static final long serialVersionUID = 832214215288873739L;
 
 	/**
 	 * 主键id
@@ -57,9 +62,15 @@ public class WmUserSignDetail extends Model<WmUserSignDetail> {
 	private String resultName;
 
 	/**
-	 * 拜访科室
+	 * 拜访科室(科室和图片数据冗余存入detail字段)
+	 */
+	private String[] department;
+
+	/**
+	 * 详情数据
 	 */
-	private String department;
+	@TableField(typeHandler = FastjsonTypeHandler.class)
+	private List<Map<String, Object>> detail;
 
 	/**
 	 * 拜访人员

+ 9 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmDeptTaskTypeTemplateService.java

@@ -29,4 +29,13 @@ public interface WmDeptTaskTypeTemplateService extends IService<WmDeptTaskTypeTe
 	 * @return
 	 */
 	List<String> listTaskTypeByDeptId(Integer deptId);
+
+	/**
+	 * 根据部门id和任务类型id查询模板
+	 *
+	 * @param deptId 部门id
+	 * @param taskTypeId 任务类型id
+	 * @return 模板
+	 */
+	List<WmDeptTaskTypeTemplate> getTemplate(Integer deptId, String... taskTypeId);
 }

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

@@ -12,6 +12,7 @@ import org.springframework.stereotype.Service;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * @author lixuesong
@@ -52,4 +53,18 @@ public class WmDeptTaskTypeTemplateServiceImpl extends ServiceImpl<WmDeptTaskTyp
 		}
 		return new ArrayList<>();
 	}
+
+	/**
+	 * 根据部门id和任务类型id查询模板
+	 *
+	 * @param deptId 部门id
+	 * @param taskTypeId 任务类型id
+	 * @return 模板
+	 */
+	@Override
+	public List<WmDeptTaskTypeTemplate> getTemplate(Integer deptId, String... taskTypeId) {
+		return this.list(Wrappers.<WmDeptTaskTypeTemplate>lambdaQuery()
+				.eq(WmDeptTaskTypeTemplate::getDeptId, deptId)
+				.in(WmDeptTaskTypeTemplate::getTaskTypeId, Stream.of(taskTypeId).collect(Collectors.toSet())));
+	}
 }

+ 75 - 12
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmUserSignServiceImpl.java

@@ -32,6 +32,7 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.temporal.ChronoUnit;
 import java.time.temporal.TemporalAdjusters;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
@@ -267,16 +268,7 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 	 * @param pkg        积分包信息
 	 * @return 任务结果
 	 */
-	private WmTask createTask(String taskTypeId, WmUserSign wmUserSign, UserVO userVO, WmScorePackage pkg) {
-
-		// 获取任务类型积分
-		WmTaskType wmTaskType = new WmTaskType();
-		wmTaskType.setTaskTypeName(wmTaskTypeService.getById(taskTypeId).getTaskTypeName());
-		wmTaskType.setRuleId(pkg.getRuleId());
-		int score = wmTaskTypeService.getWmTaskTypeByEnt(wmTaskType);
-		if (score < 0) {
-			throw new BizException("获取任务积分失败");
-		}
+	private WmTask createTask(String taskTypeId, WmUserSign wmUserSign, UserVO userVO, WmScorePackage pkg, int score) {
 
 		// 保存任务详情
 		WmTaskContent wmTaskContent = new WmTaskContent();
@@ -364,9 +356,22 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 		wmScorePackageService.updateById(tWmScorePackage);
 
 		// 如果配置了医院拜访的任务类型模板,则关联保存签到详情
-		if (wmDeptTaskTypeTemplateService.checkDeptIdHospitalTemplate(userVO.getDeptId(), taskTypeId)) {
+		List<WmDeptTaskTypeTemplate> taskTypeTemplates = wmDeptTaskTypeTemplateService.getTemplate(userVO.getDeptId(), taskTypeId);
+		if (CollUtil.isNotEmpty(taskTypeTemplates)) {
 			WmUserSignDetail userSignDetail = wmUserSign.getUserSignDetail();
 			if (userSignDetail != null) {
+				WmDeptTaskTypeTemplate taskTypeTemplate = taskTypeTemplates.get(0);
+				// 医院拜访限制科室个数
+				if (StrUtil.equals(taskTypeTemplate.getTaskTypeId(), "5")) {
+					Map<String, Object> detail = taskTypeTemplate.getDetail();
+					if (CollUtil.isNotEmpty(detail)) {
+						int numberLimit = (int) detail.getOrDefault("numberLimit", 1);
+						// 拜访科室个数和numberLimit 取最小值
+						int minDeptmentLimit = Math.min(numberLimit, userSignDetail.getDepartment().length);
+
+					}
+				}
+
 				userSignDetail.setSignId(wmUserSign.getId());
 				wmUserSignDetailService.save(userSignDetail);
 			}
@@ -647,9 +652,23 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 		// 保存后续操作
 		if (saveSign) {
 
+			// 获取任务类型积分
+			WmTaskType wmTaskType = new WmTaskType();
+			wmTaskType.setTaskTypeName(wmTaskTypeService.getById(taskTypeId).getTaskTypeName());
+			wmTaskType.setRuleId(tWmScorePackage.getRuleId());
+			int score = wmTaskTypeService.getWmTaskTypeByEnt(wmTaskType);
+			if (score < 0) {
+				throw new BizException("获取任务积分失败");
+			}
+
+			// 保存签到详情, 获取任务分值
+			int detailScore = saveSignDetail(wmUserSign, sysU.getDeptId(), taskTypeId, score);
+			log.info("精细化拜访实际任务分值:{}", detailScore);
+
 			// 保存任务
-			WmTask task = createTask(taskTypeId, wmUserSign, sysU, tWmScorePackage);
+			WmTask task = createTask(taskTypeId, wmUserSign, sysU, tWmScorePackage, detailScore);
 			task.setType(tWmScorePackage.getPackageType1());
+
 			// 操作积分包
 			operatePkgAndPkgStatus(tWmScorePackage, packageStatus, sysU, taskTypeId, wmUserSign);
 
@@ -659,5 +678,49 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 		return R.failed("签到保存失败");
 	}
 
+	/**
+	 * 保存签到详情
+	 *
+	 * @param wmUserSign 打卡信息
+	 * @param deptId 部门id
+	 * @param taskTypeId 任务类型id
+	 * @param baseScore 任务类型规则分数
+	 * @return int 任务实际分值(拜访科室数 * 任务类型规则分数)
+	 */
+	private int saveSignDetail(WmUserSign wmUserSign, Integer deptId, String taskTypeId, Integer baseScore) {
+		int minDeptmentLimit = 1;
+		// 如果配置了精细化拜访的任务类型模板,则关联保存签到详情
+		List<WmDeptTaskTypeTemplate> taskTypeTemplates = wmDeptTaskTypeTemplateService.getTemplate(deptId, taskTypeId);
+		if (CollUtil.isNotEmpty(taskTypeTemplates)) {
+			WmUserSignDetail userSignDetail = wmUserSign.getUserSignDetail();
+			if (userSignDetail != null) {
+				WmDeptTaskTypeTemplate taskTypeTemplate = taskTypeTemplates.get(0);
+				// 医院拜访限制科室个数
+				if (StrUtil.equals(taskTypeTemplate.getTaskTypeId(), "5")) {
+					Map<String, Object> detail = taskTypeTemplate.getDetail();
+					if (CollUtil.isNotEmpty(detail)) {
+						int numberLimit = (int) detail.getOrDefault("numberLimit", 1);
+						// 拜访科室个数和numberLimit 取最小值
+						minDeptmentLimit = Math.min(numberLimit, userSignDetail.getDepartment().length);
+					}
+					List<Map<String, Object>> signDetailDetail = userSignDetail.getDetail();
+					if (CollUtil.isNotEmpty(signDetailDetail)) {
+						List<String> departmentList = new ArrayList<>(signDetailDetail.size());
+						for (Map<String, Object> detailMap : signDetailDetail) {
+							String departmentName = (String) detailMap.get("departmentName");
+//							String[] fileUrl = (String[]) detailMap.get("fileUrl");
+							departmentList.add(departmentName);
+						}
+						userSignDetail.setDepartment(departmentList.toArray(new String[0]));
+					}
+				}
+
+				userSignDetail.setSignId(wmUserSign.getId());
+				wmUserSignDetailService.save(userSignDetail);
+			}
+		}
+
+		return baseScore * minDeptmentLimit;
+	}
 
 }