From ac70082e183ae551ccdcda57304c7a669e28d5ee Mon Sep 17 00:00:00 2001
From: wuxw7 <wuxw7@asiainfo.com>
Date: 星期四, 24 五月 2018 01:45:22 +0800
Subject: [PATCH] 同步过程测试完成,异步过程未测试

---
 UserService/src/main/java/com/java110/user/smo/impl/UserServiceSMOImpl.java |  756 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 723 insertions(+), 33 deletions(-)

diff --git a/UserService/src/main/java/com/java110/user/smo/impl/UserServiceSMOImpl.java b/UserService/src/main/java/com/java110/user/smo/impl/UserServiceSMOImpl.java
index 22b9271..feb3be9 100644
--- a/UserService/src/main/java/com/java110/user/smo/impl/UserServiceSMOImpl.java
+++ b/UserService/src/main/java/com/java110/user/smo/impl/UserServiceSMOImpl.java
@@ -2,27 +2,55 @@
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.JSONPath;
+import com.java110.common.cache.MappingCache;
+import com.java110.common.constant.KafkaConstant;
+import com.java110.common.constant.MappingConstant;
+import com.java110.common.constant.ResponseConstant;
+import com.java110.common.constant.StateConstant;
+import com.java110.common.exception.SMOException;
+import com.java110.common.kafka.KafkaFactory;
 import com.java110.common.log.LoggerEngine;
+import com.java110.common.util.Assert;
+import com.java110.common.util.DateUtil;
 import com.java110.common.util.ProtocolUtil;
-import com.java110.entity.user.BoCust;
-import com.java110.feign.base.IPrimaryKeyService;
-import com.java110.user.smo.IUserServiceSMO;
 import com.java110.core.base.smo.BaseServiceSMO;
-import org.apache.commons.lang.math.NumberUtils;
+import com.java110.core.context.BusinessServiceDataFlow;
+import com.java110.core.context.DataFlow;
+import com.java110.core.factory.DataFlowFactory;
+import com.java110.core.factory.DataTransactionFactory;
+import com.java110.entity.center.DataFlowLinksCost;
+import com.java110.entity.center.DataFlowLog;
+import com.java110.entity.order.BusiOrder;
+import com.java110.entity.user.BoCust;
+import com.java110.entity.user.BoCustAttr;
+import com.java110.entity.user.Cust;
+import com.java110.entity.user.CustAttr;
+import com.java110.event.service.BusinessServiceDataFlowEventPublishing;
+import com.java110.feign.base.IPrimaryKeyService;
+import com.java110.user.dao.IUserServiceDao;
+import com.java110.user.smo.IUserServiceSMO;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.ObjectUtils;
 
-import java.util.List;
+import java.util.*;
 
 /**
  * 鐢ㄦ埛鏈嶅姟淇℃伅绠$悊涓氬姟淇℃伅瀹炵幇
  * Created by wuxw on 2017/4/5.
  */
 @Service("userServiceSMOImpl")
