package org.jeecg.modules.dry.service.impl; import cn.hutool.core.bean.BeanUtil; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.vo.Result; import org.jeecg.common.config.TenantContext; import org.jeecg.common.util.RedisUtil; import org.jeecg.modules.dry.common.CacheConstants; import org.jeecg.modules.dry.entity.DryEquipment; import org.jeecg.modules.dry.entity.DryHerb; import org.jeecg.modules.dry.entity.DryOrder; import org.jeecg.modules.dry.entity.DryOrderTrend; import org.jeecg.modules.dry.service.*; import org.jeecg.modules.dry.vo.DryOrderTrendVo; import org.jeecg.modules.dry.vo.DryOrderVo; import org.jeecg.modules.dry.vo.RealTimeDataVo; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; import java.util.Map; @Slf4j @Service public class DryRealTimeDataServiceImpl implements IDryRealTimeDataService { @Autowired private IDryOrderService dryOrderService; @Autowired private IDryOrderTrendService dryOrderTrendService; @Autowired private IDryHerbService herbService; @Autowired private IDryEquipmentService equipmentService; @Autowired private RedisUtil redisUtil; @Override @Transactional public Result realTimeDataHandle(RealTimeDataVo realTimeDataVo) { TenantContext.setTenant(realTimeDataVo.getTenantid()+""); log.info("实时数据:"+realTimeDataVo.toString()); // 1 查询或创建工单 // 1.1 从redis取出工单缓存 DryOrderVo orderVo = (DryOrderVo) redisUtil.hget(CacheConstants.RedisKeyEnum.WORK_ORDER.getCode(), realTimeDataVo.getTenantid()+"_"+realTimeDataVo.getMachineid()); // 1.2 如果有缓存记录 if(orderVo != null && orderVo.getCode().equals(realTimeDataVo.getWorkorder())) { // 1.3 没有缓存记录再查询数据库 } else { // 根据租户id和工单号查询数据库是否有记录,有则返回,没有则新增一条再返回 orderVo = getOrSaveDryOrderVoDB(realTimeDataVo); } // 2 更新工单实时数据 // 2.1 将工单中的数据替换为最新数据 realTimeDataVo.setOrderId(orderVo.getId()); orderVo.setInitial(realTimeDataVo.getMoisture1()); orderVo.setDryTime(realTimeDataVo.getTime3()); orderVo.setDelay(realTimeDataVo.getDelay()); orderVo.setTurn(realTimeDataVo.getTurntime()); orderVo.setYield(realTimeDataVo.getWeight3()); orderVo.setStart(realTimeDataVo.getStart()); orderVo.setAuto(realTimeDataVo.getAuto()); orderVo.setPlcdisable(realTimeDataVo.getPlcdisable()); orderVo.setLowalarm(realTimeDataVo.getLowalarm()); orderVo.setWind(realTimeDataVo.getWind()); orderVo.setOriginWeight(realTimeDataVo.getWeight2()); orderVo.setWatt(realTimeDataVo.getWatt()); orderVo.setSteam(realTimeDataVo.getSteam()); orderVo.setEnvHum(realTimeDataVo.getEnvhum()); orderVo.setEnvTemp(realTimeDataVo.getEnvtemp()); orderVo.setRemain(realTimeDataVo.getAi_total_time()); orderVo.setCurRemain(realTimeDataVo.getAi_time()); orderVo.setState_fan(realTimeDataVo.getState_fan()); orderVo.setState_roller(realTimeDataVo.getState_roller()); orderVo.setState_auto(realTimeDataVo.getState_auto()); orderVo.setState_windbox(realTimeDataVo.getState_windbox()); orderVo.setState_valve(realTimeDataVo.getState_valve()); orderVo.setOrderStatus(realTimeDataVo.getWorkorder_status()); DryOrderTrendVo trendVo = new DryOrderTrendVo(realTimeDataVo); // 2.2 保存工单含水率变化 或 重量变化 saveOrderTrendVo(trendVo, orderVo); orderVo.setTrendVo(trendVo); orderVo.getBellowsTemp().put(realTimeDataVo.getTime3(), realTimeDataVo.getTemp2()); // 2.3 更新到redis缓存 redisUtil.hset(CacheConstants.RedisKeyEnum.WORK_ORDER.getCode(), realTimeDataVo.getTenantid()+"_"+realTimeDataVo.getMachineid(),orderVo, 600000); return Result.ok(); } /** * 根据租户id和工单号查询数据库是否有记录,有则返回,没有则新增一条 * @param realTimeDataVo * @return */ private DryOrderVo getOrSaveDryOrderVoDB(RealTimeDataVo realTimeDataVo) { DryOrderVo orderVo; LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(DryOrder::getCode, realTimeDataVo.getWorkorder()); queryWrapper.eq(DryOrder::getTenantId, realTimeDataVo.getTenantid()); // 1 查询数据库 DryOrder one = dryOrderService.getOne(queryWrapper); // 2 数据库有记录,更新到缓存 if (one != null) { // 转换为缓存数据结构 orderVo = BeanUtil.toBean(one, DryOrderVo.class); if (one.getTemps() != null) { Map map = JSONObject.parseObject(one.getTemps(), new TypeReference>(){}); orderVo.setBellowsTemp(map); } // 查询称重记录,添加到缓存数据结构 List trendVos = dryOrderTrendService.listByOrderId(one.getId()); if (trendVos != null && trendVos.size() > 0) { DryOrderTrendVo oldVo = trendVos.get(trendVos.size() - 1); orderVo.setTrendVo(oldVo); orderVo.setDetailList(trendVos); } // 3 数据库没有则新增一条数据 } else { orderVo = saveNewOrder(realTimeDataVo); } return orderVo; } /** * 保存新工单 * @param realTimeDataVo * @return */ @NotNull private DryOrderVo saveNewOrder(RealTimeDataVo realTimeDataVo) { DryOrderVo orderVo; // 查询药材 DryHerb herb = queryHerbByIndexTenant(realTimeDataVo); // 查询设备 DryEquipment equ = queryEquipmentByCodeTenant(realTimeDataVo); // 创建新工单 orderVo = new DryOrderVo(realTimeDataVo); orderVo.setHerbId(herb.getId()); orderVo.setEquId(equ.getId()); DryOrder dryOrder = BeanUtil.toBean(orderVo, DryOrder.class); boolean save = dryOrderService.save(dryOrder); return orderVo; } /** * 查询设备,新设备则添加到设备主数据 * @param realTimeDataVo * @return */ private DryEquipment queryEquipmentByCodeTenant(RealTimeDataVo realTimeDataVo) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(DryEquipment::getTenantId, realTimeDataVo.getTenantid()); queryWrapper.eq(DryEquipment::getCode, realTimeDataVo.getMachineid()); DryEquipment one = equipmentService.getOne(queryWrapper); if (one == null) { one = new DryEquipment(realTimeDataVo); equipmentService.save(one); } return one; } /** * 查询药材,新药材添加到数据库 * @param realTimeDataVo * @return */ private DryHerb queryHerbByIndexTenant(RealTimeDataVo realTimeDataVo) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(DryHerb::getTenantId, realTimeDataVo.getTenantid()); queryWrapper.eq(DryHerb::getCode, realTimeDataVo.getIndex()); DryHerb one = herbService.getOne(queryWrapper); if (one == null) { one = new DryHerb(realTimeDataVo); herbService.save(one); } return one; } /** * 保存含水率变化记录 * @param trendVo * @param orderVo */ private void saveOrderTrendVo(DryOrderTrendVo trendVo, DryOrderVo orderVo) { //判断 实时含水率 或 实时重量有没有变化,有变化则更新 if(orderVo.getTrendVo() == null || trendVo.getWeight() < orderVo.getTrendVo().getWeight() ) { DryOrder byId = dryOrderService.getById(orderVo.getId()); // 将最新结果更新到工单 if (byId != null) { BeanUtil.copyProperties(orderVo, byId); byId.setTemps(JSONObject.toJSONString(orderVo.getBellowsTemp())); dryOrderService.updateById(byId); } // 保存含水率变化 orderVo.getDetailList().add(trendVo); DryOrderTrend dryOrderTrend = BeanUtil.toBean(trendVo, DryOrderTrend.class); dryOrderTrendService.save(dryOrderTrend); } } /** * 查询机台实时数据 * @param realTimeDataVo * @return */ @Override public Result queryMachineRealTImeData(RealTimeDataVo realTimeDataVo) { TenantContext.setTenant(realTimeDataVo.getTenantid()+""); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(DryEquipment::getTenantId, realTimeDataVo.getTenantid()); queryWrapper.eq(DryEquipment::getEnable, "Y"); List dryEquipments = equipmentService.list(queryWrapper); List list = new ArrayList<>(); List dList = new ArrayList<>(); DryOrderVo orderVo = (DryOrderVo) redisUtil.hget(CacheConstants.RedisKeyEnum.WORK_ORDER.getCode(), realTimeDataVo.getTenantid() + "_" + realTimeDataVo.getMachineid()); try { if (dryEquipments != null && dryEquipments.size() > 0) { dryEquipments.stream().forEach(item -> { DryOrderVo order = (DryOrderVo) redisUtil.hget(CacheConstants.RedisKeyEnum.WORK_ORDER.getCode(), realTimeDataVo.getTenantid() + "_" + item.getCode()); if (order != null) { double v = order.getOriginWeight() - order.getYield(); list.add(item.getName().substring(0, item.getName().indexOf('#')+1)); if (v > 0) { DecimalFormat df = new DecimalFormat("#.00"); dList.add(Double.valueOf(df.format(v / order.getDryTime() * 60))); } else { dList.add(50d); } } }); } if (orderVo != null) { orderVo.setCompEqpNum(list); orderVo.setCompEqpEffic(dList); } }catch (Exception e) { e.printStackTrace(); } return Result.ok(orderVo); } }