package com.ruoyi.basic.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.dto.CustomerReturnVisitDto;
import com.ruoyi.basic.mapper.CustomerReturnVisitMapper;
import com.ruoyi.basic.pojo.CustomerReturnVisit;
import com.ruoyi.basic.service.CustomerReturnVisitService;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.List;
/**
*
* 客户回访提醒接口实现类
*
*
* @author deslrey
* @version 1.0
* @since 2026/03/04 17:58
*/
@Service
public class CustomerReturnVisitServiceImpl extends ServiceImpl implements CustomerReturnVisitService {
@Autowired
private ReturnVisitReminderService returnVisitReminderService;
@Override
@Transactional(rollbackFor = Exception.class)
public int saveOrUpdateReturnVisit(CustomerReturnVisit customerReturnVisit) {
validateReturnVisit(customerReturnVisit);
Long currentUserId = SecurityUtils.getUserId();
Long currentTenantId = SecurityUtils.getLoginUser().getTenantId();
if (customerReturnVisit.getId() != null) {
CustomerReturnVisit existing = baseMapper.selectById(customerReturnVisit.getId());
if (existing == null) {
throw new ServiceException("回访提醒不存在");
}
if (!existing.getTenantId().equals(currentTenantId)) {
throw new ServiceException("无权限修改此回访提醒");
}
customerReturnVisit.setUpdateUser(currentUserId);
customerReturnVisit.setUpdateTime(LocalDateTime.now());
int result = baseMapper.updateById(customerReturnVisit);
// 根据提醒开关来判断队列信息新增或取消
if (customerReturnVisit.getIsEnabled() == 1) {
returnVisitReminderService.scheduleReminder(customerReturnVisit.getId());
} else {
returnVisitReminderService.cancelReminder(customerReturnVisit.getId());
}
return result;
} else {
customerReturnVisit.setCreateUser(currentUserId);
customerReturnVisit.setCreateTime(LocalDateTime.now());
customerReturnVisit.setTenantId(currentTenantId);
int result = baseMapper.insert(customerReturnVisit);
if (customerReturnVisit.getIsEnabled() == 1) {
returnVisitReminderService.scheduleReminder(customerReturnVisit.getId());
}
return result;
}
}
@Override
public CustomerReturnVisitDto getByCustomerId(Integer customerId) {
if (customerId == null) {
throw new ServiceException("客户ID不能为空");
}
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(CustomerReturnVisit::getCustomerId, customerId);
CustomerReturnVisit returnVisit = baseMapper.selectOne(queryWrapper);
if (returnVisit == null) {
return null;
}
CustomerReturnVisitDto dto = new CustomerReturnVisitDto();
BeanUtils.copyProperties(returnVisit, dto);
return dto;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteByCustomerId(Long customerId) {
if (customerId == null) {
throw new ServiceException("客户ID不能为空");
}
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(CustomerReturnVisit::getCustomerId, customerId);
List returnVisits = baseMapper.selectList(queryWrapper);
for (CustomerReturnVisit returnVisit : returnVisits) {
returnVisitReminderService.cancelReminder(returnVisit.getId());
}
baseMapper.delete(queryWrapper);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void markAsRead(Long id) {
if (id == null) {
throw new ServiceException("回访提醒ID不能为空");
}
CustomerReturnVisit returnVisit = baseMapper.selectById(id);
if (returnVisit == null) {
throw new ServiceException("回访提醒不存在");
}
CustomerReturnVisit updateObj = new CustomerReturnVisit();
updateObj.setId(id);
updateObj.setIsCompleted(1);
baseMapper.updateById(updateObj);
}
private void validateReturnVisit(CustomerReturnVisit returnVisit) {
if (returnVisit == null) {
throw new ServiceException("回访提醒数据不能为空");
}
if (returnVisit.getCustomerId() == null) {
throw new ServiceException("客户ID不能为空");
}
if (returnVisit.getReminderTime() == null) {
throw new ServiceException("提醒时间不能为空");
}
if (returnVisit.getIsEnabled() != null && returnVisit.getIsEnabled() == 1) {
if (returnVisit.getReminderTime().isBefore(LocalDateTime.now())) {
throw new ServiceException("提醒时间不能早于当前时间");
}
}
}
}