Java开源生鲜电商平台-订单抽成模块的设计与架构(源码可下载)
Java生鲜电商平台-订单抽成模块的设计与架构
说明:订单抽成指的是向卖家收取相应的信息服务费.(目前市场上有两种抽成方式,一种是按照总额的抽成比率,另外一种是按照订单明细的抽成比率)
由于生鲜电商的垂直领域的特殊性质,总额抽成不切合实际,所以按照订单的明细抽成。
1. 订单抽成,是按照一个区的维度,以及菜品的二级分类类抽点的。
举例说明:比如武汉光谷区,佛祖岭区,虽然都是属于东湖高新,但是光谷区的物价以及消费水平肯定是高于佛祖岭区的,因此它是按照一个区的维度来分的。
但是有些卖家挣的钱多,有的卖家挣的钱少,虽然同属于一个菜市场,但是挣钱少的跟挣钱多的一样抽成,他们也不乐意,因此又按照卖家的ID进行抽查。
最终根据业务的形态以及我们的市场调查结果,采用以商户为基准,按照菜品的二级分类来抽成的一种盈利模式。
2. 数据库系统架构设计如下:
卖家抽点配置信息表:
- CREATE TABLE `order_percentage_config` (
- `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键,自动增加ID',
- `region_id` bigint(20) NOT NULL COMMENT '区域id',
- `seller_id` bigint(20) DEFAULT NULL COMMENT '卖家id',
- `category_id` bigint(20) DEFAULT NULL COMMENT '商品二级分类的ID',
- `percentage` decimal(12,2) DEFAULT NULL COMMENT '平台抽点率 ',
- `status` tinyint(1) DEFAULT NULL COMMENT '状态: 0禁用 ,1启用',
- `create_time` datetime DEFAULT NULL COMMENT '创建时间 ',
- `update_time` datetime DEFAULT NULL COMMENT '修改时间',
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=144 DEFAULT CHARSET=utf8 COMMENT='订单抽点配置信息表';
说明:按照卖家的所属二级分类进行抽点,不同的抽点率也是不一样的。
2. 卖家抽点明细表。(系统需要精确的记录,那个菜品进行了抽点,抽点多少,原来的多少钱,抽点后多少钱,需要明明白白的,让卖家清清楚楚的有一笔账)
- CREATE TABLE `order_percentage` (
- `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自动增加ID',
- `order_item_id` bigint(20) DEFAULT NULL COMMENT '订单item的ID',
- `order_number` varchar(64) DEFAULT NULL COMMENT '所属订单号',
- `seller_id` bigint(20) DEFAULT NULL COMMENT '卖家id',
- `order_total_amount` decimal(12,2) DEFAULT NULL COMMENT '订单金额',
- `order_percentage` decimal(12,2) DEFAULT NULL COMMENT '抽点比率',
- `order_percentage_amount` decimal(12,2) DEFAULT NULL COMMENT '抽点金额',
- `order_reality_money` decimal(12,2) DEFAULT NULL COMMENT '订单最终金额即用户最终收到的金额',
- `create_time` datetime DEFAULT NULL COMMENT '所属时间',
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=47226 DEFAULT CHARSET=utf8 COMMENT='抽点信息总表';
补充说明:1. 由于的是对某一个明细进行抽点。所以需要卖家ID,订单明细ID以及抽点比率等,最终算出抽点金额。
3. 何时进行抽点呢、
回答:每天早上6点30进行昨天的抽点,形成自己的账单。
相关的核心代码如下:采用spring task做定时器
- /**
- * 计算订单抽成 每天早上6:30点执行
- */
- @Scheduled(cron = "0 30 6 * * ?")
- protected void makeOrderPercentage() {
- try {
- logger.info("TasksQuartz.makeOrderPercentage.start");
- // 计算订单抽成,并生成抽成数据
- orderPercentageService.batchSaveOrderPercentage();
- logger.info("TasksQuartz.makeOrderPercentage.end");
- } catch (Exception ex) {
- logger.error("TasksQuartz.makeOrderPercentage.exception", ex);
- }
- }
业务核心代码:
- @Service
- public class OrderPercentageserviceImpl implements OrderPercentageService {
- private static final Logger logger = LoggerFactory.getLogger(OrderPercentageserviceImpl.class);
- @Autowired
- private OrderItemDao orderItemDao;
- @Autowired
- private OrderPercentageConfigDao orderPercentageConfigDao;
- @Autowired
- private OrderPercentageDao orderPercentageDao;
- /**
- * 批量新增数据
- */
- @Override
- public void batchSaveOrderPercentage() {
- // 1.获取昨天12:00到今天早上6:00的所有的订单明细
- Map<String, Object> dateMap = DateUtil.getTradeTime(0);
- List<OrderItem> orderItems = orderItemDao.getOrderItemsByDate(dateMap);
- List<OrderPercentage> list = new ArrayList<OrderPercentage>();
- if (CollectionUtils.isEmpty(orderItems)) {
- return;
- }
- for (OrderItem item : orderItems) {
- try {
- Long formatId = item.getFormatId();
- Long sellerId = item.getSellerId();
- OrderPercentageConfig config = orderPercentageConfigDao.getOrderPercentageConfig(formatId, sellerId);
- if (config == null) {
- logger.error("batchSaveOrderPercentage.config.isEmpty:" + "formatId:" + formatId + " sellerId:"
- + sellerId);
- continue;
- }
- OrderPercentage orderPercentage = new OrderPercentage();
- // 订单总额
- BigDecimal orderTotalAmount = item.getGoodsAmount();
- // 抽点比率
- BigDecimal percentage = config.getPercentage();
- // 抽点金额
- BigDecimal orderPercentageAmount = orderTotalAmount.multiply(percentage)
- .multiply(new BigDecimal("0.01")).setScale(3, BigDecimal.ROUND_UP);
- // 卖家最终所得
- BigDecimal orderRealityMoney = orderTotalAmount.subtract(orderPercentageAmount).setScale(3,
- BigDecimal.ROUND_UP);
- orderPercentage.setCreateTime(new Date());
- orderPercentage.setOrderItemId(item.getId());
- orderPercentage.setOrderNumber(item.getOrderNumber());
- orderPercentage.setOrderTotalAmount(orderTotalAmount);
- orderPercentage.setOrderPercentage(percentage);
- orderPercentage.setOrderPercentageAmount(orderPercentageAmount);
- orderPercentage.setOrderRealityMoney(orderRealityMoney);
- orderPercentage.setSellerId(sellerId);
- list.add(orderPercentage);
- } catch (Exception ex) {
- logger.error("batchSaveOrderPercentage.exception", ex);
- }
- }
- try {
- orderPercentageDao.batchSaveOrderPercentage(list);
- } catch (Exception ex) {
- logger.error("batchSaveOrderPercentage", ex);
- }
- }
- }
相关后台运营截图如下;
Java开源生鲜电商平台-订单抽成模块的设计与架构(源码可下载)的更多相关文章
- Java开源生鲜电商平台-订单表的设计(源码可下载)
Java开源生鲜电商平台-订单表的设计(源码可下载) 场景分析说明: 买家(餐馆)用户,通过APP进行选菜,放入购物车,然后下单,最终支付的流程,我们称为下单过程. 买家可以在张三家买茄子,李四家买萝 ...
- Java开源生鲜电商平台-系统简介
Java开源生鲜电商平台-系统简介 1.生鲜电商平台的价值与定位. 生鲜电商平台是一家致力于打造全国餐饮行业智能化.便利化.平台化与透明化服务的创新型移动互联网平台,连接买家与卖家之间的一个平台 看以 ...
- Java开源生鲜电商平台-盈利模式详解(源码可下载)
Java开源生鲜电商平台-盈利模式详解(源码可下载) 该平台提供一个联合买家与卖家的一个平台.(类似淘宝购物,这里指的是食材的购买.) 平台有以下的盈利模式:(类似的平台有美菜网,食材网等) 1. 订 ...
- Java开源生鲜电商平台-支付模块的设计与架构(源码可下载)
Java开源生鲜电商平台-支付模块的设计与架构(源码可下载) 开源生鲜电商平台支付目前支持支付宝与微信.针对的是APP端(android or IOS) 1. 数据库表设计. 说明:无论是支付宝还 ...
- Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载)
ava开源生鲜电商平台-购物车模块的设计与架构(源码可下载) 说明:任何一个电商无论是B2C还是B2B都有一个购物车模块,其中最重要的原因就是客户需要的东西放在一起,形成一个购物清单,确认是否有问题, ...
- Java开源生鲜电商平台-推荐系统模块的设计与架构(源码可下载)
Java开源生鲜电商平台-推荐系统模块的设计与架构(源码可下载) 业务需求: 对于一个B2B的生鲜电商平台,对于买家而言,他需要更加快速的购买到自己的产品,跟自己的餐饮店不相关的东西,他是不关心的,而 ...
- Java开源生鲜电商平台-性能优化以及服务器优化的设计与架构(源码可下载)
Java开源生鲜电商平台-性能优化以及服务器优化的设计与架构(源码可下载) 说明:Java开源生鲜电商平台-性能优化以及服务器优化的设计与架构,我采用以下三种维度来讲解 1. 代码层面. 2. 数 ...
- Java开源生鲜电商平台-优惠券设计与架构(源码可下载)
Java开源生鲜电商平台-优惠券设计与架构(源码可下载) 说明:现在电商白热化的程度,无论是生鲜电商还是其他的电商等等,都会有促销的这个体系,目的就是增加订单量与知名度等等 那么对于Java开源生鲜电 ...
- Java开源生鲜电商平台-团购模块设计与架构(源码可下载)
Java开源生鲜电商平台-团购模块设计与架构(源码可下载) 说明:任何一个电商系统中,对于促销这块是必不可少的,毕竟这块是最吸引用户的,用户也是最爱的模块之一,理由很简单,便宜. 我的经验是无论是大的 ...
随机推荐
- FFMPEG结构体分析:AVFormatContext
注:写了一系列的结构体的分析的文章,在这里列一个列表: FFMPEG结构体分析:AVFrameFFMPEG结构体分析:AVFormatContextFFMPEG结构体分析:AVCodecContext ...
- TCP的核心系列 — 重传队列的更新和时延的采样(一)
重传队列实际上就是发送队列(sk->sk_write_queue),保存着发送且未确认的数据段. 当有新的数据段被确认时,需要把这些段从重传队列中删除,同时更新一些变量,包括 packets_o ...
- 安卓笔记--Edittext禁止换行
直接在EditText的xml文件中通过配置android:singleLine="true"把虚拟键盘上的enter键禁止掉,不会显示 <edittext android: ...
- OpenGL OpenCV根据视差图重建三维信息
代码如下: // disparity_to_3d_reconstruction.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" //Huan ...
- iOS监听模式系列之本地通知Notification
本地通知 本地通知是由本地应用触发的,它是基于时间行为的一种通知形式,例如闹钟定时.待办事项提醒,又或者一个应用在一段时候后不使用通常会提示用户使用此应用等都是本地通知.创建一个本地通知通常分为以下几 ...
- 关于Html5发展和应用前景
现在的HTML5就像当年崭露头角时的Ajax,有人在做,但不知道叫它什么.最近,苹果在 HTML5上大做文章,而著名的Web设计师Eric Meyer则提出了Web Stacks的概念.Alex Ke ...
- 快速掌握Oracle异常
自定义例外是指由PL/SQL开发人员所定义的例外.预定义例外和非预定义例外都和Oracle错误有关,并且出现Oracle错误时会隐含的处罚相应例外:而自定义例外与Oracle错误没有任何关联,它是由开 ...
- 修改访问的后缀contant
设置Struts 2处理的请求后缀及Action调用 1.在struts2中默认处理的请求后缀为action,我们可以修改struts.xml 和struts.properties来修改默认的配置,在 ...
- 多台或者集群环境下如何保证spring定时器只执行一个
先说一下我们的系统, 在65和66上分别部署有weblogic节点,共计四个,在项目中我们的定时器会隔一段时间就从其它的五个系统中取数据,这时就出现了问题,本来取一次数据就可以的,现在重复执行了三次, ...
- Python并发编程-RabbitMQ消息队列
RabbitMQ队列 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列 ...