EvalPoolController.java 12.3 KB
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<AppPage<EvalUserPoolVO>> queryUserPool(@Validated EvalPoolQueryDTO dto) {
        if (PublicUtil.isEmpty(dto.getMonthly())) {
            dto.setMonthly(YearMonth.now());
        }
        return success(evalPoolService.queryUserPool(dto));
    }

    /**
     * 人员信息
     *
     * @return
     * @ignoreParams currentUser
     */
    @GetMapping("/staff-info")
    @ControllerMethod("人员信息")
    public Message<EvalUserPoolVO> queryUser(@CurrentUser LoginAuthBean user) {
        EvalUserPoolVO poolVO = new EvalUserPoolVO();
        if (PublicUtil.isNotEmpty(user)) {
            poolVO.setUserId(user.getUserId());
            poolVO.setUserName(user.getUserName());
        }
        return success(poolVO);
    }

    /**
     * 本月可查看的其他考评池选项
     *
     * @param user      用户id
     * @param userId    用户id [管理层查看人员薪酬详情时需传值]
     * @param monthly 月度 [员工人查看自己的酬详情时需传值]
     * @return 薪酬池选项
     * @ignoreParams user
     */
    @GetMapping("/staff-selector")
    @IgnoreUserToken
    @ControllerMethod("本月可查看的其他考评池选项")
    public Message<EvalPoolVO> 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<List<EvalUserRankStageVO>> evalPoolOwnDetail(@CurrentUser Long userId,
                                                                @Valid EvalUserRankDTO dto) {
        dto.initMonthly();
        dto.setUserId(userId);
        return success(evalGroupPoolService.queryRankStagePools(dto));
    }

    /**
     * 考评详情查询 (查看他人考评详情)
     *
     */
    @GetMapping("/detail")
    @ControllerMethod("考评详情查询")
    public Message<List<EvalUserRankStageVO>> 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<EvalPoolIndicatorDetailVO> 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<EvalPoolRewardDetailVO> 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<KpiIndicatorRankVO> 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<KpiIndicatorRankVO> 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<List<EvalGroupRewardRankLogVO>> 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<List<EvalGroupRewardRankLogVO>> 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<List<EvalGroupRewardHitLogVO>> 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<AppPage<EvalShopPoolVO>> 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<EvalShopPoolVO> queryShopPoolDetail(@NotNull(message = "考评池id不能为空") Long evalPoolId) {
        return success(evalGroupPoolService.queryShopPoolDetail(evalPoolId));
    }

    /**
     * 门店考评得分详情
     *
     * @param evalPoolId
     * @param evalGroupIndicatorId
     * @return
     */
    @GetMapping("/shop/score-detail")
    @IgnoreAuth
    @ControllerMethod("门店考评得分详情")
    public Message<EvalPoolIndicatorDetailVO> 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<EvalPoolRewardDetailVO> getShopRewardDetail(@NotNull(message = "考评池id不能为空") Long evalPoolId,
                                                                @NotNull(message = "指标id不能为空") Long evalGroupRewardId,
                                                                @NotNull(message = "日期不能为空") @RequestParam("dataDate") LocalDate dataDate) {
        return success(evalGroupPoolService.shopHitRewardDetail(evalPoolId, evalGroupRewardId, dataDate));
    }

}