diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/StoreOrderController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/StoreOrderController.java index ecbe49d07..75e14fba2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/StoreOrderController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/StoreOrderController.java @@ -5,6 +5,7 @@ import com.github.pagehelper.Page; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.XktBaseController; 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.enums.BusinessType; import com.ruoyi.common.exception.ServiceException; @@ -205,13 +206,15 @@ public class StoreOrderController extends XktBaseController { //TODO 权限 StoreOrderRefundConfirmDTO dto = BeanUtil.toBean(vo, StoreOrderRefundConfirmDTO.class); dto.setOperatorId(SecurityUtils.getUserId()); - //售后状态->售后完成,支付状态->支付中 + //售后状态->售后完成,支付状态->支付中,创建收款单 StoreOrderRefund storeOrderRefund = storeOrderService.prepareRefundOrder(dto); //三方退款 PaymentManager paymentManager = getPaymentManager(EPayChannel.of(storeOrderRefund.getRefundOrder().getPayChannel())); paymentManager.refundStoreOrder(storeOrderRefund); - //支付状态->已支付,创建收款单 - storeOrderService.refundSuccess(storeOrderRefund); + //支付状态->已支付,收款单到账 + storeOrderService.refundSuccess(storeOrderRefund.getRefundOrder().getId(), + storeOrderRefund.getRefundOrderDetails().stream().map(SimpleEntity::getId).collect(Collectors.toList()), + SecurityUtils.getUserId()); return success(); } diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/finance/FinanceBillInfo.java b/xkt/src/main/java/com/ruoyi/xkt/dto/finance/FinanceBillExt.java similarity index 93% rename from xkt/src/main/java/com/ruoyi/xkt/dto/finance/FinanceBillInfo.java rename to xkt/src/main/java/com/ruoyi/xkt/dto/finance/FinanceBillExt.java index d12cec58f..708bffd0d 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/dto/finance/FinanceBillInfo.java +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/finance/FinanceBillExt.java @@ -15,7 +15,7 @@ import java.util.List; @Data @AllArgsConstructor @NoArgsConstructor -public class FinanceBillInfo { +public class FinanceBillExt { private FinanceBill financeBill; diff --git a/xkt/src/main/java/com/ruoyi/xkt/enums/EAccountOwnerType.java b/xkt/src/main/java/com/ruoyi/xkt/enums/EAccountOwnerType.java new file mode 100644 index 000000000..8ff6edf13 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/enums/EAccountOwnerType.java @@ -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; + } +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/enums/EFinBillSrcType.java b/xkt/src/main/java/com/ruoyi/xkt/enums/EFinBillSrcType.java index 97b847034..96b20ba09 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/enums/EFinBillSrcType.java +++ b/xkt/src/main/java/com/ruoyi/xkt/enums/EFinBillSrcType.java @@ -13,7 +13,9 @@ public enum EFinBillSrcType { STORE_ORDER_PAID(1, "代发订单支付"), STORE_ORDER_COMPLETED(2, "代发订单完成"), - WITHDRAW(3, "提现"); + WITHDRAW(3, "提现"), + STORE_ORDER_REFUND(4, "代发订单退款"), + ; private final Integer value; private final String label; diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/IFinanceBillService.java b/xkt/src/main/java/com/ruoyi/xkt/service/IFinanceBillService.java index 70aaa241d..220c900ab 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/IFinanceBillService.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/IFinanceBillService.java @@ -1,6 +1,6 @@ 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.enums.EPayChannel; @@ -10,12 +10,37 @@ import com.ruoyi.xkt.enums.EPayChannel; */ public interface IFinanceBillService { /** - * 根据订单创建收款单 + * 订单支付完成创建收款单(入账) * * @param orderExt * @param payId * @param payChannel * @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); + + } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/IInternalAccountService.java b/xkt/src/main/java/com/ruoyi/xkt/service/IInternalAccountService.java index a658136c5..63780f1fe 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/IInternalAccountService.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/IInternalAccountService.java @@ -2,6 +2,7 @@ package com.ruoyi.xkt.service; import com.ruoyi.xkt.domain.InternalAccount; import com.ruoyi.xkt.dto.finance.TransInfo; +import com.ruoyi.xkt.enums.EAccountOwnerType; import com.ruoyi.xkt.enums.EEntryStatus; import com.ruoyi.xkt.enums.EFinBillType; import com.ruoyi.xkt.enums.ELoanDirection; @@ -19,6 +20,15 @@ public interface IInternalAccountService { */ InternalAccount getById(Long id); + /** + * 获取内部账户 + * + * @param ownerId + * @param ownerType + * @return + */ + InternalAccount getInternalAccount(Long ownerId, EAccountOwnerType ownerType); + /** * 添加交易明细 * diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/IStoreOrderService.java b/xkt/src/main/java/com/ruoyi/xkt/service/IStoreOrderService.java index e32499f5b..4c597ca57 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/IStoreOrderService.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/IStoreOrderService.java @@ -154,9 +154,11 @@ public interface IStoreOrderService { /** * 退款成功 * - * @param storeOrderRefund + * @param storeOrderId + * @param storeOrderDetailIds + * @param operatorId */ - void refundSuccess(StoreOrderRefund storeOrderRefund); + void refundSuccess(Long storeOrderId, List storeOrderDetailIds, Long operatorId); } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/AlipayCallbackServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/AlipayCallbackServiceImpl.java index e050f6943..64154d86f 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/AlipayCallbackServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/AlipayCallbackServiceImpl.java @@ -37,14 +37,14 @@ public class AlipayCallbackServiceImpl implements IAlipayCallbackService { .eq(AlipayCallback::getNotifyId, notifyId)); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public int insertAlipayCallback(AlipayCallback alipayCallback) { Assert.notNull(alipayCallback); return alipayCallbackMapper.insert(alipayCallback); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void processOrderPaid(AlipayCallback info) { //更新回调状态 @@ -56,6 +56,6 @@ public class AlipayCallbackServiceImpl implements IAlipayCallbackService { StoreOrderExt orderExt = storeOrderService.paySuccess(order.getId(), info.getTradeNo(), info.getTotalAmount(), info.getReceiptAmount()); //创建收款单 - financeBillService.createCollectionBillAfterOrderPaid(orderExt, info.getId(), EPayChannel.ALI_PAY); + financeBillService.createOrderPaidCollectionBill(orderExt, info.getId(), EPayChannel.ALI_PAY); } } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/ExternalAccountServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/ExternalAccountServiceImpl.java index fe68e2e5c..b0da28cb8 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/ExternalAccountServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/ExternalAccountServiceImpl.java @@ -47,7 +47,7 @@ public class ExternalAccountServiceImpl implements IExternalAccountService { return externalAccountMapper.selectById(id); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public int addTransDetail(Long externalAccountId, TransInfo transInfo, ELoanDirection loanDirection, EEntryStatus entryStatus) { @@ -72,7 +72,7 @@ public class ExternalAccountServiceImpl implements IExternalAccountService { return externalAccountTransDetailMapper.insert(transDetail); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void entryTransDetail(Long srcBillId, EFinBillType srcBillType) { Assert.notNull(srcBillId); diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/FinanceBillServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/FinanceBillServiceImpl.java index 2ac3d20d8..bb4f0cc5e 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/FinanceBillServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/FinanceBillServiceImpl.java @@ -1,11 +1,16 @@ package com.ruoyi.xkt.service.impl; +import cn.hutool.core.text.CharSequenceUtil; 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.exception.ServiceException; +import com.ruoyi.common.utils.bean.BeanValidators; import com.ruoyi.xkt.domain.FinanceBill; import com.ruoyi.xkt.domain.FinanceBillDetail; 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.order.StoreOrderExt; import com.ruoyi.xkt.enums.*; @@ -19,6 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -39,14 +45,13 @@ public class FinanceBillServiceImpl implements IFinanceBillService { @Autowired private IExternalAccountService externalAccountService; - @Transactional + @Transactional(rollbackFor = Exception.class) @Override - public FinanceBillInfo createCollectionBillAfterOrderPaid(StoreOrderExt orderExt, Long payId, - EPayChannel payChannel) { + public FinanceBillExt createOrderPaidCollectionBill(StoreOrderExt orderExt, Long payId, + EPayChannel payChannel) { Assert.notNull(orderExt); Assert.notNull(payId); Assert.notNull(payChannel); - //获取平台内部账户并加锁 FinanceBill bill = new FinanceBill(); bill.setBillNo(generateBillNo(EFinBillType.COLLECTION)); bill.setBillType(EFinBillType.COLLECTION.getValue()); @@ -92,7 +97,130 @@ public class FinanceBillServiceImpl implements IFinanceBillService { //外部账户 externalAccountService.addTransDetail(payChannel.getPlatformExternalAccountId(), transInfo, 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 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 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())); } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/InternalAccountServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/InternalAccountServiceImpl.java index 8c12b4410..5158a3d79 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/InternalAccountServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/InternalAccountServiceImpl.java @@ -1,6 +1,7 @@ package com.ruoyi.xkt.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.NumberUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.common.constant.Constants; @@ -45,7 +46,21 @@ public class InternalAccountServiceImpl implements IInternalAccountService { 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 public int addTransDetail(Long internalAccountId, TransInfo transInfo, ELoanDirection loanDirection, EEntryStatus entryStatus) { @@ -122,7 +137,7 @@ public class InternalAccountServiceImpl implements IInternalAccountService { return internalAccountTransDetailMapper.insert(transDetail); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void entryTransDetail(Long srcBillId, EFinBillType srcBillType) { Assert.notNull(srcBillId); diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/OperationRecordServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/OperationRecordServiceImpl.java index 5d1af4f69..ccd2ff346 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/OperationRecordServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/OperationRecordServiceImpl.java @@ -22,7 +22,7 @@ public class OperationRecordServiceImpl implements IOperationRecordService { @Autowired private StoreOrderOperationRecordMapper storeOrderOperationRecordMapper; - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public void addOrderOperationRecords(List recordList) { if (CollUtil.isEmpty(recordList)) { diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreOrderServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreOrderServiceImpl.java index 4bba71713..b9184e02e 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreOrderServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreOrderServiceImpl.java @@ -27,10 +27,7 @@ import com.ruoyi.xkt.enums.*; import com.ruoyi.xkt.manager.ExpressManager; import com.ruoyi.xkt.manager.PaymentManager; import com.ruoyi.xkt.mapper.*; -import com.ruoyi.xkt.service.IExpressService; -import com.ruoyi.xkt.service.IOperationRecordService; -import com.ruoyi.xkt.service.IStoreOrderService; -import com.ruoyi.xkt.service.IVoucherSequenceService; +import com.ruoyi.xkt.service.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -76,6 +73,8 @@ public class StoreOrderServiceImpl implements IStoreOrderService { @Autowired private IVoucherSequenceService voucherSequenceService; @Autowired + private IFinanceBillService financeBillService; + @Autowired private List paymentManagers; @Autowired private List expressManagers; @@ -813,7 +812,10 @@ public class StoreOrderServiceImpl implements IStoreOrderService { //操作记录 addOperationRecords(order.getId(), EOrderAction.COMPLETE, orderDetailIdList, EOrderAction.COMPLETE, "确认收货", operatorId, new Date()); - return new StoreOrderExt(order, orderDetails); + StoreOrderExt orderExt = new StoreOrderExt(order, orderDetails); + //创建转移单 + financeBillService.createOrderCompletedTransferBill(orderExt); + return orderExt; } @Transactional(rollbackFor = Exception.class) @@ -1028,13 +1030,50 @@ public class StoreOrderServiceImpl implements IStoreOrderService { EOrderAction.CONFIRM_AFTER_SALE, refundConfirmDTO.getOperatorId(), new Date()); + //创建付款单 + financeBillService.createRefundOrderPaymentBill(new StoreOrderExt(order, refundOrderDetails)); return new StoreOrderRefund(order, refundOrderDetails, getAndBaseCheck(order.getRefundOrderId())); } @Transactional(rollbackFor = Exception.class) @Override - public void refundSuccess(StoreOrderRefund storeOrderRefund) { - //TODO + public void refundSuccess(Long storeOrderId, List storeOrderDetailIds, Long operatorId) { + StoreOrder order = getAndBaseCheck(storeOrderId); + Map 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()); } /**