Explorar el Código

优化代码 完成business 过程

java110 hace 4 años
padre
commit
ed7d0de6a0

+ 12 - 0
java110-db/src/main/resources/mapper/dev/DevServiceDAOImplMapper.xml

@@ -53,4 +53,16 @@
         ]]>
     </select>
 
+    <select id="getBusinessTableHisAll" resultType="com.java110.dto.businessTableHis.BusinessTableHisDto">
+        <![CDATA[
+            SELECT
+                t.action_obj,t.action_obj actionObj,t.business_type_cd,t.business_type_cd
+                businessTypeCd,t.his_id,t.his_id hisId,t.action,t.remark,t.status_cd,t.status_cd
+                statusCd,t.action_obj_his,t.action_obj_his actionObjHis
+            from
+                c_business_table_his t
+            where t.status_cd = '0'
+        ]]>
+    </select>
+
 </mapper>

+ 89 - 0
java110-utils/src/main/java/com/java110/utils/cache/BusinessTableHisCache.java

@@ -0,0 +1,89 @@
+package com.java110.utils.cache;
+
+import com.java110.dto.businessTableHis.BusinessTableHisDto;
+import com.java110.utils.util.SerializeUtil;
+import redis.clients.jedis.Jedis;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 映射缓存工具类
+ * Created by wuxw on 2018/4/14.
+ */
+public class BusinessTableHisCache extends BaseCache {
+
+    //后缀 用来刷缓存时删除 所有以这个为后缀的数据
+    public final static String DEFAULT_BUSINESS_TABLE_HIS = "JAVA110_BUSINESS_TABLE_HIS";
+
+
+    /**
+     * 获取  databus
+     *
+     * @return
+     */
+    public static List<BusinessTableHisDto> getBusinessTableHiss() {
+        Jedis redis = null;
+        try {
+            redis = getJedis();
+            return SerializeUtil.unserializeList(redis.get((DEFAULT_BUSINESS_TABLE_HIS).getBytes()), BusinessTableHisDto.class);
+        } finally {
+            if (redis != null) {
+                redis.close();
+            }
+        }
+    }
+
+    /**
+     * 获取  databus
+     *
+     * @return
+     */
+    public static List<BusinessTableHisDto> getBusinessTableHisDtos(String action, String actionObj) {
+        List<BusinessTableHisDto> businessTableHisDtoDtoDtos = getBusinessTableHiss();
+
+        List<BusinessTableHisDto> tmpBusinessTableHisDtos = new ArrayList<>();
+
+        for (BusinessTableHisDto businessTableHisDtoDto : businessTableHisDtoDtoDtos) {
+            if (action.equals(businessTableHisDtoDto.getAction()) && actionObj.equals(businessTableHisDtoDto.getActionObj())) {
+                tmpBusinessTableHisDtos.add(businessTableHisDtoDto);
+            }
+        }
+        return tmpBusinessTableHisDtos;
+    }
+
+    /**
+     * 获取  databus
+     *
+     * @return
+     */
+    public static BusinessTableHisDto getBusinessTableHisDto(String action, String actionObj) {
+        List<BusinessTableHisDto> businessTableHisDtoDtoDtos = getBusinessTableHiss();
+
+        for (BusinessTableHisDto businessTableHisDtoDto : businessTableHisDtoDtoDtos) {
+            if (action.equals(businessTableHisDtoDto.getAction()) && actionObj.equals(businessTableHisDtoDto.getActionObj())) {
+                return businessTableHisDtoDto;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 保存list 数据
+     *
+     * @param businessTableHisDtoDtoDtos
+     */
+    public static void setValue(List<BusinessTableHisDto> businessTableHisDtoDtoDtos) {
+        Jedis redis = null;
+        try {
+            redis = getJedis();
+            redis.set((DEFAULT_BUSINESS_TABLE_HIS).getBytes(), SerializeUtil.serializeList(businessTableHisDtoDtoDtos));
+        } finally {
+            if (redis != null) {
+                redis.close();
+            }
+        }
+    }
+
+
+}

+ 5 - 0
java110-utils/src/main/java/com/java110/utils/constant/CommonConstant.java

@@ -128,6 +128,11 @@ public class CommonConstant {
      */
     public final static String CACHE_DATABUS = "DATABUS";
 
+    /**
+     * 映射 databus
+     */
+    public final static String CACHE_BUSINESS_TABLE_HIS = "BUSINESS_TABLE_HIS";
+
 
 
     /**

+ 4 - 4
service-dev/src/main/java/com/java110/dev/DevServiceApplicationStart.java

@@ -95,8 +95,8 @@ public class DevServiceApplicationStart {
         //因为好多朋友启动时 不加 参数-Dcache 所以启动时检测 redis 中是否存在 java110_hc_version
         String mapping = MappingCache.getValue("java110_hc_version");
         if (StringUtil.isEmpty(mapping)) {
-            IDevServiceCacheSMO centerServiceCacheSMO = (IDevServiceCacheSMO) ApplicationContextFactory.getBean("devServiceCacheSMOImpl");
-            centerServiceCacheSMO.startFlush();
+            IDevServiceCacheSMO devServiceCacheSMOImpl = (IDevServiceCacheSMO) ApplicationContextFactory.getBean("devServiceCacheSMOImpl");
+            devServiceCacheSMOImpl.startFlush();
             return;
         }
 
@@ -106,8 +106,8 @@ public class DevServiceApplicationStart {
         for (int i = 0; i < args.length; i++) {
             if (args[i].equalsIgnoreCase("-Dcache")) {
                 logger.debug("开始刷新日志,入参为:{}", args[i]);
-                IDevServiceCacheSMO centerServiceCacheSMO = (IDevServiceCacheSMO) ApplicationContextFactory.getBean("centerServiceCacheSMOImpl");
-                centerServiceCacheSMO.startFlush();
+                IDevServiceCacheSMO devServiceCacheSMOImpl = (IDevServiceCacheSMO) ApplicationContextFactory.getBean("devServiceCacheSMOImpl");
+                devServiceCacheSMOImpl.startFlush();
             }
         }
     }

+ 7 - 0
service-dev/src/main/java/com/java110/dev/dao/IDevServiceDAO.java

@@ -2,6 +2,7 @@ package com.java110.dev.dao;
 
 import com.java110.dto.basePrivilege.BasePrivilegeDto;
 import com.java110.dto.businessDatabus.BusinessDatabusDto;
+import com.java110.dto.businessTableHis.BusinessTableHisDto;
 import com.java110.entity.mapping.Mapping;
 import com.java110.utils.exception.DAOException;
 
@@ -39,6 +40,12 @@ public interface IDevServiceDAO {
      * @return
      */
     public List<BusinessDatabusDto> getDatabusAll();
+    /**
+     * 查询映射表
+     *
+     * @return
+     */
+    public List<BusinessTableHisDto> getBusinessTableHisAll();
 
 
 

+ 6 - 0
service-dev/src/main/java/com/java110/dev/dao/impl/DevServiceDAOImpl.java

@@ -4,6 +4,7 @@ import com.java110.core.base.dao.BaseServiceDao;
 import com.java110.dev.dao.IDevServiceDAO;
 import com.java110.dto.basePrivilege.BasePrivilegeDto;
 import com.java110.dto.businessDatabus.BusinessDatabusDto;
+import com.java110.dto.businessTableHis.BusinessTableHisDto;
 import com.java110.entity.mapping.Mapping;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -50,4 +51,9 @@ public class DevServiceDAOImpl extends BaseServiceDao implements IDevServiceDAO
         return sqlSessionTemplate.selectList("devServiceDAOImpl.getDatabusAll");
     }
 
+    @Override
+    public List<BusinessTableHisDto> getBusinessTableHisAll() {
+        return sqlSessionTemplate.selectList("devServiceDAOImpl.getBusinessTableHisAll");
+    }
+
 }

+ 51 - 3
service-dev/src/main/java/com/java110/dev/smo/impl/DevServiceCacheSMOImpl.java

@@ -3,14 +3,15 @@ package com.java110.dev.smo.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.java110.core.factory.DataTransactionFactory;
 import com.java110.db.dao.IQueryServiceDAO;
+import com.java110.dev.dao.IDevServiceDAO;
 import com.java110.dev.smo.IDevServiceCacheSMO;
 import com.java110.dto.basePrivilege.BasePrivilegeDto;
 import com.java110.dto.businessDatabus.BusinessDatabusDto;
+import com.java110.dto.businessTableHis.BusinessTableHisDto;
 import com.java110.entity.center.AppRoute;
 import com.java110.entity.mapping.Mapping;
 import com.java110.entity.order.ServiceBusiness;
 import com.java110.entity.service.ServiceSql;
-import com.java110.dev.dao.IDevServiceDAO;
 import com.java110.service.context.DataQuery;
 import com.java110.utils.cache.*;
 import com.java110.utils.constant.CommonConstant;
@@ -62,7 +63,10 @@ public class DevServiceCacheSMOImpl implements IDevServiceCacheSMO {
         flushPrivilege(dataQuery);
 
         //刷新databus
-        doFlushDatabus(dataQuery);
+        flushDatabus(dataQuery);
+
+//刷新BusinessTableHis
+        flushBusinessTableHis(dataQuery);
 
         dataQuery.setResponseInfo(DataTransactionFactory.createBusinessResponseJson(ResponseConstant.RESULT_CODE_SUCCESS, "刷新成功"));
     }
@@ -88,6 +92,8 @@ public class DevServiceCacheSMOImpl implements IDevServiceCacheSMO {
         flushPrivilege(headers);
 
         flushDatabus(headers);
+
+        flushBusinessTableHis(headers);
     }
 
     /**
@@ -111,6 +117,9 @@ public class DevServiceCacheSMOImpl implements IDevServiceCacheSMO {
 
         //刷新databus
         doFlushDatabus();
+
+        //刷新BusinessTableHis
+        doFlushBusinessTableHis();
     }
 
 
@@ -236,7 +245,7 @@ public class DevServiceCacheSMOImpl implements IDevServiceCacheSMO {
     /**
      * 刷新 Mapping 数据
      */
-    private void doFlushDatabus(DataQuery dataQuery) {
+    private void flushDatabus(DataQuery dataQuery) {
 
         JSONObject params = dataQuery.getRequestParams();
 
@@ -247,6 +256,21 @@ public class DevServiceCacheSMOImpl implements IDevServiceCacheSMO {
         doFlushDatabus();
     }
 
+    /**
+     * 刷新 doFlushBusinessTableHis 数据
+     */
+    private void flushBusinessTableHis(DataQuery dataQuery) {
+
+        JSONObject params = dataQuery.getRequestParams();
+
+        if (!CommonConstant.CACHE_BUSINESS_TABLE_HIS.equals(params.getString(CommonConstant.CACHE_PARAM_NAME))) {
+            return;
+        }
+
+        doFlushBusinessTableHis();
+    }
+
+
     /**
      * 刷新 Mapping 数据
      */
@@ -277,6 +301,21 @@ public class DevServiceCacheSMOImpl implements IDevServiceCacheSMO {
         doFlushDatabus();
     }
 
+    /**
+     * 刷新 databus 数据
+     */
+    private void flushBusinessTableHis(Map<String, String> headers) {
+
+        Assert.hasKey(headers, CommonConstant.CACHE_PARAM, "未包含cache参数" + headers.toString());
+
+        if (!CommonConstant.CACHE_BUSINESS_TABLE_HIS.equals(headers.get(CommonConstant.CACHE_PARAM))
+                && !CommonConstant.CACHE_ALL.equals(headers.get(CommonConstant.CACHE_PARAM))) {
+            return;
+        }
+
+        doFlushBusinessTableHis();
+    }
+
     /**
      * 刷新 Mapping 数据
      */
@@ -335,6 +374,15 @@ public class DevServiceCacheSMOImpl implements IDevServiceCacheSMO {
         DatabusCache.setValue(businessDatabusDtos);
     }
 
+    private void doFlushBusinessTableHis() {
+        logger.debug("开始刷新 BusinessTableHis数据到redis数据库中");
+        List<BusinessTableHisDto> businessTableHisDtos = devServiceDAOImpl.getBusinessTableHisAll();
+        //删除原始数据
+        BusinessTableHisCache.removeData(BusinessTableHisCache.DEFAULT_BUSINESS_TABLE_HIS);
+        BusinessTableHisCache.setValue(businessTableHisDtos);
+    }
+
+
     /**
      * 刷新AppRoute数据
      */

+ 2 - 3
service-order/src/main/java/com/java110/order/OrderServiceApplicationStart.java

@@ -19,7 +19,6 @@ import com.java110.config.properties.code.ZookeeperProperties;
 import com.java110.core.annotation.Java110ListenerDiscovery;
 import com.java110.core.client.RestTemplate;
 import com.java110.core.event.center.DataFlowEventPublishing;
-import com.java110.order.smo.ICenterServiceCacheSMO;
 import com.java110.service.init.ServiceInfoListener;
 import com.java110.service.init.ServiceStartInit;
 import com.java110.utils.cache.MappingCache;
@@ -42,6 +41,7 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Bean;
 import org.springframework.http.converter.StringHttpMessageConverter;
+import org.springframework.scheduling.annotation.EnableAsync;
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
@@ -72,6 +72,7 @@ import java.util.List;
         "com.java110.intf.community",
         "com.java110.intf.fee"
 })
+@EnableAsync
 public class OrderServiceApplicationStart {
 
     private static Logger logger = LoggerFactory.getLogger(OrderServiceApplicationStart.class);
@@ -120,8 +121,6 @@ public class OrderServiceApplicationStart {
     }
 
 
-
-
     /**
      * 加载 workId
      */

+ 1 - 1
service-order/src/main/java/com/java110/order/dao/impl/CenterServiceDAOImpl.java

@@ -53,7 +53,7 @@ public class CenterServiceDAOImpl extends BaseServiceDao implements ICenterServi
             throw new DAOException(ResponseConstant.RESULT_CODE_INNER_ERROR, "保存订单项信息失败:" + JSONObject.toJSONString(orderItem));
         }
 
-        //这个地方我们补充c_business
+
 
 
         if (!orderItem.containsKey("logText") || StringUtil.isEmpty(orderItem.get("logText") + "")) {

+ 12 - 0
service-order/src/main/java/com/java110/order/smo/IAsynNotifySubService.java

@@ -0,0 +1,12 @@
+package com.java110.order.smo;
+
+import com.java110.dto.businessTableHis.BusinessTableHisDto;
+import com.java110.dto.order.OrderItemDto;
+
+/**
+ * 异步通知子服务生成business 表
+ */
+public interface IAsynNotifySubService {
+
+    void notifySubService(OrderItemDto orderItemDto, BusinessTableHisDto businessTableHisDto);
+}

+ 164 - 0
service-order/src/main/java/com/java110/order/smo/impl/AsynNotifySubServiceImpl.java

@@ -0,0 +1,164 @@
+package com.java110.order.smo.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.core.client.RestTemplate;
+import com.java110.dto.businessTableHis.BusinessTableHisDto;
+import com.java110.dto.order.OrderItemDto;
+import com.java110.order.smo.IAsynNotifySubService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AsynNotifySubServiceImpl implements IAsynNotifySubService {
+    private static Logger logger = LoggerFactory.getLogger(AsynNotifySubServiceImpl.class);
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    public static final String FALLBACK_URL = "http://SERVICE_NAME/businessApi/fallBack";
+
+    public static final String SERVICE_NAME = "SERVICE_NAME";
+
+    @Override
+    @Async
+    public void notifySubService(OrderItemDto orderItemDto, BusinessTableHisDto businessTableHisDto) {
+        HttpEntity<String> httpEntity = null;
+        HttpHeaders header = new HttpHeaders();
+        try {
+            JSONArray params = generateBusinessParam(orderItemDto, businessTableHisDto);
+            httpEntity = new HttpEntity<String>(params.toJSONString(), header);
+            //通过fallBack 的方式生成Business
+            restTemplate.exchange(FALLBACK_URL.replace(SERVICE_NAME, orderItemDto.getServiceName()), HttpMethod.POST, httpEntity, String.class);
+        } catch (Exception e) {
+            logger.error("生成business失败", e);
+
+        }
+    }
+
+    /**
+     * 生成回滚sql
+     *
+     * @param orderItemDto
+     * @return
+     */
+    private JSONArray generateBusinessParam(OrderItemDto orderItemDto, BusinessTableHisDto businessTableHisDto) {
+        JSONArray params = null;
+        switch (orderItemDto.getAction()) {
+            case "ADD":
+                params = generateBusinessInsertInsertSql(orderItemDto, businessTableHisDto);
+                break;
+            case "MOD":
+                params = generateBusinessDelInsertSql(orderItemDto, businessTableHisDto);
+                JSONArray paramAdds = generateBusinessInsertInsertSql(orderItemDto, businessTableHisDto);
+                params.add(paramAdds);
+                break;
+            case "DEL":
+                params = generateBusinessDelInsertSql(orderItemDto, businessTableHisDto);
+                break;
+        }
+
+        return params;
+    }
+
+
+    /**
+     * 生成添加的insert语句
+     *
+     * @param orderItemDto
+     * @return
+     */
+    private JSONArray generateBusinessInsertInsertSql(OrderItemDto orderItemDto, BusinessTableHisDto businessTableHisDto) {
+        JSONArray params = new JSONArray();
+        JSONObject param = null;
+        String sql = "";
+        String logText = orderItemDto.getLogText();
+
+        JSONObject logTextObj = JSONObject.parseObject(logText);
+        JSONArray afterValues = logTextObj.getJSONArray("afterValue");
+        for (int afterValueIndex = 0; afterValueIndex < afterValues.size(); afterValueIndex++) {
+            sql = "insert into " + businessTableHisDto.getActionObjHis() + " ";
+            param = new JSONObject();
+            JSONObject keyValue = afterValues.getJSONObject(afterValueIndex);
+            if (keyValue.isEmpty()) {
+                continue;
+            }
+            String keySql = "( ";
+            String valueSql = " values (";
+            for (String key : keyValue.keySet()) {
+                if ("status_cd".equals(key) || "create_time".equals(key)) {
+                    continue;
+                }
+                keySql += (key + ",");
+                valueSql += (keyValue.getString(key) + ",");
+            }
+            keySql += "operate,b_id";
+            valueSql += "'ADD','" + orderItemDto.getbId() + "'";
+            if (keySql.endsWith(",")) {
+                keySql = keySql.substring(0, keySql.length() - 1);
+            }
+            if (valueSql.endsWith(",")) {
+                valueSql = valueSql.substring(0, valueSql.length() - 1);
+            }
+            sql = sql + keySql + ") " + valueSql + ") ";
+            param.put("fallBackSql", sql);
+            params.add(param);
+        }
+
+        return params;
+    }
+
+
+    /**
+     * 生成删除的insert语句
+     *
+     * @param orderItemDto
+     * @return
+     */
+    private JSONArray generateBusinessDelInsertSql(OrderItemDto orderItemDto, BusinessTableHisDto businessTableHisDto) {
+        JSONArray params = new JSONArray();
+        JSONObject param = null;
+        String sql = "";
+        String logText = orderItemDto.getLogText();
+
+        JSONObject logTextObj = JSONObject.parseObject(logText);
+        JSONArray preValues = logTextObj.getJSONArray("preValue");
+        for (int preValueIndex = 0; preValueIndex < preValues.size(); preValueIndex++) {
+            sql = "insert into " + businessTableHisDto.getActionObjHis() + " ";
+            param = new JSONObject();
+            JSONObject keyValue = preValues.getJSONObject(preValueIndex);
+            if (keyValue.isEmpty()) {
+                continue;
+            }
+            String keySql = "( ";
+            String valueSql = " values (";
+            for (String key : keyValue.keySet()) {
+                if ("status_cd".equals(key) || "create_time".equals(key)) {
+                    continue;
+                }
+                keySql += (key + ",");
+                valueSql += (keyValue.getString(key) + ",");
+            }
+            keySql += "operate,b_id";
+            valueSql += "'DEL','" + orderItemDto.getbId() + "'";
+            if (keySql.endsWith(",")) {
+                keySql = keySql.substring(0, keySql.length() - 1);
+            }
+            if (valueSql.endsWith(",")) {
+                valueSql = valueSql.substring(0, valueSql.length() - 1);
+            }
+            sql = sql + keySql + ") " + valueSql + ") ";
+            param.put("fallBackSql", sql);
+            params.add(param);
+        }
+
+        return params;
+    }
+
+}

+ 31 - 0
service-order/src/main/java/com/java110/order/smo/impl/OIdServiceSMOImpl.java

@@ -4,10 +4,14 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.java110.core.client.RestTemplate;
 import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.dto.businessTableHis.BusinessTableHisDto;
 import com.java110.dto.order.OrderDto;
 import com.java110.dto.order.OrderItemDto;
 import com.java110.order.dao.ICenterServiceDAO;
+import com.java110.order.smo.IAsynNotifySubService;
 import com.java110.order.smo.IOIdServiceSMO;
+import com.java110.utils.cache.BusinessTableHisCache;
+import com.java110.utils.constant.StatusConstant;
 import com.java110.utils.util.BeanConvertUtil;
 import com.java110.utils.util.DateUtil;
 import com.java110.utils.util.StringUtil;
@@ -45,6 +49,9 @@ public class OIdServiceSMOImpl implements IOIdServiceSMO {
     @Autowired
     private RestTemplate restTemplate;
 
+    @Autowired
+    private IAsynNotifySubService asynNotifySubServiceImpl;
+
 
     @Override
     public ResponseEntity<String> createOId(OrderDto orderDto) {
@@ -156,6 +163,7 @@ public class OIdServiceSMOImpl implements IOIdServiceSMO {
         return params;
     }
 
+
     /**
      * 生成insert语句
      *
@@ -309,9 +317,32 @@ public class OIdServiceSMOImpl implements IOIdServiceSMO {
         }
         centerServiceDAOImpl.saveOrderItem(BeanConvertUtil.beanCovertMap(orderItemDto));
 
+        //判断是否配置了 轨迹
+        BusinessTableHisDto businessTableHisDto = BusinessTableHisCache.getBusinessTableHisDto(orderItemDto.getAction(), orderItemDto.getActionObj());
+        if (businessTableHisDto == null) {
+            return ResultVo.createResponseEntity(ResultVo.CODE_OK, ResultVo.MSG_OK);
+        }
+
+        //补充 c_business  #{bId},#{oId},#{businessTypeCd},#{remark},#{statusCd}
+        Map business = new HashMap();
+        business.put("oId", orderItemDto.getoId());
+        business.put("businessTypeCd", businessTableHisDto.getBusinessTypeCd());
+        business.put("remark", "");
+        business.put("statusCd", StatusConstant.STATUS_CD_SAVE);
+        business.put("bId", orderItemDto.getbId());
+        centerServiceDAOImpl.saveBusiness(business);
+
+        //通知子服务生成 business 数据
+        doNoticeServiceGeneratorBusiness(orderItemDto, businessTableHisDto);
+
+
         return ResultVo.createResponseEntity(ResultVo.CODE_OK, ResultVo.MSG_OK);
     }
 
+    private void doNoticeServiceGeneratorBusiness(OrderItemDto orderItemDto, BusinessTableHisDto businessTableHisDto) {
+        asynNotifySubServiceImpl.notifySubService(orderItemDto,businessTableHisDto);
+    }
+
     /**
      * 完成事务
      *