|
@@ -17,14 +17,15 @@ import com.awspaas.user.apps.donenow_ctt.service.contractServiceAdj;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.sql.Connection;
|
|
import java.sql.Connection;
|
|
|
import java.sql.SQLException;
|
|
import java.sql.SQLException;
|
|
|
import java.time.LocalDate;
|
|
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.GetPeriodMonth;
|
|
|
import static com.awspaas.user.apps.donenow_ctt.PeriodCalculationUtil.getDateRate;
|
|
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.*;
|
|
|
-import static com.awspaas.user.apps.donenow_ctt.service.contractService.multiply;
|
|
|
|
|
|
|
|
|
|
@Controller
|
|
@Controller
|
|
|
public class contractServiceController {
|
|
public class contractServiceController {
|
|
@@ -284,6 +285,7 @@ public class contractServiceController {
|
|
|
String TERMINATION = contraService.get("TERMINATION") != null ? contraService.getString("TERMINATION") : "0";
|
|
String TERMINATION = contraService.get("TERMINATION") != null ? contraService.getString("TERMINATION") : "0";
|
|
|
String oldTerminationDate = contraService.get("TERMINATION_DATE") != null ? contraService.getString("TERMINATION_DATE") : "";
|
|
String oldTerminationDate = contraService.get("TERMINATION_DATE") != null ? contraService.getString("TERMINATION_DATE") : "";
|
|
|
|
|
|
|
|
|
|
+
|
|
|
if (TERMINATION.equals("1") && StringUtils.isNotBlank(oldTerminationDate)) {
|
|
if (TERMINATION.equals("1") && StringUtils.isNotBlank(oldTerminationDate)) {
|
|
|
oldTerminationDate = oldTerminationDate.length() == 10 ? oldTerminationDate : oldTerminationDate.substring(0, 10);
|
|
oldTerminationDate = oldTerminationDate.length() == 10 ? oldTerminationDate : oldTerminationDate.substring(0, 10);
|
|
|
LocalDate oldTerminationDateLocal = getLocalDate(oldTerminationDate);
|
|
LocalDate oldTerminationDateLocal = getLocalDate(oldTerminationDate);
|
|
@@ -303,8 +305,25 @@ public class contractServiceController {
|
|
|
} else {
|
|
} 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) {
|
|
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();
|
|
return ResponseObject.newOkResponse();
|
|
|
}
|
|
}
|
|
|
|
|
|