Java开源生鲜电商平台-账单模块的设计与架构(源码可下载)
Java生鲜电商平台-账单模块的设计与架构
补充说明:生鲜电商平台-账单模块的设计与架构,即用户的账单形成过程。
由于系统存在一个押账功能的需求,(何为押账,就是形成公司的资金池,类似摩拜单车,ofo单车等等)。目前B2B平台也是采用押账的这种功能策略。
这里有个特别说明的押账方式:就是比如有个卖家张三,他是5月1日跟我们平台签约开始入住平台卖菜,我们约定好押账7天,那么他5月1日的金额会在5月2日存入
他自己的余额里面,但是这个钱不能马上提取出来,需要等一个星期,也就是5月8日可以提现5月1日的金额,5月9日可以提现5月2日以前的所有金额。
这个算法的最大好处就是永远的压住客户7天的金额。
这个算法采用的是Spring quartz定时器每天晚上23:00点处理的。
相关核心的代码如下:
/**
* 任务工作
* @author wangfucai
*/
@Component
public class TasksQuartz{ private static final Logger logger=LoggerFactory.getLogger(TasksQuartz.class); @Autowired
private BillService billService;
@Autowired
private SellerService sellerService;
@Autowired
private DeliveryIncomeService deliveryIncomeService;
@Autowired
private BuyerService buyerService;
@Autowired
private OrderInfoService orderInfoService;
@Autowired
private GroupsBuyerService groupsBuyerService; /**
* 计算每天账单
* 每天23点执行
*/
@Scheduled(cron="0 0 23 * * ?")
protected void makeBill(){
try
{
logger.info("TasksQuartz.execute.start");
//统计当天的交易完成的订单生成账单
billService.addBills();
logger.info("账单数据更新完成");
//根据卖家抽点金额更新账单实际金额
billService.updateRealAmountByPercentage();
logger.info("根据卖家抽点金额更新账单实际金额完成");
//更新卖家余额
sellerService.updateBalanceByBill();
logger.info("卖家余额数据更新完成");
logger.info("TasksQuartz.execute.end");
}catch(Exception ex)
{
logger.error("TasksQuartz.execute.exception",ex);
}
}
补充说明:1.需要统计每个卖家今天的收入。
2.并行的需要把订单的数据存入账单表。
3.余额来源于账单表。形成一个数据的流转体现。
账单表的表结构如下:

补充说明:每天定时器会根据卖家的账期形成账单,最终更新到用卖家的余额里面。
实际运营情况来讲是每个卖家的账期是不一样的,有的两天,有的三天,有的一周,有的是一个月。
相关核心算法与代码如下:
/**
* 统计10天前的账单更新卖家余额和账单金额
*/
@Override
public void updateMoney() {
// 获取10天前的日期d
String day = DateUtil.dateToString(DateUtil.addDay(new Date(), -9), DateUtil.FMT_DATE);
// 查询十天前的所有帐单信息
List<Map<String, Object>> list = billDao.getBillsByDay(day);
if (CollectionUtils.isEmpty(list)) {
logger.info("TasksQuartz.updateMoney.isEmpty-->day:" + day);
return;
}
for (Map<String, Object> map : list) {
// 卖家ID
Long sellerId = (Long) map.get("sellerId");
if (sellerId == null) {
continue;
}
// 获取提现的金额即最终账单的金额
BigDecimal realityMoney = (BigDecimal) map.get("realIncome");
if (realityMoney == null) {
continue;
}
// 获取卖家的余额
BigDecimal balanceMoney = (BigDecimal) map.get("balanceMoney");
if (balanceMoney == null) {
balanceMoney = BigDecimal.ZERO;
}
// 获取卖家的账单金额
BigDecimal billMoney = (BigDecimal) map.get("billMoney");
if (billMoney == null) {
billMoney = BigDecimal.ZERO;
}
// 金额相加
BigDecimal resultBalanceMoney = realityMoney.add(balanceMoney); BigDecimal resultBillMoney = realityMoney.add(billMoney); logger.info("当前用户sellerId:" + sellerId + " 当前的余额为:balanceMoney=" + balanceMoney
+ " 最终金额:resultBalanceMoney=" + resultBalanceMoney); logger.info("当前的余额为:billMoney=" + billMoney + " 最终金额:resultBillMoney=" + resultBillMoney);
// 更新卖家余额和账单金额
int result = sellerDao.updateMoney(sellerId, resultBalanceMoney, resultBillMoney);
logger.info("当前用户sellerId:" + sellerId + " 更新结果为:" + (result > 0));
}
// 更新十天前的所有账单的状态
int count = billDao.updateStatus(day);
logger.info(" 更新" + count + "条账单,状态变为已结算");
}
业务说明:
1. 无外乎每天需要统计卖家的今日收益情况。
2. 更新卖家的最终余额。
3. 根据卖家的所设置的账单周期,形成用户的账单金额。
4. 最终根据账单金额,形成用户的可提现余额的过程。
业务有点绕口,但是整体是非常地清晰的,思路就是押用户所配置的账期金额。配置10天就压10天,配置15天就压15天。
以下是账单跟卖家的核心关联表,就是配置所属的卖家对应的所属账期时间。

总结:整个技术方面其实都不算复杂,主要是业务逻辑以及统计的一些概念,希望这些定时器计算,账单思路形成,架构方面能给大家一些帮助。
Java开源生鲜电商平台-账单模块的设计与架构(源码可下载)的更多相关文章
- Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载)
ava开源生鲜电商平台-购物车模块的设计与架构(源码可下载) 说明:任何一个电商无论是B2C还是B2B都有一个购物车模块,其中最重要的原因就是客户需要的东西放在一起,形成一个购物清单,确认是否有问题, ...
- Java开源生鲜电商平台-推荐系统模块的设计与架构(源码可下载)
Java开源生鲜电商平台-推荐系统模块的设计与架构(源码可下载) 业务需求: 对于一个B2B的生鲜电商平台,对于买家而言,他需要更加快速的购买到自己的产品,跟自己的餐饮店不相关的东西,他是不关心的,而 ...
- Java开源生鲜电商平台-支付模块的设计与架构(源码可下载)
Java开源生鲜电商平台-支付模块的设计与架构(源码可下载) 开源生鲜电商平台支付目前支持支付宝与微信.针对的是APP端(android or IOS) 1. 数据库表设计. 说明:无论是支付宝还 ...
- Java开源生鲜电商平台-异常模块的设计与架构(源码可下载)
Java开源生鲜电商平台-异常模块的设计与架构(源码可下载) 说明:任何一个软件系统都会出现各式各样的异常与错误,我们需要根据异常的情况进行捕获与分析,改善自己的代码,让其更加的稳定的,快速的运行,那 ...
- Java开源生鲜电商平台-搜索模块的设计与架构(源码可下载)
Java开源生鲜电商平台-搜索模块的设计与架构(源码可下载) 说明:搜索模块针对的是买家用户,在找菜品找的很费劲下的一种查询方面.目前也是快速的检索商品. 对于移动端的APP买家用户而言,要求的速度在 ...
- Java开源生鲜电商平台-售后模块的设计与架构(源码可下载)
Java开源生鲜电商平台-售后模块的设计与架构(源码可下载) 说明:任何一个的电商平台都有售后服务系统,那么对于我们这个生鲜的电商平台,售后系统需要思考以下几个维度. 1. 买家的需求维度 说明:买家 ...
- Java生鲜电商平台-供应链模块的设计与架构
Java生鲜电商平台-供应链模块的设计与架构 说明:Java开源生鲜电商平台中供应链模块属于卖家的行为,也就是卖家如何管理他们自己的供应商,包括结算方式,压款方式,结算周期等等,超出了我这个B2B平台 ...
- Java生鲜电商平台-提现模块的设计与架构
Java生鲜电商平台-提现模块的设计与架构 补充说明:生鲜电商平台-提现模块的设计与架构,提现功能指的卖家把在平台挣的钱提现到自己的支付宝或者银行卡的一个过程. 功能相对而言不算复杂,有以下几个功能需 ...
- Java开源生鲜电商平台-用户表的设计(源码可下载)
Java开源生鲜电商平台-用户表的设计(源码可下载) 说明:由于该系统属于B2B平台,不设计到B2C的架构. 角色分析:买家与卖家. 由于买家与卖家所填写的资料都不一样,需要建立两站表进行维护,比如: ...
随机推荐
- 安卓笔记--Style的继承
比如想要重写一个对话框的style <style name="Theme_dialog" parent="@android:style/Theme.Dialog&q ...
- 43个优秀的Swift开源项目推荐
"轮子" 工具类 项目 开发者 备注 SwiftyJSON tangplin, lingoer GitHub 上最为开发者认可的 JSON 解析类 Dollar.swift Ank ...
- JFinal开发环境搭建,JFinal开发案例
JFinal 是基于 Java 语言的极速 WEB + ORM 开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java 语言所 ...
- LeetCode之“动态规划”:Maximum Subarray
题目链接 题目要求: Find the contiguous subarray within an array (containing at least one number) which has t ...
- Dijkstra算法 c语言实现
Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最短路径的最优 ...
- How tomcat works 读书笔记十二 StandardContext 上
在tomcat4中,StandardContext.java是最大的一个类,有117k.废话不说,开始分析吧. 其实要分析StandardContext,也就主要分析两个方法,一个start,一个in ...
- 阳阳买苹果--C实现
原题:阳阳第一天买了两个苹果,一个苹果0.8元.从第二天开始,他每天购买前一天苹果数量的2倍,直到购买的苹果个数达到不超过100的最大值.编程求阳阳平均每天花多少钱? 编程思路: 假设阳阳每天购买苹果 ...
- 如何在os x或ubuntu下安装最新的ruby
os x下基本上可以安装到比较新的ruby,首先先安装rvm,然后用rvm list known看当前可供安装的ruby的版本,不过这也不是绝对的,比如在我的os x 10.9上,命令返回如下: # ...
- 关于linux防火墙
1.防火墙是什么:防火墙就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需要去定义到底防火墙如何工作 ...
- Java 深度克隆 clone()方法重写 equals()方法的重写
1.为什么要重写clone()方法? 答案:Java中的浅度复制是不会把要复制的那个对象的引用对象重新开辟一个新的引用空间,当我们需要深度复制的时候,这个时候我们就要重写clone()方法. 2.为什 ...