Java生鮮電商平台-電商起送價的深入思考與實戰


Java生鮮電商平台-電商起送價的深入思考與實戰

 

說明:在生鮮電商中,起送價是一個非常普遍的話題,今天我們就用實戰來告訴大家,如何設置起送價,如何編寫起送價的代碼,以及如何同步起送價。

 

在開始題目之前,我們思考一下幾個問題:

 

 

 

1. 業務概念

 

1.1 什么是起送價。

  起送價就是你這一單要滿多少錢才給你送。例如15塊錢起送,那你買14塊的東西就送不了.

 

1.2. 為什么要有起送價。

    一是為了降低成本
          假設你本來想買兩件東西,如果無論價格多少都包郵的話可能會下兩次單,動用兩次人力和財力。但有包郵價格后人一般都選擇一起下單。這樣節約了資源。


     二是為了獲取更大利益
        比如你買了一件10元的東西給你包郵,可能盈利只有4元,但郵費成本(注意:是成本,非對外盈利價格)可能就是4元甚至更多。那盈利肯定就不多。而且大家往往為了湊免運費而買更多的產品。

       商人嘛,講究利益和成本。遇到不明白的往這兩方面思考就好。

  因為賣家也需要盈利。如果你買的太少,還不夠路費,那賣家不是虧死了。

 

1.3. 起送價到底設置多少比較合理。

        對於生鮮電商來講,這個是很有講究的,不能隨便設置,一般的情況下,我們實際是采用平均客單價,然后處於2來算一個合理的值,最終我們確定,我們的起送價是58元。

1.4. 如何設置起送價呢?

       起送價不能寫死,因為公司需要靈活安排,隨時可以改,但是也不能隨意改,所以需要有一個APP到管理后台,同步的過程,那什么時候同步呢?如何同步呢?

        1.4.1  數據是寫在參數表中的

        1.4.2  每次APP啟動的時候,調用這個接口,把最新的起送價數據拿到本地緩存起來。

