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下麵進行下載。
總結:我的經驗是所有的人心與人性都是相同的,你需要功能的客戶其實也想看到,對於這種模式的採用,我們是經歷了很多都經驗後才總結出來的,
看起來很簡單,其實背後的努力不簡單。一起努力做好生鮮電商。