diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/paymentorderrefund/entity/PaymentOrderRefund.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/paymentorderrefund/entity/PaymentOrderRefund.java new file mode 100644 index 0000000..c836f1c --- /dev/null +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/paymentorderrefund/entity/PaymentOrderRefund.java @@ -0,0 +1,37 @@ +package com.qniao.dam.domain.aggregate.paymentorderrefund.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.qniao.domain.Entity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("da_payment_order_refund") +public class PaymentOrderRefund extends Entity { + + @ApiModelProperty("交易订单id") + private Long tradeOrderId; + + @ApiModelProperty("支付单号") + private Long paymentOrderId; + + @ApiModelProperty("退款金额") + private BigDecimal refundFee; + + @ApiModelProperty("微信支付订单号") + private String transactionId; + + @ApiModelProperty("微信退款单号") + private String refundId; + + @ApiModelProperty("退款成功时间") + private LocalDateTime refundTime; + + @ApiModelProperty("状态") + private Integer status; +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/order/user/OrderUserCommandController.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/order/user/OrderUserCommandController.java index 55366e8..127dec9 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/order/user/OrderUserCommandController.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/order/user/OrderUserCommandController.java @@ -4,11 +4,15 @@ import com.qniao.dam.api.command.order.user.request.UserBatchSubmitOrderDto; import com.qniao.dam.api.command.order.user.request.UserSubmitMarriageBountyOrderDto; import com.qniao.dam.api.command.order.user.request.UserSubmitOrderDto; import com.qniao.dam.api.command.order.user.response.UserSubmitOrderVo; +import com.qniao.dam.api.query.order.user.request.RefundMarriageBountyOrderDto; +import com.qniao.dam.application.service.marriagebounty.MarriageBountyOrderApplicationService; import com.qniao.dam.application.service.order.OrderApplicationService; +import com.qniao.dam.domain.aggregate.marriagebounty.entity.MarriageBountyOrder; import com.qniao.dam.domain.aggregate.order.entity.Order; import com.qniao.dam.domain.aggregate.product.entity.Product; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -22,6 +26,8 @@ public class OrderUserCommandController { @Resource private OrderApplicationService orderApplicationService; + @Resource + private MarriageBountyOrderApplicationService marriageBountyOrderApplicationService; @ApiOperation("用户提交订单") @PostMapping("submit/order") @@ -51,4 +57,11 @@ public class OrderUserCommandController { productList.forEach(product -> product.setUserId(userId)); return orderApplicationService.submitMarriageBountyOrder(order, productList); } + + @ApiOperation("用户发起悬赏招亲退款") + @PostMapping("/refund/marriage-bounty-order") + public void refundMarriageBountyOrder(@RequestBody @Validated RefundMarriageBountyOrderDto dto, + @RequestParam Long userId) { + marriageBountyOrderApplicationService.refund(userId, dto.getMiId()); + } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/PaymentChannelOrderUserCommandController.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/PaymentChannelOrderUserCommandController.java index 9286869..74be1aa 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/PaymentChannelOrderUserCommandController.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/PaymentChannelOrderUserCommandController.java @@ -32,7 +32,7 @@ public class PaymentChannelOrderUserCommandController { paymentChannelOrder.setAppId(Long.valueOf(ServletUtils.getAppId())); List fieldList = ThirdPartyFieldAssembler.from(dto.getThirdPartyFields()); //todo 付款单状态判断 订单支付方式是否满足 - return paymentChannelOrderApplicationService.prePay(paymentChannelOrder, userId, fieldList, appFrom); + return paymentChannelOrderApplicationService.prePay(paymentChannelOrder, fieldList, appFrom); } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/query/marriagebounty/user/response/UserGetMarriageBountyOrderPreRefundInfoVo.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/query/marriagebounty/user/response/UserGetMarriageBountyOrderPreRefundInfoVo.java index ef283fa..85a5b47 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/query/marriagebounty/user/response/UserGetMarriageBountyOrderPreRefundInfoVo.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/query/marriagebounty/user/response/UserGetMarriageBountyOrderPreRefundInfoVo.java @@ -1,5 +1,7 @@ package com.qniao.dam.api.query.marriagebounty.user.response; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -8,9 +10,16 @@ import java.math.BigDecimal; @Data public class UserGetMarriageBountyOrderPreRefundInfoVo { + @ApiModelProperty("悬赏招亲唯一标识") + @JsonSerialize(using = ToStringSerializer.class) + private Long marriageBountyOrderId; + @ApiModelProperty("可退款见面费用") private BigDecimal refundableMeetingFee = BigDecimal.ZERO; + @ApiModelProperty("可退款见面费用次数") + private Integer refundableMeetingQuantity = 0; + @ApiModelProperty("可退款结果礼金") private BigDecimal refundableResultGift = BigDecimal.ZERO; diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/query/order/user/OrderUserQueryController.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/query/order/user/OrderUserQueryController.java index 8945e82..486ab58 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/query/order/user/OrderUserQueryController.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/query/order/user/OrderUserQueryController.java @@ -1,5 +1,6 @@ package com.qniao.dam.api.query.order.user; +import com.qniao.dam.api.query.order.user.request.RefundMarriageBountyOrderDto; import com.qniao.dam.api.query.order.user.request.UserPageOrderByOperatorQueryParam; import com.qniao.dam.api.query.order.user.response.GetOrderStatisticsByOperatorVo; import com.qniao.dam.api.query.order.user.response.UserOrderRecordVo; @@ -11,6 +12,7 @@ import com.qniao.domain.QnPage; import com.qniao.framework.utils.PageUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -50,5 +52,4 @@ public class OrderUserQueryController { return orderQueryService.userUserOrderRecord(pageUtil,miId,userId); } - } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/query/order/user/request/RefundMarriageBountyOrderDto.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/query/order/user/request/RefundMarriageBountyOrderDto.java new file mode 100644 index 0000000..edb1bc1 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/query/order/user/request/RefundMarriageBountyOrderDto.java @@ -0,0 +1,13 @@ +package com.qniao.dam.api.query.order.user.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +public class RefundMarriageBountyOrderDto { + @ApiModelProperty("征婚资料标识") + @NotNull(message = "征婚资料标识不能为空") + private Long miId; +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/marriagebounty/MarriageBountyOrderApplicationService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/marriagebounty/MarriageBountyOrderApplicationService.java index 2aeede6..c518eaa 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/marriagebounty/MarriageBountyOrderApplicationService.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/marriagebounty/MarriageBountyOrderApplicationService.java @@ -1,25 +1,37 @@ package com.qniao.dam.application.service.marriagebounty; +import com.qniao.dam.api.query.marriagebounty.user.response.UserGetMarriageBountyOrderPreRefundInfoVo; import com.qniao.dam.domain.aggregate.marriagebounty.MarriageBountyOrderAggregate; import com.qniao.dam.domain.aggregate.marriagebounty.entity.MarriageBountyOrder; import com.qniao.dam.domain.aggregate.marriagebounty.entity.MarriageBountyOrderReward; +import com.qniao.dam.domain.aggregate.marriagebounty.repository.MarriageBountyOrderRepository; import com.qniao.dam.domain.aggregate.marriagebounty.valueobj.MarriageBountyOrderProductRecord; import com.qniao.dam.domain.aggregate.marriagebounty.valueobj.MarriageBountyOrderProductSpecRecord; import com.qniao.dam.domain.aggregate.marriagebounty.valueobj.MarriageBountyOrderRel; import com.qniao.dam.domain.aggregate.order.entity.Order; +import com.qniao.dam.domain.aggregate.order.entity.OrderItem; import com.qniao.dam.domain.aggregate.order.repository.OrderRepository; +import com.qniao.dam.domain.aggregate.paymentchannelorder.entity.PaymentChannelOrder; +import com.qniao.dam.domain.aggregate.paymentorder.entity.PaymentOrder; +import com.qniao.dam.domain.aggregate.paymentorderrefund.entity.PaymentOrderRefund; import com.qniao.dam.domain.aggregate.productspec.entity.ProductSpec; import com.qniao.dam.domian.aggregate.marriagebount.constant.MarriageBountyOrderStatusEnum; +import com.qniao.dam.domian.aggregate.paymentorder.constant.PaymentOrderStatusEnum; import com.qniao.dam.domian.aggregate.product.constant.ProductSubCategoryEnum; import com.qniao.dam.infrastructure.persistent.dao.domain.ProductSpecDao; import com.qniao.dam.query.marriagebounty.MarriageBountyOrderQueryService; +import com.qniao.dam.query.paymentchannelorder.PaymentChannelOrderQueryService; +import com.qniao.dam.query.paymentorder.PaymentOrderQueryService; import com.qniao.domain.BaseApplicationService; import com.qniao.domain.BaseDomainEvent; +import com.qniao.framework.exception.BizException; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; @Service public class MarriageBountyOrderApplicationService extends BaseApplicationService { @@ -31,6 +43,12 @@ public class MarriageBountyOrderApplicationService extends BaseApplicationServic private ProductSpecDao productSpecDao; @Resource private MarriageBountyOrderAggregate marriageBountyOrderAggregate; + @Resource + private MarriageBountyOrderRepository marriageBountyOrderRepository; + @Resource + private PaymentOrderQueryService paymentOrderQueryService; + @Resource + private PaymentChannelOrderQueryService paymentChannelOrderQueryService; public void save(Long orderId) { Order order = orderRepository.load(orderId); @@ -87,4 +105,29 @@ public class MarriageBountyOrderApplicationService extends BaseApplicationServic marriageBountyOrderAggregate.update(marriageBountyOrder); } } + + public void refund(Long userId, Long miId) { + UserGetMarriageBountyOrderPreRefundInfoVo preRefundInfoVo = marriageBountyOrderQueryService.getMarriageBountyOrderPreRefundInfo(userId, miId); + if (!preRefundInfoVo.getRefundable()) { + throw new BizException("不能发起退款"); + } else { + MarriageBountyOrder marriageBountyOrder = marriageBountyOrderRepository.load(preRefundInfoVo.getMarriageBountyOrderId()); + List orderList = marriageBountyOrder.getOrderRelList().stream().map(MarriageBountyOrderRel::getOrderId).collect(Collectors.toList()); + List paymentOrderList = paymentOrderQueryService.listByOrderId(orderList, PaymentOrderStatusEnum.PAID); + for (PaymentOrder paymentOrder : paymentOrderList) { + PaymentOrderRefund paymentOrderRefund = new PaymentOrderRefund(); + BigDecimal refundFee = BigDecimal.ZERO; + Order order = orderRepository.load(paymentOrder.getOrderId()); + for (OrderItem orderItem : order.getOrderItemList()) { + if (ProductSubCategoryEnum.MARRIAGE_BOUNTY_MEETING_FEE.equals(orderItem.getSubCategory())) { + refundFee = refundFee.add(orderItem.getUnitSettlementPrice().multiply(BigDecimal.valueOf(preRefundInfoVo.getRefundableMeetingQuantity()))); + } else if (ProductSubCategoryEnum.MARRIAGE_BOUNTY_RESULT_GIFT.equals(orderItem.getSubCategory())) { + refundFee = refundFee.add(orderItem.getUnitSettlementPrice()); + } + } + paymentOrderRefund.setRefundFee(refundFee); + //todo + } + } + } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/PaymentChannelOrderApplicationService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/PaymentChannelOrderApplicationService.java index 3e2b79b..5c765c5 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/PaymentChannelOrderApplicationService.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/PaymentChannelOrderApplicationService.java @@ -29,7 +29,7 @@ public class PaymentChannelOrderApplicationService { /** * todo 旧的付款单失效处理? */ - public Map prePay(PaymentChannelOrder paymentChannelOrder, Long userId, List fieldList, Long appFrom) { + public Map prePay(PaymentChannelOrder paymentChannelOrder, List fieldList, Long appFrom) { // 获取账号 String jsCode = ThirdPartyField.findFiledValueByKey(ThirdPartyField.JS_CODE, fieldList); GetWechatSessionDto sessionDto = new GetWechatSessionDto(jsCode, appFrom); diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/marriagebounty/impl/MarriageBountyOrderQueryServiceImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/marriagebounty/impl/MarriageBountyOrderQueryServiceImpl.java index 0493bf7..bb1813e 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/marriagebounty/impl/MarriageBountyOrderQueryServiceImpl.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/marriagebounty/impl/MarriageBountyOrderQueryServiceImpl.java @@ -9,7 +9,6 @@ import com.qniao.dam.domian.aggregate.product.constant.ProductSubCategoryEnum; import com.qniao.dam.infrastructure.persistent.dao.domain.MarriageBountyOrderDao; import com.qniao.dam.infrastructure.persistent.dao.domain.MarriageBountyOrderRewardDao; import com.qniao.dam.query.marriagebounty.MarriageBountyOrderQueryService; -import io.swagger.annotations.ApiModelProperty; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -44,16 +43,22 @@ public class MarriageBountyOrderQueryServiceImpl implements MarriageBountyOrderQ UserGetMarriageBountyOrderPreRefundInfoVo refundInfoVo = new UserGetMarriageBountyOrderPreRefundInfoVo(); MarriageBountyOrder marriageBountyOrder = queryBy(userId, miId, MarriageBountyOrderStatusEnum.MATCHMAKING); if (Objects.nonNull(marriageBountyOrder)) { + refundInfoVo.setMarriageBountyOrderId(marriageBountyOrder.getId()); BigDecimal refundableMeetingFee = BigDecimal.ZERO; BigDecimal refundableResultGift = BigDecimal.ZERO; + int refundableMeetingQuantity = 0; for (MarriageBountyOrderReward orderReward : marriageBountyOrder.getUpdateOrderRewardList()) { if (!orderReward.getIsReceive()) { if (ProductSubCategoryEnum.MARRIAGE_BOUNTY_MEETING_FEE.equals(orderReward.getRewardCategory())) { refundableMeetingFee = refundableMeetingFee.add(orderReward.getRewardAmount()); + refundableMeetingQuantity++; } else if (ProductSubCategoryEnum.MARRIAGE_BOUNTY_RESULT_GIFT.equals(orderReward.getRewardCategory())) { refundableResultGift = refundableResultGift.add(orderReward.getRewardAmount()); } } + refundInfoVo.setRefundableMeetingFee(refundableMeetingFee); + refundInfoVo.setRefundableMeetingQuantity(refundableMeetingQuantity); + refundInfoVo.setRefundableResultGift(refundableResultGift); refundInfoVo.setRefundable(refundableMeetingFee.compareTo(BigDecimal.ZERO) > 0 || refundableResultGift.compareTo(BigDecimal.ZERO) > 0); } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/paymentchannelorder/PaymentChannelOrderQueryService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/paymentchannelorder/PaymentChannelOrderQueryService.java new file mode 100644 index 0000000..ca38474 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/paymentchannelorder/PaymentChannelOrderQueryService.java @@ -0,0 +1,4 @@ +package com.qniao.dam.query.paymentchannelorder; + +public interface PaymentChannelOrderQueryService { +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/paymentchannelorder/impl/PaymentChannelOrderQueryServiceImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/paymentchannelorder/impl/PaymentChannelOrderQueryServiceImpl.java new file mode 100644 index 0000000..ab5e6ba --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/paymentchannelorder/impl/PaymentChannelOrderQueryServiceImpl.java @@ -0,0 +1,8 @@ +package com.qniao.dam.query.paymentchannelorder.impl; + +import com.qniao.dam.query.paymentchannelorder.PaymentChannelOrderQueryService; +import org.springframework.stereotype.Service; + +@Service +public class PaymentChannelOrderQueryServiceImpl implements PaymentChannelOrderQueryService { +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/paymentorder/PaymentOrderQueryService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/paymentorder/PaymentOrderQueryService.java new file mode 100644 index 0000000..3e8b8f7 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/paymentorder/PaymentOrderQueryService.java @@ -0,0 +1,10 @@ +package com.qniao.dam.query.paymentorder; + +import com.qniao.dam.domain.aggregate.paymentorder.entity.PaymentOrder; +import com.qniao.dam.domian.aggregate.paymentorder.constant.PaymentOrderStatusEnum; + +import java.util.List; + +public interface PaymentOrderQueryService { + List listByOrderId(List orderList, PaymentOrderStatusEnum paymentOrderStatusEnum); +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/paymentorder/impl/PaymentOrderQueryServiceImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/paymentorder/impl/PaymentOrderQueryServiceImpl.java new file mode 100644 index 0000000..166b9ad --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/paymentorder/impl/PaymentOrderQueryServiceImpl.java @@ -0,0 +1,25 @@ +package com.qniao.dam.query.paymentorder.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qniao.dam.domain.aggregate.paymentorder.entity.PaymentOrder; +import com.qniao.dam.domian.aggregate.paymentorder.constant.PaymentOrderStatusEnum; +import com.qniao.dam.infrastructure.persistent.dao.domain.PaymentOrderDao; +import com.qniao.dam.query.paymentorder.PaymentOrderQueryService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +@Service +public class PaymentOrderQueryServiceImpl implements PaymentOrderQueryService { + + @Resource + private PaymentOrderDao paymentOrderDao; + + @Override + public List listByOrderId(List orderList, PaymentOrderStatusEnum status) { + return paymentOrderDao.selectList(new LambdaQueryWrapper() + .in(PaymentOrder::getOrderId, orderList) + .eq(PaymentOrder::getStatus, status)); + } +}