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.core.factory.GenerateCodeFactory; import com.java110.dto.order.OrderDto; import com.java110.dto.order.OrderItemDto; import com.java110.order.dao.ICenterServiceDAO; import com.java110.order.smo.IOIdServiceSMO; import com.java110.utils.util.BeanConvertUtil; import com.java110.utils.util.StringUtil; import com.java110.vo.ResultVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.*; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 事务处理服务类 * Created by wuxw on 2018/4/13. */ @Service("oIdServiceSMOImpl") public class OIdServiceSMOImpl implements IOIdServiceSMO { private static Logger logger = LoggerFactory.getLogger(OIdServiceSMOImpl.class); public static final String FALLBACK_URL = "http://SERVICE_NAME/fallBack"; public static final String SERVICE_NAME = "SERVICE_NAME"; @Autowired private ICenterServiceDAO centerServiceDAOImpl; @Autowired private RestTemplate restTemplate; @Override public ResponseEntity createOId(OrderDto orderDto) { orderDto.setoId(GenerateCodeFactory.getOId()); if (StringUtil.isEmpty(orderDto.getAppId())) { throw new IllegalArgumentException("未包含appId"); } if (StringUtil.isEmpty(orderDto.getExtTransactionId())) { throw new IllegalArgumentException("未包含交互日志"); } if (StringUtil.isEmpty(orderDto.getRequestTime())) { throw new IllegalArgumentException("未包含请求时间"); } //保存订单信息 centerServiceDAOImpl.saveOrder(BeanConvertUtil.beanCovertMap(orderDto)); return new ResponseEntity(JSONObject.toJSONString(orderDto), HttpStatus.OK); } @Override public ResponseEntity fallBackOId(OrderDto orderDto) { if (StringUtil.isEmpty(orderDto.getoId())) { throw new IllegalArgumentException("未包含事务ID"); } //判断OID是否存在 orderDto = BeanConvertUtil.covertBean(centerServiceDAOImpl.getOrder(BeanConvertUtil.beanCovertMap(orderDto)), OrderDto.class); if (orderDto == null) { return new ResponseEntity("没有需要回退事务", HttpStatus.NOT_FOUND); } //查询 事务项 Map orderItem = new HashMap(); orderItem.put("oId", orderDto.getoId()); List orderItemMaps = centerServiceDAOImpl.getOrderItems(orderItem); if (orderItemMaps == null || orderItemMaps.size() < 1) { return new ResponseEntity("没有需要回退事务", HttpStatus.NOT_FOUND); } List orderItemDtos = BeanConvertUtil.covertBeanList(orderItemMaps, OrderItemDto.class); HttpEntity httpEntity = null; HttpHeaders header = new HttpHeaders(); List errorOrderItemDtos = new ArrayList<>(); for (OrderItemDto orderItemDto : orderItemDtos) { try { httpEntity = new HttpEntity(JSONObject.toJSONString(orderItemDto), header); restTemplate.exchange(FALLBACK_URL.replace(SERVICE_NAME, orderItemDto.getServiceName()), HttpMethod.POST, httpEntity, String.class); } catch (Exception e) { logger.error("回退事务失败", e); errorOrderItemDtos.add(orderItemDto); } } if (errorOrderItemDtos.size() > 0) { return new ResponseEntity(JSONArray.toJSONString(errorOrderItemDtos), HttpStatus.BAD_REQUEST); } else { return new ResponseEntity("", HttpStatus.OK); } } @Override public ResponseEntity createOrderItem(OrderItemDto orderItemDto) { if (StringUtil.isEmpty(orderItemDto.getoId())) { return new ResponseEntity("请求报文中未包含事务ID", HttpStatus.NOT_FOUND); } if (StringUtil.isEmpty(orderItemDto.getAction())) { return new ResponseEntity("请求报文中未包含动作", HttpStatus.NOT_FOUND); } if (StringUtil.isEmpty(orderItemDto.getActionObj())) { return new ResponseEntity("请求报文中未包含动作对象", HttpStatus.NOT_FOUND); } if (StringUtil.isEmpty(orderItemDto.getServiceName())) { return new ResponseEntity("请求报文中未包含服务", HttpStatus.NOT_FOUND); } if (StringUtil.isEmpty(orderItemDto.getLogText())) { return new ResponseEntity("请求报文中未包含回滚日志", HttpStatus.NOT_FOUND); } if (StringUtil.isEmpty(orderItemDto.getbId()) || orderItemDto.getbId().startsWith("-")) { orderItemDto.setbId(GenerateCodeFactory.getBId()); } centerServiceDAOImpl.saveOrderItem(BeanConvertUtil.beanCovertMap(orderItemDto)); return ResultVo.createResponseEntity(ResultVo.CODE_OK, ResultVo.MSG_OK); } }