瀏覽代碼

采购订单接收和取消接收 更新库存批次

zhangyao 4 月之前
父節點
當前提交
c0fb1c78c2

文件差異過大導致無法顯示
+ 857 - 127
aws7信息流修改/form-custom-extend.umd.js


二進制
com.awspaas.user.apps.donenow_ctt/lib/com.awspaas.user.apps.donenow_ctt.jar


+ 4 - 0
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/controller/contractCostController.java

@@ -213,6 +213,10 @@ public class contractCostController {
                     if (isPicked)
                         break;
                 }
+
+                //还要排除取消接收的sn
+
+
                 if (!isPicked) {
                     lotsns.add(SN);
                 }

二進制
com.awspaas.user.apps.donenow_ivt/lib/com.awspaas.user.apps.donenow_ivt.jar


+ 5 - 1
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/constant/IVTConstant.java

@@ -102,7 +102,11 @@ public class IVTConstant {
 	 */
 	
 	public static String obj_795cb3601f3a4b919b5896cf5b076a3a="obj_795cb3601f3a4b919b5896cf5b076a3a";
-	
+
+	/**
+	 * 库存批次表
+	 */
+	public static String BO_EU_DNIVT_WAREHOUSE_PRODUCT_LOT="BO_EU_DNIVT_WAREHOUSE_PRODUCT_LOT";
 	
 	/**
 	 * 采购订单全部接收

+ 335 - 338
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/controller/IVTController.java

@@ -1,10 +1,5 @@
 package com.awspaas.user.apps.donenow_ivt.controller;
 
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
 import com.actionsoft.bpms.bo.engine.BO;
 import com.actionsoft.bpms.bpmn.engine.model.run.delegate.ProcessInstance;
 import com.actionsoft.bpms.bpmn.engine.model.run.delegate.TaskInstance;
@@ -18,342 +13,344 @@ import com.actionsoft.sdk.local.SDK;
 import com.alibaba.fastjson.JSONObject;
 import com.awspaas.user.apps.donenow_ivt.constant.IVTConstant;
 import com.awspaas.user.apps.donenow_ivt.utils.BigDecimalUtil;
-
 import me.chanjar.weixin.common.util.StringUtils;
 
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
 @Controller
 public class IVTController extends BaseController {
 
-	 @Mapping("com.awspaas.user.apps.donenow_ivt.queryprice")
-	    public String queryprice(String ids,UserContext uc,String unitcost) {
-		 System.out.println("unitcost:"+unitcost);
-		 if(StringUtils.isBlank(ids)){
-			 return "";
-		 }
-		 if(StringUtils.isBlank(unitcost)){
-			 unitcost= "0";
-		 }
-		String[] arr= ids.split(",");
-		List<BO> list=SDK.getBOAPI().query(IVTConstant.BO_EU_DNIVT_SERVICE) .addQuery("ID IN ('"+org.apache.commons.lang3.StringUtils.join(arr, "','")+"')", null).list();
-		String unitPriceTotal="0";
-		String unitCostTotal="0";
-
-		for (BO bo : list) {
-			unitPriceTotal=BigDecimalUtil.add(unitPriceTotal, bo.getString("UNIT_PRICE"));
-			unitCostTotal=BigDecimalUtil.add(unitCostTotal, bo.getString("UNIT_COST"));
-		}
-		JSONObject json=new JSONObject();
-		//String discount=BigDecimalUtil.sub(totalPrice, unitcost);
-		json.put("unitPriceTotal", unitPriceTotal);
-		json.put("unitCostTotal",unitCostTotal );
-		//json.put("percent",BigDecimalUtil.div(discount, totalPrice));
-		 return success(json);
-	      
-	    }
-	 	
-	 	/**
-	 	 * 
-	 	 * 根据产品ID查找对应的数据
-	 	 */
-	 	@Mapping("com.awspaas.user.apps.donenow_ivt.queryproduct")
-	    public String queryproduct(String id,UserContext uc) {
-		BO detail=SDK.getBOAPI().query(IVTConstant.BO_EU_DNIVT_PRODUCT).detailById(id);
-		if(null==detail) {
-			return fail("未找到对应的产品");
-		}
-		 return success(detail.asMap());
-	    }
-	 	
-	 	/**
-	 	 * 
-	 	 * 变更原因保存
-	 	 * 类型:手工修改库存1485
-	 	 */
-	 	@Mapping("com.awspaas.user.apps.donenow_ivt.updatereason")
-	    public String updatereason(String commitmsg,UserContext uc,String productBindId) {
-	    //仓库产品
-	    System.out.println("updatereason bindId:"+productBindId);
-	    System.out.println("commitmsg:"+commitmsg);
-	    System.out.println("UserContext:"+uc.getUID());
-
-		BO detail = SDK.getBOAPI().query(IVTConstant.BO_EU_DNIVT_WAREHOUSE_PRODUCT).bindId(productBindId).detail();
-		
-		ProcessInstance createBOProcessInstance = SDK.getProcessAPI().createBOProcessInstance(IVTConstant.obj_e15a8fedeaeb43dc85aa258a7e1cffcf, uc.getUID(), "");
-
-	 	//BO productDetail=SDK.getBOAPI().query(IVTConstant.BO_EU_DNIVT_PRODUCT).detailById(productId);
-	 	//产品移库1485
-	 	BO bo=new BO();
-	 	bo.set("PRODUCT_ID",detail.getString("PRODUCT_ID") );
-	 	bo.set("NOTES",commitmsg );
-	 	bo.set("QUANTITY",detail.getString("QUANTITY") );
-	 	bo.set("TYPE_ID",1485 );
-	 	bo.setBindId(createBOProcessInstance.getId());
-	 	SDK.getBOAPI().create(IVTConstant.BO_EU_DNIVT_TRANSFER, bo, createBOProcessInstance, uc);
-	 	
-		 return success("");
-	    }
-	 	
-	 	/**
-	 	 * 
-	 	 * 产品复制并新增
-	 	 */
-	 	@Mapping("com.awspaas.user.apps.donenow_ivt.productcopy")
-	    public String productcopy(String bindId,UserContext uc,String tableName) {
-		BO detail=SDK.getBOAPI().query(tableName).detailByBindId(bindId);
-		if(null==detail) {
-			return fail("未找到对应的数据");
-		}
-		String processDefId=DBSql.getString("select processdefid from wfc_process where id=?",new Object[] {bindId});
-		ProcessInstance createBOProcessInstance = SDK.getProcessAPI().createBOProcessInstance(processDefId, uc.getUID(), "");
-		 BO bo=new BO();
-		 bo.setAll(detail.asMap());
-		 bo.setId(UUIDGener.getUUID());
-		 bo.setBindId(createBOProcessInstance.getId());
-		 SDK.getBOAPI().create(tableName, bo, createBOProcessInstance, uc);
-		 //TaskInstance taskInst = SDK.getProcessAPI().start(createBOProcessInstance).fetchActiveTasks().get(0);
-		 String url = SDK.getFormAPI().getFormURL("", uc.getSessionId(), createBOProcessInstance.getId(), "", 1, "", "", "");
-		 url=SDK.getPortalAPI().getPortalUrl()+"/r"+url.substring(1);
-		 return url;
-	    }
-	 	
-	 	/**
-	 	 * 
-	 	 * 采购审批通过
-	 	 */
-	 	@Mapping("com.awspaas.user.apps.donenow_ivt.productcostapproval")
-	    public String productcostapproval(String ids,UserContext uc,String type) {
-		if(StringUtils.isEmpty(ids)) {
-			return fail("数据id不允许为空");
-			
-		}
-		ids="'"+ids.substring(0, ids.length()-1).replace(",", "','")+"'";
-		List<BO> list=SDK.getBOAPI().query(IVTConstant.BO_EU_DNCTT_CONTRACT_COST).addQuery(" ID IN ("+ids+")", null).list();
-		System.out.println("ids:"+ids);
-		System.out.println("list.size:"+list.size());
-
-		for(BO bo:list) {
-			
-			bo.set("STATUS_ID", type);
-			SDK.getBOAPI().update(IVTConstant.BO_EU_DNCTT_CONTRACT_COST, bo);
-		}
-		return success("");
-	    }
-	 	
-	 	
-		/**
-	 	 * 
-	 	 * 采购接收打开选择数据的临时表单
-	 	 */
-	 	@Mapping("com.awspaas.user.apps.donenow_ivt.receiveorder")
-	    public String receiveorder(String ids,UserContext uc,String type) {
-		if(StringUtils.isEmpty(ids)) {
-			return fail("数据id不允许为空");
-			
-		}
-		ids="'"+ids.substring(0, ids.length()-1).replace(",", "','")+"'";
-		List<BO> list=SDK.getBOAPI().query(IVTConstant.BO_EU_DNCTT_CONTRACT_COST).addQuery(" ID IN ("+ids+")", null).list();
-		System.out.println("ids:"+ids);
-		System.out.println("list.size:"+list.size());
-
-		for(BO bo:list) {
-			
-			bo.set("STATUS_ID", type);
-			SDK.getBOAPI().update(IVTConstant.BO_EU_DNCTT_CONTRACT_COST, bo);
-		}
-		return success("");
-	    }
-	 	
-	 	
-	 	/**
-	 	 * 
-	 	 *采购项接收
-	 	 */
-	 	@Mapping("com.awspaas.user.apps.donenow_ivt.purchasereceive")
-	    public String purchasereceive(String ids,UserContext uc,String bindId) {
- 		    System.out.print("idsids:"+ids);
- 		    System.out.print("bindId:"+bindId);
- 		    
-	 		if(StringUtils.isNotBlank(ids)) {
-	 			
-	 			ids=ids.substring(0, ids.length()-1);
-	 			
-	 			}else if(StringUtils.isNotBlank(bindId)) {
-	 				ids=DBSql.getString("SELECT GROUP_CONCAT(ID) from bo_eu_dnivt_order_product WHERE BINDID=?",new Object[] {bindId});	
-	 			}else {
-	 				return fail("采购订单ID不能为空");
-	 			}
-	 			ids="'"+ids.replace(",", "','")+"'";
-	 		    System.out.print("idsids:"+ids);
-	 		    
-	 		    //采购接收查询SQL
-	    String sql="  select op.CONTRACT_COST_ID,a.IS_SERIALIZED,o.CREATEDATE,o.FREIGHT_COST,op.WAREHOUSE_ID,op.product_id,op.id,c.id as contract_id,p.id as project_id,t.id as task_id,op.product_id," +
-	    		"   ifnull(c.account_id,ifnull(p.account_id,t.account_id))as account_id,b.opportunity_id," +
-	    		 "  o.vendor_account_id,if(c.name is not null,'contract',if(p.name is not null,'project'," + 
-	    		"  'ticket'))parent_type,op.name as product_name,(select name from bo_eu_dncrm_account where " + 
-	    		"  id=ifnull(c.account_id,ifnull(p.account_id,t.account_id))) account_name," + 
-	    		"  (select name from bo_eu_dncrm_opportunity where id=b.opportunity_id)oppo_name," + 
-	    		"  ifnull(c.name,ifnull(p.name,t.no))contrac_project_task_name,op.quantity,op.unit_cost*op.quantity as " + 
-	    		"  total_cost,ifnull((select sum(ifnull(quantity,0)) from bo_eu_dnivt_warehouse_product where " + 
-	    		"  product_id=op.product_Id ),0)as on_hand,ifnull((select sum(x.quantity) from bo_eu_dnivt_reserve x," + 
-	    		"  bo_eu_dncrm_quote_item y where   x.quote_item_id=y.id and y.object_id=op.product_id ),0)+" + 
-	    		"  ifnull((select sum(x.quantity) from bo_eu_dnctt_contract_cost_product x,bo_eu_dnctt_contract_cost y " + 
-	    		"  where   x.status_id=2157 and x.contract_cost_id=y.id and y.product_id=op.product_id),0) as reserve_pick_num," + 
-	    		"  ifnull((select sum(ifnull(quantity,0)) from bo_eu_dnivt_warehouse_product where product_id=op.product_Id  ),0) " + 
-	    		"  -ifnull((select sum(x.quantity) from bo_eu_dnivt_reserve x,bo_eu_dncrm_quote_item y where  x.quote_item_id=y.id and y.object_id=op.product_id ),0)" + 
-	    		"  -ifnull((select sum(x.quantity) from bo_eu_dnctt_contract_cost_product x,bo_eu_dnctt_contract_cost y " + 
-	    		"  where   x.status_id=2157 and x.contract_cost_id=y.id and y.product_id=op.product_id),0)  as aviable_num," + 
-	    		"  (select y.name from bo_eu_dncrm_account y where y.id=o.vendor_account_id)vendor, " + 
-	    		"  a.manu_product_no as manu_product_no,a.sku,location_id as ship_to, op.estimated_arrival_date," + 
-	    		"  o.purchase_order_no" + 
-	    		" from  bo_eu_dnivt_order_product op " + 
-	    		" left  join  bo_eu_dnivt_order o on op.order_id=o.id" + 
-	    		" left  join  bo_eu_dnivt_product a on op.product_id=a.id" + 
-	    		" left  join bo_eu_dnctt_contract_cost b on op.contract_cost_id=b.id " + 
-	    		" LEFT  join bo_eu_dnctt_contract c on c.id=b.contract_id  " + 
-	    		" LEFT  join bo_eu_dnpro_project p on p.id=b.project_id " + 
-	    		" LEFT  join bo_eu_dnsdk_task t on t.id=b.task_id " + 
-	    		" left  join bo_eu_dncrm_sales_order so on b.opportunity_id=so.opportunity_id " + 
-	    		" where   1=1 AND op.id IN ("+ids+")";
-	     System.out.print("SSSSQL:"+sql);
-	     List<RowMap> maps = DBSql.getMaps(sql, new Object[] {});
-	     if(maps.size()==0) {
-	    	 return fail("未找到对应数据");
-	     }
-	     ProcessInstance createBOProcessInstance = SDK.getProcessAPI().createBOProcessInstance(IVTConstant.obj_3121af9039dc454aa776f9bdadf6b239, uc.getUID(), "");
-	 	//校验是否是同一个采购订单
-	     Set<String> set=new HashSet<String>();
-	     List<BO> list=new ArrayList<BO>();
-	     for(RowMap map:maps){
-	    	 if(StringUtils.isNotBlank(map.getString("purchase_order_no"))&&StringUtils.isNotBlank(map.getString("purchase_order_no").trim())) {
-	    		 set.add(map.getString("purchase_order_no")); 
-	    	 }
-	    	 
-	     }
-	     if(set.size()>1) {
-	 		    System.out.println("setsetset:"+set);
-
-	    	 return fail("一次只能接收同一个采购订单的采购项"); 
-	     }
-	     for(RowMap map:maps){
-	    	 String unBack="0";
-	    	 BO subBo=new BO();
-	    	 set.add(map.getString("purchase_order_no"));
-		     RowMap rowMap = DBSql.getMap("select ORDER_PRODUCT_ID,sum(QUANTITY_RECEIVED) QUANTITY_RECEIVED from BO_EU_DNIVT_RECEIVE WHERE  ORDER_PRODUCT_ID=? group by ORDER_PRODUCT_ID", new Object[] {map.getString("id")});
-		    if(null!=rowMap) {
-		    	 unBack = getUnBack(map.getString("quantity"),rowMap.getString("QUANTITY_RECEIVED"));
-			     if(Integer.valueOf(unBack)<=0) {
-				     System.out.println("采购数量小于已接收数量:"+map.getString("quantity")+"-----"+rowMap.getString("QUANTITY_RECEIVED"));
-			    	 continue;
-			     }
-			     subBo.set("QUANTITY_RECEIVED", rowMap.get("QUANTITY_RECEIVED")); 
-	    		 subBo.set("QUANTITY_BACKORDERED",unBack); 
-		    }else {
-		    	 subBo.set("QUANTITY_RECEIVED", 0); 
-	    		 subBo.set("QUANTITY_BACKORDERED",map.get("quantity")); 
-		    }
-	    	 subBo.set("PRODUCT_NAME", map.get("product_name"));
-	    	 subBo.set("IS_SERIALIZED", map.get("IS_SERIALIZED"));
-	    	 subBo.set("WAREHOUSE_ID", map.get("WAREHOUSE_ID")); 
-	    	 subBo.set("ACCOUNT_NAME", map.get("account_name")); 
-	    	 subBo.set("CONTRAC_PROJECT_TASK_NAME", map.get("contrac_project_task_name")); 
-	    	 subBo.set("QUANTITY", map.get("quantity")); 
-	    	 subBo.set("ON_HAND", map.get("on_hand")); 
-	    	 subBo.set("PRODUCT_ID", map.get("product_id"));
-	    	 subBo.set("ORDER_PRODUCT_ID", map.get("id")); 
-	    	 subBo.set("NOW_COUNT", 0); 
-	    	 subBo.set("CONTRACT_COST_ID", map.get("CONTRACT_COST_ID"));
-	    	 subBo.setBindId(createBOProcessInstance.getId());
-	    	 list.add(subBo);
-	     }
-	     if(list.size()==0) {
-	    	 return fail("采购订单项都已经接收完毕");
-	     }
-		//采购接收主表添加数据
-		 RowMap rowMap = maps.get(0);
-		 BO detail = SDK.getBOAPI().query(IVTConstant.BO_EU_DNIVT_ORDER).addQuery("PURCHASE_ORDER_NO=", rowMap.getString("purchase_order_no")).detail();
-		 if(null==detail) {
-			 return fail("未找到对应的订单");  
-		 }
-		 //主表数据
-		 BO bo=new BO();
-		 bo.setBindId(createBOProcessInstance.getId());
-		 bo.setId(UUIDGener.getUUID());
-		 bo.set("COMPANY", rowMap.getString("vendor"));
-		 bo.set("PURCHASE_ORDER_NO", rowMap.getString("purchase_order_no"));
-		 bo.set("SUBMIT_TIME", rowMap.get("CREATEDATE"));
-		 bo.set("VENDOR_INVOICE_NO", rowMap.get("VENDOR_INVOICE_NO"));
-		 bo.set("FREIGHT_COST", rowMap.get("FREIGHT_COST"));
-		 SDK.getBOAPI().create(IVTConstant.BO_EU_DNIVT_RECEIVE_MAIN, bo, createBOProcessInstance, uc);
-		 
-		 //子表数据
-		 SDK.getBOAPI().create(IVTConstant.BO_EU_DNIVT_RECEIVE_SUB, list, createBOProcessInstance, uc);
-		 
-		 String url = SDK.getFormAPI().getFormURL("", uc.getSessionId(), createBOProcessInstance.getId(), "", 1, "", "", "");
-		 url=SDK.getPortalAPI().getPortalUrl()+"/r"+url.substring(1);
-		 return success(url);
-	    }
-	 	
-	 	
-	 	public String getUnBack(String param1, String param2) {
-			// TODO Auto-generated method stub
-			if(StringUtils.isBlank(param1)) {
-				return "0";
-			}
-			if(StringUtils.isBlank(param2)) {
-				param2="0";
-			}
-			return BigDecimalUtil.sub(param1, param2);
-		}
-
-		/**
-	 	 * 
-	 	 *   未接收数量复制给本次接收数量
-	 	 */
-	 	@Mapping("com.awspaas.user.apps.donenow_ivt.copydata")
-	    public String receiveorder(String bindId,UserContext uc) {
-		
-	 	List<BO> list = SDK.getBOAPI().query(IVTConstant.BO_EU_DNIVT_RECEIVE_SUB).bindId(bindId).list();
-	 	for(BO bo:list) {
-	 		bo.set("BEN_RECEIVE", bo.get("QUANTITY_BACKORDERED"));
-	 		SDK.getBOAPI().update(IVTConstant.BO_EU_DNIVT_RECEIVE_SUB, bo);
-	 	}
-	 		
-		return success("");
-	    }
-	 	
-	 	
-	 	/**
-	 	 * 
-	 	 * 采购订单发起流程
-	 	 */
-	 	@Mapping("com.awspaas.user.apps.donenow_ivt.purchaseorder")
-	    public String purchaseorder(String bindId,UserContext uc,String ids) {
-	 		
-			ids="'"+ids.substring(0, ids.length()-1).replace(",", "','")+"'";
-			List<BO> list=SDK.getBOAPI().query(IVTConstant.BO_EU_DNIVT_WAREHOUSE_PRODUCT).addQuery(" BINDID IN ("+ids+")", null).list();
-			
-			ProcessInstance createBOProcessInstance = SDK.getProcessAPI().createBOProcessInstance(IVTConstant.obj_795cb3601f3a4b919b5896cf5b076a3a, uc.getUID(), "");
-			//插入主表数据
-			BO bo=new BO();
-			bo.setId(UUIDGener.getUUID());
-			bo.setBindId(createBOProcessInstance.getId());
-			SDK.getBOAPI().create(IVTConstant.BO_EU_DNIVT_ORDER, bo, createBOProcessInstance, uc);
-			//开始插入子表数据
-			for(BO productBo:list){
-				BO subBo=new BO();
-				subBo.set("WAREHOUSE_ID", productBo.get("WAREHOUSE_ID"));
-				subBo.set("PRODUCT_ID", productBo.get("PRODUCT_ID"));
-				
-				//用最大库存数减去库存数
-				double sub = BigDecimalUtil.sub(BigDecimalUtil.getDouble(productBo.getString("QUANTITY_MAXIMUM")), BigDecimalUtil.getDouble(productBo.getString("QUANTITY")));
-				subBo.set("QUANTITY", sub>0?sub:0);
-				subBo.setBindId(createBOProcessInstance.getId());
-				SDK.getBOAPI().create(IVTConstant.BO_EU_DNIVT_ORDER_PRODUCT, subBo, createBOProcessInstance, uc);
-				
-			}
-			TaskInstance taskInst = SDK.getProcessAPI().start(createBOProcessInstance).fetchActiveTasks().get(0);
-			String url = SDK.getFormAPI().getFormURL("", uc.getSessionId(), createBOProcessInstance.getId(), "", 1, "", "", "");
-			url=SDK.getPortalAPI().getPortalUrl()+"/r"+url.substring(1);
-			return url;
-	    }
+    @Mapping("com.awspaas.user.apps.donenow_ivt.queryprice")
+    public String queryprice(String ids, UserContext uc, String unitcost) {
+        System.out.println("unitcost:" + unitcost);
+        if (StringUtils.isBlank(ids)) {
+            return "";
+        }
+        if (StringUtils.isBlank(unitcost)) {
+            unitcost = "0";
+        }
+        String[] arr = ids.split(",");
+        List<BO> list = SDK.getBOAPI().query(IVTConstant.BO_EU_DNIVT_SERVICE).addQuery("ID IN ('" + org.apache.commons.lang3.StringUtils.join(arr, "','") + "')", null).list();
+        String unitPriceTotal = "0";
+        String unitCostTotal = "0";
+
+        for (BO bo : list) {
+            unitPriceTotal = BigDecimalUtil.add(unitPriceTotal, bo.getString("UNIT_PRICE"));
+            unitCostTotal = BigDecimalUtil.add(unitCostTotal, bo.getString("UNIT_COST"));
+        }
+        JSONObject json = new JSONObject();
+        //String discount=BigDecimalUtil.sub(totalPrice, unitcost);
+        json.put("unitPriceTotal", unitPriceTotal);
+        json.put("unitCostTotal", unitCostTotal);
+        //json.put("percent",BigDecimalUtil.div(discount, totalPrice));
+        return success(json);
+
+    }
+
+    /**
+     *
+     * 根据产品ID查找对应的数据
+     */
+    @Mapping("com.awspaas.user.apps.donenow_ivt.queryproduct")
+    public String queryproduct(String id, UserContext uc) {
+        BO detail = SDK.getBOAPI().query(IVTConstant.BO_EU_DNIVT_PRODUCT).detailById(id);
+        if (null == detail) {
+            return fail("未找到对应的产品");
+        }
+        return success(detail.asMap());
+    }
+
+    /**
+     *
+     * 变更原因保存
+     * 类型:手工修改库存1485
+     */
+    @Mapping("com.awspaas.user.apps.donenow_ivt.updatereason")
+    public String updatereason(String commitmsg, UserContext uc, String productBindId) {
+        //仓库产品
+        System.out.println("updatereason bindId:" + productBindId);
+        System.out.println("commitmsg:" + commitmsg);
+        System.out.println("UserContext:" + uc.getUID());
+
+        BO detail = SDK.getBOAPI().query(IVTConstant.BO_EU_DNIVT_WAREHOUSE_PRODUCT).bindId(productBindId).detail();
+
+        ProcessInstance createBOProcessInstance = SDK.getProcessAPI().createBOProcessInstance(IVTConstant.obj_e15a8fedeaeb43dc85aa258a7e1cffcf, uc.getUID(), "");
+
+        //BO productDetail=SDK.getBOAPI().query(IVTConstant.BO_EU_DNIVT_PRODUCT).detailById(productId);
+        //产品移库1485
+        BO bo = new BO();
+        bo.set("PRODUCT_ID", detail.getString("PRODUCT_ID"));
+        bo.set("NOTES", commitmsg);
+        bo.set("QUANTITY", detail.getString("QUANTITY"));
+        bo.set("TYPE_ID", 1485);
+        bo.setBindId(createBOProcessInstance.getId());
+        SDK.getBOAPI().create(IVTConstant.BO_EU_DNIVT_TRANSFER, bo, createBOProcessInstance, uc);
+
+        return success("");
+    }
+
+    /**
+     *
+     * 产品复制并新增
+     */
+    @Mapping("com.awspaas.user.apps.donenow_ivt.productcopy")
+    public String productcopy(String bindId, UserContext uc, String tableName) {
+        BO detail = SDK.getBOAPI().query(tableName).detailByBindId(bindId);
+        if (null == detail) {
+            return fail("未找到对应的数据");
+        }
+        String processDefId = DBSql.getString("select processdefid from wfc_process where id=?", new Object[]{bindId});
+        ProcessInstance createBOProcessInstance = SDK.getProcessAPI().createBOProcessInstance(processDefId, uc.getUID(), "");
+        BO bo = new BO();
+        bo.setAll(detail.asMap());
+        bo.setId(UUIDGener.getUUID());
+        bo.setBindId(createBOProcessInstance.getId());
+        SDK.getBOAPI().create(tableName, bo, createBOProcessInstance, uc);
+        //TaskInstance taskInst = SDK.getProcessAPI().start(createBOProcessInstance).fetchActiveTasks().get(0);
+        String url = SDK.getFormAPI().getFormURL("", uc.getSessionId(), createBOProcessInstance.getId(), "", 1, "", "", "");
+        url = SDK.getPortalAPI().getPortalUrl() + "/r" + url.substring(1);
+        return url;
+    }
+
+    /**
+     *
+     * 采购审批通过
+     */
+    @Mapping("com.awspaas.user.apps.donenow_ivt.productcostapproval")
+    public String productcostapproval(String ids, UserContext uc, String type) {
+        if (StringUtils.isEmpty(ids)) {
+            return fail("数据id不允许为空");
+
+        }
+        ids = "'" + ids.substring(0, ids.length() - 1).replace(",", "','") + "'";
+        List<BO> list = SDK.getBOAPI().query(IVTConstant.BO_EU_DNCTT_CONTRACT_COST).addQuery(" ID IN (" + ids + ")", null).list();
+        System.out.println("ids:" + ids);
+        System.out.println("list.size:" + list.size());
+
+        for (BO bo : list) {
+
+            bo.set("STATUS_ID", type);
+            SDK.getBOAPI().update(IVTConstant.BO_EU_DNCTT_CONTRACT_COST, bo);
+        }
+        return success("");
+    }
+
+
+    /**
+     *
+     * 采购接收打开选择数据的临时表单
+     */
+    @Mapping("com.awspaas.user.apps.donenow_ivt.receiveorder")
+    public String receiveorder(String ids, UserContext uc, String type) {
+        if (StringUtils.isEmpty(ids)) {
+            return fail("数据id不允许为空");
+
+        }
+        ids = "'" + ids.substring(0, ids.length() - 1).replace(",", "','") + "'";
+        List<BO> list = SDK.getBOAPI().query(IVTConstant.BO_EU_DNCTT_CONTRACT_COST).addQuery(" ID IN (" + ids + ")", null).list();
+        System.out.println("ids:" + ids);
+        System.out.println("list.size:" + list.size());
+
+        for (BO bo : list) {
+
+            bo.set("STATUS_ID", type);
+            SDK.getBOAPI().update(IVTConstant.BO_EU_DNCTT_CONTRACT_COST, bo);
+        }
+        return success("");
+    }
+
+
+    /**
+     *
+     *采购项接收
+     */
+    @Mapping("com.awspaas.user.apps.donenow_ivt.purchasereceive")
+    public String purchasereceive(String ids, UserContext uc, String bindId) {
+        System.out.print("idsids:" + ids);
+        System.out.print("bindId:" + bindId);
+
+        if (StringUtils.isNotBlank(ids)) {
+            ids = ids.substring(0, ids.length() - 1);
+        } else if (StringUtils.isNotBlank(bindId)) {
+            ids = DBSql.getString("SELECT GROUP_CONCAT(ID) from bo_eu_dnivt_order_product WHERE BINDID=?", new Object[]{bindId});
+        } else {
+            return fail("采购订单ID不能为空");
+        }
+        ids = "'" + ids.replace(",", "','") + "'";
+        System.out.print("idsids:" + ids);
+
+        //采购接收查询SQL
+        String sql = "  select op.CONTRACT_COST_ID,a.IS_SERIALIZED,o.CREATEDATE,o.FREIGHT_COST,op.WAREHOUSE_ID,op.product_id,op.id,c.id as contract_id,p.id as project_id,t.id as task_id,op.product_id," +
+                "   ifnull(c.account_id,ifnull(p.account_id,t.account_id))as account_id,b.opportunity_id," +
+                "  o.vendor_account_id,if(c.name is not null,'contract',if(p.name is not null,'project'," +
+                "  'ticket'))parent_type,op.name as product_name,(select name from bo_eu_dncrm_account where " +
+                "  id=ifnull(c.account_id,ifnull(p.account_id,t.account_id))) account_name," +
+                "  (select name from bo_eu_dncrm_opportunity where id=b.opportunity_id)oppo_name," +
+                "  ifnull(c.name,ifnull(p.name,t.no))contrac_project_task_name,op.quantity,op.unit_cost*op.quantity as " +
+                "  total_cost,ifnull((select sum(ifnull(quantity,0)) from bo_eu_dnivt_warehouse_product where " +
+                "  product_id=op.product_Id ),0)as on_hand,ifnull((select sum(x.quantity) from bo_eu_dnivt_reserve x," +
+                "  bo_eu_dncrm_quote_item y where   x.quote_item_id=y.id and y.object_id=op.product_id ),0)+" +
+                "  ifnull((select sum(x.quantity) from bo_eu_dnctt_contract_cost_product x,bo_eu_dnctt_contract_cost y " +
+                "  where   x.status_id=2157 and x.contract_cost_id=y.id and y.product_id=op.product_id),0) as reserve_pick_num," +
+                "  ifnull((select sum(ifnull(quantity,0)) from bo_eu_dnivt_warehouse_product where product_id=op.product_Id  ),0) " +
+                "  -ifnull((select sum(x.quantity) from bo_eu_dnivt_reserve x,bo_eu_dncrm_quote_item y where  x.quote_item_id=y.id and y.object_id=op.product_id ),0)" +
+                "  -ifnull((select sum(x.quantity) from bo_eu_dnctt_contract_cost_product x,bo_eu_dnctt_contract_cost y " +
+                "  where   x.status_id=2157 and x.contract_cost_id=y.id and y.product_id=op.product_id),0)  as aviable_num," +
+                "  (select y.name from bo_eu_dncrm_account y where y.id=o.vendor_account_id)vendor, " +
+                "  a.manu_product_no as manu_product_no,a.sku,location_id as ship_to, op.estimated_arrival_date," +
+                "  o.purchase_order_no" +
+                " from  bo_eu_dnivt_order_product op " +
+                " left  join  bo_eu_dnivt_order o on op.order_id=o.id" +
+                " left  join  bo_eu_dnivt_product a on op.product_id=a.id" +
+                " left  join bo_eu_dnctt_contract_cost b on op.contract_cost_id=b.id " +
+                " LEFT  join bo_eu_dnctt_contract c on c.id=b.contract_id  " +
+                " LEFT  join bo_eu_dnpro_project p on p.id=b.project_id " +
+                " LEFT  join bo_eu_dnsdk_task t on t.id=b.task_id " +
+                " left  join bo_eu_dncrm_sales_order so on b.opportunity_id=so.opportunity_id " +
+                " where   op.isend=1 and o.isend=1 AND op.id IN (" + ids + ")";
+        System.out.print("SSSSQL:" + sql);
+        List<RowMap> maps = DBSql.getMaps(sql, new Object[]{});
+        if (maps.size() == 0) {
+            return fail("请检查采购订单是否未审批!");
+        }
+        ProcessInstance createBOProcessInstance = SDK.getProcessAPI().createBOProcessInstance(IVTConstant.obj_3121af9039dc454aa776f9bdadf6b239, uc.getUID(), "");
+        //校验是否是同一个采购订单
+        Set<String> set = new HashSet<String>();
+        List<BO> list = new ArrayList<BO>();
+        for (RowMap map : maps) {
+            if (StringUtils.isNotBlank(map.getString("purchase_order_no")) && StringUtils.isNotBlank(map.getString("purchase_order_no").trim())) {
+                set.add(map.getString("purchase_order_no"));
+            }
+
+        }
+        if (set.size() > 1) {
+            System.out.println("setsetset:" + set);
+
+            return fail("一次只能接收同一个采购订单的采购项");
+        }
+        for (RowMap map : maps) {
+            String unBack = "0";
+            BO subBo = new BO();
+            set.add(map.getString("purchase_order_no"));
+            RowMap rowMap = DBSql.getMap("select ORDER_PRODUCT_ID,sum(QUANTITY_RECEIVED) QUANTITY_RECEIVED from BO_EU_DNIVT_RECEIVE WHERE  ORDER_PRODUCT_ID=? group by ORDER_PRODUCT_ID", new Object[]{map.getString("id")});
+            if (null != rowMap) {
+                unBack = getUnBack(map.getString("quantity"), rowMap.getString("QUANTITY_RECEIVED"));
+                if (Integer.valueOf(unBack) <= 0) {
+                    System.out.println("采购数量小于已接收数量:" + map.getString("quantity") + "-----" + rowMap.getString("QUANTITY_RECEIVED"));
+                    continue;
+                }
+                subBo.set("QUANTITY_RECEIVED", rowMap.get("QUANTITY_RECEIVED"));
+                subBo.set("QUANTITY_BACKORDERED", unBack);
+            } else {
+                subBo.set("QUANTITY_RECEIVED", 0);
+                subBo.set("QUANTITY_BACKORDERED", map.get("quantity"));
+            }
+            subBo.set("PRODUCT_NAME", map.get("product_name"));
+            subBo.set("IS_SERIALIZED", map.get("IS_SERIALIZED"));
+            subBo.set("WAREHOUSE_ID", map.get("WAREHOUSE_ID"));
+            subBo.set("ACCOUNT_NAME", map.get("account_name"));
+            subBo.set("CONTRAC_PROJECT_TASK_NAME", map.get("contrac_project_task_name"));
+            subBo.set("QUANTITY", map.get("quantity"));
+            subBo.set("ON_HAND", map.get("on_hand"));
+            subBo.set("PRODUCT_ID", map.get("product_id"));
+            subBo.set("ORDER_PRODUCT_ID", map.get("id"));
+            subBo.set("NOW_COUNT", 0);
+            subBo.set("CONTRACT_COST_ID", map.get("CONTRACT_COST_ID"));
+            subBo.setBindId(createBOProcessInstance.getId());
+            list.add(subBo);
+        }
+        if (list.size() == 0) {
+            return fail("采购订单项都已经接收完毕");
+        }
+        //采购接收主表添加数据
+        RowMap rowMap = maps.get(0);
+        BO detail = SDK.getBOAPI().query(IVTConstant.BO_EU_DNIVT_ORDER).addQuery("PURCHASE_ORDER_NO=", rowMap.getString("purchase_order_no")).detail();
+        if (null == detail) {
+            return fail("未找到对应的订单");
+        }
+        //主表数据
+        BO bo = new BO();
+        bo.setBindId(createBOProcessInstance.getId());
+        bo.setId(UUIDGener.getUUID());
+        bo.set("COMPANY", rowMap.getString("vendor"));
+        bo.set("PURCHASE_ORDER_NO", rowMap.getString("purchase_order_no"));
+        bo.set("SUBMIT_TIME", rowMap.get("CREATEDATE"));
+        bo.set("VENDOR_INVOICE_NO", rowMap.get("VENDOR_INVOICE_NO"));
+        bo.set("FREIGHT_COST", rowMap.get("FREIGHT_COST"));
+        SDK.getBOAPI().create(IVTConstant.BO_EU_DNIVT_RECEIVE_MAIN, bo, createBOProcessInstance, uc);
+
+        //子表数据
+        SDK.getBOAPI().create(IVTConstant.BO_EU_DNIVT_RECEIVE_SUB, list, createBOProcessInstance, uc);
+
+        String url = SDK.getFormAPI().getFormURL("", uc.getSessionId(), createBOProcessInstance.getId(), "", 1, "", "", "");
+        url = SDK.getPortalAPI().getPortalUrl() + "/r" + url.substring(1);
+        return success(url);
+    }
+
+
+    public String getUnBack(String param1, String param2) {
+        // TODO Auto-generated method stub
+        if (StringUtils.isBlank(param1)) {
+            return "0";
+        }
+        if (StringUtils.isBlank(param2)) {
+            param2 = "0";
+        }
+        return BigDecimalUtil.sub(param1, param2);
+    }
+
+    /**
+     *
+     *   未接收数量复制给本次接收数量
+     */
+    @Mapping("com.awspaas.user.apps.donenow_ivt.copydata")
+    public String receiveorder(String bindId, UserContext uc) {
+
+        List<BO> list = SDK.getBOAPI().query(IVTConstant.BO_EU_DNIVT_RECEIVE_SUB).bindId(bindId).list();
+        for (BO bo : list) {
+            bo.set("BEN_RECEIVE", bo.get("QUANTITY_BACKORDERED"));
+            SDK.getBOAPI().update(IVTConstant.BO_EU_DNIVT_RECEIVE_SUB, bo);
+        }
+
+        return success("");
+    }
+
+
+    /**
+     *
+     * 采购订单发起流程
+     */
+    @Mapping("com.awspaas.user.apps.donenow_ivt.purchaseorder")
+    public String purchaseorder(String bindId, UserContext uc, String ids) {
+
+        ids = "'" + ids.substring(0, ids.length() - 1).replace(",", "','") + "'";
+        List<BO> list = SDK.getBOAPI().query(IVTConstant.BO_EU_DNIVT_WAREHOUSE_PRODUCT).addQuery(" BINDID IN (" + ids + ")", null).list();
+
+        ProcessInstance createBOProcessInstance = SDK.getProcessAPI().createBOProcessInstance(IVTConstant.obj_795cb3601f3a4b919b5896cf5b076a3a, uc.getUID(), "");
+        //插入主表数据
+        BO bo = new BO();
+        bo.setId(UUIDGener.getUUID());
+        bo.setBindId(createBOProcessInstance.getId());
+        SDK.getBOAPI().create(IVTConstant.BO_EU_DNIVT_ORDER, bo, createBOProcessInstance, uc);
+        //开始插入子表数据
+        for (BO productBo : list) {
+            BO subBo = new BO();
+            subBo.set("WAREHOUSE_ID", productBo.get("WAREHOUSE_ID"));
+            subBo.set("PRODUCT_ID", productBo.get("PRODUCT_ID"));
+
+            //用最大库存数减去库存数
+            double sub = BigDecimalUtil.sub(BigDecimalUtil.getDouble(productBo.getString("QUANTITY_MAXIMUM")), BigDecimalUtil.getDouble(productBo.getString("QUANTITY")));
+            subBo.set("QUANTITY", sub > 0 ? sub : 0);
+            subBo.setBindId(createBOProcessInstance.getId());
+            SDK.getBOAPI().create(IVTConstant.BO_EU_DNIVT_ORDER_PRODUCT, subBo, createBOProcessInstance, uc);
+
+        }
+        TaskInstance taskInst = SDK.getProcessAPI().start(createBOProcessInstance).fetchActiveTasks().get(0);
+        String url = SDK.getFormAPI().getFormURL("", uc.getSessionId(), createBOProcessInstance.getId(), "", 1, "", "", "");
+        url = SDK.getPortalAPI().getPortalUrl() + "/r" + url.substring(1);
+        return url;
+    }
 }

