|
@@ -283,6 +283,225 @@ public class PayOrderController {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
+ /***
|
|
|
+ * 计算订单金额
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Map<String ,Object> calculateAmt(PayOrderRequest payOrderRequest){
|
|
|
+ Map<String ,Object> resultMap = new HashMap<>();
|
|
|
+ if(payOrderRequest.getReceivableAmt() !=null){ //应收金额
|
|
|
+ Double receivableAmt = payOrderRequest.getReceivableAmt(); //应收金额 用户输入的金额
|
|
|
+ Integer stationId = payOrderRequest.getStationId(); //油站ID
|
|
|
+ //String oilGun = payOrderRequest.getOilGun(); //油枪号
|
|
|
+ String oilName = payOrderRequest.getOilName(); //油品名称
|
|
|
+ String openId = payOrderRequest.getOpenId(); //用户的openId
|
|
|
+ String mobilePhone = payOrderRequest.getCustomerPhone(); //客户手机号
|
|
|
+ //获取油品价格
|
|
|
+ StationOilPrice stationOilPrice = new StationOilPrice();
|
|
|
+ stationOilPrice.setStationId(stationId);
|
|
|
+ stationOilPrice.setOilName(oilName);
|
|
|
+ StationOilPrice oilPriceInfo = stationService.getStationOilPrice(stationOilPrice);
|
|
|
+ String oilPrice = oilPriceInfo.getOilPrice();
|
|
|
+ //String stationNanme = oilPriceInfo.getStationNanme();
|
|
|
+ BigDecimal oilLiters = null;
|
|
|
+ BigDecimal discountAmt =null;
|
|
|
+ BigDecimal discountPrice = null;
|
|
|
+ BigDecimal amt = null;
|
|
|
+
|
|
|
+ //resultMap.put("stationName", stationNanme);
|
|
|
+ resultMap.put("oilPrice", oilPrice); //油品价格
|
|
|
+ resultMap.put("receivableAmt", receivableAmt); //应收价格
|
|
|
+ //该油站的优惠方式
|
|
|
+ String stationDiscountWay = stationService.getStationDiscountWay(stationId.toString());
|
|
|
+ Map<String ,Object> params = new HashMap<String, Object>();
|
|
|
+ params.put("stationId", stationId);
|
|
|
+ params.put("oilName", oilName);
|
|
|
+ BigDecimal receivableAmt_b = new BigDecimal(receivableAmt); //传入的应收金额
|
|
|
+ switch (stationDiscountWay){
|
|
|
+ case "1": //1.等级直降
|
|
|
+ //查询等级直降的优惠方式
|
|
|
+ params.put("mobilePhone", mobilePhone);
|
|
|
+ params.put("minaOpenid", openId);
|
|
|
+ //查询客户等级信息
|
|
|
+ List<Map<String, Object>> customerGradeInfo = customerGradeServices.getCustomerGradeInfo(params);
|
|
|
+ if(customerGradeInfo != null && customerGradeInfo.size() >0){ //已存在客户等级信息
|
|
|
+ //使用客户已存在的等级计算优惠
|
|
|
+ oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_UP);
|
|
|
+ discountAmt = oilLiters.multiply(new BigDecimal(customerGradeInfo.get(0).get("gasoilDiscountLitre").toString()));
|
|
|
+ discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_UP);
|
|
|
+ amt = receivableAmt_b.subtract(discountAmt);
|
|
|
+ discountPrice = amt.divide(oilLiters, 2, BigDecimal.ROUND_UP);
|
|
|
+ resultMap.put("discountAmt", discountAmt.doubleValue());
|
|
|
+ resultMap.put("amt", amt.doubleValue());
|
|
|
+ resultMap.put("oilLiters", oilLiters.doubleValue());
|
|
|
+ resultMap.put("discountPrice", discountPrice.doubleValue());
|
|
|
+ }else {
|
|
|
+ //不存在客户等级信息时,查询油站的客户等级直降优惠(查询结果根据会员成长值条件做升序查询)
|
|
|
+ List<Map> customerGradeList = customerGradeServices.getCustomerGradeList(params);
|
|
|
+ //如果存在
|
|
|
+ if(customerGradeList !=null && customerGradeList.size() >0){
|
|
|
+ //用户第一次购买 取等级最低初始会员的优惠条件计算
|
|
|
+ oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice), 2, BigDecimal.ROUND_UP); //加油升数
|
|
|
+ discountAmt = oilLiters.multiply(new BigDecimal(customerGradeList.get(0).get("gasoilDiscountLitre").toString()));
|
|
|
+ discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_UP);
|
|
|
+ amt = receivableAmt_b.subtract(discountAmt);
|
|
|
+ discountPrice = amt.divide(oilLiters, 2, BigDecimal.ROUND_UP);
|
|
|
+ resultMap.put("discountAmt", discountAmt.doubleValue());
|
|
|
+ resultMap.put("amt", amt.doubleValue());
|
|
|
+ resultMap.put("oilLiters", oilLiters.doubleValue());
|
|
|
+ resultMap.put("discountPrice", discountPrice.doubleValue());
|
|
|
+ }else {
|
|
|
+ //不存在
|
|
|
+ resultMap.put("discountAmt", 0);
|
|
|
+ resultMap.put("amt", receivableAmt.doubleValue());
|
|
|
+ oilLiters = new BigDecimal(receivableAmt).divide(new BigDecimal(oilPrice), 2, BigDecimal.ROUND_UP);
|
|
|
+ resultMap.put("oilLiters", oilLiters.doubleValue());
|
|
|
+ resultMap.put("discountPrice", oilPrice);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "2": //2.满减
|
|
|
+ params.put("discountPlanType", "1");
|
|
|
+ //营销方案
|
|
|
+ List<Map> customerMarkertPlanList_1 = customerGradeServices.getCustomerMarkertPlanList(params);
|
|
|
+ //有优惠规则
|
|
|
+ if(customerMarkertPlanList_1 !=null && customerMarkertPlanList_1.size() >0){
|
|
|
+ boolean flag = true;
|
|
|
+ for (Map m : customerMarkertPlanList_1){
|
|
|
+ //如果当前应收金额大于条件金额
|
|
|
+ BigDecimal discountAmt_b = new BigDecimal(m.get("discountAmt").toString()); //条件金额
|
|
|
+ if(receivableAmt_b.compareTo(discountAmt_b) ==1 || receivableAmt_b.compareTo(discountAmt_b) ==0){
|
|
|
+ BigDecimal gasoilDiscountAmt_b = new BigDecimal(m.get("gasoilDiscountAmt").toString()); //每满多少优惠多少的金额
|
|
|
+ discountAmt = receivableAmt_b.divide(discountAmt_b, 2, BigDecimal.ROUND_UP).multiply(gasoilDiscountAmt_b); //优惠金额
|
|
|
+ discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_UP);
|
|
|
+ amt = receivableAmt_b.subtract(discountAmt); //实收金额
|
|
|
+ oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_UP); //加油升数
|
|
|
+ discountPrice = amt.divide(oilLiters); //优惠价格
|
|
|
+ resultMap.put("discountAmt", discountAmt.doubleValue());
|
|
|
+ resultMap.put("amt", amt.doubleValue());
|
|
|
+ resultMap.put("oilLiters", oilLiters.doubleValue());
|
|
|
+ resultMap.put("discountPrice", discountPrice.doubleValue());
|
|
|
+ flag = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(flag){
|
|
|
+ resultMap.put("discountAmt", 0);
|
|
|
+ resultMap.put("amt", receivableAmt.doubleValue());
|
|
|
+ oilLiters = new BigDecimal(receivableAmt).divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_UP);
|
|
|
+ resultMap.put("oilLiters", oilLiters.doubleValue());
|
|
|
+ resultMap.put("discountPrice", oilPrice);
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ //没有优惠规则
|
|
|
+ resultMap.put("discountAmt", 0);
|
|
|
+ resultMap.put("amt", receivableAmt.doubleValue());
|
|
|
+ oilLiters = new BigDecimal(receivableAmt).divide(new BigDecimal(oilPrice), 2, BigDecimal.ROUND_UP);
|
|
|
+ resultMap.put("oilLiters", oilLiters.doubleValue());
|
|
|
+ resultMap.put("discountPrice", oilPrice);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "3": //3.立减
|
|
|
+ params.put("discountPlanType", "2");
|
|
|
+ //营销方案
|
|
|
+ List<Map> customerMarkertPlanList_2 = customerGradeServices.getCustomerMarkertPlanList(params);
|
|
|
+ if(customerMarkertPlanList_2 !=null && customerMarkertPlanList_2.size() >0){
|
|
|
+ boolean flag = true;
|
|
|
+ for (Map m : customerMarkertPlanList_2){
|
|
|
+ //如果当前应收金额大于条件金额
|
|
|
+ BigDecimal discountAmt_b = new BigDecimal(m.get("discountAmt").toString()); //条件金额
|
|
|
+ if(receivableAmt_b.compareTo(discountAmt_b) ==1 || receivableAmt_b.compareTo(discountAmt_b) ==0){
|
|
|
+ BigDecimal gasoilDiscountAmt_b = new BigDecimal(m.get("gasoilDiscountAmt").toString()); //每满多少优惠多少的金额
|
|
|
+ discountAmt = gasoilDiscountAmt_b; //优惠金额
|
|
|
+ amt = receivableAmt_b.subtract(gasoilDiscountAmt_b); //实收金额
|
|
|
+ oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice), 2, BigDecimal.ROUND_UP); //加油升数
|
|
|
+ discountPrice = amt.divide(oilLiters); //优惠价格
|
|
|
+ resultMap.put("discountAmt", discountAmt.doubleValue());
|
|
|
+ resultMap.put("amt", amt.doubleValue());
|
|
|
+ resultMap.put("oilLiters", oilLiters.doubleValue());
|
|
|
+ resultMap.put("discountPrice", discountPrice.doubleValue());
|
|
|
+ flag = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(flag){ //用户加油金额不符合优惠条件
|
|
|
+ resultMap.put("discountAmt", 0);
|
|
|
+ resultMap.put("amt", receivableAmt.doubleValue());
|
|
|
+ oilLiters = new BigDecimal(receivableAmt).divide(new BigDecimal(oilPrice), 2, BigDecimal.ROUND_UP);
|
|
|
+ resultMap.put("oilLiters", oilLiters.doubleValue());
|
|
|
+ resultMap.put("discountPrice", oilPrice);
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ //没有优惠规则
|
|
|
+ resultMap.put("discountAmt", 0);
|
|
|
+ resultMap.put("amt", receivableAmt.doubleValue());
|
|
|
+ oilLiters = new BigDecimal(receivableAmt).divide(new BigDecimal(oilPrice), 2, BigDecimal.ROUND_UP);
|
|
|
+ resultMap.put("oilLiters", oilLiters.doubleValue());
|
|
|
+ resultMap.put("discountPrice", oilPrice);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "4": //4.独立直降
|
|
|
+ params.put("discountPlanType", "3");
|
|
|
+ //营销方案
|
|
|
+ List<Map> customerMarkertPlanList_3 = customerGradeServices.getCustomerMarkertPlanList(params);
|
|
|
+ if(customerMarkertPlanList_3 !=null && customerMarkertPlanList_3.size() >0){
|
|
|
+ boolean flag= true;
|
|
|
+ for(Map m : customerMarkertPlanList_3){
|
|
|
+ BigDecimal discountAmt_b = new BigDecimal(m.get("discountAmt").toString()); //条件金额
|
|
|
+ BigDecimal gasoilDiscountAmt_b = new BigDecimal(m.get("gasoilDiscountAmt").toString());
|
|
|
+ oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice), 2, BigDecimal.ROUND_UP); //加油升数
|
|
|
+ if(m.get("discountTerm").toString().equals("1")){ //按升数优惠
|
|
|
+ if(oilLiters.compareTo(discountAmt_b) ==1 || oilLiters.compareTo(discountAmt_b) ==0){
|
|
|
+ //计算
|
|
|
+ discountAmt = oilLiters.multiply(gasoilDiscountAmt_b);
|
|
|
+ discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_UP);
|
|
|
+ amt = receivableAmt_b.subtract(discountAmt);
|
|
|
+ discountPrice = amt.divide(oilLiters, 2, BigDecimal.ROUND_UP); //优惠价格
|
|
|
+ resultMap.put("discountAmt", discountAmt.doubleValue());
|
|
|
+ resultMap.put("amt", amt.doubleValue());
|
|
|
+ resultMap.put("oilLiters", oilLiters.doubleValue());
|
|
|
+ resultMap.put("discountPrice", discountPrice.doubleValue());
|
|
|
+ flag =false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }else if(m.get("discountTerm").toString().equals("2")){ //按金额优惠
|
|
|
+ if(receivableAmt_b.compareTo(discountAmt_b) ==1 || receivableAmt_b.compareTo(discountAmt_b) ==0){
|
|
|
+ discountAmt = oilLiters.multiply(gasoilDiscountAmt_b);
|
|
|
+ discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_UP);
|
|
|
+ amt = receivableAmt_b.subtract(discountAmt);
|
|
|
+ discountPrice = amt.divide(oilLiters, 2, BigDecimal.ROUND_UP); //优惠价格
|
|
|
+ resultMap.put("discountAmt", discountAmt.doubleValue());
|
|
|
+ resultMap.put("amt", amt.doubleValue());
|
|
|
+ resultMap.put("oilLiters", oilLiters.doubleValue());
|
|
|
+ resultMap.put("discountPrice", discountPrice.doubleValue());
|
|
|
+ flag =false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(flag){
|
|
|
+ resultMap.put("discountAmt", 0);
|
|
|
+ resultMap.put("amt", receivableAmt.doubleValue());
|
|
|
+ oilLiters = new BigDecimal(receivableAmt).divide(new BigDecimal(oilPrice), 2, BigDecimal.ROUND_UP);
|
|
|
+ resultMap.put("oilLiters", oilLiters.doubleValue());
|
|
|
+ resultMap.put("discountPrice", oilPrice);
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ //没有优惠规则
|
|
|
+ resultMap.put("discountAmt", 0);
|
|
|
+ resultMap.put("amt", receivableAmt.doubleValue());
|
|
|
+ oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice), 2, BigDecimal.ROUND_UP);
|
|
|
+ resultMap.put("oilLiters", oilLiters.doubleValue());
|
|
|
+ resultMap.put("discountPrice", oilPrice);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ //resultData = ResultData.success(resultMap);
|
|
|
+ }
|
|
|
+ return resultMap;
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* ===========================计算订单金额======================================
|
|
|
* 第一次修订时间:2021年4月20日15:31:30
|
|
@@ -679,7 +898,7 @@ public class PayOrderController {
|
|
|
Double receivableAmt = Double.valueOf(params.get("receivableAmt").toString());
|
|
|
Map<String, Object> resultMap = new HashMap();
|
|
|
BigDecimal oilLiters = null;
|
|
|
- BigDecimal discountAmt =null;
|
|
|
+ BigDecimal discountAmt =new BigDecimal(0);
|
|
|
BigDecimal discountPrice = null;
|
|
|
BigDecimal amt = null;
|
|
|
BigDecimal receivableAmt_b = new BigDecimal(receivableAmt); //传入的应收金额
|