多訂單多支付方式分配金額問題

2021-08-08 07:12:09 字數 1957 閱讀 1328

算是個面試題吧,問題描述是這樣:多個業務訂單,對應乙個支付單進行支付,支付時使用了組合支付。那麼沒個訂單分配到的支付方式及金額如何計算。

一共三個支付方式組合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次是乙個迭代的**過程。

所以一種實現如下:

public

class

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...

支付方式 策略模式

很多企業的工資支付方式是很靈活的,可支付方式是比較多的,比如 人民幣現金支付 美元現金支付 銀行轉賬到工資帳戶 銀行轉賬到工資卡 一些創業型的企業為了留住骨幹員工,還可能有 工資轉股權等等方式 隨著公司的發展,會不斷有新的工資支付方式出現,這就要求能方便的擴充套件 另外工資支付方式不是固定的,是由公...