package org.springblade.common.interceptor; import org.apache.ibatis.binding.MapperMethod; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.plugin.*; import org.apache.logging.log4j.util.Strings; import org.springblade.common.constant.EsTableConstant; import org.springblade.common.utils.SQLParseUtils; import org.springblade.es.service.ElasticsearchDocumentService; import org.springblade.es.vo.EsParam; import org.springblade.modules.article.entity.Article; import org.springblade.modules.house.entity.HouseEntity; import org.springblade.modules.house.entity.HouseholdEntity; import org.springblade.modules.house.vo.HouseVO; import org.springblade.modules.house.vo.HouseholdVO; import org.springblade.modules.place.entity.PlaceEntity; import org.springblade.modules.place.vo.PlaceVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.Properties; @Component @Intercepts({ @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}) }) public class DataSyncInterceptor implements Interceptor { @Lazy @Autowired private ElasticsearchDocumentService elasticsearchDocumentService; @Value("${elasticsearch.indexName}") private String indexName; /** * 拦截器在sql执行成功后同步到es, * 如果同步失败抛出异常,保证数据一致性 * * @param invocation * @return * @throws Throwable */ @Override public Object intercept(Invocation invocation) throws Throwable { // 获取StatementHandler,进行自定义处理 // StatementHandler statementHandler = PluginUtils.realTarget(invocation.getTarget()); Object res = invocation.proceed(); System.out.println("res = " + res); Object[] args = invocation.getArgs(); MappedStatement ms = (MappedStatement) args[0]; if (args.length >= 2) { //参数 Object parameter = invocation.getArgs()[1]; BoundSql boundSql = ms.getBoundSql(parameter); //sql String sql = boundSql.getSql(); sql = sql.replaceAll("\n", ""); //获取表名 String tableName = SQLParseUtils.getTableName(sql); String sqlType = SQLParseUtils.parseSQLType(sql); if (!Strings.isBlank(tableName)) { if (tableName.equals("jczz_article") || tableName.equals("jczz_house") || tableName.equals("jczz_household") || tableName.equals("jczz_place")) syncDataAfterUpdate(tableName, sqlType, invocation.getArgs()[1]); } } return res; } /** * 数据同步 * * @param tableName * @param sqlType * @param parameter */ private void syncDataAfterUpdate(String tableName, String sqlType, Object parameter) { EsParam esParam = new EsParam(); esParam.setIndexName(indexName); esParam.setTableName(tableName); // 判断操作类型 if (sqlType.equals("INSERT")) { //insert 可用直接拦截到实体类 if (tableName.equals("jczz_article")) { Article entity = (Article) parameter; elasticsearchDocumentService.addArticle(esParam, entity); } if (tableName.equals("jczz_place")) { PlaceEntity entity = (PlaceEntity) parameter; elasticsearchDocumentService.addPlace(esParam, entity); } if (tableName.equals("jczz_house")) { HouseEntity entity = (HouseEntity) parameter; elasticsearchDocumentService.addHouse(esParam, entity); } if (tableName.equals("jczz_household")) { HouseholdEntity entity = (HouseholdEntity) parameter; elasticsearchDocumentService.addHousehold(esParam, entity); } } if (sqlType.equals("UPDATE")) { //update 方法需要特殊处理 if (tableName.equals("jczz_article")) { Article entity = (Article) ((MapperMethod.ParamMap) parameter).get("param1"); if (entity != null && entity.getId() != null) { esParam.setTableId(entity.getId().toString()); elasticsearchDocumentService.update(esParam, entity, EsTableConstant.articleList); } } if (tableName.equals("jczz_place")) { PlaceEntity entity = new PlaceEntity(); PlaceEntity placeEntity = new PlaceEntity(); if (parameter instanceof MapperMethod.ParamMap) { placeEntity = (PlaceEntity) ((MapperMethod.ParamMap) parameter).get("param1"); if (placeEntity != null && null != placeEntity.getId()) { setPlaceInfo(entity, placeEntity); esParam.setTableId(entity.getId().toString()); elasticsearchDocumentService.update(esParam, entity, EsTableConstant.placeList); } } else { placeEntity = (PlaceEntity) parameter; // 删除 esParam.setTableId(placeEntity.getId().toString()); elasticsearchDocumentService.removeByQuery(esParam); } } if (tableName.equals("jczz_house")) { HouseEntity houseEntity = new HouseEntity(); HouseEntity entity = new HouseEntity(); if (parameter instanceof MapperMethod.ParamMap) { entity = (HouseEntity) ((MapperMethod.ParamMap) parameter).get("param1"); if (entity != null && entity.getId() != null) { setHouseInfo(houseEntity, entity); esParam.setTableId(entity.getId().toString()); elasticsearchDocumentService.update(esParam, entity, EsTableConstant.houseList); } } else { entity = (HouseEntity) parameter; // 删除 esParam.setTableId(entity.getId().toString()); elasticsearchDocumentService.removeByQuery(esParam); } } if (tableName.equals("jczz_household")) { HouseholdEntity householdEntity = new HouseholdEntity(); HouseholdEntity entity = new HouseholdEntity(); if (parameter instanceof MapperMethod.ParamMap) { entity = (HouseholdEntity) ((MapperMethod.ParamMap) parameter).get("param1"); if (entity != null && entity.getId() != null) { setHouseholdInfo(householdEntity, entity); esParam.setTableId(entity.getId().toString()); elasticsearchDocumentService.update(esParam, entity, EsTableConstant.householdList); } } else { entity = (HouseholdEntity) parameter; // 删除 esParam.setTableId(entity.getId().toString()); elasticsearchDocumentService.removeByQuery(esParam); } } } // 删除处理 if (sqlType.equals("DELETE")) { List list = (List) ((MapperMethod.ParamMap) parameter).get("param1"); esParam.setTableId(list.get(0).toString()); elasticsearchDocumentService.removeByQuery(esParam); } } /** * 场所值复制 * * @param entity * @param placeEntity */ private void setPlaceInfo(PlaceEntity entity, PlaceEntity placeEntity) { entity.setId(placeEntity.getId()); entity.setPlaceName(placeEntity.getPlaceName()); entity.setPrincipal(placeEntity.getPrincipal()); entity.setPrincipalPhone(placeEntity.getPrincipalPhone()); entity.setPrincipalIdCard(placeEntity.getPrincipalIdCard()); entity.setLocation(placeEntity.getLocation()); } /** * 房屋值复制 * * @param entity * @param houseEntity */ private void setHouseInfo(HouseEntity entity, HouseEntity houseEntity) { entity.setId(houseEntity.getId()); entity.setHouseName(houseEntity.getHouseName()); } /** * 住户值复制 * * @param entity * @param householdEntity */ private void setHouseholdInfo(HouseholdEntity entity, HouseholdEntity householdEntity) { entity.setId(householdEntity.getId()); entity.setName(householdEntity.getName()); entity.setPhoneNumber(householdEntity.getPhoneNumber()); entity.setIdCard(householdEntity.getIdCard()); entity.setCurrentAddress(householdEntity.getCurrentAddress()); } @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { } }