diff --git a/fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalUserExtraReportDao.java b/fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalUserExtraReportDao.java new file mode 100644 index 0000000..cdd192b --- /dev/null +++ b/fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalUserExtraReportDao.java @@ -0,0 +1,18 @@ +package cn.fw.morax.dao.eval; + + +import cn.fw.morax.domain.db.eval.EvalUserExtraReport; +import cn.fw.morax.domain.db.eval.EvalUserReport; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 报表编码数据 Mapper 接口 + *

+ * + * @author jiangchao + * @since 2023-03-31 + */ +public interface EvalUserExtraReportDao extends BaseMapper { + +} diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalUserExtraReport.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalUserExtraReport.java new file mode 100644 index 0000000..07655f5 --- /dev/null +++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalUserExtraReport.java @@ -0,0 +1,60 @@ +package cn.fw.morax.domain.db.eval; + +import cn.fw.common.data.entity.BaseEntity; +import cn.fw.common.data.mybatis.handler.LongListTypeHandler; +import cn.fw.common.data.mybatis.handler.StringListTypeHandler; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + *

+ * 报表编码维度数据表(额外数据) + *

+ * + * @author jiangchao + * @since 2023-04-17 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName(autoResultMap = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EvalUserExtraReport extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 考评报表id + */ + private Long evalUserReportId; + + /** + * 适用门店ids + */ + @TableField(typeHandler = LongListTypeHandler.class) + private List shopIds; + + /** + * 人员ids + */ + @TableField(typeHandler = LongListTypeHandler.class) + private List staffIds; + + /** + * 适用角色编码 + */ + @TableField(typeHandler = StringListTypeHandler.class) + private List roleCodes; + /** + * 适用角色名称 + */ + @TableField(typeHandler = StringListTypeHandler.class) + private List roleNames; + +} diff --git a/fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalUserReportTask.java b/fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalUserReportTask.java index 1cf0aa0..400a366 100644 --- a/fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalUserReportTask.java +++ b/fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalUserReportTask.java @@ -4,12 +4,24 @@ import cn.fw.common.cache.locker.DistributedLocker; import cn.fw.morax.common.constant.Constant; import cn.fw.morax.common.constant.TimeTaskConstant; import cn.fw.morax.common.utils.PublicUtil; +import cn.fw.morax.domain.bo.salary.SalaryGroupProjectBO; import cn.fw.morax.domain.db.eval.*; import cn.fw.morax.domain.db.kpi.IndicatorUserValue; +import cn.fw.morax.domain.db.salary.ReportSalaryDim; +import cn.fw.morax.domain.db.salary.ReportSalaryDimExtra; +import cn.fw.morax.domain.db.salary.ReportSalaryDimValue; +import cn.fw.morax.domain.db.salary.SalaryPool; import cn.fw.morax.domain.enums.*; +import cn.fw.morax.domain.vo.salary.SalaryGroupProjectParamVO; +import cn.fw.morax.rpc.ehr.EhrRpcService; +import cn.fw.morax.rpc.ehr.dto.ManagerDTO; +import cn.fw.morax.rpc.ehr.dto.ManagerStaffRoleDTO; +import cn.fw.morax.rpc.ehr.dto.ManagerStaffShopDTO; +import cn.fw.morax.rpc.ehr.dto.StaffBaseInfoDTO; import cn.fw.morax.service.biz.CommonService; import cn.fw.morax.service.data.eval.*; import cn.fw.morax.service.data.kpi.IndicatorUserValueService; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.google.common.collect.Maps; import lombok.Getter; @@ -60,13 +72,15 @@ public class EvalUserReportTask { private final PlatformTransactionManager platformTransactionManager; private final EvalUserRankReportService evalUserRankReportService; private final EvalGroupRankStageService evalGroupRankStageService; + private final EvalUserExtraReportService evalUserExtraReportService; private final EvalUserReportService evalUserReportService; private final TransactionDefinition transactionDefinition; private final EvalUserPoolService evalUserPoolService; private final EvalShopPoolService evalShopPoolService; private final EvalGroupRankService evalGroupRankService; - private final EvalGroupService evalGroupService; private final DistributedLocker distributedLocker; + private final EvalGroupService evalGroupService; + private final EhrRpcService ehrRpcService; private final CommonService commonService; @Value("${spring.cache.custom.global-prefix}:eval:user:report") @@ -80,7 +94,7 @@ public class EvalUserReportTask { @Scheduled(cron = TimeTaskConstant.EVAL_REPORT) @Transactional(rollbackFor = Exception.class) public void evalUserReportTask() { -// this.evalUserReport(LocalDate.now().minusDays(1)); + this.evalUserReport(LocalDate.now().minusDays(1)); } /** @@ -134,6 +148,8 @@ public class EvalUserReportTask { EvalUserRankReport reportRank = this.saveRankReport(rank, date, groupId); final Long evalUserRankReportId = reportRank.getId(); for (EvalGroupRankStage rankStage : stages) { + //如果当前时间 大于 考评阶段结束时间,使用考评结束时间进行查询 + LocalDate dataDate = (date.compareTo(rankStage.getOverTime()) > 0) ? rankStage.getOverTime() : date; List evalGroups = evalGroupService.getEvalGroups(rank.getId()); List evalGroupIds = evalGroups.stream().map(EvalGroup::getId).collect(Collectors.toList()); if (PublicUtil.isEmpty(evalGroupIds)) { @@ -141,12 +157,12 @@ public class EvalUserReportTask { } List userPools = evalUserPoolService.list(Wrappers.lambdaQuery() .in(EvalUserPool::getEvalGroupId, evalGroupIds) - .eq(EvalUserPool::getMonthly, YearMonth.from(date)) + .eq(EvalUserPool::getMonthly, YearMonth.from(dataDate)) .eq(EvalUserPool::getYn, Boolean.TRUE) ); List shopPools = evalShopPoolService.list(Wrappers.lambdaQuery() .in(EvalShopPool::getEvalGroupId, evalGroupIds) - .eq(EvalShopPool::getMonthly, YearMonth.from(date)) + .eq(EvalShopPool::getMonthly, YearMonth.from(dataDate)) .eq(EvalShopPool::getYn, Boolean.TRUE) ); List evalGroupIndicators = evalGroupIndicatorService.list(Wrappers.lambdaQuery() @@ -155,16 +171,19 @@ public class EvalUserReportTask { .orderByAsc(EvalGroupIndicator::getId) ); + //排名组阶段 EvalUserRankStageReport rankStageReport = this.saveRankStageReport(reportRank, rank, rankStage, evalGroups); final Long evalUserRankStageReportId = rankStageReport.getId(); //排名组指标编码、人员、门店 - List rankCodes = this.saveRankCodeReports(evalGroupIndicators, evalUserRankReportId, evalUserRankStageReportId, date); - List evalUserReports = this.saveStaffReports(userPools, date, evalUserRankReportId, evalUserRankStageReportId); - List evalShopReports = this.saveShopReports(shopPools, date, evalUserRankReportId, evalUserRankStageReportId); + List rankCodes = this.saveRankCodeReports(evalGroupIndicators, evalUserRankReportId, evalUserRankStageReportId, dataDate); + List evalUserReports = this.saveStaffReports(userPools, dataDate, evalUserRankReportId, evalUserRankStageReportId); + List evalShopReports = this.saveShopReports(shopPools, dataDate, evalUserRankReportId, evalUserRankStageReportId); //人员维度 - List reportUserValues = calcUser(userPools, evalGroupIndicators, evalUserReports, date); + List reportUserValues = calcUser(userPools, evalGroupIndicators, evalUserReports, dataDate); + //门店维度 + calcShop(shopPools, evalGroupIndicators, evalShopReports, dataDate); //门店维度 - calcShop(shopPools, evalGroupIndicators, evalShopReports, date); + calcManager(userPools, reportUserValues, rankCodes, evalUserReports, rankStageReport, dataDate); } @@ -173,6 +192,9 @@ public class EvalUserReportTask { List evalGroupIndicators, List evalUserReports, LocalDate date) { + if (PublicUtil.isEmpty(pools)) { + return new ArrayList<>(); + } List reportUserValues = new ArrayList<>(); List userIds = pools.stream().map(EvalUserPool::getUserId).distinct().collect(Collectors.toList()); List poolIds = pools.stream().map(EvalUserPool::getId).collect(Collectors.toList()); @@ -260,9 +282,6 @@ public class EvalUserReportTask { } Optional hitLog = Optional.ofNullable(poolHitLogMap.get(pool.getId())); - if (pool.getDataDate().compareTo(date) != 0) { - hitLog = evalGroupIndicatorHitLogService.getHitLog(evalGroupIndicatorId, pool.getId(), EvalScopeEnum.SHOP, pool.getDataDate()); - } BigDecimal value = (ScoreWayEnum.LADDER.equals(scoreWay)) ? hitLog.map(EvalGroupIndicatorHitLog::getHitLadderValue).orElse(BigDecimal.ZERO) : hitLog.map(EvalGroupIndicatorHitLog::getHitCommissionValue).orElse(BigDecimal.ZERO); @@ -275,9 +294,7 @@ public class EvalUserReportTask { for (EvalGroupIndicatorParam param : params) { Map targetHitLogMap = queryTargetValue(param.getId(), poolIds, date, EvalScopeEnum.SHOP); for (EvalShopPool pool : pools) { - Boolean staffChange = pool.getDataDate().compareTo(date) != 0; - EvalGroupIndicatorTargetHitLog targetHitLog = (staffChange) - ? queryTargetValue(param.getId(), pool.getId(), pool.getDataDate(), EvalScopeEnum.SHOP) : targetHitLogMap.get(pool.getId()); + EvalGroupIndicatorTargetHitLog targetHitLog = targetHitLogMap.get(pool.getId()); BigDecimal value = this.getParamValue(targetHitLog); Long evalUserReportId = shopPoolReportIdMap.get(pool.getId()); reportUserValues.add(convertParamDB(evalUserReportId, param, value, date)); @@ -291,6 +308,55 @@ public class EvalUserReportTask { return reportUserValues; } + public void calcManager(List pools, + List reportUserValues, + List rankCodes, + List evalUserReports, + EvalUserRankStageReport rankStageReport, + LocalDate date) { + if (PublicUtil.isEmpty(pools)) { + return; + } + List shopIds = pools.stream().map(EvalUserPool::getShopId).collect(Collectors.toList()); + List managerDTOS = ehrRpcService.getRealTimeShopManager(new ArrayList<>(shopIds)); + log.info("查询门店实时管理者:{},{}", JSON.toJSONString(shopIds), JSON.toJSONString(managerDTOS)); + if (PublicUtil.isEmpty(managerDTOS)) { + return; + } + Map managerMap = staffInfoMap(managerDTOS); + List valueReports = new ArrayList<>(); + for (ManagerDTO manager : managerDTOS) { + if (PublicUtil.isEmpty(manager.getManageStaffList())) { + continue; + } + List manageStaffIds = manager.getManageStaffList().stream().map(StaffBaseInfoDTO::getId).distinct().collect(Collectors.toList()); + Set managerStaffDimReportIds = evalUserReports.stream() + .filter(user -> manageStaffIds.contains(user.getUserId())) + .map(EvalUserReport::getId).collect(Collectors.toSet()); + if (PublicUtil.isEmpty(managerStaffDimReportIds)) { + continue; + } + final Long managerEvalUserReportId = this.saveManagerDimDB(manager, rankStageReport, managerMap, manageStaffIds, date); + + for (EvalUserRankCodeReport codeReport : rankCodes) { + BigDecimal value = calcAverageValue(reportUserValues, managerStaffDimReportIds, codeReport.getCode()); + valueReports.add(this.convertManagerValue(managerEvalUserReportId, codeReport, value, date)); + } + } + if (PublicUtil.isNotEmpty(valueReports)) { + evalUserValueReportService.saveBatch(valueReports); + } + } + + public BigDecimal calcAverageValue(List valueReports, Set managerStaffDimReportIds, String code) { + Double averageRatioDouble = valueReports.stream() + .filter(user -> managerStaffDimReportIds.contains(user.getEvalUserReportId()) && code.equals(user.getCode())) + .mapToDouble(userValue -> Optional.ofNullable(userValue.getValue()).orElse(BigDecimal.ZERO).doubleValue()) + .average() + .orElse(0); + return new BigDecimal(averageRatioDouble.toString()); + } + public BigDecimal getParamValue(EvalGroupIndicatorTargetHitLog hitLog) { if (PublicUtil.isEmpty(hitLog) || PublicUtil.isEmpty(hitLog.getUseTarget())) { return BigDecimal.ZERO; @@ -470,7 +536,7 @@ public class EvalUserReportTask { .eq(EvalGroupIndicatorParam::getYn, Boolean.TRUE) ); for (EvalGroupIndicatorParam indicatorParam : params) { - rankCodes.add(this.convertParamToRankCodeDB(indicatorParam, date, reportRankId, order, groupIndicator)); + rankCodes.add(this.convertParamToRankCodeDB(indicatorParam, date, reportRankId, evalUserRankStageReportId, order, groupIndicator)); } } @@ -523,6 +589,62 @@ public class EvalUserReportTask { return reportRankStage; } + public Long saveManagerDimDB(ManagerDTO manager, EvalUserRankStageReport rankStageReport, + Map managerMap, + List manageStaffIds, LocalDate date) { + EvalUserReport evalUserReport = new EvalUserReport(); + evalUserReport.setEvalUserRankReportId(rankStageReport.getEvalGroupRankId()); + evalUserReport.setEvalUserRankStageReportId(rankStageReport.getEvalGroupRankStageId()); + evalUserReport.setDimension(ReportDimensionEnum.MANAGER); + evalUserReport.setUserId(manager.getStaffId()); + evalUserReport.setUserName(manager.getStaffName()); + evalUserReport.setDataDate(date); + if (managerMap.containsKey(manager.getStaffId())) { + StaffBaseInfoDTO staffInfo = managerMap.get(manager.getStaffId()); + evalUserReport.setShopId(staffInfo.getShopId()); + evalUserReport.setShopName(staffInfo.getShopName()); + evalUserReport.setPostId(staffInfo.getPostId()); + evalUserReport.setPostName(staffInfo.getPostName()); + } + + List roleCodes = manager.getScopeList().stream() + .flatMap(managerStaffVo -> managerStaffVo.getRoleList().stream()) + .map(ManagerStaffRoleDTO::getRoleCode) + .distinct() + .collect(Collectors.toList()); + List roleNames = manager.getScopeList().stream() + .flatMap(managerStaffVo -> managerStaffVo.getRoleList().stream()) + .map(ManagerStaffRoleDTO::getRoleName) + .distinct() + .collect(Collectors.toList()); + List shopIds = manager.getScopeList().stream() + .flatMap(managerStaffVo -> managerStaffVo.getShopList().stream()) + .map(ManagerStaffShopDTO::getShopId) + .distinct() + .collect(Collectors.toList()); + + evalUserReportService.save(evalUserReport); + EvalUserExtraReport evalUserExtraReport = EvalUserExtraReport.builder() + .evalUserReportId(evalUserReport.getId()) + .roleCodes(roleCodes) + .roleNames(roleNames) + .shopIds(shopIds) + .staffIds(manageStaffIds) + .build(); + evalUserExtraReportService.save(evalUserExtraReport); + return evalUserReport.getId(); + } + + public EvalUserValueReport convertManagerValue(Long managerEvalUserReportId, EvalUserRankCodeReport codeReport, BigDecimal value, LocalDate date) { + EvalUserValueReport userValue = new EvalUserValueReport(); + userValue.setEvalUserReportId(managerEvalUserReportId); + userValue.setCode(codeReport.getCode()); + userValue.setCodeType(codeReport.getCodeType()); + userValue.setValue(Optional.ofNullable(value).orElse(BigDecimal.ZERO)); + userValue.setDataDate(date); + return userValue; + } + public EvalUserValueReport convertDB(Long evalUserReportId, EvalGroupIndicator groupIndicator, BigDecimal value, LocalDate date, List params) { EvalUserValueReport userValue = new EvalUserValueReport(); @@ -575,10 +697,18 @@ public class EvalUserReportTask { return rankCode; } + public Map staffInfoMap(List managerDTOS) { + List staffIds = managerDTOS.stream().map(ManagerDTO::getStaffId).collect(Collectors.toList()); + List staffInfos = ehrRpcService.queryStaffBaseInfo(staffIds); + return staffInfos.stream().collect(Collectors.toMap(StaffBaseInfoDTO::getId, Function.identity(), (v1, v2) -> v1)); + } + public EvalUserRankCodeReport convertParamToRankCodeDB(EvalGroupIndicatorParam indicatorParam, LocalDate date, Long reportRankId, + Long evalUserRankStageReportId, AtomicInteger order, EvalGroupIndicator groupIndicator) { EvalUserRankCodeReport rankCode = new EvalUserRankCodeReport(); rankCode.setEvalUserRankReportId(reportRankId); + rankCode.setEvalUserRankStageReportId(evalUserRankStageReportId); rankCode.setEvalGroupIndicatorId(indicatorParam.getEvalGroupIndicatorId()); rankCode.setCode(indicatorParam.getCode()); rankCode.setCodeType(indicatorParam.getCodeType()); diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalUserExtraReportService.java b/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalUserExtraReportService.java new file mode 100644 index 0000000..c430f29 --- /dev/null +++ b/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalUserExtraReportService.java @@ -0,0 +1,18 @@ +package cn.fw.morax.service.data.eval; + + +import cn.fw.morax.domain.db.eval.EvalUserExtraReport; +import cn.fw.morax.domain.db.eval.EvalUserReport; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 报表编码数据 服务类 + *

+ * + * @author jiangchao + * @since 2023-03-31 + */ +public interface EvalUserExtraReportService extends IService { + +} diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalGroupIndicatorHitLogServiceImpl.java b/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalGroupIndicatorHitLogServiceImpl.java index a22c9bb..c3119c2 100644 --- a/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalGroupIndicatorHitLogServiceImpl.java +++ b/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalGroupIndicatorHitLogServiceImpl.java @@ -1,6 +1,7 @@ package cn.fw.morax.service.data.eval.impl; +import cn.fw.morax.common.utils.PublicUtil; import cn.fw.morax.dao.eval.EvalGroupIndicatorHitLogDao; import cn.fw.morax.domain.db.eval.EvalGroupIndicatorHitLog; import cn.fw.morax.domain.enums.EvalScopeEnum; @@ -10,6 +11,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -58,6 +60,9 @@ public class EvalGroupIndicatorHitLogServiceImpl extends ServiceImpl getHitLogs(List evalGroupIndicatorIds, List poolIds, EvalScopeEnum scopeType, LocalDate dataDate) { + if (PublicUtil.isEmpty(evalGroupIndicatorIds) || PublicUtil.isEmpty(poolIds)) { + return new ArrayList<>(); + } List indicatorHitLogs = this.list(Wrappers.lambdaQuery() .in(EvalGroupIndicatorHitLog::getEvalGroupIndicatorId, evalGroupIndicatorIds) .eq(EvalGroupIndicatorHitLog::getDataDate, dataDate) diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalUserExtraReportServiceImpl.java b/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalUserExtraReportServiceImpl.java new file mode 100644 index 0000000..a693873 --- /dev/null +++ b/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalUserExtraReportServiceImpl.java @@ -0,0 +1,24 @@ +package cn.fw.morax.service.data.eval.impl; + + +import cn.fw.morax.dao.eval.EvalUserExtraReportDao; +import cn.fw.morax.dao.eval.EvalUserReportDao; +import cn.fw.morax.domain.db.eval.EvalUserExtraReport; +import cn.fw.morax.domain.db.eval.EvalUserReport; +import cn.fw.morax.service.data.eval.EvalUserExtraReportService; +import cn.fw.morax.service.data.eval.EvalUserReportService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 报表编码数据 服务实现类 + *

+ * + * @author jiangchao + * @since 2023-03-31 + */ +@Service +public class EvalUserExtraReportServiceImpl extends ServiceImpl implements EvalUserExtraReportService { + +}