记录一次在公司秀花活

结果

其实还是以前的文章,用多态代替ifelse,先说秀花活的结果,经理说可以,但是没必要。

记录

需求

公司在扣减库存的时候,会向第三方同步扣减。但是由于各种原因,可能回传失败。对于回传失败的数据,我需要在第二天进行重传。也就是说,我需要写一个定时任务,重传数据。

分析

我需要对五个活动的数据经行回传,四个活动存在mongo,一个活动存在mysql。mysql需要进行特殊处理。所以秀花活只针对四个mongo活动。四个活动回传都是用的同一个接口,数据表接口相似。但存的数据不同。因此可以用多态代替ifelse.

开发

提取活动基类。
由于四个活动的数据表字段非常相似,所以可以提取一个超类出来:

原有类

public class EasyDispatchOutApiRecord implements Serializable {
    
    
    private String id;
    /**
     * 申领记录编码.
     */
    private String applyCode;

    /**
     * 链路id.
     */
    private String traceId;
    /**
     * 会员unionid.
     */
    private String unionid;
    /**
     * 接口名称.
     */
    private String interfaceName;
    /**
     * 接口说明.
     */
    private String interfaceExplain;
    /**
     * 接口地址.
     */
    private String interfaceAddress;
    /**
     * 请求入参.
     */
    private String requestParam;
    /**
     * 出参.
     */
    private String responseParam;
    /**
     * 请求接口结果
     */
    private Boolean status;
    /**
     * 发送错误信息.
     */
    private String errorMsg;
    /**
     * 发送时间.
     */
    private ZonedDateTime createDate;
    /**
     * 接口响应时间
     */
    private Long responseDate;

}
public class StandOutApiRecord implements Serializable {
    
    
    private String id;
    /**
     * 搭台 申领记录编码.
     */
    private String verifyCode;
    /**
     * 链路id.
     */
    private String traceId;
    /**
     * 会员unionid.
     */
    private String unionid;
    /**
     * 接口名称.
     */
    private String interfaceName;
    /**
     * 接口说明.
     */
    private String interfaceExplain;
    /**
     * 接口地址.
     */
    private String interfaceAddress;
    /**
     * 请求入参.
     */
    private String requestParam;
    /**
     * 出参.
     */
    private String responseParam;
    /**
     * 请求接口结果
     */
    private Boolean status;
    /**
     * 发送错误信息.
     */
    private String errorMsg;
    /**
     * 发送时间.
     */
    private ZonedDateTime createDate;
    /**
     * 接口响应时间
     */
    private Long responseDate;
    /**
     * 模板消息Id.
     */
    private String templateId;
}

可以看出,两个类有非常多的相同字段,因此提取基类,并设置type

public class ActiveRecord implements Serializable {
    
    
    private String id;
    /**
     * 链路id.
     */
    private String traceId;
    /**
     * 会员unionid.
     */
    private String unionid;
    /**
     * 接口名称.
     */
    private String interfaceName;
    /**
     * 接口说明.
     */
    private String interfaceExplain;
    /**
     * 接口地址.
     */
    private String interfaceAddress;
    /**
     * 请求入参.
     */
    private String requestParam;
    /**
     * 出参.
     */
    private String responseParam;
    /**
     * 请求接口结果
     */
    private Boolean status;
    /**
     * 发送错误信息.
     */
    private String errorMsg;
    /**
     * 发送时间.
     */
    private ZonedDateTime createDate;
    /**
     * 接口响应时间
     */
    private Long responseDate;
    
    String type;
    public String getType(){
    
    
        return this.type;
    }

}

那剩下两个类就可以这样写

public class EasyDispatchOutApiRecord extends ActiveRecord implements Serializable {
    
    
    /**
     * 申领记录编码.
     */
    private String applyCode;
    /**
     * 活动分类--简易派样机
     */
    private final static String type = "EasyDispatch";
    public String getType(){
    
    
        return type;
    }
}
public class StandOutApiRecord extends ActiveRecord implements Serializable {
    
    
    /**
     * 搭台 申领记录编码.
     */
    private String verifyCode;
    /**
     * 模板消息Id.
     */
    private String templateId;
    /**
     * 活动分类--搭台
     */
    private final static String type = "Stand";
    public String getType(){
    
    
        return type;
    }
}

编写回传工厂

    /**
     * 根据原数据分类调用 相应重传方法
     * @param activeRecord 需要重传的数据
     */
    public void chooseConnextRely(ActiveRecord activeRecord) {
    
    
        switch (activeRecord.getType()) {
    
    
            case "Star":
                starConnextRely.applyReturnCRM(activeRecord);
                break;
            case "EasyDispatch":
                easyDispatchConnextRely.applyReturnCRM(activeRecord);
                break;
            case "Stand":
                standConnextRely.applyReturnCRM(activeRecord);
                break;
            case "LotsSample":
                lotsSampleConnextRely.applyReturnCRM(activeRecord);
                break;
            default:
                log.info("活动信息异常:{}", activeRecord);
        }
    }

