Commit 347b9a76110e4b7eb917c5b3dc3b24cd27f25ea2

Authored by 姜超
1 parent c1b3c16f

feature(*): 考评审批

考评审批
fw-morax-dao/src/main/resources/mapper/eval/EvalShopPoolDao.xml
... ... @@ -46,28 +46,26 @@
46 46  
47 47 <select id="queryPagePool" resultType="cn.fw.morax.domain.vo.eval.EvalShopPoolVO">
48 48 SELECT
49   - t1.id,
50   - t1.eval_id,
51   - t1.egc,
52   - t1.eval_group_id,
53   - t1.shop_id,
54   - t1.shop_name,
55   - t1.reward,
56   - t1.status,
57   - t1.score,
58   - t1.score_ratio,
59   - t1.monthly,
60   - t1.group_id,
61   - t2.name as evalGroupName
62   - from eval_shop_pool t1
63   - left join eval_group t2 on t1.eval_group_id = t2.id
64   - where t1.yn = 1
65   - and t1.group_id = #{condition.groupId}
  49 + id,
  50 + eval_id,
  51 + egc,
  52 + eval_group_id,
  53 + shop_id,
  54 + shop_name,
  55 + reward,
  56 + status,
  57 + score,
  58 + score_ratio,
  59 + monthly,
  60 + group_id
  61 + from eval_shop_pool
  62 + where yn = 1
  63 + and group_id = #{condition.groupId}
66 64 <if test="condition.monthly !=null">
67   - and t1.monthly = #{condition.monthly}
  65 + and monthly = #{condition.monthly}
68 66 </if>
69 67 <if test="condition.managerShopIds !=null and condition.managerShopIds.size() > 0">
70   - and t1.shop_id in
  68 + and shop_id in
71 69 <foreach collection="condition.managerShopIds" item="id" index="index" open="(" close=")" separator=",">
72 70 #{id}
73 71 </foreach>
... ...
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalRewardDist.java
... ... @@ -2,6 +2,8 @@ package cn.fw.morax.domain.db.eval;
2 2  
3 3 import cn.fw.common.data.entity.BaseAuditableTimeEntity;
4 4 import cn.fw.common.data.mybatis.handler.LongListTypeHandler;
  5 +import cn.fw.morax.domain.enums.EvalRewardDistStatusEnum;
  6 +import cn.fw.morax.domain.enums.EvalTypeEnum;
5 7 import com.baomidou.mybatisplus.annotation.TableField;
6 8 import com.baomidou.mybatisplus.annotation.TableLogic;
7 9 import com.baomidou.mybatisplus.annotation.TableName;
... ... @@ -45,6 +47,22 @@ public class EvalRewardDist extends BaseAuditableTimeEntity&lt;EvalRewardDist, Long
45 47 */
46 48 private Long evalGroupId;
47 49  
  50 +
  51 + /**
  52 + * 考评类型; 1:活动考评 2:其他考评
  53 + */
  54 + private EvalTypeEnum evalType;
  55 +
  56 + /**
  57 + * 考评
  58 + */
  59 + private String evalName;
  60 +
  61 + /**
  62 + * 考评组
  63 + */
  64 + private String evalGroupName;
  65 +
48 66 /**
49 67 * 考评组id
50 68 */
... ... @@ -65,7 +83,7 @@ public class EvalRewardDist extends BaseAuditableTimeEntity&lt;EvalRewardDist, Long
65 83 /**
66 84 * 状态
67 85 */
68   - private Integer status;
  86 + private EvalRewardDistStatusEnum status;
69 87  
70 88 /**
71 89 * 集团id
... ...
fw-morax-domain/src/main/java/cn/fw/morax/domain/enums/ApprovalTypeEnum.java
... ... @@ -20,6 +20,7 @@ public enum ApprovalTypeEnum implements IEnum&lt;Integer&gt; {
20 20 COMPLAIN(3, "绩效星级申诉"),
21 21 INCOME_COMPENSATION(4, "岗位最低收入补偿"),
22 22 EVAL(5, "考评"),
  23 + EVAL_REWARD_DIST(6, "考评奖惩分配"),
23 24 ;
24 25  
25 26 /**
... ...
fw-morax-domain/src/main/java/cn/fw/morax/domain/enums/EvalRewardDistStatusEnum.java 0 → 100644
  1 +package cn.fw.morax.domain.enums;
  2 +
  3 +import com.baomidou.mybatisplus.core.enums.IEnum;
  4 +import com.fasterxml.jackson.annotation.JsonCreator;
  5 +import com.fasterxml.jackson.annotation.JsonValue;
  6 +import lombok.Getter;
  7 +
  8 +/**
  9 + * 考评奖惩分配枚举
  10 + *
  11 + * @author kurisu
  12 + */
  13 +public enum EvalRewardDistStatusEnum implements IEnum<Integer> {
  14 + /**
  15 + * 考评奖惩分配枚举 1.未发布 2.发布待审批 3.审批拒绝 4.审批同意 5.撤销审批
  16 + */
  17 + NO_DIST(1, "未发布"),
  18 + APPROVAL(2, "发布待审批"),
  19 + APPROVAL_REJECT(3, "审批拒绝"),
  20 + APPROVAL_AGREE(4, "审批同意"),
  21 + APPROVAL_CANCEL(5, "撤销审批"),
  22 + ;
  23 +
  24 + /**
  25 + * 值
  26 + */
  27 + private final Integer value;
  28 + /**
  29 + * 名称
  30 + */
  31 + @Getter
  32 + private final String name;
  33 +
  34 + EvalRewardDistStatusEnum(final Integer value, final String name) {
  35 + this.value = value;
  36 + this.name = name;
  37 + }
  38 +
  39 + /**
  40 + * 根据枚举值获取枚举对象
  41 + */
  42 + @JsonCreator
  43 + public static EvalRewardDistStatusEnum ofValue(final Integer value) {
  44 + for (final EvalRewardDistStatusEnum _enum : EvalRewardDistStatusEnum.values()) {
  45 + if (_enum.value.equals(value)) {
  46 + return _enum;
  47 + }
  48 + }
  49 + return null;
  50 + }
  51 +
  52 + /**
  53 + * 获取值
  54 + *
  55 + * @return 值
  56 + */
  57 + @JsonValue
  58 + @Override
  59 + public Integer getValue() {
  60 + return value;
  61 + }
  62 +
  63 + /**
  64 + * 获取描述
  65 + *
  66 + * @return 值
  67 + */
  68 + @JsonCreator
  69 + public static String getNameByVale(final Integer value) {
  70 + for (final EvalRewardDistStatusEnum _enum : EvalRewardDistStatusEnum.values()) {
  71 + if (_enum.value.equals(value)) {
  72 + return _enum.getName();
  73 + }
  74 + }
  75 + return "";
  76 + }
  77 +}
