一谆沃,目的
提供一個(gè)擴(kuò)展比較好的,積分充值設(shè)計(jì)路,每個(gè)字段都經(jīng)過(guò)多種場(chǎng)景進(jìn)行考慮仪芒。由于文筆不好唁影,以下以代碼形式展示設(shè)計(jì)思路.
兼容多種業(yè)務(wù)場(chǎng)景
現(xiàn)金耕陷、銀行、支付寶据沈,微信支付等...
二哟沫,依賴模塊
積分:http://www.reibang.com/p/e0748147c6c6 [可以參考我之前寫的 ,不過(guò)寫得差锌介,大繼的基礎(chǔ)級(jí)業(yè)務(wù)實(shí)戰(zhàn)設(shè)計(jì)記錄(一)嗜诀,積分],
銀行孔祸,alipay,wechat
三隆敢,實(shí)戰(zhàn)代碼
1.現(xiàn)金請(qǐng)求
Cent beforeCent = centsRest.findTypeAndTypeId("WALLET","0");
if(beforeCent == null){
beforeCent.setNumber(0.0);
}
//正經(jīng)一點(diǎn)需要一個(gè) cash 模塊。簡(jiǎn)化可用崔慧,只需要隨機(jī)給個(gè)UUID
CentChargeRequest centChargeRequest = new CentChargeRequest();
centChargeRequest.setChargeNumber(100.0);
centChargeRequest.setFromType("cash");
centChargeRequest.setFromTypeId(UUID.randomUUID().toString());
centChargeRequest.setFromTypeIdName("test source");
centChargeRequest.setFromTradeNo(UUID.randomUUID().toString());
centChargeRequest.setSummary("充值測(cè)試");
centChargeRequest.setFromUserId(0L);
centChargeRequest.setCentType("WALLET");
centChargeRequest.setCentTypeId("0");
centChargeRequest.setFromResultCode("0");
centChargeRequest.setCentUserId(0L);
centsChargeRest.charge(centChargeRequest);
Cent afterCent = centsRest.findTypeAndTypeId("WALLET","0");
Assert.assertEquals(new Double(afterCent.getNumber() - 100.0),beforeCent.getNumber());
2.銀行請(qǐng)求(注:此實(shí)現(xiàn)需要在業(yè)務(wù)級(jí)模塊組合拂蝎,不要讓cent模塊直接依賴bank模塊)
Cent beforeCent = centsRest.findTypeAndTypeId("WALLET","0");
if(beforeCent == null){
beforeCent.setNumber(0.0);
}
/**
* 依賴bank 模塊
*/
Bank bank = new Bank();
bank.setId(UUID.randomUUID().toString());
bank.setCreateTime(new Date());
bank.setEnable(true);
bank.setEnName("ICBC");
bank.setImage("image");
bank.setName("中國(guó)工商銀行");
bank.setUpdateTime(new Date());
bank = banksRest.save(bank);
BankCard bankCard = new BankCard();
bankCard.setBankId(bank.getId());
bankCard.setBranchId(null);
bankCard.setBranchName("廣州石牌支行");
bankCard.setCreateTime(new Date());
bankCard.setEnable(true);
bankCard.setId(UUID.randomUUID().toString());
bankCard.setMobile("+08615818733***");
bankCard.setRealName("大繼");
bankCard.setType("儲(chǔ)蓄卡");
bankCard.setNo("6222023602030330***");
bankCard.setUpdateTime(new Date());
bankCard.setUserId(0L);
bankCard = banksCardRest.save(bankCard);
//正經(jīng)一點(diǎn)需要一個(gè) cash 模塊。簡(jiǎn)化可用惶室,只需要隨機(jī)給個(gè)UUID
CentChargeRequest centChargeRequest = new CentChargeRequest();
centChargeRequest.setChargeNumber(100.0);
centChargeRequest.setFromType("bankcard");
centChargeRequest.setFromTypeId(bankCard.getId());
centChargeRequest.setFromTypeIdName(bankCard.getRealName());
centChargeRequest.setFromTradeNo(UUID.randomUUID().toString());
//需要加入對(duì)bank name描述
centChargeRequest.setSummary("充值測(cè)試");
centChargeRequest.setFromUserId(0L);
centChargeRequest.setCentType("WALLET");
centChargeRequest.setCentTypeId("0");
centChargeRequest.setCentUserId(0L);
centChargeRequest.setFromResultCode("0");
centsChargeRest.charge(centChargeRequest);
Cent afterCent = centsRest.findTypeAndTypeId("WALLET","0");
Assert.assertEquals(new Double(afterCent.getNumber() - 100.0),beforeCent.getNumber());
3.其它可按上兩個(gè)例子進(jìn)行擴(kuò)展
4.充值實(shí)體温自,及積分變更記錄
- 改進(jìn)了,之前設(shè)計(jì)過(guò)的積分設(shè)計(jì)
/**
* 積分充值
*/
@Entity
@Table(name = "cent_charge_log",
indexes = {@Index(columnList = "fromType,fromTradeNo",unique = true)})
public class CentChargeLog {
@Id
@Column(length = 37)
private String id;
/**
* 充值的積分賬號(hào)
*/
@Column(length = 37)
private String centId;
/**
* 充值的積分類型
*/
@Column(length = 32)
private String centType;
/**
* 充值的積分類型ID
*/
@Column(length = 37)
private String centTypeId;
@Column
private Long centUserId;
/**
* 充值數(shù)量
*/
@Column
private Double number;
/**
* 充值來(lái)源皇钞,可以是微信悼泌,支付寶,銀行等第三方夹界,或本系統(tǒng)現(xiàn)金
*/
@Column(length = 64)
private String fromType;
/**
* 充值來(lái)源ID 馆里,微信支付有openId,現(xiàn)金使用管理員ID,銀行使用銀行卡號(hào)
*/
@Column
private String fromTypeId;
/**
* 充值來(lái)源ID名稱
*/
@Column
private String fromTypeIdName;
/**
* 充值來(lái)源交易號(hào)
* 需要事務(wù)保證唯一
*/
@Column(length = 64)
private String fromTradeNo;
/**
* 來(lái)源交易結(jié)果
*/
@Column
private String fromResultCode;
/**
* 所屬于用戶掉盅,需要對(duì)集合描述為空并用own進(jìn)行描述
*/
@Column
private Long fromUserId;
/**
* 狀態(tài)
*/
@Column(length = 16)
private String status;
/**
* 更新時(shí)間
*/
@Column
private Date updateTime;
/**
* 創(chuàng)建時(shí)間
*/
@Column
private Date createTime;
...
}
/**
* 單體積分變更記錄也拜。
* 所有積分賬變化都需要記錄到這個(gè)表以舒。
* 滿足可查性需求.
* 如A轉(zhuǎn)賬B趾痘,這里會(huì)產(chǎn)生兩個(gè)記錄。
*/
@Entity
@Table(name = "cent_changed_log",
indexes = {@Index(columnList = "centId"),@Index(columnList = "fromType,fromTypeId")})
public class CentChangedLog {
@Id
@Column(length = 37)
private String id;
/**
* 用設(shè)計(jì)簡(jiǎn)化蔓钟,積分賬號(hào)直接光聯(lián)查詢.
*/
@Column(length = 37)
private String centId;
/**
* 變更主體
* 用設(shè)計(jì)簡(jiǎn)化永票,直接使用積分類別查詢.
*/
@Column(length = 37)
private String centType;
/**
* 變更主體
* 用設(shè)計(jì)簡(jiǎn)化,直接使用積分類別查詢.
*/
@Column
private String centTypeId;
/**
* 變更描述
*/
@Column
private String summary;
/**
* 改變數(shù)量
* 變更點(diǎn)數(shù) 正數(shù)滥沫,或負(fù)數(shù)來(lái)表達(dá)加或減.
*/
@Column
private Double changedNumber;
/**
* 手續(xù)費(fèi)
*/
@Column
private Double changedFee;
/**
* 原交易數(shù)
* 在需要手續(xù)費(fèi)的情況下這個(gè)侣集,原交易數(shù)來(lái)記錄,支付全額
* 例如: 100 -> b 扣掉2元手費(fèi)兰绣, 在changeNumber里會(huì)寫 98, 這個(gè)original則保留原始的數(shù)據(jù)世分。便于查詢.
*/
@Column
private Double changedOriginalNumber;
/**
* 變更后最終余額
*/
@Column
private Double changedLeftNumber;
/**
* 變更類型,
* 如果是轉(zhuǎn)賬積分號(hào)缀辩,充值等記錄類型來(lái)源
*/
@Column(length = 32)
private String fromType;
/**
* 如果是充值就是充值 ID
*/
@Column(length = 37)
private String fromTypeId;
@Column
private String fromTypeIdName;
@Column
private Long fromUserId;
@Column
private Long userId;
/**
* 為以后特殊情況保留臭埋,正常都是 SUCCESS
*/
@Column
private String status;
@Column
private Date updateTime;
@Column
private Date createTime;
}