|
@@ -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;
|
|
@@ -23,8 +7,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskSubmissionRule;
|
|
|
-import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskTypeSubCategory;
|
|
|
import com.qunzhixinxi.hnqz.admin.api.vo.UserVO;
|
|
|
+import com.qunzhixinxi.hnqz.admin.config.UpmsConfig;
|
|
|
import com.qunzhixinxi.hnqz.admin.entity.*;
|
|
|
import com.qunzhixinxi.hnqz.admin.mapper.WmUserSignMapper;
|
|
|
import com.qunzhixinxi.hnqz.admin.service.*;
|
|
@@ -37,10 +21,14 @@ import org.apache.commons.lang.StringUtils;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.time.Duration;
|
|
|
import java.time.LocalDateTime;
|
|
|
+import java.time.LocalTime;
|
|
|
import java.time.temporal.ChronoUnit;
|
|
|
+import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
+import java.util.Optional;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
@@ -56,18 +44,14 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
|
|
|
|
|
|
private final WmTaskContentService wmTaskContentService;
|
|
|
private final SysUserService sysUserService;
|
|
|
- private final SysDeptService sysDeptService;
|
|
|
private final WmTaskTypeService wmTaskTypeService;
|
|
|
private final WmScorePackageService wmScorePackageService;
|
|
|
private final WmScorePackageStatusService wmScorePackageStatusService;
|
|
|
private final WmTaskService wmTaskService;
|
|
|
- private final SysRoleService sysRoleService;
|
|
|
- private final WmTaskRuleService wmTaskRuleService;
|
|
|
private final SysPublicParamService sysPublicParamService;
|
|
|
private final WmDeptTaskTypeTemplateService wmDeptTaskTypeTemplateService;
|
|
|
private final WmUserSignDetailService wmUserSignDetailService;
|
|
|
- private final WmTaskSubmissionRuleService taskSubmissionRuleService;
|
|
|
- private final WmTaskTypeSubCategoryService taskTypeSubCategoryService;
|
|
|
+ private final UpmsConfig upmsConfig;
|
|
|
|
|
|
@Override
|
|
|
public R saveWmUserSign(WmUserSign wmUserSign) {
|
|
@@ -89,7 +73,7 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
|
|
|
log.warn("获取不到积分包:{}", wmUserSign.getPackageId());
|
|
|
return R.failed("获取不到积分包");
|
|
|
}
|
|
|
- if(StringUtils.isEmpty(tWmScorePackage.getRuleId())){
|
|
|
+ if (StringUtils.isEmpty(tWmScorePackage.getRuleId())) {
|
|
|
log.warn("积分包未配置积分规则:{}", wmUserSign.getPackageId());
|
|
|
return R.failed("积分包未配置积分规则");
|
|
|
}
|
|
@@ -100,63 +84,161 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
|
|
|
return R.failed("客户拜访任务,登录人不符");
|
|
|
}
|
|
|
|
|
|
- if("1".equals(tWmScorePackage.getPackageType1())){
|
|
|
+ if ("1".equals(tWmScorePackage.getPackageType1())) {
|
|
|
Boolean fullFlag = wmTaskService.checkUserTaskSubScore(sysU.getUserId() + "");
|
|
|
- if(fullFlag){
|
|
|
+ if (fullFlag) {
|
|
|
String value = sysPublicParamService.getSysPublicParamKeyToValue("USER_TASK_SUB_SCORE");
|
|
|
- String info = StringUtils.isEmpty(value)?"每日最多提交3万积分":"每日最多提交"+Integer.parseInt(value)+"积分";
|
|
|
+ String info = StringUtils.isEmpty(value) ? "每日最多提交3万积分" : "每日最多提交" + Integer.parseInt(value) + "积分";
|
|
|
log.warn("系统当前限制积分上限:【{}】,提示:【{}】", value, info);
|
|
|
- return R.failed(1,info);
|
|
|
+ return R.failed(1, info);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
String taskTypeId;
|
|
|
- if ("1".equals(wmUserSign.getSignEntType())){
|
|
|
+ if ("1".equals(wmUserSign.getSignEntType())) {
|
|
|
taskTypeId = "5";
|
|
|
- } else if ("2".equals(wmUserSign.getSignEntType())){
|
|
|
+ } else if ("2".equals(wmUserSign.getSignEntType())) {
|
|
|
taskTypeId = "6";
|
|
|
- } else if ("3".equals(wmUserSign.getSignEntType())){
|
|
|
+ } else if ("3".equals(wmUserSign.getSignEntType())) {
|
|
|
taskTypeId = "33";
|
|
|
} else {
|
|
|
return R.failed("拜访类型不存在");
|
|
|
}
|
|
|
+ wmUserSign.setTaskTypeId(taskTypeId);
|
|
|
+
|
|
|
+
|
|
|
+ if ("33".equals(taskTypeId)) {
|
|
|
+ // 一个用户,在同一打卡地点,4小时内只能打卡一次
|
|
|
+ int total = this.count(Wrappers.<WmUserSign>lambdaQuery()
|
|
|
+ .eq(WmUserSign::getSignUserid, wmUserSign.getSignUserid())
|
|
|
+ .eq(WmUserSign::getSignEntId, wmUserSign.getSignEntId())
|
|
|
+ .gt(WmUserSign::getSignDate, LocalDateTime.now().minus(4, ChronoUnit.HOURS)));
|
|
|
+ // 一个用户,半小时内只能打卡一次
|
|
|
+ int halfHourTotal = this.count(Wrappers.<WmUserSign>lambdaQuery()
|
|
|
+ .eq(WmUserSign::getSignUserid, wmUserSign.getSignUserid())
|
|
|
+ .gt(WmUserSign::getSignDate, LocalDateTime.now().minus(30, ChronoUnit.MINUTES)));
|
|
|
+ if (total != 0 || halfHourTotal != 0) {
|
|
|
+ log.warn("打卡间隔过短:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
|
|
|
+ return R.failed("打卡间隔过短");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+
|
|
|
+ List<WmTaskSubmissionRule.SubmissionRule> rules = wmTaskContentService.getTaskSubmissionRule(taskTypeId, tWmScorePackage.getRelatedService());
|
|
|
+
|
|
|
+ int dailyLimit = 0;
|
|
|
+ Map<String, Integer> eachLimitMap = new HashMap<>(2);
|
|
|
+
|
|
|
+ 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())) {
|
|
|
+ Object o = r.getFrequency().get(0).get("quantity");
|
|
|
+ dailyLimit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
|
|
|
|
|
|
- int totalLimit = 4;
|
|
|
- int halfHourTotalLimit = 30;
|
|
|
+ }
|
|
|
+ if (r.getManual().startsWith("同一个人")) {
|
|
|
+
|
|
|
+ r.getFrequency().forEach(f -> {
|
|
|
+
|
|
|
+ // 获取数量
|
|
|
+ Object o = f.get("quantity");
|
|
|
+ int limit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
|
|
|
|
|
|
- List<WmTaskSubmissionRule.SubmissionRule> rules = wmTaskContentService.getTaskSubmissionRule(taskTypeId, tWmScorePackage.getRelatedService());
|
|
|
+ // 获取单位
|
|
|
+ String timeUnit = (String) f.get("timeUnit");
|
|
|
|
|
|
- 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 (eachLimitMap.containsKey(timeUnit)) {
|
|
|
+ Integer l1 = eachLimitMap.get(timeUnit);
|
|
|
+ if (l1 != null && l1 > limit) {
|
|
|
+ eachLimitMap.put(timeUnit, limit);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ eachLimitMap.put(timeUnit, limit);
|
|
|
+ }
|
|
|
|
|
|
- if ("打卡时间间隔".equals(r.getManual())) {
|
|
|
- Object o = r.getFrequency().get(0).get("quantity");
|
|
|
- halfHourTotalLimit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
|
|
|
+ });
|
|
|
|
|
|
+ }
|
|
|
}
|
|
|
- if ("同一个人在同一个商业公司的打卡时间间隔".equals(r.getManual())) {
|
|
|
- Object o = r.getFrequency().get(0).get("quantity");
|
|
|
- totalLimit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 按照最大周期进行查询
|
|
|
+ LocalDateTime now = LocalDateTime.now();
|
|
|
+ LocalDateTime start;
|
|
|
+ boolean isMonth = false;
|
|
|
+ if (eachLimitMap.containsKey("MONTH")) {
|
|
|
+ start = now.minusDays(30L);
|
|
|
+ isMonth = true;
|
|
|
+ } else {
|
|
|
+ start = LocalDateTime.of(now.toLocalDate(), LocalTime.MIN);
|
|
|
+ }
|
|
|
+
|
|
|
+ List<WmUserSign> signs = this.list(Wrappers.<WmUserSign>lambdaQuery()
|
|
|
+ .eq(WmUserSign::getSignUserid, wmUserSign.getSignUserid())
|
|
|
+ .eq(WmUserSign::getTaskTypeId, taskTypeId)
|
|
|
+ .between(WmUserSign::getSignDate, start, now));
|
|
|
+
|
|
|
+
|
|
|
+ // 月度限制
|
|
|
+ if (isMonth) {
|
|
|
+
|
|
|
+ Map<String, List<WmUserSign>> collect = signs.stream().collect(Collectors.groupingBy(WmUserSign::getSignEntId));
|
|
|
+ List<WmUserSign> wmUserSigns = collect.get(wmUserSign.getSignEntId());
|
|
|
+ if (CollUtil.isNotEmpty(wmUserSigns)) {
|
|
|
+ int monthLimit = eachLimitMap.get("MONTH");
|
|
|
+ if (monthLimit <= wmUserSigns.size()) {
|
|
|
+ log.warn("超过打卡每月限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
|
|
|
+ return R.failed("超过打卡每月限制");
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
+ // 获取当日的打卡记录
|
|
|
+ LocalDateTime begin = LocalDateTime.of(now.toLocalDate(), LocalTime.MIN);
|
|
|
+ List<WmUserSign> todaySign = signs.stream().filter(s -> s.getSignDate().isAfter(begin)).collect(Collectors.toList());
|
|
|
+
|
|
|
+ // 没有超过日打卡限制
|
|
|
+ int todaySignQty = CollUtil.isNotEmpty(todaySign) ? todaySign.size() : 0;
|
|
|
+ if (dailyLimit > todaySignQty) {
|
|
|
+
|
|
|
+ Map<String, List<WmUserSign>> collect = todaySign.stream().collect(Collectors.groupingBy(WmUserSign::getSignEntId));
|
|
|
+ List<WmUserSign> wmUserSigns = collect.get(wmUserSign.getSignEntId());
|
|
|
+ if (CollUtil.isNotEmpty(wmUserSigns)) {
|
|
|
+ int eachLimit = eachLimitMap.get("DAY");
|
|
|
+ if (wmUserSigns.size() < eachLimit) {
|
|
|
+
|
|
|
+ // 一个用户,在同一打卡地点,4小时内只能打卡一次
|
|
|
+ Optional<LocalDateTime> first = wmUserSigns.stream().map(WmUserSign::getSignDate).filter(sd -> Duration.between(sd, now).toMinutes() <= upmsConfig.getDurationLimit()).findFirst();
|
|
|
+
|
|
|
+ if (first.isPresent()) {
|
|
|
+ log.warn("打卡间隔过短:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
|
|
|
+ return R.failed("打卡间隔过短");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 一个用户,半小时内只能打卡一次
|
|
|
+ Optional<LocalDateTime> first1 = signs.stream().map(WmUserSign::getSignDate).filter(sd -> Duration.between(sd, now).toMinutes() <= upmsConfig.getEachDurationLimit()).findFirst();
|
|
|
+
|
|
|
+ if (first1.isPresent()) {
|
|
|
+ log.warn("打卡间隔过短:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
|
|
|
+ return R.failed("打卡间隔过短");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ } else {
|
|
|
+ log.warn("超过每个地点打卡每日限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
|
|
|
+ return R.failed("超过每个地点打卡每日限制");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+ log.warn("超过打卡每日总限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
|
|
|
+ return R.failed("超过打卡每日总限制");
|
|
|
+ }
|
|
|
|
|
|
- // 一个用户,在同一打卡地点,4小时内只能打卡一次
|
|
|
- int total = this.count(Wrappers.<WmUserSign>lambdaQuery()
|
|
|
- .eq(WmUserSign::getSignUserid, wmUserSign.getSignUserid())
|
|
|
- .eq(WmUserSign::getSignEntId, wmUserSign.getSignEntId())
|
|
|
- .gt(WmUserSign::getSignDate, LocalDateTime.now().minus(totalLimit, ChronoUnit.HOURS)));
|
|
|
- // 一个用户,半小时内只能打卡一次
|
|
|
- int halfHourTotal = this.count(Wrappers.<WmUserSign>lambdaQuery()
|
|
|
- .eq(WmUserSign::getSignUserid, wmUserSign.getSignUserid())
|
|
|
- .gt(WmUserSign::getSignDate, LocalDateTime.now().minus(halfHourTotalLimit, ChronoUnit.MINUTES)));
|
|
|
- if (total != 0 || halfHourTotal != 0) {
|
|
|
- log.warn("打卡间隔过短:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
|
|
|
- return R.failed("打卡间隔过短");
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -288,8 +370,8 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
|
|
|
queryAll.setTaskAddFlag("0");
|
|
|
List<WmScorePackageStatus> statusAll = wmScorePackageStatusService.
|
|
|
list(Wrappers.query(queryAll));
|
|
|
- if(new BigDecimal(updatePke.getUserNum())
|
|
|
- .compareTo(new BigDecimal(statusAll.size())) <= 0){
|
|
|
+ if (new BigDecimal(updatePke.getUserNum())
|
|
|
+ .compareTo(new BigDecimal(statusAll.size())) <= 0) {
|
|
|
updatePke.setTaskAddFlag("0");
|
|
|
}
|
|
|
}
|