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开源生鲜电商平台-订单抽成模块的设计与架构(源码可下载)的更多相关文章

  1. Java开源生鲜电商平台-订单表的设计(源码可下载)

    Java开源生鲜电商平台-订单表的设计(源码可下载) 场景分析说明: 买家(餐馆)用户,通过APP进行选菜,放入购物车,然后下单,最终支付的流程,我们称为下单过程. 买家可以在张三家买茄子,李四家买萝 ...

  2. Java开源生鲜电商平台-系统简介

    Java开源生鲜电商平台-系统简介 1.生鲜电商平台的价值与定位. 生鲜电商平台是一家致力于打造全国餐饮行业智能化.便利化.平台化与透明化服务的创新型移动互联网平台,连接买家与卖家之间的一个平台 看以 ...

  3. Java开源生鲜电商平台-盈利模式详解(源码可下载)

    Java开源生鲜电商平台-盈利模式详解(源码可下载) 该平台提供一个联合买家与卖家的一个平台.(类似淘宝购物,这里指的是食材的购买.) 平台有以下的盈利模式:(类似的平台有美菜网,食材网等) 1. 订 ...

  4. Java开源生鲜电商平台-支付模块的设计与架构(源码可下载)

    Java开源生鲜电商平台-支付模块的设计与架构(源码可下载) 开源生鲜电商平台支付目前支持支付宝与微信.针对的是APP端(android or IOS)   1. 数据库表设计. 说明:无论是支付宝还 ...

  5. Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载)

    ava开源生鲜电商平台-购物车模块的设计与架构(源码可下载) 说明:任何一个电商无论是B2C还是B2B都有一个购物车模块,其中最重要的原因就是客户需要的东西放在一起,形成一个购物清单,确认是否有问题, ...

  6. Java开源生鲜电商平台-推荐系统模块的设计与架构(源码可下载)

    Java开源生鲜电商平台-推荐系统模块的设计与架构(源码可下载) 业务需求: 对于一个B2B的生鲜电商平台,对于买家而言,他需要更加快速的购买到自己的产品,跟自己的餐饮店不相关的东西,他是不关心的,而 ...

  7. Java开源生鲜电商平台-性能优化以及服务器优化的设计与架构(源码可下载)

    Java开源生鲜电商平台-性能优化以及服务器优化的设计与架构(源码可下载) 说明:Java开源生鲜电商平台-性能优化以及服务器优化的设计与架构,我采用以下三种维度来讲解 1.  代码层面. 2.  数 ...

  8. Java开源生鲜电商平台-优惠券设计与架构(源码可下载)

    Java开源生鲜电商平台-优惠券设计与架构(源码可下载) 说明:现在电商白热化的程度,无论是生鲜电商还是其他的电商等等,都会有促销的这个体系,目的就是增加订单量与知名度等等 那么对于Java开源生鲜电 ...

  9. Java开源生鲜电商平台-团购模块设计与架构(源码可下载)

    Java开源生鲜电商平台-团购模块设计与架构(源码可下载) 说明:任何一个电商系统中,对于促销这块是必不可少的,毕竟这块是最吸引用户的,用户也是最爱的模块之一,理由很简单,便宜. 我的经验是无论是大的 ...

随机推荐

  1. 【Android 应用开发】AndroidUI设计之 布局管理器 - 详细解析布局实现

    写完博客的总结 : 以前没有弄清楚的概念清晰化 父容器与本容器属性 : android_layout...属性是本容器的属性, 定义在这个布局管理器的LayoutParams内部类中, 每个布局管理器 ...

  2. JAVA中重写equals()方法的同时要重写hashcode()方法

    object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true:注意:当此方法 ...

  3. iOS自定义多参数类型方法

    前几天做自定义UIAlertView的时候,想仿造系统自带的初始化方法做一个AlertView,里面涉及到不确定多参数的设置和使用问题.这里做一下记录. 我自定义了一个方法: - (instancet ...

  4. 如果去掉UITableView上的section的headerView和footerView的悬浮效果

    项目需要cell的间距,又不需要悬浮效果,百度之后找到这个方法,记录一下,备忘. 用UIScrollView的代理方法实现 - (void)scrollViewDidScroll:(UIScrollV ...

  5. linux下由带-开头文件想到的

    如果要删除文件-aaa,使用rm -aaa是不行的,rm会认为-后面的是参数.2种办法: 1 带明确路径指示 rm ./-aaa 2 使用 -- :rm -- -aaa 因为命令如果发现参数中有--, ...

  6. rails应用ajax之一:使用纯js方法

    考虑如下需求: 1. 用户输入一个用户名,当焦点跳出文本框时,检查该用户名是否有效 2. 动态更新检查的结果 我们使用ajax的方式来实现这个简单的功能,首先建立view:check.html.erb ...

  7. ubuntu下无法编译ruby-2.1.5提示something wrong with CFLAGS -arch x86_64

    在Mac OS X10.10下以下语句运行没有问题: ./configure -prefix=/Users/apple/src/ruby_src/ruby2.1.5_installed --with- ...

  8. Java不走弯路教程(6.JDBC)

    6.JDBC 在上一章,我们完成了MyDb数据库的简单的客户段调用.作为产品我们还封装了驱动程序,并且提供了统一的调用接口. 大家应该知道,市面上有多种数据库产品,比如Oracle,Mysql,DB2 ...

  9. combination sum、permutation、subset(组合和、全排列、子集)

    combination sum I.permutation I.subsets  I 是组合和.全排列.子集的第一种情况,给定数组中没有重复的元素. combination sum II.permut ...

  10. Collections.sort自定义排序的使用方法

    Collections.sort自定义排序的使用方法 总结:Collections可以对List进行排序:如果想对Map进行排序,可以将Map转化成List,进行排序: public static v ...