Commit f727712b05d612df64b7bdab9fc61a51e01793c3
1 parent
304c0473
feature(*): 考评阶段指标上报
考评阶段指标上报
Showing
21 changed files
with
439 additions
and
140 deletions
fw-morax-domain/src/main/java/cn/fw/morax/domain/bo/kpi/ShopIndicatorStageBO.java
0 → 100644
1 | +package cn.fw.morax.domain.bo.kpi; | |
2 | + | |
3 | +import lombok.Data; | |
4 | + | |
5 | +import java.math.BigDecimal; | |
6 | +import java.util.Date; | |
7 | +import java.util.Map; | |
8 | + | |
9 | +/** | |
10 | + * @author : kurisu | |
11 | + * @version : 2.0 | |
12 | + * @className : UserIndicatorBO | |
13 | + * @description : 人员绩效值 | |
14 | + * @date : 2022-04-13 17:21 | |
15 | + */ | |
16 | +@Data | |
17 | +public class ShopIndicatorStageBO { | |
18 | + /** | |
19 | + * 指标编码 | |
20 | + */ | |
21 | + private String indicatorCode; | |
22 | + /** | |
23 | + * 人员id | |
24 | + */ | |
25 | + private Long shopId; | |
26 | + /** | |
27 | + * 指标值类型 | |
28 | + */ | |
29 | + private Integer valueType; | |
30 | + /** | |
31 | + * 指标对应值 | |
32 | + */ | |
33 | + private Map<String, BigDecimal> value; | |
34 | + /** | |
35 | + * 数据开始日期 | |
36 | + */ | |
37 | + private Date beginDate; | |
38 | + /** | |
39 | + * 数据结束日期 | |
40 | + */ | |
41 | + private Date endDate; | |
42 | + /** | |
43 | + * 集团id | |
44 | + */ | |
45 | + private Long groupId; | |
46 | +} | ... | ... |
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroup.java
... | ... | @@ -52,14 +52,16 @@ public class EvalGroup extends BaseAuditableTimeEntity<EvalGroup, Long> { |
52 | 52 | private String egc; |
53 | 53 | |
54 | 54 | /** |
55 | - * 岗位id | |
55 | + * 适用岗位ids | |
56 | 56 | */ |
57 | - private Long postId; | |
57 | + @TableField(typeHandler = LongListTypeHandler.class) | |
58 | + private List<Long> postIds; | |
58 | 59 | |
59 | 60 | /** |
60 | - * 岗位名称 | |
61 | + * 适用岗位名称 | |
61 | 62 | */ |
62 | - private String postName; | |
63 | + @TableField(typeHandler = StringListTypeHandler.class) | |
64 | + private List<String> postNames; | |
63 | 65 | |
64 | 66 | /** |
65 | 67 | * 适用门店ids | ... | ... |
fw-morax-sdk/pom.xml
fw-morax-sdk/src/main/java/cn/fw/morax/sdk/api/IndicatorReportService.java
... | ... | @@ -2,6 +2,7 @@ package cn.fw.morax.sdk.api; |
2 | 2 | |
3 | 3 | import cn.fw.data.base.domain.common.Message; |
4 | 4 | import cn.fw.morax.sdk.dto.CustomList; |
5 | +import cn.fw.morax.sdk.dto.common.IndicatorShopStageValueReq; | |
5 | 6 | import cn.fw.morax.sdk.dto.common.IndicatorShopValueReq; |
6 | 7 | import cn.fw.morax.sdk.dto.common.IndicatorStageValueReq; |
7 | 8 | import cn.fw.morax.sdk.dto.common.IndicatorValueReq; |
... | ... | @@ -32,7 +33,7 @@ public interface IndicatorReportService { |
32 | 33 | Message<Void> indicatorReport(@Valid @RequestBody CustomList<IndicatorValueReq> userIndicatorList); |
33 | 34 | |
34 | 35 | /** |
35 | - * 上报门店指标数据数据 | |
36 | + * 上报门店指标数据 | |
36 | 37 | * |
37 | 38 | * @param shopIndicatorList 门店指标数据 |
38 | 39 | * @return void |
... | ... | @@ -48,4 +49,13 @@ public interface IndicatorReportService { |
48 | 49 | */ |
49 | 50 | @PostMapping("/report-stage/up") |
50 | 51 | Message<Void> indicatorStageReport(@Valid @RequestBody CustomList<IndicatorStageValueReq> userIndicatorList); |
52 | + | |
53 | + /** | |
54 | + * 上报门店阶段指标数据 | |
55 | + * | |
56 | + * @param shopIndicatorList 门店指标数据 | |
57 | + * @return void | |
58 | + */ | |
59 | + @PostMapping("/report-shop-stage/up") | |
60 | + Message<Void> indicatorShopStageReport(@Valid @RequestBody CustomList<IndicatorShopStageValueReq> shopIndicatorList); | |
51 | 61 | } | ... | ... |
fw-morax-sdk/src/main/java/cn/fw/morax/sdk/dto/common/IndicatorShopStageValueReq.java
0 → 100644
1 | +package cn.fw.morax.sdk.dto.common; | |
2 | + | |
3 | +import cn.fw.common.validator.EnumValue; | |
4 | +import lombok.Data; | |
5 | +import org.hibernate.validator.constraints.ScriptAssert; | |
6 | + | |
7 | +import javax.validation.Valid; | |
8 | +import javax.validation.constraints.NotBlank; | |
9 | +import javax.validation.constraints.NotEmpty; | |
10 | +import javax.validation.constraints.NotNull; | |
11 | +import javax.validation.constraints.Past; | |
12 | +import java.util.Date; | |
13 | +import java.util.List; | |
14 | +import java.util.regex.Pattern; | |
15 | + | |
16 | +/** | |
17 | + * @author : kurisu | |
18 | + * @version : 2.0 | |
19 | + * @className : IndicatorValueReq | |
20 | + * @description : 人员绩效指标值 | |
21 | + * @date : 2022-12-22 09:45 | |
22 | + */ | |
23 | +@Data | |
24 | +@ScriptAssert.List({ | |
25 | + @ScriptAssert(lang = "javascript", script = "_this.checkConditionValue()", message = "指标项key不正确"), | |
26 | +}) | |
27 | +public class IndicatorShopStageValueReq { | |
28 | + private static final String regNo = "^[-\\+]?[\\d]*$"; | |
29 | + /** | |
30 | + * 门店id | |
31 | + */ | |
32 | + @NotNull(message = "门店id不能为空") | |
33 | + private Long shopId; | |
34 | + /** | |
35 | + * 指标编码 | |
36 | + */ | |
37 | + @NotBlank(message = "指标编码不能为空") | |
38 | + private String indicatorCode; | |
39 | + /** | |
40 | + * 指标值类型 | |
41 | + * | |
42 | + * @see IndicatorValueEnum | |
43 | + */ | |
44 | + @NotNull(message = "指标值类型不能为空") | |
45 | + @EnumValue(enumClass = IndicatorValueEnum.class, message = "指标值枚举值不正确") | |
46 | + private Integer valueType; | |
47 | + /** | |
48 | + * 指标项 | |
49 | + */ | |
50 | + @NotEmpty(message = "指标项不能为空") | |
51 | + @Valid | |
52 | + private List<IndicatorValueDTO> indicatorValue; | |
53 | + /** | |
54 | + * 数据开始日期 | |
55 | + */ | |
56 | + @NotNull(message = "数据开始日期不能为空") | |
57 | + @Past(message = "数据开始日期必须为过去的时间") | |
58 | + private Date beginDate; | |
59 | + /** | |
60 | + * 数据结束日期 | |
61 | + */ | |
62 | + @NotNull(message = "数据结束日期不能为空") | |
63 | + @Past(message = "数据结束日期必须为过去的时间") | |
64 | + private Date endDate; | |
65 | + /** | |
66 | + * 集团id | |
67 | + */ | |
68 | + @NotNull(message = "集团id不能为空") | |
69 | + private Long groupId; | |
70 | + | |
71 | + public boolean checkConditionValue() { | |
72 | + if (IndicatorValueEnum.CONDITION.getValue().equals(valueType)) { | |
73 | + return indicatorValue.stream().allMatch(r -> isNumber(r.getKey())); | |
74 | + } | |
75 | + return true; | |
76 | + } | |
77 | + | |
78 | + private boolean isNumber(String str) { | |
79 | + if (str == null) { | |
80 | + return false; | |
81 | + } | |
82 | + Pattern compile = Pattern.compile(regNo); | |
83 | + return compile.matcher(str).matches(); | |
84 | + } | |
85 | +} | |
86 | + | ... | ... |
fw-morax-sdk/src/main/java/cn/fw/morax/sdk/dto/kpi/KpiStageReportNoticeMQ.java
fw-morax-server/pom.xml
fw-morax-server/src/main/java/cn/fw/morax/server/controller/api/IndicatorReportServiceImpl.java
... | ... | @@ -4,6 +4,7 @@ import cn.fw.common.web.annotation.ControllerMethod; |
4 | 4 | import cn.fw.data.base.domain.common.Message; |
5 | 5 | import cn.fw.morax.sdk.api.IndicatorReportService; |
6 | 6 | import cn.fw.morax.sdk.dto.CustomList; |
7 | +import cn.fw.morax.sdk.dto.common.IndicatorShopStageValueReq; | |
7 | 8 | import cn.fw.morax.sdk.dto.common.IndicatorShopValueReq; |
8 | 9 | import cn.fw.morax.sdk.dto.common.IndicatorStageValueReq; |
9 | 10 | import cn.fw.morax.sdk.dto.common.IndicatorValueReq; |
... | ... | @@ -63,4 +64,13 @@ public class IndicatorReportServiceImpl implements IndicatorReportService { |
63 | 64 | indicatorBizService.reportStageData(userIndicatorList); |
64 | 65 | return Message.success(); |
65 | 66 | } |
67 | + | |
68 | + @PostMapping("/report-shop-stage/up") | |
69 | + @ControllerMethod("上报门店阶段指标数据") | |
70 | + @Override | |
71 | + public Message<Void> indicatorShopStageReport(@Valid @RequestBody CustomList<IndicatorShopStageValueReq> userIndicatorList) { | |
72 | + BV.isTrue(userIndicatorList.size() <= MAX_SIZE, () -> MessageFormatTransfer("最多支持一次性处理{0}条任务", MAX_SIZE)); | |
73 | + indicatorBizService.reportStageShopData(userIndicatorList); | |
74 | + return Message.success(); | |
75 | + } | |
66 | 76 | } | ... | ... |
fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalGroupTask.java
... | ... | @@ -111,7 +111,7 @@ public class EvalGroupTask { |
111 | 111 | kpiStageMqLogService.save(mqLog); |
112 | 112 | |
113 | 113 | kpiStageIndicatorReportProducer.send(KpiStageReportNoticeMQ.builder() |
114 | - .code(stageIndicator.getIndicatorCode()) | |
114 | + .indicatorCode(stageIndicator.getIndicatorCode()) | |
115 | 115 | .beginTime(DateUtil.localDateTime2Date(mqLog.getBeginTime().atTime(0,0,1))) |
116 | 116 | .endTime(DateUtil.localDateTime2Date(mqLog.getEndTime().atTime(23,59,59))) |
117 | 117 | .shopIds(mqLog.getShopIds()) | ... | ... |
fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalGroupUserTask.java
... | ... | @@ -97,20 +97,17 @@ public class EvalGroupUserTask { |
97 | 97 | * @return |
98 | 98 | */ |
99 | 99 | private List<EvalGroupUser> queryKpiStaff(LocalDate yesterday) { |
100 | - Map<Long, List<EvalGroup>> postKpis = evalGroupUserBizService.postEffectEvalGroups(); | |
101 | - if (! postKpis.isEmpty()) { | |
102 | - log.info("需要生成考评组人员的考评组:{}", postKpis); | |
100 | + List<EvalGroup> evalGroups = evalGroupUserBizService.postEffectEvalGroups(); | |
101 | + if (! evalGroups.isEmpty()) { | |
102 | + log.info("需要生成考评组人员的考评组:{}", evalGroups); | |
103 | 103 | } |
104 | - Long postId = null; | |
105 | - List<EvalGroup> evalGroups = null; | |
106 | - List<EvalGroupUser> evalGroupUsers = null; | |
107 | 104 | List<EvalGroupUser> evalGroupUsersForSave = Lists.newArrayListWithCapacity(300); |
108 | - for (Map.Entry<Long, List<EvalGroup>> entry : postKpis.entrySet()) { | |
109 | - postId = entry.getKey(); | |
110 | - evalGroups = entry.getValue(); | |
111 | - evalGroupUsers = evalGroupUserBizService.fetchBuildKpiUser(postId, evalGroups, yesterday).stream() | |
112 | - .collect(Collectors.toList()); | |
113 | - evalGroupUsersForSave.addAll(evalGroupUsers); | |
105 | + List<EvalGroupUser> evalGroupUsers = null; | |
106 | + for (EvalGroup evalGroup : evalGroups) { | |
107 | + for (Long postId : evalGroup.getPostIds()) { | |
108 | + evalGroupUsers = evalGroupUserBizService.fetchBuildKpiUser(postId, evalGroups, yesterday); | |
109 | + evalGroupUsersForSave.addAll(evalGroupUsers); | |
110 | + } | |
114 | 111 | } |
115 | 112 | return evalGroupUsersForSave; |
116 | 113 | } | ... | ... |
fw-morax-server/src/main/java/cn/fw/morax/server/task/KpiCalcTask.java
fw-morax-service/pom.xml
... | ... | @@ -105,6 +105,10 @@ |
105 | 105 | <groupId>org.apache.poi</groupId> |
106 | 106 | <artifactId>poi-ooxml</artifactId> |
107 | 107 | </dependency> |
108 | + <dependency> | |
109 | + <groupId>cn.fw</groupId> | |
110 | + <artifactId>fw-morax-sdk</artifactId> | |
111 | + </dependency> | |
108 | 112 | </dependencies> |
109 | 113 | |
110 | 114 | <build> | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupPoolService.java
... | ... | @@ -139,11 +139,11 @@ public class EvalGroupPoolService { |
139 | 139 | this.setIgnore(evalUserPoolVO); |
140 | 140 | evalUserPoolVO.setDataDate(localDate); |
141 | 141 | |
142 | - Eval eval = evalService.getById(pool.getEvalId()); | |
142 | +// Eval eval = evalService.getById(pool.getEvalId()); | |
143 | 143 | // BV.notNull(pool, "考评池不存在"); |
144 | - if (PublicUtil.isNotEmpty(eval)) { | |
145 | - evalUserPoolVO.setEvalType(eval.getType()); | |
146 | - } | |
144 | +// if (PublicUtil.isNotEmpty(eval)) { | |
145 | +// evalUserPoolVO.setEvalType(eval.getType()); | |
146 | +// } | |
147 | 147 | |
148 | 148 | return evalUserPoolVO; |
149 | 149 | } | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupRankBizService.java
... | ... | @@ -71,8 +71,8 @@ public class EvalGroupRankBizService { |
71 | 71 | epiGroupRankVO.setShopIds(new ArrayList<>()); |
72 | 72 | epiGroupRankVO.setShopNames(new HashSet<>()); |
73 | 73 | for (EvalGroup evalGroup : egcGroupMap.get(epiGroupRankVO.getId())) { |
74 | - epiGroupRankVO.getPostIds().add(evalGroup.getPostId()); | |
75 | - epiGroupRankVO.getPostNames().add(evalGroup.getPostName()); | |
74 | + epiGroupRankVO.getPostIds().addAll(evalGroup.getPostIds()); | |
75 | + epiGroupRankVO.getPostNames().addAll(evalGroup.getPostNames()); | |
76 | 76 | epiGroupRankVO.getShopIds().addAll(evalGroup.getShopIds()); |
77 | 77 | epiGroupRankVO.getShopNames().addAll(evalGroup.getShopNames()); |
78 | 78 | } | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupUserBizService.java
... | ... | @@ -52,16 +52,14 @@ public class EvalGroupUserBizService { |
52 | 52 | /** |
53 | 53 | * 所有集团生效的绩效组配置 |
54 | 54 | */ |
55 | - public Map<Long, List<EvalGroup>> postEffectEvalGroups(){ | |
55 | + public List<EvalGroup> postEffectEvalGroups(){ | |
56 | 56 | LocalDate queryDate = LocalDate.now().minusDays(1L); |
57 | 57 | List<EvalGroup> evalGroups = evalGroupService.getAllEffectGroups(queryDate); |
58 | - List<EvalGroup> staffEvalGroups = evalGroups.stream() | |
59 | - .filter(evalGroup -> EvalScopeEnum.STAFF.equals(evalGroup.getScopeType())).collect(Collectors.toList()); | |
60 | - if (PublicUtil.isEmpty(staffEvalGroups)) { | |
58 | + if (PublicUtil.isEmpty(evalGroups)) { | |
61 | 59 | log.info("时间:{},没有正在生效中的考评组配置", DateTimeFormatter.ofPattern("yyyy-MM-dd").format(queryDate)); |
62 | - return Maps.newHashMap(); | |
60 | + return new ArrayList<>(); | |
63 | 61 | } |
64 | - return staffEvalGroups.stream().collect(Collectors.groupingBy(EvalGroup::getPostId)); | |
62 | + return evalGroups; | |
65 | 63 | } |
66 | 64 | |
67 | 65 | /** |
... | ... | @@ -120,6 +118,33 @@ public class EvalGroupUserBizService { |
120 | 118 | } |
121 | 119 | |
122 | 120 | /** |
121 | + * 获取岗位人员 | |
122 | + * | |
123 | + * @param postIds | |
124 | + * @param shopIds | |
125 | + * @param dataDate | |
126 | + * @return | |
127 | + */ | |
128 | + public List<EvalGroupUser> fetchPostUsers(List<Long> postIds, List<Long> shopIds, LocalDate dataDate) { | |
129 | + List<PerformanceStaffDTO> staffs = Lists.newArrayListWithCapacity(100); | |
130 | + for (Long postId : postIds) { | |
131 | + staffs.addAll(ehrRpcService.queryKpiStaff(postId, shopIds)); | |
132 | + } | |
133 | + if (PublicUtil.isEmpty(staffs)) { | |
134 | + return new ArrayList<>(); | |
135 | + } | |
136 | + List<EvalGroupUser> result = Lists.newArrayListWithCapacity(staffs.size()); | |
137 | + | |
138 | + for (PerformanceStaffDTO staff : staffs) { | |
139 | + EvalGroupUser evalGroupUser = this.convertToGroupUser(staff, dataDate); | |
140 | + //处理绩效考核数据 | |
141 | + this.handleStaffKpi(staff, evalGroupUser); | |
142 | + result.add(evalGroupUser); | |
143 | + } | |
144 | + return result; | |
145 | + } | |
146 | + | |
147 | + /** | |
123 | 148 | * 构建绩效组人员 |
124 | 149 | * |
125 | 150 | * @return |
... | ... | @@ -328,8 +353,7 @@ public class EvalGroupUserBizService { |
328 | 353 | public List<EvalGroupUserVO> queryEvalGroupStaffs(Long evalGroupId) { |
329 | 354 | EvalGroup evalGroup = evalGroupService.getById(evalGroupId); |
330 | 355 | BV.notNull(evalGroup, "考评配置不存在,请重试"); |
331 | - BV.isTrue(EvalScopeEnum.STAFF.equals(evalGroup.getScopeType()), "人员考评才能查看考评人员,请重试"); | |
332 | - List<EvalGroupUser> evalGroupUsers = this.fetchPostUsers(evalGroup.getPostId(), evalGroup.getShopIds(), null); | |
356 | + List<EvalGroupUser> evalGroupUsers = this.fetchPostUsers(evalGroup.getPostIds(), evalGroup.getShopIds(), null); | |
333 | 357 | List<EvalGroupUserVO> evalGroupUserVOS = PublicUtil.copyList(evalGroupUsers, EvalGroupUserVO.class); |
334 | 358 | return evalGroupUserVOS; |
335 | 359 | } | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalIndicatorValueBizService.java
... | ... | @@ -585,35 +585,37 @@ public class EvalIndicatorValueBizService { |
585 | 585 | */ |
586 | 586 | public EvalReportVO getEvalImportSnapShoot(List<EvalGroup> evalGroups, Set<Long> manageShopIds, LocalDate dataDate) { |
587 | 587 | EvalReportVO reportVO = new EvalReportVO(); |
588 | - Map<EvalScopeEnum, List<EvalGroup>> evalScopeEnumMap = evalGroups.stream().collect(Collectors.groupingBy(EvalGroup::getScopeType)); | |
588 | +// Map<EvalScopeEnum, List<EvalGroup>> evalScopeEnumMap = evalGroups.stream().collect(Collectors.groupingBy(EvalGroup::getScopeType)); | |
589 | 589 | |
590 | 590 | //人员 |
591 | - List<EvalGroup> staffGroups = evalScopeEnumMap.get(EvalScopeEnum.STAFF); | |
592 | - if (PublicUtil.isNotEmpty(staffGroups)) { | |
593 | - List<EvalIndicatorImportUserVO> importUsers = new ArrayList<>(); | |
594 | - Map<Long, List<EvalGroup>> postEvalGroupMap = staffGroups.stream().collect(Collectors.groupingBy(EvalGroup::getPostId)); | |
595 | - for (Map.Entry<Long, List<EvalGroup>> entry : postEvalGroupMap.entrySet()) { | |
596 | - Long postId = entry.getKey(); | |
597 | - List<Long> shopIds = entry.getValue().stream() | |
598 | - .flatMap(evalGroup -> evalGroup.getShopIds().stream()) | |
599 | - .filter(shopId -> manageShopIds.contains(shopId)) | |
600 | - .distinct().collect(Collectors.toList()); | |
601 | - if (PublicUtil.isNotEmpty(shopIds)) { | |
602 | - //过滤不参加考评员工 | |
603 | - List<EvalGroupUser> users = evalGroupUserBizService.fetchBuildImportUser(postId, shopIds, dataDate) | |
604 | - .stream().filter(evalGroupUser -> ! evalGroupUser.getIgnored()).collect(Collectors.toList()); | |
605 | - if (PublicUtil.isNotEmpty(users)) { | |
606 | - importUsers.addAll(PublicUtil.copyList(users, EvalIndicatorImportUserVO.class)); | |
607 | - } | |
608 | - } | |
609 | - } | |
610 | - reportVO.setUsers(importUsers); | |
611 | - } | |
591 | +// List<EvalGroup> staffGroups = evalScopeEnumMap.get(EvalScopeEnum.STAFF); | |
592 | +// if (PublicUtil.isNotEmpty(staffGroups)) { | |
593 | + | |
594 | + | |
595 | + | |
596 | +// List<EvalIndicatorImportUserVO> importUsers = new ArrayList<>(); | |
597 | +// Map<Long, List<EvalGroup>> postEvalGroupMap = evalGroups.stream().collect(Collectors.groupingBy(EvalGroup::getPostId)); | |
598 | +// for (Map.Entry<Long, List<EvalGroup>> entry : postEvalGroupMap.entrySet()) { | |
599 | +// Long postId = entry.getKey(); | |
600 | +// List<Long> shopIds = entry.getValue().stream() | |
601 | +// .flatMap(evalGroup -> evalGroup.getShopIds().stream()) | |
602 | +// .filter(shopId -> manageShopIds.contains(shopId)) | |
603 | +// .distinct().collect(Collectors.toList()); | |
604 | +// if (PublicUtil.isNotEmpty(shopIds)) { | |
605 | +// //过滤不参加考评员工 | |
606 | +// List<EvalGroupUser> users = evalGroupUserBizService.fetchBuildImportUser(postId, shopIds, dataDate) | |
607 | +// .stream().filter(evalGroupUser -> ! evalGroupUser.getIgnored()).collect(Collectors.toList()); | |
608 | +// if (PublicUtil.isNotEmpty(users)) { | |
609 | +// importUsers.addAll(PublicUtil.copyList(users, EvalIndicatorImportUserVO.class)); | |
610 | +// } | |
611 | +// } | |
612 | +// } | |
613 | +// reportVO.setUsers(importUsers); | |
614 | +// } | |
612 | 615 | |
613 | 616 | //门店 |
614 | - List<EvalGroup> shopGroups = evalScopeEnumMap.get(EvalScopeEnum.SHOP); | |
615 | - if (PublicUtil.isNotEmpty(shopGroups)) { | |
616 | - List<Long> shopGroupIds = shopGroups.stream().flatMap(evalGroup -> evalGroup.getShopIds().stream()) | |
617 | +// List<EvalGroup> shopGroups = evalScopeEnumMap.get(EvalScopeEnum.SHOP); | |
618 | + List<Long> shopGroupIds = evalGroups.stream().flatMap(evalGroup -> evalGroup.getShopIds().stream()) | |
617 | 619 | .filter(shopId -> manageShopIds.contains(shopId)) |
618 | 620 | .distinct().collect(Collectors.toList()); |
619 | 621 | if (PublicUtil.isNotEmpty(shopGroupIds)) { |
... | ... | @@ -624,7 +626,6 @@ public class EvalIndicatorValueBizService { |
624 | 626 | } |
625 | 627 | reportVO.setShops(evalShops); |
626 | 628 | } |
627 | - } | |
628 | 629 | |
629 | 630 | return reportVO; |
630 | 631 | } | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalPoolCommonService.java
... | ... | @@ -204,7 +204,7 @@ public class EvalPoolCommonService { |
204 | 204 | @Transactional(rollbackFor = Exception.class) |
205 | 205 | public EvalUserPool createUserPoolData(EvalGroupUser user) { |
206 | 206 | EvalUserPool evalUserPool = new EvalUserPool(); |
207 | - evalUserPool.setEvalId(user.getEvalGroupRankId()); | |
207 | +// evalUserPool.setEvalId(user.getEvalGroupRankId()); | |
208 | 208 | evalUserPool.setEgc(user.getEgc()); |
209 | 209 | evalUserPool.setEvalGroupId(user.getEvalGroupId()); |
210 | 210 | evalUserPool.setUserId(user.getUserId()); | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalPoolService.java
... | ... | @@ -70,9 +70,9 @@ public class EvalPoolService { |
70 | 70 | .in(EvalGroup::getId, userPools.stream().map(EvalUserPoolVO::getEvalGroupId).collect(Collectors.toSet())) |
71 | 71 | .eq(EvalGroup::getYn, Boolean.TRUE) |
72 | 72 | ); |
73 | - Map<Long, String> evalGroupNameMap = evalGroups.stream().collect(Collectors.toMap(EvalGroup::getId, EvalGroup::getName)); | |
73 | +// Map<Long, String> evalGroupNameMap = evalGroups.stream().collect(Collectors.toMap(EvalGroup::getId, EvalGroup::getName)); | |
74 | 74 | for (EvalUserPoolVO userPool : userPools) { |
75 | - userPool.setEvalGroupName(evalGroupNameMap.getOrDefault(userPool.getEvalGroupId(), "")); | |
75 | +// userPool.setEvalGroupName(evalGroupNameMap.getOrDefault(userPool.getEvalGroupId(), "")); | |
76 | 76 | userPool.convertScoreRatio(); |
77 | 77 | } |
78 | 78 | page.setData(userPools); |
... | ... | @@ -114,9 +114,9 @@ public class EvalPoolService { |
114 | 114 | .in(EvalGroup::getId, shopPools.stream().map(EvalShopPoolVO::getEvalGroupId).collect(Collectors.toSet())) |
115 | 115 | .eq(EvalGroup::getYn, Boolean.TRUE) |
116 | 116 | ); |
117 | - Map<Long, String> evalGroupNameMap = evalGroups.stream().collect(Collectors.toMap(EvalGroup::getId, EvalGroup::getName)); | |
117 | +// Map<Long, String> evalGroupNameMap = evalGroups.stream().collect(Collectors.toMap(EvalGroup::getId, EvalGroup::getName)); | |
118 | 118 | for (EvalShopPoolVO shopPool : shopPools) { |
119 | - shopPool.setEvalGroupName(evalGroupNameMap.getOrDefault(shopPool.getEvalGroupId(), "")); | |
119 | +// shopPool.setEvalGroupName(evalGroupNameMap.getOrDefault(shopPool.getEvalGroupId(), "")); | |
120 | 120 | shopPool.convertScoreRatio(); |
121 | 121 | } |
122 | 122 | page.setData(shopPools); | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalRewardService.java
... | ... | @@ -170,75 +170,75 @@ public class EvalRewardService { |
170 | 170 | */ |
171 | 171 | @Transactional(rollbackFor = Exception.class) |
172 | 172 | public void sendDistRewardTodo(List<EvalShopPool> pools, EvalGroup evalGroup) { |
173 | - Eval eval = evalService.getById(evalGroup.getEvalGroupRankId()); | |
174 | - BV.notNull(eval, "考评配置不存在,请重试"); | |
175 | - | |
176 | - DecimalFormat decimalFormat = new DecimalFormat("##########.##"); | |
177 | - final String roleCode = evalGroup.getRoleCodes().stream().findFirst().get(); | |
178 | - final String evalGroupName = evalGroup.getName(); | |
179 | - final String evalName = eval.getName(); | |
180 | - final EvalTypeEnum evalType = eval.getType(); | |
181 | - List<Long> shopIds = evalGroup.getShopIds(); | |
182 | - | |
183 | - Date expireTime = DateUtil.localDateTime2Date(LocalDateTime.now().plusDays(2L)); | |
184 | - | |
185 | - List<BacklogBatchPlanItemReqDTO> itemList = new ArrayList<>(); | |
186 | - List<RpcUserRoleInfoDTO> users = this.getUserEnableRoleInfos(roleCode, shopIds); | |
187 | - for (RpcUserRoleInfoDTO user : users) { | |
188 | - List<Long> manageShopIds = user.getRangeList().stream() | |
189 | - .filter(range -> shopIds.contains(range.getShopId())) | |
190 | - .map(RpcUserRoleShopDTO::getShopId).distinct().collect(Collectors.toList()); | |
191 | - if (PublicUtil.isEmpty(manageShopIds)) { | |
192 | - continue; | |
193 | - } | |
194 | - | |
195 | - List<Long> poolIds = new ArrayList<>(); | |
196 | - BigDecimal reward = BigDecimal.ZERO; | |
197 | - for (EvalShopPool pool : pools) { | |
198 | - if (manageShopIds.contains(pool.getShopId())) { | |
199 | - poolIds.add(pool.getId()); | |
200 | - reward = reward.add(pool.getReward()); | |
201 | - } | |
202 | - } | |
203 | - //奖惩为0不分配 | |
204 | - if (BigDecimal.ZERO.compareTo(reward) == 0) { | |
205 | - return; | |
206 | - } | |
207 | - | |
208 | - EvalRewardDist rewardDist = transferPo(evalGroup); | |
209 | - rewardDist.setUserId(user.getUserId()); | |
210 | - rewardDist.setEvalShopPoolIds(poolIds); | |
211 | - rewardDist.setShopIds(manageShopIds); | |
212 | - rewardDist.setEvalName(evalName); | |
213 | - rewardDist.setEvalType(evalType); | |
214 | - rewardDist.setReward(reward); | |
215 | - evalRewardDistService.save(rewardDist); | |
216 | - | |
217 | - BacklogBatchPlanItemReqDTO planItemReq = new BacklogBatchPlanItemReqDTO(); | |
218 | - planItemReq.setDataId(rewardDist.getId().toString()); | |
219 | - planItemReq.setUserId(user.getUserId()); | |
220 | - planItemReq.setPlanTime(new Date()); | |
221 | - planItemReq.setExpireTime(expireTime); | |
222 | - | |
223 | - Map<String, String> dynamicMap = new HashMap<>(8); | |
224 | - dynamicMap.put("evalGroupName", evalGroupName); | |
225 | - dynamicMap.put("evalName", evalName); | |
226 | - dynamicMap.put("evalType", evalType.getName()); | |
227 | - dynamicMap.put("amount", decimalFormat.format(rewardDist.getReward())); | |
228 | - planItemReq.setDynamicMap(dynamicMap); | |
229 | - | |
230 | - Map<String, Object> extraData = new HashMap<>(); | |
231 | - planItemReq.setExtraData(extraData); | |
232 | - itemList.add(planItemReq); | |
233 | - } | |
234 | - | |
235 | - | |
236 | - //推送待办 | |
237 | - BacklogBatchPlanReqDTO batchPlanReq = new BacklogBatchPlanReqDTO(todoVal.getDistEvalReward(), itemList); | |
238 | - List<FailBacklogItem> failItems = Optional.ofNullable(todoRpcService.batchPush(batchPlanReq)).orElse(new ArrayList<>()); | |
239 | - if (PublicUtil.isNotEmpty(failItems)) { | |
240 | - log.error("发送分配考评奖励待办失败,失败人员信息:{}", JSON.toJSONString(failItems)); | |
241 | - } | |
173 | +// Eval eval = evalService.getById(evalGroup.getEvalGroupRankId()); | |
174 | +// BV.notNull(eval, "考评配置不存在,请重试"); | |
175 | +// | |
176 | +// DecimalFormat decimalFormat = new DecimalFormat("##########.##"); | |
177 | +// final String roleCode = evalGroup.getRoleCodes().stream().findFirst().get(); | |
178 | +// final String evalGroupName = evalGroup.getName(); | |
179 | +// final String evalName = eval.getName(); | |
180 | +// final EvalTypeEnum evalType = eval.getType(); | |
181 | +// List<Long> shopIds = evalGroup.getShopIds(); | |
182 | +// | |
183 | +// Date expireTime = DateUtil.localDateTime2Date(LocalDateTime.now().plusDays(2L)); | |
184 | +// | |
185 | +// List<BacklogBatchPlanItemReqDTO> itemList = new ArrayList<>(); | |
186 | +// List<RpcUserRoleInfoDTO> users = this.getUserEnableRoleInfos(roleCode, shopIds); | |
187 | +// for (RpcUserRoleInfoDTO user : users) { | |
188 | +// List<Long> manageShopIds = user.getRangeList().stream() | |
189 | +// .filter(range -> shopIds.contains(range.getShopId())) | |
190 | +// .map(RpcUserRoleShopDTO::getShopId).distinct().collect(Collectors.toList()); | |
191 | +// if (PublicUtil.isEmpty(manageShopIds)) { | |
192 | +// continue; | |
193 | +// } | |
194 | +// | |
195 | +// List<Long> poolIds = new ArrayList<>(); | |
196 | +// BigDecimal reward = BigDecimal.ZERO; | |
197 | +// for (EvalShopPool pool : pools) { | |
198 | +// if (manageShopIds.contains(pool.getShopId())) { | |
199 | +// poolIds.add(pool.getId()); | |
200 | +// reward = reward.add(pool.getReward()); | |
201 | +// } | |
202 | +// } | |
203 | +// //奖惩为0不分配 | |
204 | +// if (BigDecimal.ZERO.compareTo(reward) == 0) { | |
205 | +// return; | |
206 | +// } | |
207 | +// | |
208 | +// EvalRewardDist rewardDist = transferPo(evalGroup); | |
209 | +// rewardDist.setUserId(user.getUserId()); | |
210 | +// rewardDist.setEvalShopPoolIds(poolIds); | |
211 | +// rewardDist.setShopIds(manageShopIds); | |
212 | +// rewardDist.setEvalName(evalName); | |
213 | +// rewardDist.setEvalType(evalType); | |
214 | +// rewardDist.setReward(reward); | |
215 | +// evalRewardDistService.save(rewardDist); | |
216 | +// | |
217 | +// BacklogBatchPlanItemReqDTO planItemReq = new BacklogBatchPlanItemReqDTO(); | |
218 | +// planItemReq.setDataId(rewardDist.getId().toString()); | |
219 | +// planItemReq.setUserId(user.getUserId()); | |
220 | +// planItemReq.setPlanTime(new Date()); | |
221 | +// planItemReq.setExpireTime(expireTime); | |
222 | +// | |
223 | +// Map<String, String> dynamicMap = new HashMap<>(8); | |
224 | +// dynamicMap.put("evalGroupName", evalGroupName); | |
225 | +// dynamicMap.put("evalName", evalName); | |
226 | +// dynamicMap.put("evalType", evalType.getName()); | |
227 | +// dynamicMap.put("amount", decimalFormat.format(rewardDist.getReward())); | |
228 | +// planItemReq.setDynamicMap(dynamicMap); | |
229 | +// | |
230 | +// Map<String, Object> extraData = new HashMap<>(); | |
231 | +// planItemReq.setExtraData(extraData); | |
232 | +// itemList.add(planItemReq); | |
233 | +// } | |
234 | +// | |
235 | +// | |
236 | +// //推送待办 | |
237 | +// BacklogBatchPlanReqDTO batchPlanReq = new BacklogBatchPlanReqDTO(todoVal.getDistEvalReward(), itemList); | |
238 | +// List<FailBacklogItem> failItems = Optional.ofNullable(todoRpcService.batchPush(batchPlanReq)).orElse(new ArrayList<>()); | |
239 | +// if (PublicUtil.isNotEmpty(failItems)) { | |
240 | +// log.error("发送分配考评奖励待办失败,失败人员信息:{}", JSON.toJSONString(failItems)); | |
241 | +// } | |
242 | 242 | |
243 | 243 | // if (PublicUtil.isEmpty(failItems) || itemList.size() > failItems.size()) { |
244 | 244 | // pool.setStatus(EvalShopPoolStatusEnum.WAIT_DIST_REWARD); |
... | ... | @@ -250,7 +250,7 @@ public class EvalRewardService { |
250 | 250 | EvalRewardDist rewardDist = new EvalRewardDist(); |
251 | 251 | rewardDist.setEvalId(evalGroup.getEvalGroupRankId()); |
252 | 252 | rewardDist.setEvalGroupId(evalGroup.getId()); |
253 | - rewardDist.setEvalGroupName(evalGroup.getName()); | |
253 | +// rewardDist.setEvalGroupName(evalGroup.getName()); | |
254 | 254 | rewardDist.setStatus(EvalRewardDistStatusEnum.NO_DIST); |
255 | 255 | rewardDist.setGroupId(evalGroup.getGroupId()); |
256 | 256 | rewardDist.setYn(Boolean.TRUE); | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/kpi/IndicatorBizService.java
... | ... | @@ -10,6 +10,7 @@ import cn.fw.morax.common.utils.DateUtil; |
10 | 10 | import cn.fw.morax.common.utils.PublicUtil; |
11 | 11 | import cn.fw.morax.common.utils.ThreadPoolUtil; |
12 | 12 | import cn.fw.morax.domain.bo.kpi.ShopIndicatorBO; |
13 | +import cn.fw.morax.domain.bo.kpi.ShopIndicatorStageBO; | |
13 | 14 | import cn.fw.morax.domain.bo.kpi.UserIndicatorBO; |
14 | 15 | import cn.fw.morax.domain.bo.kpi.UserIndicatorStageBO; |
15 | 16 | import cn.fw.morax.domain.db.eval.EvalGroup; |
... | ... | @@ -33,10 +34,7 @@ import cn.fw.morax.rpc.ehr.EhrRpcService; |
33 | 34 | import cn.fw.morax.rpc.ehr.dto.PostInfoDTO; |
34 | 35 | import cn.fw.morax.rpc.ehr.dto.PostRoleDTO; |
35 | 36 | import cn.fw.morax.sdk.dto.CustomList; |
36 | -import cn.fw.morax.sdk.dto.common.IndicatorShopValueReq; | |
37 | -import cn.fw.morax.sdk.dto.common.IndicatorStageValueReq; | |
38 | -import cn.fw.morax.sdk.dto.common.IndicatorValueDTO; | |
39 | -import cn.fw.morax.sdk.dto.common.IndicatorValueReq; | |
37 | +import cn.fw.morax.sdk.dto.common.*; | |
40 | 38 | import cn.fw.morax.service.data.CombineIndicatorParamService; |
41 | 39 | import cn.fw.morax.service.data.eval.EvalGroupIndicatorParamService; |
42 | 40 | import cn.fw.morax.service.data.eval.EvalGroupIndicatorPreconditionService; |
... | ... | @@ -107,6 +105,9 @@ public class IndicatorBizService { |
107 | 105 | @Value("${spring.cache.custom.global-prefix}:indicator-stage-value") |
108 | 106 | @Getter |
109 | 107 | private String indicatorStageKeyPref; |
108 | + @Value("${spring.cache.custom.global-prefix}:indicator-shop-stage-value") | |
109 | + @Getter | |
110 | + private String indicatorShopStageKeyPref; | |
110 | 111 | |
111 | 112 | /** |
112 | 113 | * 分页查询 |
... | ... | @@ -433,6 +434,21 @@ public class IndicatorBizService { |
433 | 434 | } |
434 | 435 | |
435 | 436 | /** |
437 | + * 收集业务系统上报的数据 | |
438 | + * 先直接放到redis增加系统吞吐量 | |
439 | + * | |
440 | + * @param shopIndicatorList | |
441 | + */ | |
442 | + public void reportStageShopData(CustomList<IndicatorShopStageValueReq> shopIndicatorList) { | |
443 | + String[] jsonArr = shopIndicatorList.stream().map(r -> { | |
444 | + ShopIndicatorStageBO bo = transferShopBo(r); | |
445 | + return JSONObject.toJSONString(bo); | |
446 | + }).toArray(String[]::new); | |
447 | + BoundListOperations<String, String> opsList = stringRedisTemplate.boundListOps(getIndicatorShopStageKeyPref()); | |
448 | + opsList.rightPushAll(jsonArr); | |
449 | + } | |
450 | + | |
451 | + /** | |
436 | 452 | * 从缓存取池上报的数据并进行持久化 |
437 | 453 | */ |
438 | 454 | public void persistenceShopData() { |
... | ... | @@ -500,6 +516,76 @@ public class IndicatorBizService { |
500 | 516 | } |
501 | 517 | |
502 | 518 | /** |
519 | + * 从缓存取池上报的数据并进行持久化 | |
520 | + */ | |
521 | + public void persistenceShopStageData() { | |
522 | + ThreadPoolExecutor threadPool = ThreadPoolUtil.getInstance().getThreadPool(); | |
523 | + ListOperations<String, String> opsForList = stringRedisTemplate.opsForList(); | |
524 | + List<String> overflowsOrFailList = new ArrayList<>(); | |
525 | + String jsonStr; | |
526 | + while ((jsonStr = opsForList.leftPop(getIndicatorShopStageKeyPref())) != null) { | |
527 | + final ShopIndicatorStageBO bo = JSONObject.parseObject(jsonStr, ShopIndicatorStageBO.class); | |
528 | + if (Objects.isNull(bo)) { | |
529 | + continue; | |
530 | + } | |
531 | + try { | |
532 | + //保存业务系统绩效指标值 | |
533 | + final String finalJsonStr = jsonStr; | |
534 | + threadPool.execute(() -> { | |
535 | + try { | |
536 | + saveShopStageIndicator(bo); | |
537 | + } catch (Exception e) { | |
538 | + log.error("保存业务系统绩效指标值失败:{}", bo, e); | |
539 | + overflowsOrFailList.add(finalJsonStr); | |
540 | + } | |
541 | + }); | |
542 | + } catch (RejectedExecutionException re) { | |
543 | + overflowsOrFailList.add(jsonStr); | |
544 | + } | |
545 | + } | |
546 | + if (!CollectionUtils.isEmpty(overflowsOrFailList)) { | |
547 | + opsForList.rightPushAll(getIndicatorShopKeyPref(), overflowsOrFailList); | |
548 | + } | |
549 | + } | |
550 | + | |
551 | + /** | |
552 | + * 持久化业务系统上报的指标数据 | |
553 | + * | |
554 | + * @param bo | |
555 | + */ | |
556 | + @Transactional(rollbackFor = Exception.class) | |
557 | + public void saveShopStageIndicator(ShopIndicatorStageBO bo) { | |
558 | + final LocalDate beginDate = DateUtil.date2LocalDate(bo.getBeginDate()); | |
559 | + final LocalDate endDate = DateUtil.date2LocalDate(bo.getEndDate()); | |
560 | + Indicators indicator = indicatorsService.queryByCode(bo.getIndicatorCode(), Boolean.FALSE); | |
561 | + if (Objects.isNull(indicator)) { | |
562 | + return; | |
563 | + } | |
564 | + IndicatorUserStageValue value = new IndicatorUserStageValue(); | |
565 | + value.setUserId(-1L); | |
566 | + value.setShopId(bo.getShopId()); | |
567 | + value.setDimensionType(DimensionTypeEnum.SHOP); | |
568 | + value.setIndicatorCode(indicator.getIndicatorCode()); | |
569 | + value.setIndicatorName(indicator.getIndicatorName()); | |
570 | + IndicatorValueTypeEnum valueTypeEnum = IndicatorValueTypeEnum.ofValue(bo.getValueType()); | |
571 | + value.setValueType(valueTypeEnum); | |
572 | + Map<String, BigDecimal> valueMap = bo.getValue(); | |
573 | + value.setIndicatorValue(JSONObject.toJSONString(valueMap)); | |
574 | + value.setBeginDate(beginDate); | |
575 | + value.setEndDate(endDate); | |
576 | + value.setGroupId(bo.getGroupId()); | |
577 | + value.setYn(Boolean.TRUE); | |
578 | + indicatorUserStageValueService.remove(Wrappers.<IndicatorUserStageValue>lambdaQuery() | |
579 | + .eq(IndicatorUserStageValue::getShopId, value.getShopId()) | |
580 | + .eq(IndicatorUserStageValue::getIndicatorCode, value.getIndicatorCode()) | |
581 | + .eq(IndicatorUserStageValue::getBeginDate, beginDate) | |
582 | + .eq(IndicatorUserStageValue::getEndDate, beginDate) | |
583 | + .eq(IndicatorUserStageValue::getGroupId, value.getGroupId()) | |
584 | + ); | |
585 | + indicatorUserStageValueService.save(value); | |
586 | + } | |
587 | + | |
588 | + /** | |
503 | 589 | * 检查指标角色配置 |
504 | 590 | * |
505 | 591 | * @param dto |
... | ... | @@ -758,6 +844,34 @@ public class IndicatorBizService { |
758 | 844 | return bo; |
759 | 845 | } |
760 | 846 | |
847 | + /** | |
848 | + * 转换数据 | |
849 | + * | |
850 | + * @param req | |
851 | + * @return | |
852 | + */ | |
853 | + private ShopIndicatorStageBO transferShopBo(IndicatorShopStageValueReq req) { | |
854 | + ShopIndicatorStageBO bo = new ShopIndicatorStageBO(); | |
855 | + bo.setIndicatorCode(req.getIndicatorCode()); | |
856 | + bo.setShopId(req.getShopId()); | |
857 | + bo.setBeginDate(req.getBeginDate()); | |
858 | + bo.setEndDate(req.getEndDate()); | |
859 | + bo.setGroupId(req.getGroupId()); | |
860 | + IndicatorValueTypeEnum typeEnum = IndicatorValueTypeEnum.ofValue(req.getValueType()); | |
861 | + bo.setValueType(req.getValueType()); | |
862 | + List<IndicatorValueDTO> valueList = req.getIndicatorValue(); | |
863 | + Map<String, BigDecimal> map = new HashMap<>(valueList.size()); | |
864 | + for (IndicatorValueDTO valueDTO : valueList) { | |
865 | + String key = req.getIndicatorCode(); | |
866 | + if (IndicatorValueTypeEnum.CONDITION.equals(typeEnum)) { | |
867 | + key = valueDTO.getKey(); | |
868 | + } | |
869 | + map.put(key, valueDTO.getValue()); | |
870 | + } | |
871 | + bo.setValue(map); | |
872 | + return bo; | |
873 | + } | |
874 | + | |
761 | 875 | |
762 | 876 | /** |
763 | 877 | * 获取带条件的绩效指标库 | ... | ... |
pom.xml
... | ... | @@ -32,7 +32,7 @@ |
32 | 32 | <mysql-connector-java.version>5.1.47</mysql-connector-java.version> |
33 | 33 | <HikariCP.version>3.3.1</HikariCP.version> |
34 | 34 | <!-- fw --> |
35 | - <fw.morax.sdk.version>2.0.1</fw.morax.sdk.version> | |
35 | + <fw.morax.sdk.version>2.0.2</fw.morax.sdk.version> | |
36 | 36 | <rocketmq-spring-boot-starter.version>2.1.0</rocketmq-spring-boot-starter.version> |
37 | 37 | <redis.spring.boot.starter>2.0</redis.spring.boot.starter> |
38 | 38 | <fw-approval-sdk.version>1.0.0</fw-approval-sdk.version> | ... | ... |