商城积分系统的设计方案(中)-- 数模设计

一、总体设计

在这里插入图片描述

在这里插入图片描述

积分和积分渠道,实现积分种类和发放的动态配置,是设计中的关键之处。

积分订单表是不必要的,视具体业务需求而定。

积分账户和账户收支是核心的两个表。

后面三个表都有一个school_id, 其实就是租户编号,不同的学校或租户,互不共享。

二、积分表points

用于抽象各种虚拟货币,并通过类别来区分不同的货币体系。

包括主键ID、积分类别type、积分名称name、创建时间、更新时间、创建人员、更新人员、备注


CREATE TABLE `points` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',`type` varchar(32) NOT NULL COMMENT '积分类别',`name` varchar(128) NOT NULL COMMENT '积分名称',`created_date` datetime DEFAULT NULL COMMENT '创建时间',`modified_date` datetime DEFAULT NULL COMMENT '更新时间',`created_by` varchar(64) DEFAULT NULL COMMENT '创建人员',`modified_by` varchar(64) DEFAULT NULL COMMENT '更新人员',`remark` varchar(128) DEFAULT NULL COMMENT '备注',PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `uk_type` (`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分表';

我这里新增了三种虚拟货币:

在这里插入图片描述

三、积分渠道表points_channel

通过有效期的时间区间,控制积分的发放,减少风险。

包括主键ID、渠道编号code、渠道名称name、积分类别(渠道和积分的关联关系)、奖励的积分数reward_points、有效期起始时间、有效期截止时间、创建时间、更新时间、创建人员、更新人员、备注

CREATE TABLE `points_channel` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',`code` varchar(32) NOT NULL COMMENT '渠道编码',`name` varchar(128) NOT NULL COMMENT '渠道名称',`points_type` varchar(32) NOT NULL COMMENT '积分类别',`reward_points` int(10) DEFAULT 0 COMMENT '奖励的积分数',`begin_date` datetime DEFAULT NULL COMMENT '起始时间',`end_date` datetime DEFAULT NULL COMMENT '截止时间',`created_date` datetime DEFAULT NULL COMMENT '创建时间',`modified_date` datetime DEFAULT NULL COMMENT '更新时间',`created_by` varchar(64) DEFAULT NULL COMMENT '创建人员',`modified_by` varchar(64) DEFAULT NULL COMMENT '更新人员',`remark` varchar(128) DEFAULT NULL COMMENT '备注',PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `uk_code_points_type` (`code`,`points_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分渠道表,一类积分对应多个渠道';

在这里插入图片描述
比如,邀请他人购买某商品,即可获得虚拟货币类型是key的积分值是4。
再比如,某活动闯关成功,即可获得1个积分。

四、积分账户表points_account

包括主键ID、用户ID、积分类别points_type、积分数points、创建时间、更新时间

CREATE TABLE `points_account` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',`school_id` int(10) DEFAULT NULL COMMENT '学校ID',`user_id` bigint(20) NOT NULL COMMENT '用户ID',`points_type` varchar(32) NOT NULL COMMENT '积分类别',`points` int(10) DEFAULT 0 COMMENT '积分数',`created_date` datetime DEFAULT NULL COMMENT '创建时间',`modified_date` datetime DEFAULT NULL COMMENT '更新时间',`version` bigint(20) DEFAULT 0 COMMENT '版本号',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分账户表';

这里多了一个学校ID维度,一个用户可能在多个学校开有账户。

如果你的业务系统没有这么复杂,可去掉该字段。

学校ID,可以进一步抽象为租户编号,隔离性和抽象性更好。意思是,你在不同租户的账户不一样。

在这里插入图片描述
这里的余额,就是可用余额,我们没有去细分可用余额和冻结余额。

没有冻结的概念,大大减少了复杂度。

用户在获得积分的时候,增加至账户的余额;同理,在消耗积分的时候,减损的也是账户的余额。

有一种情况,需要考虑的,积分本身的退订。又可以分为两种情况:

  • 通过现金方式购买,获得的积分,用户需要退款。(因为积分本身是虚拟商品,大多数平台是不允许退的。 一旦需要退,则应该视积分的使用情况而定,全额退还是部分退,积分已经消耗量是其重要的依据)

  • 用户使用积分抵扣购买商品,属于消耗积分,用户需要退该订单。(用户审核退单,同意后,自动发放等量的积分给用户)

五、积分账户的流水表points_account_flow

包括主键ID、积分类别、积分数、类型(增/减)、用户ID、积分渠道编号、积分渠道名称、orderNo、创建时间、更新时间


CREATE TABLE `points_account_flow` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',`school_id` int(10) DEFAULT NULL COMMENT '学校ID',`type` smallint(1) DEFAULT 0 COMMENT '类型:0-增加;1-减少',`user_id` bigint(20) NOT NULL COMMENT '用户ID',`points_type` varchar(32) NOT NULL COMMENT '积分类别',`points` int(10) DEFAULT 0 COMMENT '积分数',`channel_code` varchar(32) DEFAULT NULL COMMENT '渠道编码',`channel_name` varchar(128) DEFAULT NULL COMMENT '渠道名称',`order_no` varchar(32) DEFAULT NULL COMMENT '订单号',`created_date` datetime DEFAULT NULL COMMENT '创建时间',`modified_date` datetime DEFAULT NULL COMMENT '更新时间',`created_by` varchar(64) DEFAULT NULL COMMENT '创建人员',`modified_by` varchar(64) DEFAULT NULL COMMENT '更新人员',`remark` varchar(128) DEFAULT NULL COMMENT '备注',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分账户的流水表';

