瀏覽代碼

Merge branch 'master' of http://210.51.45.41:3000/itcat_admin/aws_donenow

HULEI 1 月之前
父節點
當前提交
7135819d85

+ 11 - 2
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/controller/contractCreateController.java

@@ -453,12 +453,15 @@ public class contractCreateController {
     @Mapping(value = "com.awspaas.user.apps.donenow_ctt.contract_service_cost")
     public ResponseObject serviceCost(UserContext uc, String contractId, String serviceIds) {
 
-        if (StringUtils.isBlank(contractId)) return ResponseObject.newErrResponse("请选择合同");
-        if (StringUtils.isBlank(serviceIds)) return ResponseObject.newErrResponse("请选择合同服务");
+        if (StringUtils.isBlank(contractId))
+            return ResponseObject.newErrResponse("请选择合同");
+        if (StringUtils.isBlank(serviceIds))
+            return ResponseObject.newErrResponse("请选择合同服务");
 
         BO contractBO = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT", contractId);
 
         // 1、合同开始日期或结束日期变化
+        /*
         LocalDate START_DATE = getLocalDate(contractBO.get("START_DATE"));//服务开始日期
         LocalDate END_DATE = getLocalDate(contractBO.get("END_DATE"));//合同结束日期
 
@@ -470,10 +473,14 @@ public class contractCreateController {
             return ResponseObject.newErrResponse("合同开始日期不能大于结束日期");
         }
 
+         */
+
         List<BO> services = new ArrayList<>();
         for (String serviceId : serviceIds.split(",")) {
             BO contraService = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").addQuery("CONTRACT_ID =", contractId).addQuery("ID =", serviceId).detail();
 
+            /*
+
             LocalDate EFFECTIVE_DATE = getLocalDate(contraService.get("PURCHASE_START_DATE"));//服务生效日期
             if (EFFECTIVE_DATE == null) {
                 return ResponseObject.newErrResponse("请先设置采购单开始日期");
@@ -482,6 +489,8 @@ public class contractCreateController {
                 return ResponseObject.newErrResponse("采购单开始日期必须在合同计费开始日期和结束日期之间");
             }
 
+            */
+
             String NEED_PURCHASE = contraService.getString("NEED_PURCHASE");
             if (NEED_PURCHASE.equals("1") == false) {
                 return ResponseObject.newErrResponse("请选择需要采购的服务");

+ 25 - 9
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractService.java

@@ -148,7 +148,11 @@ public class contractService {
                         contractBO.set("NO", contractNo);
                     }
                 } else {
-                    contractNo = SDK.getRuleAPI().executeAtScript("@sequenceYear(@companyId_contract,5)");
+
+                    // contractNo = SDK.getRuleAPI().executeAtScript("@sequence(@companyId_contract_@year,5)");
+                    String varname = uc.getCompanyModel().getId() + "_contract_" + LocalDate.now().getYear();
+                    contractNo = SDK.getRuleAPI().executeAtScript("@sequence(" + varname + ",5)");
+
                     String DISTRICT_ID = DBSql.getString("select DISTRICT_ID from BO_EU_DNCRM_ACCOUNT where ID=?", new Object[]{contractBO.getString("ACCOUNT_ID")});
                     String cssx = "SH";//城市缩写
                     if (StringUtils.isNotBlank(DISTRICT_ID)) {
@@ -1962,7 +1966,8 @@ public class contractService {
                     contractCost.put("CALC_METHOD_1STYEAR", service.getString("CALC_METHOD_1STYEAR"));
                     contractCost.put("MONTH_1STQUARTER", service.getString("MONTH_1STQUARTER"));
 
-                    PRODUCT_ID = AddContractServiceProduct(uc, conn, contractCost);
+
+                    PRODUCT_ID = AddContractServiceProduct(uc, conn, contractCost, service.asMap());
                 } else {
                     //是否 删除 contractCostId  没有采购 没有拣货时可删除
                     if (DBSql.getInt(conn, "select count(*) from BO_EU_DNCTT_CONTRACT_COST_PRODUCT where CONTRACT_COST_ID=?", new Object[]{contractCostId}) == 0 && DBSql.getInt(conn, "select count(*) from BO_EU_DNIVT_ORDER_PRODUCT where CONTRACT_COST_ID=?", new Object[]{contractCostId}) == 0) {
@@ -2003,7 +2008,7 @@ public class contractService {
                 contractCost.put("CALC_METHOD_1STYEAR", service.getString("CALC_METHOD_1STYEAR"));
                 contractCost.put("MONTH_1STQUARTER", service.getString("MONTH_1STQUARTER"));
 
-                PRODUCT_ID = AddContractServiceProduct(uc, conn, contractCost);
+                PRODUCT_ID = AddContractServiceProduct(uc, conn, contractCost, service.asMap());
             } else {
                 //是否 删除 contractCostId
                 //是否 删除 contractCostId  没有采购 没有拣货时可删除
@@ -2049,7 +2054,7 @@ public class contractService {
      * @param service
      * @return
      */
-    private String AddContractServiceProduct(UserContext uc, Connection conn, Map<String, String> service) {
+    private String AddContractServiceProduct(UserContext uc, Connection conn, Map<String, String> service, Map<String, Object> serviceBO) {
         contractServiceLogger.info("新增合同产品");
         System.out.println(service);
         BO contractCost = null;
@@ -2079,19 +2084,29 @@ public class contractService {
                 contractCost.set("COST_CODE_NAME", DBSql.getString("select NAME from BO_EU_DND_COST_CODE where OID=?", new Object[]{product.getString("COST_CODE_ID")}));
             }
         }
+
+        //服务表上面 采购税种
+        String PURCHASE_TAX_CATEGORY_ID = serviceBO.get("PURCHASE_TAX_CATEGORY_ID") == null ? null : serviceBO.get("PURCHASE_TAX_CATEGORY_ID").toString();
+        if (StringUtils.isBlank(PURCHASE_TAX_CATEGORY_ID))
+            PURCHASE_TAX_CATEGORY_ID = serviceBO.get("TAX_CATEGORY_ID") == null ? null : serviceBO.get("TAX_CATEGORY_ID").toString();
+
+        contractCost.set("TAX_CATEGORY_ID", PURCHASE_TAX_CATEGORY_ID);
+
         contractCost.set("IS_SERVICE_PRODUCT", 1);
         //单价
         contractCost.set("UNIT_COST", service.get("UNIT_COST"));
         //成本
         contractCost.set("UNIT_PRICE", service.get("UNIT_PRICE"));
 
-        BigDecimal EXTENDED_COST = divideToBigDecimal(service.get("UNIT_COST"), contractCost.get("QUANTITY"));
+        contractCost.set("EXTENDED_COST", multiply(service.get("UNIT_COST"), service.get("QUANTITY")));//总成本
+        contractCost.set("EXTENDED_PRICE", multiply(service.get("UNIT_PRICE"), service.get("QUANTITY")));//总价
 
-        contractServiceLogger.info("计算合同成本周期:" + service);
 
+        // contractServiceLogger.info("计算合同成本周期:" + service);
         // 需要通过采购计算总成本
         // 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"), true, -1);
-
+//2025年11月5日 服务产品的 单价取采购单价、采购总价
+        /*
         List<PeriodCalculationUtil.Period> periodList = PeriodCalculationUtil.getPeriodListByConfig(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_CALC_METHOD_1STPERIOD"), service.get("CALC_METHOD_1STYEAR"), service.get("MONTH_1STQUARTER"));
 
         if (periodList != null && periodList.size() > 0) {
@@ -2139,7 +2154,7 @@ public class contractService {
         } catch (Exception e) {
 
         }
-
+*/
 
         if (contractCost.isNew()) {
             //成本子类:合同成本
@@ -2164,7 +2179,8 @@ public class contractService {
      */
     public static BigDecimal multiply(Object obj1, Object obj2) {
         try {
-            if (obj1 == null || obj2 == null) return BigDecimal.ZERO;
+            if (obj1 == null || obj2 == null)
+                return BigDecimal.ZERO;
 
             BigDecimal num1 = new BigDecimal(String.valueOf(obj1));
             BigDecimal num2 = new BigDecimal(String.valueOf(obj2));

+ 76 - 16
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/controller/ivtOrderController.java

@@ -12,6 +12,7 @@ import com.actionsoft.bpms.server.UserContext;
 import com.actionsoft.bpms.server.bind.annotation.Controller;
 import com.actionsoft.bpms.server.bind.annotation.Mapping;
 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.alibaba.fastjson.JSON;
@@ -27,12 +28,16 @@ import java.math.RoundingMode;
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.text.SimpleDateFormat;
+import java.time.LocalDate;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import static com.awspaas.user.apps.donenow_ivt.service.PaymentPlanService.toBigDecimal;
+
 @Controller
 public class ivtOrderController {
     private static final Logger ivtLogger = SDK.getLogAPI().getLogger(ivtOrderController.class);//记录日志
+
     /**
      * 添加供应商产品
      * @param uc
@@ -621,8 +626,7 @@ public class ivtOrderController {
         sql = sql.substring(0, sql.length() - 1) + ")";
         List<RowMap> costList = DBSql.getMaps(sql, Arrays.stream(serviceArr).toArray());
 
-        if (costList.isEmpty())
-            return ResponseObject.newErrResponse("没有找到对应的合同产品");
+        if (costList.isEmpty()) return ResponseObject.newErrResponse("没有找到对应的合同产品");
 
 
         String costIds = costList.stream().map(cost -> cost.getString("ID")).collect(Collectors.joining(","));
@@ -657,6 +661,7 @@ public class ivtOrderController {
             ivtLogger.info("接收到的costIds参数: " + costIds);
 
 // ========== 新增:初始化TAX_CATEGORY_ID与税率的映射关系 ==========
+            /*
             Map<String, BigDecimal> taxRateMap = new HashMap<>();
             taxRateMap.put("597", new BigDecimal("0.00"));  // 增值税-0
             taxRateMap.put("598", new BigDecimal("0.01"));  // 增值税-1
@@ -666,6 +671,13 @@ public class ivtOrderController {
             taxRateMap.put("10097", new BigDecimal("0.09")); // 增值税-9
             taxRateMap.put("14138", new BigDecimal("0.13")); // 增值税-13
 
+             */
+            List<RowMap> taxCateList = DBSql.getMaps("SELECT OID,NAME,ORGID,GENERAL_TABLE_ID,EXT1,CLOSED,IS_ACTIVE FROM BO_EU_DND_GENERAL WHERE  GENERAL_TABLE_ID=44 AND ORGID=? ", new Object[]{uc.getCompanyModel().getId()});
+            Map<String, BigDecimal> taxRateMap = new HashMap<>();
+            for (RowMap taxCate : taxCateList) {
+                taxRateMap.put(taxCate.getString("OID"), toBigDecimal(taxCate.getDouble("EXT1")));
+            }
+
             String[] costIdArr = costIds.split(",");
             String sql = "SELECT * FROM BO_EU_DNCTT_CONTRACT_COST WHERE ID IN(";
             for (int i = 0; i < costIdArr.length; i++) {
@@ -780,14 +792,9 @@ public class ivtOrderController {
                 }
 
                 BigDecimal unitCost = new BigDecimal(unitCostStr);
-                BigDecimal unitCostNotax = unitCost.divide(
-                        BigDecimal.ONE.add(taxRate),
-                        2,
-                        RoundingMode.HALF_UP
-                );
-
-                BigDecimal costTotalNotax = unitCostNotax.multiply(new BigDecimal(purchaseQuantity))
-                        .setScale(2, RoundingMode.HALF_UP);
+                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("NAME", cost.getString("NAME"));
                 purchaseOrderProduct.set("PRODUCT_ID", cost.getString("PRODUCT_ID"));
@@ -910,11 +917,9 @@ public class ivtOrderController {
 
         List<BO> orderProducts = SDK.getBOAPI().query("BO_EU_DNIVT_ORDER_PRODUCT").addQuery("BINDID =", bindId).list();
 
-        if (order.isEnd())
-            return ResponseObject.newErrResponse("采购订单已结束,不能删除");
+        if (order.isEnd()) return ResponseObject.newErrResponse("采购订单已结束,不能删除");
 
-        if (order.getString("ISEND").equals("1"))
-            return ResponseObject.newErrResponse("采购订单已结束,不能删除");
+        if (order.getString("ISEND").equals("1")) return ResponseObject.newErrResponse("采购订单已结束,不能删除");
 
         SDK.getProcessAPI().deleteById(bindId, uc.getUID());
 
@@ -923,6 +928,11 @@ public class ivtOrderController {
 
             if (StringUtils.isNotBlank(costProductID))
                 DBSql.update("delete from BO_EU_DNCTT_CONTRACT_COST_PRODUCT where ID=?", new Object[]{costProductID});
+
+            //如果是合同服务产生采购项
+            if (DBSql.getString("select IS_SERVICE_PRODUCT from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{op.getString("CONTRACT_COST_ID")}).equals("1")) {
+                DBSql.update("delete from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{op.getString("CONTRACT_COST_ID")});
+            }
         }
 
         SDK.getBOAPI().removeByBindId("BO_EU_DNIVT_ORDER", bindId);
@@ -940,12 +950,62 @@ public class ivtOrderController {
     @Mapping("com.awspaas.user.apps.donenow_ivt.createPaymentPlan")
     public ResponseObject createPaymentPlan(UserContext uc, String orderId) {
 
+        //校验
+        BO purchaseOrder = SDK.getBOAPI().get("BO_EU_DNIVT_ORDER", orderId);
+        List<BO> orderProducts = SDK.getBOAPI().query("BO_EU_DNIVT_ORDER_PRODUCT").bindId(purchaseOrder.getBindId()).list();
+
+
+        for (BO orderProduct : orderProducts) {
+            if (StringUtils.isNotBlank(orderProduct.getString("CONTRACT_COST_ID"))) {
+                String SERVICE_ID = DBSql.getString("select SERVICE_ID from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{orderProduct.getString("CONTRACT_COST_ID")});
+                //关联服务
+                if (StringUtils.isNotBlank(SERVICE_ID)) {
+
+                    BO service = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_SERVICE", SERVICE_ID);
+
+                    String RULE_CATE = service.getString("PURCHASE_PERIOD_TYPE");//采购周期
+
+                    //PERIOD_TYPE_ONCE = "609";       // 一次性收费
+                    if (RULE_CATE.equals("609") == false) {
+
+                        LocalDate PERIOD_BEGIN_DATE = service.get("PURCHASE_START_DATE", LocalDate.class);
+
+                        LocalDate START_DATE = TypeUtil.convert(DBSql.getString("select START_DATE from BO_EU_DNCTT_CONTRACT where ID=?", new Object[]{service.getString("CONTRACT_ID")}).substring(0, 10), LocalDate.class);
+
+                        LocalDate PERIOD_END_DATE = TypeUtil.convert(DBSql.getString("select END_DATE from BO_EU_DNCTT_CONTRACT where ID=?", new Object[]{service.getString("CONTRACT_ID")}).substring(0, 10), LocalDate.class);
+
+                        //采购单开始日期
+                        if (service.get("PURCHASE_START_DATE") != null) {
+                            START_DATE = TypeUtil.convert(service.get("PURCHASE_START_DATE").toString().substring(0, 10), LocalDate.class);
+                        }
+
+                        String PURCHASE_CALC_METHOD_1STPERIOD = service.getString("PURCHASE_CALC_METHOD_1STPERIOD");
+
+                        if (StringUtils.isBlank(RULE_CATE) || StringUtils.isBlank(PURCHASE_CALC_METHOD_1STPERIOD)) {
+                            return ResponseObject.newErrResponse("采购周期规则或采购计划计算方式未设置");
+                        }
+
+                        if (PERIOD_BEGIN_DATE == null || PERIOD_END_DATE == null || START_DATE == null || PERIOD_BEGIN_DATE.isAfter(PERIOD_END_DATE) || START_DATE.isAfter(PERIOD_END_DATE)) {
+                            return ResponseObject.newErrResponse("采购周期开始日期或结束日期未设置");
+                        }
+
+
+                        if (DBSql.getInt("select count(1) as cnt from  BO_EU_DNIVT_ORDER_PAYMENT_PLAN where ORDER_ID = ? and CONTRACT_COST_ID=? and CONTRACT_SERVICE_ID=?  AND PAY_AMOUNT is NOT null AND PAY_AMOUNT<>0", new Object[]{orderId, orderProduct.getString("CONTRACT_COST_ID"), SERVICE_ID}) > 0) {
+                            return ResponseObject.newErrResponse("付款计划已经开始付款,不能重新生成");
+                        }
+                    }
+                }
+            }
+        }
+
         PaymentPlanService.getInstance().createPaymentPlan(uc, orderId);
 
+        //检查 是否创建成功
+        if (DBSql.getInt("select count(1) CNT from BO_EU_DNIVT_ORDER_PAYMENT_PLAN where ORDER_ID=?", new Object[]{orderId}) == 0)
+            return ResponseObject.newErrResponse("创建付款计划失败");
+
         return ResponseObject.newOkResponse();
     }
 
 
-
-
 }

+ 4 - 1
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/event/ivtOrderFormAfter.java

@@ -56,7 +56,10 @@ public class ivtOrderFormAfter extends ExecuteListener {
         logger.info("采购订单编号:" + purchaseOrderNo);
         if (StringUtils.isBlank(purchaseOrderNo) || purchaseOrderNo.indexOf("CHT") != 0) {
 
-            purchaseOrderNo = SDK.getRuleAPI().executeAtScript("@sequenceYear(@companyId_purchase_order,4,0,130)", processExecutionContext.getUserContext());
+            // purchaseOrderNo = SDK.getRuleAPI().executeAtScript("@sequenceYear(@companyId_purchase_order,4,0,130)", processExecutionContext.getUserContext());
+
+            String varname = processExecutionContext.getUserContext().getCompanyModel().getId() + "_ivtorder_" + LocalDate.now().getYear();
+            purchaseOrderNo = SDK.getRuleAPI().executeAtScript("@sequence(" + varname + ",5)");
 
             String DISTRICT_ID = DBSql.getString("select DISTRICT_ID from BO_EU_DNCRM_ACCOUNT where ID=?", new Object[]{orderBO.getString("VENDOR_ACCOUNT_ID")});
 

+ 47 - 28
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/service/PaymentPlanService.java

@@ -65,25 +65,29 @@ public class PaymentPlanService {
                 //关联服务
                 if (StringUtils.isNotBlank(SERVICE_ID)) {
                     isOnlyOne = false;
-                    if (DBSql.getInt("select count(1) as cnt from  BO_EU_DNIVT_ORDER_PAYMENT_PLAN where ORDER_ID = ? and CONTRACT_COST_ID=? and CONTRACT_SERVICE_ID=?  AND PAY_AMOUNT is NOT null AND PAY_AMOUNT<>0", new Object[]{orderId, orderProduct.getString("CONTRACT_COST_ID"), SERVICE_ID}) > 0) {
-                        continue;
-                    }
-                    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(sql, new Object[]{orderId, orderProduct.getString("CONTRACT_COST_ID"), SERVICE_ID});
 
                     logger.info("生成付款计划SERVICE_ID--" + SERVICE_ID);
-
                     BO service = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_SERVICE", SERVICE_ID);
-                    String BILL_METHOD_ID = null;//计费方式  4601:自然月  4602:实际月
-                    if (service.getString("OBJECT_TYPE").equals("2"))//服务包
-                    {
-                        BILL_METHOD_ID = DBSql.getString("select BILL_METHOD_ID from BO_EU_DNIVT_SERVICE_BUNDLE where ID=?", new Object[]{service.getString("OBJECT_ID")});
-                    } else {
-                        BILL_METHOD_ID = DBSql.getString("select BILL_METHOD_ID from BO_EU_DNIVT_SERVICE where ID=?", new Object[]{service.getString("OBJECT_ID")});
-                    }
-
                     String RULE_CATE = service.getString("PURCHASE_PERIOD_TYPE");//采购周期
                     LocalDate PERIOD_BEGIN_DATE = service.get("PURCHASE_START_DATE", LocalDate.class);
+                    BigDecimal TOTAL_COST = toBigDecimal(service.get("TOTAL_COST"));//周期成本
+                    if (RULE_CATE.equals("609")) {   //一次性付费
+
+                        ProcessInstance processInstance = SDK.getProcessAPI().createProcessInstance("obj_5cb4ae4a42944fd0a9a284ff4c64c65d", uc.getUID(), "付款计划");
+
+                        BO paymentPlan = new BO();
+                        paymentPlan.setBindId(processInstance.getId());
+                        paymentPlan.set("ORDER_ID", orderId);
+                        paymentPlan.set("PLAN_DATE", PERIOD_BEGIN_DATE);
+                        paymentPlan.set("PLAN_AMOUNT", TOTAL_COST);
+                        paymentPlan.set("REMAIN_AMOUNT", paymentPlan.get("PLAN_AMOUNT"));
+                        paymentPlan.set("CONTRACT_COST_ID", orderProduct.getString("CONTRACT_COST_ID"));
+                        paymentPlan.set("CONTRACT_SERVICE_ID", service.getId());
+                        paymentPlan.set("PAY_DESC", orderProduct.getString("NAME"));
+                        paymentPlan.set("ACCOUNT_PAYEE", VENDOR_ACCOUNT_ID);//收款单位
+                        SDK.getBOAPI().create("BO_EU_DNIVT_ORDER_PAYMENT_PLAN", paymentPlan, processInstance, uc);
+                        continue;
+                    }
 
                     LocalDate START_DATE = TypeUtil.convert(DBSql.getString("select START_DATE from BO_EU_DNCTT_CONTRACT where ID=?", new Object[]{service.getString("CONTRACT_ID")}).substring(0, 10), LocalDate.class);
 
@@ -94,20 +98,35 @@ public class PaymentPlanService {
                         START_DATE = TypeUtil.convert(service.get("PURCHASE_START_DATE").toString().substring(0, 10), LocalDate.class);
                     }
 
-                    //  List<PERIOD> periods = getPeriodList(RULE_CATE, PERIOD_BEGIN_DATE, START_DATE, PERIOD_END_DATE, StringUtils.isNotBlank(BILL_METHOD_ID) && BILL_METHOD_ID.equals("4601"));
 
-                    //统一处理
-                    // List<PeriodCalculationUtil.Period> periods = PeriodCalculationUtil.getPeriodList(RULE_CATE, PERIOD_BEGIN_DATE, START_DATE, PERIOD_END_DATE, true, true, -1);
+                    String PURCHASE_CALC_METHOD_1STPERIOD = service.getString("PURCHASE_CALC_METHOD_1STPERIOD");
+
+                    if (StringUtils.isBlank(RULE_CATE) || StringUtils.isBlank(PURCHASE_CALC_METHOD_1STPERIOD)) {
+                        continue;
+                    }
+
+                    if (PERIOD_BEGIN_DATE == null || PERIOD_END_DATE == null || PERIOD_BEGIN_DATE.isAfter(PERIOD_END_DATE)) {
+                        continue;
+                    }
+
+
+                    if (DBSql.getInt("select count(1) as cnt from  BO_EU_DNIVT_ORDER_PAYMENT_PLAN where ORDER_ID = ? and CONTRACT_COST_ID=? and CONTRACT_SERVICE_ID=?  AND PAY_AMOUNT is NOT null AND PAY_AMOUNT<>0", new Object[]{orderId, orderProduct.getString("CONTRACT_COST_ID"), SERVICE_ID}) > 0) {
+                        continue;
+                    }
+
+                    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(sql, new Object[]{orderId, orderProduct.getString("CONTRACT_COST_ID"), SERVICE_ID});
 
-                    List<PeriodCalculationUtil.Period> periods = PeriodCalculationUtil.getPeriodListByConfig(RULE_CATE, PERIOD_BEGIN_DATE, START_DATE, PERIOD_END_DATE, service.getString("PURCHASE_CALC_METHOD_1STPERIOD"), service.getString("CALC_METHOD_1STYEAR"), service.getString("MONTH_1STQUARTER"));
+                    List<PeriodCalculationUtil.Period> periods = PeriodCalculationUtil.getPeriodListByConfig(RULE_CATE, PERIOD_BEGIN_DATE, START_DATE, PERIOD_END_DATE, PURCHASE_CALC_METHOD_1STPERIOD, service.getString("CALC_METHOD_1STYEAR"), service.getString("MONTH_1STQUARTER"));
 
                     if (periods.isEmpty())
                         continue;
 
+                    //2025年11月5日
+                    /*
                     BigDecimal COST_TOTAL = orderProduct.get("COST_TOTAL", BigDecimal.class);//总金额
-
                     BigDecimal RATE_TOTAL = periods.stream().map(period -> period.getRate()).reduce(BigDecimal.ZERO, BigDecimal::add);
-
+                     */
 
                     BigDecimal UNIT_COST_1STMONTH = BigDecimal.ZERO;
                     //首月总价需要单独计算   613	按年支付	4591	开通日期所在月
@@ -116,16 +135,16 @@ public class PaymentPlanService {
                         if (period.getRate().compareTo(BigDecimal.ONE) < 0) {
                             UNIT_COST_1STMONTH = toBigDecimal(service.get("UNIT_COST_1STMONTH"));
                             UNIT_COST_1STMONTH = period.getRate().multiply(BigDecimal.valueOf(12)).multiply(UNIT_COST_1STMONTH);
-                            RATE_TOTAL = RATE_TOTAL.subtract(period.getRate());//减去首月
-                            COST_TOTAL = COST_TOTAL.subtract(UNIT_COST_1STMONTH);//减去首月
+                            //RATE_TOTAL = RATE_TOTAL.subtract(period.getRate());//减去首月
+                            //COST_TOTAL = COST_TOTAL.subtract(UNIT_COST_1STMONTH);//减去首月
                         }
                     }
 
+                    // if (RATE_TOTAL.equals(BigDecimal.ZERO) || COST_TOTAL == null || COST_TOTAL.equals(BigDecimal.ZERO))
+                    //    continue;
+                    // BigDecimal UNIT_COST = COST_TOTAL.divide(RATE_TOTAL, 10, RoundingMode.HALF_UP);
 
-                    if (RATE_TOTAL.equals(BigDecimal.ZERO) || COST_TOTAL == null || COST_TOTAL.equals(BigDecimal.ZERO))
-                        continue;
 
-                    BigDecimal UNIT_COST = COST_TOTAL.divide(RATE_TOTAL, 10, RoundingMode.HALF_UP);
                     int i = 0;
                     for (PeriodCalculationUtil.Period period : periods) {
                         total++;
@@ -151,13 +170,13 @@ public class PaymentPlanService {
                                     continue;
                                 }
                             } else {
-                                paymentPlan.set("PLAN_AMOUNT", UNIT_COST.multiply(period.getRate()));
+                                paymentPlan.set("PLAN_AMOUNT", TOTAL_COST.multiply(period.getRate()));
                             }
                         } else {
                             if (i == 2 && UNIT_COST_1STMONTH.compareTo(BigDecimal.ZERO) > 0) {
-                                paymentPlan.set("PLAN_AMOUNT", UNIT_COST.multiply(period.getRate()).add(UNIT_COST_1STMONTH));
+                                paymentPlan.set("PLAN_AMOUNT", TOTAL_COST.multiply(period.getRate()).add(UNIT_COST_1STMONTH));
                             } else {
-                                paymentPlan.set("PLAN_AMOUNT", UNIT_COST.multiply(period.getRate()));
+                                paymentPlan.set("PLAN_AMOUNT", TOTAL_COST.multiply(period.getRate()));
                             }
                         }