diff --git a/fw-morax-dao/src/main/resources/mapper/eval/EvalGroupUserMapper.xml b/fw-morax-dao/src/main/resources/mapper/eval/EvalGroupUserMapper.xml index 868f973..3ebaa3c 100644 --- a/fw-morax-dao/src/main/resources/mapper/eval/EvalGroupUserMapper.xml +++ b/fw-morax-dao/src/main/resources/mapper/eval/EvalGroupUserMapper.xml @@ -3,7 +3,7 @@ - id, egc, eval_id, eval_group_id, user_id, user_name, post_id, post_name, shop_id, + id, eval_group_rank_id, eval_group_rank_stage_id, eval_group_id, user_id, user_name, post_id, post_name, shop_id, shop_name, ignored, ignore_cause, ignore_cause_desc, anticipated_date, remark, data_date, group_id, yn, create_time, update_time 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 a8e95f7..14c59e1 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 @@ -91,6 +91,11 @@ public class EvalGroupUserShop { private BigDecimal reward; /** + * 是否计不入考评考核 + */ + private Boolean ignored; + + /** * 指标总分 */ private BigDecimal indicatorTotalScore; diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupIndicatorParam.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupIndicatorParam.java index f276746..320d73d 100644 --- a/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupIndicatorParam.java +++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupIndicatorParam.java @@ -113,7 +113,7 @@ public class EvalGroupIndicatorParam extends BaseAuditableTimeEntity evalSelectors; + + public EvalPoolVO() { + } + + public EvalPoolVO(Long userId, String userName, List evalSelectors) { + this.userId = userId; + this.userName = userName; + this.evalSelectors = evalSelectors; + } +} diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/EvalSelectorVO.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/EvalSelectorVO.java index f403c2e..3d5518f 100644 --- a/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/EvalSelectorVO.java +++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/EvalSelectorVO.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotNull; import java.math.BigDecimal; import java.util.List; @@ -24,6 +25,18 @@ public class EvalSelectorVO { private String name; /** + * 门店 + */ + @NotNull(message = "门店") + private Long shopId; + + /** + * 岗位 + */ + @NotNull(message = "岗位") + private Long postId; + + /** * 排名 */ private List ranks; 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 7f6d67b..bfef4a8 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 @@ -12,6 +12,7 @@ import cn.fw.morax.domain.dto.eval.EvalGroupIndicatorRankDTO; import cn.fw.morax.domain.dto.eval.EvalUserRankDTO; import cn.fw.morax.domain.dto.query.EvalPoolQueryDTO; import cn.fw.morax.domain.enums.EvalScopeEnum; +import cn.fw.morax.domain.vo.EvalPoolVO; import cn.fw.morax.domain.vo.EvalSelectorVO; import cn.fw.morax.domain.vo.eval.*; import cn.fw.morax.domain.vo.kpi.KpiIndicatorRankVO; @@ -70,6 +71,23 @@ public class EvalPoolController { } /** + * 人员信息 + * + * @return + * @ignoreParams currentUser + */ + @GetMapping("/staff-info") + @ControllerMethod("人员信息") + public Message queryUser(@CurrentUser LoginAuthBean user) { + EvalUserPoolVO poolVO = new EvalUserPoolVO(); + if (PublicUtil.isNotEmpty(user)) { + poolVO.setUserId(user.getUserId()); + poolVO.setUserName(user.getUserName()); + } + return success(poolVO); + } + + /** * 本月可查看的其他考评池选项 * * @param user 用户id @@ -81,8 +99,8 @@ public class EvalPoolController { @GetMapping("/staff-selector") @IgnoreUserToken @ControllerMethod("本月可查看的其他考评池选项") - public Message> evalPoolSelector(@CurrentUser LoginAuthBean user, Long userId, - @RequestParam(required = false) YearMonth monthly) { + public Message evalPoolSelector(@CurrentUser LoginAuthBean user, Long userId, + @RequestParam(required = false) YearMonth monthly) { if (Objects.isNull(monthly)) { monthly = YearMonth.now(); } diff --git a/fw-morax-server/src/main/java/cn/fw/morax/server/controller/erp/EvalTaskController.java b/fw-morax-server/src/main/java/cn/fw/morax/server/controller/erp/EvalTaskController.java index 8a00616..8b21b28 100644 --- a/fw-morax-server/src/main/java/cn/fw/morax/server/controller/erp/EvalTaskController.java +++ b/fw-morax-server/src/main/java/cn/fw/morax/server/controller/erp/EvalTaskController.java @@ -10,6 +10,7 @@ import cn.fw.morax.rpc.ehr.EhrRpcService; import cn.fw.morax.rpc.ehr.dto.PerformanceStaffDTO; import cn.fw.morax.server.consumer.FlowConsumer; import cn.fw.morax.server.task.*; +import cn.fw.morax.service.biz.eval.EvalCalculateService; import cn.fw.security.auth.client.annotation.Authorization; import cn.fw.security.auth.client.enums.AuthType; import lombok.RequiredArgsConstructor; @@ -18,6 +19,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.time.LocalDate; import java.util.Date; import java.util.List; @@ -42,18 +44,23 @@ public class EvalTaskController { private final EvalCalcTask evalCalcTask; private final EvalGroupTask evalGroupTask; private final EvalGroupUserTask evalGroupUserTask; + private final EvalCalculateService evalCalculateService; @GetMapping("/group-user") @ControllerMethod("考评组人员") - public Message processEvalUser() { + public Message processEvalUser(Date date) { evalGroupUserTask.processEvalUser(); return success(); } @GetMapping("/calc-cache") @ControllerMethod("缓存要计算的考评") - public Message cacheCalculableEvalGroup() { - evalCalcTask.cacheCalculableEvalGroup(); + public Message cacheCalculableEvalGroup(Date date) { + if (PublicUtil.isEmpty(date)) { + evalCalculateService.cacheCalculableEvalGroupIds(LocalDate.now().minusDays(1L)); + } else { + evalCalculateService.cacheCalculableEvalGroupIds(DateUtil.date2LocalDate(date)); + } return success(); } 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 0d53285..32278bb 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 @@ -97,7 +97,7 @@ public class EvalGroupUserTask { * @return */ private List queryKpiStaff(LocalDate yesterday) { - List evalGroups = evalGroupUserBizService.postEffectEvalGroups(); + List evalGroups = evalGroupUserBizService.postEffectEvalGroups(yesterday); if (! evalGroups.isEmpty()) { log.info("需要生成考评组人员的考评组:{}", evalGroups); } @@ -105,7 +105,7 @@ public class EvalGroupUserTask { List evalGroupUsers = null; for (EvalGroup evalGroup : evalGroups) { for (Long postId : evalGroup.getPostIds()) { - evalGroupUsers = evalGroupUserBizService.fetchBuildKpiUser(postId, evalGroups, yesterday); + evalGroupUsers = evalGroupUserBizService.fetchBuildKpiUser(postId, evalGroup, yesterday); evalGroupUsersForSave.addAll(evalGroupUsers); } } 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 8604f73..5a12e9f 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 @@ -239,10 +239,11 @@ public class EvalCalculateService { if (userShop.getIndicatorTotalScore().compareTo(BigDecimal.ZERO) > 0) { scoreRatio = userShop.getScore().divide(userShop.getIndicatorTotalScore(), 2, RoundingMode.DOWN); } + BigDecimal reward = (Boolean.TRUE.equals(userShop.getIgnored())) ? BigDecimal.ZERO : userShop.getReward(); evalUserPoolService.update(Wrappers.lambdaUpdate() .eq(EvalUserPool::getId, userShop.getPoolId()) .eq(EvalUserPool::getYn, Boolean.TRUE) - .set(EvalUserPool::getReward, userShop.getReward()) + .set(EvalUserPool::getReward, reward) .set(EvalUserPool::getScore, userShop.getScore()) .set(EvalUserPool::getScoreRatio, scoreRatio) .set(EvalUserPool::getMonthly, YearMonth.from(localDate)) @@ -280,9 +281,9 @@ public class EvalCalculateService { Map userPoolMap = evalPoolCommonService.inspectionUserPoolMap(evalGroup, users, localDate); for (EvalGroupUser user : users) { - if (Boolean.TRUE.equals(user.getIgnored())) { - continue; - } +// if (Boolean.TRUE.equals(user.getIgnored())) { +// continue; +// } EvalUserPool userPool = userPoolMap.get(user.getUserId()); userShops.add(convertBO(user, userPool)); } @@ -637,6 +638,7 @@ public class EvalCalculateService { userShop.setGroupId(user.getGroupId()); userShop.setScore(BigDecimal.ZERO); userShop.setReward(BigDecimal.ZERO); + userShop.setIgnored(user.getIgnored()); return userShop; } 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 d68ecc4..9843458 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 @@ -9,6 +9,7 @@ import cn.fw.morax.domain.db.kpi.*; import cn.fw.morax.domain.dto.eval.EvalGroupIndicatorRankDTO; import cn.fw.morax.domain.dto.eval.EvalUserRankDTO; import cn.fw.morax.domain.enums.*; +import cn.fw.morax.domain.vo.EvalPoolVO; import cn.fw.morax.domain.vo.EvalSelectorVO; import cn.fw.morax.domain.vo.SelectorVO; import cn.fw.morax.domain.vo.eval.*; @@ -132,34 +133,13 @@ public class EvalGroupPoolService { List rankPools = stagePoolMap.get(stageVO.getId()); if (PublicUtil.isNotEmpty(rankPools)) { EvalUserPool stagePool = rankPools.get(0); - EvalUserPoolVO evalUserPoolVO = PublicUtil.copy(stagePool, EvalUserPoolVO.class); + EvalUserPoolVO evalUserPoolVO = this.poolDetail(stagePool); stageVO.setPool(evalUserPoolVO); } } return stageVos; } -// /** -// * 查询考评详情 -// * -// * @param userId -// * @param yearMonth -// * @return -// */ -// public List queryUserPoolDetail(final Long userId, final YearMonth yearMonth) { -// List pools = userEvalPool(userId, yearMonth); -// if (PublicUtil.isEmpty(pools)) { -// return new ArrayList<>(); -// } -// EvalUserPool userPool = pools.get(0); -// Long postId = userPool.getPostId(); -// Long shopId = userPool.getShopId(); -// -// pools.stream().filter() -// -// return poolDetail(evalUserPool); -// } - public EvalUserPoolVO poolDetail(EvalUserPool pool) { EvalUserPoolVO evalUserPoolVO = PublicUtil.copy(pool, EvalUserPoolVO.class); evalUserPoolVO.convertScoreRatio(); @@ -282,21 +262,25 @@ public class EvalGroupPoolService { * @param yearMonth * @return */ - public List evalPoolSelector(Long userId, YearMonth yearMonth) { + public EvalPoolVO evalPoolSelector(Long userId, YearMonth yearMonth) { List pools = userEvalPool(userId, yearMonth); if (CollectionUtils.isEmpty(pools)) { - return new ArrayList<>(); + return null; } + String userName = pools.stream().findFirst().map(EvalUserPool::getUserName).orElse(""); List selectors = new ArrayList<>(); + EvalPoolVO evalPoolVO = new EvalPoolVO(userId, userName, selectors); Map rankNameMap = this.getRankNameMap(pools); Map> shopPostMap = pools.stream().collect(Collectors.groupingBy(pool -> pool.getShopName() + "(" + pool.getPostName() + ")")); //门店、岗位维度 for (Map.Entry> shopPostEntry : shopPostMap.entrySet()) { - List ranks = new ArrayList<>(); - Map> rankPools = shopPostEntry.getValue().stream().collect(Collectors.groupingBy(EvalUserPool::getEvalGroupRankId)); + List shopPostPools = shopPostEntry.getValue(); + Long shopId = shopPostPools.stream().findFirst().map(EvalUserPool::getShopId).get(); + Long postId = shopPostPools.stream().findFirst().map(EvalUserPool::getPostId).get(); + Map> rankPools = shopPostPools.stream().collect(Collectors.groupingBy(EvalUserPool::getEvalGroupRankId)); + //排名维度 for (Map.Entry> rankEntry : rankPools.entrySet()) { - String rankName = rankNameMap.getOrDefault(rankEntry.getKey(), ""); List userRankPools = rankEntry.getValue(); double averageKpiScoreRatio = userRankPools.stream() .mapToDouble(r -> Optional.ofNullable(r.getScoreRatio()).orElse(BigDecimal.ZERO).doubleValue()) @@ -307,12 +291,15 @@ public class EvalGroupPoolService { rank.setEvalGroupRankName(rankNameMap.getOrDefault(rankEntry.getKey(), "")); rank.setScoreRatio(new BigDecimal(averageKpiScoreRatio).multiply(Constant.ONE_HUNDRED)); rank.setReward(reward); + rank.setEvalGroupRankId(rankEntry.getKey()); ranks.add(rank); } EvalSelectorVO evalSelectorVO = new EvalSelectorVO(shopPostEntry.getKey(), ranks); + evalSelectorVO.setShopId(shopId); + evalSelectorVO.setPostId(postId); selectors.add(evalSelectorVO); } - return selectors; + return evalPoolVO; } public Map getRankNameMap(List pools) { diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupUserBizService.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupUserBizService.java index b634500..ea5ff9c 100644 --- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupUserBizService.java +++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupUserBizService.java @@ -53,14 +53,16 @@ public class EvalGroupUserBizService { /** * 所有集团生效的绩效组配置 */ - public List postEffectEvalGroups(){ - LocalDate queryDate = LocalDate.now().minusDays(1L); + public List postEffectEvalGroups(LocalDate queryDate){ List evalGroups = evalGroupService.getAllEffectGroups(queryDate); if (PublicUtil.isEmpty(evalGroups)) { log.info("时间:{},没有正在生效中的考评组配置", DateTimeFormatter.ofPattern("yyyy-MM-dd").format(queryDate)); return new ArrayList<>(); } - return evalGroups; + //过滤岗位为空考评组 + List postEvalGroups = evalGroups.stream() + .filter(evalGroup -> PublicUtil.isNotEmpty(evalGroup.getPostIds())).collect(Collectors.toList()); + return postEvalGroups; } /** @@ -69,24 +71,11 @@ public class EvalGroupUserBizService { * @return */ @Transactional(rollbackFor = Exception.class) - public List fetchBuildKpiUser(Long postId, List evalGroups, LocalDate localDate){ - Set shopIds = new HashSet<>(); - Map shopKpiGroupMap = new HashMap<>(); - for (EvalGroup evalGroup : evalGroups) { - shopIds.addAll(evalGroup.getShopIds()); - for (Long shopId : evalGroup.getShopIds()) { - shopKpiGroupMap.put(shopId, evalGroup); - } - } - List evalGroupUsers = this.fetchPostUsers(postId, new ArrayList<>(shopIds), localDate); + public List fetchBuildKpiUser(Long postId, EvalGroup evalGroup, LocalDate localDate){ + List evalGroupUsers = this.fetchPostUsers(postId, evalGroup.getShopIds(), localDate); //构建考评组信息 for (EvalGroupUser user : evalGroupUsers) { - if (! shopKpiGroupMap.containsKey(user.getShopId())) { - log.error("员工门店没有绩效组配置,门店:{},岗位:{},员工:{}", user.getShopId(), user.getPostId(), user.getId()); - continue; - } - EvalGroup evalGroup = shopKpiGroupMap.get(user.getShopId()); user.setEvalGroupRankId(evalGroup.getEvalGroupRankId()); user.setEvalGroupRankStageId(evalGroup.getEvalGroupRankStageId()); user.setEvalGroupId(evalGroup.getId());