springboot vue 开源 会员收银系统 (7) 收银台的完善 新增开卡 结算

news2024/12/28 19:33:28

前言

完整版演示
开发版演示

在前面的开发中,我们成功完成了商品分类和商品信息的搭建,开发了收银台基础。现在,我们将进一步完善收银台的功能,添加开卡和结算功能,并在后台实现会员卡的创建和订单保存。同时,我们还将保存页面vue data数据用于修改订单

1.收银台添加开卡功能 后期不仅限开发 还有续卡 套餐…开卡
结算
2.结算后需要生成订单在此注意几个订单的问题

  • 需要有主订单表 一个订单有多个商品需要创建一个订单详情表与之关联
  • 还需要创建一个支付方式表 一个订单有多种支付方式
  • 订单表需要关联会员id便于筛查和查询消费记录
  • 添加状态字段用于消单、改单 (并创建一个表保存当前vue实例的data用于修改订单)

以下为相关表格

CREATE TABLE `business_sell` (
  `SELL_ID` varchar(32) NOT NULL COMMENT '订单id',
  `SELL_NO` varchar(255) DEFAULT NULL COMMENT '订单号',
  `SERIAL_NO` varchar(32) DEFAULT NULL COMMENT '流水号',
  `MEMBER_ID` varchar(32) DEFAULT NULL COMMENT '会员ID',
  `MEMBER_NAME` varchar(255) DEFAULT NULL COMMENT '会员名称',
  `MEMBER_CARD_ID` varchar(32) DEFAULT NULL COMMENT '会员卡id',
  `SELL_AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '消费金额',
  `REAL_AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '实际入账',
  `SELL_TYPE` tinyint(2) DEFAULT NULL COMMENT '1开卡 2续卡 3项目/卖品',
  `SELL_STATUS` tinyint(2) DEFAULT '0' COMMENT '0正常 1取消',
  `DELETED` tinyint(2) DEFAULT '0' COMMENT '0正常 1删除',
  `VERSION` bigint(10) DEFAULT '0' COMMENT '乐观锁字段',
  `SHOP_ID` varchar(32) DEFAULT NULL COMMENT '门店id',
  `SHOP_NAME` varchar(255) DEFAULT NULL COMMENT '门店名',
  `CREATE_NAME` varchar(255) DEFAULT NULL COMMENT '创建人',
  `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
  `CREATE_ID` varchar(32) DEFAULT NULL COMMENT '创建人id',
  `UPDATE_TIME` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `UPDATE_NAME` varchar(255) DEFAULT NULL COMMENT '修改人',
  `UPDATE_ID` varchar(32) DEFAULT NULL COMMENT '修改人id',
  `MEMBER_CARD_AFTER_AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '消费后金额',
  `MEMBER_CARD_BEFORE_AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '消费前赠送金额',
  `MEMBER_CARD_BEFORE_GIVE_AMOUNT` decimal(10,2) DEFAULT NULL,
  `MEMBER_CARD_AFTER_GIVE_AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '消费后赠送金额',
  PRIMARY KEY (`SELL_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单';


CREATE TABLE `business_sell_detail` (
  `SELL_DETAIL_ID` varchar(32) NOT NULL COMMENT '销售细单id',
  `MEMBER_ID` varchar(32) DEFAULT NULL COMMENT '会员id',
  `SELL_ID` varchar(32) DEFAULT NULL COMMENT '订单id',
  `SELL_TYPE` tinyint(2) DEFAULT NULL COMMENT '1开卡 2续卡 3项目 4卖品',
  `MEMBER_CARD_ID` varchar(32) DEFAULT NULL COMMENT '会员卡id',
  `PRODUCT_ID` varchar(32) DEFAULT NULL COMMENT '商品ID',
  `PRODUCT_NAME` varchar(255) DEFAULT NULL COMMENT '商品名',
  `COUNT` int(10) DEFAULT '1' COMMENT '商品数量',
  `DISCOUNT` decimal(10,2) DEFAULT NULL COMMENT '折扣',
  `AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '金额',
  `REAL_AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '实际金额',
  `CARD_ID` varchar(32) DEFAULT NULL COMMENT '卡项ID',
  `CARD_NAME` varchar(255) DEFAULT NULL COMMENT '卡名',
  `GIVE_AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '赠送金额',
  `SHOP_ID` varchar(32) DEFAULT NULL COMMENT '门店id',
  `SHOP_NAME` varchar(255) DEFAULT NULL COMMENT '门店名',
  `CREATE_NAME` varchar(255) DEFAULT NULL COMMENT '创建人',
  `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
  `CREATE_ID` varchar(32) DEFAULT NULL COMMENT '创建人id',
  `UPDATE_TIME` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `UPDATE_NAME` varchar(255) DEFAULT NULL COMMENT '修改人',
  `UPDATE_ID` varchar(32) DEFAULT NULL COMMENT '修改人id',
  `SELL_STATUS` tinyint(2) DEFAULT '0' COMMENT '0正常 1取消',
  PRIMARY KEY (`SELL_DETAIL_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单详情';


CREATE TABLE `business_sellpay` (
  `SELL_PAY_ID` varchar(32) NOT NULL COMMENT '支付id',
  `SELL_ID` varchar(32) DEFAULT NULL COMMENT '销售单id',
  `PAY_NAME` varchar(255) DEFAULT NULL COMMENT '支付方式名称',
  `PAY_TYPE` tinyint(2) DEFAULT NULL COMMENT '1.卡金 2.扫码 3.现金  888.优惠 ',
  `AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '金额',
  PRIMARY KEY (`SELL_PAY_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单支付';

CREATE TABLE `business_selljson` (
  `JSON_ID` varchar(32) NOT NULL,
  `SELL_ID` varchar(32) DEFAULT NULL COMMENT '订单id',
  `SELL_JSON` json DEFAULT NULL COMMENT '获得下订单时的JSON',
  PRIMARY KEY (`JSON_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单json';


3.订单创建完毕后还需要创建会员卡
这样后续就可以选择会员卡卡金支付了

CREATE TABLE `business_member_card` (
  `MEMBER_CARD_ID` varchar(32) NOT NULL COMMENT '会员卡id',
  `MEMBER_ID` varchar(32) DEFAULT NULL COMMENT '会员id',
  `CARD_ID` varchar(32) DEFAULT NULL COMMENT '卡项ID',
  `CARD_NO` varchar(255) DEFAULT NULL COMMENT '卡号',
  `CARD_NAME` varchar(255) DEFAULT NULL COMMENT '卡名称',
  `AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '余额',
  `GIVE_AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '赠送金额',
  `DISCOUNT` decimal(10,2) DEFAULT NULL COMMENT '商品折扣',
  `BUILD_CARD_AMOUNT` decimal(10,2) DEFAULT NULL COMMENT '开卡金额',
  `PUSH_MONEY` decimal(10,2) DEFAULT NULL COMMENT '提成比例',
  `CARD_STATUS` tinyint(2) DEFAULT '0' COMMENT '0正常 1取消',
  `DELETED` tinyint(2) DEFAULT '0' COMMENT '0正常 1删除',
  `VERSION` bigint(10) DEFAULT '0' COMMENT '乐观锁字段',
  `SHOP_ID` varchar(32) DEFAULT NULL COMMENT '门店id',
  `SHOP_NAME` varchar(255) DEFAULT NULL COMMENT '门店名',
  `CREATE_NAME` varchar(255) DEFAULT NULL COMMENT '创建人',
  `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间',
  `CREATE_ID` varchar(32) DEFAULT NULL COMMENT '创建人id',
  `UPDATE_TIME` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `UPDATE_NAME` varchar(255) DEFAULT NULL COMMENT '修改人',
  `UPDATE_ID` varchar(32) DEFAULT NULL COMMENT '修改人id',
  PRIMARY KEY (`MEMBER_CARD_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员卡';


package com.dd.admin.business.pay.service.impl;

import com.dd.admin.business.card.entity.Card;
import com.dd.admin.business.card.service.CardService;
import com.dd.admin.business.memberCard.domain.MemberCardVo;
import com.dd.admin.business.memberCard.entity.MemberCard;
import com.dd.admin.business.memberCard.service.MemberCardService;
import com.dd.admin.business.pay.domain.BaseSell;
import com.dd.admin.business.pay.domain.BuildCardForm;
import com.dd.admin.business.pay.domain.BuildCardSell;
import com.dd.admin.business.pay.service.AddSellDetailService;
import com.dd.admin.business.sell.entity.Sell;
import com.dd.admin.business.sell.service.SellService;
import com.dd.admin.business.sellDetail.entity.SellDetail;
import com.dd.admin.business.sellDetail.service.SellDetailService;
import com.dd.admin.business.sellPay.entity.Sellpay;
import com.dd.admin.business.sellPay.service.SellpayService;
import com.dd.admin.common.exception.ApiException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;

import static com.dd.admin.business.pay.enmus.CashierExceptionEnum.CARDNO_ALREADY_EXIST;

@Service
public class SellDetailBuildCard implements AddSellDetailService {

    @Autowired
    private CardService cardService;
    @Autowired
    private MemberCardService memberCardService;
    @Autowired
    private SellDetailService sellDetailService;
    @Autowired
    private SellpayService sellpayService;
    @Autowired
    private SellService sellService;

    @Override
    public void addSellDetail(Sell sell, BaseSell sellDto) {
        //转换数据
        BuildCardSell buildCardSell = (BuildCardSell) sellDto;
        // 1 获取开卡金额 等信息 先开卡
        String cardId = buildCardSell.getBuildCardForm().getCardId();
        //获取需要的开卡信息
        Card card = cardService.getById(cardId);
        //开卡
        MemberCard memberCard = buildMemberCard(sell, buildCardSell.getBuildCardForm(), card);
        //2生成销售细单
        SellDetail sellDetail = addSellDetail(sell,buildCardSell,memberCard);
        //添加支付方式
        sellpayService.addSellPayList(buildCardSell.getSellPayList(),sell.getSellId());

        //4因为是开卡还要设置额外信息
        Sell extraSellInfo = new Sell();
        extraSellInfo.setSellId(sell.getSellId());

        //设置会员信息
        extraSellInfo.setMemberId(buildCardSell.getMemberId());
        extraSellInfo.setMemberName(buildCardSell.getMemberName());
        //设置订单的卡信息
        extraSellInfo.setMemberCardId(memberCard.getMemberCardId());
        //设置订单的卡余额
        extraSellInfo.setMemberCardBeforeAmount(BigDecimal.ZERO);
        extraSellInfo.setMemberCardBeforeGiveAmount(BigDecimal.ZERO);

        extraSellInfo.setMemberCardAfterAmount(memberCard.getAmount());
        extraSellInfo.setMemberCardAfterGiveAmount(memberCard.getGiveAmount());

        sellService.updateById(extraSellInfo);
    }

    MemberCard buildMemberCard(Sell sell, BuildCardForm buildCardForm, Card card){
        //设置卡的基本和余额信息
        MemberCard memberCard = new MemberCard();
        memberCard.setMemberId(sell.getMemberId());
        memberCard.setCardId(card.getCardId());
        memberCard.setCardName(card.getCardName());

        String cardNo = buildCardForm.getCardNo();
        MemberCardVo membercardVo =  memberCardService.selectOneByCardNo(cardNo);
        if(membercardVo!=null){
            throw new ApiException(CARDNO_ALREADY_EXIST);
        }
        memberCard.setCardNo(buildCardForm.getCardNo());
        memberCard.setAmount(buildCardForm.getCardAmount());
        memberCard.setBuildCardAmount(buildCardForm.getCardAmount());
        memberCard.setGiveAmount(buildCardForm.getGiveAmount());

        //获取订单的卡折扣信息 设置进会员卡中
        memberCard.setDiscount(card.getCardDiscount());

        //设置该卡的提成金额
        memberCard.setPushMoney(card.getCardPushPercent());

        memberCardService.save(memberCard);
        return memberCard;
    }

    SellDetail addSellDetail(Sell sell,BuildCardSell buildCardSell,MemberCard membercard){
        BuildCardForm buildCardForm = buildCardSell.getBuildCardForm();
        SellDetail sellDetail = new SellDetail();
        //3设置订单id 订单类型 订单状态
        sellDetail.setSellId(sell.getSellId());
        sellDetail.setSellType(sell.getSellType());
        sellDetail.setMemberId(sell.getMemberId());
        //设置商品信息
        sellDetail.setCardId(buildCardForm.getCardId());
        sellDetail.setCardName(buildCardForm.getCardName());
        sellDetail.setAmount(buildCardForm.getCardAmount());
        sellDetail.setGiveAmount(buildCardForm.getGiveAmount());
        sellDetail.setRealAmount(sell.getRealAmount());

        //设置会员信息
        sellDetail.setMemberCardId(membercard.getMemberCardId());

        //开卡后卡金和赠送金
        sellDetail.setAmount(membercard.getAmount());
        sellDetail.setGiveAmount(membercard.getGiveAmount());

        //保存销售细单
        sellDetailService.save(sellDetail);
        return sellDetail;
    }

}

后续我们需要完成收银台的选择会员卡支付
订单管理功能

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1842956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

船舶行业信息安全解决方案介绍

船舶行业信息安全背景: 近年来随着经济复苏、疫情与国际形势影响国内外船舶海运业务蓬勃发展,在业务量激增的背景下出现多类信息安全事件。其中2017年,马士基集团遭到勒索软件攻击,内部业务系统和码头操作系统均受到严重影响&…

U盘数据恢复,小白也适用的4个方法!

你是否曾经遇到过这样的情况:当你满怀期待地插入U盘,准备欣赏那些珍贵的照片、视频或重要文件时,却发现U盘中的数据仿佛被一阵海风轻轻吹散,只剩下空荡荡的文件夹和一片茫然。那种失落感,就像是突然发现手中的藏宝图被…

(四十三)Vue Router之嵌套路由

文章目录 什么是嵌套路由嵌套路由的使用demo 上一篇:(四十二)Vue之路由及其基本使用Vue Router 什么是嵌套路由 实际生活中的应用界面,有可能由多层嵌套的组件组合而成。同样地,URL 中各段动态路径也按某种结构对应嵌…

数据可视化案例

数据可视化案例 相关的技术:scrapy、pandas、pyecharts。 使用豆瓣电影中的数据来进行可视化,网址:豆瓣电影 Top 250 (douban.com) 一、网页数据分析 我们需要爬取的是豆瓣电影Top250网页每一页的电影名称、图片链接、导演、年份、国家、电…

Bert模型实现中文新闻文本分类

Bert基于Transformer架构是解决自然语言处理的深度学习模型,常使用在文本分类、情感分析、词性标注等场合。 本文将使用Bert模型对中文文本进行分类,其中训练集数据18W条,验证集数据1W条,包含10个类别的文本数据,数据可以自己从Ka…

大润发超市购物卡怎么用?

收到大润发超市的礼品卡以后,我才发现,最近的大润发也得十来公里 为了100块的大润发打车也太不划算了 叫外送也不在配送范围内 最后没办法,在收卡云上出掉了,还好最近价格不错,也不亏,收卡云的到账速度也…

leetcode:557. 反转字符串中的单词 III(python3解法)

难度:简单 给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 示例 1: 输入:s "Lets take LeetCode contest" 输出:"steL ekat edoCteeL tsetnoc…

使用飞书多维表格实现推送邮件

一、为什么用飞书? 在当今竞争激烈的商业环境中,选择一款高效、智能的办公工具至关重要。了解飞书的朋友应该都知道,飞书的集成能力是很强大的,能够与各种主流的办公软件无缝衔接,实现数据交互,提升工作效…

恒创科技:云主机上的数据安全如何保证?(实用性技巧分享)

云主机上的数据安全如何保证?答案很简单,虽很多用户却不能完全做到,但我们可以了解一些安全措施予以防范。以下是云主机数据保护的几个实用技巧,希望对您有所帮助! 1.避免将敏感信息存储在云中 网络上的许多建议听起来都像这样:“…

业余时间做跨境电商实现经济自由,我是怎么做的?

在知乎问答上翻阅大家非常感兴趣的问题,解答一些疑惑的同时,发现大家对跨境电商还是很感兴趣的,类似“小白如何入局跨境电商?2024跨境电商平台,哪些值得做?现在电商哪个平台好做?”等的这些主观问题&#…

ubuntu访问windows共享文件夹

方法: Ubuntu访问Windows共享文件夹的方法-CSDN博客 基于交换机的PC端网络通信_服务器交换机pc端-CSDN博客 补充说明: 在这里面输入: smb://192.168.0.30/WindowsShareToLinux

虚拟机Ping不通主机

1.问题描述 虚拟机IP: 192.168.3.133 主机ip:192.168.3.137 虚拟机Ping不通主机 主机可以ping通虚拟机 2.解决方案 设置桥接模式 控制面板找到网络和Internet设置 3.问题解决

Leetcode - 周赛401

目录 一,3178. 找出 K 秒后拿着球的孩子 二,3179. K 秒后第 N 个元素的值 三,3180. 执行操作可获得的最大总奖励 I 四,3181. 执行操作可获得的最大总奖励 II 一,3178. 找出 K 秒后拿着球的孩子 本题可以直接模拟&a…

CesiumJS整合ThreeJS插件封装

最近做项目有一个三维需求使用CesiumJS比较难以实现,发现THREEJS中效果比较合适,于是准备将THREEJS整合到CesiumJS中 为实现效果所需我们找到官方Integrating Cesium with Three.js博客,于是根据该博客提供的思路去实现整合 文章目录 一、创…

VMware虚拟机三种网络模式设置 - NAT(网络地址转换模式)

一、前言 在前一篇《Bridged(桥接模式)》中,我详细介绍了虚拟机网络模式设置中的桥接模式。今天详细讲解一下NAT(网络地址转换模式)。 在虚拟机(VM)中,NAT(Network Addre…

微信小程序navigateTo异常(APP-SERVICE-SDK:Unknown URL)

背景 在开发小程序时,可能会用到banner,通过banner跳转至各种子页面。但是因为小程序自身的因素,有些是不允许的,比如通过banner跳转一个http/https链接。如果使用 wx.navigateTo完成跳转时,就会发生异常。 navigate…

Latex添加参考文献的两种方案

Latex添加参考文献的两种方案 方案1:一般插入法方案2:使用BibTex 方案1:一般插入法 此方案在latex结尾直接插入参考文献,一般从IEEE官网下载的模板好像默认都是这样的!下面为参考格式: 这种方案比较容易操…

产品心理学:曝光效应

曝光效应(the exposure effect or the mere exposure effect):又谓多看效应、(简单、单纯)暴露效应、(纯粹)接触效应等等。 它是一种心理现象,指的是我们会偏好自己熟悉的事物&#…

JVM中的垃圾回收机制

文章目录 什么是垃圾为什么需要垃圾回收早期垃圾回收Java的垃圾回收机制垃圾回收主要关注的区域垃圾判定算法引用计数算法可达性分析算法 垃圾收集算法标记清除算法复制算法标记整理算法分代收集思想增量收集算法分区算法 什么是垃圾 垃圾回收(Garbage Collection&…

2024-06月 | 维信金科 | 风控数据岗位推荐,高收入岗位来袭!

今日推荐岗位:策略分析经理/分析专家、贷前、中策略分析、风控模型分析。 风控部门是金融业务的核心部门,而从事风控行业的人即称之为风险管理者。是大脑,是最最最重要的部门之一。今日推荐岗位的核心技能分布如下: 简历发送方式…