Browse Source

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

HULEI 2 months ago
parent
commit
acade5af4d

+ 97 - 3
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractService.java

@@ -21,6 +21,8 @@ import java.time.temporal.ChronoUnit;
 import java.time.temporal.TemporalAdjusters;
 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("CONTRACT_ID", contract.getString("ID"));
                         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_COST", String.valueOf(unitCostMap.get(serviceID)));
 
@@ -1255,7 +1257,7 @@ public class contractService {
                     contractCost.put("serviceID", service.getString("OBJECT_ID"));
                     contractCost.put("CONTRACT_ID", contract.getString("ID"));
                     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_COST", service.getString("UNIT_COST"));
 
@@ -1346,7 +1348,25 @@ public class contractService {
         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"));
@@ -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("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()) {
             //成本子类:合同成本
             contractCost.set("SUB_CATE_ID", "1314");
@@ -1680,6 +1705,12 @@ public class contractService {
         return num.divide(den, 10, RoundingMode.HALF_UP); // 保留 10 位小数
     }
 
+    /**
+     * 相除
+     * @param numerator
+     * @param denominator
+     * @return
+     */
     public static BigDecimal divideToBigDecimal(Object numerator, Object denominator) {
         // 转换分子为BigDecimal
         BigDecimal num = toBigDecimal(numerator);
@@ -2397,4 +2428,67 @@ public class contractService {
         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;
+    }
+
 }

+ 24 - 0
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/controller/ivtOrderController.java

@@ -24,6 +24,7 @@ import java.sql.Connection;
 import java.sql.SQLException;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.stream.Collectors;
 
 @Controller
 public class ivtOrderController {
@@ -598,6 +599,29 @@ public class ivtOrderController {
         return HtmlPageTemplate.merge("ViewPurchaseOrder.html", map);
     }
 
+    /**
+     * 根据服务ID创建采购订单
+     * @param uc
+     * @param serviceIds
+     * @return
+     * @throws SQLException
+     */
+    @Mapping(value = "com.awspaas.user.apps.donenow_ivt.createPurchaseOrderByServiceId")
+    public ResponseObject createPurchaseOrderByServiceId(UserContext uc, String serviceIds) throws SQLException {
+        String[] serviceArr = serviceIds.split(",");
+        String sql = "SELECT ID FROM BO_EU_DNCTT_CONTRACT_COST WHERE SERVICE_ID IN(";
+        for (int i = 0; i < serviceArr.length; i++) {
+            sql += "?,";
+        }
+        sql = sql.substring(0, sql.length() - 1) + ")";
+        List<RowMap> costList = DBSql.getMaps(sql, Arrays.stream(serviceArr).toArray());
+
+        if (costList.isEmpty())
+            return ResponseObject.newErrResponse("没有找到对应的合同产品");
+
+        String costIds = costList.stream().map(cost -> cost.getString("ID")).collect(Collectors.joining(","));
+        return createPurchaseOrder(uc, costIds);
+    }
 
     /**
      * 创建采购订单