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 {
+
+}