From 2d8b912281b8a203501e5a92dba450c9528a7a0d Mon Sep 17 00:00:00 2001
From: wuxw7 <wuxw7@asiainfo.com>
Date: 星期五, 15 九月 2017 16:11:06 +0800
Subject: [PATCH] 订单受理异常情况撤单逻辑,订单查询 逻辑优化完成

---
 OrderService/src/main/java/com/java110/order/smo/impl/OrderServiceSMOImpl.java |  333 +++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 307 insertions(+), 26 deletions(-)

diff --git a/OrderService/src/main/java/com/java110/order/smo/impl/OrderServiceSMOImpl.java b/OrderService/src/main/java/com/java110/order/smo/impl/OrderServiceSMOImpl.java
index 6aea826..f4964b5 100644
--- a/OrderService/src/main/java/com/java110/order/smo/impl/OrderServiceSMOImpl.java
+++ b/OrderService/src/main/java/com/java110/order/smo/impl/OrderServiceSMOImpl.java
@@ -4,18 +4,20 @@
 import com.alibaba.fastjson.JSONObject;
 import com.java110.common.constant.ActionTypeConstant;
 import com.java110.common.constant.AttrCdConstant;
+import com.java110.common.constant.CommonConstant;
 import com.java110.common.log.LoggerEngine;
 import com.java110.common.util.ProtocolUtil;
 import com.java110.config.properties.EventProperties;
 import com.java110.core.base.smo.BaseServiceSMO;
 import com.java110.core.context.AppContext;
-import com.java110.core.event.AppEventPublishing;
+import com.java110.event.AppEventPublishing;
 import com.java110.entity.order.BusiOrder;
 import com.java110.entity.order.BusiOrderAttr;
 import com.java110.entity.order.OrderList;
 import com.java110.entity.order.OrderListAttr;
 import com.java110.feign.base.IPrimaryKeyService;
 import com.java110.order.dao.IOrderServiceDao;
+import com.java110.order.mq.DeleteOrderInfoProducer;
 import com.java110.order.smo.IOrderServiceSMO;
 import org.apache.commons.lang.math.NumberUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -24,10 +26,7 @@
 import org.springframework.transaction.annotation.Transactional;
 import com.java110.common.util.Assert;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * 璁㈠崟鏈嶅姟涓氬姟閫昏緫澶勭悊瀹炵幇绫�
@@ -46,16 +45,98 @@
     @Autowired
     EventProperties eventProperties;
 
