使用说明
推送目前不保证数据不丢失,需要有主动拉取做兜底,所以接入前请先保证有主动拉取任务存在,且主动拉取也需要缓存ChangeTime(艺龙数据变更时间),通过对比保证本地数据最新。
由于推送的吞吐量比较大,不能保证推送的顺序,所以代理拿到数据后,需要拿key=HotelId+HotelCode+RoomTypeId+RateplanId+具体某天日期、value=Time做缓存操作。当新来数据的Time>=缓存Time,则更新本地数据,如果新来数据Time<缓存Time,则舍弃该数据,保证代理本地数据始终是最新的。当Date过期时,可以从本地缓存异常该数据。
目前处于新服务接入阶段,接入前,请联系艺龙进行配置及连调。不再支持推送,请接入拉取接口
输入参数
| 节点 | 名称 | 类型 | 可为空 | 说明 |
|---|---|---|---|---|
type | 推送类型 | Enum | N | Inventory:库存增量 Rate:价格增量 Order:订单增量 State:状态增量 Data:酒店增量 HotelDetail:酒店详情增量 说明:用来标示是哪种类型数据,该接口始终为:Rate |
| data | 数据 | String | N | 无需解密,直接接收。 |
| guid | 唯一标示 | String | N | 出现问题,方便定位到哪条数据 |
Rate节点
| 节点 | 名称 | 类型 | 可为空 | 说明 |
|---|---|---|---|---|
| LastId | 增长id | Long | N | |
| Time | 变化时间 | DateTime | N | |
| HotelId | 酒店ID | String(8) | N | 这几个属性是业务主键 |
| RoomTypeId | 房型ID | String(10) | N | |
| RateplanId | 产品 ID | Int | N | |
| StartDate | 开始时间 | Date | N | |
| EndDate | 结束时间 | Date | N | |
| HotelCode | 酒店编码 | String(8) | Y | |
| Status | 库存状态 | Boolean | N | True:表示当条记录对应的房价为有效,需覆盖更新本地数据 False:表示当条记录对应的房价为无效,需更新本地价格为无效 |
| Member | 平日卖价 | Decimal | N | 具体使用的是平日卖价还是周末卖价 ,需要根据HotelCode查找hotel.data.rp中对应的酒店周末设置 |
| Weekend | 周末卖价 | Decimal | N | |
| MemberCost | 平日底价 | Decimal | N | 同上 |
| WeekendCost | 周末底价 | Decimal | N | |
| AddBed | 加床价 | Decimal | Y | -1代表不能加床,0-免费加床,大于0表示加床的费用 |
| PriceID | 价格ID | Long | N | 不能作为更新变化的主键。 |
| CurrencyCode | 货币类型 | String | Y | 参考Currency |
| InvoiceMode | 发票模式 | Int | Y | 0:全部(默认值,未区分) 1:艺龙开票 2:酒店开票 |
| IsPriceLimit | 是否限价 | Boolean | N | 表示当天价格是否限价,限价时须按照艺龙给出的售价进行售卖。 多天连住时,有一天限价,则所有天限价。 判断限价时与hotel.data.rp接口中IsPriceLimitProduct字段为或关系,两者有其一为true,则限价。 false:非限价 true:限价 |
响应结果
| 节点 | 名称 | 类型 | 可为空 | 说明 |
|---|---|---|---|---|
code | code | int | N | 0:表示接收成功 -1:表示接收失败 建议:接收成功,立马返回结果,异步进行处理。 |
| errorMsg | 错误信息 | String | N | 说明:发送失败需要给出失败信息 |
输出参数示例
{
"type": "Rate",
"guid": "031a9db5-6850-4d6b-a058-6e3e99679a20",
"data": [
{
"LastId": 5039773317,
"Time": "2016-12-11T17:37:57 08:00",
"HotelID": "30101023",
"HotelCode": "30101023",
"RoomTypeId": "1077",
"RateplanId": 25227,
"StartDate": "2016-12-11T00:00:00 08:00",
"EndDate": "2017-01-11T00:00:00 08:00",
"Status": true,
"Member": 100,
"Weekend": 100,
"MemberCost": -1,
"WeekendCost": -1,
"AddBed": -1,
"PriceID": 1233478686,
"CurrencyCode": "RMB"
}
]
}接收接口示例
@RequestMapping(value="/incr/rate/consumer",method=RequestMethod.POST)
public @ResponseBody String getIncrData(HttpServletRequest request){
PushResponse pushResponse=new PushResponse();
try {
String type=request.getParameter("type");
Assert.notNull(type,"type not null");
String data=request.getParameter("data");
Assert.notNull(data,"data not null");
String guid=request.getParameter("guid");
logger.info("message type="+type+",data="+data+",guid="+guid);
switch (type) {
case "Order":
//处理订单增量
//除订单增量需要解密外,其他需解密
if(StringUtils.isNotBlank(appkeyLast8)){
decrypt=SecurityUtil.decrypt(data,appkeyLast8);
}
break;
case "Rate":
//处理价格增量
break;
case "Inventory":
//处理库存增量
break;
case "Data":
//处理酒店增量
break;
}
pushResponse.setCode(0);
pushResponse.setErrorMsg(null);
} catch (Exception e) {
e.printStackTrace();
logger.error("error:"+e.getMessage());
// TODO: handle exception
pushResponse.setCode(-1);
pushResponse.setErrorMsg(e.getMessage());
}
return JSONObject.toJSONString(pushResponse);
}