当type类型是0-增加的时候,channel_code和channel_name不能为空;
当type类型是1-减少的时候,order_no不能为空。这里的order_no是业务订单的订单号,记录积分消耗在哪里。

六、积分订单(区别于业务订单)

用户使用现金购买积分(虚拟货币),准确地说,应该叫做积分订单扩展表,用于退款和结算的依据。

记录每个订单的积分数、已使用数、可用、已退、已结算和可结算等。注意:已结算的积分不能退回。(当然积分数不变,其余的都可能会变化)

  • 每次积分的抵扣,更新已使用、可用积分、可结算积分。优先抵扣最早的积分订单的可用积分。也就是说,可能会抵扣多个积分订单中的可用积分。
  • 积分订单退款,只能退款可用的积分,对于已使用的积分是不能退的。
  • 每次结算,把可结算积分加至已结算积分

在这里插入图片描述

下面是总结的几个等式:

  • 积分数=可用积分数+已退积分数+已使用积分数。
  • 积分数=可用积分数+已退积分数+可结算积分数+已结算积分数
  • 已使用积分数=可结算积分数+已结算积分数

CREATE TABLE `points_order` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',`order_no` varchar(32) NOT NULL COMMENT '订单号',`user_id` bigint(20) NOT NULL COMMENT '用户ID',`school_id` int(10) NOT NULL COMMENT '学校ID',`points_type` varchar(32) NOT NULL COMMENT '积分类别',`points` int(10) DEFAULT 0 COMMENT '积分数',`used_points` int(10) DEFAULT 0 COMMENT '已使用积分数',`available_points` int(10) DEFAULT 0 COMMENT '可用积分数',`refunded_points` int(10) DEFAULT 0 COMMENT '已退积分数',`settled_points` int(10) DEFAULT 0 COMMENT '已结算积分数',`available_settle_points` int(10) DEFAULT 0 COMMENT '可结算积分数',`created_date` datetime DEFAULT NULL COMMENT '创建时间',`modified_date` datetime DEFAULT NULL COMMENT '更新时间',`version` bigint(20) DEFAULT 0 COMMENT '版本号',PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `uk_order_no` (`order_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分结算表';

如果你的业务不支持积分订单的退款,更无需结算功能,本表无需引入。

最后说一下,业务订单中涉及积分的退款,视这部分的积分已使用,本来是无法逆向退款。
这里采取一个折中的方案,手动给用户发放等量的积分,比如业务订单使用了999个积分,当退款成功时,后台给用户发放999个积分。

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

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

相关文章

PointMamba: A Simple State Space Model for Point Cloud Analysis

