EvalPoolCommonService.java 10.4 KB
package cn.fw.morax.service.biz.eval;

import cn.fw.ehr.sdk.api.enums.StaffShopTypeEnum;
import cn.fw.morax.common.utils.PublicUtil;
import cn.fw.morax.domain.db.eval.*;
import cn.fw.morax.domain.enums.EvalScopeEnum;
import cn.fw.morax.domain.enums.EvalShopPoolStatusEnum;
import cn.fw.morax.rpc.ehr.EhrRpcService;
import cn.fw.morax.rpc.ehr.dto.StaffBaseInfoDTO;
import cn.fw.morax.rpc.ehr.dto.StaffShopInfoDTO;
import cn.fw.morax.rpc.oop.OopRpcService;
import cn.fw.morax.rpc.oop.dto.ShopDTO;
import cn.fw.morax.service.data.eval.EvalGroupRewardDimService;
import cn.fw.morax.service.data.eval.EvalShopPoolService;
import cn.fw.morax.service.data.eval.EvalUserPoolService;
import cn.fw.morax.service.data.salary.SalaryGroupUserService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.map.MultiKeyMap;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.YearMonth;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author : kurisu
 * @version : 1.0
 * @className : SalaryPoolCommonService
 * @description : 绩效池公用方法
 * @date : 2022-09-27 11:40
 */
@Slf4j
@Service
@AllArgsConstructor
public class EvalPoolCommonService {

    private SalaryGroupUserService salaryGroupUserService;
    private EvalUserPoolService evalUserPoolService;
    private EvalGroupRewardDimService evalGroupRewardDimService;
    private EvalShopPoolService evalShopPoolService;
    private EhrRpcService ehrRpcService;
    private OopRpcService oopRpcService;

    public Map<Long, EvalUserPool> inspectionUserPoolMap(EvalGroup evalGroup, EvalGroupRankStage evalGroupRankStage, List<EvalGroupUser> users, LocalDate localDate) {
        if (PublicUtil.isEmpty(users)) {
            return new HashMap<>();
        }
        Set<Long> userIds = users.stream().map(EvalGroupUser::getUserId).collect(Collectors.toSet());
        List<EvalUserPool> pools = evalUserPoolService.list(Wrappers.<EvalUserPool>lambdaQuery()
                .eq(EvalUserPool::getEvalGroupRankStageId, evalGroupRankStage.getId())
                .eq(EvalUserPool::getMonthly, YearMonth.from(localDate))
                .in(EvalUserPool::getUserId, userIds)
                .eq(EvalUserPool::getYn, Boolean.TRUE)
        );

        //人员可能在考评组中出现多次(调岗)
        MultiKeyMap<Long, EvalUserPool> userShopPostShopIdMap = new MultiKeyMap<>();
        for (EvalUserPool pool : pools) {
            userShopPostShopIdMap.put(pool.getUserId(), pool.getShopId(), pool.getPostId(), pool);
        }

        for (EvalGroupUser user : users) {
            if (! userShopPostShopIdMap.containsKey(user.getUserId(), user.getShopId(), user.getPostId())) {
                EvalUserPool userPool = inspectionUserPool(user);
                userShopPostShopIdMap.put(user.getUserId(), user.getShopId(), user.getPostId(), userPool);
            }
        }

        Map<Long, EvalUserPool> userPoolMap = userShopPostShopIdMap.values().stream().collect(Collectors.toMap(EvalUserPool::getUserId, Function.identity(), (v1, v2) -> {
            log.error("同一个考评组、考评人员出现两条考评池数据。用户id:{},考评组:{}", v1.getUserId(), evalGroup);
            return v1;
        }));

        return userPoolMap;
    }


