package com.mh.user.controller; import com.alibaba.fastjson2.JSONObject; import com.mh.common.http.HttpResult; import com.mh.common.utils.StringUtils; import com.mh.user.annotation.SysLogger; import com.mh.user.config.MHConfig; import com.mh.user.constants.Constant; import com.mh.user.entity.ControlSetEntity; import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.DeviceInstallEntity; import com.mh.user.entity.PumpSetEntity; import com.mh.user.job.S7PlcCollectionJob; import com.mh.user.model.DeviceModel; import com.mh.user.model.SerialPortModel; import com.mh.user.serialport.SerialPortSingle2; import com.mh.user.service.*; import com.mh.user.service.mqtt.service.IMqttGatewayService; import com.mh.user.utils.ExchangeStringUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; import java.util.List; import java.util.Map; @Slf4j @RestController @RequestMapping("serial") public class DeviceOperateController { @Autowired DeviceInstallService deviceInstallService; @Autowired PumpSetService pumpSetService; @Autowired ControlSetService controlSetService; @Autowired NowDataService nowDataService; @Autowired private DeviceControlService deviceControlService; @Autowired private MHConfig mhConfig; @Value("${control.topic}") String controlTopic; @Autowired private IMqttGatewayService iMqttGatewayService; @Autowired private S7PlcCollectionJob s7PlcCollectionJob; //操作设备 @SysLogger(title = "控制管理", optDesc = "设置设备参数值") @PostMapping(value = "/operate") public HttpResult operateDevice(@RequestBody List params) { try { Constant.WEB_FLAG = true; //单抄,暂时停止采集 // 判断通讯方式 if (deviceControlService.isMqttControl(params)) { for (SerialPortModel serialPortModel : params) { String sn = deviceControlService.getSn(serialPortModel); if (StringUtils.isBlank(sn)) { return HttpResult.error(500, "mqtt设备未配置SN"); } String sendOrder = deviceControlService.operationDevice(serialPortModel); if (Constant.FAIL.equals(sendOrder)) { return HttpResult.error(500, "fail"); } String name = mhConfig.getName(); // 获取mqtt操作队列(后期通过mqtt队列配置发送主题) String sendTopic = name + "/" + controlTopic + "/" + sn; log.info("发送主题:{},消息:{}", sendTopic, sendOrder); iMqttGatewayService.publish(sendTopic, sendOrder, 0); // 判断当前cpmId是否是 11:固定是 启用写入时间戳 if (serialPortModel.getCpmId().equals("11")) { // 是的话,重新写入,启用时间写入值变成 0 serialPortModel.setDataValue("0"); sendOrder = deviceControlService.operationDevice(serialPortModel); if (Constant.FAIL.equals(sendOrder)) { return HttpResult.error(500, "fail"); } name = mhConfig.getName(); // 获取mqtt操作队列(后期通过mqtt队列配置发送主题) sendTopic = name + "/" + controlTopic + "/" + sn; log.info("发送主题:{},消息:{}", sendTopic, sendOrder); iMqttGatewayService.publish(sendTopic, sendOrder, 0); } } } else if (deviceControlService.isS7Control(params)) { for (SerialPortModel serialPortModel : params) { boolean s7Write = s7PlcCollectionJob.writeData(Long.valueOf(serialPortModel.getCpmId()), serialPortModel.getDataValue()); if (!s7Write) { return HttpResult.error(500, "fail"); } } } else { String returnStr = deviceControlService.readOrWriteDevice(params, Constant.WRITE); if (!StringUtils.isBlank(returnStr) && "fail".equals(returnStr)) { return HttpResult.error(500, "fail"); } } Constant.WEB_FLAG = false; //单抄,恢复采集 return HttpResult.ok(); } catch (Exception e) { log.error("前端发送控制异常==>", e); Constant.WEB_FLAG = false; //单抄,恢复采集 return HttpResult.error(500, "fail"); } finally { Constant.WEB_FLAG = false; } } //读数据 @SysLogger(title = "控制管理", optDesc = "读设备数据") @PostMapping(value = "/read") public HttpResult readData(@RequestBody List params) { try { Constant.WEB_FLAG = true; //单抄,暂时停止采集 Thread.sleep(1000); String rtData = deviceControlService.readOrWriteDevice(params, Constant.READ); if (ExchangeStringUtil.getJSONType(rtData)) { Map map = JSONObject.parseObject(rtData); return HttpResult.ok("success", map); } else { if (rtData.equals("fail")) { return HttpResult.error(500, "fail"); } else { return HttpResult.ok(rtData, rtData); } } } catch (Exception e) { Constant.WEB_FLAG = false; //单抄,恢复采集 return HttpResult.error(500, "fail"); } finally { Constant.WEB_FLAG = false; //单抄,恢复采集 } } }