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之“字符串”:Valid Number(由此引发的对正则表达式的学习)
题目链接 题目要求: Validate if a given string is numeric. Some examples: "0" => true " 0.1 ...
- android 自定义Viewpager实现无限循环
; i < imageUrls.length; i ++){ ADInfo info = new ADInfo(); info.setUrl(imageUrls[i]); info.setCon ...
- Linux文件系统及常用命令
Linux文件系统介绍: 一 .Linux文件结构 文件结构是文件存放在磁盘等存贮设备上的组织方法.主要体现在对文件和目录的组织上.目录提供了管理文件的一个方便而有效的途径. Linux使用树状目录结 ...
- RHEL 6.9 udev 将lv绑定raw devices
环境 RHEL6|RHEL7,LVM2,RAW device 用途 使用LVM的lv逻辑卷绑定裸设备 1. 编辑 /etc/udev/rules.d/60-raw.rules 添加如下: ACTION ...
- java中List对象的操作方法
List<String> list = new ArrayList<String>(); //增加 list.add("苹果"); list.add(&qu ...
- 解决Visual Studio 2017隐藏“高级保存选项”命令
Visual Studio提供高级保存选项功能,它能指定特定代码文件的编码规范和行尾所使用的换行符.在Visual Studio 2017中,该命令没有默认显示在“文件”菜单中.用户需要手工设置,才能 ...
- html5中新增的非主体结构的元素
html5中出了新增了article.section.nav.aside.time主要结构元素外,还增加了一些表示逻辑结构或附加信息的非主体结构元素. 一.header元素 header元素是一种具有 ...
- 春天的事务之9.3编程式事务 - 跟我学spring3
9.3编程式事务 9.3.1编程式事务概述 所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理. Spring框架提供一致的事务抽象,因此对于JDBC还是JTA事务都是采用相同 ...
- Mybatis与Ibatis比较
随着开发团队转投Google Code旗下,ibatis3.x正式更名为Mybatis 虽然从正式版发布至今也有近一年时间,官方也非常友好的提供了中文版的使用手册,不过相信很多人还在项目中使用iba ...
- spring mvc和spring的区别
springmvc只是spring其中的一部分. spring 可以 支持 hibernate ,ibatis ,JMS,JDBC 支持事务管理, 注解功能,表达式语言,测试 springmvc 就是 ...