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 httpEntity = null; HttpHeaders header = new HttpHeaders(); try { JSONArray params = generateBusinessParam(orderItemDto, businessTableHisDto); httpEntity = new HttpEntity(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; } }