Browse Source

对接拼团数据1

master
wangfukang 1 month ago
parent
commit
82ec902119
  1. 16
      hiver-admin/test-output/test-report.html
  2. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java
  3. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallDeliveryOrder.java
  4. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallReturnOrderGoods.java
  5. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/CreateOrderDTO.java
  6. 19
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java
  7. 23
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java
  8. 58
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java
  9. 60
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java
  10. 2
      hiver-modules/hiver-mall/src/main/resources/db/mall_delivery_appointment.sql
  11. 9
      hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml

16
hiver-admin/test-output/test-report.html

@ -35,7 +35,7 @@
<a href="#"><span class="badge badge-primary">Hiver</span></a> <a href="#"><span class="badge badge-primary">Hiver</span></a>
</li> </li>
<li class="m-r-10"> <li class="m-r-10">
<a href="#"><span class="badge badge-primary">六月 19, 2026 13:55:31</span></a> <a href="#"><span class="badge badge-primary">六月 21, 2026 16:41:05</span></a>
</li> </li>
</ul> </ul>
</div> </div>
@ -84,7 +84,7 @@
<div class="test-detail"> <div class="test-detail">
<span class="meta text-white badge badge-sm"></span> <span class="meta text-white badge badge-sm"></span>
<p class="name">passTest</p> <p class="name">passTest</p>
<p class="text-sm"><span>13:55:31 下午</span> / <span>0.022 secs</span></p> <p class="text-sm"><span>16:41:06 下午</span> / <span>0.024 secs</span></p>
</div> </div>
<div class="test-contents d-none"> <div class="test-contents d-none">
<div class="detail-head"> <div class="detail-head">
@ -92,9 +92,9 @@
<div class="info"> <div class="info">
<div class='float-right'><span class='badge badge-default'>#test-id=1</span></div> <div class='float-right'><span class='badge badge-default'>#test-id=1</span></div>
<h5 class="test-status text-pass">passTest</h5> <h5 class="test-status text-pass">passTest</h5>
<span class='badge badge-success'>06.19.2026 13:55:31</span> <span class='badge badge-success'>06.21.2026 16:41:06</span>
<span class='badge badge-danger'>06.19.2026 13:55:31</span> <span class='badge badge-danger'>06.21.2026 16:41:06</span>
<span class='badge badge-default'>0.022 secs</span> <span class='badge badge-default'>0.024 secs</span>
</div> </div>
<div class="m-t-10 m-l-5"></div> <div class="m-t-10 m-l-5"></div>
</div> </div>
@ -104,7 +104,7 @@
<tbody> <tbody>
<tr class="event-row"> <tr class="event-row">
<td><span class="badge log pass-bg">Pass</span></td> <td><span class="badge log pass-bg">Pass</span></td>
<td>13:55:31</td> <td>16:41:06</td>
<td> <td>
Test passed Test passed
</td> </td>
@ -128,13 +128,13 @@
<div class="col-md-3"> <div class="col-md-3">
<div class="card"><div class="card-body"> <div class="card"><div class="card-body">
<p class="m-b-0">Started</p> <p class="m-b-0">Started</p>
<h3>六月 19, 2026 13:55:31</h3> <h3>六月 21, 2026 16:41:05</h3>
</div></div> </div></div>
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
<div class="card"><div class="card-body"> <div class="card"><div class="card-body">
<p class="m-b-0">Ended</p> <p class="m-b-0">Ended</p>
<h3>六月 19, 2026 13:55:31</h3> <h3>六月 21, 2026 16:41:06</h3>
</div></div> </div></div>
</div> </div>
<div class="col-md-3"> <div class="col-md-3">

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java

