|
|
|
@ -1,11 +1,15 @@ |
|
|
|
package cc.hiver.mall.serviceimpl.mybatis; |
|
|
|
|
|
|
|
import cc.hiver.mall.dao.mapper.MallDeliveryOrderMapper; |
|
|
|
import cc.hiver.mall.dao.mapper.MallOrderGroupMapper; |
|
|
|
import cc.hiver.mall.entity.MallDeliveryOrder; |
|
|
|
import cc.hiver.mall.entity.MallOrder; |
|
|
|
import cc.hiver.mall.entity.MallOrderGroup; |
|
|
|
import cc.hiver.mall.pojo.query.MallDeliveryOrderPageQuery; |
|
|
|
import cc.hiver.mall.service.mybatis.MallDeliveryOrderService; |
|
|
|
import cc.hiver.mall.service.mybatis.MallOrderService; |
|
|
|
import cc.hiver.mall.utils.MerchantOrderSeqUtil; |
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage; |
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
|
|
|
@ -19,7 +23,10 @@ import org.springframework.transaction.annotation.Transactional; |
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.math.RoundingMode; |
|
|
|
import java.util.Arrays; |
|
|
|
import java.util.Date; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
|
|
|
|
/** |
|
|
|
* 配送订单 Service 实现 |
|
|
|
@ -45,13 +52,28 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
@Lazy |
|
|
|
private MallOrderService mallOrderService; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private MallOrderGroupMapper mallOrderGroupMapper; |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
private MerchantOrderSeqUtil merchantOrderSeqUtil; |
|
|
|
@Override |
|
|
|
public IPage<MallDeliveryOrder> pageDelivery(MallDeliveryOrderPageQuery q) { |
|
|
|
if (Boolean.TRUE.equals(q.getHallOnly())) { |
|
|
|
q.setPageSize(20); |
|
|
|
} |
|
|
|
IPage<MallDeliveryOrder> page = new Page<>(q.getPageNum(), q.getPageSize()); |
|
|
|
return this.baseMapper.selectPageVO(page, q); |
|
|
|
page = this.baseMapper.selectPageVO(page, q); |
|
|
|
|
|
|
|
// 抢单大厅中,如果页码越界,使其循环回到前面的页
|
|
|
|
if (Boolean.TRUE.equals(q.getHallOnly()) && page.getPages() > 0 && q.getPageNum() > page.getPages()) { |
|
|
|
long actualPage = ((q.getPageNum() - 1) % page.getPages()) + 1; |
|
|
|
page.setCurrent(actualPage); |
|
|
|
page = this.baseMapper.selectPageVO(page, q); |
|
|
|
} |
|
|
|
|
|
|
|
return page; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
@ -61,14 +83,14 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
|
public void workerAccept(String deliveryId, String workerId) { |
|
|
|
public Integer workerAccept(String deliveryId, String workerId,String groupId) { |
|
|
|
MallDeliveryOrder delivery = this.getById(deliveryId); |
|
|
|
if (delivery == null) throw new RuntimeException("配送单不存在"); |
|
|
|
if (delivery.getStatus() != STATUS_WAIT_ACCEPT) throw new RuntimeException("配送单已被接取或已取消"); |
|
|
|
if (delivery == null) return 0;//throw new RuntimeException("配送单不存在");
|
|
|
|
if (delivery.getStatus() != STATUS_WAIT_ACCEPT) return 1;//throw new RuntimeException("配送单已被接取或已取消");
|
|
|
|
|
|
|
|
// 指派单校验
|
|
|
|
if (StringUtils.isNotBlank(delivery.getWorkerId()) && !delivery.getWorkerId().equals(workerId)) { |
|
|
|
throw new RuntimeException("该单已指定其他配送员,无法抢单"); |
|
|
|
return 2;//throw new RuntimeException("该单已指定其他配送员,无法抢单");
|
|
|
|
} |
|
|
|
|
|
|
|
// 更新配送单
|
|
|
|
@ -78,31 +100,67 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
.set(MallDeliveryOrder::getWorkerId, workerId) |
|
|
|
.set(MallDeliveryOrder::getAcceptTime, new Date()); |
|
|
|
|
|
|
|
MallOrder order = mallOrderService.getById(delivery.getOrderId()); |
|
|
|
String numberCode = ""; |
|
|
|
//需要查询该group的所有关联订单,如果是面对面拼团需要更新订单序号
|
|
|
|
if(delivery.getGroupId() != null){ |
|
|
|
LambdaQueryWrapper<MallOrderGroup> gq = new LambdaQueryWrapper<>(); |
|
|
|
gq.eq(MallOrderGroup::getId, delivery.getGroupId()); |
|
|
|
MallOrderGroup group = mallOrderGroupMapper.selectOne(gq); |
|
|
|
if(group.getIsFace() == 1){ |
|
|
|
List<String> orderIds = Arrays.asList(group.getGroupOrderIds().split(",")); |
|
|
|
for (String orderId : orderIds) { |
|
|
|
MallOrder orderInner = mallOrderService.getById(orderId); |
|
|
|
if (orderInner != null) { |
|
|
|
String latestSeq = merchantOrderSeqUtil.generateOrderSequence(order.getShopId(), 1); |
|
|
|
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>(); |
|
|
|
oUw.eq(MallOrder::getId, orderId) |
|
|
|
.set(MallOrder::getNumberCode, latestSeq).set(MallOrder::getStatus, 3); |
|
|
|
mallOrderService.update(oUw); |
|
|
|
numberCode+=latestSeq+"+"; |
|
|
|
} |
|
|
|
} |
|
|
|
}else{ |
|
|
|
// 同步更新关联订单状态:待配送员接单 -> 配送中(或待取货)
|
|
|
|
if (StringUtils.isNotBlank(delivery.getOrderId())) { |
|
|
|
if (order != null && order.getStatus() == ORDER_STATUS_WAIT_DELIVERY) { |
|
|
|
String latestSeq = merchantOrderSeqUtil.generateOrderSequence(order.getShopId(), 1); |
|
|
|
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>(); |
|
|
|
oUw.eq(MallOrder::getId, delivery.getOrderId()) |
|
|
|
.set(MallOrder::getNumberCode, latestSeq).set(MallOrder::getStatus, 3); // 待取货
|
|
|
|
//缺少根据groupId更新面对面团所有订单状态
|
|
|
|
mallOrderService.update(oUw); |
|
|
|
numberCode = latestSeq; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
}else{ |
|
|
|
// 同步更新关联订单状态:待配送员接单 -> 配送中(或待取货)
|
|
|
|
if (StringUtils.isNotBlank(delivery.getOrderId())) { |
|
|
|
if (order != null && order.getStatus() == ORDER_STATUS_WAIT_DELIVERY) { |
|
|
|
String latestSeq = merchantOrderSeqUtil.generateOrderSequence(order.getShopId(), 1); |
|
|
|
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>(); |
|
|
|
oUw.eq(MallOrder::getId, delivery.getOrderId()) |
|
|
|
.set(MallOrder::getNumberCode, latestSeq).set(MallOrder::getStatus, 3); // 待取货
|
|
|
|
//缺少根据groupId更新面对面团所有订单状态
|
|
|
|
mallOrderService.update(oUw); |
|
|
|
numberCode = latestSeq; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
// 若为指派单(直接购买),计算平台额外佣金 = 商品总价 * 2%
|
|
|
|
if (StringUtils.isNotBlank(delivery.getOrderId())) { |
|
|
|
MallOrder order = mallOrderService.getById(delivery.getOrderId()); |
|
|
|
if (order != null && order.getOrderType() == 1) { |
|
|
|
BigDecimal bonus = order.getGoodsAmount() |
|
|
|
.multiply(new BigDecimal("0.02")) |
|
|
|
.setScale(2, RoundingMode.HALF_UP); |
|
|
|
uw.set(MallDeliveryOrder::getDeliveryFeeMarketplace, bonus); |
|
|
|
uw.set(MallDeliveryOrder::getNumberCode, numberCode); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
this.update(uw); |
|
|
|
|
|
|
|
// 同步更新关联订单状态:待配送员接单 -> 配送中(或待取货)
|
|
|
|
if (StringUtils.isNotBlank(delivery.getOrderId())) { |
|
|
|
MallOrder order = mallOrderService.getById(delivery.getOrderId()); |
|
|
|
if (order != null && order.getStatus() == ORDER_STATUS_WAIT_DELIVERY) { |
|
|
|
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>(); |
|
|
|
oUw.eq(MallOrder::getId, delivery.getOrderId()) |
|
|
|
.set(MallOrder::getStatus, 3); // 待取货
|
|
|
|
mallOrderService.update(oUw); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
log.info("配送员 {} 接单成功,deliveryId={}", workerId, deliveryId); |
|
|
|
return 3; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
@ -190,4 +248,9 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
.eq(MallDeliveryOrder::getDeliveryType, deliveryType); |
|
|
|
return this.count(query); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public List<Map<Integer, Integer>> countOrdersByType(String regionId) { |
|
|
|
return this.baseMapper.countOrdersByType(regionId); |
|
|
|
} |
|
|
|
} |
|
|
|
|