Java生鮮電商平臺-訂單抽成模塊的設計與架構

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);
        }
    }
}

 

相關後臺運營截圖以下;

 

 

 

 

相關文章
相關標籤/搜索