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 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; } }