Java生鮮電商平臺-訂單抽成模塊的設計與架構spring
說明:訂單抽成指的是向賣家收取相應的信息服務費.(目前市場上有兩種抽成方式,一種是按照總額的抽成比率,另一種是按照訂單明細的抽成比率)
數據庫
因爲生鮮電商的垂直領域的特殊性質,總額抽成不切合實際,因此按照訂單的明細抽成。架構
1. 訂單抽成,是按照一個區的維度,以及菜品的二級分類類抽點的。ide
舉例說明:好比武漢光谷區,佛祖嶺區,雖然都是屬於東湖高新,可是光谷區的物價以及消費水平確定是高於佛祖嶺區的,所以它是按照一個區的維度來分的。架構設計
可是有些賣家掙的錢多,有的賣家掙的錢少,雖然同屬於一個菜市場,可是掙錢少的跟掙錢多的同樣抽成,他們也不樂意,所以又按照賣家的ID進行抽查。設計
最終根據業務的形態以及咱們的市場調查結果,採用以商戶爲基準,按照菜品的二級分類來抽成的一種盈利模式。3d
2. 數據庫系統架構設計以下:code
賣家抽點配置信息表:orm
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='訂單抽點配置信息表';
說明:按照賣家的所屬二級分類進行抽點,不一樣的抽點率也是不同的。blog
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); } } }
相關後臺運營截圖以下;