zhangyao 1 mēnesi atpakaļ
vecāks
revīzija
ffb12c6e26

+ 116 - 0
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/QrCodeReaderUtil.java

@@ -0,0 +1,116 @@
+package com.awspaas.user.apps.donenow_ctt;
+
+import com.google.zxing.*;
+import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
+import com.google.zxing.common.HybridBinarizer;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.rendering.PDFRenderer;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+
+public class QrCodeReaderUtil {
+
+    /**
+     * 从图片或PDF文件中识别二维码。
+     * 如果是PDF,会逐页扫描,直到找到第一个二维码。
+     *
+     * @param file 图片文件(如.jpg, .png)或PDF文件(.pdf)
+     * @return 识别到的二维码内容。如果未找到或发生错误,返回相应的错误信息字符串。
+     */
+    public static String readQrCode(File file) {
+        if (!file.exists()) {
+            return "错误:文件不存在。";
+        }
+
+        String fileName = file.getName().toLowerCase();
+
+        try {
+            // 1. 判断文件类型并处理
+            if (fileName.endsWith(".pdf")) {
+                return readQrFromPdf(file);
+            } else if (fileName.endsWith(".jpg") || fileName.endsWith(".jpeg") || fileName.endsWith(".png") || fileName.endsWith(".gif")) {
+                return readQrFromImage(file);
+            } else {
+                return "错误:不支持的文件格式。请提供图片(.jpg, .png等)或PDF(.pdf)文件。";
+            }
+
+        } catch (Exception e) {
+            // 捕获所有其他未预料的异常
+            return "处理文件时发生未知错误: " + e.getMessage();
+        }
+    }
+
+    /**
+     * 从图片文件中识别二维码
+     */
+    private static String readQrFromImage(File imageFile) throws IOException {
+        BufferedImage image = ImageIO.read(imageFile);
+        if (image == null) {
+            return "无法加载图片或图片格式不支持。";
+        }
+        return decodeImage(image);
+    }
+
+    /**
+     * 从PDF文件中识别二维码
+     */
+    private static String readQrFromPdf(File pdfFile) throws IOException {
+        try (PDDocument document = PDDocument.load(pdfFile)) { // try-with-resources 确保文档被关闭
+            if (document.isEncrypted()) {
+                return "错误:无法处理加密的PDF文件。";
+            }
+
+            PDFRenderer renderer = new PDFRenderer(document);
+            int numPages = document.getNumberOfPages();
+
+            System.out.println("开始扫描PDF文件,共 " + numPages + " 页...");
+
+            for (int i = 0; i < numPages; i++) {
+                // 将第 i 页渲染成 BufferedImage
+                // 300 是 DPI (dots per inch),值越高图片越清晰,但识别速度越慢。300是一个不错的平衡。
+                BufferedImage image = renderer.renderImageWithDPI(i, 300);
+                String result = decodeImage(image);
+
+                // 如果在当前页识别到了二维码,直接返回结果
+                if (!result.startsWith("在图片中未找到二维码") && !result.startsWith("识别二维码时发生未知错误")) {
+                    System.out.println("在第 " + (i + 1) + " 页成功识别到二维码。");
+                    return result;
+                }
+            }
+            // 如果所有页都扫描完仍未找到
+            return "在PDF文件的所有页面中均未找到二维码。";
+        }
+    }
+
+    /**
+     * 核心解码逻辑,接收一个 BufferedImage 并尝试识别其中的二维码
+     */
+    private static String decodeImage(BufferedImage image) {
+        try {
+            LuminanceSource source = new BufferedImageLuminanceSource(image);
+            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
+
+            Map<DecodeHintType, Object> hints = new HashMap<>();
+            hints.put(DecodeHintType.POSSIBLE_FORMATS, EnumSet.of(BarcodeFormat.QR_CODE));
+            hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
+            hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
+
+            MultiFormatReader reader = new MultiFormatReader();
+            Result result = reader.decode(bitmap, hints);
+
+            return "内容: " + result.getText() + "; 格式: " + result.getBarcodeFormat();
+
+        } catch (NotFoundException e) {
+            // 这个异常是预期的,当图片中没有二维码时抛出
+            return "在图片中未找到二维码。";
+        } catch (Exception e) {
+            return "识别二维码时发生未知错误: " + e.getMessage();
+        }
+    }
+}

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

@@ -14,7 +14,6 @@ import com.awspaas.user.apps.donenow_ctt.service.contractServiceAdj;
 import org.apache.commons.lang3.StringUtils;
 
 import java.time.LocalDate;
