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<TqdianbiaoMeterMapper, TqdianbiaoMeter>
|
implements TqdianbiaoMeterManageService {
|
|
private static final long MANUAL_METER_ID_BASE = 900_000_000L;
|
|
private final TqdianbiaoMeterSyncService meterSyncService;
|
|
@Override
|
public IPage<TqdianbiaoMeter> listPage(Page page, TqdianbiaoMeter query) {
|
return page(page, Wrappers.<TqdianbiaoMeter>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<Long> 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.<TqdianbiaoMeter>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;
|
}
|
}
|