Explorar el Código

服务调整--一次性付费

zhangyao hace 2 semanas
padre
commit
12f02ad513

+ 8 - 4
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/controller/contractCreateController.java

@@ -455,6 +455,10 @@ public class contractCreateController {
                 continue;
             }
 
+            if (DBSql.getInt("SELECT COUNT(1) CNT FROM BO_EU_DNCTT_CONTRACT_SERVICE_SALE_ADJUST WHERE CONTRACT_SERVICE_ID=? ", new Object[]{serviceId}) > 0) {
+                return ResponseObject.newErrResponse("做过调整销售,请执行服务调整!!!");
+            }
+
             services.add(contraService);
         }
 
@@ -476,9 +480,9 @@ public class contractCreateController {
                 contractService.getInstance().AddService(uc, conn, dto, contraService);//保存合同
                 contractService.getInstance().AddContractServiceProductOne(uc, dto, contraService, conn);//新增服务或者服务包--关联产品
                 if (DBSql.getInt(conn, "SELECT count(1) FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID=? ", new Object[]{contraService.get("ID")}) == 0) {
-                    errMsg.append(contraService.get("NAME") + "生成服务周期失败");
+                    errMsg.append(contraService.get("NAME") + "生成服务周期失败");
                 } else {
-                    succMsg.append(contraService.get("NAME") + "生成服务周期成功");
+                    succMsg.append(contraService.get("NAME") + "生成服务周期成功");
                 }
             }
 
