Selaa lähdekoodia

新增功能:账单删除并取消审核。

zhangyao 1 kuukausi sitten
vanhempi
commit
6ba52cda15

+ 18 - 110
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/controller/contractApproveController.java

@@ -1,4 +1,5 @@
 package com.awspaas.user.apps.donenow_ctt.controller;
+
 import com.actionsoft.bpms.bpmn.engine.model.run.delegate.ProcessInstance;
 import com.actionsoft.bpms.bo.engine.BO;
 import com.actionsoft.bpms.commons.database.RowMap;
@@ -187,6 +188,14 @@ public class contractApproveController {
         return ResponseObject.newOkResponse();
     }
 
+
+    /**
+     * 撤销合同成本
+     * @param uc
+     * @param ids
+     * @return
+     * @throws SQLException
+     */
     @Mapping("com.awspaas.user.apps.donenow_ctt.revoke_cost")
     public ResponseObject revokeCost(UserContext uc, String ids) throws SQLException {
         String result = contractService.getInstance().revokeCost(uc, ids);
@@ -940,44 +949,9 @@ public class contractApproveController {
      */
     @Mapping("com.awspaas.user.apps.donenow_ctt.revoke_labor")
     public ResponseObject revokeLabor(UserContext uc, String ids) throws SQLException {
-        Connection connUpdate = null;
-        try {
-            connUpdate = DBSql.open();
-            connUpdate.setAutoCommit(false);
-            for (String id : ids.split(",")) {
-                BO bo = SDK.getBOAPI().get("BO_EU_DNCRM_ACCOUNT_DEDUCTION", id);
-
-                //判断是否已经生成 发票
-                if (StringUtils.isNotBlank(bo.getString("INVOICE_ID"))) {
-                    if (!DBSql.getString("select IS_VOIDED from BO_EU_DNCTT_INVOICE where ID=?", new Object[]{bo.getString("INVOICE_ID")}).equals("1"))
-                        return ResponseObject.newErrResponse("该服务已经生成发票,请先删除发票");
-                       // throw new RuntimeException("该服务已经生成发票,请先删除发票");
-                }
-
-                bo.set("CLOSED", 1);
-                dn.recordFormChanges.record(uc, bo, "撤销工时审批");
-
-                SDK.getBOAPI().remove("BO_EU_DNCRM_ACCOUNT_DEDUCTION", bo.getId(), connUpdate);
-
-                BO oldEntry = SDK.getBOAPI().get("BO_EU_DNSDK_WORK_ENTRY", bo.getString("OBJECT_ID"));
-                oldEntry.set("APPROVE_AND_POST_DATE", null);
-                oldEntry.set("APPROVE_AND_POST_USER_ID", null);
-                dn.recordFormChanges.record(uc, oldEntry, "撤销工时审批");
-                SDK.getBOAPI().update("BO_EU_DNSDK_WORK_ENTRY", oldEntry);
-
-            }
-            connUpdate.commit();
-        } catch (SQLException e) {
-            if (connUpdate != null && !connUpdate.isClosed())
-                try {
-                    connUpdate.rollback();
-                } catch (SQLException ex) {
-                    ex.printStackTrace();
-                }
-        } finally {
-            if (connUpdate != null && !connUpdate.isClosed())
-                DBSql.close(connUpdate);
-        }
+        String result = contractService.getInstance().revokeLabor(uc, ids);
+        if (StringUtils.isNotBlank(result))
+            return ResponseObject.newErrResponse(result);
         return ResponseObject.newOkResponse();
     }
 
@@ -991,44 +965,9 @@ public class contractApproveController {
      */
     @Mapping("com.awspaas.user.apps.donenow_ctt.revoke_expense")
     public ResponseObject revokeExpense(UserContext uc, String ids) throws SQLException {
-        Connection connUpdate = null;
-        try {
-            connUpdate = DBSql.open();
-            connUpdate.setAutoCommit(false);
-            for (String id : ids.split(",")) {
-                BO bo = SDK.getBOAPI().get("BO_EU_DNCRM_ACCOUNT_DEDUCTION", id);
-
-                //判断是否已经生成 发票
-                if (StringUtils.isNotBlank(bo.getString("INVOICE_ID"))) {
-                    if (!DBSql.getString("select IS_VOIDED from BO_EU_DNCTT_INVOICE where ID=?", new Object[]{bo.getString("INVOICE_ID")}).equals("1"))
-                        return ResponseObject.newErrResponse("该服务已经生成发票,请先删除发票");
-                    // throw new RuntimeException("该服务已经生成发票,请先删除发票");
-                }
-
-                bo.set("CLOSED", 1);
-                dn.recordFormChanges.record(uc, bo, "撤销费用审批");
-
-                SDK.getBOAPI().remove("BO_EU_DNCRM_ACCOUNT_DEDUCTION", bo.getId(), connUpdate);
-
-                BO oldEntry = SDK.getBOAPI().get("BO_EU_DNSDK_EXPENSE", bo.getString("OBJECT_ID"));
-                oldEntry.set("APPROVE_AND_POST_DATE", null);
-                oldEntry.set("APPROVE_AND_POST_USER_ID", null);
-                dn.recordFormChanges.record(uc, oldEntry, "撤销费用审批");
-                SDK.getBOAPI().update("BO_EU_DNSDK_EXPENSE", oldEntry);
-
-            }
-            connUpdate.commit();
-        } catch (SQLException e) {
-            if (connUpdate != null && !connUpdate.isClosed())
-                try {
-                    connUpdate.rollback();
-                } catch (SQLException ex) {
-                    ex.printStackTrace();
-                }
-        } finally {
-            if (connUpdate != null && !connUpdate.isClosed())
-                DBSql.close(connUpdate);
-        }
+        String result = contractService.getInstance().revokeExpense(uc, ids);
+        if (StringUtils.isNotBlank(result))
+            return ResponseObject.newErrResponse(result);
         return ResponseObject.newOkResponse();
     }
 
@@ -1884,40 +1823,9 @@ public class contractApproveController {
      */
     @Mapping("com.awspaas.user.apps.donenow_ctt.revoke_commission")
     public ResponseObject revokeCommission(UserContext uc, String ids) throws SQLException {
-        Connection connUpdate = null;
-        try {
-            connUpdate = DBSql.open();
-            connUpdate.setAutoCommit(false);
-            for (String id : ids.split(",")) {
-                BO bo = SDK.getBOAPI().get("BO_EU_DNCRM_ACCOUNT_DEDUCTION", id);
-                bo.set("CLOSED", 1);
-                dn.recordFormChanges.record(uc, bo, "撤销佣金审批");
-
-                SDK.getBOAPI().remove("BO_EU_DNCRM_ACCOUNT_DEDUCTION", bo.getId(), connUpdate);
-
-                /*
-                BO oldEntry = SDK.getBOAPI().get("BO_EU_DNCTT_COMMISSION_PERIOD", bo.getString("OBJECT_ID"));
-                oldEntry.set("APPROVE_AND_POST_DATE", null);
-                oldEntry.set("APPROVE_AND_POST_USER_ID", null);
-                dn.recordFormChanges.record(uc, oldEntry, "撤销佣金审批");
-                SDK.getBOAPI().update("BO_EU_DNCTT_COMMISSION_PERIOD", oldEntry);
-
-                 */
-                DBSql.update("update BO_EU_DNCTT_COMMISSION_PERIOD set APPROVE_AND_POST_DATE=null,APPROVE_AND_POST_USER_ID=null where ID=?", new Object[]{bo.getString("OBJECT_ID")});
-
-            }
-            connUpdate.commit();
-        } catch (SQLException e) {
-            if (connUpdate != null && !connUpdate.isClosed())
-                try {
-                    connUpdate.rollback();
-                } catch (SQLException ex) {
-                    ex.printStackTrace();
-                }
-        } finally {
-            if (connUpdate != null && !connUpdate.isClosed())
-                DBSql.close(connUpdate);
-        }
+        String result = contractService.getInstance().revokeCommission(uc, ids);
+        if (StringUtils.isNotBlank(result))
+            return ResponseObject.newErrResponse(result);
         return ResponseObject.newOkResponse();
     }
 

+ 21 - 3
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/controller/invoiceController.java

@@ -1,5 +1,6 @@
 package com.awspaas.user.apps.donenow_ctt.controller;
 
+import com.actionsoft.bpms.commons.database.RowMap;
 import com.actionsoft.bpms.commons.formfile.model.delegate.FormFile;
 import com.actionsoft.bpms.commons.mvc.view.ResponseObject;
 import com.actionsoft.bpms.server.UserContext;
@@ -15,6 +16,7 @@ import org.apache.commons.lang3.StringUtils;
 
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.sql.SQLException;
 import java.util.List;
 
 /**
@@ -76,10 +78,26 @@ public class invoiceController {
      * @return
      */
     @Mapping("com.awspaas.user.apps.donenow_ctt.invoiceUpdate")
-    public ResponseObject invoiceUpdate(UserContext uc, String invoiceIds, String dealStatus) {
-
+    public ResponseObject invoiceUpdate(UserContext uc, String invoiceIds, String dealStatus) throws SQLException {
+        if (StringUtils.isBlank(dealStatus))
+            return ResponseObject.newErrResponse("请选择处理状态");
+        if (StringUtils.isBlank(invoiceIds))
+            return ResponseObject.newErrResponse("请选择");
+
+        //已申请开票的账单不允许作废
+        if (dealStatus.contains("作废发票"))
+            for (String invoiceId : invoiceIds.split(",")) {
+                if (StringUtils.isBlank(invoiceId))
+                    return ResponseObject.newErrResponse("请选择账单");
+                String sql = "SELECT d.ID,d.INVOICE_NO,COUNT(b.ID) CNT from BO_EU_DNCTT_INVOICE_PLAN a JOIN BO_EU_DNCTT_INVOICE_PLAN_DETAIL b ON a.BINDID=b.BINDID JOIN BO_EU_DNCTT_INVOICE_DETAIL c ON b.INVOICE_DETAIL_ID=c.ID JOIN BO_EU_DNCTT_INVOICE d ON c.BINDID=d.BINDID where d.ID=? GROUP BY d.ID,d.INVOICE_NO";
+                RowMap invoice = DBSql.getMap(sql, new Object[]{invoiceId});
+                if (invoice != null) {
+                    if (invoice.getInt("CNT") > 0) {
+                        return ResponseObject.newErrResponse(invoice.getString("INVOICE_NO") + "已申请开票的账单不允许作废");
+                    }
+                }
+            }
         InvoiceService.getInstance().invoiceUpdate(uc, invoiceIds, dealStatus);
-
         return ResponseObject.newOkResponse();
     }
 

+ 59 - 11
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/InvoiceService.java

@@ -8,16 +8,16 @@ 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.awspaas.user.apps.donenow_ctt.cttConstant;
 import org.apache.commons.lang3.StringUtils;
 import org.joda.time.LocalDate;
 import org.joda.time.format.DateTimeFormat;
 
 import java.math.BigDecimal;
+import java.sql.SQLException;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -321,19 +321,32 @@ public class InvoiceService {
      * @param dealStatus
      * @return
      */
-    public boolean invoiceUpdate(UserContext uc, String invoiceIds, String dealStatus) {
+    public boolean invoiceUpdate(UserContext uc, String invoiceIds, String dealStatus) throws SQLException {
         for (String invoiceId : invoiceIds.split(",")) {
             BO invoice = SDK.getBOAPI().get("BO_EU_DNCTT_INVOICE", invoiceId);
             List<BO> invoiceDetails = SDK.getBOAPI().query("BO_EU_DNCTT_INVOICE_DETAIL").bindId(invoice.getBindId()).addQuery("INVOICE_ID =", invoiceId).orderBy("ACCOUNT_ID").orderBy("BILL_ACCOUNT_ID").list();
 
-            boolean isDelete = true;
+            Map<String, HashSet<String>> TypeDedIds = new HashMap<>();
+
             int lineNo = 1;
             for (BO invoiceDetail : invoiceDetails) {
+
                 String accountDeductionId = invoiceDetail.getString("ACCOUNT_DEDUCTION_ID");
+                if (StringUtils.isBlank(accountDeductionId))
+                    continue;
                 BO accountDeduction = SDK.getBOAPI().get("BO_EU_DNCRM_ACCOUNT_DEDUCTION", accountDeductionId);
+                if (accountDeduction == null)
+                    continue;
+
+                String typeId = accountDeduction.getString("TYPE_ID");
+                if (TypeDedIds.containsKey(typeId)) {
+                    TypeDedIds.get(typeId).add(accountDeductionId);
+                } else {
+                    TypeDedIds.put(typeId, new HashSet<String>());
+                    TypeDedIds.get(typeId).add(accountDeductionId);
+                }
 
                 if (dealStatus.equals("生成发票")) {
-                    isDelete = false;
                     if (StringUtils.isBlank(accountDeduction.getString("INVOICE_ID"))) {
                         accountDeduction.set("INVOICE_ID", invoice.getId());
                         accountDeduction.set("INVOICE_LINE_ITEM_NO", lineNo);
@@ -344,9 +357,8 @@ public class InvoiceService {
                         lineNo++;
                     }
 
-                } else if (dealStatus.equals("作废发票")) {
+                } else if (dealStatus.contains("作废发票")) {
                     if (StringUtils.isNotBlank(accountDeduction.getString("INVOICE_ID"))) {
-                        isDelete = false;
                         accountDeduction.set("INVOICE_ID", null);
                         accountDeduction.set("INVOICE_LINE_ITEM_NO", 0);
 
@@ -358,7 +370,7 @@ public class InvoiceService {
                 }
             }
 
-            if (isDelete) {
+            if (dealStatus.contains("作废发票")) {
                 SDK.getProcessAPI().deleteById(invoice.getBindId(), uc.getUID());
                 SDK.getBOAPI().remove("BO_EU_DNCTT_INVOICE", invoiceId);
                 SDK.getBOAPI().removeByBindId("BO_EU_DNCTT_INVOICE_DETAIL", invoice.getBindId());
@@ -379,16 +391,52 @@ public class InvoiceService {
                 SDK.getBOAPI().update("BO_EU_DNCTT_INVOICE", invoice);
             }
 
-            if (isDelete || dealStatus.equals("作废发票")) {
+            if (dealStatus.contains("作废发票")) {
                 List<BO> deductions = SDK.getBOAPI().query("BO_EU_DNCRM_ACCOUNT_DEDUCTION").addQuery("INVOICE_ID =", invoiceId).list();
                 for (BO deduction : deductions) {
+
+                    String typeId = deduction.getString("TYPE_ID");
+
+                    if (TypeDedIds.containsKey(typeId) == false) {
+                        TypeDedIds.put(typeId, new HashSet<String>());
+                    }
+                    TypeDedIds.get(typeId).add(deduction.getId());
+
                     deduction.set("INVOICE_ID", null);
                     deduction.set("INVOICE_LINE_ITEM_NO", 0);
                     dn.recordFormChanges.record(uc, deduction, "作废发票");
                     SDK.getBOAPI().update("BO_EU_DNCRM_ACCOUNT_DEDUCTION", deduction);
+
+
+                    DBSql.update("UPDATE BO_EU_DNCRM_ACCOUNT_DEDUCTION SET INVOICE_ID=null,INVOICE_LINE_ITEM_NO=0 WHERE INVOICE_ID=?", new Object[]{invoiceId});
                 }
 
-                DBSql.update("UPDATE BO_EU_DNCRM_ACCOUNT_DEDUCTION SET INVOICE_ID=null,INVOICE_LINE_ITEM_NO=0 WHERE INVOICE_ID=?", new Object[]{invoiceId});
+
+                if (dealStatus.contains("取消审批") && TypeDedIds.isEmpty() == false) {
+                    for (String typeId : TypeDedIds.keySet()) {
+                        String ids = StringUtils.join(TypeDedIds.get(typeId), ",");
+                        //定期服务
+                        if (typeId.equals(String.valueOf(cttConstant.ACCOUNT_DEDUCTION_TYPE_SERVICE)) || typeId.equals(String.valueOf(cttConstant.ACCOUNT_DEDUCTION_TYPE_INITIAL_COST))) {
+                            //撤销定期服务  初始费用
+                            String result = contractService.getInstance().revokeRecurringServices(uc, ids);
+                        } else if (typeId.equals(String.valueOf(cttConstant.ACCOUNT_DEDUCTION_TYPE_CHARGE))) {
+                            //撤销合同成本成功
+                            String result = contractService.getInstance().revokeCost(uc, ids);
+                        } else if (typeId.equals(String.valueOf(cttConstant.ACCOUNT_DEDUCTION_TYPE_MILESTONES))) {
+                            //撤销合同里程碑成功
+                            String result = contractService.getInstance().revokeMilestones(uc, ids);
+                        } else if (typeId.equals(String.valueOf(cttConstant.ACCOUNT_DEDUCTION_TYPE_EXPENSES))) {
+                            //撤销合同费用成功
+                            String result = contractService.getInstance().revokeExpense(uc, ids);
+                        } else if (typeId.equals(String.valueOf(cttConstant.ACCOUNT_DEDUCTION_TYPE_LABOUR))) {
+                            //撤销合同人工成功
+                            String result = contractService.getInstance().revokeLabor(uc, ids);
+                        } else if (typeId.equals(String.valueOf(cttConstant.ACCOUNT_DEDUCTION_TYPE_COMMISSION))) {
+                            //撤销合同佣金成功
+                            String result = contractService.getInstance().revokeCommission(uc, ids);
+                        }
+                    }
+                }
             }
         }
         return true;

+ 130 - 0
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractService.java

@@ -3345,4 +3345,134 @@ public class contractService {
         return endDate.isAfter(endOfFullPeriods) ? fullPeriods + 1 : fullPeriods;
     }
 
+
+    /**
+     * 撤销费用审批
+     * @param uc
+     * @param ids
+     * @return
+     * @throws SQLException
+     */
+    public String revokeExpense(UserContext uc, String ids) throws SQLException {
+        Connection connUpdate = null;
+        try {
+            connUpdate = DBSql.open();
+            connUpdate.setAutoCommit(false);
+            for (String id : ids.split(",")) {
+                BO bo = SDK.getBOAPI().get("BO_EU_DNCRM_ACCOUNT_DEDUCTION", id);
+
+                //判断是否已经生成 发票
+                if (StringUtils.isNotBlank(bo.getString("INVOICE_ID"))) {
+                    if (!DBSql.getString("select IS_VOIDED from BO_EU_DNCTT_INVOICE where ID=?", new Object[]{bo.getString("INVOICE_ID")}).equals("1"))
+                        return "该服务已经生成发票,请先删除发票";
+                }
+
+                bo.set("CLOSED", 1);
+                dn.recordFormChanges.record(uc, bo, "撤销费用审批");
+                SDK.getBOAPI().remove("BO_EU_DNCRM_ACCOUNT_DEDUCTION", bo.getId(), connUpdate);
+                BO oldEntry = SDK.getBOAPI().get("BO_EU_DNSDK_EXPENSE", bo.getString("OBJECT_ID"));
+                oldEntry.set("APPROVE_AND_POST_DATE", null);
+                oldEntry.set("APPROVE_AND_POST_USER_ID", null);
+                dn.recordFormChanges.record(uc, oldEntry, "撤销费用审批");
+                SDK.getBOAPI().update("BO_EU_DNSDK_EXPENSE", oldEntry);
+
+            }
+            connUpdate.commit();
+        } catch (SQLException e) {
+            if (connUpdate != null && !connUpdate.isClosed())
+                try {
+                    connUpdate.rollback();
+                } catch (SQLException ex) {
+                    ex.printStackTrace();
+                }
+        } finally {
+            if (connUpdate != null && !connUpdate.isClosed())
+                DBSql.close(connUpdate);
+        }
+        return null;
+    }
+
+
+    /**
+     * 撤销工时审批
+     * @param uc
+     * @param ids
+     * @return
+     * @throws SQLException
+     */
+    public String revokeLabor(UserContext uc, String ids) throws SQLException {
+        Connection connUpdate = null;
+        try {
+            connUpdate = DBSql.open();
+            connUpdate.setAutoCommit(false);
+            for (String id : ids.split(",")) {
+                BO bo = SDK.getBOAPI().get("BO_EU_DNCRM_ACCOUNT_DEDUCTION", id);
+
+                //判断是否已经生成 发票
+                if (StringUtils.isNotBlank(bo.getString("INVOICE_ID"))) {
+                    if (!DBSql.getString("select IS_VOIDED from BO_EU_DNCTT_INVOICE where ID=?", new Object[]{bo.getString("INVOICE_ID")}).equals("1"))
+                        return "该服务已经生成发票,请先删除发票";
+                }
+
+                bo.set("CLOSED", 1);
+                dn.recordFormChanges.record(uc, bo, "撤销工时审批");
+
+                SDK.getBOAPI().remove("BO_EU_DNCRM_ACCOUNT_DEDUCTION", bo.getId(), connUpdate);
+
+                BO oldEntry = SDK.getBOAPI().get("BO_EU_DNSDK_WORK_ENTRY", bo.getString("OBJECT_ID"));
+                oldEntry.set("APPROVE_AND_POST_DATE", null);
+                oldEntry.set("APPROVE_AND_POST_USER_ID", null);
+                dn.recordFormChanges.record(uc, oldEntry, "撤销工时审批");
+                SDK.getBOAPI().update("BO_EU_DNSDK_WORK_ENTRY", oldEntry);
+
+            }
+            connUpdate.commit();
+        } catch (SQLException e) {
+            if (connUpdate != null && !connUpdate.isClosed())
+                try {
+                    connUpdate.rollback();
+                } catch (SQLException ex) {
+                    ex.printStackTrace();
+                }
+        } finally {
+            if (connUpdate != null && !connUpdate.isClosed())
+                DBSql.close(connUpdate);
+        }
+        return null;
+    }
+
+
+    /**
+     * 撤销佣金审批
+     * @param uc
+     * @param ids
+     * @return
+     * @throws SQLException
+     */
+    public String revokeCommission(UserContext uc, String ids) throws SQLException {
+        Connection connUpdate = null;
+        try {
+            connUpdate = DBSql.open();
+            connUpdate.setAutoCommit(false);
+            for (String id : ids.split(",")) {
+                BO bo = SDK.getBOAPI().get("BO_EU_DNCRM_ACCOUNT_DEDUCTION", id);
+                bo.set("CLOSED", 1);
+                dn.recordFormChanges.record(uc, bo, "撤销佣金审批");
+                SDK.getBOAPI().remove("BO_EU_DNCRM_ACCOUNT_DEDUCTION", bo.getId(), connUpdate);
+                DBSql.update("update BO_EU_DNCTT_COMMISSION_PERIOD set APPROVE_AND_POST_DATE=null,APPROVE_AND_POST_USER_ID=null where ID=?", new Object[]{bo.getString("OBJECT_ID")});
+            }
+            connUpdate.commit();
+        } catch (SQLException e) {
+            if (connUpdate != null && !connUpdate.isClosed())
+                try {
+                    connUpdate.rollback();
+                } catch (SQLException ex) {
+                    ex.printStackTrace();
+                }
+        } finally {
+            if (connUpdate != null && !connUpdate.isClosed())
+                DBSql.close(connUpdate);
+        }
+        return null;
+    }
 }