需求:查詢用戶的模型分,我們將用戶的請求放到biz_order表中,定期更新數據庫,按月分表,查詢某一用戶先查詢biz_order表,如果沒有數據,就會循環查詢歷史表,查得數據返回數據分,查不到返回處理失敗
入參:user_id,order_id,query_sources,order_id是記錄此次請求用的,不用於查詢參數
@RequestMapping(value = "/creditData")
@ResponseBody
public Map<String,Object> creditData(String user_id, String querySources, String order_id) {
MDC.put("user_id",user_id);
MDC.put("order_id",order_id);
MDC.put("query_source",querySources);
logger.info("[查詢歷史數據]userId={},querySource={},orderId={}",user_id,querySources,order_id);
try {
String type = "credit";
Map<String, Object> result = bizOrderService.findCreditResult(user_id, querySources,type);
logger.info("[查詢歷史數據]result={}",result);
return result;
}catch (Exception e){
logger.error("[查詢歷史數據]異常",e);
return ScdataResult.error(DecisionProcessEnum.FAIL);
}finally {
MDC.clear();
}
}
整個查詢邏輯和流程
@Override
public Map<String,Object> findCreditResult(String userId,String querySource,String type){
TypeEnum typeEnum = TypeEnum.getEnumByCode(type);
BizOrderVO bizOrderVO = new BizOrderVO();
bizOrderVO.setUserId(userId);
bizOrderVO.setQuerySource(querySource);
bizOrderVO.setType(typeEnum);
int code = thirdChannelConfigService.getThirdChannels(querySource).getCode();
bizOrderVO.setChannelId(code);
BizOrderPO bizOrder = findBizOrderForCredit(bizOrderVO,type);
if(bizOrder==null){
Map<String, Object> defaultResult = timeoutOrderHandlerTask.getDefaultResult(code);
return ScdataResult.apply(DecisionProcessEnum.NOT_FIND,defaultResult);
}
Query query = new Query();
query.addCriteria(Criteria.where("orderId").is(bizOrder.getPkid()));
HandleResultMongoPO one = mongoTemplate.findOne(query, HandleResultMongoPO.class);
String resultData = one.getResultData();
JSONObject object = JSONObject.parseObject(resultData);
if(object==null){
Map<String, Object> defaultResult = timeoutOrderHandlerTask.getDefaultResult(code);
return ScdataResult.apply(DecisionProcessEnum.NOT_FIND,defaultResult);
}else{
return ScdataResult.success(object);
}
}
findBizOrderForCredit方法
private BizOrderPO findBizOrderForCredit(BizOrderVO bizOrderVO,String type){
BizOrderPO bizOrderPO = loopFindBizOrderForCredit(bizOrderVO,type);
if(bizOrderPO==null && sameQuerySource.containsKey(bizOrderVO.getQuerySource())){
String querySource2 = sameQuerySource.get(bizOrderVO.getQuerySource());
int code2 = thirdChannelConfigService.getThirdChannels(querySource2).getCode();
bizOrderVO.setChannelId(code2);
bizOrderPO = loopFindBizOrderForCredit(bizOrderVO,type);
}
return bizOrderPO;
}
loopFindBizOrderForCredit方法
private BizOrderPO loopFindBizOrderForCredit(BizOrderVO bizOrderVO,String type){
BizOrderPO bizOrder = bizOrderDao.findOneBizOrderByUserForCredit(bizOrderVO);
if(bizOrder==null){
bizOrder = this.findHistoryBizOrderByUserForCredit(type,bizOrderVO.getUserId(),bizOrderVO.getChannelId());
if(bizOrder==null){
return null;
}
}
return bizOrder;
}
findHistoryBizOrderByUserForCredit方法
private BizOrderPO findHistoryBizOrderByUserForCredit(String type,String userId,int channelId){
BizOrderPO bizOrderPO = null;
String earliestMonth = "20170830";
LocalDate earliestMt = LocalDate.parse(earliestMonth, DateTimeFormatter.ofPattern("yyyyMMdd"));
LocalDate previousMonth = LocalDate.now().minusMonths(1);
while (bizOrderPO==null && previousMonth.isAfter(earliestMt) ){
String yyyyMM = DateTimeFormatter.ofPattern("yyyyMM").format(previousMonth);
bizOrderPO = bizOrderDao.findHistoryBizOrderByUserForCredit("biz_order_history_"+yyyyMM,userId,channelId,type);
previousMonth = previousMonth.minusMonths(1);
}
return bizOrderPO;
}
mapper查詢方式
@Select("select * from `${tableName}` where user_id = #{userId} AND `status` = 2 AND channel_id = #{channelId} AND `type` = #{type} ORDER BY create_time DESC limit 1")
@ResultMap("BizOrder")
BizOrderPO findHistoryBizOrderByUserForCredit(@Param("tableName") String table,@Param("userId") String userId,@Param("channelId") int channelId,@Param("type")String type);