+    @Autowired
+    DeleteOrderInfoProducer deleteOrderInfoProducer;
+
     /**
      * 鏍规嵁璐墿杞D 鎴栬�� 澶栭儴绯荤粺ID 鎴栬�� custId 鎴栬�� channelId 鏌ヨ璁㈠崟淇℃伅
+     *
+     * 杩斿洖鎶ユ枃鏍煎紡濡備笅锛�
+     *
+     * {
+
+     "orderList": [{
+
+     "orderListAttrs": [{路路路}],
+
+     "busiOrder": [
+
+     {
+
+     "data": {
+
+     "boCust": [{路路路}],
+
+     "boCustAttr": [ {路路路}]
+
+     },
+
+     "busiObj": {路路路路},
+
+     "busiOrderAttrs": [{路路路}]
+
+     }
+
+     ],
+
+     "orderListInfo": {路路路}
+
+     }]
+     }
+
      * @param orderList
      * @return
      */
     @Override
     public String queryOrderInfo(OrderList orderList) throws Exception{
+        return queryOrderInfo(orderList,true,false);
+    }
+
+    /**
+     * 鏍规嵁璐墿杞D 鎴栬�� 澶栭儴绯荤粺ID 鎴栬�� custId 鎴栬�� channelId 鏌ヨ璁㈠崟淇℃伅
+     *
+     * 杩斿洖鎶ユ枃鏍煎紡濡備笅锛�
+     *
+     * {
+
+         "orderList": [{
+
+         "orderListAttrs": [{路路路}],
+
+         "busiOrder": [
+
+             {
+
+                 "data": {
+
+                 "boCust": [{路路路}],
+
+                 "boCustAttr": [ {路路路}]
+
+                 },
+
+                 "busiObj": {路路路路},
+
+                 "busiOrderAttrs": [{路路路}]
+
+             }
+
+         ],
+
+         "orderListInfo": {路路路}
+
+         }]
+     }
+
+     * @param orderList
+     * @param isQueryDataInfo 鏄� 鏌ヨdata鑺傜偣 鍚︿笉鏌ヨdata鑺傜偣
+     * @return
+     */
+    @Override
+    public String queryOrderInfo(OrderList orderList,Boolean isQueryDataInfo,Boolean isNeedDelete) throws Exception{
 
 
-        List<OrderList> orderLists = iOrderServiceDao.queryOrderListAndAttr(orderList);
+        /*List<OrderList> orderLists = iOrderServiceDao.queryOrderListAndAttr(orderList);
         //
         JSONArray orderListsArray = new JSONArray();
         for (OrderList orderListTmp : orderLists){
@@ -73,9 +154,104 @@
         }
 
         JSONObject orderListTmpO = new JSONObject();
-        orderListTmpO.put("orderLists",orderListsArray);
+        orderListTmpO.put("orderList",orderListsArray);*/
 
-        return ProtocolUtil.createResultMsg(ProtocolUtil.RETURN_MSG_SUCCESS,"鏌ヨ鎴愬姛",orderListTmpO);
+        List<OrderList> orderLists = iOrderServiceDao.queryOrderListAndAttr(orderList);
+        //澶氫釜璐墿杞﹀皝瑁�
+        JSONArray orderListsArray = new JSONArray();
+
+        JSONObject orderListTmpJson = null;
+
+        for(OrderList orderListTmp : orderLists){
+            orderListTmpJson = new JSONObject();
+            //灏佽orderListAttrs
+            orderListTmpJson.put("orderListAttrs",JSONArray.parseArray(JSONObject.toJSONString(orderListTmp.getOrderListAttrs())));
+
+            orderListTmpJson.put("orderListInfo",JSONObject.parseObject(JSONObject.toJSONString(orderListTmp)).remove("orderListAttrs"));
+
+
+            BusiOrder busiOrderTmp = new BusiOrder();
+            busiOrderTmp.setBoId(orderListTmp.getOlId());
+
+            List<BusiOrder> busiOrders = iOrderServiceDao.queryBusiOrderAndAttr(busiOrderTmp);
+
+            //灏佽busiObj
+            JSONArray busiOrderTmpArray = new JSONArray();
+
+            /**
+             * [
+
+             {
+
+             "data": {
+
+             "boCust": [{路路路}],
+
+             "boCustAttr": [ {路路路}]
+
+             },
+
+             "busiObj": {路路路路},
+
+             "busiOrderAttrs": [{路路路}]
+
+             }
+             */
+            JSONObject busiOrderTmpJson = null;
+            for(BusiOrder busiOrderTmp1 : busiOrders){
+                busiOrderTmpJson = new JSONObject();
+
+                //灏佽busiOrderAttrs
+
+                busiOrderTmpJson.put("busiOrderAttrs",JSONArray.parseArray(JSONObject.toJSONString(busiOrderTmp1.getBusiOrderAttrs())));
+
+
+                //灏佽busiObj
+
+                busiOrderTmpJson.put("busiObj",JSONObject.parseObject(JSONObject.toJSONString(busiOrderTmp1)).remove("busiOrderAttrs"));
+
+                //灏佽data 鑺傜偣
+                if(isQueryDataInfo){
+                    busiOrderTmpJson.put("data",queryDataInfo(busiOrderTmp1,isNeedDelete));
+                }
+
+
+                busiOrderTmpArray.add(busiOrderTmpJson);
+            }
+
+
+            //鍒嗚busiOrder
+
+            orderListTmpJson.put("busiOrder",busiOrderTmpArray);
+
+        }
+        orderListsArray.add(orderListTmpJson);
+
+        JSONObject orderListJson = new JSONObject();
+        orderListJson.put("orderList",orderListsArray);
+
+
+        return ProtocolUtil.createResultMsg(ProtocolUtil.RETURN_MSG_SUCCESS,"鏌ヨ鎴愬姛",orderListJson);
+    }
+
+    /**
+     * 鏌ヨdata淇℃伅
+     * @return
+     */
+    private JSONObject queryDataInfo(BusiOrder busiOrder,Boolean isNeedDelete) throws Exception{
+        //璐墿杞﹁鍗曠被鍨�
+        String actionTypeCd = busiOrder.getActionTypeCd();
+
+        //鍒涘缓涓婁笅鏂囧璞�
+        AppContext context = createApplicationContext();
+
+        //prepareContext(context, busiOrder);
+        if(isNeedDelete) {
+            return AppEventPublishing.queryDataInfoEvent(context, busiOrder);
+        }else {
+            return AppEventPublishing.queryNeedDeleteDataInfoEvent(context,busiOrder);
+        }
+
     }
 
     /**
@@ -103,6 +279,7 @@
         if(StringUtils.isBlank(olId) || olId.startsWith("-") ){
             olId = this.queryPrimaryKey(iPrimaryKeyService,"OL_ID");
             orderList.setOlId(olId);
+            orderListTmp.put("olId",olId);
         }
 
         //杩欓噷淇濆瓨璐墿杞�
@@ -213,28 +390,20 @@
 
             datasTmp.put(actionTypeCd,dataJsonTmp);
 
-            /*
-            try {
-                //鍙戝竷浜嬩欢
-                AppEventPublishing.multicastEvent(actionTypeCd,orderInfo.toJSONString(), data.toJSONString(),orderListTmp.getString("asyn"));
-            }catch (Exception e){
-                //杩欓噷琛ュ伩浜嬬墿
-                throw e;
-            }*/
-
         }
 
         //鍒涘缓涓婁笅鏂囧璞�
         AppContext context = createApplicationContext();
 
         prepareContext(context, datasTmp);
