package com.ynxbd.common.action.pay; import com.ynxbd.common.result.ResultEnum; import com.ynxbd.common.result.ServiceException; import lombok.ToString; import org.apache.commons.lang3.ObjectUtils; @ToString public enum PEnum { NO("匹配失败", "zero", ""), // ------------------------------------ REG("挂号", "register", "G"), RECIPE("处方", "recipe", "C"), IN_HOSP("住院预交金", "in_hosp", "Z"), OL_REG("问诊挂号", "ol_register", "OG"), CASEBOOK("病历复印", "casebook", "BL"), OUT_COLLECT("外采", "out_collect", "OC"), TPP_QR_REG("第三方-扫码挂号", "tpp_qr_reg", "G"), PEIS_RESERVE("体检预约", "peis_reserve", "P"), ; public final String NAME; public final String CODE; // Code必须唯一 public final String ORDER_CODE; // 和订单号有关,至多两位 PEnum(String NAME, String CODE, String ORDER_CODE) { this.NAME = NAME; this.CODE = CODE; this.ORDER_CODE = ORDER_CODE; } public static PEnum toEnum(String callNo) { for (PEnum item : PEnum.values()) { if (item.CODE.equals(callNo)) { return item; } } return NO; } public String toTradeNo(String transNo) { return transNo + this.ORDER_CODE; } /** * 根据订单号获取类型 * * @param bankTransNo 交易流水号 * @param tradeNo HIS订单号 * @return 类型 */ public static PEnum getByOrderNo(String bankTransNo, String tradeNo) throws ServiceException { if (!isNewOrderNo(bankTransNo, tradeNo)) { throw new ServiceException(ResultEnum.REFUND_IS_OLD_ORDER_NUM); } int len = tradeNo.length(); String middleCode1 = tradeNo.substring(len - 4, len - 3); String middleCode2 = tradeNo.substring(len - 4, len - 2); for (PEnum item : PEnum.values()) { if (item.ORDER_CODE.equals(middleCode1) || item.ORDER_CODE.equals(middleCode2)) { return item; } } return null; } /** * 判断是否为新版订单号 * * @param bankTransNo 商户交易流水号 * @param tradeNo HIS订单号 * @return 是否为新版订单号 * @throws ServiceException 业务异常 */ public static boolean isNewOrderNo(String bankTransNo, String tradeNo) throws ServiceException { if (ObjectUtils.isEmpty(bankTransNo) || ObjectUtils.isEmpty(tradeNo)) { throw new ServiceException(ResultEnum.REFUND_ORDER_IS_ERROR); } int tradeNoLen = tradeNo.length(); if (tradeNoLen < 24) { throw new ServiceException(ResultEnum.REFUND_ORDER_IS_ERROR); } if ((bankTransNo.length() + 4) != tradeNoLen) { throw new ServiceException(ResultEnum.REFUND_IS_OLD_ORDER_NUM); } return bankTransNo.equals(tradeNo.substring(0, tradeNoLen - 4)); } }