|  |  |  | 
|---|
|  |  |  | 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.AppVersion; | 
|---|
|  |  |  | import cc.mrbird.febs.mall.entity.DataDictionaryCustom; | 
|---|
|  |  |  | import cc.mrbird.febs.mall.mapper.AppVersionMapper; | 
|---|
|  |  |  | import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper; | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | 
|---|
|  |  |  | public List<AppVersion> 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<MallOrderItem> 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("礼包一")){ | 
|---|
|  |  |  | basePercent = new BigDecimal("1.5"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(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); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|