package com.ynxbd.common.action.pay; import com.ynxbd.common.result.ResultEnum; import com.ynxbd.common.result.ServiceException; import com.ynxbd.common.service.PayService; 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"), CASEBOOK("病例", "in_casebook", "CB"), OUT_COLLECT("外采", "out_collect", "OC"), OL_REG("问诊挂号", "ol_register", "OG"), ; public final String NAME; public final String 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; } /** * 根据订单号获取类型 * * @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)); } }