feat: 订单
parent
111f5afe3a
commit
7ee4abd483
|
|
@ -5,6 +5,7 @@ import com.github.pagehelper.Page;
|
||||||
import com.ruoyi.common.annotation.Log;
|
import com.ruoyi.common.annotation.Log;
|
||||||
import com.ruoyi.common.core.controller.XktBaseController;
|
import com.ruoyi.common.core.controller.XktBaseController;
|
||||||
import com.ruoyi.common.core.domain.R;
|
import com.ruoyi.common.core.domain.R;
|
||||||
|
import com.ruoyi.common.core.domain.SimpleEntity;
|
||||||
import com.ruoyi.common.core.page.PageVO;
|
import com.ruoyi.common.core.page.PageVO;
|
||||||
import com.ruoyi.common.enums.BusinessType;
|
import com.ruoyi.common.enums.BusinessType;
|
||||||
import com.ruoyi.common.exception.ServiceException;
|
import com.ruoyi.common.exception.ServiceException;
|
||||||
|
|
@ -205,13 +206,15 @@ public class StoreOrderController extends XktBaseController {
|
||||||
//TODO 权限
|
//TODO 权限
|
||||||
StoreOrderRefundConfirmDTO dto = BeanUtil.toBean(vo, StoreOrderRefundConfirmDTO.class);
|
StoreOrderRefundConfirmDTO dto = BeanUtil.toBean(vo, StoreOrderRefundConfirmDTO.class);
|
||||||
dto.setOperatorId(SecurityUtils.getUserId());
|
dto.setOperatorId(SecurityUtils.getUserId());
|
||||||
//售后状态->售后完成,支付状态->支付中
|
//售后状态->售后完成,支付状态->支付中,创建收款单
|
||||||
StoreOrderRefund storeOrderRefund = storeOrderService.prepareRefundOrder(dto);
|
StoreOrderRefund storeOrderRefund = storeOrderService.prepareRefundOrder(dto);
|
||||||
//三方退款
|
//三方退款
|
||||||
PaymentManager paymentManager = getPaymentManager(EPayChannel.of(storeOrderRefund.getRefundOrder().getPayChannel()));
|
PaymentManager paymentManager = getPaymentManager(EPayChannel.of(storeOrderRefund.getRefundOrder().getPayChannel()));
|
||||||
paymentManager.refundStoreOrder(storeOrderRefund);
|
paymentManager.refundStoreOrder(storeOrderRefund);
|
||||||
//支付状态->已支付,创建收款单
|
//支付状态->已支付,收款单到账
|
||||||
storeOrderService.refundSuccess(storeOrderRefund);
|
storeOrderService.refundSuccess(storeOrderRefund.getRefundOrder().getId(),
|
||||||
|
storeOrderRefund.getRefundOrderDetails().stream().map(SimpleEntity::getId).collect(Collectors.toList()),
|
||||||
|
SecurityUtils.getUserId());
|
||||||
return success();
|
return success();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ import java.util.List;
|
||||||
@Data
|
@Data
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
public class FinanceBillInfo {
|
public class FinanceBillExt {
|
||||||
|
|
||||||
private FinanceBill financeBill;
|
private FinanceBill financeBill;
|
||||||
|
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
package com.ruoyi.xkt.enums;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author liangyq
|
||||||
|
* @date 2025-04-22 13:42
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public enum EAccountOwnerType {
|
||||||
|
|
||||||
|
PLATFORM(1, "平台"),
|
||||||
|
STORE(2, "档口"),
|
||||||
|
USER(3, "用户"),
|
||||||
|
;
|
||||||
|
|
||||||
|
private final Integer value;
|
||||||
|
private final String label;
|
||||||
|
|
||||||
|
public static EAccountOwnerType of(Integer value) {
|
||||||
|
for (EAccountOwnerType e : EAccountOwnerType.values()) {
|
||||||
|
if (e.getValue().equals(value)) {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -13,7 +13,9 @@ public enum EFinBillSrcType {
|
||||||
|
|
||||||
STORE_ORDER_PAID(1, "代发订单支付"),
|
STORE_ORDER_PAID(1, "代发订单支付"),
|
||||||
STORE_ORDER_COMPLETED(2, "代发订单完成"),
|
STORE_ORDER_COMPLETED(2, "代发订单完成"),
|
||||||
WITHDRAW(3, "提现");
|
WITHDRAW(3, "提现"),
|
||||||
|
STORE_ORDER_REFUND(4, "代发订单退款"),
|
||||||
|
;
|
||||||
|
|
||||||
private final Integer value;
|
private final Integer value;
|
||||||
private final String label;
|
private final String label;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package com.ruoyi.xkt.service;
|
package com.ruoyi.xkt.service;
|
||||||
|
|
||||||
import com.ruoyi.xkt.dto.finance.FinanceBillInfo;
|
import com.ruoyi.xkt.dto.finance.FinanceBillExt;
|
||||||
import com.ruoyi.xkt.dto.order.StoreOrderExt;
|
import com.ruoyi.xkt.dto.order.StoreOrderExt;
|
||||||
import com.ruoyi.xkt.enums.EPayChannel;
|
import com.ruoyi.xkt.enums.EPayChannel;
|
||||||
|
|
||||||
|
|
@ -10,12 +10,37 @@ import com.ruoyi.xkt.enums.EPayChannel;
|
||||||
*/
|
*/
|
||||||
public interface IFinanceBillService {
|
public interface IFinanceBillService {
|
||||||
/**
|
/**
|
||||||
* 根据订单创建收款单
|
* 订单支付完成创建收款单(入账)
|
||||||
*
|
*
|
||||||
* @param orderExt
|
* @param orderExt
|
||||||
* @param payId
|
* @param payId
|
||||||
* @param payChannel
|
* @param payChannel
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
FinanceBillInfo createCollectionBillAfterOrderPaid(StoreOrderExt orderExt, Long payId, EPayChannel payChannel);
|
FinanceBillExt createOrderPaidCollectionBill(StoreOrderExt orderExt, Long payId, EPayChannel payChannel);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单完成创建转移单(入账)
|
||||||
|
*
|
||||||
|
* @param orderExt
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
FinanceBillExt createOrderCompletedTransferBill(StoreOrderExt orderExt);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 售后订单创建付款单(未入账)
|
||||||
|
*
|
||||||
|
* @param orderExt
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
FinanceBillExt createRefundOrderPaymentBill(StoreOrderExt orderExt);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 售后订单付款单入账
|
||||||
|
*
|
||||||
|
* @param storeOrderId
|
||||||
|
*/
|
||||||
|
void entryRefundOrderPaymentBill(Long storeOrderId);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package com.ruoyi.xkt.service;
|
||||||
|
|
||||||
import com.ruoyi.xkt.domain.InternalAccount;
|
import com.ruoyi.xkt.domain.InternalAccount;
|
||||||
import com.ruoyi.xkt.dto.finance.TransInfo;
|
import com.ruoyi.xkt.dto.finance.TransInfo;
|
||||||
|
import com.ruoyi.xkt.enums.EAccountOwnerType;
|
||||||
import com.ruoyi.xkt.enums.EEntryStatus;
|
import com.ruoyi.xkt.enums.EEntryStatus;
|
||||||
import com.ruoyi.xkt.enums.EFinBillType;
|
import com.ruoyi.xkt.enums.EFinBillType;
|
||||||
import com.ruoyi.xkt.enums.ELoanDirection;
|
import com.ruoyi.xkt.enums.ELoanDirection;
|
||||||
|
|
@ -19,6 +20,15 @@ public interface IInternalAccountService {
|
||||||
*/
|
*/
|
||||||
InternalAccount getById(Long id);
|
InternalAccount getById(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取内部账户
|
||||||
|
*
|
||||||
|
* @param ownerId
|
||||||
|
* @param ownerType
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
InternalAccount getInternalAccount(Long ownerId, EAccountOwnerType ownerType);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 添加交易明细
|
* 添加交易明细
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -154,9 +154,11 @@ public interface IStoreOrderService {
|
||||||
/**
|
/**
|
||||||
* 退款成功
|
* 退款成功
|
||||||
*
|
*
|
||||||
* @param storeOrderRefund
|
* @param storeOrderId
|
||||||
|
* @param storeOrderDetailIds
|
||||||
|
* @param operatorId
|
||||||
*/
|
*/
|
||||||
void refundSuccess(StoreOrderRefund storeOrderRefund);
|
void refundSuccess(Long storeOrderId, List<Long> storeOrderDetailIds, Long operatorId);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,14 +37,14 @@ public class AlipayCallbackServiceImpl implements IAlipayCallbackService {
|
||||||
.eq(AlipayCallback::getNotifyId, notifyId));
|
.eq(AlipayCallback::getNotifyId, notifyId));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@Override
|
@Override
|
||||||
public int insertAlipayCallback(AlipayCallback alipayCallback) {
|
public int insertAlipayCallback(AlipayCallback alipayCallback) {
|
||||||
Assert.notNull(alipayCallback);
|
Assert.notNull(alipayCallback);
|
||||||
return alipayCallbackMapper.insert(alipayCallback);
|
return alipayCallbackMapper.insert(alipayCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@Override
|
@Override
|
||||||
public void processOrderPaid(AlipayCallback info) {
|
public void processOrderPaid(AlipayCallback info) {
|
||||||
//更新回调状态
|
//更新回调状态
|
||||||
|
|
@ -56,6 +56,6 @@ public class AlipayCallbackServiceImpl implements IAlipayCallbackService {
|
||||||
StoreOrderExt orderExt = storeOrderService.paySuccess(order.getId(), info.getTradeNo(), info.getTotalAmount(),
|
StoreOrderExt orderExt = storeOrderService.paySuccess(order.getId(), info.getTradeNo(), info.getTotalAmount(),
|
||||||
info.getReceiptAmount());
|
info.getReceiptAmount());
|
||||||
//创建收款单
|
//创建收款单
|
||||||
financeBillService.createCollectionBillAfterOrderPaid(orderExt, info.getId(), EPayChannel.ALI_PAY);
|
financeBillService.createOrderPaidCollectionBill(orderExt, info.getId(), EPayChannel.ALI_PAY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ public class ExternalAccountServiceImpl implements IExternalAccountService {
|
||||||
return externalAccountMapper.selectById(id);
|
return externalAccountMapper.selectById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@Override
|
@Override
|
||||||
public int addTransDetail(Long externalAccountId, TransInfo transInfo, ELoanDirection loanDirection,
|
public int addTransDetail(Long externalAccountId, TransInfo transInfo, ELoanDirection loanDirection,
|
||||||
EEntryStatus entryStatus) {
|
EEntryStatus entryStatus) {
|
||||||
|
|
@ -72,7 +72,7 @@ public class ExternalAccountServiceImpl implements IExternalAccountService {
|
||||||
return externalAccountTransDetailMapper.insert(transDetail);
|
return externalAccountTransDetailMapper.insert(transDetail);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@Override
|
@Override
|
||||||
public void entryTransDetail(Long srcBillId, EFinBillType srcBillType) {
|
public void entryTransDetail(Long srcBillId, EFinBillType srcBillType) {
|
||||||
Assert.notNull(srcBillId);
|
Assert.notNull(srcBillId);
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,16 @@
|
||||||
package com.ruoyi.xkt.service.impl;
|
package com.ruoyi.xkt.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.text.CharSequenceUtil;
|
||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
|
import cn.hutool.core.util.NumberUtil;
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import com.ruoyi.common.constant.Constants;
|
import com.ruoyi.common.constant.Constants;
|
||||||
|
import com.ruoyi.common.exception.ServiceException;
|
||||||
|
import com.ruoyi.common.utils.bean.BeanValidators;
|
||||||
import com.ruoyi.xkt.domain.FinanceBill;
|
import com.ruoyi.xkt.domain.FinanceBill;
|
||||||
import com.ruoyi.xkt.domain.FinanceBillDetail;
|
import com.ruoyi.xkt.domain.FinanceBillDetail;
|
||||||
import com.ruoyi.xkt.domain.StoreOrderDetail;
|
import com.ruoyi.xkt.domain.StoreOrderDetail;
|
||||||
import com.ruoyi.xkt.dto.finance.FinanceBillInfo;
|
import com.ruoyi.xkt.dto.finance.FinanceBillExt;
|
||||||
import com.ruoyi.xkt.dto.finance.TransInfo;
|
import com.ruoyi.xkt.dto.finance.TransInfo;
|
||||||
import com.ruoyi.xkt.dto.order.StoreOrderExt;
|
import com.ruoyi.xkt.dto.order.StoreOrderExt;
|
||||||
import com.ruoyi.xkt.enums.*;
|
import com.ruoyi.xkt.enums.*;
|
||||||
|
|
@ -19,6 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -39,14 +45,13 @@ public class FinanceBillServiceImpl implements IFinanceBillService {
|
||||||
@Autowired
|
@Autowired
|
||||||
private IExternalAccountService externalAccountService;
|
private IExternalAccountService externalAccountService;
|
||||||
|
|
||||||
@Transactional
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@Override
|
@Override
|
||||||
public FinanceBillInfo createCollectionBillAfterOrderPaid(StoreOrderExt orderExt, Long payId,
|
public FinanceBillExt createOrderPaidCollectionBill(StoreOrderExt orderExt, Long payId,
|
||||||
EPayChannel payChannel) {
|
EPayChannel payChannel) {
|
||||||
Assert.notNull(orderExt);
|
Assert.notNull(orderExt);
|
||||||
Assert.notNull(payId);
|
Assert.notNull(payId);
|
||||||
Assert.notNull(payChannel);
|
Assert.notNull(payChannel);
|
||||||
//获取平台内部账户并加锁
|
|
||||||
FinanceBill bill = new FinanceBill();
|
FinanceBill bill = new FinanceBill();
|
||||||
bill.setBillNo(generateBillNo(EFinBillType.COLLECTION));
|
bill.setBillNo(generateBillNo(EFinBillType.COLLECTION));
|
||||||
bill.setBillType(EFinBillType.COLLECTION.getValue());
|
bill.setBillType(EFinBillType.COLLECTION.getValue());
|
||||||
|
|
@ -92,7 +97,130 @@ public class FinanceBillServiceImpl implements IFinanceBillService {
|
||||||
//外部账户
|
//外部账户
|
||||||
externalAccountService.addTransDetail(payChannel.getPlatformExternalAccountId(), transInfo,
|
externalAccountService.addTransDetail(payChannel.getPlatformExternalAccountId(), transInfo,
|
||||||
ELoanDirection.DEBIT, EEntryStatus.FINISH);
|
ELoanDirection.DEBIT, EEntryStatus.FINISH);
|
||||||
return new FinanceBillInfo(bill, billDetails);
|
return new FinanceBillExt(bill, billDetails);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
@Override
|
||||||
|
public FinanceBillExt createOrderCompletedTransferBill(StoreOrderExt orderExt) {
|
||||||
|
Assert.notNull(orderExt);
|
||||||
|
FinanceBill bill = new FinanceBill();
|
||||||
|
bill.setBillNo(generateBillNo(EFinBillType.TRANSFER));
|
||||||
|
bill.setBillType(EFinBillType.TRANSFER.getValue());
|
||||||
|
//直接标记成功
|
||||||
|
bill.setBillStatus(EFinBillStatus.SUCCESS.getValue());
|
||||||
|
bill.setSrcType(EFinBillSrcType.STORE_ORDER_COMPLETED.getValue());
|
||||||
|
bill.setSrcId(orderExt.getOrder().getId());
|
||||||
|
bill.setRelType(EFinBillRelType.STORE_ORDER.getValue());
|
||||||
|
bill.setRelId(orderExt.getOrder().getId());
|
||||||
|
//业务唯一键
|
||||||
|
String businessUniqueKey = "STORE_ORDER_COMPLETED_" + orderExt.getOrder().getId();
|
||||||
|
bill.setBusinessUniqueKey(businessUniqueKey);
|
||||||
|
Long inputInternalAccountId = internalAccountService.getInternalAccount(orderExt.getOrder().getStoreId(),
|
||||||
|
EAccountOwnerType.STORE).getId();
|
||||||
|
bill.setInputInternalAccountId(inputInternalAccountId);
|
||||||
|
bill.setOutputInternalAccountId(Constants.PLATFORM_INTERNAL_ACCOUNT_ID);
|
||||||
|
bill.setBusinessAmount(orderExt.getOrder().getTotalAmount());
|
||||||
|
bill.setTransAmount(orderExt.getOrder().getRealTotalAmount());
|
||||||
|
bill.setVersion(0L);
|
||||||
|
bill.setDelFlag(Constants.UNDELETED);
|
||||||
|
financeBillMapper.insert(bill);
|
||||||
|
List<FinanceBillDetail> billDetails = new ArrayList<>(orderExt.getOrderDetails().size());
|
||||||
|
for (StoreOrderDetail orderDetail : orderExt.getOrderDetails()) {
|
||||||
|
FinanceBillDetail billDetail = new FinanceBillDetail();
|
||||||
|
billDetail.setFinanceBillId(bill.getId());
|
||||||
|
billDetail.setRelType(EFinBillDetailRelType.STORE_ORDER_DETAIL.getValue());
|
||||||
|
billDetail.setRelId(orderDetail.getId());
|
||||||
|
billDetail.setBusinessAmount(orderDetail.getTotalAmount());
|
||||||
|
billDetail.setTransAmount(orderDetail.getRealTotalAmount());
|
||||||
|
billDetail.setDelFlag(Constants.UNDELETED);
|
||||||
|
financeBillDetailMapper.insert(billDetail);
|
||||||
|
billDetails.add(billDetail);
|
||||||
|
}
|
||||||
|
TransInfo transInfo = TransInfo.builder()
|
||||||
|
.srcBillId(bill.getId())
|
||||||
|
.srcBillType(bill.getBillType())
|
||||||
|
.transAmount(bill.getTransAmount())
|
||||||
|
.transTime(new Date())
|
||||||
|
.handlerId(null)
|
||||||
|
.remark("订单完成")
|
||||||
|
.build();
|
||||||
|
//内部账户
|
||||||
|
internalAccountService.addTransDetail(Constants.PLATFORM_INTERNAL_ACCOUNT_ID, transInfo,
|
||||||
|
ELoanDirection.CREDIT, EEntryStatus.FINISH);
|
||||||
|
internalAccountService.addTransDetail(inputInternalAccountId, transInfo,
|
||||||
|
ELoanDirection.DEBIT, EEntryStatus.FINISH);
|
||||||
|
return new FinanceBillExt(bill, billDetails);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
@Override
|
||||||
|
public FinanceBillExt createRefundOrderPaymentBill(StoreOrderExt orderExt) {
|
||||||
|
Assert.notNull(orderExt);
|
||||||
|
FinanceBill bill = new FinanceBill();
|
||||||
|
bill.setBillNo(generateBillNo(EFinBillType.PAYMENT));
|
||||||
|
bill.setBillType(EFinBillType.PAYMENT.getValue());
|
||||||
|
//执行中
|
||||||
|
bill.setBillStatus(EFinBillStatus.PROCESSING.getValue());
|
||||||
|
bill.setSrcType(EFinBillSrcType.STORE_ORDER_REFUND.getValue());
|
||||||
|
bill.setSrcId(orderExt.getOrder().getId());
|
||||||
|
bill.setRelType(EFinBillRelType.STORE_ORDER.getValue());
|
||||||
|
bill.setRelId(orderExt.getOrder().getId());
|
||||||
|
//业务唯一键
|
||||||
|
String businessUniqueKey = "STORE_ORDER_REFUND_" + orderExt.getOrder().getId();
|
||||||
|
bill.setBusinessUniqueKey(businessUniqueKey);
|
||||||
|
bill.setOutputInternalAccountId(Constants.PLATFORM_INTERNAL_ACCOUNT_ID);
|
||||||
|
//售后订单金额以明细为准
|
||||||
|
BigDecimal businessAmount = BigDecimal.ZERO;
|
||||||
|
BigDecimal transferAmount = BigDecimal.ZERO;
|
||||||
|
for (StoreOrderDetail orderDetail : orderExt.getOrderDetails()) {
|
||||||
|
businessAmount = NumberUtil.add(businessAmount, orderDetail.getTotalAmount());
|
||||||
|
transferAmount = NumberUtil.add(transferAmount, orderDetail.getRealTotalAmount());
|
||||||
|
}
|
||||||
|
bill.setBusinessAmount(businessAmount);
|
||||||
|
bill.setTransAmount(transferAmount);
|
||||||
|
bill.setVersion(0L);
|
||||||
|
bill.setDelFlag(Constants.UNDELETED);
|
||||||
|
financeBillMapper.insert(bill);
|
||||||
|
List<FinanceBillDetail> billDetails = new ArrayList<>(orderExt.getOrderDetails().size());
|
||||||
|
for (StoreOrderDetail orderDetail : orderExt.getOrderDetails()) {
|
||||||
|
FinanceBillDetail billDetail = new FinanceBillDetail();
|
||||||
|
billDetail.setFinanceBillId(bill.getId());
|
||||||
|
billDetail.setRelType(EFinBillDetailRelType.STORE_ORDER_DETAIL.getValue());
|
||||||
|
billDetail.setRelId(orderDetail.getId());
|
||||||
|
billDetail.setBusinessAmount(orderDetail.getTotalAmount());
|
||||||
|
billDetail.setTransAmount(orderDetail.getRealTotalAmount());
|
||||||
|
billDetail.setDelFlag(Constants.UNDELETED);
|
||||||
|
financeBillDetailMapper.insert(billDetail);
|
||||||
|
billDetails.add(billDetail);
|
||||||
|
}
|
||||||
|
TransInfo transInfo = TransInfo.builder()
|
||||||
|
.srcBillId(bill.getId())
|
||||||
|
.srcBillType(bill.getBillType())
|
||||||
|
.transAmount(bill.getTransAmount())
|
||||||
|
.transTime(new Date())
|
||||||
|
.handlerId(null)
|
||||||
|
.remark("订单售后退款")
|
||||||
|
.build();
|
||||||
|
//内部账户
|
||||||
|
internalAccountService.addTransDetail(Constants.PLATFORM_INTERNAL_ACCOUNT_ID, transInfo,
|
||||||
|
ELoanDirection.CREDIT, EEntryStatus.WAITING);
|
||||||
|
return new FinanceBillExt(bill, billDetails);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
@Override
|
||||||
|
public void entryRefundOrderPaymentBill(Long storeOrderId) {
|
||||||
|
Assert.notNull(storeOrderId);
|
||||||
|
//业务唯一键
|
||||||
|
String businessUniqueKey = "STORE_ORDER_REFUND_" + storeOrderId;
|
||||||
|
FinanceBill financeBill = financeBillMapper.selectOne(Wrappers.lambdaQuery(FinanceBill.class)
|
||||||
|
.eq(FinanceBill::getBusinessUniqueKey, businessUniqueKey));
|
||||||
|
if (!BeanValidators.exists(financeBill)) {
|
||||||
|
throw new ServiceException(CharSequenceUtil.format("售后订单[{}]对应付款单不存在", storeOrderId));
|
||||||
|
}
|
||||||
|
//内部账户入账
|
||||||
|
internalAccountService.entryTransDetail(financeBill.getId(), EFinBillType.of(financeBill.getBillType()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
package com.ruoyi.xkt.service.impl;
|
package com.ruoyi.xkt.service.impl;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.text.CharSequenceUtil;
|
||||||
import cn.hutool.core.util.NumberUtil;
|
import cn.hutool.core.util.NumberUtil;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import com.ruoyi.common.constant.Constants;
|
import com.ruoyi.common.constant.Constants;
|
||||||
|
|
@ -45,7 +46,21 @@ public class InternalAccountServiceImpl implements IInternalAccountService {
|
||||||
return internalAccountMapper.selectById(id);
|
return internalAccountMapper.selectById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Override
|
||||||
|
public InternalAccount getInternalAccount(Long ownerId, EAccountOwnerType ownerType) {
|
||||||
|
Assert.notNull(ownerId);
|
||||||
|
Assert.notNull(ownerType);
|
||||||
|
InternalAccount account = internalAccountMapper.selectOne(Wrappers.lambdaQuery(InternalAccount.class)
|
||||||
|
.eq(InternalAccount::getOwnerId, ownerId)
|
||||||
|
.eq(InternalAccount::getOwnerType, ownerType.getValue()));
|
||||||
|
if (!BeanValidators.exists(account)) {
|
||||||
|
throw new ServiceException(CharSequenceUtil.format("{}[{}]内部账户不存在", ownerType.getLabel(),
|
||||||
|
ownerId));
|
||||||
|
}
|
||||||
|
return account;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@Override
|
@Override
|
||||||
public int addTransDetail(Long internalAccountId, TransInfo transInfo, ELoanDirection loanDirection,
|
public int addTransDetail(Long internalAccountId, TransInfo transInfo, ELoanDirection loanDirection,
|
||||||
EEntryStatus entryStatus) {
|
EEntryStatus entryStatus) {
|
||||||
|
|
@ -122,7 +137,7 @@ public class InternalAccountServiceImpl implements IInternalAccountService {
|
||||||
return internalAccountTransDetailMapper.insert(transDetail);
|
return internalAccountTransDetailMapper.insert(transDetail);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@Override
|
@Override
|
||||||
public void entryTransDetail(Long srcBillId, EFinBillType srcBillType) {
|
public void entryTransDetail(Long srcBillId, EFinBillType srcBillType) {
|
||||||
Assert.notNull(srcBillId);
|
Assert.notNull(srcBillId);
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ public class OperationRecordServiceImpl implements IOperationRecordService {
|
||||||
@Autowired
|
@Autowired
|
||||||
private StoreOrderOperationRecordMapper storeOrderOperationRecordMapper;
|
private StoreOrderOperationRecordMapper storeOrderOperationRecordMapper;
|
||||||
|
|
||||||
@Transactional
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@Override
|
@Override
|
||||||
public void addOrderOperationRecords(List<StoreOrderOperationRecordAddDTO> recordList) {
|
public void addOrderOperationRecords(List<StoreOrderOperationRecordAddDTO> recordList) {
|
||||||
if (CollUtil.isEmpty(recordList)) {
|
if (CollUtil.isEmpty(recordList)) {
|
||||||
|
|
|
||||||
|
|
@ -27,10 +27,7 @@ import com.ruoyi.xkt.enums.*;
|
||||||
import com.ruoyi.xkt.manager.ExpressManager;
|
import com.ruoyi.xkt.manager.ExpressManager;
|
||||||
import com.ruoyi.xkt.manager.PaymentManager;
|
import com.ruoyi.xkt.manager.PaymentManager;
|
||||||
import com.ruoyi.xkt.mapper.*;
|
import com.ruoyi.xkt.mapper.*;
|
||||||
import com.ruoyi.xkt.service.IExpressService;
|
import com.ruoyi.xkt.service.*;
|
||||||
import com.ruoyi.xkt.service.IOperationRecordService;
|
|
||||||
import com.ruoyi.xkt.service.IStoreOrderService;
|
|
||||||
import com.ruoyi.xkt.service.IVoucherSequenceService;
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
@ -76,6 +73,8 @@ public class StoreOrderServiceImpl implements IStoreOrderService {
|
||||||
@Autowired
|
@Autowired
|
||||||
private IVoucherSequenceService voucherSequenceService;
|
private IVoucherSequenceService voucherSequenceService;
|
||||||
@Autowired
|
@Autowired
|
||||||
|
private IFinanceBillService financeBillService;
|
||||||
|
@Autowired
|
||||||
private List<PaymentManager> paymentManagers;
|
private List<PaymentManager> paymentManagers;
|
||||||
@Autowired
|
@Autowired
|
||||||
private List<ExpressManager> expressManagers;
|
private List<ExpressManager> expressManagers;
|
||||||
|
|
@ -813,7 +812,10 @@ public class StoreOrderServiceImpl implements IStoreOrderService {
|
||||||
//操作记录
|
//操作记录
|
||||||
addOperationRecords(order.getId(), EOrderAction.COMPLETE, orderDetailIdList, EOrderAction.COMPLETE,
|
addOperationRecords(order.getId(), EOrderAction.COMPLETE, orderDetailIdList, EOrderAction.COMPLETE,
|
||||||
"确认收货", operatorId, new Date());
|
"确认收货", operatorId, new Date());
|
||||||
return new StoreOrderExt(order, orderDetails);
|
StoreOrderExt orderExt = new StoreOrderExt(order, orderDetails);
|
||||||
|
//创建转移单
|
||||||
|
financeBillService.createOrderCompletedTransferBill(orderExt);
|
||||||
|
return orderExt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
|
@ -1028,13 +1030,50 @@ public class StoreOrderServiceImpl implements IStoreOrderService {
|
||||||
EOrderAction.CONFIRM_AFTER_SALE,
|
EOrderAction.CONFIRM_AFTER_SALE,
|
||||||
refundConfirmDTO.getOperatorId(),
|
refundConfirmDTO.getOperatorId(),
|
||||||
new Date());
|
new Date());
|
||||||
|
//创建付款单
|
||||||
|
financeBillService.createRefundOrderPaymentBill(new StoreOrderExt(order, refundOrderDetails));
|
||||||
return new StoreOrderRefund(order, refundOrderDetails, getAndBaseCheck(order.getRefundOrderId()));
|
return new StoreOrderRefund(order, refundOrderDetails, getAndBaseCheck(order.getRefundOrderId()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@Override
|
@Override
|
||||||
public void refundSuccess(StoreOrderRefund storeOrderRefund) {
|
public void refundSuccess(Long storeOrderId, List<Long> storeOrderDetailIds, Long operatorId) {
|
||||||
//TODO
|
StoreOrder order = getAndBaseCheck(storeOrderId);
|
||||||
|
Map<Long, StoreOrderDetail> orderDetailMap = storeOrderDetailMapper.selectList(Wrappers
|
||||||
|
.lambdaQuery(StoreOrderDetail.class)
|
||||||
|
.eq(StoreOrderDetail::getStoreOrderId, order.getId())
|
||||||
|
.eq(SimpleEntity::getDelFlag, Constants.UNDELETED))
|
||||||
|
.stream()
|
||||||
|
.collect(Collectors.toMap(SimpleEntity::getId, Function.identity()));
|
||||||
|
for (Long storeOrderDetailId : storeOrderDetailIds) {
|
||||||
|
StoreOrderDetail orderDetail = orderDetailMap.get(storeOrderDetailId);
|
||||||
|
if (!BeanValidators.exists(orderDetail)) {
|
||||||
|
throw new ServiceException(CharSequenceUtil.format("订单明细[{}]不存在或与订单[{}]不匹配",
|
||||||
|
storeOrderDetailId, storeOrderId));
|
||||||
|
}
|
||||||
|
if (!EOrderStatus.COMPLETED.getValue().equals(orderDetail.getDetailStatus())
|
||||||
|
|| !EPayStatus.PAYING.getValue().equals(orderDetail.getPayStatus())) {
|
||||||
|
throw new ServiceException(CharSequenceUtil.format("订单明细[{}]状态异常", storeOrderDetailId));
|
||||||
|
}
|
||||||
|
orderDetail.setPayStatus(EPayStatus.PAID.getValue());
|
||||||
|
int orderDetailSuccess = storeOrderDetailMapper.updateById(orderDetail);
|
||||||
|
if (orderDetailSuccess == 0) {
|
||||||
|
throw new ServiceException(Constants.VERSION_LOCK_ERROR_COMMON_MSG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int orderSuccess = storeOrderMapper.updateById(order);
|
||||||
|
if (orderSuccess == 0) {
|
||||||
|
throw new ServiceException(Constants.VERSION_LOCK_ERROR_COMMON_MSG);
|
||||||
|
}
|
||||||
|
//操作记录
|
||||||
|
addOperationRecords(order.getId(),
|
||||||
|
EOrderAction.REFUND,
|
||||||
|
storeOrderDetailIds,
|
||||||
|
EOrderAction.REFUND,
|
||||||
|
operatorId,
|
||||||
|
new Date());
|
||||||
|
//付款单到账
|
||||||
|
financeBillService.entryRefundOrderPaymentBill(order.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue