|
@@ -21,6 +21,8 @@ import java.time.temporal.ChronoUnit;
|
|
|
import java.time.temporal.TemporalAdjusters;
|
|
import java.time.temporal.TemporalAdjusters;
|
|
|
import java.util.*;
|
|
import java.util.*;
|
|
|
|
|
|
|
|
|
|
+import static com.awspaas.user.apps.donenow_ctt.service.contractService.divideToBigDecimal;
|
|
|
|
|
+
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 合同服务
|
|
* 合同服务
|
|
@@ -1229,7 +1231,7 @@ public class contractService {
|
|
|
contractCost.put("serviceID", serviceID);
|
|
contractCost.put("serviceID", serviceID);
|
|
|
contractCost.put("CONTRACT_ID", contract.getString("ID"));
|
|
contractCost.put("CONTRACT_ID", contract.getString("ID"));
|
|
|
contractCost.put("QUANTITY", service.getString("QUANTITY"));
|
|
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_PRICE", String.valueOf(unitPriceMap.get(serviceID)));
|
|
|
contractCost.put("UNIT_COST", String.valueOf(unitCostMap.get(serviceID)));
|
|
contractCost.put("UNIT_COST", String.valueOf(unitCostMap.get(serviceID)));
|
|
|
|
|
|
|
@@ -1255,7 +1257,7 @@ public class contractService {
|
|
|
contractCost.put("serviceID", service.getString("OBJECT_ID"));
|
|
contractCost.put("serviceID", service.getString("OBJECT_ID"));
|
|
|
contractCost.put("CONTRACT_ID", contract.getString("ID"));
|
|
contractCost.put("CONTRACT_ID", contract.getString("ID"));
|
|
|
contractCost.put("QUANTITY", service.getString("QUANTITY"));
|
|
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_PRICE", service.getString("UNIT_PRICE"));
|
|
|
contractCost.put("UNIT_COST", service.getString("UNIT_COST"));
|
|
contractCost.put("UNIT_COST", service.getString("UNIT_COST"));
|
|
|
|
|
|
|
@@ -1346,7 +1348,25 @@ public class contractService {
|
|
|
contractCost.set("UNIT_PRICE", service.get("UNIT_PRICE"));
|
|
contractCost.set("UNIT_PRICE", service.get("UNIT_PRICE"));
|
|
|
|
|
|
|
|
//数量
|
|
//数量
|
|
|
- contractCost.set("QUANTITY", DBSql.getDouble(conn, "SELECT COUNT(1) as CNT FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "CNT"));
|
|
|
|
|
|
|
+ // 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();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //contractCost.set("QUANTITY", quantity);
|
|
|
|
|
|
|
|
//总成本
|
|
//总成本
|
|
|
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"));
|
|
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"));
|
|
@@ -1354,6 +1374,11 @@ public class contractService {
|
|
|
//总价格
|
|
//总价格
|
|
|
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("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()) {
|
|
if (contractCost.isNew()) {
|
|
|
//成本子类:合同成本
|
|
//成本子类:合同成本
|
|
|
contractCost.set("SUB_CATE_ID", "1314");
|
|
contractCost.set("SUB_CATE_ID", "1314");
|
|
@@ -1680,6 +1705,12 @@ public class contractService {
|
|
|
return num.divide(den, 10, RoundingMode.HALF_UP); // 保留 10 位小数
|
|
return num.divide(den, 10, RoundingMode.HALF_UP); // 保留 10 位小数
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 相除
|
|
|
|
|
+ * @param numerator
|
|
|
|
|
+ * @param denominator
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
public static BigDecimal divideToBigDecimal(Object numerator, Object denominator) {
|
|
public static BigDecimal divideToBigDecimal(Object numerator, Object denominator) {
|
|
|
// 转换分子为BigDecimal
|
|
// 转换分子为BigDecimal
|
|
|
BigDecimal num = toBigDecimal(numerator);
|
|
BigDecimal num = toBigDecimal(numerator);
|
|
@@ -2397,4 +2428,67 @@ public class contractService {
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 计算周期
|
|
|
|
|
+ * @param purchasePeriodType
|
|
|
|
|
+ * @param beginDate
|
|
|
|
|
+ * @param endDate
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
|
|
+ public int calculatePeriods(String purchasePeriodType, LocalDate beginDate, LocalDate endDate) {
|
|
|
|
|
+ // 校验日期合法性
|
|
|
|
|
+ if (beginDate == null || endDate == null) {
|
|
|
|
|
+ throw new IllegalArgumentException("开始日期或结束日期不能为空");
|
|
|
|
|
+ }
|
|
|
|
|
+ if (beginDate.isAfter(endDate)) {
|
|
|
|
|
+ return 0; // 开始日期晚于结束日期,周期数为0
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 一次性收费直接返回1
|
|
|
|
|
+ if ("609".equals(purchasePeriodType)) {
|
|
|
|
|
+ return 1;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 确定周期对应的月数
|
|
|
|
|
+ int periodMonths;
|
|
|
|
|
+ switch (purchasePeriodType) {
|
|
|
|
|
+ case "610":
|
|
|
|
|
+ periodMonths = 1; // 按月
|
|
|
|
|
+ break;
|
|
|
|
|
+ case "611":
|
|
|
|
|
+ periodMonths = 3; // 按季度
|
|
|
|
|
+ break;
|
|
|
|
|
+ case "612":
|
|
|
|
|
+ periodMonths = 6; // 按半年
|
|
|
|
|
+ break;
|
|
|
|
|
+ case "613":
|
|
|
|
|
+ periodMonths = 12; // 按年
|
|
|
|
|
+ break;
|
|
|
|
|
+ default:
|
|
|
|
|
+ throw new IllegalArgumentException("未知的采购周期类型:" + purchasePeriodType);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 开始日期和结束日期相同,算1个周期
|
|
|
|
|
+ if (beginDate.equals(endDate)) {
|
|
|
|
|
+ return 1;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 计算两个日期之间的总月数
|
|
|
|
|
+ long monthsBetween = ChronoUnit.MONTHS.between(beginDate, endDate);
|
|
|
|
|
+
|
|
|
|
|
+ // 不足1个月的情况,算1个周期
|
|
|
|
|
+ if (monthsBetween == 0) {
|
|
|
|
|
+ return 1;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 计算完整周期数
|
|
|
|
|
+ int fullPeriods = (int) (monthsBetween / periodMonths);
|
|
|
|
|
+ // 计算完整周期后的截止日期
|
|
|
|
|
+ LocalDate endOfFullPeriods = beginDate.plusMonths(fullPeriods * periodMonths);
|
|
|
|
|
+
|
|
|
|
|
+ // 若结束日期超过完整周期的截止日期,周期数+1
|
|
|
|
|
+ return endDate.isAfter(endOfFullPeriods) ? fullPeriods + 1 : fullPeriods;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|