CREATE TABLE `sys_params` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `param_code` varchar(32) DEFAULT NULL COMMENT '參數編碼',
  `param_value` varchar(2000) DEFAULT NULL COMMENT '參數值',
  `param_type` tinyint(3) unsigned DEFAULT '1' COMMENT '類型   0:系統參數   1:非系統參數',
  `remark` varchar(200) DEFAULT NULL COMMENT '備注',
  `creator` bigint(20) DEFAULT NULL COMMENT '創建者',
  `create_date` datetime DEFAULT NULL COMMENT '創建時間',
  `updater` bigint(20) DEFAULT NULL COMMENT '更新者',
  `update_date` datetime DEFAULT NULL COMMENT '更新時間',
  `del_flag` tinyint(2) DEFAULT '0' COMMENT '是否可用 0:可用  1:不可用',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_param_code` (`param_code`),
  KEY `idx_create_date` (`create_date`)
) ENGINE=InnoDB AUTO_INCREMENT DEFAULT CHARSET=utf8mb4 COMMENT='參數管理';

  

2. 業務操作

     2.1 使用方式

           我們設置了起送價,那么在那個步驟進行使用呢?答案很簡單,就是在購物車頁面,提交訂單的功能中,APP或者小程序頁面中,判斷下當前的訂單總額是否大於或者等於起送價,如果是的,就允許提交訂單,否則就顯示還差多少金額,去湊單的功能更。

 

     2.2 多次購買如何處理呢?

           在實際業務中,我們經常的發現用戶買完了東西后,比如起送價100元,但是用戶這一單買了300元,起送價也足夠了,而且配送也包郵了,但是用戶盤點的時候,比如發現

大白菜少了10斤,這個時候,用戶再次下單,購買10斤大白菜,很明晰,大白菜不夠起送價,那么怎么辦?

          是強制以訂單為單位,如果不滿足訂單的話,就不讓下單,這樣簡單粗暴的方式肯定是會惹得客戶不高興,或許以后丟失這個客戶。那么怎么辦呢?

          1. 判斷用戶今天是否下過單,如果下過單,那么第二次下單就不用起送價,否則的話,還是需要起送價。

         我們回顧下:

             1. 先前我們是在購物車的時候用訂單金額跟起送價對比,那么這個下過單的同一天再次下單,應該是在哪里進行判斷呢?

             答案是:在進入購物車的時候,需要提供一個接口,用來判斷用戶是否曾經下過單,如果下單了,這次就只判斷金額大於0即可。

     我貼出來實際的業務代碼:

 

    

public class ShoppingCartManager {
    private ShoppingCartDao shoppingCartDao;

    public ShoppingCartManager() {
        shoppingCartDao = BaseApplication.getInstance().getDaoSession().getShoppingCartDao();
    }

    public List<ShoppingCart> getBySeller(long sellerId, long userId) {
        return shoppingCartDao.queryBuilder().where(ShoppingCartDao.Properties.SellerId.eq(sellerId))
                .where(ShoppingCartDao.Properties.BuyerId.eq(userId)).build().list();
    }

    public List<ShoppingCart> getByUser(long userId) {
        return shoppingCartDao.queryBuilder()
                .where(ShoppingCartDao.Properties.BuyerId.eq(userId)).build().list();
    }

    public List<ShoppingCart> getByFormat(long sellerId, long userId, long formatId) {
        return shoppingCartDao.queryBuilder().where(ShoppingCartDao.Properties.SellerId.eq(sellerId))
                .where(ShoppingCartDao.Properties.BuyerId.eq(userId))
                .where(ShoppingCartDao.Properties.FormatId.eq(formatId)).build().list();
    }


    public void shopping(ShoppingCart goodsCart) {
        ShoppingCart queryGoods = shoppingCartDao.queryBuilder()
                .where(ShoppingCartDao.Properties.BuyerId.eq(goodsCart.getBuyerId()))
                .where(ShoppingCartDao.Properties.FormatId.eq(goodsCart.getFormatId()))
                .where(ShoppingCartDao.Properties.MethodId.eq(goodsCart.getMethodId()))
                .where(ShoppingCartDao.Properties.SellerId.eq(goodsCart.getSellerId()))
                .build().unique();
        int count = goodsCart.getGoodsNumber();
        if (queryGoods == null) {
            if (count > 0) {
                goodsCart.setIsSelected(1);
                shoppingCartDao.insert(goodsCart);
            }
        } else {
            if (count == 0) {
                shoppingCartDao.delete(queryGoods);
            } else {
                queryGoods.setGoodsNumber(goodsCart.getGoodsNumber());
                shoppingCartDao.update(queryGoods);
            }
        }
    }

    public void update(ShoppingCart goodsCart) {
        ShoppingCart queryGoods = shoppingCartDao.queryBuilder()
                .where(ShoppingCartDao.Properties.BuyerId.eq(goodsCart.getBuyerId()))
                .where(ShoppingCartDao.Properties.FormatId.eq(goodsCart.getFormatId()))
                .where(ShoppingCartDao.Properties.MethodId.eq(goodsCart.getMethodId()))
                .where(ShoppingCartDao.Properties.SellerId.eq(goodsCart.getSellerId()))
                .build().unique();
        if (queryGoods != null) {

            queryGoods.setPrice(goodsCart.getPrice());
            queryGoods.setIsSelected(goodsCart.getIsSelected());

            shoppingCartDao.update(queryGoods);
        }
    }

    public void deleteBySeller(long userId, long sellerId) {
        List<ShoppingCart> queryGoods = shoppingCartDao.queryBuilder()
                .where(ShoppingCartDao.Properties.BuyerId.eq(userId))
                .where(ShoppingCartDao.Properties.SellerId.eq(sellerId))
                .build().list();
        for (ShoppingCart c : queryGoods) {
            shoppingCartDao.delete(c);
        }
    }

    public void deleteByUser(long userId) {
        List<ShoppingCart> queryGoods = shoppingCartDao.queryBuilder()
                .where(ShoppingCartDao.Properties.BuyerId.eq(userId))
                .build().list();
        for (ShoppingCart c : queryGoods) {
            shoppingCartDao.delete(c);
        }
    }

    public void deleteItem(ShoppingCart goodsCart) {
        ShoppingCart queryGoods = shoppingCartDao.queryBuilder()
                .where(ShoppingCartDao.Properties.BuyerId.eq(goodsCart.getBuyerId()))
                .where(ShoppingCartDao.Properties.FormatId.eq(goodsCart.getFormatId()))
                .where(ShoppingCartDao.Properties.MethodId.eq(goodsCart.getMethodId()))
                .where(ShoppingCartDao.Properties.SellerId.eq(goodsCart.getSellerId()))
                .build().unique();
        if (queryGoods != null) {
            shoppingCartDao.delete(queryGoods);
        }
    }

    public void insert(ShoppingCart shoppingCart) {
        shoppingCartDao.insert(shoppingCart);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM