Java開源生鮮電商平臺-提現模組的設計與架構(原始碼可下載)
補充說明:Java開源生鮮電商平臺-提現模組的設計與架構(原始碼可下載),提現功能指的賣家把在平臺掙的錢提現到自己的支付寶或者銀行卡的一個過程。
功能相對而言不算複雜,有以下幾個功能需要處理。
業務邏輯如下;
1. 賣家登陸自己的B2B系統提交提現功能。
2. 如果沒有繫結銀行卡或者支付寶,則需要先繫結銀行卡或者支付寶賬戶,以及填寫提現密碼
3. 支付寶或者銀行卡需要跟使用者的姓名所填一致,防止錯誤轉賬。
4. 後端需要記錄所提現的記錄,實際情況是支付寶提現需要收取手續費,這個也需要記錄在內。
5. 需要形成一個稽核機制,使用者提現的狀態有申請提現,稽核成功,提現成功,提現失敗四種可能狀態。
6,每個提現的過程需要記錄時間軸,如果有拒絕,使用者需要檢視拒絕的原因。
7.所有的提現到賬後,需要平臺簡訊通知使用者申請了提現,提現成功,包括提現拒絕等等,都需要簡訊通知,給使用者一個信任感。
8,每天晚上5:30之前提現當日到達,之後的次日早上10點鐘到達。
9,系統自動稽核提現的金額資料量的正確與否,來源於使用者的訂單以及賬單資料。
相關的系統設計表如下:
1.提現資訊表,為了便於大家理解,我詳細的註釋都寫上了。
CREATE TABLE `withdrawal` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自動增加ID', `uid` bigint(20) NOT NULL COMMENT '提現申請人', `withdraw_order` varchar(64) NOT NULL COMMENT '提現訂單號,系統自動生成的.', `withdraw_bank_id` bigint(20) NOT NULL COMMENT '使用者對應的卡的編號', `withdraw_charge` decimal(12,2) NOT NULL COMMENT '提現手續費', `withdraw_reality_total` decimal(12,2) NOT NULL COMMENT '實際提現金額', `withdraw_apply_total` decimal(12,2) NOT NULL COMMENT '申請提現的金額', `withdraw_apply_time` datetime NOT NULL COMMENT '申請提現時間', `status` int(11) NOT NULL COMMENT '提現狀態,1表示申請提現,2表示審批透過,3,交易完成,-1審批不透過.', `create_by` bigint(20) DEFAULT NULL COMMENT '建立人', `create_time` datetime DEFAULT NULL COMMENT '建立時間', `update_by` bigint(20) DEFAULT NULL COMMENT '修改人', `last_update_time` datetime DEFAULT NULL COMMENT '最後修改時間', PRIMARY KEY (`id`), KEY `unique_order` (`withdraw_order`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='提現資訊表';
2. 賣家繫結卡的記錄表
CREATE TABLE `withdrawal_bank` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自動增加ID', `uid` bigint(20) NOT NULL COMMENT '使用者ID', `cnname` varchar(8) NOT NULL COMMENT '中文姓名', `bank_code` varchar(32) NOT NULL COMMENT '卡的縮寫,例如:ICBC', `bank_name` varchar(32) NOT NULL COMMENT '卡的名字', `bank_number` varchar(64) NOT NULL COMMENT '卡號', `sequence` tinyint(11) DEFAULT NULL COMMENT '排序用。按照小到大排序。', `create_time` datetime NOT NULL COMMENT '建立時間', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COMMENT='使用者繫結的銀行';
補充說明:如果是支付寶,那麼bank_code填寫alipay,bank_name為支付寶,bank_number為支付寶卡號,cnname為提現的姓名
3. 賣家提現日誌表。(會根據賣家的提現時間,形成時間軸)
CREATE TABLE `withdrawal_logs` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自動增加ID', `uid` bigint(20) NOT NULL COMMENT '提現申請人', `withdraw_order` varchar(64) NOT NULL COMMENT '提現訂單號,系統自動生成的.', `remark` varchar(64) NOT NULL COMMENT '備註', `status` int(11) DEFAULT NULL COMMENT '提現的狀態', `create_by` bigint(20) DEFAULT NULL COMMENT '建立人', `create_time` datetime DEFAULT NULL COMMENT '建立時間', PRIMARY KEY (`id`), KEY `unique_order` (`withdraw_order`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='使用者提現日誌表';
補充說明:形成時間軸來顯示。
4. 賣家提現密碼:
CREATE TABLE `withdrawal_password` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自動增加ID', `uid` bigint(20) NOT NULL COMMENT '使用者ID', `password` varchar(32) NOT NULL COMMENT '密碼,md5加密', `create_time` datetime NOT NULL COMMENT '記錄建立時間', `last_update_time` datetime DEFAULT NULL COMMENT '最後一次更新時間', PRIMARY KEY (`id`), UNIQUE KEY `unique_key_uid` (`uid`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COMMENT='使用者提現密碼';
補充說明:由於設計到資金安全問題,提現需要設定提現密碼,這個有別於使用者的登陸密碼。
整個業務比較簡單,只是步驟比較多而已。
相關的業務核心程式碼如下:
2.1 賣家繫結自己的銀行卡或者支付寶
/** * 新增使用者銀行資訊 * @param request * @param response * @return */ @RequestMapping(value = "/withdrawalBank/add", method = { RequestMethod.GET, RequestMethod.POST }) public JsonResult addWithdrawalBank(HttpServletRequest request, HttpServletResponse response,@RequestBody WithdrawalBank withdrawalBank) { try { if(withdrawalBank==null) { return new JsonResult(JsonResultCode.FAILURE, "傳入物件有誤", ""); } Long uid = withdrawalBank.getUid(); String bankCode = withdrawalBank.getBankCode(); if(uid == null) { return new JsonResult(JsonResultCode.FAILURE, "引數有誤", ""); } //拿到當前銀行卡的唯一編號 WithdrawalBank dbWithdrawalBank = withdrawalBankService.getWithdrawalBankByUidAndBankCode(uid, bankCode); if(dbWithdrawalBank != null){ return new JsonResult(JsonResultCode.FAILURE, "卡已存在,請重試",dbWithdrawalBank); } int result = withdrawalBankService.insertWithdrawalBank(withdrawalBank); if (result>0) { return new JsonResult(JsonResultCode.SUCCESS, "新增使用者銀行成功", result); } return new JsonResult(JsonResultCode.FAILURE, "新增使用者銀行失敗", ""); }catch(Exception e){ logger.error("[WithdrawalBankController][addWithdrawalBank] exception :",e); return new JsonResult(JsonResultCode.FAILURE, "系統錯誤,請稍後重試",""); } }
2.2 修改與管理自己的提現密碼:
/** * 提現金額計算 */ @RequestMapping(value = "/withdrawal/count", method = { RequestMethod.GET, RequestMethod.POST }) public JsonResult countWithdraw(HttpServletRequest request, HttpServletResponse response, BigDecimal withdrawApplyTotal, Long userId) { logger.info("WithdrawalController.countWithdraw.start"); try { Money m = new Money(withdrawApplyTotal); Mapresult = new HashMap (); BigDecimal withdrawCharge = null; BigDecimal withdrawRealityTotal = null; if (m.compareTo(new Money(1500))
3. 提現記錄表核心程式碼
/** * 賣家提現功能---提現銀行設定 */@RestController @RequestMapping("/seller")public class WithdrawalBankController extends BaseController { private static final Logger logger = LoggerFactory.getLogger(WithdrawalBankController.class); @Autowired private WithdrawalBankService withdrawalBankService; /** * 根據使用者Uid查詢使用者繫結的銀行卡資訊; * @param request * @param response * @param withdrawal 條件查詢 * @return */ @RequestMapping(value = "/withdrawalBank/list", method = { RequestMethod.GET, RequestMethod.POST }) public JsonResult withdrawalBankList(HttpServletRequest request, HttpServletResponse response,Long userId,Model model) { try { ListwithdrawalBankList = withdrawalBankService.getWithdrawalBankByUid(userId); if(CollectionUtils.isEmpty(withdrawalBankList)) { return new JsonResult(JsonResultCode.SUCCESS, "使用者未繫結銀行卡", withdrawalBankList); } return new JsonResult(JsonResultCode.SUCCESS, "查詢使用者銀行卡資訊", withdrawalBankList); }catch(Exception ex){ logger.error("[WithdrawalBankController][withdrawalBankList] exception :",ex); return new JsonResult(JsonResultCode.FAILURE, "系統錯誤,請稍後重試",""); } } /** * 新增使用者銀行資訊 * @param request * @param response * @return */ @RequestMapping(value = "/withdrawalBank/add", method = { RequestMethod.GET, RequestMethod.POST }) public JsonResult addWithdrawalBank(HttpServletRequest request, HttpServletResponse response,@RequestBody WithdrawalBank withdrawalBank) { try { if(withdrawalBank==null) { return new JsonResult(JsonResultCode.FAILURE, "傳入物件有誤", ""); } Long uid = withdrawalBank.getUid(); String bankCode = withdrawalBank.getBankCode(); if(uid == null) { return new JsonResult(JsonResultCode.FAILURE, "引數有誤", ""); } //拿到當前銀行卡的唯一編號 WithdrawalBank dbWithdrawalBank = withdrawalBankService.getWithdrawalBankByUidAndBankCode(uid, bankCode); if(dbWithdrawalBank != null){ return new JsonResult(JsonResultCode.FAILURE, "卡已存在,請重試",dbWithdrawalBank); } int result = withdrawalBankService.insertWithdrawalBank(withdrawalBank); if (result>0) { return new JsonResult(JsonResultCode.SUCCESS, "新增使用者銀行成功", result); } return new JsonResult(JsonResultCode.FAILURE, "新增使用者銀行失敗", ""); }catch(Exception e){ logger.error("[WithdrawalBankController][addWithdrawalBank] exception :",e); return new JsonResult(JsonResultCode.FAILURE, "系統錯誤,請稍後重試",""); } } }
4. 賣家提現日誌表:
/** * 賣家提現功能---提現日誌記錄 */@RestController @RequestMapping("/seller")public class WithdrawalLogsController extends BaseController { private static final Logger logger = LoggerFactory.getLogger(WithdrawalLogsController.class); @Autowired private WithdrawalLogsService withdrawalLogsService; /** * 根據Uid和withdrawOrder查詢單個提現詳情 * * @param userId * @param withdrawOrder * @return */ @RequestMapping(value = "/withdrawalLogs/getLogsByWithdrawOrder", method = { RequestMethod.GET,RequestMethod.POST }) public JsonResult getWithdrawalLogsByUidAndWithdrawOrder(HttpServletRequest request, HttpServletResponse response, Long userId, String withdrawOrder) { try { if (StringUtils.isBlank(withdrawOrder)) { return new JsonResult(JsonResultCode.FAILURE, "請求引數異常", ""); } ListwithdrawalLogs = withdrawalLogsService.getWithdrawalLogsByWithdrawOrder(withdrawOrder); return new JsonResult(JsonResultCode.SUCCESS, "訂單詳情", withdrawalLogs); } catch (Exception ex) { logger.error("[WithdrawalLogsController][getWithdrawalLogsByUidAndWithdrawOrder]", ex); return new JsonResult(JsonResultCode.FAILURE, "系統錯誤,請稍後重試", ""); } } }
相關的運營截圖如下:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1817/viewspace-2809123/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java生鮮電商平臺-統一異常處理及架構實戰Java架構
- SaaS架構:開放平臺架構設計架構
- 如何基於開源構架設計一個影片平臺?
- 開源雲端計算Iaas平臺CloudStack架構Cloud架構
- 愛奇藝平臺的架構設計與演進之路架構
- 企業生鮮電商O2O平臺開發解決方案
- 生鮮行業S2B2C電商平臺行業
- 大型購物平臺的系統設計與架構架構
- 如何設計電商系統原始碼的商鋪模組原始碼
- JNPF快速開發平臺3.0版的設計理念與功能架構解析架構
- 程式碼質量檢測平臺架構設計架構
- 點選即可下載原始碼原始碼
- 如何設計電商系統原始碼的商鋪模組(下)原始碼
- thrift原始碼分析-架構設計原始碼架構
- Android平臺架構的介紹和原始碼分析Android架構原始碼
- 大資料平臺架構設計探究大資料架構
- 低程式碼平臺前端的設計與實現(四)元件大綱樹的構建設計前端元件
- ERP中HR模組的操作與設計--開源軟體誕生26
- PDM的分散式虛擬設計平臺架構分散式架構
- 小米深度學習平臺架構與實現深度學習架構
- 基於電商中臺架構-商品系統設計(一)架構
- 企業分散式微服務雲架構快速開發平臺原始碼分散式微服務架構原始碼
- springboot 後臺管理模組架構設計方案Spring Boot架構
- 構建高併發高可用的電商平臺架構實踐架構
- 網易考拉規則引擎平臺架構設計與實踐架構
- vivo 全球商城:電商平臺通用取貨碼設計
- ERP製造模組操作與設計--開源軟體誕生30
- 大型 SaaS 平臺產品架構設計思路架構
- 架構設計文件提綱簡描架構
- 開放平臺架構指南架構
- 數商雲生鮮行業B2B電商平臺解決方案行業
- 基於電商中臺架構-商品系統設計(二):類目設計架構
- 《Java應用架構設計:模組化模式與OSGi》讀書筆記Java應用架構模式筆記
- 容器雲平臺微服務架構設計的誤區微服務架構
- 【提測平臺】測試平臺開發練手專案原始碼和教程彙總原始碼
- Dubbo架構設計與原始碼解析(三)責任鏈模式架構原始碼模式
- Java程式設計師必備:微服務+開源框架+架構基礎+高效能架構+設計模式Java程式設計師微服務框架架構設計模式
- 直播平臺原始碼,頂部標籤欄及內容列表的設計與實現原始碼