jiazx0107@163.com
2023-05-17 620eab6cca2bc9ef9ea6d3067a0a5ba1deadbd1c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package com.ld.igds.io.fzzy.command;
 
import com.ld.igds.constant.BizType;
import com.ld.igds.io.fzzy.ServerUtils;
import com.ld.igds.io.fzzy.dto.IoMessage;
import com.ld.igds.io.fzzy.server.BhznQuantityServerEngine;
import com.ld.igds.io.constant.OrderRespEnum;
import com.ld.igds.io.constant.ProtocolEnum;
import com.ld.igds.io.notify.NotifyWebInvoker;
import com.ld.igds.io.request.QuantityRequest;
import com.ld.igds.io.response.BaseResponse;
import com.ld.igds.quantity.io.RemoteQuantityService;
import com.ld.igds.util.RedisUtil;
import com.ld.io.api.InvokeResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
 
@Slf4j
@Component(BhznRemoteQuantityImpl.BEAN_ID)
public class BhznRemoteQuantityImpl implements RemoteQuantityService {
 
    public static final String BEAN_ID = "fzzy.remoteQuantityService";
    @Autowired
    private BhznQuantityServerEngine bhznQuantityServerEngine;
    @Autowired
    private NotifyWebInvoker notifyWebInvoker;
    @Autowired
    private RedisUtil redisUtil;
 
    @Override
    public String getProtocol() {
        return ProtocolEnum.TCP_FZZY_QUANTITY_V35.getCode();
    }
 
    @Override
    public BaseResponse checkStart(QuantityRequest request) {
        try {
 
            String key = ServerUtils.buildRequestKey(request.getCompanyId(), request.getSn());
 
            IoMessage message = CommandBuilder.getInstance().build2001Message(request);
            InvokeResult result = sendMsg(request.getIp(), request.getPort(), message);
 
            // 如果有执行异常,直接通知到前端
            if (InvokeResult.SUCCESS != result) {
                log.info("平台------>>>>数量检测:开始检测-失败{}", result.getMessage());
                notifyWebInvoker.notifyWeb(request.getCompanyId(), OrderRespEnum.ORDER_ERROR, BizType.SYS, request.getSerName() + " 开始检测,命令执行失败");
                return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
                        "开始检测执行失败:" + result.getMessage());
            }
 
            //最长保存一个小时
            redisUtil.set(key, request, 60 * 60);
 
            //启动子任务定时查询进度
            FutureTask<String> futureTask = new FutureTask<>(new QueryProgressTask(redisUtil, this, key));
            ExecutorService executorService = Executors.newCachedThreadPool();
            executorService.submit(futureTask);
            executorService.shutdown();
 
        } catch (Exception e) {
            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
                    "执行失败:" + e.getMessage());
        }
 
        return new BaseResponse(OrderRespEnum.ORDER_SUCCESS);
    }
 
 
    @Override
    public BaseResponse remoteConf(QuantityRequest request) {
 
        //检测之前先下发配置
        IoMessage message = CommandBuilder.getInstance().build1001Message(request);
 
        InvokeResult result = sendMsg(request.getIp(), request.getPort(), message);
 
        if (InvokeResult.SUCCESS != result) {
            log.info("平台------>>>>数量检测:下发配置失败-失败{}", result.getMessage());
            notifyWebInvoker.notifyWeb(request.getCompanyId(), OrderRespEnum.ORDER_ERROR, BizType.SYS, request.getSerName() + " 下发检测配置,命令执行失败");
            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
                    "下发配置执行失败:" + result.getMessage());
        }
 
        return new BaseResponse(OrderRespEnum.ORDER_SUCCESS);
    }
 
    @Override
    public BaseResponse checkStop(QuantityRequest request) {
        //检测之前先下发配置
        IoMessage message = CommandBuilder.getInstance().build2002Message(request);
        InvokeResult result = sendMsg(request.getIp(), request.getPort(), message);
        if (InvokeResult.SUCCESS != result) {
            log.info("平台------>>>>数量检测:停止检测-失败{}", result.getMessage());
            notifyWebInvoker.notifyWeb(request.getCompanyId(), OrderRespEnum.ORDER_ERROR, BizType.SYS, request.getSerName() + " 停止检测失败,命令执行失败");
            return new BaseResponse(OrderRespEnum.ORDER_ERROR.getCode(),
                    "停止检测执行失败:" + result.getMessage());
        }
        String key = ServerUtils.buildRequestKey(request.getCompanyId(),request.getSn());
        //删除缓存
        redisUtil.del(key);
 
        return new BaseResponse(OrderRespEnum.ORDER_SUCCESS);
    }
 
    @Override
    public BaseResponse snapImg(QuantityRequest request) {
        return new BaseResponse(OrderRespEnum.NO_PROTOCOL);
    }
 
    @Override
    public BaseResponse closeWarn(QuantityRequest request) {
        return new BaseResponse(OrderRespEnum.NO_FUNCTION);
    }
 
    @Override
    public BaseResponse ptz(QuantityRequest Request) {
        return new BaseResponse(OrderRespEnum.NO_FUNCTION);
    }
 
    public InvokeResult sendMsg(String ip, Integer port, IoMessage message) {
 
        String msg = CommandBuilder.getInstance().build(message);
 
        log.debug("平台------>>>>数量检测:报文信息-{}", msg);
 
        InvokeResult result = bhznQuantityServerEngine.push(ip, port, msg.getBytes());
        return result;
    }
 
}