使用说明
推送目前不保证数据不丢失,需要有主动拉取做兜底,所以接入前请先保证有主动拉取任务存在,且主动拉取也需要缓存ChangeTime(艺龙数据变更时间),通过对比保证本地数据最新。
由于推送的吞吐量比较大,不能保证推送的顺序,所以代理拿到数据后,需要拿key=HotelId+HotelCode+RoomTypeId+Date、value=Time做缓存操作。当新来数据的Time>=缓存Time,则更新本地数据,如果新来数据Time<缓存Time,则舍弃该数据,保证代理本地数据始终是最新的。当Date过期时,可以从本地缓存异常该数据。
目前处于新服务接入阶段,接入前,请联系艺龙进行配置及连调。不再支持推送,请接入拉取接口
输入参数
节点 | 名称 | 类型 | 可为空 | 说明 |
---|---|---|---|---|
type | 推送类型 | Enum | N | Inventory:库存增量 Rate:价格增量 Order:订单增量 State:状态增量 Data:酒店增量 HotelDetail:酒店详情增量 说明:用来标示是哪种类型数据,该接口始终为:Inventory |
data | 数据 | String | N | 无需解密,直接接收。 |
guid | 唯一标示 | String | N | 出现问题,方便定位到哪条数据 |
Invetory节点
节点 | 名称 | 类型 | 可为空 | 说明 |
---|---|---|---|---|
LastId | 增长id | Long | N | |
Time | 变化时间 | DateTime | N | |
HotelId | 酒店ID | String(8) | N | 这几个属性是业务主键。 Date属性就是表示本记录是其对应日期的库存。 |
RoomTypeId | 房型ID | String(10) | N | |
HotelCode | 酒店编码 | String(8) | N | |
Date | 库存时间 | Date | N | |
Status | 库存状态 | Boolean | N | True: 表示当天房态为可用,需要更新本地房态 False:表示当天房态为无效,需关闭本地房态 |
Amount | 库存数量 | Int | N | |
OverBooking | 超售状态 | Int | N | 0---可超售,可以卖出超过Amount的房间数量 1—不可超售,只能销售Amount及以下的房间数量 |
StartDate | 可用开始日期 | Date | N | |
EndDate | 可用结束日期 | Date | N | |
StartTime | 可用开始时间 | Time | N | |
EndTime | 可用结束时间 | Time | N | |
IsInstantConfirm | 当天库存是否支持即时确认 | Boolean | Y | V1.33新增 |
IC_BeginTime | 预订当天即时确认可用开始时间 | Time | Y | |
IC_EndTime | 预订当天即时确认可用结束时间 | Time | Y |
响应结果
节点 | 名称 | 类型 | 可为空 | 说明 |
---|---|---|---|---|
code | code | int | N | 0:表示接收成功 -1:表示接收失败 建议:接收成功,立马返回结果,异步进行处理。 |
errorMsg | 错误信息 | String | N | 说明:发送失败需要给出失败信息 |
输出参数示例
{ "type": "Inventory", "guid": "031a9db5-6850-4d6b-a058-6e3e99679a20", "data": [ { "LastId": 2048, "Time": "2017-03-20T09:10:00 08:00", "HotelID": "40101025", "RoomTypeId": "1114", "HotelCode": "40101025", "Date": "2017-03-21T00:00:00 08:00", "Status": true, "Amount": 3, "OverBooking": 0, "StartDate": "2016-04-13T14:07:36 08:00", "EndDate": "2017-03-21T23:59:59 08:00", "StartTime": "00:00:00", "EndTime": "18:00:00" } ] }
接收接口示例
@RequestMapping(value="/incr/inventory/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); }