算法:
(商品成交金额 / 单据总金额) * 抹零
如果单个商品成交价格,小于单据总金额,那么单个商品成交价等于单据总金额,然后商品成交价/单据总金额*抹零,就是要减去的优惠钱
比如商品标价550 优惠 50 由于是一个商品 所以单据总金额为500
要退成交的550这个商品,用成交的商品单价550去和总金额判断,如果小于总金额,那么单据总金额就等于该单个商品的单价
然后用550/550*50=50
再用单据总金额减去50=500,就是要退的钱
例子:
//实际成交金额
double actualMoney = posTradeBillList.get(pos).getActualMoney();
//抹零金额
double omittedMoney = posTradeBillList.get(pos).getOmittedMoney();
//退货取单时的数据
for (ReturnProductListItemData data : dataList) {
if (data.isChecked()) {
pos = data.getPosition();
PosTradeBillItem item = data.getPosTradeBillItem();
item.setAmount(-item.getAmount());
//当前订单退货有抹零,把抹零按照价格权重进行计算;
if (omittedMoney > 0) {
//如果实际成交的金额小于商品的单价
if (actualMoney < item.getMoney()) {
//那么实际成交的金额等于单价
actualMoney = item.getMoney();
}
//当前单个商品的优惠金额,商品单价/实际成交金额*优惠的金额
double moMoney = item.getMoney() / actualMoney * omittedMoney;
//把当前订单的实际成交金额,更新为减去退掉的物品
actualMoney = actualMoney - item.getMoney();
//设置本次商品要退的钱-号为负数(代表退款的意思)
item.setMoney(-(item.getMoney() - moMoney));
//把优惠金额,设置成去除该笔订单后的优惠金额
omittedMoney = omittedMoney - moMoney;
} else {
//没有设置优惠和抹零,有订单多少钱就退多少钱
item.setMoney(-item.getMoney());
}
//以下和算法无关
item.setOldAgio(item.getAgio());
new PosTradeBill().getBillNumber();
PosTradeBillItem parent = new PosTradeBillItem();
parent.setId(item.getId());
item.setParent(parent);
Logger.e("item id", "" + item.getId());
// double money = item.getMoney();
// if (store!=null && store.getErasureZero()==1){
// money = NumberUtils.formatDouble4Rule(money, store.getPrecision(), store.getRounding());
// }
// totalMoney += Math.abs(money);
posList.add(item);
}
}
封装方法:
/**
* 计算价格的权重
*
* @param price 单价
* @param totalPrice 总价
* @param offer 优惠
* @return
*/
private double operationWeights(double price, double totalPrice, double offer) {
return price / totalPrice * offer;
}