-import java.util.List;
 
 import static com.awspaas.user.apps.donenow_ctt.service.contractService.LocalDateYYYYMMDD;
 import static com.awspaas.user.apps.donenow_ctt.service.contractService.getLocalDate;
@@ -147,23 +146,9 @@ public class contractServiceController {
 
 
     @Mapping(value = "com.awspaas.user.apps.donenow_ctt.service_purchase_adjustTEST")
-    public ResponseObject editServicePurchaseTest(UserContext uc) {
+    public ResponseObject editServicePurchaseTest(UserContext uc, String serviceId) {
 
-        List<String> serviceIds = DBSql.getList("SELECT ID FROM bo_eu_dnctt_contract_service where NEED_PURCHASE=1 AND ID in (SELECT CONTRACT_SERVICE_ID FROM bo_eu_dnctt_contract_service_period) AND ID NOT in (SELECT CONTRACT_SERVICE_ID FROM BO_EU_DNIVT_ORDER_PAYMENT_PLAN_MONTH) ORDER BY CREATEDATE", String.class);
-
-        for (String serviceId : serviceIds) {
-            try {
-                String bindid = contractServiceAdj.getInstance().editServicePurchase(uc, serviceId, "临时--分摊采购");
-                String boId = DBSql.getString("SELECT ID FROM BO_EU_DNCTT_CONTRACT_SERVICE_PURCHASE_ADJUST where BINDID=?", new Object[]{bindid});
-                contractServiceAdj.getInstance().execServicePurchaseAdj(uc, boId, null);
-
-                //contractServiceAdj.getInstance().paySplitServiceMonth(uc, serviceId);
-
-            } catch (Exception ex) {
-
-            }
-
-        }
+        contractServiceAdj.getInstance().paySplitServiceMonth(uc, serviceId);
 
         return ResponseObject.newOkResponse();
     }

+ 33 - 4
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/controller/invoiceController.java

@@ -1,15 +1,22 @@
 package com.awspaas.user.apps.donenow_ctt.controller;
 
+import com.actionsoft.bpms.commons.formfile.model.delegate.FormFile;
 import com.actionsoft.bpms.commons.mvc.view.ResponseObject;
 import com.actionsoft.bpms.server.UserContext;
 import com.actionsoft.bpms.server.bind.annotation.Controller;
 import com.actionsoft.bpms.server.bind.annotation.Mapping;
+import com.actionsoft.bpms.server.fs.DCContext;
 import com.actionsoft.bpms.util.DBSql;
 import com.actionsoft.sdk.local.SDK;
+import com.awspaas.user.apps.donenow_ctt.QrCodeReaderUtil;
 import com.awspaas.user.apps.donenow_ctt.service.InvoiceDealDto;
 import com.awspaas.user.apps.donenow_ctt.service.InvoiceService;
 import org.apache.commons.lang3.StringUtils;
 
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+
 /**
  * 账单管理
  */
@@ -26,8 +33,7 @@ public class invoiceController {
         InvoiceDealDto invoiceDealDto = new InvoiceDealDto();
         invoiceDealDto.setIds(accDeduIds);
         String result = InvoiceService.getInstance().processInvoice(uc, accDeduIds, invoiceDealDto, false);
-        if (StringUtils.isNotBlank(result))
-            return ResponseObject.newErrResponse(result);
+        if (StringUtils.isNotBlank(result)) return ResponseObject.newErrResponse(result);
         return ResponseObject.newOkResponse();
     }
 
@@ -52,8 +58,7 @@ public class invoiceController {
         invoiceDealDto.setDateRangeToStr(endDate);
 
         String result = InvoiceService.getInstance().processInvoice(uc, accDeduIds, invoiceDealDto, true);
-        if (StringUtils.isNotBlank(result))
-            return ResponseObject.newErrResponse(result);
+        if (StringUtils.isNotBlank(result)) return ResponseObject.newErrResponse(result);
 
         return ResponseObject.newOkResponse();
     }
@@ -105,4 +110,28 @@ public class invoiceController {
         return ResponseObject.newOkResponse().put("taxRate", taxRate);
     }
 
+
+    /**
+     * 识别二维码
+     * @param uc
+     * @return
+     */
+    @Mapping("com.awspaas.user.apps.donenow_ctt.QRReader")
+    public ResponseObject QRReader(UserContext uc) {
+
+        String qrContent = "";
+
+        List<FormFile> jars = SDK.getBOAPI().getFiles("6da746b2-c84a-4502-ada8-f0b681d19ac3", "TU");
+        for (FormFile jar : jars) {
+            DCContext dcContext = SDK.getBOAPI().getFileDCContext(jar);
+
+            Path source = Paths.get(dcContext.getFilePath());
+
+            qrContent = qrContent + "\n" + QrCodeReaderUtil.readQrCode(source.toFile());
+
+        }
+
+        return ResponseObject.newOkResponse().put("qrContent", qrContent);
+    }
+
 }

+ 2 - 1
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/InvoiceDealDto.java

@@ -151,7 +151,8 @@ public class InvoiceDealDto {
     }
 
     public LocalDate getInvoiceDate() {
-        if (invoiceDate == null) invoiceDate = LocalDate.now();
+        if (invoiceDate == null)
+            invoiceDate = LocalDate.now();
         return invoiceDate;
     }
 

+ 27 - 17
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/InvoiceService.java

@@ -10,6 +10,7 @@ import com.actionsoft.sdk.local.SDK;
 import com.actionsoft.sdk.local.api.Logger;
 import org.apache.commons.lang3.StringUtils;
 import org.joda.time.LocalDate;
+import org.joda.time.format.DateTimeFormat;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
@@ -50,8 +51,7 @@ public class InvoiceService {
         logger.info("日期范围:" + param.getDateRangeFrom() + "--" + param.getDateRangeTo());
 
         // 1. 基础校验:空值过滤
-        if (StringUtils.isBlank(accDeduIds))
-            return "参数错误";
+        if (StringUtils.isBlank(accDeduIds)) return "参数错误";
 
         String[] dedIdArr = accDeduIds.split(",");
 
@@ -85,19 +85,22 @@ public class InvoiceService {
         //ITEM_DATE   i) 弹出窗口输入账单起止日期,保存时需要校验所选条目是否在账单起止日期内
         //            ii) 批量选择条目:计费客户相同、状态必须为----未生成生成账单
 
+        org.joda.time.format.DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd");
+
         String BILL_ACCOUNT_ID = null;
         for (RowMap row : postedDataList) {
             String ITEM_DATE = row.getString("ITEM_DATE");
             if (StringUtils.isNotBlank(ITEM_DATE)) {
-                LocalDate itemDate = TypeUtil.convert(ITEM_DATE, LocalDate.class);
+
+                LocalDate itemDate = LocalDate.parse(ITEM_DATE, formatter);
+
                 //i) 弹出窗口输入账单起止日期,保存时需要校验所选条目是否在账单起止日期内
                 if (itemDate.isBefore(param.getDateRangeFrom()) || itemDate.isAfter(param.getDateRangeTo())) {
                     return "所选条目有账单起止日期不符合要求";
                 }
 
                 //  ii) 批量选择条目:计费客户相同、状态必须为----未生成生成账单
-                if (StringUtils.isBlank(BILL_ACCOUNT_ID))
-                    BILL_ACCOUNT_ID = row.getString("BILL_ACCOUNT_ID");
+                if (StringUtils.isBlank(BILL_ACCOUNT_ID)) BILL_ACCOUNT_ID = row.getString("BILL_ACCOUNT_ID");
                 else {
                     if (!BILL_ACCOUNT_ID.equals(row.getString("BILL_ACCOUNT_ID"))) {
                         return "所选条目有账单客户必须相同";
@@ -106,8 +109,7 @@ public class InvoiceService {
 
                 //RECEIVE_STATUS  4661 未生成生成账单
                 String RECEIVE_STATUS = row.getString("RECEIVE_STATUS");
-                if (RECEIVE_STATUS.equals("4661") == false)
-                    return "所选条目有账单状态必须为未生成生成账单";
+                if (RECEIVE_STATUS.equals("4661") == false) return "所选条目有账单状态必须为未生成生成账单";
             }
 
         }
@@ -128,7 +130,12 @@ public class InvoiceService {
             List<RowMap> customerDedList = entry.getValue();
 
             // 4.1 客户信息校验:必须有客户顾问(否则跳过)
+
             RowMap customer = DBSql.getMap("SELECT * FROM BO_EU_DNCRM_ACCOUNT WHERE ID = ?", ACCOUNT_ID);
+
+            logger.info("处理客户ID:" + ACCOUNT_ID);
+            logger.info("RESOURCE_ID--" + customer.getString("RESOURCE_ID"));
+
             if (customer == null || StringUtils.isBlank(customer.getString("RESOURCE_ID"))) {
                 continue;
             }
@@ -137,6 +144,7 @@ public class InvoiceService {
             List<RowMap> noPoDedList = customerDedList.stream().filter(ded -> StringUtils.isBlank(ded.getString("PURCHASE_ORDER_NO"))).collect(Collectors.toList());
             if (!noPoDedList.isEmpty()) {
                 List<RowMap> noPoPostedList = postedDataList.stream().filter(p -> StringUtils.isBlank(p.getString("PURCHASE_ORDER_NO"))).filter(p -> ACCOUNT_ID.equals(p.get("ACCOUNT_ID")) || ACCOUNT_ID.equals(p.get("BILL_ACCOUNT_ID"))).collect(Collectors.toList());
+                logger.info("无PO账单数量:" + noPoPostedList.size());
                 String noPoInvoiceId = createInvoiceAndDetails(uc, customer, noPoPostedList, noPoDedList, itemTypeDict, param, isDeal, "");
                 if (StringUtils.isNotBlank(noPoInvoiceId)) {
                     invoiceIds.add(noPoInvoiceId);
@@ -149,6 +157,8 @@ public class InvoiceService {
                 String poNo = poEntry.getKey();
                 List<RowMap> poDedList = poEntry.getValue();
                 List<RowMap> poPostedList = postedDataList.stream().filter(p -> poNo.equals(p.getString("PURCHASE_ORDER_NO"))).filter(p -> ACCOUNT_ID.equals(p.get("ACCOUNT_ID")) || ACCOUNT_ID.equals(p.get("BILL_ACCOUNT_ID"))).collect(Collectors.toList());
+                logger.info("处理采购订单:" + poNo);
+
                 String poInvoiceId = createInvoiceAndDetails(uc, customer, poPostedList, poDedList, itemTypeDict, param, isDeal, poNo);
                 if (StringUtils.isNotBlank(poInvoiceId)) {
                     invoiceIds.add(poInvoiceId);
@@ -179,40 +189,38 @@ public class InvoiceService {
         try {
             // 1. 计算汇总数据
             InvoiceSummary summary = calculateSummary(postedList);
-
             // 2. 生成发票编号+创建流程实例
             String invoiceNo = SDK.getRuleAPI().executeAtScript("B@left(@date,4)@mid(@date,6,2).@mid(@sequenceMonth(@companyId_invoice,4,0,1),7)", uc);
             ProcessInstance pi = SDK.getProcessAPI().createProcessInstance("obj_a7d46a9dd4df40b899ddcf02113fe0d2", uc.getUID(), "新增账单" + invoiceNo);
-
             // 3. 构建并保存发票头
             BO invoice = new BO();
             invoice.set("INVOICE_NO", invoiceNo);
             invoice.set("ACCOUNT_ID", customer.getString("ID"));
             invoice.set("ACCOUNT_NAME", customer.getString("NAME"));
             invoice.set("OWNER_RESOURCE_NAME", DBSql.getString("SELECT USERNAME FROM orguser WHERE USERID=?", new Object[]{customer.getString("RESOURCE_ID")}));
-            invoice.set("INVOICE_DATE", param.getInvoiceDate());
+
+            invoice.set("INVOICE_DATE", param.getInvoiceDate().toString());
+            invoice.set("DATE_RANGE_FROM", param.getDateRangeFrom().toString());
+            invoice.set("DATE_RANGE_TO", param.getDateRangeTo().toString());
+
             invoice.set("TOTAL", summary.totalMoney);
             invoice.set("TAX_VALUE", summary.totalTax);
             invoice.set("TOTAL_PRICE", summary.totalPrice);
             invoice.set("NOBILL_HOURS", summary.noBillHours);
             invoice.set("BILL_HOURS", summary.billHours);
             invoice.set("PREPAID_HOURS", summary.prepaidHours);
-            invoice.set("DATE_RANGE_FROM", param.getDateRangeFrom());
-            invoice.set("DATE_RANGE_TO", param.getDateRangeTo());
             invoice.set("PAYMENT_TERM_ID", param.getPaymentTermId());
             invoice.set("PURCHASE_ORDER_NO", poNo); // 有PO则赋值,无PO为空
             invoice.set("NOTES", param.getNotes());
             // 税区名称查询
-            String taxRegionName = StringUtils.isBlank(customer.getString("TAX_REGION_ID")) ? "" : DBSql.getString("SELECT NAME FROM BO_EU_DND_GENERAL WHERE OID = ?", new Object[]{customer.getString("TAX_REGION_ID")});
+            String taxRegionName = StringUtils.isBlank(customer.getString("TAX_REGION_ID")) || customer.getString("TAX_REGION_ID").equals("0") ? "" : DBSql.getString("SELECT NAME FROM BO_EU_DND_GENERAL WHERE OID = ?", new Object[]{customer.getString("TAX_REGION_ID")});
+
             invoice.set("TAX_REGION_NAME", taxRegionName);
             invoice.setBindId(pi.getId());
 
             // 记录变更+保存发票BO
-
             SDK.getBOAPI().create("BO_EU_DNCTT_INVOICE", invoice, pi, uc);
-
             dn.recordFormChanges.record(uc, invoice, "保存发票:" + invoiceNo);
-
             // 4. 构建并保存发票明细(批量处理)
             Map<String, RowMap> dedIdMap = dedList.stream().collect(Collectors.toMap(ded -> ded.getString("ID"), ded -> ded));
             int lineNo = 1;
@@ -232,7 +240,7 @@ public class InvoiceService {
                 detail.set("DOLLARS", posted.get("DOLLARS"));//含税总价
                 detail.set("TAX_DOLLARS", posted.get("TAX_DOLLARS"));//税额
 
-                BigDecimal DOLLARS_NOTAX =(posted.get("DOLLARS")==null?BigDecimal.ZERO: TypeUtil.convert(posted.get("DOLLARS"), BigDecimal.class)).subtract((posted.get("TAX_DOLLARS")==null?BigDecimal.ZERO: TypeUtil.convert(posted.get("TAX_DOLLARS"), BigDecimal.class)));
+                BigDecimal DOLLARS_NOTAX = (posted.get("DOLLARS") == null ? BigDecimal.ZERO : TypeUtil.convert(posted.get("DOLLARS"), BigDecimal.class)).subtract((posted.get("TAX_DOLLARS") == null ? BigDecimal.ZERO : TypeUtil.convert(posted.get("TAX_DOLLARS"), BigDecimal.class)));
 
                 detail.set("DOLLARS_NOTAX", DOLLARS_NOTAX);//不含税总价
 
@@ -283,6 +291,8 @@ public class InvoiceService {
 
             return invoice.getId(); // 返回生成的发票ID
         } catch (Exception e) {
+            logger.info("错误---" + e.getMessage());
+            logger.error("错误--111-", e);
             e.printStackTrace();
             return null;
         }

+ 19 - 25
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractServiceAdj.java

@@ -313,9 +313,7 @@ public class contractServiceAdj {
             //月单价  UNIT_PRICE_MONTH
             // orgContractService.set("SERVICE_UNIT_PRICE", SERVICE_UNIT_PRICE.divide(BigDecimal.valueOf(periodMonths)));
 
-            BigDecimal result = SERVICE_UNIT_PRICE.divide(
-                    BigDecimal.valueOf(periodMonths),
-                    4, // 精度:保留2位小数
+            BigDecimal result = SERVICE_UNIT_PRICE.divide(BigDecimal.valueOf(periodMonths), 4, // 精度:保留2位小数
                     RoundingMode.HALF_UP // 舍入模式:四舍五入
             );
             orgContractService.set("SERVICE_UNIT_PRICE", result);
@@ -358,8 +356,7 @@ public class contractServiceAdj {
             }
 
         } finally {
-            if (conn != null)
-                DBSql.close(conn);
+            if (conn != null) DBSql.close(conn);
         }
 
         //分摊采购成本
@@ -386,12 +383,10 @@ public class contractServiceAdj {
 
         LocalDate PERIOD_BEGIN_DATE = TypeUtil.convert(lastServicePeriod.get("PERIOD_BEGIN_DATE"), LocalDate.class);
         LocalDate PERIOD_END_DATE = TypeUtil.convert(lastServicePeriod.get("PERIOD_END_DATE"), LocalDate.class);
-        if (PERIOD_END_DATE.equals(newEndDate))
-            return "无需修改";
+        if (PERIOD_END_DATE.equals(newEndDate)) return "无需修改";
 
         String EFFECTIVE_DATE = DBSql.getString("SELECT max(PERIOD_BEGIN_DATE) as PERIOD_BEGIN_DATE FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE APPROVE_AND_POST_DATE IS NOT NULL and CONTRACT_SERVICE_ID=? AND  PERIOD_END_DATE >=?", new Object[]{serviceId, LocalDateYYYYMMDD(newEndDate)});
-        if (StringUtils.isBlank(EFFECTIVE_DATE))
-            return "已审批不能修改了";
+        if (StringUtils.isBlank(EFFECTIVE_DATE)) return "已审批不能修改了";
 
 
         String bindId = editServiceSale(uc, serviceId, "修改结束日期");
@@ -532,13 +527,11 @@ public class contractServiceAdj {
         LocalDate PERIOD_BEGIN_DATE = TypeUtil.convert(lastServicePeriod.get("PERIOD_BEGIN_DATE"), LocalDate.class);
         LocalDate PERIOD_END_DATE = TypeUtil.convert(lastServicePeriod.get("PERIOD_END_DATE"), LocalDate.class);
 
-        if (PERIOD_END_DATE.equals(newEndDate))
-            return "无需修改";
+        if (PERIOD_END_DATE.equals(newEndDate)) return "无需修改";
 
         String EFFECTIVE_DATE = DBSql.getString("SELECT max(PERIOD_BEGIN_DATE) as PERIOD_BEGIN_DATE FROM BO_EU_DNIVT_ORDER_PAYMENT_PLAN WHERE  PAY_AMOUNT<>0 and PAY_AMOUNT is not NULL  and CONTRACT_SERVICE_ID=? AND  PERIOD_BEGIN_DATE >=?", new Object[]{serviceId, LocalDateYYYYMMDD(newEndDate)});
 
-        if (StringUtils.isNotBlank(EFFECTIVE_DATE))
-            return "已审批不能修改了";
+        if (StringUtils.isNotBlank(EFFECTIVE_DATE)) return "已审批不能修改了";
 
 
         String bindId = editServicePurchase(uc, serviceId, "修改结束日期");
@@ -619,6 +612,7 @@ public class contractServiceAdj {
             return false;
         }
         String PERIOD_TYPE = contractService.getString("PURCHASE_PERIOD_TYPE");
+        String PURCHASE_CALC_METHOD_1STPERIOD = contractService.getString("PURCHASE_CALC_METHOD_1STPERIOD");
 
         int periodMonths;
         switch (contractService.getString("PURCHASE_PERIOD_TYPE")) {
@@ -642,8 +636,7 @@ public class contractServiceAdj {
         if (StringUtils.isBlank(boName)) {
             boName = "BO_EU_DNIVT_ORDER_PAYMENT_PLAN";
         } else {
-            if (PERIOD_TYPE.equals("609") == false)
-                PERIOD_TYPE = "610";//按月
+            if (PERIOD_TYPE.equals("609") == false) PERIOD_TYPE = "610";//按月
         }
 
         LocalDate EFFECTIVE_DATE = getLocalDate(contractService.get("PURCHASE_START_DATE"));//服务生效日期
@@ -681,7 +674,7 @@ public class contractServiceAdj {
                 //获取第一笔
 
                 //首月成本
-                if (PERIOD_TYPE.equals("4598") || PERIOD_TYPE.equals("4595") || PERIOD_TYPE.equals("4592")) {
+                if (PURCHASE_CALC_METHOD_1STPERIOD.equals("4598") || PURCHASE_CALC_METHOD_1STPERIOD.equals("4595") || PURCHASE_CALC_METHOD_1STPERIOD.equals("4592")) {
 
                 } else {
                     RowMap firstContractService = DBSql.getMap("select * from BO_EU_DNCTT_CONTRACT_SERVICE_PURCHASE_ADJUST where  CONTRACT_SERVICE_ID=?  and IS_EFFECTIVE='已执行' order by PURCHASE_START_DATE ASC", new Object[]{contractService.get("CONTRACT_SERVICE_ID")});
@@ -694,8 +687,7 @@ public class contractServiceAdj {
                         SERVICE_UNIT_COST = TypeUtil.convert(contractService.get("UNIT_COST_1STMONTH"), BigDecimal.class);
                         SERVICE_TOTAL_COST = multiply(SERVICE_UNIT_COST, contractService.get("QUANTITY"));
 
-                        BigDecimal ratio = new BigDecimal(EFFECTIVE_DATE.lengthOfMonth() - EFFECTIVE_DATE.getDayOfMonth() + 1)
-                                .divide(new BigDecimal(EFFECTIVE_DATE.lengthOfMonth()), 10, BigDecimal.ROUND_HALF_UP);
+                        BigDecimal ratio = new BigDecimal(EFFECTIVE_DATE.lengthOfMonth() - EFFECTIVE_DATE.getDayOfMonth() + 1).divide(new BigDecimal(EFFECTIVE_DATE.lengthOfMonth()), 10, BigDecimal.ROUND_HALF_UP);
 
                         COST_1STMONTH = SERVICE_TOTAL_COST.multiply(ratio);
 
@@ -822,8 +814,7 @@ public class contractServiceAdj {
             }
 
         } finally {
-            if (conn != null)
-                DBSql.close(conn);
+            if (conn != null) DBSql.close(conn);
         }
 
         //生成每月的采购计划
@@ -856,14 +847,12 @@ public class contractServiceAdj {
         // 查询与该合同服务关联的所有付款计划,并按开始时间排序
         List<RowMap> payPlanList = DBSql.getMaps("select * from BO_EU_DNIVT_ORDER_PAYMENT_PLAN_MONTH where CONTRACT_SERVICE_ID=? ORDER BY PERIOD_BEGIN_DATE", new Object[]{contractServiceId});
 
-        if (payPlanList.isEmpty() || payPlanList.size() == 0)
-            return;
+        if (payPlanList.isEmpty() || payPlanList.size() == 0) return;
 
         // 查询与该合同服务对应的服务周期记录,并按开始时间排序
         List<RowMap> contractServicePeriodList = DBSql.getMaps("select * from BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD where CONTRACT_SERVICE_ID=? ORDER BY PERIOD_BEGIN_DATE", new Object[]{contractServiceId});
 
-        if (contractServicePeriodList.isEmpty() || contractServicePeriodList.size() == 0)
-            return;
+        if (contractServicePeriodList.isEmpty() || contractServicePeriodList.size() == 0) return;
 
         // 处理“一次性收费”类型的合同服务:所有付款计划总和直接赋给第一个服务周期的成本
         if (service.getString("PERIOD_TYPE").equals("609")) {
@@ -881,11 +870,15 @@ public class contractServiceAdj {
         for (RowMap servicePeriod : contractServicePeriodList) {
             // 获取当前服务周期的结束日期
             LocalDate PERIOD_END_DATE = TypeUtil.convert(servicePeriod.get("PERIOD_END_DATE"), LocalDate.class);
+            SDK.getLogAPI().consoleInfo("PERIOD_END_DATE:" + PERIOD_END_DATE.toString());
 
             BigDecimal SUM_PLAN_AMOUNT = BigDecimal.ZERO;
+
             for (RowMap payPlan : payPlanList) {
                 LocalDate PAY_PERIOD_BEGIN_DATE = TypeUtil.convert(payPlan.get("PERIOD_BEGIN_DATE"), LocalDate.class);
 
+                SDK.getLogAPI().consoleInfo("PAY_PERIOD_BEGIN_DATE:" + PAY_PERIOD_BEGIN_DATE.toString());
+
                 // 跳过已处理过的付款计划(通过上一个周期末日期+1判断)
                 if (LAST_DATE != null && PAY_PERIOD_BEGIN_DATE.isBefore(LAST_DATE)) {
                     continue;
@@ -896,6 +889,8 @@ public class contractServiceAdj {
                     continue;
                 }
 
+                SDK.getLogAPI().consoleInfo("PLAN_AMOUNT : " + payPlan.getString("PLAN_AMOUNT"));
+
                 // 累加符合时间段内的付款计划金额
                 SUM_PLAN_AMOUNT = SUM_PLAN_AMOUNT.add(TypeUtil.convert(payPlan.get("PLAN_AMOUNT"), BigDecimal.class));
 
@@ -912,5 +907,4 @@ public class contractServiceAdj {
     }
 
 
-
 }

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

@@ -221,7 +221,7 @@ public class PaymentPlanService {
         String firstPeriodBeginDate = null;
 
         //首月单独计算
-        if (RULE_CATE.equals("4598") || RULE_CATE.equals("4595") || RULE_CATE.equals("4592")) {
+        if (PURCHASE_CALC_METHOD_1STPERIOD.equals("4598") || PURCHASE_CALC_METHOD_1STPERIOD.equals("4595") || PURCHASE_CALC_METHOD_1STPERIOD.equals("4592")) {
             //签约之日开始算周期,则不需要
 
         } else {
@@ -301,26 +301,24 @@ public class PaymentPlanService {
 
         RowMap service = DBSql.getMap("select * from BO_EU_DNCTT_CONTRACT_SERVICE where ID=?", new Object[]{contractServiceId});
 
-        // 查询与该合同服务关联的所有付款计划,按开始时间排序
+        // 查询与该合同服务关联的所有付款计划,按开始时间排序
         List<RowMap> payPlanList = DBSql.getMaps("select * from BO_EU_DNIVT_ORDER_PAYMENT_PLAN_MONTH where CONTRACT_SERVICE_ID=? ORDER BY PERIOD_BEGIN_DATE", new Object[]{contractServiceId});
 
-        if (payPlanList.isEmpty() || payPlanList.size() == 0)
-            return;
+        if (payPlanList.isEmpty() || payPlanList.size() == 0) return;
 
-        // 查询与该合同服务关联的所有服务周期,按开始时间排序
+        // 查询与该合同服务对应的服务周期记录,并按开始时间排序
         List<RowMap> contractServicePeriodList = DBSql.getMaps("select * from BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD where CONTRACT_SERVICE_ID=? ORDER BY PERIOD_BEGIN_DATE", new Object[]{contractServiceId});
 
-        if (contractServicePeriodList.isEmpty() || contractServicePeriodList.size() == 0)
-            return;
+        if (contractServicePeriodList.isEmpty() || contractServicePeriodList.size() == 0) return;
 
-        // 处理“一次性收费”类型的合同服务(标识码为"609")
+        // 处理“一次性收费”类型的合同服务:所有付款计划总和直接赋给第一个服务周期的成本
         if (service.getString("PERIOD_TYPE").equals("609")) {
             BigDecimal SUM_PLAN_AMOUNT = BigDecimal.ZERO;
             for (RowMap payPlan : payPlanList) {
+
                 SUM_PLAN_AMOUNT = SUM_PLAN_AMOUNT.add(TypeUtil.convert(payPlan.get("PLAN_AMOUNT"), BigDecimal.class));
             }
 
-            // 更新第一个也是唯一一个服务周期的成本字段
             DBSql.update("update BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD set PERIOD_COST=? where ID=? ", new Object[]{SUM_PLAN_AMOUNT, contractServicePeriodList.get(0).getString("ID")});
             return;
         }
@@ -329,35 +327,39 @@ public class PaymentPlanService {
         for (RowMap servicePeriod : contractServicePeriodList) {
             // 获取当前服务周期的结束日期
             LocalDate PERIOD_END_DATE = TypeUtil.convert(servicePeriod.get("PERIOD_END_DATE"), LocalDate.class);
+            SDK.getLogAPI().consoleInfo("PERIOD_END_DATE:" + PERIOD_END_DATE.toString());
 
             BigDecimal SUM_PLAN_AMOUNT = BigDecimal.ZERO;
+
             for (RowMap payPlan : payPlanList) {
-                // 获取付款计划开始日期
                 LocalDate PAY_PERIOD_BEGIN_DATE = TypeUtil.convert(payPlan.get("PERIOD_BEGIN_DATE"), LocalDate.class);
 
-                // 若上一处理周期已覆盖此付款计划起始日,则跳过
+                SDK.getLogAPI().consoleInfo("PAY_PERIOD_BEGIN_DATE:" + PAY_PERIOD_BEGIN_DATE.toString());
+
+                // 跳过已处理过的付款计划(通过上一个周期末日期+1判断)
                 if (LAST_DATE != null && PAY_PERIOD_BEGIN_DATE.isBefore(LAST_DATE)) {
                     continue;
                 }
 
-                // 如果付款计划早于当前服务周期,则跳过
+                // 若付款计划起始日在当前服务周期之后,则跳过
                 if (PERIOD_END_DATE.isBefore(PAY_PERIOD_BEGIN_DATE)) {
                     continue;
                 }
 
-                // 累加属于当前服务周期的付款计划金额
+                SDK.getLogAPI().consoleInfo("PLAN_AMOUNT : " + payPlan.getString("PLAN_AMOUNT"));
+
+                // 累加符合时间段内的付款计划金额
                 SUM_PLAN_AMOUNT = SUM_PLAN_AMOUNT.add(TypeUtil.convert(payPlan.get("PLAN_AMOUNT"), BigDecimal.class));
-            }
 
-            // 更新当前服务周期的成本
+            }
+            // 更新当前服务周期的成本字段
             DBSql.update("update BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD set PERIOD_COST=? where ID=? ", new Object[]{SUM_PLAN_AMOUNT, servicePeriod.getString("ID")});
 
             SDK.getLogAPI().consoleInfo("服务周期:" + servicePeriod.getString("ID") + ":" + SUM_PLAN_AMOUNT);
 
-            // 设置下一个服务周期应排除的最早付款日期起点
+            // 设置下一轮比较的时间起点为当前周期结束后一天
             LAST_DATE = PERIOD_END_DATE.plusDays(1);
         }
-
     }