+@Transactional
 public class UserServiceSMOImpl extends BaseServiceSMO implements IUserServiceSMO {
 
-    @Autowired
+    //@Autowired
     IPrimaryKeyService iPrimaryKeyService;
+
+    @Autowired
+    IUserServiceDao iUserServiceDao;
 
     //鏂板鐢ㄦ埛
     private final static String USER_ACTION_ADD = "ADD";
@@ -39,7 +67,7 @@
      * @param userInfoJson 鍏ュ弬涓虹敤鎴蜂俊鎭痡son浼�
      * @return
      */
-    public String saveUser(String userInfoJson) {
+    public String saveUser(String userInfoJson) throws Exception{
 
         JSONObject reqUserJSON = null;
         try {
@@ -62,39 +90,122 @@
             //杩斿洖寮傚父淇℃伅
             return e.getMessage();
         }
-        return soUserService(reqUserJSON.toJSONString());
+        return soUserService(reqUserJSON);
     }
 
 
     /**
      * 鎵�鏈夋湇鍔″鐞嗙被
+     * {
      *
+     *     'boCust':[{}],
+     *     'boCustAttr':[{}]
+     * }
+     *
+     * 杩斿洖鎶ユ枃锛�
+     *
+     * {'RESULT_CODE':'0000','RESULT_MSG':'鎴愬姛','RESULT_INFO':{'custId':'7000123,718881991'}}
      * @param userInfoJson
      * @return
      */
-    public String soUserService(String userInfoJson) {
+    public String soUserService(JSONObject userInfoJson) throws Exception{
         LoggerEngine.debug("鐢ㄦ埛鏈嶅姟鎿嶄綔瀹㈡埛鍏ュ弬锛�" + userInfoJson);
-        String resultUserInfo = null;
-        JSONObject reqUserJSON = null;
-        try {
-            reqUserJSON = this.simpleValidateJSON(userInfoJson);
-            //1.0瑙勫垯鏍¢獙锛屾姤鏂囨槸鍚﹀悎娉�
+        JSONObject paramJson = new JSONObject();
 
-            if(reqUserJSON.containsKey("boCust")){
+        JSONObject resultInfo = null;
 
-            }
+        //瀛樻斁鐢熸垚鐨刢ustId 涓婚敭涓� custId-1 71000010100
+        Map custIdKey = new HashMap();
 
-            if(reqUserJSON.containsKey("boCustAttr")){
-
-            }
-
-            //2.0
-        } catch (Exception e) {
-            LoggerEngine.error("鏈嶅姟澶勭悊鍑虹幇寮傚父锛�", e);
-        } finally {
-            LoggerEngine.debug("鐢ㄦ埛鏈嶅姟鎿嶄綔瀹㈡埛鍑哄弬锛�" + resultUserInfo);
-            return resultUserInfo;
+        if (userInfoJson == null){
+            throw new IllegalArgumentException("soUserService 鍏ュ弬 涓虹┖"+userInfoJson);
         }
+
+            // 瀹㈡埛淇℃伅澶勭悊 澶勭悊boCust鑺傜偣
+            doProcessBoCust(userInfoJson, paramJson, custIdKey, resultInfo);
+
+            //瀹㈡埛灞炴�т俊鎭鐞� 澶勭悊boCustAttr鑺傜偣
+            doProcessBoCustAttr(userInfoJson, paramJson, custIdKey, resultInfo);
+
+        return ProtocolUtil.createResultMsg(ProtocolUtil.RETURN_MSG_SUCCESS,"鎴愬姛",resultInfo);
+
+    }
+
+    /**
+     *
+     * 璇锋眰鎶ユ枃涓猴細
+     *
+     * {
+     "data": [
+     {
+     "actionTypeCd": "C1",
+     "boCust": [{},{}],
+     "boCustAttr": [{ }, {}]
+     },
+     {
+     "actionTypeCd": "C1",
+     "boCust": [{},{}],
+     "boCustAttr": [{ }, {}]
+     }
+     ]
+     }
+
+     杩斿洖鎶ユ枃 锛�
+
+     { 'RESULT_CODE': '0000', 'RESULT_MSG': '鎴愬姛', 'RESULT_INFO': {'cust':[{'oldCustId':'-1','custId':'12345678'},{'oldCustId':'-2','custId':'12345678'}]} }
+     * @param userInfoJson
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public String soUserServiceForOrderService(JSONObject userInfoJson) throws Exception {
+
+        Assert.isNotNull(userInfoJson,"data","璇锋眰鎶ユ枃缂哄皯 data 鑺傜偣锛岃妫�鏌�");
+
+        JSONArray custInfos = userInfoJson.getJSONArray("data");
+
+        Assert.isNull(custInfos,"璇锋眰鎶ユ枃涓璬ata鑺傜偣锛屾病鏈夊瓙鑺傜偣锛宒ata瀛愯妭鐐瑰簲璇ヤ负JSONArray,custInfos="+custInfos);
+
+        JSONObject custInfoJ = new JSONObject();
+        JSONArray resultCustIdArray = new JSONArray();
+        for(int custInfoIndex = 0 ;custInfoIndex < custInfos.size();custInfoIndex ++){
+            JSONObject custInfoJson = custInfos.getJSONObject(custInfoIndex);
+            String soUserServiceResult = this.soUserService(custInfoJson);
+            JSONObject resultInfo = new JSONObject();
+
+            if(!ProtocolUtil.validateReturnJson(soUserServiceResult,resultInfo)){
+                throw new RuntimeException("瀹㈡埛淇℃伅鍙楃悊澶辫触锛屽師鍥犱负锛�"+resultInfo.getString(ProtocolUtil.RESULT_MSG));
+            }
+            if(resultInfo.getJSONObject(ProtocolUtil.RESULT_INFO) != null
+                    && resultInfo.getJSONObject(ProtocolUtil.RESULT_INFO).containsKey("custId")) {
+
+                String custIds = custInfoJ.getString("custId");
+//                custIds += "," + resultInfo.getJSONObject(ProtocolUtil.RESULT_INFO).getString("custId");
+
+//                custIds = custIds.startsWith(",") && custIds.length()>1 ? custIds.substring(1,custIds.length()):custIds;
+                //custInfoJ.put("custId", custIds);
+                JSONArray boCusts = custInfoJson.getJSONArray("boCust");
+
+                Object custIdObj = JSONPath.eval(custInfoJson,"$.boCust[custId < '0'][0].custId");
+                if(StringUtils.isNotBlank(custIds) && !ObjectUtils.isEmpty(custIdObj)) {
+
+                    String[] allNewCustIds = custIds.split(",");
+                    JSONObject newCustIdJson = null;
+                    for (String custId : allNewCustIds) {
+                        newCustIdJson = new JSONObject();
+                        newCustIdJson.put("oldCustId",custIdObj);
+                        newCustIdJson.put("custId",custId);
+                        resultCustIdArray.add(newCustIdJson);
+                    }
+
+                }
+            }
+
+        }
+
+        custInfoJ.put("cust",resultCustIdArray);
+
+        return ProtocolUtil.createResultMsg(ProtocolUtil.RETURN_MSG_SUCCESS,"鎴愬姛",custInfoJ);
     }
 
     /**
@@ -102,25 +213,54 @@
      *     boCust:[{},{}]
      * }
      * 瀹㈡埛淇″績澶勭悊
+     *
+     *
      * @param boCusts
-     * @return
+     * @return 鎴愬姛 浼氬甫涓婂鐞嗗鎴风殑瀹㈡埛ID
+     * {'RESULT_CODE':'0000','RESULT_MSG':'鎴愬姛','RESULT_INFO':{'custId':'7000123,718881991'}}
      * @throws Exception
      */
     public String soBoCust(String boCusts) throws Exception{
+        return soBoCust(boCusts,null);
+    }
+
+    /**
+     * 灏嗙敓鎴愮殑custId 灏佽鍦╩ap涓繑鍥�
+     * ...
+     * custIdKey.put("custId-1","710020404040");
+     *
+     * ...
+     *
+     * key 涓� custId 鍔犲師鍓嶇殑鍊�
+     *
+     * custIdKey 濡傛灉涓虹┖涓嶅仛澶勭悊
+     * @param boCusts 瀹㈡埛淇℃伅
+     * @param custIdKey custIdKeymap
+     * @return
+     * @throws Exception
+     */
+    public String soBoCust(String boCusts,Map custIdKey) throws Exception{
         // 灏� jsonArray 杞负list<BoCust> 瀵硅薄
         JSONObject jsonObject = JSONObject.parseObject(boCusts);
 
+        JSONObject resultInfo = new JSONObject();
+
+        String custIds = "";
+
         List<BoCust> boCustList = JSONObject.parseArray(jsonObject.getJSONArray("boCust").toJSONString(), BoCust.class);
 
+        Collections.sort(boCustList);
         //淇濆瓨鏁版嵁
 
         for(BoCust boCust : boCustList){
-            int custId = NumberUtils.toInt(boCust.getBoId(),-1);
+//        for(int boCustIndex = 0 ; boCustIndex < boCustList.size();boCustIndex++){
+//            BoCust boCust = boCustList.get(boCustIndex);
+            String custId = boCust.getBoId();
             //濡傛灉瀹㈡埛ID灏忎簬0 锛屽垯鑷繁鐢熸垚瀹㈡埛ID,杩欎釜鍙湁鍦ㄦ湁 涓婚敭鐢熸垚鏈嶅姟鏃朵娇鐢紝鍚﹀垯涓轰簡闃叉鍑洪敊锛岄渶瑕佸墠娈佃皟鐢ㄦ椂闇�瑕佺敓鎴恈ustId
-            if(custId < 0 ){
-                JSONObject data = new JSONObject();
+            if(StringUtils.isBlank(custId) || custId.startsWith("-") ){
+                /*JSONObject data = new JSONObject();
                 data.put("type","CUST_ID");
-                //{"RESULT_CODE":"0000","RESULT_INFO":{"user_id":"7020170411000041"},"RESULT_MSG":"鎴愬姛"}
+                //瑕佹眰鎺ュ彛杩斿洖 {"RESULT_CODE":"0000","RESULT_INFO":{"user_id":"7020170411000041"},"RESULT_MSG":"鎴愬姛"}
                 String custIdJSONStr = iPrimaryKeyService.queryPrimaryKey(data.toJSONString());
                 JSONObject custIdJSONTmp = JSONObject.parseObject(custIdJSONStr);
                 if(custIdJSONTmp.containsKey("RESULT_CODE")
@@ -128,15 +268,82 @@
                         && custIdJSONTmp.containsKey("RESULT_INFO")){
                     //浠庢帴鍙g敓鎴恈ustId
                     custId = NumberUtils.toInt(custIdJSONTmp.getJSONObject("RESULT_INFO").getString("CUST_ID"),-1);
+                }*/
+
+                custId = this.queryPrimaryKey(iPrimaryKeyService,"CUST_ID");
+
+                //灏� 鏂扮敓鎴愮殑custId淇濆瓨鑷� map涓� custId-1 custId-2 涓婚敭鏂瑰紡瀛樺叆
+                if(custIdKey != null){
+                    custIdKey.put("custId"+boCust.getCustId(),custId);
                 }
             }
 
-            boCust.setCustId(custId+"");
+            boCust.setCustId(custId);
+
+            //淇濆瓨鏁版嵁鑷� bo_cust 琛ㄤ腑
+            int saveBoCustFlag = iUserServiceDao.saveDataToBoCust(boCust);
+
+            if(saveBoCustFlag < 1){ // 濡傛灉娌℃湁淇濆瓨鎴愬姛锛屾姏鍑哄紓甯革紝鏈変簨鐗� 鍥為��浜嬬墿
+                throw new RuntimeException("淇濆瓨杩囩▼[bo_cust]鏁版嵁澶辫触,鍗拌薄璁板綍鏁颁负"+saveBoCustFlag+"锛宐oCust : "+boCust);
+            }
+            //寤烘。 澶勭悊 瀹炰緥鏁版嵁
+            int saveCustFlag = 0;
+            if("ADD".equals(boCust.getState())){
+               /* List<BoCust> boCustsTmp = boCustList;
+                //鍦ㄥ鍔犱箣闂撮鍏堣鍒ゆ柇鏄惁鏈夌浉搴斿垹鐨勫姩浣�
+//                for(BoCust boCustTmp : boCustsTmp){
+                for(int boCustTmpIndex = boCustIndex+1;boCustTmpIndex < boCustsTmp.size();boCustTmpIndex++){
+                    BoCust boCustTmp = boCustsTmp.get(boCustTmpIndex);
+                    if(StringUtils.isNotBlank(boCust.getCustId())
+                            && boCust.getCustId().equals(boCustTmp.getCustId())
+                            &&"DEL".equals(boCustTmp.getState())){
+                        //鍏堣皟鐢ㄥ垹闄ゅ鎴蜂俊鎭�
+                        saveCustFlag = iUserServiceDao.deleteDataToCust(boCust.convert());
+
+                        if(saveCustFlag < 1){
+                            throw new RuntimeException("鍒犻櫎瀹炰緥[cust]鏁版嵁澶辫触锛屽奖鍝嶈褰曟暟涓�"+saveCustFlag+", cust : "+boCust.convert());
+                        }
+
+                        //鍒欐妸宸茬粡鍒犻櫎杩囩殑浠巐ist涓垹闄わ紝浠ラ槻閲嶅鍒犻櫎
+                        boCustList.remove(boCustTmp);
+
+                    }
+                }*/
+
+                saveCustFlag  = iUserServiceDao.saveDataToCust(boCust.convert());
+            }else if("DEL".equals(boCust.getState())){
+                saveCustFlag = iUserServiceDao.deleteDataToCust(boCust.convert());
+            }else if("KIP".equals(boCust.getState())){
+                //鎸夌悊杩欓噷鍒颁笉浜嗭紝KIP琛ㄧず瀹炰緥鏁版嵁涓嶅彉锛屾墍浠ヨ繖閲岄粯璁ゅ啓鎴�1 璁や负鏄垚鍔�
+                saveCustFlag = 1;
+            }else{
+                //杩欓噷鍗曠嫭鎶涘嚭寮傚父锛屼笉璧颁笅闈㈢粺涓�寮傚父鎶涘嚭锛屾槸涓轰簡璇存槑鏇村叿浣撶偣
+                throw new RuntimeException("鍏ュ弬閿欒boCust 鐨� state 鐩墠鍙敮鎸� [ADD,DEL,KIP] , boCust : " +boCust);
+            }
+
+
+            if(saveCustFlag < 1){
+                throw new RuntimeException("淇濆瓨瀹炰緥[cust]鏁版嵁澶辫触锛屽奖鍝嶈褰曟暟涓�"+saveCustFlag+", cust : "+boCust.convert());
+            }
+
+            custIds +=","+custId;
+
         }
-        return "";
+
+        //鍘婚櫎绗竴涓�楀彿
+        if (custIds.length()>0){
+            custIds = custIds.substring(1);
+        }
+
+        resultInfo.put("custId",custIds);
+
+        return ProtocolUtil.createResultMsg(ProtocolUtil.RETURN_MSG_SUCCESS,"鎴愬姛",resultInfo);
     }
 
     /**
+     * 娉ㄦ剰鍦ㄨ皟鐢ㄨ繖涓帴鍙f椂锛岀浉搴旂殑瀹㈡埛淇℃伅蹇呴』瀛樺湪
+     *
+     *
      * 瀹㈡埛淇℃伅灞炴�у鐞�
      * 鍗忚锛�
      *{
@@ -148,7 +355,482 @@
      */
     @Override
     public String soBoCustAttr(String boCustAttrs) throws Exception {
+
+        //杩欓噷鍙互鍔犲叆鍩烘湰瀹㈡埛淇℃伅鏄惁瀛樺湪鐨勬牎楠岋紝鏆傛椂娌℃湁蹇呰瀹炵幇
+
+        // 灏� jsonArray 杞负list<BoCust> 瀵硅薄
+        JSONObject jsonObject = JSONObject.parseObject(boCustAttrs);
+
+        List<BoCustAttr> boCustAttrList = JSONObject.parseArray(jsonObject.getJSONArray("boCustAttr").toJSONString(), BoCustAttr.class);
+
+        //鍏堟媿涓簭 鍏堝鐞咲EL 鍐嶅鐞咥DD
+        Collections.sort(boCustAttrList);
+        //淇濆瓨鏁版嵁
+
+        for(BoCustAttr boCustAttr : boCustAttrList) {
+
+            //淇濆瓨鏁版嵁鑷� bo_cust_attr 琛ㄤ腑
+            int saveBoCustAttrFlag = iUserServiceDao.saveDataToBoCustAttr(boCustAttr);
+
+            if(saveBoCustAttrFlag < 1){ // 濡傛灉娌℃湁淇濆瓨鎴愬姛锛屾姏鍑哄紓甯革紝鏈変簨鐗� 鍥為��浜嬬墿
+                throw new RuntimeException("淇濆瓨杩囩▼[bo_cust_attr]鏁版嵁澶辫触,鍗拌薄璁板綍鏁颁负"+saveBoCustAttrFlag+"锛宐oCustAttr : "+boCustAttr);
+            }
+
+            //寤烘。 澶勭悊 瀹炰緥鏁版嵁
+            int saveCustAttrFlag = 0;
+            if("ADD".equals(boCustAttr.getState())){
+                saveCustAttrFlag  = iUserServiceDao.saveDataToCustAttr(boCustAttr.convert());
+            }else if("DEL".equals(boCustAttr.getState())){
+                saveCustAttrFlag = iUserServiceDao.deleteDataToCustAttr(boCustAttr.convert());
+            }else if("KIP".equals(boCustAttr.getState())){
+                //鎸夌悊杩欓噷鍒颁笉浜嗭紝KIP琛ㄧず瀹炰緥鏁版嵁涓嶅彉锛屾墍浠ヨ繖閲岄粯璁ゅ啓鎴�1 璁や负鏄垚鍔�
+                saveCustAttrFlag = 1;
+            }else{
+                //杩欓噷鍗曠嫭鎶涘嚭寮傚父锛屼笉璧颁笅闈㈢粺涓�寮傚父鎶涘嚭锛屾槸涓轰簡璇存槑鏇村叿浣撶偣
+                throw new RuntimeException("鍏ュ弬閿欒boCustAttr 鐨� state 鐩墠鍙敮鎸� [ADD,DEL,KIP] , boCust : " +boCustAttr);
+            }
+
+            if(saveCustAttrFlag < 1){
+                throw new RuntimeException("淇濆瓨瀹炰緥[cust_attr]鏁版嵁澶辫触锛屽奖鍝嶈褰曟暟涓�"+saveCustAttrFlag+", cust : "+boCustAttr.convert());
+            }
+        }
+
+        return ProtocolUtil.createResultMsg(ProtocolUtil.RETURN_MSG_SUCCESS,"鎴愬姛",null);
+    }
+
+    /**
+     * 浣滃簾瀹㈡埛淇℃伅
+     * [{},{},{}]
+     *
+     * @param datas
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public String soDeleteCustInfo(JSONArray datas) throws Exception {
+
+        Assert.isNull(datas,"浼犲叆鐨刣ata鑺傜偣涓嬫病鏈変换浣曞唴瀹�");
+
+        for(int boIdIndex = 0 ; boIdIndex < datas.size(); boIdIndex++){
+            JSONObject data = datas.getJSONObject(boIdIndex);
+
+            Assert.isNotNull(data,"boId","褰撳墠鑺傜偣涓病鏈夊寘鍚玝oId鑺傜偣鏍煎紡閿欒"+data);
+
+            // 澶嶅師Cust
+            doDeleteBoCust(data);
+
+            // 澶嶅師CustAttr
+            doDeleteBoCustAttr(data);
+
+        }
+
+
         return null;
+    }
+
+
+    /**
+     * 鏌ヨ瀹㈡埛淇℃伅
+     * 鍖呮嫭 鍩烘湰淇℃伅cust 鍜� 灞炴�т俊鎭� custAttr
+     * @param cust
+     * @return
+     * @throws Exception
+     */
+    public String queryCust(Cust cust) throws Exception{
+        LoggerEngine.debug("瀹㈡埛淇℃伅鏌ヨ鍏ュ弬锛�" + cust);
+        if(cust == null || StringUtils.isBlank(cust.getCustId()) ){
+            throw new IllegalArgumentException("瀹㈡埛淇℃伅鏌ヨ鍏ュ弬涓虹┖锛宑ustId 涓虹┖ "+cust);
+        }
+        Cust newCust = iUserServiceDao.queryDataToCust(cust);
+
+        if(newCust == null){
+            return ProtocolUtil.createResultMsg(ProtocolUtil.RETURN_MSG_ERROR,"鏈壘鍒扮敤鎴蜂俊鎭�",null);
+        }
+
+        return ProtocolUtil.createResultMsg(ProtocolUtil.RETURN_MSG_SUCCESS,"鎴愬姛",JSONObject.parseObject(JSONObject.toJSONString(newCust)));
+    }
+
+    /**
+     * 鏍规嵁olID鏌ヨ瀹㈡埛淇℃伅
+     * @param busiOrderStr
+     * @return
+     * @throws Exception
+     */
+    public String queryCustInfoByOlId(String busiOrderStr) throws Exception{
+        return doQueryCustInfoByOlId(busiOrderStr,false);
+    }
+
+    /**
+     * 鏍规嵁olID鏌ヨ瀹㈡埛淇℃伅 闇�瑕佷綔搴熺殑鍙戣捣鐨勬姤鏂�
+     * @param busiOrderStr
+     * @return
+     * @throws Exception
+     */
+    public String queryNeedDeleteCustInfoByOlId(String busiOrderStr) throws Exception{
+        return doQueryCustInfoByOlId(busiOrderStr,true);
+    }
+
+    /**
+     * 鏌ヨ瀹㈡埛璁㈠崟淇℃伅
+     * @param busiOrderStr 璁㈠崟椤逛俊鎭�
+     * @param isNeedDelete 鏄惁鏄挙鍗曟姤鏂� true 鏌ヨ鎾ゅ崟鎶ユ枃 false
+     * @return
+     * @throws Exception
+     */
+    private String doQueryCustInfoByOlId(String busiOrderStr,Boolean isNeedDelete) throws Exception{
+        BusiOrder busiOrder = JSONObject.parseObject(busiOrderStr, BusiOrder.class);
+
+        if(busiOrder == null || "".equals(busiOrder.getOlId())){
+            throw new IllegalArgumentException("瀹㈡埛淇℃伅鏌ヨ鍏ュ弬涓虹┖锛宱lId 涓虹┖ "+busiOrderStr);
+        }
+
+        Cust cust = new Cust();
+        cust.setVersionId(busiOrder.getOlId());
+        //鏍规嵁鐗堟湰ID鏌ヨ瀹炰緥鏁版嵁
+        Cust newCust = iUserServiceDao.queryDataToCust(cust);
+        JSONObject returnJson = JSONObject.parseObject("{'data':{}}");
+        if(newCust == null){
+            return returnJson.toJSONString();
+        }
+
+        BoCust boCust = new BoCust();
+
+        boCust.setBoId(busiOrder.getBoId());
+        boCust.setCustId(newCust.getCustId());
+        boCust.setVersionId(busiOrder.getOlId());
+
+        List<BoCust> boCusts =  iUserServiceDao.queryBoCust(boCust);
+
+
+        //涓�鑸儏鍐典笅娌℃湁杩欑鎯呭喌瀛樺湪锛岄櫎闈� 浜哄伐 鏀逛簡鏁版嵁锛屾垨娌℃寜娴佺▼瀹屾垚鏁版嵁澶勭悊
+        if(boCusts == null || boCusts.size() == 0){
+            return returnJson.toJSONString();
+        }
+
+
+        JSONArray boCustArray = new JSONArray();
+        //鍗曠函鐨勫垹闄� 鍜屽崟绾� 澧炲姞
+        for(int boCustIndex = 0 ; boCustIndex < boCusts.size();boCustIndex++) {
+            BoCust newBoCust = boCusts.get(boCustIndex);
+            if(isNeedDelete) {
+                if (StateConstant.STATE_DEL.equals(newBoCust.getState())) {
+                    newBoCust.setBoId("");
+                    newBoCust.setState(StateConstant.STATE_ADD);
+                } else if (StateConstant.STATE_ADD.equals(newBoCust.getState())) {
+                    newBoCust.setState(StateConstant.STATE_DEL);
+                } else {
+                    newBoCust.setState(StateConstant.STATE_KIP);
+                }
+            }
+            boCustArray.add(newBoCust);
+        }
+        returnJson.getJSONObject("data").put("boCust",JSONObject.toJSONString(boCustArray));
+
+
+        //灞炴�у鐞�
+        CustAttr oldCustAttr = new CustAttr();
+        oldCustAttr.setCustId(newCust.getCustId());
+        oldCustAttr.setVersionId(busiOrder.getOlId());
+        List<CustAttr> custAttrs = iUserServiceDao.queryDataToCustAttr(oldCustAttr);
+        if(custAttrs == null || custAttrs.size() == 0){
+            return returnJson.toJSONString();
+        }
+        /**
+         * 鏌ヨ瀹㈡埛鏌ヨ鐨勮繃绋嬫暟鎹�
+         */
+        BoCustAttr boCustAttr = new BoCustAttr();
+        boCustAttr.setCustId(newCust.getCustId());
+        boCustAttr.setVersionId(busiOrder.getOlId());
+        List<BoCustAttr> boCustAttrs = iUserServiceDao.queryBoCustAttr(boCustAttr);
+
+
+        //涓�鑸儏鍐典笅娌℃湁杩欑鎯呭喌瀛樺湪锛岄櫎闈� 浜哄伐 鏀逛簡鏁版嵁锛屾垨娌℃寜娴佺▼瀹屾垚鏁版嵁澶勭悊
+        if(boCustAttrs == null || boCustAttrs.size() == 0){
+            return returnJson.toJSONString();
+        }
+
+
+        JSONArray boCustAttrArray = new JSONArray();
+        //鍗曠函鐨勫垹闄� 鍜屽崟绾� 澧炲姞
+        for(BoCustAttr newBoCustAttr : boCustAttrs) {
+            if(isNeedDelete) {
+                if (StateConstant.STATE_DEL.equals(newBoCustAttr.getState())) {
+                    newBoCustAttr.setBoId("");
+                    newBoCustAttr.setState(StateConstant.STATE_ADD);
+                } else if (StateConstant.STATE_ADD.equals(newBoCustAttr.getState())) {
+                    newBoCustAttr.setState(StateConstant.STATE_DEL);
+                } else {
+                    newBoCustAttr.setState(StateConstant.STATE_KIP);
+                }
+            }
+            boCustAttrArray.add(newBoCustAttr);
+        }
+
+        returnJson.getJSONObject("data").put("boCustAttr",JSONObject.toJSONString(boCustAttrArray));
+
+        return returnJson.toJSONString();
+
+    }
+    /**
+     * 澶勭悊boCust 鑺傜偣
+     * @throws Exception
+     */
+    public void doProcessBoCust(JSONObject userInfoJson,JSONObject paramJson,Map custIdKey, JSONObject resultInfo) throws Exception{
+
+        if(userInfoJson.containsKey("boCust")){
+            JSONArray boCusts = userInfoJson.getJSONArray("boCust");
+            JSONObject boCustObj = new JSONObject();
+            boCustObj.put("boCust",boCusts);
+            String returnSaveBoCust = this.soBoCust(boCustObj.toJSONString(),custIdKey);
+
+            if(!ProtocolUtil.validateReturnJson(returnSaveBoCust,paramJson)){
+
+                throw new RuntimeException("淇濆瓨 bo_cust 澶辫触锛�"+boCustObj+(paramJson != null
+                        && paramJson.containsKey("RESULT_MSG")?paramJson.getString("RESULT_MSG"):"鏈煡寮傚父"));
+            }
+
+            resultInfo = paramJson.getJSONObject("RESULT_INFO");
+        }
+    }
+
+    /**
+     * 澶勭悊boCustAttr 鑺傜偣
+     * @param userInfoJson
+     * @param paramJson
+     * @param custIdKey
+     * @param resultInfo
+     */
+    public void doProcessBoCustAttr(JSONObject userInfoJson,JSONObject paramJson,Map custIdKey, JSONObject resultInfo) throws Exception{
+        if(userInfoJson.containsKey("boCustAttr")){
+
+            JSONArray boCustAttrs = userInfoJson.getJSONArray("boCustAttr");
+            //棣栧厛瀵筩ustId 杩涜澶勭悊
+            if(custIdKey != null && custIdKey.size() > 0 ){
+                for(int boCustAttrIndex = 0 ; boCustAttrIndex < boCustAttrs.size();boCustAttrIndex++){
+                    JSONObject boCustAttr = boCustAttrs.getJSONObject(boCustAttrIndex);
+                    boCustAttr.put("custId",custIdKey.get("custId"+boCustAttr.getString("custId")));
+                }
+            }
+            JSONObject boCustAttrObj = new JSONObject();
+            boCustAttrObj.put("boCustAttr",boCustAttrs);
+            String returnSaveBoCustAttr = soBoCustAttr(boCustAttrObj.toJSONString());
+
+            if(!ProtocolUtil.validateReturnJson(returnSaveBoCustAttr,paramJson)){
+
+                throw new RuntimeException("淇濆瓨 bo_cust 澶辫触锛�"+boCustAttrObj+(paramJson != null
+                        && paramJson.containsKey("RESULT_MSG")?paramJson.getString("RESULT_MSG"):"鏈煡寮傚父"));
+            }
+        }
+    }
+
+    /**
+     * 浣滃簾 boCust 淇℃伅
+     * @param data
+     * @throws Exception
+     */
+    public void doDeleteBoCust(JSONObject data) throws Exception{
+
+
+        Cust deleteCust = null;
+        //鏍规嵁boId 鏌ヨbo_cust 琛紝鏄惁鏈夋暟鎹紝娌℃暟鎹洿鎺ヨ繑鍥�
+        BoCust boCust = new BoCust();
+
+        boCust.setBoId(data.getString("boId"));
+
+       List<BoCust> boCusts =  iUserServiceDao.queryBoCust(boCust);
+
+       //Assert.isOne(boCusts,"鍦ㄨ〃bo_cust涓湭鎵惧埌boId 涓篬"+data.getString("boId")+"]鐨勬暟鎹� 鎴栨湁澶氭潯鏁版嵁锛岃妫�鏌�");
+        if(boCusts == null || boCusts.size() < 1){
+            LoggerEngine.error("褰撳墠娌℃湁鏌ュ埌鏁颁负 "+data+"璇锋鏌ユ暟鎹�");
+            return;
+        }
+       //鍦ㄨ繃绋嬭〃涓ˉ涓�鏉′綔搴熺殑鏁版嵁锛岀劧鍚庢牴鎹産oId鐨勫姩浣滃瀹炰緥鏁版嵁杩涜澶勭悊
+
+        boCust.setCustId(boCusts.get(0).getCustId());
+        boCust.setBoId("");
+        //鏌ヨ鍑烘墍鏈塩ustId 涓�鏍风殑鏁版嵁
+        List<BoCust> boCustAll =  iUserServiceDao.queryBoCust(boCust);
+
+        Assert.isNull(boCustAll,"褰撳墠娌℃湁鏌ュ埌custId 涓� "+boCusts.get(0).getCustId()+"璇锋鏌ユ暟鎹�");
+
+        boCust = boCusts.get(0);
+
+        BoCust newBoCust = new BoCust();
+        newBoCust.setBoId(data.getString("newBoId"));
+        newBoCust.setCustId(boCust.getCustId());
+        newBoCust.setState("DEL");
+        int saveBoCustFlag = iUserServiceDao.saveDataToBoCust(newBoCust);
+
+        if(saveBoCustFlag < 1){
+            throw new RuntimeException("鍚慴o_cust琛ㄤ腑淇濆瓨鏁版嵁澶辫触锛宐oCust="+JSONObject.toJSONString(newBoCust));
+        }
+
+        //棣栧厛鍒犻櫎瀹炰緥鏁版嵁
+        deleteCust = new Cust();
+        deleteCust.setCustId(boCust.getCustId());
+        if(iUserServiceDao.deleteDataToCust(deleteCust) < 1){
+            throw new RuntimeException("鍒犻櫎cust瀹炰緥鏁版嵁澶辫触"+JSONObject.toJSONString(deleteCust));
+        }
+        //濡傛灉鏈夊鏉℃暟鎹紝鍒欐仮澶� 鍓嶄竴鏉℃暟鎹俊鎭紝杩欒竟瀛樺湪bug 濡傛灉涓婁竴鏉$殑鏁版嵁娌℃湁鍒嗚浠ュ墠鏁版嵁鐨勬儏鍐典笅浼氭湁闂锛�
+        // 鎵�浠ユ垜浠殑鍘熷垯鏄啀鏇存柊鎴栧垹闄ゆ暟鎹椂涓�瀹氳鍦ㄨ繃绋嬭〃涓繚瀛樺畬鏁存槸瀹炰緥鏁版嵁淇℃伅
+        if(boCustAll.size() > 1){
+            Cust oldCust = boCustAll.get(1).convert();
+            if(iUserServiceDao.saveDataToCust(oldCust)<1 ){
+                throw new RuntimeException("cust 琛ㄦ仮澶嶈�佹暟鎹俊鎭け璐ワ紝cust 涓猴細"+JSONObject.toJSONString(oldCust));
+            }
+        }
+    }
+
+    /**
+     * 鍒犻櫎 bo_cust_attr
+     * @param data
+     * @throws Exception
+     */
+    public void doDeleteBoCustAttr(JSONObject data) throws Exception{
+
+        BoCustAttr boCustAttrTmp = new BoCustAttr();
+
+        boCustAttrTmp.setBoId(data.getString("boId"));
+
+        List<BoCustAttr> boCustAttrs = iUserServiceDao.queryBoCustAttr(boCustAttrTmp);
+
+        if(boCustAttrs == null || boCustAttrs.size() < 1){
+            LoggerEngine.error("褰撳墠娌℃湁鏌ュ埌鏁颁负 "+data+"璇锋鏌ユ暟鎹�");
+            return;
+        }
+
+        boCustAttrTmp.setBoId("");
+        boCustAttrTmp.setCustId(boCustAttrs.get(0).getCustId());
+
+        List<BoCustAttr> boCustAttrsTmps = iUserServiceDao.queryBoCustAttr(boCustAttrTmp);
+
+        Assert.isNull(boCustAttrsTmps,"褰撳墠娌℃湁鏌ュ埌custId 涓� "+boCustAttrs.get(0).getCustId()+"璇锋鏌ユ暟鎹�");
+
+        //鑾峰彇涓婁竴娆℃墍鏈夌殑灞炴��
+
+        List<BoCustAttr> preBoCustAttrTmps = getPreBoCustAttrs(boCustAttrsTmps);
+
+        //淇濆瓨杩囩▼琛�
+        for(BoCustAttr boCustAttr : boCustAttrs){
+            boCustAttr.setBoId("newBoId");
+            boCustAttr.setState("DEL");
+            if(iUserServiceDao.saveDataToBoCustAttr(boCustAttr) < 1){
+                throw new RuntimeException("淇濆瓨鏁版嵁澶辫触锛屼繚瀛樻暟鎹负boCustAttr = "+ JSONObject.toJSONString(boCustAttr));
+            }
+        }
+
+        //鍒犻櫎瀹炰緥鏁版嵁 杩欓噷鎬濊矾鏄紝鍒犻櫎瀹炰緥鏁版嵁涓暟鎹紝灏嗕笂涓�娆DD鏁版嵁閲嶆柊鍐欎竴閬�
+        CustAttr custAttrTmp = new CustAttr();
+        custAttrTmp.setCustId(boCustAttrs.get(0).getCustId());
+        if(iUserServiceDao.deleteDataToCustAttr(custAttrTmp) < 1){
+            throw new RuntimeException("鍒犻櫎CustAttr 瀹炰緥鏁版嵁澶辫触,鏁版嵁涓猴細"+JSONObject.toJSONString(custAttrTmp));
+        }
+
+        for(BoCustAttr boCustAttr : preBoCustAttrTmps){
+            if("ADD".equals(boCustAttr.getState())){
+                if(iUserServiceDao.deleteDataToCustAttr(boCustAttr.convert()) < 1){
+                    throw new  RuntimeException("澶嶅師鍘熷鏁版嵁澶辫触锛屾暟鎹负锛�" + JSONObject.toJSONString(boCustAttr));
+                }
+            }
+        }
+
+    }
+
+    /**
+     * 鑾峰彇涓婁笂涓�娆$殑鎿嶄綔
+     * @param boCustAttrs
+     * @return
+     */
+    private List<BoCustAttr> getPreBoCustAttrs(List<BoCustAttr> boCustAttrs){
+
+        String firstBoId = boCustAttrs.get(0).getBoId();
+        String preBoId = "";
+        List<BoCustAttr> preBoCustAttrs = new ArrayList<BoCustAttr>();
+        for(BoCustAttr boCustAttr : boCustAttrs){
+            if(!firstBoId.equals(boCustAttr.getBoId())){
+                if(!preBoId.equals(boCustAttr.getBoId()) && !"".equals(preBoId)){
+                    break;
+                }
+                preBoId = boCustAttr.getBoId();
+                preBoCustAttrs.add(boCustAttr);
+            }
+        }
+        return preBoCustAttrs;
+    }
+
+
+    @Override
+    public JSONObject service(BusinessServiceDataFlow businessServiceDataFlow) throws SMOException {
+        try {
+            Assert.hasLength(businessServiceDataFlow.getbId(),"bId 涓嶈兘涓虹┖");
+
+            BusinessServiceDataFlowEventPublishing.multicastEvent(businessServiceDataFlow);
+            Assert.notEmpty(businessServiceDataFlow.getResJson(),"鐢ㄦ埛鏈嶅姟["+businessServiceDataFlow.getCurrentBusiness().getServiceCode()+"]娌℃湁杩斿洖鍐呭");
+        } catch (Exception e) {
+            logger.error("鐢ㄦ埛淇℃伅澶勭悊寮傚父",e);
+            throw new SMOException(ResponseConstant.RESULT_PARAM_ERROR,"鐢ㄦ埛淇℃伅澶勭悊寮傚父"+e.getMessage());
+        }finally {
+            if(businessServiceDataFlow == null){
+                return null;
+            }
+
+            //杩欓噷璁板綍鏃ュ織
+            Date endDate = DateUtil.getCurrentDate();
+
+            businessServiceDataFlow.setEndDate(endDate);
+            //娣诲姞鑰楁椂
+            DataFlowFactory.addCostTime(businessServiceDataFlow, "service", "涓氬姟澶勭悊鎬昏�楁椂",
+                    businessServiceDataFlow.getStartDate(), businessServiceDataFlow.getEndDate());
+            //淇濆瓨鑰楁椂
+            saveCostTimeLogMessage(businessServiceDataFlow);
+            //淇濆瓨鏃ュ織
+            saveLogMessage(businessServiceDataFlow);
+        }
+        return businessServiceDataFlow.getResJson();
+    }
+
+
+    /**
+     * 淇濆瓨鏃ュ織淇℃伅
+     * @param businessServiceDataFlow
+     */
+    private void saveLogMessage(BusinessServiceDataFlow businessServiceDataFlow){
+
+        try{
+            if(MappingConstant.VALUE_ON.equals(MappingCache.getValue(MappingConstant.KEY_LOG_ON_OFF))){
+                for(DataFlowLog dataFlowLog :businessServiceDataFlow.getLogDatas()) {
+                    KafkaFactory.sendKafkaMessage(KafkaConstant.TOPIC_LOG_NAME, "", JSONObject.toJSONString(dataFlowLog));
+                }
+            }
+        }catch (Exception e){
+            logger.error("鎶ラ敊鏃ュ織鍑洪敊浜嗭紝",e);
+        }
+    }
+
+    /**
+     * 淇濆瓨鑰楁椂淇℃伅
+     * @param businessServiceDataFlow
+     */
+    private void saveCostTimeLogMessage(BusinessServiceDataFlow businessServiceDataFlow){
+        try{
+            if(MappingConstant.VALUE_ON.equals(MappingCache.getValue(MappingConstant.KEY_COST_TIME_ON_OFF))){
+                List<DataFlowLinksCost> dataFlowLinksCosts = businessServiceDataFlow.getLinksCostDates();
+                JSONObject costDate = new JSONObject();
+                JSONArray costDates = new JSONArray();
+                JSONObject newObj = null;
+                for(DataFlowLinksCost dataFlowLinksCost : dataFlowLinksCosts){
+                    newObj = JSONObject.parseObject(JSONObject.toJSONString(dataFlowLinksCost));
+                    newObj.put("dataFlowId",businessServiceDataFlow.getDataFlowId());
+                    newObj.put("transactionId",businessServiceDataFlow.getTransactionId());
+                    costDates.add(newObj);
+                }
+                costDate.put("costDates",costDates);
+
+                KafkaFactory.sendKafkaMessage(KafkaConstant.TOPIC_COST_TIME_LOG_NAME,"",costDate.toJSONString());
+            }
+        }catch (Exception e){
+            logger.error("鎶ラ敊鏃ュ織鍑洪敊浜嗭紝",e);
+        }
     }
 
     public IPrimaryKeyService getiPrimaryKeyService() {
@@ -158,4 +840,12 @@
     public void setiPrimaryKeyService(IPrimaryKeyService iPrimaryKeyService) {
         this.iPrimaryKeyService = iPrimaryKeyService;
     }
+
+    public IUserServiceDao getiUserServiceDao() {
+        return iUserServiceDao;
+    }
+
+    public void setiUserServiceDao(IUserServiceDao iUserServiceDao) {
+        this.iUserServiceDao = iUserServiceDao;
+    }
 }

--
Gitblit v1.8.0