| | |
| | | |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.java110.common.cache.AppRouteCache; |
| | | import com.java110.common.cache.MappingCache; |
| | | import com.java110.common.constant.*; |
| | | import com.java110.common.exception.*; |
| | | import com.java110.common.factory.ApplicationContextFactory; |
| | | import com.java110.common.kafka.KafkaFactory; |
| | | import com.java110.common.log.LoggerEngine; |
| | | import com.java110.common.util.ProtocolUtil; |
| | | import com.java110.config.properties.EventProperties; |
| | | import com.java110.core.base.smo.BaseServiceSMO; |
| | | import com.java110.core.event.AppEventPublishing; |
| | | import com.java110.entity.order.BusiOrder; |
| | | import com.java110.entity.order.BusiOrderAttr; |
| | | import com.java110.entity.order.OrderList; |
| | | import com.java110.entity.order.OrderListAttr; |
| | | import com.java110.feign.base.IPrimaryKeyService; |
| | | import com.java110.order.dao.IOrderServiceDao; |
| | | import com.java110.common.util.*; |
| | | import com.java110.core.client.RestTemplate; |
| | | import com.java110.core.context.*; |
| | | import com.java110.core.factory.AuthenticationFactory; |
| | | import com.java110.core.factory.OrderDataFlowContextFactory; |
| | | import com.java110.core.factory.GenerateCodeFactory; |
| | | import com.java110.entity.center.AppRoute; |
| | | import com.java110.entity.center.AppService; |
| | | import com.java110.entity.center.DataFlowLinksCost; |
| | | import com.java110.entity.order.Business; |
| | | import com.java110.entity.order.ServiceBusiness; |
| | | import com.java110.event.center.DataFlowEventPublishing; |
| | | import com.java110.log.agent.LogAgent; |
| | | import com.java110.order.dao.ICenterServiceDAO; |
| | | import com.java110.order.smo.IOrderServiceSMO; |
| | | import org.apache.commons.lang.math.NumberUtils; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import com.java110.service.init.ServiceInfoListener; |
| | | import com.java110.service.smo.IQueryServiceSMO; |
| | | import org.apache.commons.lang3.math.NumberUtils; |
| | | 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.HttpStatus; |
| | | import org.springframework.http.ResponseEntity; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.util.Assert; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.*; |
| | | |
| | | |
| | | /** |
| | | * 订单服务业务逻辑处理实现类 |
| | | * Created by wuxw on 2017/4/11. |
| | | * 订单服务处理类 |
| | | * Created by wuxw on 2018/4/13. |
| | | */ |
| | | @Service("orderServiceSMOImpl") |
| | | @Transactional |
| | | public class OrderServiceSMOImpl extends BaseServiceSMO implements IOrderServiceSMO { |
| | | //@Transactional |
| | | public class OrderServiceSMOImpl implements IOrderServiceSMO { |
| | | |
| | | private final static Logger logger = LoggerFactory.getLogger(OrderServiceSMOImpl.class); |
| | | |
| | | |
| | | @Autowired |
| | | IPrimaryKeyService iPrimaryKeyService; |
| | | ICenterServiceDAO centerServiceDaoImpl; |
| | | |
| | | @Autowired |
| | | IOrderServiceDao iOrderServiceDao; |
| | | private RestTemplate restTemplate; |
| | | |
| | | @Autowired |
| | | EventProperties eventProperties; |
| | | private RestTemplate restTemplateNoLoadBalanced; |
| | | |
| | | @Autowired |
| | | private IQueryServiceSMO queryServiceSMOImpl; |
| | | |
| | | |
| | | /** |
| | | * 根据购物车ID 或者 外部系统ID 或者 custId 或者 channelId 查询订单信息 |
| | | * @param orderList |
| | | * 业务统一处理服务方法 |
| | | * @param reqJson 请求报文json |
| | | * @return |
| | | */ |
| | | @Override |
| | | public String queryOrderInfo(OrderList orderList) throws Exception{ |
| | | public ResponseEntity<String> service(String reqJson, Map<String,String> headers) throws SMOException{ |
| | | IOrderDataFlowContext dataFlow = null; |
| | | |
| | | JSONObject responseJson = null; |
| | | |
| | | ResponseEntity<String> responseEntity = null; |
| | | |
| | | try { |
| | | DataFlowEventPublishing.preValidateData(reqJson,headers); |
| | | //1.0 创建数据流 |
| | | dataFlow = OrderDataFlowContextFactory.newInstance(OrderDataFlow.class).builder(reqJson, headers); |
| | | DataFlowEventPublishing.initDataFlowComplete(dataFlow); |
| | | |
| | | //2.0 调用规则校验 |
| | | ruleValidate(dataFlow); |
| | | DataFlowEventPublishing.ruleValidateComplete(dataFlow); |
| | | |
| | | //3.0 保存订单和业务项 c_orders c_order_attrs c_business c_business_attrs |
| | | saveOrdersAndBusiness(dataFlow); |
| | | |
| | | //6.0 调用下游系统 |
| | | DataFlowEventPublishing.invokeBusinessSystem(dataFlow); |
| | | invokeBusinessSystem(dataFlow); |
| | | |
| | | //能够执行到这一步 认为是都成功了 |
| | | refreshOrderDataFlowResJson(dataFlow); |
| | | |
| | | }catch (BusinessException e) { |
| | | responseEntity = new ResponseEntity<String>(e.getMessage() , OrderDataFlowContextFactory.hashMap2MultiValueMap(dataFlow.getResHeaders()),HttpStatus.INTERNAL_SERVER_ERROR); |
| | | } catch (OrdersException e) { |
| | | responseEntity = new ResponseEntity<String>(e.getMessage() , OrderDataFlowContextFactory.hashMap2MultiValueMap(dataFlow.getResHeaders()),HttpStatus.INTERNAL_SERVER_ERROR); |
| | | } catch (RuleException e) { |
| | | responseEntity = new ResponseEntity<String>(e.getMessage(),OrderDataFlowContextFactory.hashMap2MultiValueMap(dataFlow.getResHeaders()), HttpStatus.NETWORK_AUTHENTICATION_REQUIRED); |
| | | } catch (NoAuthorityException e) { |
| | | responseEntity = new ResponseEntity<String>(e.getMessage(), OrderDataFlowContextFactory.hashMap2MultiValueMap(dataFlow.getResHeaders()),HttpStatus.UNAUTHORIZED); |
| | | } catch (InitConfigDataException e){ |
| | | responseEntity = new ResponseEntity<String>(e.getMessage(), OrderDataFlowContextFactory.hashMap2MultiValueMap(dataFlow.getResHeaders()),HttpStatus.INTERNAL_SERVER_ERROR); |
| | | }catch (Exception e) { |
| | | logger.error("内部异常了:",e); |
| | | responseEntity = new ResponseEntity<String>("内部异常了:"+e.getMessage() + e.getLocalizedMessage(), OrderDataFlowContextFactory.hashMap2MultiValueMap(dataFlow.getResHeaders()),HttpStatus.INTERNAL_SERVER_ERROR); |
| | | } finally { |
| | | |
| | | if(responseEntity == null){ |
| | | responseEntity = new ResponseEntity<String>(dataFlow.getResJson().getString("msg"),OrderDataFlowContextFactory.hashMap2MultiValueMap(dataFlow.getResHeaders()),HttpStatus.OK); |
| | | } |
| | | if(dataFlow != null) { |
| | | //添加耗时 |
| | | //OrderDataFlowContextFactory.addCostTime(dataFlow, "service", "业务处理总耗时", dataFlow.getStartDate(), dataFlow.getEndDate()); |
| | | //保存耗时 |
| | | //saveCostTimeLogMessage(dataFlow); |
| | | // saveLogMessage(dataFlow,LogAgent.createLogMessage(dataFlow.getRequestHeaders(),dataFlow.getReqJson().toJSONString()), |
| | | // LogAgent.createLogMessage(dataFlow.getResponseHeaders(),responseEntity.getBody()),endDate.getTime()-dataFlow.getStartDate().getTime()); |
| | | // DataFlowEventPublishing.dataResponse(dataFlow,reqJson,headers); |
| | | } |
| | | |
| | | |
| | | List<OrderList> orderLists = iOrderServiceDao.queryOrderListAndAttr(orderList); |
| | | // |
| | | JSONArray orderListsArray = new JSONArray(); |
| | | for (OrderList orderListTmp : orderLists){ |
| | | // |
| | | BusiOrder busiOrderTmp = new BusiOrder(); |
| | | busiOrderTmp.setBoId(orderListTmp.getOlId()); |
| | | //这里保存耗时,以及日志 |
| | | return responseEntity ; |
| | | |
| | | List<BusiOrder> busiOrders = iOrderServiceDao.queryBusiOrderAndAttr(busiOrderTmp); |
| | | |
| | | JSONObject orderListJSON = JSONObject.parseObject(JSONObject.toJSONString(orderListTmp)); |
| | | |
| | | orderListJSON.put("busiOrders",JSONObject.parseArray(JSONObject.toJSONString(busiOrders))); |
| | | |
| | | orderListsArray.add(orderListJSON); |
| | | } |
| | | |
| | | JSONObject orderListTmpO = new JSONObject(); |
| | | orderListTmpO.put("orderLists",orderListsArray); |
| | | |
| | | return ProtocolUtil.createResultMsg(ProtocolUtil.RETURN_MSG_SUCCESS,"查询成功",orderListTmpO); |
| | | } |
| | | |
| | | /** |
| | | * 订单调度 |
| | | * 刷返回值 |
| | | * @param dataFlow |
| | | */ |
| | | private void refreshOrderDataFlowResJson(IOrderDataFlowContext dataFlow){ |
| | | |
| | | if(dataFlow.getResJson() == null || dataFlow.getResJson().isEmpty()){ |
| | | JSONObject resJson = new JSONObject(); |
| | | resJson.put("msg","成功"); |
| | | dataFlow.setResJson(resJson); |
| | | } |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 抒写返回头信息 |
| | | * @param dataFlow |
| | | */ |
| | | private void putResponseHeader(DataFlow dataFlow,Map<String,String> headers) { |
| | | headers.put("responseTime", DateUtil.getDefaultFormateTimeString(new Date())); |
| | | headers.put("transactionId",dataFlow.getTransactionId()); |
| | | } |
| | | |
| | | /** |
| | | * 解密 |
| | | * @param reqJson |
| | | * @return |
| | | */ |
| | | private String decrypt(String reqJson,Map<String,String> headers) throws DecryptException{ |
| | | try { |
| | | if (MappingConstant.VALUE_ON.equals(headers.get(CommonConstant.ENCRYPT))) { |
| | | logger.debug("解密前字符:" + reqJson); |
| | | reqJson = new String(AuthenticationFactory.decrypt(reqJson.getBytes("UTF-8"), AuthenticationFactory.loadPrivateKey(MappingConstant.KEY_PRIVATE_STRING) |
| | | , NumberUtils.isNumber(headers.get(CommonConstant.ENCRYPT_KEY_SIZE)) ? Integer.parseInt(headers.get(CommonConstant.ENCRYPT_KEY_SIZE)) : |
| | | Integer.parseInt(MappingCache.getValue(MappingConstant.KEY_DEFAULT_DECRYPT_KEY_SIZE))),"UTF-8"); |
| | | logger.debug("解密后字符:" + reqJson); |
| | | } |
| | | }catch (Exception e){ |
| | | throw new DecryptException(ResponseConstant.RESULT_CODE_NO_AUTHORITY_ERROR,"解密失败"); |
| | | } |
| | | |
| | | return reqJson; |
| | | } |
| | | |
| | | /** |
| | | * 加密 |
| | | * @param resJson |
| | | * @param headers |
| | | * @return |
| | | */ |
| | | private String encrypt(String resJson,Map<String,String> headers){ |
| | | try { |
| | | if (MappingConstant.VALUE_ON.equals(headers.get(CommonConstant.ENCRYPT))) { |
| | | logger.debug("加密前字符:" + resJson); |
| | | resJson = new String(AuthenticationFactory.encrypt(resJson.getBytes("UTF-8"), AuthenticationFactory.loadPubKey(MappingConstant.KEY_PUBLIC_STRING) |
| | | , NumberUtils.isNumber(headers.get(CommonConstant.ENCRYPT_KEY_SIZE)) ? Integer.parseInt(headers.get(CommonConstant.ENCRYPT_KEY_SIZE)) : |
| | | Integer.parseInt(MappingCache.getValue(MappingConstant.KEY_DEFAULT_DECRYPT_KEY_SIZE))),"UTF-8"); |
| | | logger.debug("加密后字符:" + resJson); |
| | | } |
| | | }catch (Exception e){ |
| | | logger.error("加密失败:",e); |
| | | } |
| | | return resJson; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 2.0初始化配置信息 |
| | | * |
| | | * orderListInfo 中字段 asyn 如果为 A 表示 异步处理订单,其他表同步处理订单 |
| | | * @param orderInfo 订单信息 |
| | | * @return 订单处理接口 |
| | | * @throws Exception |
| | | * @param dataFlow |
| | | */ |
| | | private void initConfigData(IOrderDataFlowContext dataFlow) { |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 4.0规则校验 |
| | | * |
| | | * @param dataFlow |
| | | * @throws RuleException |
| | | */ |
| | | private void ruleValidate(IOrderDataFlowContext dataFlow) throws RuleException { |
| | | Date startDate = DateUtil.getCurrentDate(); |
| | | try { |
| | | |
| | | if (MappingConstant.VALUE_OFF.equals(MappingCache.getValue(MappingConstant.KEY_RULE_ON_OFF)) |
| | | || (MappingCache.getValue(MappingConstant.KEY_NO_NEED_RULE_VALDATE_ORDER) != null |
| | | && MappingCache.getValue(MappingConstant.KEY_NO_NEED_RULE_VALDATE_ORDER).contains(dataFlow.getOrders().getOrderTypeCd()))) { |
| | | //不做校验 |
| | | //添加耗时 |
| | | OrderDataFlowContextFactory.addCostTime(dataFlow, "ruleValidate", "规则校验耗时", startDate); |
| | | return ; |
| | | } |
| | | |
| | | //调用规则 |
| | | |
| | | } catch (Exception e) { |
| | | //添加耗时 |
| | | OrderDataFlowContextFactory.addCostTime(dataFlow, "ruleValidate", "规则校验耗时", startDate); |
| | | throw new RuleException(ResponseConstant.RESULT_CODE_RULE_ERROR, "规则校验异常失败:" + e.getMessage()); |
| | | } |
| | | |
| | | OrderDataFlowContextFactory.addCostTime(dataFlow, "ruleValidate", "规则校验耗时", startDate); |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 5.0 保存订单和业务项 c_orders c_order_attrs c_business c_business_attrs |
| | | * |
| | | * @param dataFlow |
| | | * @throws OrdersException |
| | | */ |
| | | private void saveOrdersAndBusiness(IOrderDataFlowContext dataFlow) throws OrdersException { |
| | | Date startDate = DateUtil.getCurrentDate(); |
| | | if(MappingCache.getValue(MappingConstant.KEY_NO_SAVE_ORDER) != null |
| | | &&MappingCache.getValue(MappingConstant.KEY_NO_SAVE_ORDER).contains(dataFlow.getOrders().getOrderTypeCd())){ |
| | | //不保存订单信息 |
| | | OrderDataFlowContextFactory.addCostTime(dataFlow, "saveOrdersAndBusiness", "保存订单和业务项耗时", startDate); |
| | | return ; |
| | | } |
| | | |
| | | |
| | | //1.0 保存 orders信息 |
| | | centerServiceDaoImpl.saveOrder(OrderDataFlowContextFactory.getOrder(dataFlow.getOrders())); |
| | | |
| | | |
| | | centerServiceDaoImpl.saveOrderAttrs(OrderDataFlowContextFactory.getOrderAttrs(dataFlow.getOrders())); |
| | | |
| | | //2.0 保存 business信息 |
| | | |
| | | centerServiceDaoImpl.saveBusiness(OrderDataFlowContextFactory.getBusiness(dataFlow)); |
| | | |
| | | centerServiceDaoImpl.saveBusinessAttrs(OrderDataFlowContextFactory.getBusinessAttrs(dataFlow)); |
| | | |
| | | OrderDataFlowContextFactory.addCostTime(dataFlow, "saveOrdersAndBusiness", "保存订单和业务项耗时", startDate); |
| | | } |
| | | |
| | | /** |
| | | * 6.0 调用下游系统 |
| | | * |
| | | * @param dataFlow |
| | | * @throws BusinessException |
| | | */ |
| | | private void invokeBusinessSystem(IOrderDataFlowContext dataFlow) throws BusinessException { |
| | | Date startDate = DateUtil.getCurrentDate(); |
| | | //6.1 先处理同步方式的服务,每一同步后发布事件广播 |
| | | |
| | | doSynchronousBusinesses(dataFlow); |
| | | |
| | | //6.2 处理异步服务 |
| | | doAsynchronousBusinesses(dataFlow); |
| | | |
| | | |
| | | OrderDataFlowContextFactory.addCostTime(dataFlow, "invokeBusinessSystem", "调用下游系统耗时", startDate); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 7.0 作废订单和业务项 插入撤单记录 等待撤单 |
| | | * |
| | | * @param dataFlow |
| | | */ |
| | | private void invalidOrderAndBusiness(IOrderNotifyDataFlowContext dataFlow) { |
| | | Date startDate = DateUtil.getCurrentDate(); |
| | | if(MappingCache.getValue(MappingConstant.KEY_NO_SAVE_ORDER) != null |
| | | &&MappingCache.getValue(MappingConstant.KEY_NO_SAVE_ORDER).contains(dataFlow.getOrderTypeCd())){ |
| | | //不用作废订单信息 |
| | | // OrderDataFlowContextFactory.addCostTime(dataFlow, "invalidOrderAndBusiness", "作废订单和业务项耗时", startDate); |
| | | return ; |
| | | } |
| | | |
| | | //如果已经作废 不存在 或失败,则不做处理 |
| | | |
| | | Map order = centerServiceDaoImpl.getOrderInfoByBId(dataFlow.getbId()); |
| | | |
| | | if(order == null || !order.containsKey("status_cd") || StatusConstant.STATUS_CD_DELETE.equals(order.get("status_cd")) |
| | | || StatusConstant.STATUS_CD_ERROR.equals(order.get("status_cd"))){ |
| | | return ; |
| | | } |
| | | |
| | | //作废 订单 |
| | | centerServiceDaoImpl.updateOrder(OrderDataFlowContextFactory.getNeedInvalidOrder(dataFlow)); |
| | | |
| | | //作废订单项 |
| | | centerServiceDaoImpl.updateBusiness(OrderDataFlowContextFactory.getNeedInvalidOrder(dataFlow)); |
| | | |
| | | //将当前订单项改为 撤单状态 |
| | | centerServiceDaoImpl.updateBusinessByBId(OrderDataFlowContextFactory.getNeedDeleteBusiness(dataFlow)); |
| | | //插入撤单记录 |
| | | doAddDeleteOrderBusinessData(dataFlow); |
| | | |
| | | //OrderDataFlowContextFactory.addCostTime(dataFlow, "invalidOrderAndBusiness", "作废订单和业务项耗时", startDate); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 8.0 广播作废已经完成业务系统订单信息 |
| | | * |
| | | * @param dataFlow |
| | | */ |
| | | private void invalidCompletedBusinessSystem(IOrderNotifyDataFlowContext dataFlow) throws Exception{ |
| | | |
| | | if(!StatusConstant.REQUEST_BUSINESS_TYPE_INSTANCE.equals(dataFlow.getBusinessType())) { |
| | | return ; |
| | | } |
| | | |
| | | //判断 订单instance 是否都变成了撤单状态 |
| | | if(centerServiceDaoImpl.judgeAllBusinessDeleteOrder(dataFlow.getoId(),StatusConstant.STATUS_CD_DELETE_ORDER) < 1){ |
| | | return ; |
| | | } |
| | | |
| | | // 根据 c_business 表中的字段business_type_cd 找到对应的消息队列名称 |
| | | Map paramIn = new HashMap(); |
| | | paramIn.put("oId",dataFlow.getoId()); |
| | | paramIn.put("statusCd",StatusConstant.STATUS_CD_DELETE_ORDER); |
| | | List<Map> completedBusinesses = centerServiceDaoImpl.getBusinessByOId(paramIn); |
| | | for(Map completedBusiness : completedBusinesses){ |
| | | ServiceBusiness serviceBusiness = ServiceBusinessUtil.getServiceBusiness(completedBusiness.get("business_type_cd").toString()); |
| | | long startTime = DateUtil.getCurrentDate().getTime(); |
| | | //发起撤单 |
| | | KafkaFactory.sendKafkaMessage(serviceBusiness.getMessageTopic(),"", |
| | | OrderDataFlowContextFactory.getDeleteInstanceTableJson(dataFlow,completedBusiness).toJSONString()); |
| | | //saveLogMessage(OrderDataFlowContextFactory.getDeleteInstanceTableJson(dataFlow,completedBusiness,appRoute.getAppService()),null); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 9.0 将订单状态改为失败,人工处理。 |
| | | * |
| | | * @param dataFlow |
| | | */ |
| | | private void updateOrderAndBusinessError(IOrderDataFlowContext dataFlow) { |
| | | |
| | | Date startDate = DateUtil.getCurrentDate(); |
| | | |
| | | //作废 订单 |
| | | centerServiceDaoImpl.updateOrder(OrderDataFlowContextFactory.getNeedErrorOrder(dataFlow)); |
| | | |
| | | //作废订单项 |
| | | centerServiceDaoImpl.updateBusiness(OrderDataFlowContextFactory.getNeedErrorOrder(dataFlow)); |
| | | |
| | | |
| | | OrderDataFlowContextFactory.addCostTime(dataFlow, "updateOrderAndBusinessError", "订单状态改为失败耗时", startDate); |
| | | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 9.0 将订单状态改为失败,人工处理。 |
| | | * |
| | | * @param dataFlow |
| | | */ |
| | | private void updateOrderAndBusinessError(IOrderNotifyDataFlowContext dataFlow) { |
| | | |
| | | Date startDate = DateUtil.getCurrentDate(); |
| | | |
| | | //作废 订单 |
| | | centerServiceDaoImpl.updateOrder(OrderDataFlowContextFactory.getNeedErrorOrder(dataFlow)); |
| | | |
| | | //作废订单项 |
| | | centerServiceDaoImpl.updateBusiness(OrderDataFlowContextFactory.getNeedErrorOrder(dataFlow)); |
| | | |
| | | |
| | | //OrderDataFlowContextFactory.addCostTime(dataFlow, "updateOrderAndBusinessError", "订单状态改为失败耗时", startDate); |
| | | |
| | | } |
| | | /** |
| | | * 将订单状态改为作废状态。 |
| | | * |
| | | * @param dataFlow |
| | | */ |
| | | private void updateOrderAndBusinessDelete(IOrderDataFlowContext dataFlow) { |
| | | |
| | | Date startDate = DateUtil.getCurrentDate(); |
| | | |
| | | //作废 订单 |
| | | centerServiceDaoImpl.updateOrder(OrderDataFlowContextFactory.getNeedInvalidOrder(dataFlow)); |
| | | |
| | | //作废订单项 |
| | | centerServiceDaoImpl.updateBusiness(OrderDataFlowContextFactory.getNeedDeleteBusiness(dataFlow)); |
| | | |
| | | //加入撤单记录 |
| | | //doAddDeleteOrderBusinessData(dataFlow); |
| | | |
| | | |
| | | |
| | | OrderDataFlowContextFactory.addCostTime(dataFlow, "updateOrderAndBusinessError", "订单状态改为失败耗时", startDate); |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 加入撤单记录 |
| | | * @param dataFlow |
| | | */ |
| | | private void doAddDeleteOrderBusinessData(IOrderDataFlowContext dataFlow){ |
| | | /* Map business = new HashMap(); |
| | | business.put("bId",SequenceUtil.getBId()); |
| | | business.put("oId",dataFlow.getoId()); |
| | | business.put("businessTypeCd",StatusConstant.REQUEST_BUSINESS_TYPE_DELETE); |
| | | business.put("remark","发起撤单"); |
| | | business.put("statusCd",StatusConstant.STATUS_CD_DELETE_ORDER);*/ |
| | | centerServiceDaoImpl.saveBusiness(OrderDataFlowContextFactory.getDeleteOrderBusiness(dataFlow,"订单失败,加入撤单")); |
| | | } |
| | | |
| | | /** |
| | | * 加入撤单记录 |
| | | * @param dataFlow |
| | | */ |
| | | private void doAddDeleteOrderBusinessData(IOrderNotifyDataFlowContext dataFlow){ |
| | | /* Map business = new HashMap(); |
| | | business.put("bId",SequenceUtil.getBId()); |
| | | business.put("oId",dataFlow.getoId()); |
| | | business.put("businessTypeCd",StatusConstant.REQUEST_BUSINESS_TYPE_DELETE); |
| | | business.put("remark","发起撤单"); |
| | | business.put("statusCd",StatusConstant.STATUS_CD_DELETE_ORDER);*/ |
| | | centerServiceDaoImpl.saveBusiness(OrderDataFlowContextFactory.getDeleteOrderBusiness(dataFlow,"订单失败,加入撤单")); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 接受业务系统通知消息 |
| | | * @param receiveJson 接受报文 |
| | | * @throws SMOException |
| | | */ |
| | | @Override |
| | | public String orderDispatch(JSONObject orderInfo) throws Exception { |
| | | |
| | | //1.0 购物车信息校验处理,走订单受理必须要有购物车信息和订单项信息 |
| | | if(!orderInfo.containsKey("orderListInfo") || !orderInfo.containsKey("busiOrder")){ |
| | | throw new IllegalArgumentException("请求报文中没有购物车相关信息[orderListInfo]或订单项相关信息[busiOrder],请检查报文:"+orderInfo); |
| | | } |
| | | |
| | | JSONObject orderListTmp = orderInfo.getJSONObject("orderListInfo"); |
| | | |
| | | OrderList orderList = JSONObject.parseObject(orderListTmp.toJSONString(),OrderList.class); |
| | | |
| | | String olId = orderList.getOlId(); |
| | | //生成olId |
| | | if(StringUtils.isBlank(olId) || olId.startsWith("-") ){ |
| | | olId = this.queryPrimaryKey(iPrimaryKeyService,"OL_ID"); |
| | | orderList.setOlId(olId); |
| | | } |
| | | |
| | | //这里保存购物车 |
| | | |
| | | int saveOrderListFlag = iOrderServiceDao.saveDataToBoOrderList(orderList); |
| | | if (saveOrderListFlag < 1){ |
| | | throw new RuntimeException("保存购物车信息失败"+orderListTmp); |
| | | } |
| | | |
| | | //保存购物车属性 |
| | | |
| | | if(orderInfo.containsKey("orderListAttrs")){ |
| | | JSONArray orderListAttrs = orderInfo.getJSONArray("orderListAttrs"); |
| | | |
| | | List<OrderListAttr> orderListAttrsTmp = JSONObject.parseArray(orderListAttrs.toJSONString(), OrderListAttr.class); |
| | | |
| | | for(OrderListAttr orderListAttr : orderListAttrsTmp){ |
| | | orderListAttr.setOlId(olId); |
| | | saveOrderListFlag = iOrderServiceDao.saveDataToOrderListAttr(orderListAttr); |
| | | if(saveOrderListFlag < 1){ |
| | | throw new RuntimeException("保存购物车属性信息失败"+JSONObject.toJSONString(orderListAttr)); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | //获取 订单项 |
| | | JSONArray busiOrderTmps = orderInfo.getJSONArray("busiOrder"); |
| | | |
| | | for(int busiOrderTmpsIndex = 0 ; busiOrderTmpsIndex < busiOrderTmps.size() ; busiOrderTmpsIndex++){ |
| | | JSONObject busiOrderJson = busiOrderTmps.getJSONObject(busiOrderTmpsIndex); |
| | | if (!busiOrderJson.containsKey("busiObj")){ |
| | | throw new IllegalArgumentException("请求报文中busiOrder 节点中没有对应的 busiObj 节点,请检查"+busiOrderJson); |
| | | public void receiveBusinessSystemNotifyMessage(String receiveJson) throws SMOException{ |
| | | Date startDate = DateUtil.getCurrentDate(); |
| | | IOrderNotifyDataFlowContext dataFlow = null; |
| | | try { |
| | | //1.0 创建数据流 |
| | | dataFlow = OrderDataFlowContextFactory.newInstance(OrderNotifyDataFlow.class).builder(receiveJson,null); |
| | | //如果订单都没有保存,则再不要处理 |
| | | if(MappingCache.getValue(MappingConstant.KEY_NO_SAVE_ORDER) != null |
| | | &&MappingCache.getValue(MappingConstant.KEY_NO_SAVE_ORDER).contains(dataFlow.getOrderTypeCd())){ |
| | | //不保存订单信息 |
| | | return ; |
| | | } |
| | | |
| | | BusiOrder busiOrderObj = JSONObject.parseObject(busiOrderJson.getJSONObject("busiObj").toJSONString(),BusiOrder.class); |
| | | //如果不是 business 和instance 过程 则直接跳出 |
| | | judgeBusinessOrInstance(dataFlow); |
| | | |
| | | String boId = busiOrderObj.getBoId(); |
| | | //生成 订单项ID |
| | | if(StringUtils.isBlank(boId) || boId.startsWith("-")){ |
| | | boId = this.queryPrimaryKey(iPrimaryKeyService,"BO_ID"); |
| | | } |
| | | busiOrderObj.setOlId(olId); |
| | | //修改boId |
| | | busiOrderObj.setBoId(boId); |
| | | //2.0加载数据,没有找到appId 及配置信息 则抛出InitConfigDataException |
| | | reloadOrderInfo(dataFlow); |
| | | |
| | | //这里保存订单项 busiOrder |
| | | int saveBusiOrderFlag = iOrderServiceDao.saveDataToBusiOrder(busiOrderObj); |
| | | if(saveBusiOrderFlag < 1){ |
| | | throw new RuntimeException("保存订单项信息失败"+JSONObject.toJSONString(busiOrderObj)); |
| | | } |
| | | //3.0 判断是否成功,失败会抛出BusinessStatusException异常 |
| | | judgeBusinessStatusAndCompleteBusiness(dataFlow); |
| | | |
| | | //如果有busiOrderAttrs 节点 每个节点添加 boId |
| | | if(busiOrderJson.containsKey("busiOrderAttrs")){ |
| | | List<BusiOrderAttr> busiOrderAttrsTmp = JSONObject.parseArray(busiOrderJson.getJSONArray("busiOrderAttrs").toJSONString(), |
| | | BusiOrderAttr.class); |
| | | //4.0 修改业务为成功,如果发现业务项已经是作废或失败状态(D或E)则抛出BusinessException异常 |
| | | //completeBusiness(dataFlow); |
| | | |
| | | for (BusiOrderAttr busiOrderAttrTmp : busiOrderAttrsTmp){ |
| | | busiOrderAttrTmp.setBoId(boId); |
| | | //这里保存订单项属性 |
| | | saveBusiOrderFlag = iOrderServiceDao.saveDataToBusiOrderAttr(busiOrderAttrTmp); |
| | | if(saveBusiOrderFlag < 1){ |
| | | throw new RuntimeException("保存订单项信息属性失败"+JSONObject.toJSONString(busiOrderAttrTmp)); |
| | | } |
| | | } |
| | | } |
| | | //修改data节点下的boId,一般是没有这个值,所以直接新加就行了,不许判断是否已-开头 |
| | | if (!busiOrderJson.containsKey("data")){ |
| | | throw new IllegalArgumentException("请求报文中busiOrder 节点中没有对应的 data 节点,请检查"+busiOrderJson); |
| | | } |
| | | //5.0 判断 发起 Instance 条件是否满足,如果满足 发起 Instance过程 |
| | | judgeSendToInstance(dataFlow); |
| | | |
| | | //处理data 节点 |
| | | JSONObject data = busiOrderJson.getJSONObject("data"); |
| | | //7.0 判断撤单条件是否满足,如果满足发起撤单 |
| | | invalidCompletedBusinessSystem(dataFlow); |
| | | |
| | | for (Map.Entry<String, Object> entry : data.entrySet()) { |
| | | Object valueObj = entry.getValue(); |
| | | if (valueObj instanceof JSONObject){ |
| | | ((JSONObject)valueObj).put("boId",boId); |
| | | }else if(valueObj instanceof JSONArray){ |
| | | JSONArray valueArray = (JSONArray)valueObj; |
| | | for(int valueIndex = 0 ; valueIndex < valueArray.size(); valueIndex++){ |
| | | valueArray.getJSONObject(valueIndex).put("boId",boId); |
| | | } |
| | | } |
| | | } |
| | | }catch (BusinessStatusException e){ |
| | | |
| | | LoggerEngine.debug("处理后的data节点 :" + data.toString()); |
| | | logger.error("订单失败:" ,e); |
| | | //8.0 将订单状态改为失败,人工处理。 |
| | | updateOrderAndBusinessError(dataFlow); |
| | | |
| | | //根据busiOrder 的 actionTypeCd 注册那个服务去处理 |
| | | String actionTypeCd = busiOrderObj.getActionTypeCd(); |
| | | |
| | | }catch (BusinessException e) { |
| | | //9.0说明这个订单已经失败了,再不需要 |
| | | //想法,这里广播当前失败业务 |
| | | logger.error("修改业务数据失败",e); |
| | | }/*catch (InitConfigDataException e){ //这种一般不会出现,除非人工改了数据 |
| | | LoggerEngine.error("加载配置数据出错", e); |
| | | try { |
| | | //发布事件 |
| | | AppEventPublishing.multicastEvent(actionTypeCd,orderInfo.toJSONString(), data.toJSONString(),orderListTmp.getString("asyn")); |
| | | }catch (Exception e){ |
| | | //这里补偿事物 |
| | | throw e; |
| | | //6.0 作废订单和所有业务项 |
| | | invalidOrderAndBusiness(dataFlow); |
| | | //7.0 广播作废业务系统订单信息,这里只有 Instance 失败后才发起 撤单 |
| | | if(StatusConstant.REQUEST_BUSINESS_TYPE_INSTANCE.equals(dataFlow.getBusinessType())) { |
| | | invalidCompletedBusinessSystem(dataFlow); |
| | | } |
| | | } catch (Exception e1) { |
| | | LoggerEngine.error("作废订单失败", e1); |
| | | //8.0 将订单状态改为失败,人工处理。 |
| | | updateOrderAndBusinessError(dataFlow); |
| | | } |
| | | |
| | | |
| | | }*/catch (NoSupportException e){ |
| | | LoggerEngine.error("当前业务不支持", e); |
| | | }catch (Exception e){ |
| | | LoggerEngine.error("作废订单失败", e); |
| | | //10.0 成功的情况下通知下游系统失败将状态改为NE,人工处理。 |
| | | updateBusinessNotifyError(dataFlow); |
| | | }finally{ |
| | | /*OrderDataFlowContextFactory.addCostTime(dataFlow, "receiveBusinessSystemNotifyMessage", "接受业务系统通知消息耗时", startDate); |
| | | saveLogMessage(dataFlow,LogAgent.createLogMessage(dataFlow.getRequestCurrentHeaders(),dataFlow.getReqJson().toJSONString()), |
| | | LogAgent.createLogMessage(dataFlow.getResponseCurrentHeaders(),ResponseConstant.RESULT_CODE_SUCCESS), |
| | | DateUtil.getCurrentDate().getTime() - dataFlow.getStartDate().getTime());*/ |
| | | } |
| | | |
| | | return ProtocolUtil.createResultMsg(ProtocolUtil.RETURN_MSG_SUCCESS,"成功",JSONObject.parseObject(JSONObject.toJSONString(orderList))); |
| | | } |
| | | |
| | | /** |
| | | * 作废订单 |
| | | * 根据业务动作作废 |
| | | * 请求协议: |
| | | * { |
| | | * "orderList":{ |
| | | * "transactionId": "1000000200201704113137002690", |
| | | "channelId": "700212896", |
| | | "remarks": "", |
| | | "custId": "701008023904", |
| | | "statusCd": "S", |
| | | "reqTime": "20170411163709", |
| | | "extSystemId": "310013698777", |
| | | "olTypeCd": "15", |
| | | * "oldOlId":"123456789", |
| | | * "asyn":"S" |
| | | * }, |
| | | * "busiOrder":[{ |
| | | * "actionTypeCd":"ALL" |
| | | * }] |
| | | * } |
| | | * |
| | | * , |
| | | * |
| | | * 根据 订单项ID作废 |
| | | * |
| | | * { |
| | | * "orderList":{ |
| | | * "transactionId": "1000000200201704113137002690", |
| | | "channelId": "700212896", |
| | | "remarks": "", |
| | | "custId": "701008023904", |
| | | "statusCd": "S", |
| | | "reqTime": "20170411163709", |
| | | "extSystemId": "310013698777", |
| | | "olTypeCd": "15", |
| | | "asyn":"A" |
| | | * }, |
| | | * "busiOrder":[{ |
| | | * "oldBoId":"123456789" |
| | | * }, |
| | | * { |
| | | * "oldBoId":"123456799" |
| | | * }] |
| | | * } |
| | | * @param orderInfo |
| | | * @return |
| | | * @throws Exception |
| | | * Instance过程 |
| | | * @param dataFlow |
| | | */ |
| | | @Override |
| | | public String deleteOrder(JSONObject orderInfo) throws Exception { |
| | | return null; |
| | | private void doSendInstance(IOrderNotifyDataFlowContext dataFlow) { |
| | | if(dataFlow == null || !StatusConstant.REQUEST_BUSINESS_TYPE_BUSINESS.equals(dataFlow.getBusinessType())){ |
| | | return ; |
| | | } |
| | | try { |
| | | ServiceBusiness serviceBusiness = ServiceBusinessUtil.getServiceBusiness(dataFlow.getBusinessTypeCd()); |
| | | KafkaFactory.sendKafkaMessage(serviceBusiness.getMessageTopic(), "", |
| | | OrderDataFlowContextFactory.getBusinessTableDataInfoToInstanceTableJson(dataFlow).toJSONString()); |
| | | }catch (Exception e){ |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | public IPrimaryKeyService getiPrimaryKeyService() { |
| | | return iPrimaryKeyService; |
| | | /** |
| | | * 判断是否是 business 或者 instance过程 |
| | | * @param dataFlow |
| | | * @throws NoSupportException |
| | | */ |
| | | private void judgeBusinessOrInstance(IOrderNotifyDataFlowContext dataFlow) throws NoSupportException{ |
| | | |
| | | if(dataFlow == null || StatusConstant.REQUEST_BUSINESS_TYPE_BUSINESS.equals(dataFlow.getBusinessType()) || |
| | | StatusConstant.REQUEST_BUSINESS_TYPE_INSTANCE.equals(dataFlow.getBusinessType())){ |
| | | return ; |
| | | } |
| | | |
| | | throw new NoSupportException(ResponseConstant.RESULT_PARAM_ERROR,"当前只支持 Business 和 Instance过程"); |
| | | } |
| | | |
| | | public void setiPrimaryKeyService(IPrimaryKeyService iPrimaryKeyService) { |
| | | this.iPrimaryKeyService = iPrimaryKeyService; |
| | | |
| | | /** |
| | | * 2.0重新加载订单信息到dataFlow 中 |
| | | * |
| | | * @param dataFlow |
| | | */ |
| | | private void reloadOrderInfoAndConfigData(DataFlow dataFlow) { |
| | | |
| | | Map order = centerServiceDaoImpl.getOrderInfoByBId(dataFlow.getBusinesses().get(0).getbId()); |
| | | dataFlow.setoId(order.get("o_id").toString()); |
| | | dataFlow.setAppId(order.get("app_id").toString()); |
| | | if("-1".equals(dataFlow.getDataFlowId()) || StringUtil.isNullOrNone(dataFlow.getDataFlowId())){ |
| | | throw new InitConfigDataException(ResponseConstant.RESULT_CODE_ERROR,"请求报文中没有包含 dataFlowId 节点"); |
| | | } |
| | | //重新刷端口信息 |
| | | ServiceInfoListener serviceInfoListener = ApplicationContextFactory.getBean("serviceInfoListener",ServiceInfoListener.class); |
| | | if(serviceInfoListener != null){ |
| | | dataFlow.setPort(serviceInfoListener.getServerPort()+""); |
| | | } |
| | | //重新加载配置 |
| | | //initConfigData(dataFlow); |
| | | } |
| | | |
| | | public IOrderServiceDao getiOrderServiceDao() { |
| | | return iOrderServiceDao; |
| | | |
| | | /** |
| | | * 2.0重新加载订单信息到dataFlow 中 |
| | | * |
| | | * @param dataFlow |
| | | */ |
| | | private void reloadOrderInfo(IOrderNotifyDataFlowContext dataFlow) { |
| | | |
| | | Map order = centerServiceDaoImpl.getOrderInfoByBId(dataFlow.getbId()); |
| | | dataFlow.setoId(order.get("o_id").toString()); |
| | | if("-1".equals(dataFlow.getDataFlowId()) || StringUtil.isNullOrNone(dataFlow.getDataFlowId())){ |
| | | throw new InitConfigDataException(ResponseConstant.RESULT_CODE_ERROR,"请求报文中没有包含 dataFlowId 节点"); |
| | | } |
| | | } |
| | | |
| | | public void setiOrderServiceDao(IOrderServiceDao iOrderServiceDao) { |
| | | this.iOrderServiceDao = iOrderServiceDao; |
| | | /** |
| | | * 9.0 成功的情况下通知下游系统失败将状态改为NE,人工处理。 |
| | | * |
| | | * @param dataFlow |
| | | */ |
| | | private void updateBusinessNotifyError(IOrderNotifyDataFlowContext dataFlow) { |
| | | |
| | | Date startDate = DateUtil.getCurrentDate(); |
| | | //完成订单项 |
| | | centerServiceDaoImpl.updateBusinessByBId(OrderDataFlowContextFactory.getNeedNotifyErrorBusiness(dataFlow)); |
| | | |
| | | // OrderDataFlowContextFactory.addCostTime(dataFlow, "updateBusinessNotifyError", "订单状态改为失败耗时", startDate); |
| | | |
| | | } |
| | | |
| | | public EventProperties getEventProperties() { |
| | | return eventProperties; |
| | | /** |
| | | * 判断是否都成功了 |
| | | * @param dataFlow |
| | | */ |
| | | private void judgeBusinessStatusAndCompleteBusiness(IOrderNotifyDataFlowContext dataFlow) throws BusinessStatusException{ |
| | | |
| | | //List<Business> businesses = dataFlow.getBusinesses(); |
| | | |
| | | //1.0 判断是否存在撤单,如果是撤单则将当前 bId 标记为撤单状态 |
| | | if(StatusConstant.REQUEST_BUSINESS_TYPE_INSTANCE.equals(dataFlow.getBusinessType())) { |
| | | Map businessMap = centerServiceDaoImpl.getDeleteOrderBusinessByOId(dataFlow.getoId()); |
| | | if(businessMap != null && !businessMap.isEmpty()){ |
| | | centerServiceDaoImpl.updateBusinessByBId(OrderDataFlowContextFactory.getNeedDeleteBusiness(dataFlow)); |
| | | return ; |
| | | } |
| | | } |
| | | |
| | | //Business business = dataFlow.getCurrentBusiness(); |
| | | if(!ResponseConstant.RESULT_CODE_SUCCESS.equals(((IOrderResponse)dataFlow).getCode())){ |
| | | //throw new BusinessStatusException(business.getCode(),"业务bId= "+business.getbId() + " 处理失败,需要作废订单"); |
| | | //作废订单和业务项 插入撤单记录 等待撤单 |
| | | invalidOrderAndBusiness(dataFlow); |
| | | }else{ |
| | | completeBusiness(dataFlow); |
| | | } |
| | | |
| | | } |
| | | |
| | | public void setEventProperties(EventProperties eventProperties) { |
| | | this.eventProperties = eventProperties; |
| | | /** |
| | | * 3.0 修改业务为成功,如果发现业务项已经是作废或失败状态(D或E)则抛出BusinessException异常 |
| | | * |
| | | * @param dataFlow |
| | | */ |
| | | private void completeBusiness(IOrderNotifyDataFlowContext dataFlow) throws BusinessException{ |
| | | try { |
| | | if(StatusConstant.REQUEST_BUSINESS_TYPE_INSTANCE.equals(dataFlow.getBusinessType())) { |
| | | //完成订单项 |
| | | centerServiceDaoImpl.updateBusinessByBId(OrderDataFlowContextFactory.getNeedCompleteBusiness(dataFlow)); |
| | | |
| | | //如果业务都完成,则将 订单改为完成状态 |
| | | centerServiceDaoImpl.completeOrderByBId(dataFlow.getbId()); |
| | | }else if(StatusConstant.REQUEST_BUSINESS_TYPE_BUSINESS.equals(dataFlow.getBusinessType())) { |
| | | centerServiceDaoImpl.updateBusinessByBId(OrderDataFlowContextFactory.getNeedBusinessComplete(dataFlow)); |
| | | }else{ //这里到不了,前面做了校验 |
| | | throw new BusinessException(ResponseConstant.RESULT_PARAM_ERROR,"当前不支持 业务类型为 businessType" +dataFlow.getBusinessType()); |
| | | } |
| | | |
| | | }catch (DAOException e){ |
| | | throw new BusinessException(e.getResult(),e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * //4.0当所有业务动作是否都是C,将订单信息改为 C 并且发布竣工消息,这里在广播之前确认 |
| | | * @param dataFlow |
| | | */ |
| | | private void judgeSendToInstance(IOrderNotifyDataFlowContext dataFlow) throws Exception{ |
| | | try { |
| | | if(centerServiceDaoImpl.judgeAllBusinessCompleted(dataFlow.getoId(),StatusConstant.STATUS_CD_BUSINESS_COMPLETE) > 0) { |
| | | //通知成功消息 |
| | | doSendInstance(dataFlow); |
| | | } |
| | | }catch (DAOException e){ |
| | | //这里什么都不做,说明订单没有完成 |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 通知 订单已经完成,后端需要完成数据 |
| | | * @param dataFlow |
| | | */ |
| | | private void notifyBusinessSystemSuccessMessage(IOrderNotifyDataFlowContext dataFlow) throws Exception{ |
| | | |
| | | long startTime = DateUtil.getCurrentDate().getTime(); |
| | | |
| | | ServiceBusiness serviceBusiness = ServiceBusinessUtil.getServiceBusiness(dataFlow.getBusinessTypeCd()); |
| | | //拼装报文通知业务系统 |
| | | KafkaFactory.sendKafkaMessage(serviceBusiness.getMessageTopic(),"", |
| | | OrderDataFlowContextFactory.getNotifyBusinessSuccessJson(dataFlow).toJSONString()); |
| | | |
| | | /*saveLogMessage(dataFlow,LogAgent.createLogMessage(dataFlow.getRequestCurrentHeaders(),OrderDataFlowContextFactory.getNotifyBusinessSuccessJson(dataFlow).toJSONString()), |
| | | LogAgent.createLogMessage(dataFlow.getResponseCurrentHeaders(),ResponseConstant.RESULT_CODE_SUCCESS), |
| | | DateUtil.getCurrentDate().getTime() - startTime);*/ |
| | | } |
| | | |
| | | /** |
| | | * 8.0 广播作废业务系统订单信息 |
| | | * |
| | | * @param dataFlow |
| | | */ |
| | | private void notifyBusinessSystemErrorMessage(IOrderNotifyDataFlowContext dataFlow) throws Exception{ |
| | | long startTime = DateUtil.getCurrentDate().getTime(); |
| | | |
| | | ServiceBusiness serviceBusiness = ServiceBusinessUtil.getServiceBusiness(dataFlow.getBusinessTypeCd()); |
| | | |
| | | //拼装报文通知业务系统 |
| | | KafkaFactory.sendKafkaMessage(serviceBusiness.getMessageTopic(),"", |
| | | OrderDataFlowContextFactory.getNotifyBusinessErrorJson(dataFlow).toJSONString()); |
| | | /*saveLogMessage(dataFlow,LogAgent.createLogMessage(dataFlow.getRequestCurrentHeaders(),OrderDataFlowContextFactory.getNotifyBusinessErrorJson(dataFlow).toJSONString()), |
| | | LogAgent.createLogMessage(dataFlow.getResponseCurrentHeaders(),ResponseConstant.RESULT_CODE_ERROR), |
| | | DateUtil.getCurrentDate().getTime() - startTime);*/ |
| | | } |
| | | |
| | | /** |
| | | * 处理同步业务 |
| | | * @param dataFlow |
| | | */ |
| | | private void doSynchronousBusinesses(IOrderDataFlowContext dataFlow) throws BusinessException{ |
| | | Date startDate = DateUtil.getCurrentDate(); |
| | | List<Business> synchronousBusinesses = OrderDataFlowContextFactory.getSynchronousBusinesses(dataFlow); |
| | | |
| | | List<Business> deleteBusinesses = new ArrayList<Business>(); |
| | | |
| | | if(synchronousBusinesses == null || synchronousBusinesses.size() == 0){ |
| | | return ; |
| | | } |
| | | JSONArray responseBusinesses = new JSONArray(); |
| | | |
| | | //6.1处理同步服务 发起Business |
| | | doSaveDataInfoToBusinessTable(dataFlow, synchronousBusinesses, responseBusinesses); |
| | | |
| | | try { |
| | | //6.2发起Instance |
| | | doBusinessTableDataInfoToInstanceTable(dataFlow, synchronousBusinesses,deleteBusinesses); |
| | | }catch (Exception e){ |
| | | try { |
| | | //这里发起撤单逻辑 |
| | | doDeleteOrderAndInstanceData(dataFlow, deleteBusinesses); |
| | | }catch (Exception e1){ |
| | | logger.error("撤单失败",e1); |
| | | //这里记录撤单失败的信息 |
| | | } |
| | | throw new BusinessException(ResponseConstant.RESULT_PARAM_ERROR,e.getMessage()); |
| | | } |
| | | //6.3 c_business 数据修改为完成 |
| | | /*List<Business> asynchronousBusinesses = OrderDataFlowContextFactory.getAsynchronousBusinesses(dataFlow); |
| | | if(asynchronousBusinesses == null || asynchronousBusinesses.size() == 0){ |
| | | doComplateOrderAndBusiness(dataFlow,synchronousBusinesses); |
| | | }*/ |
| | | OrderDataFlowContextFactory.addCostTime(dataFlow, "doSynchronousBusinesses", "同步调用业务系统总耗时", startDate); |
| | | } |
| | | |
| | | /** |
| | | * 发起撤单业务 |
| | | * @param dataFlow |
| | | * @param deleteBusinesses |
| | | */ |
| | | private void doDeleteOrderAndInstanceData(IOrderDataFlowContext dataFlow, List<Business> deleteBusinesses) { |
| | | |
| | | if(deleteBusinesses == null || deleteBusinesses.size() == 0){ |
| | | return ; |
| | | } |
| | | |
| | | //1.0 在c_business 表中加入 撤单记录 |
| | | centerServiceDaoImpl.saveBusiness(OrderDataFlowContextFactory.getDeleteOrderBusiness(dataFlow,"业务系统实例失败,发起撤单")); |
| | | //2.0 作废 c_orders 和 c_business 数据 |
| | | updateOrderAndBusinessDelete(dataFlow); |
| | | //3.0 发起 撤单业务 |
| | | doDeleteBusinessSystemInstanceData(dataFlow,deleteBusinesses); |
| | | } |
| | | |
| | | /** |
| | | * 完成订单状态 |
| | | * @param synchronousBusinesses |
| | | */ |
| | | /*private void doComplateOrderAndBusiness(DataFlow dataFlow,List<Business> synchronousBusinesses) { |
| | | |
| | | //Complete Order and business |
| | | Map order = new HashMap(); |
| | | order.put("oId",dataFlow.getoId()); |
| | | order.put("statusCd", StatusConstant.STATUS_CD_COMPLETE); |
| | | order.put("finishTime",DateUtil.getCurrentDate()); |
| | | centerServiceDaoImpl.updateOrder(order); |
| | | centerServiceDaoImpl.updateBusiness(order); |
| | | Date businessStartDate; |
| | | AppService service; |
| | | JSONObject requestBusinessJson; |
| | | for(Business business : synchronousBusinesses){ |
| | | businessStartDate = DateUtil.getCurrentDate(); |
| | | service = OrderDataFlowContextFactory.getService(dataFlow,business.getServiceCode()); |
| | | if(!CommonConstant.INSTANCE_Y.equals(service.getIsInstance())){ |
| | | continue; |
| | | } |
| | | requestBusinessJson = OrderDataFlowContextFactory.getCompleteInstanceDataJson(dataFlow,business); |
| | | JSONObject responseJson = doRequestBusinessSystem(dataFlow, service, requestBusinessJson); |
| | | |
| | | OrderDataFlowContextFactory.addCostTime(dataFlow, business.getServiceCode(), "调用"+business.getServiceName()+"-doComplete耗时", businessStartDate); |
| | | saveLogMessage(dataFlow,LogAgent.createLogMessage(dataFlow.getRequestCurrentHeaders(),requestBusinessJson.toJSONString()), |
| | | LogAgent.createLogMessage(dataFlow.getResponseCurrentHeaders(),responseJson.toJSONString()), |
| | | DateUtil.getCurrentDate().getTime() - businessStartDate.getTime()); |
| | | } |
| | | |
| | | }*/ |
| | | |
| | | /** |
| | | * 将BusinessTable 中的数据保存到 InstanceTable |
| | | * @param dataFlow |
| | | * @param synchronousBusinesses |
| | | */ |
| | | private void doBusinessTableDataInfoToInstanceTable(IOrderDataFlowContext dataFlow, List<Business> synchronousBusinesses,List<Business> deleteBusinesses) { |
| | | Date businessStartDate; |
| | | ServiceBusiness serviceBusiness; |
| | | JSONObject requestBusinessJson; |
| | | for(Business business : synchronousBusinesses){ |
| | | businessStartDate = DateUtil.getCurrentDate(); |
| | | serviceBusiness = ServiceBusinessUtil.getServiceBusiness(business.getBusinessTypeCd()); |
| | | //添加需要撤单的业务信息 |
| | | deleteBusinesses.add(business); |
| | | |
| | | requestBusinessJson = OrderDataFlowContextFactory.getBusinessTableDataInfoToInstanceTableJson(dataFlow,business); |
| | | JSONObject responseJson = doRequestBusinessSystem(dataFlow, serviceBusiness, requestBusinessJson); |
| | | //发布事件 |
| | | DataFlowEventPublishing.invokeBusinessISuccess(dataFlow,business); |
| | | updateBusinessStatusCdByBId(business.getbId(),StatusConstant.STATUS_CD_COMPLETE); |
| | | OrderDataFlowContextFactory.addCostTime(dataFlow, business.getBusinessTypeCd(), "调用"+business.getBusinessTypeCd()+"耗时", businessStartDate); |
| | | /* saveLogMessage(dataFlow,LogAgent.createLogMessage(dataFlow.getRequestCurrentHeaders(),requestBusinessJson.toJSONString()), |
| | | LogAgent.createLogMessage(dataFlow.getResponseCurrentHeaders(),responseJson.toJSONString()), |
| | | DateUtil.getCurrentDate().getTime() - businessStartDate.getTime());*/ |
| | | } |
| | | |
| | | /* if(dataFlow.getCurrentBusiness() == null){ |
| | | return ; |
| | | }*/ |
| | | |
| | | //判断业务动作是否都竣工,主要考虑 请求报文中 有异步也有同步的情况 |
| | | //如果业务都完成,则将 订单改为完成状态 |
| | | centerServiceDaoImpl.completeOrderByOId(dataFlow.getOrders().getoId()); |
| | | } |
| | | |
| | | /** |
| | | * 业务系统撤单 |
| | | * @param dataFlow |
| | | * @param deleteBusinesses |
| | | */ |
| | | private void doDeleteBusinessSystemInstanceData(IOrderDataFlowContext dataFlow, List<Business> deleteBusinesses) { |
| | | Date businessStartDate; |
| | | JSONObject requestBusinessJson; |
| | | ServiceBusiness serviceBusiness; |
| | | for(Business business : deleteBusinesses){ |
| | | businessStartDate = DateUtil.getCurrentDate(); |
| | | requestBusinessJson = OrderDataFlowContextFactory.getDeleteInstanceTableJson(dataFlow,business); |
| | | serviceBusiness = ServiceBusinessUtil.getServiceBusiness(business.getBusinessTypeCd()); |
| | | JSONObject responseJson = doRequestBusinessSystem(dataFlow, serviceBusiness, requestBusinessJson); |
| | | OrderDataFlowContextFactory.addCostTime(dataFlow, business.getBusinessTypeCd(), "调用"+business.getBusinessTypeCd()+"-撤单 耗时", businessStartDate); |
| | | // saveLogMessage(dataFlow,LogAgent.createLogMessage(dataFlow.getRequestCurrentHeaders(),requestBusinessJson.toJSONString()), |
| | | // LogAgent.createLogMessage(dataFlow.getResponseCurrentHeaders(),responseJson.toJSONString()), |
| | | // DateUtil.getCurrentDate().getTime() - businessStartDate.getTime()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 调用下游系统 |
| | | * @param dataFlow |
| | | * @param serviceBusiness |
| | | * @param requestBusinessJson 请求报文 |
| | | * @return |
| | | */ |
| | | private JSONObject doRequestBusinessSystem(IOrderDataFlowContext dataFlow, ServiceBusiness serviceBusiness, JSONObject requestBusinessJson) { |
| | | String responseMessage; |
| | | |
| | | Assert.hasLength(serviceBusiness.getInvokeType(),"c_service_business表配置出错,invoke_type 不能为空"+ serviceBusiness.getBusinessTypeCd()); |
| | | if(ServiceBusinessConstant.INVOKE_TYPE_WEBSERVICE.equals(serviceBusiness.getInvokeType())) {//webservice方式 |
| | | String url = serviceBusiness.getUrl(); |
| | | String[] urls = url.split("#"); |
| | | |
| | | if(urls.length != 2){ |
| | | throw new ConfigDataException(ResponseConstant.RESULT_CODE_CONFIG_ERROR,"配置错误:c_service_business配置url字段错误"+serviceBusiness.getBusinessTypeCd()); |
| | | } |
| | | String webserviceUrl = CodeMapUtil.getDynamicConstantValue(urls[0]); |
| | | String method = CodeMapUtil.getDynamicConstantValue(urls[1]); |
| | | responseMessage = (String) WebServiceAxisClient.callWebService(webserviceUrl,method, |
| | | new Object[]{requestBusinessJson.toJSONString()}, |
| | | serviceBusiness.getTimeout()); |
| | | }else if(ServiceBusinessConstant.INVOKE_TYPE_HTTP_POST.equals(serviceBusiness.getInvokeType())){ |
| | | //http://user-service/test/sayHello |
| | | String httpPostUrl = CodeMapUtil.getDynamicConstantValue(serviceBusiness.getUrl()); |
| | | responseMessage = restTemplate.postForObject(httpPostUrl,requestBusinessJson.toJSONString(),String.class); |
| | | }else if(ServiceBusinessConstant.INVOKE_TYPE_OUT_HTTP_POST.equals(serviceBusiness.getInvokeType())){ |
| | | String httpPostUrl = CodeMapUtil.getDynamicConstantValue(serviceBusiness.getUrl()); |
| | | responseMessage = restTemplateNoLoadBalanced.postForObject(httpPostUrl,requestBusinessJson.toJSONString(),String.class); |
| | | } |
| | | else {//post方式 |
| | | throw new ConfigDataException(ResponseConstant.RESULT_CODE_CONFIG_ERROR,"配置错误:c_service_business配置url字段错误,当前无法识别"+serviceBusiness.getBusinessTypeCd()); |
| | | } |
| | | |
| | | if(StringUtil.isNullOrNone(responseMessage) || !Assert.isJsonObject(responseMessage)){ |
| | | throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,"下游系统返回格式不正确,请按协议规范处理"); |
| | | } |
| | | JSONObject responseJson = JSONObject.parseObject(responseMessage); |
| | | |
| | | Assert.jsonObjectHaveKey(responseJson,"response","下游返回报文格式错误,没有包含responseJson节点【"+serviceBusiness.getBusinessTypeCd()+"】"); |
| | | |
| | | JSONObject responseInfo = responseJson.getJSONObject("response"); |
| | | |
| | | Assert.jsonObjectHaveKey(responseInfo,"code","下游返回报文格式错误,response 节点中没有包含code节点【"+serviceBusiness.getBusinessTypeCd()+"】"); |
| | | |
| | | if(!ResponseConstant.RESULT_CODE_SUCCESS.equals(responseInfo.getString("code"))){ |
| | | throw new BusinessException(ResponseConstant.RESULT_PARAM_ERROR,"业务系统处理失败,"+responseInfo.getString("message")); |
| | | } |
| | | return responseJson; |
| | | } |
| | | |
| | | private String doTransferRequestBusinessSystem(DataFlow dataFlow, AppService service, String reqData) { |
| | | String responseMessage; |
| | | if(service.getMethod() == null || "".equals(service.getMethod())) {//post方式 |
| | | //http://user-service/test/sayHello |
| | | HttpHeaders header = new HttpHeaders(); |
| | | for(String key : dataFlow.getRequestCurrentHeaders().keySet()){ |
| | | header.add(key,dataFlow.getRequestCurrentHeaders().get(key)); |
| | | } |
| | | HttpEntity<String> httpEntity = new HttpEntity<String>(reqData, header); |
| | | responseMessage = restTemplateNoLoadBalanced.postForObject(service.getUrl(),httpEntity,String.class); |
| | | }else{//webservice方式 |
| | | responseMessage = (String) WebServiceAxisClient.callWebService(service.getUrl(),service.getMethod(), |
| | | new Object[]{dataFlow.getRequestBusinessJson().toJSONString()}, |
| | | service.getTimeOut()); |
| | | } |
| | | return responseMessage; |
| | | } |
| | | |
| | | /** |
| | | * 数据保存到BusinessTable 中 |
| | | * @param dataFlow |
| | | * @param synchronousBusinesses |
| | | * @param responseBusinesses |
| | | */ |
| | | private void doSaveDataInfoToBusinessTable(IOrderDataFlowContext dataFlow, List<Business> synchronousBusinesses, JSONArray responseBusinesses) { |
| | | Date businessStartDate; |
| | | ServiceBusiness serviceBusiness; |
| | | JSONObject requestBusinessJson; |
| | | for(Business business : synchronousBusinesses) { |
| | | businessStartDate = DateUtil.getCurrentDate(); |
| | | //发起Business过程 |
| | | updateBusinessStatusCdByBId(business.getbId(),StatusConstant.STATUS_CD_BUSINESS); |
| | | |
| | | serviceBusiness = ServiceBusinessUtil.getServiceBusiness(business.getBusinessTypeCd()); |
| | | requestBusinessJson = OrderDataFlowContextFactory.getRequestBusinessJson(dataFlow,business); |
| | | |
| | | JSONObject responseJson = doRequestBusinessSystem(dataFlow, serviceBusiness, requestBusinessJson); |
| | | |
| | | //发布事件 |
| | | DataFlowEventPublishing.invokeBusinessBSuccess(dataFlow,business); |
| | | |
| | | responseBusinesses.add(responseJson); |
| | | |
| | | OrderDataFlowContextFactory.addCostTime(dataFlow, business.getBusinessTypeCd(), "调用"+business.getBusinessTypeCd()+"耗时", businessStartDate); |
| | | /* saveLogMessage(null,LogAgent.createLogMessage(dataFlow.getRequestCurrentHeaders(),requestBusinessJson.toJSONString()), |
| | | LogAgent.createLogMessage(dataFlow.getResponseCurrentHeaders(),responseJson.toJSONString()), |
| | | DateUtil.getCurrentDate().getTime()-businessStartDate.getTime());*/ |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 处理异步业务 |
| | | * @param |
| | | */ |
| | | private void doAsynchronousBusinesses(IOrderDataFlowContext dataFlow) throws BusinessException{ |
| | | Date startDate = DateUtil.getCurrentDate(); |
| | | //6.3 处理异步,按消息队里处理 |
| | | List<Business> asynchronousBusinesses = OrderDataFlowContextFactory.getAsynchronousBusinesses(dataFlow); |
| | | |
| | | if(asynchronousBusinesses == null || asynchronousBusinesses.size() == 0){ |
| | | return ; |
| | | } |
| | | ServiceBusiness serviceBusiness; |
| | | try { |
| | | for (Business business : asynchronousBusinesses) { |
| | | serviceBusiness = ServiceBusinessUtil.getServiceBusiness(business.getBusinessTypeCd()); |
| | | KafkaFactory.sendKafkaMessage(serviceBusiness.getMessageTopic(), "", |
| | | OrderDataFlowContextFactory.getRequestBusinessJson(dataFlow,business).toJSONString()); |
| | | } |
| | | }catch (Exception e){ |
| | | throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,e.getMessage()); |
| | | } |
| | | |
| | | OrderDataFlowContextFactory.addCostTime(dataFlow, "doSynchronousBusinesses", "异步调用业务系统总耗时", startDate); |
| | | // saveLogMessage(dataFlow,LogAgent.createLogMessage(dataFlow.getRequestCurrentHeaders(),dataFlow.getRequestBusinessJson().toJSONString()), |
| | | // LogAgent.createLogMessage(dataFlow.getRequestCurrentHeaders(),dataFlow.getResponseBusinessJson().toJSONString()), |
| | | // DateUtil.getCurrentDate().getTime()-startDate.getTime()); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 保存日志信息 |
| | | * @param dataFlow 数据流对象 封装用户请求的信息 |
| | | * |
| | | * @param requestJson 请求报文 格式为 |
| | | * {"headers":"", |
| | | * "body":"" |
| | | * } |
| | | * @param responseJson 请求报文 格式为 |
| | | * {"headers":"", |
| | | * "body":"" |
| | | * } |
| | | */ |
| | | private void saveLogMessage(DataFlow dataFlow,JSONObject requestJson,JSONObject responseJson,long costTime){ |
| | | LogAgent.sendLog(dataFlow,requestJson,responseJson,costTime); |
| | | } |
| | | |
| | | /** |
| | | * 保存日志信息 |
| | | * @param requestJson |
| | | */ |
| | | private void saveLogMessage(String requestJson,String responseJson){ |
| | | |
| | | try{ |
| | | if(MappingConstant.VALUE_ON.equals(MappingCache.getValue(MappingConstant.KEY_LOG_ON_OFF))){ |
| | | JSONObject log = new JSONObject(); |
| | | log.put("request",requestJson); |
| | | log.put("response",responseJson); |
| | | KafkaFactory.sendKafkaMessage(KafkaConstant.TOPIC_LOG_NAME,"",log.toJSONString()); |
| | | } |
| | | }catch (Exception e){ |
| | | logger.error("报错日志出错了,",e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 保存耗时信息 |
| | | * @param dataFlow |
| | | */ |
| | | private void saveCostTimeLogMessage(DataFlow dataFlow){ |
| | | try{ |
| | | if(MappingConstant.VALUE_ON.equals(MappingCache.getValue(MappingConstant.KEY_COST_TIME_ON_OFF))){ |
| | | List<DataFlowLinksCost> dataFlowLinksCosts = dataFlow.getLinksCostDates(); |
| | | JSONObject costDate = new JSONObject(); |
| | | JSONArray costDates = new JSONArray(); |
| | | JSONObject newObj = null; |
| | | for(DataFlowLinksCost dataFlowLinksCost : dataFlowLinksCosts){ |
| | | newObj = JSONObject.parseObject(JSONObject.toJSONString(dataFlowLinksCost)); |
| | | newObj.put("dataFlowId",dataFlow.getDataFlowId()); |
| | | newObj.put("transactionId",dataFlow.getTransactionId()); |
| | | costDates.add(newObj); |
| | | } |
| | | costDate.put("costDates",costDates); |
| | | |
| | | KafkaFactory.sendKafkaMessage(KafkaConstant.TOPIC_COST_TIME_LOG_NAME,"",costDate.toJSONString()); |
| | | } |
| | | }catch (Exception e){ |
| | | logger.error("报错日志出错了,",e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 修改c_business状态 |
| | | * @param bId |
| | | * @param statusCd |
| | | */ |
| | | private void updateBusinessStatusCdByBId(String bId,String statusCd){ |
| | | Map business = new HashMap(); |
| | | business.put("bId",bId); |
| | | business.put("statusCd",statusCd); |
| | | business.put("finishTime",DateUtil.getCurrentDate()); |
| | | centerServiceDaoImpl.updateBusinessByBId(business); |
| | | } |
| | | |
| | | public ICenterServiceDAO getCenterServiceDaoImpl() { |
| | | return centerServiceDaoImpl; |
| | | } |
| | | |
| | | public void setCenterServiceDaoImpl(ICenterServiceDAO centerServiceDaoImpl) { |
| | | this.centerServiceDaoImpl = centerServiceDaoImpl; |
| | | } |
| | | |
| | | public RestTemplate getRestTemplate() { |
| | | return restTemplate; |
| | | } |
| | | |
| | | public void setRestTemplate(RestTemplate restTemplate) { |
| | | this.restTemplate = restTemplate; |
| | | } |
| | | |
| | | public IQueryServiceSMO getQueryServiceSMOImpl() { |
| | | return queryServiceSMOImpl; |
| | | } |
| | | |
| | | public void setQueryServiceSMOImpl(IQueryServiceSMO queryServiceSMOImpl) { |
| | | this.queryServiceSMOImpl = queryServiceSMOImpl; |
| | | } |
| | | |
| | | public RestTemplate getRestTemplateNoLoadBalanced() { |
| | | return restTemplateNoLoadBalanced; |
| | | } |
| | | |
| | | public void setRestTemplateNoLoadBalanced(RestTemplate restTemplateNoLoadBalanced) { |
| | | this.restTemplateNoLoadBalanced = restTemplateNoLoadBalanced; |
| | | } |
| | | } |