@ -464,6 +464,8 @@ public class MallDeliveryOrderController {
Integer result = mallDeliveryOrderService.rejectDelivery(deliveryId); Integer result = mallDeliveryOrderService.rejectDelivery(deliveryId);
if(result == -1){ if(result == -1){
return ResultUtil.error("今日拒单次数已达上限,无法继续拒单!"); return ResultUtil.error("今日拒单次数已达上限,无法继续拒单!");
}else if(result == -2){
return ResultUtil.success("预约配送单拒单成功,不计入今日拒单次数");
}else{ }else{
return ResultUtil.success("拒单成功!今日剩余拒单次数:" + result); return ResultUtil.success("拒单成功!今日剩余拒单次数:" + result);
} }

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallDeliveryOrder.java

@ -75,6 +75,8 @@ public class MallDeliveryOrder implements Serializable {
private Date getTime; private Date getTime;
@ApiModelProperty(value = "客户要求送达时间") @ApiModelProperty(value = "客户要求送达时间")
private Date mustFinishTime; private Date mustFinishTime;
@ApiModelProperty(value = "是否预约配送 0否 1是")
private Integer appointmentDelivery;
@ApiModelProperty(value = "到店时间") @ApiModelProperty(value = "到店时间")
private Date arriveTime; private Date arriveTime;
@ApiModelProperty(value = "送达时间") @ApiModelProperty(value = "送达时间")

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/MallReturnOrderGoods.java

@ -34,6 +34,8 @@ public class MallReturnOrderGoods implements Serializable {
private String specs; private String specs;
@ApiModelProperty(value = "商品单价") @ApiModelProperty(value = "商品单价")
private BigDecimal price; private BigDecimal price;
@ApiModelProperty(value = "商品餐盒费")
private BigDecimal packageFee;
@ApiModelProperty(value = "商品数量") @ApiModelProperty(value = "商品数量")
private Integer quantity; private Integer quantity;
} }

3
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/pojo/dto/CreateOrderDTO.java

@ -57,6 +57,9 @@ public class CreateOrderDTO {
@ApiModelProperty(value = "要求送达时间(预约配送时填写)") @ApiModelProperty(value = "要求送达时间(预约配送时填写)")
private Date mustFinishTime; private Date mustFinishTime;
@ApiModelProperty(value = "是否预约配送 0否 1是")
private Integer appointmentDelivery;
@ApiModelProperty(value = "加入已有拼团时传入groupId") @ApiModelProperty(value = "加入已有拼团时传入groupId")
private String groupId; private String groupId;

19
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java

@ -266,10 +266,13 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
MallOrder order = mallOrderService.getById(delivery.getOrderId()); MallOrder order = mallOrderService.getById(delivery.getOrderId());
boolean transferDelivery = Integer.valueOf(1).equals(delivery.getTransferDelivery()) boolean transferDelivery = Integer.valueOf(1).equals(delivery.getTransferDelivery())
|| (order != null && Integer.valueOf(1).equals(order.getTransferDelivery())); || (order != null && Integer.valueOf(1).equals(order.getTransferDelivery()));
boolean appointmentDelivery = Integer.valueOf(1).equals(delivery.getAppointmentDelivery());
String transferPickupCode = transferDelivery ? generateTransferPickupCode() : delivery.getTransferPickupCode(); String transferPickupCode = transferDelivery ? generateTransferPickupCode() : delivery.getTransferPickupCode();
// 计算必须完成时间 // 计算必须完成时间
Date mustFinishTime; Date mustFinishTime;
if (transferDelivery) { if (appointmentDelivery) {
mustFinishTime = delivery.getMustFinishTime();
} else if (transferDelivery) {
mustFinishTime = calculateTransferMustFinishTime(delivery.getRegionId(), delivery.getShopId(), delivery.getDeliveryType()); mustFinishTime = calculateTransferMustFinishTime(delivery.getRegionId(), delivery.getShopId(), delivery.getDeliveryType());
} else if (Boolean.FALSE.equals(notifyShop) && delivery.getMustFinishTime() != null) { } else if (Boolean.FALSE.equals(notifyShop) && delivery.getMustFinishTime() != null) {
mustFinishTime = delivery.getMustFinishTime(); mustFinishTime = delivery.getMustFinishTime();
@ -295,7 +298,9 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
delivery.setWorkerId(workerId); delivery.setWorkerId(workerId);
delivery.setWorkerName(workerName); delivery.setWorkerName(workerName);
delivery.setAcceptTime(acceptTime); delivery.setAcceptTime(acceptTime);
delivery.setMustFinishTime(mustFinishTime); if (!appointmentDelivery) {
delivery.setMustFinishTime(mustFinishTime);
}
delivery.setTransferPickupCode(transferPickupCode); delivery.setTransferPickupCode(transferPickupCode);
LambdaUpdateWrapper<MallDeliveryOrder> uw = new LambdaUpdateWrapper<>(); LambdaUpdateWrapper<MallDeliveryOrder> uw = new LambdaUpdateWrapper<>();
@ -305,8 +310,10 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
.set(MallDeliveryOrder::getWorkerName, workerName) .set(MallDeliveryOrder::getWorkerName, workerName)
.set(MallDeliveryOrder::getWorkerPhone, workerPhone) .set(MallDeliveryOrder::getWorkerPhone, workerPhone)
.set(MallDeliveryOrder::getAcceptTime, acceptTime) .set(MallDeliveryOrder::getAcceptTime, acceptTime)
.set(MallDeliveryOrder::getMustFinishTime, mustFinishTime)
.set(MallDeliveryOrder::getTransferPickupCode, transferPickupCode); .set(MallDeliveryOrder::getTransferPickupCode, transferPickupCode);
if (!appointmentDelivery) {
uw.set(MallDeliveryOrder::getMustFinishTime, mustFinishTime);
}
if (transferDelivery) { if (transferDelivery) {
uw.set(MallDeliveryOrder::getShopAddress, delivery.getShopAddress()); uw.set(MallDeliveryOrder::getShopAddress, delivery.getShopAddress());
} }
@ -795,11 +802,13 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
@Override @Override
public Integer rejectDelivery(String deliveryId) { public Integer rejectDelivery(String deliveryId) {
MallDeliveryOrder delivery = this.getById(deliveryId); MallDeliveryOrder delivery = this.getById(deliveryId);
Integer result = deliveryRejectUtil.handleRejectOrder(delivery.getWorkerId(), delivery.getOrderId()); if (delivery == null) throw new RuntimeException("配送单不存在");
Integer result = Integer.valueOf(1).equals(delivery.getAppointmentDelivery())
? -2
: deliveryRejectUtil.handleRejectOrder(delivery.getWorkerId(), delivery.getOrderId());
if(result == -1){ if(result == -1){
return -1; return -1;
}else{ }else{
if (delivery == null) throw new RuntimeException("配送单不存在");
LambdaUpdateWrapper<MallDeliveryOrder> uw = new LambdaUpdateWrapper<>(); LambdaUpdateWrapper<MallDeliveryOrder> uw = new LambdaUpdateWrapper<>();
uw.eq(MallDeliveryOrder::getId, deliveryId) uw.eq(MallDeliveryOrder::getId, deliveryId)
.set(MallDeliveryOrder::getWorkerId, null).set(MallDeliveryOrder::getWorkerName, (String)null) .set(MallDeliveryOrder::getWorkerId, null).set(MallDeliveryOrder::getWorkerName, (String)null)

23
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderGroupServiceImpl.java

@ -241,8 +241,22 @@ public class MallOrderGroupServiceImpl extends ServiceImpl<MallOrderGroupMapper,
delivery.setStatus(0); delivery.setStatus(0);
Date createTime = new Timestamp(System.currentTimeMillis()); Date createTime = new Timestamp(System.currentTimeMillis());
delivery.setCreateTime(createTime); delivery.setCreateTime(createTime);
delivery.setMustFinishTime(calculateActivatedMustFinishTime(order, delivery)); boolean appointmentDelivery = Integer.valueOf(1).equals(delivery.getAppointmentDelivery());
mallDeliveryOrderMapper.updateById(delivery); Date mustFinishTime = appointmentDelivery ? delivery.getMustFinishTime() : calculateActivatedMustFinishTime(order, delivery);
if (!appointmentDelivery) {
delivery.setMustFinishTime(mustFinishTime);
}
LambdaUpdateWrapper<MallDeliveryOrder> duw = new LambdaUpdateWrapper<>();
duw.eq(MallDeliveryOrder::getId, delivery.getId())
.set(MallDeliveryOrder::getStatus, delivery.getStatus())
.set(MallDeliveryOrder::getCreateTime, createTime)
.set(MallDeliveryOrder::getWorkerId, delivery.getWorkerId())
.set(MallDeliveryOrder::getWorkerPhone, delivery.getWorkerPhone())
.set(MallDeliveryOrder::getWorkerName, delivery.getWorkerName());
if (!appointmentDelivery) {
duw.set(MallDeliveryOrder::getMustFinishTime, mustFinishTime);
}
mallDeliveryOrderMapper.update(null, duw);
//抢单大厅缓存 //抢单大厅缓存
if (isFace2Face) { if (isFace2Face) {
// 面对面团查所有人订单;保持原有查询条件,依赖上方先完成整团状态激活。 // 面对面团查所有人订单;保持原有查询条件,依赖上方先完成整团状态激活。
@ -310,7 +324,10 @@ public class MallOrderGroupServiceImpl extends ServiceImpl<MallOrderGroupMapper,
if (order != null && Integer.valueOf(1).equals(order.getTransferDelivery())) { if (order != null && Integer.valueOf(1).equals(order.getTransferDelivery())) {
return calculateTransferMustFinishTime(order.getRegionId(), order.getShopId(), deliveryType); return calculateTransferMustFinishTime(order.getRegionId(), order.getShopId(), deliveryType);
} }
if (order != null && Integer.valueOf(1).equals(order.getShopDelivery()) && delivery != null && delivery.getMustFinishTime() != null) { if (delivery != null
&& delivery.getMustFinishTime() != null
&& (Integer.valueOf(1).equals(delivery.getAppointmentDelivery())
|| (order != null && Integer.valueOf(1).equals(order.getShopDelivery())))) {
return delivery.getMustFinishTime(); return delivery.getMustFinishTime();
} }
return calculateMustFinishTime(order == null ? null : order.getRegionId(), order == null ? null : order.getShopId(), deliveryType); return calculateMustFinishTime(order == null ? null : order.getRegionId(), order == null ? null : order.getShopId(), deliveryType);

58
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java

@ -618,17 +618,23 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
LambdaQueryWrapper<MallDeliveryOrder> qw = new LambdaQueryWrapper<>(); LambdaQueryWrapper<MallDeliveryOrder> qw = new LambdaQueryWrapper<>();
qw.eq(MallDeliveryOrder::getOrderId, orderId); qw.eq(MallDeliveryOrder::getOrderId, orderId);
MallDeliveryOrder deliveryOrder = mallDeliveryOrderMapper.selectOne(qw); MallDeliveryOrder deliveryOrder = mallDeliveryOrderMapper.selectOne(qw);
Date mustFinishTime = calculateActivatedMustFinishTime(order, deliveryOrder); boolean appointmentDelivery = deliveryOrder != null && Integer.valueOf(1).equals(deliveryOrder.getAppointmentDelivery());
Date mustFinishTime = appointmentDelivery ? deliveryOrder.getMustFinishTime() : calculateActivatedMustFinishTime(order, deliveryOrder);
LambdaUpdateWrapper<MallDeliveryOrder> duw = new LambdaUpdateWrapper<>(); LambdaUpdateWrapper<MallDeliveryOrder> duw = new LambdaUpdateWrapper<>();
duw.eq(MallDeliveryOrder::getOrderId, orderId) duw.eq(MallDeliveryOrder::getOrderId, orderId)
.set(MallDeliveryOrder::getStatus, 0).set(MallDeliveryOrder::getCreateTime, createTime).set(MallDeliveryOrder::getMustFinishTime, mustFinishTime); .set(MallDeliveryOrder::getStatus, 0).set(MallDeliveryOrder::getCreateTime, createTime);
if (!appointmentDelivery) {
duw.set(MallDeliveryOrder::getMustFinishTime, mustFinishTime);
}
mallDeliveryOrderMapper.update(null, duw); mallDeliveryOrderMapper.update(null, duw);
//抢单大厅缓存 //抢单大厅缓存
if (deliveryOrder != null) { if (deliveryOrder != null) {
deliveryOrder.setStatus(0); deliveryOrder.setStatus(0);
deliveryOrder.setCreateTime(createTime); deliveryOrder.setCreateTime(createTime);
deliveryOrder.setMustFinishTime(mustFinishTime); if (!appointmentDelivery) {
deliveryOrder.setMustFinishTime(mustFinishTime);
}
} }
List<MallOrderGoods> goodsList = mallOrderGoodsMapper.selectByOrderId(orderId); List<MallOrderGoods> goodsList = mallOrderGoodsMapper.selectByOrderId(orderId);
if (deliveryOrder != null) { if (deliveryOrder != null) {
@ -706,6 +712,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
} }
} }
if (group != null) { if (group != null) {
//判断是否成团 激活订单和配送单等操作
mallOrderGroupService.checkAndActivateGroup(group.getId()); mallOrderGroupService.checkAndActivateGroup(group.getId());
} }
} }
@ -1653,6 +1660,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
delivery.setStatus(initialStatus); delivery.setStatus(initialStatus);
delivery.setRemark(dto.getRemark()); delivery.setRemark(dto.getRemark());
delivery.setDeliveryType(1); // 外卖单 delivery.setDeliveryType(1); // 外卖单
delivery.setAppointmentDelivery(Integer.valueOf(1).equals(dto.getAppointmentDelivery()) ? 1 : 0);
// 总配送费放入 delivery // 总配送费放入 delivery
delivery.setDeliveryFee(overrideDeliveryFee != null ? overrideDeliveryFee : order.getDeliveryFee()); delivery.setDeliveryFee(overrideDeliveryFee != null ? overrideDeliveryFee : order.getDeliveryFee());
delivery.setCreateTime(new Date()); delivery.setCreateTime(new Date());
@ -1729,7 +1737,10 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
if (order != null && Integer.valueOf(1).equals(order.getTransferDelivery())) { if (order != null && Integer.valueOf(1).equals(order.getTransferDelivery())) {
return calculateTransferMustFinishTime(order.getRegionId(), order.getShopId(), deliveryType); return calculateTransferMustFinishTime(order.getRegionId(), order.getShopId(), deliveryType);
} }
if (order != null && Integer.valueOf(1).equals(order.getShopDelivery()) && delivery != null && delivery.getMustFinishTime() != null) { if (delivery != null
&& delivery.getMustFinishTime() != null
&& (Integer.valueOf(1).equals(delivery.getAppointmentDelivery())
|| (order != null && Integer.valueOf(1).equals(order.getShopDelivery())))) {
return delivery.getMustFinishTime(); return delivery.getMustFinishTime();
} }
return calculateMustFinishTime(order == null ? null : order.getRegionId(), order == null ? null : order.getShopId(), deliveryType); return calculateMustFinishTime(order == null ? null : order.getRegionId(), order == null ? null : order.getShopId(), deliveryType);
@ -1866,21 +1877,35 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
record.setCreateTime(new Date()); record.setCreateTime(new Date());
record.setRefundType(refundType); record.setRefundType(refundType);
record.setRefundTypeStatus(refundTypeStatus); record.setRefundTypeStatus(refundTypeStatus);
//是否有优惠券 // 2. 查询关联的优惠券
BigDecimal ratio = null;
LambdaQueryWrapper<MallUserCoupon> uq = new LambdaQueryWrapper<>(); LambdaQueryWrapper<MallUserCoupon> uq = new LambdaQueryWrapper<>();
uq.eq(MallUserCoupon::getOrderId, record.getOrderId()); uq.eq(MallUserCoupon::getOrderId, order.getId());
List<MallUserCoupon> coupons = mallUserCouponMapper.selectList(uq); List<MallUserCoupon> coupons = mallUserCouponMapper.selectList(uq);
//计算已结算订单 商家同意售后时,按照商品原价-抽佣金额给商家加一条负数待结算记录,
// 未结算的订单结算时需要关联是否有售后减掉售后金额 商家需要有账单结算记录 BigDecimal ratio = null;
//配送员同意售后时需要在他的账户余额减退款金额,订单配送完成给加钱 // 4. 分别计算优惠券总额和免单金额
if(coupons != null && coupons.size() > 0){ BigDecimal totalCoupons = BigDecimal.ZERO;
BigDecimal totalCoupons = coupons.stream() if (coupons != null && !coupons.isEmpty()) {
.map(item -> item.getDiscountAmount()) // 提取 BigDecimal 金额 totalCoupons = coupons.stream()
.map(MallUserCoupon::getDiscountAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add); .reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal allAmount = amount.add(totalCoupons); }
//计算比例
ratio = totalCoupons.divide(allAmount, 4, RoundingMode.HALF_UP); // 获取免单金额,防止空指针
BigDecimal freeAmount = order.getFreeAmount() != null ? order.getFreeAmount() : BigDecimal.ZERO;
// 5. 分开判断并计算比例
// 只要存在优惠券抵扣或免单金额,就需要计算比例
if (totalCoupons.compareTo(BigDecimal.ZERO) > 0 || freeAmount.compareTo(BigDecimal.ZERO) > 0) {
BigDecimal allAmount = order.getTotalAmount()
.add(freeAmount)
.add(totalCoupons);
// 防止除以 0 的异常
if (allAmount.compareTo(BigDecimal.ZERO) > 0) {
ratio = totalCoupons.add(freeAmount)
.divide(allAmount, 4, RoundingMode.HALF_UP);
}
} }
// 全额退款 // 全额退款
if(refundType == 3){ if(refundType == 3){
@ -1988,6 +2013,7 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
returnGoods.setProductPicture(goods.getProductPicture()); returnGoods.setProductPicture(goods.getProductPicture());
returnGoods.setSpecs(goods.getSpecs()); returnGoods.setSpecs(goods.getSpecs());
returnGoods.setPrice(goods.getPrice()); returnGoods.setPrice(goods.getPrice());
returnGoods.setPackageFee(goods.getPackageFee());
returnGoods.setQuantity(goods.getQuantity()); returnGoods.setQuantity(goods.getQuantity());
mallReturnOrderGoodsMapper.insert(returnGoods); mallReturnOrderGoodsMapper.insert(returnGoods);
return returnGoods; return returnGoods;

60
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallRefundRecordServiceImpl.java

@ -109,25 +109,45 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void create(MallRefundRecord mallRefundRecord) { public void create(MallRefundRecord mallRefundRecord) {
//更新订单为 待售后 //更新订单为 待售后
// 1. 使用 LambdaUpdateWrapper 规范更新订单状态
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>(); LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>();
oUw.eq(MallOrder::getId, mallRefundRecord.getOrderId()) oUw.eq(MallOrder::getId, mallRefundRecord.getOrderId())
.set(MallOrder::getStatus, 11); .set(MallOrder::getStatus, 11);
mallOrderService.update(oUw); // 注意:Service 层的 update 方法通常需要传入实体对象,若只传 Wrapper 可能会报错,建议传 null
mallOrderService.update(null, oUw);
// 2. 查询关联的优惠券
LambdaQueryWrapper<MallUserCoupon> uq = new LambdaQueryWrapper<>();
uq.eq(MallUserCoupon::getOrderId, mallRefundRecord.getOrderId());
List<MallUserCoupon> coupons = mallUserCouponMapper.selectList(uq);
// 3. 重新获取最新订单信息
MallOrder order = mallOrderService.getById(mallRefundRecord.getOrderId()); MallOrder order = mallOrderService.getById(mallRefundRecord.getOrderId());
BigDecimal ratio = null; BigDecimal ratio = null;
LambdaQueryWrapper<MallUserCoupon> uq = new LambdaQueryWrapper<>(); // 4. 分别计算优惠券总额和免单金额
uq.eq(MallUserCoupon::getOrderId, mallRefundRecord.getOrderId()); BigDecimal totalCoupons = BigDecimal.ZERO;
List<MallUserCoupon> coupons = mallUserCouponMapper.selectList(uq); if (coupons != null && !coupons.isEmpty()) {
//计算已结算订单 商家同意售后时,按照商品原价-抽佣金额给商家加一条负数待结算记录, totalCoupons = coupons.stream()
// 未结算的订单结算时需要关联是否有售后减掉售后金额 商家需要有账单结算记录 .map(MallUserCoupon::getDiscountAmount)
//配送员同意售后时需要在他的账户余额减退款金额,订单配送完成给加钱
if(coupons != null && coupons.size() > 0){
BigDecimal totalCoupons = coupons.stream()
.map(item -> item.getDiscountAmount()) // 提取 BigDecimal 金额
.reduce(BigDecimal.ZERO, BigDecimal::add); .reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal allAmount = mallRefundRecord.getTotalAmount().add(totalCoupons); }
//计算比例
ratio = totalCoupons.divide(allAmount, 4, RoundingMode.HALF_UP); // 获取免单金额,防止空指针
BigDecimal freeAmount = order.getFreeAmount() != null ? order.getFreeAmount() : BigDecimal.ZERO;
// 5. 分开判断并计算比例
// 只要存在优惠券抵扣或免单金额,就需要计算比例
if (totalCoupons.compareTo(BigDecimal.ZERO) > 0 || freeAmount.compareTo(BigDecimal.ZERO) > 0) {
BigDecimal allAmount = mallRefundRecord.getTotalAmount()
.add(freeAmount)
.add(totalCoupons);
// 防止除以 0 的异常
if (allAmount.compareTo(BigDecimal.ZERO) > 0) {
ratio = totalCoupons.add(freeAmount)
.divide(allAmount, 4, RoundingMode.HALF_UP);
}
} }
//如果是售后商品 给商家加一条 如果是配送给配送员加一条 //如果是售后商品 给商家加一条 如果是配送给配送员加一条
@ -219,6 +239,7 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
returnGoods.setProductName(goods.getProductName()); returnGoods.setProductName(goods.getProductName());
returnGoods.setProductPicture(goods.getProductPicture()); returnGoods.setProductPicture(goods.getProductPicture());
returnGoods.setSpecs(goods.getSpecs()); returnGoods.setSpecs(goods.getSpecs());
returnGoods.setPackageFee(goods.getPackageFee());
returnGoods.setPrice(goods.getPrice()); returnGoods.setPrice(goods.getPrice());
returnGoods.setQuantity(goods.getQuantity()); returnGoods.setQuantity(goods.getQuantity());
mallReturnOrderGoodsMapper.insert(returnGoods); mallReturnOrderGoodsMapper.insert(returnGoods);
@ -273,10 +294,15 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap
.set(MallDeliveryOrder::getStatus, 4); .set(MallDeliveryOrder::getStatus, 4);
mallDeliveryOrderMapper.update(null, duw); mallDeliveryOrderMapper.update(null, duw);
//更新缓存 //更新缓存
LambdaQueryWrapper<MallDeliveryOrder> qw = new LambdaQueryWrapper<>(); if(mallRefundRecord.getOrderType() == STATUS_WAIT_PICKUP){
qw.eq(MallDeliveryOrder::getOrderId, mallRefundRecord.getOrderId()); MallDeliveryOrder deliveryOrder = mallDeliveryOrderMapper.selectByGroupId(mallRefundRecord.getOrderId());
MallDeliveryOrder deliveryOrder = mallDeliveryOrderMapper.selectOne(qw); workerOrderCacheUtil.remove(deliveryOrder.getWorkerId(),deliveryOrder.getId());
workerOrderCacheUtil.remove(deliveryOrder.getWorkerId(),deliveryOrder.getId()); }else{
LambdaQueryWrapper<MallDeliveryOrder> qw = new LambdaQueryWrapper<>();
qw.eq(MallDeliveryOrder::getOrderId, mallRefundRecord.getOrderId());
MallDeliveryOrder deliveryOrder = mallDeliveryOrderMapper.selectOne(qw);
workerOrderCacheUtil.remove(deliveryOrder.getWorkerId(),deliveryOrder.getId());
}
} }
BigDecimal totalRefund = result.getRecords().stream() BigDecimal totalRefund = result.getRecords().stream()
.map(item -> item.getRefundAmount()) // 提取 BigDecimal 金额 .map(item -> item.getRefundAmount()) // 提取 BigDecimal 金额

2
hiver-modules/hiver-mall/src/main/resources/db/mall_delivery_appointment.sql

@ -0,0 +1,2 @@
ALTER TABLE mall_delivery_order
ADD COLUMN appointment_delivery TINYINT NOT NULL DEFAULT 0 COMMENT '是否预约配送 0否 1是' AFTER must_finish_time;

9
hiver-modules/hiver-mall/src/main/resources/mapper/MallDeliveryOrderMapper.xml

@ -24,6 +24,7 @@
<result column="accept_time" property="acceptTime"/> <result column="accept_time" property="acceptTime"/>
<result column="get_time" property="getTime"/> <result column="get_time" property="getTime"/>
<result column="must_finish_time" property="mustFinishTime"/> <result column="must_finish_time" property="mustFinishTime"/>
<result column="appointment_delivery" property="appointmentDelivery"/>
<result column="finish_time" property="finishTime"/> <result column="finish_time" property="finishTime"/>
<result column="delivery_type" property="deliveryType"/> <result column="delivery_type" property="deliveryType"/>
<result column="number_code" property="numberCode"/> <result column="number_code" property="numberCode"/>
@ -53,7 +54,7 @@
SELECT SELECT
d.id, d.order_id, d.group_id, d.worker_id, d.shop_id, d.id, d.order_id, d.group_id, d.worker_id, d.shop_id,
d.get_area_id, d.put_area_id, d.delivery_fee, d.delivery_fee_marketplace, d.get_area_id, d.put_area_id, d.delivery_fee, d.delivery_fee_marketplace,
d.status, d.create_time, d.accept_time, d.get_time, d.must_finish_time, d.finish_time, d.status, d.create_time, d.accept_time, d.get_time, d.must_finish_time, d.appointment_delivery, d.finish_time,
d.receiver_name, d.receiver_phone, d.receiver_address, d.receiver_name, d.receiver_phone, d.receiver_address,
d.shop_name, d.shop_phone, d.shop_address, d.delivery_type, d.number_code, d.shop_name, d.shop_phone, d.shop_address, d.delivery_type, d.number_code,
d.region_id,d.remark, d.all_count, d.phone_number, d.get_codes, d.get_pictures, d.is_big, d.region_id,d.remark, d.all_count, d.phone_number, d.get_codes, d.get_pictures, d.is_big,
@ -150,7 +151,7 @@
SELECT SELECT
d.id, d.order_id, d.group_id, d.worker_id, d.shop_id, d.id, d.order_id, d.group_id, d.worker_id, d.shop_id,
d.get_area_id, d.put_area_id, d.delivery_fee, d.delivery_fee_marketplace, d.get_area_id, d.put_area_id, d.delivery_fee, d.delivery_fee_marketplace,
d.status, d.create_time, d.accept_time, d.get_time, d.must_finish_time, d.finish_time, d.status, d.create_time, d.accept_time, d.get_time, d.must_finish_time, d.appointment_delivery, d.finish_time,
d.receiver_name, d.receiver_phone, d.receiver_address, d.receiver_name, d.receiver_phone, d.receiver_address,
d.shop_name, d.shop_phone, d.shop_address, d.delivery_type, d.number_code, d.shop_name, d.shop_phone, d.shop_address, d.delivery_type, d.number_code,
d.region_id,d.remark, d.all_count, d.phone_number, d.get_codes, d.get_pictures, d.region_id,d.remark, d.all_count, d.phone_number, d.get_codes, d.get_pictures,
@ -215,7 +216,7 @@
SELECT SELECT
d.id, d.order_id, d.group_id, d.worker_id, d.shop_id, d.id, d.order_id, d.group_id, d.worker_id, d.shop_id,
d.get_area_id, d.put_area_id, d.delivery_fee, d.delivery_fee_marketplace, d.get_area_id, d.put_area_id, d.delivery_fee, d.delivery_fee_marketplace,
d.status, d.create_time, d.accept_time, d.get_time, d.must_finish_time, d.finish_time, d.status, d.create_time, d.accept_time, d.get_time, d.must_finish_time, d.appointment_delivery, d.finish_time,
d.receiver_name, d.receiver_phone, d.receiver_address, d.receiver_name, d.receiver_phone, d.receiver_address,
d.shop_name, d.shop_phone, d.shop_address, d.delivery_type, d.number_code, d.shop_name, d.shop_phone, d.shop_address, d.delivery_type, d.number_code,
d.region_id,d.remark, d.all_count, d.phone_number, d.get_codes, d.get_pictures, d.region_id,d.remark, d.all_count, d.phone_number, d.get_codes, d.get_pictures,
@ -280,7 +281,7 @@
SELECT SELECT
d.id, d.order_id, d.group_id, d.worker_id, d.shop_id, d.id, d.order_id, d.group_id, d.worker_id, d.shop_id,
d.get_area_id, d.put_area_id, d.delivery_fee, d.delivery_fee_marketplace, d.get_area_id, d.put_area_id, d.delivery_fee, d.delivery_fee_marketplace,
d.status, d.create_time, d.accept_time, d.get_time, d.must_finish_time, d.finish_time, d.status, d.create_time, d.accept_time, d.get_time, d.must_finish_time, d.appointment_delivery, d.finish_time,
d.receiver_name, d.receiver_phone, d.receiver_address, d.receiver_name, d.receiver_phone, d.receiver_address,
d.shop_name, d.shop_phone, d.shop_address, d.delivery_type, d.number_code, d.shop_name, d.shop_phone, d.shop_address, d.delivery_type, d.number_code,
d.region_id,d.remark, d.all_count, d.phone_number, d.get_codes, d.get_pictures, d.region_id,d.remark, d.all_count, d.phone_number, d.get_codes, d.get_pictures,

Loading…
Cancel
Save