|
@@ -3,11 +3,13 @@ package com.qunzhixinxi.hnqz.admin.service.impl;
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
import cn.hutool.core.bean.copier.CopyOptions;
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
+import cn.hutool.core.date.DatePattern;
|
|
|
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.constant.UpmsType;
|
|
|
+import com.qunzhixinxi.hnqz.admin.api.dto.WmUserSignDTO;
|
|
|
import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskSubmissionPercentRule;
|
|
|
import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskSubmissionRule;
|
|
|
import com.qunzhixinxi.hnqz.admin.api.vo.UserVO;
|
|
@@ -15,11 +17,11 @@ import com.qunzhixinxi.hnqz.admin.api.entity.*;
|
|
|
import com.qunzhixinxi.hnqz.admin.api.constant.enums.EnableEnum;
|
|
|
import com.qunzhixinxi.hnqz.admin.api.constant.enums.PackageTypeEnum;
|
|
|
import com.qunzhixinxi.hnqz.admin.event.TaskInfoImgEvent;
|
|
|
-import com.qunzhixinxi.hnqz.admin.mapper.WmTaskMapper;
|
|
|
import com.qunzhixinxi.hnqz.admin.mapper.WmUserSignMapper;
|
|
|
import com.qunzhixinxi.hnqz.admin.service.*;
|
|
|
import com.qunzhixinxi.hnqz.common.core.exception.BizException;
|
|
|
import com.qunzhixinxi.hnqz.common.core.util.R;
|
|
|
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
|
|
|
import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
|
|
|
import com.qunzhixinxi.hnqz.common.sequence.sequence.Sequence;
|
|
|
import lombok.AllArgsConstructor;
|
|
@@ -27,14 +29,16 @@ import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
import org.springframework.context.ApplicationEventPublisher;
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.time.Duration;
|
|
|
import java.time.LocalDate;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.LocalTime;
|
|
|
-import java.time.temporal.ChronoUnit;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
import java.time.temporal.TemporalAdjusters;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Arrays;
|
|
@@ -42,6 +46,7 @@ import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.Set;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
import java.util.function.Function;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
@@ -56,691 +61,725 @@ import java.util.stream.Collectors;
|
|
|
@AllArgsConstructor
|
|
|
public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserSign> implements WmUserSignService {
|
|
|
|
|
|
- private final WmTaskContentService wmTaskContentService;
|
|
|
- private final SysUserService sysUserService;
|
|
|
- private final WmTaskTypeService wmTaskTypeService;
|
|
|
- private final WmScorePackageService wmScorePackageService;
|
|
|
- private final WmScorePackageStatusService wmScorePackageStatusService;
|
|
|
- private final WmTaskService wmTaskService;
|
|
|
- private final WmTaskMapper wmTaskMapper;
|
|
|
- private final WmTaskContentService taskContentService;
|
|
|
- private final SysPublicParamService sysPublicParamService;
|
|
|
- private final WmDeptTaskTypeTemplateService wmDeptTaskTypeTemplateService;
|
|
|
- private final WmUserSignDetailService wmUserSignDetailService;
|
|
|
- private final WmTaskSubmissionPercentRuleService wmTaskSubmissionPercentRuleService;
|
|
|
- private final WmTaskSubmissionRuleService wmTaskSubmissionRuleService;
|
|
|
- private final WmDaPharmacyService wmDaPharmacyService;
|
|
|
- private final ApplicationEventPublisher applicationEventPublisher;
|
|
|
- private final Sequence taskSequence;
|
|
|
-
|
|
|
- /**
|
|
|
- * 校验基础参数
|
|
|
- *
|
|
|
- * @param wmUserSign 参数
|
|
|
- * @return 任务ID
|
|
|
- */
|
|
|
- private Map<String, String> checkBaseInfo(WmUserSign wmUserSign) {
|
|
|
-
|
|
|
- if (StringUtils.isEmpty(wmUserSign.getSignEntId()) || StringUtils.isEmpty(wmUserSign.getSignEntName())) {
|
|
|
- throw new BizException("打卡地址异常,请退出后重试");
|
|
|
- }
|
|
|
-
|
|
|
- String taskTypeId;
|
|
|
- String baseTaskTypeId;
|
|
|
- if ("1".equals(wmUserSign.getSignEntType())) {
|
|
|
- taskTypeId = "5";
|
|
|
- baseTaskTypeId = "5";
|
|
|
- } else if ("2".equals(wmUserSign.getSignEntType())) {
|
|
|
- taskTypeId = "6";
|
|
|
- baseTaskTypeId = "6";
|
|
|
- } else if ("3".equals(wmUserSign.getSignEntType())) {
|
|
|
- baseTaskTypeId = "33";
|
|
|
- // 根据药店类型 区分任务类型33-普通药店/73-连锁药房
|
|
|
- WmDaPharmacy daPharmacy = wmDaPharmacyService.getById(wmUserSign.getSignEntId());
|
|
|
- if (daPharmacy == null) {
|
|
|
- throw new BizException("药店不存在或已停用");
|
|
|
- }
|
|
|
-
|
|
|
- switch (daPharmacy.getPharmacyType()) {
|
|
|
- case ORDINARY:
|
|
|
- taskTypeId = "33";
|
|
|
- break;
|
|
|
- case CHAIN:
|
|
|
- taskTypeId = "73";
|
|
|
- break;
|
|
|
- default:
|
|
|
- taskTypeId = "33";
|
|
|
- }
|
|
|
- } else {
|
|
|
- throw new BizException("拜访类型不存在");
|
|
|
- }
|
|
|
-
|
|
|
- Map<String, String> result = new HashMap<>();
|
|
|
- result.put("taskTypeId", taskTypeId);
|
|
|
- result.put("baseTaskTypeId", baseTaskTypeId);
|
|
|
-
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取并校验积分包信息
|
|
|
- *
|
|
|
- * @param wmUserSign 签到信息
|
|
|
- * @return 积分包信息
|
|
|
- */
|
|
|
- private WmScorePackage checkPkgInfo(WmUserSign wmUserSign) {
|
|
|
- String pkgId = wmUserSign.getPackageId();
|
|
|
- if (StringUtils.isEmpty(pkgId)) {
|
|
|
- throw new BizException("关联积分包异常");
|
|
|
- }
|
|
|
-
|
|
|
- WmScorePackage tWmScorePackage = wmScorePackageService.getById(pkgId);
|
|
|
-
|
|
|
- if (tWmScorePackage == null) {
|
|
|
- log.warn("获取不到积分包:{}", pkgId);
|
|
|
- throw new BizException("获取不到积分包");
|
|
|
- }
|
|
|
- if (LocalDate.now().isAfter(tWmScorePackage.getEndTime())) {
|
|
|
- throw new BizException("当前积分包已过截止日期");
|
|
|
- }
|
|
|
-
|
|
|
- if (StringUtils.isEmpty(tWmScorePackage.getRuleId())) {
|
|
|
- log.warn("积分包未配置积分规则:{}", pkgId);
|
|
|
- throw new BizException("积分包未配置积分规则");
|
|
|
- }
|
|
|
-
|
|
|
- return tWmScorePackage;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取用户
|
|
|
- *
|
|
|
- * @param wmUserSign 打卡信息
|
|
|
- * @return 用户vo
|
|
|
- */
|
|
|
- private UserVO checkUser(WmUserSign wmUserSign) {
|
|
|
-
|
|
|
- Integer userId = SecurityUtils.getUser().getId();
|
|
|
- if (!userId.toString().equals(wmUserSign.getSignUserid())) {
|
|
|
- log.warn("客户拜访任务,登录人不符:{}", wmUserSign.getSignUserid());
|
|
|
- throw new BizException("客户拜访任务,登录人不符");
|
|
|
- }
|
|
|
-
|
|
|
- UserVO userVO = sysUserService.selectUserVoById(userId);
|
|
|
-
|
|
|
- // 校验超过60周岁,不能做任务
|
|
|
- Map<String, String> checkResult = sysUserService.checkSixtyYearsOld(userVO);
|
|
|
- if (CollUtil.isNotEmpty(checkResult) && checkResult.containsKey("OVER")) {
|
|
|
- throw new BizException(checkResult.get("OVER"));
|
|
|
- }
|
|
|
-
|
|
|
- return userVO;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 校验任务类型规则
|
|
|
- *
|
|
|
- * @param entId 企业ID
|
|
|
- * @param taskTypeId 任务类型ID
|
|
|
- */
|
|
|
- private void checkTaskTypeRules(Integer entId, String taskTypeId) {
|
|
|
- List<WmTaskSubmissionPercentRule> taskTypeRules = wmTaskSubmissionPercentRuleService.list(Wrappers.<WmTaskSubmissionPercentRule>lambdaQuery()
|
|
|
- .eq(WmTaskSubmissionPercentRule::getDeptId, entId)
|
|
|
- .eq(WmTaskSubmissionPercentRule::getSubCategory, UpmsType.TaskSubCategory2.TASK_TYPE_CONFIG));
|
|
|
- if (CollUtil.isEmpty(taskTypeRules)) {
|
|
|
- throw new BizException("当前企业未开启该任务!");
|
|
|
- }
|
|
|
- String[] taskTypeIds = taskTypeRules.get(0).getRule().getTaskTypeIds();
|
|
|
- if (!ArrayUtil.contains(taskTypeIds, taskTypeId)) {
|
|
|
- throw new BizException("当前企业未开启该任务!");
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 校验百分比规则
|
|
|
- * 校验任务百分比限制规则(如果积分包值大于【任务配置】-【百分比限制】配置的起始值,
|
|
|
- * 且【任务配置】-【百分比限制】所选的任务类型对应的任务总完成积分值>积分包值*【任务配置】-【百分比限制】配置的百分比,则校验不通过)
|
|
|
- *
|
|
|
- * @param pkg 积分包
|
|
|
- * @param entId 企业ID
|
|
|
- */
|
|
|
- private void checkPercentRule(WmScorePackage pkg, Integer entId) {
|
|
|
- R<?> checkPercentRuleResult =
|
|
|
- wmTaskSubmissionPercentRuleService.checkPercentRule(pkg, entId, null, Arrays.asList("5", "6", "33", "73"));
|
|
|
- if (checkPercentRuleResult.getCode() != 0) {
|
|
|
- throw new BizException(checkPercentRuleResult.getMsg());
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 校验任务类型是否启用
|
|
|
- *
|
|
|
- * @param taskTypeId 任务类型ID
|
|
|
- * @param ruleId 规则ID
|
|
|
- */
|
|
|
- private void checkTaskType(String taskTypeId, String ruleId) {
|
|
|
- WmTaskType _baseTaskType = wmTaskTypeService.getById(taskTypeId);
|
|
|
- String typeName = _baseTaskType.getTaskTypeName();
|
|
|
- List<WmTaskType> deptTaskTypes = wmTaskTypeService.list(Wrappers.<WmTaskType>lambdaQuery()
|
|
|
- .eq(WmTaskType::getRuleId, ruleId)
|
|
|
- .eq(WmTaskType::getTaskTypeName, typeName)
|
|
|
- .eq(WmTaskType::getDelFlag, "0"));
|
|
|
- if (CollUtil.isEmpty(deptTaskTypes)) {
|
|
|
- throw new BizException(typeName + "任务类型不存在");
|
|
|
- }
|
|
|
- if (EnableEnum.DISABLE.val().equals(deptTaskTypes.get(0).getEnableFlag())) {
|
|
|
- throw new BizException(typeName + "任务类型已停用");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取积分包领取明细
|
|
|
- *
|
|
|
- * @param pkgId 积分包ID
|
|
|
- * @param userId 用户ID
|
|
|
- * @return 明细
|
|
|
- */
|
|
|
- private WmScorePackageStatus checkPkgStatus(String pkgId, Integer userId) {
|
|
|
-
|
|
|
- List<WmScorePackageStatus> statusList = wmScorePackageStatusService.list(Wrappers.<WmScorePackageStatus>lambdaQuery()
|
|
|
- .eq(WmScorePackageStatus::getUserId, userId.toString())
|
|
|
- .eq(WmScorePackageStatus::getStatus, "2")
|
|
|
- .eq(WmScorePackageStatus::getTaskAddFlag, "1")
|
|
|
- .eq(WmScorePackageStatus::getPackageId, pkgId)
|
|
|
- );
|
|
|
- if (CollectionUtils.isEmpty(statusList) || statusList.size() != 1) {
|
|
|
- log.warn("获取积分包异常,任务保存失败:{}", pkgId);
|
|
|
- throw new BizException("获取积分包领取异常,任务保存失败");
|
|
|
- }
|
|
|
-
|
|
|
- return statusList.get(0);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 保存任务
|
|
|
- *
|
|
|
- * @param taskTypeId 任务ID
|
|
|
- * @param wmUserSign 用户签到信息
|
|
|
- * @param userVO 用户信息
|
|
|
- * @param pkg 积分包信息
|
|
|
- * @return 任务结果
|
|
|
- */
|
|
|
- private WmTask createTask(String taskTypeId, WmUserSign wmUserSign, UserVO userVO, WmScorePackage pkg, int score) {
|
|
|
-
|
|
|
- // 保存任务详情
|
|
|
- WmTaskContent wmTaskContent = new WmTaskContent();
|
|
|
- wmTaskContent.setTemp1(wmUserSign.getLatitude());
|
|
|
- wmTaskContent.setTemp2(wmUserSign.getLongitude());
|
|
|
- wmTaskContent.setTemp3(wmUserSign.getId().toString());
|
|
|
- wmTaskContentService.save(wmTaskContent);
|
|
|
-
|
|
|
- // 保存任务
|
|
|
- WmTask wmTask = new WmTask();
|
|
|
- wmTask.setTaskFrom("1");
|
|
|
- wmTask.setTaskUserId(userVO.getUserId().toString());
|
|
|
- wmTask.setTaskTypeId(taskTypeId);
|
|
|
- wmTask.setSubmitStatus("0");
|
|
|
- LocalDateTime now = LocalDateTime.now();
|
|
|
- wmTask.setCreateTime(now);
|
|
|
- wmTask.setUpdateTime(now);
|
|
|
- wmTask.setLookintoDate(now);
|
|
|
- wmTask.setTaskStatus("2"); //直接提交
|
|
|
- wmTask.setDrugEntId(userVO.getDrugEntId());
|
|
|
- wmTask.setDeptId(userVO.getDeptId().toString());
|
|
|
- wmTask.setScorePackageId(pkg.getId());
|
|
|
- wmTask.setTaskRuleId(pkg.getTaskRuleId());
|
|
|
- wmTask.setTaskContentId(wmTaskContent.getId().toString());
|
|
|
- wmTask.setTaskNumber(taskSequence.nextNo());
|
|
|
- wmTask.setScore(score);
|
|
|
-
|
|
|
- // 保存任务
|
|
|
- wmTaskService.save(wmTask);
|
|
|
-
|
|
|
- return wmTask;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- /**
|
|
|
- * 操作积分包和领包状态, 判断任务完成度
|
|
|
- *
|
|
|
- * @param tWmScorePackage 积分包
|
|
|
- * @param packageStatus 领包记录
|
|
|
- * @param userVO 用户信息
|
|
|
- * @param taskTypeId 任务ID
|
|
|
- * @param wmUserSign 签到信息
|
|
|
- */
|
|
|
- private void operatePkgAndPkgStatus(WmScorePackage tWmScorePackage, WmScorePackageStatus packageStatus, UserVO userVO, String taskTypeId, WmUserSign wmUserSign) {
|
|
|
-
|
|
|
- // 查询出 审核通过和审核中的任务
|
|
|
- List<WmTask> wmTaskList = wmTaskService.list(Wrappers.<WmTask>lambdaQuery()
|
|
|
- .eq(WmTask::getScorePackageId, tWmScorePackage.getId())
|
|
|
- .ne(WmTask::getTaskStatus, "4")
|
|
|
- .eq(WmTask::getRealFlag, "0"));
|
|
|
-
|
|
|
- // 判断定量还是定额 1- 定额 2-定量
|
|
|
- // 20210120 目前 1-定额 1包1人 2-定量 1包多人
|
|
|
- if ("1".equals(tWmScorePackage.getPackageType1())) {
|
|
|
-
|
|
|
- int totalCount = wmTaskList.stream().mapToInt(WmTask::getScore).sum();
|
|
|
-
|
|
|
- if (totalCount >= tWmScorePackage.getScore()) {
|
|
|
- tWmScorePackage.setTaskAddFlag("0");
|
|
|
- packageStatus.setTaskAddFlag("0");
|
|
|
- wmScorePackageStatusService.updateById(packageStatus);
|
|
|
- }
|
|
|
-
|
|
|
- } else if ("2".equals(tWmScorePackage.getPackageType1())) {
|
|
|
-
|
|
|
- String userIdStr = userVO.getUserId().toString();
|
|
|
- long count = wmTaskList.stream().filter(item -> item.getTaskUserId().equals(userIdStr)).count();
|
|
|
-
|
|
|
- if (count - packageStatus.getTaskNum() >= 0) {
|
|
|
- packageStatus.setTaskAddFlag("0");
|
|
|
- wmScorePackageStatusService.updateById(packageStatus);
|
|
|
-
|
|
|
- // 改变大包状态
|
|
|
- List<WmScorePackageStatus> statusAll = wmScorePackageStatusService.list(Wrappers.<WmScorePackageStatus>lambdaQuery()
|
|
|
- .eq(WmScorePackageStatus::getPackageId, tWmScorePackage.getId())
|
|
|
- .eq(WmScorePackageStatus::getStatus, "2")
|
|
|
- .eq(WmScorePackageStatus::getTaskAddFlag, "0"));
|
|
|
- if (new BigDecimal(tWmScorePackage.getUserNum()).compareTo(new BigDecimal(statusAll.size())) <= 0) {
|
|
|
- tWmScorePackage.setTaskAddFlag("0");
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- tWmScorePackage.setIsConduct("1");
|
|
|
- wmScorePackageService.updateById(tWmScorePackage);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- /**
|
|
|
- * 校验打卡规则
|
|
|
- *
|
|
|
- * @param taskTypeId 任务类型
|
|
|
- * @param wmUserSign 签到信息
|
|
|
- * @param relatedServiceEntId 关联企业
|
|
|
- */
|
|
|
- private void checkByRule(String taskTypeId, WmUserSign wmUserSign, String relatedServiceEntId) {
|
|
|
- // 校验药店打卡
|
|
|
- if ("33".equals(taskTypeId)) {
|
|
|
- checkPharmacySign(relatedServiceEntId, wmUserSign);
|
|
|
- }
|
|
|
- // 医院拜访
|
|
|
- else if ("5".equals(taskTypeId)) {
|
|
|
- checkHospitalSign(relatedServiceEntId, wmUserSign);
|
|
|
- }
|
|
|
- // 商业公司拜访
|
|
|
- else {
|
|
|
- checkBizSign(relatedServiceEntId, wmUserSign);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 校验药店打卡
|
|
|
- *
|
|
|
- * @param relatedServiceEntId 关联企业
|
|
|
- * @param wmUserSign 签到信息
|
|
|
- */
|
|
|
- private void checkPharmacySign(String relatedServiceEntId, WmUserSign wmUserSign) {
|
|
|
- checkCommonSign("33", relatedServiceEntId, wmUserSign);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 校验医院打卡
|
|
|
- *
|
|
|
- * @param relatedServiceEntId 关联企业
|
|
|
- * @param wmUserSign 签到信息
|
|
|
- */
|
|
|
- private void checkHospitalSign(String relatedServiceEntId, WmUserSign wmUserSign) {
|
|
|
-
|
|
|
- checkCommonSign("5", relatedServiceEntId, wmUserSign);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 校验商业公司打卡
|
|
|
- *
|
|
|
- * @param relatedServiceEntId 关联企业
|
|
|
- * @param wmUserSign 签到信息
|
|
|
- */
|
|
|
- private void checkBizSign(String relatedServiceEntId, WmUserSign wmUserSign) {
|
|
|
- checkCommonSign("6", relatedServiceEntId, wmUserSign);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 公用打卡校验
|
|
|
- *
|
|
|
- * @param taskTypeId 任务类型
|
|
|
- * @param relatedServiceEntId 服务企业
|
|
|
- * @param wmUserSign 签到信息
|
|
|
- */
|
|
|
- @SuppressWarnings("unchecked")
|
|
|
- private void checkCommonSign(String taskTypeId, String relatedServiceEntId, WmUserSign wmUserSign) {
|
|
|
-
|
|
|
- List<WmTaskSubmissionRule.SubmissionRule> rules = wmTaskContentService.getTaskSubmissionRule(taskTypeId, relatedServiceEntId);
|
|
|
-
|
|
|
- Map<String, Integer> eachLimitMap = new HashMap<>(3);
|
|
|
- Map<String, Integer> totalLimitMap = new HashMap<>(3);
|
|
|
-
|
|
|
- if (CollUtil.isNotEmpty(rules)) {
|
|
|
- // 获取限制
|
|
|
- for (int i = 0, size = rules.size(); i < size; i++) {
|
|
|
- Map<String, Object> map = (Map<String, Object>) rules.get(i);
|
|
|
- WmTaskSubmissionRule.SubmissionRule r = BeanUtil.mapToBean(map, WmTaskSubmissionRule.SubmissionRule.class, true, new CopyOptions());
|
|
|
-
|
|
|
- if ("拜访次数上限".equals(r.getManual())) {
|
|
|
- r.getFrequency().forEach(f -> {
|
|
|
-
|
|
|
- // 获取数量
|
|
|
- Object o = f.get("quantity");
|
|
|
- int limit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
|
|
|
-
|
|
|
- // 获取单位
|
|
|
- String timeUnit = (String) f.get("timeUnit");
|
|
|
-
|
|
|
- // 同一个单位只记录最小的
|
|
|
- if (totalLimitMap.containsKey(timeUnit)) {
|
|
|
- Integer l1 = totalLimitMap.get(timeUnit);
|
|
|
- if (l1 != null && l1 > limit) {
|
|
|
- totalLimitMap.put(timeUnit, limit);
|
|
|
- }
|
|
|
- } else {
|
|
|
- totalLimitMap.put(timeUnit, limit);
|
|
|
- }
|
|
|
-
|
|
|
- });
|
|
|
-
|
|
|
- }
|
|
|
- if (r.getManual().startsWith("同一个人")) {
|
|
|
-
|
|
|
- r.getFrequency().forEach(f -> {
|
|
|
-
|
|
|
- // 获取数量
|
|
|
- Object o = f.get("quantity");
|
|
|
- int limit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
|
|
|
-
|
|
|
- // 获取单位
|
|
|
- String timeUnit = (String) f.get("timeUnit");
|
|
|
-
|
|
|
- // 同一个单位只记录最小的
|
|
|
- if (eachLimitMap.containsKey(timeUnit)) {
|
|
|
- Integer l1 = eachLimitMap.get(timeUnit);
|
|
|
- if (l1 != null && l1 > limit) {
|
|
|
- eachLimitMap.put(timeUnit, limit);
|
|
|
- }
|
|
|
- } else {
|
|
|
- eachLimitMap.put(timeUnit, limit);
|
|
|
- }
|
|
|
-
|
|
|
- });
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 月度为最大单位,以当前时间所在自然月查询范围, 获取签到记录
|
|
|
- LocalDateTime now = LocalDateTime.now();
|
|
|
- LocalDateTime start = now.with(TemporalAdjusters.firstDayOfMonth());
|
|
|
- List<WmUserSign> signs = this.list(Wrappers.<WmUserSign>lambdaQuery()
|
|
|
- .eq(WmUserSign::getSignUserid, wmUserSign.getSignUserid())
|
|
|
- .eq(WmUserSign::getTaskTypeId, taskTypeId)
|
|
|
- .between(WmUserSign::getSignDate, start, now));
|
|
|
-
|
|
|
- // 本月未有打卡记录
|
|
|
- if (CollUtil.isEmpty(signs)) {
|
|
|
- log.info("当前用户本月不存在打卡任务,放行");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- Set<Integer> signIds = signs.stream().map(WmUserSign::getId).collect(Collectors.toSet());
|
|
|
-
|
|
|
- List<WmTaskContent> taskContents = taskContentService.list(Wrappers.<WmTaskContent>lambdaQuery()
|
|
|
- .in(WmTaskContent::getTemp3, signIds)
|
|
|
- .isNull(WmTaskContent::getTemp30));
|
|
|
-
|
|
|
- List<WmTaskContent> availTaskContents = taskContents.stream().filter(con -> StrUtil.isNotBlank(con.getTemp3())).collect(Collectors.toList());
|
|
|
-
|
|
|
- if (CollUtil.isEmpty(availTaskContents)) {
|
|
|
- log.info("当前用户本月不存在打卡任务记录,放行");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- Map<String, String> signIdAndContentIdMap = availTaskContents.stream().collect(Collectors.toMap(WmTaskContent::getTemp3, cont -> cont.getId().toString()));
|
|
|
-
|
|
|
- List<WmTask> taskList = wmTaskService.list(Wrappers.<WmTask>lambdaQuery()
|
|
|
- .eq(WmTask::getTaskUserId, wmUserSign.getSignUserid())
|
|
|
- .eq(WmTask::getTaskTypeId, taskTypeId)
|
|
|
- .in(WmTask::getTaskContentId, signIdAndContentIdMap.values()));
|
|
|
-
|
|
|
- Map<String, WmTask> taskMap = taskList.stream().collect(Collectors.toMap(WmTask::getTaskContentId, Function.identity()));
|
|
|
-
|
|
|
- List<WmUserSign> availSigned = signs.stream().filter(sign -> {
|
|
|
- String contId = signIdAndContentIdMap.get(sign.getId().toString());
|
|
|
- log.info("任务内容ID为:[{}]", contId);
|
|
|
- if (StrUtil.isBlank(contId)) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- WmTask wmTask = taskMap.get(contId);
|
|
|
-
|
|
|
- if (wmTask == null) {
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- String taskStatus = wmTask.getTaskStatus();
|
|
|
- log.info("当前任务ID:[{}], 对应的任务状态为:[{}]", contId, taskStatus);
|
|
|
- return "2".equals(taskStatus) || "3".equals(taskStatus);
|
|
|
-
|
|
|
- }).collect(Collectors.toList());
|
|
|
-
|
|
|
- // 校验 同一个人,对同一拜访对象
|
|
|
- Map<String, List<WmUserSign>> collect = availSigned.stream().collect(Collectors.groupingBy(WmUserSign::getSignEntId));
|
|
|
- List<WmUserSign> wmUserSigns = collect.get(wmUserSign.getSignEntId());
|
|
|
- if (CollUtil.isNotEmpty(wmUserSigns)) {
|
|
|
-
|
|
|
- int currCount = wmUserSigns.size();
|
|
|
- log.info("当前用户同一地点本月已完成次数:[{}]", currCount);
|
|
|
- Integer monthLimit = eachLimitMap.get("MONTH");
|
|
|
- log.info("同一个人,对同一拜访对象打卡每月限制:[{}]", monthLimit);
|
|
|
- if (monthLimit != null && monthLimit <= currCount) {
|
|
|
- log.warn("超过同一个人,对同一拜访对象打卡每月限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
|
|
|
- throw new BizException("超过同一个人,对同一拜访对象打卡每月限制");
|
|
|
- }
|
|
|
-
|
|
|
- Integer dailyLimit = eachLimitMap.get("DAY");
|
|
|
- log.info("同一个人,对同一拜访对象打卡每日限制:[{}]", dailyLimit);
|
|
|
- if (dailyLimit != null) {
|
|
|
- LocalDateTime todayStart = LocalDateTime.of(now.toLocalDate(), LocalTime.MIN);
|
|
|
- long dailyCount = wmUserSigns.stream().filter(sign -> sign.getSignDate().isAfter(todayStart)).count();
|
|
|
- log.info("当前用户同一地点本日已完成次数:[{}]", dailyCount);
|
|
|
- if (dailyLimit <= dailyCount) {
|
|
|
- log.warn("超过同一个人,对同一拜访对象打卡每日限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
|
|
|
- throw new BizException("超过同一个人,对同一拜访对象打卡每日限制");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- Integer hourLimit = eachLimitMap.get("HOUR");
|
|
|
- log.info("同一个人,对同一拜访对象打卡每小时限制:[{}]", hourLimit);
|
|
|
- if (hourLimit != null) {
|
|
|
- LocalDateTime hourStart = now.minusHours(1L);
|
|
|
- long hourCount = wmUserSigns.stream().filter(sign -> sign.getSignDate().isAfter(hourStart)).count();
|
|
|
- log.info("当前用户同一地点本小时已完成次数:[{}]", hourCount);
|
|
|
- if (hourLimit <= hourCount) {
|
|
|
- log.warn("超过同一个人,对同一拜访对象打卡每小时限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
|
|
|
- throw new BizException("超过同一个人,对同一拜访对象打卡每小时限制");
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- log.info("当前用户本月不存在关于该企业的打卡任务,放行");
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- // 校验当日的拜访限制
|
|
|
- int currCount = availSigned.size();
|
|
|
- log.info("当前用户本月已完成打卡次数:[{}]", currCount);
|
|
|
- Integer monthLimit = totalLimitMap.get("MONTH");
|
|
|
- log.info("拜访次数上限打卡每月限制:[{}]", monthLimit);
|
|
|
- if (monthLimit != null && monthLimit <= currCount) {
|
|
|
- log.warn("超过拜访次数上限打卡每月限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
|
|
|
- throw new BizException("超过拜访次数上限打卡每月限制");
|
|
|
- }
|
|
|
-
|
|
|
- Integer dailyLimit = totalLimitMap.get("DAY");
|
|
|
- log.info("拜访次数上限打卡每天限制:[{}]", dailyLimit);
|
|
|
- if (dailyLimit != null) {
|
|
|
- LocalDateTime todayStart = LocalDateTime.of(now.toLocalDate(), LocalTime.MIN);
|
|
|
- long dailyCount = availSigned.stream().filter(sign -> sign.getSignDate().isAfter(todayStart)).count();
|
|
|
- log.info("当前用户本日已完成打卡次数:[{}]", dailyCount);
|
|
|
- if (dailyLimit <= dailyCount) {
|
|
|
- log.warn("超过拜访次数上限打卡每日限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
|
|
|
- throw new BizException("超过拜访次数上限打卡每日限制");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- Integer hourLimit = totalLimitMap.get("HOUR");
|
|
|
- log.info("拜访次数上限打卡每小时限制:[{}]", hourLimit);
|
|
|
- if (hourLimit != null) {
|
|
|
- LocalDateTime hourStart = now.minusHours(1L);
|
|
|
- long hourCount = availSigned.stream().filter(sign -> sign.getSignDate().isAfter(hourStart)).count();
|
|
|
- log.info("当前用户本小时已完成打卡次数:[{}]", hourCount);
|
|
|
- if (hourLimit <= hourCount) {
|
|
|
- log.warn("超过拜访次数上限打卡每小时限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
|
|
|
- throw new BizException("超过拜访次数上限打卡每小时限制");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- @Override
|
|
|
- @Transactional(rollbackFor = Exception.class)
|
|
|
- public R<?> saveWmUserSign(WmUserSign wmUserSign) {
|
|
|
- // 校验基础参数
|
|
|
- Map<String, String> taskTypeMap = checkBaseInfo(wmUserSign);
|
|
|
- // 细分任务类型
|
|
|
- String taskTypeId = taskTypeMap.get("taskTypeId");
|
|
|
- // 基础任务类型
|
|
|
- String baseTaskTypeId = taskTypeMap.get("baseTaskTypeId");
|
|
|
-
|
|
|
- // 校验积分包
|
|
|
- WmScorePackage tWmScorePackage = checkPkgInfo(wmUserSign);
|
|
|
-
|
|
|
- // 获取用户
|
|
|
- UserVO sysU = checkUser(wmUserSign);
|
|
|
-
|
|
|
- // 查询任务类型启用状态
|
|
|
- checkTaskTypeRules(sysU.getDeptId(), taskTypeId);
|
|
|
-
|
|
|
- // 校验任务类型是否启用
|
|
|
- checkTaskType(taskTypeId, tWmScorePackage.getRuleId());
|
|
|
-
|
|
|
- // 根据规则校验限制
|
|
|
- checkByRule(taskTypeId, wmUserSign, tWmScorePackage.getRelatedService());
|
|
|
-
|
|
|
- // 校验百分比参数
|
|
|
- checkPercentRule(tWmScorePackage, sysU.getDeptId());
|
|
|
-
|
|
|
- // 校验积分包领取明细
|
|
|
- WmScorePackageStatus packageStatus = checkPkgStatus(tWmScorePackage.getId(), sysU.getUserId());
|
|
|
-
|
|
|
- // 校验积分限制
|
|
|
- if (StrUtil.equals(PackageTypeEnum.TYPE1_SCOTE_PACKAGE.val(), tWmScorePackage.getPackageType1())
|
|
|
- || StrUtil.equals(PackageTypeEnum.TYPE1_SCORE_AND_TASK_PACKAGE.val(), tWmScorePackage.getPackageType1())) {
|
|
|
- wmTaskContentService.limitScore(sysU.getUserId(), sysU.getDeptId(), "1");
|
|
|
- }
|
|
|
-
|
|
|
- // 设置参数 && 保存
|
|
|
- if (StringUtils.isEmpty(wmUserSign.getSignEntType())) {
|
|
|
- wmUserSign.setSignEntType("1");
|
|
|
- }
|
|
|
- wmUserSign.setTaskTypeId(taskTypeId);
|
|
|
- boolean saveSign = this.save(wmUserSign);
|
|
|
-
|
|
|
- // 保存后续操作
|
|
|
- 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(), baseTaskTypeId, score);
|
|
|
- log.info("精细化拜访实际任务分值:{}", detailScore);
|
|
|
-
|
|
|
- // 保存任务
|
|
|
- WmTask task = createTask(taskTypeId, wmUserSign, sysU, tWmScorePackage, detailScore);
|
|
|
- task.setType(tWmScorePackage.getPackageType1());
|
|
|
-
|
|
|
- // 操作积分包
|
|
|
- operatePkgAndPkgStatus(tWmScorePackage, packageStatus, sysU, taskTypeId, wmUserSign);
|
|
|
-
|
|
|
- // 推送任务h5截图
|
|
|
- applicationEventPublisher.publishEvent(new TaskInfoImgEvent(task.getId()));
|
|
|
-
|
|
|
- return R.ok(task);
|
|
|
- }
|
|
|
-
|
|
|
- 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");
|
|
|
+ private final WmTaskContentService wmTaskContentService;
|
|
|
+ private final SysUserService sysUserService;
|
|
|
+ private final WmTaskTypeService wmTaskTypeService;
|
|
|
+ private final WmScorePackageService wmScorePackageService;
|
|
|
+ private final WmScorePackageStatusService wmScorePackageStatusService;
|
|
|
+ private final WmTaskService wmTaskService;
|
|
|
+ private final WmTaskContentService taskContentService;
|
|
|
+ private final WmDeptTaskTypeTemplateService wmDeptTaskTypeTemplateService;
|
|
|
+ private final WmUserSignDetailService wmUserSignDetailService;
|
|
|
+ private final WmTaskSubmissionPercentRuleService wmTaskSubmissionPercentRuleService;
|
|
|
+ private final WmDaPharmacyService wmDaPharmacyService;
|
|
|
+ private final ApplicationEventPublisher applicationEventPublisher;
|
|
|
+ private final Sequence taskSequence;
|
|
|
+ private final RedisTemplate<String, Object> redisTemplate;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验基础参数
|
|
|
+ *
|
|
|
+ * @param wmUserSign 参数
|
|
|
+ * @return 任务ID
|
|
|
+ */
|
|
|
+ private Map<String, String> checkBaseInfo(WmUserSign wmUserSign) {
|
|
|
+
|
|
|
+ if (StringUtils.isEmpty(wmUserSign.getSignEntId()) || StringUtils.isEmpty(wmUserSign.getSignEntName())) {
|
|
|
+ throw new BizException("打卡地址异常,请退出后重试");
|
|
|
+ }
|
|
|
+
|
|
|
+ String taskTypeId;
|
|
|
+ String baseTaskTypeId;
|
|
|
+ if ("1".equals(wmUserSign.getSignEntType())) {
|
|
|
+ taskTypeId = "5";
|
|
|
+ baseTaskTypeId = "5";
|
|
|
+ } else if ("2".equals(wmUserSign.getSignEntType())) {
|
|
|
+ taskTypeId = "6";
|
|
|
+ baseTaskTypeId = "6";
|
|
|
+ } else if ("3".equals(wmUserSign.getSignEntType())) {
|
|
|
+ baseTaskTypeId = "33";
|
|
|
+ // 根据药店类型 区分任务类型33-普通药店/73-连锁药房
|
|
|
+ WmDaPharmacy daPharmacy = wmDaPharmacyService.getById(wmUserSign.getSignEntId());
|
|
|
+ if (daPharmacy == null) {
|
|
|
+ throw new BizException("药店不存在或已停用");
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (daPharmacy.getPharmacyType()) {
|
|
|
+ case ORDINARY:
|
|
|
+ taskTypeId = "33";
|
|
|
+ break;
|
|
|
+ case CHAIN:
|
|
|
+ taskTypeId = "73";
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ taskTypeId = "33";
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ throw new BizException("拜访类型不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, String> result = new HashMap<>();
|
|
|
+ result.put("taskTypeId", taskTypeId);
|
|
|
+ result.put("baseTaskTypeId", baseTaskTypeId);
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取并校验积分包信息
|
|
|
+ *
|
|
|
+ * @param wmUserSign 签到信息
|
|
|
+ * @return 积分包信息
|
|
|
+ */
|
|
|
+ private WmScorePackage checkPkgInfo(WmUserSign wmUserSign) {
|
|
|
+ String pkgId = wmUserSign.getPackageId();
|
|
|
+ if (StringUtils.isEmpty(pkgId)) {
|
|
|
+ throw new BizException("关联积分包异常");
|
|
|
+ }
|
|
|
+
|
|
|
+ WmScorePackage tWmScorePackage = wmScorePackageService.getById(pkgId);
|
|
|
+
|
|
|
+ if (tWmScorePackage == null) {
|
|
|
+ log.warn("获取不到积分包:{}", pkgId);
|
|
|
+ throw new BizException("获取不到积分包");
|
|
|
+ }
|
|
|
+ if (LocalDate.now().isAfter(tWmScorePackage.getEndTime())) {
|
|
|
+ throw new BizException("当前积分包已过截止日期");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (StringUtils.isEmpty(tWmScorePackage.getRuleId())) {
|
|
|
+ log.warn("积分包未配置积分规则:{}", pkgId);
|
|
|
+ throw new BizException("积分包未配置积分规则");
|
|
|
+ }
|
|
|
+
|
|
|
+ return tWmScorePackage;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取用户
|
|
|
+ *
|
|
|
+ * @param wmUserSign 打卡信息
|
|
|
+ * @return 用户vo
|
|
|
+ */
|
|
|
+ private UserVO checkUser(WmUserSign wmUserSign) {
|
|
|
+
|
|
|
+ Integer userId = SecurityUtils.getUser().getId();
|
|
|
+ if (!userId.toString().equals(wmUserSign.getSignUserid())) {
|
|
|
+ log.warn("客户拜访任务,登录人不符:{}", wmUserSign.getSignUserid());
|
|
|
+ throw new BizException("客户拜访任务,登录人不符");
|
|
|
+ }
|
|
|
+
|
|
|
+ UserVO userVO = sysUserService.selectUserVoById(userId);
|
|
|
+
|
|
|
+ // 校验超过60周岁,不能做任务
|
|
|
+ Map<String, String> checkResult = sysUserService.checkSixtyYearsOld(userVO);
|
|
|
+ if (CollUtil.isNotEmpty(checkResult) && checkResult.containsKey("OVER")) {
|
|
|
+ throw new BizException(checkResult.get("OVER"));
|
|
|
+ }
|
|
|
+
|
|
|
+ return userVO;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验任务类型规则
|
|
|
+ *
|
|
|
+ * @param entId 企业ID
|
|
|
+ * @param taskTypeId 任务类型ID
|
|
|
+ */
|
|
|
+ private void checkTaskTypeRules(Integer entId, String taskTypeId) {
|
|
|
+ List<WmTaskSubmissionPercentRule> taskTypeRules = wmTaskSubmissionPercentRuleService.list(Wrappers.<WmTaskSubmissionPercentRule>lambdaQuery()
|
|
|
+ .eq(WmTaskSubmissionPercentRule::getDeptId, entId)
|
|
|
+ .eq(WmTaskSubmissionPercentRule::getSubCategory, UpmsType.TaskSubCategory2.TASK_TYPE_CONFIG));
|
|
|
+ if (CollUtil.isEmpty(taskTypeRules)) {
|
|
|
+ throw new BizException("当前企业未开启该任务!");
|
|
|
+ }
|
|
|
+ String[] taskTypeIds = taskTypeRules.get(0).getRule().getTaskTypeIds();
|
|
|
+ if (!ArrayUtil.contains(taskTypeIds, taskTypeId)) {
|
|
|
+ throw new BizException("当前企业未开启该任务!");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验百分比规则
|
|
|
+ * 校验任务百分比限制规则(如果积分包值大于【任务配置】-【百分比限制】配置的起始值,
|
|
|
+ * 且【任务配置】-【百分比限制】所选的任务类型对应的任务总完成积分值>积分包值*【任务配置】-【百分比限制】配置的百分比,则校验不通过)
|
|
|
+ *
|
|
|
+ * @param pkg 积分包
|
|
|
+ * @param entId 企业ID
|
|
|
+ */
|
|
|
+ private void checkPercentRule(WmScorePackage pkg, Integer entId) {
|
|
|
+ R<?> checkPercentRuleResult =
|
|
|
+ wmTaskSubmissionPercentRuleService.checkPercentRule(pkg, entId, null, Arrays.asList("5", "6", "33", "73"));
|
|
|
+ if (checkPercentRuleResult.getCode() != 0) {
|
|
|
+ throw new BizException(checkPercentRuleResult.getMsg());
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验任务类型是否启用
|
|
|
+ *
|
|
|
+ * @param taskTypeId 任务类型ID
|
|
|
+ * @param ruleId 规则ID
|
|
|
+ */
|
|
|
+ private void checkTaskType(String taskTypeId, String ruleId) {
|
|
|
+ WmTaskType _baseTaskType = wmTaskTypeService.getById(taskTypeId);
|
|
|
+ String typeName = _baseTaskType.getTaskTypeName();
|
|
|
+ List<WmTaskType> deptTaskTypes = wmTaskTypeService.list(Wrappers.<WmTaskType>lambdaQuery()
|
|
|
+ .eq(WmTaskType::getRuleId, ruleId)
|
|
|
+ .eq(WmTaskType::getTaskTypeName, typeName)
|
|
|
+ .eq(WmTaskType::getDelFlag, "0"));
|
|
|
+ if (CollUtil.isEmpty(deptTaskTypes)) {
|
|
|
+ throw new BizException(typeName + "任务类型不存在");
|
|
|
+ }
|
|
|
+ if (EnableEnum.DISABLE.val().equals(deptTaskTypes.get(0).getEnableFlag())) {
|
|
|
+ throw new BizException(typeName + "任务类型已停用");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取积分包领取明细
|
|
|
+ *
|
|
|
+ * @param pkgId 积分包ID
|
|
|
+ * @param userId 用户ID
|
|
|
+ * @return 明细
|
|
|
+ */
|
|
|
+ private WmScorePackageStatus checkPkgStatus(String pkgId, Integer userId) {
|
|
|
+
|
|
|
+ List<WmScorePackageStatus> statusList = wmScorePackageStatusService.list(Wrappers.<WmScorePackageStatus>lambdaQuery()
|
|
|
+ .eq(WmScorePackageStatus::getUserId, userId.toString())
|
|
|
+ .eq(WmScorePackageStatus::getStatus, "2")
|
|
|
+ .eq(WmScorePackageStatus::getTaskAddFlag, "1")
|
|
|
+ .eq(WmScorePackageStatus::getPackageId, pkgId)
|
|
|
+ );
|
|
|
+ if (CollectionUtils.isEmpty(statusList) || statusList.size() != 1) {
|
|
|
+ log.warn("获取积分包异常,任务保存失败:{}", pkgId);
|
|
|
+ throw new BizException("获取积分包领取异常,任务保存失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ return statusList.get(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存任务
|
|
|
+ *
|
|
|
+ * @param taskTypeId 任务ID
|
|
|
+ * @param wmUserSign 用户签到信息
|
|
|
+ * @param userVO 用户信息
|
|
|
+ * @param pkg 积分包信息
|
|
|
+ * @return 任务结果
|
|
|
+ */
|
|
|
+ private WmTask createTask(String taskTypeId, WmUserSign wmUserSign, UserVO userVO, WmScorePackage pkg, int score) {
|
|
|
+
|
|
|
+ // 保存任务详情
|
|
|
+ WmTaskContent wmTaskContent = new WmTaskContent();
|
|
|
+ wmTaskContent.setTemp1(wmUserSign.getLatitude());
|
|
|
+ wmTaskContent.setTemp2(wmUserSign.getLongitude());
|
|
|
+ wmTaskContent.setTemp3(wmUserSign.getId().toString());
|
|
|
+ wmTaskContentService.save(wmTaskContent);
|
|
|
+
|
|
|
+ // 保存任务
|
|
|
+ WmTask wmTask = new WmTask();
|
|
|
+ wmTask.setTaskFrom("1");
|
|
|
+ wmTask.setTaskUserId(userVO.getUserId().toString());
|
|
|
+ wmTask.setTaskTypeId(taskTypeId);
|
|
|
+ wmTask.setSubmitStatus("0");
|
|
|
+ LocalDateTime now = LocalDateTime.now();
|
|
|
+ wmTask.setCreateTime(now);
|
|
|
+ wmTask.setUpdateTime(now);
|
|
|
+ wmTask.setLookintoDate(now);
|
|
|
+ wmTask.setTaskStatus("2"); //直接提交
|
|
|
+ wmTask.setDrugEntId(userVO.getDrugEntId());
|
|
|
+ wmTask.setDeptId(userVO.getDeptId().toString());
|
|
|
+ wmTask.setScorePackageId(pkg.getId());
|
|
|
+ wmTask.setTaskRuleId(pkg.getTaskRuleId());
|
|
|
+ wmTask.setTaskContentId(wmTaskContent.getId().toString());
|
|
|
+ wmTask.setTaskNumber(taskSequence.nextNo());
|
|
|
+ wmTask.setScore(score);
|
|
|
+
|
|
|
+ // 保存任务
|
|
|
+ wmTaskService.save(wmTask);
|
|
|
+
|
|
|
+ return wmTask;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 操作积分包和领包状态, 判断任务完成度
|
|
|
+ *
|
|
|
+ * @param tWmScorePackage 积分包
|
|
|
+ * @param packageStatus 领包记录
|
|
|
+ * @param userVO 用户信息
|
|
|
+ * @param taskTypeId 任务ID
|
|
|
+ * @param wmUserSign 签到信息
|
|
|
+ */
|
|
|
+ private void operatePkgAndPkgStatus(WmScorePackage tWmScorePackage, WmScorePackageStatus packageStatus, UserVO userVO, String taskTypeId, WmUserSign wmUserSign) {
|
|
|
+
|
|
|
+ // 查询出 审核通过和审核中的任务
|
|
|
+ List<WmTask> wmTaskList = wmTaskService.list(Wrappers.<WmTask>lambdaQuery()
|
|
|
+ .eq(WmTask::getScorePackageId, tWmScorePackage.getId())
|
|
|
+ .ne(WmTask::getTaskStatus, "4")
|
|
|
+ .eq(WmTask::getRealFlag, "0"));
|
|
|
+
|
|
|
+ // 判断定量还是定额 1- 定额 2-定量
|
|
|
+ // 20210120 目前 1-定额 1包1人 2-定量 1包多人
|
|
|
+ if ("1".equals(tWmScorePackage.getPackageType1())) {
|
|
|
+
|
|
|
+ int totalCount = wmTaskList.stream().mapToInt(WmTask::getScore).sum();
|
|
|
+
|
|
|
+ if (totalCount >= tWmScorePackage.getScore()) {
|
|
|
+ tWmScorePackage.setTaskAddFlag("0");
|
|
|
+ packageStatus.setTaskAddFlag("0");
|
|
|
+ wmScorePackageStatusService.updateById(packageStatus);
|
|
|
+ }
|
|
|
+
|
|
|
+ } else if ("2".equals(tWmScorePackage.getPackageType1())) {
|
|
|
+
|
|
|
+ String userIdStr = userVO.getUserId().toString();
|
|
|
+ long count = wmTaskList.stream().filter(item -> item.getTaskUserId().equals(userIdStr)).count();
|
|
|
+
|
|
|
+ if (count - packageStatus.getTaskNum() >= 0) {
|
|
|
+ packageStatus.setTaskAddFlag("0");
|
|
|
+ wmScorePackageStatusService.updateById(packageStatus);
|
|
|
+
|
|
|
+ // 改变大包状态
|
|
|
+ List<WmScorePackageStatus> statusAll = wmScorePackageStatusService.list(Wrappers.<WmScorePackageStatus>lambdaQuery()
|
|
|
+ .eq(WmScorePackageStatus::getPackageId, tWmScorePackage.getId())
|
|
|
+ .eq(WmScorePackageStatus::getStatus, "2")
|
|
|
+ .eq(WmScorePackageStatus::getTaskAddFlag, "0"));
|
|
|
+ if (new BigDecimal(tWmScorePackage.getUserNum()).compareTo(new BigDecimal(statusAll.size())) <= 0) {
|
|
|
+ tWmScorePackage.setTaskAddFlag("0");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ tWmScorePackage.setIsConduct("1");
|
|
|
+ wmScorePackageService.updateById(tWmScorePackage);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验打卡规则
|
|
|
+ *
|
|
|
+ * @param taskTypeId 任务类型
|
|
|
+ * @param wmUserSign 签到信息
|
|
|
+ * @param relatedServiceEntId 关联企业
|
|
|
+ */
|
|
|
+ private void checkByRule(String taskTypeId, WmUserSign wmUserSign, String relatedServiceEntId) {
|
|
|
+ // 校验药店打卡
|
|
|
+ if ("33".equals(taskTypeId)) {
|
|
|
+ checkPharmacySign(relatedServiceEntId, wmUserSign);
|
|
|
+ }
|
|
|
+ // 医院拜访
|
|
|
+ else if ("5".equals(taskTypeId)) {
|
|
|
+ checkHospitalSign(relatedServiceEntId, wmUserSign);
|
|
|
+ }
|
|
|
+ // 商业公司拜访
|
|
|
+ else {
|
|
|
+ checkBizSign(relatedServiceEntId, wmUserSign);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验药店打卡
|
|
|
+ *
|
|
|
+ * @param relatedServiceEntId 关联企业
|
|
|
+ * @param wmUserSign 签到信息
|
|
|
+ */
|
|
|
+ private void checkPharmacySign(String relatedServiceEntId, WmUserSign wmUserSign) {
|
|
|
+ checkCommonSign("33", relatedServiceEntId, wmUserSign);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验医院打卡
|
|
|
+ *
|
|
|
+ * @param relatedServiceEntId 关联企业
|
|
|
+ * @param wmUserSign 签到信息
|
|
|
+ */
|
|
|
+ private void checkHospitalSign(String relatedServiceEntId, WmUserSign wmUserSign) {
|
|
|
+
|
|
|
+ checkCommonSign("5", relatedServiceEntId, wmUserSign);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验商业公司打卡
|
|
|
+ *
|
|
|
+ * @param relatedServiceEntId 关联企业
|
|
|
+ * @param wmUserSign 签到信息
|
|
|
+ */
|
|
|
+ private void checkBizSign(String relatedServiceEntId, WmUserSign wmUserSign) {
|
|
|
+ checkCommonSign("6", relatedServiceEntId, wmUserSign);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 公用打卡校验
|
|
|
+ *
|
|
|
+ * @param taskTypeId 任务类型
|
|
|
+ * @param relatedServiceEntId 服务企业
|
|
|
+ * @param wmUserSign 签到信息
|
|
|
+ */
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
+ private void checkCommonSign(String taskTypeId, String relatedServiceEntId, WmUserSign wmUserSign) {
|
|
|
+
|
|
|
+ List<WmTaskSubmissionRule.SubmissionRule> rules = wmTaskContentService.getTaskSubmissionRule(taskTypeId, relatedServiceEntId);
|
|
|
+
|
|
|
+ Map<String, Integer> eachLimitMap = new HashMap<>(3);
|
|
|
+ Map<String, Integer> totalLimitMap = new HashMap<>(3);
|
|
|
+
|
|
|
+ if (CollUtil.isNotEmpty(rules)) {
|
|
|
+ // 获取限制
|
|
|
+ for (int i = 0, size = rules.size(); i < size; i++) {
|
|
|
+ Map<String, Object> map = (Map<String, Object>) rules.get(i);
|
|
|
+ WmTaskSubmissionRule.SubmissionRule r = BeanUtil.mapToBean(map, WmTaskSubmissionRule.SubmissionRule.class, true, new CopyOptions());
|
|
|
+
|
|
|
+ if ("拜访次数上限".equals(r.getManual())) {
|
|
|
+ r.getFrequency().forEach(f -> {
|
|
|
+
|
|
|
+ // 获取数量
|
|
|
+ Object o = f.get("quantity");
|
|
|
+ int limit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
|
|
|
+
|
|
|
+ // 获取单位
|
|
|
+ String timeUnit = (String) f.get("timeUnit");
|
|
|
+
|
|
|
+ // 同一个单位只记录最小的
|
|
|
+ if (totalLimitMap.containsKey(timeUnit)) {
|
|
|
+ Integer l1 = totalLimitMap.get(timeUnit);
|
|
|
+ if (l1 != null && l1 > limit) {
|
|
|
+ totalLimitMap.put(timeUnit, limit);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ totalLimitMap.put(timeUnit, limit);
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ }
|
|
|
+ if (r.getManual().startsWith("同一个人")) {
|
|
|
+
|
|
|
+ r.getFrequency().forEach(f -> {
|
|
|
+
|
|
|
+ // 获取数量
|
|
|
+ Object o = f.get("quantity");
|
|
|
+ int limit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
|
|
|
+
|
|
|
+ // 获取单位
|
|
|
+ String timeUnit = (String) f.get("timeUnit");
|
|
|
+
|
|
|
+ // 同一个单位只记录最小的
|
|
|
+ if (eachLimitMap.containsKey(timeUnit)) {
|
|
|
+ Integer l1 = eachLimitMap.get(timeUnit);
|
|
|
+ if (l1 != null && l1 > limit) {
|
|
|
+ eachLimitMap.put(timeUnit, limit);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ eachLimitMap.put(timeUnit, limit);
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 月度为最大单位,以当前时间所在自然月查询范围, 获取签到记录
|
|
|
+ LocalDateTime now = LocalDateTime.now();
|
|
|
+ LocalDateTime start = now.with(TemporalAdjusters.firstDayOfMonth());
|
|
|
+ List<WmUserSign> signs = this.list(Wrappers.<WmUserSign>lambdaQuery()
|
|
|
+ .eq(WmUserSign::getSignUserid, wmUserSign.getSignUserid())
|
|
|
+ .eq(WmUserSign::getTaskTypeId, taskTypeId)
|
|
|
+ .between(WmUserSign::getSignDate, start, now));
|
|
|
+
|
|
|
+ // 本月未有打卡记录
|
|
|
+ if (CollUtil.isEmpty(signs)) {
|
|
|
+ log.info("当前用户本月不存在打卡任务,放行");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ Set<Integer> signIds = signs.stream().map(WmUserSign::getId).collect(Collectors.toSet());
|
|
|
+
|
|
|
+ List<WmTaskContent> taskContents = taskContentService.list(Wrappers.<WmTaskContent>lambdaQuery()
|
|
|
+ .in(WmTaskContent::getTemp3, signIds)
|
|
|
+ .isNull(WmTaskContent::getTemp30));
|
|
|
+
|
|
|
+ List<WmTaskContent> availTaskContents = taskContents.stream().filter(con -> StrUtil.isNotBlank(con.getTemp3())).collect(Collectors.toList());
|
|
|
+
|
|
|
+ if (CollUtil.isEmpty(availTaskContents)) {
|
|
|
+ log.info("当前用户本月不存在打卡任务记录,放行");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, String> signIdAndContentIdMap = availTaskContents.stream().collect(Collectors.toMap(WmTaskContent::getTemp3, cont -> cont.getId().toString()));
|
|
|
+
|
|
|
+ List<WmTask> taskList = wmTaskService.list(Wrappers.<WmTask>lambdaQuery()
|
|
|
+ .eq(WmTask::getTaskUserId, wmUserSign.getSignUserid())
|
|
|
+ .eq(WmTask::getTaskTypeId, taskTypeId)
|
|
|
+ .in(WmTask::getTaskContentId, signIdAndContentIdMap.values()));
|
|
|
+
|
|
|
+ Map<String, WmTask> taskMap = taskList.stream().collect(Collectors.toMap(WmTask::getTaskContentId, Function.identity()));
|
|
|
+
|
|
|
+ List<WmUserSign> availSigned = signs.stream().filter(sign -> {
|
|
|
+ String contId = signIdAndContentIdMap.get(sign.getId().toString());
|
|
|
+ log.info("任务内容ID为:[{}]", contId);
|
|
|
+ if (StrUtil.isBlank(contId)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ WmTask wmTask = taskMap.get(contId);
|
|
|
+
|
|
|
+ if (wmTask == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ String taskStatus = wmTask.getTaskStatus();
|
|
|
+ log.info("当前任务ID:[{}], 对应的任务状态为:[{}]", contId, taskStatus);
|
|
|
+ return "2".equals(taskStatus) || "3".equals(taskStatus);
|
|
|
+
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+
|
|
|
+ // 校验 同一个人,对同一拜访对象
|
|
|
+ Map<String, List<WmUserSign>> collect = availSigned.stream().collect(Collectors.groupingBy(WmUserSign::getSignEntId));
|
|
|
+ List<WmUserSign> wmUserSigns = collect.get(wmUserSign.getSignEntId());
|
|
|
+ if (CollUtil.isNotEmpty(wmUserSigns)) {
|
|
|
+
|
|
|
+ int currCount = wmUserSigns.size();
|
|
|
+ log.info("当前用户同一地点本月已完成次数:[{}]", currCount);
|
|
|
+ Integer monthLimit = eachLimitMap.get("MONTH");
|
|
|
+ log.info("同一个人,对同一拜访对象打卡每月限制:[{}]", monthLimit);
|
|
|
+ if (monthLimit != null && monthLimit <= currCount) {
|
|
|
+ log.warn("超过同一个人,对同一拜访对象打卡每月限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
|
|
|
+ throw new BizException("超过同一个人,对同一拜访对象打卡每月限制");
|
|
|
+ }
|
|
|
+
|
|
|
+ Integer dailyLimit = eachLimitMap.get("DAY");
|
|
|
+ log.info("同一个人,对同一拜访对象打卡每日限制:[{}]", dailyLimit);
|
|
|
+ if (dailyLimit != null) {
|
|
|
+ LocalDateTime todayStart = LocalDateTime.of(now.toLocalDate(), LocalTime.MIN);
|
|
|
+ long dailyCount = wmUserSigns.stream().filter(sign -> sign.getSignDate().isAfter(todayStart)).count();
|
|
|
+ log.info("当前用户同一地点本日已完成次数:[{}]", dailyCount);
|
|
|
+ if (dailyLimit <= dailyCount) {
|
|
|
+ log.warn("超过同一个人,对同一拜访对象打卡每日限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
|
|
|
+ throw new BizException("超过同一个人,对同一拜访对象打卡每日限制");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Integer hourLimit = eachLimitMap.get("HOUR");
|
|
|
+ log.info("同一个人,对同一拜访对象打卡每小时限制:[{}]", hourLimit);
|
|
|
+ if (hourLimit != null) {
|
|
|
+ LocalDateTime hourStart = now.minusHours(1L);
|
|
|
+ long hourCount = wmUserSigns.stream().filter(sign -> sign.getSignDate().isAfter(hourStart)).count();
|
|
|
+ log.info("当前用户同一地点本小时已完成次数:[{}]", hourCount);
|
|
|
+ if (hourLimit <= hourCount) {
|
|
|
+ log.warn("超过同一个人,对同一拜访对象打卡每小时限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
|
|
|
+ throw new BizException("超过同一个人,对同一拜访对象打卡每小时限制");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ log.info("当前用户本月不存在关于该企业的打卡任务,放行");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 校验当日的拜访限制
|
|
|
+ int currCount = availSigned.size();
|
|
|
+ log.info("当前用户本月已完成打卡次数:[{}]", currCount);
|
|
|
+ Integer monthLimit = totalLimitMap.get("MONTH");
|
|
|
+ log.info("拜访次数上限打卡每月限制:[{}]", monthLimit);
|
|
|
+ if (monthLimit != null && monthLimit <= currCount) {
|
|
|
+ log.warn("超过拜访次数上限打卡每月限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
|
|
|
+ throw new BizException("超过拜访次数上限打卡每月限制");
|
|
|
+ }
|
|
|
+
|
|
|
+ Integer dailyLimit = totalLimitMap.get("DAY");
|
|
|
+ log.info("拜访次数上限打卡每天限制:[{}]", dailyLimit);
|
|
|
+ if (dailyLimit != null) {
|
|
|
+ LocalDateTime todayStart = LocalDateTime.of(now.toLocalDate(), LocalTime.MIN);
|
|
|
+ long dailyCount = availSigned.stream().filter(sign -> sign.getSignDate().isAfter(todayStart)).count();
|
|
|
+ log.info("当前用户本日已完成打卡次数:[{}]", dailyCount);
|
|
|
+ if (dailyLimit <= dailyCount) {
|
|
|
+ log.warn("超过拜访次数上限打卡每日限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
|
|
|
+ throw new BizException("超过拜访次数上限打卡每日限制");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Integer hourLimit = totalLimitMap.get("HOUR");
|
|
|
+ log.info("拜访次数上限打卡每小时限制:[{}]", hourLimit);
|
|
|
+ if (hourLimit != null) {
|
|
|
+ LocalDateTime hourStart = now.minusHours(1L);
|
|
|
+ long hourCount = availSigned.stream().filter(sign -> sign.getSignDate().isAfter(hourStart)).count();
|
|
|
+ log.info("当前用户本小时已完成打卡次数:[{}]", hourCount);
|
|
|
+ if (hourLimit <= hourCount) {
|
|
|
+ log.warn("超过拜访次数上限打卡每小时限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
|
|
|
+ throw new BizException("超过拜访次数上限打卡每小时限制");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public R<?> saveWmUserSign(WmUserSign wmUserSign) {
|
|
|
+ // 校验基础参数
|
|
|
+ Map<String, String> taskTypeMap = checkBaseInfo(wmUserSign);
|
|
|
+ // 细分任务类型
|
|
|
+ String taskTypeId = taskTypeMap.get("taskTypeId");
|
|
|
+ // 基础任务类型
|
|
|
+ String baseTaskTypeId = taskTypeMap.get("baseTaskTypeId");
|
|
|
+
|
|
|
+ // 校验积分包
|
|
|
+ WmScorePackage tWmScorePackage = checkPkgInfo(wmUserSign);
|
|
|
+
|
|
|
+ // 获取用户
|
|
|
+ UserVO sysU = checkUser(wmUserSign);
|
|
|
+
|
|
|
+ // 查询任务类型启用状态
|
|
|
+ checkTaskTypeRules(sysU.getDeptId(), taskTypeId);
|
|
|
+
|
|
|
+ // 校验任务类型是否启用
|
|
|
+ checkTaskType(taskTypeId, tWmScorePackage.getRuleId());
|
|
|
+
|
|
|
+ // 根据规则校验限制
|
|
|
+ checkByRule(taskTypeId, wmUserSign, tWmScorePackage.getRelatedService());
|
|
|
+
|
|
|
+ // 校验百分比参数
|
|
|
+ checkPercentRule(tWmScorePackage, sysU.getDeptId());
|
|
|
+
|
|
|
+ // 校验积分包领取明细
|
|
|
+ WmScorePackageStatus packageStatus = checkPkgStatus(tWmScorePackage.getId(), sysU.getUserId());
|
|
|
+
|
|
|
+ // 校验积分限制
|
|
|
+ if (StrUtil.equals(PackageTypeEnum.TYPE1_SCOTE_PACKAGE.val(), tWmScorePackage.getPackageType1())
|
|
|
+ || StrUtil.equals(PackageTypeEnum.TYPE1_SCORE_AND_TASK_PACKAGE.val(), tWmScorePackage.getPackageType1())) {
|
|
|
+ wmTaskContentService.limitScore(sysU.getUserId(), sysU.getDeptId(), "1");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置参数 && 保存
|
|
|
+ if (StringUtils.isEmpty(wmUserSign.getSignEntType())) {
|
|
|
+ wmUserSign.setSignEntType("1");
|
|
|
+ }
|
|
|
+ wmUserSign.setTaskTypeId(taskTypeId);
|
|
|
+ boolean saveSign = this.save(wmUserSign);
|
|
|
+
|
|
|
+ // 保存后续操作
|
|
|
+ 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(), baseTaskTypeId, score);
|
|
|
+ log.info("精细化拜访实际任务分值:{}", detailScore);
|
|
|
+
|
|
|
+ // 保存任务
|
|
|
+ WmTask task = createTask(taskTypeId, wmUserSign, sysU, tWmScorePackage, detailScore);
|
|
|
+ task.setType(tWmScorePackage.getPackageType1());
|
|
|
+
|
|
|
+ // 操作积分包
|
|
|
+ operatePkgAndPkgStatus(tWmScorePackage, packageStatus, sysU, taskTypeId, wmUserSign);
|
|
|
+
|
|
|
+ // 推送任务h5截图
|
|
|
+ applicationEventPublisher.publishEvent(new TaskInfoImgEvent(task.getId()));
|
|
|
+
|
|
|
+ return R.ok(task);
|
|
|
+ }
|
|
|
+
|
|
|
+ return R.failed("签到保存失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 会员临时签到
|
|
|
+ *
|
|
|
+ * @param resource 签到信息
|
|
|
+ * @param user 用户
|
|
|
+ * @return 签到结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public String doTempSign(WmUserSignDTO.OnTempSign resource, HnqzUser user) {
|
|
|
+
|
|
|
+
|
|
|
+ LocalDateTime now = LocalDateTime.now();
|
|
|
+
|
|
|
+ // 误差不能超过5秒
|
|
|
+ if (Duration.between(resource.getSignTime(), now).toMillis() > 5_000) {
|
|
|
+ throw new BizException("签到误差不能超过5秒");
|
|
|
+ }
|
|
|
+
|
|
|
+ String signTime = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN).format(now);
|
|
|
+
|
|
|
+ // 获取签到key
|
|
|
+ String cacheKey = String.format("user:sign:temp:%s:%s", user.getId(), resource.getLocationId());
|
|
|
+
|
|
|
+ if (Boolean.TRUE.equals(redisTemplate.hasKey(cacheKey))) {
|
|
|
+
|
|
|
+ return redisTemplate.opsForValue().get(cacheKey).toString();
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ redisTemplate.opsForValue().set(cacheKey, signTime, 6, TimeUnit.HOURS);
|
|
|
+
|
|
|
+ return signTime;
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存签到详情
|
|
|
+ *
|
|
|
+ * @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;
|
|
|
- }
|
|
|
+ departmentList.add(departmentName);
|
|
|
+ }
|
|
|
+ userSignDetail.setDepartment(departmentList.toArray(new String[0]));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ userSignDetail.setSignId(wmUserSign.getId());
|
|
|
+ wmUserSignDetailService.save(userSignDetail);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return baseScore * minDeptmentLimit;
|
|
|
+ }
|
|
|
|
|
|
}
|