结果
其实还是以前的文章,用多态代替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);
}
}
其实存储接口调用记录也可以用这种方法写,只不过偷懒了而已。
虽然是新功能,但是也算是一次小小的重构。