diff --git a/fw-morax-dao/src/main/resources/mapper/eval/EvalGroupMapper.xml b/fw-morax-dao/src/main/resources/mapper/eval/EvalGroupMapper.xml
index c6893e8..69a4c18 100644
--- a/fw-morax-dao/src/main/resources/mapper/eval/EvalGroupMapper.xml
+++ b/fw-morax-dao/src/main/resources/mapper/eval/EvalGroupMapper.xml
@@ -72,13 +72,15 @@
t3.id
FROM
eval_group_rank t1
- LEFT JOIN eval_group_rank_stage t2 ON t1.id = t2.eval_group_rank_id AND t2.yn = 1
- LEFT JOIN eval_group t3 ON t2.id = t3.eval_group_rank_stage_id AND t3.yn = 1
+ INNER JOIN eval_group_rank_stage t2 ON t1.id = t2.eval_group_rank_id AND t2.yn = 1
+ INNER JOIN eval_group t3 ON t2.id = t3.eval_group_rank_stage_id AND t3.yn = 1
+ INNER JOIN eval_group_reward_dim t4 ON t3.id = t4.eval_group_id AND t4.yn = 1
WHERE
t1.yn = 1
AND t1.`status` IN ( 3, 4 )
and DATE_FORMAT(t2.begin_time, '%Y-%m-%d') <= DATE_FORMAT(#{day}, '%Y-%m-%d')
and DATE_FORMAT(t2.over_time, '%Y-%m-%d') = DATE_FORMAT(#{day}, '%Y-%m-%d')
+ AND t4.`type` = 2
+ *
+ * @author jiangchao
+ * @since 2022-09-26
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class EvalUserRankDTO {
+
+ /**
+ * 用户id
+ */
+// @NotNull(message = "用户id不能为空")
+ private Long userId;
+
+ /**
+ * 门店
+ */
+ @NotNull(message = "门店")
+ private Long shopId;
+
+ /**
+ * 岗位
+ */
+ @NotNull(message = "岗位")
+ private Long postId;
+
+ /**
+ * 考评排名组id
+ */
+ @NotNull(message = "考评排名组id")
+ private Long evalGroupRankId;
+
+ /**
+ * 月份
+ */
+ private YearMonth monthly;
+
+ public void initMonthly() {
+ if (PublicUtil.isEmpty(this.monthly)) {
+ this.monthly = YearMonth.now();
+ }
+ }
+
+}
diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/EvalPoolVO.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/EvalPoolVO.java
new file mode 100644
index 0000000..4a01a9c
--- /dev/null
+++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/EvalPoolVO.java
@@ -0,0 +1,36 @@
+package cn.fw.morax.domain.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author jiangchao
+ * @des:
+ * @date 2023/5/22 11:35
+ */
+@Data
+public class EvalPoolVO {
+
+ /**
+ * 用户id
+ */
+ private Long userId;
+ /**
+ * 用户名称
+ */
+ private String userName;
+ /**
+ * 考评选择
+ */
+ private List 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
new file mode 100644
index 0000000..3d5518f
--- /dev/null
+++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/EvalSelectorVO.java
@@ -0,0 +1,52 @@
+package cn.fw.morax.domain.vo;
+
+import cn.fw.morax.domain.vo.eval.EvalUserGroupRankVO;
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author : kurisu
+ * @version : 1.0
+ * @className : SelectorVO
+ * @description : 绩效\薪酬池选项
+ * @date : 2022-05-06 11:23
+ */
+@Data
+@EqualsAndHashCode
+public class EvalSelectorVO {
+ /**
+ * 名称
+ */
+ private String name;
+
+ /**
+ * 门店
+ */
+ @NotNull(message = "门店")
+ private Long shopId;
+
+ /**
+ * 岗位
+ */
+ @NotNull(message = "岗位")
+ private Long postId;
+
+ /**
+ * 排名
+ */
+ private List ranks;
+
+
+ public EvalSelectorVO() {
+ }
+
+ public EvalSelectorVO(String name, List ranks) {
+ this.name = name;
+ this.ranks = ranks;
+ }
+}
diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalUserGroupRankVO.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalUserGroupRankVO.java
new file mode 100644
index 0000000..92c4b9c
--- /dev/null
+++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalUserGroupRankVO.java
@@ -0,0 +1,64 @@
+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.EvalTypeEnum;
+import cn.fw.morax.domain.enums.KpiIgnoreCauseEnum;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.YearMonth;
+import java.util.List;
+
+/**
+ *
+ * 考评池
+ *
+ *
+ * @author jiangchao
+ * @since 2022-12-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class EvalUserGroupRankVO {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 考评排名组id
+ */
+ private Long id;
+
+ /**
+ * 考评组编码
+ */
+ private String evalGroupRankName;
+
+ /**
+ * 考评组id
+ */
+ private Long evalGroupRankId;
+
+ /**
+ * 考评得分率
+ */
+ private BigDecimal scoreRatio;
+ /**
+ * 奖惩
+ */
+ private BigDecimal reward;
+
+ /**
+ * 考评得分率(格式化)
+ */
+ private String scoreRatioFormat;
+
+
+ public void convertScoreRatio() {
+ if (PublicUtil.isNotEmpty(this.getScoreRatio())) {
+ this.setScoreRatio(this.getScoreRatio().multiply(Constant.ONE_HUNDRED));
+ }
+ }
+}
diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalUserRankStageVO.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalUserRankStageVO.java
new file mode 100644
index 0000000..ca7da90
--- /dev/null
+++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalUserRankStageVO.java
@@ -0,0 +1,51 @@
+package cn.fw.morax.domain.vo.eval;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ *
+ * 考评组
+ *
+ *
+ * @author jiangchao
+ * @since 2022-12-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class EvalUserRankStageVO {
+
+ /**
+ * 主键id
+ */
+ private Long id;
+ /**
+ * 阶段名称
+ */
+ private String name;
+
+ /**
+ * 考评排名组id
+ */
+ private Long evalGroupRankId;
+
+ /**
+ * 生效时间
+ */
+ private LocalDate beginTime;
+
+ /**
+ * 结束时间
+ */
+ private LocalDate overTime;
+
+ /**
+ * 考评池
+ */
+ private EvalUserPoolVO pool;
+
+
+}
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 9f03c0d..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
@@ -9,9 +9,11 @@ import cn.fw.common.web.auth.annotation.CurrentUser;
import cn.fw.data.base.domain.common.Message;
import cn.fw.morax.common.utils.PublicUtil;
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.SelectorVO;
+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;
import cn.fw.morax.service.biz.eval.*;
@@ -24,12 +26,12 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
+import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.time.LocalDate;
import java.time.YearMonth;
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;
@@ -69,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
@@ -80,7 +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();
}
@@ -92,33 +112,28 @@ public class EvalPoolController {
/**
* 考评详情查询 (查看自己考评详情)
- *
- * @param userId 用户id
- * @param monthly 月度
- * @return 绩效池详情
- * @ignoreParams userId
*/
@GetMapping("/own-detail")
@ControllerMethod("考评详情查询")
- public Message evalPoolOwnDetail(@CurrentUser Long userId,
- @RequestParam(required = false) YearMonth monthly) {
- if (Objects.isNull(monthly)) {
- monthly = YearMonth.now();
- }
- return success(evalGroupPoolService.queryUserPoolDetail(userId, monthly));
+ public Message> evalPoolOwnDetail(@CurrentUser Long userId,
+ @Valid EvalUserRankDTO dto) {
+ dto.initMonthly();
+ dto.setUserId(userId);
+ return success(evalGroupPoolService.queryRankStagePools(dto));
}
/**
* 考评详情查询 (查看他人考评详情)
*
- * @param evalPoolId 用户id
- * @return 绩效池详情
- * @ignoreParams userId
*/
- @GetMapping("/staff")
+ @GetMapping("/detail")
@ControllerMethod("考评详情查询")
- public Message evalPoolDetail(@NotNull(message = "考评池id不能为空") Long evalPoolId) {
- return success(evalGroupPoolService.queryPoolDetail(evalPoolId));
+ public Message> evalPoolDetail(@Valid EvalUserRankDTO dto) {
+ dto.initMonthly();
+ if (PublicUtil.isEmpty(dto.getUserId())) {
+ throw new BusinessException("人员信息不能为空");
+ }
+ return success(evalGroupPoolService.queryRankStagePools(dto));
}
/**
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/calculator/eval/reward/EvalRewardProportionCalculator.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardProportionCalculator.java
index 39be6c9..c7b582c 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
@@ -23,6 +23,7 @@ import java.math.RoundingMode;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.stream.Collectors;
/**
* @author jiangchao
@@ -46,6 +47,7 @@ public class EvalRewardProportionCalculator extends EvalRewardBaseCalculator {
@Override
public void calculateGroup(List userShops, EvalGroupReward reward) {
+ userShops = userShops.stream().filter(userShop -> Boolean.FALSE.equals(userShop.getIgnored())).collect(Collectors.toList());
if (PublicUtil.isEmpty(userShops)) {
return;
}
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 0334194..f880a96 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
@@ -45,6 +45,7 @@ public class EvalRewardRankCalculator extends EvalRewardBaseCalculator {
@Override
public void calculateGroup(List userShops, EvalGroupReward reward) {
+ userShops = userShops.stream().filter(userShop -> Boolean.FALSE.equals(userShop.getIgnored())).collect(Collectors.toList());
if (PublicUtil.isEmpty(userShops)) {
return;
}
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..0197d8d 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
@@ -116,7 +116,6 @@ public class EvalCalculateService {
log.info("定时任务【缓存需要计算的考评组】开始执行");
List evalGroups = evalGroupService.getAllEffectGroups(localDate);
Set evalGroupIds = evalGroups.stream().map(EvalGroup::getId).collect(Collectors.toSet());
-// Set evalGroupIds = evalGroupService.queryCalculableEvalGroupIds(localDate);
if (CollectionUtils.isEmpty(evalGroupIds)) {
return;
}
@@ -184,7 +183,7 @@ public class EvalCalculateService {
log.error("考评排名组阶段[{}]不存在,终止计算!", JSON.toJSONString(evalGroup));
return;
}
- List userShops = this.buildEvalGroupObj(evalGroup, evalGroupRankStage.getBeginTime(), localDate, scopeType);
+ List userShops = this.buildEvalGroupObj(evalGroup, evalGroupRankStage, localDate, scopeType);
if (CollectionUtils.isEmpty(userShops)) {
log.error("考评组[{}]人员为空,终止计算!", evalGroupId);
return;
@@ -239,10 +238,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))
@@ -269,34 +269,29 @@ public class EvalCalculateService {
}
- public List buildEvalGroupObj(EvalGroup evalGroup, LocalDate beginDate, LocalDate localDate, EvalScopeEnum scopeType) {
+ public List buildEvalGroupObj(EvalGroup evalGroup, EvalGroupRankStage evalGroupRankStage, LocalDate localDate, EvalScopeEnum scopeType) {
+ LocalDate beginDate = evalGroupRankStage.getBeginTime();
List userShops = new ArrayList<>();
if (EvalScopeEnum.STAFF.equals(scopeType)) {
List users = evalGroupUserService.list(Wrappers.lambdaQuery()
- .eq(EvalGroupUser::getEvalGroupId, evalGroup.getId())
+ .eq(EvalGroupUser::getEvalGroupRankStageId, evalGroupRankStage.getId())
.eq(EvalGroupUser::getDataDate, localDate)
.eq(EvalGroupUser::getYn, Boolean.TRUE)
);
- Map userPoolMap = evalPoolCommonService.inspectionUserPoolMap(evalGroup, users, localDate);
+ Map userPoolMap = evalPoolCommonService.inspectionUserPoolMap(evalGroup, evalGroupRankStage, users, localDate);
for (EvalGroupUser user : users) {
- if (Boolean.TRUE.equals(user.getIgnored())) {
- continue;
- }
EvalUserPool userPool = userPoolMap.get(user.getUserId());
userShops.add(convertBO(user, userPool));
}
return userShops;
}
-
List distShopIds = this.getEvalDistShopIds(evalGroup);
- if (PublicUtil.isEmpty(distShopIds)) {
- return new ArrayList<>();
- }
Map shopPoolBOMap = evalPoolCommonService.inspectionShopPools(evalGroup, localDate, distShopIds);
- for (Long shopId : distShopIds) {
+ for (Long shopId : evalGroup.getShopIds()) {
EvalShopPool shopPool = shopPoolBOMap.get(shopId);
- userShops.add(convertBO(shopPool, evalGroup, beginDate, localDate));
+ Boolean ignored = ! distShopIds.contains(shopId);
+ userShops.add(convertBO(shopPool, evalGroup, beginDate, localDate, ignored));
}
return userShops;
}
@@ -637,10 +632,11 @@ public class EvalCalculateService {
userShop.setGroupId(user.getGroupId());
userShop.setScore(BigDecimal.ZERO);
userShop.setReward(BigDecimal.ZERO);
+ userShop.setIgnored(user.getIgnored());
return userShop;
}
- public EvalGroupUserShop convertBO(EvalShopPool shopPool, EvalGroup evalGroup, LocalDate beginDate, LocalDate dataDate) {
+ public EvalGroupUserShop convertBO(EvalShopPool shopPool, EvalGroup evalGroup, LocalDate beginDate, LocalDate dataDate, Boolean ignored) {
EvalGroupUserShop userShop = new EvalGroupUserShop();
userShop.setName(shopPool.getShopName());
userShop.setReferId(shopPool.getShopId());
@@ -652,6 +648,7 @@ public class EvalCalculateService {
userShop.setBeginDate(beginDate);
userShop.setDataDate(dataDate);
userShop.setGroupId(evalGroup.getGroupId());
+ userShop.setIgnored(ignored);
userShop.setScore(BigDecimal.ZERO);
userShop.setReward(BigDecimal.ZERO);
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 45efe73..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
@@ -7,7 +7,10 @@ import cn.fw.morax.common.utils.PublicUtil;
import cn.fw.morax.domain.db.eval.*;
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.*;
import cn.fw.morax.domain.vo.kpi.IndicatorUserValueVO;
@@ -60,6 +63,8 @@ public class EvalGroupPoolService {
private final EvalIndicatorValueService evalIndicatorValueService;
private final EvalGroupUserService evalGroupUserService;
private final EvalGroupRewardService evalGroupRewardService;
+ private final EvalGroupRankStageService evalGroupRankStageService;
+ private final EvalGroupRankService evalGroupRankService;
private final EvalGroupService evalGroupService;
private final EvalUserPoolService evalUserPoolService;
private final EvalShopPoolService evalShopPoolService;
@@ -101,31 +106,38 @@ public class EvalGroupPoolService {
*
* @return
*/
- public EvalUserPoolVO queryPoolDetail(final Long poolId) {
- EvalUserPool evalUserPool = evalUserPoolService.getById(poolId);
- if (PublicUtil.isEmpty(evalUserPool)) {
-// throw new BusinessException("人员考评数据不存在");
- return null;
- }
- return poolDetail(evalUserPool);
- }
+ public List queryRankStagePools(EvalUserRankDTO dto) {
+ final Long userId = dto.getUserId();
+ final Long postId = dto.getPostId();
+ final Long shopId = dto.getShopId();
+ final Long evalGroupRankId = dto.getEvalGroupRankId();
+ List pools = evalUserPoolService.list(Wrappers.lambdaQuery()
+ .eq(EvalUserPool::getPostId, postId)
+ .eq(EvalUserPool::getShopId, shopId)
+ .eq(EvalUserPool::getUserId, userId)
+ .eq(EvalUserPool::getEvalGroupRankId, evalGroupRankId)
+ .eq(EvalUserPool::getYn, Boolean.TRUE)
+ .orderByDesc(EvalUserPool::getScoreRatio)
+ );
+ Map> stagePoolMap = pools.stream().collect(Collectors.groupingBy(EvalUserPool::getEvalGroupRankStageId));
+ List evalGroupRankStageIds = pools.stream().map(EvalUserPool::getEvalGroupRankStageId).collect(Collectors.toList());
- /**
- * 查询考评详情
- *
- * @param userId
- * @param yearMonth
- * @return
- */
- public EvalUserPoolVO queryUserPoolDetail(final Long userId, final YearMonth yearMonth) {
- List pools = userEvalPool(userId, yearMonth);
+ List stages = evalGroupRankStageService.list(Wrappers.lambdaQuery()
+ .in(EvalGroupRankStage::getId, evalGroupRankStageIds)
+ .eq(EvalGroupRankStage::getYn, Boolean.TRUE)
+ .orderByAsc(EvalGroupRankStage::getBeginTime)
+ );
- if (PublicUtil.isEmpty(pools)) {
-// throw new BusinessException("人员考评数据不存在");
- return null;
+ List stageVos = PublicUtil.copyList(stages, EvalUserRankStageVO.class);
+ for (EvalUserRankStageVO stageVO : stageVos) {
+ List rankPools = stagePoolMap.get(stageVO.getId());
+ if (PublicUtil.isNotEmpty(rankPools)) {
+ EvalUserPool stagePool = rankPools.get(0);
+ EvalUserPoolVO evalUserPoolVO = this.poolDetail(stagePool);
+ stageVO.setPool(evalUserPoolVO);
+ }
}
- EvalUserPool evalUserPool = pools.get(0);
- return poolDetail(evalUserPool);
+ return stageVos;
}
public EvalUserPoolVO poolDetail(EvalUserPool pool) {
@@ -139,12 +151,6 @@ public class EvalGroupPoolService {
this.setIgnore(evalUserPoolVO);
evalUserPoolVO.setDataDate(localDate);
-// Eval eval = evalService.getById(pool.getEvalId());
-// BV.notNull(pool, "考评池不存在");
-// if (PublicUtil.isNotEmpty(eval)) {
-// evalUserPoolVO.setEvalType(eval.getType());
-// }
-
return evalUserPoolVO;
}
@@ -256,14 +262,73 @@ public class EvalGroupPoolService {
* @param yearMonth
* @return
*/
- public Set evalPoolSelector(Long userId, YearMonth yearMonth) {
+ public EvalPoolVO evalPoolSelector(Long userId, YearMonth yearMonth) {
List pools = userEvalPool(userId, yearMonth);
if (CollectionUtils.isEmpty(pools)) {
- return new HashSet<>();
+ 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<>();
+ 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()) {
+ List userRankPools = rankEntry.getValue();
+ double averageKpiScoreRatio = userRankPools.stream()
+ .mapToDouble(r -> Optional.ofNullable(r.getScoreRatio()).orElse(BigDecimal.ZERO).doubleValue())
+ .average()
+ .orElse(0);
+ BigDecimal reward = userRankPools.stream().map(EvalUserPool::getReward).reduce(BigDecimal.ZERO, BigDecimal::add);
+ EvalUserGroupRankVO rank = new EvalUserGroupRankVO();
+ 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 pools.stream().map(r -> SelectorVO.whit(r.getId(), r.getPostName(), r.getShopName() + "")).collect(Collectors.toSet());
+ return evalPoolVO;
}
+ public Map getRankNameMap(List pools) {
+ List evalGroupRankIds = pools.stream().map(EvalUserPool::getEvalGroupRankId).distinct().collect(Collectors.toList());
+ List evalGroupRanks = evalGroupRankService.list(Wrappers.lambdaQuery()
+ .in(EvalGroupRank::getId, evalGroupRankIds)
+ .eq(EvalGroupRank::getYn, Boolean.TRUE)
+ );
+ if (PublicUtil.isEmpty(evalGroupRanks)) {
+ return new HashMap<>();
+ }
+ return evalGroupRanks.stream().collect(Collectors.toMap(EvalGroupRank::getId, EvalGroupRank::getName, (v1, v2) -> v1));
+ }
+
+ /**
+ * 查询用户绩效池
+ *
+ * @param userId
+ * @param yearMonth
+ * @return
+ */
+// public Set evalPoolSelector(Long userId, YearMonth yearMonth) {
+// List pools = userEvalPool(userId, yearMonth);
+// if (CollectionUtils.isEmpty(pools)) {
+// return new HashSet<>();
+// }
+// return pools.stream().map(r -> SelectorVO.whit(r.getId(), r.getPostName(), r.getShopName() + "")).collect(Collectors.toSet());
+// }
+
/**
* 查询用户月度绩效池列表
@@ -308,7 +373,6 @@ public class EvalGroupPoolService {
if (PublicUtil.isEmpty(pool)) {
return null;
}
-// BV.notNull(pool, "考评池不存在");
Long userId = pool.getUserId();
return getHitIndicatorDetail(evalPoolId, EvalScopeEnum.STAFF, userId, evalGroupIndicatorId, dataDate);
}
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());
diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalPoolCommonService.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalPoolCommonService.java
index a76f30e..fc6e74d 100644
--- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalPoolCommonService.java
+++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalPoolCommonService.java
@@ -17,6 +17,7 @@ import cn.fw.morax.service.data.salary.SalaryGroupUserService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.map.MultiKeyMap;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -46,29 +47,36 @@ public class EvalPoolCommonService {
private EhrRpcService ehrRpcService;
private OopRpcService oopRpcService;
- public Map inspectionUserPoolMap(EvalGroup evalGroup, List users, LocalDate localDate) {
+ public Map inspectionUserPoolMap(EvalGroup evalGroup, EvalGroupRankStage evalGroupRankStage, List users, LocalDate localDate) {
if (PublicUtil.isEmpty(users)) {
return new HashMap<>();
}
Set userIds = users.stream().map(EvalGroupUser::getUserId).collect(Collectors.toSet());
List pools = evalUserPoolService.list(Wrappers.lambdaQuery()
- .eq(EvalUserPool::getEvalGroupId, evalGroup.getId())
+ .eq(EvalUserPool::getEvalGroupRankStageId, evalGroupRankStage.getId())
.eq(EvalUserPool::getMonthly, YearMonth.from(localDate))
.in(EvalUserPool::getUserId, userIds)
.eq(EvalUserPool::getYn, Boolean.TRUE)
);
- Map userPoolMap = pools.stream().collect(Collectors.toMap(EvalUserPool::getUserId, Function.identity(), (v1, v2) -> {
- log.error("同一个考评组、考评人员出现两条考评池数据。用户id:{},考评组:{}", v1.getUserId(), evalGroup);
- return v1;
- }));
+ //人员可能在考评组中出现多次(调岗)
+ MultiKeyMap userShopPostShopIdMap = new MultiKeyMap<>();
+ for (EvalUserPool pool : pools) {
+ userShopPostShopIdMap.put(pool.getUserId(), pool.getShopId(), pool.getPostId(), pool);
+ }
for (EvalGroupUser user : users) {
- if (! userPoolMap.containsKey(user.getUserId())) {
+ if (! userShopPostShopIdMap.containsKey(user.getUserId(), user.getShopId(), user.getPostId())) {
EvalUserPool userPool = inspectionUserPool(user);
- userPoolMap.put(userPool.getUserId(), userPool);
+ userShopPostShopIdMap.put(user.getUserId(), user.getShopId(), user.getPostId(), userPool);
}
}
+
+ Map userPoolMap = userShopPostShopIdMap.values().stream().collect(Collectors.toMap(EvalUserPool::getUserId, Function.identity(), (v1, v2) -> {
+ log.error("同一个考评组、考评人员出现两条考评池数据。用户id:{},考评组:{}", v1.getUserId(), evalGroup);
+ return v1;
+ }));
+
return userPoolMap;
}
@@ -87,45 +95,17 @@ public class EvalPoolCommonService {
return v1;
}));
- if (PublicUtil.isEmpty(distShopIds)) {
- return new HashMap<>();
- }
- for (Long shopId : distShopIds) {
+ for (Long shopId : evalGroupShopIds) {
if (! shopPoolMap.containsKey(shopId)) {
-// EvalShopPoolStatusEnum status = (distShopIds.contains(shopId))
-// ? EvalShopPoolStatusEnum.CALC_REWARD : EvalShopPoolStatusEnum.NO_REWARD;
- EvalShopPool shopPool = this.inspectionShopPool(shopId, evalGroup, localDate, EvalShopPoolStatusEnum.CALC_REWARD);
+ EvalShopPoolStatusEnum status = (distShopIds.contains(shopId))
+ ? EvalShopPoolStatusEnum.CALC_REWARD : EvalShopPoolStatusEnum.NO_REWARD;
+ EvalShopPool shopPool = this.createShopPoolData(shopId, evalGroup, localDate, status);
shopPoolMap.put(shopId, shopPool);
}
}
return shopPoolMap;
}
- /**
- * 查询考评门店池
- *
- * @return
- */
- @Transactional(rollbackFor = Exception.class)
- public EvalShopPool inspectionShopPool(Long shopId, EvalGroup evalGroup, LocalDate localDate, EvalShopPoolStatusEnum status) {
- EvalShopPool evalShopPool = evalShopPoolService.getOne(Wrappers.lambdaQuery()
- .eq(EvalShopPool::getId, evalGroup.getId())
- .eq(EvalShopPool::getShopId, shopId)
- .eq(EvalShopPool::getYn, Boolean.TRUE)
- .eq(EvalShopPool::getMonthly, YearMonth.from(localDate).minusMonths(1))
- , Boolean.FALSE);
- if (PublicUtil.isNotEmpty(evalShopPool)) {
- evalShopPoolService.update(Wrappers.lambdaUpdate()
- .eq(EvalShopPool::getId, evalShopPool.getId())
- .set(EvalShopPool::getMonthly, YearMonth.from(localDate))
- .set(EvalShopPool::getUpdateTime, new Date())
- );
- evalShopPool.setMonthly(YearMonth.from(localDate));
- return evalShopPool;
- }
- return this.createShopPoolData(shopId, evalGroup, localDate, status);
- }
-
@Transactional(rollbackFor = Exception.class)
public EvalShopPool createShopPoolData(Long shopId, EvalGroup evalGroup, LocalDate localDate, EvalShopPoolStatusEnum status) {
ShopDTO shopDTO = oopRpcService.queryShop(shopId);
@@ -157,29 +137,31 @@ public class EvalPoolCommonService {
@Transactional(rollbackFor = Exception.class)
public EvalUserPool inspectionUserPool(EvalGroupUser user) {
EvalUserPool evalUserPool = evalUserPoolService.getOne(Wrappers.lambdaQuery()
- .eq(EvalUserPool::getEgc, user.getEgc())
+ .eq(EvalUserPool::getEvalGroupRankStageId, user.getEvalGroupRankStageId())
.eq(EvalUserPool::getUserId, user.getUserId())
+ .eq(EvalUserPool::getPostId, user.getPostId())
+ .eq(EvalUserPool::getShopId, user.getShopId())
.eq(EvalUserPool::getMonthly, YearMonth.from(user.getDataDate()))
.eq(EvalUserPool::getYn, Boolean.TRUE)
, Boolean.FALSE);
if (PublicUtil.isNotEmpty(evalUserPool)) {
return evalUserPool;
}
- evalUserPool = evalUserPoolService.getOne(Wrappers.lambdaQuery()
- .eq(EvalUserPool::getEgc, user.getEgc())
- .eq(EvalUserPool::getUserId, user.getUserId())
- .eq(EvalUserPool::getMonthly, YearMonth.from(user.getDataDate()).minusMonths(1))
- .eq(EvalUserPool::getYn, Boolean.TRUE)
- , Boolean.FALSE);
- if (PublicUtil.isNotEmpty(evalUserPool)) {
- evalUserPoolService.update(Wrappers.lambdaUpdate()
- .eq(EvalUserPool::getId, evalUserPool.getId())
- .set(EvalUserPool::getMonthly, YearMonth.from(user.getDataDate()))
- .set(EvalUserPool::getUpdateTime, new Date())
- );
- evalUserPool.setMonthly(YearMonth.from(user.getDataDate()));
- return evalUserPool;
- }
+// evalUserPool = evalUserPoolService.getOne(Wrappers.lambdaQuery()
+// .eq(EvalUserPool::getEvalGroupRankStageId, user.getEvalGroupRankStageId())
+// .eq(EvalUserPool::getUserId, user.getUserId())
+// .eq(EvalUserPool::getMonthly, YearMonth.from(user.getDataDate()).minusMonths(1))
+// .eq(EvalUserPool::getYn, Boolean.TRUE)
+// , Boolean.FALSE);
+// if (PublicUtil.isNotEmpty(evalUserPool)) {
+// evalUserPoolService.update(Wrappers.lambdaUpdate()
+// .eq(EvalUserPool::getId, evalUserPool.getId())
+// .set(EvalUserPool::getMonthly, YearMonth.from(user.getDataDate()))
+// .set(EvalUserPool::getUpdateTime, new Date())
+// );
+// evalUserPool.setMonthly(YearMonth.from(user.getDataDate()));
+// return evalUserPool;
+// }
return this.createUserPoolData(user);
}
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 ff9731f..16356c3 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
@@ -1,36 +1,33 @@
package cn.fw.morax.service.biz.eval;
+import cn.fw.backlog.sdk.api.result.FailBacklogItem;
import cn.fw.common.cache.locker.DistributedLocker;
import cn.fw.common.exception.BusinessException;
import cn.fw.common.web.auth.LoginAuthBean;
import cn.fw.morax.common.config.TodoVal;
import cn.fw.morax.common.pojo.event.ApprovalResultEvent;
+import cn.fw.morax.common.utils.DateUtil;
import cn.fw.morax.common.utils.PublicUtil;
import cn.fw.morax.common.utils.ThreadPoolUtil;
import cn.fw.morax.domain.bo.eval.EvalGroupRewardDistributionBO;
import cn.fw.morax.domain.db.ApprovalRecord;
-import cn.fw.morax.domain.db.eval.EvalGroup;
-import cn.fw.morax.domain.db.eval.EvalRewardDist;
-import cn.fw.morax.domain.db.eval.EvalRewardDistDetail;
-import cn.fw.morax.domain.db.eval.EvalShopPool;
+import cn.fw.morax.domain.db.eval.*;
import cn.fw.morax.domain.dto.eval.EvalRewardDistDTO;
import cn.fw.morax.domain.dto.eval.EvalRewardDistDetailDTO;
-import cn.fw.morax.domain.enums.ApprovalTypeEnum;
-import cn.fw.morax.domain.enums.EvalRewardDistStatusEnum;
-import cn.fw.morax.domain.enums.EvalRewardPushStatusEnum;
+import cn.fw.morax.domain.enums.*;
import cn.fw.morax.domain.vo.eval.EvalRewardDistDetailVO;
import cn.fw.morax.domain.vo.eval.EvalRewardDistVO;
import cn.fw.morax.domain.vo.eval.EvalShopPoolVO;
import cn.fw.morax.rpc.backlog.TodoRpcService;
import cn.fw.morax.rpc.backlog.dto.BackLogItemDTO;
+import cn.fw.morax.rpc.backlog.dto.BacklogBatchPlanItemReqDTO;
+import cn.fw.morax.rpc.backlog.dto.BacklogBatchPlanReqDTO;
import cn.fw.morax.rpc.erp.ErpRpcService;
import cn.fw.morax.rpc.erp.dto.RpcUserRoleInfoDTO;
+import cn.fw.morax.rpc.erp.dto.RpcUserRoleShopDTO;
import cn.fw.morax.service.biz.ApprovalBizService;
import cn.fw.morax.service.data.ApprovalRecordService;
-import cn.fw.morax.service.data.eval.EvalGroupService;
-import cn.fw.morax.service.data.eval.EvalRewardDistDetailService;
-import cn.fw.morax.service.data.eval.EvalRewardDistService;
-import cn.fw.morax.service.data.eval.EvalShopPoolService;
+import cn.fw.morax.service.data.eval.*;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
@@ -47,11 +44,14 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
+import java.text.DecimalFormat;
import java.time.LocalDate;
+import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.locks.Lock;
+import java.util.stream.Collectors;
import static cn.fw.common.businessvalidator.Validator.BV;
@@ -75,6 +75,9 @@ public class EvalRewardService {
private final EvalShopPoolService evalShopPoolService;
private final ApprovalRecordService approvalRecordService;
private final EvalRewardDistService evalRewardDistService;
+ private final EvalGroupRankService evalGroupRankService;
+ private final EvalGroupRankStageService evalGroupRankStageService;
+ private final EvalGroupRewardDimService evalGroupRewardDimService;
private final EvalRewardDistDetailService evalRewardDistDetailService;
@Value("${spring.cache.custom.global-prefix}:dist:eval-reward")
@@ -152,14 +155,32 @@ public class EvalRewardService {
log.info("分配奖惩的考评组:{}", evalGroupId);
EvalGroup evalGroup = evalGroupService.getById(evalGroupId);
BV.notNull(evalGroup, "考评组不存在,终止计算!");
+ EvalGroupRank evalGroupRank = evalGroupRankService.getById(evalGroup.getEvalGroupRankId());
+ BV.notNull(evalGroupRank, "考评排名组不存在,终止计算!");
+ EvalGroupRankStage evalGroupRankStage = evalGroupRankStageService.getById(evalGroup.getEvalGroupRankStageId());
+ BV.notNull(evalGroupRankStage, "考评阶段不存在,终止计算!");
+
+
+// List pools = evalShopPoolService.list(Wrappers.lambdaQuery()
+// .eq(EvalShopPool::getEvalGroupId, evalGroupId)
+// .eq(EvalShopPool::getYn, Boolean.TRUE)
+// );
+// if (PublicUtil.isEmpty(pools)) {
+// log.error("考评池不存在,终止计算!");
+// return;
+// }
+// BV.isNotEmpty(pools, "考评池不存在,终止计算!");
- List pools = evalShopPoolService.list(Wrappers.lambdaQuery()
- .eq(EvalShopPool::getEvalGroupId, evalGroupId)
- .eq(EvalShopPool::getYn, Boolean.TRUE)
+ List shopRewardDims = evalGroupRewardDimService.list(Wrappers.lambdaQuery()
+ .eq(EvalGroupRewardDim::getEvalGroupId, evalGroup.getId())
+ .eq(EvalGroupRewardDim::getType, EvalScopeEnum.SHOP)
+ .eq(EvalGroupRewardDim::getYn, Boolean.TRUE)
);
- BV.isNotEmpty(pools, "考评池不存在,终止计算!");
-
- sendDistRewardTodo(pools, evalGroup );
+ if (PublicUtil.isEmpty(shopRewardDims)) {
+ log.error("考评奖惩没有门店:{}", JSON.toJSONString(evalGroup));
+ return;
+ }
+// sendDistRewardTodo(shopRewardDims, evalGroup, evalGroupRank, evalGroupRankStage);
}
/**
@@ -168,81 +189,98 @@ public class EvalRewardService {
* @param
*/
@Transactional(rollbackFor = Exception.class)
- public void sendDistRewardTodo(List pools, EvalGroup evalGroup) {
-// Eval eval = evalService.getById(evalGroup.getEvalGroupRankId());
-// BV.notNull(eval, "考评配置不存在,请重试");
-//
-// DecimalFormat decimalFormat = new DecimalFormat("##########.##");
-// final String roleCode = evalGroup.getRoleCodes().stream().findFirst().get();
-// final String evalGroupName = evalGroup.getName();
-// final String evalName = eval.getName();
-// final EvalTypeEnum evalType = eval.getType();
-// List shopIds = evalGroup.getShopIds();
-//
-// Date expireTime = DateUtil.localDateTime2Date(LocalDateTime.now().plusDays(2L));
-//
-// List itemList = new ArrayList<>();
-// List users = this.getUserEnableRoleInfos(roleCode, shopIds);
-// for (RpcUserRoleInfoDTO user : users) {
-// List manageShopIds = user.getRangeList().stream()
-// .filter(range -> shopIds.contains(range.getShopId()))
-// .map(RpcUserRoleShopDTO::getShopId).distinct().collect(Collectors.toList());
-// if (PublicUtil.isEmpty(manageShopIds)) {
-// continue;
-// }
-//
-// List poolIds = new ArrayList<>();
-// BigDecimal reward = BigDecimal.ZERO;
-// for (EvalShopPool pool : pools) {
-// if (manageShopIds.contains(pool.getShopId())) {
-// poolIds.add(pool.getId());
-// reward = reward.add(pool.getReward());
-// }
-// }
-// //奖惩为0不分配
-// if (BigDecimal.ZERO.compareTo(reward) == 0) {
-// return;
-// }
-//
-// EvalRewardDist rewardDist = transferPo(evalGroup);
-// rewardDist.setUserId(user.getUserId());
-// rewardDist.setEvalShopPoolIds(poolIds);
-// rewardDist.setShopIds(manageShopIds);
-// rewardDist.setEvalName(evalName);
-// rewardDist.setEvalType(evalType);
-// rewardDist.setReward(reward);
-// evalRewardDistService.save(rewardDist);
-//
-// BacklogBatchPlanItemReqDTO planItemReq = new BacklogBatchPlanItemReqDTO();
-// planItemReq.setDataId(rewardDist.getId().toString());
-// planItemReq.setUserId(user.getUserId());
-// planItemReq.setPlanTime(new Date());
-// planItemReq.setExpireTime(expireTime);
-//
-// Map dynamicMap = new HashMap<>(8);
-// dynamicMap.put("evalGroupName", evalGroupName);
-// dynamicMap.put("evalName", evalName);
-// dynamicMap.put("evalType", evalType.getName());
-// dynamicMap.put("amount", decimalFormat.format(rewardDist.getReward()));
-// planItemReq.setDynamicMap(dynamicMap);
-//
-// Map extraData = new HashMap<>();
-// 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));
-// }
+ public void sendDistRewardTodo(List shopRewardDims, EvalGroup evalGroup,
+ EvalGroupRank evalGroupRank, EvalGroupRankStage evalGroupRankStage) {
+ String evalGroupRankName = evalGroupRank.getName();
+ String evalGroupRankStageName = evalGroupRankStage.getName();
+ DecimalFormat decimalFormat = new DecimalFormat("##########.##");
+ List itemList = new ArrayList<>();
+
+ List distPoolIds = new ArrayList<>();
+ final Date expireTime = DateUtil.localDateTime2Date(LocalDateTime.now().plusDays(2L));
+ for (EvalGroupRewardDim rewardDim : shopRewardDims) {
+ final String roleCode = rewardDim.getDistRoleCode();
+ List pools = evalShopPoolService.list(Wrappers.lambdaQuery()
+ .eq(EvalShopPool::getEvalGroupId, evalGroup.getId())
+ .in(EvalShopPool::getShopId, rewardDim.getShopIds())
+ .eq(EvalShopPool::getYn, Boolean.TRUE)
+ );
+ if (PublicUtil.isEmpty(pools)) {
+ 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 users = this.getUserEnableRoleInfos(roleCode, distShopIds);
+ for (RpcUserRoleInfoDTO user : users) {
+ List manageShopIds = user.getRangeList().stream()
+ .filter(range -> distShopIds.contains(range.getShopId()))
+ .map(RpcUserRoleShopDTO::getShopId).distinct().collect(Collectors.toList());
+ if (PublicUtil.isEmpty(manageShopIds)) {
+ continue;
+ }
+ List poolIds = new ArrayList<>();
+ BigDecimal reward = BigDecimal.ZERO;
+ for (EvalShopPool pool : pools) {
+ if (manageShopIds.contains(pool.getShopId())) {
+ poolIds.add(pool.getId());
+ distPoolIds.add(pool.getId());
+ reward = reward.add(pool.getReward());
+ }
+ }
+ //奖惩为0不分配
+ if (BigDecimal.ZERO.compareTo(reward) == 0) {
+ return;
+ }
+
+ EvalRewardDist rewardDist = transferPo(evalGroup);
+ rewardDist.setUserId(user.getUserId());
+ rewardDist.setEvalShopPoolIds(poolIds);
+ rewardDist.setShopIds(manageShopIds);
+ rewardDist.setEvalName(evalGroupRankName);
+// rewardDist.setEvalType(evalType);
+ rewardDist.setReward(reward);
+ evalRewardDistService.save(rewardDist);
+
+ BacklogBatchPlanItemReqDTO planItemReq = new BacklogBatchPlanItemReqDTO();
+ planItemReq.setDataId(rewardDist.getId().toString());
+ planItemReq.setUserId(user.getUserId());
+ planItemReq.setPlanTime(new Date());
+ planItemReq.setExpireTime(expireTime);
+
+ Map dynamicMap = new HashMap<>(8);
+ dynamicMap.put("evalGroupName", evalGroupRankName);
+ dynamicMap.put("evalName", evalGroupRankStageName);
+// dynamicMap.put("evalType", evalType.getName());
+ dynamicMap.put("amount", decimalFormat.format(rewardDist.getReward()));
+ planItemReq.setDynamicMap(dynamicMap);
+
+ Map extraData = new HashMap<>();
+ planItemReq.setExtraData(extraData);
+ itemList.add(planItemReq);
+ }
-// if (PublicUtil.isEmpty(failItems) || itemList.size() > failItems.size()) {
-// pool.setStatus(EvalShopPoolStatusEnum.WAIT_DIST_REWARD);
-// evalShopPoolService.updateById(pool);
-// }
+ }
+
+
+ //推送待办
+ 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())
+ );
+ }
+ }
}
public EvalRewardDist transferPo(EvalGroup evalGroup) {