... ...
fw-morax-rpc/src/main/java/cn/fw/morax/rpc/erp/ErpRpcService.java
... ... @@ -7,6 +7,7 @@ import cn.fw.ehr.sdk.api.StaffApi;
7 7 import cn.fw.ehr.sdk.api.result.*;
8 8 import cn.fw.erp.sdk.api.UserRoleApi;
9 9 import cn.fw.erp.sdk.api.enums.AuthStatusEnum;
  10 +import cn.fw.erp.sdk.api.enums.RoleUseTypeEnum;
10 11 import cn.fw.erp.sdk.api.result.UserRoleDataRange;
11 12 import cn.fw.erp.sdk.api.result.UserRoleInfo;
12 13 import cn.fw.morax.common.utils.PublicUtil;
... ... @@ -186,4 +187,32 @@ public class ErpRpcService {
186 187 return Boolean.FALSE;
187 188 }
188 189  
  190 + /**
  191 + * 查询人员是否拥有某个角色
  192 + *
  193 + * @param userId
  194 + * @return
  195 + */
  196 + public List<Long> manageShopIds(Long userId) {
  197 + try {
  198 + Message<List<UserRoleInfo>> msg = userRoleApi.queryUserRoleDetailList(userId);
  199 + log.info("获取人员所有角色信息 userRoleApi.queryUserRoleDetailList 传入参数:userId:{} 返回结果:{}", userId, JSON.toJSONString(msg));
  200 + if (msg.isSuccess() && !Objects.isNull(msg.getData())) {
  201 + Integer manageRoleType = RoleUseTypeEnum.MANAGE.getValue();
  202 + Integer enableStatus = AuthStatusEnum.ENABLED.getValue();
  203 +
  204 + List<Long> manageShopIds = msg.getData().stream()
  205 + .filter(userRole -> manageRoleType.equals(userRole.getUseType()))
  206 + .flatMap(userRole -> userRole.getDataRangeList().stream())
  207 + .filter(range -> enableStatus.equals(range.getStatus()))
  208 + .map(UserRoleDataRange::getRangeValue).distinct()
  209 + .collect(Collectors.toList());
  210 + return manageShopIds;
  211 + }
  212 + } catch (Exception e) {
  213 + e.printStackTrace();
  214 + }
  215 + return new ArrayList<>();
  216 + }
  217 +
189 218 }
... ...
fw-morax-server/src/main/java/cn/fw/morax/server/consumer/FlowConsumer.java
... ... @@ -7,11 +7,11 @@ import cn.fw.morax.domain.db.ApprovalRecord;
7 7 import cn.fw.morax.service.biz.ApprovalBizService;
8 8 import cn.fw.morax.service.biz.eval.EvalGroupBizService;
9 9 import cn.fw.morax.service.biz.eval.EvalGroupDataService;
  10 +import cn.fw.morax.service.biz.eval.EvalRewardService;
