package com.ruoyi.http.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.http.mapper.TqdianbiaoMeterMapper; import com.ruoyi.http.pojo.TqdianbiaoMeter; import com.ruoyi.http.service.TqdianbiaoMeterManageService; import com.ruoyi.http.service.TqdianbiaoMeterSyncService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.time.LocalDateTime; import java.util.List; @Service @RequiredArgsConstructor public class TqdianbiaoMeterManageServiceImpl extends ServiceImpl implements TqdianbiaoMeterManageService { private static final long MANUAL_METER_ID_BASE = 900_000_000L; private final TqdianbiaoMeterSyncService meterSyncService; @Override public IPage listPage(Page page, TqdianbiaoMeter query) { return page(page, Wrappers.lambdaQuery() .and(StringUtils.isNotEmpty(query.getKeyword()), w -> w .like(TqdianbiaoMeter::getMeterName, query.getKeyword()) .or() .like(TqdianbiaoMeter::getAddress, query.getKeyword()) .or() .like(TqdianbiaoMeter::getDescription, query.getKeyword())) .eq(query.getMeterId() != null, TqdianbiaoMeter::getMeterId, query.getMeterId()) .eq(StringUtils.isNotEmpty(query.getSource()), TqdianbiaoMeter::getSource, query.getSource()) .orderByDesc(TqdianbiaoMeter::getUpdateTime)); } @Override public boolean addMeter(TqdianbiaoMeter meter) { validateManualMeter(meter); meter.setSource("manual"); meter.setMeterId(generateManualMeterId()); if (meter.getRate() == null) { meter.setRate(1); } if (StringUtils.isEmpty(meter.getRelayState())) { meter.setRelayState("1"); } meter.setSyncTime(LocalDateTime.now()); return save(meter); } @Override public boolean updateMeter(TqdianbiaoMeter meter) { if (meter.getId() == null) { throw new ServiceException("ID不能为空"); } TqdianbiaoMeter existing = getById(meter.getId()); if (existing == null) { throw new ServiceException("电表不存在"); } if (StringUtils.isEmpty(meter.getAddress())) { throw new ServiceException("表地址不能为空"); } String meterName = StringUtils.isNotEmpty(meter.getMeterName()) ? meter.getMeterName() : meter.getAddress(); existing.setMeterName(meterName); existing.setAddress(meter.getAddress()); existing.setDescription(meter.getDescription()); existing.setRelayState(meter.getRelayState()); if (existing.getSource() == null) { existing.setSource("sync"); } if ("manual".equals(existing.getSource())) { existing.setRate(meter.getRate()); } existing.setSyncTime(LocalDateTime.now()); return updateById(existing); } @Override public boolean deleteByIds(List ids) { if (CollectionUtils.isEmpty(ids)) { throw new ServiceException("请选择至少一条数据"); } return removeBatchByIds(ids); } @Override public int syncFromRemote() { return meterSyncService.syncMeters(); } private void validateManualMeter(TqdianbiaoMeter meter) { if (StringUtils.isEmpty(meter.getMeterName())) { throw new ServiceException("电表名称不能为空"); } if (StringUtils.isEmpty(meter.getAddress())) { throw new ServiceException("表地址不能为空"); } } private Long generateManualMeterId() { TqdianbiaoMeter maxManual = getOne( Wrappers.lambdaQuery() .eq(TqdianbiaoMeter::getSource, "manual") .orderByDesc(TqdianbiaoMeter::getMeterId) .last("LIMIT 1"), false); if (maxManual == null || maxManual.getMeterId() == null) { return MANUAL_METER_ID_BASE + 1; } return maxManual.getMeterId() + 1; } }