-        try {
+       /* try {*/
             //鍙戝竷浜嬩欢
             AppEventPublishing.multicastEvent(context,datasTmp,orderListTmp.getString("asyn"));
-        }catch (Exception e){
-            //杩欓噷琛ュ伩浜嬬墿
+       /* }catch (Exception e){
+            //杩欓噷琛ュ伩浜嬬墿,杩欓噷鍙戝竷骞挎挱
+            compensateTransactional(datasTmp);
             throw e;
-        }
+        }*/
         return ProtocolUtil.createResultMsg(ProtocolUtil.RETURN_MSG_SUCCESS,"鎴愬姛",JSONObject.parseObject(JSONObject.toJSONString(orderList)));
     }
 
@@ -366,23 +535,84 @@
             busiOrderAttr.setBoId(newBoId);
             busiOrderAttr.setAttrCd(AttrCdConstant.BUSI_ORDER_ATTR_10000001);
             busiOrderAttr.setValue(needDeleteBoIdMap.get("boId"));
+            needDeleteBoIdMap.put("newBoId",newBoId);
 
             saveBusiOrderFlag =  iOrderServiceDao.saveDataToBusiOrderAttr(busiOrderAttr);
             if(saveBusiOrderFlag < 1){
                 throw new RuntimeException("鎾ゅ崟锛屼綔搴熻鍗曞け璐�,淇濆瓨璁㈠崟椤逛俊鎭睘鎬уけ璐�"+JSONObject.toJSONString(busiOrderAttr));
             }
 
-
+            //灏佽鏁版嵁
+            processDeleteOrderByActionTypeCd(needDeleteBoIdMap,datasTmp);
 
         }
 
         //杩欓噷琛ュ厖 order_list_attr涓� 缂栫爜涓� 10000002 鐨勬暟鎹紝瑕佷綔搴� 璁㈠崟璐墿杞︿俊鎭紝鐪熸浣滃簾鍗曞瓙鏄互 busi_order_attr 涓殑boId 涓轰富
