package cn.fw.morax.server.controller.app; import cn.fw.common.exception.BusinessException; import cn.fw.common.page.AppPage; import cn.fw.common.web.annotation.ControllerMethod; import cn.fw.common.web.auth.LoginAuthBean; import cn.fw.common.web.auth.annotation.CurrentUser; import cn.fw.data.base.domain.common.Message; import cn.fw.morax.common.utils.PublicUtil; import cn.fw.morax.domain.dto.eval.EvalGroupIndicatorRankDTO; import cn.fw.morax.domain.dto.eval.EvalUserRankDTO; import cn.fw.morax.domain.dto.query.EvalPoolQueryDTO; import cn.fw.morax.domain.enums.EvalScopeEnum; import cn.fw.morax.domain.vo.EvalPoolVO; import cn.fw.morax.domain.vo.EvalSelectorVO; import cn.fw.morax.domain.vo.eval.*; import cn.fw.morax.domain.vo.kpi.KpiIndicatorRankVO; import cn.fw.morax.service.biz.eval.*; import cn.fw.security.auth.client.annotation.Authorization; import cn.fw.security.auth.client.annotation.IgnoreAuth; import cn.fw.security.auth.client.annotation.IgnoreUserToken; import cn.fw.security.auth.client.enums.AuthType; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import javax.validation.constraints.NotNull; import java.time.LocalDate; import java.time.YearMonth; import java.util.List; import java.util.Objects; import static cn.fw.common.businessvalidator.Validator.BV; import static cn.fw.common.web.util.ResultBuilder.success; /** * 考评池 * * @author jiangchao * @since 2022-11-09 */ @Slf4j @RequiredArgsConstructor @Authorization(AuthType.APP) @Validated @IgnoreAuth @RestController @RequestMapping("/app/eval-pool") public class EvalPoolController { private final EvalPoolService evalPoolService; private final EvalGroupPoolService evalGroupPoolService; /** * 人员考评池列表 * * @param dto * @return * @ignoreParams currentUser */ @GetMapping("/staffs") @ControllerMethod("人员考评池列表") public Message> queryUserPool(@Validated EvalPoolQueryDTO dto) { if (PublicUtil.isEmpty(dto.getMonthly())) { dto.setMonthly(YearMonth.now()); } return success(evalPoolService.queryUserPool(dto)); } /** * 本月可查看的其他考评池选项 * * @param user 用户id * @param userId 用户id [管理层查看人员薪酬详情时需传值] * @param monthly 月度 [员工人查看自己的酬详情时需传值] * @return 薪酬池选项 * @ignoreParams user */ @GetMapping("/staff-selector") @IgnoreUserToken @ControllerMethod("本月可查看的其他考评池选项") public Message evalPoolSelector(@CurrentUser LoginAuthBean user, Long userId, @RequestParam(required = false) YearMonth monthly) { if (Objects.isNull(monthly)) { monthly = YearMonth.now(); } if (Objects.isNull(userId)) { userId = user.getUserId(); } return success(evalGroupPoolService.evalPoolSelector(userId, monthly)); } /** * 考评详情查询 (查看自己考评详情) */ @GetMapping("/own-detail") @ControllerMethod("考评详情查询") public Message> evalPoolOwnDetail(@CurrentUser Long userId, @Valid EvalUserRankDTO dto) { dto.initMonthly(); dto.setUserId(userId); return success(evalGroupPoolService.queryRankStagePools(dto)); } /** * 考评详情查询 (查看他人考评详情) * */ @GetMapping("/detail") @ControllerMethod("考评详情查询") public Message> evalPoolDetail(@Valid EvalUserRankDTO dto) { dto.initMonthly(); if (PublicUtil.isEmpty(dto.getUserId())) { throw new BusinessException("人员信息不能为空"); } return success(evalGroupPoolService.queryRankStagePools(dto)); } /** * 员工考评得分详情 * * @param evalPoolId * @param evalGroupIndicatorId * @return */ @GetMapping("/staff/score-detail") @IgnoreAuth @ControllerMethod("员工考评得分详情") public Message getStaffHitIndicatorDetail(@NotNull(message = "考评池id不能为空") Long evalPoolId, @NotNull(message = "指标id不能为空") Long evalGroupIndicatorId, @NotNull(message = "日期不能为空") @RequestParam("dataDate") LocalDate dataDate) { return success(evalGroupPoolService.staffHitIndicatorDetail(evalPoolId, evalGroupIndicatorId, dataDate)); } /** * 员工奖惩详情 * * @param evalPoolId * @param evalGroupRewardId * @return */ @GetMapping("/staff/reward-detail") @IgnoreAuth @ControllerMethod("员工奖惩详情") public Message getStaffRewardDetail(@NotNull(message = "考评池id不能为空") Long evalPoolId, @NotNull(message = "指标id不能为空") Long evalGroupRewardId, @NotNull(message = "日期不能为空") @RequestParam("dataDate") LocalDate dataDate) { return success(evalGroupPoolService.staffHitRewardDetail(evalPoolId, evalGroupRewardId, dataDate)); } /** * 人员考评指标排名 * * @param dto * @return */ @GetMapping("/staff-indicator-rank") @ControllerMethod("人员考评指标排名") public Message queryKpiIndicatorRank(@Validated EvalGroupIndicatorRankDTO dto) { if (dto.getIsEvalGroupIndicator() && PublicUtil.isEmpty(dto.getEvalGroupIndicatorParamId()) && PublicUtil.isEmpty(dto.getEvalGroupIndicatorPreconditionId())) { throw new BusinessException("参数错误"); } if (! dto.getIsEvalGroupIndicator() && PublicUtil.isEmpty(dto.getEvalGroupRewardParamId()) && PublicUtil.isEmpty(dto.getEvalGroupRewardPreconditionId())) { throw new BusinessException("参数错误"); } return success(evalGroupPoolService.queryIndicatorRank(dto, EvalScopeEnum.STAFF)); } /** * 门店考评指标排名 * * @param dto * @return */ @GetMapping("/shop-indicator-rank") @ControllerMethod("门店考评指标排名") public Message queryShopIndicatorRank(@Validated EvalGroupIndicatorRankDTO dto) { if (dto.getIsEvalGroupIndicator() && PublicUtil.isEmpty(dto.getEvalGroupIndicatorParamId()) && PublicUtil.isEmpty(dto.getEvalGroupIndicatorPreconditionId())) { throw new BusinessException("参数错误"); } if (! dto.getIsEvalGroupIndicator() && PublicUtil.isEmpty(dto.getEvalGroupRewardParamId()) && PublicUtil.isEmpty(dto.getEvalGroupRewardPreconditionId())) { throw new BusinessException("参数错误"); } return success(evalGroupPoolService.queryIndicatorRank(dto, EvalScopeEnum.SHOP)); } /** * 门店、人员考评条件指标排名(排名条件使用) * * @param preconditionId * @param dataDate * @return */ @GetMapping("/reward-cond-rank") @ControllerMethod("门店、人员考评条件指标排名") public Message> queryRewardCondRank(Long preconditionId, @NotNull(message = "日期不能为空") @RequestParam("dataDate") LocalDate dataDate) { return success(evalGroupPoolService.getRewardCondRankLogs(preconditionId, dataDate)); } /** * 门店、人员考评提成指标排名(排名计算使用) * * @param evalGroupRewardId * @param dataDate * @return */ @GetMapping("/reward-rank") @ControllerMethod("门店、人员考评奖惩排名") public Message> queryRewardCommissionRank(Long evalGroupRewardId, @NotNull(message = "日期不能为空") @RequestParam("dataDate") LocalDate dataDate) { return success(evalGroupPoolService.queryRewardCommissionRank(evalGroupRewardId, dataDate)); } /** * 门店、人员考评奖惩占比(占比计算使用) * * @param evalGroupRewardId * @param dataDate * @return */ @GetMapping("/reward-proportion") @ControllerMethod("门店、人员考评奖惩占比") public Message> queryUserRewardProportion(@NotNull(message = "奖惩id不能为空") Long evalGroupRewardId, @NotNull(message = "类型不能为空") Integer scopeType, @NotNull(message = "日期不能为空") @RequestParam("dataDate") LocalDate dataDate) { EvalScopeEnum scopeTypeEnum = EvalScopeEnum.ofValue(scopeType); BV.notNull(scopeTypeEnum, "参数错误"); return success(evalGroupPoolService.queryRewardProportion(scopeTypeEnum, evalGroupRewardId, dataDate)); } /** * 门店考评池列表 * * @param dto * @return * @ignoreParams currentUser */ @GetMapping("/shops") @ControllerMethod("门店考评池列表") public Message> queryShopPool(@Validated EvalPoolQueryDTO dto) { if (PublicUtil.isEmpty(dto.getMonthly())) { dto.setMonthly(YearMonth.now()); } return success(evalPoolService.queryShopPool(dto)); } /** * 门店考评详情查询 * * @param evalPoolId 用户id * @return 绩效池详情 * @ignoreParams userId */ @GetMapping("/shop") @ControllerMethod("门店考评详情查询") public Message queryShopPoolDetail(@NotNull(message = "考评池id不能为空") Long evalPoolId) { return success(evalGroupPoolService.queryShopPoolDetail(evalPoolId)); } /** * 门店考评得分详情 * * @param evalPoolId * @param evalGroupIndicatorId * @return */ @GetMapping("/shop/score-detail") @IgnoreAuth @ControllerMethod("门店考评得分详情") public Message getShopHitIndicatorDetail(@NotNull(message = "考评池id不能为空") Long evalPoolId, @NotNull(message = "指标id不能为空") Long evalGroupIndicatorId, @NotNull(message = "日期不能为空") @RequestParam("dataDate") LocalDate dataDate) { return success(evalGroupPoolService.shopHitIndicatorDetail(evalPoolId, evalGroupIndicatorId, dataDate)); } /** * 门店奖惩详情 * * @param evalPoolId * @param evalGroupRewardId * @return */ @GetMapping("/shop/reward-detail") @IgnoreAuth @ControllerMethod("门店奖惩详情") public Message getShopRewardDetail(@NotNull(message = "考评池id不能为空") Long evalPoolId, @NotNull(message = "指标id不能为空") Long evalGroupRewardId, @NotNull(message = "日期不能为空") @RequestParam("dataDate") LocalDate dataDate) { return success(evalGroupPoolService.shopHitRewardDetail(evalPoolId, evalGroupRewardId, dataDate)); } }