@@ -622,7 +626,7 @@ public class contractCreateController {
     @Mapping(value = "com.awspaas.user.apps.donenow_ctt.contract_service_exec", session = false, noSessionEvaluate = "无安全隐患", noSessionReason = "批量生产")
     public String contractServicExec() {
 
-        List<RowMap> services = DBSql.getMaps("SELECT b.* FROM BO_EU_DNCTT_CONTRACT a JOIN bo_eu_dnctt_contract_service b ON b.CONTRACT_ID=a.ID WHERE b.BILL_TO_ACCOUNT_ID = 'e9358570-f6f3-4a43-9268-ae265f3cc030' AND b.`NAME` LIKE '%普通宽带%' AND a.CLOSED=0");
+        List<RowMap> services = DBSql.getMaps("SELECT b.* FROM BO_EU_DNCTT_CONTRACT a JOIN bo_eu_dnctt_contract_service b ON b.CONTRACT_ID=a.ID WHERE b.BILL_TO_ACCOUNT_ID = 'e9358570-f6f3-4a43-9268-ae265f3cc030' AND b.`NAME` LIKE '%普通宽带%' AND a.CLOSED=0 AND EXISTS(select 1 from bo_eu_dnctt_contract_service_sale_adjust where CONTRACT_SERVICE_ID=b.ID) ");
 
         //SELECT b.* FROM BO_EU_DNCTT_CONTRACT a JOIN bo_eu_dnctt_contract_service b ON b.CONTRACT_ID=a.ID WHERE a.NAME LIKE '%历峰%' AND b.SERVICE_NAME='网络线路' AND b.CALC_METHOD_1STPERIOD='4599' AND b.CREATEUSER='hulei'
 
@@ -630,7 +634,7 @@ public class contractCreateController {
         for (RowMap service : services) {
             try {
                 contractLogger.info("开始处理合同服务:" + service.getString("NAME") + "(" + service.getString("ID") + ")");
-
+                DBSql.update("DELETE FROM bo_eu_dnctt_contract_service_sale_adjust WHERE CONTRACT_SERVICE_ID=?", new Object[]{service.getString("ID")});
                 String contractId = service.getString("CONTRACT_ID");
                 String serviceIds = service.getString("ID");
                 servicePeriod(uc, contractId, serviceIds);

+ 160 - 2
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/controller/contractServiceController.java

@@ -17,14 +17,15 @@ import com.awspaas.user.apps.donenow_ctt.service.contractServiceAdj;
 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;
+import java.util.List;
 
 import static com.awspaas.user.apps.donenow_ctt.PeriodCalculationUtil.GetPeriodMonth;
 import static com.awspaas.user.apps.donenow_ctt.PeriodCalculationUtil.getDateRate;
 import static com.awspaas.user.apps.donenow_ctt.service.contractService.*;
-import static com.awspaas.user.apps.donenow_ctt.service.contractService.multiply;
 
 @Controller
 public class contractServiceController {
@@ -284,6 +285,7 @@ public class contractServiceController {
         String TERMINATION = contraService.get("TERMINATION") != null ? contraService.getString("TERMINATION") : "0";
         String oldTerminationDate = contraService.get("TERMINATION_DATE") != null ? contraService.getString("TERMINATION_DATE") : "";
 
+
         if (TERMINATION.equals("1") && StringUtils.isNotBlank(oldTerminationDate)) {
             oldTerminationDate = oldTerminationDate.length() == 10 ? oldTerminationDate : oldTerminationDate.substring(0, 10);
             LocalDate oldTerminationDateLocal = getLocalDate(oldTerminationDate);
@@ -303,8 +305,25 @@ public class contractServiceController {
         } else {
             //生效日期之后有审批通过的;
             if (DBSql.getInt("SELECT count(1) FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE APPROVE_AND_POST_USER_ID IS NOT NULL AND LENGTH(APPROVE_AND_POST_USER_ID)>1 AND APPROVE_AND_POST_DATE IS NOT NULL and CONTRACT_SERVICE_ID=? AND  PERIOD_END_DATE>=?", new Object[]{serviceId, TerminationDate}) > 0) {
-                return ResponseObject.newErrResponse("终止日期之后的合同服务已经进行审批!");
+
+                if (TERMINATION.equals("1"))//如果有退款单,不能多次终止
+                {
+                    if (DBSql.getInt("SELECT count(1) FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE PERIOD_PRICE<0 AND CONTRACT_SERVICE_ID=? AND  PERIOD_END_DATE>=?", new Object[]{serviceId, TerminationDate}) > 0)
+                        return ResponseObject.newErrResponse("服务已终止,不能再次终止!");
+                }
+
+                //  return ResponseObject.newErrResponse("终止日期之后的合同服务已经进行审批!");
+                String str = DBSql.getString("SELECT GROUP_CONCAT(CONCAT(DATE_FORMAT(PERIOD_BEGIN_DATE, '%Y-%m-%d'),'-',DATE_FORMAT(PERIOD_END_DATE, '%Y-%m-%d'))) FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE APPROVE_AND_POST_USER_ID IS NOT NULL AND LENGTH(APPROVE_AND_POST_USER_ID)>1 AND APPROVE_AND_POST_DATE IS NOT NULL and CONTRACT_SERVICE_ID=? AND  PERIOD_END_DATE>=?", new Object[]{serviceId, TerminationDate});
+                //部分服务周期应该款已确认,需要执行应收款取消确认操作,或者执行退款操作。两个按钮:应收款取消确认(系统什么都不做)、退款
+
+                ResponseObject res = ResponseObject.newOkResponse();
+
+                res.put("msg", TerminationDate + "日期之后的合同服务【" + str + "】应该款已确认,需要执行应收款取消确认操作,或者执行退款操作。");
+                res.put("code", "termination_service_period_confirm");
+                return res;
             }
+
+
         }
 
 
@@ -388,6 +407,145 @@ public class contractServiceController {
         }
 
 
+        return ResponseObject.newOkResponse();
+    }
+
+    /**
+     * 服务终止并退款
+     *
+     * @param uc
+     * @param serviceId
+     * @param TerminationDate
+     * @return
+     */
+    @Mapping(value = "com.awspaas.user.apps.donenow_ctt.termina_serviceand_refund")
+    public ResponseObject TerminationServiceAndRefund(UserContext uc, String serviceId, String TerminationDate) {
+
+        if (StringUtils.isBlank(serviceId) || StringUtils.isBlank(TerminationDate))
+            return ResponseObject.newErrResponse("参数错误");
+
+        BO contraService = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").addQuery("ID =", serviceId).detail();
+
+        if (contraService == null)
+            return ResponseObject.newErrResponse("参数错误");
+
+        TerminationDate = TerminationDate.length() == 10 ? TerminationDate : TerminationDate.substring(0, 10);
+
+        LocalDate TerminationDateLocal = getLocalDate(TerminationDate);
+
+        LocalDate SERVICE_END_DATE = TerminationDateLocal; //服务结束日期
+
+        String TERMINATION = contraService.get("TERMINATION") != null ? contraService.getString("TERMINATION") : "0";
+        String oldTerminationDate = contraService.get("TERMINATION_DATE") != null ? contraService.getString("TERMINATION_DATE") : "";
+
+
+        if (TERMINATION.equals("1"))
+            return ResponseObject.newErrResponse("服务已终止,不能再次终止!");
+
+        if (TERMINATION.equals("1") && StringUtils.isNotBlank(oldTerminationDate)) {
+            oldTerminationDate = oldTerminationDate.length() == 10 ? oldTerminationDate : oldTerminationDate.substring(0, 10);
+            LocalDate oldTerminationDateLocal = getLocalDate(oldTerminationDate);
+            if (!oldTerminationDateLocal.isAfter(TerminationDateLocal))
+                return ResponseObject.newErrResponse("终止日期不能晚于原终止日期");
+        }
+
+
+        //2025年10月15日 一次性收费服务
+        if (contraService.getString("PERIOD_TYPE").equals(cttConstant.PERIOD_TYPE_ONE_TIME)) {
+
+            //有审批通过的;
+            if (DBSql.getInt("SELECT count(1) FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE APPROVE_AND_POST_USER_ID IS NOT NULL AND LENGTH(APPROVE_AND_POST_USER_ID)>1 AND APPROVE_AND_POST_DATE IS NOT NULL and CONTRACT_SERVICE_ID=? ", new Object[]{serviceId}) > 0) {
+                return ResponseObject.newErrResponse("服务已审批不能再进行调整");
+            }
+
+        } else {
+            //生效日期之后有审批通过的;
+            if (DBSql.getInt("SELECT count(1) FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE APPROVE_AND_POST_USER_ID IS NOT NULL AND LENGTH(APPROVE_AND_POST_USER_ID)>1 AND APPROVE_AND_POST_DATE IS NOT NULL and CONTRACT_SERVICE_ID=? AND  PERIOD_END_DATE>=?", new Object[]{serviceId, TerminationDate}) > 0) {
+                String minStart = DBSql.getString("SELECT DATE_FORMAT(MIN(PERIOD_BEGIN_DATE), '%Y-%m-%d') FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE (APPROVE_AND_POST_USER_ID IS  NULL OR LENGTH(APPROVE_AND_POST_USER_ID)=0) AND APPROVE_AND_POST_DATE IS NULL and CONTRACT_SERVICE_ID=? AND  PERIOD_END_DATE>=?", new Object[]{serviceId, TerminationDate});
+                if (StringUtils.isNotBlank(minStart)) {
+                    SERVICE_END_DATE = getLocalDate(minStart);
+                }
+            }
+        }
+
+        Connection conn = null;
+        try {
+            conn = DBSql.open();
+            conn.setAutoCommit(false);
+
+
+            //  TerminationDate  到  SERVICE_END_DATE 之间的金额要退款
+            List<RowMap> periodList = DBSql.getMaps("select * from BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD where CONTRACT_SERVICE_ID=? AND PERIOD_END_DATE>=? AND PERIOD_BEGIN_DATE<=? ORDER BY PERIOD_BEGIN_DATE", new Object[]{serviceId, TerminationDate, LocalDateYYYYMMDD(SERVICE_END_DATE)});
+
+            for (RowMap period : periodList) {
+
+                LocalDate period_begin_date = getLocalDate(period.get("PERIOD_BEGIN_DATE"));
+                LocalDate period_end_date = getLocalDate(period.get("PERIOD_END_DATE"));
+
+                BigDecimal periodRate = BigDecimal.ONE;
+                if (period_begin_date.isAfter(TerminationDateLocal) == false) {
+
+                    BigDecimal periodRate1 = getDateRate(period_begin_date, TerminationDateLocal, false);
+
+                    BigDecimal periodRate2 = getDateRate(period_begin_date, period_end_date, false);
+
+                    periodRate = periodRate.subtract(periodRate1.divide(periodRate2, 10, RoundingMode.HALF_UP));
+
+                    period_begin_date = TerminationDateLocal.plusDays(1);
+                }
+
+                periodRate = BigDecimal.ZERO.subtract(periodRate);
+
+
+                BigDecimal PERIOD_PRICE = toBigDecimal(period.get("PERIOD_PRICE"));
+                BigDecimal PARTYA_PERIOD_PRICE = toBigDecimal(period.get("PARTYA_PERIOD_PRICE"));
+                BigDecimal PERIOD_COST = toBigDecimal(period.get("PERIOD_COST"));
+
+                BO itemBO = new BO();
+                itemBO.set("PERIOD_BEGIN_DATE", period_begin_date);
+                itemBO.set("PERIOD_END_DATE", period_end_date);
+                itemBO.set("BINDID", period.get("BINDID"));
+                itemBO.set("CONTRACT_ID", period.get("CONTRACT_ID"));
+                itemBO.set("CONTRACT_SERVICE_ID", period.get("CONTRACT_SERVICE_ID"));
+                itemBO.set("OBJECT_ID", period.get("OBJECT_ID"));
+                itemBO.set("OBJECT_TYPE", period.get("OBJECT_TYPE"));
+                itemBO.set("QUANTITY", period.get("QUANTITY"));
+                itemBO.set("VENDOR_ACCOUNT_ID", period.get("VENDOR_ACCOUNT_ID"));
+                itemBO.set("PERIOD_PRICE", PERIOD_PRICE.multiply(periodRate));
+                itemBO.set("PERIOD_ADJUSTED_PRICE", itemBO.get("PERIOD_PRICE"));
+                itemBO.set("PARTYA_PERIOD_PRICE", PARTYA_PERIOD_PRICE.multiply(periodRate));
+                itemBO.set("PERIOD_COST", PERIOD_COST.multiply(periodRate));
+                SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", itemBO, uc);
+            }
+
+            //生效日期之后的服务周期删除
+            DBSql.update(conn, "DELETE FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE WHERE CONTRACT_SERVICE_PERIOD_ID IN (SELECT ID FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID =? AND PERIOD_BEGIN_DATE >=?)", new Object[]{serviceId, LocalDateYYYYMMDD(SERVICE_END_DATE)});
+
+            DBSql.update(conn, "DELETE FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID=? AND PERIOD_BEGIN_DATE>=?", new Object[]{serviceId, LocalDateYYYYMMDD(SERVICE_END_DATE)});
+
+            contraService.set("TERMINATION", 1);
+            contraService.set("TERMINATION_DATE", TerminationDate);//服务终止日期
+            contraService.set("END_DATE", TerminationDate);//服务结束日期
+
+            SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE", contraService, conn);
+
+            conn.commit();
+
+        } catch (SQLException e) {
+
+            e.printStackTrace();
+            try {
+                conn.rollback();
+            } catch (SQLException e1) {
+                e1.printStackTrace();
+            }
+
+
+        } finally {
+            if (conn != null) DBSql.close(conn);
+        }
+
+
         return ResponseObject.newOkResponse();
     }
 

+ 5 - 1
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/job/ServicePeriodMonthJob.java

@@ -97,7 +97,11 @@ public class ServicePeriodMonthJob implements Job {
 
                 itemBO.set("PERIOD_PRICE", unit_PRICE * rated);
 
-                itemBO.set("PARTYA_PRICE_MONTH", PARTYA_UNIT_PRICE_MONTH * rated);
+                if (unit_PRICE > 0)
+                    itemBO.set("PARTYA_PRICE_MONTH", PARTYA_UNIT_PRICE_MONTH * rated);
+                else
+                    itemBO.set("PARTYA_PRICE_MONTH", 0-PARTYA_UNIT_PRICE_MONTH * rated);
+
                 SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_MONTH", itemBO, null);
             }
         }

+ 13 - 0
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractService.java

@@ -3537,4 +3537,17 @@ public class contractService {
         }
         return null;
     }
+
+
+
+
+    public void  splitServicePeriodMonth()
+    {
+
+
+
+    }
+
+
+
 }

+ 7 - 4
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractServiceAdj.java

@@ -177,9 +177,10 @@ public class contractServiceAdj {
 
             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"));
+            periodBO.set("PERIOD_PRICE", contractService.get("TOTAL_PRICE"));
+            periodBO.set("PERIOD_ADJUSTED_PRICE", periodBO.get("PERIOD_PRICE"));
+            periodBO.set("QUANTITY", contractService.get("QUANTITY"));
+
             SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", periodBO);
 
             orgContractService.set("UNIT_PRICE", contractService.get("UNIT_PRICE"));
@@ -187,7 +188,9 @@ public class contractServiceAdj {
             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()});
+            if (orgContractService.getString("NEED_PURCHASE").equals("1"))
+                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=? ", new Object[]{orgContractService.getId(), orgContractService.getId()});
+
             return true;
         }