jk-GitHub-coder 4 år sedan
förälder
incheckning
f7e7fb79eb

+ 220 - 1
YijiaRestful/src/main/java/com/platform/yijia/controller/PayOrderController.java

@@ -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); //传入的应收金额