@Override
 public Passport destroy(PassCode passCode) {
   log.info("Gugong Destroy Code: " + passCode.getSerialNo());
   Passport passport = new Passport();
   passport.setEventType(PassportConstant.PASSCODE_TYPE.DESTROYCODE.name());
   passport.setSerialno(passCode.getSerialNo());
   try {
     GugongOrderResponse response = GugongHTTPUtil.getRefundResponse(passCode);
     if (response.getStatus() == 0) {
       passport.setStatus(PassportConstant.PASSCODE_STATUS.SUCCESS.name());
     } else {
       passport.setComLogContent(
           "供应商返回异常:" + GugongConstant.getInstance().getCodeMsg(response.getResultcode()));
       passport.setStatus(PassportConstant.PASSCODE_STATUS.FAILED.name());
       passport.setErrorNO(PassportConstant.PASSCODE_ERROR.DESTROY.name());
     }
   } catch (Exception e) {
     passport.setStatus(PassportConstant.PASSCODE_STATUS.FAILED.name());
     passport.setErrorNO(PassportConstant.PASSCODE_ERROR.DESTROY.name());
     passport.setComLogContent(e.getMessage());
     log.error("Gugong Destroy Exception:".concat(e.getMessage()));
   }
   return passport;
 }
  @Override
  public Passport perform(PassCode passCode) {
    log.info("Gugong perform serialNo: " + passCode.getSerialNo());
    log.info("Gugong getOrder: " + passCode.getSerialNo());

    Passport passport = null;
    GugongOrderResponse response = null;
    try {
      response = GugongHTTPUtil.getOrderStatus(passCode);
    } catch (Exception e) {
      log.error(e);
    }
    if (response != null) {
      // 永乐方已经出票,驴妈妈自动履行
      if (response.isSuccess() && response.getStatus() == 2) {
        passport = new Passport();
        passport.setChild("0");
        passport.setAdult("0");
        passport.setUsedDate(new Date());
        passport.setDeviceId("Gugong");
      } else {
        String codeMsg = GugongConstant.getInstance().getOrderStatus(response.getStatus());
        log.error("Gugong auto perform failed: ".concat(codeMsg));
      }
    } else {
      this.addComLog(
          passCode,
          GugongConstant.getInstance().getCodeMsg(response.getResultcode()),
          "查询永乐方订单状态失败");
      log.error(
          "Gugong auto perform failed: "
              .concat(GugongConstant.getInstance().getCodeMsg(response.getResultcode())));
    }

    return passport;
  }
  @Override
  public Passport apply(PassCode passCode) {
    log.info("Gugong Apply Code: " + passCode.getSerialNo());
    Passport passport = new Passport();
    passport.setEventType(PassportConstant.PASSCODE_TYPE.APPLAYCODE.name());
    passport.setSendSms(PassportConstant.PASSCODE_SMS_SENDER.LVMAMA.name());
    try {
      sendOrder(passCode, passport);
    } catch (Exception e) {
      passport.setStatus(PassportConstant.PASSCODE_STATUS.FAILED.name());
      passport.setErrorNO(PassportConstant.PASSCODE_ERROR.APPLY.name());
      passport.setComLogContent(e.getMessage());
      this.reapplySet(passport, passCode.getReapplyCount());
      log.error("Gugong Apply Exception message:", e);
    }

    return passport;
  }
 private Passport sendOrder(PassCode passCode, Passport passport) {
   String orderInfo = buildOrderInfo(passCode);
   log.info("GugongOrderRequest:" + orderInfo);
   GugongOrderResponse response = null;
   Long startTime = 0L;
   try {
     if (orderInfo.isEmpty()) {
       throw new RuntimeException("由于未获取到支付信息,未生成订单信息");
     }
     startTime = System.currentTimeMillis();
     response = GugongHTTPUtil.sendOrder(orderInfo);
     log.info(
         "Gugong Apply serialNo :"
             + passCode.getSerialNo()
             + " UseTime:"
             + (System.currentTimeMillis() - startTime) / 1000);
   } catch (ClientProtocolException e) {
     this.reapplySet(passport, passCode.getReapplyCount());
     passport.setComLogContent(
         "故宫对接推单:地址" + GugongConstant.GUGONG_URLS.GUGONG_URLS_ORDER.getUrl() + " 客户端协议异常" + e);
     log.error(e);
   } catch (ParseException e) {
     this.reapplySet(passport, passCode.getReapplyCount());
     passport.setComLogContent("解析永乐方返回的推单结果:异常" + e);
     log.error(e);
   } catch (IOException e) {
     this.reapplySet(passport, passCode.getReapplyCount());
     passport.setComLogContent(
         "故宫对接推单:地址" + GugongConstant.GUGONG_URLS.GUGONG_URLS_ORDER.getUrl() + " 网络异常" + e);
     log.error(e);
   } catch (Exception e) {
     log.error(
         "Gugong Apply serialNo Error :"
             + passCode.getSerialNo()
             + " UseTime:"
             + (System.currentTimeMillis() - startTime) / 1000);
     this.reapplySet(passport, passCode.getReapplyCount());
     passport.setComLogContent(e.getMessage());
     log.error(e);
   }
   boolean flag = false;
   if (response != null) {
     if (response.isSuccess()) {
       String ylorderId = response.getYlorderid();
       passport.setStatus(PassportConstant.PASSCODE_STATUS.SUCCESS.name());
       passport.setSerialno(passCode.getSerialNo());
       passport.setAddCode(ylorderId);
       passport.setExtId(ylorderId);
       passport.setCode(cardNum); // 故宫产品code则存放证件号
       passport.setMessageWhenApplySuccess(""); // 清空状态描述信息
       flag = true;
     }
   }
   if (!flag) {
     passport.setErrorNO(PassportConstant.PASSCODE_ERROR.APPLY.name());
     // 如果推单失败原因是由永乐方业务代码不成功,而非系统异常,申码失败且不重申码
     passport.setStatus(PassportConstant.PASSCODE_STATUS.FAILED.name());
     if (response != null) {
       passport.setComLogContent(
           GugongConstant.getInstance().getCodeMsg(response.getResultcode()));
     } else {
       passport.setComLogContent("供应商返回信息为空");
     }
   }
   return passport;
 }
 @Override
 public String getCode(Passport passport) {
   return CodeMap.getInstance().encode(passport.getAddCode());
 }