Bladeren bron

与小明合并代码

zhangyao 4 maanden geleden
bovenliggende
commit
8b33c149b3

+ 64 - 0
com.awspaas.user.apps.donenow_crm/src/com/awspaas/user/apps/donenow_crm/constant/CrmConstant.java

@@ -0,0 +1,64 @@
+package com.awspaas.user.apps.donenow_crm.constant;
+
+import net.sourceforge.pinyin4j.PinyinHelper;
+import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
+import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
+
+public class CrmConstant {
+	  /**
+	   * 客户表
+	   */
+	  public static String BO_EU_DNCRM_ACCOUNT = "BO_EU_DNCRM_ACCOUNT";
+	  /**
+	   * 联系人表
+	   */
+	  public static String BO_EU_DNCRM_CONTACT = "BO_EU_DNCRM_CONTACT";
+	  /**
+	   * 配置项
+	   */
+	  public static String BO_EU_DNCRM_INSTALLED_PRODUCT = "BO_EU_DNCRM_INSTALLED_PRODUCT";
+	  /**
+	   * 配置项类型
+	   */
+	  public static String BO_EU_DNSYS_UDF_GROUP = "BO_EU_DNSYS_UDF_GROUP";
+	  /**
+	   * 配置项类型关联自定义字段
+	   */
+	  public static String BO_EU_DNSYS_UDF_GROUP_FIELD = "BO_EU_DNSYS_UDF_GROUP_FIELD";
+	  /**
+	   * 自定义属性
+	   */
+	  public static String BO_EU_DNSYS_UDF_FIELD = "BO_EU_DNSYS_UDF_FIELD";
+	  
+	  /**
+	   * 客户地址表
+	   */
+	  public static String BO_EU_DNCRM_LOCATION = "BO_EU_DNCRM_LOCATION";
+	  
+	  /**
+	   	*联系人DW
+	   */
+	  public static String obj_fcf1c6204d084ea78e152af821ff4874 = "obj_fcf1c6204d084ea78e152af821ff4874";
+	  
+	  /**
+	   	* 配置项ID
+	   */
+	  public static Integer PZXID = 523;
+	  
+	  /**
+	   	*办公地址
+	   */
+	  public static Integer OFFICELOCATION = 824;
+	  
+	  
+	  public static void main(String[] args) {
+		  HanyuPinyinOutputFormat aa=new HanyuPinyinOutputFormat();
+		try {
+			String  tempStr =  PinyinHelper.toHanyuPinyinString("阿萨德拉拉手大卡司", aa, "").replaceAll("\\d+", "");
+			System.out.println(tempStr);
+		} catch (BadHanyuPinyinOutputFormatCombination e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+}

+ 46 - 0
com.awspaas.user.apps.donenow_crm/src/com/awspaas/user/apps/donenow_crm/controller/BaseController.java

@@ -0,0 +1,46 @@
+package com.awspaas.user.apps.donenow_crm.controller;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.alibaba.fastjson.JSON;
+
+/**
+ * @Description
+ * @Author fengf
+ * @Date 2023�06�26� 14:58
+ * @Version 1.0
+ */
+public class BaseController {
+    private static final int SUCCESS = 0;
+
+    private static final int FAIL = 1;
+
+    private static final String SUCCESS_MSG = "success";
+
+    private static final String FAIL_MSG = "fail";
+
+    protected String success(Object data, Integer code, String msg) {
+        Map<String, Object> returnData = new HashMap<>();
+        returnData.put("code", Integer.valueOf((code == null) ? SUCCESS : code.intValue()));
+        returnData.put("data", (data == null) ? new HashMap<>() : data);
+        returnData.put("msg", (msg == null) ? SUCCESS_MSG : msg);
+        return JSON.toJSONString(returnData);
+    }
+
+    protected String fail(Integer code, String msg) {
+        Map<String, Object> returnData = new HashMap<>();
+        returnData.put("code", Integer.valueOf((code == null) ? FAIL : code.intValue()));
+        returnData.put("data", new HashMap<>());
+        returnData.put("msg", (msg == null) ? FAIL_MSG : msg);
+        return JSON.toJSONString(returnData);
+    }
+
+    protected String success(Object data) {
+        return success(data, SUCCESS, SUCCESS_MSG);
+    }
+    
+    protected String fail(String msg) {
+        return fail(FAIL, msg);
+    }
+}

+ 155 - 37
com.awspaas.user.apps.donenow_crm/src/com/awspaas/user/apps/donenow_crm/controller/accountController.java

@@ -1,23 +1,29 @@
 package com.awspaas.user.apps.donenow_crm.controller;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 import com.actionsoft.bpms.bo.engine.BO;
 import com.actionsoft.bpms.commons.database.RowMap;
+import com.actionsoft.bpms.commons.htmlframework.HtmlPageTemplate;
 import com.actionsoft.bpms.commons.mvc.view.ResponseObject;
 import com.actionsoft.bpms.server.UserContext;
 import com.actionsoft.bpms.server.bind.annotation.Controller;
 import com.actionsoft.bpms.server.bind.annotation.Mapping;
 import com.actionsoft.bpms.util.DBSql;
 import com.actionsoft.sdk.local.SDK;
-import org.apache.commons.lang3.StringUtils;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.List;
+import com.alibaba.cloud.commons.lang.StringUtils;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.awspaas.user.apps.donenow_crm.constant.CrmConstant;
 
 @Controller
-public class accountController {
-    /**
-     * 鍒犻櫎瀹㈡埛
+public class AccountController extends BaseController {
+	  /**
+     * 删除客户
      * @param uc
      * @param ids
      * @return
@@ -26,18 +32,18 @@ public class accountController {
     @Mapping(value = "com.awspaas.user.apps.donenow_DelAccount")
     public ResponseObject delAccount(UserContext uc, String ids) throws SQLException {
         if (StringUtils.isBlank(ids))
-            return ResponseObject.newErrResponse("璇烽€夋嫨瑕佸垹闄ょ殑鏁版嵁");
+            return ResponseObject.newErrResponse("请选择要删除的数据");
 
         String tableName = "BO_EU_DNCRM_ACCOUNT";
 
-        //寮曠敤鏍¢獙
+        //引用校验
         String result = verifyDel(tableName, ids);
         if (result != null)
             return ResponseObject.newErrResponse(result);
 
         Connection conn = null;
         try {
-            //寮曠敤鏍¢獙
+            //引用校验
             conn = DBSql.open();
             conn.setAutoCommit(false);
 
@@ -46,19 +52,19 @@ public class accountController {
                 bo.set("CLOSED", "1");
                 SDK.getBOAPI().update(tableName, bo, conn);
 
-                //Contacts鑱旂郴浜� 鍒犻櫎
+                //Contacts联系人 删除
                 List<BO> contacts = SDK.getBOAPI().query("BO_EU_DNCRM_CONTACT").addQuery("ACCOUNT_ID=", id).addQuery("CLOSED=", 0).list();
                 for (BO contact : contacts) {
                     contact.set("CLOSED", "1");
                     SDK.getBOAPI().update("BO_EU_DNCRM_CONTACT", contact, conn);
 
-                    //鍒犻櫎 缁勭粐涓��搴旂殑鐢ㄦ埛
+                    //删除 组织中对应的用户
                     String userId = DBSql.getString(conn, "SELECT USERID FROM orguser WHERE ext5=? AND CLOSED=0 ", new Object[]{contact.getId()});
                     if (StringUtils.isNotBlank(userId))
-                        SDK.getORGAPI().disabledUser(userId);//绂佺敤缁勭粐涓�敤鎴�
+                        SDK.getORGAPI().disabledUser(userId);//禁用组织中用户
                 }
 
-                //閰嶇疆椤归€昏緫鍒犻櫎
+                //配置项逻辑删除
                 List<BO> installedProducts = SDK.getBOAPI().query("BO_EU_DNCRM_INSTALLED_PRODUCT").addQuery("ACCOUNT_ID=", id).addQuery("CLOSED=", 0).list();
                 for (BO installedProduct : installedProducts) {
                     installedProduct.set("CLOSED", "1");
@@ -66,7 +72,7 @@ public class accountController {
                 }
 
 
-                //瀹㈡埛鍦板潃
+                //客户地址
                 List<BO> address = SDK.getBOAPI().query("BO_EU_DNCRM_LOCATION").addQuery("ACCOUNT_ID=", id).addQuery("CLOSED=", 0).list();
                 for (BO addressBO : address) {
                     addressBO.set("CLOSED", "1");
@@ -90,7 +96,7 @@ public class accountController {
 
 
     /**
-     * 鍒犻櫎鑱旂郴浜�
+     * 删除联系人
      * @param uc
      * @param ids
      * @return
@@ -99,11 +105,11 @@ public class accountController {
     @Mapping(value = "com.awspaas.user.apps.donenow_DelContact")
     public ResponseObject delContact(UserContext uc, String ids) throws SQLException {
         if (StringUtils.isBlank(ids))
-            return ResponseObject.newErrResponse("璇烽€夋嫨瑕佸垹闄ょ殑鏁版嵁");
+            return ResponseObject.newErrResponse("请选择要删除的数据");
 
         String tableName = "BO_EU_DNCRM_CONTACT";
 
-        //寮曠敤鏍¢獙
+        //引用校验
         String result = verifyDel(tableName, ids);
         if (result != null)
             return ResponseObject.newErrResponse(result);
@@ -118,43 +124,43 @@ public class accountController {
 /*
             if (DBSql.getInt(conn,"SELECT COUNT(*) from BO_EU_DNSDK_TASK where contact_id=? and closed=0",new Object[]{id}) > 0)
             {
-                return "璇ヨ仈绯讳汉鏄�叕鍙哥殑澶栧寘鑱旂郴浜猴紙宸ュ崟涓�殑澶栧寘浜哄憳锛�";
+                return "该联系人是公司的外包联系人(工单中的外包人员)";
             }
 */
                 if (DBSql.getInt(conn, "SELECT COUNT(*) from BO_EU_DNSDK_TASK where contact_id=? and closed=0", new Object[]{id}) > 0) {
-                    throw new Exception("璇ヨ仈绯讳汉鏈夊叧鑱旂殑宸ュ崟鎴栦换鍔�");
+                    throw new Exception("该联系人有关联的工单或任务");
                 }
 
                 if (DBSql.getInt(conn, "SELECT COUNT(*) from BO_EU_DNCOM_ACTIVITY where CREATEUSER=(SELECT USERID FROM orguser WHERE ext5=? AND CLOSED=0 ) and closed=0", new Object[]{id}) > 0) {
-                    throw new Exception("璇ヨ仈绯讳汉鍦ㄨ嚜鍔╂湇鍔″彴鍒涘缓杩囧伐鍗曞�娉�");
+                    throw new Exception("该联系人在自助服务台创建过工单备注");
                 }
 /*
 
             if (_dal.FindSignleBySql<int>($"SELECT COUNT(*) from com_attachment where create_user_id={id} and delete_time=0") > 0)
             {
-                return "璇ヨ仈绯讳汉鍦ㄨ嚜鍔╂湇鍔″彴鍒涘缓杩囬檮浠�";
+                return "该联系人在自助服务台创建过附件";
             }
 */
 
                 if (DBSql.getInt(conn, "SELECT COUNT(*) from BO_EU_DNCTT_CONTRACT where (contact_id=? OR bill_to_contact_id=?)  and closed=0", new Object[]{id, id}) > 0) {
-                    throw new Exception("璇ヨ仈绯讳汉鏄��鎴风殑璐﹀崟鑱旂郴浜�");
+                    throw new Exception("该联系人是客户的账单联系人");
                 }
 
                 if (DBSql.getInt(conn, "SELECT COUNT(*) from BO_EU_DNCRM_ACCOUNT_REFERENCE where email_to_contacts=? and closed=0", new Object[]{id}) > 0) {
-                    throw new Exception("璇ヨ仈绯讳汉鏄��鎴风殑鍞�竴鐨勪竴涓�彂绁ㄩ偖浠舵帴鏀朵汉");
+                    throw new Exception("该联系人是客户的唯一的一个发票邮件接收人");
                 }
 
-                //Contacts鑱旂郴浜� 鍒犻櫎
+                //Contacts联系人 删除
                 BO contact = SDK.getBOAPI().get("BO_EU_DNCRM_CONTACT", id);
                 contact.set("CLOSED", "1");
                 SDK.getBOAPI().update("BO_EU_DNCRM_CONTACT", contact, conn);
 
-                //鍒犻櫎 缁勭粐涓��搴旂殑鐢ㄦ埛
+                //删除 组织中对应的用户
                 String userId = DBSql.getString(conn, "SELECT USERID FROM orguser WHERE ext5=? AND CLOSED=0 ", new Object[]{contact.getId()});
                 if (StringUtils.isNotBlank(userId))
-                    SDK.getORGAPI().disabledUser(userId);//绂佺敤缁勭粐涓�敤鎴�
+                    SDK.getORGAPI().disabledUser(userId);//禁用组织中用户
 
-                //閰嶇疆椤归€昏緫鍒犻櫎
+                //配置项逻辑删除
                 List<BO> installedProducts = SDK.getBOAPI().query("BO_EU_DNCRM_INSTALLED_PRODUCT").addQuery("CONTACT_ID=", id).addQuery("CLOSED=", 0).list();
                 for (BO installedProduct : installedProducts) {
                     installedProduct.set("CLOSED", "1");
@@ -179,7 +185,7 @@ public class accountController {
     }
 
     /**
-     * 鍒犻櫎閰嶇疆椤�
+     * 删除配置项
      * @param uc
      * @param ids
      * @return
@@ -189,11 +195,11 @@ public class accountController {
     public ResponseObject delInstallProd(UserContext uc, String ids) throws SQLException {
 
         if (StringUtils.isBlank(ids))
-            return ResponseObject.newErrResponse("璇烽€夋嫨瑕佸垹闄ょ殑鏁版嵁");
+            return ResponseObject.newErrResponse("请选择要删除的数据");
 
         String tableName = "BO_EU_DNCRM_INSTALLED_PRODUCT";
 
-        //寮曠敤鏍¢獙
+        //引用校验
         String result = verifyDel(tableName, ids);
         if (result != null)
             return ResponseObject.newErrResponse(result);
@@ -210,7 +216,7 @@ public class accountController {
                 installProd.set("CLOSED", "1");
                 SDK.getBOAPI().update(tableName, installProd, conn);
 
-                //鍚堝悓鎴愭湰  淇�敼椤圭洰鎴愭湰
+                //合同成本  修改项目成本
                 String CONTRACT_COST_ID = installProd.getString("CONTRACT_COST_ID");
                 if (StringUtils.isNotBlank(CONTRACT_COST_ID)) {
                     BO contractCost = SDK.getBOAPI().get("BO_EU_DNCTT_CONTRACT_COST", CONTRACT_COST_ID);
@@ -238,7 +244,7 @@ public class accountController {
 
 
     /**
-     * 鍒犻櫎鍦板潃
+     * 删除地址
      * @param uc
      * @param ids
      * @return
@@ -248,11 +254,11 @@ public class accountController {
     public ResponseObject delLocation(UserContext uc, String ids) throws SQLException {
 
         if (StringUtils.isBlank(ids))
-            return ResponseObject.newErrResponse("璇烽€夋嫨瑕佸垹闄ょ殑鏁版嵁");
+            return ResponseObject.newErrResponse("请选择要删除的数据");
 
         String tableName = "BO_EU_DNCRM_LOCATION";
 
-        //寮曠敤鏍¢獙
+        //引用校验
         String result = verifyDel(tableName, ids);
         if (result != null)
             return ResponseObject.newErrResponse(result);
@@ -301,11 +307,123 @@ public class accountController {
                     for (RowMap rowMap : list) {
                         errMsg += rowMap.getString("NAME") + rowMap.getString("NUM") + "\r\n";
                     }
-                    return "鍒犻櫎澶辫触锛岃�浠ヤ笅鏁版嵁寮曠敤锛歕r\n" + errMsg;
+                    return "删除失败,被以下数据引用:\r\n" + errMsg;
                 }
             }
         }
         return null;
     }
 
+	 @Mapping("com.awspaas.user.apps.donenow_crm.querydepartment")
+	    public String findPchSelect(String accountId,UserContext uc) {
+	       RowMap map = DBSql.getMap("SELECT * FROM orgdepartment WHERE EXT1=?", new Object[] {accountId});
+	       if(map==null) {
+	    	  return fail("请先保存主表数据"); 
+	       }
+		 return success("保存成功");
+	      
+	    }
+	 
+	 
+	 @Mapping("com.awspaas.user.apps.donenow_crm.queryhtml")
+	    public String queryhtml(String cateId,String objectId,UserContext uc) {
+		 System.out.println("cateId:"+cateId);
+		 System.out.println("objectId:"+objectId);
+
+		   Map<String, Object> map = new HashMap<>();
+		   map.put("uid", uc.getUID());
+		   map.put("sid", uc.getSessionId());
+		   map.put("cateId", cateId);
+		   map.put("objectId", objectId);
+		   
+		   String ORGID = uc.getCompanyModel().getId();
+			 System.out.println("ORGID:"+ORGID);
+			 //查询配置项类型
+			BO detail = SDK.getBOAPI().query(CrmConstant.BO_EU_DNSYS_UDF_GROUP).detailById(cateId);
+			if(null==detail) {
+				return StringUtils.EMPTY;
+			}
+			 //查询配置项类型自定义字段,比如EXTTEXT5
+			List<BO> fieldList = SDK.getBOAPI().query(CrmConstant.BO_EU_DNSYS_UDF_GROUP_FIELD).bindId(detail.getBindId()).list();
+			List<String> list=new ArrayList<String>();
+			for (BO bo : fieldList) {
+				list.add("'"+bo.getString("UDF_FIELD_COL_NAME")+"'");
+			}
+			//根据配置信息去自定义属性表中查询所有字段信息,返回前端拼接成页面
+			String fieldSql="SELECT * FROM "+CrmConstant.BO_EU_DNSYS_UDF_FIELD+" WHERE COL_NAME IN ("+org.apache.commons.lang3.StringUtils.join(list, ",")+") AND ORGID=? AND CATE_ID="+CrmConstant.PZXID+"  ORDER BY SORT_ORDER";
+		   List<RowMap> udfList = DBSql.getMaps(fieldSql, new Object[] { ORGID }); 
+		   System.out.println("sql2:"+fieldSql);
+
+		   map.put("formTitle", "配置项自定义字段");
+		   
+		   List<Map<String, Object>> colFields = new ArrayList<>();
+		   
+		   //查询配置表存储数据
+		   BO object=SDK.getBOAPI().query(CrmConstant.BO_EU_DNCRM_INSTALLED_PRODUCT).detailById(objectId);
+		   for (RowMap udf : udfList) {
+		     Map<String, Object> field = new HashMap<>();
+		     String COL_NAME = udf.getString("COL_NAME");
+		     
+		     field.put("name", COL_NAME);
+		     if (object != null) {
+		    	   field.put("value", object.getString(COL_NAME));
+		    	     } else {
+		    	     field.put("value", udf.getString("DEFAULT_VALUE"));
+		    	      } 
+		     String DATA_TYPE_ID = udf.getString("DATA_TYPE_ID");
+		     
+		     field.put("type", DATA_TYPE_ID);
+		     if (DATA_TYPE_ID.equals("530")) {
+		       
+		       String sql = udf.getString("SQL_CONFIG");
+		       
+		       if (sql.contains("@")) {
+		         sql = SDK.getRuleAPI().executeAtScript(sql, uc);
+		       }
+		       List<RowMap> list2 = DBSql.getMaps(sql, new Object[0]);
+		       
+		       field.put("list", list2);
+		     } 
+		     
+		     field.put("comment", udf.getString("COL_COMMENT"));
+		     field.put("readonly", udf.getString("IS_PROTECTED"));
+		     field.put("required", udf.getString("IS_REQUIRED"));
+		     
+		     colFields.add(field);
+		   } 
+		   
+		   map.put("colFields", JSON.toJSONString(colFields));
+		   
+		   return HtmlPageTemplate.merge("CONF.html", map);
+		 }
+	 
+	 @Mapping("com.awspaas.user.apps.donenow_crm_save")
+	    public ResponseObject udfSave(UserContext userContext, String cateId, String objectId, String data) throws Exception {
+	      System.out.println("cateId=" + cateId + " objectId=" + objectId);
+	      System.out.println(data);
+	      JSONObject json = JSON.parseObject(data);
+	     String set = "";
+	     List<String> values = new ArrayList<>();
+	     for (String key : json.keySet()) {
+	      String value = json.getString(key);
+	      	if(StringUtils.isBlank(value))
+	      		value="";
+	      	if(value.contains("[")&&value.length()>4) {
+	   		 value=value.substring(2, 3);
+	      	}
+	         set = set + key + "=?,";
+	         values.add(value);
+	     } 
+	     values.add(objectId);
+	
+	    
+	     String sql = "update " + CrmConstant.BO_EU_DNCRM_INSTALLED_PRODUCT + " set " + set.substring(0, set.length() - 1) + " where id=?";
+	      System.out.println("updateBO_EU_DNCRM_INSTALLED_PRODUCTSql:"+sql);
+
+	     DBSql.update(sql, values.toArray());
+	     
+	     return ResponseObject.newOkResponse("保存成功");
+   }
+	 
+	
 }

+ 118 - 0
com.awspaas.user.apps.donenow_crm/src/com/awspaas/user/apps/donenow_crm/event/ContactFormAfterSaveEvent.java

@@ -0,0 +1,118 @@
+  package com.awspaas.user.apps.donenow_crm.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.commons.database.RowMap;
+import com.actionsoft.bpms.org.cache.UserCache;
+import com.actionsoft.bpms.server.UserContext;
+  import com.actionsoft.bpms.util.DBSql;
+  import com.actionsoft.sdk.local.SDK;
+  import com.actionsoft.sdk.local.api.BOQueryAPI;
+import com.actionsoft.sdk.service.model.UserModel;
+import com.alibaba.fastjson.JSON;
+import com.alipay.remoting.util.StringUtils;
+  import com.awspaas.user.apps.donenow_crm.constant.CrmConstant;
+
+import net.sourceforge.pinyin4j.PinyinHelper;
+import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
+import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
+
+import java.util.List;
+  
+  
+  public class ContactFormAfterSaveEvent
+    extends ExecuteListener
+  {
+    public String getDescription() {
+    return "表单保存后事件";
+    }
+    
+    public String getProvider() {
+     return "上海声联";
+    }
+    
+    public String getVersion() {
+    return "1.0";
+    }
+    
+    public void execute(ProcessExecutionContext process) throws Exception {
+    	 UserContext uc = process.getUserContext();
+		 String boName = process.getParameterOfString("$BONAME");
+		 System.out.println("单位boName:" + boName);
+		 BO contactBo = process.getFormData();
+		 saveContactData(uc,contactBo,boName,true);
+		   
+    }
+    
+    public String saveContactData(UserContext uc,BO contactBo,String boName,boolean type) {
+		 String roleNO = "roledn_customer";
+    	 String deptId = DBSql.getString("SELECT ID FROM ORGDEPARTMENT WHERE EXT1=?", new Object[] { contactBo.getString("ACCOUNT_ID")});
+    	 
+		   if (contactBo != null&&CrmConstant.BO_EU_DNCRM_CONTACT.equals(boName)&&StringUtils.isNotBlank(deptId)) {
+		    String roleId = DBSql.getString("SELECT ID from orgrole where roleno='"+roleNO+"'");
+		    if (StringUtils.isBlank(roleId)) {
+		      System.out.println("roleModel为空:");
+		        return "";
+		      } 
+		     RowMap map = DBSql.getMap("SELECT * FROM ORGUSER WHERE EXT5=? or (USERNAME=? AND MOBILE=?)", new Object[] { contactBo.getId(),contactBo.get("NAME"),contactBo.get("MOBILE_PHONE") });
+		     System.out.println("userMap:" +JSON.toJSONString(map));
+		     System.out.println("userMap:" + (map == null));
+		      
+		     //用户表中是否已经存在该人
+		     if (map != null) {
+		       System.out.println("用户更新:");
+		       //说明联系人姓名没有修改过
+		       if(contactBo.getString("NAME").equals(map.getString("USERNAME"))) {
+			       SDK.getORGAPI().updateUser(map.getString("USERID"), contactBo.getString("NAME"), "", contactBo.getString("EMAIL"), contactBo.getString("MOBILE_PHONE"), "", "", "", "", contactBo.getId());
+		       }
+		       //联系人姓名修改过了,要修改USERID
+		       else {
+		    	   String userId=getPinYinUserId(contactBo.getString("NAME"));
+		    	   DBSql.update("UPDATE ORGUSER SET USERID='"+userId+"' WHERE EXT5='"+contactBo.getId()+"'");
+		    	   UserCache.getCache().reload();
+			       SDK.getORGAPI().updateUser(userId, contactBo.getString("NAME"), "", contactBo.getString("EMAIL"), contactBo.getString("MOBILE_PHONE"), "", "", "", "", contactBo.getId());
+		       }
+		       
+		      } else {
+		      System.out.println("用户新增");
+		      String pinYinUserId = getPinYinUserId(contactBo.getString("NAME"));
+		      SDK.getORGAPI().createUser(deptId, pinYinUserId, contactBo.getString("NAME"), roleId, "", "", false, contactBo.getString("EMAIL"), contactBo.getString("MOBILE_PHONE"), "", "", "", "", contactBo.getId());
+		      } 
+    	
+		   }
+		   //主联系人保存需要往客户表同步联系人数据
+		   if(type&&"1".equals(contactBo.getString("IS_PRIMARY_CONTACT"))) {
+			   BO accoutnBo = SDK.getBOAPI().query(CrmConstant.BO_EU_DNCRM_ACCOUNT).detailById(contactBo.getString("ACCOUNT_ID"));
+			   if(null!=accoutnBo) {
+				   accoutnBo.set("CONTACT_NAME", contactBo.get("NAME"));  
+				   accoutnBo.set("CONTACT_SUFFIX_ID", contactBo.get("SUFFIX_ID"));  
+				   accoutnBo.set("CONTACT_TITLE", contactBo.get("TITLE"));  
+				   accoutnBo.set("CONTACT_EMAIL", contactBo.get("EMAIL"));  
+				   accoutnBo.set("PHONE", contactBo.get("MOBILE_PHONE"));  
+				   accoutnBo.set("ALTERNATE_PHONE1", contactBo.get("PHONE"));  
+				  SDK.getBOAPI().update(CrmConstant.BO_EU_DNCRM_ACCOUNT, accoutnBo);
+			   }
+		   }
+		return "";
+    }
+    public String getPinYinUserId(String userName) {
+    	
+  	  	HanyuPinyinOutputFormat hanyuPinyinOutputFormat=new HanyuPinyinOutputFormat();
+  	    String  tempStr=StringUtils.EMPTY;
+  		try {
+  			 tempStr =  PinyinHelper.toHanyuPinyinString(userName, hanyuPinyinOutputFormat, "").replaceAll("\\d+", "");
+  		} catch (BadHanyuPinyinOutputFormatCombination e) {
+  			// TODO Auto-generated catch block
+  			e.printStackTrace();
+  		}
+  		Integer count = DBSql.getInt("SELECT COUNT(1) FROM ORGUSER WHERE USERID LIKE CONCAT(?,'%')", new Object[] {tempStr});
+		if(count>0) {
+			return tempStr+(count+1);
+		}else {
+			return tempStr;
+		}
+    	
+    }
+    
+  }

+ 158 - 0
com.awspaas.user.apps.donenow_crm/src/com/awspaas/user/apps/donenow_crm/event/FormAfterSaveEvent.java

@@ -0,0 +1,158 @@
+  package com.awspaas.user.apps.donenow_crm.event;
+  
+  import java.util.List;
+
+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.bpmn.engine.model.run.delegate.ProcessInstance;
+import com.actionsoft.bpms.org.cache.DepartmentCache;
+import com.actionsoft.bpms.server.UserContext;
+import com.actionsoft.bpms.util.DBSql;
+import com.actionsoft.bpms.util.UUIDGener;
+import com.actionsoft.sdk.local.SDK;
+import com.alipay.remoting.util.StringUtils;
+import com.awspaas.user.apps.donenow_crm.constant.CrmConstant;
+  
+  
+  public class FormAfterSaveEvent
+    extends ExecuteListener
+  {
+    public String getDescription() {
+    return "表单保存后事件";
+    }
+    
+    public String getProvider() {
+     return "上海声联";
+    }
+    
+    public String getVersion() {
+    return "1.0";
+    }
+  
+    
+    public void execute(ProcessExecutionContext process) throws Exception {
+     try {
+		UserContext uc = process.getUserContext();
+		 BO formData = process.getFormData();
+		 String boName = process.getParameterOfString("$BONAME");
+		  
+		 System.out.println("单位boName:" + boName);
+		  
+		 String companyId = uc.getCompanyModel().getId();
+		 System.out.println("单位crmCompanyId:" + companyId);
+		 String parentDepartmentId=DBSql.getString("select ID from orgdepartment where COMPANYID='"+companyId+"' and DEPARTMENTNAME='客户'");
+		 System.out.println("parentDepartmentId:" + parentDepartmentId);
+
+		  
+		BO accountBo = process.getBO(CrmConstant.BO_EU_DNCRM_ACCOUNT);
+		 if (accountBo != null) {
+		   
+		   System.out.println("客户表数据:" + accountBo.getBindId());
+		    
+		   String deptId = DBSql.getString("SELECT ID FROM ORGDEPARTMENT WHERE EXT1=?", new Object[] { accountBo.getId() });
+		    
+		   System.out.println("父部门ID:" + parentDepartmentId);
+		    
+ 		   String parentId = accountBo.getString("PARENT_ID");
+		    
+		   if (StringUtils.isBlank(parentId)) {
+		     parentId = parentDepartmentId;
+		    }
+		   
+		   //客户表单保存,往系统部门表中新增或者更新数据
+		   if (StringUtils.isNotBlank(deptId)) {
+		    DBSql.update("UPDATE ORGDEPARTMENT SET PARENTDEPARTMENTID=? WHERE ID=?", new Object[] { parentId, deptId });
+		    SDK.getORGAPI().updateDepartment(deptId, accountBo.getString("NAME"));
+		    } else {
+		      
+		     deptId = SDK.getORGAPI().createDepartment(companyId, accountBo.getString("NAME"), "", "", parentId, accountBo.getId(), "");
+		    } 
+		    DepartmentCache.getCache().reload();
+		   
+		   //说明是客户表单保存 
+		  if (CrmConstant.BO_EU_DNCRM_ACCOUNT.equals(boName)) {
+		   //往地址表同步数据
+			  List<BO> list = SDK.getBOAPI().query(CrmConstant.BO_EU_DNCRM_LOCATION).bindId(accountBo.getBindId()).addQuery("IS_DEFAULT=", Integer.valueOf(1)).list();
+		    //已经存在默认地址
+		    if(list.size()>0) {
+			    for (BO bo : list) {
+			      bo.set("COUNTRY_ID", accountBo.get("COUNTRY_ID"));
+			      bo.set("DISTRICT_ID", accountBo.get("DISTRICT_ID"));
+			      bo.set("ADDRESS", accountBo.get("ADDRESS"));
+			      bo.set("POSTAL_CODE", accountBo.get("POSTAL_CODE"));
+				  bo.set("CATE_ID", accountBo.get("CATE_ID"));
+			      SDK.getBOAPI().update(CrmConstant.BO_EU_DNCRM_LOCATION, bo);
+			      
+			     }
+		    }else {
+		    	//往地址表中新增数据
+		    	BO bo=new BO();
+		    	bo.setBindId(accountBo.getBindId());
+		    	bo.set("COUNTRY_ID", accountBo.get("COUNTRY_ID"));
+			    bo.set("DISTRICT_ID", accountBo.get("DISTRICT_ID"));
+			    bo.set("ADDRESS", accountBo.get("ADDRESS"));
+			    bo.set("POSTAL_CODE", accountBo.get("POSTAL_CODE"));
+			    bo.set("IS_DEFAULT", 1);
+			    bo.set("ACCOUNT_ID", accountBo.getId());
+			    bo.set("CATE_ID", CrmConstant.OFFICELOCATION);
+			    bo.set("ID", UUIDGener.getUUID());
+			    SDK.getBOAPI().create(CrmConstant.BO_EU_DNCRM_LOCATION, bo,SDK.getProcessAPI().getInstanceById(accountBo.getBindId()), uc);
+			    //更新客户表的LocationId字段
+			    accountBo.set("LOCATION_ID", bo.getId());
+			    SDK.getBOAPI().update(CrmConstant.BO_EU_DNCRM_ACCOUNT, bo);
+		     }
+		    
+		    //往联系人表同步数据
+		    List<BO> mainList = SDK.getBOAPI().query(CrmConstant.BO_EU_DNCRM_CONTACT).addQuery("ACCOUNT_ID=", accountBo.getId()).addQuery("IS_PRIMARY_CONTACT=", 1).list();
+			System.out.println("mainList:"+mainList.size());
+		    if(mainList.size()==0) {
+				  ProcessInstance createBOProcessInstance = SDK.getProcessAPI().createBOProcessInstance(CrmConstant.obj_fcf1c6204d084ea78e152af821ff4874, uc.getUID(), "");
+					BO bo=new BO();
+					bo.setId(UUIDGener.getUUID());
+					bo.set("NAME", accountBo.get("CONTACT_NAME"));
+					bo.set("SUFFIX_ID", accountBo.get("CONTACT_SUFFIX_ID"));
+					bo.set("TITLE", accountBo.get("CONTACT_TITLE"));
+					bo.set("EMAIL", accountBo.get("CONTACT_EMAIL"));
+					bo.set("MOBILE_PHONE", accountBo.get("PHONE"));
+					bo.set("PHONE", accountBo.get("ALTERNATE_PHONE1"));
+					bo.set("ACCOUNT_ID", accountBo.getId());
+					bo.set("IS_PRIMARY_CONTACT", 1);
+				 	SDK.getBOAPI().create(CrmConstant.BO_EU_DNCRM_CONTACT, bo, createBOProcessInstance, uc);
+				 	//同步联系人数据到用户表
+					new ContactFormAfterSaveEvent().saveContactData(uc, bo, CrmConstant.BO_EU_DNCRM_CONTACT, false);
+			}else {
+				BO bo = mainList.get(0);
+				bo.set("NAME", accountBo.get("CONTACT_NAME"));
+				bo.set("SUFFIX_ID", accountBo.get("CONTACT_SUFFIX_ID"));
+				bo.set("TITLE", accountBo.get("CONTACT_TITLE"));
+				bo.set("EMAIL", accountBo.get("CONTACT_EMAIL"));
+				bo.set("MOBILE_PHONE", accountBo.get("PHONE"));
+				bo.set("PHONE", accountBo.get("ALTERNATE_PHONE1"));
+				bo.set("ACCOUNT_ID", accountBo.getId());
+				SDK.getBOAPI().update(CrmConstant.BO_EU_DNCRM_CONTACT, bo);
+				//同步联系人数据到用户表
+				new ContactFormAfterSaveEvent().saveContactData(uc, bo, CrmConstant.BO_EU_DNCRM_CONTACT, false);
+				}
+		    }
+		  
+		  //说明是地址表单保存
+		   else if (CrmConstant.BO_EU_DNCRM_LOCATION.equals(boName)) {
+		    BO locationBo = process.getBO(CrmConstant.BO_EU_DNCRM_LOCATION);
+		    if (locationBo != null && "1".equals(locationBo.getString("IS_DEFAULT"))) {
+		      accountBo.set("COUNTRY_ID", locationBo.get("COUNTRY_ID"));
+		      accountBo.set("DISTRICT_ID", locationBo.get("DISTRICT_ID"));
+		      accountBo.set("ADDRESS", locationBo.get("ADDRESS"));
+		     accountBo.set("POSTAL_CODE", locationBo.get("POSTAL_CODE"));
+		       SDK.getBOAPI().update(CrmConstant.BO_EU_DNCRM_ACCOUNT, accountBo);
+		      } 
+		    } 
+		  }
+	} catch (Exception e) {
+		// TODO Auto-generated catch block
+		System.out.println("客户保存事件报错了:"+e.getMessage());
+	} 
+    }
+    
+    
+  }

+ 134 - 0
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/constant/IVTConstant.java

@@ -0,0 +1,134 @@
+package com.awspaas.user.apps.donenow_ivt.constant;
+
+public class IVTConstant {
+	
+	/**
+	 * 服务
+	 */
+	public static String BO_EU_DNIVT_SERVICE="BO_EU_DNIVT_SERVICE";
+	
+	/**
+	 * 产品信息
+	 */
+	public static String BO_EU_DNIVT_PRODUCT="BO_EU_DNIVT_PRODUCT";
+	/**
+	 * 仓库产品
+	 */
+	public static String BO_EU_DNIVT_WAREHOUSE_PRODUCT="BO_EU_DNIVT_WAREHOUSE_PRODUCT";
+	
+	/**
+	 * 产品移库
+	 */
+	public static String BO_EU_DNIVT_TRANSFER="BO_EU_DNIVT_TRANSFER";
+
+	
+	/**
+	 * 合同物料
+	 */
+	public static String BO_EU_DNCTT_CONTRACT_COST="BO_EU_DNCTT_CONTRACT_COST";
+	
+	/**
+	 * 采购订单
+	 */
+	public static String BO_EU_DNIVT_ORDER="BO_EU_DNIVT_ORDER";
+	
+	/**
+	 * 采购项
+	 */
+	public static String BO_EU_DNIVT_ORDER_PRODUCT="BO_EU_DNIVT_ORDER_PRODUCT";
+	
+	/**
+	 * 采购接收临时表主表
+	 */
+	public static String BO_EU_DNIVT_RECEIVE_MAIN="BO_EU_DNIVT_RECEIVE_MAIN";
+	
+	
+	/**
+	 *  采购接收临时表子表
+	 */
+	public static String BO_EU_DNIVT_RECEIVE_SUB="BO_EU_DNIVT_RECEIVE_SUB";
+	
+	/**
+	 *采购接收表
+	 */
+	public static String BO_EU_DNIVT_RECEIVE="BO_EU_DNIVT_RECEIVE";
+	
+	/**
+	 * 合同物料明细 
+	 */
+	
+	public static String BO_EU_DNCTT_CONTRACT_COST_PRODUCT="BO_EU_DNCTT_CONTRACT_COST_PRODUCT";
+
+	//PROCESSDEFID
+	/**
+	 * 产品管理DW
+	 */
+	public static String obj_791ae138caae4644b22cdf95dad67a0a="obj_791ae138caae4644b22cdf95dad67a0a";
+	
+	/**
+	 * 库存转移更新
+	 */
+	public static String obj_e15a8fedeaeb43dc85aa258a7e1cffcf="obj_e15a8fedeaeb43dc85aa258a7e1cffcf";
+	
+	/**
+	 *采购接收
+	 */
+	public static String obj_4d2ff59f7e0d424190ebffcc13db2de2="obj_4d2ff59f7e0d424190ebffcc13db2de2";
+	
+	/**
+	 *接收/取消接收采购订单
+	 */
+	public static String obj_3121af9039dc454aa776f9bdadf6b239="obj_3121af9039dc454aa776f9bdadf6b239";
+	
+	/**
+	 *采购订单收货
+	 */
+	public static String obj_60c43c56593d42108be36f3aa8d3f8a2="obj_60c43c56593d42108be36f3aa8d3f8a2";
+	
+	
+	/**
+	 *仓库产品管理
+	 */
+	public static String obj_41f06b1e807647db8a69dd10d4be5764="obj_41f06b1e807647db8a69dd10d4be5764";
+	
+	
+	/**
+	 *合同物料
+	 */
+	public static String obj_6bc913271069455abbd516c556b26d31="obj_6bc913271069455abbd516c556b26d31";
+	
+	/**
+	 * 采购订单审批
+	 */
+	
+	public static String obj_795cb3601f3a4b919b5896cf5b076a3a="obj_795cb3601f3a4b919b5896cf5b076a3a";
+	
+	
+	/**
+	 * 采购订单全部接收
+	 */
+	public static String STATUS_2148="2148";
+	/**
+	 * 采购订单部分接收
+	 */
+	public static String STATUS_2149="2149";
+	/**
+	 * 已提交
+	 */
+	public static String STATUS_2150="2150";
+	
+	/**
+	 * 采购中
+	 */
+	public static String STATUS_1235="1235";
+	
+	/**
+	 * 待配送
+	 */
+	public static String STATUS_1236="1236";
+	
+	/**
+	 * 已配送
+	 */
+	public static String STATUS_1237="1237";
+}

+ 43 - 0
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/controller/BaseController.java

@@ -0,0 +1,43 @@
+package com.awspaas.user.apps.donenow_ivt.controller;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.alibaba.fastjson.JSON;
+
+/**
+ *
+ */
+public class BaseController {
+    private static final int SUCCESS = 0;
+
+    private static final int FAIL = 1;
+
+    private static final String SUCCESS_MSG = "success";
+
+    private static final String FAIL_MSG = "fail";
+
+    protected String success(Object data, Integer code, String msg) {
+        Map<String, Object> returnData = new HashMap<>();
+        returnData.put("code", Integer.valueOf((code == null) ? SUCCESS : code.intValue()));
+        returnData.put("data", (data == null) ? new HashMap<>() : data);
+        returnData.put("msg", (msg == null) ? SUCCESS_MSG : msg);
+        return JSON.toJSONString(returnData);
+    }
+
+    protected String fail(Integer code, String msg) {
+        Map<String, Object> returnData = new HashMap<>();
+        returnData.put("code", Integer.valueOf((code == null) ? FAIL : code.intValue()));
+        returnData.put("data", new HashMap<>());
+        returnData.put("msg", (msg == null) ? FAIL_MSG : msg);
+        return JSON.toJSONString(returnData);
+    }
+
+    protected String success(Object data) {
+        return success(data, SUCCESS, SUCCESS_MSG);
+    }
+    
+    protected String fail(String msg) {
+        return fail(FAIL, msg);
+    }
+}

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

@@ -0,0 +1,359 @@
+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;
+import com.actionsoft.bpms.commons.database.RowMap;
+import com.actionsoft.bpms.server.UserContext;
+import com.actionsoft.bpms.server.bind.annotation.Controller;
+import com.actionsoft.bpms.server.bind.annotation.Mapping;
+import com.actionsoft.bpms.util.DBSql;
+import com.actionsoft.bpms.util.UUIDGener;
+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;
+
+@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;
+	    }
+}

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

@@ -0,0 +1,176 @@
+package com.awspaas.user.apps.donenow_ivt.event;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.actionsoft.bpms.bo.engine.BO;
+import com.actionsoft.bpms.bpmn.engine.core.delegate.ProcessExecutionContext;
+import com.actionsoft.bpms.bpmn.engine.model.run.delegate.ProcessInstance;
+import com.actionsoft.bpms.commons.database.RowMap;
+import com.actionsoft.bpms.server.UserContext;
+import com.actionsoft.bpms.util.DBSql;
+import com.actionsoft.bpms.util.UUIDGener;
+import com.actionsoft.sdk.local.SDK;
+import com.awspaas.user.apps.donenow_ivt.constant.IVTConstant;
+import com.awspaas.user.apps.donenow_ivt.utils.BigDecimalUtil;
+
+public class DoWorkThread extends Thread {
+	 private ProcessExecutionContext process; 
+	    //有参构造方法
+	    public DoWorkThread(ProcessExecutionContext process){
+	        this.process = process;
+	    }
+	    
+	    public void run() {
+	    	System.out.println("======================多线程开始分割线====================================");
+	    	doWork(process); 
+	    }
+	    
+	    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) {
+				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")});
+				BO receiveBo=new BO();
+				receiveBo.set("ORDER_PRODUCT_ID", bo.get("ORDER_PRODUCT_ID"));
+				receiveBo.set("QUANTITY_RECEIVED", bo.getString("BEN_RECEIVE"));
+				String sub = BigDecimalUtil.sub(bo.getString("QUANTITY"), bo.getString("BEN_RECEIVE"),(null==rowMap?"0":rowMap.getString("QUANTITY_RECEIVED")));
+				receiveBo.set("QUANTITY_BACKORDERED",sub);
+				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.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);
+				    }
+			    }else{
+				    ProcessInstance wareBOProcessInstance = SDK.getProcessAPI().createBOProcessInstance(IVTConstant.obj_41f06b1e807647db8a69dd10d4be5764, uc.getUID(), "");
+				    BO wareHouseBo=new BO();
+				    wareHouseBo.setBindId(wareBOProcessInstance.getId());
+				    wareHouseBo.set("QUANTITY", bo.getString("BEN_RECEIVE"));
+				    wareHouseBo.set("PRODUCT_ID", bo.getString("PRODUCT_ID"));
+				    wareHouseBo.set("WAREHOUSE_ID", bo.getString("WAREHOUSE_ID"));
+				    wareHouseBo.set("QUANTITY_MINIMUM", 0);
+				    wareHouseBo.set("QUANTITY_MAXIMUM", 0);
+				    SDK.getBOAPI().create(IVTConstant.BO_EU_DNIVT_WAREHOUSE_PRODUCT, wareHouseBo, wareBOProcessInstance, uc);
+			    }
+			    
+			    
+			    //更新成本信息
+			    if(StringUtils.isNotBlank(bo.getString("CONTRACT_COST_ID"))) {
+			    	//根据采购项上的CONTRACT_COST_ID查找对应的成本
+				    RowMap receiveMap = 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")});
+
+			    	BO CONTRACT_COST_Detail = SDK.getBOAPI().query(IVTConstant.BO_EU_DNCTT_CONTRACT_COST).detailById(bo.getString("CONTRACT_COST_ID"));
+			    	if(null!=CONTRACT_COST_Detail) {
+			    	//根据成本ID找到对应的所有成本产品	
+			    	List<BO> costProductList = SDK.getBOAPI().query(IVTConstant.BO_EU_DNCTT_CONTRACT_COST_PRODUCT).addQuery("CONTRACT_COST_ID=", CONTRACT_COST_Detail.getId()).list();
+			    	//判断成本是否是采购中状态
+			    	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) {
+				    			costProductBo.set("STATUS_ID", IVTConstant.STATUS_1236);
+				    			SDK.getBOAPI().update(IVTConstant.BO_EU_DNCTT_CONTRACT_COST_PRODUCT, costProductBo);
+				    		}else if(intBenReceive<intQuantity) {
+				    			costProductBo.set("STATUS_ID", IVTConstant.STATUS_1236);
+				    			costProductBo.set("QUANTITY", intBenReceive);
+				    			SDK.getBOAPI().update(IVTConstant.BO_EU_DNCTT_CONTRACT_COST_PRODUCT, costProductBo);
+				    			
+				    			//将剩余的数量生成一条新的成本产品,状态为采购中
+				    			BO newCostProductBo=new BO();
+				    			newCostProductBo.setAll(costProductBo.asMap());
+				    			//IVTConstant.obj_6bc913271069455abbd516c556b26d31
+							    ProcessInstance processInstance = SDK.getProcessAPI().createBOProcessInstance(IVTConstant.obj_6bc913271069455abbd516c556b26d31, uc.getUID(), "");
+							    newCostProductBo.setBindId(processInstance.getId());
+							    newCostProductBo.set("QUANTITY", intQuantity-intBenReceive);
+							    newCostProductBo.setId(UUIDGener.getUUID());
+				    			costProductBo.set("STATUS_ID", IVTConstant.STATUS_1235);
+							    SDK.getBOAPI().create(IVTConstant.BO_EU_DNCTT_CONTRACT_COST_PRODUCT, newCostProductBo, processInstance, uc);
+							    
+				    		}
+			    		}
+			    		
+			    	  }
+			    	}
+			    	//采购接收取消
+			    	else if(intBenReceive<0) {
+			    		
+			    		for(BO costProductBo:costProductList) {
+			    			//如果存在采购中的成本产品,将取消数量加到采购数量中
+//			    			if() {
+//			    				
+//			    			}
+			    			
+			    			
+			    			
+			    		}
+			    		
+			    	}
+			      }
+			    }
+			 }
+			 //循环结束
+			 
+			
+			 //更改采购项状态为全部接收、部门接收、已提交
+			String orderBindId=DBSql.getString("SELECT BINDID FROM "+IVTConstant.BO_EU_DNIVT_ORDER_PRODUCT+" WHERE ID='"+list.get(0).getString("ORDER_PRODUCT_ID")+"')");
+			List<BO> orderProductList = SDK.getBOAPI().query(IVTConstant.BO_EU_DNIVT_ORDER_PRODUCT).bindId(orderBindId).list();
+			int count=0;
+			for(BO bo:orderProductList) {
+				 RowMap map = 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("ID")});
+				 //采购项总共接收数量
+				 int QUANTITY_RECEIVED = map.getInt("QUANTITY_RECEIVED");
+				 //采购项数量
+				 int QUANTITY=Integer.valueOf(BigDecimalUtil.isNull(bo.getString("QUANTITY"))).intValue();
+				 if(QUANTITY_RECEIVED==QUANTITY) {
+					 count++;
+				 }
+			}
+			 if(count==orderProductList.size()&&count>0) {
+				 DBSql.update("UPDATE "+IVTConstant.BO_EU_DNIVT_ORDER+" SET STATUS_ID="+IVTConstant.STATUS_2150+" WHERE BINDID='"+orderBindId+"'");
+			   }else if(count>0) {
+			     DBSql.update("UPDATE "+IVTConstant.BO_EU_DNIVT_ORDER+" SET STATUS_ID="+IVTConstant.STATUS_2149+" WHERE BINDID='"+orderBindId+"'");
+			   }else  {
+				 DBSql.update("UPDATE "+IVTConstant.BO_EU_DNIVT_ORDER+" SET STATUS_ID="+IVTConstant.STATUS_2148+" WHERE BINDID='"+orderBindId+"'");
+			   }
+			 }
+			 
+			 
+			 
+	    	return "";
+	    }
+}