    public Map<Long, EvalShopPool> inspectionShopPools(EvalGroup evalGroup, LocalDate localDate, List<Long> distShopIds) {
        Set<Long> evalGroupShopIds = new HashSet<>(evalGroup.getShopIds());
        List<EvalShopPool> pools = evalShopPoolService.list(Wrappers.<EvalShopPool>lambdaQuery()
                .eq(EvalShopPool::getEvalGroupId, evalGroup.getId())
                .in(EvalShopPool::getShopId, evalGroupShopIds)
                .eq(EvalShopPool::getMonthly, YearMonth.from(localDate))
                .eq(EvalShopPool::getYn, Boolean.TRUE)
        );

        Map<Long, EvalShopPool> shopPoolMap = pools.stream().collect(Collectors.toMap(EvalShopPool::getShopId, Function.identity(), (v1, v2) -> {
            log.error("同一个考评组、考评门店出现两条考评池数据。门店id:{},考评组:{}", v1.getShopId(), evalGroup);
            return v1;
        }));

        for (Long shopId : evalGroupShopIds) {
            if (! shopPoolMap.containsKey(shopId)) {
                EvalShopPoolStatusEnum status = (distShopIds.contains(shopId))
                        ? EvalShopPoolStatusEnum.CALC_REWARD : EvalShopPoolStatusEnum.NO_REWARD;
                EvalShopPool shopPool = this.createShopPoolData(shopId, evalGroup, localDate, status);
                shopPoolMap.put(shopId, shopPool);
            }
        }
        return shopPoolMap;
    }

    @Transactional(rollbackFor = Exception.class)
    public EvalShopPool createShopPoolData(Long shopId, EvalGroup evalGroup, LocalDate localDate, EvalShopPoolStatusEnum status) {
        ShopDTO shopDTO = oopRpcService.queryShop(shopId);
        EvalShopPool evalShopPool = new EvalShopPool();
        evalShopPool.setEgc(evalGroup.getEgc());
        evalShopPool.setEvalGroupId(evalGroup.getId());
        evalShopPool.setEvalGroupRankId(evalGroup.getEvalGroupRankId());
        evalShopPool.setEvalGroupRankStageId(evalGroup.getEvalGroupRankStageId());
//        evalShopPool.setEvalId(evalGroup.getEvalId());
        evalShopPool.setStatus(status);
        evalShopPool.setShopId(shopId);
        evalShopPool.setShopName(shopDTO.getShortName());
        evalShopPool.setScore(BigDecimal.ZERO);
        evalShopPool.setScoreRatio(BigDecimal.ZERO);
        evalShopPool.setMonthly(YearMonth.from(localDate));
        evalShopPool.setReward(BigDecimal.ZERO);
        evalShopPool.setGroupId(evalGroup.getGroupId());
        evalShopPool.setYn(Boolean.TRUE);
        evalShopPoolService.save(evalShopPool);
        return evalShopPool;
    }

