| | |
| | | package cc.mrbird.febs.vip.service.impl; |
| | | |
| | | import cc.mrbird.febs.common.enumerates.FlowTypeEnum; |
| | | import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; |
| | | import cc.mrbird.febs.common.enumerates.OrderStatusEnum; |
| | | import cc.mrbird.febs.common.enumerates.ScoreFlowTypeEnum; |
| | | import cc.mrbird.febs.common.enumerates.*; |
| | | import cc.mrbird.febs.common.exception.FebsException; |
| | | import cc.mrbird.febs.mall.dto.ScoreSettingDto; |
| | | import cc.mrbird.febs.mall.entity.*; |
| | | import cc.mrbird.febs.mall.mapper.*; |
| | | import cc.mrbird.febs.mall.service.IApiMallGoodsService; |
| | |
| | | import cn.hutool.core.date.DateUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.hutool.json.JSONUtil; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | private final HappyMemberLevelMapper happyMemberLevelMapper; |
| | | private final HappySaleLevelMapper happySaleLevelMapper; |
| | | private final MallAchieveRecordMapper mallAchieveRecordMapper; |
| | | private final DataDictionaryCustomMapper dataDictionaryCustomMapper; |
| | | /** |
| | | * 根据订单ID获取分数 |
| | | * 此方法处理订单得分逻辑,包括直接购买得分、会员等级得分和推荐人得分 |
| | |
| | | Long memberId = mallOrderInfo.getMemberId(); |
| | | // 根据会员ID查询会员信息 |
| | | MallMember member = mallMemberMapper.selectById(memberId); |
| | | |
| | | // 记录会员购买获得的经验 |
| | | mallMoneyFlowService.addMoneyFlow( |
| | | memberId, |
| | | amount, |
| | | ScoreFlowTypeEnum.BUY.getValue(), |
| | | mallOrderInfo.getOrderNo(), |
| | | FlowTypeEnum.SCORE.getValue(), |
| | | StrUtil.format(ScoreFlowTypeEnum.BUY.getDesc(),amount), |
| | | 2 |
| | | ); |
| | | // 更新会员钱包中的分数 |
| | | mallMemberWalletService.add(amount, memberId, "score"); |
| | | BigDecimal scorePercent = BigDecimal.ONE; |
| | | DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | DataDictionaryEnum.SCORE_SIGN_SETTING.getType(), |
| | | DataDictionaryEnum.SCORE_SIGN_SETTING.getCode()); |
| | | if (dic != null) { |
| | | ScoreSettingDto scoreSettingDto = JSONObject.parseObject(dic.getValue(), ScoreSettingDto.class); |
| | | BigDecimal bigDecimal = ObjectUtil.isEmpty(scoreSettingDto.getScorePercent()) ? BigDecimal.ONE : new BigDecimal(scoreSettingDto.getScorePercent()); |
| | | if (bigDecimal.compareTo(BigDecimal.ZERO) > 0) { |
| | | scorePercent = bigDecimal; |
| | | } |
| | | } |
| | | |
| | | // 下单自己获得积分,推荐人获得积分 |
| | | //<memberId,积分数量>的map |
| | |
| | | happyMemberLevelLambdaQueryWrapper.eq(HappyMemberLevel::getCode, director); |
| | | happyMemberLevelLambdaQueryWrapper.last("limit 1"); |
| | | HappyMemberLevel happyMemberLevel = happyMemberLevelMapper.selectOne(happyMemberLevelLambdaQueryWrapper); |
| | | log.info("会员等级信息:{}", JSONUtil.toJsonStr(happyMemberLevel)); |
| | | if(ObjectUtil.isNotEmpty(happyMemberLevel)){ |
| | | // 计算自己获得的积分 |
| | | BigDecimal minePercent = happyMemberLevel.getMinePercent(); |
| | | BigDecimal mineScore = amount.multiply(minePercent).setScale(0, RoundingMode.HALF_DOWN); |
| | | if(BigDecimal.ZERO.compareTo(mineScore) < 0){ |
| | | recommendScoreMap.put(memberId, mineScore); |
| | | recommendTypeScoreMap.put(memberId, ScoreFlowTypeEnum.MINE_RECOMMEND.getValue()); |
| | | BigDecimal mineScore = amount.multiply(minePercent).multiply(scorePercent).setScale(0, RoundingMode.HALF_DOWN); |
| | | log.info("下单获得积分:{}", mineScore); |
| | | if(mineScore.compareTo(BigDecimal.ZERO) > 0){ |
| | | mallMoneyFlowService.addMoneyFlow( |
| | | memberId, |
| | | mineScore, |
| | | ScoreFlowTypeEnum.MINE_RECOMMEND.getValue(), |
| | | mallOrderInfo.getOrderNo(), |
| | | FlowTypeEnum.PRIZE_SCORE.getValue(), |
| | | StrUtil.format( ScoreFlowTypeEnum.MINE_RECOMMEND.getDesc(),mineScore), |
| | | 2); |
| | | mallMemberWalletService.add(mineScore,memberId , "prizeScore"); |
| | | |
| | | // 记录会员购买获得的经验 |
| | | BigDecimal multiply = amount.multiply(minePercent).setScale(2, RoundingMode.HALF_DOWN); |
| | | mallMoneyFlowService.addMoneyFlow( |
| | | memberId, |
| | | multiply, |
| | | ScoreFlowTypeEnum.BUY.getValue(), |
| | | mallOrderInfo.getOrderNo(), |
| | | FlowTypeEnum.SCORE.getValue(), |
| | | StrUtil.format(ScoreFlowTypeEnum.BUY.getDesc(),multiply), |
| | | 2 |
| | | ); |
| | | // 更新会员钱包中的分数 |
| | | mallMemberWalletService.add(multiply, memberId, "score"); |
| | | // 发送会员等级升级消息 |
| | | agentProducer.sendVipLevelUp(memberId); |
| | | } |
| | | // 计算推荐人获得的积分 |
| | | if(StrUtil.isNotEmpty(member.getReferrerId())){ |
| | | MallMember refMember = mallMemberMapper.selectInfoByInviteId(member.getReferrerId()); |
| | | BigDecimal otherPercent = happyMemberLevel.getOtherPercent(); |
| | | BigDecimal otherScore = amount.multiply(otherPercent).setScale(0, RoundingMode.HALF_DOWN); |
| | | if(BigDecimal.ZERO.compareTo(otherScore) < 0){ |
| | | recommendScoreMap.put(refMember.getId(), otherScore); |
| | | recommendTypeScoreMap.put(memberId, ScoreFlowTypeEnum.OTHER_RECOMMEND.getValue()); |
| | | BigDecimal otherScore = amount.multiply(otherPercent).multiply(scorePercent).setScale(0, RoundingMode.HALF_DOWN); |
| | | log.info("推荐人获得积分:{}", otherScore); |
| | | if(otherScore.compareTo(BigDecimal.ZERO) > 0){ |
| | | mallMoneyFlowService.addMoneyFlow( |
| | | refMember.getId(), |
| | | otherScore, |
| | | ScoreFlowTypeEnum.OTHER_RECOMMEND.getValue(), |
| | | mallOrderInfo.getOrderNo(), |
| | | FlowTypeEnum.PRIZE_SCORE.getValue(), |
| | | StrUtil.format( ScoreFlowTypeEnum.OTHER_RECOMMEND.getDesc(),otherScore), |
| | | 2); |
| | | mallMemberWalletService.add(otherScore,refMember.getId() , "prizeScore"); |
| | | |
| | | // 记录会员购买获得的经验 |
| | | BigDecimal multiply = amount.multiply(otherPercent).setScale(2, RoundingMode.HALF_DOWN); |
| | | mallMoneyFlowService.addMoneyFlow( |
| | | refMember.getId(), |
| | | multiply, |
| | | ScoreFlowTypeEnum.BUY.getValue(), |
| | | mallOrderInfo.getOrderNo(), |
| | | FlowTypeEnum.SCORE.getValue(), |
| | | StrUtil.format(ScoreFlowTypeEnum.BUY.getDesc(),multiply), |
| | | 2 |
| | | ); |
| | | // 更新会员钱包中的分数 |
| | | mallMemberWalletService.add(multiply, refMember.getId(), "score"); |
| | | // 发送会员等级升级消息 |
| | | agentProducer.sendVipLevelUp(refMember.getId()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 为推荐人和自己添加积分流动记录和更新钱包 |
| | | recommendScoreMap.forEach((key, value) -> { |
| | | if (value != null) { |
| | | mallMoneyFlowService.addMoneyFlow( |
| | | key, |
| | | value, |
| | | recommendTypeScoreMap.get(key), |
| | | mallOrderInfo.getOrderNo(), |
| | | FlowTypeEnum.PRIZE_SCORE.getValue(), |
| | | StrUtil.format(ScoreFlowTypeEnum.getDescByValue(recommendTypeScoreMap.get(key)),value), |
| | | 2); |
| | | mallMemberWalletService.add(value, key, "prizeScore"); |
| | | } |
| | | }); |
| | | |
| | | // 发送会员等级升级消息 |
| | | agentProducer.sendVipLevelUp(orderId); |
| | | // 发送分销等级升级消息 |
| | | agentProducer.sendSaleLevelUp(orderId); |
| | | } |
| | | |
| | | |
| | |
| | | * @param orderId 订单ID |
| | | */ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void levelUp(Long orderId) { |
| | | // 根据订单ID获取订单详细信息 |
| | | MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectOrderDetailsById(orderId); |
| | | // 如果订单信息为空,则直接返回 |
| | | if (mallOrderInfo == null) { |
| | | return; |
| | | } |
| | | // 如果订单状态不是完成状态,则直接返回 |
| | | if (mallOrderInfo.getStatus() != OrderStatusEnum.FINISH.getValue()) { |
| | | // 订单不是完成状态 |
| | | return; |
| | | } |
| | | |
| | | // 根据订单中的会员ID获取会员信息 |
| | | MallMember member = mallMemberMapper.selectById(mallOrderInfo.getMemberId()); |
| | | MallMember member = mallMemberMapper.selectById(orderId); |
| | | // 如果会员信息为空,则记录日志并返回 |
| | | if (member == null) { |
| | | log.info("会员不存在"); |
| | |
| | | if(member.getDirector() == code){ |
| | | return; |
| | | } |
| | | if(member.getDirector() > code){ |
| | | return; |
| | | } |
| | | |
| | | // 更新会员的导演等级为当前会员等级代码 |
| | | member.setDirector(code); |
| | | // 更新会员信息 |
| | | mallMemberMapper.updateById(member); |
| | | |
| | | // 发送分销等级升级消息 |
| | | agentProducer.sendSaleLevelUp(orderId); |
| | | } |
| | | |
| | | /** |
| | |
| | | * @param orderId 订单ID,用于识别和处理特定的订单 |
| | | */ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void saleLevelUp(Long orderId) { |
| | | // 根据订单ID获取订单详细信息 |
| | | MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectOrderDetailsById(orderId); |
| | |
| | | .eq(MallMember::getAccountStatus, MallMember.ACCOUNT_STATUS_ENABLE) |
| | | .eq(MallMember::getAccountType, MallMember.ACCOUNT_TYPE_NORMAL) |
| | | .ne(MallMember::getStoreMaster, 0) |
| | | .orderByAsc(MallMember::getStoreMaster) |
| | | .orderByDesc(MallMember::getId) |
| | | .last("limit 1") |
| | | ); |
| | | // 如果没有找到符合条件的团长,则记录日志并返回 |
| | |
| | | // 计算返佣金额 |
| | | BigDecimal returnPercent = happySaleLevel.getReturnPercent(); |
| | | BigDecimal multiply = mallOrderInfo.getAmount().multiply(returnPercent).setScale(2, RoundingMode.HALF_DOWN); |
| | | log.info("团长获得返佣:{}",multiply); |
| | | // 如果返佣金额小于等于0,则直接返回 |
| | | if(BigDecimal.ZERO.compareTo(multiply) >=0){ |
| | | return; |
| | |
| | | ); |
| | | // 更新会员钱包中的余额 |
| | | mallMemberWalletService.add(multiply, storeMasterMember.getId(), "commission"); |
| | | mallMemberWalletService.add(multiply, storeMasterMember.getId(), "total_score"); |
| | | mallMemberWalletService.add(multiply, storeMasterMember.getId(), "totalScore"); |
| | | |
| | | MallAchieveRecord mallAchieveRecord = new MallAchieveRecord(); |
| | | mallAchieveRecord.setMemberId(mallOrderInfo.getMemberId()); |
| | | mallAchieveRecord.setMemberId(storeMasterMember.getId()); |
| | | mallAchieveRecord.setAchieveTime(new Date()); |
| | | mallAchieveRecord.setAmount(mallOrderInfo.getAmount()); |
| | | mallAchieveRecord.setCostAmount(multiply); |