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

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

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

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

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

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

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

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

    Java开源生鲜电商平台-异常模块的设计与架构(源码可下载) 说明:任何一个软件系统都会出现各式各样的异常与错误,我们需要根据异常的情况进行捕获与分析,改善自己的代码,让其更加的稳定的,快速的运行,那 ...

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

    Java开源生鲜电商平台-搜索模块的设计与架构(源码可下载) 说明:搜索模块针对的是买家用户,在找菜品找的很费劲下的一种查询方面.目前也是快速的检索商品. 对于移动端的APP买家用户而言,要求的速度在 ...

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

    Java开源生鲜电商平台-售后模块的设计与架构(源码可下载) 说明:任何一个的电商平台都有售后服务系统,那么对于我们这个生鲜的电商平台,售后系统需要思考以下几个维度. 1. 买家的需求维度 说明:买家 ...

  7. Java生鲜电商平台-供应链模块的设计与架构

    Java生鲜电商平台-供应链模块的设计与架构 说明:Java开源生鲜电商平台中供应链模块属于卖家的行为,也就是卖家如何管理他们自己的供应商,包括结算方式,压款方式,结算周期等等,超出了我这个B2B平台 ...

  8. Java生鲜电商平台-提现模块的设计与架构

    Java生鲜电商平台-提现模块的设计与架构 补充说明:生鲜电商平台-提现模块的设计与架构,提现功能指的卖家把在平台挣的钱提现到自己的支付宝或者银行卡的一个过程. 功能相对而言不算复杂,有以下几个功能需 ...

  9. Java开源生鲜电商平台-用户表的设计(源码可下载)

    Java开源生鲜电商平台-用户表的设计(源码可下载) 说明:由于该系统属于B2B平台,不设计到B2C的架构. 角色分析:买家与卖家. 由于买家与卖家所填写的资料都不一样,需要建立两站表进行维护,比如: ...

随机推荐

  1. Using Integrated SOA Gateway in Oracle EBS

    FROM:http://blog.csdn.net/pan_tian/article/details/10159935 Oracle EBS如何与第三方系统相集成?比如这样的需求,X系统知道物料编码, ...

  2. Stackoverflow上人气最旺的10个Java问题

    1. 为什么两个(1927年)时间相减得到一个奇怪的结果? (3623个赞) 如果执行下面的程序,程序解析两个间隔1秒的日期字符串并比较: 01 public static void main(Str ...

  3. 【Android 应用开发】BluetoothSocket详解

    一. BluetoothSocket简介 1. 简介 客户端与服务端 : BluetoothSocket 和 BluetoothServerSocket 类似于Java中的套接字的 Socket 和 ...

  4. P3370 【模板】字符串哈希

    题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 输入输出格式 输入格式: 第一行包含一个整数N,为字符串 ...

  5. eclipse3.7+resin4.0集成配置小结

    1.插件不要用improve公司的了,那个太老了.直接用resin官方的,用eclipse的help->install new software功能,地址用:http://www.caucho. ...

  6. 移动App开发基本技术面

    1.UI布局 1.1.熟悉系统布局基本机制和使用方法 2.界面效果 2.1.熟悉系统提供的所有界面组件 2.2.熟悉各种功能界面效果的实现途径 2,3.动画等特殊UI效果的实现机制 3.网络请求 3. ...

  7. The note of Developing Innovative Ideas for New Companies Course

    This course is free on the Coursera Site,But it only has English version Threee pieces of the course ...

  8. neo4j-rest-client使用摘要

    1.使用它的原因,与django搭配的最好的neomodel目前只支持到v2.2,我已给官方发了issue,官方也回复了,马上修改并发布(老外对开源项目的负责态度让人感动) 2.这个库的文档中大概描述 ...

  9. SOFA 源码分析 — 连接管理器

    前言 RPC 框架需要维护客户端和服务端的连接,通常是一个客户端对应多个服务端,而客户端看到的是接口,并不是服务端的地址,服务端地址对于客户端来讲是透明的. 那么,如何实现这样一个 RPC 框架的网络 ...

  10. swagger在nginx下出现无法请求接口的问题

    在Nginx配置绑定域名的时候,增加proxy_set_header即可 示例如下: server { listen ; server_name xxx.dev.internal.XXX.com; l ...