diff --git a/doc/2023_update.sql b/doc/2023_update.sql
new file mode 100644
index 0000000..977c3a9
--- /dev/null
+++ b/doc/2023_update.sql
@@ -0,0 +1,22 @@
+-- 2023年3月7日
+ALTER TABLE `fw_morax`.`eval_group_reward_ladders`
+ ADD COLUMN `rank_order_type` tinyint(4) NULL DEFAULT 1 COMMENT '排名顺序类型 1:正 2:负' AFTER `upper`;
+
+CREATE TABLE `eval_group_reward_rank_log` (
+ `id` bigint(20) NOT NULL AUTO_INCREMENT,
+ `name` varchar(512) NOT NULL COMMENT '名称',
+ `pool_id` bigint(20) DEFAULT NULL COMMENT '人员id 、门店id',
+ `scope_type` tinyint(4) NOT NULL COMMENT '考评范围; 1:门店考评 2:人员考评',
+ `refer_id` bigint(20) DEFAULT NULL COMMENT '考评奖惩 前置条件 配置id',
+ `target_type` tinyint(4) DEFAULT NULL COMMENT '1:参数 2:前置条件',
+ `value` decimal(18,4) DEFAULT NULL COMMENT '原始值',
+ `reach_value` decimal(18,4) DEFAULT NULL COMMENT '达成目标',
+ `rank` int(10) DEFAULT NULL COMMENT '排名',
+ `hit` tinyint(1) DEFAULT NULL COMMENT '是否命中',
+ `data_date` date NOT NULL COMMENT '数据日期',
+ `group_id` bigint(20) NOT NULL COMMENT '集团',
+ `create_time` datetime DEFAULT NULL,
+ `update_time` datetime DEFAULT NULL,
+ `yn` tinyint(1) DEFAULT '1',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='考评指标达成目标记录';
\ No newline at end of file
diff --git a/fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalGroupRewardHitLogDao.java b/fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalGroupRewardHitLogDao.java
index aee510b..9211ae9 100644
--- a/fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalGroupRewardHitLogDao.java
+++ b/fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalGroupRewardHitLogDao.java
@@ -2,7 +2,12 @@ package cn.fw.morax.dao.eval;
import cn.fw.morax.domain.db.eval.EvalGroupRewardHitLog;
+import cn.fw.morax.domain.vo.eval.EvalGroupRewardHitLogVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.time.LocalDate;
+import java.util.List;
/**
*
@@ -14,4 +19,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface EvalGroupRewardHitLogDao extends BaseMapper {
+ List getUserHitLogs(@Param("evalGroupRewardId")Long evalGroupRewardId, @Param("dataDate")LocalDate dataDate);
+
+ List getShopHitLogs(@Param("evalGroupRewardId")Long evalGroupRewardId, @Param("dataDate")LocalDate dataDate);
+
}
diff --git a/fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalGroupRewardRankLogDao.java b/fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalGroupRewardRankLogDao.java
new file mode 100644
index 0000000..44d2db0
--- /dev/null
+++ b/fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalGroupRewardRankLogDao.java
@@ -0,0 +1,18 @@
+package cn.fw.morax.dao.eval;
+
+
+import cn.fw.morax.domain.db.eval.EvalGroupRewardRankLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ *
+ * 考评指标达成目标记录 Mapper 接口
+ *
+ *
+ * @author jiangchao
+ * @since 2022-12-09
+ */
+public interface EvalGroupRewardRankLogDao extends BaseMapper {
+
+
+}
diff --git a/fw-morax-dao/src/main/resources/mapper/eval/EvalGroupRewardHitLogMapper.xml b/fw-morax-dao/src/main/resources/mapper/eval/EvalGroupRewardHitLogMapper.xml
index 39f11cd..b305acf 100644
--- a/fw-morax-dao/src/main/resources/mapper/eval/EvalGroupRewardHitLogMapper.xml
+++ b/fw-morax-dao/src/main/resources/mapper/eval/EvalGroupRewardHitLogMapper.xml
@@ -2,6 +2,50 @@
+
+
\ No newline at end of file
diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/bo/eval/EvalGroupUserShop.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/bo/eval/EvalGroupUserShop.java
index beb8e94..34805ac 100644
--- a/fw-morax-domain/src/main/java/cn/fw/morax/domain/bo/eval/EvalGroupUserShop.java
+++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/bo/eval/EvalGroupUserShop.java
@@ -48,6 +48,11 @@ public class EvalGroupUserShop {
private Long poolId;
/**
+ * 名称
+ */
+ private String name;
+
+ /**
* 用户id、门店id
*/
private Long referId;
diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupRewardLadders.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupRewardLadders.java
index df8f830..544afd2 100644
--- a/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupRewardLadders.java
+++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupRewardLadders.java
@@ -1,6 +1,7 @@
package cn.fw.morax.domain.db.eval;
import cn.fw.common.data.entity.BaseAuditableTimeEntity;
+import cn.fw.morax.domain.enums.RankOrderTypeEnum;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@@ -52,6 +53,11 @@ public class EvalGroupRewardLadders extends BaseAuditableTimeEntity
+ * 奖惩排名日志
+ *
+ *
+ * @author jiangchao
+ * @since 2022-12-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName(autoResultMap = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class EvalGroupRewardRankLog extends BaseAuditableTimeEntity
+ implements Comparable{
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 员工id
+ */
+ private Long poolId;
+
+ /**
+ * 考评范围; 1:门店考评 2:人员考评
+ */
+ private EvalScopeEnum scopeType;
+
+ /**
+ * 名称
+ */
+ private String name;
+
+ /**
+ * 考评奖惩 前置条件 配置id
+ */
+ private Long referId;
+ /**
+ * 指标类型 1.奖惩提成 2.前置条件指标
+ */
+ private RankIndicatorTypeEnum targetType;
+ /**
+ * 原始值
+ */
+ private BigDecimal value;
+ /**
+ * 达成目标
+ */
+ private BigDecimal reachValue;
+ /**
+ * 排名
+ */
+ private Integer rank;
+ /**
+ * 命中
+ */
+ private Boolean hit;
+
+ /**
+ * 数据日期
+ */
+ private LocalDate dataDate;
+
+ /**
+ * 集团
+ */
+ private Long groupId;
+
+ private Boolean yn;
+
+ @Override
+ public int compareTo(EvalGroupRewardRankLog other) {
+ return other.reachValue.compareTo(this.reachValue);
+ }
+}
diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/dto/eval/EvalGroupRewardLaddersDTO.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/dto/eval/EvalGroupRewardLaddersDTO.java
index fe1d140..663964d 100644
--- a/fw-morax-domain/src/main/java/cn/fw/morax/domain/dto/eval/EvalGroupRewardLaddersDTO.java
+++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/dto/eval/EvalGroupRewardLaddersDTO.java
@@ -4,6 +4,7 @@ import cn.fw.common.data.entity.BaseAuditableTimeEntity;
import cn.fw.morax.common.utils.PublicUtil;
import cn.fw.morax.domain.dto.AbstractLaddersDto;
import cn.fw.morax.domain.dto.kpi.KpiGroupIndicatorLaddersDTO;
+import cn.fw.morax.domain.enums.RankOrderTypeEnum;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@@ -38,6 +39,11 @@ public class EvalGroupRewardLaddersDTO extends AbstractLaddersDto implements Com
// private BigDecimal upper;
/**
+ * 排名顺序类型 1:正 2:负
+ */
+ private RankOrderTypeEnum rankOrderType;
+
+ /**
* 金额
*/
@NotNull(message = "金额不能为空")
diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/enums/RankIndicatorTypeEnum.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/enums/RankIndicatorTypeEnum.java
new file mode 100644
index 0000000..ac14514
--- /dev/null
+++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/enums/RankIndicatorTypeEnum.java
@@ -0,0 +1,74 @@
+package cn.fw.morax.domain.enums;
+
+import com.baomidou.mybatisplus.core.enums.IEnum;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.Getter;
+
+/**
+ * 指标类型
+ *
+ * @author kurisu
+ */
+public enum RankIndicatorTypeEnum implements IEnum {
+ /**
+ * 指标类型 1.奖惩提成 2.前置条件指标
+ */
+ REWARD_COMMISSION(1, "奖惩提成"),
+ PRE(2, "前置条件指标"),
+ ;
+
+ /**
+ * 值
+ */
+ private final Integer value;
+ /**
+ * 名称
+ */
+ @Getter
+ private final String name;
+
+ RankIndicatorTypeEnum(final Integer value, final String name) {
+ this.value = value;
+ this.name = name;
+ }
+
+ /**
+ * 根据枚举值获取枚举对象
+ */
+ @JsonCreator
+ public static RankIndicatorTypeEnum ofValue(final Integer value) {
+ for (final RankIndicatorTypeEnum _enum : RankIndicatorTypeEnum.values()) {
+ if (_enum.value.equals(value)) {
+ return _enum;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 获取值
+ *
+ * @return 值
+ */
+ @JsonValue
+ @Override
+ public Integer getValue() {
+ return value;
+ }
+
+ /**
+ * 获取描述
+ *
+ * @return 值
+ */
+ @JsonCreator
+ public static String getNameByVale(final Integer value) {
+ for (final RankIndicatorTypeEnum _enum : RankIndicatorTypeEnum.values()) {
+ if (_enum.value.equals(value)) {
+ return _enum.getName();
+ }
+ }
+ return "";
+ }
+}
diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/enums/RankOrderTypeEnum.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/enums/RankOrderTypeEnum.java
new file mode 100644
index 0000000..70e9bcf
--- /dev/null
+++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/enums/RankOrderTypeEnum.java
@@ -0,0 +1,74 @@
+package cn.fw.morax.domain.enums;
+
+import com.baomidou.mybatisplus.core.enums.IEnum;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.Getter;
+
+/**
+ * 数据范围范围类型
+ *
+ * @author kurisu
+ */
+public enum RankOrderTypeEnum implements IEnum {
+ /**
+ * 排名顺序类型 1:正 2:负
+ */
+ POSITIVE(1, "正数"),
+ NEGATIVE(2, "负数"),
+ ;
+
+ /**
+ * 值
+ */
+ private final Integer value;
+ /**
+ * 名称
+ */
+ @Getter
+ private final String name;
+
+ RankOrderTypeEnum(final Integer value, final String name) {
+ this.value = value;
+ this.name = name;
+ }
+
+ /**
+ * 根据枚举值获取枚举对象
+ */
+ @JsonCreator
+ public static RankOrderTypeEnum ofValue(final Integer value) {
+ for (final RankOrderTypeEnum _enum : RankOrderTypeEnum.values()) {
+ if (_enum.value.equals(value)) {
+ return _enum;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 获取值
+ *
+ * @return 值
+ */
+ @JsonValue
+ @Override
+ public Integer getValue() {
+ return value;
+ }
+
+ /**
+ * 获取描述
+ *
+ * @return 值
+ */
+ @JsonCreator
+ public static String getNameByVale(final Integer value) {
+ for (final RankOrderTypeEnum _enum : RankOrderTypeEnum.values()) {
+ if (_enum.value.equals(value)) {
+ return _enum.getName();
+ }
+ }
+ return "";
+ }
+}
diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalGroupRewardHitLogVO.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalGroupRewardHitLogVO.java
new file mode 100644
index 0000000..2825ec6
--- /dev/null
+++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalGroupRewardHitLogVO.java
@@ -0,0 +1,89 @@
+package cn.fw.morax.domain.vo.eval;
+
+import cn.fw.morax.common.constant.Constant;
+import cn.fw.morax.domain.enums.DataTypeEnum;
+import cn.fw.morax.domain.enums.EvalScopeEnum;
+import cn.fw.morax.domain.enums.TargetTypeEnum;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+/**
+ * 指标命中记录
+ *
+ * @author : kurisu
+ * @version : 2.0
+ * @className : KpiGroupIndicatorHitLog
+ * @description : 指标命中记录
+ * @date : 2022-12-13 10:27
+ */
+@Data
+public class EvalGroupRewardHitLogVO {
+ /**
+ * id
+ */
+ private Long id;
+ /**
+ * 名称
+ */
+ private String name;
+ /**
+ * 员工id
+ */
+ private Long poolId;
+
+ /**
+ * 考评范围; 1:门店考评 2:人员考评
+ */
+ private EvalScopeEnum scopeType;
+ /**
+ * 奖惩项id
+ */
+ private Long evalGroupRewardId;
+ /**
+ * 命中的奖惩配置项
+ */
+ private Long evalGroupRewardLaddersId;
+ /**
+ * 奖惩值
+ */
+ private BigDecimal rewardValue;
+ /**
+ * 命中的台阶指标值
+ */
+ private BigDecimal hitLadderValue;
+ /**
+ * 命中的提成指标值
+ */
+ private BigDecimal hitCommissionValue;
+ /**
+ * 占比
+ */
+ private BigDecimal proportionValue;
+ /**
+ * 数据日期
+ */
+ private LocalDate dataDate;
+ /**
+ * 集团id
+ */
+ private Long groupId;
+ /**
+ * 逻辑删除
+ */
+ private Boolean yn;
+
+
+ /**
+ * 转换为百分数展示
+ */
+ public void convertValueToPercent(DataTypeEnum laddersType){
+ this.setProportionValue(this.getProportionValue().multiply(Constant.ONE_HUNDRED));
+// if (DataTypeEnum.RATIO.equals(laddersType)) {
+// this.setHitCommissionValue(this.getHitCommissionValue().multiply(Constant.ONE_HUNDRED));
+// }
+ }
+
+
+}
diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalGroupRewardLaddersVO.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalGroupRewardLaddersVO.java
index d797237..f5d9a1d 100644
--- a/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalGroupRewardLaddersVO.java
+++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalGroupRewardLaddersVO.java
@@ -3,10 +3,7 @@ package cn.fw.morax.domain.vo.eval;
import cn.fw.common.data.entity.BaseAuditableTimeEntity;
import cn.fw.morax.common.constant.Constant;
import cn.fw.morax.common.utils.PublicUtil;
-import cn.fw.morax.domain.enums.DataTypeEnum;
-import cn.fw.morax.domain.enums.EvalRewardCalMethodEnum;
-import cn.fw.morax.domain.enums.RankTypeEnum;
-import cn.fw.morax.domain.enums.TargetTypeEnum;
+import cn.fw.morax.domain.enums.*;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@@ -65,6 +62,11 @@ public class EvalGroupRewardLaddersVO {
private Boolean hit;
/**
+ * 排名顺序类型 1:正 2:负
+ */
+ private RankOrderTypeEnum rankOrderType;
+
+ /**
* 转换为百分数展示
*/
public void processPercent(EvalRewardCalMethodEnum calMethod, RankTypeEnum rankType, DataTypeEnum laddersType){
diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalGroupRewardRankLogVO.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalGroupRewardRankLogVO.java
new file mode 100644
index 0000000..24e1b52
--- /dev/null
+++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalGroupRewardRankLogVO.java
@@ -0,0 +1,109 @@
+package cn.fw.morax.domain.vo.eval;
+
+import cn.fw.morax.common.constant.Constant;
+import cn.fw.morax.common.utils.PublicUtil;
+import cn.fw.morax.domain.enums.DataTypeEnum;
+import cn.fw.morax.domain.enums.EvalScopeEnum;
+import cn.fw.morax.domain.enums.RankIndicatorTypeEnum;
+import cn.fw.morax.domain.enums.TargetTypeEnum;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+/**
+ *
+ * 奖惩排名日志
+ *
+ *
+ * @author jiangchao
+ * @since 2022-12-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class EvalGroupRewardRankLogVO {
+
+ private static final long serialVersionUID = 1L;
+ /**
+ * id
+ */
+ private Long id;
+
+ /**
+ * 名称
+ */
+ private String name;
+
+ /**
+ * 员工id
+ */
+ private Long poolId;
+
+ /**
+ * 考评范围; 1:门店考评 2:人员考评
+ */
+ private EvalScopeEnum scopeType;
+
+ /**
+ * 考评奖惩 前置条件 配置id
+ */
+ private Long referId;
+ /**
+ * 指标类型 1.奖惩提成 2.前置条件指标
+ */
+ private RankIndicatorTypeEnum targetType;
+ /**
+ * 原始值
+ */
+ private BigDecimal value;
+ /**
+ * 达成目标
+ */
+ private BigDecimal reachValue;
+ /**
+ * 排名
+ */
+ private Integer rank;
+ /**
+ * 命中
+ */
+ private Boolean hit;
+
+ /**
+ * 数据日期
+ */
+ private LocalDate dataDate;
+
+ /**
+ * 集团
+ */
+ private Long groupId;
+
+ /**
+ * 转换为百分数展示(条件使用)
+ */
+ public void convertPercentForCond(DataTypeEnum dataType, TargetTypeEnum targetType){
+ if (DataTypeEnum.RATIO.equals(dataType)) {
+ this.setValue(this.getValue().multiply(Constant.ONE_HUNDRED));
+ }
+ //有目标
+ if (! TargetTypeEnum.NO.equals(targetType)) {
+ this.setReachValue(this.getReachValue().multiply(Constant.ONE_HUNDRED));
+ }
+ }
+
+ /**
+ * 转换为百分数展示(条件使用)
+ */
+ public void convertPercentForCommission(DataTypeEnum dataType, TargetTypeEnum targetType){
+ if (DataTypeEnum.RATIO.equals(dataType)) {
+ this.setValue(this.getValue().multiply(Constant.ONE_HUNDRED));
+ }
+ //有目标
+ if (! TargetTypeEnum.NO.equals(targetType)) {
+ this.setReachValue(this.getReachValue().multiply(Constant.ONE_HUNDRED));
+ }
+ }
+
+}
diff --git a/fw-morax-server/src/main/java/cn/fw/morax/server/controller/app/EvalPoolController.java b/fw-morax-server/src/main/java/cn/fw/morax/server/controller/app/EvalPoolController.java
index 4197fc6..9f03c0d 100644
--- a/fw-morax-server/src/main/java/cn/fw/morax/server/controller/app/EvalPoolController.java
+++ b/fw-morax-server/src/main/java/cn/fw/morax/server/controller/app/EvalPoolController.java
@@ -14,7 +14,6 @@ import cn.fw.morax.domain.enums.EvalScopeEnum;
import cn.fw.morax.domain.vo.SelectorVO;
import cn.fw.morax.domain.vo.eval.*;
import cn.fw.morax.domain.vo.kpi.KpiIndicatorRankVO;
-import cn.fw.morax.service.biz.SettingDraftBizService;
import cn.fw.morax.service.biz.eval.*;
import cn.fw.security.auth.client.annotation.Authorization;
import cn.fw.security.auth.client.annotation.IgnoreAuth;
@@ -28,12 +27,11 @@ import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotNull;
import java.time.LocalDate;
import java.time.YearMonth;
-import java.time.temporal.ChronoField;
-import java.time.temporal.TemporalAdjuster;
-import java.time.temporal.TemporalAdjusters;
+import java.util.List;
import java.util.Objects;
import java.util.Set;
+import static cn.fw.common.businessvalidator.Validator.BV;
import static cn.fw.common.web.util.ResultBuilder.success;
/**
@@ -195,6 +193,52 @@ public class EvalPoolController {
return success(evalGroupPoolService.queryIndicatorRank(dto, EvalScopeEnum.SHOP));
}
+ /**
+ * 门店、人员考评条件指标排名(排名条件使用)
+ *
+ * @param preconditionId
+ * @param dataDate
+ * @return
+ */
+ @GetMapping("/reward-cond-rank")
+ @ControllerMethod("门店、人员考评条件指标排名")
+ public Message> queryRewardCondRank(Long preconditionId,
+ @NotNull(message = "日期不能为空") @RequestParam("dataDate") LocalDate dataDate) {
+ return success(evalGroupPoolService.getRewardCondRankLogs(preconditionId, dataDate));
+ }
+
+ /**
+ * 门店、人员考评提成指标排名(排名计算使用)
+ *
+ * @param evalGroupRewardId
+ * @param dataDate
+ * @return
+ */
+ @GetMapping("/reward-rank")
+ @ControllerMethod("门店、人员考评奖惩排名")
+ public Message> queryRewardCommissionRank(Long evalGroupRewardId,
+ @NotNull(message = "日期不能为空") @RequestParam("dataDate") LocalDate dataDate) {
+ return success(evalGroupPoolService.queryRewardCommissionRank(evalGroupRewardId, dataDate));
+ }
+
+ /**
+ * 门店、人员考评奖惩占比(占比计算使用)
+ *
+ * @param evalGroupRewardId
+ * @param dataDate
+ * @return
+ */
+ @GetMapping("/reward-proportion")
+ @ControllerMethod("门店、人员考评奖惩占比")
+ public Message> queryUserRewardProportion(@NotNull(message = "奖惩id不能为空") Long evalGroupRewardId,
+ @NotNull(message = "类型不能为空") Integer scopeType,
+ @NotNull(message = "日期不能为空") @RequestParam("dataDate") LocalDate dataDate) {
+ EvalScopeEnum scopeTypeEnum = EvalScopeEnum.ofValue(scopeType);
+ BV.notNull(scopeTypeEnum, "参数错误");
+ return success(evalGroupPoolService.queryRewardProportion(scopeTypeEnum, evalGroupRewardId, dataDate));
+ }
+
+
/**
* 门店考评池列表
diff --git a/fw-morax-server/src/main/java/cn/fw/morax/server/controller/erp/EvalIndicatorController.java b/fw-morax-server/src/main/java/cn/fw/morax/server/controller/erp/EvalIndicatorController.java
index 882a05f..ccb6e23 100644
--- a/fw-morax-server/src/main/java/cn/fw/morax/server/controller/erp/EvalIndicatorController.java
+++ b/fw-morax-server/src/main/java/cn/fw/morax/server/controller/erp/EvalIndicatorController.java
@@ -15,6 +15,7 @@ import cn.fw.morax.service.biz.eval.EvalIndicatorBizService;
import cn.fw.morax.service.biz.eval.EvalIndicatorReportService;
import cn.fw.security.auth.client.annotation.Authorization;
import cn.fw.security.auth.client.annotation.IgnoreAuth;
+import cn.fw.security.auth.client.annotation.IgnoreUserToken;
import cn.fw.security.auth.client.enums.AuthType;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -89,7 +90,7 @@ public class EvalIndicatorController {
*
* @return
*/
- @IgnoreAuth
+ @IgnoreUserToken
@GetMapping("/staff/template-file")
@ControllerMethod("人员模板文件")
public Message staffTemplateFile(HttpServletRequest request, HttpServletResponse response) {
@@ -102,7 +103,7 @@ public class EvalIndicatorController {
*
* @return
*/
- @IgnoreAuth
+ @IgnoreUserToken
@GetMapping("/shop/template-file")
@ControllerMethod("门店模板文件")
public Message shopTemplateFile(HttpServletRequest request, HttpServletResponse response) {
diff --git a/fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalGroupTask.java b/fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalGroupTask.java
index 221aa75..368fb89 100644
--- a/fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalGroupTask.java
+++ b/fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalGroupTask.java
@@ -50,21 +50,14 @@ import java.util.stream.Collectors;
@ConditionalOnProperty(prefix = "task", name = "switch", havingValue = "on")
public class EvalGroupTask {
- private final EvalRewardService evalRewardService;
private final EvalShopPoolService evalShopPoolService;
- private final EvalGroupRewardService evalGroupRewardService;
- private final EvalGroupDataService evalGroupDataService;
- private final EvalGroupBizService evalGroupBizService;
private final EvalGroupService evalGroupService;
private final EvalService evalService;
private final DistributedLocker distributedLocker;
- private final StringRedisTemplate stringRedisTemplate;
- @Value("${spring.cache.custom.global-prefix}:distr:eval-group")
+ @Value("${spring.cache.custom.global-prefix}:eval:group")
@Getter
- private String distributionKey;
- private final static String LOCK_KEY = "eval:group";
- private final static String REWARD_LOCK_KEY = "eval:group:reward";
+ private String evalGroupDistKey;
/**
* 每天凌晨3点
@@ -75,7 +68,7 @@ public class EvalGroupTask {
@Scheduled(cron = TimeTaskConstant.EVAL)
@Transactional(rollbackFor = Exception.class)
public void processCurMonthEffectEvals() {
- Lock lock = distributedLocker.lock(LOCK_KEY);
+ Lock lock = distributedLocker.lock(getEvalGroupDistKey());
if (! ((RLock) lock).isLocked()) {
return;
}
diff --git a/fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalGroupUserTask.java b/fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalGroupUserTask.java
index 68b562c..9d7da42 100644
--- a/fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalGroupUserTask.java
+++ b/fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalGroupUserTask.java
@@ -11,9 +11,11 @@ import cn.fw.morax.service.data.eval.EvalGroupUserService;
import cn.hutool.core.date.StopWatch;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.common.collect.Lists;
+import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@@ -41,10 +43,11 @@ public class EvalGroupUserTask {
private final EvalGroupUserBizService evalGroupUserBizService;
private final EvalGroupUserService evalGroupUserService;
- private final EvalGroupBizService evalGroupBizService;
private final DistributedLocker distributedLocker;
- private final static String LOCK_KEY = "eval:group:user";
+ @Value("${spring.cache.custom.global-prefix}:eval:group:user")
+ @Getter
+ private String evalGroupUserDistKey;
/**
* 每天凌晨30分执行(人事角色、岗位调整在5点执行)
@@ -55,7 +58,7 @@ public class EvalGroupUserTask {
@Scheduled(cron = TimeTaskConstant.EVAL_GROUP_USER)
@Transactional(rollbackFor = Exception.class)
public void processEvalUser() {
- Lock lock = distributedLocker.lock(LOCK_KEY);
+ Lock lock = distributedLocker.lock(getEvalGroupUserDistKey());
if (((RLock) lock).isLocked()) {
try {
log.info("定时任务【考评组人员更新】开始执行");
diff --git a/fw-morax-server/src/main/java/cn/fw/morax/server/task/KpiGroupUserTask.java b/fw-morax-server/src/main/java/cn/fw/morax/server/task/KpiGroupUserTask.java
index 8414060..610cf40 100644
--- a/fw-morax-server/src/main/java/cn/fw/morax/server/task/KpiGroupUserTask.java
+++ b/fw-morax-server/src/main/java/cn/fw/morax/server/task/KpiGroupUserTask.java
@@ -14,9 +14,11 @@ import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@@ -45,8 +47,9 @@ public class KpiGroupUserTask {
private final KpiGroupBizService kpiGroupBizService;
private final DistributedLocker distributedLocker;
- private final static String LOCK_KEY = "kpi:group:user";
-
+ @Value("${spring.cache.custom.global-prefix}:kpi:group:user")
+ @Getter
+ private String kpiGroupUserDistKey;
/**
* 每天凌晨30分执行(人事角色、岗位调整在5点执行)
* 1. 将待生效数据改为生效中
@@ -56,7 +59,7 @@ public class KpiGroupUserTask {
@Scheduled(cron = TimeTaskConstant.KPI_GROUP_USER)
@Transactional(rollbackFor = Exception.class)
public void processKpiUser() {
- Lock lock = distributedLocker.lock(LOCK_KEY);
+ Lock lock = distributedLocker.lock(getKpiGroupUserDistKey());
if (((RLock) lock).isLocked()) {
try {
log.info("定时任务【绩效组人员更新】开始执行");
diff --git a/fw-morax-server/src/main/java/cn/fw/morax/server/task/KpiReportRatioTask.java b/fw-morax-server/src/main/java/cn/fw/morax/server/task/KpiReportRatioTask.java
index 6f99aa3..4c932a6 100644
--- a/fw-morax-server/src/main/java/cn/fw/morax/server/task/KpiReportRatioTask.java
+++ b/fw-morax-server/src/main/java/cn/fw/morax/server/task/KpiReportRatioTask.java
@@ -19,10 +19,12 @@ import cn.fw.morax.service.data.kpi.KpiPoolService;
import cn.fw.morax.service.data.kpi.KpiRatioService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.common.collect.Lists;
+import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.map.MultiKeyMap;
import org.redisson.api.RLock;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@@ -58,7 +60,9 @@ public class KpiReportRatioTask {
private final EhrRpcService ehrRpcService;
private final OopRpcService oopRpcService;
- private final static String LOCK_KEY = "kpi:group:report";
+ @Value("${spring.cache.custom.global-prefix}:kpi:group:report")
+ @Getter
+ private String kpiGroupReportDistKey;
/**
* 绩效报表定时任务
@@ -77,7 +81,7 @@ public class KpiReportRatioTask {
*/
@Transactional(rollbackFor = Exception.class)
public void kpiReport(LocalDate date) {
- Lock lock = distributedLocker.lock(LOCK_KEY);
+ Lock lock = distributedLocker.lock(getKpiGroupReportDistKey());
if (! ((RLock) lock).isLocked()) {
return;
}
diff --git a/fw-morax-server/src/main/java/cn/fw/morax/server/task/PayoffTask.java b/fw-morax-server/src/main/java/cn/fw/morax/server/task/PayoffTask.java
index 9478fcf..0fc5618 100644
--- a/fw-morax-server/src/main/java/cn/fw/morax/server/task/PayoffTask.java
+++ b/fw-morax-server/src/main/java/cn/fw/morax/server/task/PayoffTask.java
@@ -6,9 +6,11 @@ import cn.fw.morax.rpc.oop.OopRpcService;
import cn.fw.morax.rpc.oop.dto.GroupDTO;
import cn.fw.morax.service.biz.salary.PayoffBizService;
import cn.fw.morax.service.biz.salary.SalaryConfirmBizService;
+import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@@ -31,11 +33,14 @@ import java.util.concurrent.locks.Lock;
@ConditionalOnProperty(prefix = "task", name = "switch", havingValue = "on")
public class PayoffTask {
private final PayoffBizService payoffBizService;
- private final static String LOCK_KEY = ":createSalarySheet";
private final DistributedLocker distributedLocker;
private final OopRpcService oopRpcService;
private final SalaryConfirmBizService salaryConfirmBizService;
+ @Value("${spring.cache.custom.global-prefix}:createSalarySheet")
+ @Getter
+ private String createSalarySheetKey;
+
@Autowired
public PayoffTask(final PayoffBizService payoffBizService,
final DistributedLocker distributedLocker,
@@ -71,7 +76,7 @@ public class PayoffTask {
*/
@Scheduled(cron = "0 0 0/2 * * ?")
public void createSalarySheet() {
- Lock lock = distributedLocker.lock(LOCK_KEY);
+ Lock lock = distributedLocker.lock(getCreateSalarySheetKey());
if (((RLock) lock).isLocked()) {
List list = oopRpcService.allGroups();
if (!CollectionUtils.isEmpty(list)) {
diff --git a/fw-morax-server/src/main/java/cn/fw/morax/server/task/SalaryGroupTask.java b/fw-morax-server/src/main/java/cn/fw/morax/server/task/SalaryGroupTask.java
index 4467779..90c6cb4 100644
--- a/fw-morax-server/src/main/java/cn/fw/morax/server/task/SalaryGroupTask.java
+++ b/fw-morax-server/src/main/java/cn/fw/morax/server/task/SalaryGroupTask.java
@@ -12,9 +12,11 @@ import cn.fw.morax.service.biz.salary.SalaryGroupUserBizService;
import cn.fw.morax.service.data.salary.SalaryGroupService;
import cn.hutool.core.date.StopWatch;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@@ -44,7 +46,9 @@ public class SalaryGroupTask {
private final SalaryGroupService salaryGroupService;
private final DistributedLocker distributedLocker;
- private final static String LOCK_KEY = "salary:group";
+ @Value("${spring.cache.custom.global-prefix}:salary:group")
+ @Getter
+ private String salaryGroupKey;
/**
* 每个月1号凌晨3点执行
@@ -55,7 +59,7 @@ public class SalaryGroupTask {
@Scheduled(cron = TimeTaskConstant.SALARY_GROUP)
@Transactional(rollbackFor = Exception.class)
public void processCurMonthEffectSalaryGroup() {
- Lock lock = distributedLocker.lock(LOCK_KEY);
+ Lock lock = distributedLocker.lock(getSalaryGroupKey());
if (((RLock) lock).isLocked()) {
try {
log.info("定时任务【每月薪酬组配置状态改变】开始执行");
diff --git a/fw-morax-server/src/main/java/cn/fw/morax/server/task/SalaryPoolFundShopTask.java b/fw-morax-server/src/main/java/cn/fw/morax/server/task/SalaryPoolFundShopTask.java
index 71ef191..fd08920 100644
--- a/fw-morax-server/src/main/java/cn/fw/morax/server/task/SalaryPoolFundShopTask.java
+++ b/fw-morax-server/src/main/java/cn/fw/morax/server/task/SalaryPoolFundShopTask.java
@@ -11,9 +11,11 @@ import cn.fw.morax.rpc.ehr.dto.StaffShopInfoDTO;
import cn.fw.morax.service.data.salary.SalaryPoolService;
import com.google.common.base.Functions;
import com.google.common.collect.Lists;
+import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@@ -43,7 +45,9 @@ public class SalaryPoolFundShopTask {
private final SalaryPoolService salaryPoolService;
private final EhrRpcService ehrRpcService;
- private final static String LOCK_KEY = "salary:pool:fund";
+ @Value("${spring.cache.custom.global-prefix}:salary:pool:fund")
+ @Getter
+ private String salaryPoolFundKey;
/**
* 每月第一天凌晨执行,薪酬池写入社保公积金门店
@@ -53,7 +57,7 @@ public class SalaryPoolFundShopTask {
@Scheduled(cron = TimeTaskConstant.SALARY_POOL_FUND_SHOP)
@Transactional(rollbackFor = Exception.class)
public void dealSalaryPoolFundShop() {
- Lock lock = distributedLocker.lock(LOCK_KEY);
+ Lock lock = distributedLocker.lock(getSalaryPoolFundKey());
if (((RLock) lock).isLocked()) {
try {
log.info("定时任务【酬池写入社保公积金门店】开始执行");
diff --git a/fw-morax-server/src/main/java/cn/fw/morax/server/task/SalaryReportTask.java b/fw-morax-server/src/main/java/cn/fw/morax/server/task/SalaryReportTask.java
index c043236..c5c780c 100644
--- a/fw-morax-server/src/main/java/cn/fw/morax/server/task/SalaryReportTask.java
+++ b/fw-morax-server/src/main/java/cn/fw/morax/server/task/SalaryReportTask.java
@@ -21,10 +21,12 @@ import cn.fw.morax.service.data.salary.SalaryRewardService;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.common.collect.Lists;
+import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.map.MultiKeyMap;
import org.redisson.api.RLock;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@@ -60,7 +62,9 @@ public class SalaryReportTask {
private final OopRpcService oopRpcService;
private final DistributedLocker distributedLocker;
- private final static String LOCK_KEY = "kpi:group:report";
+ @Value("${spring.cache.custom.global-prefix}:salary:group:report")
+ @Getter
+ private String salaryGroupReport;
/**
* 绩效报表定时任务
@@ -78,7 +82,7 @@ public class SalaryReportTask {
*/
@Transactional(rollbackFor = Exception.class)
public void salaryReport(LocalDate date) {
- Lock lock = distributedLocker.lock(LOCK_KEY);
+ Lock lock = distributedLocker.lock(getSalaryGroupReport());
if (!((RLock) lock).isLocked()) {
return;
}
diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/CommonService.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/CommonService.java
index 472b63f..7772374 100644
--- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/CommonService.java
+++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/CommonService.java
@@ -6,6 +6,7 @@ import cn.fw.morax.common.constant.Constant;
import cn.fw.morax.common.utils.ExcelDataUtil;
import cn.fw.morax.common.utils.PublicUtil;
import cn.fw.morax.domain.db.SettingDraft;
+import cn.fw.morax.domain.db.eval.EvalGroupRewardRankLog;
import cn.fw.morax.domain.db.eval.EvalIndicatorValue;
import cn.fw.morax.domain.db.kpi.IndicatorUserValue;
import cn.fw.morax.domain.db.kpi.KpiGroup;
@@ -15,6 +16,7 @@ import cn.fw.morax.domain.enums.IndicatorValueTypeEnum;
import cn.fw.morax.domain.enums.SettingDraftStatusEnum;
import cn.fw.morax.domain.enums.SettingDraftTypeEnum;
import cn.fw.morax.domain.vo.kpi.IndicatorUserValueVO;
+import cn.fw.morax.domain.vo.kpi.KpiIndicatorRankStaffVO;
import cn.fw.morax.rpc.ehr.EhrRpcService;
import cn.fw.morax.rpc.ehr.dto.StaffBaseInfoDTO;
import cn.fw.morax.service.data.SettingDraftService;
@@ -368,4 +370,27 @@ public class CommonService {
return settingDrafts;
}
+ /**
+ * 设置排名序号
+ *
+ * @return
+ */
+ public void calcRank(List rankLogs) {
+ int rank = 1;
+ BigDecimal lastIndicatorValue = null;
+ for (EvalGroupRewardRankLog rankLog : rankLogs) {
+ //初始化
+ if (PublicUtil.isEmpty(lastIndicatorValue)) {
+ rankLog.setRank(rank);
+ lastIndicatorValue = rankLog.getReachValue();
+ continue;
+ }
+ if (lastIndicatorValue.compareTo(rankLog.getReachValue()) != 0) {
+ rank++;
+ }
+ rankLog.setRank(rank);
+ lastIndicatorValue = rankLog.getReachValue();
+ }
+ }
+
}
diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardBaseCalculator.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardBaseCalculator.java
index 1b0352d..cfe7d03 100644
--- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardBaseCalculator.java
+++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardBaseCalculator.java
@@ -6,12 +6,15 @@ import cn.fw.morax.domain.bo.eval.EvalGroupUserShop;
import cn.fw.morax.domain.db.eval.*;
import cn.fw.morax.domain.db.kpi.IndicatorUserValue;
import cn.fw.morax.domain.enums.*;
+import cn.fw.morax.service.biz.CommonService;
import cn.fw.morax.service.biz.calculator.Calculator;
import cn.fw.morax.service.data.eval.*;
import cn.fw.morax.service.data.kpi.IndicatorUserValueService;
+import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.google.common.collect.Lists;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -29,7 +32,6 @@ import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -47,6 +49,8 @@ import java.util.stream.Collectors;
public abstract class EvalRewardBaseCalculator implements Calculator {
@Autowired
+ protected EvalGroupRewardRankLogService evalGroupRewardRankLogService;
+ @Autowired
protected EvalGroupRewardHitLogService evalGroupRewardHitLogService;
@Autowired
protected EvalGroupRewardPreconditionHitLogService evalGroupRewardPreconditionHitLogService;
@@ -68,6 +72,8 @@ public abstract class EvalRewardBaseCalculator implements Calculator queryRewardLadders(final Long evalGroupRewardId) {
List ladders = evalGroupRewardLaddersService.list(Wrappers.lambdaQuery()
.eq(EvalGroupRewardLadders::getEvalGroupRewardId, evalGroupRewardId)
- .eq(EvalGroupRewardLadders::getYn, Boolean.TRUE));
+ .eq(EvalGroupRewardLadders::getYn, Boolean.TRUE)
+ );
if (CollectionUtils.isEmpty(ladders)) {
return Collections.emptyList();
}
@@ -168,54 +175,50 @@ public abstract class EvalRewardBaseCalculator implements Calculator userShops, List preconditions) {
if (CollectionUtils.isEmpty(preconditions)) {
return;
}
for (EvalGroupRewardPrecondition precondition : preconditions) {
- final String indicatorCode = precondition.getCode();
final Long preconditionId = precondition.getId();
- final TargetTypeEnum targetType = precondition.getTargetType();
- final BigDecimal targetValue = precondition.getTargetValue();
- final TargetCalcTypeEnum targetCalcType = precondition.getTargetCalcType();
final BigDecimal personCount = BigDecimal.valueOf(userShops.size());
- final Integer startIndex = 0;
final BigDecimal condValue = precondition.getCondValue();
+ final Integer startIndex = 0;
final Integer endIndex = condValue.multiply(personCount).divide(BigDecimal.ONE, 0, RoundingMode.FLOOR).intValue() - 1;
- String key = getPreconditionRank() + ":" + precondition.getId();
- BoundZSetOperations zSetOps = stringRedisTemplate.boundZSetOps(key);
- stringRedisTemplate.expireAt(key, DateUtil.localDateTime2Date(LocalDateTime.now().plus(2L, ChronoUnit.HOURS)));
- for (EvalGroupUserShop userShop : userShops) {
- final BigDecimal indicatorValue = queryValue(userShop, precondition.getCodeType(), indicatorCode).orElse(BigDecimal.ZERO);
- BigDecimal reachValue = indicatorValue;
- if (!TargetTypeEnum.NO.equals(targetType)) {
- reachValue = calculateTargetValue(targetCalcType, targetValue, indicatorValue);
- }
- saveTargetHitLog(userShop, preconditionId, IndicatorTypeEnum.PRE, indicatorValue, reachValue);
- zSetOps.add(userShop.getPoolId().toString(), reachValue.doubleValue());
- }
+ //计算排名
+ List rankLogs = calculateRankPreconditionValue(userShops, precondition);
+ Collections.sort(rankLogs);
+ commonService.calcRank(rankLogs);
+ saveRankLogs(preconditionId, rankLogs, RankIndicatorTypeEnum.PRE);
+ Map poolUserShopMap = userShops.stream().collect(Collectors.toMap(EvalGroupUserShop::getPoolId,
+ Function.identity(), (v1, v2) -> v1));
if (startIndex > endIndex) {
continue;
}
- Map userShopMap = userShops.stream().collect(Collectors.toMap(EvalGroupUserShop::getPoolId, Function.identity(), (v1, v2) -> v1));
- Set> referIdStrs = zSetOps.reverseRangeWithScores(startIndex, endIndex);
+ Integer _startIndex = startIndex, _endIndex = endIndex;;
+ List matchRankLogs = rankLogs.stream().filter(rankLog -> {
+ return rankLog.getRank() > _startIndex && rankLog.getRank() <= _endIndex;
+ }).collect(Collectors.toList());
+ updateHitRankLog(matchRankLogs);
+
AtomicInteger rank = new AtomicInteger(0);
- referIdStrs.stream().forEach(stringTypedTuple -> {
- EvalGroupUserShop userShop = userShopMap.get(Long.parseLong(stringTypedTuple.getValue()));
+ for (EvalGroupRewardRankLog rankLog : matchRankLogs) {
+ EvalGroupUserShop userShop = poolUserShopMap.get(rankLog.getPoolId());
if (PublicUtil.isNotEmpty(userShop)) {
List meetRankCondIds = Optional.ofNullable(userShop.getMeetRankCondIds()).orElse(new ArrayList<>());
meetRankCondIds.add(preconditionId);
userShop.setMeetRankCondIds(meetRankCondIds);
savePreHitLog(userShop, precondition, log -> {
- log.setReachValue(new BigDecimal(stringTypedTuple.getScore().toString()));
+ log.setReachValue(rankLog.getReachValue());
log.setCondValue(new BigDecimal(endIndex + 1));
log.setRank(rank.incrementAndGet());
});
}
- });
+ }
}
}
@@ -238,6 +241,7 @@ public abstract class EvalRewardBaseCalculator implements CalculatorlambdaQuery()
.eq(EvalGroupRewardTargetHitLog::getPoolId, userShop.getPoolId())
@@ -259,6 +263,7 @@ public abstract class EvalRewardBaseCalculator implements Calculator consumer) {
evalGroupRewardPreconditionHitLogService.remove(Wrappers.lambdaQuery()
.eq(EvalGroupRewardPreconditionHitLog::getPoolId, userShop.getPoolId())
@@ -435,6 +440,115 @@ public abstract class EvalRewardBaseCalculator implements Calculator calculateRankParamValue(List userShops, Long evalGroupRewardId, List params) {
+ List rankLogs = Lists.newArrayListWithCapacity(userShops.size());
+ for (EvalGroupUserShop userShop : userShops) {
+ BigDecimal commissionValue = BigDecimal.ZERO;
+ for (EvalGroupRewardParam param: params) {
+ String indicatorCode = param.getCode();
+ boolean isCap = Boolean.TRUE.equals(param.getCap());
+ BigDecimal proportion = param.getProportion();
+ TargetTypeEnum targetType = param.getTargetType();
+ final BigDecimal userOriginValue = queryValue(userShop, param.getCodeType(), indicatorCode).orElse(BigDecimal.ZERO);
+ BigDecimal _calcValue = userOriginValue;
+ if (!TargetTypeEnum.NO.equals(targetType)) {
+ _calcValue = calculateTargetValue(param.getTargetCalcType(), param.getTargetValue(), _calcValue);
+ saveTargetHitLog(userShop, param.getId(), IndicatorTypeEnum.EXAMINE, userOriginValue, _calcValue);
+ }
+ if (isCap) {
+ _calcValue = _calcValue.compareTo(BigDecimal.ONE) > 0 ? BigDecimal.ONE : _calcValue;
+ }
+ commissionValue = commissionValue.add(proportion.multiply(_calcValue));
+ }
+ EvalGroupRewardRankLog rankLog = EvalGroupRewardRankLog.builder()
+ .poolId(userShop.getPoolId())
+ .name(userShop.getName())
+ .scopeType(userShop.getScopeType())
+ .referId(evalGroupRewardId)
+ .targetType(RankIndicatorTypeEnum.REWARD_COMMISSION)
+ .value(commissionValue)
+ .reachValue(commissionValue)
+ .hit(Boolean.FALSE)
+ .dataDate(userShop.getDataDate())
+ .groupId(userShop.getGroupId())
+ .build();
+ rankLogs.add(rankLog);
+ }
+ return rankLogs;
+ }
+
+ /**
+ * 计算排名条件最终值
+ *
+ * @param userShops
+ * @param precondition
+ * @return
+ */
+ protected List calculateRankPreconditionValue(List userShops, EvalGroupRewardPrecondition precondition) {
+ final String indicatorCode = precondition.getCode();
+ final Long preconditionId = precondition.getId();
+ final TargetTypeEnum targetType = precondition.getTargetType();
+ final BigDecimal targetValue = precondition.getTargetValue();
+ final TargetCalcTypeEnum targetCalcType = precondition.getTargetCalcType();
+
+ List rankLogs = Lists.newArrayListWithCapacity(userShops.size());
+ for (EvalGroupUserShop userShop : userShops) {
+ final BigDecimal indicatorValue = queryValue(userShop, precondition.getCodeType(), indicatorCode).orElse(BigDecimal.ZERO);
+ BigDecimal reachValue = indicatorValue;
+ if (!TargetTypeEnum.NO.equals(targetType)) {
+ reachValue = calculateTargetValue(targetCalcType, targetValue, indicatorValue);
+ }
+
+ EvalGroupRewardRankLog rankLog = EvalGroupRewardRankLog.builder()
+ .name(userShop.getName())
+ .poolId(userShop.getPoolId())
+ .scopeType(userShop.getScopeType())
+ .referId(preconditionId)
+ .targetType(RankIndicatorTypeEnum.PRE)
+ .value(indicatorValue)
+ .reachValue(reachValue)
+ .dataDate(userShop.getDataDate())
+ .groupId(userShop.getGroupId())
+ .build();
+ rankLogs.add(rankLog);
+ }
+ return rankLogs;
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ public void saveRankLogs(Long evalGroupRewardId, List rankLogs, RankIndicatorTypeEnum targetType) {
+ Set poolIds = rankLogs.stream().map(EvalGroupRewardRankLog::getPoolId).collect(Collectors.toSet());
+ EvalGroupRewardRankLog rankLog = rankLogs.stream().findFirst().get();
+ evalGroupRewardRankLogService.remove(Wrappers.lambdaQuery()
+ .in(EvalGroupRewardRankLog::getPoolId, poolIds)
+ .eq(EvalGroupRewardRankLog::getScopeType, rankLog.getScopeType())
+ .eq(EvalGroupRewardRankLog::getReferId, evalGroupRewardId)
+ .eq(EvalGroupRewardRankLog::getTargetType, targetType)
+ .eq(EvalGroupRewardRankLog::getGroupId, rankLog.getGroupId())
+ );
+
+ evalGroupRewardRankLogService.saveBatch(rankLogs);
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ public void updateHitRankLog(List matchRankLogs) {
+ if (PublicUtil.isEmpty(matchRankLogs)) {
+ return;
+ }
+ evalGroupRewardRankLogService.update(Wrappers.lambdaUpdate()
+ .in(EvalGroupRewardRankLog::getId, matchRankLogs.stream().map(EvalGroupRewardRankLog::getId).collect(Collectors.toList()))
+ .set(EvalGroupRewardRankLog::getHit, Boolean.TRUE)
+ );
+ }
+
+ /**
* 初始化奖惩值
*
* @param userShops
diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardProportionCalculator.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardProportionCalculator.java
index 2cc0648..39be6c9 100644
--- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardProportionCalculator.java
+++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardProportionCalculator.java
@@ -69,25 +69,8 @@ public class EvalRewardProportionCalculator extends EvalRewardBaseCalculator {
referValueMap.put(poolId, commissionValue);
}
- if (BigDecimal.ZERO.compareTo(totalCommissionValue) == 0) {
- for (EvalGroupUserShop userShop : userShops) {
- BigDecimal proportion = BigDecimal.ZERO;
- BigDecimal rewardValue = BigDecimal.ZERO;
- userShop.setEvalGroupRewardAmount(rewardValue);
- clearProjectHitLog(evalGroupRewardId, userShop);
- saveProjectHitLog(evalGroupRewardId, userShop, log -> {
- log.setRewardValue(rewardValue);
- log.setHitCommissionValue(proportion);
- });
- }
- }
-
for (EvalGroupUserShop userShop : userShops) {
boolean examined = examinePrecondition(userShop, preconditions);
- if (!examined) {
- userShop.setEvalGroupRewardAmount(BigDecimal.ZERO);
- continue;
- }
BigDecimal commissionValue = referValueMap.getOrDefault(userShop.getPoolId(), BigDecimal.ZERO);
@@ -98,6 +81,11 @@ public class EvalRewardProportionCalculator extends EvalRewardBaseCalculator {
rewardValue = proportion.multiply(money).divide(BigDecimal.ONE, 2, RoundingMode.DOWN);
}
+ //未通过条件,奖惩为0,保存日志
+ if (!examined) {
+ rewardValue = BigDecimal.ZERO;
+ }
+
userShop.setEvalGroupRewardAmount(rewardValue);
clearProjectHitLog(evalGroupRewardId, userShop);
BigDecimal finalRewardValue = rewardValue;
diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardRankCalculator.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardRankCalculator.java
index ac89a52..0334194 100644
--- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardRankCalculator.java
+++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardRankCalculator.java
@@ -1,33 +1,25 @@
package cn.fw.morax.service.biz.calculator.eval.reward;
-import cn.fw.morax.common.utils.DateUtil;
import cn.fw.morax.common.utils.PublicUtil;
import cn.fw.morax.domain.bo.eval.EvalGroupUserShop;
-import cn.fw.morax.domain.db.eval.EvalGroupReward;
-import cn.fw.morax.domain.db.eval.EvalGroupRewardLadders;
-import cn.fw.morax.domain.db.eval.EvalGroupRewardParam;
-import cn.fw.morax.domain.db.eval.EvalGroupRewardPrecondition;
-import cn.fw.morax.domain.enums.EvalRewardCalMethodEnum;
-import cn.fw.morax.domain.enums.ParamTypeEnum;
-import cn.fw.morax.domain.enums.RankTypeEnum;
+import cn.fw.morax.domain.db.eval.*;
+import cn.fw.morax.domain.enums.*;
+import cn.fw.morax.service.biz.CommonService;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.sun.org.apache.regexp.internal.RE;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
-import org.springframework.data.redis.core.BoundZSetOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.temporal.ChronoUnit;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
/**
* @author jiangchao
@@ -39,11 +31,7 @@ import java.util.Set;
@RequiredArgsConstructor
public class EvalRewardRankCalculator extends EvalRewardBaseCalculator {
- private final StringRedisTemplate stringRedisTemplate;
-
- @Value("${spring.cache.custom.global-prefix}:eval:reward:rank")
- @Getter
- private String rank;
+ private final CommonService commonService;
@Override
public EvalRewardCalMethodEnum getCalMethod() {
@@ -62,7 +50,6 @@ public class EvalRewardRankCalculator extends EvalRewardBaseCalculator {
}
initReward(userShops);
final Long evalGroupRewardId = reward.getId();
- final String key = getRank() + evalGroupRewardId;
RankTypeEnum rankType = reward.getRankType();
List preconditions = queryPrecondition(evalGroupRewardId);
List params = queryProjectParam(evalGroupRewardId, ParamTypeEnum.LADDER);
@@ -70,48 +57,32 @@ public class EvalRewardRankCalculator extends EvalRewardBaseCalculator {
return;
}
- BoundZSetOperations zSetOps = stringRedisTemplate.boundZSetOps(key);
- stringRedisTemplate.expireAt(key, DateUtil.localDateTime2Date(LocalDateTime.now().plus(2L, ChronoUnit.HOURS)));
-
- Map rewardObjectBOMap = new HashMap<>();
- Map referCommonMap = new HashMap<>();
- for (EvalGroupUserShop rewardObject : userShops) {
- BigDecimal commissionValue = calculateParamValue(rewardObject, params);
- zSetOps.add(rewardObject.getReferId().toString(), commissionValue.doubleValue());
-
- referCommonMap.put(rewardObject.getReferId().toString(), commissionValue);
- rewardObjectBOMap.put(rewardObject.getReferId().toString(), rewardObject);
- }
+ //计算排名
+ List rankLogs = calculateRankParamValue(userShops, evalGroupRewardId, params);
+ Collections.sort(rankLogs);
+ commonService.calcRank(rankLogs);
+ saveRankLogs(evalGroupRewardId, rankLogs, RankIndicatorTypeEnum.REWARD_COMMISSION);
+ Map poolUserShopMap = userShops.stream().collect(Collectors.toMap(EvalGroupUserShop::getPoolId,
+ Function.identity(), (v1, v2) -> v1));
+ //计算金额
final BigDecimal personCount = BigDecimal.valueOf(userShops.size());
List ladders = queryRewardLadders(evalGroupRewardId);
for (EvalGroupRewardLadders ladder : ladders) {
final BigDecimal money = ladder.getMoney();
- Integer startIndex = null;
- Integer endIndex = null;
-
- if (RankTypeEnum.PERCENT.equals(rankType)) {
- startIndex = ladder.getLower().multiply(personCount).divide(BigDecimal.ONE, 0, RoundingMode.FLOOR).intValue();
- endIndex = ladder.getUpper().multiply(personCount).divide(BigDecimal.ONE, 0, RoundingMode.FLOOR).intValue() - 1;
- } else {
- startIndex = ladder.getLower().intValue() - 1;
- endIndex = ladder.getUpper().intValue()- 1;
- }
- if (startIndex > endIndex) {
- continue;
- }
+ List matchRankLogs = matchRank(rankType, personCount, ladder, rankLogs);
+ updateHitRankLog(matchRankLogs);
- Set referIdStrs = zSetOps.reverseRange(startIndex, endIndex);
- for (String referIdStr : referIdStrs) {
- EvalGroupUserShop userShop = rewardObjectBOMap.get(referIdStr);
+ for (EvalGroupRewardRankLog rankLog : matchRankLogs) {
+ EvalGroupUserShop userShop = poolUserShopMap.get(rankLog.getPoolId());
boolean examined = examinePrecondition(userShop, preconditions);
if (!examined) {
userShop.setEvalGroupRewardAmount(BigDecimal.ZERO);
continue;
}
userShop.setEvalGroupRewardAmount(money);
- BigDecimal hitCommissionValue = referCommonMap.get(referIdStr);
+ BigDecimal hitCommissionValue = rankLog.getReachValue();
clearProjectHitLog(evalGroupRewardId, userShop);
saveProjectHitLog(evalGroupRewardId, userShop, log -> {
log.setRewardValue(money);
@@ -124,5 +95,65 @@ public class EvalRewardRankCalculator extends EvalRewardBaseCalculator {
}
+ /**
+ * 匹配排名
+ *
+ * @param rankType
+ * @param personCount
+ * @param ladder
+ * @param rankLogs
+ * @return
+ */
+ public List matchRank(final RankTypeEnum rankType,
+ final BigDecimal personCount,
+ EvalGroupRewardLadders ladder,
+ List rankLogs) {
+ BigDecimal lower = ladder.getLower();
+ BigDecimal upper = ladder.getUpper();
+ RankOrderTypeEnum rankOrderType = ladder.getRankOrderType();
+ Integer startIndex ;
+ Integer endIndex ;
+
+ //百分比
+ if (RankTypeEnum.PERCENT.equals(rankType)) {
+ if (RankOrderTypeEnum.NEGATIVE.equals(rankOrderType)) {
+ lower = BigDecimal.ONE.subtract(ladder.getUpper());
+ upper = BigDecimal.ONE.subtract(ladder.getLower());
+ }
+ startIndex = lower.multiply(personCount).divide(BigDecimal.ONE, 0, RoundingMode.FLOOR).intValue();
+ endIndex = upper.multiply(personCount).divide(BigDecimal.ONE, 0, RoundingMode.FLOOR).intValue();
+
+ if (startIndex > endIndex) {
+ return new ArrayList<>();
+ }
+
+ Integer finalEndIndex = endIndex,finalStartIndex = startIndex;
+ List matchRankLogs = rankLogs.stream().filter(rankLog -> {
+ return rankLog.getRank() > finalStartIndex && rankLog.getRank() <= finalEndIndex;
+ }).collect(Collectors.toList());
+ return matchRankLogs;
+ }
+
+ //名次
+ if (RankOrderTypeEnum.NEGATIVE.equals(rankOrderType)) {
+ startIndex = personCount.subtract(upper).intValue() + 1;
+ endIndex = personCount.subtract(lower).intValue() + 1;
+ } else {
+ startIndex = ladder.getLower().intValue();
+ endIndex = ladder.getUpper().intValue();
+ }
+
+ if (startIndex > endIndex) {
+ return new ArrayList<>();
+ }
+
+ Integer finalEndIndex = endIndex,finalStartIndex = startIndex;
+ List matchRankLogs = rankLogs.stream().filter(rankLog -> {
+ return rankLog.getRank() >= finalStartIndex && rankLog.getRank() <= finalEndIndex;
+ }).collect(Collectors.toList());
+
+ return matchRankLogs;
+ }
+
}
diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/kpi/KpiAbsBaseCalculator.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/kpi/KpiAbsBaseCalculator.java
index 07c36b2..ce3b286 100644
--- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/kpi/KpiAbsBaseCalculator.java
+++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/kpi/KpiAbsBaseCalculator.java
@@ -8,19 +8,19 @@ import cn.fw.morax.domain.enums.TargetCalcTypeEnum;
import cn.fw.morax.domain.enums.TargetTypeEnum;
import cn.fw.morax.service.biz.calculator.Calculator;
import cn.fw.morax.service.data.kpi.*;
+import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.google.common.base.Strings;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
+import java.util.*;
import java.util.function.Consumer;
/**
@@ -47,6 +47,20 @@ public abstract class KpiAbsBaseCalculator implements Calculator set = new HashSet<>();
+ set.add(1L);
+ set.add(2L);
+ set.add(3L);
+ String json = JSON.toJSONString(set);
+ System.out.println(json);
+ List set2 = JSON.parseArray(json, Long.class);
+ System.out.println(set2.toString());
+ System.out.println(Arrays.toString(set2.toArray()));
+ String join = StringUtils.join(",", set);
+ System.out.println(join);
+ }
+
/**
* 获取设置类型
*
diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalCalculateService.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalCalculateService.java
index 3dd3626..b0da103 100644
--- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalCalculateService.java
+++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalCalculateService.java
@@ -413,6 +413,7 @@ public class EvalCalculateService {
public EvalGroupUserShop convertBO(EvalGroupUser user, EvalUserPool userPool) {
EvalGroupUserShop userShop = new EvalGroupUserShop();
+ userShop.setName(user.getUserName());
userShop.setScopeType(EvalScopeEnum.STAFF);
userShop.setEvalGroupId(user.getEvalGroupId());
userShop.setPoolId(userPool.getId());
@@ -426,6 +427,7 @@ public class EvalCalculateService {
public EvalGroupUserShop convertBO(EvalShopPool shopPool, EvalGroup evalGroup, LocalDate dataDate) {
EvalGroupUserShop userShop = new EvalGroupUserShop();
+ userShop.setName(shopPool.getShopName());
userShop.setReferId(shopPool.getShopId());
userShop.setPoolId(shopPool.getId());
userShop.setScopeType(EvalScopeEnum.SHOP);
diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupBizService.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupBizService.java
index b62196e..5760ceb 100644
--- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupBizService.java
+++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupBizService.java
@@ -100,6 +100,7 @@ public class EvalGroupBizService {
checkReward(evalGroupDTO);
checkEvalIndicatorLadders(evalGroupDTO.getIndicators());
checkEvalRewardLadders(evalGroupDTO.getRewards());
+ sortRewardRankLadders(evalGroupDTO.getRewards());
setTargetVos(evalGroupDTO);
}
SettingDraft settingDraft = getSettingDraft(dto, isSubmit);
@@ -316,7 +317,7 @@ public class EvalGroupBizService {
* @param dto
*/
public void checkTime(EvalGroupDTO dto) {
- BV.isTrue(dto.getBeginTime().isBefore(dto.getOverTime()), "考评组【" + dto.getName()+ "】生效时间必须在结束时间之前");
+// BV.isTrue(dto.getBeginTime().isBefore(dto.getOverTime()), "考评组【" + dto.getName()+ "】生效时间必须在结束时间之前");
if (PublicUtil.isNotEmpty(dto.getId())) {
List evalGroups = evalGroupService.list(Wrappers.lambdaQuery()
@@ -424,6 +425,39 @@ public class EvalGroupBizService {
}
/**
+ * 检查阶梯分值
+ * @param rewards
+ */
+ private void sortRewardRankLadders(List rewards) {
+ for (EvalGroupRewardDTO reward : rewards) {
+ if (! EvalRewardCalMethodEnum.RANK.equals(reward.getCalMethod())) {
+ continue;
+ }
+
+ List ladders = reward.getLadders();
+ Collections.sort(ladders, new Comparator() {
+ @Override
+ public int compare(EvalGroupRewardLaddersDTO o1, EvalGroupRewardLaddersDTO o2) {
+ if (PublicUtil.isEmpty(o1.getRankOrderType())) {
+ return -1;
+ }
+ if (PublicUtil.isEmpty(o2.getRankOrderType())) {
+ return 1;
+ }
+ //正数在前 负数在后
+ Integer order = o1.getRankOrderType().compareTo(o2.getRankOrderType());
+ if (order == 0) {
+ //大的在后
+ return o1.getLower().subtract(o2.getLower()).intValue();
+ }
+ return order;
+ }
+ });
+
+ }
+ }
+
+ /**
* 检查考评组指标
*
* @param evalGroupDTO
@@ -619,10 +653,10 @@ public class EvalGroupBizService {
reward.setLadderParams(paramTypeMap.getOrDefault(ParamTypeEnum.LADDER, new ArrayList<>()));
reward.setConds(rewardCondMap.getOrDefault(rewardId, new ArrayList<>()));
-
List rewardLadders = evalGroupRewardLaddersService.list(Wrappers.lambdaQuery()
.eq(EvalGroupRewardLadders::getEvalGroupRewardId, rewardId)
.eq(EvalGroupRewardLadders::getYn, Boolean.TRUE)
+ .last("order by rank_order_type ASC, lower ASC")
);
List rewardLaddersVOS = new ArrayList<>();
for (EvalGroupRewardLadders rewardLadder : rewardLadders) {
diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupPoolService.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupPoolService.java
index 8ebf674..eddad31 100644
--- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupPoolService.java
+++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupPoolService.java
@@ -1,7 +1,6 @@
package cn.fw.morax.service.biz.eval;
import cn.fw.common.exception.BusinessException;
-import cn.fw.morax.common.config.FlowVal;
import cn.fw.morax.common.constant.Constant;
import cn.fw.morax.common.utils.DateUtil;
import cn.fw.morax.common.utils.PublicUtil;
@@ -14,12 +13,7 @@ import cn.fw.morax.domain.vo.eval.*;
import cn.fw.morax.domain.vo.kpi.IndicatorUserValueVO;
import cn.fw.morax.domain.vo.kpi.KpiIndicatorRankStaffVO;
import cn.fw.morax.domain.vo.kpi.KpiIndicatorRankVO;
-import cn.fw.morax.rpc.approval.FlowApproveRpc;
-import cn.fw.morax.service.biz.ApprovalBizService;
import cn.fw.morax.service.biz.CommonService;
-import cn.fw.morax.service.biz.kpi.KpiGroupUserBizService;
-import cn.fw.morax.service.data.ApprovalRecordService;
-import cn.fw.morax.service.data.SettingDraftService;
import cn.fw.morax.service.data.eval.*;
import cn.fw.morax.service.data.kpi.IndicatorUserValueService;
import com.alibaba.fastjson.JSON;
@@ -60,10 +54,13 @@ public class EvalGroupPoolService {
private final EvalGroupRewardLaddersService evalGroupRewardLaddersService;
private final EvalPoolRewardDetailService evalPoolRewardDetailService;
private final EvalGroupRewardParamService evalGroupRewardParamService;
+ private final EvalGroupRewardRankLogService evalGroupRewardRankLogService;
private final EvalGroupRewardHitLogService evalGroupRewardHitLogService;
private final IndicatorUserValueService indicatorUserValueService;
private final EvalIndicatorValueService evalIndicatorValueService;
private final EvalGroupUserService evalGroupUserService;
+ private final EvalGroupRewardService evalGroupRewardService;
+ private final EvalGroupService evalGroupService;
private final EvalUserPoolService evalUserPoolService;
private final EvalShopPoolService evalShopPoolService;
private final CommonService commonService;
@@ -656,6 +653,7 @@ public class EvalGroupPoolService {
List rewardLadders = evalGroupRewardLaddersService.list(Wrappers.lambdaQuery()
.eq(EvalGroupRewardLadders::getEvalGroupRewardId, reward.getEvalGroupRewardId())
.eq(EvalGroupRewardLadders::getYn, Boolean.TRUE)
+ .last("order by rank_order_type ASC, lower ASC")
);
List rewardLaddersVOS = new ArrayList<>();
for (EvalGroupRewardLadders rewardLadder : rewardLadders) {
@@ -1226,4 +1224,49 @@ public class EvalGroupPoolService {
}
}
+ public List getRewardCondRankLogs(Long preconditionId, LocalDate dataDate) {
+ EvalGroupRewardPrecondition precondition = evalGroupRewardPreconditionService.getById(preconditionId);
+ BV.notNull(precondition, "奖惩条件不存在");
+ BV.isTrue(ConditionTypeEnum.RANK.equals(precondition.getCondType()), "满足排名率条件才能查询排名情况");
+ final DataTypeEnum dataType = precondition.getDataType();
+ final TargetTypeEnum targetType = precondition.getTargetType();
+ List rankLogs = evalGroupRewardRankLogService.list(Wrappers.lambdaQuery()
+ .eq(EvalGroupRewardRankLog::getDataDate, dataDate)
+ .eq(EvalGroupRewardRankLog::getReferId, preconditionId)
+ .eq(EvalGroupRewardRankLog::getTargetType, RankIndicatorTypeEnum.PRE)
+ .eq(EvalGroupRewardRankLog::getYn, Boolean.TRUE)
+ );
+ Collections.sort(rankLogs);
+
+ List rankLogVOs = PublicUtil.copyList(rankLogs, EvalGroupRewardRankLogVO.class);
+ rankLogVOs.stream().forEach(rankLog -> rankLog.convertPercentForCond(dataType, targetType));
+ return rankLogVOs;
+ }
+
+ public List queryRewardCommissionRank(Long evalGroupRewardId, LocalDate dataDate) {
+ EvalGroupReward reward = evalGroupRewardService.getById(evalGroupRewardId);
+ BV.notNull(reward, "奖惩不存在");
+ List rankLogs = evalGroupRewardRankLogService.list(Wrappers.lambdaQuery()
+ .eq(EvalGroupRewardRankLog::getDataDate, dataDate)
+ .eq(EvalGroupRewardRankLog::getReferId, evalGroupRewardId)
+ .eq(EvalGroupRewardRankLog::getTargetType, RankIndicatorTypeEnum.REWARD_COMMISSION)
+ .eq(EvalGroupRewardRankLog::getYn, Boolean.TRUE)
+ );
+ Collections.sort(rankLogs);
+ List rankLogVOs = PublicUtil.copyList(rankLogs, EvalGroupRewardRankLogVO.class);
+ return rankLogVOs;
+ }
+
+ public List queryRewardProportion(EvalScopeEnum scopeType, Long evalGroupRewardId, LocalDate dataDate) {
+ EvalGroupReward reward = evalGroupRewardService.getById(evalGroupRewardId);
+ BV.notNull(reward, "奖惩不存在");
+ List hitLogVOS = null;
+ if (EvalScopeEnum.STAFF.equals(scopeType)) {
+ hitLogVOS = evalGroupRewardHitLogService.getUserHitLogs(evalGroupRewardId, dataDate);
+ } else {
+ hitLogVOS = evalGroupRewardHitLogService.getShopHitLogs(evalGroupRewardId, dataDate);
+ }
+ hitLogVOS.stream().forEach(hitLog -> hitLog.convertValueToPercent(reward.getLaddersType()));
+ return hitLogVOS;
+ }
}
diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalGroupRewardHitLogService.java b/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalGroupRewardHitLogService.java
index d62c0c9..ade40e6 100644
--- a/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalGroupRewardHitLogService.java
+++ b/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalGroupRewardHitLogService.java
@@ -3,8 +3,12 @@ package cn.fw.morax.service.data.eval;
import cn.fw.morax.domain.db.eval.EvalGroupReward;
import cn.fw.morax.domain.db.eval.EvalGroupRewardHitLog;
+import cn.fw.morax.domain.vo.eval.EvalGroupRewardHitLogVO;
import com.baomidou.mybatisplus.extension.service.IService;
+import java.time.LocalDate;
+import java.util.List;
+
/**
*
* 考评奖惩 服务类
@@ -15,4 +19,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface EvalGroupRewardHitLogService extends IService {
+ List getUserHitLogs(Long evalGroupRewardId, LocalDate dataDate);
+
+ List getShopHitLogs(Long evalGroupRewardId, LocalDate dataDate);
+
}
diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalGroupRewardRankLogService.java b/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalGroupRewardRankLogService.java
new file mode 100644
index 0000000..8382929
--- /dev/null
+++ b/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalGroupRewardRankLogService.java
@@ -0,0 +1,26 @@
+package cn.fw.morax.service.data.eval;
+
+
+import cn.fw.morax.domain.db.eval.EvalGroupRewardRankLog;
+import cn.fw.morax.domain.db.eval.EvalGroupRewardTargetHitLog;
+import cn.fw.morax.domain.enums.EvalScopeEnum;
+import cn.fw.morax.domain.enums.IndicatorTypeEnum;
+import cn.fw.morax.domain.vo.eval.EvalGroupRewardTargetHitLogVO;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.time.YearMonth;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * 考评奖惩 服务类
+ *
+ *
+ * @author jiangchao
+ * @since 2022-12-09
+ */
+public interface EvalGroupRewardRankLogService extends IService {
+
+
+}
diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalGroupRewardHitLogServiceImpl.java b/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalGroupRewardHitLogServiceImpl.java
index 8cd8889..a705f51 100644
--- a/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalGroupRewardHitLogServiceImpl.java
+++ b/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalGroupRewardHitLogServiceImpl.java
@@ -5,11 +5,15 @@ import cn.fw.morax.dao.eval.EvalGroupRewardHitLogDao;
import cn.fw.morax.dao.eval.EvalGroupRewardTargetHitLogDao;
import cn.fw.morax.domain.db.eval.EvalGroupRewardHitLog;
import cn.fw.morax.domain.db.eval.EvalGroupRewardTargetHitLog;
+import cn.fw.morax.domain.vo.eval.EvalGroupRewardHitLogVO;
import cn.fw.morax.service.data.eval.EvalGroupRewardHitLogService;
import cn.fw.morax.service.data.eval.EvalGroupRewardTargetHitLogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
+import java.time.LocalDate;
+import java.util.List;
+
/**
*
* 考评指标达成目标记录 服务实现类
@@ -23,4 +27,13 @@ public class EvalGroupRewardHitLogServiceImpl
extends ServiceImpl
implements EvalGroupRewardHitLogService {
+ @Override
+ public List getUserHitLogs(Long evalGroupRewardId, LocalDate dataDate) {
+ return this.baseMapper.getUserHitLogs(evalGroupRewardId, dataDate);
+ }
+
+ @Override
+ public List getShopHitLogs(Long evalGroupRewardId, LocalDate dataDate) {
+ return this.baseMapper.getShopHitLogs(evalGroupRewardId, dataDate);
+ }
}
diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalGroupRewardRankLogServiceImpl.java b/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalGroupRewardRankLogServiceImpl.java
new file mode 100644
index 0000000..59d8e82
--- /dev/null
+++ b/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalGroupRewardRankLogServiceImpl.java
@@ -0,0 +1,33 @@
+package cn.fw.morax.service.data.eval.impl;
+
+
+import cn.fw.morax.dao.eval.EvalGroupRewardRankLogDao;
+import cn.fw.morax.dao.eval.EvalGroupRewardTargetHitLogDao;
+import cn.fw.morax.domain.db.eval.EvalGroupRewardRankLog;
+import cn.fw.morax.domain.db.eval.EvalGroupRewardTargetHitLog;
+import cn.fw.morax.domain.enums.EvalScopeEnum;
+import cn.fw.morax.domain.enums.IndicatorTypeEnum;
+import cn.fw.morax.domain.vo.eval.EvalGroupRewardTargetHitLogVO;
+import cn.fw.morax.service.data.eval.EvalGroupRewardRankLogService;
+import cn.fw.morax.service.data.eval.EvalGroupRewardTargetHitLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.time.YearMonth;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * 考评指标达成目标记录 服务实现类
+ *
+ *
+ * @author jiangchao
+ * @since 2022-12-09
+ */
+@Service
+public class EvalGroupRewardRankLogServiceImpl
+ extends ServiceImpl
+ implements EvalGroupRewardRankLogService {
+
+}