+ 45 - 0
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/event/FormAfterSaveEvent.java

@@ -0,0 +1,45 @@
+  package com.awspaas.user.apps.donenow_ivt.event;
+  
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
+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.bpmn.engine.model.run.delegate.ProcessInstance;
+import com.actionsoft.bpms.commons.database.RowMap;
+import com.actionsoft.bpms.server.UserContext;
+import com.actionsoft.bpms.util.DBSql;
+import com.actionsoft.sdk.local.SDK;
+import com.awspaas.user.apps.donenow_ivt.constant.IVTConstant;
+import com.awspaas.user.apps.donenow_ivt.utils.BigDecimalUtil;
+  
+  
+  public class FormAfterSaveEvent extends ExecuteListener
+  {
+    public String getDescription() {
+    return "表单保存后事件";
+    }
+    
+    public String getProvider() {
+     return "上海声联";
+    }
+    
+    public String getVersion() {
+    return "1.0";
+    }
+  
+    
+    public void execute(ProcessExecutionContext process) throws Exception {
+    	
+    	//开启多线程,防止数据过多导致保存时间太长
+    	DoWorkThread thread=new DoWorkThread(process);
+    	thread.start();
+    }
+    
+   
+    
+  }

+ 292 - 0
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/utils/BigDecimalUtil.java

