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> java110-utils/src/main/java/com/java110/utils/cache/BusinessTableHisCache.java
New file @@ -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(); } } } } java110-utils/src/main/java/com/java110/utils/constant/CommonConstant.java
@@ -128,6 +128,11 @@ */ public final static String CACHE_DATABUS = "DATABUS"; /** * 映射 databus */ public final static String CACHE_BUSINESS_TABLE_HIS = "BUSINESS_TABLE_HIS"; /** service-dev/src/main/java/com/java110/dev/DevServiceApplicationStart.java
@@ -95,8 +95,8 @@ //因为好多朋友启动时 不加 参数-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 @@ 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(); } } } service-dev/src/main/java/com/java110/dev/dao/IDevServiceDAO.java
@@ -2,6 +2,7 @@ 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 @@ * @return */ public List<BusinessDatabusDto> getDatabusAll(); /** * 查询映射表 * * @return */ public List<BusinessTableHisDto> getBusinessTableHisAll(); service-dev/src/main/java/com/java110/dev/dao/impl/DevServiceDAOImpl.java
@@ -4,6 +4,7 @@ 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 @@ return sqlSessionTemplate.selectList("devServiceDAOImpl.getDatabusAll"); } @Override public List<BusinessTableHisDto> getBusinessTableHisAll() { return sqlSessionTemplate.selectList("devServiceDAOImpl.getBusinessTableHisAll"); } } service-dev/src/main/java/com/java110/dev/smo/impl/DevServiceCacheSMOImpl.java
@@ -3,14 +3,15 @@ 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 @@ flushPrivilege(dataQuery); //刷新databus doFlushDatabus(dataQuery); flushDatabus(dataQuery); //刷新BusinessTableHis flushBusinessTableHis(dataQuery); dataQuery.setResponseInfo(DataTransactionFactory.createBusinessResponseJson(ResponseConstant.RESULT_CODE_SUCCESS, "刷新成功")); } @@ -88,6 +92,8 @@ flushPrivilege(headers); flushDatabus(headers); flushBusinessTableHis(headers); } /** @@ -111,6 +117,9 @@ //刷新databus doFlushDatabus(); //刷新BusinessTableHis doFlushBusinessTableHis(); } @@ -236,7 +245,7 @@ /** * 刷新 Mapping 数据 */ private void doFlushDatabus(DataQuery dataQuery) { private void flushDatabus(DataQuery dataQuery) { JSONObject params = dataQuery.getRequestParams(); @@ -246,6 +255,21 @@ 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 数据 @@ -275,6 +299,21 @@ } 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(); } /** @@ -335,6 +374,15 @@ 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数据 */ service-order/src/main/java/com/java110/order/OrderServiceApplicationStart.java
@@ -19,7 +19,6 @@ 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.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 @@ "com.java110.intf.community", "com.java110.intf.fee" }) @EnableAsync public class OrderServiceApplicationStart { private static Logger logger = LoggerFactory.getLogger(OrderServiceApplicationStart.class); @@ -118,8 +119,6 @@ logger.error("系统启动失败", e); } } /** service-order/src/main/java/com/java110/order/dao/impl/CenterServiceDAOImpl.java
@@ -53,7 +53,7 @@ throw new DAOException(ResponseConstant.RESULT_CODE_INNER_ERROR, "保存订单项信息失败:" + JSONObject.toJSONString(orderItem)); } //这个地方我们补充c_business if (!orderItem.containsKey("logText") || StringUtil.isEmpty(orderItem.get("logText") + "")) { service-order/src/main/java/com/java110/order/smo/IAsynNotifySubService.java
New file @@ -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); } service-order/src/main/java/com/java110/order/smo/impl/AsynNotifySubServiceImpl.java
New file @@ -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; } } service-order/src/main/java/com/java110/order/smo/impl/OIdServiceSMOImpl.java
@@ -4,10 +4,14 @@ 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; @@ -44,6 +48,9 @@ @Autowired private RestTemplate restTemplate; @Autowired private IAsynNotifySubService asynNotifySubServiceImpl; @Override @@ -155,6 +162,7 @@ return params; } /** * 生成insert语句 @@ -309,9 +317,32 @@ } 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); } /** * 完成事务 *