+        Assert.hasSize(datasTmp,"褰撳墠娌℃湁鍙綔搴熺殑璁㈠崟锛岃鏍稿疄");
+        //鐢变簬鎾ゅ崟锛屼綔搴熻鍗曟垜浠彧鏀寔涓�涓喘鐗╄溅鎿嶄綔
+        Set keys = datasTmp.keySet();
+        Object key =  keys.toArray()[0];
+        Assert.isNull(datasTmp.get(key).getJSONObject(0),"olId","鏁版嵁閿欒锛岄渶瑕佷綔搴熺殑璁㈠崟鐨勭涓�涓妭鐐逛负绌猴紝鎴栦笉鍖呭惈olId鑺傜偣锛岃鏍告煡"+datasTmp);
+        String oldOlId = datasTmp.get(key).getJSONObject(0).getString("olId");
+
+
+        OrderListAttr orderListAttr = new OrderListAttr();
+        orderListAttr.setOlId(olId);
+        orderListAttr.setAttrCd(AttrCdConstant.ORDER_LIST_ATTR_10000002);
+        orderListAttr.setValue(oldOlId);
+        saveOrderListFlag = iOrderServiceDao.saveDataToOrderListAttr(orderListAttr);
+        if(saveOrderListFlag < 1){
+            throw new RuntimeException("淇濆瓨璐墿杞﹀睘鎬т俊鎭け璐�"+JSONObject.toJSONString(orderListAttr));
+        }
 
 
 
 
+        //鍒涘缓涓婁笅鏂囧璞�
+        AppContext context = createApplicationContext();
 
