訂單路由定時任務

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;    }}
相關文章
相關標籤/搜索