package cn.fw.morax.service.biz; import cn.fw.approval.sdk.param.InitiateApprovalParam; import cn.fw.common.web.auth.LoginAuthBean; import cn.fw.morax.common.config.FlowVal; import cn.fw.morax.common.utils.DateUtil; import cn.fw.morax.common.utils.PublicUtil; import cn.fw.morax.domain.db.ApprovalRecord; import cn.fw.morax.domain.db.SettingDraft; import cn.fw.morax.domain.db.eval.Eval; import cn.fw.morax.domain.db.eval.EvalRewardDist; import cn.fw.morax.domain.db.kpi.KpiGroup; import cn.fw.morax.domain.db.kpi.KpiStarSpecialRule; import cn.fw.morax.domain.db.salary.SalaryGroup; import cn.fw.morax.domain.dto.eval.EvalGroupDTO; import cn.fw.morax.domain.dto.eval.EvalGroupRankDTO; import cn.fw.morax.domain.dto.kpi.KpiGroupDTO; import cn.fw.morax.domain.dto.kpi.KpiGroupRankDTO; import cn.fw.morax.domain.dto.salary.SalaryGroupDTO; import cn.fw.morax.domain.enums.ApprovalStatusEnum; import cn.fw.morax.domain.enums.ApprovalTypeEnum; import cn.fw.morax.rpc.approval.FlowApproveRpc; import cn.fw.morax.rpc.approval.dto.FlowDto; import cn.fw.morax.rpc.ehr.EhrRpcService; import cn.fw.morax.rpc.ehr.dto.StaffBaseInfoDTO; import cn.fw.morax.service.biz.salary.SalaryGeneralSettinBizService; import cn.fw.morax.service.biz.salary.SalarySettingCommonService; import cn.fw.morax.service.data.ApprovalRecordService; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.google.common.base.Joiner; import com.google.common.collect.Lists; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; import static cn.fw.common.businessvalidator.Validator.BV; @Slf4j @RequiredArgsConstructor @Service public class ApprovalBizService { private final SalarySettingCommonService salarySettingCommonService; private final SalaryGeneralSettinBizService salaryGeneralSettinBizService; private final ApprovalRecordService approvalRecordService; private final FlowApproveRpc flowApproveRpc; private final EhrRpcService ehrRpcService; private final FlowVal flowVal; /** * 提交审批 * * @param salaryGroup */ @Transactional(rollbackFor = Exception.class) public void applyApproveSalaryGroup(SalaryGroup salaryGroup, LoginAuthBean user, Integer staffNum) { Date expTime = PublicUtil.getExpTimeOfMonth(salaryGroup.getBeginTime()); //提交审批 List conditions = Lists.newArrayList(); InitiateApprovalParam.Condition postCondition = new InitiateApprovalParam.Condition(); postCondition.setParamName("postId"); postCondition.setValue(salaryGroup.getPostId().toString()); InitiateApprovalParam.Condition shopCondition = new InitiateApprovalParam.Condition(); shopCondition.setParamName("shopId"); List shopIdsStr = salaryGroup.getShopIds().stream().map(s -> s.toString()).collect(Collectors.toList()); shopCondition.setValue(String.join(",", shopIdsStr)); conditions.add(postCondition); conditions.add(shopCondition); Map extDataMap = new HashMap() {{ put("id", salaryGroup.getId().toString()); }}; FlowDto flowDto = FlowDto.builder() .groupId(salaryGroup.getGroupId()) .approvalNo(flowVal.getSalaryGroupConfig()) .briefContent(Lists.newArrayList( "申请人:" + user.getUserName(), "岗位:" + salaryGroup.getPostName(), // "薪酬项目:" + salaryGroup.getProjectNum() + "个", // "适用门店:" + salaryGroup.getShopIds().size() + "个", // "适用人员:" + staffNum + "人", "申请时间:" + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(LocalDateTime.now()) )) .initiatorId(user.getUserId()) .expTime(expTime) .shopIds(salaryGroup.getShopIds()) .conditions(conditions) .extData(extDataMap) .build(); String approvalNo = flowApproveRpc.initiate(flowDto); ApprovalRecord approvalRecord = ApprovalRecord.builder() .approvalNo(approvalNo) .approvalStatus(ApprovalStatusEnum.IN_APPROVAL) .approvalType(ApprovalTypeEnum.SALARY) .dataId(salaryGroup.getId()) .groupId(salaryGroup.getGroupId()) .build(); approvalRecordService.save(approvalRecord); } /** * 提交审批 * * @param kpiGroup */ @Transactional(rollbackFor = Exception.class) public void applyApproveKpi(KpiGroup kpiGroup, LoginAuthBean user, Integer staffNum) { Date expTime = PublicUtil.getExpTimeOfMonth(kpiGroup.getBeginTime()); //提交审批 List conditions = Lists.newArrayList(); InitiateApprovalParam.Condition postCondition = new InitiateApprovalParam.Condition(); postCondition.setParamName("postId"); postCondition.setValue(kpiGroup.getPostId().toString()); InitiateApprovalParam.Condition shopCondition = new InitiateApprovalParam.Condition(); shopCondition.setParamName("shopId"); List shopIdsStr = kpiGroup.getShopIds().stream().map(s -> s.toString()).collect(Collectors.toList()); shopCondition.setValue(String.join(",", shopIdsStr)); conditions.add(postCondition); conditions.add(shopCondition); Map extDataMap = new HashMap() {{ put("id", kpiGroup.getId().toString()); }}; FlowDto flowDto = FlowDto.builder() .groupId(kpiGroup.getGroupId()) .approvalNo(flowVal.getKpiGroupConfig()) .briefContent(Lists.newArrayList( "申请人:" + user.getUserName(), "岗位:" + kpiGroup.getPostName(), // "绩效项目:" + kpiGroup.getIndicatorNum() + "个", // "适用门店:" + kpiGroup.getShopIds().size() + "个", // "适用人员:" + staffNum + "人", "申请时间:" + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(LocalDateTime.now()) )) .initiatorId(user.getUserId()) .expTime(expTime) .shopIds(kpiGroup.getShopIds()) .conditions(conditions) .extData(extDataMap) .build(); String approvalNo = flowApproveRpc.initiate(flowDto); ApprovalRecord approvalRecord = ApprovalRecord.builder() .approvalNo(approvalNo) .approvalStatus(ApprovalStatusEnum.IN_APPROVAL) .approvalType(ApprovalTypeEnum.KPI) .dataId(kpiGroup.getId()) .groupId(kpiGroup.getGroupId()) .build(); approvalRecordService.save(approvalRecord); } /** * 提交审批 * * @param specialRule */ @Transactional(rollbackFor = Exception.class) public void applyKpiStarAdjustment(KpiStarSpecialRule specialRule, LoginAuthBean user, Date expTime) { //员工基础信息 StaffBaseInfoDTO staffInfo = ehrRpcService.queryStaffBaseInfo(specialRule.getUserId()); //提交审批 List conditions = Lists.newArrayList(); InitiateApprovalParam.Condition postCondition = new InitiateApprovalParam.Condition(); postCondition.setParamName("postId"); postCondition.setValue(staffInfo.getPostId().toString()); InitiateApprovalParam.Condition shopCondition = new InitiateApprovalParam.Condition(); shopCondition.setParamName("shopId"); shopCondition.setValue(staffInfo.getShopId().toString()); conditions.add(postCondition); conditions.add(shopCondition); Map extDataMap = new HashMap() {{ put("id", specialRule.getId().toString()); }}; FlowDto flowDto = FlowDto.builder() .groupId(specialRule.getGroupId()) .approvalNo(flowVal.getKpiStarAdjustment()) .briefContent(Lists.newArrayList( "申请人:" + user.getUserName(), "岗位:" + staffInfo.getPostName(), "在职门店:" + staffInfo.getShopName(), // "调整方式:" + staffInfo.getShopName(), "调整原因:" + specialRule.getReason(), "申请时间:" + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(LocalDateTime.now()) )) .initiatorId(user.getUserId()) .expTime(expTime) .shopIds(Collections.singletonList(staffInfo.getShopId())) .conditions(conditions) .extData(extDataMap) .build(); String approvalNo = flowApproveRpc.initiate(flowDto); ApprovalRecord approvalRecord = ApprovalRecord.builder() .approvalNo(approvalNo) .approvalStatus(ApprovalStatusEnum.IN_APPROVAL) .approvalType(ApprovalTypeEnum.COMPLAIN) .dataId(specialRule.getId()) .groupId(specialRule.getGroupId()) .build(); approvalRecordService.save(approvalRecord); } /** * 提交审批 */ @Transactional(rollbackFor = Exception.class) public void applyApproveEval(Eval eval, List evalGroups, LoginAuthBean user) { Date expTime = PublicUtil.getExpTimeOfMonth(LocalDate.now()); Set postIds = new HashSet<>(); Set shopIds = new HashSet<>(); for (EvalGroupDTO evalGroupDTO : evalGroups) { // postIds.add(evalGroupDTO.getPostId()); shopIds.addAll(evalGroupDTO.getShopIds()); } //提交审批 List conditions = Lists.newArrayList(); InitiateApprovalParam.Condition postCondition = new InitiateApprovalParam.Condition(); postCondition.setParamName("postId"); postCondition.setValue(StringUtils.join(",", postIds)); InitiateApprovalParam.Condition shopCondition = new InitiateApprovalParam.Condition(); shopCondition.setParamName("shopId"); shopCondition.setValue(StringUtils.join(",", shopIds)); conditions.add(postCondition); conditions.add(shopCondition); Map extDataMap = new HashMap() {{ put("id", eval.getId().toString()); }}; FlowDto flowDto = FlowDto.builder() .groupId(eval.getGroupId()) .approvalNo(flowVal.getEvalGroupConfig()) .briefContent(Lists.newArrayList( "申请人:" + user.getUserName(), "考评/活动名称:" + eval.getName(), "考评类型:" + eval.getType().getName(), // "岗位:" + evalGroup.getPostName(), "考评组:" + evalGroups.size() + "个", // "适用门店:" + evalGroup.getShopIds().size() + "个", // "适用人员:" + staffNum + "人", "申请时间:" + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(LocalDateTime.now()) )) .initiatorId(user.getUserId()) .expTime(expTime) .shopIds(new ArrayList<>(shopIds)) .conditions(conditions) .extData(extDataMap) .build(); String approvalNo = flowApproveRpc.initiate(flowDto); ApprovalRecord approvalRecord = ApprovalRecord.builder() .approvalNo(approvalNo) .approvalStatus(ApprovalStatusEnum.IN_APPROVAL) .approvalType(ApprovalTypeEnum.EVAL) .dataId(eval.getId()) .groupId(eval.getGroupId()) .build(); approvalRecordService.save(approvalRecord); } /** * 审批 * * @param approvalNo * @param agree */ @Transactional(rollbackFor = Exception.class) public ApprovalRecord closeApprove(String approvalNo, Boolean agree) { ApprovalRecord approvalRecord = approvalRecordService.getOne(Wrappers.lambdaQuery() .eq(ApprovalRecord::getApprovalNo, approvalNo)); //记录不存在、记录已被修改返回空,不再继续执行 if (PublicUtil.isEmpty(approvalRecord)) { return null; } if (PublicUtil.isNotEmpty(approvalRecord) && (!ApprovalStatusEnum.IN_APPROVAL.equals(approvalRecord.getApprovalStatus()))) { return null; } approvalRecordService.update(Wrappers.lambdaUpdate() .set(ApprovalRecord::getApprovalStatus, (agree) ? ApprovalStatusEnum.PASS : ApprovalStatusEnum.REFUSE) .eq(ApprovalRecord::getApprovalNo, approvalNo) ); return approvalRecord; } /** * 提交审批 * * @param kpiGroup */ @Transactional(rollbackFor = Exception.class) public void applyApproveKpiDraft(KpiGroupDTO kpiGroup, SettingDraft settingDraft, LoginAuthBean user, Integer staffNum) { Date expTime = PublicUtil.getExpTimeOfMonth(kpiGroup.getBeginTime()); //提交审批 List conditions = Lists.newArrayList(); InitiateApprovalParam.Condition postCondition = new InitiateApprovalParam.Condition(); postCondition.setParamName("postId"); postCondition.setValue(kpiGroup.getPostId().toString()); InitiateApprovalParam.Condition shopCondition = new InitiateApprovalParam.Condition(); shopCondition.setParamName("shopId"); List shopIdsStr = kpiGroup.getShopIds().stream().map(s -> s.toString()).collect(Collectors.toList()); shopCondition.setValue(String.join(",", shopIdsStr)); conditions.add(postCondition); conditions.add(shopCondition); Map extDataMap = new HashMap() {{ put("id", settingDraft.getId().toString()); }}; FlowDto flowDto = FlowDto.builder() .groupId(kpiGroup.getGroupId()) .approvalNo(flowVal.getKpiGroupConfig()) .briefContent(Lists.newArrayList( "申请人:" + user.getUserName(), "岗位:" + kpiGroup.getPostName(), // "绩效项目:" + kpiGroup.getIndicatorNum() + "个", // "适用门店:" + kpiGroup.getShopIds().size() + "个", // "适用人员:" + staffNum + "人", "申请时间:" + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(LocalDateTime.now()) )) .initiatorId(user.getUserId()) .expTime(expTime) .shopIds(kpiGroup.getShopIds()) .conditions(conditions) .extData(extDataMap) .build(); String approvalNo = flowApproveRpc.initiate(flowDto); ApprovalRecord approvalRecord = ApprovalRecord.builder() .approvalNo(approvalNo) .approvalStatus(ApprovalStatusEnum.IN_APPROVAL) .approvalType(ApprovalTypeEnum.KPI) .dataId(settingDraft.getId()) .groupId(kpiGroup.getGroupId()) .build(); approvalRecordService.save(approvalRecord); } /** * 提交审批 * * @param kpiGroupRank */ @Transactional(rollbackFor = Exception.class) public void applyApproveKpiRankDraft(KpiGroupRankDTO kpiGroupRank, SettingDraft settingDraft, LoginAuthBean user) { List kpiGroups = kpiGroupRank.getKpiGroups(); Date expTime = PublicUtil.getExpTimeOfMonth(LocalDate.now().plusDays(7)); //提交审批 List conditions = Lists.newArrayList(); InitiateApprovalParam.Condition postCondition = new InitiateApprovalParam.Condition(); postCondition.setParamName("postId"); InitiateApprovalParam.Condition shopCondition = new InitiateApprovalParam.Condition(); shopCondition.setParamName("shopId"); List postIds = kpiGroups.stream().map(KpiGroupDTO::getPostId).collect(Collectors.toList()); List shopIds = kpiGroups.stream().map(kpiGroup -> kpiGroup.getShopIds()).collect(ArrayList::new, List::addAll, List::addAll); postCondition.setValue(Joiner.on(",").join(postIds)); shopCondition.setValue(Joiner.on(",").join(shopIds)); conditions.add(postCondition); conditions.add(shopCondition); Map extDataMap = new HashMap() {{ put("id", settingDraft.getId().toString()); }}; FlowDto flowDto = FlowDto.builder() .groupId(kpiGroupRank.getGroupId()) .approvalNo(flowVal.getKpiGroupConfig()) .briefContent(Lists.newArrayList( "申请人:" + user.getUserName(), // "岗位:" + kpiGroupRank.getPostName(), // "岗位:" + kpiGroupRank.getPostName(), // "绩效项目:" + kpiGroup.getIndicatorNum() + "个", // "适用门店:" + kpiGroup.getShopIds().size() + "个", // "适用人员:" + staffNum + "人", "申请时间:" + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(LocalDateTime.now()) )) .initiatorId(user.getUserId()) .expTime(expTime) .shopIds(shopIds) .conditions(conditions) .extData(extDataMap) .build(); String approvalNo = flowApproveRpc.initiate(flowDto); ApprovalRecord approvalRecord = ApprovalRecord.builder() .approvalNo(approvalNo) .approvalStatus(ApprovalStatusEnum.IN_APPROVAL) .approvalType(ApprovalTypeEnum.KPI_GROUP_RANK) .dataId(settingDraft.getId()) .groupId(kpiGroupRank.getGroupId()) .build(); approvalRecordService.save(approvalRecord); } /** * 提交审批 * * @param salaryGroup */ @Transactional(rollbackFor = Exception.class) public void applyApproveSalaryDraft(SalaryGroupDTO salaryGroup, SettingDraft settingDraft, LoginAuthBean user) { Date expTime = PublicUtil.getExpTimeOfMonth(salaryGroup.getBeginTime()); //提交审批 List conditions = Lists.newArrayList(); InitiateApprovalParam.Condition postCondition = new InitiateApprovalParam.Condition(); postCondition.setParamName("postId"); postCondition.setValue(salaryGroup.getPostId().toString()); InitiateApprovalParam.Condition shopCondition = new InitiateApprovalParam.Condition(); shopCondition.setParamName("shopId"); List shopIdsStr = salaryGroup.getShopIds().stream().map(s -> s.toString()).collect(Collectors.toList()); shopCondition.setValue(String.join(",", shopIdsStr)); conditions.add(postCondition); conditions.add(shopCondition); Map extDataMap = new HashMap() {{ put("id", settingDraft.getId().toString()); }}; FlowDto flowDto = FlowDto.builder() .groupId(salaryGroup.getGroupId()) .approvalNo(flowVal.getSalaryGroupConfig()) .briefContent(Lists.newArrayList( "申请人:" + user.getUserName(), "岗位:" + salaryGroup.getPostName(), // "薪酬项目:" + salaryGroup.getProjectNum() + "个", // "适用门店:" + salaryGroup.getShopIds().size() + "个", // "适用人员:" + staffNum + "人", "申请时间:" + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(LocalDateTime.now()) )) .initiatorId(user.getUserId()) .expTime(expTime) .shopIds(salaryGroup.getShopIds()) .conditions(conditions) .extData(extDataMap) .build(); String approvalNo = flowApproveRpc.initiate(flowDto); ApprovalRecord approvalRecord = ApprovalRecord.builder() .approvalNo(approvalNo) .approvalStatus(ApprovalStatusEnum.IN_APPROVAL) .approvalType(ApprovalTypeEnum.SALARY) .dataId(settingDraft.getId()) .groupId(salaryGroup.getGroupId()) .build(); approvalRecordService.save(approvalRecord); } /** * 提交审批 */ @Transactional(rollbackFor = Exception.class) public void applyApproveEvalDraft(EvalGroupRankDTO evalGroupRankDto, Integer evalGroupSize, SettingDraft settingDraft, LoginAuthBean user) { Date expTime = PublicUtil.getExpTimeOfMonth(LocalDate.now()); //员工基础信息 StaffBaseInfoDTO staffInfo = ehrRpcService.queryStaffBaseInfo(user.getUserId()); BV.notNull(staffInfo, "人员信息查询失败,请重试"); //提交审批 List conditions = Lists.newArrayList(); InitiateApprovalParam.Condition postCondition = new InitiateApprovalParam.Condition(); postCondition.setParamName("postId"); postCondition.setValue(staffInfo.getPostId().toString()); conditions.add(postCondition); InitiateApprovalParam.Condition shopCondition = new InitiateApprovalParam.Condition(); shopCondition.setParamName("shopId"); shopCondition.setValue(staffInfo.getShopId().toString()); conditions.add(shopCondition); Map extDataMap = new HashMap() {{ put("id", settingDraft.getId().toString()); }}; FlowDto flowDto = FlowDto.builder() .groupId(evalGroupRankDto.getGroupId()) .approvalNo(flowVal.getEvalGroupConfig()) .briefContent(Lists.newArrayList( "申请人:" + user.getUserName(), "考评/活动名称:" + evalGroupRankDto.getName(), // "考评类型:" + eval.getType().getName(), // "岗位:" + evalGroup.getPostName(), "考评组:" + evalGroupSize + "个", // "适用门店:" + evalGroup.getShopIds().size() + "个", // "适用人员:" + staffNum + "人", "申请时间:" + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(LocalDateTime.now()) )) .initiatorId(user.getUserId()) .expTime(expTime) .shopIds(new ArrayList(){{add(staffInfo.getShopId());}}) .conditions(conditions) .extData(extDataMap) .build(); String approvalNo = flowApproveRpc.initiate(flowDto); ApprovalRecord approvalRecord = ApprovalRecord.builder() .approvalNo(approvalNo) .approvalStatus(ApprovalStatusEnum.IN_APPROVAL) .approvalType(ApprovalTypeEnum.EVAL_GROUP_RANK) .dataId(settingDraft.getId()) .groupId(evalGroupRankDto.getGroupId()) .build(); approvalRecordService.save(approvalRecord); } /** * 提交审批 * */ @Transactional(rollbackFor = Exception.class) public void applyApproveDistReward(EvalRewardDist rewardDist, LoginAuthBean user) { Date expTime = DateUtil.localDateTime2Date(LocalDate.now().atTime(23, 59, 59).plusDays(3)); //员工基础信息 StaffBaseInfoDTO staffInfo = ehrRpcService.queryStaffBaseInfo(user.getUserId()); BV.notNull(staffInfo, "人员信息查询失败,请重试"); //提交审批 List conditions = Lists.newArrayList(); InitiateApprovalParam.Condition postCondition = new InitiateApprovalParam.Condition(); postCondition.setParamName("postId"); postCondition.setValue(staffInfo.getPostId().toString()); conditions.add(postCondition); InitiateApprovalParam.Condition shopCondition = new InitiateApprovalParam.Condition(); shopCondition.setParamName("shopId"); shopCondition.setValue(staffInfo.getShopId().toString()); conditions.add(shopCondition); Map extDataMap = new HashMap() {{ put("id", rewardDist.getId().toString()); }}; FlowDto flowDto = FlowDto.builder() .groupId(rewardDist.getGroupId()) .approvalNo(flowVal.getEvalShopReward()) .briefContent(Lists.newArrayList( "申请人:" + user.getUserName(), "考评排名组:" + rewardDist.getEvalGroupRankName(), "考评排名组阶段:" + rewardDist.getEvalGroupRankStageName(), "门店奖惩金额:" + rewardDist.getReward(), "申请时间:" + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(LocalDateTime.now()) )) .initiatorId(user.getUserId()) .expTime(expTime) .shopIds(rewardDist.getShopIds()) .conditions(conditions) .extData(extDataMap) .build(); String approvalNo = flowApproveRpc.initiate(flowDto); ApprovalRecord approvalRecord = ApprovalRecord.builder() .approvalNo(approvalNo) .approvalStatus(ApprovalStatusEnum.IN_APPROVAL) .approvalType(ApprovalTypeEnum.EVAL_REWARD_DIST) .dataId(rewardDist.getId()) .groupId(rewardDist.getGroupId()) .build(); approvalRecordService.save(approvalRecord); } }