Просмотр исходного кода

//首月+3个月、首月+6个月、首月+12个月 的情况,需要把前两条 合并成一条

zhangyao 1 месяц назад
Родитель
Сommit
0e54775105

+ 21 - 5
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractService.java

@@ -1154,16 +1154,30 @@ public class contractService {
 
         //获取服务周期
         //List<PeriodCalculationUtil.Period> periodList = PeriodCalculationUtil.getPeriodList(PERIOD_TYPE, START_DATE, EFFECTIVE_DATE, END_DATE, true, true, -1);
-
-        List<PeriodCalculationUtil.Period> periodList = PeriodCalculationUtil.getPeriodListByConfig(PERIOD_TYPE, EFFECTIVE_DATE, EFFECTIVE_DATE, END_DATE, service.getString("CALC_METHOD_1STPERIOD"), service.getString("CALC_METHOD_1STYEAR"), service.getString("MONTH_1STQUARTER"));
+        String CALC_METHOD_1STPERIOD = service.getString("CALC_METHOD_1STPERIOD");
+        List<PeriodCalculationUtil.Period> periodList = PeriodCalculationUtil.getPeriodListByConfig(PERIOD_TYPE, EFFECTIVE_DATE, EFFECTIVE_DATE, END_DATE, CALC_METHOD_1STPERIOD, service.getString("CALC_METHOD_1STYEAR"), service.getString("MONTH_1STQUARTER"));
 
         if (periodList != null && periodList.size() > 0) {
             String PERIOD = periodList.get(0).getPeriodBeginDateStr() + "~" + periodList.get(periodList.size() - 1).getPeriodEndDateStr();
 
-            int i = 0;
-            for (PeriodCalculationUtil.Period period : periodList) {
+            //首月+3个月、首月+6个月、首月+12个月 的情况,需要把前两条 合并成一条
+            if (periodList.size() > 1) {
+                if (CALC_METHOD_1STPERIOD.equals("4597") || CALC_METHOD_1STPERIOD.equals("4594") || CALC_METHOD_1STPERIOD.equals("4591")) {
+                    PeriodCalculationUtil.Period period1 = periodList.get(0);
+                    PeriodCalculationUtil.Period period2 = periodList.get(1);
+                    //小于1
+                    if (period1.getRate().compareTo(BigDecimal.ONE) < 1) {
+                        //合并
+                        period2.setRate(period1.getRate().add(period2.getRate()));
+                        period2.setPeriodBeginDate(period1.getPeriodBeginDate());
+                        //移除第一条
+                        periodList.remove(0);
+                    }
+                }
+            }
+
 
-                i++;
+            for (PeriodCalculationUtil.Period period : periodList) {
                 BO csp = new BO();//服务周期
                 csp.set("CONTRACT_ID", contract.get("ID"));
                 csp.set("OBJECT_ID", service.get("OBJECT_ID"));
@@ -2034,6 +2048,8 @@ public class contractService {
         contractCost.set("EXTENDED_COST", multiply(service.get("UNIT_COST"), service.get("QUANTITY")));//总成本
         contractCost.set("EXTENDED_PRICE", multiply(service.get("UNIT_PRICE"), service.get("QUANTITY")));//总价
 
+        //计费客户
+        contractCost.set("BILL_ACCOUNT_ID", serviceBO.get("BILL_TO_ACCOUNT_ID"));
 
         // contractServiceLogger.info("计算合同成本周期:" + service);
         // 需要通过采购计算总成本

+ 40 - 20
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractServiceAdj.java

@@ -158,8 +158,9 @@ public class contractServiceAdj {
 
             }
 
+            String CALC_METHOD_1STPERIOD = contractService.getString("CALC_METHOD_1STPERIOD");
             //获取服务周期
-            List<PeriodCalculationUtil.Period> periodList = PeriodCalculationUtil.getPeriodListByConfig(PERIOD_TYPE, EFFECTIVE_DATE, EFFECTIVE_DATE, EFFECTIVE_END_DATE, contractService.getString("CALC_METHOD_1STPERIOD"), "4638", contractService.getString("MONTH_1STQUARTER"));
+            List<PeriodCalculationUtil.Period> periodList = PeriodCalculationUtil.getPeriodListByConfig(PERIOD_TYPE, EFFECTIVE_DATE, EFFECTIVE_DATE, EFFECTIVE_END_DATE, CALC_METHOD_1STPERIOD, "4638", contractService.getString("MONTH_1STQUARTER"));
 
             SERVICE_UNIT_PRICE = TypeUtil.convert(contractService.get("UNIT_PRICE"), BigDecimal.class);
 
@@ -175,22 +176,35 @@ public class contractServiceAdj {
                     sbsList = Arrays.asList(serviceIds.split(","));
                 }
 
-                int i = 0;
+                //首月+3个月、首月+6个月、首月+12个月 的情况,需要把前两条 合并成一条
+                if (periodList.size() > 1) {
+                    if (CALC_METHOD_1STPERIOD.equals("4597") || CALC_METHOD_1STPERIOD.equals("4594") || CALC_METHOD_1STPERIOD.equals("4591")) {
+                        PeriodCalculationUtil.Period period1 = periodList.get(0);
+                        PeriodCalculationUtil.Period period2 = periodList.get(1);
+                        //小于1
+                        if (period1.getRate().compareTo(BigDecimal.ONE) < 1) {
+                            //合并
+                            period2.setRate(period1.getRate().add(period2.getRate()));
+                            period2.setPeriodBeginDate(period1.getPeriodBeginDate());
+                            //移除第一条
+                            periodList.remove(0);
+                        }
+                    }
+                }
+
+
                 for (PeriodCalculationUtil.Period period : periodList) {
-                    i++;
+
                     BO csp = new BO();//服务周期
                     csp.set("CONTRACT_ID", orgContractService.get("CONTRACT_ID"));
                     csp.set("OBJECT_ID", orgContractService.get("OBJECT_ID"));
                     csp.set("OBJECT_TYPE", orgContractService.get("OBJECT_TYPE"));
                     csp.set("CONTRACT_SERVICE_ID", orgContractService.get("ID"));
-
                     csp.set("PERIOD_BEGIN_DATE", period.getPeriodBeginDateStr());
                     csp.set("PERIOD_END_DATE", period.getPeriodEndDateStr());
                     csp.set("QUANTITY", contractService.get("QUANTITY"));
 
-                    //第一条
                     csp.set("PERIOD_PRICE", period.getRate().multiply(SERVICE_TOTAL_PRICE));
-
                     csp.set("PERIOD_ADJUSTED_PRICE", csp.get("PERIOD_PRICE"));
                     csp.set("PARTYA_PERIOD_PRICE", multiply(contractService.get("PARTYA_TOTAL_PRICE"), period.getRate()));//三方合同甲方含税总价
 
@@ -534,34 +548,39 @@ public class contractServiceAdj {
             boolean teshuchuli = false;
             String teshuchuliBeginDate = null;
             BigDecimal COST_1STMONTH = null;
+            LocalDate START_DATE = EFFECTIVE_DATE;
             if (StringUtils.isNotBlank(lastPeriodId)) {
 
                 //获取第一笔
 
                 //首月成本
-                RowMap firstContractService = DBSql.getMap("select * from BO_EU_DNCTT_CONTRACT_SERVICE_PURCHASE_ADJUST where  CONTRACT_SERVICE_ID=?  and IS_EFFECTIVE='已执行' order by PURCHASE_START_DATE ASC", new Object[]{contractService.get("CONTRACT_SERVICE_ID")});
+                if (PERIOD_TYPE.equals("4598") || PERIOD_TYPE.equals("4595") || PERIOD_TYPE.equals("4592")) {
+
+                } else {
+                    RowMap firstContractService = DBSql.getMap("select * from BO_EU_DNCTT_CONTRACT_SERVICE_PURCHASE_ADJUST where  CONTRACT_SERVICE_ID=?  and IS_EFFECTIVE='已执行' order by PURCHASE_START_DATE ASC", new Object[]{contractService.get("CONTRACT_SERVICE_ID")});
 
-                LocalDate firstEFFECTIVE_DATE = getLocalDate(firstContractService.get("PURCHASE_START_DATE"));
+                    LocalDate firstEFFECTIVE_DATE = getLocalDate(firstContractService.get("PURCHASE_START_DATE"));
 
-                if (firstEFFECTIVE_DATE.getYear() == EFFECTIVE_DATE.getYear() && firstEFFECTIVE_DATE.getMonth() == EFFECTIVE_DATE.getMonth()) {
-                    teshuchuli = true;
-                    teshuchuliBeginDate = LocalDateYYYYMMDD(EFFECTIVE_DATE);
-                    SERVICE_UNIT_COST = TypeUtil.convert(contractService.get("UNIT_COST_1STMONTH"), BigDecimal.class);
-                    SERVICE_TOTAL_COST = multiply(SERVICE_UNIT_COST, contractService.get("QUANTITY"));
+                    if (firstEFFECTIVE_DATE.getYear() == EFFECTIVE_DATE.getYear() && firstEFFECTIVE_DATE.getMonth() == EFFECTIVE_DATE.getMonth()) {
+                        teshuchuli = true;
+                        teshuchuliBeginDate = LocalDateYYYYMMDD(EFFECTIVE_DATE);
+                        SERVICE_UNIT_COST = TypeUtil.convert(contractService.get("UNIT_COST_1STMONTH"), BigDecimal.class);
+                        SERVICE_TOTAL_COST = multiply(SERVICE_UNIT_COST, contractService.get("QUANTITY"));
 
-                    BigDecimal ratio = new BigDecimal(EFFECTIVE_DATE.getDayOfMonth()).divide(new BigDecimal(EFFECTIVE_DATE.lengthOfMonth()), 10, BigDecimal.ROUND_HALF_UP);
-                    ratio = BigDecimal.ONE.subtract(ratio);
+                        BigDecimal ratio = new BigDecimal(EFFECTIVE_DATE.getDayOfMonth()).divide(new BigDecimal(EFFECTIVE_DATE.lengthOfMonth()), 10, BigDecimal.ROUND_HALF_UP);
+                        ratio = BigDecimal.ONE.subtract(ratio);
 
-                    COST_1STMONTH = SERVICE_TOTAL_COST.multiply(ratio);
+                        COST_1STMONTH = SERVICE_TOTAL_COST.multiply(ratio);
 
-                    EFFECTIVE_DATE = EFFECTIVE_DATE.plusMonths(1).withDayOfMonth(1);//下个月1号
+                        EFFECTIVE_DATE = EFFECTIVE_DATE.plusMonths(1).withDayOfMonth(1);//下个月1号
+                    }
                 }
 
+
                 // 首月单独计费
                 if (teshuchuli) {
                     SERVICE_UNIT_COST = TypeUtil.convert(lastContractService.get("UNIT_COST_1STMONTH"), BigDecimal.class);
                     SERVICE_TOTAL_COST = multiply(SERVICE_UNIT_COST, lastContractService.get("QUANTITY"));
-                    SERVICE_TOTAL_COST = multiply(SERVICE_TOTAL_COST, 12);
                 } else {
                     SERVICE_UNIT_COST = TypeUtil.convert(lastContractService.get("UNIT_COST"), BigDecimal.class);
                     SERVICE_TOTAL_COST = multiply(SERVICE_UNIT_COST, lastContractService.get("QUANTITY"));
@@ -574,15 +593,16 @@ public class contractServiceAdj {
 
                 lastServicePeriod.set("PERIOD_END_DATE", EFFECTIVE_DATE.minusDays(1));
 
-                BigDecimal periodRate = PeriodCalculationUtil.divideToBigDecimal(getDateRate(last_period_begin_date, EFFECTIVE_DATE.minusDays(1), false), GetPeriodMonth(lastContractService.getString("PURCHASE_PERIOD_TYPE")));
+                BigDecimal periodRate = getDateRate(last_period_begin_date, EFFECTIVE_DATE.minusDays(1), false);
 
                 lastServicePeriod.set("PLAN_AMOUNT", multiply(SERVICE_TOTAL_COST, periodRate));
                 lastServicePeriod.set("REMAIN_AMOUNT", lastServicePeriod.get("PLAN_AMOUNT"));
+
                 SDK.getBOAPI().update("BO_EU_DNIVT_ORDER_PAYMENT_PLAN", lastServicePeriod, conn);
             }
 
             //获取服务周期
-            List<PeriodCalculationUtil.Period> periodList = PeriodCalculationUtil.getPeriodListByConfig(PERIOD_TYPE, EFFECTIVE_DATE, EFFECTIVE_DATE, EFFECTIVE_END_DATE, contractService.getString("PURCHASE_CALC_METHOD_1STPERIOD"), "4638", contractService.getString("MONTH_1STQUARTER"));
+            List<PeriodCalculationUtil.Period> periodList = PeriodCalculationUtil.getPeriodListByConfig(PERIOD_TYPE, START_DATE, EFFECTIVE_DATE, EFFECTIVE_END_DATE, contractService.getString("PURCHASE_CALC_METHOD_1STPERIOD"), "4638", contractService.getString("MONTH_1STQUARTER"));
 
             SERVICE_UNIT_COST = TypeUtil.convert(contractService.get("UNIT_COST"), BigDecimal.class);
 

+ 8 - 4
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/controller/ivtOrderController.java

@@ -696,8 +696,9 @@ public class ivtOrderController {
             int validCount = 0;
 
             for (RowMap cost : costList) {
-                String account_id = cost.getString("ACCOUNT_ID");
+                // String account_id = cost.getString("ACCOUNT_ID");
 
+                String account_id = cost.getString("BILL_ACCOUNT_ID");//计费客户
                 String status_id = cost.getString("STATUS_ID");
 
                 /*待采购/待拣货*/
@@ -738,9 +739,10 @@ public class ivtOrderController {
                 if (StringUtils.isNotBlank(vendor_id)) {
                     VENDOR_ACCOUNT_ID.add(vendor_id);
                 }
+
                 ivtLogger.info("处理的vendor_id: " + vendor_id);
 
-                int purchase_quantity = cost.getInt("QUANTITY") - DBSql.getInt("select sum(QUANTITY) AS QU from BO_EU_DNCTT_CONTRACT_COST_PRODUCT where CONTRACT_COST_ID=? and CLOSED=0", new Object[]{cost.getString("ID")});
+                int purchase_quantity = cost.getInt("QUANTITY") - DBSql.getInt("SELECT sum(a.QUANTITY) AS QU  FROM BO_EU_DNCTT_CONTRACT_COST_PRODUCT a  LEFT JOIN BO_EU_DNIVT_ORDER_PRODUCT b ON a.ORDER_ID=b.ORDER_ID AND a.CONTRACT_COST_ID=b.CONTRACT_COST_ID WHERE  ((a.ORDER_ID is NULL OR a.ORDER_ID='') OR b.ORDER_ID IS NOT NULL) AND  a.CONTRACT_COST_ID=?  and a.CLOSED=0", new Object[]{cost.getString("ID")});
                 if (purchase_quantity <= 0) {
                     ivtLogger.info("采购数量<=0,跳过该记录,ID: " + cost.getString("ID"));
                     continue;
@@ -749,11 +751,13 @@ public class ivtOrderController {
                 validCount++;
             }
 
+
             if (validCount < 1) {
                 ivtLogger.info("没有可处理的采购订单记录");
                 return ResponseObject.newErrResponse("没有可处理的采购订单");
             }
 
+
             ProcessInstance processInstance;
             try {
                 processInstance = SDK.getProcessAPI().createProcessInstance("obj_795cb3601f3a4b919b5896cf5b076a3a", uc.getUID(), "采购订单");
@@ -781,7 +785,7 @@ public class ivtOrderController {
                 int purchaseQuantity = cost.getInt("PURCHASE_QUANTITY");
 
                 if (StringUtils.isBlank(unitCostStr) || StringUtils.isBlank(taxCategoryId) || purchaseQuantity <= 0) {
-                    System.err.println("无效计算参数:UNIT_COST=" + unitCostStr + ",TAX_CATEGORY_ID=" + taxCategoryId + ",PURCHASE_QUANTITY=" + purchaseQuantity);
+                    ivtLogger.info("无效计算参数:UNIT_COST=" + unitCostStr + ",TAX_CATEGORY_ID=" + taxCategoryId + ",PURCHASE_QUANTITY=" + purchaseQuantity);
                     throw new RuntimeException("计算不含税金额失败:参数无效");
                 }
 
@@ -795,7 +799,7 @@ public class ivtOrderController {
                 BigDecimal unitCostNotax = unitCost.divide(BigDecimal.ONE.add(taxRate), 2, RoundingMode.HALF_UP);
 
                 BigDecimal costTotalNotax = unitCostNotax.multiply(new BigDecimal(purchaseQuantity)).setScale(2, RoundingMode.HALF_UP);
-                purchaseOrderProduct.set("PURCHASE_ACCOUNT_ID", cost.getString("ACCOUNT_ID"));
+                purchaseOrderProduct.set("PURCHASE_ACCOUNT_ID", cost.getString("BILL_ACCOUNT_ID"));//使用计费客户
                 purchaseOrderProduct.set("NAME", cost.getString("NAME"));
                 purchaseOrderProduct.set("PRODUCT_ID", cost.getString("PRODUCT_ID"));
                 purchaseOrderProduct.set("QUANTITY", cost.getString("PURCHASE_QUANTITY"));

+ 6 - 0
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/event/ivtOrderFormAfter.java

@@ -3,6 +3,7 @@ package com.awspaas.user.apps.donenow_ivt.event;
 import com.actionsoft.bpms.bo.engine.BO;
 import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext;
 import com.actionsoft.bpms.bpmn.engine.listener.ExecuteListener;
+import com.actionsoft.bpms.util.DBSql;
 import com.actionsoft.sdk.local.SDK;
 import com.actionsoft.sdk.local.api.Logger;
 import org.apache.commons.lang3.StringUtils;
@@ -46,6 +47,11 @@ public class ivtOrderFormAfter extends ExecuteListener {
             SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_COST_PRODUCT", costProduct);
         }
 
+        //删除多余的采购订单产品
+        List<String> costProductIds = DBSql.getList("SELECT a.ID FROM BO_EU_DNCTT_CONTRACT_COST_PRODUCT a  LEFT JOIN BO_EU_DNIVT_ORDER_PRODUCT b ON a.ORDER_ID=b.ORDER_ID AND a.CONTRACT_COST_ID=b.CONTRACT_COST_ID WHERE b.ID IS NULL AND a.ORDER_ID=?", String.class, new Object[]{orderBO.getId()});
+        for (String costProductId : costProductIds) {
+            SDK.getBOAPI().remove("BO_EU_DNCTT_CONTRACT_COST_PRODUCT", costProductId);
+        }
 
         //采购订单编号
         String purchaseOrderNo = orderBO.getString("PURCHASE_ORDER_NO");

+ 15 - 8
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/service/PaymentPlanService.java

@@ -132,17 +132,24 @@ public class PaymentPlanService {
                         String sql = "delete from BO_EU_DNIVT_ORDER_PAYMENT_PLAN where ORDER_ID = ? and CONTRACT_COST_ID=? and CONTRACT_SERVICE_ID=? and (PAY_AMOUNT is null or PAY_AMOUNT = 0)";
                         DBSql.update(conn, sql, new Object[]{orderId, orderProduct.getString("CONTRACT_COST_ID"), SERVICE_ID});
 
+                        BigDecimal UNIT_COST_1STMONTH = BigDecimal.ZERO;
+                        String firstPeriodBeginDate = null;
+
                         //首月单独计算
-                        BigDecimal UNIT_COST_1STMONTH = toBigDecimal(service.get("UNIT_COST_1STMONTH"));
-                        BigDecimal ratio = new BigDecimal(PERIOD_BEGIN_DATE.getDayOfMonth()).divide(new BigDecimal(PERIOD_BEGIN_DATE.lengthOfMonth()), 10, BigDecimal.ROUND_HALF_UP);
-                        ratio=BigDecimal.ONE.subtract(ratio);
-                        UNIT_COST_1STMONTH = ratio.multiply(UNIT_COST_1STMONTH);
-                        String firstPeriodBeginDate = PERIOD_BEGIN_DATE.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+                        if (RULE_CATE.equals("4598") || RULE_CATE.equals("4595") || RULE_CATE.equals("4592")) {
+                            //签约之日开始算周期,则不需要
 
-                        //下月一号
-                        LocalDate firstDayOfNextMonth = PERIOD_BEGIN_DATE.plusMonths(1).withDayOfMonth(1);
+                        } else {
+                            UNIT_COST_1STMONTH = toBigDecimal(service.get("UNIT_COST_1STMONTH"));
+                            BigDecimal ratio = new BigDecimal(PERIOD_BEGIN_DATE.getDayOfMonth()).divide(new BigDecimal(PERIOD_BEGIN_DATE.lengthOfMonth()), 10, BigDecimal.ROUND_HALF_UP);
+                            ratio = BigDecimal.ONE.subtract(ratio);
+                            UNIT_COST_1STMONTH = ratio.multiply(UNIT_COST_1STMONTH);
+                            firstPeriodBeginDate = PERIOD_BEGIN_DATE.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+                            //下月一号
+                            PERIOD_BEGIN_DATE = PERIOD_BEGIN_DATE.plusMonths(1).withDayOfMonth(1);
+                        }
 
-                        List<PeriodCalculationUtil.Period> periods = PeriodCalculationUtil.getPeriodListByConfig(RULE_CATE, firstDayOfNextMonth, firstDayOfNextMonth, PERIOD_END_DATE, PURCHASE_CALC_METHOD_1STPERIOD, service.getString("CALC_METHOD_1STYEAR"), service.getString("MONTH_1STQUARTER"));
+                        List<PeriodCalculationUtil.Period> periods = PeriodCalculationUtil.getPeriodListByConfig(RULE_CATE, START_DATE, PERIOD_BEGIN_DATE, PERIOD_END_DATE, PURCHASE_CALC_METHOD_1STPERIOD, service.getString("CALC_METHOD_1STYEAR"), service.getString("MONTH_1STQUARTER"));
 
                         int i = 0;
                         for (PeriodCalculationUtil.Period period : periods) {