Java開源生鮮電商平臺-提現模組的設計與架構(原始碼可下載)

at_1發表於2021-09-09

補充說明: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);
            Map result = 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
        {
            List withdrawalBankList = 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, "請求引數異常", "");
            }
            List withdrawalLogs = 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章