Explorar el Código

周期服务计算成本

zhangyao hace 1 mes
padre
commit
dfddce6e9a

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

@@ -405,9 +405,10 @@ public class contractCreateController {
 
             //如果已经做了服务调整,则不能重新生成服务周期, 跳过就行
 
-            if (DBSql.getInt("SELECT COUNT(1) CNT FROM BO_EU_DNCTT_CONTRACT_SERVICE_SALE_ADJUST WHERE CONTRACT_SERVICE_ID=? ", new Object[]{serviceId}) > 0) {
+            if (DBSql.getInt("SELECT COUNT(1) CNT FROM BO_EU_DNCTT_CONTRACT_SERVICE_SALE_ADJUST WHERE CONTRACT_SERVICE_ID=? ", new Object[]{serviceId}) > 0 && DBSql.getInt("SELECT COUNT(1) CNT FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID=? ", new Object[]{serviceId}) > 0) {
                 continue;
             }
+
             services.add(contraService);
         }
 

+ 54 - 9
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractServiceAdj.java

@@ -12,6 +12,7 @@ import com.awspaas.user.apps.donenow_ctt.PeriodCalculationUtil;
 import org.apache.commons.lang3.StringUtils;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.time.LocalDate;
@@ -122,6 +123,26 @@ public class contractServiceAdj {
 
         String PERIOD_TYPE = contractService.getString("PERIOD_TYPE");
 
+        //一次性收费
+        if (PERIOD_TYPE.equals("609")) {
+
+            BO periodBO = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD").addQuery("CONTRACT_SERVICE_ID =", orgContractService.getId()).detail();
+
+            periodBO.set("PERIOD_PRICE", contractService.get("UNIT_PRICE"));
+            periodBO.set("PARTYA_PERIOD_PRICE", contractService.get("TOTAL_PRICE"));
+            periodBO.set("PERIOD_ADJUSTED_PRICE", contractService.get("QUANTITY"));
+            SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", periodBO);
+
+            orgContractService.set("UNIT_PRICE", contractService.get("UNIT_PRICE"));
+            orgContractService.set("TOTAL_PRICE", contractService.get("TOTAL_PRICE"));
+            orgContractService.set("QUANTITY", contractService.get("QUANTITY"));
+            SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE", orgContractService);
+
+            DBSql.update("UPDATE bo_eu_dnctt_contract_service_period a SET a.PERIOD_COST =( SELECT SUM(b.PLAN_AMOUNT) FROM BO_EU_DNIVT_ORDER_PAYMENT_PLAN b WHERE a.CONTRACT_SERVICE_ID=? AND b.CONTRACT_SERVICE_ID = a.CONTRACT_SERVICE_ID) WHERE a.CONTRACT_SERVICE_ID=? AND EXISTS ( SELECT 1 FROM BO_EU_DNIVT_ORDER_PAYMENT_PLAN b JOIN bo_eu_dnctt_contract_service c ON b.CONTRACT_SERVICE_ID = c.ID WHERE b.CONTRACT_SERVICE_ID = a.CONTRACT_SERVICE_ID AND c.PERIOD_TYPE = 609 AND c.ID=?)", new Object[]{orgContractService.getId(), orgContractService.getId(), orgContractService.getId()});
+            return true;
+        }
+
+
         Connection conn = null;
         try {
             conn = DBSql.open();
@@ -269,7 +290,7 @@ public class contractServiceAdj {
 
             //计算各种不含税金额
             // 确定周期对应的月数
-            int periodMonths;
+            int periodMonths = 1;
             switch (contractService.getString("PERIOD_TYPE")) {
                 case "610":
                     periodMonths = 1; // 按月
@@ -290,14 +311,21 @@ public class contractServiceAdj {
 
 
             //月单价  UNIT_PRICE_MONTH
-            orgContractService.set("SERVICE_UNIT_PRICE", SERVICE_UNIT_PRICE.divide(BigDecimal.valueOf(periodMonths)));
+            // orgContractService.set("SERVICE_UNIT_PRICE", SERVICE_UNIT_PRICE.divide(BigDecimal.valueOf(periodMonths)));
+
+            BigDecimal result = SERVICE_UNIT_PRICE.divide(
+                    BigDecimal.valueOf(periodMonths),
+                    4, // 精度:保留2位小数
+                    RoundingMode.HALF_UP // 舍入模式:四舍五入
+            );
+            orgContractService.set("SERVICE_UNIT_PRICE", result);
 
             RowMap taxCate = DBSql.getMap("SELECT OID,NAME,ORGID,GENERAL_TABLE_ID,EXT1,CLOSED,IS_ACTIVE FROM BO_EU_DND_GENERAL WHERE  GENERAL_TABLE_ID=44 AND ORGID=? AND OID=?", new Object[]{uc.getCompanyModel().getId(), orgContractService.getString("TAX_CATEGORY_ID")}); //税种
 
             if (taxCate != null) {
                 BigDecimal taxRate = new BigDecimal(taxCate.getString("EXT1"));
                 //月不含税单价 UNIT_PRICE_MONTH_NOTAX
-                BigDecimal taxExcluded = SERVICE_UNIT_PRICE.divide(BigDecimal.valueOf(periodMonths)).divide(BigDecimal.ONE.add(taxRate), 4, BigDecimal.ROUND_HALF_UP); // 保留4位小数
+                BigDecimal taxExcluded = SERVICE_UNIT_PRICE.divide(BigDecimal.valueOf(periodMonths), 4, BigDecimal.ROUND_HALF_UP).divide(BigDecimal.ONE.add(taxRate), 4, BigDecimal.ROUND_HALF_UP); // 保留4位小数
                 orgContractService.set("SERVICE_UNIT_PRICE_NOTAX", taxExcluded);
 
                 //周期不含税单价 UNIT_PRICE_NOTAX
@@ -319,7 +347,7 @@ public class contractServiceAdj {
             SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE", orgContractService, conn);
 
             conn.commit();
-            return true;
+
         } catch (SQLException e) {
 
             e.printStackTrace();
@@ -328,11 +356,15 @@ public class contractServiceAdj {
             } catch (SQLException e1) {
                 e1.printStackTrace();
             }
-            return false;
+
         } finally {
             if (conn != null)
                 DBSql.close(conn);
         }
+
+        //分摊采购成本
+        paySplitServiceMonth(uc, orgContractService.getId());
+        return true;
     }
 
     /**
@@ -344,6 +376,11 @@ public class contractServiceAdj {
      */
     public String editServiceSaleEndDate(UserContext uc, String serviceId, LocalDate newEndDate) {
 
+        //一次性收费,无需修改
+        if (DBSql.getString("select PERIOD_TYPE from BO_EU_DNCTT_CONTRACT_SERVICE where CONTRACT_SERVICE_ID=?", new Object[]{serviceId}).equals("609")) {
+            return "无需修改";
+        }
+
         RowMap lastServicePeriod = DBSql.getMap("SELECT * FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID=? ORDER BY PERIOD_BEGIN_DATE DESC", new Object[]{serviceId});//最后一笔服务周期
 
 
@@ -485,13 +522,16 @@ public class contractServiceAdj {
      * @return
      */
     public String editServicePurchaseEndDate(UserContext uc, String serviceId, LocalDate newEndDate) {
-
         RowMap lastServicePeriod = DBSql.getMap("SELECT * FROM BO_EU_DNIVT_ORDER_PAYMENT_PLAN WHERE CONTRACT_SERVICE_ID=? ORDER BY PERIOD_BEGIN_DATE DESC", new Object[]{serviceId});//最后一笔服务周期
 
+        //一次性收费,无需修改
+        if (DBSql.getString("select PURCHASE_PERIOD_TYPE from BO_EU_DNCTT_CONTRACT_SERVICE where CONTRACT_SERVICE_ID=?", new Object[]{serviceId}).equals("609")) {
+            return "无需修改";
+        }
+
         LocalDate PERIOD_BEGIN_DATE = TypeUtil.convert(lastServicePeriod.get("PERIOD_BEGIN_DATE"), LocalDate.class);
         LocalDate PERIOD_END_DATE = TypeUtil.convert(lastServicePeriod.get("PERIOD_END_DATE"), LocalDate.class);
 
-
         if (PERIOD_END_DATE.equals(newEndDate))
             return "无需修改";
 
@@ -602,7 +642,8 @@ public class contractServiceAdj {
         if (StringUtils.isBlank(boName)) {
             boName = "BO_EU_DNIVT_ORDER_PAYMENT_PLAN";
         } else {
-            PERIOD_TYPE = "610";//按月
+            if (PERIOD_TYPE.equals("609") == false)
+                PERIOD_TYPE = "610";//按月
         }
 
         LocalDate EFFECTIVE_DATE = getLocalDate(contractService.get("PURCHASE_START_DATE"));//服务生效日期
@@ -620,7 +661,11 @@ public class contractServiceAdj {
             conn.setAutoCommit(false);
 
             //生效日期之后的服务周期删除
-            DBSql.update(conn, "DELETE FROM " + boName + " WHERE  CONTRACT_SERVICE_ID=? and PERIOD_BEGIN_DATE >=? and (PAY_AMOUNT=0 or PAY_AMOUNT is NULL)", new Object[]{contractService.get("CONTRACT_SERVICE_ID"), LocalDateYYYYMMDD(EFFECTIVE_DATE)});
+            if (PERIOD_TYPE.equals("609")) {
+                DBSql.update(conn, "DELETE FROM " + boName + " WHERE  CONTRACT_SERVICE_ID=? ", new Object[]{contractService.get("CONTRACT_SERVICE_ID")});
+            } else {
+                DBSql.update(conn, "DELETE FROM " + boName + " WHERE  CONTRACT_SERVICE_ID=? and PERIOD_BEGIN_DATE >=? and (PAY_AMOUNT=0 or PAY_AMOUNT is NULL)", new Object[]{contractService.get("CONTRACT_SERVICE_ID"), LocalDateYYYYMMDD(EFFECTIVE_DATE)});
+            }
 
             String lastPeriodId = DBSql.getString(conn, "select ID from " + boName + " where CONTRACT_SERVICE_ID=? and PERIOD_END_DATE >=? order by PERIOD_BEGIN_DATE asc", new Object[]{contractService.get("CONTRACT_SERVICE_ID"), LocalDateYYYYMMDD(EFFECTIVE_DATE)});
 

+ 5 - 2
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/service/PaymentPlanService.java

@@ -157,7 +157,7 @@ public class PaymentPlanService {
                 break;
         }
 
-        if (boName.equals("BO_EU_DNIVT_ORDER_PAYMENT_PLAN_MONTH"))//按月采购
+        if (boName.equals("BO_EU_DNIVT_ORDER_PAYMENT_PLAN_MONTH") && !RULE_CATE.equals("609"))//按月采购
             RULE_CATE = "610";
 
         LocalDate PERIOD_BEGIN_DATE = service.get("PURCHASE_START_DATE", LocalDate.class);
@@ -183,9 +183,12 @@ public class PaymentPlanService {
                 SDK.getBOAPI().createDataBO(boName, paymentPlan, uc, conn);
             }
 
+            //一次性收费
+            DBSql.update("UPDATE bo_eu_dnctt_contract_service_period a SET a.PERIOD_COST =( SELECT SUM(b.PLAN_AMOUNT) FROM BO_EU_DNIVT_ORDER_PAYMENT_PLAN b WHERE a.CONTRACT_SERVICE_ID=? AND b.CONTRACT_SERVICE_ID = a.CONTRACT_SERVICE_ID) WHERE a.CONTRACT_SERVICE_ID=? AND EXISTS ( SELECT 1 FROM BO_EU_DNIVT_ORDER_PAYMENT_PLAN b JOIN bo_eu_dnctt_contract_service c ON b.CONTRACT_SERVICE_ID = c.ID WHERE b.CONTRACT_SERVICE_ID = a.CONTRACT_SERVICE_ID AND c.PERIOD_TYPE = 609 AND c.ID=?)", new Object[]{SERVICE_ID, SERVICE_ID, SERVICE_ID});
+
             if (boName.equals("BO_EU_DNIVT_ORDER_PAYMENT_PLAN")) {
                 createServicePaymentPlan(uc, orderId, SERVICE_ID, VENDOR_ACCOUNT_ID, orderProduct, "BO_EU_DNIVT_ORDER_PAYMENT_PLAN_MONTH", conn);
-                paySplitServiceMonth(uc, SERVICE_ID);
+                //paySplitServiceMonth(uc, SERVICE_ID);
             }
 
             return;