From 3ea3c013bb241c05d0e6a2c4344d9b708ffa1e61 Mon Sep 17 00:00:00 2001 From: xiaoyong931011 <15274802129@163.com> Date: Thu, 09 Mar 2023 16:01:46 +0800 Subject: [PATCH] 下单,余额支付,转账,分享奖,星级奖励,商品贡献值,补贴三倍回购 --- src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java | 8 src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java | 4 src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java | 2 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java | 244 ++++++++++++++++----- src/main/java/cc/mrbird/febs/mall/service/impl/ScoreServiceImpl.java | 86 +------ src/main/java/cc/mrbird/febs/mall/dto/AddMallGoodsDto.java | 2 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java | 38 +++ src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java | 12 + src/main/java/cc/mrbird/febs/mall/vo/ScoreSignVo.java | 10 src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html | 38 ++- src/main/java/cc/mrbird/febs/mall/dto/AddOrderDto.java | 4 src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java | 2 src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java | 105 ++++++--- src/main/resources/mapper/modules/MallMemberWalletMapper.xml | 17 + src/main/java/cc/mrbird/febs/common/enumerates/FlowTypeEnum.java | 10 src/main/resources/templates/febs/views/modules/goods/goodsUpdateNew.html | 43 ++- src/main/java/cc/mrbird/febs/mall/dto/MallGoodsUpdateDto.java | 1 src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java | 4 src/main/java/cc/mrbird/febs/mall/vo/CashOutSettingVo.java | 3 19 files changed, 430 insertions(+), 203 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/FlowTypeEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/FlowTypeEnum.java index 8bf01bd..47c6edc 100644 --- a/src/main/java/cc/mrbird/febs/common/enumerates/FlowTypeEnum.java +++ b/src/main/java/cc/mrbird/febs/common/enumerates/FlowTypeEnum.java @@ -25,7 +25,15 @@ /** * 佣金 */ - COMMISSION(4); + COMMISSION(4), + /** + * 贡献点 + */ + STAR(5), + /** + * 补贴额度 + */ + TOTAL_SCORE(6); private final int value; diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java index a3aa3d7..0f75787 100644 --- a/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java +++ b/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java @@ -123,7 +123,17 @@ /** * 星级奖励 */ - STAR_PERK_SEVEN(24); + STAR_PERK_SEVEN(24), + + /** + * 贡献点 + */ + STAR(25), + + /** + * 补贴额度 + */ + TOTAL_SCORE(26); private final int value; diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java index 2c293f7..4b29d6a 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java @@ -32,6 +32,14 @@ private final IApiMallOrderInfoService mallOrderInfoService; + @ApiOperation(value = "判断是否允许创建订单", notes = "判断是否允许创建订单") + @PostMapping(value = "/judgeCreateOrder") + public FebsResponse judgeCreateOrder(@RequestBody AddOrderDto addOrderDto) { + boolean result = mallOrderInfoService.judgeCreateOrder(addOrderDto); + + return new FebsResponse().success().data(result); + } + @ApiOperation(value = "创建订单", notes = "创建订单") @PostMapping(value = "/createOrder") public FebsResponse createOrder(@RequestBody AddOrderDto addOrderDto) { diff --git a/src/main/java/cc/mrbird/febs/mall/dto/AddMallGoodsDto.java b/src/main/java/cc/mrbird/febs/mall/dto/AddMallGoodsDto.java index f3cf467..ad139d9 100644 --- a/src/main/java/cc/mrbird/febs/mall/dto/AddMallGoodsDto.java +++ b/src/main/java/cc/mrbird/febs/mall/dto/AddMallGoodsDto.java @@ -82,4 +82,6 @@ private BigDecimal carriage; + private BigDecimal star; + } diff --git a/src/main/java/cc/mrbird/febs/mall/dto/AddOrderDto.java b/src/main/java/cc/mrbird/febs/mall/dto/AddOrderDto.java index 5940ee7..a9758ca 100644 --- a/src/main/java/cc/mrbird/febs/mall/dto/AddOrderDto.java +++ b/src/main/java/cc/mrbird/febs/mall/dto/AddOrderDto.java @@ -5,6 +5,7 @@ import lombok.Data; import javax.validation.constraints.NotNull; +import java.math.BigDecimal; import java.util.List; /** @@ -37,4 +38,7 @@ @ApiModelProperty(value = "商品明细") private List<AddOrderItemDto> items; + @ApiModelProperty(value = "积分数量") + private BigDecimal score; + } diff --git a/src/main/java/cc/mrbird/febs/mall/dto/MallGoodsUpdateDto.java b/src/main/java/cc/mrbird/febs/mall/dto/MallGoodsUpdateDto.java index 977a0ca..2304173 100644 --- a/src/main/java/cc/mrbird/febs/mall/dto/MallGoodsUpdateDto.java +++ b/src/main/java/cc/mrbird/febs/mall/dto/MallGoodsUpdateDto.java @@ -86,4 +86,5 @@ private Integer hasCarriage; private BigDecimal carriage; + private BigDecimal star; } diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java b/src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java index 371035b..056d026 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java @@ -114,5 +114,9 @@ private Integer hasCarriage; private BigDecimal carriage; + /** + * 贡献值 + */ + private BigDecimal star; } diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java b/src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java index 072fd1e..133f112 100644 --- a/src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java +++ b/src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java @@ -93,4 +93,8 @@ private Integer deliverType; private Long shopId; + //折扣后金额 + private BigDecimal scoreAmount; + //折扣积分数量 + private BigDecimal scoreCnt; } diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java index 2195065..1f9a1d0 100644 --- a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java +++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java @@ -31,4 +31,6 @@ List<MallMemberWallet> selectSumStarByIds(@Param("list")List<Long> ids); int updateStarByList(@Param("list")List<Map<String, Object>> result); + + int updateTotalScoreByList(@Param("list")List<Map<String, Object>> resultReduce); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java b/src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java index 91bd897..c9e2e26 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java @@ -35,4 +35,6 @@ void goodsComment(ApiAddCommentDtos addCommentDtos); FebsResponse bangCardSign(BangCardSignDto bangCardSignDto); + + boolean judgeCreateOrder(AddOrderDto addOrderDto); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java index cc45a65..3fce202 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java @@ -44,6 +44,7 @@ private final IMallMoneyFlowService mallMoneyFlowService; private final MallMemberWalletMapper mallMemberWalletMapper; private final SqlSessionTemplate sqlSessionTemplate; + private final IApiMallMemberWalletService memberWalletService; @Override @Transactional(rollbackFor = Exception.class) @@ -195,14 +196,25 @@ //分享补贴金额 BigDecimal sharePerkAmount = amount.multiply(sharePerkPercent); - iApiMallMemberWalletService.addBalance(sharePerkAmount, mallMemberUp.getId()); + //所有合伙人补贴至消费礼包的三倍额度需要复购一次。 + MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(mallMemberUp.getId()); + BigDecimal totalScore = mallMemberWallet.getTotalScore(); + if(totalScore.compareTo(sharePerkAmount) < 0){ + sharePerkAmount = totalScore; + } + if(BigDecimal.ZERO.compareTo(sharePerkAmount) < 0){ + //减少补贴额度 + memberWalletService.reduce(sharePerkAmount, memberId, "totalScore"); - mallMoneyFlowService.addMoneyFlow( - mallMemberUp.getId(), - sharePerkAmount, - MoneyFlowTypeEnum.DYNAMIC_ACHIEVE.getValue(), - mallOrderInfo.getOrderNo(), - FlowTypeEnum.BALANCE.getValue()); + iApiMallMemberWalletService.addBalance(sharePerkAmount, mallMemberUp.getId()); + + mallMoneyFlowService.addMoneyFlow( + mallMemberUp.getId(), + sharePerkAmount, + MoneyFlowTypeEnum.DYNAMIC_ACHIEVE.getValue(), + mallOrderInfo.getOrderNo(), + FlowTypeEnum.BALANCE.getValue()); + } } /** * 星级奖励 @@ -228,6 +240,7 @@ * @return */ public List<MallMember> getStarRecord(List<MallMember> mallMembersOlds,String LevelParam,BigDecimal amount,String orderNo,Long memberId,int starPerkType){ + long start = System.currentTimeMillis(); //根据用户的level获取用户 List<MallMember> mallMemberStars = memberMapper.selectMemberWithLevel(LevelParam); if(CollUtil.isNotEmpty(mallMembersOlds)){ @@ -260,6 +273,7 @@ //给当前等级的每个用户发放星级奖励 int count = 0; List<Map<String,Object>> result = new ArrayList<>(); + List<Map<String,Object>> resultReduce = new ArrayList<>(); List<MallMoneyFlow> mallMoneyFlows = new ArrayList<>(); for(MallMemberWallet mallMemberWallet : mallMemberWallets){ Map<String,Object> hashMap = new HashMap<>(); @@ -267,44 +281,63 @@ //当前用户的星级奖励 BigDecimal starPerkAmount = starPerkAmountAva .multiply(new BigDecimal(starCnt)).abs().setScale(2, BigDecimal.ROUND_DOWN); - hashMap.put("id",mallMemberWallet.getId()); - hashMap.put("starPerkAmount",starPerkAmount); - result.add(hashMap); - //生成星级奖励的流水对象 - MallMoneyFlow mallMoneyFlow = new MallMoneyFlow(); - mallMoneyFlow.setMemberId(mallMemberWallet.getMemberId()); - mallMoneyFlow.setAmount(starPerkAmount); - mallMoneyFlow.setType(starPerkType); - mallMoneyFlow.setOrderNo(orderNo); - mallMoneyFlow.setRtMemberId(memberId); - mallMoneyFlow.setStatus(2); - mallMoneyFlow.setFlowType(FlowTypeEnum.BALANCE.getValue()); - mallMoneyFlows.add(mallMoneyFlow); + BigDecimal totalScorePerk = mallMemberWallet.getTotalScore(); + if(totalScorePerk.compareTo(starPerkAmount) < 0){ + starPerkAmount = totalScorePerk; + } + if(BigDecimal.ZERO.compareTo(starPerkAmount) < 0){ + hashMap.put("id",mallMemberWallet.getId()); + hashMap.put("starPerkAmount",starPerkAmount); + result.add(hashMap); + resultReduce.add(hashMap); + //生成星级奖励的流水对象 + MallMoneyFlow mallMoneyFlow = new MallMoneyFlow(); + mallMoneyFlow.setMemberId(mallMemberWallet.getMemberId()); + mallMoneyFlow.setAmount(starPerkAmount); + mallMoneyFlow.setType(starPerkType); + mallMoneyFlow.setOrderNo(orderNo); + mallMoneyFlow.setRtMemberId(memberId); + mallMoneyFlow.setStatus(2); + mallMoneyFlow.setFlowType(FlowTypeEnum.BALANCE.getValue()); + mallMoneyFlows.add(mallMoneyFlow); + } count = count + 1; if (count % 1000 == 0 || count == mallMemberWallets.size()) { - int updateCount = mallMemberWalletMapper.updateStarByList(result); - if(updateCount>0){ - log.info("============更新============第{}条数据===========",count); + if(CollUtil.isNotEmpty(result)){ + int resultCount = mallMemberWalletMapper.updateStarByList(result); + if(resultCount>0){ + log.info("============余额新增============第{}条数据===========",resultCount); + } + //每更新完一批数据,在result内进行删除操作。 + result.clear(); + + int resultReduceCount = mallMemberWalletMapper.updateTotalScoreByList(resultReduce); + if(resultReduceCount>0){ + log.info("============额度减少============第{}条数据===========",resultReduceCount); + } + //每更新完一批数据,在result内进行删除操作。 + resultReduce.clear(); } - //每更新完一批数据,在result内进行删除操作。 - result.clear(); } } - SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH,false); - MallMoneyFlowMapper mallMoneyFlowMapper = sqlSession.getMapper(MallMoneyFlowMapper.class); - long start = System.currentTimeMillis(); - for(int i = 1; i <= mallMoneyFlows.size(); i++){ - mallMoneyFlowMapper.insertMoneyFlow(mallMoneyFlows.get(i-1)); - if (i % 1000 == 0 || i == mallMoneyFlows.size()) { - long end = System.currentTimeMillis(); - log.info("============插入============第{}条数据,时间:{}===========",mallMoneyFlows.size(),(end - start)/1000); - sqlSession.commit(); - sqlSession.clearCache(); + if(CollUtil.isNotEmpty(mallMoneyFlows)){ + SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH,false); + MallMoneyFlowMapper mallMoneyFlowMapper = sqlSession.getMapper(MallMoneyFlowMapper.class); + + for(int i = 1; i <= mallMoneyFlows.size(); i++){ + mallMoneyFlowMapper.insertMoneyFlow(mallMoneyFlows.get(i-1)); + if (i % 1000 == 0 || i == mallMoneyFlows.size()) { + log.info("============插入流水============第{}条数据===========",mallMoneyFlows.size()); + sqlSession.commit(); + sqlSession.clearCache(); + } } + sqlSession.close(); } - sqlSession.close(); } } + long end = System.currentTimeMillis(); + log.info("============订单:{},时间:{}===========",orderNo,(end - start)/1000); return mallMemberStars; } } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java index 4465115..719da23 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java @@ -379,12 +379,40 @@ throw new FebsException("支付密码错误"); } - walletService.reduceBalance(transferDto.getAmount(), memberId); - String orderNo = MallUtils.getOrderNum("T"); - this.addMoneyFlow(memberId, transferDto.getAmount().negate(), MoneyFlowTypeEnum.TRANSFER.getValue(), orderNo, null, null, mallMember.getId(), null, FlowTypeEnum.BALANCE.getValue()); + DataDictionaryCustom cashOutSettingDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.CASHOUT_SETTING.getType(), + DataDictionaryEnum.CASHOUT_SETTING.getCode() + ); + CashOutSettingVo cashOutSettingVo = JSONObject.parseObject(cashOutSettingDic.getValue(), CashOutSettingVo.class); + BigDecimal insideFee = cashOutSettingVo.getInsideFee().multiply(BigDecimal.valueOf(0.01)); + //转账手续费 + BigDecimal insideFeeAmount = transferDto.getAmount().multiply(insideFee).setScale(2, BigDecimal.ROUND_DOWN); - walletService.addBalance(transferDto.getAmount(), mallMember.getId()); - this.addMoneyFlow(mallMember.getId(), transferDto.getAmount(), MoneyFlowTypeEnum.TRANSFER.getValue(), orderNo, null, null, memberId, null, FlowTypeEnum.BALANCE.getValue()); + BigDecimal avaAmount = transferDto.getAmount().subtract(insideFeeAmount).setScale(2, BigDecimal.ROUND_DOWN); + walletService.reduceBalance(avaAmount, memberId); + String orderNo = MallUtils.getOrderNum("T"); + this.addMoneyFlow( + memberId, + avaAmount.negate(), + MoneyFlowTypeEnum.TRANSFER.getValue(), + orderNo, + null, + null, + mallMember.getId(), + null, + FlowTypeEnum.BALANCE.getValue()); + + walletService.addBalance(avaAmount, mallMember.getId()); + this.addMoneyFlow( + mallMember.getId(), + avaAmount, + MoneyFlowTypeEnum.TRANSFER.getValue(), + orderNo, + null, + null, + memberId, + null, + FlowTypeEnum.BALANCE.getValue()); } @Override diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java index 9e6f74b..1a86fd2 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java @@ -77,6 +77,8 @@ private final MallMemberBankSignMapper mallMemberBankSignMapper; private final MallMemberBankMapper mallMemberBankMapper; private final MallShopApplyMapper mallShopApplyMapper; + private final DataDictionaryCustomMapper dataDictionaryCustomMapper; + private final MallAchieveRecordMapper mallAchieveRecordMapper; @Override @Transactional(rollbackFor = Exception.class) @@ -202,7 +204,28 @@ } mallOrderItemMapper.insert(orderItem); } - + /** + * 使用积分折扣现金 + */ + DataDictionaryCustom scorePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.SCORE_PERCENT.getType(), + DataDictionaryEnum.SCORE_PERCENT.getCode() + ); + DataDictionaryCustom scoreChangeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.SCORE_CHANGE.getType(), + DataDictionaryEnum.SCORE_CHANGE.getCode() + ); + BigDecimal score = ObjectUtil.isEmpty(addOrderDto.getScore()) ? BigDecimal.ZERO : addOrderDto.getScore(); + orderInfo.setScoreCnt(score); + if(ObjectUtil.isNotEmpty(scorePercentDic)){ + BigDecimal scoreChange = BigDecimal.ONE; + if(ObjectUtil.isNotEmpty(scoreChangeDic)){ + scoreChange = new BigDecimal(scoreChangeDic.getValue()).abs().setScale(2,BigDecimal.ROUND_DOWN); + } + //折扣现金 + BigDecimal scorePercentAmount = score.divide(scoreChange,BigDecimal.ROUND_DOWN).setScale(2,BigDecimal.ROUND_DOWN); + orderInfo.setScoreAmount(scorePercentAmount); + } orderInfo.setAmount(total); if(2 == deliverType){ orderInfo.setDeliverType(2); @@ -326,46 +349,10 @@ orderInfo.setPayTime(new Date()); orderInfo.setPayResult("1"); - boolean hasTc = false; - // 静态倍数 - List<MallOrderItem> orderItems = this.baseMapper.getMallOrderItemByOrderId(orderInfo.getId()); - if (CollUtil.isNotEmpty(orderItems)) { - for (MallOrderItem orderItem : orderItems) { - MallGoods mallGoods = mallGoodsMapper.selectById(orderItem.getGoodsId()); - BigDecimal score = BigDecimal.ZERO; - MallGoodsSku sku = mallGoodsSkuMapper.selectById(orderItem.getSkuId()); - if (mallGoods.getIsNormal() == 2) { - hasTc = true; - score = sku.getPresentPrice().multiply(mallGoods.getStaticMulti()).multiply(new BigDecimal(orderItem.getCnt())); -// BigDecimal staticMulti = mallGoods.getStaticMulti() == null ? BigDecimal.ZERO : mallGoods.getStaticMulti(); -// score = sku.getPresentPrice().multiply(staticMulti); - // 普通商品也及时结算,不再10天结算 - } else { - score = sku.getPresentPrice(); - } + changeWallet(orderInfo.getId(), member.getId()); - if (score.compareTo(BigDecimal.ZERO) > 0) { - memberWalletService.add(score, member.getId(), "score"); - mallMoneyFlowService.addMoneyFlow(member.getId(), score, MoneyFlowTypeEnum.STATIC_BONUS.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.SCORE.getValue()); - - // 添加业绩 - mallAchieveService.add(orderItem.getId()); - } - } - } - - // 购买套餐后,升级为普通会员 - if (hasTc) { - MallMember mallMember = memberMapper.selectById(member.getId()); - if (AgentLevelEnum.ZERO_LEVEL.name().equals(mallMember.getLevel())) { - mallMember.setLevel(AgentLevelEnum.FIRST_LEVEL.name()); - memberMapper.updateById(mallMember); - } - } - - mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue()); agentProducer.sendAutoLevelUpMsg(member.getId()); - agentProducer.sendOrderReturn(orderInfo.getId()); +// agentProducer.sendOrderReturn(orderInfo.getId()); break; case "4": if (orderInfo.getOrderType() != 2) { @@ -382,28 +369,6 @@ mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.PRIZE_SCORE.getValue()); break; case "5": -// AgreementSignDto agreementSignDto = new AgreementSignDto(); -// agreementSignDto.setOrderNo(orderInfo.getOrderNo()); -// agreementSignDto.setSmsCode(payOrderDto.getSmsCode()); -// String agreementSignStr = unipayService.agreementSign(agreementSignDto); -// if("fail".equals(agreementSignStr)){ -// throw new FebsException("支付失败"); -// }else{ -// JSONObject jsonObject = JSONUtil.parseObj(agreementSignStr); -// payResultStr = (String) jsonObject.get("biz_code"); -// String signData = (String) jsonObject.get("data"); -// String signBizMsg = (String) jsonObject.get("biz_msg"); -// -// JSONObject signDatajsonObject = JSONUtil.parseObj(signData); -// String err_msg = (String) signDatajsonObject.get("err_msg"); -// if(!"JS000000".equals(payResultStr)){ -// throw new FebsException(signBizMsg); -// } -// if(ObjectUtil.isNotNull(signDatajsonObject.get("err_code"))){ -// throw new FebsException(err_msg); -// } -// } - AgreementPayDto agreementPayDto = new AgreementPayDto(); agreementPayDto.setOrderNo(orderInfo.getOrderNo()); @@ -457,6 +422,116 @@ return map; } + /** + * 支付金额后的操作 + * 减少积分,增加流水 + * 购买套餐后,升级会员等级 + * 增加支付金额流水 + * 增加补贴额度 + * 增加贡献值,增加流水 + * 产生一条业绩记录 + * @param orderId + * @param memberId + */ + public void changeWallet(Long orderId,Long memberId){ + MallOrderInfo orderInfo = this.baseMapper.selectById(orderId); + boolean hasTc = false; + //总贡献值 + BigDecimal starSum = BigDecimal.ZERO; + /** + * 总补贴额度 + * 所有合伙人补贴至消费礼包的三倍额度需要复购一次。 + */ + BigDecimal scoreSum = BigDecimal.ZERO; + List<MallOrderItem> orderItems = this.baseMapper.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(); + starSum = starSum.add(star); + scoreSum = scoreSum.add( + new BigDecimal(mallGoods.getPresentPrice()) + .multiply(new BigDecimal(3)) + .abs() + .setScale(2,BigDecimal.ROUND_DOWN)); + } + } + /** + * 增加贡献值,增加流水 + */ + if (starSum.compareTo(BigDecimal.ZERO) > 0) { + memberWalletService.add(starSum, memberId, "star"); + mallMoneyFlowService.addMoneyFlow( + memberId, + starSum, + MoneyFlowTypeEnum.STAR.getValue(), + orderInfo.getOrderNo(), + FlowTypeEnum.STAR.getValue()); + } + /** + * 增加补贴额度 + */ + if (scoreSum.compareTo(BigDecimal.ZERO) > 0) { + memberWalletService.add(scoreSum, memberId, "totalScore"); + mallMoneyFlowService.addMoneyFlow( + memberId, + scoreSum, + MoneyFlowTypeEnum.TOTAL_SCORE.getValue(), + orderInfo.getOrderNo(), + FlowTypeEnum.TOTAL_SCORE.getValue()); + } + } + + /** + * 购买套餐后,升级会员等级 + */ + 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(), + FlowTypeEnum.BALANCE.getValue()); + /** + * 减少积分,增加流水 + */ + 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()); + /** + * 产生一条业绩记录 + */ + MallAchieveRecord mallAchieveRecord = new MallAchieveRecord(); + mallAchieveRecord.setMemberId(memberId); + mallAchieveRecord.setAchieveTime(new Date()); + mallAchieveRecord.setAmount(orderInfo.getAmount().subtract(orderInfo.getScoreAmount())); + mallAchieveRecord.setOrderId(orderId); + mallAchieveRecord.setPayTime(orderInfo.getPayTime()); + mallAchieveRecordMapper.insert(mallAchieveRecord); + } + public static void main(String[] args) { String str = "{\"biz_code\":\"JS000000\",\"biz_msg\":\"成功\",\"data\":\"{\\\"order_status\\\":\\\"P2000\\\",\\\"jp_order_no\\\":\\\"100120220826446740396081496064\\\",\\\"err_msg\\\":\\\"短信验证码不符\\\",\\\"err_code\\\":\\\"CP110026\\\",\\\"sign_no\\\":\\\"\\\",\\\"mch_order_no\\\":\\\"NO_2022082618263952399\\\"}\",\"mch_no\":\"888118000001971\",\"rand_str\":\"an2w7ulf5ru6upkk5bdg441kdi3gnpvu\",\"resp_code\":\"SUCCESS\",\"sec_key\":\"\",\"sign\":\"NiJXRTSIZ9xZMUOwEHiEHdZXmgL2cHUU5WUa1NbMRRzui0DIiuZSW4e31LjnBxwVwmy3uuPMP+tqhY8VLyC8uCFOdGdZI7e72VuRvyvaiW7/sqCrsfgPOBEjiGE/CmSMRoEXv9HmqCyNBF6iHSEhQJql5Yge30dQdyB6xFfqjk0=\",\"sign_type\":\"2\"}"; @@ -486,7 +561,7 @@ throw new FebsException("支付密码错误"); } - int reduce = memberWalletService.reduce(orderInfo.getAmount().add(orderInfo.getCarriage()), mallMember.getId(), field); + int reduce = memberWalletService.reduce(orderInfo.getAmount().subtract(orderInfo.getScoreAmount()).add(orderInfo.getCarriage()), mallMember.getId(), field); if (reduce == 2) { throw new FebsException("余额不足"); } @@ -731,4 +806,49 @@ } } + @Override + public boolean judgeCreateOrder(AddOrderDto addOrderDto) { + boolean flag = false; + + if (CollUtil.isEmpty(addOrderDto.getItems())) { + return false; + } + + BigDecimal total = BigDecimal.ZERO; + for (AddOrderItemDto item : addOrderDto.getItems()) { + MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId()); + BigDecimal amount = sku.getPresentPrice().multiply(BigDecimal.valueOf(item.getCnt())); + total = total.add(amount); + } + /** + * 使用积分折扣现金 + */ + DataDictionaryCustom scorePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.SCORE_PERCENT.getType(), + DataDictionaryEnum.SCORE_PERCENT.getCode() + ); + DataDictionaryCustom scoreChangeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.SCORE_CHANGE.getType(), + DataDictionaryEnum.SCORE_CHANGE.getCode() + ); + BigDecimal score = ObjectUtil.isEmpty(addOrderDto.getScore()) ? BigDecimal.ZERO : addOrderDto.getScore(); + if(ObjectUtil.isNotEmpty(scorePercentDic)){ + //商品的现金折扣比例 + BigDecimal scorePercent = new BigDecimal(scorePercentDic.getValue()).divide(new BigDecimal(100), BigDecimal.ROUND_DOWN); + //最大折扣金额对应需要的总积分数目 + BigDecimal scorePercentMaxAmount = total.multiply(scorePercent); + BigDecimal scoreChange = BigDecimal.ONE; + if(ObjectUtil.isNotEmpty(scoreChangeDic)){ + scoreChange = new BigDecimal(scoreChangeDic.getValue()).abs().setScale(2,BigDecimal.ROUND_DOWN); + } + scorePercentMaxAmount = scorePercentMaxAmount.multiply(scoreChange); + if(scorePercentMaxAmount.compareTo(score) < 0){ + return false; + } + }else{ + flag = true; + } + return flag; + } + } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ScoreServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ScoreServiceImpl.java index 62d0087..78bcdad 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/ScoreServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ScoreServiceImpl.java @@ -51,21 +51,13 @@ MallMemberWallet wallet = mallMemberWalletMapper.selectWalletByMemberId(member.getId()); - MallScoreSignRecord mallScoreSignRecord = mallScoreSignRecordMapper.selectRecentSignRecord(member.getId()); - ScoreSignVo scoreSign = new ScoreSignVo(); scoreSign.setMineScore(wallet.getPrizeScore().intValue()); - if (mallScoreSignRecord == null) { - scoreSign.setHasSignDays(0); - } else { - mallScoreSignRecord = judgeScoreIsContinuity(mallScoreSignRecord); - scoreSign.setHasSignDays(mallScoreSignRecord.getTotalCnt()); - } - - DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SCORE_SIGN_SETTING.getType(), DataDictionaryEnum.SCORE_SIGN_SETTING.getCode()); - if (dic != null) { - scoreSign.setSetting(JSONObject.parseObject(dic.getValue(), ScoreSettingDto.class)); + DataDictionaryCustom signScpreDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.SIGN_SCORE.getType(), DataDictionaryEnum.SIGN_SCORE.getCode()); + if (signScpreDic != null) { + scoreSign.setSetting(Integer.parseInt(signScpreDic.getValue())); } return scoreSign; } @@ -89,9 +81,11 @@ public void sign() { MallMember member = LoginUserUtil.getLoginUser(); - DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SCORE_SIGN_SETTING.getType(), DataDictionaryEnum.SCORE_SIGN_SETTING.getCode()); - if (dic == null) { - throw new FebsException("暂未设置积分"); + DataDictionaryCustom signScoreDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.SIGN_SCORE.getType(), + DataDictionaryEnum.SIGN_SCORE.getCode()); + if (signScoreDic == null) { + throw new FebsException("签到活动未开启"); } MallScoreSignRecord mallScoreSignRecord = mallScoreSignRecordMapper.selectRecentSignRecord(member.getId()); @@ -100,65 +94,23 @@ } if (mallScoreSignRecord.getSignTime() != null && DateUtil.betweenDay(mallScoreSignRecord.getSignTime(), new Date(), true) == 0) { - throw new FebsException("今天已签到"); + throw new FebsException("今日已签到"); } - mallScoreSignRecord = judgeScoreIsContinuity(mallScoreSignRecord); - - ScoreSettingDto scoreSetting = JSONObject.parseObject(dic.getValue(),ScoreSettingDto.class); - int days = mallScoreSignRecord.getTotalCnt() == null ? 1 : mallScoreSignRecord.getTotalCnt() + 1; - switch (days) { - case 1: - if (scoreSetting.getSignInOne() == null) { - throw new FebsException("积分未设置"); - } - mallScoreSignRecord.setScore(scoreSetting.getSignInOne()); - break; - case 2: - if (scoreSetting.getSignInTwo() == null) { - throw new FebsException("积分未设置"); - } - mallScoreSignRecord.setScore(scoreSetting.getSignInTwo()); - break; - case 3: - if (scoreSetting.getSignInThree() == null) { - throw new FebsException("积分未设置"); - } - mallScoreSignRecord.setScore(scoreSetting.getSignInThree()); - break; - case 4: - if (scoreSetting.getSignInFour() == null) { - throw new FebsException("积分未设置"); - } - mallScoreSignRecord.setScore(scoreSetting.getSignInFour()); - break; - case 5: - if (scoreSetting.getSignInFive() == null) { - throw new FebsException("积分未设置"); - } - mallScoreSignRecord.setScore(scoreSetting.getSignInFive()); - break; - case 6: - if (scoreSetting.getSignInSix() == null) { - throw new FebsException("积分未设置"); - } - mallScoreSignRecord.setScore(scoreSetting.getSignInSix()); - break; - case 7: - if (scoreSetting.getSignInSeven() == null) { - throw new FebsException("积分未设置"); - } - mallScoreSignRecord.setScore(scoreSetting.getSignInSeven()); - break; - } - + Integer signScore = Integer.parseInt(signScoreDic.getValue()); mallScoreSignRecord.setMemberId(member.getId()); - mallScoreSignRecord.setTotalCnt(days); + mallScoreSignRecord.setTotalCnt(signScore); mallScoreSignRecord.setSignTime(new Date()); + mallScoreSignRecord.setScore(signScore); mallScoreSignRecordMapper.insert(mallScoreSignRecord); BigDecimal amount = BigDecimal.valueOf(mallScoreSignRecord.getScore()); walletService.add(amount, member.getId(), "prizeScore"); - mallMoneyFlowService.addMoneyFlow(member.getId(), amount, MoneyFlowTypeEnum.SCORE_SIGN.getValue(), null, FlowTypeEnum.PRIZE_SCORE.getValue()); + mallMoneyFlowService.addMoneyFlow( + member.getId(), + amount, + MoneyFlowTypeEnum.SCORE_SIGN.getValue(), + null, + FlowTypeEnum.PRIZE_SCORE.getValue()); } } diff --git a/src/main/java/cc/mrbird/febs/mall/vo/CashOutSettingVo.java b/src/main/java/cc/mrbird/febs/mall/vo/CashOutSettingVo.java index ec29d88..0600b7b 100644 --- a/src/main/java/cc/mrbird/febs/mall/vo/CashOutSettingVo.java +++ b/src/main/java/cc/mrbird/febs/mall/vo/CashOutSettingVo.java @@ -17,6 +17,9 @@ @ApiModelProperty(value = "提现手续费") private BigDecimal serviceFee; + @ApiModelProperty(value = "内转手续费") + private BigDecimal insideFee; + @ApiModelProperty(value = "提现时间 1:工作日 2:每一天") private Integer workingDays; diff --git a/src/main/java/cc/mrbird/febs/mall/vo/ScoreSignVo.java b/src/main/java/cc/mrbird/febs/mall/vo/ScoreSignVo.java index b72f21d..6ce8e06 100644 --- a/src/main/java/cc/mrbird/febs/mall/vo/ScoreSignVo.java +++ b/src/main/java/cc/mrbird/febs/mall/vo/ScoreSignVo.java @@ -13,12 +13,12 @@ @ApiModel(value = "ScoreSignVo", description = "积分签到返回参数接口") public class ScoreSignVo { - @ApiModelProperty(value = "我的竞猜积分") + @ApiModelProperty(value = "我的签到积分") private Integer mineScore; - @ApiModelProperty(value = "已连续签到") - private Integer hasSignDays; +// @ApiModelProperty(value = "已连续签到") +// private Integer hasSignDays; - @ApiModelProperty(value = "签到积分设置") - private ScoreSettingDto setting; + @ApiModelProperty(value = "每次签到获得积分数量") + private Integer setting; } diff --git a/src/main/resources/mapper/modules/MallMemberWalletMapper.xml b/src/main/resources/mapper/modules/MallMemberWalletMapper.xml index 966088f..b988a31 100644 --- a/src/main/resources/mapper/modules/MallMemberWalletMapper.xml +++ b/src/main/resources/mapper/modules/MallMemberWalletMapper.xml @@ -42,6 +42,12 @@ <if test="record.commission != null"> , commission = #{record.commission} </if> + <if test="record.totalScore != null"> + , total_score = #{record.totalScore} + </if> + <if test="record.star != null"> + , star = #{record.star} + </if> where id=#{record.id} and revision=#{record.revision} </update> @@ -70,7 +76,6 @@ </select> <update id="updateStarByList" parameterType="java.util.List" > --- //注意sql语句应被;分隔开,否则批量更新多少条数据就有多少条sql拼在一起。 <foreach collection="list" item="item" index="index" open="" close="" separator=";"> update mall_member_wallet <set> @@ -80,4 +85,14 @@ </foreach> </update> + <update id="updateTotalScoreByList" parameterType="java.util.List" > + <foreach collection="list" item="item" index="index" open="" close="" separator=";"> + update mall_member_wallet + <set> + total_score = total_score - #{item.starPerkAmount}, + </set> + WHERE id = #{item.id} + </foreach> + </update> + </mapper> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html b/src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html index 5208f25..b43fa63 100644 --- a/src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html +++ b/src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html @@ -77,7 +77,7 @@ </div> </div> - <blockquote class="layui-elem-quote blue-border">商品类型</blockquote> + <blockquote class="layui-elem-quote blue-border">商品类型:</blockquote> <div class="layui-form-item"> <label class="layui-form-label febs-form-item-require">商品类型</label> <div class="layui-input-block"> @@ -89,20 +89,28 @@ </div> <div class="layui-form-item febs-hide tc-set"> - <label class="layui-form-label">静态倍数</label> + <label class="layui-form-label">贡献值:</label> <div class="layui-input-block"> - <input type="text" name="staticMulti" placeholder="请输入静态倍数" autocomplete="off" class="layui-input"> - <div class="layui-form-mid layui-word-aux">支付后,赠送(购买金额*静态倍数)的赠送积分</div> + <input type="text" name="star" lay-verify="required|integer" placeholder="请输入贡献值" autocomplete="off" class="layui-input"> + <div class="layui-form-mid layui-word-aux">支付后,用户获取对应的贡献值</div> </div> </div> - <div class="layui-form-item febs-hide tc-set"> - <label class="layui-form-label">静态占比(%)</label> - <div class="layui-input-block"> - <input type="text" name="staticProp" placeholder="请输入静态占比" autocomplete="off" class="layui-input"> - <div class="layui-form-mid layui-word-aux">所有套餐静态占比相加应等于100%</div> - </div> - </div> +<!-- <div class="layui-form-item febs-hide tc-set">--> +<!-- <label class="layui-form-label">静态倍数</label>--> +<!-- <div class="layui-input-block">--> +<!-- <input type="text" name="staticMulti" placeholder="请输入静态倍数" autocomplete="off" class="layui-input">--> +<!-- <div class="layui-form-mid layui-word-aux">支付后,赠送(购买金额*静态倍数)的赠送积分</div>--> +<!-- </div>--> +<!-- </div>--> + +<!-- <div class="layui-form-item febs-hide tc-set">--> +<!-- <label class="layui-form-label">静态占比(%)</label>--> +<!-- <div class="layui-input-block">--> +<!-- <input type="text" name="staticProp" placeholder="请输入静态占比" autocomplete="off" class="layui-input">--> +<!-- <div class="layui-form-mid layui-word-aux">所有套餐静态占比相加应等于100%</div>--> +<!-- </div>--> +<!-- </div>--> </div> <div class="layui-tab-item"> @@ -297,6 +305,14 @@ form.render(); + + form.verify({ + integer: [ + /^[1-9]\d*$/ + , '只能输入正整数' + ] + }); + var E = window.wangEditor; const editorConfig = { MENU_CONF: {} }; editorConfig.MENU_CONF['uploadImage'] = { diff --git a/src/main/resources/templates/febs/views/modules/goods/goodsUpdateNew.html b/src/main/resources/templates/febs/views/modules/goods/goodsUpdateNew.html index d91bcd3..9d3eefd 100644 --- a/src/main/resources/templates/febs/views/modules/goods/goodsUpdateNew.html +++ b/src/main/resources/templates/febs/views/modules/goods/goodsUpdateNew.html @@ -85,7 +85,7 @@ </div> </div> - <blockquote class="layui-elem-quote blue-border">商品类型</blockquote> + <blockquote class="layui-elem-quote blue-border">商品类型:</blockquote> <div class="layui-form-item"> <label class="layui-form-label febs-form-item-require">商品类型</label> <div class="layui-input-block"> @@ -98,23 +98,30 @@ </div> <div class="layui-form-item febs-hide tc-set"> - <label class="layui-form-label">静态倍数</label> + <label class="layui-form-label">贡献值:</label> <div class="layui-input-block"> - <input type="text" name="staticMulti" placeholder="请输入静态倍数" - autoComplete="off" class="layui-input"> - <div class="layui-form-mid layui-word-aux">支付后,赠送(购买金额*静态倍数)的赠送积分 - </div> + <input type="text" name="star" lay-verify="required|integer" placeholder="请输入贡献值" autocomplete="off" class="layui-input"> + <div class="layui-form-mid layui-word-aux">支付后,用户获取对应的贡献值</div> </div> </div> +<!-- <div class="layui-form-item febs-hide tc-set">--> +<!-- <label class="layui-form-label">静态倍数</label>--> +<!-- <div class="layui-input-block">--> +<!-- <input type="text" name="staticMulti" placeholder="请输入静态倍数"--> +<!-- autoComplete="off" class="layui-input">--> +<!-- <div class="layui-form-mid layui-word-aux">支付后,赠送(购买金额*静态倍数)的赠送积分--> +<!-- </div>--> +<!-- </div>--> +<!-- </div>--> - <div class="layui-form-item febs-hide tc-set"> - <label class="layui-form-label">静态占比(%)</label> - <div class="layui-input-block"> - <input type="text" name="staticProp" placeholder="请输入静态占比" - autoComplete="off" class="layui-input"> - <div class="layui-form-mid layui-word-aux">所有套餐静态占比相加应等于100%</div> - </div> - </div> +<!-- <div class="layui-form-item febs-hide tc-set">--> +<!-- <label class="layui-form-label">静态占比(%)</label>--> +<!-- <div class="layui-input-block">--> +<!-- <input type="text" name="staticProp" placeholder="请输入静态占比"--> +<!-- autoComplete="off" class="layui-input">--> +<!-- <div class="layui-form-mid layui-word-aux">所有套餐静态占比相加应等于100%</div>--> +<!-- </div>--> +<!-- </div>--> </div> <div class="layui-tab-item"> @@ -343,6 +350,13 @@ }); formSelects.render(); + + form.verify({ + integer: [ + /^[1-9]\d*$/ + , '只能输入正整数' + ] + }); var E = window.wangEditor; const editorConfig = { MENU_CONF: {} }; @@ -652,6 +666,7 @@ "costPrice": goodsInfo.costPrice, "isSku": goodsInfo.isSku, "thumb": goodsInfo.thumb, + "star": goodsInfo.star, "thumbs": thumbs }); -- Gitblit v1.9.1