Эх сурвалжийг харах

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

HULEI 3 долоо хоног өмнө
parent
commit
4f37422865

+ 1 - 1
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/PeriodCalculationUtil.java

@@ -287,7 +287,7 @@ public class PeriodCalculationUtil {
         }
 
         // 3.2 处理首个周期
-        if (currLastDay != null && currLastDay.equals(periodBeginDate) == false) {
+        if (currLastDay != null) {
 
             if(currLastDay.isAfter(periodEndDate))
                 currLastDay=periodEndDate;

+ 5 - 3
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/controller/contractCreateController.java

@@ -621,11 +621,13 @@ 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 CONTRACT_ID,GROUP_CONCAT(ID) IDS FROM bo_eu_dnctt_contract_service WHERE CONTRACT_ID in (SELECT ID FROM BO_EU_DNCTT_CONTRACT WHERE FRAMEWORK='7c2841c3-8f51-4dea-a6ea-984d9b9c3574' AND NO NOT LIKE '%old%' ) GROUP BY CONTRACT_ID");
-        UserContext uc = UserContext.fromUID("admin");
+
+        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 a.NAME LIKE '%历峰%' AND b.SERVICE_NAME='网络线路' AND b.CALC_METHOD_1STPERIOD='4599' AND b.CREATEUSER='hulei'");
+
+        UserContext uc = UserContext.fromUID("hulei");
         for (RowMap service : services) {
             String contractId = service.getString("CONTRACT_ID");
-            String serviceIds = service.getString("IDS");
+            String serviceIds = service.getString("ID");
             servicePeriod(uc, contractId, serviceIds);
             serviceCost(uc, contractId, serviceIds);
         }

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

@@ -85,7 +85,7 @@ public class contractServiceController {
         }
 
 
-        if (contractServiceAdj.getInstance().execServiceSaleAdj(uc, boId,false))
+        if (contractServiceAdj.getInstance().execServiceSaleAdj(uc, boId, false))
 
             return ResponseObject.newOkResponse();
 
@@ -138,7 +138,7 @@ public class contractServiceController {
         }
 
 
-        if (contractServiceAdj.getInstance().execServicePurchaseAdj(uc, boId, null,false)) {
+        if (contractServiceAdj.getInstance().execServicePurchaseAdj(uc, boId, null, false)) {
             return ResponseObject.newOkResponse();
         }
         return ResponseObject.newOkResponse();
@@ -169,4 +169,85 @@ public class contractServiceController {
     }
 
 
+    /*
+    @Mapping(value = "com.awspaas.user.apps.donenow_ctt.BO_EU_DNV_RPT_MONTH_PUMA")
+    public ResponseObject BO_EU_DNV_RPT_MONTH_PUMA(UserContext uc, int startAccountPeriod, int endAccountPeriod) {
+
+       // DBSql.update("delete from BO_EU_DNV_RPT_MONTH_PUMA where  userid='" + uc.getUID() + "'");
+
+        DBSql.update("delete from BO_EU_DNV_RPT_MONTH_PUMA ");
+
+        String sql = "INSERT INTO BO_EU_DNV_RPT_MONTH_PUMA \n" +
+                "\tselect t.*,onetime_dollars+tube_dollars+property_manage_dollars+construction_dollars+phone_dollars+datacard_dollars+adsl_dollars as total_dollars,concat(left(item_month,4),QUARTER(concat(item_month,'01')))  as item_quarter,'" + uc.getUID() + "' AS userid from (\n" +
+                "select  item_month,a.CONTRACT_ID,no as contract_no,project_Location,CONTRACT_START_DATE,group_concat(distinct ITEM_MODEL) as ITEM_MODEL,\n" +
+                "ifnull((select sum(ifnull(DOLLARS,0)) from VIEW_EU_DNV_POSTED_ALL where item_month =a.item_month and group_Label=4684 and contract_id=a.contract_id),0)adsl_dollars,-- 宽带服务费\n" +
+                "ifnull((select sum(ifnull(DOLLARS,0)) from VIEW_EU_DNV_POSTED_ALL where item_month =a.item_month and group_Label=4683 and contract_id=a.contract_id),0)onetime_dollars,-- 一次性费用\n" +
+                "ifnull((select sum(ifnull(DOLLARS,0)) from VIEW_EU_DNV_POSTED_ALL where item_month =a.item_month  and group_Label=4685 and contract_id=a.contract_id),0)tube_dollars, -- 物业管道占用费\n" +
+                "ifnull((select sum(ifnull(DOLLARS,0)) from VIEW_EU_DNV_POSTED_ALL where item_month =a.item_month and group_Label=4686 and contract_id=a.contract_id),0)property_manage_dollars,-- 物业管理费\n" +
+                "ifnull((select sum(ifnull(DOLLARS,0)) from VIEW_EU_DNV_POSTED_ALL where item_month =a.item_month  and group_Label=4687 and contract_id=a.contract_id),0)construction_dollars, -- 第三方施工费\n" +
+                "ifnull((select sum(ifnull(DOLLARS,0)) from VIEW_EU_DNV_POSTED_ALL where item_month =a.item_month  and group_Label=4688 and contract_id=a.contract_id),0)phone_dollars, -- 固话非\n" +
+                "ifnull((select sum(ifnull(DOLLARS,0)) from VIEW_EU_DNV_POSTED_ALL where item_month =a.item_month  and group_Label=4689 and contract_id=a.contract_id),0)datacard_dollars, -- 流量卡费\n" +
+                "ifnull((select sum(ifnull(DOLLARS,0)) from VIEW_EU_DNV_POSTED_ALL where item_month =a.item_month  and group_Label=4691 and contract_id= a.contract_id   ),0)datacard_personal_dollars, -- 个人流量卡费\n" +
+                "ifnull((select sum(ifnull(DOLLARS,0)) from VIEW_EU_DNV_POSTED_ALL where item_month =a.item_month  and group_Label=4690 and contract_id=a.contract_id   ),0)vats_service_dollars, -- 代领专票服务费\n" +
+                "ifnull((select sum(ifnull(DOLLARS,0)) from VIEW_EU_DNV_POSTED_ALL where item_month =a.item_month  and item_type=1318  and contract_id=a.contract_id),0)product_dollars -- 物料费\n" +
+                "from VIEW_EU_DNV_POSTED_ALL a   where   account_id='e9358570-f6f3-4a43-9268-ae265f3cc030' \n" +
+                "GROUP BY item_month,a.CONTRACT_ID,no,project_Location,CONTRACT_START_DATE \n" +
+                ")t where t.item_month>=" + startAccountPeriod + " and t.item_month<=" + endAccountPeriod + " order by item_month";
+
+
+        DBSql.update(sql);
+        return ResponseObject.newOkResponse();
+    }
+*/
+    @Mapping(value = "com.awspaas.user.apps.donenow_ctt.BO_EU_DNV_RPT_MONTH_PUMA")
+    public ResponseObject BO_EU_DNV_RPT_MONTH_PUMA(UserContext uc, int startAccountPeriod, int endAccountPeriod) {
+        // 直接执行upsert操作,无需先删除
+        String sql = "INSERT INTO BO_EU_DNV_RPT_MONTH_PUMA \n" +
+                "\tSELECT t.*, onetime_dollars+tube_dollars+property_manage_dollars+construction_dollars+phone_dollars+datacard_dollars+adsl_dollars AS total_dollars, \n" +
+                "\t       CONCAT(LEFT(item_month,4), QUARTER(CONCAT(item_month,'01'))) AS item_quarter, \n" +
+                "\t       '" + uc.getUID() + "' AS userid \n" +
+                "FROM (\n" +
+                "    SELECT item_month, a.CONTRACT_ID, no AS contract_no, project_Location, CONTRACT_START_DATE, \n" +
+                "           GROUP_CONCAT(DISTINCT ITEM_MODEL) AS ITEM_MODEL,\n" +
+                "           IFNULL((SELECT SUM(IFNULL(DOLLARS,0)) FROM VIEW_EU_DNV_POSTED_ALL WHERE item_month = a.item_month AND group_Label = 4684 AND contract_id = a.contract_id), 0) AS adsl_dollars,\n" +
+                "           IFNULL((SELECT SUM(IFNULL(DOLLARS,0)) FROM VIEW_EU_DNV_POSTED_ALL WHERE item_month = a.item_month AND group_Label = 4683 AND contract_id = a.contract_id), 0) AS onetime_dollars,\n" +
+                "           IFNULL((SELECT SUM(IFNULL(DOLLARS,0)) FROM VIEW_EU_DNV_POSTED_ALL WHERE item_month = a.item_month AND group_Label = 4685 AND contract_id = a.contract_id), 0) AS tube_dollars,\n" +
+                "           IFNULL((SELECT SUM(IFNULL(DOLLARS,0)) FROM VIEW_EU_DNV_POSTED_ALL WHERE item_month = a.item_month AND group_Label = 4686 AND contract_id = a.contract_id), 0) AS property_manage_dollars,\n" +
+                "           IFNULL((SELECT SUM(IFNULL(DOLLARS,0)) FROM VIEW_EU_DNV_POSTED_ALL WHERE item_month = a.item_month AND group_Label = 4687 AND contract_id = a.contract_id), 0) AS construction_dollars,\n" +
+                "           IFNULL((SELECT SUM(IFNULL(DOLLARS,0)) FROM VIEW_EU_DNV_POSTED_ALL WHERE item_month = a.item_month AND group_Label = 4688 AND contract_id = a.contract_id), 0) AS phone_dollars,\n" +
+                "           IFNULL((SELECT SUM(IFNULL(DOLLARS,0)) FROM VIEW_EU_DNV_POSTED_ALL WHERE item_month = a.item_month AND group_Label = 4689 AND contract_id = a.contract_id), 0) AS datacard_dollars,\n" +
+                "           IFNULL((SELECT SUM(IFNULL(DOLLARS,0)) FROM VIEW_EU_DNV_POSTED_ALL WHERE item_month = a.item_month AND group_Label = 4691 AND contract_id = a.contract_id), 0) AS datacard_personal_dollars,\n" +
+                "           IFNULL((SELECT SUM(IFNULL(DOLLARS,0)) FROM VIEW_EU_DNV_POSTED_ALL WHERE item_month = a.item_month AND group_Label = 4690 AND contract_id = a.contract_id), 0) AS vats_service_dollars,\n" +
+                "           IFNULL((SELECT SUM(IFNULL(DOLLARS,0)) FROM VIEW_EU_DNV_POSTED_ALL WHERE item_month = a.item_month AND item_type = 1318 AND contract_id = a.contract_id), 0) AS product_dollars\n" +
+                "    FROM VIEW_EU_DNV_POSTED_ALL a\n" +
+                "    WHERE account_id = 'e9358570-f6f3-4a43-9268-ae265f3cc030'\n" +
+                "    GROUP BY item_month, a.CONTRACT_ID, no, project_Location, CONTRACT_START_DATE\n" +
+                ") t \n" +
+                "WHERE t.item_month >= " + startAccountPeriod + " AND t.item_month <= " + endAccountPeriod + "\n" +
+                "ORDER BY item_month\n" +
+                "ON DUPLICATE KEY UPDATE \n" +
+                "    contract_no = VALUES(contract_no),\n" +
+                "    project_Location = VALUES(project_Location),\n" +
+                "    CONTRACT_START_DATE = VALUES(CONTRACT_START_DATE),\n" +
+                "    ITEM_MODEL = VALUES(ITEM_MODEL),\n" +
+                "    adsl_dollars = VALUES(adsl_dollars),\n" +
+                "    onetime_dollars = VALUES(onetime_dollars),\n" +
+                "    tube_dollars = VALUES(tube_dollars),\n" +
+                "    property_manage_dollars = VALUES(property_manage_dollars),\n" +
+                "    construction_dollars = VALUES(construction_dollars),\n" +
+                "    phone_dollars = VALUES(phone_dollars),\n" +
+                "    datacard_dollars = VALUES(datacard_dollars),\n" +
+                "    datacard_personal_dollars = VALUES(datacard_personal_dollars),\n" +
+                "    vats_service_dollars = VALUES(vats_service_dollars),\n" +
+                "    product_dollars = VALUES(product_dollars),\n" +
+                "    total_dollars = VALUES(total_dollars),\n" +
+                "    item_quarter = VALUES(item_quarter),\n" +
+                "    userid = VALUES(userid);";
+
+        contractLogger.info("BO_EU_DNV_RPT_MONTH_PUMA SQL: " + sql);
+
+        DBSql.update(sql);
+        return ResponseObject.newOkResponse();
+    }
+
 }

+ 161 - 0
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/job/ServicePeriodMonthJob.java

@@ -0,0 +1,161 @@
+package com.awspaas.user.apps.donenow_ctt.job;
+
+import com.actionsoft.bpms.bo.engine.BO;
+import com.actionsoft.bpms.commons.database.RowMap;
+import com.actionsoft.bpms.util.DBSql;
+import com.actionsoft.sdk.local.SDK;
+import com.actionsoft.sdk.local.api.Logger;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.temporal.TemporalAdjusters;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static com.awspaas.user.apps.donenow_ctt.service.contractService.LocalDateYYYYMMDD;
+import static com.awspaas.user.apps.donenow_ctt.service.contractService.getLocalDate;
+
+public class ServicePeriodMonthJob implements Job {
+    private static final Logger jobLogger = SDK.getLogAPI().getLogger(ServicePeriodMonthJob.class);//记录日志
+
+    /**
+     *把服务周期拆分到每个月
+     * @param jobExecutionContext
+     * @throws JobExecutionException
+     */
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        List<RowMap> servicePeriodlist = DBSql.getMaps("SELECT c.*,b.UNIT_PRICE_MONTH,b.UNIT_PRICE,b.TOTAL_PRICE,b.QUANTITY AS SERVICE_QUANTITY,b.PARTYA_UNIT_PRICE_MONTH,b.PERIOD_TYPE FROM BO_EU_DNCTT_CONTRACT a JOIN bo_eu_dnctt_contract_service b ON b.CONTRACT_ID=a.ID JOIN bo_eu_dnctt_contract_service_period c ON c.CONTRACT_SERVICE_ID=b.ID  WHERE a.NAME LIKE '历峰%' AND a.CLOSED=0 AND ((b.CALC_METHOD_1STPERIOD IS NOT NULL AND b.CALC_METHOD_1STPERIOD>0) OR b.PERIOD_TYPE=609)  ORDER BY c.CONTRACT_SERVICE_ID,c.PERIOD_BEGIN_DATE");
+
+        //AND b.SERVICE_NAME='网络线路' AND b.CALC_METHOD_1STPERIOD='4599'
+
+        List<String> contractServiceIdList = servicePeriodlist.stream().map(k -> k.getString("CONTRACT_SERVICE_ID")).collect(Collectors.toList());
+
+        for (String csID : contractServiceIdList) {
+            DBSql.update("delete from BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_MONTH where CONTRACT_SERVICE_ID=? ", new Object[]{csID});
+        }
+
+        for (RowMap servicePeriod : servicePeriodlist) {
+
+            double QUANTITY = servicePeriod.getDouble("QUANTITY");
+
+            double PARTYA_UNIT_PRICE_MONTH = servicePeriod.getDouble("PARTYA_UNIT_PRICE_MONTH");//三方含税单位价格
+            PARTYA_UNIT_PRICE_MONTH = PARTYA_UNIT_PRICE_MONTH * QUANTITY;
+
+            String PERIOD_TYPE = servicePeriod.getString("PERIOD_TYPE");
+            //一次性
+            if (PERIOD_TYPE.equals("609")) {
+                BO itemBO = new BO();
+                itemBO.set("CONTRACT_ID", servicePeriod.get("CONTRACT_ID"));
+                itemBO.set("CONTRACT_SERVICE_ID", servicePeriod.get("CONTRACT_SERVICE_ID"));
+                itemBO.set("QUANTITY", servicePeriod.get("QUANTITY"));
+                itemBO.set("ITEM_MONTH", servicePeriod.getString("PERIOD_BEGIN_DATE").substring(0, 7).replace("-", ""));
+                itemBO.set("CONTRACT_SERVICE_PERIOD_ID", servicePeriod.get("ID"));
+                itemBO.set("PERIOD_BEGIN_DATE", servicePeriod.get("PERIOD_BEGIN_DATE"));
+                itemBO.set("PERIOD_END_DATE", servicePeriod.get("PERIOD_END_DATE"));
+                itemBO.set("PERIOD_PRICE", servicePeriod.get("PERIOD_PRICE"));
+                itemBO.set("PARTYA_PRICE_MONTH", PARTYA_UNIT_PRICE_MONTH);
+                SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_MONTH", itemBO, null);
+                continue;
+            }
+
+            LocalDate period_begin_date = getLocalDate(servicePeriod.get("PERIOD_BEGIN_DATE"));
+            LocalDate period_end_date = getLocalDate(servicePeriod.get("PERIOD_END_DATE"));
+            double UNIT_PRICE_MONTH = servicePeriod.getDouble("UNIT_PRICE_MONTH");
+            UNIT_PRICE_MONTH = UNIT_PRICE_MONTH * QUANTITY;//每月单位价格
+
+            List<Map<String, String>> monthRateList = getMonthRateList(period_begin_date, period_end_date);
+
+            double rateSum = monthRateList.stream().filter(k -> k.get("rate") != null).mapToDouble(k -> Double.parseDouble(k.get("rate"))).sum();
+            double PERIOD_PRICE = servicePeriod.getDouble("PERIOD_PRICE");
+            double unit_PRICE = PERIOD_PRICE / rateSum;
+
+            jobLogger.info("【服务周期拆分】单价:" + unit_PRICE);
+            jobLogger.info("【服务周期拆分】单价:" + UNIT_PRICE_MONTH);
+
+
+            for (Map<String, String> monthRate : monthRateList) {
+                jobLogger.info("【服务周期拆分】开始日期:" + monthRate.get("start") + " 结束日期:" + monthRate.get("end") + " 占比:" + monthRate.get("rate"));
+
+                BO itemBO = new BO();
+                itemBO.set("CONTRACT_ID", servicePeriod.get("CONTRACT_ID"));
+                itemBO.set("CONTRACT_SERVICE_ID", servicePeriod.get("CONTRACT_SERVICE_ID"));
+                itemBO.set("QUANTITY", servicePeriod.get("QUANTITY"));
+                itemBO.set("ITEM_MONTH", monthRate.get("start").substring(0, 7).replace("-", ""));
+                itemBO.set("CONTRACT_SERVICE_PERIOD_ID", servicePeriod.get("ID"));
+                itemBO.set("PERIOD_BEGIN_DATE", monthRate.get("start"));
+                itemBO.set("PERIOD_END_DATE", monthRate.get("end"));
+                String rate = monthRate.get("rate");
+                double rated = Double.parseDouble(rate);
+
+                itemBO.set("PERIOD_PRICE", unit_PRICE * rated);
+
+                itemBO.set("PARTYA_PRICE_MONTH", PARTYA_UNIT_PRICE_MONTH * rated);
+                SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_MONTH", itemBO, null);
+            }
+        }
+    }
+
+
+    /**
+     * 计算日期范围内每个涉及月份的【开始日期、结束日期、占比】
+     * @param start 整体开始日期(包含)
+     * @param end 整体结束日期(包含)
+     * @return List<MonthRateVO>:每个元素包含该月的计算开始日、结束日、占比(按月份顺序)
+     */
+    public static List<Map<String, String>> getMonthRateList(LocalDate start, LocalDate end) {
+        // 初始化返回结果(按月份顺序存储)
+        List<Map<String, String>> monthRateList = new ArrayList<>();
+
+        // 校验日期合法性:start不能晚于end
+        if (start.isAfter(end)) {
+            return monthRateList; // 返回空列表,也可抛异常
+        }
+
+        // 步骤1:获取日期范围涉及的所有月份(从start月到end月)
+        LocalDate currentMonthFirstDay = start.with(TemporalAdjusters.firstDayOfMonth());
+        LocalDate endMonthFirstDay = end.with(TemporalAdjusters.firstDayOfMonth());
+
+        // 步骤2:遍历每个月份,计算该月的区间和占比
+        while (!currentMonthFirstDay.isAfter(endMonthFirstDay)) {
+            // 当前月的最后一天
+            LocalDate currentMonthLastDay = currentMonthFirstDay.with(TemporalAdjusters.lastDayOfMonth());
+
+            // 确定当前月的实际计算起始/结束日
+            LocalDate calcStart = currentMonthFirstDay.equals(start.with(TemporalAdjusters.firstDayOfMonth())) ? start // 起始月:从整体start当天开始
+                    : currentMonthFirstDay; // 中间月/结束月:从当月1日开始
+
+            LocalDate calcEnd = currentMonthFirstDay.equals(end.with(TemporalAdjusters.firstDayOfMonth())) ? end // 结束月:到整体end当天结束
+                    : currentMonthLastDay; // 起始月/中间月:到当月最后一天结束
+
+            // 计算当前月内的天数(包含首尾)
+            int daysInMonthForRange = (int) java.time.temporal.ChronoUnit.DAYS.between(calcStart, calcEnd) + 1;
+
+            // 计算当月总天数(按参数选择30天或自然月天数)
+            int totalDaysInMonth = currentMonthLastDay.getDayOfMonth();
+
+            // 计算占比(保留10位小数,四舍五入)
+            BigDecimal monthRate = BigDecimal.valueOf(daysInMonthForRange).divide(BigDecimal.valueOf(totalDaysInMonth), 10, RoundingMode.HALF_UP);
+
+            // 封装到VO对象,加入列表
+            Map<String, String> monthRateMap = new HashMap<>();
+            monthRateMap.put("start", LocalDateYYYYMMDD(calcStart));
+            monthRateMap.put("end", LocalDateYYYYMMDD(calcEnd));
+            monthRateMap.put("rate", monthRate.toString());
+            monthRateList.add(monthRateMap);
+            // 切换到下一个月的第一天
+            currentMonthFirstDay = currentMonthFirstDay.plusMonths(1).with(TemporalAdjusters.firstDayOfMonth());
+        }
+
+        return monthRateList;
+    }
+
+
+}

+ 41 - 5
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractService.java

@@ -1128,17 +1128,41 @@ public class contractService {
         if (EFFECTIVE_END_DATE != null)
             END_DATE = EFFECTIVE_END_DATE;
 
+        //做过服务调整
+        if (DBSql.getInt("SELECT count(1) AS CNT FROM BO_EU_DNCTT_CONTRACT_SERVICE_SALE_ADJUST WHERE CONTRACT_SERVICE_ID=? ", new Object[]{service.get("ID")}) > 0) {
+            return false;
+        }
+
+        LocalDate YS_EFFECTIVE_DATE = EFFECTIVE_DATE;
+        LocalDate YS_END_DATE = END_DATE;
+
+        String CALC_METHOD_1STPERIOD = service.getString("CALC_METHOD_1STPERIOD");
+
+        if (CALC_METHOD_1STPERIOD.equals("4598") || CALC_METHOD_1STPERIOD.equals("4595") || CALC_METHOD_1STPERIOD.equals("4592")) {
+
+        } else {
+            //固定价格,按照整个月计算
+            if (service.getString("FIXED_PRICE").equals("1")) {
+                EFFECTIVE_DATE = (EFFECTIVE_DATE.withDayOfMonth(1)); //当月1号
+                END_DATE = END_DATE.withDayOfMonth(END_DATE.lengthOfMonth()); //当月最后一天;
+            }
+        }
+
         //已经审批并提交则不能重新生成服务
         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  BINDID=? and CONTRACT_ID=? and CONTRACT_SERVICE_ID=? ", new Object[]{service.get("BINDID"), contract.get("ID"), service.get("ID")}) > 0) {
             return false;
         }
 
         //删除历史数据
+        /*
         List<String> cspIdList = DBSql.getList(conn, "select ID from BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD where BINDID=? and CONTRACT_ID=? and OBJECT_ID=? and CONTRACT_SERVICE_ID=?", String.class, new Object[]{service.get("BINDID"), contract.get("ID"), service.get("OBJECT_ID"), service.get("ID")});
         for (String cspId : cspIdList) {
             DBSql.update(conn, "delete from BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD_BUNDLE_SERVICE where BINDID=? and CONTRACT_SERVICE_PERIOD_ID=? ", new Object[]{service.get("BINDID"), cspId});
         }
-        DBSql.update(conn, "delete from BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD where BINDID=? and CONTRACT_ID=? and OBJECT_ID=? and CONTRACT_SERVICE_ID=?", new Object[]{service.get("BINDID"), contract.get("ID"), service.get("OBJECT_ID"), service.get("ID")});
+         */
+
+        //删除历史服务周期
+        DBSql.update(conn, "delete from BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD where CONTRACT_SERVICE_ID=?", new Object[]{service.get("ID")});
 
 
         String PERIOD_TYPE = service.getString("PERIOD_TYPE");//服务周期类型
@@ -1164,10 +1188,15 @@ public class contractService {
 
         //获取服务周期
         //List<PeriodCalculationUtil.Period> periodList = PeriodCalculationUtil.getPeriodList(PERIOD_TYPE, START_DATE, EFFECTIVE_DATE, END_DATE, true, true, -1);
-        String CALC_METHOD_1STPERIOD = service.getString("CALC_METHOD_1STPERIOD");
+
         List<PeriodCalculationUtil.Period> periodList = PeriodCalculationUtil.getPeriodListByConfig(PERIOD_TYPE, EFFECTIVE_DATE, EFFECTIVE_DATE, END_DATE, CALC_METHOD_1STPERIOD, service.getString("CALC_METHOD_1STYEAR"), service.getString("MONTH_1STQUARTER"));
 
         if (periodList != null && periodList.size() > 0) {
+
+            //周期原来的开始日期和结束日期
+            periodList.get(0).setPeriodBeginDate(YS_EFFECTIVE_DATE);
+            periodList.get(periodList.size() - 1).setPeriodEndDate(YS_END_DATE);
+
             String PERIOD = periodList.get(0).getPeriodBeginDateStr() + "~" + periodList.get(periodList.size() - 1).getPeriodEndDateStr();
 
             //首月+3个月、首月+6个月、首月+12个月 的情况,需要把前两条 合并成一条
@@ -2409,7 +2438,7 @@ public class contractService {
                 // 定义日期格式
                 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                 // 解析字符串为 LocalDate
-               // contractServiceLogger.info("getLocalDate" + obj.toString());
+                // contractServiceLogger.info("getLocalDate" + obj.toString());
                 return LocalDate.parse(obj.toString(), formatter);
             } else if (obj instanceof Date) {
                 return ((Date) obj).toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
@@ -2637,6 +2666,8 @@ public class contractService {
 
                 String ORGID = uc.getCompanyModel().getId();
 
+                String BILL_TO_ACCOUNT_ID=DBSql.getString("select BILL_ACCOUNT_ID from VIEW_EU_DNV_PENDING_RECURRING_CONTRACT where ID=?",new Object[]{approveId});
+
                 //BO_EU_DNCTT_CONTRACT
                 BO bo = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT", approveId);//合同初始费用
                 if (bo != null) {
@@ -2651,7 +2682,10 @@ public class contractService {
                     cad.set("QUANTITY", 1);
                     cad.set("BILL_CREATE_USER_ID", bo.getCreateUser());//创建人
                     cad.set("ACCOUNT_ID", bo.getString("ACCOUNT_ID"));
-                    cad.set("BILL_ACCOUNT_ID", bo.getString("BILL_TO_ACCOUNT_ID"));
+                   // cad.set("BILL_ACCOUNT_ID", bo.getString("BILL_TO_ACCOUNT_ID"));
+
+                    cad.set("BILL_ACCOUNT_ID",BILL_TO_ACCOUNT_ID);
+
                     cad.set("EXTENDED_PRICE", bo.get("ADJUST_SETUP_FEE"));
 
                     if (StringUtils.isNotBlank(bo.getString("SETUP_FEE_COST_CODE_ID"))) {
@@ -2677,7 +2711,9 @@ public class contractService {
 
                         cad.set("BILL_CREATE_USER_ID", bo.getCreateUser());//创建人
                         cad.set("ACCOUNT_ID", DBSql.getString("SELECT ACCOUNT_ID FROM BO_EU_DNCTT_CONTRACT WHERE ID = ?", new Object[]{bo.getString("CONTRACT_ID")}));
-                        cad.set("BILL_ACCOUNT_ID", DBSql.getString("SELECT BILL_TO_ACCOUNT_ID FROM BO_EU_DNCTT_CONTRACT WHERE ID = ?", new Object[]{bo.getString("CONTRACT_ID")}));
+                        //cad.set("BILL_ACCOUNT_ID", DBSql.getString("SELECT BILL_TO_ACCOUNT_ID FROM BO_EU_DNCTT_CONTRACT WHERE ID = ?", new Object[]{bo.getString("CONTRACT_ID")}));
+
+                        cad.set("BILL_ACCOUNT_ID",BILL_TO_ACCOUNT_ID);
 
                         cad.set("EXTENDED_PRICE", bo.get("PERIOD_ADJUSTED_PRICE"));
                         cad.set("EXTENDED_COST", bo.get("PERIOD_COST"));

+ 98 - 13
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractServiceAdj.java

@@ -56,11 +56,14 @@ public class contractServiceAdj {
      * @return
      */
     public String editServiceSale(UserContext uc, String serviceId, String remark) {
-        RowMap contractService = DBSql.getMap("SELECT * FROM BO_EU_DNCTT_CONTRACT_SERVICE_SALE_ADJUST WHERE CONTRACT_SERVICE_ID=? AND IS_EFFECTIVE='未执行' ", new Object[]{serviceId});
 
-        //存在未完成的调整单,继续编辑
-        if (contractService != null) {
-            return contractService.getString("BINDID");
+        RowMap contractService = null;
+        if (remark == null || !remark.equals("修改结束日期")) {
+            contractService = DBSql.getMap("SELECT * FROM BO_EU_DNCTT_CONTRACT_SERVICE_SALE_ADJUST WHERE CONTRACT_SERVICE_ID=? AND IS_EFFECTIVE='未执行' ", new Object[]{serviceId});
+            //存在未完成的调整单,继续编辑
+            if (contractService != null) {
+                return contractService.getString("BINDID");
+            }
         }
 
         contractService = DBSql.getMap("SELECT * FROM BO_EU_DNCTT_CONTRACT_SERVICE_SALE_ADJUST WHERE CONTRACT_SERVICE_ID=? AND IS_EFFECTIVE='已执行' ORDER BY  CREATEDATE DESC ", new Object[]{serviceId});
@@ -101,7 +104,7 @@ public class contractServiceAdj {
 
         if (editBO.get("END_DATE") == null) {
             DBSql.update("UPDATE BO_EU_DNCTT_CONTRACT_SERVICE a JOIN BO_EU_DNCTT_CONTRACT b ON a.CONTRACT_ID=b.ID set a.END_DATE=b.END_DATE WHERE a.END_DATE IS NULL AND a.ID=?", new Object[]{serviceId});
-            DBSql.update("UPDATE BO_EU_DNCTT_CONTRACT_SERVICE_SALE_ADJUST a JOIN BO_EU_DNCTT_CONTRACT b ON a.CONTRACT_ID=b.ID set a.END_DATE=b.END_DATE WHERE a.END_DATE IS NULL a.CONTRACT_SERVICE_ID=?", new Object[]{serviceId});
+            DBSql.update("UPDATE BO_EU_DNCTT_CONTRACT_SERVICE_SALE_ADJUST a JOIN BO_EU_DNCTT_CONTRACT b ON a.CONTRACT_ID=b.ID set a.END_DATE=b.END_DATE WHERE a.END_DATE IS NULL AND a.CONTRACT_SERVICE_ID=?", new Object[]{serviceId});
         }
 
         return contractInstance.getId();
@@ -123,6 +126,37 @@ public class contractServiceAdj {
         //合同服务
         BO orgContractService = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_SERVICE", contractService.getString("CONTRACT_SERVICE_ID"));
 
+        LocalDate YS_EFFECTIVE_DATE = EFFECTIVE_DATE;
+        LocalDate YS_END_DATE = EFFECTIVE_END_DATE;
+        String CALC_METHOD_1STPERIOD = contractService.getString("CALC_METHOD_1STPERIOD");
+
+        if (CALC_METHOD_1STPERIOD.equals("4598") || CALC_METHOD_1STPERIOD.equals("4595") || CALC_METHOD_1STPERIOD.equals("4592")) {
+
+        } else {
+            //固定价格,按照整个月计算
+            if (orgContractService.getString("FIXED_PRICE").equals("1")) {
+                //需要判断是当月1号,还是下月1号  合同开始日期
+
+                String minPERIOD_BEGIN_DATE = DBSql.getString("select min(PERIOD_BEGIN_DATE) PERIOD_BEGIN_DATE from BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD where CONTRACT_SERVICE_ID=?", new Object[]{contractService.get("CONTRACT_SERVICE_ID")});
+
+                minPERIOD_BEGIN_DATE = minPERIOD_BEGIN_DATE.substring(0, 10);
+                if (minPERIOD_BEGIN_DATE.compareTo(LocalDateYYYYMMDD(EFFECTIVE_DATE)) >= 0) {
+                    EFFECTIVE_DATE = (EFFECTIVE_DATE.withDayOfMonth(1)); //当月1号
+                } else {
+                    if (DBSql.getInt("select count(1) CNT from BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD where PERIOD_BEGIN_DATE<? and CONTRACT_SERVICE_ID=?", new Object[]{LocalDateYYYYMMDD(EFFECTIVE_DATE), contractService.get("CONTRACT_SERVICE_ID")}) > 0 && EFFECTIVE_DATE.getDayOfMonth() > 1) {
+                        //下月1号
+                        EFFECTIVE_DATE = (EFFECTIVE_DATE.plusMonths(1)).withDayOfMonth(1);
+                    } else {
+                        EFFECTIVE_DATE = (EFFECTIVE_DATE.withDayOfMonth(1)); //当月1号
+                    }
+                    YS_EFFECTIVE_DATE = EFFECTIVE_DATE;
+                }
+
+                EFFECTIVE_END_DATE = EFFECTIVE_END_DATE.withDayOfMonth(EFFECTIVE_END_DATE.lengthOfMonth()); //当月最后一天;
+            }
+        }
+
+
         //生效日期之前的一次调整
         RowMap lastContractService = DBSql.getMap("select * from BO_EU_DNCTT_CONTRACT_SERVICE_SALE_ADJUST where  CONTRACT_SERVICE_ID=? and EFFECTIVE_DATE <=? and IS_EFFECTIVE='已执行' order by EFFECTIVE_DATE desc", new Object[]{contractService.get("CONTRACT_SERVICE_ID"), LocalDateYYYYMMDD(EFFECTIVE_DATE)});
 
@@ -197,7 +231,7 @@ public class contractServiceAdj {
 
             }
 
-            String CALC_METHOD_1STPERIOD = contractService.getString("CALC_METHOD_1STPERIOD");
+
             //获取服务周期
             List<PeriodCalculationUtil.Period> periodList = PeriodCalculationUtil.getPeriodListByConfig(PERIOD_TYPE, EFFECTIVE_DATE, EFFECTIVE_DATE, EFFECTIVE_END_DATE, CALC_METHOD_1STPERIOD, "4638", contractService.getString("MONTH_1STQUARTER"));
 
@@ -225,6 +259,10 @@ public class contractServiceAdj {
                     sbsList = Arrays.asList(serviceIds.split(","));
                 }
 
+                //周期原来的开始日期和结束日期
+                //periodList.get(0).setPeriodBeginDate(YS_EFFECTIVE_DATE);
+                periodList.get(periodList.size() - 1).setPeriodEndDate(YS_END_DATE);
+
                 //首月+3个月、首月+6个月、首月+12个月 的情况,需要把前两条 合并成一条
                 if (periodList.size() > 1) {
                     if (CALC_METHOD_1STPERIOD.equals("4597") || CALC_METHOD_1STPERIOD.equals("4594") || CALC_METHOD_1STPERIOD.equals("4591")) {
@@ -325,7 +363,10 @@ public class contractServiceAdj {
             BigDecimal result = SERVICE_UNIT_PRICE.divide(BigDecimal.valueOf(periodMonths), 4, // 精度:保留2位小数
                     RoundingMode.HALF_UP // 舍入模式:四舍五入
             );
-            orgContractService.set("SERVICE_UNIT_PRICE", result);
+           // orgContractService.set("SERVICE_UNIT_PRICE", result);
+
+            orgContractService.set("UNIT_PRICE_MONTH", 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")}); //税种
 
@@ -339,6 +380,9 @@ public class contractServiceAdj {
 
                 orgContractService.set("UNIT_PRICE_NOTAX", SERVICE_UNIT_PRICE.divide(BigDecimal.ONE.add(taxRate), 4, BigDecimal.ROUND_HALF_UP));
 
+                //月不含税单价 UNIT_PRICE_MONTH_NOTAX
+                orgContractService.set("UNIT_PRICE_MONTH_NOTAX", SERVICE_UNIT_PRICE.divide(BigDecimal.ONE.add(taxRate), 4, BigDecimal.ROUND_HALF_UP).divide(BigDecimal.valueOf(periodMonths), 4, BigDecimal.ROUND_HALF_UP));
+
                 //周期不含税总价 TOTAL_PRICE_NOTAX
                 orgContractService.set("TOTAL_PRICE_NOTAX", SERVICE_TOTAL_PRICE.divide(BigDecimal.ONE.add(taxRate), 4, BigDecimal.ROUND_HALF_UP));
             } else {
@@ -483,13 +527,18 @@ public class contractServiceAdj {
      * @return
      */
     public String editServicePurchase(UserContext uc, String serviceId, String remark) {
-        RowMap contractService = DBSql.getMap("SELECT * FROM BO_EU_DNCTT_CONTRACT_SERVICE_PURCHASE_ADJUST WHERE CONTRACT_SERVICE_ID=? AND IS_EFFECTIVE='未执行' ", new Object[]{serviceId});
 
-        //存在未完成的调整单,继续编辑
-        if (contractService != null) {
-            return contractService.getString("BINDID");
+        RowMap contractService = null;
+        if (remark == null || !remark.equals("修改结束日期")) {
+            contractService = DBSql.getMap("SELECT * FROM BO_EU_DNCTT_CONTRACT_SERVICE_PURCHASE_ADJUST WHERE CONTRACT_SERVICE_ID=? AND IS_EFFECTIVE='未执行' ", new Object[]{serviceId});
+
+            //存在未完成的调整单,继续编辑
+            if (contractService != null) {
+                return contractService.getString("BINDID");
+            }
         }
 
+
         contractService = DBSql.getMap("SELECT * FROM BO_EU_DNCTT_CONTRACT_SERVICE_PURCHASE_ADJUST WHERE CONTRACT_SERVICE_ID=? AND IS_EFFECTIVE='已执行' ORDER BY  CREATEDATE DESC ", new Object[]{serviceId});
 
         String processDefId = "obj_b147ad05008546058736a06bc6205313";//采购
@@ -580,7 +629,7 @@ public class contractServiceAdj {
                         EFFECTIVE_DATE = DBSql.getString("SELECT max(PERIOD_BEGIN_DATE) as PERIOD_BEGIN_DATE FROM BO_EU_DNIVT_ORDER_PAYMENT_PLAN WHERE  CONTRACT_SERVICE_ID=? AND  PERIOD_BEGIN_DATE <=?", new Object[]{serviceId, LocalDateYYYYMMDD(newEndDate)});
                         EFFECTIVE_DATE = EFFECTIVE_DATE.length() >= 10 ? EFFECTIVE_DATE.substring(0, 10) : EFFECTIVE_DATE;
                         EFFECTIVE_DATE1 = TypeUtil.convert(EFFECTIVE_DATE, LocalDate.class);
-                       // EFFECTIVE_DATE1 = EFFECTIVE_DATE1.plusDays(1);
+                        // EFFECTIVE_DATE1 = EFFECTIVE_DATE1.plusDays(1);
                     } else {
                         EFFECTIVE_DATE = EFFECTIVE_DATE.length() >= 10 ? EFFECTIVE_DATE.substring(0, 10) : EFFECTIVE_DATE;
 
@@ -677,6 +726,36 @@ public class contractServiceAdj {
         //合同服务
         BO orgContractService = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_SERVICE", contractService.getString("CONTRACT_SERVICE_ID"));
 
+
+        LocalDate YS_EFFECTIVE_DATE = EFFECTIVE_DATE;
+        LocalDate YS_END_DATE = EFFECTIVE_END_DATE;
+
+        if (PURCHASE_CALC_METHOD_1STPERIOD.equals("4598") || PURCHASE_CALC_METHOD_1STPERIOD.equals("4595") || PURCHASE_CALC_METHOD_1STPERIOD.equals("4592")) {
+
+        } else {
+            //固定价格,按照整个月计算
+            if (orgContractService.getString("FIXED_PRICE").equals("1")) {
+                //需要判断是当月1号,还是下月1号  合同开始日期
+
+                String minPERIOD_BEGIN_DATE = DBSql.getString("select min(PERIOD_BEGIN_DATE) PERIOD_BEGIN_DATE from " + boName + " where CONTRACT_SERVICE_ID=?", new Object[]{contractService.get("CONTRACT_SERVICE_ID")});
+
+                minPERIOD_BEGIN_DATE = minPERIOD_BEGIN_DATE.substring(0, 10);
+                if (minPERIOD_BEGIN_DATE.compareTo(LocalDateYYYYMMDD(EFFECTIVE_DATE)) >= 0) {
+                    EFFECTIVE_DATE = (EFFECTIVE_DATE.withDayOfMonth(1)); //当月1号
+                } else {
+                    if (DBSql.getInt("select count(1) CNT from " + boName + " where PERIOD_BEGIN_DATE<? and CONTRACT_SERVICE_ID=?", new Object[]{LocalDateYYYYMMDD(EFFECTIVE_DATE), contractService.get("CONTRACT_SERVICE_ID")}) > 0 && EFFECTIVE_DATE.getDayOfMonth() > 1) {
+                        //下月1号
+                        EFFECTIVE_DATE = (EFFECTIVE_DATE.plusMonths(1)).withDayOfMonth(1);
+                    } else {
+                        EFFECTIVE_DATE = (EFFECTIVE_DATE.withDayOfMonth(1)); //当月1号
+                    }
+                    YS_EFFECTIVE_DATE = EFFECTIVE_DATE;
+                }
+
+                EFFECTIVE_END_DATE = EFFECTIVE_END_DATE.withDayOfMonth(EFFECTIVE_END_DATE.lengthOfMonth()); //当月最后一天;
+            }
+        }
+
         //生效日期之前的一次调整
         RowMap lastContractService = DBSql.getMap("select * from BO_EU_DNCTT_CONTRACT_SERVICE_PURCHASE_ADJUST where  CONTRACT_SERVICE_ID=? and PURCHASE_START_DATE <=? and IS_EFFECTIVE='已执行' order by PURCHASE_START_DATE desc", new Object[]{contractService.get("CONTRACT_SERVICE_ID"), LocalDateYYYYMMDD(EFFECTIVE_DATE)});
 
@@ -708,7 +787,6 @@ public class contractServiceAdj {
             BigDecimal COST_1STMONTH = null;
             LocalDate START_DATE = EFFECTIVE_DATE;
 
-
             //获取第一笔
             //首月成本
             if (PURCHASE_CALC_METHOD_1STPERIOD.equals("4598") || PURCHASE_CALC_METHOD_1STPERIOD.equals("4595") || PURCHASE_CALC_METHOD_1STPERIOD.equals("4592")) {
@@ -723,6 +801,11 @@ public class contractServiceAdj {
                 if (firstEFFECTIVE_DATE.getYear() == EFFECTIVE_DATE.getYear() && firstEFFECTIVE_DATE.getMonth() == EFFECTIVE_DATE.getMonth()) {
                     teshuchuli = true;
                     teshuchuliBeginDate = LocalDateYYYYMMDD(EFFECTIVE_DATE);
+
+                    if (orgContractService.getString("FIXED_PRICE").equals("1")) {
+                        teshuchuliBeginDate = LocalDateYYYYMMDD(YS_EFFECTIVE_DATE);
+                    }
+
                     SERVICE_UNIT_COST = TypeUtil.convert(contractService.get("UNIT_COST_1STMONTH"), BigDecimal.class);
                     SERVICE_TOTAL_COST = multiply(SERVICE_UNIT_COST, contractService.get("QUANTITY"));
 
@@ -817,6 +900,8 @@ public class contractServiceAdj {
 
             if (periodList != null && periodList.size() > 0) {
 
+                periodList.get(periodList.size() - 1).setPeriodEndDate(YS_END_DATE);
+
                 int i = 0;
                 for (PeriodCalculationUtil.Period period : periodList) {
                     i++;

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

@@ -15,7 +15,6 @@ import com.actionsoft.bpms.util.DBSql;
 import com.actionsoft.bpms.util.TypeUtil;
 import com.actionsoft.sdk.local.SDK;
 import com.actionsoft.sdk.local.api.Logger;
-import com.actionsoft.sdk.local.api.TaskAPI;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -679,16 +678,17 @@ public class ivtOrderController {
 
     @Mapping(value = "com.awspaas.user.apps.donenow_ivt.contract_serviceOrder_exec2", session = false, noSessionEvaluate = "无安全隐患", noSessionReason = "批量生产")
     public String contractServicExec2() throws SQLException {
-        List<RowMap> services = DBSql.getMaps("SELECT DISTINCT c.ID FROM bo_eu_dnctt_contract_service a JOIN bo_eu_dnivt_order_product b ON a.ID=b.CONTRACT_SERVICE_ID JOIN wfc_task c ON b.BINDID=c.PROCESSINSTID WHERE  c.CONTROLSTATE='active' AND c.TASKSTATE=1  AND a.CONTRACT_ID in (SELECT ID FROM BO_EU_DNCTT_CONTRACT WHERE FRAMEWORK='7c2841c3-8f51-4dea-a6ea-984d9b9c3574' AND NO NOT LIKE '%old%' ) ");
-        UserContext uc = UserContext.fromUID("admin");
+        List<RowMap> services = DBSql.getMaps("SELECT DISTINCT c.ORDER_ID FROM BO_EU_DNCTT_CONTRACT a JOIN bo_eu_dnctt_contract_service b ON b.CONTRACT_ID=a.ID JOIN BO_EU_DNIVT_ORDER_PAYMENT_PLAN c ON c.CONTRACT_SERVICE_ID=b.ID WHERE a.NAME LIKE '%历峰%' AND b.SERVICE_NAME='网络线路' AND b.CALC_METHOD_1STPERIOD='4599' AND b.CREATEUSER='hulei'");
 
-        TaskAPI taskAPI = SDK.getTaskAPI();
+        UserContext uc = UserContext.fromUID("hulei");
 
         for (RowMap service : services) {
-            String taskId = service.getString("ID");
-            taskAPI.completeTask(taskId, "admin");
-        }
 
+            String orderId = service.getString("ORDER_ID");
+
+            PaymentPlanService.getInstance().createPaymentPlan(uc, orderId);
+
+        }
 
 
         return "ok";
@@ -840,7 +840,7 @@ public class ivtOrderController {
 
                 String taxCategoryId = null;
                 //增值税发票,选择是时,才需要展示税率
-                if(StringUtils.isNotBlank(cost.getString("IS_SERVICE_PRODUCT")) && "1".equals(cost.getString("IS_SERVICE_PRODUCT"))){
+                if (StringUtils.isNotBlank(cost.getString("IS_SERVICE_PRODUCT")) && "1".equals(cost.getString("IS_SERVICE_PRODUCT"))) {
                     if (StringUtils.isNotBlank(cost.getString("SERVICE_ID"))) {
                         RowMap serviceMap = DBSql.getMap("select PURCHASE_TAX_CATEGORY_ID,VAT_TAX from BO_EU_DNCTT_CONTRACT_SERVICE where ID=?", new Object[]{cost.getString("SERVICE_ID")});
                         if (serviceMap.getString("VAT_TAX").equals("1")) {
@@ -849,7 +849,7 @@ public class ivtOrderController {
                             taxCategoryId = zeroTaxTaxCateId;
                         }
                     }
-                }else {
+                } else {
                     taxCategoryId = cost.getString("TAX_CATEGORY_ID");
                 }
 
@@ -945,7 +945,7 @@ public class ivtOrderController {
             e.printStackTrace();
             if (conn != null) {
                 try {
-                    conn.rollback();    
+                    conn.rollback();
                 } catch (SQLException ex) {
                     System.err.println("事务回滚异常: " + ex.getMessage());
                 }

+ 19 - 0
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/service/PaymentPlanService.java

@@ -206,9 +206,22 @@ public class PaymentPlanService {
         LocalDate START_DATE = PERIOD_BEGIN_DATE;
         LocalDate PERIOD_END_DATE = service.get("PURCHASE_END_DATE", LocalDate.class);//新增采购结束时间
 
+        LocalDate YS_EFFECTIVE_DATE=PERIOD_BEGIN_DATE;
+        LocalDate YS_END_DATE=PERIOD_END_DATE;
 
         String PURCHASE_CALC_METHOD_1STPERIOD = service.getString("PURCHASE_CALC_METHOD_1STPERIOD");
 
+        if (PURCHASE_CALC_METHOD_1STPERIOD.equals("4598") || PURCHASE_CALC_METHOD_1STPERIOD.equals("4595") || PURCHASE_CALC_METHOD_1STPERIOD.equals("4592")) {
+
+        }else{
+            //固定价格,按照整个月计算
+            if (service.getString("FIXED_PRICE").equals("1")) {
+                PERIOD_BEGIN_DATE = (PERIOD_BEGIN_DATE.withDayOfMonth(1)); //当月1号
+                START_DATE = PERIOD_BEGIN_DATE;
+                PERIOD_END_DATE = PERIOD_END_DATE.withDayOfMonth(PERIOD_END_DATE.lengthOfMonth()); //当月最后一天;
+            }
+        }
+
         if (StringUtils.isBlank(RULE_CATE) || StringUtils.isBlank(PURCHASE_CALC_METHOD_1STPERIOD)) {
             return;
         }
@@ -239,6 +252,9 @@ public class PaymentPlanService {
             if (PERIOD_BEGIN_DATE.getDayOfMonth() == 1 && RULE_CATE.equals("610") && boName.equals("BO_EU_DNIVT_ORDER_PAYMENT_PLAN")) {
 
                 firstPeriodBeginDate = PERIOD_BEGIN_DATE.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+                if (service.getString("FIXED_PRICE").equals("1"))
+                    firstPeriodBeginDate = YS_EFFECTIVE_DATE.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+
                 //下月一号
                 PERIOD_BEGIN_DATE = PERIOD_BEGIN_DATE.plusMonths(1).withDayOfMonth(1);
 
@@ -297,6 +313,9 @@ public class PaymentPlanService {
             TOTAL_COST = TOTAL_COST.divide(new BigDecimal(periodMonths), 10, BigDecimal.ROUND_HALF_UP);
 
         int i = 0;
+
+        periods.get(periods.size() - 1).setPeriodEndDate(YS_END_DATE);
+
         for (PeriodCalculationUtil.Period period : periods) {
             i++;
 

+ 1 - 1
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/utils/PeriodCalculationUtil.java

@@ -287,7 +287,7 @@ public class PeriodCalculationUtil {
         }
 
         // 3.2 处理首个周期
-        if (currLastDay != null && currLastDay.equals(periodBeginDate) == false) {
+        if (currLastDay != null) {
             if(currLastDay.isAfter(periodEndDate))
                 currLastDay=periodEndDate;
             if (userMonthDay) {