Просмотр исходного кода

1、更新合同产品上面的采购订单号;
2、 新增字段IS_SERVICE_PRODUCT 标记由服务产生的产品;
3、合同服务自动创建的产品采购接收:不允许部分接收 ;
4、合同服务相关修改;

zhangyao 3 месяцев назад
Родитель
Сommit
55afa03aba

+ 7 - 7
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/event/contractCreateFormAfterSave.java

@@ -56,9 +56,10 @@ public class contractCreateFormAfterSave extends ExecuteListener {
                         contractBO = SDK.getBOAPI().getByProcess("BO_EU_DNCTT_CONTRACT_APPLY", bindid);
                     RowMap dto = new RowMap(contractBO.asMap());
 
-                    contractService.getInstance().AddContractServiceProduct(processExecutionContext.getUserContext(), dto);//新增服务或者服务包--关联产品
-
                     contractService.getInstance().AddServiceServiceBundleOne(processExecutionContext.getUserContext(), conn, dto, formData);//保存合同
+
+                    contractService.getInstance().AddContractServiceProduct(processExecutionContext.getUserContext(), dto,conn);//新增服务或者服务包--关联产品
+
                     conn.commit();
                 } catch (SQLException e) {
 
@@ -91,10 +92,8 @@ public class contractCreateFormAfterSave extends ExecuteListener {
                     SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE", formData);
 
                     RowMap dto = new RowMap(contractBO.asMap());
-
-                    contractService.getInstance().AddContractServiceProduct(processExecutionContext.getUserContext(), dto);//新增服务或者服务包--关联产品
-
                     contractService.getInstance().AddServiceServiceBundleOne(processExecutionContext.getUserContext(), conn, dto, formData);//保存合同
+                    contractService.getInstance().AddContractServiceProduct(processExecutionContext.getUserContext(), dto,conn);//新增服务或者服务包--关联产品
                     conn.commit();
                 } catch (SQLException e) {
 
@@ -136,9 +135,10 @@ public class contractCreateFormAfterSave extends ExecuteListener {
 
                     RowMap dto = new RowMap(contractBO.asMap());
 
-                    contractService.getInstance().AddContractServiceProduct(processExecutionContext.getUserContext(), dto);//新增服务或者服务包--关联产品
-
                     contractService.getInstance().AddServiceServiceBundleOne(processExecutionContext.getUserContext(), conn, dto, contractServiceBO);//保存合同
+
+                    contractService.getInstance().AddContractServiceProduct(processExecutionContext.getUserContext(), dto,conn);//新增服务或者服务包--关联产品
+
                     conn.commit();
                 } catch (SQLException e) {
 

+ 121 - 57
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/service/contractService.java

@@ -161,9 +161,11 @@ public class contractService {
             {
                 try {
 
+                    boolean flag = AddServiceServiceBundle(uc, dto);//新增服务或者服务包
+
                     AddContractServiceProduct(uc, dto);//新增服务或者服务包--关联产品
 
-                    boolean flag = AddServiceServiceBundle(uc, dto);//新增服务或者服务包
+                    //更新服务产品价格
 
                     if (!flag) {
                         resultDto.put("success", false);
@@ -438,11 +440,16 @@ public class contractService {
             service.set("UNIT_COST", unit_cost);
             unit_price = unit_price.multiply(rate);
             service.set("UNIT_PRICE", unit_price);
+
+            service.set("PERIOD_TYPE", contract.getString("PERIOD_TYPE"));//计费周期更新
         }
 
         contractServiceLogger.info("计算-service-ADJUSTED_PRICE");
 
+        service.set("TOTAL_PRICE", multiply(service.get("QUANTITY"), service.get("UNIT_PRICE")));//总价
         service.set("ADJUSTED_PRICE", multiply(service.get("QUANTITY"), service.get("UNIT_PRICE")));//总价
+        service.set("TOTAL_COST", multiply(service.get("QUANTITY"), service.get("UNIT_COST")));//总价
+
 
         SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE", service, conn);//保存
 
@@ -513,13 +520,15 @@ public class contractService {
 
             ADJUST_PERIOD = LocalDateYYYYMMDD(EFFECTIVE_DATE) + "~" + LocalDateYYYYMMDD(end);
 
-            csa.set("PRORATED_COST_CHANGE", service.get("ADJUSTED_PRICE"));
-
             contractServiceLogger.info("计算-csa-ADJUST_PRORATED_PRICE_CHANGE");
             csa.set("ADJUST_PRORATED_PRICE_CHANGE", multiply(service.get("ADJUSTED_PRICE"), periodRate));
             csa.set("PRORATED_PRICE_CHANGE", csa.get("ADJUST_PRORATED_PRICE_CHANGE"));
             csa.set("VENDOR_ACCOUNT_ID", vendor_account_id);
             csa.setBindId(service.getString("BINDID"));
+
+            //服务周期成本
+            csa.set("PRORATED_COST_CHANGE", multiply(service.get("TOTAL_COST"), periodRate));
+
             SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST", csa, uc, conn);
 
             // 插入服务调整表包含的服务ctt_contract_service_adjust_bundle_service
@@ -572,7 +581,7 @@ public class contractService {
                 csp.set("PERIOD_PRICE", period_price);
 
                 contractServiceLogger.info("计算-csp-PERIOD_COST");
-                BigDecimal period_cost = multiply(service.get("PERIOD_COST"), service.get("QUANTITY"));
+                BigDecimal period_cost = multiply(service.get("UNIT_COST"), service.get("QUANTITY"));
                 period_cost = periodRate.multiply(period_cost);
                 csp.set("PERIOD_COST", period_cost);
 
@@ -628,80 +637,124 @@ public class contractService {
     /**
      * 一个服务对应添加一个合同产品
      * @param uc
+     * @param contract
+     * @param conn
      * @return
+     * @throws SQLException
      */
-    public boolean AddContractServiceProduct(UserContext uc, RowMap contract) throws SQLException {
-        contractServiceLogger.info("新增服务或服务包");
+    public boolean AddContractServiceProduct(UserContext uc, RowMap contract, Connection conn) throws SQLException {
+        //获取服务列表
+        List<BO> serviceList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").connection(conn).addQuery("BINDID=", contract.get("BINDID")).list();
+        List<BO> serviceList2 = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").connection(conn).addQuery("BINDID!=", contract.get("BINDID")).addQuery("CONTRACT_ID=", contract.get("ID")).list();
+
+        if (serviceList == null)
+            serviceList = new ArrayList<BO>();
+        if (serviceList2 != null && serviceList2.size() > 0)
+            for (BO service : serviceList2) {
+                serviceList.add(service);
+            }
 
-        Connection conn = null;
-        try {
-            conn = DBSql.open();
-            conn.setAutoCommit(false);
-            //获取服务列表
-            List<BO> serviceList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").connection(conn).addQuery("BINDID=", contract.get("BINDID")).list();
-            List<BO> serviceList2 = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").connection(conn).addQuery("BINDID!=", contract.get("BINDID")).addQuery("CONTRACT_ID=", contract.get("ID")).list();
+        for (BO service : serviceList) {
 
-            if (serviceList == null)
-                serviceList = new ArrayList<BO>();
-            if (serviceList2 != null && serviceList2.size() > 0)
-                for (BO service : serviceList2) {
-                    serviceList.add(service);
-                }
+            String PRODUCT_ID = null;
+            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")});
+                String serviceIDS = serviceBUNDLE.getString("SERVICE_ID");
 
-            for (BO service : serviceList) {
+                Double BUNDLE_UNIT_COST = serviceBUNDLE.getDouble("UNIT_COST");
+                Double BUNDLE_UNIT_PRICE = serviceBUNDLE.getDouble("UNIT_PRICE");
 
-                String PRODUCT_ID = null;
-                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")});
-                    for (String serviceID : serviceIDS.split(",")) {
-                        String contractCostId = DBSql.getString(conn, "select ID from BO_EU_DNCTT_CONTRACT_COST where CONTRACT_ID=? and SERVICE_ID=? and PRODUCT_ID in(select PRODUCT_ID from BO_EU_DNIVT_SERVICE where ID=?)", new Object[]{contract.getString("ID"), service.getString("ID"), serviceID});
-
-                        String NEED_PURCHASE = service.getString("NEED_PURCHASE");
-                        if (NEED_PURCHASE.equals("1")) {
-                            Map<String, String> contractCost = new HashMap<String, String>();
-                            contractCost.put("ID", contractCostId);
-                            contractCost.put("SERVICE_ID", service.getString("ID"));
-                            contractCost.put("SERVICE_NAME", service.getString("NAME"));
-                            contractCost.put("serviceID", serviceID);
-                            contractCost.put("CONTRACT_ID", contract.getString("ID"));
-                            contractCost.put("QUANTITY", service.getString("QUANTITY"));
-                            PRODUCT_ID = AddContractServiceProduct(uc, conn, contractCost);
-                        } else {
-                            //是否 删除 contractCostId  没有采购 没有拣货时可删除
-                            if (DBSql.getInt(conn, "select count(*) from BO_EU_DNCTT_CONTRACT_COST_PRODUCT where CONTRACT_COST_ID=?", new Object[]{contractCostId}) == 0 && DBSql.getInt(conn, "select count(*) from BO_EU_DNIVT_ORDER_PRODUCT where CONTRACT_COST_ID=?", new Object[]{contractCostId}) == 0) {
-                                String contractCostBINDId = DBSql.getString(conn, "select BINDID from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{contractCostId});
-                                SDK.getProcessAPI().deleteById(contractCostBINDId, uc.getUID());
-                                DBSql.update(conn, "delete from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{contractCostId});
-                            }
-                        }
+                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});
+
+                Map<String, Double> unitPriceMap = new HashMap<String, Double>();
+                Map<String, Double> unitCostMap = new HashMap<String, Double>();
+                for (RowMap ivtService : ivtServiceList) {
+                    Double UNIT_PRICE = ivtService.getDouble("UNIT_PRICE");
+                    Double UNIT_COST = ivtService.getDouble("UNIT_COST");
+
+                    UNIT_PRICE = ivtServiceSum.getDouble("SUM_PRICE") == 0 ? 0.0 : BUNDLE_UNIT_PRICE * UNIT_PRICE / ivtServiceSum.getDouble("SUM_PRICE");
+                    unitPriceMap.put(ivtService.getString("ID"), UNIT_PRICE);
+
+                    UNIT_COST = ivtServiceSum.getDouble("SUM_COST") == 0 ? 0.0 : BUNDLE_UNIT_COST * UNIT_COST / ivtServiceSum.getDouble("SUM_COST");
+                    unitCostMap.put(ivtService.getString("ID"), UNIT_COST);
+                }
+
+                for (String serviceID : serviceIDS.split(",")) {
+                    String contractCostId = DBSql.getString(conn, "select ID from BO_EU_DNCTT_CONTRACT_COST where IS_SERVICE_PRODUCT=1 AND  CONTRACT_ID=? and SERVICE_ID=? and PRODUCT_ID in(select PRODUCT_ID from BO_EU_DNIVT_SERVICE where ID=?)", new Object[]{contract.getString("ID"), service.getString("ID"), serviceID});
 
-                    }
-                } else {
-                    String contractCostId = DBSql.getString(conn, "select ID from BO_EU_DNCTT_CONTRACT_COST where CONTRACT_ID=? and SERVICE_ID=?", new Object[]{contract.getString("ID"), service.getString("ID")});
                     String NEED_PURCHASE = service.getString("NEED_PURCHASE");
                     if (NEED_PURCHASE.equals("1")) {
                         Map<String, String> contractCost = new HashMap<String, String>();
                         contractCost.put("ID", contractCostId);
                         contractCost.put("SERVICE_ID", service.getString("ID"));
                         contractCost.put("SERVICE_NAME", service.getString("NAME"));
-                        contractCost.put("serviceID", service.getString("OBJECT_ID"));
+                        contractCost.put("serviceID", serviceID);
                         contractCost.put("CONTRACT_ID", contract.getString("ID"));
                         contractCost.put("QUANTITY", service.getString("QUANTITY"));
+
+                        contractCost.put("UNIT_PRICE", String.valueOf(unitPriceMap.get(serviceID)));
+                        contractCost.put("UNIT_COST", String.valueOf(unitCostMap.get(serviceID)));
+
                         PRODUCT_ID = AddContractServiceProduct(uc, conn, contractCost);
                     } else {
-                        //是否 删除 contractCostId
                         //是否 删除 contractCostId  没有采购 没有拣货时可删除
                         if (DBSql.getInt(conn, "select count(*) from BO_EU_DNCTT_CONTRACT_COST_PRODUCT where CONTRACT_COST_ID=?", new Object[]{contractCostId}) == 0 && DBSql.getInt(conn, "select count(*) from BO_EU_DNIVT_ORDER_PRODUCT where CONTRACT_COST_ID=?", new Object[]{contractCostId}) == 0) {
                             String contractCostBINDId = DBSql.getString(conn, "select BINDID from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{contractCostId});
                             SDK.getProcessAPI().deleteById(contractCostBINDId, uc.getUID());
                             DBSql.update(conn, "delete from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{contractCostId});
                         }
-
                     }
+
                 }
+            } else {
+                String contractCostId = DBSql.getString(conn, "select ID from BO_EU_DNCTT_CONTRACT_COST where IS_SERVICE_PRODUCT=1 AND CONTRACT_ID=? and SERVICE_ID=?", new Object[]{contract.getString("ID"), service.getString("ID")});
+                String NEED_PURCHASE = service.getString("NEED_PURCHASE");
+                if (NEED_PURCHASE.equals("1")) {
+                    Map<String, String> contractCost = new HashMap<String, String>();
+                    contractCost.put("ID", contractCostId);
+                    contractCost.put("SERVICE_ID", service.getString("ID"));
+                    contractCost.put("SERVICE_NAME", service.getString("NAME"));
+                    contractCost.put("serviceID", service.getString("OBJECT_ID"));
+                    contractCost.put("CONTRACT_ID", contract.getString("ID"));
+                    contractCost.put("QUANTITY", service.getString("QUANTITY"));
+
+                    contractCost.put("UNIT_PRICE", service.getString("UNIT_PRICE"));
+                    contractCost.put("UNIT_COST", service.getString("UNIT_COST"));
+
+                    PRODUCT_ID = AddContractServiceProduct(uc, conn, contractCost);
+                } else {
+                    //是否 删除 contractCostId
+                    //是否 删除 contractCostId  没有采购 没有拣货时可删除
+                    if (DBSql.getInt(conn, "select count(*) from BO_EU_DNCTT_CONTRACT_COST_PRODUCT where CONTRACT_COST_ID=?", new Object[]{contractCostId}) == 0 && DBSql.getInt(conn, "select count(*) from BO_EU_DNIVT_ORDER_PRODUCT where CONTRACT_COST_ID=?", new Object[]{contractCostId}) == 0) {
+                        String contractCostBINDId = DBSql.getString(conn, "select BINDID from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{contractCostId});
+                        SDK.getProcessAPI().deleteById(contractCostBINDId, uc.getUID());
+                        DBSql.update(conn, "delete from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{contractCostId});
+                    }
 
+                }
             }
+
+        }
+        return true;
+    }
+
+    /**
+     * 一个服务对应添加一个合同产品
+     * @param uc
+     * @return
+     */
+    public boolean AddContractServiceProduct(UserContext uc, RowMap contract) throws SQLException {
+        contractServiceLogger.info("新增服务或服务包");
+
+        Connection conn = null;
+        try {
+            conn = DBSql.open();
+            conn.setAutoCommit(false);
+            AddContractServiceProduct(uc,contract,conn);
             conn.commit();
             return true;
         } catch (SQLException e) {
@@ -744,22 +797,33 @@ public class contractService {
             BO product = SDK.getBOAPI().get("BO_EU_DNIVT_PRODUCT", contractCost.getString("PRODUCT_ID"));
 
             if (product != null) {
-
                 contractCost.set("DESCRIPTION", product.getString("DESCRIPTION"));
                 contractCost.set("COST_CODE_ID", product.getString("COST_CODE_ID"));
-                contractCost.set("UNIT_COST", product.getString("UNIT_COST"));
-                contractCost.set("UNIT_PRICE", product.getString("UNIT_PRICE"));
                 contractCost.set("PRODUCT_NAME", product.getString("NAME"));
-
                 contractCost.set("TAX_CATEGORY_ID", DBSql.getString("select TAX_CATEGORY_ID from BO_EU_DND_COST_CODE where OID=?", new Object[]{product.getString("COST_CODE_ID")}));
                 contractCost.set("COST_CODE_NAME", DBSql.getString("select NAME from BO_EU_DND_COST_CODE where OID=?", new Object[]{product.getString("COST_CODE_ID")}));
             }
         }
+        contractCost.set("IS_SERVICE_PRODUCT", 1);
+        //单价
+        contractCost.set("UNIT_COST", service.get("UNIT_COST"));
+
+        //成本
+        contractCost.set("UNIT_PRICE", service.get("UNIT_PRICE"));
+
+        //数量
+        contractCost.set("QUANTITY", DBSql.getDouble(conn, "SELECT COUNT(1) as CNT FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "CNT") + DBSql.getDouble(conn, "SELECT COUNT(1) as CNT FROM BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "CNT"));
+
+        //总成本
+        contractCost.set("EXTENDED_COST", DBSql.getDouble(conn, "SELECT SUM(PERIOD_COST) as COST FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "COST") + DBSql.getDouble(conn, "SELECT SUM(PRORATED_COST_CHANGE) as COST FROM BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "COST"));
+
+        //总价格
+        contractCost.set("EXTENDED_PRICE", DBSql.getDouble(conn, "SELECT SUM(PERIOD_ADJUSTED_PRICE) as PRICE FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "PRICE") + DBSql.getDouble(conn, "SELECT SUM(ADJUST_PRORATED_PRICE_CHANGE) as PRICE FROM BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "PRICE"));
 
         if (contractCost.isNew()) {
-            SDK.getBOAPI().create("BO_EU_DNCTT_CONTRACT_COST", contractCost, contractCost.getBindId(), uc.getUID());
+            SDK.getBOAPI().create("BO_EU_DNCTT_CONTRACT_COST", contractCost, contractCost.getBindId(), uc.getUID(), conn);
         } else {
-            SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_COST", contractCost);
+            SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_COST", contractCost, conn);
         }
 
         return contractCost.getId();

+ 1 - 0
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/controller/IVTController.java

@@ -275,6 +275,7 @@ public class IVTController extends BaseController {
             subBo.set("NOW_COUNT", 0);
             subBo.set("CONTRACT_COST_ID", map.get("CONTRACT_COST_ID"));
             subBo.set("STATUS", "待接收");
+            subBo.set("WHOLE", DBSql.getInt("select count(1) AS CNT from BO_EU_DNCTT_CONTRACT_COST where ID=? AND IS_SERVICE_PRODUCT=1", new Object[]{map.get("CONTRACT_COST_ID")}));//判断是否整体接收
             subBo.setBindId(createBOProcessInstance.getId());
             list.add(subBo);
         }

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

@@ -17,6 +17,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.awspaas.user.apps.donenow_ivt.cache.formStatusCache;
+import com.awspaas.user.apps.donenow_ivt.constant.IVTConstant;
 import org.apache.commons.lang3.StringUtils;
 
 import java.sql.Connection;
@@ -687,6 +688,12 @@ public class ivtOrderController {
                 purchaseOrderProduct.set("CONTRACT_SERVICE_ID", cost.getString("SERVICE_ID"));
                 purchaseOrderProduct.set("ORDER_ID", purchaseOrder.getId());
                 SDK.getBOAPI().createDataBO("BO_EU_DNIVT_ORDER_PRODUCT", purchaseOrderProduct, uc, conn);  //采购项
+
+
+                //更新采购订单号
+                String PURCHASE_ORDER_NO = DBSql.getString("SELECT GROUP_CONCAT(PURCHASE_ORDER_NO) FROM " + IVTConstant.BO_EU_DNIVT_ORDER + " WHERE CLOSED=0 AND ID IN (SELECT ORDER_ID FROM BO_EU_DNIVT_ORDER_PRODUCT WHERE CONTRACT_COST_ID=?) ", new Object[]{cost.getString("ID")});
+
+                DBSql.update(conn, "UPDATE BO_EU_DNCTT_CONTRACT_COST SET PURCHASE_ORDER_NO=? WHERE ID=?", new Object[]{PURCHASE_ORDER_NO, cost.getString("ID")});
             }
 
 

+ 4 - 0
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/event/DoWorkThread.java

@@ -277,6 +277,10 @@ public class DoWorkThread extends Thread {
                     if (DBSql.getInt(sql, new Object[]{bo.getString("CONTRACT_COST_ID")}) <= 0) {
                         BO contractProductBo = SDK.getBOAPI().get(IVTConstant.BO_EU_DNCTT_CONTRACT_COST, bo.getString("CONTRACT_COST_ID"));
                         contractProductBo.set("STATUS_ID", IVTConstant.STATUS_1236);//待配送
+
+                        //更新采购订单号
+                        String PURCHASE_ORDER_NO = DBSql.getString("SELECT GROUP_CONCAT(PURCHASE_ORDER_NO) FROM " + IVTConstant.BO_EU_DNIVT_ORDER + " WHERE CLOSED=0 AND ID IN (SELECT ORDER_ID FROM BO_EU_DNIVT_ORDER_PRODUCT WHERE CONTRACT_COST_ID=?) ", new Object[]{bo.getString("CONTRACT_COST_ID")});
+                        contractProductBo.set("PURCHASE_ORDER_NO", PURCHASE_ORDER_NO);
                         SDK.getBOAPI().update(IVTConstant.BO_EU_DNCTT_CONTRACT_COST, contractProductBo);
                     }
                     //更新合同产品上面的合同产品状态

+ 5 - 0
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/event/ivtOrderProcessAfterComplete.java

@@ -7,6 +7,7 @@ import com.actionsoft.bpms.bpmn.engine.model.run.delegate.ProcessInstance;
 import com.actionsoft.bpms.server.UserContext;
 import com.actionsoft.bpms.util.DBSql;
 import com.actionsoft.sdk.local.SDK;
+import com.awspaas.user.apps.donenow_ivt.constant.IVTConstant;
 import org.apache.commons.lang3.StringUtils;
 
 import java.util.List;
@@ -77,6 +78,10 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
                     SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_COST", cost);
                 }
 
+                //更新采购订单号
+                String PURCHASE_ORDER_NO = DBSql.getString("SELECT GROUP_CONCAT(PURCHASE_ORDER_NO) FROM " + IVTConstant.BO_EU_DNIVT_ORDER + " WHERE CLOSED=0 AND ID IN (SELECT ORDER_ID FROM BO_EU_DNIVT_ORDER_PRODUCT WHERE CONTRACT_COST_ID=?) ", new Object[]{cost.getString("ID")});
+                DBSql.update("UPDATE BO_EU_DNCTT_CONTRACT_COST SET PURCHASE_ORDER_NO=? WHERE ID=?", new Object[]{PURCHASE_ORDER_NO, cost.getString("ID")});
+
             }
 
         }

+ 9 - 1
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/event/reserveFormBeforeSave.java

@@ -38,9 +38,17 @@ public class reserveFormBeforeSave extends InterruptListener {
             List<BO> list = SDK.getBOAPI().query(IVTConstant.BO_EU_DNIVT_RECEIVE_SUB).bindId(bindId).list();
             //序列号不能重复
             for (BO bo : list) {
-
                 String BEN_RECEIVE = BigDecimalUtil.isNull(bo.getString("BEN_RECEIVE"));
                 int intBenReceive = Integer.valueOf(BEN_RECEIVE).intValue();
+
+                //只能整体接收
+                if (bo.getString("WHOLE").equals("1")) {
+                    String QUANTITY_BACKORDERED = BigDecimalUtil.isNull(bo.getString("QUANTITY_BACKORDERED"));
+                    int backorderedQty = Integer.valueOf(QUANTITY_BACKORDERED).intValue();
+                    if (intBenReceive != backorderedQty && (0 - intBenReceive) != backorderedQty) {
+                        throw new BPMNError("receiveErrorCode6", bo.getString("PRODUCT_NAME") + "只能整体接收,接收数量为" + backorderedQty + "!");
+                    }
+                }
                 String sns = bo.getString("SN");
                 if (intBenReceive == 0) {
                     if (StringUtils.isNotBlank(sns))