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 inspectionUserPoolMap(EvalGroup evalGroup, EvalGroupRankStage evalGroupRankStage, List users, LocalDate localDate) { if (PublicUtil.isEmpty(users)) { return new HashMap<>(); } Set userIds = users.stream().map(EvalGroupUser::getUserId).collect(Collectors.toSet()); List pools = evalUserPoolService.list(Wrappers.lambdaQuery() .eq(EvalUserPool::getEvalGroupRankStageId, evalGroupRankStage.getId()) .eq(EvalUserPool::getMonthly, YearMonth.from(localDate)) .in(EvalUserPool::getUserId, userIds) .eq(EvalUserPool::getYn, Boolean.TRUE) ); //人员可能在考评组中出现多次(调岗) MultiKeyMap 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 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 inspectionShopPools(EvalGroup evalGroup, LocalDate localDate, List distShopIds) { Set evalGroupShopIds = new HashSet<>(evalGroup.getShopIds()); List pools = evalShopPoolService.list(Wrappers.lambdaQuery() .eq(EvalShopPool::getEvalGroupId, evalGroup.getId()) .in(EvalShopPool::getShopId, evalGroupShopIds) .eq(EvalShopPool::getMonthly, YearMonth.from(localDate)) .eq(EvalShopPool::getYn, Boolean.TRUE) ); Map 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.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.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.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; } }