    /**
     * 查询薪酬池
     *
     * @param user
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public EvalUserPool inspectionUserPool(EvalGroupUser user) {
        EvalUserPool evalUserPool = evalUserPoolService.getOne(Wrappers.<EvalUserPool>lambdaQuery()
                        .eq(EvalUserPool::getEvalGroupRankStageId, user.getEvalGroupRankStageId())
                        .eq(EvalUserPool::getUserId, user.getUserId())
                        .eq(EvalUserPool::getPostId, user.getPostId())
                        .eq(EvalUserPool::getShopId, user.getShopId())
                        .eq(EvalUserPool::getMonthly, YearMonth.from(user.getDataDate()))
                        .eq(EvalUserPool::getYn, Boolean.TRUE)
                , Boolean.FALSE);
        if (PublicUtil.isNotEmpty(evalUserPool)) {
            return evalUserPool;
        }
//        evalUserPool = evalUserPoolService.getOne(Wrappers.<EvalUserPool>lambdaQuery()
//                        .eq(EvalUserPool::getEvalGroupRankStageId, user.getEvalGroupRankStageId())
//                        .eq(EvalUserPool::getUserId, user.getUserId())
//                        .eq(EvalUserPool::getMonthly, YearMonth.from(user.getDataDate()).minusMonths(1))
//                        .eq(EvalUserPool::getYn, Boolean.TRUE)
//                , Boolean.FALSE);
//        if (PublicUtil.isNotEmpty(evalUserPool)) {
//            evalUserPoolService.update(Wrappers.<EvalUserPool>lambdaUpdate()
//                    .eq(EvalUserPool::getId, evalUserPool.getId())
//                    .set(EvalUserPool::getMonthly, YearMonth.from(user.getDataDate()))
//                    .set(EvalUserPool::getUpdateTime, new Date())
//            );
//            evalUserPool.setMonthly(YearMonth.from(user.getDataDate()));
//            return evalUserPool;
//        }
        return this.createUserPoolData(user);
    }

    /**
     * 获取员工社保公积金门店
     *
     * @param userId
     */
    private StaffShopInfoDTO getFundShopInfo(Long userId) {
        StaffBaseInfoDTO staff = ehrRpcService.queryStaffBaseInfo(userId);
        if (PublicUtil.isEmpty(staff) || PublicUtil.isEmpty(staff.getStaffShopList())) {
            log.error("员工没有社保公积金门店,userId:{}", userId);
        }
        return staff.getStaffShopList().stream()
                .filter(shop -> StaffShopTypeEnum.FUND_SHOP.getValue().equals(shop.getType()))
                .findFirst()
                .orElse(null);

    }

    @Transactional(rollbackFor = Exception.class)
    public EvalUserPool modifyPoolData(EvalUserPool pool, EvalGroupUser user) {
        pool.setEvalGroupId(user.getEvalGroupId());
        pool.setShopId(user.getShopId());
        pool.setShopName(user.getShopName());
        pool.setEgc(user.getEgc());
        evalUserPoolService.updateById(pool);
        return pool;
    }

    @Transactional(rollbackFor = Exception.class)
    public EvalUserPool createUserPoolData(EvalGroupUser user) {
        EvalUserPool evalUserPool = new EvalUserPool();
//        evalUserPool.setEvalId(user.getEvalGroupRankId());
        evalUserPool.setEgc(user.getEgc());
        evalUserPool.setEvalGroupId(user.getEvalGroupId());
        evalUserPool.setEvalGroupRankId(user.getEvalGroupRankId());
        evalUserPool.setEvalGroupRankStageId(user.getEvalGroupRankStageId());
        evalUserPool.setUserId(user.getUserId());
        evalUserPool.setUserName(user.getUserName());
        evalUserPool.setPostId(user.getPostId());
        evalUserPool.setPostName(user.getPostName());
        evalUserPool.setShopId(user.getShopId());
        evalUserPool.setShopName(user.getShopName());
        evalUserPool.setScore(BigDecimal.ZERO);
        evalUserPool.setScoreRatio(BigDecimal.ZERO);
        evalUserPool.setInclusion(Boolean.FALSE.equals(user.getIgnored()));
//        evalUserPool.setScoreRatio(BigDecimal.ZERO);
        evalUserPool.setReward(BigDecimal.ZERO);
        evalUserPool.setMonthly(YearMonth.from(user.getDataDate()));
//        evalUserPool.setRegular(Boolean.FALSE);
        evalUserPool.setGroupId(user.getGroupId());
        evalUserPool.setYn(Boolean.TRUE);
        StaffShopInfoDTO staffShopInfoDTO = this.getFundShopInfo(user.getUserId());
        if (PublicUtil.isNotEmpty(staffShopInfoDTO)) {
            evalUserPool.setFundShopId(staffShopInfoDTO.getShopId());
            evalUserPool.setFundShopName(staffShopInfoDTO.getShopName());
        }
        evalUserPoolService.save(evalUserPool);
        return evalUserPool;
    }

}