-
mentioned in commit e50dcf17
Showing
16 changed files
fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalGroupRankStageDao.java
fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalUserExtraReportDao.java
0 → 100644
1 | +package cn.fw.morax.dao.eval; | |
2 | + | |
3 | + | |
4 | +import cn.fw.morax.domain.db.eval.EvalUserExtraReport; | |
5 | +import cn.fw.morax.domain.db.eval.EvalUserReport; | |
6 | +import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |
7 | + | |
8 | +/** | |
9 | + * <p> | |
10 | + * 报表编码数据 Mapper 接口 | |
11 | + * </p> | |
12 | + * | |
13 | + * @author jiangchao | |
14 | + * @since 2023-03-31 | |
15 | + */ | |
16 | +public interface EvalUserExtraReportDao extends BaseMapper<EvalUserExtraReport> { | |
17 | + | |
18 | +} | ... | ... |
fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalUserRankStageReportDao.java
0 → 100644
1 | +package cn.fw.morax.dao.eval; | |
2 | + | |
3 | + | |
4 | +import cn.fw.morax.domain.db.eval.EvalUserRankStageReport; | |
5 | +import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |
6 | + | |
7 | +/** | |
8 | + * <p> | |
9 | + * 报表绩效排名组 Mapper 接口 | |
10 | + * </p> | |
11 | + * | |
12 | + * @author jiangchao | |
13 | + * @since 2023-03-31 | |
14 | + */ | |
15 | +public interface EvalUserRankStageReportDao extends BaseMapper<EvalUserRankStageReport> { | |
16 | + | |
17 | +} | ... | ... |
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalUserExtraReport.java
0 → 100644
1 | +package cn.fw.morax.domain.db.eval; | |
2 | + | |
3 | +import cn.fw.common.data.entity.BaseEntity; | |
4 | +import cn.fw.common.data.mybatis.handler.LongListTypeHandler; | |
5 | +import cn.fw.common.data.mybatis.handler.StringListTypeHandler; | |
6 | +import com.baomidou.mybatisplus.annotation.TableField; | |
7 | +import com.baomidou.mybatisplus.annotation.TableName; | |
8 | +import lombok.*; | |
9 | +import lombok.experimental.Accessors; | |
10 | + | |
11 | +import java.util.List; | |
12 | + | |
13 | +/** | |
14 | + * <p> | |
15 | + * 报表编码维度数据表(额外数据) | |
16 | + * </p> | |
17 | + * | |
18 | + * @author jiangchao | |
19 | + * @since 2023-04-17 | |
20 | + */ | |
21 | +@Data | |
22 | +@EqualsAndHashCode(callSuper = false) | |
23 | +@Accessors(chain = true) | |
24 | +@TableName(autoResultMap = true) | |
25 | +@Builder | |
26 | +@NoArgsConstructor | |
27 | +@AllArgsConstructor | |
28 | +public class EvalUserExtraReport extends BaseEntity<EvalUserExtraReport, Long> { | |
29 | + | |
30 | + private static final long serialVersionUID = 1L; | |
31 | + | |
32 | + /** | |
33 | + * 考评报表id | |
34 | + */ | |
35 | + private Long evalUserReportId; | |
36 | + | |
37 | + /** | |
38 | + * 适用门店ids | |
39 | + */ | |
40 | + @TableField(typeHandler = LongListTypeHandler.class) | |
41 | + private List<Long> shopIds; | |
42 | + | |
43 | + /** | |
44 | + * 人员ids | |
45 | + */ | |
46 | + @TableField(typeHandler = LongListTypeHandler.class) | |
47 | + private List<Long> staffIds; | |
48 | + | |
49 | + /** | |
50 | + * 适用角色编码 | |
51 | + */ | |
52 | + @TableField(typeHandler = StringListTypeHandler.class) | |
53 | + private List<String> roleCodes; | |
54 | + /** | |
55 | + * 适用角色名称 | |
56 | + */ | |
57 | + @TableField(typeHandler = StringListTypeHandler.class) | |
58 | + private List<String> roleNames; | |
59 | + | |
60 | +} | ... | ... |
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalUserRankCodeReport.java
... | ... | @@ -31,6 +31,11 @@ public class EvalUserRankCodeReport extends BaseEntity<EvalUserRankCodeReport, L |
31 | 31 | private Long evalUserRankReportId; |
32 | 32 | |
33 | 33 | /** |
34 | + * 报表考评排名组阶段id | |
35 | + */ | |
36 | + private Long evalUserRankStageReportId; | |
37 | + | |
38 | + /** | |
34 | 39 | * 考评指标id |
35 | 40 | */ |
36 | 41 | private Long evalGroupIndicatorId; | ... | ... |
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalUserRankReport.java
... | ... | @@ -39,17 +39,14 @@ public class EvalUserRankReport extends BaseEntity<EvalUserRankReport, Long> { |
39 | 39 | private String rankName; |
40 | 40 | |
41 | 41 | /** |
42 | - * 考评组id | |
42 | + * 多阶段 | |
43 | 43 | */ |
44 | - @TableField(typeHandler = LongListTypeHandler.class) | |
45 | - private List<Long> evalGroupIds; | |
44 | + private Boolean multiStage; | |
46 | 45 | |
47 | 46 | /** |
48 | - * 考评所有门店id | |
47 | + * 门店 | |
49 | 48 | */ |
50 | - @TableField(typeHandler = LongListTypeHandler.class) | |
51 | 49 | private List<Long> shopIds; |
52 | - | |
53 | 50 | /** |
54 | 51 | * 集团id |
55 | 52 | */ | ... | ... |
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalUserRankStageReport.java
0 → 100644
1 | +package cn.fw.morax.domain.db.eval; | |
2 | + | |
3 | +import cn.fw.common.data.entity.BaseEntity; | |
4 | +import cn.fw.common.data.mybatis.handler.LongListTypeHandler; | |
5 | +import com.baomidou.mybatisplus.annotation.TableField; | |
6 | +import com.baomidou.mybatisplus.annotation.TableName; | |
7 | +import lombok.Data; | |
8 | +import lombok.EqualsAndHashCode; | |
9 | +import lombok.experimental.Accessors; | |
10 | + | |
11 | +import java.time.LocalDate; | |
12 | +import java.time.LocalDateTime; | |
13 | +import java.time.YearMonth; | |
14 | +import java.util.List; | |
15 | + | |
16 | +/** | |
17 | + * <p> | |
18 | + * 报表绩效排名组 | |
19 | + * </p> | |
20 | + * | |
21 | + * @author jiangchao | |
22 | + * @since 2023-03-31 | |
23 | + */ | |
24 | +@Data | |
25 | +@EqualsAndHashCode(callSuper = false) | |
26 | +@Accessors(chain = true) | |
27 | +@TableName(autoResultMap = true) | |
28 | +public class | |
29 | +EvalUserRankStageReport extends BaseEntity<EvalUserRankStageReport, Long> { | |
30 | + | |
31 | + private static final long serialVersionUID = 1L; | |
32 | + | |
33 | + /** | |
34 | + * 报表考评排名组id | |
35 | + */ | |
36 | + private Long evalUserRankReportId; | |
37 | + | |
38 | + /** | |
39 | + * 考评排名组id | |
40 | + */ | |
41 | + private Long evalGroupRankId; | |
42 | + | |
43 | + /** | |
44 | + * 考评排名组阶段id | |
45 | + */ | |
46 | + private Long evalGroupRankStageId; | |
47 | + | |
48 | + /** | |
49 | + * 考评排名组阶段名称 | |
50 | + */ | |
51 | + private String stageName; | |
52 | + | |
53 | + /** | |
54 | + * 考评组id | |
55 | + */ | |
56 | + @TableField(typeHandler = LongListTypeHandler.class) | |
57 | + private List<Long> evalGroupIds; | |
58 | + | |
59 | + /** | |
60 | + * 生效时间 | |
61 | + */ | |
62 | + private LocalDateTime beginTime; | |
63 | + | |
64 | + /** | |
65 | + * 结束时间 | |
66 | + */ | |
67 | + private LocalDateTime overTime; | |
68 | + | |
69 | +} | ... | ... |
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalUserReport.java
... | ... | @@ -34,6 +34,11 @@ public class EvalUserReport extends BaseEntity<EvalUserReport, Long> { |
34 | 34 | private Long evalUserRankReportId; |
35 | 35 | |
36 | 36 | /** |
37 | + * 报表考评排名组阶段id | |
38 | + */ | |
39 | + private Long evalUserRankStageReportId; | |
40 | + | |
41 | + /** | |
37 | 42 | * 维度 |
38 | 43 | */ |
39 | 44 | private ReportDimensionEnum dimension; |
... | ... | @@ -78,16 +83,31 @@ public class EvalUserReport extends BaseEntity<EvalUserReport, Long> { |
78 | 83 | */ |
79 | 84 | private LocalDate dataDate; |
80 | 85 | |
81 | -// /** | |
82 | -// * 月份 | |
83 | -// */ | |
84 | -// private YearMonth monthly; | |
86 | + /** | |
87 | + * 考评奖惩 | |
88 | + */ | |
89 | + private BigDecimal reward; | |
90 | + | |
91 | + /** | |
92 | + * 考评得分 | |
93 | + */ | |
94 | + private BigDecimal score; | |
95 | + | |
96 | + /** | |
97 | + * 考评得分率 | |
98 | + */ | |
99 | + private BigDecimal scoreRatio; | |
85 | 100 | |
86 | 101 | /** |
87 | 102 | * 绩效池id |
88 | 103 | */ |
89 | 104 | private Long evalUserPoolId; |
90 | 105 | |
106 | + /** | |
107 | + * 绩效池id | |
108 | + */ | |
109 | + private Long evalShopPoolId; | |
110 | + | |
91 | 111 | public EvalUserReport() { |
92 | 112 | } |
93 | 113 | ... | ... |
fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalUserReportTask.java
... | ... | @@ -3,18 +3,32 @@ package cn.fw.morax.server.task; |
3 | 3 | import cn.fw.common.cache.locker.DistributedLocker; |
4 | 4 | import cn.fw.morax.common.constant.Constant; |
5 | 5 | import cn.fw.morax.common.constant.TimeTaskConstant; |
6 | +import cn.fw.morax.common.utils.DateUtil; | |
6 | 7 | import cn.fw.morax.common.utils.PublicUtil; |
8 | +import cn.fw.morax.domain.bo.salary.SalaryGroupProjectBO; | |
7 | 9 | import cn.fw.morax.domain.db.eval.*; |
8 | 10 | import cn.fw.morax.domain.db.kpi.IndicatorUserValue; |
11 | +import cn.fw.morax.domain.db.salary.ReportSalaryDim; | |
12 | +import cn.fw.morax.domain.db.salary.ReportSalaryDimExtra; | |
13 | +import cn.fw.morax.domain.db.salary.ReportSalaryDimValue; | |
14 | +import cn.fw.morax.domain.db.salary.SalaryPool; | |
9 | 15 | import cn.fw.morax.domain.enums.*; |
16 | +import cn.fw.morax.domain.vo.salary.SalaryGroupProjectParamVO; | |
17 | +import cn.fw.morax.rpc.ehr.EhrRpcService; | |
18 | +import cn.fw.morax.rpc.ehr.dto.ManagerDTO; | |
19 | +import cn.fw.morax.rpc.ehr.dto.ManagerStaffRoleDTO; | |
20 | +import cn.fw.morax.rpc.ehr.dto.ManagerStaffShopDTO; | |
21 | +import cn.fw.morax.rpc.ehr.dto.StaffBaseInfoDTO; | |
10 | 22 | import cn.fw.morax.service.biz.CommonService; |
11 | 23 | import cn.fw.morax.service.data.eval.*; |
12 | 24 | import cn.fw.morax.service.data.kpi.IndicatorUserValueService; |
25 | +import com.alibaba.fastjson.JSON; | |
13 | 26 | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
14 | 27 | import com.google.common.collect.Maps; |
15 | 28 | import lombok.Getter; |
16 | 29 | import lombok.RequiredArgsConstructor; |
17 | 30 | import lombok.extern.slf4j.Slf4j; |
31 | +import org.apache.rocketmq.common.filter.impl.Op; | |
18 | 32 | import org.redisson.api.RLock; |
19 | 33 | import org.springframework.beans.factory.annotation.Value; |
20 | 34 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
... | ... | @@ -26,6 +40,7 @@ import org.springframework.transaction.TransactionStatus; |
26 | 40 | import org.springframework.transaction.annotation.Transactional; |
27 | 41 | |
28 | 42 | import java.math.BigDecimal; |
43 | +import java.math.RoundingMode; | |
29 | 44 | import java.time.LocalDate; |
30 | 45 | import java.time.YearMonth; |
31 | 46 | import java.time.temporal.TemporalAdjusters; |
... | ... | @@ -51,18 +66,21 @@ public class EvalUserReportTask { |
51 | 66 | private final EvalGroupIndicatorHitLogService evalGroupIndicatorHitLogService; |
52 | 67 | private final EvalGroupIndicatorParamService evalGroupIndicatorParamService; |
53 | 68 | private final EvalUserRankCodeReportService evalUserRankCodeReportService; |
69 | + private final EvalUserRankStageReportService evalUserRankStageReportService; | |
54 | 70 | private final EvalUserValueReportService evalUserValueReportService; |
55 | 71 | private final EvalGroupIndicatorService evalGroupIndicatorService; |
56 | - private final IndicatorUserValueService indicatorUserValueService; | |
57 | - private final EvalIndicatorValueService evalIndicatorValueService; | |
58 | 72 | private final PlatformTransactionManager platformTransactionManager; |
59 | 73 | private final EvalUserRankReportService evalUserRankReportService; |
74 | + private final EvalGroupRankStageService evalGroupRankStageService; | |
75 | + private final EvalUserExtraReportService evalUserExtraReportService; | |
60 | 76 | private final EvalUserReportService evalUserReportService; |
61 | 77 | private final TransactionDefinition transactionDefinition; |
62 | 78 | private final EvalUserPoolService evalUserPoolService; |
79 | + private final EvalShopPoolService evalShopPoolService; | |
63 | 80 | private final EvalGroupRankService evalGroupRankService; |
64 | - private final EvalGroupService evalGroupService; | |
65 | 81 | private final DistributedLocker distributedLocker; |
82 | + private final EvalGroupService evalGroupService; | |
83 | + private final EhrRpcService ehrRpcService; | |
66 | 84 | private final CommonService commonService; |
67 | 85 | |
68 | 86 | @Value("${spring.cache.custom.global-prefix}:eval:user:report") |
... | ... | @@ -76,7 +94,7 @@ public class EvalUserReportTask { |
76 | 94 | @Scheduled(cron = TimeTaskConstant.EVAL_REPORT) |
77 | 95 | @Transactional(rollbackFor = Exception.class) |
78 | 96 | public void evalUserReportTask() { |
79 | -// this.evalUserReport(LocalDate.now().minusDays(1)); | |
97 | + this.evalUserReport(LocalDate.now().minusDays(1)); | |
80 | 98 | } |
81 | 99 | |
82 | 100 | /** |
... | ... | @@ -121,44 +139,65 @@ public class EvalUserReportTask { |
121 | 139 | * @param date |
122 | 140 | */ |
123 | 141 | public void createRankReport(EvalGroupRank rank, Long groupId, LocalDate date) { |
124 | - List<EvalGroup> evalGroups = evalGroupService.getEffectsByRankId(rank.getId(), date); | |
125 | - List<Long> evalGroupIds = evalGroups.stream().map(EvalGroup::getId).collect(Collectors.toList()); | |
126 | - if (PublicUtil.isEmpty(evalGroupIds)) { | |
127 | - return; | |
128 | - } | |
129 | - List<EvalUserPool> pools = evalUserPoolService.list(Wrappers.<EvalUserPool>lambdaQuery() | |
130 | - .in(EvalUserPool::getEvalGroupId, evalGroupIds) | |
131 | - .eq(EvalUserPool::getMonthly, YearMonth.from(date)) | |
132 | - .eq(EvalUserPool::getYn, Boolean.TRUE) | |
133 | - ); | |
134 | - if (PublicUtil.isEmpty(pools)) { | |
142 | + //查已经开始的考评阶段 | |
143 | + List<EvalGroupRankStage> stages = evalGroupRankStageService.getRankStartStages(rank.getId(), date); | |
144 | + if (PublicUtil.isEmpty(stages)) { | |
135 | 145 | return; |
136 | 146 | } |
137 | - List<EvalGroupIndicator> evalGroupIndicators = evalGroupIndicatorService.list(Wrappers.<EvalGroupIndicator>lambdaQuery() | |
138 | - .in(EvalGroupIndicator::getEvalGroupId, evalGroupIds) | |
139 | - .eq(EvalGroupIndicator::getYn, Boolean.TRUE) | |
140 | - .orderByAsc(EvalGroupIndicator::getId) | |
141 | - ); | |
142 | - | |
147 | + List<EvalGroup> evalGroups = evalGroupService.getEvalGroups(rank.getId()); | |
148 | + Map<Long, List<EvalGroup>> stageEvalGroupMap = evalGroups.stream().collect(Collectors.groupingBy(EvalGroup::getEvalGroupRankStageId)); | |
143 | 149 | //排名组 |
144 | - EvalUserRankReport reportRank = this.saveRankReport(rank, evalGroupIds, evalGroups, date, groupId); | |
150 | + EvalUserRankReport reportRank = this.saveRankReport(rank, evalGroups, date, groupId); | |
145 | 151 | final Long evalUserRankReportId = reportRank.getId(); |
146 | - //排名组指标编码、人员、门店 | |
147 | - List<EvalUserRankCodeReport> rankCodes = this.saveRankCodeReports(evalGroupIndicators, evalUserRankReportId, date); | |
148 | - List<EvalUserReport> evalUserReports = this.saveStaffReports(pools, date, evalUserRankReportId); | |
149 | - List<EvalUserReport> evalShopReports = this.saveShopReports(pools, date, evalUserRankReportId); | |
150 | - //人员维度 | |
151 | - List<EvalUserValueReport> reportUserValues = calcUser(pools, evalGroupIndicators, evalUserReports, date); | |
152 | - //门店维度 | |
153 | - calcShop(evalShopReports, rankCodes, reportUserValues, evalUserReports, date); | |
152 | + for (EvalGroupRankStage rankStage : stages) { | |
153 | + //如果当前时间 大于 考评阶段结束时间,使用考评结束时间进行查询 | |
154 | + LocalDate dataDate = (date.compareTo(rankStage.getOverTime()) > 0) ? rankStage.getOverTime() : date; | |
155 | + List<EvalGroup> stageEvalGroups = stageEvalGroupMap.get(rankStage.getId()); | |
156 | + List<Long> evalGroupIds = stageEvalGroups.stream().map(EvalGroup::getId).collect(Collectors.toList()); | |
157 | + if (PublicUtil.isEmpty(evalGroupIds)) { | |
158 | + continue; | |
159 | + } | |
160 | + List<EvalUserPool> userPools = evalUserPoolService.list(Wrappers.<EvalUserPool>lambdaQuery() | |
161 | + .in(EvalUserPool::getEvalGroupId, evalGroupIds) | |
162 | + .eq(EvalUserPool::getMonthly, YearMonth.from(dataDate)) | |
163 | + .eq(EvalUserPool::getYn, Boolean.TRUE) | |
164 | + ); | |
165 | + List<EvalShopPool> shopPools = evalShopPoolService.list(Wrappers.<EvalShopPool>lambdaQuery() | |
166 | + .in(EvalShopPool::getEvalGroupId, evalGroupIds) | |
167 | + .eq(EvalShopPool::getMonthly, YearMonth.from(dataDate)) | |
168 | + .eq(EvalShopPool::getYn, Boolean.TRUE) | |
169 | + ); | |
170 | + List<EvalGroupIndicator> evalGroupIndicators = evalGroupIndicatorService.list(Wrappers.<EvalGroupIndicator>lambdaQuery() | |
171 | + .in(EvalGroupIndicator::getEvalGroupId, evalGroupIds) | |
172 | + .eq(EvalGroupIndicator::getYn, Boolean.TRUE) | |
173 | + .orderByAsc(EvalGroupIndicator::getId) | |
174 | + ); | |
175 | + | |
176 | + //排名组阶段 | |
177 | + EvalUserRankStageReport rankStageReport = this.saveRankStageReport(reportRank, rank, rankStage, stageEvalGroups); | |
178 | + final Long evalUserRankStageReportId = rankStageReport.getId(); | |
179 | + //排名组指标编码、人员、门店 | |
180 | + List<EvalUserRankCodeReport> rankCodes = this.saveRankCodeReports(evalGroupIndicators, evalUserRankReportId, evalUserRankStageReportId, dataDate); | |
181 | + List<EvalUserReport> evalUserReports = this.saveStaffReports(userPools, dataDate, evalUserRankReportId, evalUserRankStageReportId); | |
182 | + List<EvalUserReport> evalShopReports = this.saveShopReports(shopPools, dataDate, evalUserRankReportId, evalUserRankStageReportId); | |
183 | + //人员维度 | |
184 | + List<EvalUserValueReport> reportUserValues = calcUser(userPools, evalGroupIndicators, evalUserReports, dataDate); | |
185 | + //门店维度 | |
186 | + calcShop(shopPools, evalGroupIndicators, evalShopReports, dataDate); | |
187 | + //门店维度 | |
188 | + calcManager(userPools, reportUserValues, rankCodes, evalUserReports, rankStageReport, date); | |
189 | + } | |
190 | + | |
154 | 191 | |
155 | 192 | } |
156 | 193 | public List<EvalUserValueReport> calcUser(List<EvalUserPool> pools, |
157 | 194 | List<EvalGroupIndicator> evalGroupIndicators, |
158 | 195 | List<EvalUserReport> evalUserReports, |
159 | 196 | LocalDate date) { |
197 | + if (PublicUtil.isEmpty(pools)) { | |
198 | + return new ArrayList<>(); | |
199 | + } | |
160 | 200 | List<EvalUserValueReport> reportUserValues = new ArrayList<>(); |
161 | - List<Long> userIds = pools.stream().map(EvalUserPool::getUserId).distinct().collect(Collectors.toList()); | |
162 | 201 | List<Long> poolIds = pools.stream().map(EvalUserPool::getId).collect(Collectors.toList()); |
163 | 202 | List<Long> evalGroupIndicatorIds = evalGroupIndicators.stream().map(EvalGroupIndicator::getId).collect(Collectors.toList()); |
164 | 203 | List<EvalGroupIndicatorHitLog> hitLogs = evalGroupIndicatorHitLogService.getHitLogs(evalGroupIndicatorIds, poolIds, EvalScopeEnum.STAFF, date); |
... | ... | @@ -177,37 +216,33 @@ public class EvalUserReportTask { |
177 | 216 | List<EvalGroupIndicatorHitLog> userHitLogs = indicatorHitLogMap.getOrDefault(evalGroupIndicatorId, new ArrayList<>()); |
178 | 217 | Map<Long, EvalGroupIndicatorHitLog> poolHitLogMap = userHitLogs.stream() |
179 | 218 | .collect(Collectors.toMap(EvalGroupIndicatorHitLog::getPoolId, Function.identity(), (v1, v2) -> v1)); |
180 | - for (EvalUserPool userPool : pools) { | |
181 | - if (! userPool.getEvalGroupId().equals(groupIndicator.getEvalGroupId())) { | |
219 | + for (EvalUserPool pool : pools) { | |
220 | + if (! pool.getEvalGroupId().equals(groupIndicator.getEvalGroupId())) { | |
182 | 221 | continue; |
183 | 222 | } |
184 | - Optional<EvalGroupIndicatorHitLog> hitLog = Optional.ofNullable(poolHitLogMap.get(userPool.getId())); | |
223 | + | |
224 | + Optional<EvalGroupIndicatorHitLog> hitLog = Optional.ofNullable(poolHitLogMap.get(pool.getId())); | |
225 | + if (pool.getDataDate().compareTo(date) != 0) { | |
226 | + hitLog = evalGroupIndicatorHitLogService.getHitLog(evalGroupIndicatorId, pool.getId(), EvalScopeEnum.STAFF, pool.getDataDate()); | |
227 | + } | |
185 | 228 | BigDecimal value = (ScoreWayEnum.LADDER.equals(scoreWay)) ? |
186 | 229 | hitLog.map(EvalGroupIndicatorHitLog::getHitLadderValue).orElse(BigDecimal.ZERO) : |
187 | 230 | hitLog.map(EvalGroupIndicatorHitLog::getHitCommissionValue).orElse(BigDecimal.ZERO); |
188 | - Long evalUserReportId = userPoolReportIdMap.get(userPool.getId()); | |
231 | + Long evalUserReportId = userPoolReportIdMap.get(pool.getId()); | |
189 | 232 | reportUserValues.add(convertDB(evalUserReportId, groupIndicator, value, date, params)); |
190 | 233 | } |
191 | 234 | |
192 | 235 | //是否有子指标 |
193 | 236 | if (IndicatorCodeTypeEnum.COMBINE_INDICATOR.equals(codeType)) { |
194 | 237 | for (EvalGroupIndicatorParam param : params) { |
195 | - if (TargetTypeEnum.NO.equals(param.getTargetType())) { | |
196 | - Map<Long, BigDecimal> userValueMap = queryUserOriginValue(param, userIds, date); | |
197 | - for (EvalUserPool userPool : pools) { | |
198 | - BigDecimal value = userValueMap.getOrDefault(userPool.getUserId(), BigDecimal.ZERO); | |
199 | - Long evalUserReportId = userPoolReportIdMap.get(userPool.getId()); | |
200 | - reportUserValues.add(convertParamDB(evalUserReportId, param, value, date)); | |
201 | - } | |
202 | - } else { | |
203 | - Map<Long, EvalGroupIndicatorTargetHitLog> hitLogMap = queryUserTargetValue(param.getId(), poolIds, date); | |
204 | - for (EvalUserPool userPool : pools) { | |
205 | - EvalGroupIndicatorTargetHitLog hitLog = hitLogMap.get(userPool.getId()); | |
206 | - BigDecimal value = Optional.ofNullable(hitLog) | |
207 | - .map(EvalGroupIndicatorTargetHitLog::getReachValue).orElse(BigDecimal.ZERO).multiply(Constant.ONE_HUNDRED); | |
208 | - Long evalUserReportId = userPoolReportIdMap.get(userPool.getId()); | |
209 | - reportUserValues.add(convertParamDB(evalUserReportId, param, value, date)); | |
210 | - } | |
238 | + Map<Long, EvalGroupIndicatorTargetHitLog> targetHitLogMap = queryTargetValue(param.getId(), poolIds, date, EvalScopeEnum.STAFF); | |
239 | + for (EvalUserPool pool : pools) { | |
240 | + Boolean staffChange = pool.getDataDate().compareTo(date) != 0; | |
241 | + EvalGroupIndicatorTargetHitLog targetHitLog = (staffChange) | |
242 | + ? queryTargetValue(param.getId(), pool.getId(), pool.getDataDate(), EvalScopeEnum.STAFF) : targetHitLogMap.get(pool.getId()); | |
243 | + BigDecimal value = this.getParamValue(targetHitLog); | |
244 | + Long evalUserReportId = userPoolReportIdMap.get(pool.getId()); | |
245 | + reportUserValues.add(convertParamDB(evalUserReportId, param, value, date)); | |
211 | 246 | } |
212 | 247 | } |
213 | 248 | } |
... | ... | @@ -218,44 +253,149 @@ public class EvalUserReportTask { |
218 | 253 | return reportUserValues; |
219 | 254 | } |
220 | 255 | |
221 | - public void calcShop(List<EvalUserReport> evalShopReports, | |
222 | - List<EvalUserRankCodeReport> rankCodes, | |
223 | - List<EvalUserValueReport> reportUserValues, | |
224 | - List<EvalUserReport> evalUserReports, | |
225 | - LocalDate date) { | |
226 | - List<EvalUserValueReport> reportShopValues = new ArrayList<>(); | |
227 | - for (EvalUserReport shopReport : evalShopReports) { | |
256 | + public void calcShop(List<EvalShopPool> pools, | |
257 | + List<EvalGroupIndicator> evalGroupIndicators, | |
258 | + List<EvalUserReport> evalShopReports, | |
259 | + LocalDate date) { | |
260 | + if (PublicUtil.isEmpty(pools)) { | |
261 | + return ; | |
262 | + } | |
263 | + List<EvalUserValueReport> reportUserValues = new ArrayList<>(); | |
264 | + List<Long> poolIds = pools.stream().map(EvalShopPool::getId).collect(Collectors.toList()); | |
265 | + List<Long> evalGroupIndicatorIds = evalGroupIndicators.stream().map(EvalGroupIndicator::getId).collect(Collectors.toList()); | |
266 | + List<EvalGroupIndicatorHitLog> hitLogs = evalGroupIndicatorHitLogService.getHitLogs(evalGroupIndicatorIds, poolIds, EvalScopeEnum.SHOP, date); | |
267 | + Map<Long, List<EvalGroupIndicatorHitLog>> indicatorHitLogMap = hitLogs.stream().collect(Collectors.groupingBy(EvalGroupIndicatorHitLog::getEvalGroupIndicatorId)); | |
268 | + Map<Long, Long> shopPoolReportIdMap = evalShopReports.stream().collect(Collectors.toMap(EvalUserReport::getEvalShopPoolId, EvalUserReport::getId, (v1, v2) -> v1)); | |
269 | + | |
270 | + for (EvalGroupIndicator groupIndicator : evalGroupIndicators) { | |
271 | + final ScoreWayEnum scoreWay = groupIndicator.getScoreWay(); | |
272 | + final IndicatorCodeTypeEnum codeType = groupIndicator.getCodeType(); | |
273 | + final Long evalGroupIndicatorId = groupIndicator.getId(); | |
274 | + List<EvalGroupIndicatorParam> params = evalGroupIndicatorParamService.list(Wrappers.<EvalGroupIndicatorParam>lambdaQuery() | |
275 | + .eq(EvalGroupIndicatorParam::getEvalGroupIndicatorId, evalGroupIndicatorId) | |
276 | + .eq(EvalGroupIndicatorParam::getYn, Boolean.TRUE) | |
277 | + ); | |
278 | + | |
279 | + List<EvalGroupIndicatorHitLog> userHitLogs = indicatorHitLogMap.getOrDefault(evalGroupIndicatorId, new ArrayList<>()); | |
280 | + Map<Long, EvalGroupIndicatorHitLog> poolHitLogMap = userHitLogs.stream() | |
281 | + .collect(Collectors.toMap(EvalGroupIndicatorHitLog::getPoolId, Function.identity(), (v1, v2) -> v1)); | |
282 | + for (EvalShopPool pool : pools) { | |
283 | + if (! pool.getEvalGroupId().equals(groupIndicator.getEvalGroupId())) { | |
284 | + continue; | |
285 | + } | |
286 | + | |
287 | + Optional<EvalGroupIndicatorHitLog> hitLog = Optional.ofNullable(poolHitLogMap.get(pool.getId())); | |
288 | + BigDecimal value = (ScoreWayEnum.LADDER.equals(scoreWay)) ? | |
289 | + hitLog.map(EvalGroupIndicatorHitLog::getHitLadderValue).orElse(BigDecimal.ZERO) : | |
290 | + hitLog.map(EvalGroupIndicatorHitLog::getHitCommissionValue).orElse(BigDecimal.ZERO); | |
291 | + Long evalUserReportId = shopPoolReportIdMap.get(pool.getId()); | |
292 | + reportUserValues.add(convertDB(evalUserReportId, groupIndicator, value, date, params)); | |
293 | + } | |
228 | 294 | |
229 | - Set<Long> shopReportIds = evalUserReports.stream() | |
230 | - .filter(user -> shopReport.getShopId().equals(user.getShopId()) && Boolean.TRUE.equals(user.getInclusion())) | |
295 | + //是否有子指标 | |
296 | + if (IndicatorCodeTypeEnum.COMBINE_INDICATOR.equals(codeType)) { | |
297 | + for (EvalGroupIndicatorParam param : params) { | |
298 | + Map<Long, EvalGroupIndicatorTargetHitLog> targetHitLogMap = queryTargetValue(param.getId(), poolIds, date, EvalScopeEnum.SHOP); | |
299 | + for (EvalShopPool pool : pools) { | |
300 | + EvalGroupIndicatorTargetHitLog targetHitLog = targetHitLogMap.get(pool.getId()); | |
301 | + BigDecimal value = this.getParamValue(targetHitLog); | |
302 | + Long evalUserReportId = shopPoolReportIdMap.get(pool.getId()); | |
303 | + reportUserValues.add(convertParamDB(evalUserReportId, param, value, date)); | |
304 | + } | |
305 | + } | |
306 | + } | |
307 | + } | |
308 | + if (PublicUtil.isNotEmpty(reportUserValues)) { | |
309 | + evalUserValueReportService.saveBatch(reportUserValues); | |
310 | + } | |
311 | + } | |
312 | + | |
313 | + public void calcManager(List<EvalUserPool> pools, | |
314 | + List<EvalUserValueReport> reportUserValues, | |
315 | + List<EvalUserRankCodeReport> rankCodes, | |
316 | + List<EvalUserReport> evalUserReports, | |
317 | + EvalUserRankStageReport rankStageReport, | |
318 | + LocalDate date) { | |
319 | + if (PublicUtil.isEmpty(pools)) { | |
320 | + return; | |
321 | + } | |
322 | + List<Long> shopIds = pools.stream().map(EvalUserPool::getShopId).distinct().collect(Collectors.toList()); | |
323 | + List<ManagerDTO> managerDTOS = ehrRpcService.getRealTimeShopManager(new ArrayList<>(shopIds)); | |
324 | + log.info("查询门店实时管理者:{},{}", JSON.toJSONString(shopIds), JSON.toJSONString(managerDTOS)); | |
325 | + if (PublicUtil.isEmpty(managerDTOS)) { | |
326 | + return; | |
327 | + } | |
328 | + Map<Long, StaffBaseInfoDTO> managerMap = staffInfoMap(managerDTOS); | |
329 | + List<EvalUserValueReport> valueReports = new ArrayList<>(); | |
330 | + for (ManagerDTO manager : managerDTOS) { | |
331 | + if (PublicUtil.isEmpty(manager.getManageStaffList())) { | |
332 | + continue; | |
333 | + } | |
334 | + List<Long> manageStaffIds = manager.getManageStaffList().stream().map(StaffBaseInfoDTO::getId).distinct().collect(Collectors.toList()); | |
335 | + Set<Long> managerStaffDimReportIds = evalUserReports.stream() | |
336 | + .filter(user -> manageStaffIds.contains(user.getUserId())) | |
231 | 337 | .map(EvalUserReport::getId).collect(Collectors.toSet()); |
338 | + if (PublicUtil.isEmpty(managerStaffDimReportIds)) { | |
339 | + continue; | |
340 | + } | |
341 | + EvalUserReport evalUserReport = createManager(rankStageReport, date); | |
342 | + final Long managerEvalUserReportId = this.saveManagerDimDB(evalUserReport, manager, pools, managerMap, manageStaffIds); | |
232 | 343 | |
233 | - final Long evalUserReportId = shopReport.getId(); | |
234 | - for (EvalUserRankCodeReport rankCode : rankCodes) { | |
235 | - final String code = rankCode.getCode(); | |
236 | - final IndicatorCodeTypeEnum codeType = rankCode.getCodeType(); | |
237 | - | |
238 | - Double averageRatioDouble = reportUserValues.stream() | |
239 | - .filter(user -> shopReportIds.contains(user.getEvalUserReportId()) && code.equals(user.getCode())) | |
240 | - .mapToDouble(userValue -> Optional.ofNullable(userValue.getValue()).orElse(BigDecimal.ZERO).doubleValue()) | |
241 | - .average() | |
242 | - .orElse(0); | |
243 | - BigDecimal value = new BigDecimal(averageRatioDouble.toString()); | |
244 | - EvalUserValueReport shopValue = new EvalUserValueReport(evalUserReportId, code, codeType, value, date); | |
245 | - reportShopValues.add(shopValue); | |
344 | + for (EvalUserRankCodeReport codeReport : rankCodes) { | |
345 | + BigDecimal value = calcAverageValue(reportUserValues, managerStaffDimReportIds, codeReport.getCode()); | |
346 | + valueReports.add(this.convertManagerValue(managerEvalUserReportId, codeReport, value, date)); | |
246 | 347 | } |
247 | 348 | } |
248 | - if (PublicUtil.isNotEmpty(reportShopValues)) { | |
249 | - evalUserValueReportService.saveBatch(reportShopValues); | |
349 | + if (PublicUtil.isNotEmpty(valueReports)) { | |
350 | + evalUserValueReportService.saveBatch(valueReports); | |
351 | + } | |
352 | + } | |
353 | + | |
354 | + public BigDecimal calcAverageValue(List<EvalUserValueReport> valueReports, Set<Long> managerStaffDimReportIds, String code) { | |
355 | + Double averageRatioDouble = valueReports.stream() | |
356 | + .filter(user -> managerStaffDimReportIds.contains(user.getEvalUserReportId()) && code.equals(user.getCode())) | |
357 | + .mapToDouble(userValue -> Optional.ofNullable(userValue.getValue()).orElse(BigDecimal.ZERO).doubleValue()) | |
358 | + .average() | |
359 | + .orElse(0); | |
360 | + return new BigDecimal(averageRatioDouble.toString()); | |
361 | + } | |
362 | + | |
363 | + public BigDecimal getParamValue(EvalGroupIndicatorTargetHitLog hitLog) { | |
364 | + if (PublicUtil.isEmpty(hitLog) || PublicUtil.isEmpty(hitLog.getUseTarget())) { | |
365 | + return BigDecimal.ZERO; | |
366 | + } | |
367 | + BigDecimal value = null; | |
368 | + switch (hitLog.getUseTarget()) { | |
369 | + case NO: { | |
370 | + value = Optional.ofNullable(hitLog.getValue()).orElse(BigDecimal.ZERO); | |
371 | + break; | |
372 | + } | |
373 | + case FIRST_TARGET: { | |
374 | + value = Optional.ofNullable(hitLog.getReachValue()).orElse(BigDecimal.ZERO); | |
375 | + break; | |
376 | + } | |
377 | + case EXTRA_TARGET: { | |
378 | + value = Optional.ofNullable(hitLog.getExtraReachValue()).orElse(BigDecimal.ZERO); | |
379 | + break; | |
380 | + } | |
250 | 381 | } |
382 | + | |
383 | + return value; | |
251 | 384 | } |
252 | 385 | |
253 | - public List<EvalUserReport> saveStaffReports(List<EvalUserPool> pools, LocalDate date, Long evalUserRankReportId) { | |
386 | + public List<EvalUserReport> saveStaffReports(List<EvalUserPool> pools, LocalDate date, Long evalUserRankReportId, Long evalUserRankStageReportId) { | |
387 | + if (PublicUtil.isEmpty(pools)) { | |
388 | + return new ArrayList<>(); | |
389 | + } | |
254 | 390 | List<EvalUserReport> evalUserReports = new ArrayList<>(); |
255 | 391 | for (EvalUserPool userPool : pools) { |
256 | 392 | EvalUserReport report = new EvalUserReport(); |
257 | 393 | report.setEvalUserRankReportId(evalUserRankReportId); |
394 | + report.setEvalUserRankStageReportId(evalUserRankStageReportId); | |
258 | 395 | report.setDimension(ReportDimensionEnum.STAFF); |
396 | + report.setReward(userPool.getReward()); | |
397 | + report.setScore(userPool.getScore()); | |
398 | + report.setScoreRatio(userPool.getScoreRatio().multiply(Constant.ONE_HUNDRED)); | |
259 | 399 | report.setUserId(userPool.getUserId()); |
260 | 400 | report.setUserName(userPool.getUserName()); |
261 | 401 | report.setPostId(userPool.getPostId()); |
... | ... | @@ -271,15 +411,22 @@ public class EvalUserReportTask { |
271 | 411 | return evalUserReports; |
272 | 412 | } |
273 | 413 | |
274 | - public List<EvalUserReport> saveShopReports(List<EvalUserPool> pools, LocalDate date, Long evalUserRankReportId) { | |
414 | + public List<EvalUserReport> saveShopReports(List<EvalShopPool> shopPools, LocalDate date, Long evalUserRankReportId, Long evalUserRankStageReportId) { | |
415 | + if (PublicUtil.isEmpty(shopPools)) { | |
416 | + return new ArrayList<>(); | |
417 | + } | |
275 | 418 | List<EvalUserReport> evalShopReports = new ArrayList<>(); |
276 | - Map<Long, String> shopMap = pools.stream().collect(Collectors.toMap(EvalUserPool::getShopId, EvalUserPool::getShopName, (v1, v2) -> v1)); | |
277 | - for (Long shopId : shopMap.keySet()) { | |
419 | + for (EvalShopPool shopPool : shopPools) { | |
278 | 420 | EvalUserReport report = new EvalUserReport(); |
279 | 421 | report.setDimension(ReportDimensionEnum.SHOP); |
280 | 422 | report.setEvalUserRankReportId(evalUserRankReportId); |
281 | - report.setShopId(shopId); | |
282 | - report.setShopName(shopMap.get(shopId)); | |
423 | + report.setReward(shopPool.getReward()); | |
424 | + report.setScore(shopPool.getScore()); | |
425 | + report.setScoreRatio(shopPool.getScoreRatio().multiply(Constant.ONE_HUNDRED)); | |
426 | + report.setEvalUserRankStageReportId(evalUserRankStageReportId); | |
427 | + report.setShopId(shopPool.getShopId()); | |
428 | + report.setEvalShopPoolId(shopPool.getId()); | |
429 | + report.setShopName(shopPool.getShopName()); | |
283 | 430 | report.setDataDate(date); |
284 | 431 | evalShopReports.add(report); |
285 | 432 | } |
... | ... | @@ -287,46 +434,32 @@ public class EvalUserReportTask { |
287 | 434 | return evalShopReports; |
288 | 435 | } |
289 | 436 | |
290 | - public Map<Long, BigDecimal> queryUserOriginValue(EvalGroupIndicatorParam param, List<Long> userIds, LocalDate dataDate) { | |
291 | - final String code = param.getCode(); | |
292 | - final IndicatorCodeTypeEnum codeType = param.getCodeType(); | |
293 | - Map<Long, BigDecimal> referValueMap = Maps.newHashMapWithExpectedSize(userIds.size()); | |
294 | - //无目标 | |
295 | - if (IndicatorCodeTypeEnum.INDICATOR.equals(codeType)) { | |
296 | - List<IndicatorUserValue> indicatorUserValues = indicatorUserValueService.list(Wrappers.<IndicatorUserValue>lambdaQuery() | |
297 | - .eq(IndicatorUserValue::getIndicatorCode, code) | |
298 | - .eq(IndicatorUserValue::getDataDate, dataDate) | |
299 | - .in(IndicatorUserValue::getUserId, userIds) | |
300 | - .eq(IndicatorUserValue::getDimensionType, DimensionTypeEnum.STAFF) | |
301 | - .eq(IndicatorUserValue::getYn, Boolean.TRUE) | |
302 | - ); | |
303 | - for (IndicatorUserValue userValue : indicatorUserValues) { | |
304 | - referValueMap.put(userValue.getUserId(), commonService.queryIndicatorValueVO(code, userValue, | |
305 | - param.getTargetType(), param.getDataType())); | |
306 | - } | |
307 | - return referValueMap; | |
308 | - } | |
309 | - for (Long userId : userIds) { | |
310 | - EvalIndicatorValue evalIndicatorValue = evalIndicatorValueService.queryLastValue(userId, | |
311 | - DimensionTypeEnum.STAFF, code, dataDate); | |
312 | - referValueMap.put(userId, commonService.queryEvalIndicatorValueVO(code, evalIndicatorValue, param.getTargetType(), param.getDataType())); | |
313 | - } | |
314 | - return referValueMap; | |
315 | - } | |
316 | - | |
317 | - public Map<Long, EvalGroupIndicatorTargetHitLog> queryUserTargetValue(Long referId, List<Long> poolIds, LocalDate dataDate) { | |
437 | + public Map<Long, EvalGroupIndicatorTargetHitLog> queryTargetValue(Long referId, List<Long> poolIds, LocalDate dataDate, EvalScopeEnum scopeType) { | |
318 | 438 | List<EvalGroupIndicatorTargetHitLog> targetHitLogs = evalGroupIndicatorTargetHitLogService.list(Wrappers.<EvalGroupIndicatorTargetHitLog>lambdaQuery() |
319 | 439 | .eq(EvalGroupIndicatorTargetHitLog::getReferId, referId) |
320 | 440 | .eq(EvalGroupIndicatorTargetHitLog::getTargetType, IndicatorTypeEnum.EXAMINE) |
321 | 441 | .eq(EvalGroupIndicatorTargetHitLog::getDataDate, dataDate) |
322 | 442 | .in(EvalGroupIndicatorTargetHitLog::getPoolId, poolIds) |
323 | - .eq(EvalGroupIndicatorTargetHitLog::getScopeType, EvalScopeEnum.STAFF) | |
443 | + .eq(EvalGroupIndicatorTargetHitLog::getScopeType, scopeType) | |
324 | 444 | .eq(EvalGroupIndicatorTargetHitLog::getYn, Boolean.TRUE) |
325 | 445 | ); |
326 | 446 | return targetHitLogs.stream() |
327 | 447 | .collect(Collectors.toMap(EvalGroupIndicatorTargetHitLog::getPoolId, Function.identity(), (v1, v2) -> v1)); |
328 | 448 | } |
329 | 449 | |
450 | + public EvalGroupIndicatorTargetHitLog queryTargetValue(Long referId, Long poolId, LocalDate dataDate, EvalScopeEnum scopeType) { | |
451 | + EvalGroupIndicatorTargetHitLog targetHitLog = evalGroupIndicatorTargetHitLogService.getOne(Wrappers.<EvalGroupIndicatorTargetHitLog>lambdaQuery() | |
452 | + .eq(EvalGroupIndicatorTargetHitLog::getReferId, referId) | |
453 | + .eq(EvalGroupIndicatorTargetHitLog::getTargetType, IndicatorTypeEnum.EXAMINE) | |
454 | + .eq(EvalGroupIndicatorTargetHitLog::getDataDate, dataDate) | |
455 | + .eq(EvalGroupIndicatorTargetHitLog::getPoolId, poolId) | |
456 | + .eq(EvalGroupIndicatorTargetHitLog::getScopeType, scopeType) | |
457 | + .eq(EvalGroupIndicatorTargetHitLog::getYn, Boolean.TRUE) | |
458 | + , Boolean.FALSE | |
459 | + ); | |
460 | + return targetHitLog; | |
461 | + } | |
462 | + | |
330 | 463 | public void cleanTodayData(LocalDate date) { |
331 | 464 | evalUserRankReportService.remove(Wrappers.<EvalUserRankReport>lambdaUpdate() |
332 | 465 | .eq(EvalUserRankReport::getDataDate, date) |
... | ... | @@ -354,6 +487,9 @@ public class EvalUserReportTask { |
354 | 487 | } |
355 | 488 | List<Long> rankReportIds = rankReports.stream().map(EvalUserRankReport::getId).collect(Collectors.toList()); |
356 | 489 | evalUserRankReportService.removeByIds(rankReportIds); |
490 | + evalUserRankStageReportService.remove(Wrappers.<EvalUserRankStageReport>lambdaUpdate() | |
491 | + .in(EvalUserRankStageReport::getEvalUserRankReportId, rankReportIds) | |
492 | + ); | |
357 | 493 | evalUserRankCodeReportService.remove(Wrappers.<EvalUserRankCodeReport>lambdaUpdate() |
358 | 494 | .in(EvalUserRankCodeReport::getEvalUserRankReportId, rankReportIds) |
359 | 495 | ); |
... | ... | @@ -371,7 +507,8 @@ public class EvalUserReportTask { |
371 | 507 | ); |
372 | 508 | } |
373 | 509 | |
374 | - public List<EvalUserRankCodeReport> saveRankCodeReports(List<EvalGroupIndicator> evalGroupIndicators, Long reportRankId, LocalDate date) { | |
510 | + public List<EvalUserRankCodeReport> saveRankCodeReports(List<EvalGroupIndicator> evalGroupIndicators, Long reportRankId, | |
511 | + Long evalUserRankStageReportId, LocalDate date) { | |
375 | 512 | Set<String> codes = new HashSet<>(); |
376 | 513 | List<EvalUserRankCodeReport> rankCodes = new ArrayList<>(); |
377 | 514 | AtomicInteger order = new AtomicInteger(); |
... | ... | @@ -380,7 +517,7 @@ public class EvalUserReportTask { |
380 | 517 | if (! codes.add(groupIndicator.getCode())) { |
381 | 518 | continue; |
382 | 519 | } |
383 | - rankCodes.add(this.convertRankCodeDB(groupIndicator, date, reportRankId, order)); | |
520 | + rankCodes.add(this.convertRankCodeDB(groupIndicator, date, reportRankId, evalUserRankStageReportId, order)); | |
384 | 521 | |
385 | 522 | //组合指标 |
386 | 523 | if (PublicUtil.isNotEmpty(groupIndicator.getCodeType()) && |
... | ... | @@ -391,7 +528,7 @@ public class EvalUserReportTask { |
391 | 528 | .eq(EvalGroupIndicatorParam::getYn, Boolean.TRUE) |
392 | 529 | ); |
393 | 530 | for (EvalGroupIndicatorParam indicatorParam : params) { |
394 | - rankCodes.add(this.convertParamToRankCodeDB(indicatorParam, date, reportRankId, order, groupIndicator)); | |
531 | + rankCodes.add(this.convertParamToRankCodeDB(indicatorParam, date, reportRankId, evalUserRankStageReportId, order, groupIndicator)); | |
395 | 532 | } |
396 | 533 | } |
397 | 534 | |
... | ... | @@ -413,20 +550,121 @@ public class EvalUserReportTask { |
413 | 550 | return evalGroupRanks.stream().collect(Collectors.groupingBy(EvalGroupRank::getGroupId)); |
414 | 551 | } |
415 | 552 | |
416 | - public EvalUserRankReport saveRankReport(EvalGroupRank rank, List<Long> evalGroupIds, List<EvalGroup> evalGroups, LocalDate date, Long groupId) { | |
553 | + public EvalUserRankReport saveRankReport(EvalGroupRank rank, List<EvalGroup> evalGroups, LocalDate date, Long groupId) { | |
417 | 554 | List<Long> shopIds = evalGroups.stream().map(EvalGroup::getShopIds).distinct().collect(ArrayList::new, List::addAll, List::addAll); |
418 | 555 | EvalUserRankReport reportRank = new EvalUserRankReport(); |
419 | 556 | reportRank.setRankId(rank.getId()); |
420 | 557 | reportRank.setRankName(rank.getName()); |
421 | - reportRank.setEvalGroupIds(evalGroupIds); | |
422 | - reportRank.setShopIds(shopIds); | |
558 | + reportRank.setMultiStage(rank.getMultiStage()); | |
423 | 559 | reportRank.setDataDate(date); |
424 | 560 | reportRank.setMonthly(YearMonth.from(date)); |
561 | + reportRank.setShopIds(shopIds); | |
425 | 562 | reportRank.setGroupId(groupId); |
426 | 563 | evalUserRankReportService.save(reportRank); |
427 | 564 | return reportRank; |
428 | 565 | } |
429 | 566 | |
567 | + public EvalUserRankStageReport saveRankStageReport(EvalUserRankReport rankReport, EvalGroupRank rank, | |
568 | + EvalGroupRankStage rankStage, List<EvalGroup> evalGroups) { | |
569 | + List<Long> shopIds = evalGroups.stream().map(EvalGroup::getShopIds).distinct().collect(ArrayList::new, List::addAll, List::addAll); | |
570 | + List<Long> evalGroupIds = evalGroups.stream().map(EvalGroup::getId).collect(Collectors.toList()); | |
571 | + EvalUserRankStageReport reportRankStage = new EvalUserRankStageReport(); | |
572 | + reportRankStage.setEvalUserRankReportId(rankReport.getId()); | |
573 | + reportRankStage.setEvalGroupRankId(rank.getId()); | |
574 | + reportRankStage.setEvalGroupRankStageId(rankStage.getId()); | |
575 | + if (PublicUtil.isNotEmpty(rankStage.getName())) { | |
576 | + reportRankStage.setStageName(rankStage.getName()); | |
577 | + } | |
578 | + reportRankStage.setEvalGroupIds(evalGroupIds); | |
579 | + reportRankStage.setBeginTime(rankStage.getBeginTime().atTime(0,0,1)); | |
580 | + reportRankStage.setOverTime(rankStage.getOverTime().atTime(23,23,59)); | |
581 | + evalUserRankStageReportService.save(reportRankStage); | |
582 | + return reportRankStage; | |
583 | + } | |
584 | + | |
585 | + public EvalUserReport createManager(EvalUserRankStageReport rankStageReport, LocalDate date) { | |
586 | + EvalUserReport evalUserReport = new EvalUserReport(); | |
587 | + evalUserReport.setEvalUserRankReportId(rankStageReport.getEvalUserRankReportId()); | |
588 | + evalUserReport.setEvalUserRankStageReportId(rankStageReport.getId()); | |
589 | + evalUserReport.setDimension(ReportDimensionEnum.MANAGER); | |
590 | + evalUserReport.setDataDate(date); | |
591 | + return evalUserReport; | |
592 | + } | |
593 | + | |
594 | + public Long saveManagerDimDB(EvalUserReport evalUserReport, ManagerDTO manager, List<EvalUserPool> pools, Map<Long, StaffBaseInfoDTO> managerMap, List<Long> manageStaffIds) { | |
595 | + evalUserReport.setUserId(manager.getStaffId()); | |
596 | + evalUserReport.setUserName(manager.getStaffName()); | |
597 | + if (managerMap.containsKey(manager.getStaffId())) { | |
598 | + StaffBaseInfoDTO staffInfo = managerMap.get(manager.getStaffId()); | |
599 | + evalUserReport.setShopId(staffInfo.getShopId()); | |
600 | + evalUserReport.setShopName(staffInfo.getShopName()); | |
601 | + evalUserReport.setPostId(staffInfo.getPostId()); | |
602 | + evalUserReport.setPostName(staffInfo.getPostName()); | |
603 | + } | |
604 | + | |
605 | + List<String> roleCodes = manager.getScopeList().stream() | |
606 | + .flatMap(managerStaffVo -> managerStaffVo.getRoleList().stream()) | |
607 | + .map(ManagerStaffRoleDTO::getRoleCode) | |
608 | + .distinct() | |
609 | + .collect(Collectors.toList()); | |
610 | + List<String> roleNames = manager.getScopeList().stream() | |
611 | + .flatMap(managerStaffVo -> managerStaffVo.getRoleList().stream()) | |
612 | + .map(ManagerStaffRoleDTO::getRoleName) | |
613 | + .distinct() | |
614 | + .collect(Collectors.toList()); | |
615 | + List<Long> shopIds = manager.getScopeList().stream() | |
616 | + .flatMap(managerStaffVo -> managerStaffVo.getShopList().stream()) | |
617 | + .map(ManagerStaffShopDTO::getShopId) | |
618 | + .distinct() | |
619 | + .collect(Collectors.toList()); | |
620 | + | |
621 | + Double averageScoreDouble = pools.stream() | |
622 | + .filter(pool -> manageStaffIds.contains(pool.getUserId())) | |
623 | + .mapToDouble(userValue -> Optional.ofNullable(userValue.getScore()).orElse(BigDecimal.ZERO).doubleValue()) | |
624 | + .average() | |
625 | + .orElse(0); | |
626 | + BigDecimal score = new BigDecimal(averageScoreDouble.toString()).divide(BigDecimal.ONE, 4, RoundingMode.HALF_UP); | |
627 | + | |
628 | + Double averageScoreRatioDouble = pools.stream() | |
629 | + .filter(pool -> manageStaffIds.contains(pool.getUserId())) | |
630 | + .mapToDouble(userValue -> Optional.ofNullable(userValue.getScoreRatio()).orElse(BigDecimal.ZERO).doubleValue()) | |
631 | + .average() | |
632 | + .orElse(0); | |
633 | + BigDecimal scoreRatio = new BigDecimal(averageScoreRatioDouble.toString()).divide(BigDecimal.ONE, 4, RoundingMode.HALF_UP); | |
634 | + | |
635 | + Double averageRewardDouble = pools.stream() | |
636 | + .filter(pool -> manageStaffIds.contains(pool.getUserId())) | |
637 | + .mapToDouble(userValue -> Optional.ofNullable(userValue.getScore()).orElse(BigDecimal.ZERO).doubleValue()) | |
638 | + .average() | |
639 | + .orElse(0); | |
640 | + BigDecimal reward = new BigDecimal(averageRewardDouble.toString()).divide(BigDecimal.ONE, 4, RoundingMode.HALF_UP); | |
641 | + | |
642 | + evalUserReport.setScore(score); | |
643 | + evalUserReport.setScoreRatio(scoreRatio.multiply(Constant.ONE_HUNDRED)); | |
644 | + evalUserReport.setReward(reward); | |
645 | + | |
646 | + evalUserReportService.save(evalUserReport); | |
647 | + EvalUserExtraReport evalUserExtraReport = EvalUserExtraReport.builder() | |
648 | + .evalUserReportId(evalUserReport.getId()) | |
649 | + .roleCodes(roleCodes) | |
650 | + .roleNames(roleNames) | |
651 | + .shopIds(shopIds) | |
652 | + .staffIds(manageStaffIds) | |
653 | + .build(); | |
654 | + evalUserExtraReportService.save(evalUserExtraReport); | |
655 | + return evalUserReport.getId(); | |
656 | + } | |
657 | + | |
658 | + public EvalUserValueReport convertManagerValue(Long managerEvalUserReportId, EvalUserRankCodeReport codeReport, BigDecimal value, LocalDate date) { | |
659 | + EvalUserValueReport userValue = new EvalUserValueReport(); | |
660 | + userValue.setEvalUserReportId(managerEvalUserReportId); | |
661 | + userValue.setCode(codeReport.getCode()); | |
662 | + userValue.setCodeType(codeReport.getCodeType()); | |
663 | + userValue.setValue(Optional.ofNullable(value).orElse(BigDecimal.ZERO)); | |
664 | + userValue.setDataDate(date); | |
665 | + return userValue; | |
666 | + } | |
667 | + | |
430 | 668 | public EvalUserValueReport convertDB(Long evalUserReportId, EvalGroupIndicator groupIndicator, BigDecimal value, |
431 | 669 | LocalDate date, List<EvalGroupIndicatorParam> params) { |
432 | 670 | EvalUserValueReport userValue = new EvalUserValueReport(); |
... | ... | @@ -459,9 +697,11 @@ public class EvalUserReportTask { |
459 | 697 | return userValue; |
460 | 698 | } |
461 | 699 | |
462 | - public EvalUserRankCodeReport convertRankCodeDB(EvalGroupIndicator groupIndicator, LocalDate date, Long reportRankId, AtomicInteger order) { | |
700 | + public EvalUserRankCodeReport convertRankCodeDB(EvalGroupIndicator groupIndicator, LocalDate date, Long reportRankId, | |
701 | + Long evalUserRankStageReportId, AtomicInteger order) { | |
463 | 702 | EvalUserRankCodeReport rankCode = new EvalUserRankCodeReport(); |
464 | 703 | rankCode.setEvalUserRankReportId(reportRankId); |
704 | + rankCode.setEvalUserRankStageReportId(evalUserRankStageReportId); | |
465 | 705 | rankCode.setEvalGroupIndicatorId(groupIndicator.getId()); |
466 | 706 | rankCode.setCode(groupIndicator.getCode()); |
467 | 707 | rankCode.setCodeType(groupIndicator.getCodeType()); |
... | ... | @@ -477,10 +717,18 @@ public class EvalUserReportTask { |
477 | 717 | return rankCode; |
478 | 718 | } |
479 | 719 | |
720 | + public Map<Long, StaffBaseInfoDTO> staffInfoMap(List<ManagerDTO> managerDTOS) { | |
721 | + List<Long> staffIds = managerDTOS.stream().map(ManagerDTO::getStaffId).collect(Collectors.toList()); | |
722 | + List<StaffBaseInfoDTO> staffInfos = ehrRpcService.queryStaffBaseInfo(staffIds); | |
723 | + return staffInfos.stream().collect(Collectors.toMap(StaffBaseInfoDTO::getId, Function.identity(), (v1, v2) -> v1)); | |
724 | + } | |
725 | + | |
480 | 726 | public EvalUserRankCodeReport convertParamToRankCodeDB(EvalGroupIndicatorParam indicatorParam, LocalDate date, Long reportRankId, |
727 | + Long evalUserRankStageReportId, | |
481 | 728 | AtomicInteger order, EvalGroupIndicator groupIndicator) { |
482 | 729 | EvalUserRankCodeReport rankCode = new EvalUserRankCodeReport(); |
483 | 730 | rankCode.setEvalUserRankReportId(reportRankId); |
731 | + rankCode.setEvalUserRankStageReportId(evalUserRankStageReportId); | |
484 | 732 | rankCode.setEvalGroupIndicatorId(indicatorParam.getEvalGroupIndicatorId()); |
485 | 733 | rankCode.setCode(indicatorParam.getCode()); |
486 | 734 | rankCode.setCodeType(indicatorParam.getCodeType()); |
... | ... | @@ -494,5 +742,4 @@ public class EvalUserReportTask { |
494 | 742 | return rankCode; |
495 | 743 | } |
496 | 744 | |
497 | - | |
498 | 745 | } | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalGroupRankStageService.java
... | ... | @@ -17,5 +17,11 @@ import java.util.List; |
17 | 17 | */ |
18 | 18 | public interface EvalGroupRankStageService extends IService<EvalGroupRankStage> { |
19 | 19 | |
20 | - List<EvalGroupRankStage> getEffects(LocalDate dataDate); | |
20 | + /** | |
21 | + * 获取排名组开始的阶段 | |
22 | + * @param rankId | |
23 | + * @return | |
24 | + */ | |
25 | + List<EvalGroupRankStage> getRankStartStages(Long rankId, LocalDate date); | |
26 | + | |
21 | 27 | } | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalUserExtraReportService.java
0 → 100644
1 | +package cn.fw.morax.service.data.eval; | |
2 | + | |
3 | + | |
4 | +import cn.fw.morax.domain.db.eval.EvalUserExtraReport; | |
5 | +import cn.fw.morax.domain.db.eval.EvalUserReport; | |
6 | +import com.baomidou.mybatisplus.extension.service.IService; | |
7 | + | |
8 | +/** | |
9 | + * <p> | |
10 | + * 报表编码数据 服务类 | |
11 | + * </p> | |
12 | + * | |
13 | + * @author jiangchao | |
14 | + * @since 2023-03-31 | |
15 | + */ | |
16 | +public interface EvalUserExtraReportService extends IService<EvalUserExtraReport> { | |
17 | + | |
18 | +} | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalUserRankStageReportService.java
0 → 100644
1 | +package cn.fw.morax.service.data.eval; | |
2 | + | |
3 | + | |
4 | +import cn.fw.morax.domain.db.eval.EvalUserRankStageReport; | |
5 | +import com.baomidou.mybatisplus.extension.service.IService; | |
6 | + | |
7 | +/** | |
8 | + * <p> | |
9 | + * 报表绩效排名组 服务类 | |
10 | + * </p> | |
11 | + * | |
12 | + * @author jiangchao | |
13 | + * @since 2023-03-31 | |
14 | + */ | |
15 | +public interface EvalUserRankStageReportService extends IService<EvalUserRankStageReport> { | |
16 | + | |
17 | +} | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalGroupIndicatorHitLogServiceImpl.java
1 | 1 | package cn.fw.morax.service.data.eval.impl; |
2 | 2 | |
3 | 3 | |
4 | +import cn.fw.morax.common.utils.PublicUtil; | |
4 | 5 | import cn.fw.morax.dao.eval.EvalGroupIndicatorHitLogDao; |
5 | 6 | import cn.fw.morax.domain.db.eval.EvalGroupIndicatorHitLog; |
6 | 7 | import cn.fw.morax.domain.enums.EvalScopeEnum; |
... | ... | @@ -10,6 +11,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
10 | 11 | import org.springframework.stereotype.Service; |
11 | 12 | |
12 | 13 | import java.time.LocalDate; |
14 | +import java.util.ArrayList; | |
13 | 15 | import java.util.List; |
14 | 16 | import java.util.Objects; |
15 | 17 | import java.util.Optional; |
... | ... | @@ -58,6 +60,9 @@ public class EvalGroupIndicatorHitLogServiceImpl extends ServiceImpl<EvalGroupIn |
58 | 60 | |
59 | 61 | @Override |
60 | 62 | public List<EvalGroupIndicatorHitLog> getHitLogs(List<Long> evalGroupIndicatorIds, List<Long> poolIds, EvalScopeEnum scopeType, LocalDate dataDate) { |
63 | + if (PublicUtil.isEmpty(evalGroupIndicatorIds) || PublicUtil.isEmpty(poolIds)) { | |
64 | + return new ArrayList<>(); | |
65 | + } | |
61 | 66 | List<EvalGroupIndicatorHitLog> indicatorHitLogs = this.list(Wrappers.<EvalGroupIndicatorHitLog>lambdaQuery() |
62 | 67 | .in(EvalGroupIndicatorHitLog::getEvalGroupIndicatorId, evalGroupIndicatorIds) |
63 | 68 | .eq(EvalGroupIndicatorHitLog::getDataDate, dataDate) | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalGroupRankStageServiceImpl.java
... | ... | @@ -4,6 +4,7 @@ package cn.fw.morax.service.data.eval.impl; |
4 | 4 | import cn.fw.morax.dao.eval.EvalGroupRankStageDao; |
5 | 5 | import cn.fw.morax.domain.db.eval.EvalGroupRankStage; |
6 | 6 | import cn.fw.morax.service.data.eval.EvalGroupRankStageService; |
7 | +import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |
7 | 8 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
8 | 9 | import org.springframework.stereotype.Service; |
9 | 10 | |
... | ... | @@ -22,7 +23,13 @@ import java.util.List; |
22 | 23 | public class EvalGroupRankStageServiceImpl extends ServiceImpl<EvalGroupRankStageDao, EvalGroupRankStage> implements EvalGroupRankStageService { |
23 | 24 | |
24 | 25 | @Override |
25 | - public List<EvalGroupRankStage> getEffects(LocalDate dataDate) { | |
26 | - return this.baseMapper.getEffects(dataDate); | |
26 | + public List<EvalGroupRankStage> getRankStartStages(Long rankId, LocalDate date) { | |
27 | + List<EvalGroupRankStage> stages = this.baseMapper.selectList(Wrappers.<EvalGroupRankStage>lambdaQuery() | |
28 | + .eq(EvalGroupRankStage::getEvalGroupRankId, rankId) | |
29 | + .eq(EvalGroupRankStage::getYn, Boolean.TRUE) | |
30 | + .le(EvalGroupRankStage::getBeginTime, date) | |
31 | + .orderByAsc(EvalGroupRankStage::getBeginTime) | |
32 | + ); | |
33 | + return stages; | |
27 | 34 | } |
28 | 35 | } | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalUserExtraReportServiceImpl.java
0 → 100644
1 | +package cn.fw.morax.service.data.eval.impl; | |
2 | + | |
3 | + | |
4 | +import cn.fw.morax.dao.eval.EvalUserExtraReportDao; | |
5 | +import cn.fw.morax.dao.eval.EvalUserReportDao; | |
6 | +import cn.fw.morax.domain.db.eval.EvalUserExtraReport; | |
7 | +import cn.fw.morax.domain.db.eval.EvalUserReport; | |
8 | +import cn.fw.morax.service.data.eval.EvalUserExtraReportService; | |
9 | +import cn.fw.morax.service.data.eval.EvalUserReportService; | |
10 | +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | |
11 | +import org.springframework.stereotype.Service; | |
12 | + | |
13 | +/** | |
14 | + * <p> | |
15 | + * 报表编码数据 服务实现类 | |
16 | + * </p> | |
17 | + * | |
18 | + * @author jiangchao | |
19 | + * @since 2023-03-31 | |
20 | + */ | |
21 | +@Service | |
22 | +public class EvalUserExtraReportServiceImpl extends ServiceImpl<EvalUserExtraReportDao, EvalUserExtraReport> implements EvalUserExtraReportService { | |
23 | + | |
24 | +} | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalUserRankStageServiceImplReport.java
0 → 100644
1 | +package cn.fw.morax.service.data.eval.impl; | |
2 | + | |
3 | + | |
4 | +import cn.fw.morax.dao.eval.EvalUserRankStageReportDao; | |
5 | +import cn.fw.morax.domain.db.eval.EvalUserRankStageReport; | |
6 | +import cn.fw.morax.service.data.eval.EvalUserRankStageReportService; | |
7 | +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | |
8 | +import org.springframework.stereotype.Service; | |
9 | + | |
10 | +/** | |
11 | + * <p> | |
12 | + * 报表绩效排名组 服务实现类 | |
13 | + * </p> | |
14 | + * | |
15 | + * @author jiangchao | |
16 | + * @since 2023-03-31 | |
17 | + */ | |
18 | +@Service | |
19 | +public class EvalUserRankStageServiceImplReport extends ServiceImpl<EvalUserRankStageReportDao, EvalUserRankStageReport> | |
20 | + implements EvalUserRankStageReportService { | |
21 | + | |
22 | +} | ... | ... |