签约解约控制器接口

签约解约控制器接口,第1张

签约解约控制器接口

@RestController
@RequestMapping(path="/sign",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@Api(value = "签约控制器接口",tags="签约控制器接口-SignApiController",description = "签约控制器接口",produces="application/json")
public class SignApiController extends baseApiController {


    @Autowired
    private UnsignService unSignService;

    @Autowired
    private SignService signService;

    
    @RequestMapping("unsign")
    @ApiOperation(value = "解约请求接口",httpMethod = "POST")
    PayCoreResult unsign(@RequestBody UnsignRequest request) {
        return unSignService.unsign(request);
    }

    
    @RequestMapping("query")
    @ApiOperation(value = "条件查询签约信息",httpMethod = "POST")
    PayCoreResult query(@RequestBody QuerySignRequest request) {
        return signService.query(request);
    }

    
    @RequestMapping("sign")
    @MethodRequired
    @ApiOperation(value = "协议签约接口",httpMethod = "POST")
    public PayCoreResult sign(@RequestBody SignRequest request){
        return signService.sign(request);
    }

    
    @RequestMapping("sign/confirm/i")
    @ApiOperation(value = "协议签约确认接口",httpMethod = "POST")
    PayCoreResult sign/confirm/i(@RequestBody Sign/confirm/iRequest request){
        return signService.sign/confirm/i(request);
    }

    
    @RequestMapping("checkSign")
    @ApiOperation(value = "校验是否需要签约",httpMethod = "POST")
    PayCoreResult checkSign(@RequestBody SignCheckRequest request){
        return signService.signCheck(request);
    }
}





public interface UnsignService {

    
    PayCoreResult unsign(UnsignRequest request);


    
    boolean unsignAck(CorebaseResponseBody responseBody);

    boolean unsignRecvGw(MessageEntity messageEntity) throws PayCoreException;

}





@Service
public class UnsignServiceImpl extends Servicebase implements UnsignService {

    private Logger logger = LoggerFactory.getLogger(UnsignServiceImpl.class);

    @Autowired
    private MonitorService monitorService;

    @Autowired
    private UnsignDomainFactory unsignDomainFactory;

    @Autowired
    private UnsignCardCommandChain unsignCardCommandChain;

    @Autowired
    private UnsignWapCommandChain unsignWapCommandChain;

    @Autowired
    private UnsignCardCommand unsignCardCommand;

    @Autowired
    private UnsignWapCommand unsignWapCommand;

    @Autowired
    private UnsignDetailRepository unsignDetailRepository;

    @Autowired
    private UnsignOrderRepository unsignOrderRepository;

    @Autowired
    private UnsignNotifyBizCommand unsignNotifyBizCommand;

    @Autowired
    private WapSignDetailRepository wapSignDetailRepository;

    @Autowired
    private WapSignOrderRepository wapSignOrderRepository;

    @Autowired
    private UnsignDomainRepository unsignDomainRepository;

    @Autowired
    private WapSignNotifyBizCommand wapSignNotifyBizCommand;


    
    @Override
    public PayCoreResult unsign(UnsignRequest request) {
        return serviceTemplate.execute(new ServiceCallback() {
            @Override
            public Domain beforeProcess() throws PayCoreException {
                //参数校验
                AssertUtils.isNotNull(request, SystemErrorCode.BIZ_PARAM_NULL);
                request.check();

                return unsignDomainFactory.createDomain(request);
            }

            @Override
            public void execute(Domain domain) throws PayCoreException {
                UnsignDomain unsignDomain = (UnsignDomain) domain;
                if (StringUtils.equals(unsignDomain.getUnsignOrder().getSignType(), SignTypeEnum.CARD.code())) {
                    unsignCardCommandChain.execute(domain);//yhk解约
                } else {
                    unsignWapCommandChain.execute(domain);//网关解约
                }
            }

            @Override
            public PayCoreResult resultProcess(Domain domain) {
                UnsignDomain unsignDomain = (UnsignDomain) domain;
                return new PayCoreResult(new baseResultVo(unsignDomain.getUnsignOrder().getBizStatus(),
                        unsignDomain.getUnsignOrder().getRespCode(), unsignDomain.getUnsignOrder().getRespMsg()));
            }
        });
    }


    @Override
    public boolean unsignAck(CorebaseResponseBody responseBody) {
        UnsignDomain domain = new UnsignDomain();
        //幂等性校验
        UnsignDetail detail = unsignDetailRepository.findByPayOrderNo(responseBody.getPayOrderNo());
        if (detail != null) {
            logger.info("解约订单已经存在,不需要继续发起解约,订单号payOrderNo:{}", responseBody.getPayOrderNo());
            return true;
        }
        //状态校验
        UnsignOrder unsignOrder = unsignOrderRepository.findByPayOrderNo(responseBody.getPayOrderNo());
        if (unsignOrder == null
                || StringUtils.equals(BizStatus.FAILED.code(), unsignOrder.getBizStatus())
                || StringUtils.equals(BizStatus.SUCCESS.code(), unsignOrder.getBizStatus())) {
            return true;
        }
        domain.setUnsignOrder(unsignOrder);

        if (StringUtils.equals(unsignOrder.getSignType(), SignTypeEnum.CARD.code())) {
            unsignCardCommand.execute(domain);//yhk解约
        } else {
            //查找解约对应的网关签约信息
            unsignDomainRepository.findSignInfo(domain, unsignOrder.getAcctNo());
            unsignWapCommand.execute(domain);//网关解约
        }

        return true;
    }

    @Override
    public boolean unsignRecvGw(MessageEntity messageEntity) throws PayCoreException {
        //对象解析
        Header header = messageEntity.getHeader();
        baseResponseBody responseBody = messageEntity.getBody();
        String paySerialNo = header.getChannelTransNo();

        //网关状态校验
        if (ProcessStatus.GW_DOING.getGwStatus().equals(responseBody.getTransStatus())) {
            return true;
        }

        UnsignDomain domain = new UnsignDomain();

        //查询解约明细,如不存在,再查询签约明细
        UnsignDetail detail = unsignDetailRepository.findByPaySerialNo(paySerialNo);
        if (detail == null) {
            logger.info("paySerialNo={}解约数据不存在,查找网关签约数据", paySerialNo);

            //解约数据不存在,paygw会根据签约表里的channelTransNo进行异步通知,所以此处查询签约明细
            WapSignDetail wapSignDetail = wapSignDetailRepository.findByPaySerialNo(paySerialNo);
            AssertUtils.isNotNull(wapSignDetail, SystemErrorCode.DATA_NOT_EXIST, "签约明细不存在paySerialNo:" + paySerialNo);
            WapSignOrder wapSignOrder = wapSignOrderRepository.findByPayOrderNo(wapSignDetail.getPayOrderNo());
            AssertUtils.isNotNull(wapSignOrder, SystemErrorCode.DATA_NOT_EXIST, "签约订单不存在");

            domain.setWapSignDetail(wapSignDetail);
            domain.setWapSignOrder(wapSignOrder);
            domain.setExistUnsign(false);
            domain.setSignType(SignTypeEnum.WAP.code());
        } else {
            UnsignOrder unsignOrder = unsignOrderRepository.findByPayOrderNo(detail.getPayOrderNo());
            if (unsignOrder == null) {
                LoggerUtil.info(logger, "payOrderNo={}解约订单不存在", detail.getPayOrderNo());
                return true;
            }
            //终态校验,解约订单状态已经终态(成功/失败)直接返回true,ack消息
            if (BizStatus.SUCCESS.getCode().equals(unsignOrder.getBizStatus())
                    || BizStatus.FAILED.getCode().equals(unsignOrder.getBizStatus())) {
                LoggerUtil.info(logger, "payOrderNo={}解约订单状态已经终态", detail.getPayOrderNo());
                return true;
            }

            domain.setUnsignOrder(unsignOrder);
            domain.setUnsignDetail(detail);
            domain.setExistUnsign(true);
            domain.setSignType(unsignOrder.getSignType());

        }

        try {
            domain = findAndSave(responseBody, domain);
        } catch (PayCoreException payCoreException) {
            //TODO SystemErrorCode.ORDER_STATUS_ERR此校验表示数据已终态,可返回true,不再消费
            if (StringUtils.equals(payCoreException.getErrorCode().getCode(),
                    SystemErrorCode.ORDER_STATUS_ERR.code())) {
                LoggerUtil.error(logger, "订单已是终态,不需要重新处理");
                return true;
            }
            LoggerUtil.error(logger, "解约异步回执事务更新异常", payCoreException);
            return false;
        } catch (Exception e) {
            LoggerUtil.error(logger, "解约UnsignDetail回执事务更新异常,参数paySerialNo:{}", paySerialNo, e);
            return false;
        }

        //异步通知业务系统
        unsignNotifyBizCommand.execute(domain);

        return true;
    }

    private UnsignDomain findAndSave(final baseResponseBody responseBody, UnsignDomain domain) throws PayCoreException{
        return transactionTemplate.execute((TransactionStatus status)->{

            if (domain.isExistUnsign()) {
                
                UnsignOrder unsignOrder = domain.getUnsignOrder();
                UnsignDetail unsignDetail = domain.getUnsignDetail();
                //用id加锁查询
                UnsignDetail localUnsignDetail = unsignDetailRepository.getDetailByIdForUpdate(unsignDetail.getId());

                /
                //AssertUtils.isTrue(ProcessStatus.GW_DOING.getCode().equals(localUnsignDetail.getProcessStatus()), SystemErrorCode.ORDER_STATUS_ERR, "明细状态不为处理中");
                //TODO 防止终态数据同时更新
                if (ProcessStatus.GW_SUCCESS.getCode().equals(localUnsignDetail.getProcessStatus())
                        || ProcessStatus.GW_FAILED.getCode().equals(localUnsignDetail.getProcessStatus())) {
                    throw new PayCoreException(SystemErrorCode.ORDER_STATUS_ERR);
                }
                //更新明细表
                localUnsignDetail.setProcessStatus(responseBody.getTransStatus());
                localUnsignDetail.setGwTransNo(responseBody.getTransNo());
                localUnsignDetail.setGwTransDate(responseBody.getTransDateTime());
                localUnsignDetail.setGwRespCode(responseBody.getRespCode());
                localUnsignDetail.setGwRespMsg(responseBody.getRespMsg());
                localUnsignDetail.setUpdateTime(DateUtil.getCurrentDate());

                unsignOrder.setRespCode(localUnsignDetail.getGwRespCode());
                unsignOrder.setRespMsg(localUnsignDetail.getGwRespMsg());
                unsignOrder.setBizStatus(BizStatus.getByGwCode(responseBody.getTransStatus()).code());
                unsignOrder.setUpdateTime(DateUtil.getCurrentDate());

                //更新解约数据
                domain.setUnsignOrder(unsignOrderRepository.save(unsignOrder));
                domain.setUnsignDetail(unsignDetailRepository.save(localUnsignDetail));

                //更新其余处理中解约数据
                unsignDomainRepository.storeUnsignInfo(domain);
            }

            return domain;
        });
    }

}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5637738.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存