编写回传逻辑

回传接口
public interface ConnextRely {
    
    
    /**
     * 重传connext数据
     * @param activeRecord 元数据
     */
    void applyReturnCRM(ActiveRecord activeRecord);
}
接口实现
@Service
public class EasyDispatchConnextRely implements ConnextRely {
    
    

    private final BaseService baseService;

    private final EasyDispatchOutApiRecordRepository easyDispatchOutApiRecordRepository;

    public EasyDispatchConnextRely(BaseService baseService
        , EasyDispatchOutApiRecordRepository easyDispatchOutApiRecordRepository) {
    
    
        this.baseService = baseService;
        this.easyDispatchOutApiRecordRepository = easyDispatchOutApiRecordRepository;
    }

    @Value("${ELCRM.return.url}")
    private String returnUrl;

    /**
     * 简易派样机重传connext数据
     * @param activeRecord 原数据
     */
    @Override
    public void applyReturnCRM(ActiveRecord activeRecord) {
    
    
        EasyDispatchOutApiRecord activeRecordApi = (EasyDispatchOutApiRecord) activeRecord;
        String requestParam = activeRecordApi.getRequestParam();
        CrmReturnDTO crmReturnDTO = JSON.parseObject(requestParam, CrmReturnDTO.class);
        long sendDate = System.currentTimeMillis();
        String crm = baseService.applyReturnCRM(crmReturnDTO);

        EasyDispatchOutApiRecord easyDispatchOutApiRecord = new EasyDispatchOutApiRecord();
        easyDispatchOutApiRecord.setApplyCode(activeRecordApi.getApplyCode());
        easyDispatchOutApiRecord.setUnionid(activeRecordApi.getUnionid());
        easyDispatchOutApiRecord.setInterfaceName("applyReturnCRM");
        easyDispatchOutApiRecord.setInterfaceExplain("简易派样机数据回传Connext");
        easyDispatchOutApiRecord.setInterfaceAddress(returnUrl);
        easyDispatchOutApiRecord.setRequestParam(requestParam);
        easyDispatchOutApiRecord.setResponseParam(crm);
        easyDispatchOutApiRecord.setCreateDate(ZonedDateTime.now());
        easyDispatchOutApiRecord.setResponseDate(System.currentTimeMillis() - sendDate);
        easyDispatchOutApiRecordRepository.save(easyDispatchOutApiRecord);

    }
}
@Service
public class StandConnextRely implements ConnextRely {
    
    
    private final BaseService baseService;

    private final StandOutApiRecordRepository standOutApiRecordRepository;

    public StandConnextRely(BaseService baseService
        , StandOutApiRecordRepository standOutApiRecordRepository) {
    
    
        this.baseService = baseService;
        this.standOutApiRecordRepository = standOutApiRecordRepository;
    }

    @Value("${ELCRM.return.url}")
    private String returnUrl;

    /**
     * 搭台重传connext数据
     * @param activeRecord 原数据
     */
    @Override
    public void applyReturnCRM(ActiveRecord activeRecord) {
    
    
        StandOutApiRecord activeRecordApi = (StandOutApiRecord) activeRecord;
        String requestParam = activeRecordApi.getRequestParam();
        CrmReturnDTO crmReturnDTO = JSON.parseObject(requestParam, CrmReturnDTO.class);
        long sendDate = System.currentTimeMillis();
        String crm = baseService.applyReturnCRM(crmReturnDTO);

        //存储接口调用记录
        StandOutApiRecord standOutApiRecord = new StandOutApiRecord();
        standOutApiRecord.setVerifyCode(activeRecordApi.getVerifyCode());
        standOutApiRecord.setUnionid(activeRecordApi.getUnionid());
        standOutApiRecord.setInterfaceName("applyReturnCRM");
        standOutApiRecord.setInterfaceExplain("搭台数据回传Connext");
        standOutApiRecord.setInterfaceAddress(returnUrl);
        standOutApiRecord.setRequestParam(requestParam);
        standOutApiRecord.setResponseParam(crm);
        standOutApiRecord.setCreateDate(ZonedDateTime.now());
        standOutApiRecord.setResponseDate(System.currentTimeMillis() - sendDate);
        standOutApiRecordRepository.save(standOutApiRecord);
    }
}

其实存储接口调用记录也可以用这种方法写,只不过偷懒了而已。

虽然是新功能,但是也算是一次小小的重构。

猜你喜欢

转载自blog.csdn.net/qq_45770147/article/details/133180296