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 { + +}