Ver código fonte

付款计划调整

zhangyao 1 mês atrás
pai
commit
fc5d57059b

+ 6 - 5
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/PeriodCalculationUtil.java

@@ -18,11 +18,11 @@ import java.util.List;
  */
 public class PeriodCalculationUtil {
     // 周期类型常量(与原IVTConstant对齐,可根据实际常量类调整)
-    public static final String PERIOD_TYPE_ONCE = "ONCE";       // 一次性收费
-    public static final String PERIOD_TYPE_MONTH = "MONTH";     // 按月支付
-    public static final String PERIOD_TYPE_QUARTER = "QUARTER"; // 按季支付
-    public static final String PERIOD_TYPE_HALFYEAR = "HALFYEAR"; // 按半年支付
-    public static final String PERIOD_TYPE_YEAR = "YEAR";       // 按年支付
+    public static final String PERIOD_TYPE_ONCE = "609";       // 一次性收费
+    public static final String PERIOD_TYPE_MONTH = "610";     // 按月支付
+    public static final String PERIOD_TYPE_QUARTER = "611"; // 按季支付
+    public static final String PERIOD_TYPE_HALFYEAR = "612"; // 按半年支付
+    public static final String PERIOD_TYPE_YEAR = "613";       // 按年支付
 
     // 日期格式化器(复用避免重复创建)
     private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@@ -35,6 +35,7 @@ public class PeriodCalculationUtil {
         throw new AssertionError("工具类不允许实例化");
     }
 
+
     /**
      * 核心方法:生成周期列表(含费率)
      *

+ 154 - 49
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractService.java

@@ -7,6 +7,7 @@ import com.actionsoft.bpms.server.UserContext;
 import com.actionsoft.bpms.util.DBSql;
 import com.actionsoft.sdk.local.SDK;
 import com.actionsoft.sdk.local.api.Logger;
+import com.awspaas.user.apps.donenow_ctt.PeriodCalculationUtil;
 import com.awspaas.user.apps.donenow_ctt.cttConstant;
 import org.apache.commons.lang3.StringUtils;
 
@@ -412,6 +413,15 @@ public class contractService {
 
 
             if (!PERIOD_END.isEqual(END_DATE)) {
+
+                BigDecimal SERVICE_UNIT_COST = service.get("UNIT_COST", BigDecimal.class);//服务单元成本
+                //需要采购
+                if (service.getString("NEED_PURCHASE").equals("1")) {
+                    BigDecimal prate = GetPeriodRate(service.getString("PERIOD_TYPE"), service.getString("PURCHASE_PERIOD_TYPE"));
+                    SERVICE_UNIT_COST = SERVICE_UNIT_COST.multiply(prate);
+                }
+                BigDecimal SERVICE_TOTAL_COST = multiply(SERVICE_UNIT_COST, service.get("QUANTITY"));//服务总成本
+
                 if (PERIOD_END.isBefore(END_DATE)) {
                     contractServiceLogger.info("服务周期延长--" + service.getString("NAME"));
                     //延长
@@ -421,7 +431,8 @@ public class contractService {
                     LocalDate period_begin_date = getLocalDate(servicePeriod.get("PERIOD_BEGIN_DATE"));
                     LocalDate period_end_date = getLocalDate(servicePeriod.get("PERIOD_END_DATE"));
 
-                    String maxPeriod = servicePeriod.getString("PERIOD_TYPE");
+                    String maxPeriod = service.getString("PERIOD_TYPE");
+
                     LocalDate firstPeriodEnd = getNextPeriodStart(period_begin_date, maxPeriod).minusDays(1);//本周期结束时间
                     LocalDate SATRT_DATE = null;
                     if (period_end_date.isBefore(firstPeriodEnd)) {
@@ -467,9 +478,9 @@ public class contractService {
                             BigDecimal period_price = multiply(service.get("UNIT_PRICE"), service.get("QUANTITY"));
                             period_price = periodRate.multiply(period_price);
                             csp.set("PERIOD_PRICE", period_price);
-                            BigDecimal period_cost = multiply(service.get("UNIT_COST"), service.get("QUANTITY"));
-                            period_cost = periodRate.multiply(period_cost);
-                            csp.set("PERIOD_COST", period_cost);
+
+                            csp.set("PERIOD_COST", periodRate.multiply(SERVICE_TOTAL_COST));
+
                             csp.set("PERIOD_ADJUSTED_PRICE", csp.get("PERIOD_PRICE"));
 
                             csp.set("PARTYA_PERIOD_PRICE", multiply(service.get("PARTYA_TOTAL_PRICE"), periodRate));
@@ -524,9 +535,88 @@ public class contractService {
                 }
 
                 DBSql.update(conn, "update BO_EU_DNCTT_CONTRACT_SERVICE set PERIOD=?,ADJUST_PERIOD=? where ID=? and BINDID=?", new Object[]{PERIOD, ADJUST_PERIOD, service.get("ID"), service.get("BINDID")});
-            }
 
 
+                //付款计划延期
+                if (PERIOD_END.isBefore(END_DATE)) {
+                    contractServiceLogger.info("服务周期延长--" + service.getString("NAME"));
+                    //延长
+                    List<BO> payPeriodList = SDK.getBOAPI().query("BO_EU_DNIVT_ORDER_PAYMENT_PLAN").connection(conn).addQuery("CONTRACT_SERVICE_ID =", service.getId()).addQuery("PLAN_DATE >=", LocalDateYYYYMMDD(PERIOD_END)).orderBy("PLAN_DATE").desc().list();
+
+                    BO payPeriod = payPeriodList.get(0);
+                    LocalDate period_begin_date = getLocalDate(payPeriod.get("PLAN_DATE"));
+                    LocalDate period_end_date = getLocalDate(PERIOD_END);//上次结束日期
+
+                    String maxPeriod = service.getString("PURCHASE_PERIOD_TYPE");//采购周期类型
+
+                    LocalDate firstPeriodEnd = getNextPeriodStart(period_begin_date, maxPeriod).minusDays(1);//本周期结束时间
+                    LocalDate SATRT_DATE = null;
+                    if (period_end_date.isBefore(firstPeriodEnd)) {
+                        LocalDate new_period_end_date;
+                        if (END_DATE.isBefore(firstPeriodEnd)) {
+                            new_period_end_date = END_DATE;
+                        } else {
+                            new_period_end_date = firstPeriodEnd;
+                            SATRT_DATE = firstPeriodEnd.plusDays(1);
+                        }
+                        BigDecimal periodRate = divideToBigDecimal(GetPeriodDays(period_begin_date, new_period_end_date), GetPeriodDays(period_begin_date, period_end_date));
+
+                        payPeriod.set("PLAN_AMOUNT", multiply(payPeriod.get("PLAN_AMOUNT"), periodRate));//计划付款金额
+                        payPeriod.set("REMAIN_AMOUNT", payPeriod.get("PLAN_AMOUNT", BigDecimal.class).subtract(payPeriod.get("PAY_AMOUNT", BigDecimal.class)));//剩余金额
+                        SDK.getBOAPI().update("BO_EU_DNIVT_ORDER_PAYMENT_PLAN", payPeriod, conn);
+                    } else {
+                        SATRT_DATE = period_end_date.plusDays(1);
+                    }
+
+                    if (SATRT_DATE != null && SATRT_DATE.isBefore(END_DATE)) {
+
+                        //循环添加全部周期
+                        while (!SATRT_DATE.isAfter(END_DATE)) {
+                            BigDecimal periodRate = BigDecimal.ONE;
+                            LocalDate periodEnd = getNextPeriodStart(SATRT_DATE, maxPeriod).minusDays(1);//本周期结束时间
+                            if (periodEnd.isAfter(END_DATE)) {//如果结束日期大于合同结束日期,则计算结束日期和合同结束日期的差值,并计算该差值占整周期的比例
+                                periodRate = divideToBigDecimal(GetPeriodDays(SATRT_DATE, END_DATE), GetPeriodDays(SATRT_DATE, periodEnd));
+                                periodEnd = END_DATE;
+                            }
+
+                            ProcessInstance processInstance = SDK.getProcessAPI().createProcessInstance("obj_5cb4ae4a42944fd0a9a284ff4c64c65d", uc.getUID(), "付款计划");
+                            BO csp = new BO();//服务周期
+                            csp.setAll(payPeriod.asMap());
+                            csp.setBindId(processInstance.getId());
+                            csp.set("PLAN_DATE", SATRT_DATE);
+                            csp.set("PLAN_AMOUNT", periodRate.multiply(SERVICE_TOTAL_COST));
+                            csp.set("REMAIN_AMOUNT", csp.get("PLAN_AMOUNT"));
+                            SDK.getBOAPI().create("BO_EU_DNIVT_ORDER_PAYMENT_PLAN", csp, processInstance, uc);
+
+
+                            if (periodEnd != null) {
+                                SATRT_DATE = periodEnd.plusDays(1);
+                            }
+                        }
+                    }
+                } else if (PERIOD_END.isAfter(END_DATE)) {
+                    contractServiceLogger.info("服务周期缩短--" + service.getString("NAME"));
+                    //缩短
+
+                    List<BO> payPeriodList = SDK.getBOAPI().query("BO_EU_DNIVT_ORDER_PAYMENT_PLAN").connection(conn).addQuery("CONTRACT_SERVICE_ID =", service.getId()).addQuery("PLAN_DATE >=", LocalDateYYYYMMDD(PERIOD_END)).orderBy("PLAN_DATE").asc().list();
+
+                    BO payPeriod = payPeriodList.get(0);
+                    LocalDate period_begin_date = getLocalDate(payPeriod.get("PLAN_DATE"));
+                    BigDecimal periodRate = divideToBigDecimal(GetPeriodDays(period_begin_date, END_DATE), GetPeriodDays(period_begin_date, PERIOD_END));
+                    payPeriod.set("PLAN_AMOUNT", multiply(payPeriod.get("PLAN_AMOUNT"), periodRate));//计划付款金额
+                    payPeriod.set("REMAIN_AMOUNT", payPeriod.get("PLAN_AMOUNT", BigDecimal.class).subtract(payPeriod.get("PAY_AMOUNT", BigDecimal.class)));//剩余金额
+                    SDK.getBOAPI().update("BO_EU_DNIVT_ORDER_PAYMENT_PLAN", payPeriod, conn);
+
+                    for (BO period : payPeriodList) {
+                        //删除
+                        if (period.getString("ID").equals(payPeriod.getString("ID")) == false) {
+
+                            DBSql.update(conn, "DELETE FROM BO_EU_DNIVT_ORDER_PAYMENT_PLAN WHERE ID=?", new Object[]{period.getString("ID")});
+                        }
+                    }
+                }
+            }
+
         } catch (Exception e) {
 
         }
@@ -679,8 +769,13 @@ public class contractService {
 
         // 合同周期更长,服务周期使用合同周期,单价和成本根据周期倍数翻倍
         if (rate.compareTo(BigDecimal.ONE) > 0) {
-            unit_cost = unit_cost.multiply(rate);
-            service.set("UNIT_COST", unit_cost);
+
+            //是否需要采购
+            if (service.getString("NEED_PURCHASE").equals("1") == false) {
+                unit_cost = unit_cost.multiply(rate);
+                service.set("UNIT_COST", unit_cost);
+            }
+
             unit_price = unit_price.multiply(rate);
             service.set("UNIT_PRICE", unit_price);
             // service.set("PERIOD_TYPE", contract.getString("PERIOD_TYPE"));//计费周期更新
@@ -698,7 +793,10 @@ public class contractService {
         contractServiceLogger.info("计算-service-ADJUSTED_PRICE");
         service.set("TOTAL_PRICE", multiply(service.get("QUANTITY"), service.get("UNIT_PRICE")));//总价
         service.set("ADJUSTED_PRICE", multiply(service.get("QUANTITY"), service.get("UNIT_PRICE")));//总价
-        service.set("TOTAL_COST", multiply(service.get("QUANTITY"), service.get("UNIT_COST")));//总价
+
+        //是否需要采购
+        if (service.getString("NEED_PURCHASE").equals("1") == false)
+            service.set("TOTAL_COST", multiply(service.get("QUANTITY"), service.get("UNIT_COST")));//总价
 
         SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE", service, conn);//保存
 
@@ -740,6 +838,13 @@ public class contractService {
             if (currMontLastDay.isBefore(END_DATE)) START_DATE = currMontLastDay.plusDays(1);//周期开始日期
         }
 
+        BigDecimal SERVICE_UNIT_COST = service.get("UNIT_COST", BigDecimal.class);//服务单元成本
+        //需要采购
+        if (service.getString("NEED_PURCHASE").equals("1")) {
+            BigDecimal prate = GetPeriodRate(service.getString("PERIOD_TYPE"), service.getString("PURCHASE_PERIOD_TYPE"));
+            SERVICE_UNIT_COST = SERVICE_UNIT_COST.multiply(prate);
+        }
+        BigDecimal SERVICE_TOTAL_COST = multiply(SERVICE_UNIT_COST, service.get("QUANTITY"));//服务总成本
 
         //2025年10月15日 一次性收费服务
         if (service.getString("PERIOD_TYPE").equals(cttConstant.PERIOD_TYPE_ONE_TIME)) {
@@ -753,7 +858,7 @@ public class contractService {
             csp.set("QUANTITY", service.get("QUANTITY"));
             BigDecimal period_price = multiply(service.get("UNIT_PRICE"), service.get("QUANTITY"));
             csp.set("PERIOD_PRICE", period_price);
-            BigDecimal period_cost = multiply(service.get("UNIT_COST"), service.get("QUANTITY"));
+            BigDecimal period_cost = multiply(SERVICE_UNIT_COST, service.get("QUANTITY"));
             csp.set("PERIOD_COST", period_cost);
             csp.set("PERIOD_ADJUSTED_PRICE", csp.get("PERIOD_PRICE"));
             csp.set("PARTYA_PERIOD_PRICE", service.get("PARTYA_TOTAL_PRICE"));//三方合同甲方含税总价
@@ -820,7 +925,7 @@ public class contractService {
             csa.setBindId(service.getString("BINDID"));
 
             //服务周期成本
-            csa.set("PERIOD_COST", multiply(service.get("TOTAL_COST"), periodRate));
+            csa.set("PERIOD_COST", multiply(SERVICE_TOTAL_COST, periodRate));
             SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", csa, uc, conn);
 
             // 插入服务调整表包含的服务ctt_contract_service_adjust_bundle_service
@@ -873,10 +978,7 @@ public class contractService {
                 period_price = periodRate.multiply(period_price);
                 csp.set("PERIOD_PRICE", period_price);
 
-                contractServiceLogger.info("计算-csp-PERIOD_COST");
-                BigDecimal period_cost = multiply(service.get("UNIT_COST"), service.get("QUANTITY"));
-                period_cost = periodRate.multiply(period_cost);
-                csp.set("PERIOD_COST", period_cost);
+                csp.set("PERIOD_COST", periodRate.multiply(SERVICE_TOTAL_COST));
 
                 csp.set("PERIOD_ADJUSTED_PRICE", csp.get("PERIOD_PRICE"));
 
@@ -954,13 +1056,23 @@ public class contractService {
         BO contractServiceBO = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_SERVICE", editService.getString("CONTRACT_SERVICE_ID"));
 
         String maxPeriod = editService.getString("PERIOD_TYPE");
+
+        BigDecimal SERVICE_UNIT_COST = editService.get("UNIT_COST", BigDecimal.class);//服务单元成本
+        //需要采购
+        if (editService.getString("NEED_PURCHASE").equals("1")) {
+            BigDecimal prate = GetPeriodRate(editService.getString("PERIOD_TYPE"), editService.getString("PURCHASE_PERIOD_TYPE"));
+            SERVICE_UNIT_COST = SERVICE_UNIT_COST.multiply(prate);
+        }
+        BigDecimal SERVICE_TOTAL_COST = multiply(SERVICE_UNIT_COST, editService.get("QUANTITY"));//服务总成本
+
+
         //一次性收费服务
         if (editService.getString("PERIOD_TYPE").equals(cttConstant.PERIOD_TYPE_ONE_TIME)) {
             BO servicePeriod = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD").connection(conn).addQuery("CONTRACT_SERVICE_ID =", editService.getString("CONTRACT_SERVICE_ID")).detail();
             servicePeriod.set("PERIOD_BEGIN_DATE", EFFECTIVE_DATE);
             servicePeriod.set("QUANTITY", editService.get("QUANTITY"));
             servicePeriod.set("PERIOD_PRICE", editService.get("TOTAL_PRICE"));
-            servicePeriod.set("PERIOD_COST", editService.get("TOTAL_COST"));
+            servicePeriod.set("PERIOD_COST", SERVICE_TOTAL_COST);
 
             servicePeriod.set("PARTYA_PERIOD_PRICE", editService.get("PARTYA_TOTAL_PRICE"));//三方合同甲方含税总价
 
@@ -1019,7 +1131,7 @@ public class contractService {
                             BigDecimal periodRateAdj = divideToBigDecimal(GetPeriodDays(EFFECTIVE_DATE, period_end_date), priodDays);
 
                             servicePeriodAdj.set("PERIOD_PRICE", multiply(editService.get("TOTAL_PRICE"), periodRateAdj));
-                            servicePeriodAdj.set("PERIOD_COST", multiply(editService.get("TOTAL_COST"), periodRateAdj));
+                            servicePeriodAdj.set("PERIOD_COST", multiply(SERVICE_TOTAL_COST, periodRateAdj));
                             servicePeriodAdj.set("PERIOD_ADJUSTED_PRICE", servicePeriodAdj.get("PERIOD_PRICE"));
 
                             //三方合同甲方含税总价
@@ -1069,7 +1181,7 @@ public class contractService {
 
                             servicePeriod.set("QUANTITY", editService.get("QUANTITY"));
                             servicePeriod.set("PERIOD_PRICE", multiply(editService.get("TOTAL_PRICE"), periodRate));
-                            servicePeriod.set("PERIOD_COST", multiply(editService.get("TOTAL_COST"), periodRate));
+                            servicePeriod.set("PERIOD_COST", multiply(SERVICE_TOTAL_COST, periodRate));
                             servicePeriod.set("PERIOD_ADJUSTED_PRICE", servicePeriod.get("PERIOD_PRICE"));
                             //三方合同甲方含税总价
                             servicePeriod.set("PARTYA_PERIOD_PRICE", multiply(editService.get("PARTYA_TOTAL_PRICE"), periodRate));
@@ -1122,7 +1234,7 @@ public class contractService {
                     int priodDays = GetPeriodDays(getPreviousPeriodStart(period_end_date.plusDays(1), editService.getString("PERIOD_TYPE")), period_end_date);
                     BigDecimal periodRateAdj = divideToBigDecimal(GetPeriodDays(EFFECTIVE_DATE, period_end_date), priodDays);
                     servicePeriodAdj.set("PERIOD_PRICE", multiply(editService.get("TOTAL_PRICE"), periodRateAdj));
-                    servicePeriodAdj.set("PERIOD_COST", multiply(editService.get("TOTAL_COST"), periodRateAdj));
+                    servicePeriodAdj.set("PERIOD_COST", multiply(SERVICE_TOTAL_COST, periodRateAdj));
                     servicePeriodAdj.set("PERIOD_ADJUSTED_PRICE", servicePeriodAdj.get("PERIOD_PRICE"));
                     //三方合同甲方含税总价
                     servicePeriodAdj.set("PARTYA_PERIOD_PRICE", multiply(editService.get("PARTYA_TOTAL_PRICE"), periodRateAdj));
@@ -1191,7 +1303,7 @@ public class contractService {
                     LocalDate start = getPreviousPeriodStart(last_period_end_date.plusDays(1), editService.getString("PERIOD_TYPE"));
                     BigDecimal periodRateAdj = divideToBigDecimal(GetPeriodDays(EFFECTIVE_DATE, last_period_end_date), GetPeriodDays(start, last_period_end_date));    // 首周期占整周期比例
                     servicePeriodAdj.set("PERIOD_PRICE", multiply(editService.get("TOTAL_PRICE"), periodRateAdj));
-                    servicePeriodAdj.set("PERIOD_COST", multiply(editService.get("TOTAL_COST"), periodRateAdj));
+                    servicePeriodAdj.set("PERIOD_COST", multiply(SERVICE_TOTAL_COST, periodRateAdj));
 
                     servicePeriodAdj.set("PARTYA_PERIOD_PRICE", multiply(editService.get("PARTYA_TOTAL_PRICE"), periodRateAdj));
 
@@ -1249,9 +1361,8 @@ public class contractService {
                         period_price = periodRate.multiply(period_price);
                         csp.set("PERIOD_PRICE", period_price);
                         contractServiceLogger.info("计算-csp-PERIOD_COST");
-                        BigDecimal period_cost = multiply(editService.get("UNIT_COST"), editService.get("QUANTITY"));
-                        period_cost = periodRate.multiply(period_cost);
-                        csp.set("PERIOD_COST", period_cost);
+
+                        csp.set("PERIOD_COST", periodRate.multiply(SERVICE_TOTAL_COST));
                         csp.set("PERIOD_ADJUSTED_PRICE", csp.get("PERIOD_PRICE"));
 
                         csp.set("PARTYA_PERIOD_PRICE", multiply(editService.get("PARTYA_TOTAL_PRICE"), periodRate));//三方合同甲方含税总价
@@ -1389,10 +1500,17 @@ public class contractService {
                         contractCost.put("serviceID", serviceID);
                         contractCost.put("CONTRACT_ID", contract.getString("ID"));
                         contractCost.put("QUANTITY", service.getString("QUANTITY"));
-                        contractCost.put("PURCHASE_PERIOD_TYPE", service.getString("PURCHASE_PERIOD_TYPE"));
+
                         contractCost.put("UNIT_PRICE", String.valueOf(unitPriceMap.get(serviceID)));
                         contractCost.put("UNIT_COST", String.valueOf(unitCostMap.get(serviceID)));
 
+                        //采购
+                        contractCost.put("PURCHASE_PERIOD_TYPE", service.getString("PURCHASE_PERIOD_TYPE"));//采购周期
+                        contractCost.put("PURCHASE_START_DATE", service.getString("PURCHASE_START_DATE"));//采购开始日期
+                        contractCost.put("CONTRACT_START_DATE", service.getString("START_DATE"));
+                        contractCost.put("CONTRACT_END_DATE", contract.getString("END_DATE"));//采购结束日期
+
+
                         PRODUCT_ID = AddContractServiceProduct(uc, conn, contractCost);
                     } else {
                         //是否 删除 contractCostId  没有采购 没有拣货时可删除
@@ -1415,10 +1533,16 @@ public class contractService {
                     contractCost.put("serviceID", service.getString("OBJECT_ID"));
                     contractCost.put("CONTRACT_ID", contract.getString("ID"));
                     contractCost.put("QUANTITY", service.getString("QUANTITY"));
-                    contractCost.put("PURCHASE_PERIOD_TYPE", service.getString("PURCHASE_PERIOD_TYPE"));
+
                     contractCost.put("UNIT_PRICE", service.getString("UNIT_PRICE"));
                     contractCost.put("UNIT_COST", service.getString("UNIT_COST"));
 
+                    //采购
+                    contractCost.put("PURCHASE_PERIOD_TYPE", service.getString("PURCHASE_PERIOD_TYPE"));//采购周期
+                    contractCost.put("PURCHASE_START_DATE", service.getString("PURCHASE_START_DATE"));//采购开始日期
+                    contractCost.put("CONTRACT_START_DATE", service.getString("START_DATE"));
+                    contractCost.put("CONTRACT_END_DATE", contract.getString("END_DATE"));//采购结束日期
+
                     PRODUCT_ID = AddContractServiceProduct(uc, conn, contractCost);
                 } else {
                     //是否 删除 contractCostId
@@ -1500,40 +1624,21 @@ public class contractService {
         contractCost.set("IS_SERVICE_PRODUCT", 1);
         //单价
         contractCost.set("UNIT_COST", service.get("UNIT_COST"));
-
         //成本
         contractCost.set("UNIT_PRICE", service.get("UNIT_PRICE"));
 
-        //数量
-        // int quantity = DBSql.getInt(conn, "SELECT COUNT(1) as CNT FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "CNT"); //周期数量
-
-        try {
-            /*
-            String PURCHASE_PERIOD_TYPE = service.get("PURCHASE_PERIOD_TYPE");//采购周期
-            RowMap contractServicePeriod = DBSql.getMap("SELECT MIN(PERIOD_BEGIN_DATE) AS PERIOD_BEGIN_DATE,MAX(PERIOD_END_DATE) AS PERIOD_END_DATE FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID=?", new Object[]{service.get("SERVICE_ID")});//服务开始和结束日期
-            LocalDate beginDate = getLocalDate(contractServicePeriod.get("PERIOD_BEGIN_DATE"));
-            LocalDate endDate = getLocalDate(contractServicePeriod.get("PERIOD_END_DATE"));
-            //计算周期个数
-            if (StringUtils.isNotBlank(PURCHASE_PERIOD_TYPE) && beginDate != null && endDate != null)
-                quantity = calculatePeriods(PURCHASE_PERIOD_TYPE, beginDate, endDate);
-
-             */
-
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
+        BigDecimal EXTENDED_COST = divideToBigDecimal(service.get("UNIT_COST"), contractCost.get("QUANTITY"));
 
-        //contractCost.set("QUANTITY", quantity);
+        // 需要通过采购计算总成本
+        List<PeriodCalculationUtil.Period> periodList = PeriodCalculationUtil.getPeriodList(service.get("PURCHASE_PERIOD_TYPE"), LocalDate.parse(service.get("CONTRACT_START_DATE").substring(0, 10)), LocalDate.parse(service.get("PURCHASE_START_DATE").substring(0, 10)), LocalDate.parse(service.get("CONTRACT_END_DATE").substring(0, 10)), service.get("PURCHASE_PERIOD_TYPE").equals("610"));
 
-        //总成本
-        contractCost.set("EXTENDED_COST", DBSql.getDouble(conn, "SELECT SUM(PERIOD_COST) as COST FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "COST"));
+        BigDecimal rate = periodList.stream().map(period -> period.getRate()).reduce(BigDecimal.ZERO, BigDecimal::add);
+        EXTENDED_COST = EXTENDED_COST.multiply(rate);
+        contractCost.set("EXTENDED_COST", EXTENDED_COST);
 
         //总价格
         contractCost.set("EXTENDED_PRICE", DBSql.getDouble(conn, "SELECT SUM(PERIOD_ADJUSTED_PRICE) as PRICE FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "PRICE"));
 
-        //单价=总价格➗数量
-        contractCost.set("UNIT_COST", divideToBigDecimal(contractCost.get("EXTENDED_COST"), contractCost.get("QUANTITY")));
-        //成本=总成本➗数量
         contractCost.set("UNIT_PRICE", divideToBigDecimal(contractCost.get("EXTENDED_PRICE"), contractCost.get("QUANTITY")));
 
         if (contractCost.isNew()) {

+ 0 - 10
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/event/ivtOrderProcessAfterComplete.java

@@ -7,22 +7,13 @@ import com.actionsoft.bpms.bpmn.engine.model.run.delegate.ProcessInstance;
 import com.actionsoft.bpms.commons.database.RowMap;
 import com.actionsoft.bpms.server.UserContext;
 import com.actionsoft.bpms.util.DBSql;
-import com.actionsoft.bpms.util.TypeUtil;
 import com.actionsoft.sdk.local.SDK;
 import com.actionsoft.sdk.local.api.Logger;
 import com.awspaas.user.apps.donenow_ivt.constant.IVTConstant;
 import com.awspaas.user.apps.donenow_ivt.service.PaymentPlanService;
 import org.apache.commons.lang3.StringUtils;
 
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.time.LocalDate;
-import java.time.Month;
-import java.time.format.DateTimeFormatter;
-import java.time.temporal.ChronoUnit;
-import java.time.temporal.TemporalAdjusters;
 import java.util.*;
-import java.util.stream.Collectors;
 
 public class ivtOrderProcessAfterComplete extends ExecuteListener {
     public String getDescription() {
@@ -396,7 +387,6 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
     }
 
 
-    /*************************************2025年10月23日**************************************************/
 
 
 }