Browse Source

rst 数据恢复--物流方式恢复

wangxiaoming 6 years ago
parent
commit
c34209113c

+ 15 - 4
watero-common-tool/src/main/java/com/iamberry/wechat/tools/HttpClient431Util.java

@@ -725,9 +725,20 @@ public class HttpClient431Util {
     }
 
     public static void main(String[] args) throws Exception {
-    	long start = System.currentTimeMillis();
-    	boolean b = downloadFile("https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQHT8DoAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xLzgwamFXRURsc3AzTE1pQnoxbUFfAAIEkhQsVwMEAAAAAA%3D%3D", "D://abcdefgj.png");
-    	long end = System.currentTimeMillis();
-    	System.out.println(b + "," + (end - start));
+//    	long start = System.currentTimeMillis();
+//    	boolean b = downloadFile("https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQHT8DoAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xLzgwamFXRURsc3AzTE1pQnoxbUFfAAIEkhQsVwMEAAAAAA%3D%3D", "D://abcdefgj.png");
+//    	long end = System.currentTimeMillis();
+//    	System.out.println(b + "," + (end - start));
+
+        // 生成系统级请求数据
+//        Map<String, String> params = new HashMap<String, String>();
+//        params.put("nu", "221435993148");
+//        String url = "http://api.open.baidu.com/pae/common/api/Redirect";
+//        // 发送请求
+//        String html = HttpClient431Util.doGet(params, url);
+//        Document doc = Jsoup.parse(html);
+//        Element content = doc.getElementById("companyCode");
+//        String value = content.val();
     }
+
 }

+ 12 - 0
watero-rst-interface/src/main/java/com/iamberry/rst/faces/kdn/KuaiDiNiaoService.java

@@ -0,0 +1,12 @@
+package com.iamberry.rst.faces.kdn;
+
+public interface KuaiDiNiaoService {
+
+    /**
+     * 使用快递单号
+     * 查询快递公司
+     * @param code
+     * @return
+     */
+    String selectCourierCompany(String code);
+}

+ 176 - 0
watero-rst-service/src/main/java/com/iamberry/rst/service/kdn/KuaiDiNiaoServiceImpl.java

