| | |
| | | |
| | | import ai.djl.modality.Classifications; |
| | | import cn.hutool.core.bean.BeanUtil; |
| | | import cn.hutool.core.thread.ThreadUtil; |
| | | import com.alibaba.druid.support.json.JSONUtils; |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.eclipse.paho.client.mqttv3.MqttException; |
| | | import org.eclipse.paho.client.mqttv3.MqttMessage; |
| | | import org.jeecg.common.api.vo.Result; |
| | | |
| | | import org.jeecg.modules.dry.entity.DryHerbInfo; |
| | | import org.jeecg.common.config.TenantContext; |
| | | import org.jeecg.common.constant.MqttConstant; |
| | | import org.jeecg.common.system.query.QueryGenerator; |
| | | import org.jeecg.common.util.IpUtils; |
| | | import org.jeecg.common.util.SpringContextUtils; |
| | | import org.jeecg.common.util.oConvertUtils; |
| | | import org.jeecg.config.mybatis.MybatisPlusSaasConfig; |
| | | import org.jeecg.modules.dry.entity.*; |
| | | import org.jeecg.modules.dry.mqtt.MqttConfig; |
| | | import org.jeecg.modules.dry.mqtt.MqttUtil; |
| | | import org.jeecg.modules.dry.service.*; |
| | | |
| | | import org.jeecg.modules.dry.util.HerbUtil; |
| | | import org.jeecg.modules.dry.vo.CommandMessageVo; |
| | | import org.jeecg.modules.dry.vo.DryHerbInfoVo; |
| | | import org.jeecg.modules.dry.vo.RealTimeDataVo; |
| | | //import org.jeecg.modules.dry.util.HerbUtil; |
| | | import org.jeecg.modules.dry.vo.*; |
| | | |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.*; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import javax.xml.bind.JAXBContext; |
| | | import javax.xml.bind.JAXBException; |
| | | import javax.xml.bind.Marshaller; |
| | | import java.io.InputStream; |
| | | import java.io.StringWriter; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | import java.util.stream.Stream; |
| | |
| | | private IDryRealTimeDataService dryRealTimeDataService; |
| | | |
| | | @Autowired |
| | | private HerbUtil herbUtil; |
| | | private IDryHerbFormulaService dryHerbFormulaService; |
| | | |
| | | @Autowired |
| | | private IDryHerbInfoService dryHerbInfoService; |
| | | |
| | | @Autowired |
| | | private IDryEqpTypeService dryEqpTypeService; |
| | | |
| | | // @Autowired |
| | | // private HerbUtil herbUtil; |
| | | |
| | | @Autowired |
| | | private MqttUtil mqttUtil; |
| | | |
| | | @Autowired |
| | | private MqttConfig mqttConfig; |
| | | |
| | | @Autowired |
| | | private IDryHerbInfoService herbInfoService; |
| | | |
| | | @Autowired |
| | | private IDryHerbFormulaHisService dryHerbFormulaHisService; |
| | | |
| | | @Autowired |
| | | private IDryEquipmentService dryEquipmentService; |
| | | |
| | | |
| | | |
| | | @ApiOperation(value="测试", notes="返回Hello") |
| | |
| | | |
| | | @ApiOperation(value="接收实时数据Json", notes="设备实时数据上传") |
| | | @PostMapping("/sendRealTimeDataJson") |
| | | public Result<?> realTimeDataJson(@RequestBody RealTimeDataVo realTimeDataVo) { |
| | | public Result<?> realTimeDataJson(@RequestBody RealTimeDataVo realTimeDataVo) { |
| | | try { |
| | | if ("user".equals(mqttConfig.getRole())){ |
| | | MqttMessage mqttMessage = new MqttMessage(); |
| | | mqttMessage.setQos(0); |
| | | mqttMessage.setPayload(JSONObject.toJSONString(realTimeDataVo).getBytes()); |
| | | mqttUtil.getMqttClient().publish(MqttConstant.TENANT_UP_PREFIX_REALTIME_DATA,mqttMessage); |
| | | //处理故障信息 |
| | | dryRealTimeDataService.fitFultRecord(realTimeDataVo); |
| | | } |
| | | |
| | | } catch (MqttException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | |
| | | return dryRealTimeDataService.realTimeDataHandle(realTimeDataVo); |
| | | } |
| | | |
| | |
| | | return dryRealTimeDataService.sendSocketMsg(msgVo); |
| | | } |
| | | |
| | | |
| | | @ApiOperation(value = "药材识别") |
| | | @PostMapping("/identify") |
| | | public Result<?> identify(@RequestParam("file") MultipartFile file) throws Exception { |
| | | try { |
| | | if (file.isEmpty()) { |
| | | throw new RuntimeException("上传文件不能为空"); |
| | | // |
| | | // @ApiOperation(value = "药材识别") |
| | | // @PostMapping("/identify") |
| | | // public Result<?> identify(@RequestParam("file") MultipartFile file) throws Exception { |
| | | // try { |
| | | // if (file.isEmpty()) { |
| | | // throw new RuntimeException("上传文件不能为空"); |
| | | // } |
| | | // InputStream inputStream = file.getInputStream(); |
| | | // List<Classifications.Classification> predict = herbUtil.predict(inputStream); |
| | | // |
| | | // if(predict.size()>0) { |
| | | // Map<String, Double> collect = predict.stream().collect(Collectors.toMap(Classifications.Classification::getClassName, Classifications.Classification::getProbability)); |
| | | // |
| | | // |
| | | // List<DryHerbInfoVo> voList = new ArrayList<>(); |
| | | // Set<String> strings = collect.keySet(); |
| | | // List<DryHerbInfo> list = herbInfoService.list(new LambdaQueryWrapper<DryHerbInfo>().in(DryHerbInfo::getPinyin, strings)); |
| | | // list.forEach(item -> { |
| | | // DryHerbInfoVo dryHerbInfoVo = new DryHerbInfoVo(); |
| | | // BeanUtil.copyProperties(item, dryHerbInfoVo); |
| | | // dryHerbInfoVo.setProbabily(collect.get(item.getPinyin())); |
| | | // voList.add(dryHerbInfoVo); |
| | | // }); |
| | | // |
| | | // List<DryHerbInfoVo> collect1 = voList.stream().sorted(Comparator.comparing(DryHerbInfoVo::getProbabily, Comparator.reverseOrder())). |
| | | // collect(Collectors.toList()); |
| | | // |
| | | // return Result.ok(collect1); |
| | | // } else { |
| | | // return Result.error("AI识别服务异常"); |
| | | // } |
| | | // |
| | | // } catch (Exception e) { |
| | | // e.printStackTrace(); |
| | | // return Result.error("AI识别服务异常"); |
| | | // } |
| | | // } |
| | | @ApiOperation(value="干燥配方获取", notes="干燥配方下发") |
| | | @GetMapping(value = "/queryFormula") |
| | | public Result<String> queryFormulaByEqpType(Integer tenantId, String eqpCode) throws JAXBException { |
| | | //获取request |
| | | HttpServletRequest request = SpringContextUtils.getHttpServletRequest(); |
| | | // 获取请求主机的IP地址 |
| | | String ip = IpUtils.getIpAddr(request); |
| | | DryEquipment dryEquipment = dryEquipmentService.selectByTenantIdEquipmentId(tenantId+ "", eqpCode); |
| | | if (dryEquipment != null) { |
| | | if (dryEquipment.getIp().equals(ip)) { |
| | | } else { |
| | | return Result.error("设备IP地址未配置:" + ip); |
| | | } |
| | | InputStream inputStream = file.getInputStream(); |
| | | List<Classifications.Classification> predict = herbUtil.predict(inputStream); |
| | | Map<String, Double> collect = predict.stream().collect(Collectors.toMap(Classifications.Classification::getClassName, Classifications.Classification::getProbability)); |
| | | |
| | | |
| | | List<DryHerbInfoVo> voList = new ArrayList<>(); |
| | | Set<String> strings = collect.keySet(); |
| | | List<DryHerbInfo> list = herbInfoService.list(new LambdaQueryWrapper<DryHerbInfo>().in(DryHerbInfo::getPinyin, strings)); |
| | | list.forEach(item -> { |
| | | DryHerbInfoVo dryHerbInfoVo = new DryHerbInfoVo(); |
| | | BeanUtil.copyProperties(item, dryHerbInfoVo); |
| | | dryHerbInfoVo.setProbabily(collect.get(item.getPinyin())); |
| | | voList.add(dryHerbInfoVo); |
| | | }); |
| | | |
| | | List<DryHerbInfoVo> collect1 = voList.stream().sorted(Comparator.comparing(DryHerbInfoVo::getProbabily, Comparator.reverseOrder())). |
| | | collect(Collectors.toList()); |
| | | |
| | | return Result.ok(collect1); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | return Result.error("AI识别服务异常"); |
| | | } else { |
| | | return Result.error("设备不存在"); |
| | | } |
| | | LambdaQueryWrapper<DryHerbFormula> queryWrapper = new LambdaQueryWrapper<DryHerbFormula>(); |
| | | queryWrapper.eq(DryHerbFormula::getEqpType, dryEquipment.getType()) |
| | | .eq(DryHerbFormula::getTenantId, tenantId); |
| | | List<DryHerbFormula> list = dryHerbFormulaService.list(queryWrapper); |
| | | Formulas formulas = new Formulas(); |
| | | list.forEach(item -> { |
| | | DryHerbInfo byId = dryHerbInfoService.getById(item.getHerbId()); |
| | | if (byId!=null) { |
| | | item.setPinyin(byId.getPinyin()); |
| | | item.setName(byId.getName()); |
| | | } |
| | | Formula formula = new Formula(); |
| | | BaseParam baseParam = new BaseParam(); |
| | | WaterParam waterParam = new WaterParam(); |
| | | TypeParam typeParam = new TypeParam(); |
| | | OffsetParam offsetParam = new OffsetParam(); |
| | | baseParam.setCode(item.getCode()); |
| | | baseParam.setIndex(item.getCode()); |
| | | baseParam.setName(item.getName()); |
| | | baseParam.setAb(item.getName()); |
| | | baseParam.setTyp(item.getCategory()); |
| | | waterParam.setDelay(Double.valueOf(item.getDelay())); |
| | | waterParam.setMoisture3(item.getTarget()); |
| | | waterParam.setWeight1(Double.valueOf(item.getFeed())); |
| | | waterParam.setTimes(item.getEt()); |
| | | waterParam.setTemp1(item.getWindTemp()); |
| | | waterParam.setTemp2(item.getEnvTemp()); |
| | | waterParam.setTemp3(item.getEnvHum()); |
| | | waterParam.setTurntime(item.getTurn()); |
| | | typeParam.setMtype(Integer.valueOf(item.getCategory())); |
| | | offsetParam.setMoisoffset(item.getMoisOffset()); |
| | | offsetParam.setColdwind(Double.valueOf(item.getCoolingDuration())); |
| | | |
| | | formula.setBaseParam(baseParam); |
| | | formula.setWaterParam(waterParam); |
| | | formula.setTypeParam(typeParam); |
| | | formula.setOffsetParam(offsetParam); |
| | | formulas.getDryFormulaList().add(formula); |
| | | }); |
| | | // 把vos转换成xml |
| | | // 创建JAXBContext实例 |
| | | JAXBContext jaxbContext = JAXBContext.newInstance(Formulas.class); |
| | | |
| | | // 创建Marshaller实例 |
| | | Marshaller marshaller = jaxbContext.createMarshaller(); |
| | | |
| | | // 设置是否格式化输出 |
| | | marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false); |
| | | |
| | | // 将对象序列化到字符串 |
| | | StringWriter writer = new StringWriter(); |
| | | marshaller.marshal(formulas, writer); |
| | | |
| | | return Result.OK("请求成功",writer.toString()); |
| | | |
| | | |
| | | } |
| | | |
| | | @ApiOperation(value="干燥配方上报", notes="干燥配方记录上报") |
| | | @PostMapping(value = "/sendFormulaHistory") |
| | | public Result<?> sendFormulaHistory(DryHerbFormulaHisVo hisVo) { |
| | | //获取request |
| | | HttpServletRequest request = SpringContextUtils.getHttpServletRequest(); |
| | | // 获取请求主机的IP地址 |
| | | String ip = IpUtils.getIpAddr(request); |
| | | DryHerbFormulaHis his = new DryHerbFormulaHis(); |
| | | BeanUtil.copyProperties(hisVo, his); |
| | | his.setFormulaIndex(hisVo.getIndex()); |
| | | DryEquipment dryEquipment = dryEquipmentService.selectByTenantIdEquipmentId(hisVo.getTenantId() + "", hisVo.getEqp()); |
| | | if (dryEquipment != null) { |
| | | if (dryEquipment.getIp().equals(ip)) { |
| | | his.setEqpId(dryEquipment.getId()); |
| | | } else { |
| | | return Result.error("设备IP地址未配置:" + ip); |
| | | } |
| | | |
| | | } else { |
| | | return Result.error("设备不存在"); |
| | | } |
| | | dryHerbFormulaHisService.save(his); |
| | | return Result.OK("保存成功"); |
| | | } |
| | | |
| | | } |