package com.doumee.service.business.impl;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.doumee.core.constants.Constants;
|
import com.doumee.core.constants.ResponseStatus;
|
import com.doumee.core.exception.BusinessException;
|
import com.doumee.core.model.PageData;
|
import com.doumee.core.model.PageWrap;
|
import com.doumee.core.utils.Utils;
|
import com.doumee.dao.business.RevenueMapper;
|
import com.doumee.dao.business.WithdrawalOrdersMapper;
|
import com.doumee.dao.business.MemberMapper;
|
import com.doumee.dao.business.ShopInfoMapper;
|
import com.doumee.dao.business.model.Revenue;
|
import com.doumee.dao.business.model.ShopInfo;
|
import com.doumee.dao.business.model.Member;
|
import com.doumee.dao.business.model.WithdrawalOrders;
|
import com.doumee.dao.vo.RevenueStatisticsVO;
|
import com.doumee.service.business.RevenueService;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import java.util.List;
|
import java.util.Map;
|
import java.util.Objects;
|
|
/**
|
* 收支记录Service实现
|
* @author rk
|
* @date 2026/04/10
|
*/
|
@Service
|
public class RevenueServiceImpl implements RevenueService {
|
|
@Autowired
|
private RevenueMapper revenueMapper;
|
|
@Autowired
|
private WithdrawalOrdersMapper withdrawalOrdersMapper;
|
|
@Autowired
|
private ShopInfoMapper shopInfoMapper;
|
|
@Autowired
|
private MemberMapper memberMapper;
|
|
@Override
|
public Integer create(Revenue revenue) {
|
revenueMapper.insert(revenue);
|
return revenue.getId();
|
}
|
|
@Override
|
public void deleteById(Integer id) {
|
revenueMapper.update(new UpdateWrapper<Revenue>().lambda()
|
.set(Revenue::getDeleted, Constants.ONE)
|
.eq(Revenue::getId, id));
|
}
|
|
@Override
|
public void delete(Revenue revenue) {
|
UpdateWrapper<Revenue> deleteWrapper = new UpdateWrapper<>(revenue);
|
revenueMapper.delete(deleteWrapper);
|
}
|
|
@Override
|
public void deleteByIdInBatch(List<Integer> ids) {
|
if (ids == null || ids.isEmpty()) {
|
return;
|
}
|
revenueMapper.deleteBatchIds(ids);
|
}
|
|
@Override
|
public void updateById(Revenue revenue) {
|
revenueMapper.updateById(revenue);
|
}
|
|
@Override
|
public void updateByIdInBatch(List<Revenue> revenues) {
|
if (revenues == null || revenues.isEmpty()) {
|
return;
|
}
|
for (Revenue revenue : revenues) {
|
this.updateById(revenue);
|
}
|
}
|
|
@Override
|
public Revenue findById(Integer id) {
|
Revenue revenue = revenueMapper.selectById(id);
|
if (Objects.isNull(revenue)) {
|
throw new BusinessException(ResponseStatus.DATA_EMPTY);
|
}
|
return revenue;
|
}
|
|
@Override
|
public Revenue findOne(Revenue revenue) {
|
QueryWrapper<Revenue> wrapper = new QueryWrapper<>(revenue);
|
return revenueMapper.selectOne(wrapper);
|
}
|
|
@Override
|
public List<Revenue> findList(Revenue revenue) {
|
QueryWrapper<Revenue> wrapper = new QueryWrapper<>(revenue);
|
return revenueMapper.selectList(wrapper);
|
}
|
|
@Override
|
public PageData<Revenue> findPage(PageWrap<Revenue> pageWrap) {
|
IPage<Revenue> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
|
QueryWrapper<Revenue> queryWrapper = new QueryWrapper<>();
|
Utils.MP.blankToNull(pageWrap.getModel());
|
pageWrap.getModel().setDeleted(Constants.ZERO);
|
// 用户主键
|
if (pageWrap.getModel().getMemberId() != null) {
|
queryWrapper.lambda().eq(Revenue::getMemberId, pageWrap.getModel().getMemberId());
|
}
|
// 时间范围
|
if (pageWrap.getModel().getStartTime() != null) {
|
queryWrapper.lambda().ge(Revenue::getCreateTime, pageWrap.getModel().getStartTime());
|
}
|
if (pageWrap.getModel().getEndTime() != null) {
|
queryWrapper.lambda().le(Revenue::getCreateTime, pageWrap.getModel().getEndTime());
|
}
|
// 收支类型
|
if (pageWrap.getModel().getOptType() != null) {
|
queryWrapper.lambda().eq(Revenue::getOptType, pageWrap.getModel().getOptType());
|
}
|
// 订单号模糊查询
|
if (StringUtils.isNotBlank(pageWrap.getModel().getOrderNo())) {
|
queryWrapper.lambda().like(Revenue::getOrderNo, pageWrap.getModel().getOrderNo());
|
}
|
// 是否生效
|
if (pageWrap.getModel().getVaildStatus() != null) {
|
queryWrapper.lambda().eq(Revenue::getVaildStatus, pageWrap.getModel().getVaildStatus());
|
}
|
// 默认按创建时间倒序
|
queryWrapper.lambda().orderByDesc(Revenue::getCreateTime);
|
for (PageWrap.SortData sortData : pageWrap.getSorts()) {
|
if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
|
queryWrapper.orderByDesc(sortData.getProperty());
|
} else {
|
queryWrapper.orderByAsc(sortData.getProperty());
|
}
|
}
|
PageData<Revenue> result = PageData.from(revenueMapper.selectPage(page, queryWrapper));
|
// 金额分转元
|
if (result != null && result.getRecords() != null) {
|
for (Revenue model : result.getRecords()) {
|
model.setAmountInfo(Constants.getFormatMoney(model.getAmount()));
|
}
|
}
|
return result;
|
}
|
|
@Override
|
public long count(Revenue revenue) {
|
QueryWrapper<Revenue> wrapper = new QueryWrapper<>(revenue);
|
return revenueMapper.selectCount(wrapper);
|
}
|
|
@Override
|
public RevenueStatisticsVO getShopRevenueStatistics(Integer shopId) {
|
ShopInfo shop = shopInfoMapper.selectById(shopId);
|
if (shop == null || Constants.equalsInteger(shop.getDeleted(), Constants.ONE)) {
|
throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "门店不存在");
|
}
|
Integer memberId = shop.getRegionMemberId();
|
return buildRevenueStatistics(memberId, Constants.TWO, shop.getBalance());
|
}
|
|
@Override
|
public RevenueStatisticsVO getDriverRevenueStatistics(Integer memberId) {
|
Member member = memberMapper.selectById(memberId);
|
if (member == null) {
|
throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "用户不存在");
|
}
|
return buildRevenueStatistics(memberId, Constants.ONE, member.getAmount());
|
}
|
|
/**
|
* 构建收益统计
|
*
|
* @param memberId 会员主键
|
* @param memberType 会员类型:1=司机;2=门店
|
* @param balance 当前余额(分)
|
*/
|
private RevenueStatisticsVO buildRevenueStatistics(Integer memberId, Integer memberType, Long balance) {
|
RevenueStatisticsVO vo = new RevenueStatisticsVO();
|
vo.setBalance(balance != null ? balance : 0L);
|
|
// 待结算金额:revenue中 vaildStatus=0 且 type=0(完成订单)的收入之和
|
QueryWrapper<Revenue> pendingWrapper = new QueryWrapper<>();
|
pendingWrapper.select("IFNULL(SUM(AMOUNT), 0) as amount")
|
.eq("MEMBER_ID", memberId)
|
.eq("MEMBER_TYPE", memberType)
|
.eq("VAILD_STATUS", Constants.ZERO)
|
.eq("TYPE", Constants.ZERO)
|
.eq("OPT_TYPE", Constants.ONE)
|
.eq("DELETED", Constants.ZERO);
|
Map<String, Object> pendingResult = revenueMapper.selectMaps(pendingWrapper).stream().findFirst().orElse(null);
|
vo.setPendingAmount(pendingResult != null && pendingResult.get("amount") != null
|
? Long.parseLong(pendingResult.get("amount").toString()) : 0L);
|
|
// 累计提现金额:withdrawal_orders中 status=1(提现成功)且 type=0(提现)
|
QueryWrapper<WithdrawalOrders> successWrapper = new QueryWrapper<>();
|
successWrapper.select("IFNULL(SUM(AMOUNT), 0) as amount")
|
.eq("MEMBER_ID", memberId)
|
.eq("MEMBER_TYPE", memberType)
|
.eq("STATUS", Constants.ONE)
|
.eq("TYPE", Constants.ZERO)
|
.eq("DELETED", Constants.ZERO);
|
Map<String, Object> successResult = withdrawalOrdersMapper.selectMaps(successWrapper).stream().findFirst().orElse(null);
|
vo.setTotalWithdrawn(successResult != null && successResult.get("amount") != null
|
? Long.parseLong(successResult.get("amount").toString()) : 0L);
|
|
// 提现中金额:withdrawal_orders中 status=0(提现申请中)且 type=0(提现)
|
QueryWrapper<WithdrawalOrders> progressWrapper = new QueryWrapper<>();
|
progressWrapper.select("IFNULL(SUM(AMOUNT), 0) as amount")
|
.eq("MEMBER_ID", memberId)
|
.eq("MEMBER_TYPE", memberType)
|
.eq("STATUS", Constants.ZERO)
|
.eq("TYPE", Constants.ZERO)
|
.eq("DELETED", Constants.ZERO);
|
Map<String, Object> progressResult = withdrawalOrdersMapper.selectMaps(progressWrapper).stream().findFirst().orElse(null);
|
vo.setWithdrawingAmount(progressResult != null && progressResult.get("amount") != null
|
? Long.parseLong(progressResult.get("amount").toString()) : 0L);
|
|
return vo;
|
}
|
|
}
|