|
|
@ -1,18 +1,27 @@ |
|
|
package cc.hiver.mall.serviceimpl.mybatis; |
|
|
package cc.hiver.mall.serviceimpl.mybatis; |
|
|
|
|
|
|
|
|
import cc.hiver.core.common.utils.SnowFlakeUtil; |
|
|
import cc.hiver.core.common.utils.SnowFlakeUtil; |
|
|
|
|
|
import cc.hiver.mall.dao.mapper.MallDeliveryOrderMapper; |
|
|
|
|
|
import cc.hiver.mall.dao.mapper.MallOrderMapper; |
|
|
import cc.hiver.mall.dao.mapper.MallRefundRecordMapper; |
|
|
import cc.hiver.mall.dao.mapper.MallRefundRecordMapper; |
|
|
import cc.hiver.mall.dao.mapper.MallReturnOrderGoodsMapper; |
|
|
import cc.hiver.mall.dao.mapper.MallReturnOrderGoodsMapper; |
|
|
|
|
|
import cc.hiver.mall.entity.MallDeliveryOrder; |
|
|
import cc.hiver.mall.entity.MallOrder; |
|
|
import cc.hiver.mall.entity.MallOrder; |
|
|
import cc.hiver.mall.entity.MallRefundRecord; |
|
|
import cc.hiver.mall.entity.MallRefundRecord; |
|
|
import cc.hiver.mall.entity.MallReturnOrderGoods; |
|
|
import cc.hiver.mall.entity.MallReturnOrderGoods; |
|
|
|
|
|
import cc.hiver.mall.pojo.query.MallRefundRecordPageQuery; |
|
|
import cc.hiver.mall.service.mybatis.MallOrderService; |
|
|
import cc.hiver.mall.service.mybatis.MallOrderService; |
|
|
import cc.hiver.mall.service.mybatis.MallRefundRecordService; |
|
|
import cc.hiver.mall.service.mybatis.MallRefundRecordService; |
|
|
|
|
|
import cc.hiver.mall.utils.WechatPayUtil; |
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
|
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
|
|
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage; |
|
|
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
import org.springframework.stereotype.Service; |
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
import java.util.Date; |
|
|
import java.util.Date; |
|
|
import java.util.List; |
|
|
import java.util.List; |
|
|
|
|
|
|
|
|
@ -23,6 +32,21 @@ import java.util.List; |
|
|
public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMapper, MallRefundRecord> |
|
|
public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMapper, MallRefundRecord> |
|
|
implements MallRefundRecordService { |
|
|
implements MallRefundRecordService { |
|
|
|
|
|
|
|
|
|
|
|
// 订单状态常量数据库存储为 "01",用数字10代替
|
|
|
|
|
|
private static final int STATUS_WAIT_SHOP = 1; |
|
|
|
|
|
private static final int STATUS_WAIT_PICKUP = 3; |
|
|
|
|
|
private static final int STATUS_DELIVERING = 4; |
|
|
|
|
|
private static final int STATUS_END = 5; |
|
|
|
|
|
private static final int STATUS_REFUNDED = 8; |
|
|
|
|
|
private static final int STATUS_LAST_REFUNDED = 12; |
|
|
|
|
|
|
|
|
|
|
|
// 配送方式常量// 外卖
|
|
|
|
|
|
private static final int DELIVERY_TYPE_SELF = 2;// 外
|
|
|
|
|
|
private static final int DELIVERY_TYPE_PEISONG = 1; |
|
|
|
|
|
|
|
|
|
|
|
private static final int PAGESIZE = 10; |
|
|
|
|
|
private static final int PAGENUM = 1; |
|
|
|
|
|
|
|
|
@Autowired |
|
|
@Autowired |
|
|
private MallRefundRecordMapper mallRefundRecordMapper; |
|
|
private MallRefundRecordMapper mallRefundRecordMapper; |
|
|
|
|
|
|
|
|
@ -32,6 +56,18 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap |
|
|
@Autowired |
|
|
@Autowired |
|
|
private MallOrderService mallOrderService; |
|
|
private MallOrderService mallOrderService; |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
|
private MallOrderMapper mallOrderMapper; |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
|
private WechatPayUtil wechatPayUtil; |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
|
private MallDeliveryOrderMapper mallDeliveryOrderMapper; |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
|
private MallRefundRecordService mallRefundRecordService; |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public void create(MallRefundRecord mallRefundRecord) { |
|
|
public void create(MallRefundRecord mallRefundRecord) { |
|
|
//更新订单为 待售后
|
|
|
//更新订单为 待售后
|
|
|
@ -79,6 +115,161 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public void updateStatus(MallRefundRecord mallRefundRecord) { |
|
|
|
|
|
LambdaUpdateWrapper<MallRefundRecord> uw = new LambdaUpdateWrapper<>(); |
|
|
|
|
|
uw.eq(MallRefundRecord::getId, mallRefundRecord.getId()) |
|
|
|
|
|
.set(MallRefundRecord::getSuccessTime, new Date()) |
|
|
|
|
|
.set(MallRefundRecord::getStatus, mallRefundRecord.getStatus()); |
|
|
|
|
|
this.update(null, uw); |
|
|
|
|
|
Boolean isTuiKuan = true; |
|
|
|
|
|
if(mallRefundRecord.getStatus() > 3){ |
|
|
|
|
|
//处理售后
|
|
|
|
|
|
isTuiKuan = false; |
|
|
|
|
|
} |
|
|
|
|
|
//更新订单status、 配送单isReturn
|
|
|
|
|
|
if(mallRefundRecord.getRefundTypeStatus() != null && mallRefundRecord.getRefundTypeStatus() == 3){ |
|
|
|
|
|
//商家和配送员都有原因,需要判断另外角色处理了没再判断是否更新订单的状态
|
|
|
|
|
|
IPage<MallRefundRecord> page = new Page<>(PAGENUM, PAGESIZE); |
|
|
|
|
|
MallRefundRecordPageQuery q = new MallRefundRecordPageQuery(); |
|
|
|
|
|
q.setOrder(mallRefundRecord.getOrderId()); |
|
|
|
|
|
IPage<MallRefundRecord> result = this.baseMapper.selectPageVO(page, q); |
|
|
|
|
|
boolean hasEnd = result.getRecords().stream() |
|
|
|
|
|
.anyMatch(item -> item.getStatus() == 3 || item.getStatus() == 0); |
|
|
|
|
|
boolean hasReject = result.getRecords().stream() |
|
|
|
|
|
.anyMatch(item -> item.getStatus() == 2 || item.getStatus() == 5); |
|
|
|
|
|
if(isTuiKuan){ |
|
|
|
|
|
//都处理了
|
|
|
|
|
|
if(!hasEnd){ |
|
|
|
|
|
//都同意退款
|
|
|
|
|
|
if(!hasReject){ |
|
|
|
|
|
//同意退款
|
|
|
|
|
|
//MallOrder order = mallOrderService.getById(mallRefundRecord.getOrderId());
|
|
|
|
|
|
updateOrderStatus(mallRefundRecord.getOrderId(), STATUS_REFUNDED); |
|
|
|
|
|
if(mallRefundRecord.getDeliveryType() == DELIVERY_TYPE_PEISONG){ |
|
|
|
|
|
//更新配送单
|
|
|
|
|
|
LambdaUpdateWrapper<MallDeliveryOrder> duw = new LambdaUpdateWrapper<>(); |
|
|
|
|
|
duw.eq(MallDeliveryOrder::getOrderId, mallRefundRecord.getOrderId()) |
|
|
|
|
|
.set(MallDeliveryOrder::getStatus, 4); |
|
|
|
|
|
mallDeliveryOrderMapper.update(null, duw); |
|
|
|
|
|
} |
|
|
|
|
|
BigDecimal totalRefund = result.getRecords().stream() |
|
|
|
|
|
.map(item -> item.getRefundAmount()) // 提取 BigDecimal 金额
|
|
|
|
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add); |
|
|
|
|
|
wechatPayUtil.refund(mallRefundRecord.getOrderId(), totalRefund.multiply(new BigDecimal(100)).longValue(), totalRefund.multiply(new BigDecimal(100)).longValue()); |
|
|
|
|
|
}else{ |
|
|
|
|
|
//拒绝退款
|
|
|
|
|
|
//MallOrder order = mallOrderService.getById(mallRefundRecord.getOrderId());
|
|
|
|
|
|
//如果是自取订单,则恢复待消费状态
|
|
|
|
|
|
if(mallRefundRecord.getDeliveryType() == DELIVERY_TYPE_SELF){ |
|
|
|
|
|
updateOrderStatusAndReturn(mallRefundRecord.getOrderId(), STATUS_WAIT_PICKUP); |
|
|
|
|
|
}else{ |
|
|
|
|
|
MallDeliveryOrder delivery = findDeliveryByOrderId(mallRefundRecord.getOrderId()); |
|
|
|
|
|
if(delivery == null){ |
|
|
|
|
|
//去查团长的配送单
|
|
|
|
|
|
} |
|
|
|
|
|
if(delivery.getStatus() == STATUS_WAIT_SHOP){ |
|
|
|
|
|
updateOrderStatusAndReturn(mallRefundRecord.getOrderId(), STATUS_WAIT_PICKUP); |
|
|
|
|
|
}else if(delivery.getStatus() == DELIVERY_TYPE_SELF){ |
|
|
|
|
|
updateOrderStatusAndReturn(mallRefundRecord.getOrderId(), STATUS_DELIVERING); |
|
|
|
|
|
} |
|
|
|
|
|
//更新配送单isReturn
|
|
|
|
|
|
LambdaUpdateWrapper<MallDeliveryOrder> duw = new LambdaUpdateWrapper<>(); |
|
|
|
|
|
duw.eq(MallDeliveryOrder::getOrderId, mallRefundRecord.getOrderId()) |
|
|
|
|
|
.set(MallDeliveryOrder::getIsReturn, 0); |
|
|
|
|
|
mallDeliveryOrderMapper.update(null, duw); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
}else{ |
|
|
|
|
|
//售后
|
|
|
|
|
|
if(mallRefundRecord.getStatus() == 4){ |
|
|
|
|
|
//同意售后
|
|
|
|
|
|
MallOrder order = mallOrderService.getById(mallRefundRecord.getOrderId()); |
|
|
|
|
|
wechatPayUtil.refund(mallRefundRecord.getOrderId(),order.getTotalAmount().multiply(new BigDecimal(100)).longValue(), mallRefundRecord.getRefundAmount().multiply(new BigDecimal(100)).longValue()); |
|
|
|
|
|
} |
|
|
|
|
|
//都处理了
|
|
|
|
|
|
if(!hasEnd){ |
|
|
|
|
|
//更新订单状态已售后
|
|
|
|
|
|
updateOrderStatus(mallRefundRecord.getOrderId(), STATUS_LAST_REFUNDED); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
}else{ |
|
|
|
|
|
if(isTuiKuan){ |
|
|
|
|
|
//拒绝退款
|
|
|
|
|
|
if(mallRefundRecord.getStatus() == 2){ |
|
|
|
|
|
//MallOrder order = mallOrderService.getById(mallRefundRecord.getOrderId());
|
|
|
|
|
|
//如果是自取订单,则恢复待消费状态
|
|
|
|
|
|
if(mallRefundRecord.getDeliveryType() == DELIVERY_TYPE_SELF){ |
|
|
|
|
|
updateOrderStatusAndReturn(mallRefundRecord.getOrderId(), STATUS_WAIT_PICKUP); |
|
|
|
|
|
}else{ |
|
|
|
|
|
MallDeliveryOrder delivery = findDeliveryByOrderId(mallRefundRecord.getOrderId()); |
|
|
|
|
|
if(delivery == null){ |
|
|
|
|
|
//去查团长的配送单
|
|
|
|
|
|
} |
|
|
|
|
|
if(delivery.getStatus() == STATUS_WAIT_SHOP){ |
|
|
|
|
|
updateOrderStatusAndReturn(mallRefundRecord.getOrderId(), STATUS_WAIT_PICKUP); |
|
|
|
|
|
}else if(delivery.getStatus() == DELIVERY_TYPE_SELF){ |
|
|
|
|
|
updateOrderStatusAndReturn(mallRefundRecord.getOrderId(), STATUS_DELIVERING); |
|
|
|
|
|
} |
|
|
|
|
|
//更新配送单isReturn
|
|
|
|
|
|
LambdaUpdateWrapper<MallDeliveryOrder> duw = new LambdaUpdateWrapper<>(); |
|
|
|
|
|
duw.eq(MallDeliveryOrder::getOrderId, mallRefundRecord.getOrderId()) |
|
|
|
|
|
.set(MallDeliveryOrder::getIsReturn, 0); |
|
|
|
|
|
mallDeliveryOrderMapper.update(null, duw); |
|
|
|
|
|
} |
|
|
|
|
|
}else{ |
|
|
|
|
|
//同意退款
|
|
|
|
|
|
//MallOrder order = mallOrderService.getById(mallRefundRecord.getOrderId());
|
|
|
|
|
|
updateOrderStatus(mallRefundRecord.getOrderId(), STATUS_REFUNDED); |
|
|
|
|
|
if(mallRefundRecord.getDeliveryType() == DELIVERY_TYPE_PEISONG){ |
|
|
|
|
|
//更新配送单
|
|
|
|
|
|
LambdaUpdateWrapper<MallDeliveryOrder> duw = new LambdaUpdateWrapper<>(); |
|
|
|
|
|
duw.eq(MallDeliveryOrder::getOrderId, mallRefundRecord.getOrderId()) |
|
|
|
|
|
.set(MallDeliveryOrder::getStatus, 4); |
|
|
|
|
|
mallDeliveryOrderMapper.update(null, duw); |
|
|
|
|
|
} |
|
|
|
|
|
wechatPayUtil.refund(mallRefundRecord.getOrderId(), mallRefundRecord.getRefundAmount().multiply(new BigDecimal(100)).longValue(), mallRefundRecord.getRefundAmount().multiply(new BigDecimal(100)).longValue()); |
|
|
|
|
|
} |
|
|
|
|
|
}else{ |
|
|
|
|
|
//售后
|
|
|
|
|
|
if(mallRefundRecord.getStatus() == 4){ |
|
|
|
|
|
//同意售后
|
|
|
|
|
|
MallOrder order = mallOrderService.getById(mallRefundRecord.getOrderId()); |
|
|
|
|
|
updateOrderStatus(mallRefundRecord.getOrderId(), STATUS_LAST_REFUNDED); |
|
|
|
|
|
wechatPayUtil.refund(mallRefundRecord.getOrderId(), order.getTotalAmount().multiply(new BigDecimal(100)).longValue(), mallRefundRecord.getRefundAmount().multiply(new BigDecimal(100)).longValue()); |
|
|
|
|
|
}else{ |
|
|
|
|
|
//订单还是变成已完成状态
|
|
|
|
|
|
updateOrderStatus(mallRefundRecord.getOrderId(), STATUS_END); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 更新订单状态 |
|
|
|
|
|
*/ |
|
|
|
|
|
private void updateOrderStatus(String orderId, int status) { |
|
|
|
|
|
LambdaUpdateWrapper<MallOrder> uw = new LambdaUpdateWrapper<>(); |
|
|
|
|
|
uw.eq(MallOrder::getId, orderId).set(MallOrder::getStatus, status); |
|
|
|
|
|
mallOrderMapper.update(null, uw); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void updateOrderStatusAndReturn(String orderId, int status) { |
|
|
|
|
|
LambdaUpdateWrapper<MallOrder> uw = new LambdaUpdateWrapper<>(); |
|
|
|
|
|
uw.eq(MallOrder::getId, orderId).set(MallOrder::getStatus, status); |
|
|
|
|
|
mallOrderMapper.update(null, uw); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 根据订单ID查找配送单 |
|
|
|
|
|
*/ |
|
|
|
|
|
private MallDeliveryOrder findDeliveryByOrderId(String orderId) { |
|
|
|
|
|
LambdaQueryWrapper<MallDeliveryOrder> dq = new LambdaQueryWrapper<>(); |
|
|
|
|
|
dq.eq(MallDeliveryOrder::getOrderId, orderId).last("LIMIT 1"); |
|
|
|
|
|
return mallDeliveryOrderMapper.selectOne(dq); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public List<MallRefundRecord> selectByLinkId(MallRefundRecord mallRefundRecord) { |
|
|
public List<MallRefundRecord> selectByLinkId(MallRefundRecord mallRefundRecord) { |
|
|
LambdaUpdateWrapper<MallRefundRecord> uw = new LambdaUpdateWrapper<>(); |
|
|
LambdaUpdateWrapper<MallRefundRecord> uw = new LambdaUpdateWrapper<>(); |
|
|
@ -86,4 +277,41 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap |
|
|
List<MallRefundRecord> mallRefundRecords = this.list(uw); |
|
|
List<MallRefundRecord> mallRefundRecords = this.list(uw); |
|
|
return mallRefundRecords; |
|
|
return mallRefundRecords; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
public IPage<MallRefundRecord> selectPageVO(MallRefundRecordPageQuery q) { |
|
|
|
|
|
IPage<MallRefundRecord> page = new Page<>(q.getPageNum(), q.getPageSize()); |
|
|
|
|
|
IPage<MallRefundRecord> result = this.baseMapper.selectPageVO(page, q); |
|
|
|
|
|
// 批量查询售后商品明细,避免 N+1 问题
|
|
|
|
|
|
List<MallRefundRecord> records = result.getRecords(); |
|
|
|
|
|
if (records != null && !records.isEmpty()) { |
|
|
|
|
|
// 1. 收集所有订单ID
|
|
|
|
|
|
List<String> orderIds = records.stream() |
|
|
|
|
|
.map(MallRefundRecord::getOrderId) |
|
|
|
|
|
.collect(java.util.stream.Collectors.toList()); |
|
|
|
|
|
|
|
|
|
|
|
// 2. 一次 IN 查询所有商品明细
|
|
|
|
|
|
LambdaQueryWrapper<MallReturnOrderGoods> qw = new LambdaQueryWrapper<>(); |
|
|
|
|
|
qw.in(MallReturnOrderGoods::getOrderId, orderIds); |
|
|
|
|
|
List<MallReturnOrderGoods> allGoods = mallReturnOrderGoodsMapper.selectList(qw); |
|
|
|
|
|
|
|
|
|
|
|
// 3. 按 orderId 分组
|
|
|
|
|
|
java.util.Map<String, List<MallReturnOrderGoods>> goodsMap = allGoods.stream() |
|
|
|
|
|
.collect(java.util.stream.Collectors.groupingBy(MallReturnOrderGoods::getOrderId)); |
|
|
|
|
|
|
|
|
|
|
|
// 4. 批量查询订单商品明细,避免 N+1 问题
|
|
|
|
|
|
LambdaQueryWrapper<MallOrder> qwOrder = new LambdaQueryWrapper<>(); |
|
|
|
|
|
qwOrder.in(MallOrder::getId, orderIds); |
|
|
|
|
|
List<MallOrder> allOrders = mallOrderMapper.selectList(qwOrder); |
|
|
|
|
|
|
|
|
|
|
|
java.util.Map<String, List<MallOrder>> orderMap = allOrders.stream() |
|
|
|
|
|
.collect(java.util.stream.Collectors.groupingBy(MallOrder::getId)); |
|
|
|
|
|
// 4. 组装到每个 VO
|
|
|
|
|
|
for (MallRefundRecord vo : records) { |
|
|
|
|
|
vo.setItems(goodsMap.getOrDefault(vo.getOrderId(), java.util.Collections.emptyList())); |
|
|
|
|
|
vo.setMallOrder(orderMap.getOrDefault(vo.getOrderId(), new java.util.ArrayList<>()).get(0)); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return result; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|