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的架构. 角色分析:买家与卖家. 由于买家与卖家所填写的资料都不一样,需要建立两站表进行维护,比如: ...
随机推荐
- LeetCode之“链表”:在O(1)时间删除链表节点
下边讨论暂不包括尾节点. 一般来说,我们要删除链表中的一个节点是需要知道其上一节点的.但我们真的需要吗? 其实我们可以将待删节点的下一节点的值和指向的下一节点赋予待删节点,然后删除待删节点的下一节点. ...
- Java 继承Thread类和实现Runnable接口的区别
ava中线程的创建有两种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. 通过实现Runnable接口,实例化Thread类 在实际应用中,我 ...
- Shell Script - 追踪与debug
[root@www ~]# sh [-nvx] scripts.sh 选项与参数: -n :不要运行 script,仅查询语法的问题: -v :再运行 sccript 前,先将 scripts 的内容 ...
- Machine Learning 学习笔记
点击标题可转到相关博客. 博客专栏:机器学习 PDF 文档下载地址:Machine Learning 学习笔记 机器学习 scikit-learn 图谱 人脸表情识别常用的几个数据库 机器学习 F1- ...
- PS 滤镜——旋转模糊
这里给出灰度图像的模糊算法,彩色图像只要分别对三个通道做模糊即可. %% spin blur % 旋转模糊 clc; clear all; close all; I=imread('4.jpg'); ...
- 程序设计之---单例模式VS静态方法
我们在设计程序经常会有这种需求 , 某个类里的方法能够全局访问. 在这种情况下有两种实现方案 : 1>单例模式(Singleton); 2>静态方法. 但是, 对于这两种实现方式 , 那种 ...
- SharePoint 2007 制作值班表
背景:公司有了新项目,其中有一块是值班表,简单地说,就是客户需要安排值班,希望把所有的值班安排好,输入到网站中,然后每天发布出来,方便大家看:一开始看到需求,觉得应该用程序去实现,后来想想,其实挺简单 ...
- 在linux下搭建STM32工程
转载自康神博客:http://blog.csdn.net/u013298300/article/details/50243935 在LINUX下开始一个STM32工程 在LINUX下开始一个STM32 ...
- 网站系统压力测试Jmeter+Badboy
最近项目需要压力测试,因此搜了几款试用,首选的是LoadRunner这款大名鼎鼎的测试软件: LoadRunner11 下载请猛戳这里 传送门LoadRunner破解文件 下载请猛戳这里 传送门Loa ...
- 面试之路(6)-BAT面试之操作系统内存详解
本文主要参考两篇博客,读后整理出来,以供大家阅读,链接如下: http://blog.jobbole.com/95499/?hmsr=toutiao.io&utm_medium=toutiao ...