package com.sf.XWFS.task;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;import com.sf.XWFS.domain.OrderDO;import com.sf.XWFS.service.OrderService;import com.sf.XWFS.service.YHOrderService;import com.sf.XWFS.util.CSIMUtil;import com.sf.erui.util.StringUtil;import io.jsonwebtoken.lang.Collections;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component;import java.text.SimpleDateFormat;import java.util.*;/** * author:80003756-蔡俊華 * date:2019-5-13 * desc:訂單路由定時任務 */@Componentpublic class OrderSendStateTask { private Logger logger = LoggerFactory.getLogger(OrderSendStateTask.class); //redis緩存注入 //@Autowired //private RedisTemplate redisTemplate; //@Autowired private OrderService orderService; private YHOrderService yhOrderService; /** * 從豐橋拉取路由狀態 * 每隔12小時執行一次 */ @Scheduled(cron="0 0 0/12 * * ?") public void pullSendState() { logger.info("start -----> 開始從豐橋拉取路由狀態 "); orderService = (OrderService)ApplicationContextUtil.getBean("orderServiceImpl"); yhOrderService = (YHOrderService)ApplicationContextUtil.getBean("YHOrderServiceImpl"); long start = System.currentTimeMillis(); int pageSize = 100;//條數 int pageStart = 0;//偏移量 int maxTimes = 50;//最多查詢次數 50*100爲5000條數據 int queryTimes = 0; boolean isStop = false; HashMap<String,Object> param = new HashMap<String,Object>(); try { //查詢50次,一共5000條 param.put("pageSize", pageSize); param.put("orderBy", "create_tm asc");//排序 param.put("is_cancel", "0");//未做廢 param.put("mailnoNotNull","1");//運單號不爲空 param.put("send_state_nq","已收件");//未收件 param.put("submit_state","1");//已提交 while( queryTimes ++ <= maxTimes){ param.put("pageStart", pageStart); try{ List<Map<String, Object>> orderList =orderService.selectOrder(param); if(Collections.isEmpty(orderList)){ logger.info("第"+queryTimes+"次查詢到數據爲空"); break; } logger.info("第"+queryTimes+"次查詢到記錄:"+orderList.size()); if(orderList.size()<100){ isStop = true; } //獲取路由狀態 queryState(filter(orderList)); }catch(Exception ex){ isStop = true; logger.error("", ex); } //已經沒有須要更新路由的數據 if(isStop){ break; } //翻頁 pageStart +=pageSize; } } catch (Exception ex) { logger.error("從豐橋拉取路由異常", ex); } finally { logger.info("end -----> 從豐橋拉取路由狀態結束,耗時:" + (System.currentTimeMillis() - start) + "ms"); } } private void queryState(List<Map<String, Object>> orderList){ try{ int start =0; boolean isStop = false; String trackingType = "1";//用運單號查詢 JSONArray result = new JSONArray(); while(!isStop){ try{ //運單號多個逗號隔開 StringBuilder tracking_number = new StringBuilder(); //每次取十條 for(int i=0;i <10; i++){ if(start >= orderList.size()){ isStop = true; break; } Map<String,Object> order = orderList.get(start ++); tracking_number.append(order.get("mailno")+","); } JSONArray route = CSIMUtil.RouteServiceBySys(trackingType,tracking_number.substring(0,tracking_number.length()-1)); //----/* JSONObject jsonb = new JSONObject(); jsonb.put("mailno", "873YUADSFH11197773DL0982"); jsonb.put("opcode", "8000"); route.add(jsonb); JSONObject jsonb2 = new JSONObject(); jsonb2.put("mailno", "873YUADSFH11197773DL098"); jsonb2.put("opcode", "70"); route.add(jsonb2);*/ //-- logger.info("豐橋返回:"+route.toString()); result.addAll(route); }catch(Exception ex){ logger.error("查詢豐橋路由異常",ex ); } if(result.size()>=30){//30條更新一次數據庫 //更新數據狀態 updateDatabase(result); result.clear(); } } if(result.size()>0){//更新一次數據庫 //更新數據狀態 updateDatabase(result); } }catch(Exception ex){ logger.error("查詢豐橋路由異常",ex ); } } /** * 更新到數據庫 * @param route */ private void updateDatabase(JSONArray route){ try{ if(route == null ||route.size()==0){ return; } Map<String, List<OrderDO>> map = new HashMap<String, List<OrderDO>>() ; List<OrderDO> list = new ArrayList<OrderDO>(); route.forEach(jsonObj ->{ JSONObject json = (JSONObject)jsonObj; if(json.get("error") != null){ return; } String sendState = ""; String mailno = json.getString("mailno"); String opcode = json.getString("opcode"); switch (opcode) { case "50": sendState = "已收件"; break; case "80": sendState = "派送成功"; break; case "8000": sendState = "派送成功"; break; case "33": sendState = "派送失敗"; break; case "70": sendState = "派送失敗"; break; default: sendState = "運輸中"; break; } OrderDO order = new OrderDO(); order.setMailno(mailno); order.setSendState(sendState); list.add(order); }); map.put("list",list); Integer rest = orderService.batchUpdateRoute(map); logger.info("成功更新路由到數據庫:"+rest); //更新數據到遠航 new Thread(()->updateRoutToYH(list)).start(); }catch(Exception ex){ logger.error("更新路由異常",ex ); } } //更新數據到遠航 private void updateRoutToYH(List<OrderDO> list){ try{ SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateStr = sf.format(new Date()); List<Map<String,Object>> param = new ArrayList<Map<String,Object>>(); list.forEach(orderDO -> { Map<String,Object> map = new HashMap<String,Object>(); map.put("mailno",orderDO.getMailno()); map.put("send_state",orderDO.getSendState()); map.put("hcsj",dateStr); param.add(map); }); //推送路由 Integer rest = yhOrderService.updateYHOrderRoute(param); logger.info("路由推送成功:"+rest); //更新數據庫 Map<String, List<OrderDO>> map = new HashMap<String, List<OrderDO>>(); map.put("list", list); rest = orderService.batchUpdateBack(map,dateStr); logger.info("更新回傳時間成功:"+rest); }catch(Exception ex){ logger.error("更新路由到遠航異常", ex); } } /** * 派送失敗超過10天再也不查詢路由 * @param datalist * @return */ public List<Map<String, Object>> filter(List<Map<String, Object>> datalist){ for(Iterator<Map<String,Object>> it = datalist.iterator(); it.hasNext();){ Map<String, Object> map = it.next(); if(map.get("send_state")!=null && map.get("send_state").equals("派送失敗")){ if(map.get("first_time_route") == null){ continue; } Date first_time_route = (Date)map.get("first_time_route"); Date now = new Date(); long ms = now.getTime()-first_time_route.getTime(); int days = (int) (ms/(1000*60*60*24)); if(days >=10){ it.remove();; } } } return datalist; }}