干燥机配套车间生产管理系统/云平台服务端
zhuguifei
2024-11-29 339515558253d776769dc2e2560bbb4a0450c989
jeecg-module-dry/jeecg-module-dry-biz/src/main/java/org/jeecg/modules/dry/controller/DryRealTimeDataController.java
old mode 100644 new mode 100755
@@ -3,25 +3,44 @@
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;
@@ -37,10 +56,32 @@
    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")
@@ -52,6 +93,20 @@
    @ApiOperation(value="接收实时数据Json", notes="设备实时数据上传")
    @PostMapping("/sendRealTimeDataJson")
    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);
    }
@@ -85,43 +140,149 @@
        return dryRealTimeDataService.sendSocketMsg(msgVo);
    }
//
//    @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 = "药材识别")
    @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);
    /**
     * 根据设备和租户查询该设备类型的干燥配方,将配方转成xml格式,以字符串方式返回
     * @param tenantId
     * @param eqpCode
     * @return
     * @throws JAXBException
     */
    @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("AI识别服务异常");
                return Result.error("设备IP地址未配置:" + ip);
            }
        } 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());
            }
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error("AI识别服务异常");
    @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("保存成功");
    }
}