diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/entity/MarriageBountyOrderReward.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/entity/MarriageBountyOrderReward.java index e0010fc..23764b6 100644 --- a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/entity/MarriageBountyOrderReward.java +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/marriagebounty/entity/MarriageBountyOrderReward.java @@ -31,18 +31,22 @@ public class MarriageBountyOrderReward extends Entity @ApiModelProperty("奖励金额") private BigDecimal rewardAmount; + @ApiModelProperty("付款金额") + private BigDecimal paidAmount; + @ApiModelProperty("是否领取") private Boolean isReceive; @ApiModelProperty("悬赏招亲订单奖励领取记录") private transient List rewardReceiveRecordList; - public static Collection build(ProductSubCategoryEnum rewardCategory, BigDecimal rewardAmount, int quantity) { + public static Collection build(ProductSubCategoryEnum rewardCategory, BigDecimal rewardAmount, BigDecimal paidAmount,int quantity) { List orderRewardList = new ArrayList<>(); for (int i = 0; i < quantity; i++) { MarriageBountyOrderReward orderReward = new MarriageBountyOrderReward(); orderReward.setRewardCategory(rewardCategory); orderReward.setRewardAmount(rewardAmount); + orderReward.setPaidAmount(paidAmount); orderReward.setIsReceive(false); orderRewardList.add(orderReward); } diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/order/entity/OrderItem.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/order/entity/OrderItem.java index fceedc8..011fcf6 100644 --- a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/order/entity/OrderItem.java +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/order/entity/OrderItem.java @@ -40,6 +40,9 @@ public class OrderItem extends Entity { @ApiModelProperty("产品描述") private String productDesc; + @ApiModelProperty("原始单价") + private BigDecimal unitOriginalPrice; + @ApiModelProperty("结算单价") private BigDecimal unitSettlementPrice; @@ -47,7 +50,7 @@ public class OrderItem extends Entity { private Integer quantity; @ApiModelProperty("原始金额") - private BigDecimal originalAmount ; + private BigDecimal originalAmount; @ApiModelProperty("折扣金额") private BigDecimal discountAmount; @@ -61,6 +64,7 @@ public class OrderItem extends Entity { ProductMainCategoryEnum mainCategory, ProductSubCategoryEnum subCategory, String productTitle, + BigDecimal unitOriginalPrice, BigDecimal unitSettlementPrice, Integer quantity) { OrderItem orderItem = new OrderItem(); @@ -70,6 +74,7 @@ public class OrderItem extends Entity { orderItem.setMainCategory(mainCategory); orderItem.setSubCategory(subCategory); orderItem.setProductTitle(productTitle); + orderItem.setOriginalAmount(unitOriginalPrice); orderItem.setUnitSettlementPrice(unitSettlementPrice); orderItem.setQuantity(quantity); return orderItem; diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/rewardconfig/entity/RewardConfig.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/rewardconfig/entity/RewardConfig.java index 7522e86..65be180 100644 --- a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/rewardconfig/entity/RewardConfig.java +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/rewardconfig/entity/RewardConfig.java @@ -45,6 +45,14 @@ public class RewardConfig extends Entity { } } + public BigDecimal calculatePrice(BigDecimal price) { + if (RewardAmountUnitEnum.NUM.equals(rewardAmountUnit)) { + return new BigDecimal(value); + } else { + return price.multiply(new BigDecimal(value)).divide(BigDecimal.valueOf(100), 3, RoundingMode.HALF_UP); + } + } + public LocalDateTime getRefundableTime(LocalDateTime time) { return time.plusMonths(Long.parseLong(value)); } 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 825fdd0..38e4b91 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 @@ -17,6 +17,9 @@ public class UserGetMarriageBountyOrderPreRefundInfoVo { @ApiModelProperty("奖励金额") private BigDecimal rewardAmount; + @ApiModelProperty("付款金额") + private BigDecimal paidMount; + @ApiModelProperty("可退款见面费用") private BigDecimal refundableMeetingFee = BigDecimal.ZERO; diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/order/OrderEventHandler.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/order/OrderEventHandler.java index b373fba..62e21be 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/order/OrderEventHandler.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/handler/order/OrderEventHandler.java @@ -161,7 +161,7 @@ public class OrderEventHandler extends BaseApplicationService { Order order = Order.build(userId, miId, OrderBelongingEnum.CUSTOMER, marriageInformation.getNickName(), OrderTypeEnum.NORMAL); ProductSpec productSpec = product.getProductSpecList().get(0); OrderItem orderItem = OrderItem.build(productSpec.getProductId(), productSpec.getId(), product.getProductType(), product.getMainCategory(), product.getSubCategory(), - product.getProductTitle(), BigDecimal.ZERO, 1); + product.getProductTitle(), BigDecimal.ZERO,BigDecimal.ZERO, 1); orderItem.setSettlementAmount(BigDecimal.ZERO); order.setSettlementAmount(BigDecimal.ZERO); order.setOrderItemList(Collections.singletonList(orderItem)); 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 613da9a..354220a 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 @@ -78,7 +78,8 @@ public class MarriageBountyOrderApplicationService extends BaseApplicationServic MarriageBountyOrderStatusEnum.MATCHMAKING, MarriageBountyOrderPaymentStatusEnum.PAID); if (Objects.nonNull(marriageBountyOrder)) { //修改悬赏招亲订单 - Map rewardCategoryPriceMap = new HashMap<>(); + Map rewardOriginalPriceMap = new HashMap<>(); + Map rewardSettlementPriceMap = new HashMap<>(); //订单关系 MarriageBountyOrderRel orderRel = MarriageBountyOrderRel.build(orderId, order.getSettlementAmount()); marriageBountyOrder.setOrderRelList(Collections.singletonList(orderRel)); @@ -88,14 +89,20 @@ public class MarriageBountyOrderApplicationService extends BaseApplicationServic ProductSpec productSpec = productSpecDao.selectById(orderItem.getProductSpecId()); productRecord.getProductSpecRecordList().add(MarriageBountyOrderProductSpecRecord.build( orderItem.getSubCategory(), productSpec.getUnitOriginalPrice(), productSpec.getUnitOriginalPrice())); - rewardCategoryPriceMap.put(orderItem.getSubCategory().getValue(), orderItem.getUnitSettlementPrice()); + rewardOriginalPriceMap.put(orderItem.getSubCategory().getValue(), orderItem.getUnitOriginalPrice()); + rewardSettlementPriceMap.put(orderItem.getSubCategory().getValue(), orderItem.getUnitSettlementPrice()); }); //悬赏招亲订单奖励 for (MarriageBountyOrderReward orderReward : marriageBountyOrder.getOrderRewardList()) { if (!orderReward.getIsReceive()) { - BigDecimal addPrice = rewardCategoryPriceMap.get(orderReward.getRewardCategory().getValue()); - addPrice = Objects.nonNull(addPrice) ? addPrice : BigDecimal.ZERO; - orderReward.setRewardAmount(orderReward.getRewardAmount().add(addPrice)); + //奖励金额 + BigDecimal addOriginalPrice = rewardOriginalPriceMap.get(orderReward.getRewardCategory().getValue()); + addOriginalPrice = Objects.nonNull(addOriginalPrice) ? addOriginalPrice : BigDecimal.ZERO; + orderReward.setRewardAmount(orderReward.getRewardAmount().add(addOriginalPrice)); + //付款金额 + BigDecimal addPaidPrice = rewardSettlementPriceMap.get(orderReward.getRewardCategory().getValue()); + addPaidPrice = Objects.nonNull(addPaidPrice) ? addPaidPrice : BigDecimal.ZERO; + orderReward.setPaidAmount(orderReward.getPaidAmount().add(addPaidPrice)); marriageBountyOrder.getUpdateOrderRewardList().add(orderReward); } } @@ -122,9 +129,9 @@ public class MarriageBountyOrderApplicationService extends BaseApplicationServic productRecord.getProductSpecRecordList().add(MarriageBountyOrderProductSpecRecord.build( orderItem.getSubCategory(), productSpec.getUnitOriginalPrice(), productSpec.getUnitOriginalPrice())); if (ProductSubCategoryEnum.MARRIAGE_BOUNTY_MEETING_FEE.equals(orderItem.getSubCategory())) { - orderRewardList.addAll(MarriageBountyOrderReward.build(ProductSubCategoryEnum.MARRIAGE_BOUNTY_MEETING_FEE, orderItem.getUnitSettlementPrice(), orderItem.getQuantity())); + orderRewardList.addAll(MarriageBountyOrderReward.build(ProductSubCategoryEnum.MARRIAGE_BOUNTY_MEETING_FEE, orderItem.getUnitOriginalPrice(), orderItem.getUnitSettlementPrice(), orderItem.getQuantity())); } else if (ProductSubCategoryEnum.MARRIAGE_BOUNTY_RESULT_GIFT.equals(orderItem.getSubCategory())) { - orderRewardList.addAll(MarriageBountyOrderReward.build(ProductSubCategoryEnum.MARRIAGE_BOUNTY_RESULT_GIFT, orderItem.getUnitSettlementPrice(), orderItem.getQuantity())); + orderRewardList.addAll(MarriageBountyOrderReward.build(ProductSubCategoryEnum.MARRIAGE_BOUNTY_RESULT_GIFT, orderItem.getUnitOriginalPrice(), orderItem.getUnitSettlementPrice(), orderItem.getQuantity())); } }); marriageBountyOrder.setOrderRewardList(orderRewardList); diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/order/OrderApplicationService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/order/OrderApplicationService.java index 1a0e6fa..f2e130c 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/order/OrderApplicationService.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/order/OrderApplicationService.java @@ -55,6 +55,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -135,7 +136,7 @@ public class OrderApplicationService extends BaseApplicationService { if (CollUtil.isNotEmpty(order.getOrderItemList())) { BigDecimal totalOriginalAmount = BigDecimal.ZERO; for (OrderItem orderItem : order.getOrderItemList()) { - orderItem.setOriginalAmount(orderItem.getUnitSettlementPrice().multiply(BigDecimal.valueOf(orderItem.getQuantity()))); + orderItem.setOriginalAmount(orderItem.getOriginalAmount().multiply(BigDecimal.valueOf(orderItem.getQuantity()))); orderItem.setDiscountAmount(BigDecimal.ZERO); orderItem.setSettlementAmount(orderItem.getOriginalAmount()); totalOriginalAmount = totalOriginalAmount.add(orderItem.getOriginalAmount()); @@ -161,12 +162,14 @@ public class OrderApplicationService extends BaseApplicationService { orderItem.setSubCategory(product.getSubCategory()); orderItem.setProductTitle(product.getProductTitle()); orderItem.setProductDesc(product.getProductDesc()); + orderItem.setUnitOriginalPrice(productSpec.getUnitSellingPrice()); orderItem.setUnitSettlementPrice(productSpec.getUnitSellingPrice()); order.setOrderBelonging(order.transformBelonging(product.getProductType())); if (order.getGroupType() != null && order.getGroupType() == 1) { ActivityProduct activityProduct = activityProductDao.selectOne(Wrappers.lambdaQuery(new ActivityProduct()) .eq(ActivityProduct::getActivityId, order.getActivityId()) .eq(ActivityProduct::getProductSpecId, orderItem.getProductSpecId())); + orderItem.setUnitOriginalPrice(activityProduct.getActivityUnitSellingPrice()); orderItem.setUnitSettlementPrice(activityProduct.getActivityUnitSellingPrice()); } //1.1. 同类型权益,不同规格,限制购买和提醒 @@ -249,23 +252,26 @@ public class OrderApplicationService extends BaseApplicationService { if (CollUtil.isNotEmpty(order.getOrderItemList())) { BigDecimal totalOriginalAmount = BigDecimal.ZERO; BigDecimal totalDiscountAmount = BigDecimal.ZERO; + BigDecimal totalSettlementAmount = BigDecimal.ZERO; for (OrderItem orderItem : order.getOrderItemList()) { - orderItem.setOriginalAmount(orderItem.getUnitSettlementPrice().multiply(BigDecimal.valueOf(orderItem.getQuantity()))); - BigDecimal discountAmount = BigDecimal.ZERO; + orderItem.setOriginalAmount(orderItem.getOriginalAmount().multiply(BigDecimal.valueOf(orderItem.getQuantity()))); + BigDecimal discountPrice = BigDecimal.ZERO; if (Objects.nonNull(guestCertificationReward)) { - discountAmount = discountAmount.add(guestCertificationReward.calculateReward(orderItem.getOriginalAmount())); + discountPrice = discountPrice.add(guestCertificationReward.calculateReward(orderItem.getUnitOriginalPrice())); } if (Objects.nonNull(publishMarriageBountyReward)) { - discountAmount = discountAmount.add(publishMarriageBountyReward.calculateReward(orderItem.getOriginalAmount())); + discountPrice = discountPrice.add(publishMarriageBountyReward.calculateReward(orderItem.getUnitOriginalPrice())); } - orderItem.setDiscountAmount(discountAmount); - orderItem.setSettlementAmount(orderItem.getOriginalAmount().subtract(discountAmount)); + orderItem.setUnitSettlementPrice(orderItem.getUnitOriginalPrice().subtract(discountPrice)); + orderItem.setSettlementAmount(orderItem.getUnitSettlementPrice().multiply(BigDecimal.valueOf(orderItem.getQuantity())).setScale(2, RoundingMode.HALF_UP)); + orderItem.setDiscountAmount(orderItem.getOriginalAmount().subtract(orderItem.getSettlementAmount())); totalOriginalAmount = totalOriginalAmount.add(orderItem.getOriginalAmount()); - totalDiscountAmount = totalDiscountAmount.add(discountAmount); + totalSettlementAmount = totalSettlementAmount.add(orderItem.getSettlementAmount()); + totalDiscountAmount = totalDiscountAmount.add(orderItem.getDiscountAmount()); } order.setOriginalAmount(totalOriginalAmount); order.setDiscountAmount(totalDiscountAmount); - order.setSettlementAmount(order.getOriginalAmount().subtract(totalDiscountAmount)); + order.setSettlementAmount(totalSettlementAmount); if (order.getSettlementAmount().compareTo(BigDecimal.ZERO) <= 0) { throw new BizException("订单金额应该大于0"); } @@ -317,6 +323,7 @@ public class OrderApplicationService extends BaseApplicationService { orderItem.setSubCategory(product.getSubCategory()); orderItem.setProductTitle(product.getProductTitle()); orderItem.setProductDesc(product.getProductDesc()); + orderItem.setOriginalAmount(productSpec.getUnitSellingPrice()); orderItem.setUnitSettlementPrice(productSpec.getUnitSellingPrice()); orderItem.setQuantity(1); if (ProductSubCategoryEnum.MARRIAGE_BOUNTY_MEETING_FEE.equals(product.getSubCategory())) { @@ -353,6 +360,7 @@ public class OrderApplicationService extends BaseApplicationService { orderItem.setSubCategory(product.getSubCategory()); orderItem.setProductTitle(product.getProductTitle()); orderItem.setProductDesc(product.getProductDesc()); + orderItem.setOriginalAmount(unitSettlementPrice); orderItem.setUnitSettlementPrice(unitSettlementPrice); orderItem.setQuantity(quantity); orderItemList.add(orderItem); @@ -399,7 +407,7 @@ public class OrderApplicationService extends BaseApplicationService { throw new BizException("下单异常"); } OrderItem orderItem = OrderItem.build(productSpec.getProductId(), productSpec.getId(), product.getProductType(), product.getMainCategory(), product.getSubCategory(), - product.getProductTitle(), calculateVo.getUnitSettlementPrice(), 1); + product.getProductTitle(), calculateVo.getUnitSettlementPrice(), calculateVo.getUnitSettlementPrice(), 1); order.setOrderItemList(Collections.singletonList(orderItem)); // } //2. 订单金额计算 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 656ca61..3af639b 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 @@ -63,16 +63,17 @@ public class MarriageBountyOrderQueryServiceImpl implements MarriageBountyOrderQ if (Objects.nonNull(marriageBountyOrder) && MarriageBountyOrderPaymentStatusEnum.PAID.equals(marriageBountyOrder.getPaymentStatus())) { refundInfoVo.setMarriageBountyOrderId(marriageBountyOrder.getId()); refundInfoVo.setRewardAmount(marriageBountyOrder.getRewardAmount()); + refundInfoVo.setPaidMount(marriageBountyOrder.getPaidAmount()); BigDecimal refundableMeetingFee = BigDecimal.ZERO; BigDecimal refundableResultGift = BigDecimal.ZERO; int refundableMeetingQuantity = 0; for (MarriageBountyOrderReward orderReward : marriageBountyOrder.getOrderRewardList()) { if (!orderReward.getIsReceive()) { if (ProductSubCategoryEnum.MARRIAGE_BOUNTY_MEETING_FEE.equals(orderReward.getRewardCategory())) { - refundableMeetingFee = refundableMeetingFee.add(orderReward.getRewardAmount()); + refundableMeetingFee = refundableMeetingFee.add(orderReward.getPaidAmount()); refundableMeetingQuantity++; } else if (ProductSubCategoryEnum.MARRIAGE_BOUNTY_RESULT_GIFT.equals(orderReward.getRewardCategory())) { - refundableResultGift = refundableResultGift.add(orderReward.getRewardAmount()); + refundableResultGift = refundableResultGift.add(orderReward.getPaidAmount()); } } }