RiderBalanceServiceImpl.java 3.28 KB
package com.diligrp.rider.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.diligrp.rider.common.exception.BizException;
import com.diligrp.rider.entity.Rider;
import com.diligrp.rider.entity.RiderBalance;
import com.diligrp.rider.mapper.RiderBalanceMapper;
import com.diligrp.rider.mapper.RiderMapper;
import com.diligrp.rider.service.RiderBalanceService;
import com.diligrp.rider.vo.BalanceVO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

@Service
@RequiredArgsConstructor
public class RiderBalanceServiceImpl implements RiderBalanceService {

    private final RiderMapper riderMapper;
    private final RiderBalanceMapper balanceMapper;

    private static final int PAGE_SIZE = 20;
    private static final DateTimeFormatter FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")
            .withZone(ZoneId.of("Asia/Shanghai"));

    @Override
    public BalanceVO getBalance(Long riderId, int page) {
        Rider rider = riderMapper.selectById(riderId);
        if (rider == null) throw new BizException("骑手信息不存在");

        int offset = (page - 1) * PAGE_SIZE;
        List<RiderBalance> records = balanceMapper.selectList(
                new LambdaQueryWrapper<RiderBalance>()
                        .eq(RiderBalance::getUid, riderId)
                        .orderByDesc(RiderBalance::getId)
                        .last("LIMIT " + offset + "," + PAGE_SIZE));

        List<BalanceVO.BalanceRecordVO> recordVOs = new ArrayList<>();
        for (RiderBalance r : records) {
            BalanceVO.BalanceRecordVO vo = new BalanceVO.BalanceRecordVO();
            vo.setId(r.getId());
            vo.setType(r.getType());
            vo.setTypeName(r.getType() == 1 ? "收入" : "提现");
            vo.setAction(r.getAction());
            vo.setOrderNo(r.getOrderNo());
            vo.setNums(r.getNums());
            vo.setTotal(r.getTotal());
            vo.setAddTime(r.getAddTime() != null ? FMT.format(Instant.ofEpochSecond(r.getAddTime())) : "");
            recordVOs.add(vo);
        }

        BalanceVO vo = new BalanceVO();
        vo.setBalance(rider.getBalance());
        vo.setRecords(recordVOs);
        return vo;
    }

    @Override
    public java.math.BigDecimal getTodayIncome(Long riderId) {
        //  Balance.getToday():type=1(收入) action=order_complete 当日流水总和
        java.time.LocalDate today = java.time.LocalDate.now();
        long todayStart = today.atStartOfDay(ZoneId.of("Asia/Shanghai")).toEpochSecond();
        long todayEnd = todayStart + 86400;

        java.util.List<RiderBalance> records = balanceMapper.selectList(
                new LambdaQueryWrapper<RiderBalance>()
                        .eq(RiderBalance::getUid, riderId)
                        .eq(RiderBalance::getType, 1)  // 收入
                        .ge(RiderBalance::getAddTime, todayStart)
                        .lt(RiderBalance::getAddTime, todayEnd));

        return records.stream()
                .map(RiderBalance::getNums)
                .filter(n -> n != null)
                .reduce(java.math.BigDecimal.ZERO, java.math.BigDecimal::add);
    }
}