Quellcode durchsuchen

Merge branch 'feat-20231114-hospitalvisits'

lixuesong vor 1 Jahr
Ursprung
Commit
87051c405b

+ 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 '详情数据';
+

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

@@ -2515,8 +2515,24 @@ public class ApiController {
 									}
 								}
 								if (StrUtil.isNotBlank(userSignDetail.getResult())) {
-									userSignDetail.setResultName(UserSignResultEnum.resolve(userSignDetail.getResult()).getName());
+									userSignDetail.setResultName(Objects.requireNonNull(UserSignResultEnum.resolve(userSignDetail.getResult())).getName());
 								}
+
+								// 医院打卡, 兼容历史字段department
+								if ("1".equals(userSign.getSignEntType())) {
+									if (CollUtil.isEmpty(userSignDetail.getDetail()) && ArrayUtil.isNotEmpty(userSignDetail.getDepartment())) {
+										List<Map<String, Object>> detail = new ArrayList<>();
+										for (String dep : userSignDetail.getDepartment()) {
+											Map<String, Object> detailMap = new HashMap<>();
+											detailMap.put("departmentName", dep);
+											detailMap.put("fileUrl", new String[0]);
+											detail.add(detailMap);
+										}
+										userSignDetail.setDetail(detail);
+									}
+									userSignDetail.setDepartment(null);
+								}
+
 								userSign.setUserSignDetail(userSignDetail);
 							}
 						}

+ 16 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmTaskController.java

@@ -1357,6 +1357,22 @@ public class WmTaskController {
 							if (StrUtil.isNotBlank(userSignDetail.getResult())) {
 								userSignDetail.setResultName(UserSignResultEnum.resolve(userSignDetail.getResult()).getName());
 							}
+
+							// 医院打卡, 兼容历史字段department
+							if ("1".equals(userSign.getSignEntType())) {
+								if (CollUtil.isEmpty(userSignDetail.getDetail()) && ArrayUtil.isNotEmpty(userSignDetail.getDepartment())) {
+									List<Map<String, Object>> detail = new ArrayList<>();
+									for (String dep : userSignDetail.getDepartment()) {
+										Map<String, Object> detailMap = new HashMap<>();
+										detailMap.put("departmentName", dep);
+										detailMap.put("fileUrl", new String[0]);
+										detail.add(detailMap);
+									}
+									userSignDetail.setDetail(detail);
+								}
+								userSignDetail.setDepartment(null);
+							}
+
 							userSign.setUserSignDetail(userSignDetail);
 						}
 						wmUserSignList.add(userSign);

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

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

@@ -1402,6 +1402,22 @@ public class WmReportServiceImpl extends ServiceImpl<WmReportMapper, WmReport> i
 							if (StrUtil.isNotBlank(userSignDetail.getResult())) {
 								userSignDetail.setResultName(UserSignResultEnum.resolve(userSignDetail.getResult()).getName());
 							}
+
+							// 医院打卡, 兼容历史字段department
+							if ("1".equals(userSign.getSignEntType())) {
+								if (CollUtil.isEmpty(userSignDetail.getDetail()) && ArrayUtil.isNotEmpty(userSignDetail.getDepartment())) {
+									List<Map<String, Object>> detail = new ArrayList<>();
+									for (String dep : userSignDetail.getDepartment()) {
+										Map<String, Object> detailMap = new HashMap<>();
+										detailMap.put("departmentName", dep);
+										detailMap.put("fileUrl", new String[0]);
+										detail.add(detailMap);
+									}
+									userSignDetail.setDetail(detail);
+								}
+								userSignDetail.setDepartment(null);
+							}
+
 							userSign.setUserSignDetail(userSignDetail);
 						}
 						wmUserSignList.add(userSign);

+ 64 - 19
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();
@@ -363,14 +355,6 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 		tWmScorePackage.setIsConduct("1");
 		wmScorePackageService.updateById(tWmScorePackage);
 
-		// 如果配置了医院拜访的任务类型模板,则关联保存签到详情
-		if (wmDeptTaskTypeTemplateService.checkDeptIdHospitalTemplate(userVO.getDeptId(), taskTypeId)) {
-			WmUserSignDetail userSignDetail = wmUserSign.getUserSignDetail();
-			if (userSignDetail != null) {
-				userSignDetail.setSignId(wmUserSign.getId());
-				wmUserSignDetailService.save(userSignDetail);
-			}
-		}
 	}
 
 
@@ -647,9 +631,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 +657,52 @@ 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();
+					int numberLimit = 1;
+					if (CollUtil.isNotEmpty(detail)) {
+						numberLimit = (int) detail.getOrDefault("numberLimit", 1);
+					}
+
+					List<Map<String, Object>> signDetailDetail = userSignDetail.getDetail();
+					if (CollUtil.isNotEmpty(signDetailDetail)) {
+						// 模板配置的numberLimit 和 实际传参的拜访科室个数 取最小值
+						minDeptmentLimit = Math.min(numberLimit, signDetailDetail.size());
+
+						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;
+	}
 
 }