package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.enumerates.AgentLevelEnum; import cc.mrbird.febs.common.enumerates.DataDictionaryEnum; import cc.mrbird.febs.common.enumerates.FlowTypeEnum; import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.AppContants; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; import cc.mrbird.febs.mall.service.ICommonService; import cc.mrbird.febs.mall.service.IMallAchieveService; import cc.mrbird.febs.mall.service.IMallMoneyFlowService; import cc.mrbird.febs.pay.service.IAliPayService; import cc.mrbird.febs.pay.service.IPayService; import cc.mrbird.febs.pay.service.UnipayService; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.Date; import java.util.List; /** * @author wzy * @date 2021-09-16 **/ @Slf4j @Service @RequiredArgsConstructor public class CommonService implements ICommonService { private final RedisUtils redisUtils; private final DataDictionaryCustomMapper dataDictionaryCustomMapper; private final AppVersionMapper appVersionMapper; private final MallGoodsMapper mallGoodsMapper; private final MallMemberMapper memberMapper; private final IApiMallMemberWalletService memberWalletService; private final IMallMoneyFlowService mallMoneyFlowService; private final MallAchieveRecordMapper mallAchieveRecordMapper; private final MallMemberWalletMapper mallMemberWalletMapper; private final MallOrderInfoMapper mallOrderInfoMapper; @Override public boolean verifyCode(String account, String code) { if ("SMS_CODE".equals(code)) { return true; } String cacheCode = redisUtils.getString(AppContants.VERIFY_CODE_PREFIX + account); if (StrUtil.isBlank(cacheCode)) { return false; } if (code.equals(cacheCode)) { redisUtils.del(AppContants.VERIFY_CODE_PREFIX + account); return true; } else { return false; } } @Override public List findDataDicByType(String type) { return dataDictionaryCustomMapper.selectDicByType(type); } @Override public List findAppVersion() { return appVersionMapper.selectList(null); } @Override public void addDataDic(String type, String code, Object value, String description) { DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(type, code); String data = JSONObject.toJSONString(value); if (dic != null) { dic.setValue(data); dataDictionaryCustomMapper.updateById(dic); return; } dic = new DataDictionaryCustom(); dic.setCode(code); dic.setType(type); dic.setValue(data); dic.setDescription(description); dataDictionaryCustomMapper.insert(dic); } @Override public void updateDataDic(String type, String code, String value) { DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(type, code); if (dic != null) { dic.setValue(value); dataDictionaryCustomMapper.updateById(dic); } } /** * 支付金额后的操作 * 减少积分,增加流水 * 购买套餐后,升级会员等级 * 增加支付金额流水 * 增加补贴额度 * 增加贡献值,增加流水 * 产生一条业绩记录 * @param orderId */ @Override public void changeWallet(Long orderId, int payType) { MallOrderInfo orderInfo = this.mallOrderInfoMapper.selectById(orderId); Long memberId = orderInfo.getMemberId(); boolean hasTc = false; //总贡献值 BigDecimal starSum = BigDecimal.ZERO; /** * 总补贴额度 * 所有合伙人补贴至消费礼包的三倍额度需要复购一次。 */ BigDecimal scoreSum = BigDecimal.ZERO; BigDecimal achieveSum = BigDecimal.ZERO; List orderItems = this.mallOrderInfoMapper.getMallOrderItemByOrderId(orderInfo.getId()); if (CollUtil.isNotEmpty(orderItems)) { for (MallOrderItem orderItem : orderItems) { MallGoods mallGoods = mallGoodsMapper.selectById(orderItem.getGoodsId()); /** * 购买套餐赠送贡献值 * 补贴3倍额度 */ if (mallGoods.getIsNormal() == 2) { hasTc = true; BigDecimal star = (mallGoods.getStar()==null ? BigDecimal.ZERO : mallGoods.getStar()) .multiply(new BigDecimal(orderItem.getCnt())); starSum = starSum.add(star); // scoreSum = scoreSum.add( // new BigDecimal(mallGoods.getPresentPrice()) // .multiply(new BigDecimal(3)) // .multiply(new BigDecimal(orderItem.getCnt())) // .abs() // .setScale(2,BigDecimal.ROUND_DOWN)); String goodsName = mallGoods.getGoodsName(); /** * 1-2档投资级别,2.5倍 * 3-4档投资级别,2.8倍 * 5-6档投资级别,3倍 * 目前紧急修改成按照商品名称 */ BigDecimal basePercent = new BigDecimal("3"); if(goodsName.equals("礼包一") || goodsName.equals("礼包二")){ basePercent = new BigDecimal("2.5"); } if(goodsName.equals("礼包三") || goodsName.equals("礼包四")){ basePercent = new BigDecimal("2.8"); } if(goodsName.equals("礼包五") || goodsName.equals("礼包六")){ basePercent = new BigDecimal("3"); } scoreSum = scoreSum.add( new BigDecimal(mallGoods.getPresentPrice()) .multiply(new BigDecimal(orderItem.getCnt())) .multiply(basePercent) .abs() .setScale(2,BigDecimal.ROUND_DOWN)); achieveSum = achieveSum.add( new BigDecimal(mallGoods.getPresentPrice()) .multiply(new BigDecimal(orderItem.getCnt())) .abs() .setScale(2,BigDecimal.ROUND_DOWN)); } } /** * 增加贡献值,增加流水 */ if (starSum.compareTo(BigDecimal.ZERO) > 0) { //系统设置的个人贡献点最大值 DataDictionaryCustom starGetDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.STAR_GET.getType(), DataDictionaryEnum.STAR_GET.getCode()); if(ObjectUtil.isNotEmpty(starGetDic)){ String starGetStr = StrUtil.isEmpty(starGetDic.getValue()) ? "0" : starGetDic.getValue(); BigDecimal starGet = new BigDecimal(starGetStr); MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); BigDecimal star = new BigDecimal(mallMemberWallet.getStar()); if(starGet.compareTo(star.add(starSum)) < 0){ if(starGet.compareTo(BigDecimal.ZERO) == 0){ mallMemberWalletMapper.addStarByMemberId(starSum.intValue(), memberId); mallMoneyFlowService.addMoneyFlow( memberId, starSum, MoneyFlowTypeEnum.STAR.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.STAR.getValue(), 2); } if(starGet.compareTo(star) > 0){ BigDecimal subtract = starGet.subtract(star); if(subtract.compareTo(starSum) < 0){ starSum = subtract; } mallMemberWalletMapper.addStarByMemberId(starSum.intValue(), memberId); mallMoneyFlowService.addMoneyFlow( memberId, starSum, MoneyFlowTypeEnum.STAR.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.STAR.getValue(), 2); } }else{ mallMemberWalletMapper.addStarByMemberId(starSum.intValue(), memberId); mallMoneyFlowService.addMoneyFlow( memberId, starSum, MoneyFlowTypeEnum.STAR.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.STAR.getValue(), 2); } } } /** * 增加补贴额度 */ if (scoreSum.compareTo(BigDecimal.ZERO) > 0) { // MallMember mallMember = memberMapper.selectById(memberId); // if(MemberLevelEnum.SECOND_LEVEL.getLevelCode(mallMember.getLevel()) >= 5){ // scoreSum = scoreSum.multiply(new BigDecimal(3)); // } // if(MemberLevelEnum.SECOND_LEVEL.getLevelCode(mallMember.getLevel()) >= 3 // &&MemberLevelEnum.SECOND_LEVEL.getLevelCode(mallMember.getLevel()) < 5){ // scoreSum = scoreSum.multiply(new BigDecimal(2.8)); // } // if(MemberLevelEnum.SECOND_LEVEL.getLevelCode(mallMember.getLevel()) < 3){ // scoreSum = scoreSum.multiply(new BigDecimal(2.5)); // } memberWalletService.add(scoreSum, memberId, "totalScore"); mallMoneyFlowService.addMoneyFlow( memberId, scoreSum, MoneyFlowTypeEnum.TOTAL_SCORE.getValue(), orderInfo.getOrderNo(), "", scoreSum.toString(), memberId, 1, FlowTypeEnum.TOTAL_SCORE.getValue(), 2); } } /** * 购买套餐后,升级会员等级 */ if (hasTc) { MallMember mallMember = memberMapper.selectById(memberId); if (AgentLevelEnum.ZERO_LEVEL.name().equals(mallMember.getLevel())) { mallMember.setLevel(AgentLevelEnum.SECOND_LEVEL.name()); memberMapper.updateById(mallMember); } } /** * 增加支付金额流水 */ mallMoneyFlowService.addMoneyFlow( memberId, orderInfo.getAmount().subtract(orderInfo.getScoreAmount()).negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), payType); /** * 减少积分,增加流水 */ if (orderInfo.getScoreCnt().compareTo(BigDecimal.ZERO) > 0) { int reduce = memberWalletService.reduce(orderInfo.getScoreCnt(), memberId, "prizeScore"); if (reduce == 2) { throw new FebsException("积分不足"); } mallMoneyFlowService.addMoneyFlow( memberId, orderInfo.getScoreCnt().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.PRIZE_SCORE.getValue()); } /** * 产生一条业绩记录 */ if(achieveSum.compareTo(BigDecimal.ZERO) > 0){ MallAchieveRecord mallAchieveRecord = new MallAchieveRecord(); mallAchieveRecord.setMemberId(memberId); mallAchieveRecord.setAchieveTime(new Date()); mallAchieveRecord.setAmount(achieveSum.subtract(orderInfo.getScoreAmount())); mallAchieveRecord.setOrderId(orderId); mallAchieveRecord.setPayTime(orderInfo.getPayTime()); mallAchieveRecordMapper.insert(mallAchieveRecord); } } }