소스 검색

账单相关修改

zhangyao 3 달 전
부모
커밋
de39c072e6

+ 6 - 1
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/controller/invoiceController.java

@@ -38,9 +38,14 @@ public class invoiceController {
      * @return
      */
     @Mapping("com.awspaas.user.apps.donenow_ctt.deal_invoice")
-    public ResponseObject dealInvoice(UserContext uc, String accDeduIds) {
+    public ResponseObject dealInvoice(UserContext uc, String accDeduIds,String startDate,String endDate) {
         InvoiceDealDto invoiceDealDto = new InvoiceDealDto();
         invoiceDealDto.setIds(accDeduIds);
+
+        invoiceDealDto.setDateRangeFromStr(startDate);
+        invoiceDealDto.setDateRangeToStr(endDate);
+
+
         List<String> invoiceIds = InvoiceService.getInstance().processInvoice(uc, accDeduIds, invoiceDealDto, true);
 
         return ResponseObject.newOkResponse();

+ 32 - 11
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/InvoiceDealDto.java

@@ -1,6 +1,8 @@
 package com.awspaas.user.apps.donenow_ctt.service;
 
-import java.time.LocalDateTime;
+import org.apache.commons.lang3.StringUtils;
+
+import java.time.LocalDate;
 import java.util.List;
 import java.util.Map;
 
@@ -34,17 +36,17 @@ public class InvoiceDealDto {
      * 发票日期(必填,原C#:DateTime)
      * 注:Java中用LocalDateTime对应日期时间类型,若仅需日期可改用LocalDate
      */
-    private LocalDateTime invoiceDate;
+    private LocalDate invoiceDate;
 
     /**
      * 发票开始日期(可空,原C#:DateTime?)
      */
-    private LocalDateTime dateRangeFrom;
+    private LocalDate dateRangeFrom;
 
     /**
      * 发票结束日期(可空,原C#:DateTime?)
      */
-    private LocalDateTime dateRangeTo;
+    private LocalDate dateRangeTo;
 
     /**
      * 订单号(可空,原C#:string)
@@ -148,32 +150,51 @@ public class InvoiceDealDto {
         this.emailTempId = emailTempId;
     }
 
-    public LocalDateTime getInvoiceDate() {
+    public LocalDate getInvoiceDate() {
         if (invoiceDate == null)
-            invoiceDate = LocalDateTime.now();
+            invoiceDate = LocalDate.now();
         return invoiceDate;
     }
 
-    public void setInvoiceDate(LocalDateTime invoiceDate) {
+    public void setInvoiceDate(LocalDate invoiceDate) {
         this.invoiceDate = invoiceDate;
     }
 
-    public LocalDateTime getDateRangeFrom() {
+    public LocalDate getDateRangeFrom() {
         return dateRangeFrom;
     }
 
-    public void setDateRangeFrom(LocalDateTime dateRangeFrom) {
+    public void setDateRangeFrom(LocalDate dateRangeFrom) {
         this.dateRangeFrom = dateRangeFrom;
     }
 
-    public LocalDateTime getDateRangeTo() {
+    public void setDateRangeFromStr(String dateRangeFrom) {
+        try {
+            if (StringUtils.isNotBlank(dateRangeFrom))
+                this.dateRangeFrom = LocalDate.parse(dateRangeFrom);
+        } catch (Exception e) {
+            this.dateRangeFrom = null;
+        }
+    }
+
+    public LocalDate getDateRangeTo() {
         return dateRangeTo;
     }
 
-    public void setDateRangeTo(LocalDateTime dateRangeTo) {
+
+    public void setDateRangeTo(LocalDate dateRangeTo) {
         this.dateRangeTo = dateRangeTo;
     }
 
+    public void setDateRangeToStr(String dateRangeTo) {
+        try {
+            if (StringUtils.isNotBlank(dateRangeTo))
+                this.dateRangeTo = LocalDate.parse(dateRangeTo);
+        } catch (Exception e) {
+            this.dateRangeTo = null;
+        }
+    }
+
     public String getPurchaseOrderNo() {
         return purchaseOrderNo;
     }

+ 6 - 4
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/InvoiceService.java

@@ -157,9 +157,7 @@ public class InvoiceService {
             InvoiceSummary summary = calculateSummary(postedList);
 
             // 2. 生成发票编号+创建流程实例
-            String invoiceNo = SDK.getRuleAPI().executeAtScript(
-                    "@year()-@sequence(@concat(@companyId(),@year(),INVOICE),6)"
-            );
+            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(),
@@ -191,9 +189,11 @@ public class InvoiceService {
             invoice.setBindId(pi.getId());
 
             // 记录变更+保存发票BO
-            dn.recordFormChanges.record(uc, invoice, "保存发票:" + invoiceNo);
+
             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));
@@ -250,12 +250,14 @@ public class InvoiceService {
 
                 // 4.5 保存明细
                 SDK.getBOAPI().createDataBO("BO_EU_DNCTT_INVOICE_DETAIL", detail, uc);
+                dn.recordFormChanges.record(uc, detail, "保存账单明细:" + detail.getId());
 
                 // 5. 实际处理时:更新账户抵扣(关联发票ID+行号)
                 if (isDeal) {
                     BO dedBo = SDK.getBOAPI().get("BO_EU_DNCRM_ACCOUNT_DEDUCTION", dedId);
                     dedBo.set("INVOICE_ID", invoice.getId());
                     dedBo.set("INVOICE_LINE_ITEM_NO", lineNo);
+                    dn.recordFormChanges.record(uc, dedBo, "生成账单");
                     SDK.getBOAPI().update("BO_EU_DNCRM_ACCOUNT_DEDUCTION", dedBo);
                 }
 

+ 29 - 10
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractService.java

@@ -233,9 +233,9 @@ public class contractService {
             contractBO.set("APPLY_ID", APPLY_ID);
             contractBO.setBindId(contractInstance.getId());
 
+            SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT", contractBO, uc);
             dn.recordFormChanges.record(uc, contractBO, "合同新增");
 
-            SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT", contractBO, uc);
             exitsBOID = contractBO.getId();
             contract.put("BINDID", contractInstance.getId());
             contract.put("ID", contractBO.getId());
@@ -660,15 +660,15 @@ public class contractService {
             if (service.getString("OBJECT_TYPE").equals("2"))//服务包
             {
                 // String serviceIDS = DBSql.getString(conn, "select SERVICE_ID from BO_EU_DNIVT_SERVICE_BUNDLE where ID=?", new Object[]{service.getString("OBJECT_ID")});
-                RowMap serviceBUNDLE = DBSql.getMap(conn,"SELECT SERVICE_ID,UNIT_COST,UNIT_PRICE FROM BO_EU_DNIVT_SERVICE_BUNDLE WHERE ID=?", new Object[]{service.getString("OBJECT_ID")});
+                RowMap serviceBUNDLE = DBSql.getMap(conn, "SELECT SERVICE_ID,UNIT_COST,UNIT_PRICE FROM BO_EU_DNIVT_SERVICE_BUNDLE WHERE ID=?", new Object[]{service.getString("OBJECT_ID")});
                 String serviceIDS = serviceBUNDLE.getString("SERVICE_ID");
 
                 Double BUNDLE_UNIT_COST = serviceBUNDLE.getDouble("UNIT_COST");
                 Double BUNDLE_UNIT_PRICE = serviceBUNDLE.getDouble("UNIT_PRICE");
 
-                List<RowMap> ivtServiceList = DBSql.getMaps(conn,"select ID,UNIT_COST,UNIT_PRICE from BO_EU_DNIVT_SERVICE where FIND_IN_SET(ID,?)", new Object[]{serviceIDS});
+                List<RowMap> ivtServiceList = DBSql.getMaps(conn, "select ID,UNIT_COST,UNIT_PRICE from BO_EU_DNIVT_SERVICE where FIND_IN_SET(ID,?)", new Object[]{serviceIDS});
 
-                RowMap ivtServiceSum = DBSql.getMap(conn,"SELECT SUM(UNIT_COST) AS SUM_COST,SUM(UNIT_PRICE) AS SUM_PRICE  FROM BO_EU_DNIVT_SERVICE where FIND_IN_SET(ID,?)", new Object[]{serviceIDS});
+                RowMap ivtServiceSum = DBSql.getMap(conn, "SELECT SUM(UNIT_COST) AS SUM_COST,SUM(UNIT_PRICE) AS SUM_PRICE  FROM BO_EU_DNIVT_SERVICE where FIND_IN_SET(ID,?)", new Object[]{serviceIDS});
 
                 Map<String, Double> unitPriceMap = new HashMap<String, Double>();
                 Map<String, Double> unitCostMap = new HashMap<String, Double>();
@@ -754,7 +754,7 @@ public class contractService {
         try {
             conn = DBSql.open();
             conn.setAutoCommit(false);
-            AddContractServiceProduct(uc,contract,conn);
+            AddContractServiceProduct(uc, contract, conn);
             conn.commit();
             return true;
         } catch (SQLException e) {
@@ -1287,7 +1287,12 @@ public class contractService {
                     double tax_dollars = cad.get("EXTENDED_PRICE", Double.class) - cad.get("EXTENDED_PRICE", Double.class) / (1 + tax_rate);//税额
                     cad.set("TAX_DOLLARS", tax_dollars);
                 }
+
+                //计费客户
+                if (StringUtils.isBlank(cad.getString("BILL_ACCOUNT_ID")) && StringUtils.isNotBlank(cad.getString("ACCOUNT_ID")))
+                    cad.set("BILL_ACCOUNT_ID", cad.get("ACCOUNT_ID"));
                 SDK.getBOAPI().createDataBO("BO_EU_DNCRM_ACCOUNT_DEDUCTION", cad, uc, connUpdate);
+                dn.recordFormChanges.record(uc, cad, "提交服务费费用");
             }
             connUpdate.commit();
         } catch (SQLException e) {
@@ -1357,8 +1362,11 @@ public class contractService {
                         cad.set("TAX_DOLLARS", tax_dollars);
                     }
 
-                    dn.recordFormChanges.record(uc, cad, "审批提交里程碑");
+                    //计费客户
+                    if (StringUtils.isBlank(cad.getString("BILL_ACCOUNT_ID")) && StringUtils.isNotBlank(cad.getString("ACCOUNT_ID")))
+                        cad.set("BILL_ACCOUNT_ID", cad.get("ACCOUNT_ID"));
                     SDK.getBOAPI().createDataBO("BO_EU_DNCRM_ACCOUNT_DEDUCTION", cad, uc, connUpdate);
+                    dn.recordFormChanges.record(uc, cad, "审批提交里程碑");
 
                 }
             }
@@ -1447,8 +1455,12 @@ public class contractService {
                     double tax_dollars = cad.get("EXTENDED_PRICE", Double.class) - cad.get("EXTENDED_PRICE", Double.class) / (1 + tax_rate);//税额
                     cad.set("TAX_DOLLARS", tax_dollars);
                 }
-                SDK.getBOAPI().createDataBO("BO_EU_DNCRM_ACCOUNT_DEDUCTION", cad, uc, connUpdate);
 
+                //计费客户
+                if (StringUtils.isBlank(cad.getString("BILL_ACCOUNT_ID")) && StringUtils.isNotBlank(cad.getString("ACCOUNT_ID")))
+                    cad.set("BILL_ACCOUNT_ID", cad.get("ACCOUNT_ID"));
+                SDK.getBOAPI().createDataBO("BO_EU_DNCRM_ACCOUNT_DEDUCTION", cad, uc, connUpdate);
+                dn.recordFormChanges.record(uc, cad, "审批并提交合同产品");
                 //改变状态
                 ccc.set("BILL_STATUS", "1");
                 SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_COST", ccc, connUpdate);
@@ -1514,7 +1526,9 @@ public class contractService {
                     SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT", ccc, connUpdate);
                 }
                 bo.set("CLOSED", 1);
-                SDK.getBOAPI().update("BO_EU_DNCRM_ACCOUNT_DEDUCTION", bo, connUpdate);
+                dn.recordFormChanges.record(uc, bo, "撤销定期服务");
+                SDK.getBOAPI().remove("BO_EU_DNCRM_ACCOUNT_DEDUCTION", bo.getId(), connUpdate);
+                //SDK.getBOAPI().update("BO_EU_DNCRM_ACCOUNT_DEDUCTION", bo, connUpdate);
             }
             connUpdate.commit();
         } catch (SQLException e) {
@@ -1555,7 +1569,9 @@ public class contractService {
                     SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_MILESTONES", ccm, connUpdate);
                 }
                 bo.set("CLOSED", 1);
-                SDK.getBOAPI().update("BO_EU_DNCRM_ACCOUNT_DEDUCTION", bo, connUpdate);
+                dn.recordFormChanges.record(uc, bo, "撤销里程碑审批");
+                //SDK.getBOAPI().update("BO_EU_DNCRM_ACCOUNT_DEDUCTION", bo, connUpdate);
+                SDK.getBOAPI().remove("BO_EU_DNCRM_ACCOUNT_DEDUCTION", bo.getId(), connUpdate);
             }
 
             connUpdate.commit();
@@ -1590,7 +1606,10 @@ public class contractService {
             for (String id : ids.split(",")) {
                 BO bo = SDK.getBOAPI().get("BO_EU_DNCRM_ACCOUNT_DEDUCTION", id);
                 bo.set("CLOSED", 1);
-                SDK.getBOAPI().update("BO_EU_DNCRM_ACCOUNT_DEDUCTION", bo, connUpdate);
+                dn.recordFormChanges.record(uc, bo, "撤销成本审批");
+
+                SDK.getBOAPI().remove("BO_EU_DNCRM_ACCOUNT_DEDUCTION", bo.getId(), connUpdate);
+                //SDK.getBOAPI().update("BO_EU_DNCRM_ACCOUNT_DEDUCTION", bo, connUpdate);
 
                 BO ccc = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_COST", bo.getString("OBJECT_ID"));//合同成本
                 ccc.set("BILL_STATUS", 0);

+ 0 - 408
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/invoiceService.java1

@@ -1,408 +0,0 @@
-package com.awspaas.user.apps.donenow_ctt.service;
-
-import com.actionsoft.bpms.bo.engine.BO;
-import com.actionsoft.bpms.bpmn.engine.model.run.delegate.ProcessInstance;
-import com.actionsoft.bpms.commons.database.RowMap;
-import com.actionsoft.bpms.server.UserContext;
-import com.actionsoft.bpms.util.DBSql;
-import com.actionsoft.sdk.local.SDK;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-/**
- * 发票服务
- */
-public class invoiceService {
-    // 单例模式
-    private static volatile invoiceService instance;
-
-    private invoiceService() {
-    }
-
-    public static invoiceService getInstance() {
-        if (instance == null) {
-            synchronized (invoiceService.class) {
-                if (instance == null) {
-                    instance = new invoiceService();
-                }
-            }
-        }
-        return instance;
-    }
-
-    /*
-     *处理发票
-     * @param uc
-     * @param accDeduIds
-     */
-    public List<String> ProcessInvoice(UserContext uc, String accDeduIds, InvoiceDealDto param, boolean isDeal) {
-        if (StringUtils.isBlank(accDeduIds))
-            return null;
-
-        String sqlWhere = " (";
-        String[] arr = accDeduIds.split(",");
-        for (int i = 0; i < arr.length; i++) {
-            sqlWhere += "?,";
-        }
-        sqlWhere = sqlWhere.substring(0, sqlWhere.length() - 1) + ")";
-
-        List<RowMap> thisAccDtoList = DBSql.getMaps("SELECT * FROM VIEW_EU_DNV_POSTED_ALL WHERE ID IN " + sqlWhere, Arrays.stream(arr).toArray());
-        if (thisAccDtoList.isEmpty())
-            return null;
-
-        //把里面的key转成大写
-        for (RowMap rowMap : thisAccDtoList) {
-            rowMap.forEach((key, value) -> rowMap.put(key.toUpperCase(), value));
-            //rowMap.forEach((key, value) -> rowMap.put(key.toLowerCase(), value));
-        }
-
-        List<RowMap> thisAccList = DBSql.getMaps("SELECT * FROM BO_EU_DNCRM_ACCOUNT_DEDUCTION WHERE ID IN " + sqlWhere, Arrays.stream(arr).toArray());
-
-        Map<String, List<RowMap>> dicList = thisAccList.stream().filter(rowMap -> rowMap.get("BILL_ACCOUNT_ID") != null).collect(
-                Collectors.groupingBy(rowMap -> rowMap.get("BILL_ACCOUNT_ID").toString())
-        );
-        if (dicList.isEmpty())
-            return null;
-
-        List<RowMap> itemTypeList = DBSql.getMaps("SELECT OID,NAME FROM BO_EU_DND_GENERAL WHERE GENERAL_TABLE_ID='121'");
-
-        List<String> invoiceIds = new ArrayList<>();
-        for (String key : dicList.keySet()) {
-
-            RowMap account = DBSql.getMap("SELECT * FROM BO_EU_DNCRM_ACCOUNT WHERE ID = ?", key);
-            // 客户的客户顾问在发票中是必填项,没有客户顾问暂时不创建发票
-            if (StringUtils.isBlank(account.getString("RESOURCE_ID"))) {
-                continue;
-            }
-
-            List<RowMap> noPurOrderList = dicList.get(key).stream().filter(rowMap -> StringUtils.isBlank(rowMap.getString("PURCHASE_ORDER_NO"))).collect(Collectors.toList());
-            if (noPurOrderList.size() > 0) {
-                //没有销售订单的条目,计费到这个客户的和这个客户的条目
-                List<RowMap> thisNoPurOrdList = thisAccDtoList.stream().filter(rowMap -> StringUtils.isBlank(rowMap.getString("PURCHASE_ORDER_NO")) && rowMap.get("ACCOUNT_ID").equals(key)).collect(Collectors.toList());
-                List<RowMap> billToThisNoPurOrdList = thisAccDtoList.stream().filter(rowMap -> StringUtils.isBlank(rowMap.getString("PURCHASE_ORDER_NO")) && !rowMap.get("ACCOUNT_ID").equals(key) && rowMap.get("BILL_ACCOUNT_ID").equals(key)).collect(Collectors.toList());
-
-                BO invoice = new BO();
-                //汇总
-                Double totalMoney = thisNoPurOrdList.stream().mapToDouble(rowMap -> rowMap.getDouble("DOLLARS")).sum() + billToThisNoPurOrdList.stream().mapToDouble(rowMap -> rowMap.getDouble("DOLLARS")).sum();
-                Double totalTax = thisNoPurOrdList.stream().mapToDouble(rowMap -> rowMap.getDouble("TAX_DOLLARS")).sum() + billToThisNoPurOrdList.stream().mapToDouble(rowMap -> rowMap.getDouble("TAX_DOLLARS")).sum();
-                invoice.set("TOTAL_MONEY", totalMoney);//总额
-                invoice.set("TOTAL_TAX", totalTax);//税
-                Double totalPrice = totalMoney - totalTax;//总价
-                invoice.set("TOTAL_PRICE", totalPrice);//总价(不含税)
-                Double noBillHours = thisNoPurOrdList.stream().filter(rowMap -> StringUtils.isBlank(rowMap.getString("BILLABLE"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum() + billToThisNoPurOrdList.stream().filter(rowMap -> StringUtils.isBlank(rowMap.getString("BILLABLE"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum();
-
-                invoice.set("NOBILL_HOURS", noBillHours);//不计费工时
-                Double billHours = thisNoPurOrdList.stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("BILLABLE"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum() + billToThisNoPurOrdList.stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("BILLABLE"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum();
-                invoice.set("BILL_HOURS", billHours);//计费工时
-                Double prepaidHours = thisNoPurOrdList.stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("CONTRACT_BLOCK_ID"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum() + billToThisNoPurOrdList.stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("CONTRACT_BLOCK_ID"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum();
-                invoice.set("PREPAID_HOURS", prepaidHours);//预付工时
-
-
-                StringBuilder thisIds = new StringBuilder();
-                if (thisNoPurOrdList.size() > 0) {
-                    thisNoPurOrdList.forEach(rowMap -> thisIds.append(rowMap.get("ID").toString() + ","));
-                }
-                if (billToThisNoPurOrdList.size() > 0) {
-                    billToThisNoPurOrdList.forEach(rowMap -> thisIds.append(rowMap.get("ID").toString() + ","));
-                }
-                String stringIds = thisIds.toString();
-                if (StringUtils.isNotBlank(stringIds)) {
-                    stringIds = stringIds.substring(0, stringIds.length() - 1);
-                }
-                String invoiceNo = SDK.getRuleAPI().executeAtScript("@year()-@sequence(@concat(@companyId(),@year(),INVOICE),6)");//发票编号
-                ProcessInstance processInstance = SDK.getProcessAPI().createProcessInstance("obj_a7d46a9dd4df40b899ddcf02113fe0d2", uc.getUID(), "新增账单" + invoiceNo);
-
-
-                invoice.set("INVOICE_NO", invoiceNo);//发票编号
-                invoice.set("INVOICE_DATE", param.getInvoiceDate());
-                invoice.set("TOTAL", dicList.get(key).stream().mapToDouble(rowMap -> rowMap.getDouble("EXTENDED_PRICE")).sum());//总价
-                invoice.set("TAX_VALUE", dicList.get(key).stream().mapToDouble(rowMap -> rowMap.getDouble("TAX_DOLLARS")).sum());//税
-                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", "");
-                invoice.set("NOTES", param.getNotes());
-                invoice.set("TAX_REGION_NAME", account.getString("TAX_REGION_ID") == null ? "" : DBSql.getString("SELECT NAME FROM BO_EU_DND_GENERAL WHERE OID = ?", new Object[]{account.getString("TAX_REGION_ID")}));
-                invoice.setBindId(processInstance.getId());
-
-                dn.recordFormChanges.record(uc, invoice, "保存发票");
-
-                SDK.getBOAPI().create("BO_EU_DNCTT_INVOICE", invoice, processInstance, uc);
-
-                int invoice_line = 1;
-                for (RowMap param_item : thisNoPurOrdList) {
-
-                    RowMap accDedItem = dicList.get(key).stream().filter(rowMap -> rowMap.get("ID").equals(param_item.get("ID"))).findFirst().get();
-
-                    String billable_hours = param_item.getString("BILLABLE_HOURS");
-
-                    if (param_item.getString("CONTRACT_TYPE_ID").equals("1199") || param_item.getString("CONTRACT_TYPE_ID").equals("1201")) {
-                        billable_hours = "合同已包";
-                    } else if (param_item.getString("CONTRACT_TYPE_ID").equals("1202") || param_item.getString("CONTRACT_TYPE_ID").equals("1203")) {
-                        if (StringUtils.isNotBlank(param_item.getString("BILLABLE")))
-                            billable_hours = "预支付";
-                    }
-
-                    BO invoiceItem = new BO();
-                    invoiceItem.setBindId(invoice.getBindId());
-                    invoiceItem.set("INVOICE_ID", invoice.getId());
-                    invoiceItem.set("ITEM_DATE", param_item.get("ITEM_DATE"));
-                    invoiceItem.set("ITEM_DESC", param_item.get("ITEM_DESC"));
-                    invoiceItem.set("ITEM_TYPE", param_item.get("ITEM_TYPE"));
-                    invoiceItem.set("RESOURCE_NAME", param_item.get("RESOURCE_NAME"));
-                    invoiceItem.set("billable_hours", billable_hours);
-                    invoiceItem.set("QUANTITY", param_item.get("QUANTITY"));
-                    invoiceItem.set("RATE", param_item.get("RATE"));
-                    invoiceItem.set("EFFECTIVE_TAX_RATE", accDedItem.getDouble("EFFECTIVE_TAX_RATE") * 100);
-                    invoiceItem.set("TAX_CATEGORY_NAME", accDedItem.get("TAX_CATEGORY_NAME"));
-                    String itemType = itemTypeList.stream().filter(rowMap -> rowMap.get("OID").equals(param_item.get("ITEM_TYPE"))).findFirst().get().getString("NAME");
-                    invoiceItem.set("ITEM_TYPE", itemType);
-                    invoiceItem.set("DOLLARS", param_item.get("DOLLARS"));
-                    invoiceItem.set("HOURLY_RATE", param_item.get("HOURLY_RATE"));
-                    invoiceItem.set("ROLE_NAME", param_item.get("ROLE_NAME"));
-                    invoiceItem.set("WORK_TYPE", param_item.get("WORK_TYPE"));
-                    invoiceItem.set("TAX_INCLUSIVE", param_item.get("DOLLARS"));
-                    invoiceItem.set("ACCOUNT_DEDUCTION_ID", param_item.get("ID"));
-                    SDK.getBOAPI().createDataBO("BO_EU_DNCTT_INVOICE_DETAIL", invoiceItem, uc);
-
-                    //更新账户抵扣条目
-                    if (isDeal)// 处理,区分预览和实际生成
-                    {
-                        BO thisacc_ded = SDK.getBOAPI().get("BO_EU_DNCRM_ACCOUNT_DEDUCTION", accDedItem.getString("ID"));
-                        thisacc_ded.set("INVOICE_ID", invoice.getId());
-                        thisacc_ded.set("INVOICE_LINE_ITEM_NO", invoice_line);
-                        SDK.getBOAPI().update("BO_EU_DNCRM_ACCOUNT_DEDUCTION", thisacc_ded);
-                    }
-                    invoice_line++;
-                }
-                //付费到这个客户的条目
-                if (billToThisNoPurOrdList.size() > 0) {
-                    Map<String, List<RowMap>> dicBillToThis = billToThisNoPurOrdList.stream().collect(Collectors.groupingBy(rowMap -> rowMap.getString("account_id")));
-                    for (String bkey : dicBillToThis.keySet()) {
-
-                        for (RowMap param_item : dicBillToThis.get(bkey)) {
-                            RowMap accDedItem = dicList.get(key).stream().filter(rowMap -> rowMap.get("ID").equals(param_item.get("ID"))).findFirst().get();
-
-                            String billable_hours = param_item.getString("BILLABLE_HOURS");
-
-                            if (param_item.getString("CONTRACT_TYPE_ID").equals("1199") || param_item.getString("CONTRACT_TYPE_ID").equals("1201")) {
-                                billable_hours = "合同已包";
-                            } else if (param_item.getString("CONTRACT_TYPE_ID").equals("1202") || param_item.getString("CONTRACT_TYPE_ID").equals("1203")) {
-                                if (StringUtils.isNotBlank(param_item.getString("BILLABLE")))
-                                    billable_hours = "预支付";
-                            }
-
-                            BO invoiceItem = new BO();
-                            invoiceItem.setBindId(invoice.getBindId());
-                            invoiceItem.set("INVOICE_ID", invoice.getId());
-                            invoiceItem.set("ITEM_DATE", param_item.get("ITEM_DATE"));
-                            invoiceItem.set("ITEM_DESC", param_item.get("ITEM_DESC"));
-                            invoiceItem.set("ITEM_TYPE", param_item.get("ITEM_TYPE"));
-                            invoiceItem.set("RESOURCE_NAME", param_item.get("RESOURCE_NAME"));
-                            invoiceItem.set("billable_hours", billable_hours);
-                            invoiceItem.set("QUANTITY", param_item.get("QUANTITY"));
-                            invoiceItem.set("RATE", param_item.get("RATE"));
-                            invoiceItem.set("EFFECTIVE_TAX_RATE", accDedItem.getDouble("EFFECTIVE_TAX_RATE") * 100);
-                            invoiceItem.set("TAX_CATEGORY_NAME", accDedItem.get("TAX_CATEGORY_NAME"));
-                            String itemType = itemTypeList.stream().filter(rowMap -> rowMap.get("OID").equals(param_item.get("ITEM_TYPE"))).findFirst().get().getString("NAME");
-                            invoiceItem.set("ITEM_TYPE", itemType);
-                            invoiceItem.set("DOLLARS", param_item.get("DOLLARS"));
-                            invoiceItem.set("HOURLY_RATE", param_item.get("HOURLY_RATE"));
-                            invoiceItem.set("ROLE_NAME", param_item.get("ROLE_NAME"));
-                            invoiceItem.set("WORK_TYPE", param_item.get("WORK_TYPE"));
-                            invoiceItem.set("TAX_INCLUSIVE", param_item.get("DOLLARS"));
-                            invoiceItem.set("ACCOUNT_DEDUCTION_ID", param_item.get("ID"));
-                            SDK.getBOAPI().createDataBO("BO_EU_DNCTT_INVOICE_DETAIL", invoiceItem, uc);
-
-
-                            //更新账户抵扣条目
-                            if (isDeal)// 处理,区分预览和实际生成
-                            {
-                                BO thisacc_ded = SDK.getBOAPI().get("BO_EU_DNCRM_ACCOUNT_DEDUCTION", accDedItem.getString("ID"));
-                                thisacc_ded.set("INVOICE_ID", invoice.getId());
-                                thisacc_ded.set("INVOICE_LINE_ITEM_NO", invoice_line);
-                                SDK.getBOAPI().update("BO_EU_DNCRM_ACCOUNT_DEDUCTION", thisacc_ded);
-                            }
-                            invoice_line++;
-                        }
-
-                    }
-
-                }
-
-            }
-
-
-            //有采购订单的条目
-            List<RowMap> purchOrderList = dicList.get(key).stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("purchase_order_no"))).collect(Collectors.toList());
-
-            if (purchOrderList.size() > 0) {
-                Map<String, List<RowMap>> poDic = purchOrderList.stream().collect(Collectors.groupingBy(rowMap -> rowMap.getString("purchase_order_no")));
-                for (String poKey : poDic.keySet()) {
-
-                    //采购订单的条目
-                    List<RowMap> thisPurOrdList = poDic.get(poKey).stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("purchase_order_no")) && rowMap.getString("account_id").equals(key) && rowMap.getString("bill_account_id").equals(key)).collect(Collectors.toList());
-
-                    //采购订单的条目
-                    List<RowMap> billToThisPurOrdList = poDic.get(poKey).stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("purchase_order_no")) && !rowMap.getString("account_id").equals(key) && rowMap.getString("bill_account_id").equals(key)).collect(Collectors.toList());
-
-
-                    BO invoice = new BO();
-                    //汇总
-                    Double totalMoney = thisPurOrdList.stream().mapToDouble(rowMap -> rowMap.getDouble("DOLLARS")).sum() + billToThisPurOrdList.stream().mapToDouble(rowMap -> rowMap.getDouble("DOLLARS")).sum();
-                    Double totalTax = thisPurOrdList.stream().mapToDouble(rowMap -> rowMap.getDouble("TAX_DOLLARS")).sum() + billToThisPurOrdList.stream().mapToDouble(rowMap -> rowMap.getDouble("TAX_DOLLARS")).sum();
-                    invoice.set("TOTAL_MONEY", totalMoney);//总额
-                    invoice.set("TOTAL_TAX", totalTax);//税
-                    Double totalPrice = totalMoney - totalTax;//总价
-                    invoice.set("TOTAL_PRICE", totalPrice);//总价(不含税)
-                    Double noBillHours = thisPurOrdList.stream().filter(rowMap -> StringUtils.isBlank(rowMap.getString("BILLABLE"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum() + billToThisPurOrdList.stream().filter(rowMap -> StringUtils.isBlank(rowMap.getString("BILLABLE"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum();
-
-                    invoice.set("NOBILL_HOURS", noBillHours);//不计费工时
-                    Double billHours = thisPurOrdList.stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("BILLABLE"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum() + billToThisPurOrdList.stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("BILLABLE"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum();
-                    invoice.set("BILL_HOURS", billHours);//计费工时
-                    Double prepaidHours = thisPurOrdList.stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("CONTRACT_BLOCK_ID"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum() + billToThisPurOrdList.stream().filter(rowMap -> StringUtils.isNotBlank(rowMap.getString("CONTRACT_BLOCK_ID"))).mapToDouble(rowMap -> rowMap.getDouble("BILLABLE_HOURS")).sum();
-                    invoice.set("PREPAID_HOURS", prepaidHours);//预付工时
-
-
-                    String invoiceNo = SDK.getRuleAPI().executeAtScript("@year()-@sequence(@concat(@companyId(),@year(),INVOICE),6)");//发票编号
-                    ProcessInstance processInstance = SDK.getProcessAPI().createProcessInstance("obj_a7d46a9dd4df40b899ddcf02113fe0d2", uc.getUID(), "新增账单" + invoiceNo);
-
-
-                    invoice.set("INVOICE_NO", invoiceNo);//发票编号
-                    invoice.set("INVOICE_DATE", param.getInvoiceDate());
-                    invoice.set("TOTAL", poDic.get(key).stream().mapToDouble(rowMap -> rowMap.getDouble("EXTENDED_PRICE")).sum());//总价
-                    invoice.set("TAX_VALUE", poDic.get(key).stream().mapToDouble(rowMap -> rowMap.getDouble("TAX_DOLLARS")).sum());//税
-                    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", "");
-                    invoice.set("NOTES", param.getNotes());
-                    invoice.set("TAX_REGION_NAME", account.getString("TAX_REGION_ID") == null ? "" : DBSql.getString("SELECT NAME FROM BO_EU_DND_GENERAL WHERE OID = ?", new Object[]{account.getString("TAX_REGION_ID")}));
-                    invoice.setBindId(processInstance.getId());
-
-                    dn.recordFormChanges.record(uc, invoice, "保存发票");
-
-                    SDK.getBOAPI().create("BO_EU_DNCTT_INVOICE", invoice, processInstance, uc);
-
-
-                    int invoice_line = 1;
-                    for (RowMap param_item : thisPurOrdList) {
-
-                        RowMap accDedItem = dicList.get(key).stream().filter(rowMap -> rowMap.get("ID").equals(param_item.get("ID"))).findFirst().get();
-
-                        String billable_hours = param_item.getString("BILLABLE_HOURS");
-
-                        if (param_item.getString("CONTRACT_TYPE_ID").equals("1199") || param_item.getString("CONTRACT_TYPE_ID").equals("1201")) {
-                            billable_hours = "合同已包";
-                        } else if (param_item.getString("CONTRACT_TYPE_ID").equals("1202") || param_item.getString("CONTRACT_TYPE_ID").equals("1203")) {
-                            if (StringUtils.isNotBlank(param_item.getString("BILLABLE")))
-                                billable_hours = "预支付";
-                        }
-
-                        BO invoiceItem = new BO();
-                        invoiceItem.setBindId(invoice.getBindId());
-                        invoiceItem.set("INVOICE_ID", invoice.getId());
-                        invoiceItem.set("ITEM_DATE", param_item.get("ITEM_DATE"));
-                        invoiceItem.set("ITEM_DESC", param_item.get("ITEM_DESC"));
-                        invoiceItem.set("ITEM_TYPE", param_item.get("ITEM_TYPE"));
-                        invoiceItem.set("RESOURCE_NAME", param_item.get("RESOURCE_NAME"));
-                        invoiceItem.set("billable_hours", billable_hours);
-                        invoiceItem.set("QUANTITY", param_item.get("QUANTITY"));
-                        invoiceItem.set("RATE", param_item.get("RATE"));
-                        invoiceItem.set("EFFECTIVE_TAX_RATE", accDedItem.getDouble("EFFECTIVE_TAX_RATE") * 100);
-                        invoiceItem.set("TAX_CATEGORY_NAME", accDedItem.get("TAX_CATEGORY_NAME"));
-                        String itemType = itemTypeList.stream().filter(rowMap -> rowMap.get("OID").equals(param_item.get("ITEM_TYPE"))).findFirst().get().getString("NAME");
-                        invoiceItem.set("ITEM_TYPE", itemType);
-                        invoiceItem.set("DOLLARS", param_item.get("DOLLARS"));
-                        invoiceItem.set("HOURLY_RATE", param_item.get("HOURLY_RATE"));
-                        invoiceItem.set("ROLE_NAME", param_item.get("ROLE_NAME"));
-                        invoiceItem.set("WORK_TYPE", param_item.get("WORK_TYPE"));
-                        invoiceItem.set("TAX_INCLUSIVE", param_item.get("DOLLARS"));
-                        invoiceItem.set("ACCOUNT_DEDUCTION_ID", param_item.get("ID"));
-                        SDK.getBOAPI().createDataBO("BO_EU_DNCTT_INVOICE_DETAIL", invoiceItem, uc);
-
-                        //更新账户抵扣条目
-                        if (isDeal)// 处理,区分预览和实际生成
-                        {
-                            BO thisacc_ded = SDK.getBOAPI().get("BO_EU_DNCRM_ACCOUNT_DEDUCTION", accDedItem.getString("ID"));
-                            thisacc_ded.set("INVOICE_ID", invoice.getId());
-                            thisacc_ded.set("INVOICE_LINE_ITEM_NO", invoice_line);
-                            SDK.getBOAPI().update("BO_EU_DNCRM_ACCOUNT_DEDUCTION", thisacc_ded);
-                        }
-                        invoice_line++;
-                    }
-                    //付费到这个客户的条目
-                    if (billToThisPurOrdList.size() > 0) {
-                        Map<String, List<RowMap>> dicBillToThis = billToThisPurOrdList.stream().collect(Collectors.groupingBy(rowMap -> rowMap.getString("account_id")));
-                        for (String bkey : dicBillToThis.keySet()) {
-
-                            for (RowMap param_item : dicBillToThis.get(bkey)) {
-                                RowMap accDedItem = dicList.get(key).stream().filter(rowMap -> rowMap.get("ID").equals(param_item.get("ID"))).findFirst().get();
-
-                                String billable_hours = param_item.getString("BILLABLE_HOURS");
-
-                                if (param_item.getString("CONTRACT_TYPE_ID").equals("1199") || param_item.getString("CONTRACT_TYPE_ID").equals("1201")) {
-                                    billable_hours = "合同已包";
-                                } else if (param_item.getString("CONTRACT_TYPE_ID").equals("1202") || param_item.getString("CONTRACT_TYPE_ID").equals("1203")) {
-                                    if (StringUtils.isNotBlank(param_item.getString("BILLABLE")))
-                                        billable_hours = "预支付";
-                                }
-
-                                BO invoiceItem = new BO();
-                                invoiceItem.setBindId(invoice.getBindId());
-                                invoiceItem.set("INVOICE_ID", invoice.getId());
-                                invoiceItem.set("ITEM_DATE", param_item.get("ITEM_DATE"));
-                                invoiceItem.set("ITEM_DESC", param_item.get("ITEM_DESC"));
-                                invoiceItem.set("ITEM_TYPE", param_item.get("ITEM_TYPE"));
-                                invoiceItem.set("RESOURCE_NAME", param_item.get("RESOURCE_NAME"));
-                                invoiceItem.set("billable_hours", billable_hours);
-                                invoiceItem.set("QUANTITY", param_item.get("QUANTITY"));
-                                invoiceItem.set("RATE", param_item.get("RATE"));
-                                invoiceItem.set("EFFECTIVE_TAX_RATE", accDedItem.getDouble("EFFECTIVE_TAX_RATE") * 100);
-                                invoiceItem.set("TAX_CATEGORY_NAME", accDedItem.get("TAX_CATEGORY_NAME"));
-                                String itemType = itemTypeList.stream().filter(rowMap -> rowMap.get("OID").equals(param_item.get("ITEM_TYPE"))).findFirst().get().getString("NAME");
-                                invoiceItem.set("ITEM_TYPE", itemType);
-                                invoiceItem.set("DOLLARS", param_item.get("DOLLARS"));
-                                invoiceItem.set("HOURLY_RATE", param_item.get("HOURLY_RATE"));
-                                invoiceItem.set("ROLE_NAME", param_item.get("ROLE_NAME"));
-                                invoiceItem.set("WORK_TYPE", param_item.get("WORK_TYPE"));
-                                invoiceItem.set("TAX_INCLUSIVE", param_item.get("DOLLARS"));
-                                invoiceItem.set("ACCOUNT_DEDUCTION_ID", param_item.get("ID"));
-                                SDK.getBOAPI().createDataBO("BO_EU_DNCTT_INVOICE_DETAIL", invoiceItem, uc);
-
-
-                                //更新账户抵扣条目
-                                if (isDeal)// 处理,区分预览和实际生成
-                                {
-                                    BO thisacc_ded = SDK.getBOAPI().get("BO_EU_DNCRM_ACCOUNT_DEDUCTION", accDedItem.getString("ID"));
-                                    thisacc_ded.set("INVOICE_ID", invoice.getId());
-                                    thisacc_ded.set("INVOICE_LINE_ITEM_NO", invoice_line);
-                                    SDK.getBOAPI().update("BO_EU_DNCRM_ACCOUNT_DEDUCTION", thisacc_ded);
-                                }
-                                invoice_line++;
-                            }
-                        }
-                    }
-
-                }
-
-            }
-
-        }
-
-
-        return invoiceIds;
-    }
-
-
-    private boolean addInvoiceItem(UserContext uc, List<RowMap> invoiceItemList) {
-
-        return true;
-    }
-
-}

BIN
libs/dn_form_before_save.jar