Jelajahi Sumber

采购编号、合同编号、采购订单

zhangyao 2 bulan lalu
induk
melakukan
a40dd65d8b

+ 2 - 2
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/event/contractFormBeforeSave.java

@@ -45,7 +45,7 @@ public class contractFormBeforeSave extends InterruptListener {
                 LocalDate END_DATE = getLocalDate(formData.get("END_DATE"));//合同结束日期
 
                 //修改了合同开始日期
-                if (START_DATE.isEqual(ORG_START_DATE) == false) {
+                if (START_DATE != null && ORG_START_DATE != null && START_DATE.isEqual(ORG_START_DATE) == false) {
                     //已审批服务周期,则不能修改合同开始时间
                     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 CONTRACT_ID=? ", new Object[]{orgData.getId()}) > 0) {
                         throw new BPMNError("500", "已审批服务周期,则不能修改合同开始时间");
@@ -53,7 +53,7 @@ public class contractFormBeforeSave extends InterruptListener {
                 }
 
                 //修改了合同结束日期
-                if (END_DATE.isEqual(ORG_END_DATE) == false) {
+                if (END_DATE != null && ORG_END_DATE != null && END_DATE.isEqual(ORG_END_DATE) == false) {
 
                     String END_DATE_STR = END_DATE.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
 

+ 80 - 14
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractService.java

@@ -123,8 +123,30 @@ public class contractService {
                 DBSql.update("update BO_EU_DNCTT_CONTRACT set IS_SDT_DEFAULT=0 where ACCOUNT_ID=?", new Object[]{contractBO.getString("ACCOUNT_ID")});
             }
 
-            if (idApply)
-                SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_APPLY", contractBO);//更新合同
+
+            //2025年10月25日  生成合同编号
+
+            String contractNo = contractBO.getString("NO");
+            if (StringUtils.isBlank(contractNo) || contractNo.indexOf("XHT") != 0) {
+                contractNo = SDK.getRuleAPI().executeAtScript("@sequenceYear(@companyId_contract,5)");
+                String DISTRICT_ID = DBSql.getString("select DISTRICT_ID from BO_EU_DNCRM_ACCOUNT where ID=?", new Object[]{contractBO.getString("ACCOUNT_ID")});
+                String cssx = "SH";//城市缩写
+                if (StringUtils.isNotBlank(DISTRICT_ID)) {
+                    RowMap city = DBSql.getMap("SELECT EXTTEXT1,EXTTEXT2 FROM BO_ACT_DICT_KV_ITEM WHERE DICTKEY = 'GB.ADDR' AND ITEMNO= ?", new Object[]{DISTRICT_ID});
+                    if (city != null) {
+                        cssx = city.getString("EXTTEXT1");
+                        if (!cssx.contains("市")) {
+                            cssx = city.getString("EXTTEXT2");
+                        }
+                        //如果 cssx="上海市" 则输出 SH
+                        cssx = getCityAbbreviation(cssx);
+                    }
+                }
+                contractNo = "XHT-" + cssx + "-" + LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + "-" + contractNo;
+                contractBO.set("NO", contractNo);
+            }
+
+            if (idApply) SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_APPLY", contractBO);//更新合同
             else {
                 dn.recordFormChanges.record(uc, contractBO, "合同编辑");
                 SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT", contractBO);
@@ -138,8 +160,7 @@ public class contractService {
 
             RowMap dto = new RowMap(contractBO.asMap());//合同对象
 
-            if (idApply)
-                insertContract(uc, dto);//创建合同详情,用于提交后查看和修改相关配置项、工单、服务等
+            if (idApply) insertContract(uc, dto);//创建合同详情,用于提交后查看和修改相关配置项、工单、服务等
             else {
                 //更新
                 DBSql.update("update BO_EU_DNCTT_CONTRACT_RATE set CONTRACT_ID=? where BINDID=?", new Object[]{dto.getString("ID"), dto.getString("BINDID")});
@@ -271,7 +292,31 @@ public class contractService {
         //更新
         DBSql.update("update BO_EU_DNCTT_CONTRACT_RATE set PROCESSDEFID=?,BINDID=?,CONTRACT_ID=? where BINDID=?", new Object[]{processDefId, contractBINDID, exitsBOID, APPLY_BINDID});
         DBSql.update("update BO_EU_DNCTT_CONTRACT_MILESTONE set PROCESSDEFID=?,BINDID=?,CONTRACT_ID=? where BINDID=?", new Object[]{processDefId, contractBINDID, exitsBOID, APPLY_BINDID});
-        DBSql.update("update BO_EU_DNCTT_CONTRACT_SERVICE set PROCESSDEFID=?,BINDID=?,CONTRACT_ID=? where BINDID=?", new Object[]{processDefId, contractBINDID, exitsBOID, APPLY_BINDID});
+
+        // DBSql.update("update BO_EU_DNCTT_CONTRACT_SERVICE set PROCESSDEFID=?,BINDID=?,CONTRACT_ID=? where BINDID=?", new Object[]{processDefId, contractBINDID, exitsBOID, APPLY_BINDID});
+
+        // 合同服务
+        List<BO> serviceList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").addQuery("BINDID =", APPLY_BINDID).list();
+        for (BO service : serviceList) {
+
+            ProcessInstance costServiceProcessInst = SDK.getProcessAPI().createBOProcessInstance("obj_58693e03feac4879901430440b42efd9", uc.getUID(), "合同服务管理");
+
+            Map<String, Object> serviceMap = service.asMap();
+
+            BO serviceBO = new BO();
+            for (String key : excludesArray) {
+                serviceMap.remove(key);
+            }
+            serviceBO.setAll(serviceMap);
+
+            serviceBO.setBindId(costServiceProcessInst.getId());
+            serviceBO.set("CONTRACT_ID", exitsBOID);
+            dn.recordFormChanges.record(uc, serviceBO, "合同服务新增");
+
+            SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE", serviceBO, uc);
+
+        }
+
         DBSql.update("update BO_EU_DNCTT_CONTRACT_BLOCK set PROCESSDEFID=?,BINDID=?,CONTRACT_ID=? where BINDID=?", new Object[]{processDefId, contractBINDID, exitsBOID, APPLY_BINDID});
     }
 
@@ -461,8 +506,7 @@ public class contractService {
             conn.rollback();
 
         } finally {
-            if (conn != null)
-                DBSql.close(conn);
+            if (conn != null) DBSql.close(conn);
         }
         return false;
     }
@@ -1979,7 +2023,7 @@ public class contractService {
                     }
                 }
 
-                RowMap ca = DBSql.getMap("select TAX_REGION_ID,IS_TAX_EXEMPT from BO_EU_DNCRM_ACCOUNT where ID=?", new Object[]{cad.get("ACCOUNT_ID")});
+                RowMap ca = DBSql.getMap("select NAME,TAX_REGION_ID,IS_TAX_EXEMPT from BO_EU_DNCRM_ACCOUNT where ID=?", new Object[]{cad.get("ACCOUNT_ID")});
                 String tax_category_name = null;//税收种类
                 String tax_region_name = null;//税区
                 double tax_rate = 0;//税率
@@ -2005,10 +2049,24 @@ public class contractService {
                 // cad.set("EXTENDED_COST", tax_rate);
                 // cad.extended_cost = GetCost(id);
 
+                contractServiceLogger.info("定期服务计算税额");
+                contractServiceLogger.info("是否免税" + ca.get("IS_TAX_EXEMPT"));
+                contractServiceLogger.info(ca.getString("NAME") + cad.get("ACCOUNT_ID") + "是否免税" + ca.get("IS_TAX_EXEMPT"));
                 //是否免税
-                if (!ca.getString("IS_TAX_EXEMPT").equals("1") && ca.get("EXTENDED_PRICE") != null && tax_rate > 0) {
-                    double tax_dollars = cad.get("EXTENDED_PRICE", Double.class) * (1 - 1 / (1 + tax_rate));//税额
-                    cad.set("TAX_DOLLARS", tax_dollars);
+                if (ca.get("IS_TAX_EXEMPT") != null && ca.getString("IS_TAX_EXEMPT").equals("1")) {
+
+                } else {
+
+                    contractServiceLogger.info("cad.extended_price:" + cad.get("EXTENDED_PRICE"));
+                    contractServiceLogger.info("tax_rate:" + tax_rate);
+
+                    if (cad.get("EXTENDED_PRICE") != null && tax_rate > 0) {
+                        double tax_dollars = cad.get("EXTENDED_PRICE", Double.class) * (1 - 1 / (1 + tax_rate));//税额
+                        contractServiceLogger.info("cad.tax_dollars:" + tax_dollars);
+                        //截取前四位
+                        tax_dollars = Math.round(tax_dollars * 10000) / 10000.0;
+                        cad.set("TAX_DOLLARS", tax_dollars);
+                    }
                 }
 
                 //计费客户
@@ -2224,21 +2282,29 @@ public class contractService {
                         throw new RuntimeException("该服务已经生成发票,请先删除发票");
                 }
 
-                if (bo.get("TYPE_ID").equals(cttConstant.ACCOUNT_DEDUCTION_TYPE_SERVICE)) //类型:服务
+                if (bo.getString("TYPE_ID").equals(String.valueOf(cttConstant.ACCOUNT_DEDUCTION_TYPE_SERVICE))) //类型:服务
                 {
+                    /*
                     BO ccsp = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD").addQuery("CONTRACT_ID =", bo.getString("CONTRACT_ID")).addQuery("ID =", bo.getString("OBJECT_ID")).detail();
                     ccsp.set("APPROVE_AND_POST_DATE", null);
                     ccsp.set("APPROVE_AND_POST_USER_ID", null);
                     SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", ccsp, connUpdate);
+                    */
+                    DBSql.update(connUpdate, "update BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD set APPROVE_AND_POST_DATE=null,APPROVE_AND_POST_USER_ID=null where ID=?", new Object[]{bo.getString("OBJECT_ID")});
 
-                } else if (bo.get("TYPE_ID").equals(cttConstant.ACCOUNT_DEDUCTION_TYPE_INITIAL_COST)) //类型:初始费用
+                } else if (bo.getString("TYPE_ID").equals(String.valueOf(cttConstant.ACCOUNT_DEDUCTION_TYPE_INITIAL_COST))) //类型:初始费用
                 {
+                    /*
                     BO ccc = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT").addQuery("ID =", bo.getString("CONTRACT_ID")).detail();
                     ccc.set("SETUP_FEE_APPROVE_AND_POST_USER_ID", null);
                     ccc.set("SETUP_FEE_APPROVE_AND_POST_DATE", null);
                     SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT", ccc, connUpdate);
+
+                     */
+
+                    DBSql.update(connUpdate, "update BO_EU_DNCTT_CONTRACT set SETUP_FEE_APPROVE_AND_POST_USER_ID=null,SETUP_FEE_APPROVE_AND_POST_DATE=null where ID=?", new Object[]{bo.getString("OBJECT_ID")});
                 }
-                bo.set("CLOSED", 1);
+                //bo.set("CLOSED", 1);
                 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);

+ 25 - 15
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/event/ivtOrderFormAfter.java

@@ -6,6 +6,7 @@ import com.actionsoft.bpms.bpmn.engine.listener.ExecuteListener;
 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.apache.commons.lang3.StringUtils;
 
 import java.time.LocalDate;
@@ -15,6 +16,8 @@ import java.util.List;
 import static com.awspaas.user.apps.donenow_ivt.utils.CityAbbreviationUtil.getCityAbbreviation;
 
 public class ivtOrderFormAfter extends ExecuteListener {
+    private static final Logger logger = SDK.getLogAPI().getLogger(ivtOrderFormAfter.class);//记录日志
+
     public String getDescription() {
         return "采购订单表单保存后,数据处理事件";
     }
@@ -26,6 +29,8 @@ public class ivtOrderFormAfter extends ExecuteListener {
      */
     @Override
     public void execute(ProcessExecutionContext processExecutionContext) throws Exception {
+
+        logger.info("采购订单表单保存后,数据处理事件");
         BO orderBO = SDK.getBOAPI().getByProcess("BO_EU_DNIVT_ORDER", processExecutionContext.getProcessInstance().getId());
         List<BO> orderProducts = SDK.getBOAPI().query("BO_EU_DNIVT_ORDER_PRODUCT").bindId(orderBO.getBindId()).list();
         List<BO> costProducts = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_COST_PRODUCT").addQuery("ORDER_ID=", orderBO.getId()).list();
@@ -47,30 +52,35 @@ public class ivtOrderFormAfter extends ExecuteListener {
 
 
         //采购订单编号
+        String purchaseOrderNo = orderBO.getString("PURCHASE_ORDER_NO");
+        logger.info("采购订单编号:" + purchaseOrderNo);
+        if (StringUtils.isBlank(purchaseOrderNo)) {
 
-        String purchaseOrderNo = SDK.getRuleAPI().executeAtScript("@sequenceYear(@companyId_purchase_order,4,0,130)");
+            purchaseOrderNo = SDK.getRuleAPI().executeAtScript("@sequenceYear(@companyId_purchase_order,4,0,130)", processExecutionContext.getUserContext());
 
-        String DISTRICT_ID = DBSql.getString("select DISTRICT_ID from BO_EU_DNCRM_ACCOUNT where ID=?", new Object[]{orderBO.getString("VENDOR_ACCOUNT_ID")});
+            String DISTRICT_ID = DBSql.getString("select DISTRICT_ID from BO_EU_DNCRM_ACCOUNT where ID=?", new Object[]{orderBO.getString("VENDOR_ACCOUNT_ID")});
 
-        String cssx = "SH";//城市缩写
+            String cssx = "SH";//城市缩写
 
-        if (StringUtils.isNotBlank(DISTRICT_ID)) {
-            RowMap city = DBSql.getMap("SELECT EXTTEXT1,EXTTEXT2 FROM BO_ACT_DICT_KV_ITEM WHERE DICTKEY = 'GB.ADDR' AND ITEMNO= ?", new Object[]{DISTRICT_ID});
-            if (city != null) {
-                cssx = city.getString("EXTTEXT1");
-                if (!cssx.contains("市")) {
-                    cssx = city.getString("EXTTEXT2");
+            if (StringUtils.isNotBlank(DISTRICT_ID)) {
+                RowMap city = DBSql.getMap("SELECT EXTTEXT1,EXTTEXT2 FROM BO_ACT_DICT_KV_ITEM WHERE DICTKEY = 'GB.ADDR' AND ITEMNO= ?", new Object[]{DISTRICT_ID});
+                if (city != null) {
+                    cssx = city.getString("EXTTEXT1");
+                    if (!cssx.contains("市")) {
+                        cssx = city.getString("EXTTEXT2");
+                    }
+                    //如果 cssx="上海市" 则输出 SH
+                    cssx = getCityAbbreviation(cssx);
                 }
-                //如果 cssx="上海市" 则输出 SH
-                cssx = getCityAbbreviation(cssx);
             }
-        }
-        purchaseOrderNo = "CHT-" + cssx + "-" + LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + "-" + purchaseOrderNo;
+            purchaseOrderNo = "CHT-" + cssx + "-" + LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + "-" + purchaseOrderNo;
 
-        orderBO.set("PURCHASE_ORDER_NO", purchaseOrderNo);
+            orderBO.set("PURCHASE_ORDER_NO", purchaseOrderNo);
 
-        SDK.getBOAPI().update("BO_EU_DNIVT_ORDER", orderBO);
+            logger.info("采购订单编号:" + purchaseOrderNo);
 
+            SDK.getBOAPI().update("BO_EU_DNIVT_ORDER", orderBO);
 
+        }
     }
 }

+ 7 - 1
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/event/ivtOrderProcessAfterComplete.java

@@ -97,7 +97,7 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
                     if (costProduct.getString("COST_CODE_ID").equals("307")) {
                         costProduct.set("STATUS_ID", "2159");//已配送
                     }
-
+                    costProduct.set("UNIT_COST", orderProduct.get("UNIT_COST"));
                     dn.recordFormChanges.record(uc, costProduct, "采购产品审批后新增");
                     SDK.getBOAPI().create("BO_EU_DNCTT_CONTRACT_COST_PRODUCT", costProduct, processInstance, uc);
                 } else {
@@ -113,6 +113,8 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
                     costProduct.set("COST_CODE_ID", cost.getString("COST_CODE_ID"));
                     costProduct.set("COST_CODE_NAME", cost.getString("COST_CODE_NAME"));
 
+                    costProduct.set("UNIT_COST", orderProduct.get("UNIT_COST"));
+
                     //服务采购审批完成,状态直接改为已配送。
                     if (costProduct.getString("COST_CODE_ID").equals("307")) {
                         costProduct.set("STATUS_ID", "2159");//已配送
@@ -155,6 +157,8 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
         }
         SDK.getBOAPI().update("BO_EU_DNIVT_ORDER", purchaseOrder);
 
+        String VENDOR_ACCOUNT_ID = purchaseOrder.getString("VENDOR_ACCOUNT_ID");//供应商账户ID
+
         //生成付款计划-- 胡磊 旧版
         //createPaymentPlan(uc,orderId);
 
@@ -217,6 +221,8 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
                         paymentPlan.set("CONTRACT_SERVICE_ID", service.getId());
                         paymentPlan.set("PAY_DESC", orderProduct.getString("NAME"));
 
+                        paymentPlan.set("ACCOUNT_PAYEE", VENDOR_ACCOUNT_ID);//收款单位
+
                         SDK.getBOAPI().create("BO_EU_DNIVT_ORDER_PAYMENT_PLAN", paymentPlan, processInstance, uc);
 
                         System.out.println("==== 创建付款计划:" + paymentPlan.get("PLAN_DATE") + ",金额:" + paymentPlan.get("PLAN_AMOUNT") + " ====");

+ 41 - 0
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/event/ivtOrderProcessAfterDeleted.java

@@ -0,0 +1,41 @@
+package com.awspaas.user.apps.donenow_ivt.event;
+
+import com.actionsoft.bpms.bo.engine.BO;
+import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext;
+import com.actionsoft.bpms.bpmn.engine.listener.ExecuteListener;
+import com.actionsoft.bpms.util.DBSql;
+import com.actionsoft.sdk.local.SDK;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+
+/**
+ * 采购订单删除作废
+ */
+public class ivtOrderProcessAfterDeleted extends ExecuteListener {
+
+    public String getDescription() {
+        return "采购订单删除作废";
+    }
+
+    public void execute(ProcessExecutionContext ctx) throws Exception {
+        info("流程删除后事件被触发-->" + ctx.getProcessInstance());
+
+        String bindId = ctx.getProcessInstance().getId();
+
+        //BO order = SDK.getBOAPI().getByProcess("BO_EU_DNIVT_ORDER", bindId);
+        List<BO> orderProducts = SDK.getBOAPI().query("BO_EU_DNIVT_ORDER_PRODUCT").addQuery("BINDID =", bindId).list();
+
+        for (BO op : orderProducts) {
+            String costProductID = DBSql.getString("SELECT ID FROM BO_EU_DNCTT_CONTRACT_COST_PRODUCT WHERE ORDER_ID=? AND CONTRACT_COST_ID=?", new Object[]{op.getString("ORDER_ID"), op.getString("CONTRACT_COST_ID")});
+
+            if (StringUtils.isNotBlank(costProductID))
+                DBSql.update("delete from BO_EU_DNCTT_CONTRACT_COST_PRODUCT where ID=?", new Object[]{costProductID});
+        }
+
+        //SDK.getBOAPI().removeByBindId("BO_EU_DNIVT_ORDER", bindId);
+        //SDK.getBOAPI().removeByBindId("BO_EU_DNIVT_ORDER_PRODUCT", bindId);
+
+    }
+
+}

+ 31 - 0
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/event/ivtOrderProcessBeforeDeleted.java

@@ -0,0 +1,31 @@
+package com.awspaas.user.apps.donenow_ivt.event;
+
+import com.actionsoft.bpms.bo.engine.BO;
+import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext;
+import com.actionsoft.bpms.bpmn.engine.listener.InterruptListener;
+import com.actionsoft.bpms.util.DBSql;
+import com.actionsoft.sdk.local.SDK;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+
+public class ivtOrderProcessBeforeDeleted extends InterruptListener {
+    /**
+     *采购订单删除后,删除关联的采购合同产品
+     * @param ctx
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public boolean execute(ProcessExecutionContext ctx) throws Exception {
+        String bindId = ctx.getProcessInstance().getId();
+        List<BO> orderProducts = SDK.getBOAPI().query("BO_EU_DNIVT_ORDER_PRODUCT").addQuery("BINDID =", bindId).list();
+        for (BO op : orderProducts) {
+            String costProductID = DBSql.getString("SELECT ID FROM BO_EU_DNCTT_CONTRACT_COST_PRODUCT WHERE ORDER_ID=? AND CONTRACT_COST_ID=?", new Object[]{op.getString("ORDER_ID"), op.getString("CONTRACT_COST_ID")});
+            if (StringUtils.isNotBlank(costProductID))
+                DBSql.update("delete from BO_EU_DNCTT_CONTRACT_COST_PRODUCT where ID=?", new Object[]{costProductID});
+        }
+
+        return true;
+    }
+}