@@ -0,0 +1,176 @@
+package com.iamberry.rst.service.kdn;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.iamberry.rst.faces.kdn.KuaiDiNiaoService;
+import com.iamberry.wechat.tools.HttpClient431Util;
+import com.sun.org.apache.xml.internal.security.utils.Base64;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.io.*;
+import java.net.URLEncoder;
+import java.security.MessageDigest;
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
+public class KuaiDiNiaoServiceImpl implements KuaiDiNiaoService {
+    private static Logger LOGGER = LoggerFactory.getLogger(KuaiDiNiaoServiceImpl.class);
+    private static String ERRORPATH = "D:\\testJavaPath\\error.txt";
+    private static String SUCCESSPATH = "D:\\testJavaPath\\success.txt";
+
+    //电商ID
+    private static final String EBusinessID="1343593";
+    //电商加密私钥,快递鸟提供
+    private static final String AppKey="3597c368-9dc0-40b5-9cf2-86d9cb90e38a";
+    //单号识别API
+    private final static  String URL = "http://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx";
+
+    //获取EBusinessID
+    public String getEBusinessID(){
+        return EBusinessID;
+    }
+
+    @Override
+    public String selectCourierCompany(String code) {
+        String courierCompang="";
+        Map<String,Object> requestMap = new HashMap();
+        requestMap.put("LogisticCode",code);
+        try {
+            // 第三方接口对时效性有要求,并发数不超过多少,此处Sleep 1200ms
+            Thread.sleep(1200);
+
+            // 生成电子面单的请求数据
+            String requestData = JSONObject.toJSONString(requestMap);
+            // 生成系统级请求数据
+            Map<String, String> params = new HashMap<String, String>();
+            params.put("RequestData", urlEncoder(requestData, "UTF-8"));
+            params.put("EBusinessID", EBusinessID);
+            params.put("RequestType", "2002");
+            String dataSign=encrypt(requestData, AppKey, "UTF-8");
+            params.put("DataSign", urlEncoder(dataSign, "UTF-8"));
+            params.put("DataType", "2");
+            // 发送请求
+            String json = HttpClient431Util.doPost(params, URL);
+
+            Map responseMap = JSONObject.parseObject(json);
+
+            JSONArray shippersAyyar = (JSONArray) responseMap.get("Shippers");
+            if(shippersAyyar.size() < 1){
+                LOGGER.info("=========快递单号:"+code+";查询不到快递公司");
+                String errorMsg = "快递单号:" + code+";查询不到快递公司+"+"\n";
+                writeTxt(ERRORPATH,errorMsg);
+            }
+            if(shippersAyyar.size()>0 &&  shippersAyyar.size() < 2){
+                JSONObject job = shippersAyyar.getJSONObject(0);  // 遍历 jsonarray 数组,把每一个对象转成 json 对象
+                String  shipperName = (String) job.get("ShipperName");
+                String  shipperCode = (String) job.get("ShipperCode");
+                courierCompang = shipperCode;
+                if(courierCompang == null || "".equals(courierCompang) ){
+                    LOGGER.info("=========快递单号:"+code+";查询不到快递公司,其中有一个快递公司");
+                    String errorMsg = "快递单号:" + code+";查询不到快递公司+"+"\n";
+                    writeTxt(ERRORPATH,errorMsg);
+                }else{
+                    LOGGER.info("=========快递单号:"+code+";查询成功,快递公司:"+shipperName+":"+shipperCode);
+                    String errorMsg = "快递单号:" + code+"快递公司:"+shipperName+":"+shipperCode +"\n";
+                    writeTxt(SUCCESSPATH,errorMsg);
+                }
+            }else{
+                StringBuffer company = new StringBuffer();
+                for(int i=0;i<shippersAyyar.size();i++){
+                    JSONObject job = shippersAyyar.getJSONObject(i);
+                    company.append(job.get("ShipperName")+":");
+                    company.append(job.get("ShipperCode")+";");
+                }
+                LOGGER.info("=========快递单号:"+code+";查询到多个快递公司:"+company.toString());
+                String errorMsg = "快递单号:"+code+";查询到多个快递公司:"+company.toString()+"\n";
+                writeTxt(ERRORPATH,errorMsg);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return courierCompang;
+    }
+
+    /**
+     * 写入文件
+     * @param path
+     * @param s
+     */
+    public static void writeTxt(String path,String s){
+        File file = new File(path);
+        try{
+            FileWriter fw = new FileWriter(file, true);
+            if(!file.exists()){
+                file.createNewFile();
+            }
+            BufferedWriter bw = new BufferedWriter(fw);
+            PrintWriter pw = new PrintWriter(bw);
+
+            pw.println(s);
+
+            pw.flush();
+            fw.flush();
+            pw.close();
+            fw.close();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * base64编码
+     * @param str 内容
+     * @param charset 编码方式
+     * @throws UnsupportedEncodingException
+     */
+    private static String base64(String str, String charset) throws UnsupportedEncodingException {
+        return Base64.encode(str.getBytes(charset));
+    }
+
+    @SuppressWarnings("unused")
+    private static String urlEncoder(String str, String charset) throws UnsupportedEncodingException {
+        return URLEncoder.encode(str, charset);
+    }
+    /**
+     * 电商Sign签名生成
+     * @param content 内容
+     * @param keyValue Appkey
+     * @param charset 编码方式
+     * @throws UnsupportedEncodingException ,Exception
+     * @return DataSign签名
+     */
+    @SuppressWarnings("unused")
+    private static String encrypt (String content, String keyValue, String charset) throws UnsupportedEncodingException, Exception {
+        if (keyValue != null)
+        {
+            return base64(MD5(content + keyValue, charset), charset);
+        }
+        return base64(MD5(content, charset), charset);
+    }
+
+    /**
+     * MD5加密
+     * @param str 内容
+     * @param charset 编码方式
+     * @throws Exception
+     */
+    @SuppressWarnings("unused")
+    private static String MD5(String str, String charset) throws Exception {
+        MessageDigest md = MessageDigest.getInstance("MD5");
+        md.update(str.getBytes(charset));
+        byte[] result = md.digest();
+        StringBuilder sb = new StringBuilder(32);
+        for (byte aResult : result) {
+            int val = aResult & 0xff;
+            if (val <= 0xf) {
+                sb.append("0");
+            }
+            sb.append(Integer.toHexString(val));
+        }
+        return sb.toString().toLowerCase();
+    }
+
+}

+ 82 - 2
watero-rst-web/src/main/java/com/iamberry/rst/controllers/cm/AppComplaintQuestionInfoController.java

@@ -2,16 +2,21 @@ package com.iamberry.rst.controllers.cm;
 
 import com.iamberry.rst.core.cm.*;
 import com.iamberry.rst.core.order.ProductColor;
+import com.iamberry.rst.core.page.PagedResult;
 import com.iamberry.rst.faces.cm.ComplaintQuestionInfoService;
 import com.iamberry.rst.faces.cm.CustomerCommonService;
 import com.iamberry.rst.faces.cm.RelationOrderService;
 import com.iamberry.rst.faces.cm.SalesOrderService;
+import com.iamberry.rst.faces.kdn.KuaiDiNiaoService;
 import com.iamberry.rst.faces.order.EfastOrderService;
 import com.iamberry.rst.faces.product.ProductService;
 import com.iamberry.rst.service.cm.CustomerServiceImpl;
 import com.iamberry.rst.service.cm.mapper.FittingsInfoMapper;
+import com.iamberry.rst.utils.KuaiDi100;
+import com.iamberry.rst.utils.SeleOrdeCompUtil;
 import com.iamberry.wechat.tools.DateTimeUtil;
 import com.iamberry.wechat.tools.ResponseJson;
+import com.sun.tools.corba.se.idl.StringGen;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
 import org.slf4j.Logger;
@@ -55,8 +60,9 @@ public class AppComplaintQuestionInfoController {
     @Autowired
     private ProductService productService;
     @Autowired
-    private FittingsInfoMapper fittingsInfoMapper;
-
+    private SeleOrdeCompUtil seleOrdeCompUtil;
+    @Autowired
+    private KuaiDi100 kuaiDi100;
 
     /**
      * 进入客诉问题描述
@@ -337,5 +343,79 @@ public class AppComplaintQuestionInfoController {
 //    }
 
 
+    /**
+     * 订单关联表,新增客诉id
+     * @param request
+     * @return
+     */
+  /*  @ResponseBody
+    @RequestMapping(value = "/synOrderCompany")
+    public ResponseJson synRelatedOrder(HttpServletRequest request){
+        ResponseJson msg = new ResponseJson();
+        SalesOrder salesOrder = new SalesOrder();
+//        PagedResult<SalesOrder> salesOrderPagedResult =  salesOrderService.listSalesOrderPage(1, 10, salesOrder, false);
+//        ArrayList<SalesOrder> salesOrderList = (ArrayList<SalesOrder>) salesOrderPagedResult.getDataList();
+//
+//        for (SalesOrder so:salesOrderList) {
+//            String  salesPostNum = so.getSalesPostNum();  //salesPostNum
+//            if(salesPostNum == null || "".equals(salesPostNum)){
+//                System.out.println("----------该订单无物流编号,订单编号:" + so.getSalesId()+"----------");
+//                continue;
+//            }
+//            String company = kuaiDiNiaoService.selectCourierCompany(salesPostNum);
+//            if(company != null && !"".equals(company)){
+//                so.setCompanyName(company);
+//                Integer flag = salesOrderService.distributionExpress(so);
+//                if(flag < 1){
+//                    System.out.println("*********修改订单物流方式出错,物流编号:"+ salesPostNum +";订单编号:" + so.getSalesId()+"***********");
+//                }
+//            }else{
+//                System.out.println("*********物流公司为空,物流编号:"+ salesPostNum +";订单编号:" + so.getSalesId()+"***********");
+//            }
+//        }
+        new Thread(new Producer(seleOrdeCompUtil)).start();
+        new Thread(new Consumer(seleOrdeCompUtil)).start();
+        return msg;
+    }
+*/
+  /*  public class Producer implements Runnable {
+        private SeleOrdeCompUtil seleOrdeCompUtil;
+        public Producer(SeleOrdeCompUtil seleOrdeCompUtil) {
+            this.seleOrdeCompUtil = seleOrdeCompUtil;
+        }
+        @Override
+        public void run() {
+            for(int i = 0;i<30700;i++){
+                this.seleOrdeCompUtil.produce("shenchan"+i);
+
+                try {
+                    Thread.sleep(500);//每隔10毫秒生产一个产品
+                } catch (InterruptedException e) {
+                    // TODO Auto-generated catch block
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+    public class Consumer implements Runnable {
+        private SeleOrdeCompUtil seleOrdeCompUtil;
+        public Consumer(SeleOrdeCompUtil seleOrdeCompUtil) {
+            this.seleOrdeCompUtil = seleOrdeCompUtil;
+        }
+        @Override
+        public void run() {
+            for(int i = 0;i<30700;i++){
+                this.seleOrdeCompUtil.consume("xiaofei"+i);
+                try {
+                    Thread.sleep(200);//每隔100毫秒消费一个
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }*/
+
+
+
 
 }

+ 107 - 2
watero-rst-web/src/main/java/com/iamberry/rst/utils/KuaiDi100.java

@@ -1,19 +1,31 @@
 package com.iamberry.rst.utils;
 
+import com.iamberry.wechat.tools.HttpClient431Util;
 import net.sf.json.JSONObject;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.*;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLConnection;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * Created by Administrator on 2017/8/15.
  */
 @Component
 public class KuaiDi100 {
+
+
+
+    private static Logger LOGGER = LoggerFactory.getLogger(KuaiDi100.class);
+
     private static String key = "29833628d495d7a5";//授权密匙key    百度的
   /*private static String key = "06d6c2ea1bdb4ee9";//授权密匙key  自己的*/
                     /*<option value="sto">申通快递</option>
@@ -303,4 +315,97 @@ public class KuaiDi100 {
         }
         return postFirm;
     }
+
+    /**
+     * 将快递100的物流公司编号转为rst的物流编号
+     * @return
+     */
+    private String kuaidiToRstCode(String company){
+        String postFirm = "";
+        switch (company){
+            case "shentong":postFirm="STO";break;
+            case "debangwuliu":postFirm="DBL";break;
+            case "youzhengguonei":postFirm="YZBK";break; //9719606885204 省外
+            case "ems":postFirm="EMS";break;    //1170100776910  省内
+            case "shunfeng":postFirm="SF";break;
+            case "jd":postFirm="jd";break;
+            case "youshuwuliu":postFirm="youshuwuliu";break;    //优速
+            case "zhongtong":postFirm="zto";break;    //优速
+            default:
+                postFirm = company;
+                LOGGER.error("未匹配到物流公司");
+                break;
+        }
+        return postFirm;
+    }
+
+
+    /**
+     * 快递一百
+     * 根据物流单号查询快递公司--仅能查询快递公司,不能查询快递流程
+     * @param code
+     * @return
+     */
+    public String selectCourierCompany(String code) {
+       String errorPath = "D:\\testJavaPath\\error.txt";
+       String successPath = "D:\\testJavaPath\\success.txt";
+
+        String courierCompang="";
+        Map<String,Object> requestMap = new HashMap();
+        requestMap.put("LogisticCode",code);
+        try {
+            Map<String, String> params = new HashMap<String, String>();
+            params.put("nu", "221435993148");
+            String url = "http://api.open.baidu.com/pae/common/api/Redirect";
+            // 发送请求
+            String html = HttpClient431Util.doGet(params, url);
+            Document doc = Jsoup.parse(html);
+            Element content = doc.getElementById("companyCode");
+            String value = content.val();
+            if(value == null || "".equals(value)){
+                LOGGER.info("=========快递单号:"+code+";查询不到快递公司");
+                String errorMsg = "快递单号:" + code+";查询不到快递公司+"+"\n";
+                writeTxt(errorPath,errorMsg);
+            }else{
+                value = kuaidiToRstCode(value); //转换物流方式
+                LOGGER.info("=========快递单号:"+code+";查询成功,快递公司:"+code+":"+value);
+                String errorMsg = "快递单号:" + code+"快递公司:"+code+":"+value +"\n";
+                writeTxt(successPath,errorMsg);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            LOGGER.info("=========快递单号:"+code+";处理报错");
+            String errorMsg = "快递单号:" + code+";处理报错+"+"\n";
+            writeTxt(errorPath,errorMsg);
+        }
+        return courierCompang;
+    }
+
+    /**
+     * 写入文件
+     * @param path
+     * @param s
+     */
+    public static void writeTxt(String path,String s){
+        File file = new File(path);
+        try{
+            FileWriter fw = new FileWriter(file, true);
+            if(!file.exists()){
+                file.createNewFile();
+            }
+            BufferedWriter bw = new BufferedWriter(fw);
+            PrintWriter pw = new PrintWriter(bw);
+
+            pw.println(s);
+
+            pw.flush();
+            fw.flush();
+            pw.close();
+            fw.close();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+
 }

+ 157 - 0
watero-rst-web/src/main/java/com/iamberry/rst/utils/SeleOrdeCompUtil.java

@@ -0,0 +1,157 @@
+package com.iamberry.rst.utils;
+
+import com.iamberry.rst.core.cm.SalesOrder;
+import com.iamberry.rst.core.page.PagedResult;
+import com.iamberry.rst.faces.cm.SalesOrderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+
+/**
+ * 查询订单物流公司
+ */
+@Component
+public class SeleOrdeCompUtil {
+
+    @Autowired
+    private SalesOrderService salesOrderService;
+    @Autowired
+    private KuaiDi100 kuaiDi100;
+
+
+    // 仓库最大存储量
+    private final int MAX_SIZE = 20;
+
+    private static int NODE_NUM = 1710;
+
+    // 仓库存储的载体
+    private LinkedList<SalesOrder> list = new LinkedList<SalesOrder>();
+
+    // 生产产品
+    public void produce(String producer)
+    {
+        synchronized (list)
+        {
+            // 如果仓库已满
+            while (list.size() == MAX_SIZE)
+            {
+                try
+                {
+                    // 由于条件不满足,生产阻塞
+                    list.wait();
+                }
+                catch (InterruptedException e)
+                {
+                    e.printStackTrace();
+                }
+            }
+
+            // 生产产品
+            SalesOrder salesOrder = new SalesOrder();
+            PagedResult<SalesOrder> salesOrderPagedResult =  salesOrderService.listSalesOrderPage(NODE_NUM, 1, salesOrder, false);
+            ArrayList<SalesOrder> array = (ArrayList<SalesOrder>) salesOrderPagedResult.getDataList();
+            if(array==null || array.size() <1){
+                return;
+            }
+            System.out.println("======shengchan"+producer+";订单号"+array.get(0).getSalesId()+"交易号"+array.get(0).getSalesDealCode());
+
+            System.out.println("=====查询订单数/节点"+NODE_NUM);
+            NODE_NUM++;
+
+            list.add(array.get(0));
+            list.notifyAll();
+        }
+    }
+
+    // 消费产品
+    public void consume(String consumer)
+    {
+        synchronized (list)
+        {
+            //如果仓库存储量不足
+            while (list.size()==0)
+            {
+                try
+                {
+                    // 由于条件不满足,消费阻塞
+                    list.wait();
+                }
+                catch (InterruptedException e)
+                {
+                    e.printStackTrace();
+                }
+            }
+            SalesOrder so = list.get(0);
+            System.out.println("======xiaofei"+consumer+"当前执行到订单编号:"+so.getSalesId()+"交易号:"+so.getSalesDealCode());
+            String  salesPostNum = so.getSalesPostNum();  //salesPostNum
+
+            if(salesPostNum == null || "".equals(salesPostNum)){
+                System.out.println("----------该订单无物流编号,订单编号:" + so.getSalesId()+"----------");
+            }else{
+                String company = "";
+                if("00000000".equals(salesPostNum)){
+                    company = "02";
+                }else if("0".equals(salesPostNum)){
+                    company = "02";
+                }else if(salesPostNum.length() == 1){
+                    company = "02";
+                }else{
+                    String beginTwo = salesPostNum.substring(0,2);
+                    if("71".equals(beginTwo)){
+                        company = "yto";
+                    }else if("33".equals(beginTwo)){
+                        company = "STO";
+                    }else if("95".equals(beginTwo)){
+                        company = "STO";
+                    }else if("97".equals(beginTwo)){
+                        company = "YZBK";
+                    }else if("11".equals(beginTwo)){
+                        company = "EMS";
+                    }else if("22".equals(beginTwo)){
+                        company = "STO";
+                    }else if("21".equals(beginTwo)){
+                        company = "01";
+                    }else if("25".equals(beginTwo)){
+                        company = "SF";
+                    }else if("83".equals(beginTwo)){
+                        company = "DBL";
+                    }else if("26".equals(beginTwo)){
+                        company = "SF";
+                    }else{
+                        company = kuaiDi100.selectCourierCompany(salesPostNum);
+                    }
+                }
+                if(company != null && !"".equals(company)){
+                    so.setSalesPostFirm(company);
+                    Integer flag = salesOrderService.distributionExpress(so);
+                    if(flag < 1){
+                        System.out.println("*********修改订单物流方式出错,物流编号:"+ salesPostNum +";订单编号:" + so.getSalesId()+"***********");
+                    }
+                }else{
+                    System.out.println("*********物流公司为空,物流编号:"+ salesPostNum +";订单编号:" + so.getSalesId()+"***********");
+                }
+            }
+            list.remove(0);
+            list.notifyAll();
+        }
+    }
+
+
+    public LinkedList<SalesOrder> getList()
+    {
+        return list;
+    }
+
+    public void setList(LinkedList<SalesOrder> list)
+    {
+        this.list = list;
+    }
+
+    public int getMAX_SIZE()
+    {
+        return MAX_SIZE;
+    }
+
+}