xiaoyong931011
2023-03-09 3ea3c013bb241c05d0e6a2c4344d9b708ffa1e61
下单,余额支付,转账,分享奖,星级奖励,商品贡献值,补贴三倍回购
19 files modified
573 ■■■■■ changed files
src/main/java/cc/mrbird/febs/common/enumerates/FlowTypeEnum.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/AddMallGoodsDto.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/AddOrderDto.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/MallGoodsUpdateDto.java 1 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallOrderInfo.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java 45 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java 38 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java 244 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ScoreServiceImpl.java 86 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/CashOutSettingVo.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/ScoreSignVo.java 10 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallMemberWalletMapper.xml 17 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html 38 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/goods/goodsUpdateNew.html 43 ●●●●● patch | view | raw | blame | history
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;
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;
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) {
src/main/java/cc/mrbird/febs/mall/dto/AddMallGoodsDto.java
@@ -82,4 +82,6 @@
    private BigDecimal carriage;
    private BigDecimal star;
}
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;
}
src/main/java/cc/mrbird/febs/mall/dto/MallGoodsUpdateDto.java
@@ -86,4 +86,5 @@
    private Integer hasCarriage;
    private BigDecimal carriage;
    private BigDecimal star;
}
src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java
@@ -114,5 +114,9 @@
    private Integer hasCarriage;
    private BigDecimal carriage;
    /**
     * 贡献值
     */
    private BigDecimal star;
}
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;
}
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);
}
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);
}
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,6 +196,16 @@
            //分享补贴金额
            BigDecimal sharePerkAmount = amount.multiply(sharePerkPercent);
            //所有合伙人补贴至消费礼包的三倍额度需要复购一次。
            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");
            iApiMallMemberWalletService.addBalance(sharePerkAmount, mallMemberUp.getId());
            mallMoneyFlowService.addMoneyFlow(
@@ -203,6 +214,7 @@
                    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,9 +281,15 @@
                    //当前用户的星级奖励
                    BigDecimal starPerkAmount = starPerkAmountAva
                            .multiply(new BigDecimal(starCnt)).abs().setScale(2, BigDecimal.ROUND_DOWN);
                    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());
@@ -280,24 +300,34 @@
                    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();
                    }
                }
                }
                if(CollUtil.isNotEmpty(mallMoneyFlows)){
                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);
                            log.info("============插入流水============第{}条数据===========",mallMoneyFlows.size());
                        sqlSession.commit();
                        sqlSession.clearCache();
                    }
@@ -305,6 +335,9 @@
                sqlSession.close();
            }
        }
        }
        long end = System.currentTimeMillis();
        log.info("============订单:{},时间:{}===========",orderNo,(end - start)/1000);
        return mallMemberStars;
    }
}
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
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;
    }
}
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());
    }
}
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;
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;
}
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>
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'] = {
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">支付后,赠送(购买金额*静态倍数)的赠送积分
                                                <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>
<!--                                        <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
            });