From 322445438463daac38516f43e2987eae95ffbade Mon Sep 17 00:00:00 2001 From: Derran Date: Mon, 18 Nov 2024 16:53:02 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BA=A2=E5=A8=98=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constant/MatchmakerOrderTypeEnum.java | 36 ++++++++++ .../rewardconfig/constant/RewardTypeEnum.java | 11 ++- .../rewardconfig/entity/RewardConfig.java | 3 +- .../user/OrderUserCommandController.java | 9 +++ .../request/UserSubmitMatchMakerOrderDto.java | 40 +++++++++++ .../order/OrderApplicationService.java | 70 +++++++++++++++++++ .../MarriageBountyOrderQueryServiceImpl.java | 2 +- 7 files changed, 167 insertions(+), 4 deletions(-) create mode 100644 dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/order/constant/MatchmakerOrderTypeEnum.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/order/user/request/UserSubmitMatchMakerOrderDto.java diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/order/constant/MatchmakerOrderTypeEnum.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/order/constant/MatchmakerOrderTypeEnum.java new file mode 100644 index 0000000..6a94fa3 --- /dev/null +++ b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/order/constant/MatchmakerOrderTypeEnum.java @@ -0,0 +1,36 @@ +package com.qniao.dam.domian.aggregate.order.constant; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.Getter; + +@Getter +@JsonFormat(shape = JsonFormat.Shape.OBJECT) +public enum MatchmakerOrderTypeEnum { + + JOIN(1, "红娘加盟"), + + UPGRADE(2, "红娘升级"); + + @EnumValue + @JsonValue + private final Integer value; + private final String desc; + + MatchmakerOrderTypeEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + @JsonCreator + public static MatchmakerOrderTypeEnum get(Object code) { + for (MatchmakerOrderTypeEnum e : MatchmakerOrderTypeEnum.values()) { + if (e.getValue().equals(code)) { + return e; + } + } + return null; + } +} \ No newline at end of file diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/rewardconfig/constant/RewardTypeEnum.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/rewardconfig/constant/RewardTypeEnum.java index 9954967..6ee9de1 100644 --- a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/rewardconfig/constant/RewardTypeEnum.java +++ b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/rewardconfig/constant/RewardTypeEnum.java @@ -76,7 +76,16 @@ public enum RewardTypeEnum { MARRIAGE_BOUNTY_DATING_VALIDITY_PERIOD(305,"招亲榜-牵手服务有效期"), - MARRIAGE_BOUNTY_MARRIAGE_VALIDITY_PERIOD(306,"招亲榜-结婚服务有效期"); + MARRIAGE_BOUNTY_MARRIAGE_VALIDITY_PERIOD(306,"招亲榜-结婚服务有效期"), + + //周期保护 红娘升级补差价周期 红娘推荐奖励周期 用户发榜红娘奖励周期 用户升级红娘邀请奖励周期 + MATCHMAKER_UPGRADE_PROTECTION_PERIOD(401,"红娘升级保护周期"), + + MATCHMAKER_RECOMMEND_PROTECTION_PERIOD(402,"红娘推荐奖励保护周期"), + + MARRIAGE_BOUNTY_MATCHMAKER_PROTECTION_PERIOD(403,"发榜红娘奖励保护周期"), + + GUEST_JOIN_MATCHMAKER_RECOMMEND_PROTECTION_PERIOD(404,"嘉宾成为红娘邀请奖励保护周期"); @EnumValue @JsonValue 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 fccda3a..7b58d9f 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 @@ -12,7 +12,6 @@ import lombok.EqualsAndHashCode; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; -import java.time.chrono.ChronoLocalDateTime; @Data @EqualsAndHashCode(callSuper = true) @@ -57,7 +56,7 @@ public class RewardConfig extends Entity { } } - public LocalDateTime getRefundableTime(LocalDateTime time) { + public LocalDateTime getPeriodTime(LocalDateTime time) { return time.plusMonths(Long.parseLong(value)); } } 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 0dcdcde..945f57e 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 @@ -70,4 +70,13 @@ public class OrderUserCommandController { @RequestParam("userId") Long userId) { return orderApplicationService.submitSiteActivityOrder(dto, userId); } + + @ApiOperation("用户提交红娘订单") + @PostMapping("submit/matchmaker-order") + public UserSubmitOrderVo userSubmitMatchMakerOrder(@RequestBody @Valid UserSubmitMatchMakerOrderDto dto, + @RequestParam("userId") Long userId) { + Order order = dto.trans2Domain(); + order.setUserId(userId); + return orderApplicationService.submitMatchMakerOrder(order, dto.getMatchmakerOrderType()); + } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/order/user/request/UserSubmitMatchMakerOrderDto.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/order/user/request/UserSubmitMatchMakerOrderDto.java new file mode 100644 index 0000000..dcac57e --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/order/user/request/UserSubmitMatchMakerOrderDto.java @@ -0,0 +1,40 @@ +package com.qniao.dam.api.command.order.user.request; + +import com.qniao.dam.domain.aggregate.order.entity.Order; +import com.qniao.dam.domain.aggregate.order.entity.OrderItem; +import com.qniao.dam.domian.aggregate.order.constant.MatchmakerOrderTypeEnum; +import com.qniao.domain.Trans2DomainAssembler; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.ArrayList; +import java.util.List; + +@Data +public class UserSubmitMatchMakerOrderDto implements Trans2DomainAssembler { + + @ApiModelProperty("征婚资料标识") + private Long miId; + + @ApiModelProperty("产品规格标识") + @NotNull(message = "产品规格标识不能为空") + private Long productSpecId; + + @ApiModelProperty("红娘订单类型") + @NotNull(message = "红娘订单类型不能为空") + private MatchmakerOrderTypeEnum matchmakerOrderType; + + @Override + public Order trans2Domain() { + Order order = new Order(); + order.setMiId(miId); + List orderItemList = new ArrayList<>(); + OrderItem orderItem = new OrderItem(); + orderItem.setProductSpecId(productSpecId); + orderItem.setQuantity(1); + orderItemList.add(orderItem); + order.setOrderItemList(orderItemList); + return order; + } +} 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 1b7e577..a90be1d 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 @@ -25,6 +25,7 @@ import com.qniao.dam.domian.aggregate.marriagebount.constant.MarriageBountyOrder import com.qniao.dam.domian.aggregate.marriagebount.constant.MarriageBountyOrderStatusEnum; import com.qniao.dam.domian.aggregate.marriagebount.constant.MarriageBountyOrderVersion; import com.qniao.dam.domian.aggregate.marriagebount.constant.PublishIdentityTypeEnum; +import com.qniao.dam.domian.aggregate.order.constant.MatchmakerOrderTypeEnum; import com.qniao.dam.domian.aggregate.order.constant.OrderBelongingEnum; import com.qniao.dam.domian.aggregate.order.constant.OrderTypeEnum; import com.qniao.dam.domian.aggregate.product.constant.ProductSubCategoryEnum; @@ -56,6 +57,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -438,4 +440,72 @@ public class OrderApplicationService extends BaseApplicationService { } }); } + + /** + * 红娘订单 + * + * @param order + * @param matchmakerOrderType + * @return + */ + public UserSubmitOrderVo submitMatchMakerOrder(Order order, + MatchmakerOrderTypeEnum matchmakerOrderType) { + //1. 填充订单信息 + 同类型权益,不同规格,限制购买和提醒 + fillOrderInfo(order); + //2. 订单金额计算 + countMatchMakerOrderAmount(order, matchmakerOrderType); + //3. 设置订单号 + order.setOrderCode(snowFlakeUtil.getSnowflakeOrderCode()); + //4. 组织付款单信息 + PaymentOrder paymentOrder = makePaymentOrder(order); + submitOrderDomainService.handle(order, paymentOrder); + return new UserSubmitOrderVo(order.getId(), paymentOrder.getId(), false); + } + + private void countMatchMakerOrderAmount(Order order, + MatchmakerOrderTypeEnum matchmakerOrderType) { + if (CollUtil.isNotEmpty(order.getOrderItemList())) { + BigDecimal totalOriginalAmount = BigDecimal.ZERO; + BigDecimal totalDiscountAmount = BigDecimal.ZERO; + BigDecimal totalSettlementAmount = BigDecimal.ZERO; + for (OrderItem orderItem : order.getOrderItemList()) { + if (MatchmakerOrderTypeEnum.JOIN.equals(matchmakerOrderType)) { + orderItem.setOriginalAmount(orderItem.getUnitOriginalPrice().multiply(BigDecimal.valueOf(orderItem.getQuantity()))); + orderItem.setDiscountAmount(BigDecimal.ZERO); + orderItem.setSettlementAmount(orderItem.getOriginalAmount()); + totalOriginalAmount = totalOriginalAmount.add(orderItem.getOriginalAmount()); + totalSettlementAmount = totalSettlementAmount.add(orderItem.getSettlementAmount()); + totalDiscountAmount = totalDiscountAmount.add(orderItem.getDiscountAmount()); + } else if (MatchmakerOrderTypeEnum.UPGRADE.equals(matchmakerOrderType)) { + //红娘升级 + Matchmaker matchmaker = matchmakerQueryService.queryByUserId(order.getUserId()); + if (Objects.isNull(matchmaker)) { + throw new BizException("没有查询到红娘信息"); + } else { + orderItem.setOriginalAmount(orderItem.getUnitOriginalPrice().multiply(BigDecimal.valueOf(orderItem.getQuantity()))); + BigDecimal discountAmount = BigDecimal.ZERO; + //红娘升级补差价周期 + RewardConfig rewardConfig = rewardConfigQueryService.queryByRewardType(RewardTypeEnum.MATCHMAKER_UPGRADE_PROTECTION_PERIOD); + if (Objects.nonNull(rewardConfig)) { + //仍在保护期内则红娘升级补充差价 + if (LocalDateTime.now().isBefore(rewardConfig.getPeriodTime(matchmaker.getCreateTime()))) { + discountAmount = matchmaker.getFranchiseFee(); + } + } + orderItem.setDiscountAmount(discountAmount); + orderItem.setSettlementAmount(orderItem.getOriginalAmount().subtract(discountAmount)); + totalOriginalAmount = totalOriginalAmount.add(orderItem.getOriginalAmount()); + totalSettlementAmount = totalSettlementAmount.add(orderItem.getSettlementAmount()); + totalDiscountAmount = totalDiscountAmount.add(orderItem.getDiscountAmount()); + } + } + } + order.setOriginalAmount(totalOriginalAmount); + order.setDiscountAmount(totalDiscountAmount); + order.setSettlementAmount(totalSettlementAmount); + if (order.getSettlementAmount().compareTo(BigDecimal.ZERO) <= 0) { + throw new BizException("订单金额应该大于0"); + } + } + } } 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 7890d02..dfece36 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 @@ -85,7 +85,7 @@ public class MarriageBountyOrderQueryServiceImpl implements MarriageBountyOrderQ if (!management) { RewardTypeEnum rewardType = marriageBountyOrder.getValidityPeriodType(); RewardConfig rewardConfig = rewardConfigQueryService.queryByRewardType(rewardType); - if (Objects.nonNull(rewardConfig) && LocalDateTime.now().isBefore(rewardConfig.getRefundableTime(marriageBountyOrder.getCreateTime()))) { + if (Objects.nonNull(rewardConfig) && LocalDateTime.now().isBefore(rewardConfig.getPeriodTime(marriageBountyOrder.getCreateTime()))) { refundInfoVo.setRefundable(false); //补充因有效期原因无法撤销原因 悬赏-包牵手(6月)正在服务中,无法撤销,如有疑问或特殊情况请联系客服处理; refundInfoVo.setNonRefundableReason(marriageBountyOrder.getType().getDesc() + "(" + rewardConfig.getValue() + "月)"