OrderSubscriptionMessageDbServiceImpl.java 4.9 KB
package com.tianting.infoloop.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.infoloop.tianting.mealorderservice.CreateOrderSubscriptionMessageRpcRequest;
import com.infoloop.tianting.mealorderservice.GetUserOrderSubscriptionMessageHistoryRpcRequest;
import com.tianting.infoloop.mapper.OrderSubscriptionMessageMapper;
import com.tianting.infoloop.model.db.OrderSubscriptionMessageDb;
import com.tianting.infoloop.service.OrderSubscriptionMessageDbService;
import com.tianting.infoloop.utils.exception.ErrorCodeConstants;
import com.tianting.infoloop.utils.exception.ServiceExceptionUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.List;

@Slf4j
@Service
@RequiredArgsConstructor(onConstructor_ = @Autowired)
public class OrderSubscriptionMessageDbServiceImpl extends ServiceImpl<OrderSubscriptionMessageMapper, OrderSubscriptionMessageDb> implements OrderSubscriptionMessageDbService {

  @Override
  public OrderSubscriptionMessageDb createOrderSubscriptionMessage(CreateOrderSubscriptionMessageRpcRequest request) {
    OrderSubscriptionMessageDb orderSubscriptionMessageDb = new OrderSubscriptionMessageDb();
    orderSubscriptionMessageDb.setEnterpriseId(request.getEnterpriseId());
    if (request.getDinerId() != 0) {
      orderSubscriptionMessageDb.setDinerId(request.getDinerId());
    }
    orderSubscriptionMessageDb.setOpenId(request.getOpenId());
    orderSubscriptionMessageDb.setTemplateId(request.getTemplateId());
    if (!request.getJumpPath().isEmpty()) {
      orderSubscriptionMessageDb.setJumpPath(request.getJumpPath());
    }

    // 转换时间戳为LocalDateTime(精确到秒),与项目中其他时间字段保持一致
    LocalDateTime orderPeriodStartDate = Instant.ofEpochMilli(request.getOrderPeriodStartDate())
        .atZone(ZoneId.systemDefault())
        .toLocalDateTime();
    orderSubscriptionMessageDb.setOrderPeriodStartDate(orderPeriodStartDate);

    if (request.getOrderPeriodEndDate() > 0) {
      LocalDateTime orderPeriodEndDate = Instant.ofEpochMilli(request.getOrderPeriodEndDate())
          .atZone(ZoneId.systemDefault())
          .toLocalDateTime();
      orderSubscriptionMessageDb.setOrderPeriodEndDate(orderPeriodEndDate);
    }

    boolean res = this.save(orderSubscriptionMessageDb);
    if (!res) {
      log.error("创建订阅消息授权记录失败, request: {}", request);
      throw ServiceExceptionUtil.exception(ErrorCodeConstants.ORDER_GEN_FAIL);
    }
    return orderSubscriptionMessageDb;
  }

  @Override
  public List<OrderSubscriptionMessageDb> getUserOrderSubscriptionMessageHistory(GetUserOrderSubscriptionMessageHistoryRpcRequest request) {
    LambdaQueryWrapper<OrderSubscriptionMessageDb> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(OrderSubscriptionMessageDb::getEnterpriseId, request.getEnterpriseId());
    queryWrapper.eq(OrderSubscriptionMessageDb::getOpenId, request.getOpenId());

    // 如果传入了 orderPeriodStartDate,查询大于等于该值的记录
    if (request.getOrderPeriodStartDate() > 0) {
      LocalDateTime orderPeriodStartDate = Instant.ofEpochMilli(request.getOrderPeriodStartDate())
          .atZone(ZoneId.systemDefault())
          .toLocalDateTime();
      queryWrapper.ge(OrderSubscriptionMessageDb::getOrderPeriodStartDate, orderPeriodStartDate);
    }

    queryWrapper.orderByDesc(OrderSubscriptionMessageDb::getCreatedAt);
    return this.list(queryWrapper);
  }

  @Override
  public int batchDeleteByIds(java.util.List<Long> ids, int enterpriseId) {
    if (ids == null || ids.isEmpty()) {
      return 0;
    }
    LambdaQueryWrapper<OrderSubscriptionMessageDb> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(OrderSubscriptionMessageDb::getEnterpriseId, enterpriseId);
    queryWrapper.in(OrderSubscriptionMessageDb::getId, ids);
    // 逻辑删除(使用 MyBatis-Plus 的 @TableLogic)
    return this.remove(queryWrapper) ? ids.size() : 0;
  }

  @Override
  public int batchPhysicalDeleteByIds(java.util.List<Long> ids, int enterpriseId) {
    if (ids == null || ids.isEmpty()) {
      return 0;
    }
    // 物理删除(使用 Mapper 中的 SQL,绕过逻辑删除)
    return this.baseMapper.physicalDeleteByIds(ids, enterpriseId);
  }

  @Override
  public List<OrderSubscriptionMessageDb> queryPendingMessages(int enterpriseId) {
    LambdaQueryWrapper<OrderSubscriptionMessageDb> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(OrderSubscriptionMessageDb::getEnterpriseId, enterpriseId)
        .eq(OrderSubscriptionMessageDb::getIsDeleted, false)
        .orderByAsc(OrderSubscriptionMessageDb::getCreatedAt);
    return this.list(queryWrapper);
  }
}