10 11 import cn.fw.morax.service.biz.kpi.KpiGroupBizService;
11 12 import cn.fw.morax.service.biz.kpi.KpiStarSpecialRuleBizService;
12 13 import cn.fw.morax.service.biz.salary.IncomeCompensationBizService;
13 14 import cn.fw.morax.service.biz.salary.SalaryGroupBizService;
14   -import cn.fw.morax.service.data.eval.EvalGroupService;
15 15 import com.alibaba.fastjson.JSONObject;
16 16 import lombok.RequiredArgsConstructor;
17 17 import lombok.extern.slf4j.Slf4j;
... ... @@ -39,6 +39,7 @@ public class FlowConsumer implements RocketMQListener&lt;ApprovalResult&gt; {
39 39 private final EvalGroupBizService evalGroupBizService;
40 40 private final KpiGroupBizService kpiGroupBizService;
41 41 private final ApprovalBizService approvalBizService;
  42 + private final EvalRewardService evalRewardService;
42 43  
43 44 @Override
44 45 @Transactional(rollbackFor = Exception.class)
... ... @@ -84,6 +85,10 @@ public class FlowConsumer implements RocketMQListener&lt;ApprovalResult&gt; {
84 85 evalGroupBizService.approvalEvalConfig(approvalRecord, result);
85 86 break;
86 87 }
  88 + case EVAL_REWARD_DIST: {
  89 + evalRewardService.approvalEvalRewardDist(approvalRecord, result);
  90 + break;
  91 + }
87 92 }
88 93 }
89 94  
... ...
fw-morax-server/src/main/java/cn/fw/morax/server/controller/app/EvalController.java
... ... @@ -12,11 +12,9 @@ import cn.fw.morax.domain.dto.eval.EvalDTO;
12 12 import cn.fw.morax.domain.dto.eval.EvalGroupIndicatorRankDTO;
13 13 import cn.fw.morax.domain.dto.eval.EvalRewardDistDTO;
14 14 import cn.fw.morax.domain.dto.query.EvalPoolQueryDTO;
15   -import cn.fw.morax.domain.dto.query.KpiPoolQueryDTO;
16 15 import cn.fw.morax.domain.vo.SelectorVO;
17 16 import cn.fw.morax.domain.vo.eval.*;
18 17 import cn.fw.morax.domain.vo.kpi.KpiIndicatorRankVO;
19   -import cn.fw.morax.domain.vo.kpi.KpiPoolVO;
20 18 import cn.fw.morax.service.biz.SettingDraftBizService;
21 19 import cn.fw.morax.service.biz.eval.*;
22 20 import cn.fw.security.auth.client.annotation.Authorization;
... ... @@ -163,7 +161,7 @@ public class EvalController {
163 161 public Message<EvalPoolIndicatorDetailVO> getStaffHitIndicatorDetail(@NotNull(message = "考评池id不能为空") Long evalPoolId,
164 162 @NotNull(message = "指标id不能为空") Long evalGroupIndicatorId,
165 163 @NotNull(message = "日期不能为空") @RequestParam("dataDate") LocalDate dataDate) {
166   - return success(evalGroupPoolService.getHitIndicatorDetail(evalPoolId, evalGroupIndicatorId, dataDate));
  164 + return success(evalGroupPoolService.staffHitIndicatorDetail(evalPoolId, evalGroupIndicatorId, dataDate));
167 165 }
168 166  
169 167 /**
... ... @@ -179,20 +177,7 @@ public class EvalController {
179 177 public Message<EvalPoolRewardDetailVO> getStaffRewardDetail(@NotNull(message = "考评池id不能为空") Long evalPoolId,
180 178 @NotNull(message = "指标id不能为空") Long evalGroupRewardId,
181 179 @NotNull(message = "日期不能为空") @RequestParam("dataDate") LocalDate dataDate) {
182   - return success(evalGroupPoolService.getStaffRewardDetail(evalPoolId, evalGroupRewardId, dataDate));
183   - }
184   -
185   - /**
186   - * 门店考评详情查询
187   - *
188   - * @param evalPoolId 用户id
189   - * @return 绩效池详情
190   - * @ignoreParams userId
191   - */
192   - @GetMapping("/shop-pool")
193   - @ControllerMethod("门店考评详情查询")
194   - public Message<EvalShopPoolVO> queryShopPoolDetail(@NotNull(message = "考评池id不能为空") Long evalPoolId) {
195   - return success(evalGroupPoolService.queryShopPoolDetail(evalPoolId));
  180 + return success(evalGroupPoolService.staffHitRewardDetail(evalPoolId, evalGroupRewardId, dataDate));
196 181 }
197 182  
198 183 /**
... ... @@ -223,7 +208,7 @@ public class EvalController {
223 208 * @return
224 209 * @ignoreParams currentUser
225 210 */
226   - @GetMapping("/staffs-pool")
  211 + @GetMapping("/staff-pools")
227 212 @ControllerMethod("人员考评池列表")
228 213 public Message<AppPage<EvalUserPoolVO>> queryUserPool(@Validated EvalPoolQueryDTO dto) {
229 214 if (PublicUtil.isEmpty(dto.getMonthly())) {
... ... @@ -249,6 +234,51 @@ public class EvalController {
249 234 }
250 235  
251 236 /**
  237 + * 门店考评详情查询
  238 + *
  239 + * @param evalPoolId 用户id
  240 + * @return 绩效池详情
  241 + * @ignoreParams userId
  242 + */
  243 + @GetMapping("/shop-pool")
  244 + @ControllerMethod("门店考评详情查询")
  245 + public Message<EvalShopPoolVO> queryShopPoolDetail(@NotNull(message = "考评池id不能为空") Long evalPoolId) {
  246 + return success(evalGroupPoolService.queryShopPoolDetail(evalPoolId));
  247 + }
  248 +
  249 + /**
  250 + * 门店考评得分详情
  251 + *
  252 + * @param evalPoolId
  253 + * @param evalGroupIndicatorId
  254 + * @return
  255 + */
  256 + @GetMapping("/shop/score-detail")
  257 + @IgnoreAuth
  258 + @ControllerMethod("门店考评得分详情")
  259 + public Message<EvalPoolIndicatorDetailVO> getShopHitIndicatorDetail(@NotNull(message = "考评池id不能为空") Long evalPoolId,
  260 + @NotNull(message = "指标id不能为空") Long evalGroupIndicatorId,
  261 + @NotNull(message = "日期不能为空") @RequestParam("dataDate") LocalDate dataDate) {
  262 + return success(evalGroupPoolService.shopHitIndicatorDetail(evalPoolId, evalGroupIndicatorId, dataDate));
  263 + }
  264 +
  265 + /**
  266 + * 门店奖惩详情
  267 + *
  268 + * @param evalPoolId
  269 + * @param evalGroupRewardId
  270 + * @return
  271 + */
  272 + @GetMapping("/shop/reward-detail")
  273 + @IgnoreAuth
  274 + @ControllerMethod("门店奖惩详情")
  275 + public Message<EvalPoolRewardDetailVO> getShopRewardDetail(@NotNull(message = "考评池id不能为空") Long evalPoolId,
  276 + @NotNull(message = "指标id不能为空") Long evalGroupRewardId,
  277 + @NotNull(message = "日期不能为空") @RequestParam("dataDate") LocalDate dataDate) {
  278 + return success(evalGroupPoolService.shopHitRewardDetail(evalPoolId, evalGroupRewardId, dataDate));
  279 + }
  280 +
  281 + /**
252 282 * 奖惩分配详情
253 283 *
254 284 */
... ... @@ -264,8 +294,9 @@ public class EvalController {
264 294 */
265 295 @PostMapping("/reward-dist")
266 296 @ControllerMethod("奖惩分配")
267   - public Message<Void> rewardDist(@Validated @RequestBody EvalRewardDistDTO rewardDist) {
268   - evalRewardService.rewardDist(rewardDist);
  297 + public Message<Void> rewardDist(@Validated @RequestBody EvalRewardDistDTO rewardDist,
  298 + @CurrentUser LoginAuthBean currentUser) {
  299 + evalRewardService.rewardDist(rewardDist, currentUser);
269 300 return success();
270 301 }
271 302  
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/ApprovalBizService.java
... ... @@ -3,10 +3,12 @@ package cn.fw.morax.service.biz;
3 3 import cn.fw.approval.sdk.param.InitiateApprovalParam;
4 4 import cn.fw.common.web.auth.LoginAuthBean;
5 5 import cn.fw.morax.common.config.FlowVal;
  6 +import cn.fw.morax.common.utils.DateUtil;
6 7 import cn.fw.morax.common.utils.PublicUtil;
7 8 import cn.fw.morax.domain.db.ApprovalRecord;
8 9 import cn.fw.morax.domain.db.SettingDraft;
9 10 import cn.fw.morax.domain.db.eval.Eval;
  11 +import cn.fw.morax.domain.db.eval.EvalRewardDist;
10 12 import cn.fw.morax.domain.db.kpi.KpiGroup;
11 13 import cn.fw.morax.domain.db.kpi.KpiStarSpecialRule;
12 14 import cn.fw.morax.domain.db.salary.SalaryGroup;
... ... @@ -444,4 +446,49 @@ public class ApprovalBizService {
444 446 approvalRecordService.save(approvalRecord);
445 447 }
446 448  
  449 + /**
  450 + * 提交审批
  451 + *
  452 + */
  453 + @Transactional(rollbackFor = Exception.class)
  454 + public void applyApproveDistReward(EvalRewardDist rewardDist, LoginAuthBean user) {
  455 + Date expTime = DateUtil.localDateTime2Date(LocalDate.now().atTime(23, 59, 59).plusDays(3));
  456 + //提交审批
  457 + List<InitiateApprovalParam.Condition> conditions = Lists.newArrayList();
  458 + InitiateApprovalParam.Condition shopCondition = new InitiateApprovalParam.Condition();
  459 + shopCondition.setParamName("shopId");
  460 + List<String> shopIdsStr = rewardDist.getShopIds().stream().map(s -> s.toString()).collect(Collectors.toList());
  461 + shopCondition.setValue(String.join(",", shopIdsStr));
  462 + conditions.add(shopCondition);
  463 + Map extDataMap = new HashMap<String, Object>() {{
  464 + put("id", rewardDist.getId().toString());
  465 + }};
  466 + FlowDto flowDto = FlowDto.builder()
  467 + .groupId(rewardDist.getGroupId())
  468 + .approvalNo(flowVal.getEvalShopReward())
  469 + .briefContent(Lists.newArrayList(
  470 + "申请人:" + user.getUserName(),
  471 + "考评/活动名称:" + user.getUserName(),
  472 + "考评类型:" + rewardDist.getEvalType().getName(),
  473 + "考评组:" + rewardDist.getEvalGroupName(),
  474 + "门店奖惩金额:" + rewardDist.getReward(),
  475 + "申请时间:" + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(LocalDateTime.now())
  476 + ))
  477 + .initiatorId(user.getUserId())
  478 + .expTime(expTime)
  479 + .shopIds(rewardDist.getShopIds())
  480 + .conditions(conditions)
  481 + .extData(extDataMap)
  482 + .build();
  483 + String approvalNo = flowApproveRpc.initiate(flowDto);
  484 + ApprovalRecord approvalRecord = ApprovalRecord.builder()
  485 + .approvalNo(approvalNo)
  486 + .approvalStatus(ApprovalStatusEnum.IN_APPROVAL)
  487 + .approvalType(ApprovalTypeEnum.EVAL_REWARD_DIST)
  488 + .dataId(rewardDist.getId())
  489 + .groupId(rewardDist.getGroupId())
  490 + .build();
  491 + approvalRecordService.save(approvalRecord);
  492 + }
  493 +
447 494 }
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupPoolService.java
... ... @@ -214,11 +214,8 @@ public class EvalGroupPoolService {
214 214 BigDecimal indicatorScoreRatio = indicatorValueVO.getScore().divide(baseScore, 2, RoundingMode.DOWN).multiply(Constant.ONE_HUNDRED);
215 215 indicatorValueVO.setScoreRatioFormat(decimalFormat.format(indicatorScoreRatio));
216 216 }
217   - BigDecimal staffScoreRatio = (BigDecimal.ZERO.compareTo(totalScore) == 0) ? BigDecimal.ZERO :
218   - staffScore.divide(totalScore, 2, RoundingMode.DOWN).multiply(Constant.ONE_HUNDRED);
219   - pool.setScoreRatioFormat(decimalFormat.format(staffScoreRatio));
  217 + pool.setScoreRatioFormat(decimalFormat.format(pool.getScoreRatio()));
220 218 pool.setIndicators(indicatorDetails);
221   - pool.setScoreRatio(staffScoreRatio);
222 219 pool.setTotalScore(totalScore);
223 220 }
224 221  
... ... @@ -309,6 +306,19 @@ public class EvalGroupPoolService {
309 306 return users.stream().findFirst().get().getDataDate();
310 307 }
311 308  
  309 + public EvalPoolIndicatorDetailVO staffHitIndicatorDetail(Long evalPoolId, Long evalGroupIndicatorId, LocalDate dataDate) {
  310 + EvalUserPool pool = evalUserPoolService.getById(evalPoolId);
  311 + BV.notNull(pool, "考评池不存在");
  312 + Long userId = pool.getUserId();
  313 + return getHitIndicatorDetail(evalPoolId, EvalScopeEnum.STAFF, userId, evalGroupIndicatorId, dataDate);
  314 + }
  315 +
  316 + public EvalPoolIndicatorDetailVO shopHitIndicatorDetail(Long evalPoolId, Long evalGroupIndicatorId, LocalDate dataDate) {
  317 + EvalShopPool pool = evalShopPoolService.getById(evalPoolId);
  318 + BV.notNull(pool, "考评池不存在");
  319 + Long userId = pool.getShopId();
  320 + return getHitIndicatorDetail(evalPoolId, EvalScopeEnum.SHOP, userId, evalGroupIndicatorId, dataDate);
  321 + }
312 322  
313 323 /**
314 324 * 员工考评得分详情
... ... @@ -317,12 +327,12 @@ public class EvalGroupPoolService {
317 327 * @param evalGroupIndicatorId
318 328 * @return
319 329 */
320   - public EvalPoolIndicatorDetailVO getHitIndicatorDetail(Long evalPoolId, Long evalGroupIndicatorId, LocalDate dataDate) {
321   - EvalUserPool pool = evalUserPoolService.getById(evalPoolId);
322   - Long userId = pool.getUserId();
323   - EvalScopeEnum scopeType = EvalScopeEnum.STAFF;
324   - BV.notNull(pool, "考评池不存在");
325   - EvalPoolIndicatorDetailVO indicatorDetail = evalPoolIndicatorDetailService.getStaffIndicatorValue(evalPoolId, evalGroupIndicatorId, dataDate);
  330 + public EvalPoolIndicatorDetailVO getHitIndicatorDetail(Long evalPoolId, EvalScopeEnum scopeType, Long referId, Long evalGroupIndicatorId, LocalDate dataDate) {
  331 +// EvalUserPool pool = evalUserPoolService.getById(evalPoolId);
  332 +// Long userId = pool.getUserId();
  333 +// EvalScopeEnum scopeType = EvalScopeEnum.STAFF;
  334 +// BV.notNull(pool, "考评池不存在");
  335 + EvalPoolIndicatorDetailVO indicatorDetail = evalPoolIndicatorDetailService.getStaffIndicatorValue(evalPoolId, scopeType, evalGroupIndicatorId, dataDate);
326 336 BV.notNull(indicatorDetail, "考评指标明细不存在");
327 337  
328 338 //命中记录
... ... @@ -339,14 +349,14 @@ public class EvalGroupPoolService {
339 349  
340 350 //参数
341 351 Map<ParamTypeEnum, List<EvalGroupIndicatorParamVO>> paramMap = this.getEvalGroupIndicatorParamMap(evalGroupIndicatorId,
342   - userId, evalPoolId, scopeType, dataDate);
  352 + referId, evalPoolId, scopeType, dataDate);
343 353 indicatorDetail.setLadderParams(paramMap.getOrDefault(ParamTypeEnum.LADDER, new ArrayList<>()));
344 354 indicatorDetail.setCommissionParams(paramMap.getOrDefault(ParamTypeEnum.COMMISSION, new ArrayList<>()));
345 355  
346 356  
347 357 //条件
348 358 List<EvalGroupIndicatorPreconditionVO> preconditionVOS = this.getHitPreconditionVo(evalGroupIndicatorId,
349   - userId, evalPoolId, scopeType, dataDate);
  359 + referId, evalPoolId, scopeType, dataDate);
350 360 indicatorDetail.setConds(preconditionVOS);
351 361  
352 362 //处理百分数
... ... @@ -527,31 +537,42 @@ public class EvalGroupPoolService {
527 537 }
528 538 }
529 539  
  540 + public EvalPoolRewardDetailVO staffHitRewardDetail(Long evalPoolId, Long evalGroupRewardId, LocalDate dataDate) {
  541 + EvalUserPool pool = evalUserPoolService.getById(evalPoolId);
  542 + BV.notNull(pool, "考评池不存在");
  543 + Long userId = pool.getUserId();
  544 + return getHitRewardDetail(evalPoolId, EvalScopeEnum.STAFF, userId, evalGroupRewardId, dataDate);
  545 + }
  546 +
  547 + public EvalPoolRewardDetailVO shopHitRewardDetail(Long evalPoolId, Long evalGroupRewardId, LocalDate dataDate) {
  548 + EvalShopPool pool = evalShopPoolService.getById(evalPoolId);
  549 + BV.notNull(pool, "考评池不存在");
  550 + Long referId = pool.getShopId();
  551 + return getHitRewardDetail(evalPoolId, EvalScopeEnum.SHOP, referId, evalGroupRewardId, dataDate);
  552 + }
  553 +
530 554 /**
531   - * 员工奖惩详情
  555 + * 奖惩详情
532 556 *
533 557 * @param evalPoolId
534 558 * @param evalGroupRewardId
535 559 * @param dataDate
536 560 * @return
537 561 */
538   - public EvalPoolRewardDetailVO getStaffRewardDetail(Long evalPoolId, Long evalGroupRewardId, LocalDate dataDate) {
539   - EvalUserPool pool = evalUserPoolService.getById(evalPoolId);
540   - BV.notNull(pool, "考评池不存在");
541   - Long userId = pool.getUserId();
  562 + public EvalPoolRewardDetailVO getHitRewardDetail(Long evalPoolId, EvalScopeEnum scopeType, Long referId, Long evalGroupRewardId, LocalDate dataDate) {
542 563  
543 564 EvalPoolRewardDetailVO reward = evalPoolRewardDetailService.getStaffRewardValue(evalPoolId, evalGroupRewardId, dataDate);
544 565 BV.notNull(reward, "考评奖惩明细不存在");
545 566  
546 567 //命中记录
547   - Optional<EvalGroupRewardHitLog> hitLog = this.getRewardHitLog(evalGroupRewardId, evalPoolId, EvalScopeEnum.STAFF, dataDate);
  568 + Optional<EvalGroupRewardHitLog> hitLog = this.getRewardHitLog(evalGroupRewardId, evalPoolId, scopeType, dataDate);
548 569 reward.setHitLadderValue(hitLog.map(EvalGroupRewardHitLog::getHitLadderValue).orElse(BigDecimal.ZERO));
549 570 reward.setHitCommissionValue(hitLog.map(EvalGroupRewardHitLog::getHitCommissionValue).orElse(BigDecimal.ZERO));
550 571 Long hitLadderId = hitLog.map(EvalGroupRewardHitLog::getEvalGroupRewardLaddersId).orElse(0L);
551 572  
552 573 //参数
553 574 Map<ParamTypeEnum, List<EvalGroupRewardParamVO>> rewardParamMap = this.getEvalGroupRewardParamMap(evalGroupRewardId,
554   - evalPoolId, EvalScopeEnum.STAFF, userId, dataDate);
  575 + evalPoolId, scopeType, referId, dataDate);
555 576 reward.setLadderParams(rewardParamMap.getOrDefault(ParamTypeEnum.LADDER, new ArrayList<>()));
556 577 reward.setCommissionParams(rewardParamMap.getOrDefault(ParamTypeEnum.COMMISSION, new ArrayList<>()));
557 578  
... ... @@ -559,7 +580,7 @@ public class EvalGroupPoolService {
559 580 reward.setLadders(this.getLadderVos(reward, hitLadderId));
560 581  
561 582 //条件
562   - reward.setConds(getConds(evalPoolId, userId, evalGroupRewardId, dataDate));
  583 + reward.setConds(getConds(evalPoolId, referId, evalGroupRewardId, dataDate));
563 584  
564 585 //处理百分数
565 586 processRewardPercent(reward);
... ... @@ -832,7 +853,6 @@ public class EvalGroupPoolService {
832 853 if (indicatorUserValueMap.containsKey(kpiPool.getUserId())) {
833 854 IndicatorUserValueVO indicatorUserValueVO = indicatorUserValueMap.get(kpiPool.getUserId());
834 855 rankStaffVO.setOriginValue(commonService.queryIndicatorValueVO(indicatorCode, indicatorUserValueVO));
835   -
836 856 }
837 857 staffRanks.add(rankStaffVO);
838 858 }
... ... @@ -1002,7 +1022,6 @@ public class EvalGroupPoolService {
1002 1022 * @return
1003 1023 */
1004 1024 public void calcRank(List<KpiIndicatorRankStaffVO> staffs) {
1005   -
1006 1025 int rank = 1;
1007 1026 BigDecimal lastIndicatorValue = null;
1008 1027 for (KpiIndicatorRankStaffVO staff : staffs) {
... ... @@ -1020,7 +1039,6 @@ public class EvalGroupPoolService {
1020 1039 staff.setIndicatorRank(rank);
1021 1040 lastIndicatorValue = staff.getOriginValue();
1022 1041 }
1023   -
1024 1042 }
1025 1043  
1026 1044 }
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalPoolService.java
... ... @@ -4,15 +4,19 @@ import cn.fw.common.page.AppPage;
4 4 import cn.fw.morax.common.constant.Constant;
5 5 import cn.fw.morax.common.utils.PublicUtil;
6 6 import cn.fw.morax.common.utils.StringUtils;
  7 +import cn.fw.morax.domain.db.eval.EvalGroup;
7 8 import cn.fw.morax.domain.dto.query.EvalPoolQueryDTO;
8 9 import cn.fw.morax.domain.vo.eval.EvalShopPoolVO;
9 10 import cn.fw.morax.domain.vo.eval.EvalUserPoolVO;
10 11 import cn.fw.morax.rpc.ehr.EhrRpcService;
  12 +import cn.fw.morax.rpc.erp.ErpRpcService;
11 13 import cn.fw.morax.service.biz.CommonService;
  14 +import cn.fw.morax.service.data.eval.EvalGroupService;
12 15 import cn.fw.morax.service.data.eval.EvalGroupUserService;
13 16 import cn.fw.morax.service.data.eval.EvalShopPoolService;
14 17 import cn.fw.morax.service.data.eval.EvalUserPoolService;
15 18 import com.alibaba.fastjson.JSON;
  19 +import com.baomidou.mybatisplus.core.toolkit.Wrappers;
16 20 import lombok.RequiredArgsConstructor;
17 21 import lombok.extern.slf4j.Slf4j;
18 22 import org.springframework.stereotype.Service;
... ... @@ -22,6 +26,7 @@ import java.math.RoundingMode;
22 26 import java.time.YearMonth;
23 27 import java.util.Arrays;
24 28 import java.util.List;
  29 +import java.util.Map;
25 30 import java.util.Objects;
26 31 import java.util.stream.Collectors;
27 32  
... ... @@ -36,9 +41,11 @@ import java.util.stream.Collectors;
36 41 public class EvalPoolService {
37 42  
38 43 private final EvalGroupUserService evalGroupUserService;
  44 + private final EvalGroupService evalGroupService;
39 45 private final EvalUserPoolService evalUserPoolService;
40 46 private final EvalShopPoolService evalShopPoolService;
41 47 private final CommonService commonService;
  48 + private final ErpRpcService erpRpcService;
42 49 private final EhrRpcService ehrRpcService;
43 50  
44 51  
... ... @@ -64,13 +71,16 @@ public class EvalPoolService {
64 71 long total = evalUserPoolService.queryPagePoolTotal(dto);
65 72 if (total > 0) {
66 73 page.setTotal(total);
67   - List<EvalUserPoolVO> userPoolVOS = evalUserPoolService.queryPagePool(dto);
68   - for (EvalUserPoolVO poolVO : userPoolVOS) {
69   - BigDecimal staffScoreRatio = (BigDecimal.ZERO.compareTo(poolVO.getTotalScore()) == 0) ? BigDecimal.ZERO :
70   - poolVO.getScore().divide(poolVO.getTotalScore(), 2, RoundingMode.DOWN).multiply(Constant.ONE_HUNDRED);
71   - poolVO.setScoreRatio(staffScoreRatio);
  74 + List<EvalUserPoolVO> userPools = evalUserPoolService.queryPagePool(dto);
  75 + List<EvalGroup> evalGroups = evalGroupService.list(Wrappers.<EvalGroup>lambdaQuery()
  76 + .in(EvalGroup::getId, userPools.stream().map(EvalUserPoolVO::getEvalGroupId).collect(Collectors.toSet()))
  77 + .eq(EvalGroup::getYn, Boolean.TRUE)
  78 + );
  79 + Map<Long, String> evalGroupNameMap = evalGroups.stream().collect(Collectors.toMap(EvalGroup::getId, EvalGroup::getName));
  80 + for (EvalUserPoolVO userPool : userPools) {
  81 + userPool.setEvalGroupName(evalGroupNameMap.getOrDefault(userPool.getEvalGroupId(), ""));
72 82 }
73   - page.setData(userPoolVOS);
  83 + page.setData(userPools);
74 84 }
75 85 return page;
76 86 }
... ... @@ -83,9 +93,9 @@ public class EvalPoolService {
83 93 */
84 94 public AppPage<EvalShopPoolVO> queryShopPool(EvalPoolQueryDTO dto) {
85 95 if (PublicUtil.isNotEmpty(dto.getManagerUserId())) {
86   - dto.setManagerShopIds(ehrRpcService.queryManageShops(dto.getManagerUserId()));
  96 + dto.setManagerShopIds(erpRpcService.manageShopIds(dto.getManagerUserId()));
87 97 } else {
88   - dto.setManagerShopIds(ehrRpcService.queryManageShops(dto.getCurrentUserId()));
  98 + dto.setManagerShopIds(erpRpcService.manageShopIds(dto.getCurrentUserId()));
89 99 }
90 100 if (PublicUtil.isEmpty(dto.getManagerShopIds())) {
91 101 return AppPage.empty(dto);
... ... @@ -97,11 +107,22 @@ public class EvalPoolService {
97 107 long total = evalShopPoolService.queryPagePoolTotal(dto);
98 108 if (total > 0) {
99 109 page.setTotal(total);
100   - page.setData(evalShopPoolService.queryPagePool(dto));
  110 + List<EvalShopPoolVO> shopPools = evalShopPoolService.queryPagePool(dto);
  111 + List<EvalGroup> evalGroups = evalGroupService.list(Wrappers.<EvalGroup>lambdaQuery()
  112 + .in(EvalGroup::getId, shopPools.stream().map(EvalShopPoolVO::getEvalGroupId).collect(Collectors.toSet()))
  113 + .eq(EvalGroup::getYn, Boolean.TRUE)
  114 + );
  115 + Map<Long, String> evalGroupNameMap = evalGroups.stream().collect(Collectors.toMap(EvalGroup::getId, EvalGroup::getName));
  116 + for (EvalShopPoolVO shopPool : shopPools) {
  117 + shopPool.setEvalGroupName(evalGroupNameMap.getOrDefault(shopPool.getEvalGroupId(), ""));
  118 + }
  119 + page.setData(shopPools);
101 120 }
102 121 return page;
103 122 }
104 123  
  124 +
  125 +
105 126 /**
106 127 * 参数赋值
107 128 *
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalRewardService.java
... ... @@ -3,13 +3,15 @@ package cn.fw.morax.service.biz.eval;
3 3 import cn.fw.backlog.sdk.api.result.FailBacklogItem;
4 4 import cn.fw.common.cache.locker.DistributedLocker;
5 5 import cn.fw.common.exception.BusinessException;
  6 +import cn.fw.common.web.auth.LoginAuthBean;
6 7 import cn.fw.morax.common.config.TodoVal;
  8 +import cn.fw.morax.common.pojo.event.ApprovalResultEvent;
7 9 import cn.fw.morax.common.utils.DateUtil;
8 10 import cn.fw.morax.common.utils.PublicUtil;
9 11 import cn.fw.morax.common.utils.ThreadPoolUtil;
10 12 import cn.fw.morax.domain.bo.eval.EvalGroupRewardDistributionBO;
  13 +import cn.fw.morax.domain.db.ApprovalRecord;
11 14 import cn.fw.morax.domain.db.eval.*;
12   -import cn.fw.morax.domain.db.salary.SalaryExtraProject;
13 15 import cn.fw.morax.domain.dto.eval.EvalRewardDistDTO;
14 16 import cn.fw.morax.domain.dto.eval.EvalRewardDistDetailDTO;
15 17 import cn.fw.morax.domain.enums.*;
... ... @@ -22,8 +24,7 @@ import cn.fw.morax.rpc.backlog.dto.BacklogBatchPlanReqDTO;
22 24 import cn.fw.morax.rpc.erp.ErpRpcService;
23 25 import cn.fw.morax.rpc.erp.dto.RpcUserRoleInfoDTO;
24 26 import cn.fw.morax.rpc.erp.dto.RpcUserRoleShopDTO;
25   -import cn.fw.morax.service.biz.calculator.eval.kpi.EvalKpiBaseCalculator;
26   -import cn.fw.morax.service.biz.calculator.eval.reward.EvalRewardBaseCalculator;
  27 +import cn.fw.morax.service.biz.ApprovalBizService;
27 28 import cn.fw.morax.service.data.eval.*;
28 29 import com.alibaba.fastjson.JSON;
29 30 import com.alibaba.fastjson.JSONObject;
... ... @@ -63,6 +64,7 @@ import static cn.fw.common.businessvalidator.Validator.BV;
63 64 public class EvalRewardService {
64 65  
65 66 private final TodoVal todoVal;
  67 + private final ApprovalBizService approvalBizService;
66 68 private final TodoRpcService todoRpcService;
67 69 private final ErpRpcService erpRpcService;
68 70 private final EvalRewardDistService evalRewardDistService;
... ... @@ -209,8 +211,11 @@ public class EvalRewardService {
209 211 rewardDist.setEvalGroupId(evalGroup.getId());
210 212 rewardDist.setEvalShopPoolIds(poolIds);
211 213 rewardDist.setShopIds(manageShopIds);
  214 + rewardDist.setEvalGroupName(evalGroupName);
  215 + rewardDist.setEvalName(evalName);
  216 + rewardDist.setEvalType(evalType);
212 217 rewardDist.setReward(reward);
213   - rewardDist.setStatus(1);
  218 + rewardDist.setStatus(EvalRewardDistStatusEnum.NO_DIST);
214 219 rewardDist.setGroupId(evalGroup.getGroupId());
215 220 rewardDist.setYn(Boolean.TRUE);
216 221 evalRewardDistService.save(rewardDist);
... ... @@ -290,7 +295,8 @@ public class EvalRewardService {
290 295 return rewardDistVO;
291 296 }
292 297  
293   - public void rewardDist(EvalRewardDistDTO rewardDistDTO) {
  298 + @Transactional(rollbackFor = Exception.class)
  299 + public void rewardDist(EvalRewardDistDTO rewardDistDTO, LoginAuthBean currentUser) {
294 300 Long rewardDistId = rewardDistDTO.getEvalShopDistId();
295 301 EvalRewardDist rewardDist = evalRewardDistService.getById(rewardDistId);
296 302 BV.notNull(rewardDist, "奖惩分配不存在,请重试");
... ... @@ -319,14 +325,32 @@ public class EvalRewardService {
319 325 evalRewardDistDetail.setYn(Boolean.TRUE);
320 326 }
321 327  
322   - BackLogItemDTO dto = new BackLogItemDTO(rewardDist.getUserId(), todoVal.getDistEvalReward(),
323   - String.valueOf(rewardDist.getId()), new Date(), null);
324   - if (todoRpcService.cancel(dto)) {
325   - evalRewardDistDetailService.saveBatch(distDetails);
326   - } else {
327   - log.error("奖惩分配待办取消失败:{}", JSON.toJSONString(rewardDist));
328   - throw new BusinessException("奖惩分配失败,请重试");
329   - }
  328 + approvalBizService.applyApproveDistReward(rewardDist, currentUser);
  329 + evalRewardDistDetailService.saveBatch(distDetails);
  330 + rewardDist.setStatus(EvalRewardDistStatusEnum.APPROVAL);
  331 + evalRewardDistService.saveOrUpdate(rewardDist);
  332 + }
330 333  
  334 + @Transactional(rollbackFor = Exception.class)
  335 + public void approvalEvalRewardDist(ApprovalRecord approvalRecord, ApprovalResultEvent result) {
  336 + log.info("收到考评门店奖惩分配审批信息:{}", JSON.toJSONString(result));
  337 + Boolean agree = result.getAgree();
  338 + Long rewardDistId = approvalRecord.getDataId();
  339 + EvalRewardDist rewardDist = evalRewardDistService.getById(rewardDistId);
  340 + BV.notNull(rewardDist, "奖惩分配不存在,请重试");
  341 + rewardDist.setStatus(EvalRewardDistStatusEnum.APPROVAL_REJECT);
  342 + if (agree) {
  343 + BackLogItemDTO dto = new BackLogItemDTO(rewardDist.getUserId(), todoVal.getDistEvalReward(),
  344 + String.valueOf(rewardDist.getId()), new Date(), null);
  345 + if (todoRpcService.cancel(dto)) {
  346 +
  347 + } else {
  348 + log.error("奖惩分配待办取消失败:{}", JSON.toJSONString(rewardDist));
  349 + throw new BusinessException("奖惩分配失败,请重试");
  350 + }
  351 + rewardDist.setStatus(EvalRewardDistStatusEnum.APPROVAL_AGREE);
  352 + }
  353 + evalRewardDistService.saveOrUpdate(rewardDist);
331 354 }
  355 +
332 356 }
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalPoolIndicatorDetailService.java
... ... @@ -2,6 +2,7 @@ package cn.fw.morax.service.data.eval;
2 2  
3 3  
4 4 import cn.fw.morax.domain.db.eval.EvalPoolIndicatorDetail;
  5 +import cn.fw.morax.domain.enums.EvalScopeEnum;
5 6 import cn.fw.morax.domain.vo.eval.EvalPoolIndicatorDetailVO;
6 7 import com.baomidou.mybatisplus.extension.service.IService;
7 8 import org.apache.ibatis.annotations.Param;
... ... @@ -40,6 +41,7 @@ public interface EvalPoolIndicatorDetailService extends IService&lt;EvalPoolIndicat
40 41 * @return
41 42 */
42 43 EvalPoolIndicatorDetailVO getStaffIndicatorValue(Long evalPoolId,
  44 + EvalScopeEnum scopeType,
43 45 Long evalGroupIndicatorId,
44 46 LocalDate localDate);
45 47 }
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalPoolIndicatorDetailServiceImpl.java
... ... @@ -30,7 +30,7 @@ public class EvalPoolIndicatorDetailServiceImpl extends ServiceImpl&lt;EvalPoolIndi
30 30 }
31 31  
32 32 @Override
33   - public EvalPoolIndicatorDetailVO getStaffIndicatorValue(Long evalPoolId, Long evalGroupIndicatorId, LocalDate localDate) {
34   - return this.baseMapper.getStaffIndicatorValue(evalPoolId, EvalScopeEnum.STAFF.getValue(), evalGroupIndicatorId, localDate);
  33 + public EvalPoolIndicatorDetailVO getStaffIndicatorValue(Long evalPoolId, EvalScopeEnum scopeType,Long evalGroupIndicatorId, LocalDate localDate) {
  34 + return this.baseMapper.getStaffIndicatorValue(evalPoolId, scopeType.getValue(), evalGroupIndicatorId, localDate);
35 35 }
36 36 }
... ...