diff --git a/doc/2023-05-18_update.sql b/doc/2023-05-18_update.sql index f86f321..869dd83 100644 --- a/doc/2023-05-18_update.sql +++ b/doc/2023-05-18_update.sql @@ -4,3 +4,8 @@ ALTER TABLE `fw_morax`.`eval_user_pool` CHANGE COLUMN `eval_group_stage_id` `eval_group_rank_stage_id` bigint(20) NOT NULL COMMENT '考评阶段id' AFTER `eval_group_rank_id`; ALTER TABLE `fw_morax`.`eval_group_user` ADD COLUMN `eval_group_rank_stage_id` bigint(20) NOT NULL COMMENT '考评排名组阶段id' AFTER `eval_group_rank_id`; + +-- 2023年5月23日 +ALTER TABLE `fw_morax`.`eval_group_indicator_target_hit_log` + ADD COLUMN `extra_reach_value` decimal(18, 4) NULL COMMENT '额外达成目标' AFTER `reach_value`, +ADD COLUMN `use_target` tinyint(4) NULL DEFAULT 1 COMMENT '考评使用目标; 1:无目标 2:第一目标 3:额外目标值' AFTER `extra_reach_value`; diff --git a/fw-morax-dao/src/main/resources/mapper/eval/EvalGroupIndicatorTargetHitLogMapper.xml b/fw-morax-dao/src/main/resources/mapper/eval/EvalGroupIndicatorTargetHitLogMapper.xml index 256cc08..043dcec 100644 --- a/fw-morax-dao/src/main/resources/mapper/eval/EvalGroupIndicatorTargetHitLogMapper.xml +++ b/fw-morax-dao/src/main/resources/mapper/eval/EvalGroupIndicatorTargetHitLogMapper.xml @@ -9,6 +9,8 @@ + + @@ -24,6 +26,8 @@ t1.`pool_id`, t1.`value` AS `value`, t1.`reach_value`, + t1.`extra_reach_value`, + t1.`use_target`, t1.`data_date`, t1.`group_id` FROM 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 14c59e1..c9e381c 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 @@ -65,6 +65,11 @@ public class EvalGroupUserShop { */ private Long referId; +// /** +// * 多阶段 +// */ +// private Boolean multiStage; + /** * 数据开始日期 */ diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupIndicatorTargetHitLog.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupIndicatorTargetHitLog.java index 9b0ff98..b67fa43 100644 --- a/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupIndicatorTargetHitLog.java +++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupIndicatorTargetHitLog.java @@ -2,6 +2,7 @@ package cn.fw.morax.domain.db.eval; import cn.fw.common.data.entity.BaseAuditableTimeEntity; import cn.fw.morax.domain.enums.EvalScopeEnum; +import cn.fw.morax.domain.enums.EvalUseTargetEnum; import cn.fw.morax.domain.enums.IndicatorTypeEnum; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; @@ -60,6 +61,16 @@ public class EvalGroupIndicatorTargetHitLog extends BaseAuditableTimeEntity { + /** + * 考评使用目标; 1:无目标 2:第一目标 3:额外目标值 + */ + NO(1, "无目标"), + FIRST_TARGET(2, "第一目标"), + EXTRA_TARGET(2, "额外目标值"), + ; + + /** + * 值 + */ + private final Integer value; + /** + * 名称 + */ + @Getter + private final String name; + + EvalUseTargetEnum(final Integer value, final String name) { + this.value = value; + this.name = name; + } + + /** + * 根据枚举值获取枚举对象 + */ + @JsonCreator + public static EvalUseTargetEnum ofValue(final Integer value) { + for (final EvalUseTargetEnum _enum : EvalUseTargetEnum.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 EvalUseTargetEnum _enum : EvalUseTargetEnum.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/EvalGroupIndicatorParamVO.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalGroupIndicatorParamVO.java index a904810..5c17fd8 100644 --- a/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalGroupIndicatorParamVO.java +++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalGroupIndicatorParamVO.java @@ -93,14 +93,24 @@ public class EvalGroupIndicatorParamVO { private BigDecimal indicatorValue; /** - * 达成值 + * 达成目标 */ private BigDecimal reachValue; /** + * 额外达成目标 + */ + private BigDecimal extraReachValue; + + /** + * 考评使用目标; 1:无目标 2:第一目标 3:额外目标值 + */ + private EvalUseTargetEnum useTarget; + + /** * 时间进度目标值 */ - private BigDecimal timeScheduleTargetValue; +// private BigDecimal timeScheduleTargetValue; /** * 目标计算类型;1: 目标值计算 2:最低要求计算 3:阶段目标 4:时间进度 diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalGroupIndicatorTargetHitLogVO.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalGroupIndicatorTargetHitLogVO.java index f2b26dc..52b6621 100644 --- a/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalGroupIndicatorTargetHitLogVO.java +++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalGroupIndicatorTargetHitLogVO.java @@ -2,6 +2,7 @@ package cn.fw.morax.domain.vo.eval; import cn.fw.common.data.entity.BaseAuditableTimeEntity; import cn.fw.morax.domain.enums.EvalScopeEnum; +import cn.fw.morax.domain.enums.EvalUseTargetEnum; import cn.fw.morax.domain.enums.IndicatorTypeEnum; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -56,6 +57,16 @@ public class EvalGroupIndicatorTargetHitLogVO extends BaseAuditableTimeEntity msg = managerApi.getRealTimeManagerLeaveScope(null, staffId, startLeaveTime.getTime(), endLeaveTime.getTime()); - log.info("ManagerApi.getRealTimeManagerScope: msg.code={}, msg.result={}, msg.data={}", msg.getCode(), msg.getResult(), msg.getData()); + log.info("ManagerApi.getRealTimeManagerLeaveScope: msg.code={}, msg.result={}, msg.data={}", msg.getCode(), msg.getResult(), msg.getData()); if (msg.isSuccess() && !Objects.isNull(msg.getData())) { return this.convertStaffBaseDTOs(msg.getData().getManageStaffList()); } diff --git a/fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalUserReportTask.java b/fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalUserReportTask.java index b5ae021..534d2dc 100644 --- a/fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalUserReportTask.java +++ b/fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalUserReportTask.java @@ -96,8 +96,8 @@ public class EvalUserReportTask { TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition); try { log.info("定时任务【考评人员报表数据抽取】开始执行"); - Map> groupKpiGroupMap = queryStaffEffectRank(date); - for (Map.Entry> entry : groupKpiGroupMap.entrySet()) { + Map> groupEvalGroupMap = queryEffectRank(date); + for (Map.Entry> entry : groupEvalGroupMap.entrySet()) { for (EvalGroupRank rank : entry.getValue()) { //清除当月数据(当月只有一条数据) cleanRankCurMonthData(rank.getId(), date); @@ -400,8 +400,13 @@ public class EvalUserReportTask { return rankCodes; } - public Map> queryStaffEffectRank(LocalDate date) { + public Map> queryEffectRank(LocalDate date) { + List status = new ArrayList(){{ + add(SettingStatusEnum.EFFECTIVE); + add(SettingStatusEnum.BE_EFFECTIVE); + }}; List evalGroupRanks = evalGroupRankService.list(Wrappers.lambdaQuery() + .in(EvalGroupRank::getStatus, status) .ge(EvalGroupRank::getOverTime, date) .eq(EvalGroupRank::getYn, Boolean.TRUE) ); diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/kpi/EvalKpiBaseCalculator.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/kpi/EvalKpiBaseCalculator.java index 743ec76..adc5c42 100644 --- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/kpi/EvalKpiBaseCalculator.java +++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/kpi/EvalKpiBaseCalculator.java @@ -80,9 +80,12 @@ public abstract class EvalKpiBaseCalculator implements Calculator 0)) { - indicatorValue = extraIndicatorValue; + if (PublicUtil.isEmpty(reachValue) || (extraReachValue.compareTo(reachValue) > 0)) { + indicatorValue = extraReachValue; + useTarget = EvalUseTargetEnum.EXTRA_TARGET; } } - - saveTargetHitLog(userShop, param.getId(), IndicatorTypeEnum.EXAMINE, originValue, indicatorValue); + EvalGroupIndicatorTargetHitLog log = new EvalGroupIndicatorTargetHitLog(); + log.setValue(originValue); + log.setReachValue(reachValue); + log.setExtraReachValue(extraReachValue); + log.setUseTarget(useTarget); + saveTargetHitLog(userShop, param.getId(), IndicatorTypeEnum.EXAMINE, originValue, log); boolean isCap = Boolean.TRUE.equals(param.getCap()); BigDecimal proportion = param.getProportion(); @@ -281,6 +298,26 @@ public abstract class EvalKpiBaseCalculator implements Calculator queryKpiIndicatorValue(IndicatorUserValue indicatorUserValue) { + if (PublicUtil.isEmpty(indicatorUserValue) || PublicUtil.isEmpty(indicatorUserValue.getIndicatorValue())) { + return Optional.empty(); + } + BigDecimal value = BigDecimal.ZERO; + try { + JSONObject jsonObject = JSONObject.parseObject(indicatorUserValue.getIndicatorValue()); + value = Optional.ofNullable(jsonObject.getBigDecimal(indicatorUserValue.getIndicatorCode())).orElse(BigDecimal.ZERO); + } catch (Exception e) { + log.error("[{}]指标值转化失败", indicatorUserValue, e); + } + return Optional.of(value); + } + + /** + * 查询具体指标值 + * * @param indicatorCode * @param originalValue * @return @@ -318,6 +355,25 @@ public abstract class EvalKpiBaseCalculator implements CalculatorlambdaQuery() + .eq(EvalGroupIndicatorTargetHitLog::getPoolId, userShop.getPoolId()) + .eq(EvalGroupIndicatorTargetHitLog::getScopeType, userShop.getScopeType()) + .eq(EvalGroupIndicatorTargetHitLog::getTargetType, targetType) + .eq(EvalGroupIndicatorTargetHitLog::getDataDate, userShop.getDataDate()) + .eq(EvalGroupIndicatorTargetHitLog::getReferId, referId) + ); + log.setPoolId(userShop.getPoolId()); + log.setScopeType(userShop.getScopeType()); + log.setReferId(referId); + log.setTargetType(targetType); + log.setValue(value); + log.setDataDate(userShop.getDataDate()); + log.setGroupId(userShop.getGroupId()); + log.setYn(Boolean.TRUE); + evalGroupIndicatorTargetHitLogService.save(log); + } + protected void saveTargetHitLog(EvalGroupUserShop userShop, Long referId, IndicatorTypeEnum targetType, BigDecimal value, BigDecimal reachValue) { evalGroupIndicatorTargetHitLogService.remove(Wrappers.lambdaQuery() .eq(EvalGroupIndicatorTargetHitLog::getPoolId, userShop.getPoolId()) @@ -333,6 +389,7 @@ public abstract class EvalKpiBaseCalculator implements Calculator hitLogOptional = Optional.ofNullable(paramTargetHitLogMap.get(paramId)); paramVO.setIndicatorValue(hitLogOptional.map(EvalGroupIndicatorTargetHitLog::getValue).orElse(BigDecimal.ZERO)); paramVO.setReachValue(hitLogOptional.map(EvalGroupIndicatorTargetHitLog::getReachValue).orElse(BigDecimal.ZERO)); + paramVO.setExtraReachValue(hitLogOptional.map(EvalGroupIndicatorTargetHitLog::getReachValue).orElse(BigDecimal.ZERO)); + paramVO.setUseTarget(hitLogOptional.map(EvalGroupIndicatorTargetHitLog::getUseTarget).orElse(EvalUseTargetEnum.NO)); } Map> indicatorParamMap = paramVos.stream() @@ -560,23 +569,21 @@ public class EvalGroupPoolService { EvalScopeEnum scopeType, LocalDate dataDate, List paramVos) { - List hasTargetParamIds = paramVos.stream() - .filter(param -> (! TargetTypeEnum.NO.equals(param.getTargetType()))) - .map(EvalGroupIndicatorParamVO::getId).collect(Collectors.toList()); +// List hasTargetParamIds = paramVos.stream() +// .filter(param -> (! TargetTypeEnum.NO.equals(param.getTargetType()))) +// .map(EvalGroupIndicatorParamVO::getId).collect(Collectors.toList()); Map paramTargetHitLogMap = new HashMap<>(); - if (PublicUtil.isNotEmpty(hasTargetParamIds)) { - List targetHitLogs = evalGroupIndicatorTargetHitLogService.list(Wrappers.lambdaQuery() - .in(EvalGroupIndicatorTargetHitLog::getReferId, hasTargetParamIds) - .in(EvalGroupIndicatorTargetHitLog::getTargetType, IndicatorTypeEnum.EXAMINE) - .eq(EvalGroupIndicatorTargetHitLog::getDataDate, dataDate) - .eq(EvalGroupIndicatorTargetHitLog::getPoolId, poolId) - .eq(EvalGroupIndicatorTargetHitLog::getScopeType, scopeType) - .eq(EvalGroupIndicatorTargetHitLog::getYn, Boolean.TRUE) - ); - paramTargetHitLogMap = targetHitLogs.stream() - .collect(Collectors.toMap(EvalGroupIndicatorTargetHitLog::getReferId, Function.identity(), (v1, v2) -> v1)); - } + List targetHitLogs = evalGroupIndicatorTargetHitLogService.list(Wrappers.lambdaQuery() +// .in(EvalGroupIndicatorTargetHitLog::getReferId, hasTargetParamIds) + .in(EvalGroupIndicatorTargetHitLog::getTargetType, IndicatorTypeEnum.EXAMINE) + .eq(EvalGroupIndicatorTargetHitLog::getDataDate, dataDate) + .eq(EvalGroupIndicatorTargetHitLog::getPoolId, poolId) + .eq(EvalGroupIndicatorTargetHitLog::getScopeType, scopeType) + .eq(EvalGroupIndicatorTargetHitLog::getYn, Boolean.TRUE) + ); + paramTargetHitLogMap = targetHitLogs.stream() + .collect(Collectors.toMap(EvalGroupIndicatorTargetHitLog::getReferId, Function.identity(), (v1, v2) -> v1)); return paramTargetHitLogMap; } diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalRewardService.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalRewardService.java index 0b62452..e2b7fa1 100644 --- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalRewardService.java +++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalRewardService.java @@ -169,7 +169,7 @@ public class EvalRewardService { log.error("考评奖惩没有门店:{}", JSON.toJSONString(evalGroup)); return; } - sendDistRewardTodo(shopRewardDims, evalGroup, evalGroupRank, evalGroupRankStage); +// sendDistRewardTodo(shopRewardDims, evalGroup, evalGroupRank, evalGroupRankStage); } /** @@ -190,6 +190,7 @@ public class EvalRewardService { for (EvalGroupRewardDim rewardDim : shopRewardDims) { final String roleCode = rewardDim.getDistRoleCode(); List pools = evalShopPoolService.list(Wrappers.lambdaQuery() + .ne(EvalShopPool::getReward, BigDecimal.ZERO) .eq(EvalShopPool::getEvalGroupId, evalGroup.getId()) .in(EvalShopPool::getShopId, rewardDim.getShopIds()) .eq(EvalShopPool::getYn, Boolean.TRUE) @@ -198,9 +199,7 @@ public class EvalRewardService { log.error("分配奖惩待办,未找到考评池:{}", JSON.toJSONString(rewardDim)); continue; } - List distShopIds = pools.stream().filter(pool -> pool.getReward().compareTo(BigDecimal.ZERO) == 0) - .map(EvalShopPool::getShopId).collect(Collectors.toList()); - + List distShopIds = pools.stream().map(EvalShopPool::getShopId).collect(Collectors.toList()); List users = this.getUserEnableRoleInfos(roleCode, distShopIds); for (RpcUserRoleInfoDTO user : users) { List manageShopIds = user.getRangeList().stream() @@ -249,25 +248,23 @@ public class EvalRewardService { planItemReq.setExtraData(extraData); itemList.add(planItemReq); } - - } - - - //推送待办 - BacklogBatchPlanReqDTO batchPlanReq = new BacklogBatchPlanReqDTO(todoVal.getDistEvalReward(), itemList); - List failItems = Optional.ofNullable(todoRpcService.batchPush(batchPlanReq)).orElse(new ArrayList<>()); - if (PublicUtil.isNotEmpty(failItems)) { - log.error("发送分配考评奖励待办失败,失败人员信息:{}", JSON.toJSONString(failItems)); } + if (PublicUtil.isNotEmpty(itemList)) { + //推送待办 + BacklogBatchPlanReqDTO batchPlanReq = new BacklogBatchPlanReqDTO(todoVal.getDistEvalReward(), itemList); + List failItems = Optional.ofNullable(todoRpcService.batchPush(batchPlanReq)).orElse(new ArrayList<>()); + if (PublicUtil.isNotEmpty(failItems)) { + log.error("发送分配考评奖励待办失败,失败人员信息:{}", JSON.toJSONString(failItems)); + } - if (PublicUtil.isEmpty(failItems) || itemList.size() > failItems.size()) { - if (PublicUtil.isNotEmpty(distPoolIds)) { - evalShopPoolService.update(Wrappers.lambdaUpdate() - .in(EvalShopPool::getId, distPoolIds) - .set(EvalShopPool::getStatus, EvalShopPoolStatusEnum.WAIT_DIST_REWARD) - .set(EvalShopPool::getYn, Boolean.FALSE) - .set(EvalShopPool::getUpdateTime, new Date()) - ); + if (PublicUtil.isEmpty(failItems) || itemList.size() > failItems.size()) { + if (PublicUtil.isNotEmpty(distPoolIds)) { + evalShopPoolService.update(Wrappers.lambdaUpdate() + .in(EvalShopPool::getId, distPoolIds) + .set(EvalShopPool::getStatus, EvalShopPoolStatusEnum.WAIT_DIST_REWARD) + .set(EvalShopPool::getUpdateTime, new Date()) + ); + } } } }