一,需求分析
1,访问关系
外联平台--》第三方公积金机构
公司内部其他部门--》外联平台
2,设计模式
外联平台对内部提供了统一的调用接口,post或get,内部调用哪家公积金呢,入参时会传入一个cityId,通过它区分不同城市公积金。
平台后台实现怎么设计:
*适配平台 , 统一各公积金输入输出
*设计一个统一调用接口,请求体,响应体相同,各家公积金各自实现该接口,来实现各自的业务逻辑
统一接口
public interface ICheckMonthlyPayment { //获取原始报文 public BaseGjjResponse callGjjGetResponse(IcsGjjMpCrRequest rq); //原始报文转化为统一响应体 public IcsGjjMpCrResponse convertAndReturnResponse(BaseGjjResponse gjjRs, IcsGjjMpCrRequest rq); } 武汉实现类 @Service("wuHanMonPayImpl") public class WuHanMonPayImpl implements ICheckMonthlyPayment {
3,内部访问外联平台流程
对内提供了:post与get两种请求方式
1,判断是否直连查询还是查询本地数据库缓存
2,如直连查询,要重新写入本地最新数据
3,记录内部调用日志
表结构设计与响应体
主表(IcsGjjApiCheckMpCache)+明细表(IcsGjjApiCheckMpCacheMap)=响应体(IcsGjjMpCrResponse)
二,各个城市调用详细
《1》,武汉直连查询详细
1,校验该城市是否接入,接入,获取该城市接口访问信息
2,AOP,外联平台链接公积金机构,统计接口调用日志;
3,socket连接,创建socket,获取响应报文
*第一次连接,解析非标准xml报文,获取公积金信息及文件名信息报文
*第二次连接,根据第一次获取的文件名,再次连接socket,获取文件报文信息
4,解析原始报文,数据落地
《2》深圳公积金
1,esb对接
《3》杭州公积金
1,esb对接
《4》51公积金
代码:
适配平台
@Service("checkMpRouting")
public class AdapterRoutingServiceImpl implements ISwitchService{
@Autowired
Map<String, ICheckMonthlyPayment> checkMpMap;
/**
* 主业务逻辑
* 1 根据cityid路由到 第二层service DONE
* 2 DB 获取连接地址信息 DONE
* 3 访问gjj中心获得response
* 通过aspect AOP拦截方法,
* 添加逻辑 3A. circuitbreaker DONE
* 3B. 记录数据库日志-- 调用API DONE
* 3C. 记录数据库日志-- 获取RS DONE
* 4 读取RS信息,转化为输出格式
* AOP 拦截方法,记录日志 DONE
*/
public IcsGjjMpCrResponse callGjjCenterCheckMpAndConvert(IcsGjjMpCrRequest rq) {
IcsGjjMpCrResponse rs = null;
ICheckMonthlyPayment checkMpApi = null;
//根据cityid 使用不同公积金中心的client逻辑
switch (rq.getPayCityID())
{
case GjjCityIDConstants.CITYID_WUHAN:
checkMpApi = checkMpMap.get("wuHanMonPayImpl");
break;
case GjjCityIDConstants.CITYID_SHENZHEN:
checkMpApi = checkMpMap.get("shenZhenGjjEsbServiceImpl");
break;
case GjjCityIDConstants.CITYID_QINGDAO:
checkMpApi = checkMpMap.get("qingDaoMonPayImpl");
break;
case GjjCityIDConstants.CITYID_HANGZHOU:
checkMpApi = checkMpMap.get("hangZhouGjjEsbServiceImpl");
break;
default:
checkMpApi = checkMpMap.get("yahooWeatherImpl");
break;
}
//提交请求,获得返回报文并转化为实体
BaseGjjResponse gjjResponsePojo = checkMpApi.callGjjGetResponse(rq);
//转化为返回的RS POJO
rs = checkMpApi.convertAndReturnResponse(gjjResponsePojo, rq);
return rs;
}
}