Commit 3cbc22e1f91f424944d4ef75eebce7e34dbc5612
1 parent
4964363d
feature(*): 考评排名组修改
考评排名组修改
Showing
16 changed files
with
643 additions
and
789 deletions
doc/2023_update.sql
... | ... | @@ -558,4 +558,5 @@ ALTER TABLE `fw_morax`.`eval_group_user` |
558 | 558 | -- eval_group_rank |
559 | 559 | -- eval_group |
560 | 560 | -- kpi_stage_mq_log |
561 | --- indicator_user_stage_value | |
562 | 561 | \ No newline at end of file |
562 | +-- indicator_user_stage_value | |
563 | +-- 同步指标 考评得分率、绩效得分率 | |
563 | 564 | \ No newline at end of file | ... | ... |
fw-morax-common/src/main/java/cn/fw/morax/common/config/SpecialIndicatorCodeVal.java
fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalGroupDao.java
... | ... | @@ -27,12 +27,6 @@ public interface EvalGroupDao extends BaseMapper<EvalGroup> { |
27 | 27 | * @return |
28 | 28 | */ |
29 | 29 | List<EvalGroup> getAllEffectGroups(@Param("day") LocalDate day); |
30 | - /** | |
31 | - * 查询生效中的考评组 | |
32 | - * @param day | |
33 | - * @return | |
34 | - */ | |
35 | - List<EvalGroup> getAllEffectGroupByEgcs(@Param("egcs") List<String> egcs, @Param("day") LocalDate day); | |
36 | 30 | |
37 | 31 | /** |
38 | 32 | * 查询生效中的考评组 |
... | ... | @@ -43,7 +37,7 @@ public interface EvalGroupDao extends BaseMapper<EvalGroup> { |
43 | 37 | |
44 | 38 | Set<Long> queryCalculableEvalGroupIds(@Param("day") LocalDate localDate); |
45 | 39 | |
46 | - Set<Long> queryDistributionShopReward(@Param("day") LocalDate localDate, @Param("scopeType") Integer scopeType); | |
40 | + Set<Long> queryDistributionShopReward(@Param("day") LocalDate localDate); | |
47 | 41 | |
48 | 42 | /** |
49 | 43 | * 查询生效中的考评组 | ... | ... |
fw-morax-dao/src/main/resources/mapper/eval/EvalGroupMapper.xml
... | ... | @@ -8,9 +8,9 @@ |
8 | 8 | </sql> |
9 | 9 | |
10 | 10 | <sql id="left_join_columns"> |
11 | - t1.id,t1.eval_group_rank_id, | |
12 | - t1.eval_group_rank_stage_id,t1.egc,t1.post_ids,t1.post_names, | |
13 | - t1.shop_ids,t1.shop_names,t1.indicator_num,t1.group_id | |
11 | + t3.id,t3.eval_group_rank_id, | |
12 | + t3.eval_group_rank_stage_id,t3.egc,t3.post_ids,t3.post_names, | |
13 | + t3.shop_ids,t3.shop_names,t3.indicator_num,t3.group_id | |
14 | 14 | </sql> |
15 | 15 | |
16 | 16 | <!-- 通用查询映射结果 --> |
... | ... | @@ -32,11 +32,15 @@ |
32 | 32 | <select id="getAllEffectGroups" resultMap="BaseResultMap"> |
33 | 33 | select |
34 | 34 | <include refid="left_join_columns"/> |
35 | - from eval_group | |
36 | - where yn = 1 | |
37 | - and DATE_FORMAT(begin_time, '%Y-%m-%d') <= DATE_FORMAT(#{day}, '%Y-%m-%d') | |
38 | - and DATE_FORMAT(over_time, '%Y-%m-%d') >= DATE_FORMAT(#{day}, '%Y-%m-%d') | |
39 | - and eval_id in (select id from eval where `status` in (3,4) and yn = 1) | |
35 | + FROM | |
36 | + eval_group_rank t1 | |
37 | + LEFT JOIN eval_group_rank_stage t2 ON t1.id = t2.eval_group_rank_id AND t2.yn = 1 | |
38 | + LEFT JOIN eval_group t3 ON t2.id = t3.eval_group_rank_stage_id AND t3.yn = 1 | |
39 | + WHERE | |
40 | + t1.yn = 1 | |
41 | + AND t1.`status` IN ( 3, 4 ) | |
42 | + and DATE_FORMAT(t2.begin_time, '%Y-%m-%d') <= DATE_FORMAT(#{day}, '%Y-%m-%d') | |
43 | + and DATE_FORMAT(t2.over_time, '%Y-%m-%d') >= DATE_FORMAT(#{day}, '%Y-%m-%d') | |
40 | 44 | </select> |
41 | 45 | |
42 | 46 | <select id="getAllEffectGroupByEgcs" resultMap="BaseResultMap"> |
... | ... | @@ -79,13 +83,16 @@ |
79 | 83 | |
80 | 84 | <select id="queryDistributionShopReward" resultType="java.lang.Long"> |
81 | 85 | select |
82 | - id | |
83 | - from eval_group | |
84 | - where yn = 1 | |
85 | - and DATE_FORMAT(begin_time, '%Y-%m-%d') <= DATE_FORMAT(#{day}, '%Y-%m-%d') | |
86 | - and DATE_FORMAT(over_time, '%Y-%m-%d') = DATE_FORMAT(#{day}, '%Y-%m-%d') | |
87 | - and scope_type = #{scopeType} | |
88 | - and eval_id in (select id from eval where `status` IN (3, 4) and yn = 1) | |
86 | + t3.id | |
87 | + FROM | |
88 | + eval_group_rank t1 | |
89 | + LEFT JOIN eval_group_rank_stage t2 ON t1.id = t2.eval_group_rank_id AND t2.yn = 1 | |
90 | + LEFT JOIN eval_group t3 ON t2.id = t3.eval_group_rank_stage_id AND t3.yn = 1 | |
91 | + WHERE | |
92 | + t1.yn = 1 | |
93 | + AND t1.`status` IN ( 3, 4 ) | |
94 | + and DATE_FORMAT(t2.begin_time, '%Y-%m-%d') <= DATE_FORMAT(#{day}, '%Y-%m-%d') | |
95 | + and DATE_FORMAT(t2.over_time, '%Y-%m-%d') = DATE_FORMAT(#{day}, '%Y-%m-%d') | |
89 | 96 | </select> |
90 | 97 | |
91 | 98 | <select id="getEffectsByRankId" resultMap="BaseResultMap"> | ... | ... |
fw-morax-domain/src/main/java/cn/fw/morax/domain/dto/query/ShopsPostsQueryDTO.java
0 → 100644
1 | +package cn.fw.morax.domain.dto.query; | |
2 | + | |
3 | +import lombok.AllArgsConstructor; | |
4 | +import lombok.Builder; | |
5 | +import lombok.Data; | |
6 | +import lombok.NoArgsConstructor; | |
7 | + | |
8 | +import javax.validation.constraints.NotNull; | |
9 | +import java.util.List; | |
10 | + | |
11 | +@Data | |
12 | +@Builder | |
13 | +@AllArgsConstructor | |
14 | +@NoArgsConstructor | |
15 | +public class ShopsPostsQueryDTO { | |
16 | + | |
17 | + /** | |
18 | + * 门店id | |
19 | + */ | |
20 | + @NotNull(message = "门店不能为空") | |
21 | + private List<Long> shopIds; | |
22 | + | |
23 | + /** | |
24 | + * 岗位id | |
25 | + */ | |
26 | + @NotNull(message = "岗位不能为空") | |
27 | + private List<Long> postIds; | |
28 | + | |
29 | +} | ... | ... |
fw-morax-server/src/main/java/cn/fw/morax/server/controller/app/EvalController.java
... | ... | @@ -2,25 +2,20 @@ package cn.fw.morax.server.controller.app; |
2 | 2 | |
3 | 3 | |
4 | 4 | import cn.fw.common.exception.BusinessException; |
5 | -import cn.fw.common.page.AppPage; | |
6 | 5 | import cn.fw.common.web.annotation.ControllerMethod; |
7 | 6 | import cn.fw.common.web.auth.LoginAuthBean; |
8 | 7 | import cn.fw.common.web.auth.annotation.CurrentUser; |
9 | 8 | import cn.fw.data.base.domain.common.Message; |
10 | 9 | import cn.fw.morax.common.utils.PublicUtil; |
10 | +import cn.fw.morax.domain.db.eval.EvalGroupRank; | |
11 | 11 | import cn.fw.morax.domain.dto.eval.EvalDTO; |
12 | -import cn.fw.morax.domain.dto.eval.EvalGroupIndicatorRankDTO; | |
13 | 12 | import cn.fw.morax.domain.dto.eval.EvalGroupRankQueryDto; |
14 | 13 | import cn.fw.morax.domain.dto.eval.EvalRewardDistDTO; |
15 | -import cn.fw.morax.domain.dto.query.EvalPoolQueryDTO; | |
16 | -import cn.fw.morax.domain.vo.SelectorVO; | |
17 | 14 | import cn.fw.morax.domain.vo.eval.*; |
18 | -import cn.fw.morax.domain.vo.kpi.KpiIndicatorRankVO; | |
19 | 15 | import cn.fw.morax.service.biz.SettingDraftBizService; |
20 | 16 | import cn.fw.morax.service.biz.eval.*; |
21 | 17 | import cn.fw.security.auth.client.annotation.Authorization; |
22 | 18 | import cn.fw.security.auth.client.annotation.IgnoreAuth; |
23 | -import cn.fw.security.auth.client.annotation.IgnoreUserToken; | |
24 | 19 | import cn.fw.security.auth.client.enums.AuthType; |
25 | 20 | import lombok.RequiredArgsConstructor; |
26 | 21 | import lombok.extern.slf4j.Slf4j; |
... | ... | @@ -28,11 +23,7 @@ import org.springframework.validation.annotation.Validated; |
28 | 23 | import org.springframework.web.bind.annotation.*; |
29 | 24 | |
30 | 25 | import javax.validation.constraints.NotNull; |
31 | -import java.time.LocalDate; | |
32 | -import java.time.YearMonth; | |
33 | 26 | import java.util.List; |
34 | -import java.util.Objects; | |
35 | -import java.util.Set; | |
36 | 27 | |
37 | 28 | import static cn.fw.common.web.util.ResultBuilder.success; |
38 | 29 | |
... | ... | @@ -51,29 +42,13 @@ import static cn.fw.common.web.util.ResultBuilder.success; |
51 | 42 | @RequestMapping("/app/eval") |
52 | 43 | public class EvalController { |
53 | 44 | |
54 | - private final EvalPoolService evalPoolService; | |
55 | - private final EvalGroupPoolService evalGroupPoolService; | |
56 | - private final EvalGroupRankBizService evalGroupRankBizService; | |
45 | + private final EvalRewardService evalRewardService; | |
57 | 46 | private final EvalGroupBizService evalGroupBizService; |
58 | - private final EvalGroupDataService evalGroupDataService; | |
59 | 47 | private final SettingDraftBizService settingDraftBizService; |
60 | - private final EvalRewardService evalRewardService; | |
48 | + private final EvalGroupRankBizService evalGroupRankBizService; | |
61 | 49 | private final EvalIndicatorValueBizService evalIndicatorValueBizService; |
62 | 50 | |
63 | 51 | /** |
64 | - * 考评详情 | |
65 | - * | |
66 | - * @param id | |
67 | - * @return | |
68 | - */ | |
69 | - @GetMapping("/group") | |
70 | - @ControllerMethod("考评详情") | |
71 | - public Message<EvalVO> evalGroupDetail(@NotNull(message = "考评组id不能为空") Long id) { | |
72 | - | |
73 | - return success(evalGroupBizService.evalDetail(id)); | |
74 | - } | |
75 | - | |
76 | - /** | |
77 | 52 | * 考评草稿详情 |
78 | 53 | * |
79 | 54 | * @param id 草稿id |
... | ... | @@ -127,6 +102,17 @@ public class EvalController { |
127 | 102 | */ |
128 | 103 | @GetMapping("/rank-group") |
129 | 104 | @ControllerMethod("考评排名组详情") |
105 | + public Message<EvalGroupRankVO> evalGroupRankDetail(@NotNull(message = "考评排名组id不能为空") Long id) { | |
106 | + return success(evalGroupBizService.evalGroupRankDetail(id)); | |
107 | + } | |
108 | + | |
109 | + /** | |
110 | + * 考评排名组详情 | |
111 | + * | |
112 | + * @return | |
113 | + */ | |
114 | + @GetMapping("/rank-groups") | |
115 | + @ControllerMethod("考评排名组详情") | |
130 | 116 | public Message<List<EvalGroupVO>> rankEvalGroupDetail(@Validated EvalGroupRankQueryDto dto) { |
131 | 117 | return success(evalGroupBizService.rankEvalGroupDetail(dto)); |
132 | 118 | } | ... | ... |
fw-morax-server/src/main/java/cn/fw/morax/server/controller/erp/EvalConfigController.java
... | ... | @@ -11,14 +11,10 @@ import cn.fw.morax.domain.dto.eval.EvalConfigPostIndicatorsDTO; |
11 | 11 | import cn.fw.morax.domain.dto.eval.EvalGroupRankDTO; |
12 | 12 | import cn.fw.morax.domain.dto.eval.EvalShopIndicatorsDTO; |
13 | 13 | import cn.fw.morax.domain.dto.kpi.IndicatorAbleDTO; |
14 | -import cn.fw.morax.domain.dto.query.EvalGroupQueryDTO; | |
15 | 14 | import cn.fw.morax.domain.dto.query.EvalIndicatorQueryDTO; |
16 | 15 | import cn.fw.morax.domain.dto.query.QueryConditionEvalIndicatorsListDTO; |
17 | 16 | import cn.fw.morax.domain.enums.ApplicableTypeEnum; |
18 | -import cn.fw.morax.domain.vo.eval.CompositeIndicatorVO; | |
19 | -import cn.fw.morax.domain.vo.eval.EvalIndicatorVO; | |
20 | -import cn.fw.morax.domain.vo.eval.EvalVO; | |
21 | -import cn.fw.morax.domain.vo.eval.QueryConditionEvalIndicatorsListVO; | |
17 | +import cn.fw.morax.domain.vo.eval.*; | |
22 | 18 | import cn.fw.morax.service.biz.eval.EvalGroupBizService; |
23 | 19 | import cn.fw.morax.service.biz.eval.EvalIndicatorBizService; |
24 | 20 | import cn.fw.security.auth.client.annotation.Authorization; |
... | ... | @@ -103,48 +99,6 @@ public class EvalConfigController { |
103 | 99 | } |
104 | 100 | |
105 | 101 | /** |
106 | - * 保存考评排名组 | |
107 | - * | |
108 | - * @param dto 考评 | |
109 | - * @return | |
110 | - */ | |
111 | - @PostMapping("/group-rank/{submit}") | |
112 | - @ControllerMethod("保存考评排名组") | |
113 | - public Message<Void> saveEvalGroup(@Validated @RequestBody EvalGroupRankDTO dto, | |
114 | - @PathVariable("submit") Integer submit, | |
115 | - @CurrentUser LoginAuthBean user) { | |
116 | - Boolean isSubmit = (submit == 1); | |
117 | - evalGroupBizService.saveEvalGroupRank(dto, user, isSubmit); | |
118 | - return success(); | |
119 | - } | |
120 | - | |
121 | - /** | |
122 | - * 考评分页 | |
123 | - * | |
124 | - * @param dto | |
125 | - * @return | |
126 | - */ | |
127 | - @GetMapping("/page") | |
128 | - @ControllerMethod("考评分页") | |
129 | - public Message<AppPage<EvalVO>> evalPage(@Validated EvalGroupQueryDTO dto) { | |
130 | - | |
131 | - return success(evalGroupBizService.evalPage(dto)); | |
132 | - } | |
133 | - | |
134 | - /** | |
135 | - * 考评详情 | |
136 | - * | |
137 | - * @param id | |
138 | - * @return | |
139 | - */ | |
140 | - @GetMapping("/group") | |
141 | - @ControllerMethod("考评详情") | |
142 | - public Message<EvalVO> evalGroupDetail(@NotNull(message = "考评组id不能为空") Long id) { | |
143 | - | |
144 | - return success(evalGroupBizService.evalDetail(id)); | |
145 | - } | |
146 | - | |
147 | - /** | |
148 | 102 | * 获取岗位下的指标 |
149 | 103 | * |
150 | 104 | * @param dto | ... | ... |
fw-morax-server/src/main/java/cn/fw/morax/server/controller/erp/EvalGroupRankController.java
... | ... | @@ -10,9 +10,11 @@ import cn.fw.morax.common.utils.PublicUtil; |
10 | 10 | import cn.fw.morax.domain.dto.eval.EvalGroupRankDTO; |
11 | 11 | import cn.fw.morax.domain.dto.query.EvalGroupRankQueryDTO; |
12 | 12 | import cn.fw.morax.domain.dto.query.KpiGroupRankStaffQueryDTO; |
13 | +import cn.fw.morax.domain.dto.query.ShopsPostsQueryDTO; | |
13 | 14 | import cn.fw.morax.domain.vo.eval.EvalGroupRankVO; |
14 | 15 | import cn.fw.morax.domain.vo.eval.EvalGroupUserVO; |
15 | 16 | import cn.fw.morax.domain.vo.eval.EvalGroupVO; |
17 | +import cn.fw.morax.service.biz.eval.EvalGroupBizService; | |
16 | 18 | import cn.fw.morax.service.biz.eval.EvalGroupRankBizService; |
17 | 19 | import cn.fw.morax.service.biz.eval.EvalGroupUserBizService; |
18 | 20 | import cn.fw.security.auth.client.annotation.Authorization; |
... | ... | @@ -44,6 +46,7 @@ public class EvalGroupRankController { |
44 | 46 | |
45 | 47 | private final EvalGroupRankBizService evalGroupRankBizService; |
46 | 48 | private final EvalGroupUserBizService evalGroupUserBizService; |
49 | + private final EvalGroupBizService evalGroupBizService; | |
47 | 50 | |
48 | 51 | /** |
49 | 52 | * 考评排名列表 |
... | ... | @@ -57,47 +60,34 @@ public class EvalGroupRankController { |
57 | 60 | return success(evalGroupRankBizService.evalGroupRankPage(dto)); |
58 | 61 | } |
59 | 62 | |
60 | -// /** | |
61 | -// * 未选择考评组列表 | |
62 | -// * | |
63 | -// * @param dto | |
64 | -// * @return | |
65 | -// */ | |
66 | -// @GetMapping("/eval-group/page") | |
67 | -// @ControllerMethod("未选择考评组列表") | |
68 | -// public Message<AppPage<EvalGroupVO>> restEvalGroupPage(@Validated EvalGroupRankQueryDTO dto) { | |
69 | -// if (PublicUtil.isEmpty(dto.getScopeType())) { | |
70 | -// throw new BusinessException("参数错误"); | |
71 | -// } | |
72 | -// return success(evalGroupRankBizService.restEvalGroupPage(dto)); | |
73 | -// } | |
74 | - | |
75 | -// /** | |
76 | -// * 考评组排名配置保存 | |
77 | -// * | |
78 | -// * @param dto | |
79 | -// * @return | |
80 | -// */ | |
81 | -// @PostMapping("/config") | |
82 | -// @ControllerMethod("考评组排名配置保存") | |
83 | -// public Message<Void> saveEvalGroupRank(@RequestBody @Validated EvalGroupRankDTO dto, @CurrentUser LoginAuthBean currentUser) { | |
84 | -// evalGroupRankBizService.saveEvalGroupRank(dto); | |
85 | -// return success(); | |
86 | -// } | |
87 | - | |
63 | + /** | |
64 | + * 保存考评排名组 | |
65 | + * | |
66 | + * @param dto 考评 | |
67 | + * @return | |
68 | + */ | |
69 | + @PostMapping("/group-rank/{submit}") | |
70 | + @ControllerMethod("保存考评排名组") | |
71 | + public Message<Void> saveEvalGroupRank(@Validated @RequestBody EvalGroupRankDTO dto, | |
72 | + @PathVariable("submit") Integer submit, | |
73 | + @CurrentUser LoginAuthBean user) { | |
74 | + Boolean isSubmit = (submit == 1); | |
75 | + evalGroupRankBizService.saveEvalGroupRank(dto, user, isSubmit); | |
76 | + return success(); | |
77 | + } | |
88 | 78 | |
89 | 79 | /** |
90 | - * 考评组排名组合详情 | |
80 | + * 考评排名组详情 | |
91 | 81 | * |
92 | - * @param id | |
93 | 82 | * @return |
94 | 83 | */ |
95 | - @GetMapping("/config") | |
96 | - @ControllerMethod("考评组排名组合详情") | |
97 | - public Message<EvalGroupRankVO> evalGroupRankDetail(@NotNull(message = "考评组排名组合包id不能为空") Long id) { | |
98 | - return success(evalGroupRankBizService.evalGroupRankDetail(id)); | |
84 | + @GetMapping("/rank-group") | |
85 | + @ControllerMethod("考评排名组详情") | |
86 | + public Message<EvalGroupRankVO> evalGroupRankDetail(@NotNull(message = "考评排名组id不能为空") Long id) { | |
87 | + return success(evalGroupBizService.evalGroupRankDetail(id)); | |
99 | 88 | } |
100 | 89 | |
90 | + | |
101 | 91 | /** |
102 | 92 | * 删除考评组排名组合包 |
103 | 93 | * |
... | ... | @@ -127,6 +117,21 @@ public class EvalGroupRankController { |
127 | 117 | } |
128 | 118 | |
129 | 119 | /** |
120 | + * 查询门店岗位人员 | |
121 | + * | |
122 | + * @param dto | |
123 | + * @return | |
124 | + */ | |
125 | + @GetMapping("/shop-post-staffs") | |
126 | + @ControllerMethod("查询门店岗位人员") | |
127 | + public Message<List<EvalGroupUserVO>> queryRankStaffs(@Validated ShopsPostsQueryDTO dto) { | |
128 | + if (PublicUtil.isEmpty(dto.getPostIds())) { | |
129 | + throw new BusinessException("参数错误"); | |
130 | + } | |
131 | + return success(evalGroupUserBizService.queryShopPostStaffs(dto)); | |
132 | + } | |
133 | + | |
134 | + /** | |
130 | 135 | * 查询考评组人员 |
131 | 136 | * |
132 | 137 | * @param evalGroupId | ... | ... |
fw-morax-server/src/main/resources/application.yml
fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardBaseCalculator.java
1 | 1 | package cn.fw.morax.service.biz.calculator.eval.reward; |
2 | 2 | |
3 | +import cn.fw.morax.common.config.SpecialIndicatorCodeVal; | |
3 | 4 | import cn.fw.morax.common.utils.DateUtil; |
4 | 5 | import cn.fw.morax.common.utils.PublicUtil; |
5 | 6 | import cn.fw.morax.domain.bo.eval.EvalGroupUserShop; |
6 | 7 | import cn.fw.morax.domain.db.eval.*; |
7 | 8 | import cn.fw.morax.domain.db.kpi.IndicatorUserValue; |
9 | +import cn.fw.morax.domain.db.kpi.KpiPool; | |
8 | 10 | import cn.fw.morax.domain.enums.*; |
9 | 11 | import cn.fw.morax.service.biz.CommonService; |
10 | 12 | import cn.fw.morax.service.biz.calculator.Calculator; |
... | ... | @@ -29,6 +31,7 @@ import java.math.BigDecimal; |
29 | 31 | import java.math.RoundingMode; |
30 | 32 | import java.time.LocalDate; |
31 | 33 | import java.time.LocalDateTime; |
34 | +import java.time.YearMonth; | |
32 | 35 | import java.time.temporal.ChronoUnit; |
33 | 36 | import java.util.*; |
34 | 37 | import java.util.concurrent.atomic.AtomicInteger; |
... | ... | @@ -71,7 +74,11 @@ public abstract class EvalRewardBaseCalculator implements Calculator<EvalGroupUs |
71 | 74 | @Autowired |
72 | 75 | protected EvalGroupRewardService evalGroupRewardService; |
73 | 76 | @Autowired |
74 | - private StringRedisTemplate stringRedisTemplate; | |
77 | + private SpecialIndicatorCodeVal specialIndicatorCodeVal; | |
78 | + @Autowired | |
79 | + private EvalUserPoolService evalUserPoolService; | |
80 | + @Autowired | |
81 | + private EvalShopPoolService evalShopPoolService; | |
75 | 82 | @Autowired |
76 | 83 | private CommonService commonService; |
77 | 84 | @Value("${spring.cache.custom.global-prefix}:eval:reward:cond:rank") |
... | ... | @@ -294,6 +301,16 @@ public abstract class EvalRewardBaseCalculator implements Calculator<EvalGroupUs |
294 | 301 | */ |
295 | 302 | protected Optional<BigDecimal> queryValue(EvalGroupUserShop obj, IndicatorCodeTypeEnum codeType, String indicatorCode) { |
296 | 303 | DimensionTypeEnum dimensionType = EvalScopeEnum.STAFF.equals(obj.getScopeType()) ? DimensionTypeEnum.STAFF : DimensionTypeEnum.SHOP; |
304 | + if (specialIndicatorCodeVal.getEvalRatio().equals(indicatorCode)) { | |
305 | + if (DimensionTypeEnum.STAFF.equals(dimensionType)) { | |
306 | + EvalUserPool evalUserPool = evalUserPoolService.getById(obj.getPoolId()); | |
307 | + return Optional.ofNullable(evalUserPool).map(EvalUserPool::getScoreRatio); | |
308 | + } else { | |
309 | + EvalShopPool evalShopPool = evalShopPoolService.getById(obj.getPoolId()); | |
310 | + return Optional.ofNullable(evalShopPool).map(EvalShopPool::getScoreRatio); | |
311 | + } | |
312 | + } | |
313 | + | |
297 | 314 | if (IndicatorCodeTypeEnum.INDICATOR.equals(codeType)) { |
298 | 315 | LambdaQueryWrapper<IndicatorUserValue> queryWrapper = Wrappers.<IndicatorUserValue>lambdaQuery() |
299 | 316 | .eq(IndicatorUserValue::getIndicatorCode, indicatorCode) | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupBizService.java
... | ... | @@ -50,6 +50,7 @@ public class EvalGroupBizService { |
50 | 50 | private final EvalGroupRewardLaddersService evalGroupRewardLaddersService; |
51 | 51 | private final EvalGroupRewardParamService evalGroupRewardParamService; |
52 | 52 | private final EvalGroupIndicatorService evalGroupIndicatorService; |
53 | + private final EvalGroupRankStageService evalGroupRankStageService; | |
53 | 54 | private final EvalGroupRewardService evalGroupRewardService; |
54 | 55 | private final EvalGroupDataService evalGroupDataService; |
55 | 56 | private final EvalGroupRankService evalGroupRankService; |
... | ... | @@ -60,159 +61,6 @@ public class EvalGroupBizService { |
60 | 61 | private final SettingDraftService settingDraftService; |
61 | 62 | private final ApprovalBizService approvalBizService; |
62 | 63 | |
63 | - @Value("${spring.cache.custom.global-prefix}:eval:save:") | |
64 | - @Getter | |
65 | - private String saveGroupPrefix; | |
66 | - | |
67 | - | |
68 | - /** | |
69 | - * 考评组保存 | |
70 | - * | |
71 | - * @param evalGroupRankDto | |
72 | - * @param user | |
73 | - * @return | |
74 | - */ | |
75 | - @Transactional(rollbackFor = Exception.class) | |
76 | - @DisLock(prefix = "#this.getSaveGroupPrefix()", key = "#evalGroupRankDto.getName()", message = "保存中,请勿重复操作") | |
77 | - public void saveEvalGroupRank(EvalGroupRankDTO evalGroupRankDto, LoginAuthBean user, Boolean isSubmit) { | |
78 | - this.checkNameRepetition(evalGroupRankDto); | |
79 | - AtomicInteger evalGroupSize = new AtomicInteger(); | |
80 | - LocalDate lastStageOverTime = null; | |
81 | - Boolean multiStage = evalGroupRankDto.getMultiStage(); | |
82 | - for (EvalGroupRankStageDTO stage : evalGroupRankDto.getStages()) { | |
83 | - this.checkStageTime(evalGroupRankDto, stage, lastStageOverTime); | |
84 | - for (EvalGroupDTO evalGroupDTO : stage.getEvalGroups()) { | |
85 | - initEvalGroupDTO(evalGroupDTO); | |
86 | - checkIndicator(evalGroupDTO, multiStage); | |
87 | - checkReward(evalGroupDTO); | |
88 | - checkEvalIndicatorLadders(evalGroupDTO.getIndicators()); | |
89 | - checkEvalRewardLadders(evalGroupDTO.getRewards()); | |
90 | - sortRewardRankLadders(evalGroupDTO.getRewards()); | |
91 | - this.setTargetVos(evalGroupDTO); | |
92 | - evalGroupSize.incrementAndGet(); | |
93 | - List<Long> postIds = evalGroupDTO.getRewards().stream().flatMap(reward -> reward.getPostIds().stream()) | |
94 | - .distinct().collect(Collectors.toList()); | |
95 | - List<String> postNames = evalGroupDTO.getRewards().stream().flatMap(reward -> reward.getPostNames().stream()) | |
96 | - .distinct().collect(Collectors.toList()); | |
97 | - evalGroupDTO.setPostIds(postIds); | |
98 | - evalGroupDTO.setPostNames(postNames); | |
99 | - } | |
100 | - lastStageOverTime = stage.getOverTime(); | |
101 | - } | |
102 | - | |
103 | - SettingDraft settingDraft = getSettingDraft(evalGroupRankDto, isSubmit); | |
104 | - settingDraftService.saveOrUpdate(settingDraft); | |
105 | - if (! isSubmit) { | |
106 | - return; | |
107 | - } | |
108 | - approvalBizService.applyApproveEvalDraft(evalGroupRankDto, evalGroupSize.get(), settingDraft, user); | |
109 | - } | |
110 | - | |
111 | - public void checkStageTime(EvalGroupRankDTO eval, EvalGroupRankStageDTO stage, LocalDate lastStageOverTime) { | |
112 | - if (stage.getBeginTime().isBefore(eval.getBeginTime())) { | |
113 | - throw new BusinessException("阶段开始时间不能在考评时间之前"); | |
114 | - } | |
115 | - if (stage.getOverTime().isAfter(eval.getOverTime())) { | |
116 | - throw new BusinessException("阶段结束时间不能在考评时间之前"); | |
117 | - } | |
118 | - if (PublicUtil.isNotEmpty(lastStageOverTime)) { | |
119 | - if (stage.getBeginTime().isBefore(lastStageOverTime)) { | |
120 | - throw new BusinessException("阶段开始时间不能在上一个阶段结束时间之前"); | |
121 | - } | |
122 | - } | |
123 | - } | |
124 | - | |
125 | - /** | |
126 | - * 获取草稿 | |
127 | - * | |
128 | - * @param dto | |
129 | - * @return | |
130 | - */ | |
131 | - public SettingDraft getSettingDraft(EvalGroupRankDTO dto, Boolean submit) { | |
132 | - SettingDraft settingDraft = null; | |
133 | - if (PublicUtil.isEmpty(dto.getDraftId())) { | |
134 | - settingDraft = new SettingDraft(); | |
135 | - settingDraft.setGroupId(dto.getGroupId()); | |
136 | - settingDraft.setYn(Boolean.TRUE); | |
137 | - settingDraft.setType(SettingDraftTypeEnum.EVAL_GROUP_RANK); | |
138 | - } else { | |
139 | - settingDraft = settingDraftService.getById(dto.getDraftId()); | |
140 | - BV.notNull(settingDraft, "草稿配置不存在,请重试"); | |
141 | - } | |
142 | - settingDraft.setStatus(submit ? SettingDraftStatusEnum.RELEASE_APPROVAL : SettingDraftStatusEnum.NO_RELEASE); | |
143 | -// settingDraft.setEvalType(dto.getType()); | |
144 | - settingDraft.setName(dto.getName()); | |
145 | - settingDraft.setContent(JSONObject.toJSONString(dto)); | |
146 | - return settingDraft; | |
147 | - } | |
148 | - | |
149 | - /** | |
150 | - * 装换为目标对象 | |
151 | - * | |
152 | - * @return | |
153 | - */ | |
154 | - public void setTargetVos(EvalGroupDTO evalGroupDTO) { | |
155 | - | |
156 | - for (EvalGroupIndicatorDTO indicatorDTO : evalGroupDTO.getIndicators()) { | |
157 | - List<EvalGroupIndicatorParamDTO> ladderParams = Optional.ofNullable(indicatorDTO.getLadderParams()).orElse(new ArrayList<>()); | |
158 | - List<EvalGroupIndicatorParamDTO> commissionParams = Optional.ofNullable(indicatorDTO.getCommissionParams()).orElse(new ArrayList<>()); | |
159 | - List<EvalGroupIndicatorPreconditionDTO> conds = Optional.ofNullable(indicatorDTO.getConds()).orElse(new ArrayList<>()); | |
160 | - | |
161 | - List<EvalGroupIndicatorTargetVO> targetVOS = new ArrayList<>(); | |
162 | - for (EvalGroupIndicatorParamDTO paramDTO : ladderParams) { | |
163 | - if (PublicUtil.isNotEmpty(paramDTO.getTargetType()) && (! TargetTypeEnum.NO.equals(paramDTO.getTargetType()))) { | |
164 | - EvalGroupIndicatorTargetVO targetVO = PublicUtil.copy(paramDTO, EvalGroupIndicatorTargetVO.class); | |
165 | - targetVOS.add(targetVO); | |
166 | - } | |
167 | - } | |
168 | - | |
169 | - for (EvalGroupIndicatorParamDTO paramDTO : commissionParams) { | |
170 | - if (PublicUtil.isNotEmpty(paramDTO.getTargetType()) && (! TargetTypeEnum.NO.equals(paramDTO.getTargetType()))) { | |
171 | - EvalGroupIndicatorTargetVO targetVO = PublicUtil.copy(paramDTO, EvalGroupIndicatorTargetVO.class); | |
172 | - targetVOS.add(targetVO); | |
173 | - } | |
174 | - } | |
175 | - | |
176 | - for (EvalGroupIndicatorPreconditionDTO preconditionDTO : conds) { | |
177 | - if (PublicUtil.isNotEmpty(preconditionDTO.getTargetType()) && (! TargetTypeEnum.NO.equals(preconditionDTO.getTargetType()))) { | |
178 | - EvalGroupIndicatorTargetVO targetVO = PublicUtil.copy(preconditionDTO, EvalGroupIndicatorTargetVO.class); | |
179 | - targetVOS.add(targetVO); | |
180 | - } | |
181 | - } | |
182 | - | |
183 | - indicatorDTO.setTargets(targetVOS); | |
184 | - } | |
185 | - | |
186 | - for (EvalGroupRewardDTO rewardDTO : evalGroupDTO.getRewards()) { | |
187 | - List<EvalGroupRewardParamDTO> ladderParams = Optional.ofNullable(rewardDTO.getLadderParams()).orElse(new ArrayList<>()); | |
188 | - List<EvalGroupRewardParamDTO> commissionParams = Optional.ofNullable(rewardDTO.getCommissionParams()).orElse(new ArrayList<>()); | |
189 | - List<EvalGroupRewardPreconditionDTO> conds = Optional.ofNullable(rewardDTO.getConds()).orElse(new ArrayList<>()); | |
190 | - | |
191 | - List<EvalGroupIndicatorTargetVO> targetVOS = new ArrayList<>(); | |
192 | - for (EvalGroupRewardParamDTO paramDTO : ladderParams) { | |
193 | - if (PublicUtil.isNotEmpty(paramDTO.getTargetType()) && (! TargetTypeEnum.NO.equals(paramDTO.getTargetType()))) { | |
194 | - EvalGroupIndicatorTargetVO targetVO = PublicUtil.copy(paramDTO, EvalGroupIndicatorTargetVO.class); | |
195 | - targetVOS.add(targetVO); | |
196 | - } | |
197 | - } | |
198 | - | |
199 | - for (EvalGroupRewardParamDTO paramDTO : commissionParams) { | |
200 | - if (PublicUtil.isNotEmpty(paramDTO.getTargetType()) && (! TargetTypeEnum.NO.equals(paramDTO.getTargetType()))) { | |
201 | - EvalGroupIndicatorTargetVO targetVO = PublicUtil.copy(paramDTO, EvalGroupIndicatorTargetVO.class); | |
202 | - targetVOS.add(targetVO); | |
203 | - } | |
204 | - } | |
205 | - | |
206 | - for (EvalGroupRewardPreconditionDTO preconditionDTO : conds) { | |
207 | - if (PublicUtil.isNotEmpty(preconditionDTO.getTargetType()) && (! TargetTypeEnum.NO.equals(preconditionDTO.getTargetType()))) { | |
208 | - EvalGroupIndicatorTargetVO targetVO = PublicUtil.copy(preconditionDTO, EvalGroupIndicatorTargetVO.class); | |
209 | - targetVOS.add(targetVO); | |
210 | - } | |
211 | - } | |
212 | - rewardDTO.setTargets(targetVOS); | |
213 | - } | |
214 | - } | |
215 | - | |
216 | 64 | /** |
217 | 65 | * 装换为目标对象 |
218 | 66 | * |
... | ... | @@ -284,47 +132,7 @@ public class EvalGroupBizService { |
284 | 132 | } |
285 | 133 | } |
286 | 134 | |
287 | - /** | |
288 | - * 检查时间 | |
289 | - * | |
290 | - * @param dto | |
291 | - */ | |
292 | - public void initEvalGroupDTO(EvalGroupDTO dto) { | |
293 | - if (PublicUtil.isEmpty(dto.getIndicators())) { | |
294 | - dto.setIndicators(new ArrayList<>()); | |
295 | - } | |
296 | - if (PublicUtil.isEmpty(dto.getRewards())) { | |
297 | - dto.setRewards(new ArrayList<>()); | |
298 | - } | |
299 | - for (EvalGroupIndicatorDTO indicatorDTO : dto.getIndicators()) { | |
300 | - if (PublicUtil.isEmpty(indicatorDTO.getLadderParams())) { | |
301 | - indicatorDTO.setLadderParams(new ArrayList<>()); | |
302 | - } | |
303 | - if (PublicUtil.isEmpty(indicatorDTO.getCommissionParams())) { | |
304 | - indicatorDTO.setCommissionParams(new ArrayList<>()); | |
305 | - } | |
306 | - if (PublicUtil.isEmpty(indicatorDTO.getLadders())) { | |
307 | - indicatorDTO.setLadders(new ArrayList<>()); | |
308 | - } | |
309 | - if (PublicUtil.isEmpty(indicatorDTO.getConds())) { | |
310 | - indicatorDTO.setConds(new ArrayList<>()); | |
311 | - } | |
312 | - } | |
313 | - for (EvalGroupRewardDTO rewardDTO : dto.getRewards()) { | |
314 | - if (PublicUtil.isEmpty(rewardDTO.getLadderParams())) { | |
315 | - rewardDTO.setLadderParams(new ArrayList<>()); | |
316 | - } | |
317 | - if (PublicUtil.isEmpty(rewardDTO.getCommissionParams())) { | |
318 | - rewardDTO.setCommissionParams(new ArrayList<>()); | |
319 | - } | |
320 | - if (PublicUtil.isEmpty(rewardDTO.getLadders())) { | |
321 | - rewardDTO.setLadders(new ArrayList<>()); | |
322 | - } | |
323 | - if (PublicUtil.isEmpty(rewardDTO.getConds())) { | |
324 | - rewardDTO.setConds(new ArrayList<>()); | |
325 | - } | |
326 | - } | |
327 | - } | |
135 | + | |
328 | 136 | /** |
329 | 137 | * 检查时间 |
330 | 138 | * |
... | ... | @@ -347,258 +155,7 @@ public class EvalGroupBizService { |
347 | 155 | // } |
348 | 156 | } |
349 | 157 | |
350 | - /** | |
351 | - * 检查绩效组排名名称是否重复 | |
352 | - * | |
353 | - * @param evalGroupRankDto | |
354 | - */ | |
355 | - public void checkNameRepetition(EvalGroupRankDTO evalGroupRankDto) { | |
356 | - int count = evalGroupRankService.count(Wrappers.<EvalGroupRank>lambdaQuery() | |
357 | - .eq(EvalGroupRank::getName, evalGroupRankDto.getName()) | |
358 | - .ne(PublicUtil.isNotEmpty(evalGroupRankDto.getId()), EvalGroupRank::getId, evalGroupRankDto.getId()) | |
359 | - .eq(EvalGroupRank::getYn, Boolean.TRUE) | |
360 | - ); | |
361 | - BV.isTrue(count <= 0, "考评排名组名称重复,请重新输入"); | |
362 | - } | |
363 | - | |
364 | - /** | |
365 | - * 检查阶梯分值 | |
366 | - * @param indicators | |
367 | - */ | |
368 | - private void checkEvalIndicatorLadders(List<EvalGroupIndicatorDTO> indicators) { | |
369 | - Integer baseScore = null; | |
370 | - for (EvalGroupIndicatorDTO indicatorDto : indicators) { | |
371 | - if (ScoreWayEnum.NORMAL.equals(indicatorDto.getScoreWay())) { | |
372 | - continue; | |
373 | - } | |
374 | - | |
375 | - baseScore = indicatorDto.getBaseScore(); | |
376 | - List<EvalGroupIndicatorLaddersDTO> ladders = indicatorDto.getLadders(); | |
377 | - Collections.sort(ladders); | |
378 | 158 | |
379 | - //阶梯值校验 标准分不能超过指标基础分,阶梯值必须连续 | |
380 | - for (EvalGroupIndicatorLaddersDTO laddersDto : ladders) { | |
381 | - BV.isTrue(PublicUtil.isNotEmpty(laddersDto.getLower()), "阶梯下限不能为空"); | |
382 | - BV.isTrue(PublicUtil.isNotEmpty(laddersDto.getUpper()), "阶梯上限不能为空"); | |
383 | - | |
384 | - //阶梯标准分不能超过绩效分值 | |
385 | - if (laddersDto.getStandardScore().compareTo(baseScore) > 0) { | |
386 | - throw new BusinessException("【" + indicatorDto.getName() + "】的阶梯标准分不能超过绩效分值"); | |
387 | - } | |
388 | - } | |
389 | - //校验阶梯 | |
390 | - CommonService.checkLadders(ladders, indicatorDto.getName()); | |
391 | - | |
392 | - //校验条件 | |
393 | - for (EvalGroupIndicatorPreconditionDTO condDTO : indicatorDto.getConds()) { | |
394 | - CommonService.checkLadders(condDTO.getLadders(), indicatorDto.getName()); | |
395 | - } | |
396 | - } | |
397 | - } | |
398 | - | |
399 | - /** | |
400 | - * 检查阶梯分值 | |
401 | - * @param rewards | |
402 | - */ | |
403 | - private void checkEvalRewardLadders(List<EvalGroupRewardDTO> rewards) { | |
404 | - for (EvalGroupRewardDTO reward : rewards) { | |
405 | - | |
406 | - String rewardName = reward.getName(); | |
407 | - List<EvalGroupRewardLaddersDTO> ladders = reward.getLadders(); | |
408 | - if (EvalRewardCalMethodEnum.RANK.equals(reward.getCalMethod()) || | |
409 | - EvalRewardCalMethodEnum.LADDER.equals(reward.getCalMethod()) || | |
410 | - EvalRewardCalMethodEnum.LADDER_DOUBLE.equals(reward.getCalMethod())) { | |
411 | - BV.isTrue(PublicUtil.isNotEmpty(ladders), "阶梯不能为空"); | |
412 | - Collections.sort(ladders); | |
413 | - } | |
414 | - | |
415 | - for (EvalGroupRewardLaddersDTO ladder : ladders) { | |
416 | - BV.isTrue(PublicUtil.isNotEmpty(ladder.getLower()), "阶梯下限不能为空"); | |
417 | - BV.isTrue(PublicUtil.isNotEmpty(ladder.getUpper()), "阶梯上限不能为空"); | |
418 | - } | |
419 | - | |
420 | - switch (reward.getCalMethod()) { | |
421 | - case TOTAL_PROPORTION: case FIXATION:{ | |
422 | - if (PublicUtil.isNotEmpty(ladders)) { | |
423 | - throw new BusinessException("计算方式【" + reward.getCalMethod().getName() + "】不能配置阶梯"); | |
424 | - } | |
425 | - break; | |
426 | - } | |
427 | -// case RANK: | |
428 | - case LADDER: | |
429 | - case LADDER_DOUBLE: | |
430 | - { | |
431 | - CommonService.checkLadders(ladders, rewardName); | |
432 | - break; | |
433 | - } | |
434 | - } | |
435 | - | |
436 | - } | |
437 | - } | |
438 | - | |
439 | - /** | |
440 | - * 检查阶梯分值 | |
441 | - * @param rewards | |
442 | - */ | |
443 | - private void sortRewardRankLadders(List<EvalGroupRewardDTO> rewards) { | |
444 | - for (EvalGroupRewardDTO reward : rewards) { | |
445 | - if (! EvalRewardCalMethodEnum.RANK.equals(reward.getCalMethod())) { | |
446 | - continue; | |
447 | - } | |
448 | - | |
449 | - List<EvalGroupRewardLaddersDTO> ladders = reward.getLadders(); | |
450 | - Collections.sort(ladders, new Comparator<EvalGroupRewardLaddersDTO>() { | |
451 | - @Override | |
452 | - public int compare(EvalGroupRewardLaddersDTO o1, EvalGroupRewardLaddersDTO o2) { | |
453 | - if (PublicUtil.isEmpty(o1.getRankOrderType())) { | |
454 | - return -1; | |
455 | - } | |
456 | - if (PublicUtil.isEmpty(o2.getRankOrderType())) { | |
457 | - return 1; | |
458 | - } | |
459 | - //正数在前 负数在后 | |
460 | - Integer order = o1.getRankOrderType().compareTo(o2.getRankOrderType()); | |
461 | - if (order == 0) { | |
462 | - //大的在后 | |
463 | - return o1.getLower().subtract(o2.getLower()).intValue(); | |
464 | - } | |
465 | - return order; | |
466 | - } | |
467 | - }); | |
468 | - | |
469 | - } | |
470 | - } | |
471 | - | |
472 | - /** | |
473 | - * 检查考评组指标 | |
474 | - * | |
475 | - * @param evalGroupDTO | |
476 | - */ | |
477 | - public void checkIndicator(EvalGroupDTO evalGroupDTO, Boolean multiStage) { | |
478 | - for (EvalGroupIndicatorDTO indicator : evalGroupDTO.getIndicators()) { | |
479 | - String indicatorName = indicator.getName(); | |
480 | - | |
481 | - if (ScoreWayEnum.LADDER.equals(indicator.getScoreWay())) { | |
482 | - BV.notNull(indicator.getLaddersType(), indicatorName + " 台阶数据类型不能为空"); | |
483 | - } | |
484 | - | |
485 | - if (PublicUtil.isNotEmpty(indicator.getLadderParams())) { | |
486 | - BigDecimal proportion = indicator.getLadderParams().stream() | |
487 | - .map(EvalGroupIndicatorParamDTO::getProportion) | |
488 | - .reduce(BigDecimal.ZERO, BigDecimal::add); | |
489 | - BV.isTrue(Constant.ONE_HUNDRED.compareTo(proportion) == 0, "【" + indicator.getName() + "】台阶占比总和必须为100"); | |
490 | - | |
491 | - for (EvalGroupIndicatorParamDTO paramDTO : indicator.getLadderParams()) { | |
492 | - if (! TargetTypeEnum.NO.equals(paramDTO.getTargetType()) && | |
493 | - (PublicUtil.isEmpty(paramDTO.getTargetType()) || PublicUtil.isEmpty(paramDTO.getTargetValue()))) { | |
494 | - paramDTO.setTargetType(TargetTypeEnum.NO); | |
495 | - } | |
496 | - if (PublicUtil.isNotEmpty(paramDTO.getTargetCalcType())) { | |
497 | - if (multiStage) { | |
498 | - if (TargetCalcTypeEnum.STAGE_TARGET.equals(paramDTO.getTargetCalcType()) || | |
499 | - TargetCalcTypeEnum.TIME_SCHEDULE.equals(paramDTO.getTargetCalcType())) { | |
500 | - throw new BusinessException("多阶段目标只能选择阶段目标或时间进度"); | |
501 | - } | |
502 | - } else if (TargetCalcTypeEnum.TARGET_VALUE.equals(paramDTO.getTargetCalcType()) || | |
503 | - TargetCalcTypeEnum.MINIMUM.equals(paramDTO.getTargetCalcType())) { | |
504 | - throw new BusinessException("非多阶段目标只能选择百分比或数量"); | |
505 | - } | |
506 | - } | |
507 | - } | |
508 | - } | |
509 | - | |
510 | - if (PublicUtil.isNotEmpty(indicator.getCommissionParams())) { | |
511 | - BigDecimal proportion = indicator.getCommissionParams().stream() | |
512 | - .map(EvalGroupIndicatorParamDTO::getProportion) | |
513 | - .reduce(BigDecimal.ZERO, BigDecimal::add); | |
514 | - BV.isTrue(Constant.ONE_HUNDRED.compareTo(proportion) == 0, "【" + indicator.getName() + "】提成占比总和必须为100"); | |
515 | - | |
516 | - for (EvalGroupIndicatorParamDTO paramDTO : indicator.getCommissionParams()) { | |
517 | - if (! TargetTypeEnum.NO.equals(paramDTO.getTargetType()) && | |
518 | - (PublicUtil.isEmpty(paramDTO.getTargetType()) || PublicUtil.isEmpty(paramDTO.getTargetValue()))) { | |
519 | - paramDTO.setTargetType(TargetTypeEnum.NO); | |
520 | - continue; | |
521 | - } | |
522 | - if (PublicUtil.isNotEmpty(paramDTO.getTargetCalcType())) { | |
523 | - if (multiStage) { | |
524 | - if (TargetCalcTypeEnum.STAGE_TARGET.equals(paramDTO.getTargetCalcType()) || | |
525 | - TargetCalcTypeEnum.TIME_SCHEDULE.equals(paramDTO.getTargetCalcType())) { | |
526 | - throw new BusinessException("多阶段目标只能选择阶段目标或时间进度"); | |
527 | - } | |
528 | - } else if (TargetCalcTypeEnum.TARGET_VALUE.equals(paramDTO.getTargetCalcType()) || | |
529 | - TargetCalcTypeEnum.MINIMUM.equals(paramDTO.getTargetCalcType())) { | |
530 | - throw new BusinessException("非多阶段目标只能选择百分比或数量"); | |
531 | - } | |
532 | - } | |
533 | - } | |
534 | - } | |
535 | - | |
536 | - if (PublicUtil.isNotEmpty(indicator.getConds())) { | |
537 | - for (EvalGroupIndicatorPreconditionDTO preconditionDTO : indicator.getConds()) { | |
538 | - if (! TargetTypeEnum.NO.equals(preconditionDTO.getTargetType()) && | |
539 | - (PublicUtil.isEmpty(preconditionDTO.getTargetType()) || PublicUtil.isEmpty(preconditionDTO.getTargetValue()))) { | |
540 | - preconditionDTO.setTargetType(TargetTypeEnum.NO); | |
541 | - continue; | |
542 | - } | |
543 | - } | |
544 | - } | |
545 | - | |
546 | - } | |
547 | - } | |
548 | - | |
549 | - /** | |
550 | - * 检查考评组指标 | |
551 | - * | |
552 | - * @param evalGroupDTO | |
553 | - */ | |
554 | - public void checkReward(EvalGroupDTO evalGroupDTO) { | |
555 | - for (EvalGroupRewardDTO reward : evalGroupDTO.getRewards()) { | |
556 | - String rewardName = reward.getName(); | |
557 | - | |
558 | - if (EvalRewardCalMethodEnum.LADDER.equals(reward.getCalMethod()) || | |
559 | - EvalRewardCalMethodEnum.LADDER_DOUBLE.equals(reward.getCalMethod()) || | |
560 | - EvalRewardCalMethodEnum.RANK.equals(reward.getCalMethod())) { | |
561 | - BV.notNull(reward.getLaddersType(), rewardName + " 台阶数据类型不能为空"); | |
562 | - } | |
563 | - | |
564 | - if (PublicUtil.isNotEmpty(reward.getCommissionParams())) { | |
565 | - BigDecimal proportion = reward.getCommissionParams().stream() | |
566 | - .map(EvalGroupRewardParamDTO::getProportion) | |
567 | - .reduce(BigDecimal.ZERO, BigDecimal::add); | |
568 | - BV.isTrue(Constant.ONE_HUNDRED.compareTo(proportion) == 0, "【" + rewardName + "】台阶占比总和必须为100"); | |
569 | - | |
570 | - for (EvalGroupRewardParamDTO commissionParam : reward.getCommissionParams()) { | |
571 | - if (! TargetTypeEnum.NO.equals(commissionParam.getTargetType()) && | |
572 | - (PublicUtil.isEmpty(commissionParam.getTargetType()) || PublicUtil.isEmpty(commissionParam.getTargetValue()))) { | |
573 | - commissionParam.setTargetType(TargetTypeEnum.NO); | |
574 | - } | |
575 | - } | |
576 | - } | |
577 | - | |
578 | - if (PublicUtil.isNotEmpty(reward.getLadderParams())) { | |
579 | - BigDecimal proportion = reward.getLadderParams().stream() | |
580 | - .map(EvalGroupRewardParamDTO::getProportion) | |
581 | - .reduce(BigDecimal.ZERO, BigDecimal::add); | |
582 | - BV.isTrue(Constant.ONE_HUNDRED.compareTo(proportion) == 0, "【" + rewardName + "】提成占比总和必须为100"); | |
583 | - | |
584 | - for (EvalGroupRewardParamDTO commissionParam : reward.getLadderParams()) { | |
585 | - if (! TargetTypeEnum.NO.equals(commissionParam.getTargetType()) && | |
586 | - (PublicUtil.isEmpty(commissionParam.getTargetType()) || PublicUtil.isEmpty(commissionParam.getTargetValue()))) { | |
587 | - commissionParam.setTargetType(TargetTypeEnum.NO); | |
588 | - } | |
589 | - } | |
590 | - } | |
591 | - | |
592 | - if (PublicUtil.isNotEmpty(reward.getConds())) { | |
593 | - for (EvalGroupRewardPreconditionDTO preconditionDTO : reward.getConds()) { | |
594 | - if (! TargetTypeEnum.NO.equals(preconditionDTO.getTargetType()) && | |
595 | - (PublicUtil.isEmpty(preconditionDTO.getTargetType()) || PublicUtil.isEmpty(preconditionDTO.getTargetValue()))) { | |
596 | - preconditionDTO.setTargetType(TargetTypeEnum.NO); | |
597 | - } | |
598 | - } | |
599 | - } | |
600 | - } | |
601 | - } | |
602 | 159 | |
603 | 160 | /** |
604 | 161 | * 分页查询 |
... | ... | @@ -634,32 +191,38 @@ public class EvalGroupBizService { |
634 | 191 | }); |
635 | 192 | } |
636 | 193 | |
194 | + | |
637 | 195 | /** |
638 | - * 考评组详情 | |
196 | + * 考评组排名组合详情 | |
639 | 197 | * |
640 | - * @param evalId | |
198 | + * @param id | |
641 | 199 | * @return |
642 | 200 | */ |
643 | - public EvalVO evalDetail(Long evalId) { | |
644 | - Eval eval = evalService.getById(evalId); | |
645 | - BV.notNull(eval, "考评配置不存在,请重试"); | |
646 | - EvalVO evalVO = PublicUtil.copy(eval, EvalVO.class); | |
201 | + public EvalGroupRankVO evalGroupRankDetail(Long id) { | |
202 | + EvalGroupRank evalGroupRank = evalGroupRankService.getById(id); | |
203 | + EvalGroupRankVO evalGroupRankVO = PublicUtil.copy(evalGroupRank, EvalGroupRankVO.class); | |
647 | 204 | |
648 | - List<EvalGroup> evalGroups = evalGroupService.list(Wrappers.<EvalGroup>lambdaQuery() | |
649 | -// .in(EvalGroup::getEvalId, evalId) | |
650 | - .in(EvalGroup::getYn, Boolean.TRUE) | |
205 | + List<EvalGroupRankStage> stages = evalGroupRankStageService.list(Wrappers.<EvalGroupRankStage>lambdaQuery() | |
206 | + .in(EvalGroupRankStage::getEvalGroupRankId, evalGroupRankVO.getId()) | |
207 | + .eq(EvalGroupRankStage::getYn, Boolean.TRUE) | |
651 | 208 | ); |
652 | - List<EvalGroupVO> evalGroupVOs = PublicUtil.copyList(evalGroups, EvalGroupVO.class); | |
653 | - for (EvalGroupVO evalGroupVO : evalGroupVOs) { | |
654 | - this.setEvalGroupIndicator(evalGroupVO); | |
655 | - this.setEvalGroupReward(evalGroupVO); | |
656 | - this.setTargetVos(evalGroupVO); | |
657 | - } | |
658 | - evalVO.setEvalGroups(evalGroupVOs); | |
209 | + List<EvalGroupRankStageVO> stageVOS = PublicUtil.copyList(stages, EvalGroupRankStageVO.class); | |
210 | + evalGroupRankVO.setStages(stageVOS); | |
659 | 211 | |
660 | - return evalVO; | |
661 | - } | |
212 | + List<EvalGroup> evalGroups = evalGroupService.getEvalGroups(evalGroupRankVO.getId()); | |
213 | + List<EvalGroupVO> evalGroupVOS = PublicUtil.copyList(evalGroups, EvalGroupVO.class); | |
214 | + Map<Long, List<EvalGroupVO>> evalGroupStageMap = evalGroupVOS.stream().collect(Collectors.groupingBy(EvalGroupVO::getEvalGroupRankStageId)); | |
215 | + for (EvalGroupRankStageVO stageVO : stageVOS) { | |
216 | + stageVO.setEvalGroups(evalGroupStageMap.getOrDefault(stageVO.getId(), new ArrayList<>())); | |
217 | + for (EvalGroupVO evalGroupVO : stageVO.getEvalGroups()) { | |
218 | + this.setEvalGroupIndicator(evalGroupVO); | |
219 | + this.setEvalGroupReward(evalGroupVO); | |
220 | + this.setTargetVos(evalGroupVO); | |
221 | + } | |
662 | 222 | |
223 | + } | |
224 | + return evalGroupRankVO; | |
225 | + } | |
663 | 226 | /** |
664 | 227 | * 考评排名组详情 |
665 | 228 | * |
... | ... | @@ -1059,4 +622,5 @@ public class EvalGroupBizService { |
1059 | 622 | } |
1060 | 623 | |
1061 | 624 | } |
625 | + | |
1062 | 626 | } | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupRankBizService.java
1 | 1 | package cn.fw.morax.service.biz.eval; |
2 | 2 | |
3 | +import cn.fw.common.exception.BusinessException; | |
3 | 4 | import cn.fw.common.page.AppPage; |
5 | +import cn.fw.common.web.annotation.DisLock; | |
6 | +import cn.fw.common.web.auth.LoginAuthBean; | |
4 | 7 | import cn.fw.morax.common.constant.Constant; |
5 | 8 | import cn.fw.morax.common.utils.PublicUtil; |
9 | +import cn.fw.morax.domain.db.SettingDraft; | |
6 | 10 | import cn.fw.morax.domain.db.eval.*; |
7 | -import cn.fw.morax.domain.dto.eval.EvalGroupRankDTO; | |
8 | -import cn.fw.morax.domain.dto.eval.EvalGroupRankQueryDto; | |
11 | +import cn.fw.morax.domain.dto.eval.*; | |
9 | 12 | import cn.fw.morax.domain.dto.query.EvalGroupRankQueryDTO; |
10 | -import cn.fw.morax.domain.enums.EvalScopeEnum; | |
11 | -import cn.fw.morax.domain.enums.SettingStatusEnum; | |
13 | +import cn.fw.morax.domain.enums.*; | |
12 | 14 | import cn.fw.morax.domain.vo.eval.*; |
15 | +import cn.fw.morax.service.biz.ApprovalBizService; | |
16 | +import cn.fw.morax.service.biz.CommonService; | |
17 | +import cn.fw.morax.service.data.SettingDraftService; | |
13 | 18 | import cn.fw.morax.service.data.eval.*; |
19 | +import com.alibaba.fastjson.JSONObject; | |
14 | 20 | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
15 | 21 | import lombok.Getter; |
16 | 22 | import lombok.RequiredArgsConstructor; |
... | ... | @@ -19,11 +25,10 @@ import org.springframework.beans.factory.annotation.Value; |
19 | 25 | import org.springframework.stereotype.Service; |
20 | 26 | import org.springframework.transaction.annotation.Transactional; |
21 | 27 | |
28 | +import java.math.BigDecimal; | |
22 | 29 | import java.time.LocalDate; |
23 | -import java.util.ArrayList; | |
24 | -import java.util.HashSet; | |
25 | -import java.util.List; | |
26 | -import java.util.Map; | |
30 | +import java.util.*; | |
31 | +import java.util.concurrent.atomic.AtomicInteger; | |
27 | 32 | import java.util.stream.Collectors; |
28 | 33 | |
29 | 34 | import static cn.fw.common.businessvalidator.Validator.BV; |
... | ... | @@ -35,15 +40,16 @@ public class EvalGroupRankBizService { |
35 | 40 | |
36 | 41 | private final EvalGroupRankStageService evalGroupRankStageService; |
37 | 42 | private final EvalGroupRankService evalGroupRankService; |
43 | + private final SettingDraftService settingDraftService; | |
44 | + private final ApprovalBizService approvalBizService; | |
38 | 45 | private final EvalUserPoolService evalUserPoolService; |
39 | 46 | private final EvalShopPoolService evalShopPoolService; |
40 | 47 | private final EvalGroupService evalGroupService; |
41 | 48 | private final EvalService evalService; |
42 | 49 | |
43 | - @Value("${spring.cache.custom.global-prefix}:kpi:group:save:") | |
50 | + @Value("${spring.cache.custom.global-prefix}:eval:rank:save:") | |
44 | 51 | @Getter |
45 | - private String savePrefix; | |
46 | - | |
52 | + private String saveGroupPrefix; | |
47 | 53 | /** |
48 | 54 | * 考评排名列表 |
49 | 55 | * |
... | ... | @@ -109,209 +115,499 @@ public class EvalGroupRankBizService { |
109 | 115 | return evalIds; |
110 | 116 | } |
111 | 117 | |
112 | - | |
113 | 118 | /** |
114 | - * 未选择考评组列表 | |
115 | - * | |
116 | - * @param dto | |
117 | - * @return | |
119 | + * 根据id删除考评组排名包 | |
120 | + * @param id | |
118 | 121 | */ |
119 | - public AppPage<EvalGroupVO> restEvalGroupPage(EvalGroupRankQueryDTO dto) { | |
120 | -// EvalScopeEnum scopeType = EvalScopeEnum.ofValue(dto.getScopeType()); | |
121 | -// List<EvalGroupRank> evalGroupRanks = evalGroupRankService.list(Wrappers.<EvalGroupRank>lambdaQuery() | |
122 | -// .eq(EvalGroupRank::getScopeType, scopeType) | |
123 | -// .eq(EvalGroupRank::getGroupId, dto.getGroupId()) | |
124 | -// .eq(EvalGroupRank::getYn, Boolean.TRUE) | |
125 | -// ); | |
126 | -// Set<String> excludeEgcs = evalGroupRanks.stream().flatMap(evalGroupRank -> evalGroupRank.getEgcs().stream()).collect(Collectors.toSet()); | |
127 | -// List<Long> evalIds = getEffectEvalIds(dto.getGroupId()); | |
128 | -// //只有有指标的考评组才能配置到考评排名组 | |
129 | -// PageData<EvalGroup> pageData = evalGroupService.page(new PageData<>(dto.getCurrent(), dto.getPageSize()), | |
130 | -// Wrappers.<EvalGroup>lambdaQuery() | |
131 | -// .gt(EvalGroup::getIndicatorNum, BigDecimal.ZERO.intValue()) | |
132 | -// .in(PublicUtil.isNotEmpty(evalIds), EvalGroup::getEvalId, evalIds) | |
133 | -// .eq(EvalGroup::getGroupId, dto.getGroupId()) | |
134 | -// .eq(PublicUtil.isNotEmpty(dto.getPostId()), EvalGroup::getPostId, dto.getPostId()) | |
135 | -// .notIn(PublicUtil.isNotEmpty(excludeEgcs), EvalGroup::getEgc, excludeEgcs) | |
136 | -// .eq(EvalGroup::getYn, Boolean.TRUE) | |
137 | -// .eq(EvalGroup::getScopeType, scopeType) | |
138 | -// ); | |
139 | -// return PublicUtil.toPage(pageData, EvalGroup -> { | |
140 | -// EvalGroupVO EvalGroupVo = PublicUtil.copy(EvalGroup, EvalGroupVO.class); | |
141 | -// EvalGroupVo.setBeginTime(EvalGroup.getBeginTime()); | |
142 | -// EvalGroupVo.setOverTime(EvalGroup.getOverTime()); | |
143 | -// return EvalGroupVo; | |
144 | -// }); | |
145 | - return null; | |
122 | + public void removeById(Long id) { | |
123 | + evalGroupRankService.removeById(id); | |
124 | + evalGroupRankStageService.remove(Wrappers.<EvalGroupRankStage>lambdaUpdate() | |
125 | + .eq(EvalGroupRankStage::getEvalGroupRankId, id) | |
126 | + ); | |
127 | + evalGroupService.remove(Wrappers.<EvalGroup>lambdaUpdate() | |
128 | + .eq(EvalGroup::getEvalGroupRankId, id) | |
129 | + ); | |
130 | + evalUserPoolService.remove(Wrappers.<EvalUserPool>lambdaUpdate() | |
131 | + .eq(EvalUserPool::getEvalGroupRankId, id) | |
132 | + ); | |
133 | + } | |
134 | + | |
135 | + public List<EvalUserPoolVO> staffRank(EvalGroupRankQueryDto dto) { | |
136 | + List<EvalUserPool> pools = evalUserPoolService.list(Wrappers.<EvalUserPool>lambdaQuery() | |
137 | + .in(EvalUserPool::getEvalGroupId, dto.getEvalGroupIds()) | |
138 | + .eq(EvalUserPool::getYn, Boolean.TRUE) | |
139 | + .eq(EvalUserPool::getMonthly, dto.getMonthly()) | |
140 | + .last("ORDER BY ISNULL(rank), rank ASC") | |
141 | + ); | |
142 | + if (PublicUtil.isEmpty(pools)) { | |
143 | + return new ArrayList<>(); | |
144 | + } | |
145 | + List<EvalUserPoolVO> poolVOS = PublicUtil.copyList(pools, EvalUserPoolVO.class); | |
146 | + for (EvalUserPoolVO pool : poolVOS) { | |
147 | + pool.setScoreRatio(pool.getScoreRatio().multiply(Constant.ONE_HUNDRED)); | |
148 | + } | |
149 | + return poolVOS; | |
146 | 150 | } |
147 | 151 | |
152 | + public List<EvalShopPoolVO> shopRank(EvalGroupRankQueryDto dto) { | |
153 | + List<EvalShopPool> pools = evalShopPoolService.list(Wrappers.<EvalShopPool>lambdaQuery() | |
154 | + .in(EvalShopPool::getEvalGroupId, dto.getEvalGroupIds()) | |
155 | + .eq(EvalShopPool::getYn, Boolean.TRUE) | |
156 | + .eq(EvalShopPool::getMonthly, dto.getMonthly()) | |
157 | + .last("ORDER BY ISNULL(rank), rank ASC") | |
158 | + ); | |
159 | + if (PublicUtil.isEmpty(pools)) { | |
160 | + return new ArrayList<>(); | |
161 | + } | |
162 | + List<EvalShopPoolVO> poolVOS = PublicUtil.copyList(pools, EvalShopPoolVO.class); | |
163 | + for (EvalShopPoolVO pool : poolVOS) { | |
164 | + pool.setScoreRatio(pool.getScoreRatio().multiply(Constant.ONE_HUNDRED)); | |
165 | + } | |
166 | + return poolVOS; | |
167 | + } | |
148 | 168 | |
149 | 169 | /** |
150 | - * 考评组排名组合详情 | |
170 | + * 考评组保存 | |
151 | 171 | * |
152 | - * @param id | |
172 | + * @param evalGroupRankDto | |
173 | + * @param user | |
153 | 174 | * @return |
154 | 175 | */ |
155 | - public EvalGroupRankVO evalGroupRankDetail(Long id) { | |
156 | - EvalGroupRank evalGroupRank = evalGroupRankService.getById(id); | |
157 | - EvalGroupRankVO evalGroupRankVO = PublicUtil.copy(evalGroupRank, EvalGroupRankVO.class); | |
176 | + @Transactional(rollbackFor = Exception.class) | |
177 | + @DisLock(prefix = "#this.getSaveGroupPrefix()", key = "#evalGroupRankDto.getName()", message = "保存中,请勿重复操作") | |
178 | + public void saveEvalGroupRank(EvalGroupRankDTO evalGroupRankDto, LoginAuthBean user, Boolean isSubmit) { | |
179 | + this.checkNameRepetition(evalGroupRankDto); | |
180 | + AtomicInteger evalGroupSize = new AtomicInteger(); | |
181 | + LocalDate lastStageOverTime = null; | |
182 | + Boolean multiStage = evalGroupRankDto.getMultiStage(); | |
183 | + for (EvalGroupRankStageDTO stage : evalGroupRankDto.getStages()) { | |
184 | + this.checkStageTime(evalGroupRankDto, stage, lastStageOverTime); | |
185 | + for (EvalGroupDTO evalGroupDTO : stage.getEvalGroups()) { | |
186 | + initEvalGroupDTO(evalGroupDTO); | |
187 | + checkIndicator(evalGroupDTO, multiStage); | |
188 | + checkReward(evalGroupDTO); | |
189 | + checkEvalIndicatorLadders(evalGroupDTO.getIndicators()); | |
190 | + checkEvalRewardLadders(evalGroupDTO.getRewards()); | |
191 | + sortRewardRankLadders(evalGroupDTO.getRewards()); | |
192 | + this.setTargetVos(evalGroupDTO); | |
193 | + evalGroupSize.incrementAndGet(); | |
194 | + List<Long> postIds = evalGroupDTO.getRewards().stream().flatMap(reward -> reward.getPostIds().stream()) | |
195 | + .distinct().collect(Collectors.toList()); | |
196 | + List<String> postNames = evalGroupDTO.getRewards().stream().flatMap(reward -> reward.getPostNames().stream()) | |
197 | + .distinct().collect(Collectors.toList()); | |
198 | + evalGroupDTO.setPostIds(postIds); | |
199 | + evalGroupDTO.setPostNames(postNames); | |
200 | + } | |
201 | + lastStageOverTime = stage.getOverTime(); | |
202 | + } | |
158 | 203 | |
159 | - List<EvalGroupRankStage> stages = evalGroupRankStageService.list(Wrappers.<EvalGroupRankStage>lambdaQuery() | |
160 | - .in(EvalGroupRankStage::getEvalGroupRankId, evalGroupRankVO.getId()) | |
161 | - .eq(EvalGroupRankStage::getYn, Boolean.TRUE) | |
162 | - ); | |
163 | - List<EvalGroupRankStageVO> stageVOS = PublicUtil.copyList(stages, EvalGroupRankStageVO.class); | |
164 | - evalGroupRankVO.setStages(stageVOS); | |
165 | - | |
166 | - List<EvalGroup> evalGroups = evalGroupService.getEvalGroups(evalGroupRankVO.getId()); | |
167 | - List<EvalGroupVO> evalGroupVOS = PublicUtil.copyList(evalGroups, EvalGroupVO.class); | |
168 | - Map<Long, List<EvalGroupVO>> evalGroupStageMap = evalGroupVOS.stream().collect(Collectors.groupingBy(EvalGroupVO::getEvalGroupRankStageId)); | |
169 | - for (EvalGroupRankStageVO stageVO : stageVOS) { | |
170 | - stageVO.setEvalGroups(evalGroupStageMap.getOrDefault(stageVO.getId(), new ArrayList<>())); | |
204 | + SettingDraft settingDraft = getSettingDraft(evalGroupRankDto, isSubmit); | |
205 | + settingDraftService.saveOrUpdate(settingDraft); | |
206 | + if (! isSubmit) { | |
207 | + return; | |
171 | 208 | } |
172 | - return evalGroupRankVO; | |
209 | + approvalBizService.applyApproveEvalDraft(evalGroupRankDto, evalGroupSize.get(), settingDraft, user); | |
173 | 210 | } |
174 | 211 | |
212 | + public void checkStageTime(EvalGroupRankDTO eval, EvalGroupRankStageDTO stage, LocalDate lastStageOverTime) { | |
213 | + if (stage.getBeginTime().isBefore(eval.getBeginTime())) { | |
214 | + throw new BusinessException("阶段开始时间不能在考评时间之前"); | |
215 | + } | |
216 | + if (stage.getOverTime().isAfter(eval.getOverTime())) { | |
217 | + throw new BusinessException("阶段结束时间不能在考评时间之前"); | |
218 | + } | |
219 | + if (PublicUtil.isNotEmpty(lastStageOverTime)) { | |
220 | + if (stage.getBeginTime().isBefore(lastStageOverTime)) { | |
221 | + throw new BusinessException("阶段开始时间不能在上一个阶段结束时间之前"); | |
222 | + } | |
223 | + } | |
224 | + } | |
175 | 225 | |
176 | 226 | /** |
177 | - * 考评组排名配置保存 | |
227 | + * 检查绩效组排名名称是否重复 | |
178 | 228 | * |
179 | - * @param dto | |
229 | + * @param evalGroupRankDto | |
180 | 230 | */ |
181 | - @Transactional(rollbackFor = Exception.class) | |
182 | - public void saveEvalGroupRank(EvalGroupRankDTO dto) { | |
183 | -// checkRank(dto); | |
184 | -// checkEgcRepetition(dto.getId(), dto.getEgcs()); | |
185 | -// checkNameRepetition(dto.getId(), dto.getName()); | |
186 | -// | |
187 | -// EvalGroupRank evalGroupRank = this.convertPO(dto); | |
188 | -// evalGroupRankService.saveOrUpdate(evalGroupRank); | |
231 | + public void checkNameRepetition(EvalGroupRankDTO evalGroupRankDto) { | |
232 | + int count = evalGroupRankService.count(Wrappers.<EvalGroupRank>lambdaQuery() | |
233 | + .eq(EvalGroupRank::getName, evalGroupRankDto.getName()) | |
234 | + .ne(PublicUtil.isNotEmpty(evalGroupRankDto.getId()), EvalGroupRank::getId, evalGroupRankDto.getId()) | |
235 | + .eq(EvalGroupRank::getYn, Boolean.TRUE) | |
236 | + ); | |
237 | + BV.isTrue(count <= 0, "考评排名组名称重复,请重新输入"); | |
189 | 238 | } |
190 | 239 | |
191 | 240 | /** |
192 | - * 转换对象 | |
193 | - * | |
194 | - * @param dto | |
195 | - * @return | |
241 | + * 检查阶梯分值 | |
242 | + * @param indicators | |
196 | 243 | */ |
197 | - public EvalGroupRank convertPO(EvalGroupRankDTO dto) { | |
198 | - EvalGroupRank evalGroupRank = null; | |
199 | - if (PublicUtil.isNotEmpty(dto.getId())) { | |
200 | - evalGroupRank = evalGroupRankService.getById(dto.getId()); | |
201 | - BV.notNull(evalGroupRank, "考评组排名不存在"); | |
202 | - evalGroupRank.setId(dto.getId()); | |
203 | - } else { | |
204 | - evalGroupRank = new EvalGroupRank(); | |
244 | + private void checkEvalIndicatorLadders(List<EvalGroupIndicatorDTO> indicators) { | |
245 | + Integer baseScore = null; | |
246 | + for (EvalGroupIndicatorDTO indicatorDto : indicators) { | |
247 | + if (ScoreWayEnum.NORMAL.equals(indicatorDto.getScoreWay())) { | |
248 | + continue; | |
249 | + } | |
250 | + | |
251 | + baseScore = indicatorDto.getBaseScore(); | |
252 | + List<EvalGroupIndicatorLaddersDTO> ladders = indicatorDto.getLadders(); | |
253 | + Collections.sort(ladders); | |
254 | + | |
255 | + //阶梯值校验 标准分不能超过指标基础分,阶梯值必须连续 | |
256 | + for (EvalGroupIndicatorLaddersDTO laddersDto : ladders) { | |
257 | + BV.isTrue(PublicUtil.isNotEmpty(laddersDto.getLower()), "阶梯下限不能为空"); | |
258 | + BV.isTrue(PublicUtil.isNotEmpty(laddersDto.getUpper()), "阶梯上限不能为空"); | |
259 | + | |
260 | + //阶梯标准分不能超过绩效分值 | |
261 | + if (laddersDto.getStandardScore().compareTo(baseScore) > 0) { | |
262 | + throw new BusinessException("【" + indicatorDto.getName() + "】的阶梯标准分不能超过绩效分值"); | |
263 | + } | |
264 | + } | |
265 | + //校验阶梯 | |
266 | + CommonService.checkLadders(ladders, indicatorDto.getName()); | |
267 | + | |
268 | + //校验条件 | |
269 | + for (EvalGroupIndicatorPreconditionDTO condDTO : indicatorDto.getConds()) { | |
270 | + CommonService.checkLadders(condDTO.getLadders(), indicatorDto.getName()); | |
271 | + } | |
205 | 272 | } |
206 | -// evalGroupRank.setScopeType(dto.getScopeType()); | |
207 | -// evalGroupRank.setGroupId(dto.getGroupId()); | |
208 | -// evalGroupRank.setYn(Boolean.TRUE); | |
209 | -// evalGroupRank.setName(dto.getName()); | |
210 | -// evalGroupRank.setEgcs(dto.getEgcs()); | |
211 | -// List<EvalGroup> evalGroups = evalGroupService.list(Wrappers.<EvalGroup>lambdaQuery() | |
212 | -// .in(EvalGroup::getEgc, dto.getEgcs()) | |
213 | -// .eq(EvalGroup::getYn, Boolean.TRUE) | |
214 | -// ); | |
215 | -// LocalDate overTime = evalGroups.stream().map(EvalGroup::getOverTime).max(LocalDate::compareTo).get(); | |
216 | -// evalGroupRank.setOverTime(overTime); | |
217 | - evalGroupRank.setStatus(SettingStatusEnum.EFFECTIVE); | |
218 | - return evalGroupRank; | |
219 | 273 | } |
220 | 274 | |
221 | 275 | /** |
222 | - * 检查考评组排名名称是否重复 | |
223 | - * | |
224 | - * @param id | |
225 | - * @param name | |
276 | + * 检查阶梯分值 | |
277 | + * @param rewards | |
226 | 278 | */ |
227 | - public void checkNameRepetition(Long id, String name) { | |
228 | - int count = evalGroupRankService.count(Wrappers.<EvalGroupRank>lambdaQuery() | |
229 | - .eq(EvalGroupRank::getName, name) | |
230 | - .ne(PublicUtil.isNotEmpty(id), EvalGroupRank::getId, id) | |
231 | - .eq(EvalGroupRank::getYn, Boolean.TRUE) | |
232 | - ); | |
233 | - BV.isTrue(count <= 0, "考评组排名名称重复,请重新输入"); | |
279 | + private void checkEvalRewardLadders(List<EvalGroupRewardDTO> rewards) { | |
280 | + for (EvalGroupRewardDTO reward : rewards) { | |
281 | + | |
282 | + String rewardName = reward.getName(); | |
283 | + List<EvalGroupRewardLaddersDTO> ladders = reward.getLadders(); | |
284 | + if (EvalRewardCalMethodEnum.RANK.equals(reward.getCalMethod()) || | |
285 | + EvalRewardCalMethodEnum.LADDER.equals(reward.getCalMethod()) || | |
286 | + EvalRewardCalMethodEnum.LADDER_DOUBLE.equals(reward.getCalMethod())) { | |
287 | + BV.isTrue(PublicUtil.isNotEmpty(ladders), "阶梯不能为空"); | |
288 | + Collections.sort(ladders); | |
289 | + } | |
290 | + | |
291 | + for (EvalGroupRewardLaddersDTO ladder : ladders) { | |
292 | + BV.isTrue(PublicUtil.isNotEmpty(ladder.getLower()), "阶梯下限不能为空"); | |
293 | + BV.isTrue(PublicUtil.isNotEmpty(ladder.getUpper()), "阶梯上限不能为空"); | |
294 | + } | |
295 | + | |
296 | + switch (reward.getCalMethod()) { | |
297 | + case TOTAL_PROPORTION: case FIXATION:{ | |
298 | + if (PublicUtil.isNotEmpty(ladders)) { | |
299 | + throw new BusinessException("计算方式【" + reward.getCalMethod().getName() + "】不能配置阶梯"); | |
300 | + } | |
301 | + break; | |
302 | + } | |
303 | +// case RANK: | |
304 | + case LADDER: | |
305 | + case LADDER_DOUBLE: | |
306 | + { | |
307 | + CommonService.checkLadders(ladders, rewardName); | |
308 | + break; | |
309 | + } | |
310 | + } | |
311 | + | |
312 | + } | |
234 | 313 | } |
235 | 314 | |
236 | 315 | /** |
237 | - * 检查考评组排名名称是否重复 | |
238 | - * | |
239 | - * @param egcs | |
316 | + * 检查阶梯分值 | |
317 | + * @param rewards | |
240 | 318 | */ |
241 | - public void checkEgc(EvalScopeEnum scopeType, List<String> egcs) { | |
242 | - List<EvalGroup> evalGroups = evalGroupService.list(Wrappers.<EvalGroup>lambdaQuery() | |
243 | - .eq(EvalGroup::getYn, Boolean.TRUE) | |
244 | - .in(EvalGroup::getEgc, egcs) | |
245 | - ); | |
319 | + private void sortRewardRankLadders(List<EvalGroupRewardDTO> rewards) { | |
320 | + for (EvalGroupRewardDTO reward : rewards) { | |
321 | + if (! EvalRewardCalMethodEnum.RANK.equals(reward.getCalMethod())) { | |
322 | + continue; | |
323 | + } | |
246 | 324 | |
247 | - if (EvalScopeEnum.SHOP.equals(scopeType)) { | |
325 | + List<EvalGroupRewardLaddersDTO> ladders = reward.getLadders(); | |
326 | + Collections.sort(ladders, new Comparator<EvalGroupRewardLaddersDTO>() { | |
327 | + @Override | |
328 | + public int compare(EvalGroupRewardLaddersDTO o1, EvalGroupRewardLaddersDTO o2) { | |
329 | + if (PublicUtil.isEmpty(o1.getRankOrderType())) { | |
330 | + return -1; | |
331 | + } | |
332 | + if (PublicUtil.isEmpty(o2.getRankOrderType())) { | |
333 | + return 1; | |
334 | + } | |
335 | + //正数在前 负数在后 | |
336 | + Integer order = o1.getRankOrderType().compareTo(o2.getRankOrderType()); | |
337 | + if (order == 0) { | |
338 | + //大的在后 | |
339 | + return o1.getLower().subtract(o2.getLower()).intValue(); | |
340 | + } | |
341 | + return order; | |
342 | + } | |
343 | + }); | |
248 | 344 | |
249 | 345 | } |
250 | - | |
251 | 346 | } |
252 | 347 | |
253 | 348 | /** |
254 | - * 检查考考评排名组 | |
349 | + * 检查考评组指标 | |
255 | 350 | * |
351 | + * @param evalGroupDTO | |
256 | 352 | */ |
257 | - public void checkRank(EvalGroupRankDTO dto) { | |
258 | - if (PublicUtil.isNotEmpty(dto.getId())) { | |
259 | - EvalGroupRank evalGroupRank = evalGroupRankService.getById(dto.getId()); | |
260 | - BV.notNull(evalGroupRank, "考评排名组不存在,请重试"); | |
261 | - BV.isFalse(SettingStatusEnum.INEFFECTIVE.equals(evalGroupRank.getStatus()), "考评排名组已失效不能编辑"); | |
353 | + public void checkIndicator(EvalGroupDTO evalGroupDTO, Boolean multiStage) { | |
354 | + for (EvalGroupIndicatorDTO indicator : evalGroupDTO.getIndicators()) { | |
355 | + String indicatorName = indicator.getName(); | |
356 | + | |
357 | + if (ScoreWayEnum.LADDER.equals(indicator.getScoreWay())) { | |
358 | + BV.notNull(indicator.getLaddersType(), indicatorName + " 台阶数据类型不能为空"); | |
359 | + } | |
360 | + | |
361 | + if (PublicUtil.isNotEmpty(indicator.getLadderParams())) { | |
362 | + BigDecimal proportion = indicator.getLadderParams().stream() | |
363 | + .map(EvalGroupIndicatorParamDTO::getProportion) | |
364 | + .reduce(BigDecimal.ZERO, BigDecimal::add); | |
365 | + BV.isTrue(Constant.ONE_HUNDRED.compareTo(proportion) == 0, "【" + indicator.getName() + "】台阶占比总和必须为100"); | |
366 | + | |
367 | + for (EvalGroupIndicatorParamDTO paramDTO : indicator.getLadderParams()) { | |
368 | + if (! TargetTypeEnum.NO.equals(paramDTO.getTargetType()) && | |
369 | + (PublicUtil.isEmpty(paramDTO.getTargetType()) || PublicUtil.isEmpty(paramDTO.getTargetValue()))) { | |
370 | + paramDTO.setTargetType(TargetTypeEnum.NO); | |
371 | + } | |
372 | + if (PublicUtil.isNotEmpty(paramDTO.getTargetCalcType())) { | |
373 | + if (multiStage) { | |
374 | + if (TargetCalcTypeEnum.STAGE_TARGET.equals(paramDTO.getTargetCalcType()) || | |
375 | + TargetCalcTypeEnum.TIME_SCHEDULE.equals(paramDTO.getTargetCalcType())) { | |
376 | + throw new BusinessException("多阶段目标只能选择阶段目标或时间进度"); | |
377 | + } | |
378 | + } else if (TargetCalcTypeEnum.TARGET_VALUE.equals(paramDTO.getTargetCalcType()) || | |
379 | + TargetCalcTypeEnum.MINIMUM.equals(paramDTO.getTargetCalcType())) { | |
380 | + throw new BusinessException("非多阶段目标只能选择百分比或数量"); | |
381 | + } | |
382 | + } | |
383 | + } | |
384 | + } | |
385 | + | |
386 | + if (PublicUtil.isNotEmpty(indicator.getCommissionParams())) { | |
387 | + BigDecimal proportion = indicator.getCommissionParams().stream() | |
388 | + .map(EvalGroupIndicatorParamDTO::getProportion) | |
389 | + .reduce(BigDecimal.ZERO, BigDecimal::add); | |
390 | + BV.isTrue(Constant.ONE_HUNDRED.compareTo(proportion) == 0, "【" + indicator.getName() + "】提成占比总和必须为100"); | |
391 | + | |
392 | + for (EvalGroupIndicatorParamDTO paramDTO : indicator.getCommissionParams()) { | |
393 | + if (! TargetTypeEnum.NO.equals(paramDTO.getTargetType()) && | |
394 | + (PublicUtil.isEmpty(paramDTO.getTargetType()) || PublicUtil.isEmpty(paramDTO.getTargetValue()))) { | |
395 | + paramDTO.setTargetType(TargetTypeEnum.NO); | |
396 | + continue; | |
397 | + } | |
398 | + if (PublicUtil.isNotEmpty(paramDTO.getTargetCalcType())) { | |
399 | + if (multiStage) { | |
400 | + if (TargetCalcTypeEnum.STAGE_TARGET.equals(paramDTO.getTargetCalcType()) || | |
401 | + TargetCalcTypeEnum.TIME_SCHEDULE.equals(paramDTO.getTargetCalcType())) { | |
402 | + throw new BusinessException("多阶段目标只能选择阶段目标或时间进度"); | |
403 | + } | |
404 | + } else if (TargetCalcTypeEnum.TARGET_VALUE.equals(paramDTO.getTargetCalcType()) || | |
405 | + TargetCalcTypeEnum.MINIMUM.equals(paramDTO.getTargetCalcType())) { | |
406 | + throw new BusinessException("非多阶段目标只能选择百分比或数量"); | |
407 | + } | |
408 | + } | |
409 | + } | |
410 | + } | |
411 | + | |
412 | + if (PublicUtil.isNotEmpty(indicator.getConds())) { | |
413 | + for (EvalGroupIndicatorPreconditionDTO preconditionDTO : indicator.getConds()) { | |
414 | + if (! TargetTypeEnum.NO.equals(preconditionDTO.getTargetType()) && | |
415 | + (PublicUtil.isEmpty(preconditionDTO.getTargetType()) || PublicUtil.isEmpty(preconditionDTO.getTargetValue()))) { | |
416 | + preconditionDTO.setTargetType(TargetTypeEnum.NO); | |
417 | + continue; | |
418 | + } | |
419 | + } | |
420 | + } | |
421 | + | |
262 | 422 | } |
263 | 423 | } |
264 | 424 | |
265 | - | |
266 | 425 | /** |
267 | - * 根据id删除考评组排名包 | |
268 | - * @param id | |
426 | + * 检查考评组指标 | |
427 | + * | |
428 | + * @param evalGroupDTO | |
269 | 429 | */ |
270 | - public void removeById(Long id) { | |
271 | - evalGroupRankService.removeById(id); | |
272 | - evalGroupRankStageService.remove(Wrappers.<EvalGroupRankStage>lambdaUpdate() | |
273 | - .eq(EvalGroupRankStage::getEvalGroupRankId, id) | |
274 | - ); | |
275 | - evalGroupService.remove(Wrappers.<EvalGroup>lambdaUpdate() | |
276 | - .eq(EvalGroup::getEvalGroupRankId, id) | |
277 | - ); | |
278 | - evalUserPoolService.remove(Wrappers.<EvalUserPool>lambdaUpdate() | |
279 | - .eq(EvalUserPool::getEvalGroupRankId, id) | |
280 | - ); | |
430 | + public void checkReward(EvalGroupDTO evalGroupDTO) { | |
431 | + for (EvalGroupRewardDTO reward : evalGroupDTO.getRewards()) { | |
432 | + String rewardName = reward.getName(); | |
433 | + | |
434 | + if (EvalRewardCalMethodEnum.LADDER.equals(reward.getCalMethod()) || | |
435 | + EvalRewardCalMethodEnum.LADDER_DOUBLE.equals(reward.getCalMethod()) || | |
436 | + EvalRewardCalMethodEnum.RANK.equals(reward.getCalMethod())) { | |
437 | + BV.notNull(reward.getLaddersType(), rewardName + " 台阶数据类型不能为空"); | |
438 | + } | |
439 | + | |
440 | + if (PublicUtil.isNotEmpty(reward.getCommissionParams())) { | |
441 | + BigDecimal proportion = reward.getCommissionParams().stream() | |
442 | + .map(EvalGroupRewardParamDTO::getProportion) | |
443 | + .reduce(BigDecimal.ZERO, BigDecimal::add); | |
444 | + BV.isTrue(Constant.ONE_HUNDRED.compareTo(proportion) == 0, "【" + rewardName + "】台阶占比总和必须为100"); | |
445 | + | |
446 | + for (EvalGroupRewardParamDTO commissionParam : reward.getCommissionParams()) { | |
447 | + if (! TargetTypeEnum.NO.equals(commissionParam.getTargetType()) && | |
448 | + (PublicUtil.isEmpty(commissionParam.getTargetType()) || PublicUtil.isEmpty(commissionParam.getTargetValue()))) { | |
449 | + commissionParam.setTargetType(TargetTypeEnum.NO); | |
450 | + } | |
451 | + } | |
452 | + } | |
453 | + | |
454 | + if (PublicUtil.isNotEmpty(reward.getLadderParams())) { | |
455 | + BigDecimal proportion = reward.getLadderParams().stream() | |
456 | + .map(EvalGroupRewardParamDTO::getProportion) | |
457 | + .reduce(BigDecimal.ZERO, BigDecimal::add); | |
458 | + BV.isTrue(Constant.ONE_HUNDRED.compareTo(proportion) == 0, "【" + rewardName + "】提成占比总和必须为100"); | |
459 | + | |
460 | + for (EvalGroupRewardParamDTO commissionParam : reward.getLadderParams()) { | |
461 | + if (! TargetTypeEnum.NO.equals(commissionParam.getTargetType()) && | |
462 | + (PublicUtil.isEmpty(commissionParam.getTargetType()) || PublicUtil.isEmpty(commissionParam.getTargetValue()))) { | |
463 | + commissionParam.setTargetType(TargetTypeEnum.NO); | |
464 | + } | |
465 | + } | |
466 | + } | |
467 | + | |
468 | + if (PublicUtil.isNotEmpty(reward.getConds())) { | |
469 | + for (EvalGroupRewardPreconditionDTO preconditionDTO : reward.getConds()) { | |
470 | + if (! TargetTypeEnum.NO.equals(preconditionDTO.getTargetType()) && | |
471 | + (PublicUtil.isEmpty(preconditionDTO.getTargetType()) || PublicUtil.isEmpty(preconditionDTO.getTargetValue()))) { | |
472 | + preconditionDTO.setTargetType(TargetTypeEnum.NO); | |
473 | + } | |
474 | + } | |
475 | + } | |
476 | + } | |
281 | 477 | } |
282 | 478 | |
283 | - public List<EvalUserPoolVO> staffRank(EvalGroupRankQueryDto dto) { | |
284 | - List<EvalUserPool> pools = evalUserPoolService.list(Wrappers.<EvalUserPool>lambdaQuery() | |
285 | - .in(EvalUserPool::getEvalGroupId, dto.getEvalGroupIds()) | |
286 | - .eq(EvalUserPool::getYn, Boolean.TRUE) | |
287 | - .eq(EvalUserPool::getMonthly, dto.getMonthly()) | |
288 | - .last("ORDER BY ISNULL(rank), rank ASC") | |
289 | - ); | |
290 | - if (PublicUtil.isEmpty(pools)) { | |
291 | - return new ArrayList<>(); | |
479 | + /** | |
480 | + * 检查时间 | |
481 | + * | |
482 | + * @param dto | |
483 | + */ | |
484 | + public void initEvalGroupDTO(EvalGroupDTO dto) { | |
485 | + if (PublicUtil.isEmpty(dto.getIndicators())) { | |
486 | + dto.setIndicators(new ArrayList<>()); | |
292 | 487 | } |
293 | - List<EvalUserPoolVO> poolVOS = PublicUtil.copyList(pools, EvalUserPoolVO.class); | |
294 | - for (EvalUserPoolVO pool : poolVOS) { | |
295 | - pool.setScoreRatio(pool.getScoreRatio().multiply(Constant.ONE_HUNDRED)); | |
488 | + if (PublicUtil.isEmpty(dto.getRewards())) { | |
489 | + dto.setRewards(new ArrayList<>()); | |
490 | + } | |
491 | + for (EvalGroupIndicatorDTO indicatorDTO : dto.getIndicators()) { | |
492 | + if (PublicUtil.isEmpty(indicatorDTO.getLadderParams())) { | |
493 | + indicatorDTO.setLadderParams(new ArrayList<>()); | |
494 | + } | |
495 | + if (PublicUtil.isEmpty(indicatorDTO.getCommissionParams())) { | |
496 | + indicatorDTO.setCommissionParams(new ArrayList<>()); | |
497 | + } | |
498 | + if (PublicUtil.isEmpty(indicatorDTO.getLadders())) { | |
499 | + indicatorDTO.setLadders(new ArrayList<>()); | |
500 | + } | |
501 | + if (PublicUtil.isEmpty(indicatorDTO.getConds())) { | |
502 | + indicatorDTO.setConds(new ArrayList<>()); | |
503 | + } | |
504 | + } | |
505 | + for (EvalGroupRewardDTO rewardDTO : dto.getRewards()) { | |
506 | + if (PublicUtil.isEmpty(rewardDTO.getLadderParams())) { | |
507 | + rewardDTO.setLadderParams(new ArrayList<>()); | |
508 | + } | |
509 | + if (PublicUtil.isEmpty(rewardDTO.getCommissionParams())) { | |
510 | + rewardDTO.setCommissionParams(new ArrayList<>()); | |
511 | + } | |
512 | + if (PublicUtil.isEmpty(rewardDTO.getLadders())) { | |
513 | + rewardDTO.setLadders(new ArrayList<>()); | |
514 | + } | |
515 | + if (PublicUtil.isEmpty(rewardDTO.getConds())) { | |
516 | + rewardDTO.setConds(new ArrayList<>()); | |
517 | + } | |
296 | 518 | } |
297 | - return poolVOS; | |
298 | 519 | } |
299 | 520 | |
300 | - public List<EvalShopPoolVO> shopRank(EvalGroupRankQueryDto dto) { | |
301 | - List<EvalShopPool> pools = evalShopPoolService.list(Wrappers.<EvalShopPool>lambdaQuery() | |
302 | - .in(EvalShopPool::getEvalGroupId, dto.getEvalGroupIds()) | |
303 | - .eq(EvalShopPool::getYn, Boolean.TRUE) | |
304 | - .eq(EvalShopPool::getMonthly, dto.getMonthly()) | |
305 | - .last("ORDER BY ISNULL(rank), rank ASC") | |
306 | - ); | |
307 | - if (PublicUtil.isEmpty(pools)) { | |
308 | - return new ArrayList<>(); | |
521 | + /** | |
522 | + * 装换为目标对象 | |
523 | + * | |
524 | + * @return | |
525 | + */ | |
526 | + public void setTargetVos(EvalGroupDTO evalGroupDTO) { | |
527 | + | |
528 | + for (EvalGroupIndicatorDTO indicatorDTO : evalGroupDTO.getIndicators()) { | |
529 | + List<EvalGroupIndicatorParamDTO> ladderParams = Optional.ofNullable(indicatorDTO.getLadderParams()).orElse(new ArrayList<>()); | |
530 | + List<EvalGroupIndicatorParamDTO> commissionParams = Optional.ofNullable(indicatorDTO.getCommissionParams()).orElse(new ArrayList<>()); | |
531 | + List<EvalGroupIndicatorPreconditionDTO> conds = Optional.ofNullable(indicatorDTO.getConds()).orElse(new ArrayList<>()); | |
532 | + | |
533 | + List<EvalGroupIndicatorTargetVO> targetVOS = new ArrayList<>(); | |
534 | + for (EvalGroupIndicatorParamDTO paramDTO : ladderParams) { | |
535 | + if (PublicUtil.isNotEmpty(paramDTO.getTargetType()) && (! TargetTypeEnum.NO.equals(paramDTO.getTargetType()))) { | |
536 | + EvalGroupIndicatorTargetVO targetVO = PublicUtil.copy(paramDTO, EvalGroupIndicatorTargetVO.class); | |
537 | + targetVOS.add(targetVO); | |
538 | + } | |
539 | + } | |
540 | + | |
541 | + for (EvalGroupIndicatorParamDTO paramDTO : commissionParams) { | |
542 | + if (PublicUtil.isNotEmpty(paramDTO.getTargetType()) && (! TargetTypeEnum.NO.equals(paramDTO.getTargetType()))) { | |
543 | + EvalGroupIndicatorTargetVO targetVO = PublicUtil.copy(paramDTO, EvalGroupIndicatorTargetVO.class); | |
544 | + targetVOS.add(targetVO); | |
545 | + } | |
546 | + } | |
547 | + | |
548 | + for (EvalGroupIndicatorPreconditionDTO preconditionDTO : conds) { | |
549 | + if (PublicUtil.isNotEmpty(preconditionDTO.getTargetType()) && (! TargetTypeEnum.NO.equals(preconditionDTO.getTargetType()))) { | |
550 | + EvalGroupIndicatorTargetVO targetVO = PublicUtil.copy(preconditionDTO, EvalGroupIndicatorTargetVO.class); | |
551 | + targetVOS.add(targetVO); | |
552 | + } | |
553 | + } | |
554 | + | |
555 | + indicatorDTO.setTargets(targetVOS); | |
309 | 556 | } |
310 | - List<EvalShopPoolVO> poolVOS = PublicUtil.copyList(pools, EvalShopPoolVO.class); | |
311 | - for (EvalShopPoolVO pool : poolVOS) { | |
312 | - pool.setScoreRatio(pool.getScoreRatio().multiply(Constant.ONE_HUNDRED)); | |
557 | + | |
558 | + for (EvalGroupRewardDTO rewardDTO : evalGroupDTO.getRewards()) { | |
559 | + List<EvalGroupRewardParamDTO> ladderParams = Optional.ofNullable(rewardDTO.getLadderParams()).orElse(new ArrayList<>()); | |
560 | + List<EvalGroupRewardParamDTO> commissionParams = Optional.ofNullable(rewardDTO.getCommissionParams()).orElse(new ArrayList<>()); | |
561 | + List<EvalGroupRewardPreconditionDTO> conds = Optional.ofNullable(rewardDTO.getConds()).orElse(new ArrayList<>()); | |
562 | + | |
563 | + List<EvalGroupIndicatorTargetVO> targetVOS = new ArrayList<>(); | |
564 | + for (EvalGroupRewardParamDTO paramDTO : ladderParams) { | |
565 | + if (PublicUtil.isNotEmpty(paramDTO.getTargetType()) && (! TargetTypeEnum.NO.equals(paramDTO.getTargetType()))) { | |
566 | + EvalGroupIndicatorTargetVO targetVO = PublicUtil.copy(paramDTO, EvalGroupIndicatorTargetVO.class); | |
567 | + targetVOS.add(targetVO); | |
568 | + } | |
569 | + } | |
570 | + | |
571 | + for (EvalGroupRewardParamDTO paramDTO : commissionParams) { | |
572 | + if (PublicUtil.isNotEmpty(paramDTO.getTargetType()) && (! TargetTypeEnum.NO.equals(paramDTO.getTargetType()))) { | |
573 | + EvalGroupIndicatorTargetVO targetVO = PublicUtil.copy(paramDTO, EvalGroupIndicatorTargetVO.class); | |
574 | + targetVOS.add(targetVO); | |
575 | + } | |
576 | + } | |
577 | + | |
578 | + for (EvalGroupRewardPreconditionDTO preconditionDTO : conds) { | |
579 | + if (PublicUtil.isNotEmpty(preconditionDTO.getTargetType()) && (! TargetTypeEnum.NO.equals(preconditionDTO.getTargetType()))) { | |
580 | + EvalGroupIndicatorTargetVO targetVO = PublicUtil.copy(preconditionDTO, EvalGroupIndicatorTargetVO.class); | |
581 | + targetVOS.add(targetVO); | |
582 | + } | |
583 | + } | |
584 | + rewardDTO.setTargets(targetVOS); | |
313 | 585 | } |
314 | - return poolVOS; | |
315 | 586 | } |
316 | 587 | |
588 | + /** | |
589 | + * 获取草稿 | |
590 | + * | |
591 | + * @param dto | |
592 | + * @return | |
593 | + */ | |
594 | + public SettingDraft getSettingDraft(EvalGroupRankDTO dto, Boolean submit) { | |
595 | + SettingDraft settingDraft = null; | |
596 | + if (PublicUtil.isEmpty(dto.getDraftId())) { | |
597 | + settingDraft = new SettingDraft(); | |
598 | + settingDraft.setGroupId(dto.getGroupId()); | |
599 | + settingDraft.setYn(Boolean.TRUE); | |
600 | + settingDraft.setType(SettingDraftTypeEnum.EVAL_GROUP_RANK); | |
601 | + } else { | |
602 | + settingDraft = settingDraftService.getById(dto.getDraftId()); | |
603 | + BV.notNull(settingDraft, "草稿配置不存在,请重试"); | |
604 | + } | |
605 | + settingDraft.setStatus(submit ? SettingDraftStatusEnum.RELEASE_APPROVAL : SettingDraftStatusEnum.NO_RELEASE); | |
606 | +// settingDraft.setEvalType(dto.getType()); | |
607 | + settingDraft.setName(dto.getName()); | |
608 | + settingDraft.setContent(JSONObject.toJSONString(dto)); | |
609 | + return settingDraft; | |
610 | + } | |
611 | + | |
612 | + | |
317 | 613 | } | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupUserBizService.java
... | ... | @@ -4,6 +4,7 @@ import cn.fw.ehr.sdk.api.enums.StaffStatusEnum; |
4 | 4 | import cn.fw.morax.common.utils.PublicUtil; |
5 | 5 | import cn.fw.morax.domain.db.eval.EvalGroup; |
6 | 6 | import cn.fw.morax.domain.db.eval.EvalGroupUser; |
7 | +import cn.fw.morax.domain.dto.query.ShopsPostsQueryDTO; | |
7 | 8 | import cn.fw.morax.domain.enums.EvalScopeEnum; |
8 | 9 | import cn.fw.morax.domain.enums.KpiIgnoreCauseEnum; |
9 | 10 | import cn.fw.morax.domain.vo.eval.EvalGroupUserVO; |
... | ... | @@ -373,4 +374,16 @@ public class EvalGroupUserBizService { |
373 | 374 | return evalGroupUserVOS; |
374 | 375 | } |
375 | 376 | |
377 | + /** | |
378 | + * 查询考评组排名人员 | |
379 | + * | |
380 | + * @param dto | |
381 | + * @return | |
382 | + */ | |
383 | + public List<EvalGroupUserVO> queryShopPostStaffs(ShopsPostsQueryDTO dto) { | |
384 | + List<EvalGroupUser> evalGroupUsers = this.fetchPostUsers(dto.getPostIds(), dto.getShopIds(), null); | |
385 | + List<EvalGroupUserVO> evalGroupUserVOS = PublicUtil.copyList(evalGroupUsers, EvalGroupUserVO.class); | |
386 | + return evalGroupUserVOS; | |
387 | + } | |
388 | + | |
376 | 389 | } | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalRewardService.java
1 | 1 | package cn.fw.morax.service.biz.eval; |
2 | 2 | |
3 | -import cn.fw.backlog.sdk.api.result.FailBacklogItem; | |
4 | 3 | import cn.fw.common.cache.locker.DistributedLocker; |
5 | 4 | import cn.fw.common.exception.BusinessException; |
6 | 5 | import cn.fw.common.web.auth.LoginAuthBean; |
7 | 6 | import cn.fw.morax.common.config.TodoVal; |
8 | 7 | import cn.fw.morax.common.pojo.event.ApprovalResultEvent; |
9 | -import cn.fw.morax.common.utils.DateUtil; | |
10 | 8 | import cn.fw.morax.common.utils.PublicUtil; |
11 | 9 | import cn.fw.morax.common.utils.ThreadPoolUtil; |
12 | 10 | import cn.fw.morax.domain.bo.eval.EvalGroupRewardDistributionBO; |
13 | 11 | import cn.fw.morax.domain.db.ApprovalRecord; |
14 | -import cn.fw.morax.domain.db.eval.*; | |
12 | +import cn.fw.morax.domain.db.eval.EvalGroup; | |
13 | +import cn.fw.morax.domain.db.eval.EvalRewardDist; | |
14 | +import cn.fw.morax.domain.db.eval.EvalRewardDistDetail; | |
15 | +import cn.fw.morax.domain.db.eval.EvalShopPool; | |
15 | 16 | import cn.fw.morax.domain.dto.eval.EvalRewardDistDTO; |
16 | 17 | import cn.fw.morax.domain.dto.eval.EvalRewardDistDetailDTO; |
17 | -import cn.fw.morax.domain.enums.*; | |
18 | +import cn.fw.morax.domain.enums.ApprovalTypeEnum; | |
19 | +import cn.fw.morax.domain.enums.EvalRewardDistStatusEnum; | |
20 | +import cn.fw.morax.domain.enums.EvalRewardPushStatusEnum; | |
18 | 21 | import cn.fw.morax.domain.vo.eval.EvalRewardDistDetailVO; |
19 | 22 | import cn.fw.morax.domain.vo.eval.EvalRewardDistVO; |
20 | 23 | import cn.fw.morax.domain.vo.eval.EvalShopPoolVO; |
21 | 24 | import cn.fw.morax.rpc.backlog.TodoRpcService; |
22 | 25 | import cn.fw.morax.rpc.backlog.dto.BackLogItemDTO; |
23 | -import cn.fw.morax.rpc.backlog.dto.BacklogBatchPlanItemReqDTO; | |
24 | -import cn.fw.morax.rpc.backlog.dto.BacklogBatchPlanReqDTO; | |
25 | 26 | import cn.fw.morax.rpc.erp.ErpRpcService; |
26 | 27 | import cn.fw.morax.rpc.erp.dto.RpcUserRoleInfoDTO; |
27 | -import cn.fw.morax.rpc.erp.dto.RpcUserRoleShopDTO; | |
28 | 28 | import cn.fw.morax.service.biz.ApprovalBizService; |
29 | 29 | import cn.fw.morax.service.data.ApprovalRecordService; |
30 | -import cn.fw.morax.service.data.eval.*; | |
30 | +import cn.fw.morax.service.data.eval.EvalGroupService; | |
31 | +import cn.fw.morax.service.data.eval.EvalRewardDistDetailService; | |
32 | +import cn.fw.morax.service.data.eval.EvalRewardDistService; | |
33 | +import cn.fw.morax.service.data.eval.EvalShopPoolService; | |
31 | 34 | import com.alibaba.fastjson.JSON; |
32 | 35 | import com.alibaba.fastjson.JSONObject; |
33 | 36 | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; |
... | ... | @@ -44,14 +47,11 @@ import org.springframework.stereotype.Service; |
44 | 47 | import org.springframework.transaction.annotation.Transactional; |
45 | 48 | |
46 | 49 | import java.math.BigDecimal; |
47 | -import java.text.DecimalFormat; | |
48 | 50 | import java.time.LocalDate; |
49 | -import java.time.LocalDateTime; | |
50 | 51 | import java.util.*; |
51 | 52 | import java.util.concurrent.RejectedExecutionException; |
52 | 53 | import java.util.concurrent.ThreadPoolExecutor; |
53 | 54 | import java.util.concurrent.locks.Lock; |
54 | -import java.util.stream.Collectors; | |
55 | 55 | |
56 | 56 | import static cn.fw.common.businessvalidator.Validator.BV; |
57 | 57 | |
... | ... | @@ -66,7 +66,6 @@ import static cn.fw.common.businessvalidator.Validator.BV; |
66 | 66 | public class EvalRewardService { |
67 | 67 | |
68 | 68 | private final TodoVal todoVal; |
69 | - private final EvalService evalService; | |
70 | 69 | private final ErpRpcService erpRpcService; |
71 | 70 | private final TodoRpcService todoRpcService; |
72 | 71 | private final EvalGroupService evalGroupService; | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalGroupService.java
... | ... | @@ -2,14 +2,11 @@ package cn.fw.morax.service.data.eval; |
2 | 2 | |
3 | 3 | |
4 | 4 | import cn.fw.morax.domain.db.eval.EvalGroup; |
5 | -import cn.fw.morax.domain.db.kpi.KpiGroup; | |
6 | -import cn.fw.morax.domain.enums.EvalScopeEnum; | |
7 | 5 | import com.baomidou.mybatisplus.extension.service.IService; |
8 | 6 | import org.springframework.lang.NonNull; |
9 | 7 | import org.springframework.lang.Nullable; |
10 | 8 | |
11 | 9 | import java.time.LocalDate; |
12 | -import java.util.Date; | |
13 | 10 | import java.util.List; |
14 | 11 | import java.util.Set; |
15 | 12 | |
... | ... | @@ -56,13 +53,6 @@ public interface EvalGroupService extends IService<EvalGroup> { |
56 | 53 | Set<Long> queryDistributionShopReward(@NonNull final LocalDate localDate); |
57 | 54 | |
58 | 55 | /** |
59 | - * 获取所有生效中考评组数据 | |
60 | - * | |
61 | - * @return | |
62 | - */ | |
63 | - List<EvalGroup> getAllEffectGroupByEgcs(@NonNull final List<String> egcs, @NonNull final LocalDate localDate); | |
64 | - | |
65 | - /** | |
66 | 56 | * 获取考评排名组的考评组 |
67 | 57 | * |
68 | 58 | * @return | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalGroupServiceImpl.java
... | ... | @@ -3,8 +3,6 @@ package cn.fw.morax.service.data.eval.impl; |
3 | 3 | |
4 | 4 | import cn.fw.morax.dao.eval.EvalGroupDao; |
5 | 5 | import cn.fw.morax.domain.db.eval.EvalGroup; |
6 | -import cn.fw.morax.domain.db.kpi.KpiGroup; | |
7 | -import cn.fw.morax.domain.enums.EvalScopeEnum; | |
8 | 6 | import cn.fw.morax.service.data.eval.EvalGroupService; |
9 | 7 | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
10 | 8 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
... | ... | @@ -12,7 +10,6 @@ import org.springframework.lang.NonNull; |
12 | 10 | import org.springframework.stereotype.Service; |
13 | 11 | |
14 | 12 | import java.time.LocalDate; |
15 | -import java.util.Date; | |
16 | 13 | import java.util.List; |
17 | 14 | import java.util.Set; |
18 | 15 | |
... | ... | @@ -32,10 +29,6 @@ public class EvalGroupServiceImpl extends ServiceImpl<EvalGroupDao, EvalGroup> i |
32 | 29 | return this.getBaseMapper().getAllEffectGroups(localDate); |
33 | 30 | } |
34 | 31 | @Override |
35 | - public List<EvalGroup> getAllEffectGroupByEgcs(@NonNull final List<String> egcs, @NonNull final LocalDate localDate) { | |
36 | - return this.getBaseMapper().getAllEffectGroupByEgcs(egcs, localDate); | |
37 | - } | |
38 | - @Override | |
39 | 32 | public List<EvalGroup> getEffectGroups(@NonNull final Long groupId, LocalDate localDate) { |
40 | 33 | return this.getBaseMapper().getEffectGroups(groupId, localDate); |
41 | 34 | } |
... | ... | @@ -47,7 +40,7 @@ public class EvalGroupServiceImpl extends ServiceImpl<EvalGroupDao, EvalGroup> i |
47 | 40 | |
48 | 41 | @Override |
49 | 42 | public Set<Long> queryDistributionShopReward(LocalDate localDate) { |
50 | - return this.baseMapper.queryDistributionShopReward(localDate, EvalScopeEnum.SHOP.getValue()); | |
43 | + return this.baseMapper.queryDistributionShopReward(localDate); | |
51 | 44 | } |
52 | 45 | |
53 | 46 | @Override | ... | ... |