@@ -0,0 +1,292 @@
+package com.awspaas.user.apps.donenow_ivt.utils;
+
+import com.alibaba.nacos.api.utils.StringUtils;
+import com.google.common.base.Optional;
+
+import java.math.BigDecimal;
+
+/**
+ * 
+ * @Description
+ * @author fengf
+ * @date 2020年2月21日 下午5:00:46
+ * @version V1.0.0
+ */
+public class BigDecimalUtil {
+
+	private BigDecimalUtil() {
+
+	}
+
+	public static String add(String v1, String v2) {
+		if(StringUtils.isBlank(v1)) {
+			v1="0";
+		}
+		if(StringUtils.isBlank(v2)) {
+			v2="0";
+		}
+		BigDecimal b1 = new BigDecimal(v1);
+		BigDecimal b2 = new BigDecimal(v2);
+		return b1.add(b2).toPlainString();
+	}
+	public static String sub(String v1, String v2) {
+		if(StringUtils.isBlank(v1)) {
+			v1="0";
+		}
+		if(StringUtils.isBlank(v2)) {
+			v2="0";
+		}
+		BigDecimal b1 = new BigDecimal(v1);
+		BigDecimal b2 = new BigDecimal(v2);
+		return b1.subtract(b2).toPlainString();
+	}
+	
+	public static String sub(String v1, String v2,String v3) {
+		if(StringUtils.isBlank(v1)) {
+			v1="0";
+		}
+		if(StringUtils.isBlank(v2)) {
+			v2="0";
+		}
+		if(StringUtils.isBlank(v3)) {
+			v3="0";
+		}
+		BigDecimal b1 = new BigDecimal(v1);
+		BigDecimal b2 = new BigDecimal(v2);
+		BigDecimal b3 = new BigDecimal(v3);
+		BigDecimal b4 = b1.subtract(b2);
+		return b4.subtract(b3).toPlainString();
+	}
+
+	public static String mul(String v1, String v2) {
+		if(StringUtils.isBlank(v1)) {
+			v1="0";
+		}
+		if(StringUtils.isBlank(v2)) {
+			v2="0";
+		}
+		BigDecimal b1 = new BigDecimal(v1);
+		BigDecimal b2 = new BigDecimal(v2);
+		return b1.multiply(b2).toPlainString();
+	}
+
+	public static String div(String v1, String v2) {
+		
+		if(StringUtils.isBlank(v1)||StringUtils.isBlank(v2)||v2.equals("0")) {
+			return "0";
+		}
+		BigDecimal b1 = new BigDecimal(v1);
+		BigDecimal b2 = new BigDecimal(v2);
+		return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP).toPlainString();//四舍五入,保留2位小数
+	}
+	
+	public static double add(double v1, double v2) {
+		BigDecimal b1 = new BigDecimal(v1);
+		BigDecimal b2 = new BigDecimal(v2);
+		return b1.add(b2).doubleValue();
+	}
+
+	public static double sub(double v1, double v2) {
+		BigDecimal b1 = new BigDecimal(v1);
+		BigDecimal b2 = new BigDecimal(v2);
+		return b1.subtract(b2).doubleValue();
+	}
+	
+	public static double mul(double v1, double v2) {
+		BigDecimal b1 = new BigDecimal(v1);
+		BigDecimal b2 = new BigDecimal(v2);
+		return b1.multiply(b2).doubleValue();
+	}
+
+	public static double div(double v1, double v2) {
+		BigDecimal b1 = new BigDecimal(v1);
+		BigDecimal b2 = new BigDecimal(v2);
+		return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP).doubleValue();//四舍五入,保留2位小数
+	}
+	
+	
+	public static String div(String v1, String v2,int decimalDigits) {
+		if(StringUtils.isBlank(v1)) {
+			v1="0";
+		}
+		if(StringUtils.isBlank(v2)) {
+			v2="0";
+		}
+		BigDecimal b1 = new BigDecimal(v1);
+		BigDecimal b2 = new BigDecimal(v2);
+		BigDecimal noZeros = b1.divide(b2, decimalDigits, BigDecimal.ROUND_HALF_UP).stripTrailingZeros();
+        String result = noZeros.toPlainString();
+		return result;
+	}
+	
+	public static double round(double d,int len) {     // 进行四舍五入操作
+        BigDecimal b1 = new BigDecimal(d);
+        BigDecimal b2 = new BigDecimal(1);
+       // 任何一个数字除以1都是原数字
+       // ROUND_HALF_UP是BigDecimal的一个常量,表示进行四舍五入的操作
+       return b1.divide(b2, len,BigDecimal.ROUND_HALF_UP).doubleValue();
+    }
+	
+	
+	/**
+	 * BigDecimal的加法运算封装
+	 * 
+	 * @author : shijing 2017年3月23日下午4:53:21
+	 * @param b1
+	 * @param bn
+	 * @return
+	 */
+	public static BigDecimal safeAdd(BigDecimal b1, BigDecimal... bn) {
+		if (null == b1) {
+			b1 = BigDecimal.ZERO;
+		}
+		if (null != bn) {
+			for (BigDecimal b : bn) {
+				b1 = b1.add(null == b ? BigDecimal.ZERO : b);
+			}
+		}
+		return b1;
+	}
+
+	/**
+	 * Integer加法运算的封装
+	 * 
+	 * @author : shijing 2017年3月23日下午4:54:08
+	 * @param b1 第一个数
+	 * @param bn 需要加的加法数组
+	 * @注 : Optional 是属于com.google.common.base.Optional<T> 下面的class
+	 * @return
+	 */
+	public static Integer safeAdd(Integer b1, Integer... bn) {
+		if (null == b1) {
+			b1 = 0;
+		}
+		Integer r = b1;
+		if (null != bn) {
+			for (Integer b : bn) {
+				r += Optional.fromNullable(b).or(0);
+			}
+		}
+		return r > 0 ? r : 0;
+	}
+
+	/**
+	 * 计算金额方法
+	 * 
+	 * @author : shijing 2017年3月23日下午4:53:00
+	 * @param b1
+	 * @param bn
+	 * @return
+	 */
+	public static BigDecimal safeSubtract(BigDecimal b1, BigDecimal... bn) {
+		return safeSubtract(true, b1, bn);
+	}
+
+	/**
+	 * BigDecimal的安全减法运算
+	 * 
+	 * @author : shijing 2017年3月23日下午4:50:45
+	 * @param isZero 减法结果为负数时是否返回0,true是返回0(金额计算时使用),false是返回负数结果
+	 * @param b1     被减数
+	 * @param bn     需要减的减数数组
+	 * @return
+	 */
+	public static BigDecimal safeSubtract(Boolean isZero, BigDecimal b1, BigDecimal... bn) {
+		if (null == b1) {
+			b1 = BigDecimal.ZERO;
+		}
+		BigDecimal r = b1;
+		if (null != bn) {
+			for (BigDecimal b : bn) {
+				r = r.subtract((null == b ? BigDecimal.ZERO : b));
+			}
+		}
+		return isZero ? (r.compareTo(BigDecimal.ZERO) == -1 ? BigDecimal.ZERO : r) : r;
+	}
+
+	/**
+	 * 整型的减法运算,小于0时返回0
+	 * 
+	 * @author : shijing 2017年3月23日下午4:58:16
+	 * @param b1
+	 * @param bn
+	 * @return
+	 */
+	public static Integer safeSubtract(Integer b1, Integer... bn) {
+		if (null == b1) {
+			b1 = 0;
+		}
+		Integer r = b1;
+		if (null != bn) {
+			for (Integer b : bn) {
+				r -= Optional.fromNullable(b).or(0);
+			}
+		}
+		return null != r && r > 0 ? r : 0;
+	}
+	/**
+	 * BigDecimal的乘法运算封装
+	 * 
+	 * @author : shijing 2017年3月23日下午5:01:57
+	 * @param b1
+	 * @param b2
+	 * @return
+	 */
+	public static <T extends Number> BigDecimal safeMultiply(T b1, T b2) {
+		if (null == b1 || null == b2) {
+			return BigDecimal.ZERO;
+		}
+		return BigDecimal.valueOf(b1.doubleValue()).multiply(BigDecimal.valueOf(b2.doubleValue())).setScale(2, BigDecimal.ROUND_HALF_UP);
+	}
+	/**
+	 * 金额除法计算,返回2位小数(具体的返回多少位大家自己看着改吧)
+	 * 
+	 * @author : shijing 2017年3月23日下午5:02:17
+	 * @param b1
+	 * @param b2
+	 * @return
+	 */
+	public static <T extends Number> BigDecimal safeDivide(T b1, T b2) {
+		return safeDivide(b1, b2, BigDecimal.ZERO);
+	}
+
+	/**
+	 * BigDecimal的除法运算封装,如果除数或者被除数为0,返回默认值 默认返回小数位后2位,用于金额计算
+	 * 
+	 * @author : shijing 2017年3月23日下午4:59:29
+	 * @param b1
+	 * @param b2
+	 * @param defaultValue
+	 * @return
+	 */
+	public static <T extends Number> BigDecimal safeDivide(T b1, T b2, BigDecimal defaultValue) {
+		if (null == b1 || null == b2) {
+			return defaultValue;
+		}
+		try {
+			return BigDecimal.valueOf(b1.doubleValue()).divide(BigDecimal.valueOf(b2.doubleValue()), 2, BigDecimal.ROUND_HALF_UP);
+		} catch (Exception e) {
+			return defaultValue;
+		}
+	}
+
+	public static String isNull(String value) {
+		if(StringUtils.isBlank(value)){
+			return "0";
+		}
+		return value;
+	}
+	
+	public static double getDouble(String value) {
+		if(StringUtils.isBlank(value)){
+			return 0;
+		}
+		try {
+			return Double.valueOf(value);
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			return 0;
+		}
+		
+	  }
+	}