Commit f727712b05d612df64b7bdab9fc61a51e01793c3

Authored by 姜超
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&lt;EvalGroup, Long&gt; {
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
... ... @@ -13,7 +13,7 @@
13 13 <artifactId>fw-morax-sdk</artifactId>
14 14 <packaging>jar</packaging>
15 15 <name>fw-morax-sdk</name>
16   - <version>2.0.1</version>
  16 + <version>2.0.2</version>
17 17  
18 18 <properties>
19 19 <hibernate.validator>5.3.6.Final</hibernate.validator>
... ...
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
... ... @@ -26,7 +26,7 @@ public class KpiStageReportNoticeMQ {
26 26 /**
27 27 * 编码
28 28 */
29   - private String code;
  29 + private String indicatorCode;
30 30  
31 31 /**
32 32 * 阶段开始时间
... ...
fw-morax-server/pom.xml
... ... @@ -115,6 +115,10 @@
115 115 <groupId>p6spy</groupId>
116 116 <artifactId>p6spy</artifactId>
117 117 </dependency>
  118 + <dependency>
  119 + <groupId>cn.fw</groupId>
  120 + <artifactId>fw-morax-sdk</artifactId>
  121 + </dependency>
118 122 </dependencies>
119 123  
120 124 <build>
... ...
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
... ... @@ -52,6 +52,7 @@ public class KpiCalcTask {
52 52 indicatorBizService.persistenceUserData();
53 53 indicatorBizService.persistenceShopData();
54 54 indicatorBizService.persistenceUserStageData();
  55 + indicatorBizService.persistenceShopStageData();
55 56 }
56 57  
57 58 /**
... ...
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 * 获取带条件的绩效指标库
... ...
... ... @@ -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>
... ...