1. 论文基本信息 2. 创新点 介绍了第一个状态空间模型 PointMamba,将其应用与点云分析。PointMamba 表现出令人印象深刻的能力,包括结构简单性(例如,vanilla Mamba)、低计算成本和知识可迁移性(例如&#…

如何将编译过的C++库迅速部署在Visual Studio新项目中

本文介绍在Visual Studio中,通过属性表,使得一个新建解决方案中的项目可以快速配置已有解决方案的项目中各类已编译好的C第三方库的方法。 例如,我们现有一个解决方案,其中的一个项目需要调用Armadillo、OpenCV等多个不同的C第三…

爆款短视频素材库有哪些?分享几个容易火的视频素材网站

当今自媒体时代,每位内容创作者都渴望制作出下一个爆款短视频。你是否在寻找那些能让你的视频迅速蹭热度的顶级素材库?本文将为你介绍几个视频素材库,它们或许能成为你成功的秘密武器。首先要提的,自然是著名的国内素材库——蛙学…

fetch-jsonp源码阅读

fetchJsonp源码 源码地址:https://github.com/camsong/fetch-jsonp jsonp优势 请求数据没有跨域的限制,后台不用考虑跨域问题 对于老版本浏览器更加支持 jsonp缺陷 只支持get请求,不支持其他所有方式的请求(请求方式受到了限制)只支持get请求,不支持post(不安…

SAP PP学习笔记24 - 生产订单(制造指图)的创建

上面两章讲了生产订单的元素。 SAP PP学习笔记22 - 生产订单(制造指图)的元素1-CSDN博客 SAP PP学习笔记23 - 生产订单(制造指图)的元素2 - 决济规则(结算规则)-CSDN博客 这一章讲生产订单的创建。比如 - 生产订单的流程&#…

【课程总结】Day12:YOLO的深入了解

前言 在【课程总结】Day11(下):YOLO的入门使用一节中,我们已经了解YOLO的使用方法,使用过程非常简单,训练时只需要三行代码:引入YOLO,构建模型,训练模型;预测…

SwiftUI八与UIKIT交互

代码下载 SwiftUI可以在苹果全平台上无缝兼容现有的UI框架。例如,可以在SwiftUI视图中嵌入UIKit视图或UIKit视图控制器,反过来在UIKit视图或UIKit视图控制器中也可以嵌入SwiftUI视图。 本文展示如何把landmark应用的主页混合使用UIPageViewController和…

代码随想录算法训练营第五十二天 | 647. 回文子串、516.最长回文子序列、动态规划总结篇、复习

647. 回文子串 题目链接:https://leetcode.cn/problems/palindromic-substrings/ 文档讲解:https://programmercarl.com/0647.%E5%9B%9E%E6%96%87%E5%AD%90%E4%B8%B2.html 视频讲解:https://www.bilibili.com/video/BV17G4y1y7z9/ 思路 确定…

Meta CEO 扎克伯格批评闭源AI竞争对手:称其试图“创造上帝”|TodayAI

美国社交媒体巨头Meta(Facebook母公司)的CEO马克扎克伯格(Mark Zuckerberg)近日在一次采访中,公开批评了那些他认为不够开放的AI竞争对手,称他们的行为就像是在“创造上帝”。扎克伯格坚定表示,AI技术不应该被某一家公…

git如何切换到tag分支

项目场景: 当我们需要回退到某个tag分支。 问题描述 通过git命令 git checkout tag_name 执行这个命令后,会提示你当前处于一个“detached HEAD”的状态。 原因分析: 这是因为tag只是一个快照,是不能更改代码的。 解决方案&am…

SysML与MBSE的关系

SysML与MBSE的关系 对于任何基于模型的系统工程 (MBSE) 方法,推荐的最佳实践是基于模型的语言、基于模型的工具、基于模型的流程和基于模型的架构框架的协同应用,如下图所示 系统架构四元组 图。经过十年将SysML应用于棘手的系统…

2535. 数组元素和与数字和的绝对差

给你一个正整数数组 nums 。 元素和 是 nums 中的所有元素相加求和。数字和 是 nums 中每一个元素的每一数位(重复数位需多次求和)相加求和。 返回 元素和 与 数字和 的绝对差。 注意:两个整数 x 和 y 的绝对差定义为 |x - y| 。 示例 1&a…

面试真题及答题思路(二)

题目 某地为了开发旅游资源,花费 600万元建了一个涉嫌抄袭的牛郎织女雕塑,变成了网红打卡地,也吸引了游客,但是部分网民说太丑,花的钱太多。对此,你怎么看?为了缓解辖区内双职工家庭的育儿压力…

戴尔md3400存储控制器脱机故障 电池故障处理

看了一下网上关于DELL MD系列存储故障处理的文档还是比较少的,最近处理了一些关于MD系列存储的问题,稍微整理整理就分享一下,各位喜欢摸索的朋友可以稍稍做些参考,当然如果想寻求外援的也可以快速的找到合适的人。以便安全又快捷的…

C语言基础——操作符

ʕ • ᴥ • ʔ づ♡ど 🎉 欢迎点赞支持🎉 个人主页:励志不掉头发的内向程序员; 专栏主页:C语言基础; 文章目录 前言 一、操作符的分类 二、二进制和进制转换 2.1 二进制转十进制 2.1.1 十…

零知识证明基础:数字签名

1、绪论 数字签名(Digital Signature),也称电子签名,是指附加在某一电子文档中的一组特定的符号或代码。它利用密码技术对该电子文档进行关信息提取并进行认证形成,用于标识签发者的身份以及签发者对电子文档的认可,并能被接收者…

pyqt5 制作视频剪辑软件,切割视频

该软件用于切割视频,手动选取视频片段的起始帧和结束帧并保存为json文件。gui界面如下:包含快进、快退、暂停等功能, 代码如下: # coding=UTF-8 """ theme: pyqt5实现动作起始帧和结束帧的定位,将定位到的帧数保存json文件 time: 2024-6-27 author: cong…

详细介绍LP-SCADA系统的核心数据采集单元

关键字:LP-SCADA系统, 传感器可视化, 设备可视化, 独立SPC系统, 智能仪表系统,SPC可视化,独立SPC系统 SCADA系统的数据采集功能是其核心组成部分,它允许系统从各种传感器、仪器和设备中收集实时数据。以下是SCADA系统数据采集功能的详细描述: 传感器和…

Kotlin vs Java:深入解析两者之间的最新差异与优劣(全面指南)

文章目录 1. 概述2. 语法简洁性3. 空安全4. 扩展函数5. 协程6. 数据类7. 智能类型转换8. 默认参数与命名参数9. 无 checked exceptions10. 单例模式总结 🎉欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨…

Java对象类辨识指南:Object与Objects类的区别详解

今天在写lambda表达式时,用filter来做过滤判断我的结果是否为null时使用到了Objects.nonNull,但是敲着敲着发现不对劲,怎么没有nonNull方法?? 其实时我少敲了一个s,当时自己并没有很清楚Object和Objects两者之前的区别&#xf…