|
|
|
@ -22,6 +22,7 @@ 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 org.springframework.beans.BeanUtils; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.data.redis.core.StringRedisTemplate; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
@ -127,6 +128,131 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap |
|
|
|
@Autowired |
|
|
|
private WorkerServiceImpl workerServiceImpl; |
|
|
|
|
|
|
|
private BigDecimal safeAmount(BigDecimal amount) { |
|
|
|
return amount == null ? BigDecimal.ZERO : amount; |
|
|
|
} |
|
|
|
|
|
|
|
private BigDecimal goodsPackageAmount(MallOrder order) { |
|
|
|
if (order == null) { |
|
|
|
return BigDecimal.ZERO; |
|
|
|
} |
|
|
|
return safeAmount(order.getGoodsAmount()).add(safeAmount(order.getPackageFee())); |
|
|
|
} |
|
|
|
|
|
|
|
private BigDecimal deliveryAmount(MallOrder order) { |
|
|
|
return order == null ? BigDecimal.ZERO : safeAmount(order.getDeliveryFee()); |
|
|
|
} |
|
|
|
|
|
|
|
private boolean isRunnerOrder(MallOrder order) { |
|
|
|
return order != null && Integer.valueOf(1).equals(order.getOtherOrder()); |
|
|
|
} |
|
|
|
|
|
|
|
private boolean isMerchantDeliveryOrder(MallOrder order) { |
|
|
|
return order != null |
|
|
|
&& order.getOtherOrder() == null |
|
|
|
&& Integer.valueOf(DELIVERY_TYPE_PEISONG).equals(order.getDeliveryType()); |
|
|
|
} |
|
|
|
|
|
|
|
private BigDecimal selectedGoodsPackageAmount(MallRefundRecord refundRecord) { |
|
|
|
if (refundRecord == null || refundRecord.getItems() == null || refundRecord.getItems().isEmpty()) { |
|
|
|
return safeAmount(refundRecord == null ? null : refundRecord.getGoodsAmount()) |
|
|
|
.add(safeAmount(refundRecord == null ? null : refundRecord.getPackageFee())); |
|
|
|
} |
|
|
|
BigDecimal amount = BigDecimal.ZERO; |
|
|
|
for (MallReturnOrderGoods item : refundRecord.getItems()) { |
|
|
|
BigDecimal quantity = item.getQuantity() == null ? BigDecimal.ZERO : new BigDecimal(item.getQuantity()); |
|
|
|
amount = amount.add(safeAmount(item.getPrice()).add(safeAmount(item.getPackageFee())).multiply(quantity)); |
|
|
|
} |
|
|
|
return amount.setScale(2, RoundingMode.HALF_UP); |
|
|
|
} |
|
|
|
|
|
|
|
private MallRefundRecord copyRefundRecord(MallRefundRecord source) { |
|
|
|
MallRefundRecord target = new MallRefundRecord(); |
|
|
|
BeanUtils.copyProperties(source, target); |
|
|
|
return target; |
|
|
|
} |
|
|
|
|
|
|
|
private BigDecimal settlementAmountOrRefundAmount(MallRefundRecord refundRecord) { |
|
|
|
BigDecimal amount = safeAmount(refundRecord == null ? null : refundRecord.getSettlementAmount()); |
|
|
|
return amount.compareTo(BigDecimal.ZERO) > 0 ? amount : safeAmount(refundRecord == null ? null : refundRecord.getRefundAmount()); |
|
|
|
} |
|
|
|
|
|
|
|
private void deductWorkerBalance(MallRefundRecord refundRecord, Integer dealingsType) { |
|
|
|
if (refundRecord == null || refundRecord.getLinkId() == null || !refundRecord.getLinkId().toUpperCase().startsWith("W")) { |
|
|
|
return; |
|
|
|
} |
|
|
|
Worker worker = workerServiceImpl.findByWorkerId(refundRecord.getLinkId()); |
|
|
|
if (worker == null) { |
|
|
|
return; |
|
|
|
} |
|
|
|
BigDecimal amount = settlementAmountOrRefundAmount(refundRecord); |
|
|
|
if (amount.compareTo(BigDecimal.ZERO) <= 0) { |
|
|
|
return; |
|
|
|
} |
|
|
|
BigDecimal currentDepoBal = safeAmount(worker.getDepoBal()); |
|
|
|
BigDecimal currentDepoBalRel = safeAmount(worker.getDepoBalRel()); |
|
|
|
if (currentDepoBal.compareTo(amount) >= 0) { |
|
|
|
worker.setDepoBal(currentDepoBal.subtract(amount)); |
|
|
|
worker.setDepoBalRel(currentDepoBalRel); |
|
|
|
} else { |
|
|
|
worker.setDepoBal(BigDecimal.ZERO); |
|
|
|
worker.setDepoBalRel(currentDepoBalRel.subtract(amount.subtract(currentDepoBal))); |
|
|
|
} |
|
|
|
workerServiceImpl.update(worker); |
|
|
|
saveWorkerDealingsRecord( |
|
|
|
worker, |
|
|
|
refundRecord.getId(), |
|
|
|
amount, |
|
|
|
refundRecord.getStatus() != null && refundRecord.getStatus() > 3 |
|
|
|
? DealingsRecordConstant.TYPE_REMARK[1] |
|
|
|
: DealingsRecordConstant.TYPE_REMARK[10], |
|
|
|
dealingsType |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
private void addWorkerCommissionForMerchantRefund(MallOrder order, MallRefundRecord refundRecord) { |
|
|
|
if (order == null || refundRecord == null || !isMerchantDeliveryOrder(order)) { |
|
|
|
return; |
|
|
|
} |
|
|
|
MallDeliveryOrder delivery = order.getOrderType() == ORDER_TYPE_FACETOFACE |
|
|
|
? mallDeliveryOrderMapper.selectByGroupId(order.getId()) |
|
|
|
: findDeliveryByOrderId(order.getId()); |
|
|
|
if (delivery == null || delivery.getWorkerId() == null) { |
|
|
|
return; |
|
|
|
} |
|
|
|
LambdaQueryWrapper<DealingsRecord> existsQw = new LambdaQueryWrapper<>(); |
|
|
|
existsQw.eq(DealingsRecord::getLinkId, refundRecord.getId()) |
|
|
|
.eq(DealingsRecord::getLinkUserId, delivery.getWorkerId()) |
|
|
|
.eq(DealingsRecord::getDealingsWay, DealingsRecordConstant.TYPE_REMARK[11]); |
|
|
|
if (dealingsRecordService.count(existsQw) > 0) { |
|
|
|
return; |
|
|
|
} |
|
|
|
Worker worker = workerServiceImpl.findByWorkerId(delivery.getWorkerId()); |
|
|
|
if (worker == null) { |
|
|
|
return; |
|
|
|
} |
|
|
|
BigDecimal commission = safeAmount(delivery.getDeliveryFee()).add(safeAmount(delivery.getDeliveryFeeMarketplace())).setScale(2, RoundingMode.UP); |
|
|
|
if (commission.compareTo(BigDecimal.ZERO) <= 0) { |
|
|
|
return; |
|
|
|
} |
|
|
|
worker.setDepoBal(safeAmount(worker.getDepoBal()).add(commission)); |
|
|
|
workerServiceImpl.update(worker); |
|
|
|
saveWorkerDealingsRecord(worker, refundRecord.getId(), commission, DealingsRecordConstant.TYPE_REMARK[11], DealingsRecordConstant.DEALINGS_TYPE[0]); |
|
|
|
} |
|
|
|
|
|
|
|
private void saveWorkerDealingsRecord(Worker worker, String linkId, BigDecimal amount, String dealingsWay, Integer dealingsType) { |
|
|
|
DealingsRecord dealingsRecord = new DealingsRecord(); |
|
|
|
dealingsRecord.setDealingsWay(dealingsWay); |
|
|
|
dealingsRecord.setAmount(amount); |
|
|
|
dealingsRecord.setDealingsTime(new Date()); |
|
|
|
dealingsRecord.setLinkUserId(worker.getWorkerId()); |
|
|
|
dealingsRecord.setLinkId(linkId); |
|
|
|
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[1]); |
|
|
|
dealingsRecord.setDealingsType(dealingsType); |
|
|
|
dealingsRecord.setCreateBy(worker.getWorkerId()); |
|
|
|
dealingsRecordService.save(dealingsRecord); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
|
public void create(MallRefundRecord mallRefundRecord) { |
|
|
|
@ -180,6 +306,7 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap |
|
|
|
if(mallRefundRecord.getRefundType() == 1){ |
|
|
|
// 退商品,和商家有关联
|
|
|
|
mallRefundRecord.setLinkId(mallRefundRecord.getShopId()); |
|
|
|
mallRefundRecord.setSettlementAmount(selectedGoodsPackageAmount(mallRefundRecord)); |
|
|
|
/*if(ratio != null && ratio.compareTo(BigDecimal.ZERO) > 0){ |
|
|
|
mallRefundRecord.setRefundAmount(mallRefundRecord.getRefundAmount() |
|
|
|
.subtract(mallRefundRecord.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.UP)); |
|
|
|
@ -200,6 +327,7 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap |
|
|
|
}else if(mallRefundRecord.getRefundType() == 2){ |
|
|
|
// 退配送费和配送员有关联
|
|
|
|
mallRefundRecord.setLinkId(mallRefundRecord.getWorkerId()); |
|
|
|
mallRefundRecord.setSettlementAmount(deliveryAmount(order)); |
|
|
|
/*if(ratio != null && ratio.compareTo(BigDecimal.ZERO) > 0){ |
|
|
|
mallRefundRecord.setRefundAmount(mallRefundRecord.getRefundAmount() |
|
|
|
.subtract(mallRefundRecord.getRefundAmount().multiply(ratio)).setScale(2, RoundingMode.UP)); |
|
|
|
@ -218,16 +346,31 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap |
|
|
|
// 全额退款
|
|
|
|
if(mallRefundRecord.getRefundTypeStatus() == 1){ |
|
|
|
//和商家有关联
|
|
|
|
mallRefundRecord.setLinkId(mallRefundRecord.getShopId()); |
|
|
|
if (isRunnerOrder(order)) { |
|
|
|
mallRefundRecord.setLinkId(mallRefundRecord.getWorkerId()); |
|
|
|
mallRefundRecord.setSettlementAmount(deliveryAmount(order)); |
|
|
|
} else { |
|
|
|
mallRefundRecord.setLinkId(mallRefundRecord.getShopId()); |
|
|
|
mallRefundRecord.setSettlementAmount(isMerchantDeliveryOrder(order) |
|
|
|
? goodsPackageAmount(order).add(deliveryAmount(order)) |
|
|
|
: goodsPackageAmount(order)); |
|
|
|
} |
|
|
|
mallRefundRecordMapper.insert(mallRefundRecord); |
|
|
|
//售后放到缓存
|
|
|
|
refundOrderCacheUtil.put(mallRefundRecord.getLinkId(),mallRefundRecord); |
|
|
|
//发送1小时延时MQ:超时未处理则自动同意
|
|
|
|
orderAsyncProducer.sendRefundDelayMessage(mallRefundRecord.getId(), mallRefundRecord.getOrderId()); |
|
|
|
sendShopAfterSaleNotice(order); |
|
|
|
if (!isRunnerOrder(order)) { |
|
|
|
sendShopAfterSaleNotice(order); |
|
|
|
} else { |
|
|
|
sendWorkerAfterSaleSms(mallRefundRecord,order); |
|
|
|
} |
|
|
|
}else if(mallRefundRecord.getRefundTypeStatus() == 2){ |
|
|
|
//和配送员有关联
|
|
|
|
mallRefundRecord.setLinkId(mallRefundRecord.getWorkerId()); |
|
|
|
mallRefundRecord.setSettlementAmount(isRunnerOrder(order) |
|
|
|
? deliveryAmount(order) |
|
|
|
: goodsPackageAmount(order).add(deliveryAmount(order))); |
|
|
|
mallRefundRecordMapper.insert(mallRefundRecord); |
|
|
|
//售后放到缓存
|
|
|
|
refundOrderCacheUtil.put(mallRefundRecord.getLinkId(),mallRefundRecord); |
|
|
|
@ -235,8 +378,21 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap |
|
|
|
orderAsyncProducer.sendRefundDelayMessage(mallRefundRecord.getId(), mallRefundRecord.getOrderId()); |
|
|
|
sendWorkerAfterSaleSms(mallRefundRecord,order); |
|
|
|
}else if(mallRefundRecord.getRefundTypeStatus() == 3){ |
|
|
|
if (!isMerchantDeliveryOrder(order)) { |
|
|
|
mallRefundRecord.setLinkId(isRunnerOrder(order) ? mallRefundRecord.getWorkerId() : mallRefundRecord.getShopId()); |
|
|
|
mallRefundRecord.setSettlementAmount(isRunnerOrder(order) ? deliveryAmount(order) : goodsPackageAmount(order)); |
|
|
|
mallRefundRecordMapper.insert(mallRefundRecord); |
|
|
|
refundOrderCacheUtil.put(mallRefundRecord.getLinkId(),mallRefundRecord); |
|
|
|
orderAsyncProducer.sendRefundDelayMessage(mallRefundRecord.getId(), mallRefundRecord.getOrderId()); |
|
|
|
if (isRunnerOrder(order)) { |
|
|
|
sendWorkerAfterSaleSms(mallRefundRecord,order); |
|
|
|
} else { |
|
|
|
sendShopAfterSaleNotice(order); |
|
|
|
} |
|
|
|
} else { |
|
|
|
//商家、配送员都加一条,和商家+配送员都有关联
|
|
|
|
mallRefundRecord.setLinkId(mallRefundRecord.getShopId()); |
|
|
|
mallRefundRecord.setSettlementAmount(goodsPackageAmount(order)); |
|
|
|
mallRefundRecord.setRefundAmount(mallRefundRecord.getGoodsAmount().add(mallRefundRecord.getPackageFee())); |
|
|
|
BigDecimal shopRefund = BigDecimal.ZERO; |
|
|
|
if(ratio != null && ratio.compareTo(BigDecimal.ZERO) > 0){ |
|
|
|
@ -250,9 +406,10 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap |
|
|
|
//发送1小时延时MQ:超时未处理则自动同意(商家侧)
|
|
|
|
orderAsyncProducer.sendRefundDelayMessage(mallRefundRecord.getId(), mallRefundRecord.getOrderId()); |
|
|
|
sendShopAfterSaleNotice(order); |
|
|
|
MallRefundRecord mallRefundRecord1 = mallRefundRecord; |
|
|
|
MallRefundRecord mallRefundRecord1 = copyRefundRecord(mallRefundRecord); |
|
|
|
mallRefundRecord1.setId(SnowFlakeUtil.nextId().toString()); |
|
|
|
mallRefundRecord1.setLinkId(mallRefundRecord.getWorkerId()); |
|
|
|
mallRefundRecord1.setSettlementAmount(deliveryAmount(order)); |
|
|
|
mallRefundRecord1.setRefundAmount(mallRefundRecord.getDeliveryFee()); |
|
|
|
if(ratio != null && ratio.compareTo(BigDecimal.ZERO) > 0){ |
|
|
|
mallRefundRecord1.setRefundAmount(order.getTotalAmount().subtract(shopRefund)); |
|
|
|
@ -263,9 +420,10 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap |
|
|
|
//发送1小时延时MQ:超时未处理则自动同意(配送员侧)
|
|
|
|
orderAsyncProducer.sendRefundDelayMessage(mallRefundRecord1.getId(), mallRefundRecord1.getOrderId()); |
|
|
|
sendWorkerAfterSaleSms(mallRefundRecord1,order); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if(!mallRefundRecord.getItems().isEmpty()){ |
|
|
|
if(mallRefundRecord.getItems() != null && !mallRefundRecord.getItems().isEmpty()){ |
|
|
|
for(MallReturnOrderGoods item : mallRefundRecord.getItems()){ |
|
|
|
mallReturnOrderGoodsMapper.insert(item); |
|
|
|
} |
|
|
|
@ -323,13 +481,15 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap |
|
|
|
//更新订单status、 配送单isReturn
|
|
|
|
if(mallRefundRecord.getRefundTypeStatus() != null && mallRefundRecord.getRefundTypeStatus() == 3){ |
|
|
|
//商家和配送员都有原因,需要判断另外角色处理了没再判断是否更新订单的状态
|
|
|
|
IPage<MallRefundRecord> page = new Page<>(PAGENUM, PAGESIZE); |
|
|
|
IPage<MallRefundRecord> page = new Page<>(PAGENUM, 2); |
|
|
|
MallRefundRecordPageQuery q = new MallRefundRecordPageQuery(); |
|
|
|
q.setOrderId(mallRefundRecord.getOrderId()); |
|
|
|
q.setOrderDesc(true); |
|
|
|
IPage<MallRefundRecord> result = this.baseMapper.selectPageVO(page, q); |
|
|
|
boolean hasEnd = result.getRecords().stream() |
|
|
|
List<MallRefundRecord> latestRecords = result.getRecords(); |
|
|
|
boolean hasEnd = latestRecords != null && latestRecords.stream() |
|
|
|
.anyMatch(item -> item.getStatus() == 3 || item.getStatus() == 0); |
|
|
|
boolean hasReject = result.getRecords().stream() |
|
|
|
boolean hasReject = latestRecords != null && latestRecords.stream() |
|
|
|
.anyMatch(item -> item.getStatus() == 2 || item.getStatus() == 5); |
|
|
|
if(isTuiKuan){ |
|
|
|
//都处理了
|
|
|
|
@ -365,31 +525,7 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap |
|
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add);*/ |
|
|
|
mallOrderDeliveryFeeRefundHelper.refundOrderWithAddedDeliveryFee(order, order.getTotalAmount()); |
|
|
|
if(mallRefundRecord.getLinkId().toUpperCase().startsWith("W")){ |
|
|
|
//配送员同意退款。扣掉余额
|
|
|
|
Worker worker = workerServiceImpl.findByWorkerId(mallRefundRecord.getLinkId()); |
|
|
|
BigDecimal refundAmount = mallRefundRecord.getRefundAmount(); |
|
|
|
// 获取当前的待结算金额(depoBal)和实际可提现金额(depoBalRel)
|
|
|
|
BigDecimal currentDepoBal = worker.getDepoBal(); |
|
|
|
BigDecimal currentDepoBalRel = worker.getDepoBalRel(); |
|
|
|
|
|
|
|
// 1. 优先从待结算金额(depoBal)中扣除
|
|
|
|
if (currentDepoBal.compareTo(refundAmount) >= 0) { |
|
|
|
// 情况一:待结算金额足够全额抵扣退款
|
|
|
|
worker.setDepoBal(currentDepoBal.subtract(refundAmount)); |
|
|
|
// 可提现金额保持不变
|
|
|
|
worker.setDepoBalRel(currentDepoBalRel); |
|
|
|
} else { |
|
|
|
// 情况二:待结算金额不足,需要联合扣款
|
|
|
|
// 先把待结算金额扣成 0
|
|
|
|
worker.setDepoBal(BigDecimal.ZERO); |
|
|
|
|
|
|
|
// 计算还需要从可提现金额中扣除的部分
|
|
|
|
BigDecimal remainingRefund = refundAmount.subtract(currentDepoBal); |
|
|
|
// 用可提现金额减去剩余退款
|
|
|
|
worker.setDepoBalRel(currentDepoBalRel.subtract(remainingRefund)); |
|
|
|
} |
|
|
|
// 执行更新
|
|
|
|
workerServiceImpl.update(worker); |
|
|
|
deductWorkerBalance(mallRefundRecord, DealingsRecordConstant.DEALINGS_TYPE[2]); |
|
|
|
} |
|
|
|
}else{ |
|
|
|
//拒绝退款
|
|
|
|
@ -426,7 +562,7 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap |
|
|
|
} |
|
|
|
//更新配送单isReturn
|
|
|
|
LambdaUpdateWrapper<MallDeliveryOrder> duw = new LambdaUpdateWrapper<>(); |
|
|
|
duw.eq(MallDeliveryOrder::getOrderId, mallRefundRecord.getOrderId()) |
|
|
|
duw.eq(MallDeliveryOrder::getId, delivery.getId()) |
|
|
|
.set(MallDeliveryOrder::getIsReturn, 0); |
|
|
|
mallDeliveryOrderMapper.update(null, duw); |
|
|
|
|
|
|
|
@ -457,9 +593,16 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap |
|
|
|
} |
|
|
|
//更新配送单isReturn
|
|
|
|
LambdaUpdateWrapper<MallDeliveryOrder> duw = new LambdaUpdateWrapper<>(); |
|
|
|
duw.eq(MallDeliveryOrder::getOrderId, mallRefundRecord.getOrderId()) |
|
|
|
duw.eq(MallDeliveryOrder::getId, delivery.getId()) |
|
|
|
.set(MallDeliveryOrder::getIsReturn, 0); |
|
|
|
mallDeliveryOrderMapper.update(null, duw); |
|
|
|
|
|
|
|
//更新缓存
|
|
|
|
MallDeliveryOrder delivery1 = workerOrderCacheUtil.get(delivery.getWorkerId(),delivery.getId()); |
|
|
|
if(delivery1 != null){ |
|
|
|
delivery1.setIsReturn(0); |
|
|
|
workerOrderCacheUtil.update(delivery.getWorkerId(),delivery1); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -483,43 +626,7 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap |
|
|
|
}*/ |
|
|
|
refundWechatForAfterSaleWithOrderLock(order, mallRefundRecord); |
|
|
|
if(mallRefundRecord.getLinkId().toUpperCase().startsWith("W")){ |
|
|
|
//配送员同意退款。扣掉余额
|
|
|
|
Worker worker = workerServiceImpl.findByWorkerId(mallRefundRecord.getLinkId()); |
|
|
|
BigDecimal refundAmount = mallRefundRecord.getRefundAmount(); |
|
|
|
// 获取当前的待结算金额(depoBal)和实际可提现金额(depoBalRel)
|
|
|
|
BigDecimal currentDepoBal = worker.getDepoBal(); |
|
|
|
BigDecimal currentDepoBalRel = worker.getDepoBalRel(); |
|
|
|
|
|
|
|
// 1. 优先从待结算金额(depoBal)中扣除
|
|
|
|
if (currentDepoBal.compareTo(refundAmount) >= 0) { |
|
|
|
// 情况一:待结算金额足够全额抵扣退款
|
|
|
|
worker.setDepoBal(currentDepoBal.subtract(refundAmount)); |
|
|
|
// 可提现金额保持不变
|
|
|
|
worker.setDepoBalRel(currentDepoBalRel); |
|
|
|
} else { |
|
|
|
// 情况二:待结算金额不足,需要联合扣款
|
|
|
|
// 先把待结算金额扣成 0
|
|
|
|
worker.setDepoBal(BigDecimal.ZERO); |
|
|
|
|
|
|
|
// 计算还需要从可提现金额中扣除的部分
|
|
|
|
BigDecimal remainingRefund = refundAmount.subtract(currentDepoBal); |
|
|
|
// 用可提现金额减去剩余退款
|
|
|
|
worker.setDepoBalRel(currentDepoBalRel.subtract(remainingRefund)); |
|
|
|
} |
|
|
|
// 执行更新
|
|
|
|
workerServiceImpl.update(worker); |
|
|
|
|
|
|
|
//增加余额变动记录
|
|
|
|
DealingsRecord dealingsRecord = new DealingsRecord(); |
|
|
|
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[1]); |
|
|
|
dealingsRecord.setAmount(refundAmount); |
|
|
|
dealingsRecord.setDealingsTime(new Date()); |
|
|
|
dealingsRecord.setLinkUserId(worker.getWorkerId()); |
|
|
|
dealingsRecord.setLinkId(mallRefundRecord.getId()); |
|
|
|
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[1]); |
|
|
|
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[3]); |
|
|
|
dealingsRecord.setCreateBy(worker.getWorkerId()); |
|
|
|
dealingsRecordService.save(dealingsRecord); |
|
|
|
deductWorkerBalance(mallRefundRecord, DealingsRecordConstant.DEALINGS_TYPE[3]); |
|
|
|
} |
|
|
|
} |
|
|
|
//都处理了
|
|
|
|
@ -646,30 +753,9 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap |
|
|
|
} |
|
|
|
refundWechatForRefundRecord(order, mallRefundRecord); |
|
|
|
if(mallRefundRecord.getLinkId().toUpperCase().startsWith("W")){ |
|
|
|
Worker worker = workerServiceImpl.findByWorkerId(mallRefundRecord.getLinkId()); |
|
|
|
BigDecimal refundAmount = mallRefundRecord.getRefundAmount(); |
|
|
|
// 获取当前的待结算金额(depoBal)和实际可提现金额(depoBalRel)
|
|
|
|
BigDecimal currentDepoBal = worker.getDepoBal(); |
|
|
|
BigDecimal currentDepoBalRel = worker.getDepoBalRel(); |
|
|
|
|
|
|
|
// 1. 优先从待结算金额(depoBal)中扣除
|
|
|
|
if (currentDepoBal.compareTo(refundAmount) >= 0) { |
|
|
|
// 情况一:待结算金额足够全额抵扣退款
|
|
|
|
worker.setDepoBal(currentDepoBal.subtract(refundAmount)); |
|
|
|
// 可提现金额保持不变
|
|
|
|
worker.setDepoBalRel(currentDepoBalRel); |
|
|
|
} else { |
|
|
|
// 情况二:待结算金额不足,需要联合扣款
|
|
|
|
// 先把待结算金额扣成 0
|
|
|
|
worker.setDepoBal(BigDecimal.ZERO); |
|
|
|
|
|
|
|
// 计算还需要从可提现金额中扣除的部分
|
|
|
|
BigDecimal remainingRefund = refundAmount.subtract(currentDepoBal); |
|
|
|
// 用可提现金额减去剩余退款
|
|
|
|
worker.setDepoBalRel(currentDepoBalRel.subtract(remainingRefund)); |
|
|
|
} |
|
|
|
// 执行更新
|
|
|
|
workerServiceImpl.update(worker); |
|
|
|
deductWorkerBalance(mallRefundRecord, DealingsRecordConstant.DEALINGS_TYPE[2]); |
|
|
|
} else if (Integer.valueOf(1).equals(mallRefundRecord.getRefundTypeStatus())) { |
|
|
|
addWorkerCommissionForMerchantRefund(order, mallRefundRecord); |
|
|
|
} |
|
|
|
} |
|
|
|
}else{ |
|
|
|
@ -680,41 +766,7 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap |
|
|
|
updateOrderStatus(mallRefundRecord.getOrderId(), STATUS_LAST_REFUNDED); |
|
|
|
refundWechatForRefundRecord(order, mallRefundRecord); |
|
|
|
if(mallRefundRecord.getLinkId().toUpperCase().startsWith("W")){ |
|
|
|
Worker worker = workerServiceImpl.findByWorkerId(mallRefundRecord.getLinkId()); |
|
|
|
BigDecimal refundAmount = mallRefundRecord.getRefundAmount(); |
|
|
|
// 获取当前的待结算金额(depoBal)和实际可提现金额(depoBalRel)
|
|
|
|
BigDecimal currentDepoBal = worker.getDepoBal(); |
|
|
|
BigDecimal currentDepoBalRel = worker.getDepoBalRel(); |
|
|
|
|
|
|
|
// 1. 优先从待结算金额(depoBal)中扣除
|
|
|
|
if (currentDepoBal.compareTo(refundAmount) >= 0) { |
|
|
|
// 情况一:待结算金额足够全额抵扣退款
|
|
|
|
worker.setDepoBal(currentDepoBal.subtract(refundAmount)); |
|
|
|
// 可提现金额保持不变
|
|
|
|
worker.setDepoBalRel(currentDepoBalRel); |
|
|
|
} else { |
|
|
|
// 情况二:待结算金额不足,需要联合扣款
|
|
|
|
// 先把待结算金额扣成 0
|
|
|
|
worker.setDepoBal(BigDecimal.ZERO); |
|
|
|
|
|
|
|
// 计算还需要从可提现金额中扣除的部分
|
|
|
|
BigDecimal remainingRefund = refundAmount.subtract(currentDepoBal); |
|
|
|
// 用可提现金额减去剩余退款
|
|
|
|
worker.setDepoBalRel(currentDepoBalRel.subtract(remainingRefund)); |
|
|
|
} |
|
|
|
// 执行更新
|
|
|
|
workerServiceImpl.update(worker); |
|
|
|
//增加余额变动记录
|
|
|
|
DealingsRecord dealingsRecord = new DealingsRecord(); |
|
|
|
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[1]); |
|
|
|
dealingsRecord.setAmount(refundAmount); |
|
|
|
dealingsRecord.setLinkUserId(worker.getWorkerId()); |
|
|
|
dealingsRecord.setDealingsTime(new Date()); |
|
|
|
dealingsRecord.setLinkId(mallRefundRecord.getId()); |
|
|
|
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[1]); |
|
|
|
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[2]); |
|
|
|
dealingsRecord.setCreateBy(worker.getWorkerId()); |
|
|
|
dealingsRecordService.save(dealingsRecord); |
|
|
|
deductWorkerBalance(mallRefundRecord, DealingsRecordConstant.DEALINGS_TYPE[2]); |
|
|
|
} |
|
|
|
}else{ |
|
|
|
//订单还是变成已完成状态
|
|
|
|
@ -765,6 +817,7 @@ public class MallRefundRecordServiceImpl extends ServiceImpl<MallRefundRecordMap |
|
|
|
mallRefundRecord.setOrderId(dbRecord.getOrderId()); |
|
|
|
mallRefundRecord.setLinkId(dbRecord.getLinkId()); |
|
|
|
mallRefundRecord.setRefundAmount(dbRecord.getRefundAmount()); |
|
|
|
mallRefundRecord.setSettlementAmount(dbRecord.getSettlementAmount()); |
|
|
|
mallRefundRecord.setRefundType(dbRecord.getRefundType()); |
|
|
|
mallRefundRecord.setRefundTypeStatus(dbRecord.getRefundTypeStatus()); |
|
|
|
mallRefundRecord.setRegionId(dbRecord.getRegionId()); |
|
|
|
|