ForwardService.java 4.57 KB
package com.viontech.tvp;

import cn.hutool.json.JSONObject;
import cn.hutool.json.xml.JSONXMLSerializer;
import lombok.extern.slf4j.Slf4j;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Optional;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * .
 *
 * @author 谢明辉
 * @date 2022/3/7
 */

@Service
@Slf4j
public class ForwardService {
    private static final ThreadPoolExecutor POOL = new ThreadPoolExecutor(20, 40, 1, TimeUnit.MINUTES, new LinkedBlockingQueue<>(1000), new ThreadPoolExecutor.CallerRunsPolicy());
    @Value("${vion.tvp.url}")
    private String tvpUrl;

    public void forwardAsync(JSONObject fxData) {
        POOL.submit(new Task(fxData, tvpUrl));
    }

    private static class Task implements Runnable {
        private final JSONObject fxData;
        private final String tvpUrl;

        public Task(JSONObject fxData, String tvpUrl) {
            this.fxData = fxData;
            this.tvpUrl = tvpUrl;
        }

        @Override
        public void run() {
            try {
                JSONObject cast = cast(fxData);
                String data = JSONXMLSerializer.toXml(cast, "Data");

                JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
                Client client = dcf.createClient(tvpUrl);
                Object[] res = client.invoke("InPeccancyInfo", data);
                log.info("发送消息结果:[{}]", res[0]);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        public JSONObject cast(JSONObject fxData) {
            JSONObject res = new JSONObject();
            res.set("DataType", "Violation");
            res.set("SFQJ", "00");
            res.set("CJYH", "VION");
            res.set("SJLY", "09");
            String eventDt = fxData.getStr("event_dt").substring(0, 19);
            JSONObject eventData = fxData.getJSONObject("event_data");
            JSONObject plate = eventData.getJSONObject("vehicle").getJSONObject("plate");
            JSONObject illegal = eventData.getJSONObject("illegal");
            JSONObject illegalDetail = illegal.getJSONObject("detail");
            String illegalCode = illegal.getStr("code");
            boolean overSpeed = overSpeed(illegalCode);
            // 违法时间
            res.set("WFSJ", eventDt);
            // 采集时间
            res.set("CJSJ", eventDt);
            // 号牌种类
            res.set("HPZL", castPlateType(plate.getStr("type_code")));
            // 号牌号码
            res.set("HPHM", plate.getStr("text"));
            // 违法行为
            res.set("WFXW", IllegalCodeUtil.cast(illegalCode));
            // 违法地点
            res.set("WFDD", eventData.getJSONObject("location").getStr("name"));
            if (overSpeed) {
                // 车辆速度
                res.set("CLSD", eventData.getFloat("speed"));
                // 车辆限速
                res.set("CLXS", illegalDetail.getStr("limit_speed"));
                // 超速比例
                res.set("CSBL", illegalDetail.getStr("over_speed_rate"));
            }

            // 车道编号
            res.set("CDBH", String.valueOf(eventData.getJSONObject("lane").getInt("number")));
            // todo 方向编号
//            res.set("FXBH", "");
            // 设备编号
            res.set("SBBH", fxData.getStr("vchan_refid"));
            // 违法图片
            String base64 = Optional.of(fxData).map(x -> x.getJSONArray("pics")).map(x -> x.getJSONObject(0)).map(x -> x.getStr("pic_base64")).orElse(null);
            res.set("ZJWJ1", base64);
            return res;
        }

        private String castPlateType(String plateType) {
            if ("31".equals(plateType)) {
                return "51";
            }
            if ("32".equals(plateType)) {
                return "52";
            }
            return plateType;
        }

        private boolean overSpeed(String illegalCode) {
            switch (illegalCode) {
                case "51":
                case "52":
                case "33":
                case "45":
                case "50":
                case "48":
                case "49":
                case "47":
                case "46":
                case "21":
                    return true;
                default:
                    return false;
            }
        }

    }

}