+ 101 - 20
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/event/DoWorkThread.java

@@ -7,6 +7,7 @@ import com.actionsoft.bpms.commons.database.RowMap;
 import com.actionsoft.bpms.server.UserContext;
 import com.actionsoft.bpms.util.DBSql;
 import com.actionsoft.bpms.util.UUIDGener;
+import com.actionsoft.exception.BPMNError;
 import com.actionsoft.sdk.local.SDK;
 import com.awspaas.user.apps.donenow_ivt.constant.IVTConstant;
 import com.awspaas.user.apps.donenow_ivt.utils.BigDecimalUtil;
@@ -29,17 +30,39 @@ public class DoWorkThread extends Thread {
     }
 
     public String doWork(ProcessExecutionContext process) {
-
         UserContext uc = process.getUserContext();
         BO formData = process.getFormData();
         String boName = process.getParameterOfString("$BONAME");
 
-
         //采购接收主表保存
         if (IVTConstant.BO_EU_DNIVT_RECEIVE_MAIN.equals(boName)) {
             String bindId = process.getProcessInstance().getId();
             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();
+                String sns = bo.getString("SN");
+                if (StringUtils.isNotBlank(sns)) {
+                    for (String sn : sns.split(",")) {
+                        List<RowMap> exitsLots = DBSql.getMaps("select * from BO_EU_DNIVT_WAREHOUSE_PRODUCT_LOT WHERE FIND_IN_SET(?,SN)", new Object[]{sn});
+                        if (exitsLots.size() > 0 && intBenReceive > 0) {
+                            //已存在,不能再新增
+                            throw new BPMNError("505", sn + "已存在此序列号,不能再新增!");
+
+                        } else {
+                            if (intBenReceive < 0) {
+                                //不存在,不能取消
+                                throw new BPMNError("505", sn + "不存在此序列号,不能取消接收!");
+                            }
+                        }
+                    }
+                }
+            }
+
+
             //循环开始
             for (BO bo : list) {
                 RowMap rowMap = DBSql.getMap("select ORDER_PRODUCT_ID,sum(QUANTITY_RECEIVED) QUANTITY_RECEIVED from BO_EU_DNIVT_RECEIVE WHERE  ORDER_PRODUCT_ID=? group by ORDER_PRODUCT_ID", new Object[]{bo.getString("ORDER_PRODUCT_ID")});
@@ -51,19 +74,20 @@ public class DoWorkThread extends Thread {
                 receiveBo.set("UNIT_COST", bo.get("UNIT_COST"));
                 receiveBo.set("EXPORTED_TIME", new Date());
                 receiveBo.set("RECEIVE_BY_ID", uc.getUID());
-                ProcessInstance createBOProcessInstance = SDK.getProcessAPI().createBOProcessInstance(IVTConstant.obj_60c43c56593d42108be36f3aa8d3f8a2, uc.getUID(), "");
+                receiveBo.set("SN", bo.get("SN"));//序列号
+                ProcessInstance createBOProcessInstance = SDK.getProcessAPI().createBOProcessInstance(IVTConstant.obj_60c43c56593d42108be36f3aa8d3f8a2, uc.getUID(), "订单接收");
                 receiveBo.setBindId(createBOProcessInstance.getId());
                 SDK.getBOAPI().createDataBO(IVTConstant.BO_EU_DNIVT_RECEIVE, receiveBo, uc);
 
 
                 //更新产品的库存
-                List<BO> wareHouseList = SDK.getBOAPI().query(IVTConstant.BO_EU_DNIVT_WAREHOUSE_PRODUCT).addQuery("WAREHOUSE_ID=", bo.getString("WAREHOUSE_ID")).addQuery("PRODUCT_ID=", bo.getString("PRODUCT_ID")).list();
-                if (wareHouseList.size() > 0) {
-                    for (BO wareHouseBo : wareHouseList) {
-                        String add = BigDecimalUtil.add(wareHouseBo.getString("QUANTITY"), bo.getString("BEN_RECEIVE"));
-                        wareHouseBo.set("QUANTITY", add);
-                        SDK.getBOAPI().update(IVTConstant.BO_EU_DNIVT_WAREHOUSE_PRODUCT, wareHouseBo);
-                    }
+                String wareHouseProductBINDID = null;
+                BO wareHouseProduct = SDK.getBOAPI().query(IVTConstant.BO_EU_DNIVT_WAREHOUSE_PRODUCT).addQuery("WAREHOUSE_ID=", bo.getString("WAREHOUSE_ID")).addQuery("PRODUCT_ID=", bo.getString("PRODUCT_ID")).detail();
+                if (wareHouseProduct != null && wareHouseProduct.isNew() == false) {
+                    String add = BigDecimalUtil.add(wareHouseProduct.getString("QUANTITY"), bo.getString("BEN_RECEIVE"));
+                    wareHouseProduct.set("QUANTITY", add);
+                    SDK.getBOAPI().update(IVTConstant.BO_EU_DNIVT_WAREHOUSE_PRODUCT, wareHouseProduct);
+                    wareHouseProductBINDID = wareHouseProduct.getBindId();
                 } else {
                     ProcessInstance wareBOProcessInstance = SDK.getProcessAPI().createBOProcessInstance(IVTConstant.obj_41f06b1e807647db8a69dd10d4be5764, uc.getUID(), "");
                     BO wareHouseBo = new BO();
@@ -74,8 +98,39 @@ public class DoWorkThread extends Thread {
                     wareHouseBo.set("QUANTITY_MINIMUM", 0);
                     wareHouseBo.set("QUANTITY_MAXIMUM", 0);
                     SDK.getBOAPI().create(IVTConstant.BO_EU_DNIVT_WAREHOUSE_PRODUCT, wareHouseBo, wareBOProcessInstance, uc);
+                    wareHouseProductBINDID = wareHouseBo.getBindId();
                 }
 
+                //1、库存批次  BO_EU_DNIVT_WAREHOUSE_PRODUCT_LOT
+                //多次接收是更新操作
+                BO warehouseProductLotBo = SDK.getBOAPI().query(IVTConstant.BO_EU_DNIVT_WAREHOUSE_PRODUCT_LOT).addQuery("ORDER_PRODUCT_ID=", bo.getString("ORDER_PRODUCT_ID")).detail();
+                if (warehouseProductLotBo == null || warehouseProductLotBo.isNew()) {
+                    warehouseProductLotBo.setBindId(wareHouseProductBINDID);
+                    warehouseProductLotBo.set("PRODUCT_ID", bo.getString("PRODUCT_ID"));
+                    warehouseProductLotBo.set("WAREHOUSE_ID", bo.getString("WAREHOUSE_ID"));
+                    warehouseProductLotBo.set("QUANTITY", bo.getString("BEN_RECEIVE"));
+                    warehouseProductLotBo.set("UNIT_COST", bo.getString("UNIT_COST"));
+                    warehouseProductLotBo.set("SN", bo.getString("SN"));
+                    warehouseProductLotBo.set("ORDER_PRODUCT_ID", bo.getString("ORDER_PRODUCT_ID"));
+                    SDK.getBOAPI().createDataBO(IVTConstant.BO_EU_DNIVT_WAREHOUSE_PRODUCT_LOT, warehouseProductLotBo, uc);
+                } else {
+                    warehouseProductLotBo.set("SN", warehouseProductLotBo.getString("SN") + "," + bo.getString("SN"));
+                    warehouseProductLotBo.set("QUANTITY", BigDecimalUtil.add(warehouseProductLotBo.getString("QUANTITY"), bo.getString("BEN_RECEIVE")));
+                    SDK.getBOAPI().update(IVTConstant.BO_EU_DNIVT_WAREHOUSE_PRODUCT_LOT, warehouseProductLotBo);
+                }
+
+                //2、库存转移记录 BO_EU_DNIVT_TRANSFER
+                ProcessInstance warehouseTransferInstance = SDK.getProcessAPI().createBOProcessInstance("obj_e15a8fedeaeb43dc85aa258a7e1cffcf", uc.getUID(), "采购接收-" + warehouseProductLotBo.get("LOT"));
+                BO warehouseTransferBo = new BO();
+                warehouseTransferBo.setBindId(warehouseTransferInstance.getId());
+                warehouseTransferBo.set("PRODUCT_ID", bo.getString("PRODUCT_ID"));
+                warehouseTransferBo.set("TO_WAREHOUSE_ID", bo.getString("WAREHOUSE_ID"));
+                warehouseTransferBo.set("QUANTITY", bo.getString("BEN_RECEIVE"));
+                warehouseTransferBo.set("NOTES", "采购接收");
+                warehouseTransferBo.set("TYPE_ID", "1484");//接收/取消接收
+                warehouseTransferBo.set("LOT", warehouseProductLotBo.get("LOT"));
+                warehouseTransferBo.set("SN", bo.get("SN"));
+                SDK.getBOAPI().createDataBO(IVTConstant.BO_EU_DNIVT_TRANSFER, warehouseTransferBo, uc);
 
                 //更新成本信息
                 if (StringUtils.isNotBlank(bo.getString("CONTRACT_COST_ID"))) {
@@ -89,18 +144,18 @@ public class DoWorkThread extends Thread {
                         //判断成本是否是采购中状态
                         String BEN_RECEIVE = BigDecimalUtil.isNull(bo.getString("BEN_RECEIVE"));
                         int intBenReceive = Integer.valueOf(BEN_RECEIVE).intValue();
-
                         //采购接收
                         if (intBenReceive > 0) {
                             for (BO costProductBo : costProductList) {
                                 //采购中
                                 if (IVTConstant.STATUS_1235.equals(costProductBo.getString("STATUS_ID"))) {
                                     String QUANTITY = BigDecimalUtil.isNull(costProductBo.getString("QUANTITY"));
-
+                                    //采购数量
                                     int intQuantity = Integer.valueOf(QUANTITY).intValue();
 
                                     //待配送
-                                    if (intQuantity == intBenReceive) {
+                                    if (intQuantity <= intBenReceive) {
+                                        intBenReceive = intBenReceive - intQuantity;
                                         costProductBo.set("STATUS_ID", IVTConstant.STATUS_1236);
                                         SDK.getBOAPI().update(IVTConstant.BO_EU_DNCTT_CONTRACT_COST_PRODUCT, costProductBo);
                                     } else if (intBenReceive < intQuantity) {
@@ -118,24 +173,50 @@ public class DoWorkThread extends Thread {
                                         newCostProductBo.setId(UUIDGener.getUUID());
                                         costProductBo.set("STATUS_ID", IVTConstant.STATUS_1235);
                                         SDK.getBOAPI().create(IVTConstant.BO_EU_DNCTT_CONTRACT_COST_PRODUCT, newCostProductBo, processInstance, uc);
-
+                                        break;
                                     }
+                                    if (intBenReceive <= 0)
+                                        break;
                                 }
 
                             }
                         }
                         //采购接收取消
                         else if (intBenReceive < 0) {
-
+                            int outBenReceive = 0 - intBenReceive;//取消数量
                             for (BO costProductBo : costProductList) {
-                                //如果存在采购中的成本产品,将取消数量加到采购数量中
-//			    			if() {
-//			    				
-//			    			}
+                                //如果存在采购中的成本产品,将取消数量加到采购数量中 从待配送数量中减
+                                if (IVTConstant.STATUS_1236.equals(costProductBo.getString("STATUS_ID"))) {
+                                    //采购数量
+                                    String QUANTITY = BigDecimalUtil.isNull(costProductBo.getString("QUANTITY"));
+                                    int intQuantity = Integer.valueOf(QUANTITY).intValue();
 
+                                    if (intQuantity <= outBenReceive) {
+                                        costProductBo.set("STATUS_ID", IVTConstant.STATUS_1235);//采购中
+                                        costProductBo.set("QUANTITY", intQuantity);
+                                        SDK.getBOAPI().update(IVTConstant.BO_EU_DNCTT_CONTRACT_COST_PRODUCT, costProductBo);
+                                        outBenReceive = outBenReceive - intQuantity;
+                                    } else {
+                                        //待配送
+                                        costProductBo.set("QUANTITY", intQuantity - outBenReceive);
+                                        SDK.getBOAPI().update(IVTConstant.BO_EU_DNCTT_CONTRACT_COST_PRODUCT, costProductBo);
 
+                                        //采购中
+                                        //将剩余的数量生成一条新的成本产品,状态为采购中
+                                        BO newCostProductBo = new BO();
+                                        newCostProductBo.setAll(costProductBo.asMap());
+                                        ProcessInstance processInstance = SDK.getProcessAPI().createBOProcessInstance(IVTConstant.obj_6bc913271069455abbd516c556b26d31, uc.getUID(), "");
+                                        newCostProductBo.setBindId(processInstance.getId());
+                                        newCostProductBo.set("QUANTITY", outBenReceive);
+                                        newCostProductBo.setId(UUIDGener.getUUID());
+                                        costProductBo.set("STATUS_ID", IVTConstant.STATUS_1235);
+                                        SDK.getBOAPI().create(IVTConstant.BO_EU_DNCTT_CONTRACT_COST_PRODUCT, newCostProductBo, processInstance, uc);
+                                        break;
+                                    }
+                                    if (outBenReceive <= 0)
+                                        break;
+                                }
                             }
-
                         }
                     }
                 }

+ 77 - 0
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/event/reserveFormBeforeSave.java

@@ -0,0 +1,77 @@
+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.commons.database.RowMap;
+import com.actionsoft.bpms.server.UserContext;
+import com.actionsoft.bpms.util.DBSql;
+import com.actionsoft.exception.BPMNError;
+import com.actionsoft.sdk.local.SDK;
+import com.awspaas.user.apps.donenow_ivt.constant.IVTConstant;
+import com.awspaas.user.apps.donenow_ivt.utils.BigDecimalUtil;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+
+public class reserveFormBeforeSave extends InterruptListener {
+    public String getDescription() {
+        return "合同产品拣货保存前,校验库存";
+    }
+
+    /**
+     *
+     * @param processExecutionContext
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public boolean execute(ProcessExecutionContext processExecutionContext) throws Exception {
+        UserContext uc = processExecutionContext.getUserContext();
+        BO formData = processExecutionContext.getFormData();
+        String boName = processExecutionContext.getParameterOfString("$BONAME");
+        String bindId = processExecutionContext.getProcessInstance().getId();
+
+        //采购接收主表保存
+        if (IVTConstant.BO_EU_DNIVT_RECEIVE_MAIN.equals(boName)) {
+
+            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();
+
+                String sns = bo.getString("SN");
+                if (StringUtils.isNotBlank(sns)) {
+                    for (String sn : sns.split(",")) {
+                        List<RowMap> exitsLots = DBSql.getMaps("select * from BO_EU_DNIVT_WAREHOUSE_PRODUCT_LOT WHERE FIND_IN_SET(?,SN)", new Object[]{sn});
+                        if (exitsLots.size() > 0 && intBenReceive > 0) {
+                            //已存在,不能再新增
+                            throw new BPMNError("505", sn + "已存在此序列号,不能再新增!");
+                        }
+
+                        if (intBenReceive < 0) {
+                            if (exitsLots.size() <= 0) throw new BPMNError("505", sn + "不存在此序列号,不能再删除!");
+                            else if (exitsLots.size() > 0) {
+                                boolean sameOrderProduct = false;
+                                for (RowMap rowMap : exitsLots) {
+                                    if (rowMap.getString("ORDER_PRODUCT_ID").equals(bo.getString("ORDER_PRODUCT_ID"))) {
+                                        sameOrderProduct = true;
+                                    }
+                                }
+                                if (!sameOrderProduct) {
+                                    throw new BPMNError("505", sn + "不是此采购单接收的,不能在此采购单上取消!");
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        //记录表单修改
+        dn.recordFormChanges.execute(processExecutionContext);
+        return true;
+    }
+}

部分文件因文件數量過多而無法顯示