算是個面試題吧,問題描述是這樣:多個業務訂單,對應乙個支付單進行支付,支付時使用了組合支付。那麼沒個訂單分配到的支付方式及金額如何計算。
一共三個支付方式組合a,b,c金額分辨佔100,100,80.
一共兩個訂單1訂單金額80,2訂單金額200.
分配後,產生4份訂單和支付方式不同的資料。
畫個圖明了一點:
問題抽象:
我們發現圖一和圖二重疊一下不就是圖三的分配結果嘛。
可是**似乎沒這麼簡單就可以操作。
又將問題擬物化,便於理解,將支付方式組合可以想象成不通種類的杯子,而訂單組合是不同種類的酒,現在要把酒放到輩子裡去。每倒一次算乙個訂單和支付方式組合的資料。
第一次:1號酒開始到,在a杯子裡都倒不滿,直接全部倒光。資料為1+a+80
第二次:2號酒倒入a剩下的20雨量滿了。資料為2+a+20
第三次:2號酒倒入b杯子,倒滿100,2號酒還剩80。資料為2+b+100
第四次:2號酒倒入c杯子,倒滿也到光了。資料為2+c+80
我們發現這四次操作就是遍歷訂單組合的資料,依次去占有剩餘支付金額的資料。而2,3,4次是乙個迭代的**過程。
所以一種實現如下:
publicclass
itemdistribution
integer start = 0;
integer end = 0;
for(item item : list)
}/*** 分配
* @param
orderidamountmap
* @return
*/public listgetorderinfoitemlist(maporderidamountmap)
list
cuptransferlist =cuplist;
list
returnitems = new arraylist<>();
for (map.entryorderidamountentry : orderidamountmap.entryset())
return
returnitems;
}/*** 單個cup分配
* @param
orderid
* @param
orderamount
* @param
cuplist
* @param
returnitems
*/private
void builditem(integer orderid, integer orderamount, listcuplist, listreturnitems)
entry cup =getlatestcup(cuplist);
if(cup == null
) integer remain = cup.end -cup.index;
item item = null
;
if(remain >orderamount)
else
builditem(orderid, orderamount, cuplist, returnitems);
}/*** 獲得可用的cup
* @param
cuptransferlist
* @return
*/private entry getlatestcup(listcuptransferlist)
}return
null
; }
public
class
entry
}public
static
void
main(string args)
}
多支付方式選擇
由於業務需要,原單一支付方式現存在多種支付方式的可能性,故在原有基礎上進行擴充,可自由增減付款方式 最少一種,最多三種 如下圖 html 部分 style width 100px 售價 th type text value 3000.00 id txtamount td tr style width...
Magento新增支付方式
增加類似check money order 這樣的線下支付方式check1 money order 並且在前台讓客戶選擇,在後台管理訂單中也能正確顯示客戶選擇的支付方式。1 找到 複製這個標籤及其包含的內容,緊接著這個標籤貼上乙份,把checkmo改名為checkmo1,check money or...
支付方式 策略模式
很多企業的工資支付方式是很靈活的,可支付方式是比較多的,比如 人民幣現金支付 美元現金支付 銀行轉賬到工資帳戶 銀行轉賬到工資卡 一些創業型的企業為了留住骨幹員工,還可能有 工資轉股權等等方式 隨著公司的發展,會不斷有新的工資支付方式出現,這就要求能方便的擴充套件 另外工資支付方式不是固定的,是由公...