-        return null;
+        prepareContext(context, datasTmp);
+        try {
+            //鍙戝竷浜嬩欢
+            AppEventPublishing.multicastEvent(context,datasTmp,orderListTmp.getString("asyn"));
+        }catch (Exception e){
+            //杩欓噷琛ュ伩浜嬬墿
+            compensateTransactional(datasTmp);
+            throw e;
+        }
+        return ProtocolUtil.createResultMsg(ProtocolUtil.RETURN_MSG_SUCCESS,"鎴愬姛",JSONObject.parseObject(JSONObject.toJSONString(orderList)));
+
+    }
+
+    /**
+     * 鎾ゅ崟澶勭悊 add by wuxw 2017-09-10 22:35
+     * 淇敼浠ュ墠閫昏緫锛屾牴鎹畂lId 鍘荤洰鏍囩郴缁熸煡璇㈤渶瑕佹煡璇㈡挙鍗曡鍗曠粍瑁呮姤鏂�
+     * @param orderInfo
+     * @throws Exception
+     */
+    public void soDeleteOrder(JSONObject orderInfo) throws Exception{
+
+        //1.0 璐墿杞︿俊鎭牎楠屽鐞�,璧拌鍗曞彈鐞嗗繀椤昏鏈夎喘鐗╄溅淇℃伅鍜岃鍗曢」淇℃伅
+        if(!orderInfo.containsKey("orderListInfo") || !orderInfo.containsKey("busiOrder")){
+            return;
+        }
+
+        JSONObject orderListTmp = orderInfo.getJSONObject("orderListInfo");
+
+        OrderList orderList = JSONObject.parseObject(orderListTmp.toJSONString(),OrderList.class);
+
+        String olId = orderList.getOlId();
+        //鐢熸垚olId
+        if(StringUtils.isBlank(olId) || olId.startsWith("-") ){
+           return ;
+        }
+
+        // 鏌ヨ璐墿杞︿俊鎭紝璁㈠崟椤逛俊鎭�
+        String oldOrderInfo = this.queryOrderInfo(orderList,true,true);
+
+
+        //閲嶆柊鍙戣捣鎾ゅ崟璁㈠崟
+        orderDispatch(JSONObject.parseObject(oldOrderInfo));
     }
 
     /**
@@ -454,10 +684,10 @@
         Assert.isNull(datasTmp,"processDeleteOrderByActionTypeCd 鏂规硶鐨勫弬鏁� datasTmp 涓虹┖锛�");
 
         // 濡傛灉杩欎袱涓腑鏈変竴涓负绌猴紝鍒欎粠搴撲腑鏌ヨ
-        if(StringUtils.isBlank(needDeleteBoIdMap.get("olId")) || StringUtils.isBlank(needDeleteBoIdMap.get("actionTypeCd"))){
+        if(StringUtils.isBlank(needDeleteBoIdMap.get("newBoId")) || StringUtils.isBlank(needDeleteBoIdMap.get("actionTypeCd"))){
             BusiOrder busiOrderTmp = new BusiOrder();
             busiOrderTmp.setBoId(needDeleteBoIdMap.get("boId"));
-            //杩欓噷鍙湁涓�鏉″叾浠栵紝鍒欐姏鍑哄紓甯�
+            //杩欓噷鍙湁涓�鏉″叾浠栵紝鍚﹀垯鎶涘嚭寮傚父
             List<BusiOrder> oldBusiOrders =  iOrderServiceDao.queryBusiOrderAndAttr(busiOrderTmp);
 
             if(oldBusiOrders == null || oldBusiOrders.size() != 1){
@@ -467,7 +697,7 @@
             //鍥炲啓鏁版嵁
 
             needDeleteBoIdMap.put("olId",oldBusiOrders.get(0).getOlId());
-            needDeleteBoIdMap.put("actionTypeCd",oldBusiOrders.get(0).getActionTypeCd());
+            needDeleteBoIdMap.put("actionTypeCd",oldBusiOrders.get(0).getActionTypeCd()+ CommonConstant.SUFFIX_DELETE_ORDER);
         }
 
         String actionTypeCd = needDeleteBoIdMap.get("actionTypeCd");
@@ -480,6 +710,57 @@
         }
         dataJsonTmp.add(JSONObject.parseObject(JSONObject.toJSONString(needDeleteBoIdMap)));
         datasTmp.put(actionTypeCd,dataJsonTmp);
+
+        //deleteOrderInfoProducer.send(datasTmp.toString());
+    }
+
+
+    /**
+     * 琛ュ伩浜嬬墿锛岃繖閲屼笉鐢ㄦ墜宸ヤ綔搴� 璐墿杞︿俊鎭紝浜嬬墿浼氳嚜鍔ㄥ洖閫�鎺夛紝杩欓噷杩欓渶瑕佹墜宸ョ粰鍏朵粬鐨勭郴缁熷彂甯冧簨鐗╁洖閫�
+     *
+     * { 'data': [
+
+     {
+     'boId': '222222',
+     'actionTypeCd': 'C1',
+     'oldBoId':'11111'
+     },
+     {
+     'boId': '222222',
+     'actionTypeCd': 'M1',
+     'oldBoId':'11111'
+     },
+     {
+     'boId': '222222',
+     'actionTypeCd': 'C1',
+     'oldBoId':'11111'
+     }
+     ]
+     }
+     * @param datasTmp {C1={'data':[{}]}}
+     */
+    private void compensateTransactional(Map<String,JSONArray> datasTmp){
+
+        Set<String> keys = datasTmp.keySet();
+
+        JSONArray compensateDatas = new JSONArray();
+
+        JSONObject compensateBoId = null;
+        for(String key : keys){
+            JSONArray datas = datasTmp.get(key);
+
+            for(int dataIndex = 0 ; dataIndex <datas.size() ; dataIndex++){
+                compensateBoId.put("boId",datas.getJSONObject(dataIndex).getString("boId"));
+                compensateBoId.put("actionTypeCd",key);
+                compensateDatas.add(compensateBoId);
+            }
+        }
+
+        JSONObject compensateData = new JSONObject();
+
+        compensateData.put("data",compensateDatas);
+
+        deleteOrderInfoProducer.send(datasTmp.toString());
     }
 
     public IPrimaryKeyService getiPrimaryKeyService() {

--
Gitblit v1.8.0