springboot vue 开源 会员收银系统 (10) 销单 销单后会员卡余额及库存优化

前言

完整版演示 http://120.26.95.195/
开发版演示 http://120.26.95.195:8889/

在之前的开发进程中,我们完成商品的出入库及收银台库存优化,今天文章主要完成订单的销单,及销单后会员卡余额及库存的优化。

主要考虑三种思路 商品订单销单 开卡销单 续卡销单

1.商品订单销单

销单确认 并填写必要的原因

第一步 订单减少的商品库存 重新回退

第二部 扣除的会员卡余额返回 这里有一个点 当卡金足够支付时直接回退卡金 当同时用了卡金赠送金 则返回相应余额

关键代码

java 复制代码
    public void cancel(Sell sell) {
        List<SellDetail> sellDetailList = sellDetailService.selectSellDetailList(sell.getSellId());
        //增加库存
        addInventory(sellDetailList);

        MemberCard memberCard = memberCardService.getById(sell.getMemberCardId());

        if(memberCard!=null){
            BigDecimal cardAmount = memberCard.getAmount();
            log.info("当前卡余额:"+cardAmount);
            BigDecimal cardGiveAmount = memberCard.getGiveAmount();
            log.info("当前卡赠送金余额:"+cardAmount);


            List<Sellpay> sellPayVoList = sellpayService.selectSellPayList(sell.getSellId());

            //计算订单卡金支付的金额
            Sellpay memberCardPay = sellPayVoList.stream().filter(p->
                    p.getPayType().equals(PAY_TYPE_CARD)
            ).findFirst().orElse(null);
            Sellpay memberGivePay= sellPayVoList.stream().filter(p->
                    p.getPayType().equals(PAY_TYPE_CARD_GIVE)
            ).findFirst().orElse(null);

            if(memberCardPay!=null){
                memberCard.setAmount(BigDecimalUtil.add(cardAmount,memberCardPay.getAmount()));
            }
            if(memberGivePay!=null){
                memberCard.setGiveAmount(BigDecimalUtil.add(cardGiveAmount,memberGivePay.getAmount()));
            }
            Boolean b = memberCardService.updateById(memberCard);
            if(!b){
                throw new ApiException(CARD_AMOUNT_CHANGE);
            }
        }
    }

2.开卡订单销单

首选判断是否消费过 消费过禁止销单

需要把开卡后的所有消费平账才可进行销单

销单后卡删除

关键代码

java 复制代码
    public void cancel(Sell sell) {
        Sell extraSellInfo = sellService.getById(sell.getSellId());

        //消费时用的哪张会员卡
        MemberCard membercard = memberCardService.getById(extraSellInfo.getMemberCardId());
        BigDecimal sellCardAmount = extraSellInfo.getMemberCardAfterAmount();
        BigDecimal sellCardGiveAmount = extraSellInfo.getMemberCardAfterGiveAmount();
        log.info("订单显示的卡余额:"+sellCardAmount);
        BigDecimal cardAmount = membercard.getAmount();
        BigDecimal cardGiveAmount = membercard.getGiveAmount();
        log.info("当前卡余额:"+cardAmount);
        //当前余额和订单充值余额比较
        if(sellCardAmount.compareTo(cardAmount) != 0 || cardGiveAmount.compareTo(sellCardGiveAmount) != 0){
            throw new ApiException(PAY_SELL_CARD_AMOUNT_CHANGE);
        }
        //删除卡
        memberCardService.removeById(membercard);
    }

3.续卡订单销单

续卡仅增加或减少余额即可 需要注意赠送余额也减少 如果当前余额不够 减少则给出错误提示

java 复制代码
    public void cancel(Sell sell) {
        Sell extraSellInfo = sellService.getById(sell.getSellId());
        //消费时用的哪张会员卡
        MemberCard memberCard = memberCardService.getById(extraSellInfo.getMemberCardId());

        List<SellDetail> sellDetailList = sellDetailService.selectSellDetailList(sell.getSellId());
        SellDetail sellDetail  = sellDetailList.get(0);

        BigDecimal sellCardAmount = sellDetail.getAmount();
        BigDecimal sellCardGiveAmount = sellDetail.getGiveAmount();

        BigDecimal cardAmount = memberCard.getAmount();
        log.info("当前卡余额:"+cardAmount);
        BigDecimal cardGiveAmount = memberCard.getGiveAmount();
        log.info("当前卡余额:"+cardAmount);

        //消费后余额
        BigDecimal nowCardAmount = BigDecimalUtil.sub(cardAmount,sellCardAmount);
        BigDecimal nowGiveAmount =  BigDecimalUtil.sub(cardGiveAmount,sellCardGiveAmount);

        if (nowCardAmount.signum() == -1|nowGiveAmount.signum() == -1) {
            throw new ApiException(PAY_SELL_CARD_AMOUNT_NOT_SUFFICIENT_FUNDS);
        }

        //修改当前卡金赠送金
        memberCard.setAmount(nowCardAmount);
        memberCard.setGiveAmount(nowGiveAmount);
        Boolean b = memberCardService.updateById(memberCard);
        if(!b){
            throw new ApiException(CARD_AMOUNT_CHANGE);
        }
    }

后续功能是 修改订单 挂单 取单。

代码地址
https://gitee.com/ddeatrr/memberShop

相关推荐
冬奇Lab33 分钟前
每日一个开源项目(第146篇):openpilot - 开源自动驾驶辅助系统,曾在 Consumer Reports 评测中超过特斯拉 Autopilot
人工智能·开源·自动驾驶
她的男孩4 小时前
后台接口加密别只会 HTTPS,ForgeAdmin 的 RSA + SM4/AES 源码拆解
后端·面试·开源
Java陈序员4 小时前
企业级!一个基于 Java 开发的开源 AI 应用开发平台!
spring boot·agent·mcp
DarkLONGLOVE6 小时前
快速上手 Pinia!Vue3 极简状态管理使用教程
javascript·vue.js
宸翰7 小时前
解决 uni-app App 端 vue-i18n 占位符丢失:封装跨端可用的 tf 格式化方法
前端·vue.js·uni-app
用户21366100357211 小时前
VueRouter进阶-动态路由与嵌套路由
前端·vue.js
杨运交12 小时前
[041][公共模块]分布式唯一ID生成器设计与实现:一款灵活可扩展的雪花算法框架
spring boot
fthux12 小时前
如果你用 Mac,那你可能需要 Noti Shift
macos·开源·github
冬奇Lab1 天前
每日一个开源项目(第145篇):Trellis - 把项目记忆、规范和任务上下文持久化进代码仓库
人工智能·开源·资讯
暴走的小呆1 天前
Vue 2 中 Object 的变化侦测:从 getter/setter 到 Dep、Watcher、Observer
vue.js