Java開源生鮮電商平臺-財務系統模塊的設計與架構(源碼可下載)

来源:https://www.cnblogs.com/jurendage/archive/2018/05/17/9049318.html
-Advertisement-
Play Games

Java開源生鮮電商平臺-財務系統模塊的設計與架構(源碼可下載) 前言:任何一個平臺也好,系統也好,掙錢養活團隊這個是無可厚非的,那麼對於一個生鮮B2B平臺盈利模式( 查看:http://www.cnblogs.com/jurendage/p/9016411.html)而言, 其中財務模塊無論是對於 ...


Java開源生鮮電商平臺-財務系統模塊的設計與架構(源碼可下載)

 

前言:任何一個平臺也好,系統也好,掙錢養活團隊這個是無可厚非的,那麼對於一個生鮮B2B平臺盈利模式( 查看:http://www.cnblogs.com/jurendage/p/9016411.html)而言,

其中財務模塊無論是對於買家而言還是賣家而言都至關重要,老百姓對錢的看重是沒有經歷的人想不到的,一句話說清楚了:一分錢也不能少。

 

買家或者賣家對財務模塊的要求很簡單:

                              1. 賬清楚明白。

                              2. 消費清清楚楚。

                              3. 計算準確無誤。

 

對平臺而言:財務的要求是每筆資金的輸入與輸出,有理有據,真真實實。

 

我們分兩個模塊來討論,買家與賣家我們稱為客戶財務模塊,平臺我們稱為公司財務模塊

 

1. 客戶財務模塊

      1.1 買家需要查看任何一天的消費記錄。數據按照時間的倒敘排列,根據時間進入某天的消費記錄,需要查看當天的歷史訂單數據。

            業務中按照時間來分組,數據是來源於訂單表:

            相關業務核心代碼如下:

             

    /**
     * 訂單列表
     * 
     * @description 1.用戶的所有訂單列表。 2.支付狀態 3.交易狀態.
     * @param request
     * @param response
     * @param orderStatus
     *            0 待支付 1待送達 2已完成
     * @return
     */
    @RequestMapping(value = "/order/list", method = { RequestMethod.GET, RequestMethod.POST })
    public JsonResult buyerOrderList(HttpServletRequest request, HttpServletResponse response, Long buyerId,
            int orderStatus) {

        List<OrderListVo> listVo = new ArrayList<OrderListVo>();

        // 需要順序
        Map<String, List<OrderInfoVo>> resultMap = new TreeMap<String, List<OrderInfoVo>>(new Comparator<String>() {
            public int compare(String obj1, String obj2) {
                // 降序排序
                return obj2.compareTo(obj1);
            }
        });

        try {
            List<OrderInfo> orderList = orderInfoService.getAllOrderInfo(buyerId, orderStatus);

            // 判斷是否有訂單
            if (CollectionUtils.isEmpty(orderList)) {
                return new JsonResult(JsonResultCode.SUCCESS, "訂單查詢成功", listVo);
            }

            // 組裝Map對象
            for (OrderInfo order : orderList) {
                List<OrderInfoVo> resultList = new ArrayList<OrderInfoVo>();

                OrderInfoVo orderInfoVo = transform(order);

                String time = DateUtil.dateToString(order.getCreateTime(), "yyyy-MM-dd");

                if (resultMap.get(time) == null) {
                    resultList.add(orderInfoVo);
                    resultMap.put(time, resultList);
                } else {
                    List<OrderInfoVo> mapList = resultMap.get(time);
                    mapList.add(orderInfoVo);
                    resultMap.put(time, mapList);
                }
            }

            // 組裝VO
            Set<String> keys = resultMap.keySet();
            for (String data : keys) {
                OrderListVo vo = new OrderListVo();
                vo.setDate(data);
                vo.setList(resultMap.get(data));
                listVo.add(vo);
            }
            return new JsonResult(JsonResultCode.SUCCESS, "訂單查詢成功", listVo);
        } catch (Exception ex) {
            logger.error("[OrderController][buyerOrderList] exception :", ex);
            return new JsonResult(JsonResultCode.FAILURE, "系統錯誤,請稍後重試", "");
        }
    }

說明:買家而言其實就是待支付,已經支付等訂單的明細查詢,根據時間進行分組,根據時間(按照天來計算,查看自己的明細。),然後查詢出整個訂單明細即可。

 

相關運營截圖如下:

               

 

 

    1.2  對於賣家而言,他肯定想知道每天具體賣了多少東西,多少錢,但是不是針對某一個買家而言,是針對整個統計而言。

          比如:他想知道我今天賣了土豆多少共多少斤,白菜多少斤,蘿蔔多少斤,花菜多少斤等等,同時他自己會算出今天的利潤多少。

        補充說明:其實系統是可以算出來今天他掙錢多少的,但是客戶很討厭輸入進貨價,相當於把自己的“秘密”出賣了一樣,整個系統架構中

先前是有的,但是實際運營發現,不是我們的那個樣子,最終是去掉了。

 

          相關的業務核心代碼如下:(數據也是來源於訂單明細表中)

           

訂單主表的列表:

 

/**
     * 查詢買家需要確認的訂單列表
     */
    @RequestMapping(value = "/order/list", method = { RequestMethod.GET, RequestMethod.POST })
    public JsonResult orderList(HttpServletRequest request, HttpServletResponse response,Integer type,Long saleId) {
        try {
            List<OrderVo> orderList = orderService.getOrderList(type, saleId);
            return new JsonResult(JsonResultCode.SUCCESS, "查詢信息成功", orderList);
        } catch (Exception ex) {
            logger.error("[OrderController][orderList] exception :", ex);
            return new JsonResult(JsonResultCode.FAILURE, "系統錯誤,請稍後重試", "");
        }
    }
    

 

根據訂單號獲取訂單明細:

     

/**
     * 查詢買家需要確認的訂單列表
     */
    @RequestMapping(value = "/order/detail", method = { RequestMethod.GET, RequestMethod.POST })
    public JsonResult getOrderDetail(HttpServletRequest request, HttpServletResponse response,Long orderId) {
        try {
            OrderDetailVo odv = orderService.getOrderDetail(orderId);
            return new JsonResult(JsonResultCode.SUCCESS, "查詢信息成功", odv);
        } catch (Exception ex) {
            logger.error("[OrderController][getOrderDetail] exception :", ex);
            return new JsonResult(JsonResultCode.FAILURE, "系統錯誤,請稍後重試", "");
        }
    }

 

訂單明細VO:對象:

    

/**
 * 訂單詳情VO
 */
public class OrderDetailVo implements java.io.Serializable {

    private static final long serialVersionUID = 1L;
    /**
     * 訂單主表id,order_info表的order_id
     */
    private Long orderId;
    /**
     * 唯一訂單號
     */
    private String orderNumber;
    /**
     * 買家ID
     */
    private Long buyerId;
    /**
     * 買家店鋪名稱
     */
    private String buyerName;
    /**
     * 買家店鋪圖片
     */
    private String buyerLogo;
    /**
     * 買家地址
     */
    private String buyerAddress;
    /**
     * 買家姓名
     */
    private String bossName;
    /**
     * 買家手機
     */
    private String bossTel;
    /**
     * 收貨人的最佳送貨時間
     */
    private String bestTime;
    /**
     * 訂單創建時間
     */
    private String createTime;
    /**
     * 商品列表
     */
    private List<OrderGoodsVo> goodsList;
    
    public Long getOrderId() {
        return orderId;
    }
    public void setOrderId(Long orderId) {
        this.orderId = orderId;
    }
    public String getOrderNumber() {
        return orderNumber;
    }
    public void setOrderNumber(String orderNumber) {
        this.orderNumber = orderNumber;
    }
    public Long getBuyerId() {
        return buyerId;
    }
    public void setBuyerId(Long buyerId) {
        this.buyerId = buyerId;
    }
    public String getBuyerName() {
        return buyerName;
    }
    public void setBuyerName(String buyerName) {
        this.buyerName = buyerName;
    }
    public String getBuyerLogo() {
        return buyerLogo;
    }
    public void setBuyerLogo(String buyerLogo) {
        this.buyerLogo = buyerLogo;
    }
    public String getBuyerAddress() {
        return buyerAddress;
    }
    public void setBuyerAddress(String buyerAddress) {
        this.buyerAddress = buyerAddress;
    }
    public String getBossName() {
        return bossName;
    }
    public void setBossName(String bossName) {
        this.bossName = bossName;
    }
    public String getBossTel() {
        return bossTel;
    }
    public void setBossTel(String bossTel) {
        this.bossTel = bossTel;
    }
    public String getBestTime() {
        return bestTime;
    }
    public void setBestTime(String bestTime) {
        this.bestTime = bestTime;
    }
    public String getCreateTime() {
        return createTime;
    }
    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }
    public List<OrderGoodsVo> getGoodsList() {
        return goodsList;
    }
    public void setGoodsList(List<OrderGoodsVo> goodsList) {
        this.goodsList = goodsList;
    }
}

 

相關SQL核心:

           

  <!-- 訂單詳情 -->
  <select id="getOrderDetail" resultMap="orderDetailMap">
      select 
        o.order_id,o.order_number,o.buyer_id,b.buyer_name,b.buyer_logo,b.buyer_address,b.boss_name,b.boss_tel,
        date_format(o.best_time,'%Y-%m-%d %H:%i') as best_time,date_format(o.create_time,'%Y-%m-%d %H:%i') as create_time,
        oi.item_id,oi.remark,g.goods_id,g.goods_name,g.goods_brand,g.goods_label,
        gf.format_id,gf.format_name,u.unit_id,u.unit_name,gf.format_num,
        pm.method_id,pm.method_name,oi.goods_price,oi.goods_number,oi.goods_amount,
        gp.pic_id,gp.pic_url,gp.is_main,gp.pic_seq
     from order_item oi
        inner join order_info o on o.order_id=oi.order_id
        inner join buyer b on b.buyer_id=o.buyer_id
        inner join goods_format gf on gf.format_id=oi.format_id
        inner join goods g on gf.goods_id=g.goods_id
        inner join unit u on gf.unit_id=u.unit_id
        left join process_method pm on pm.method_id=oi.method_id 
        left join goods_picture gp on g.goods_id=gp.goods_id
     where oi.order_id=#{orderId} 
     order by gp.is_main desc
  </select>
  

 

疑問一:為什麼會貼出如此多的代碼嗎?尤其是SQL? 

理由只有一點:的確這塊比較複雜,很多都是基於SQL語句的查詢,需要SQL功底。

 

相關的業務運營截圖如下:

 

 

 

 

 

 

 

下麵的核心的歷史收益這塊,賣家可以扔掉自己的手抄本了。根據這個平臺就可以方便的明細的賬單記錄

 

 

 

補充說明:數據報表有金額,有數據,有統計,有分析,包括以後的折線圖,柱狀圖等等報表分析,讓用戶明確的知道今天掙錢多少,明天預警備貨多少,一切清楚明瞭。

 

Java開源生鮮電商平臺-財務系統模塊的設計與架構(源碼可下載),如果需要下載的話,可以在我的github下麵進行下載。 

 

總結:我的經驗是所有的人心與人性都是相同的,你需要功能的客戶其實也想看到,對於這種模式的採用,我們是經歷了很多都經驗後才總結出來的,

          看起來很簡單,其實背後的努力不簡單。一起努力做好生鮮電商。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我的個人博客: "http://www.xiaolongwu.cn" 在平時的開發中,編碼技巧很重要,會讓你少寫很多代碼,起到事倍功半的效果。 下麵總結幾種簡單的技巧,大家共同學習一下 1、 利用+、 、/1, 1將字元串轉換為整數型 這個方法試用於將字元串類型的數字轉換為整數型,如果帶字母就會返回 ...
  • es6學習筆記初步總結 1. let、const 和 block 作用域 在ES6以前,var關鍵字聲明變數。無論聲明在何處,都會被視為聲明在函數的最頂部(不在函數內即在全局作用域的最頂部)。這就是函數變數提升例如: let 關鍵詞聲明的變數不具備變數提升(hoisting)特性 let 和 con ...
  • 高階組件是什麼東西 簡單的理解是:一個包裝了另一個基礎組件的組件。(相對高階組件來說,我習慣把被包裝的組件稱為基礎組件) 註意:這裡說的是包裝,可以理解成包裹和組裝; 具體的是高階組件的兩種形式吧: a、屬性代理(Props Proxy) 可以說是對組件的包裹,在包裹的過程中對被包裹的組件做了點什麼 ...
  • 在網站開發中,有時候需要獲取瀏覽器滾動條的寬度,在武漢螞蹄軟體服務中心的技術人員指導之下,我實現了該需求 ...
  • 本書是Eric Evans對他自己寫的《領域驅動設計-軟體核心複雜性應對之道》的一本字典式的參考書,可用於快速查找《領域驅動設計》中的諸多概念及其簡明解釋。 其它本系列其它文章地址: [譯文]Domain Driven Design Reference(一)—— 前言 [譯文]Domain Driv ...
  • 一、什麼是外觀模式 有些人可能炒過股票,但其實大部分人都不太懂,這種沒有足夠瞭解證券知識的情況下做股票是很容易虧錢的,剛開始炒股肯定都會想,如果有個懂行的幫幫手就好,其實基金就是個好幫手,支付寶里就有許多的基金,它將投資者分散的資金集中起來,交由專業的經理人進行管理,投資於股票、債券、外匯等領域,而 ...
  • 模板方法是通過繼承實現的,在父類中定義出演算法的骨架,將不同點在子類中實現。而策略模式是通過介面實現的,策略中定義了完整的演算法。它們有點像啊…… 策略模式的定義 策略模式(Strategy Pattern),定義了一系列的演算法,將每一種演算法封裝起來並可以互相替換使用,策略模式讓演算法獨立於使用它的客戶應 ...
  • 一、分散式一致性 一個事務需要跨多個分散式節點,又要保持事務的ACID特性,需要引入協調者來統一調度所有分散式節點的執行邏輯,被調度的節點稱為參與者。 協調者負責調用參與者,並決定最終是否提交事務。基於這個思想,衍生出2PC和3PC兩種協議 二、2PC協議(Two phase commit) 二階段 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...