| | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.tcm.training.admin.app.auth.service.AppAuthSessionService; |
| | | import com.tcm.training.admin.app.member.vo.AppMemberPurchaseOrderItemVO; |
| | | import com.tcm.training.admin.common.DateTimes; |
| | | import com.tcm.training.admin.common.PageResponse; |
| | | import com.tcm.training.admin.common.PhoneMasker; |
| | |
| | | private static final String PAYMENT_METHOD_ALIPAY = "ALIPAY"; |
| | | |
| | | private final MemberPurchaseOrderMapper memberPurchaseOrderMapper; |
| | | private final AppAuthSessionService appAuthSessionService; |
| | | |
| | | public MemberPurchaseOrderAppService(MemberPurchaseOrderMapper memberPurchaseOrderMapper) { |
| | | /** |
| | | * 注入会员订单查询能力。 |
| | | */ |
| | | public MemberPurchaseOrderAppService(MemberPurchaseOrderMapper memberPurchaseOrderMapper, |
| | | AppAuthSessionService appAuthSessionService) { |
| | | this.memberPurchaseOrderMapper = memberPurchaseOrderMapper; |
| | | this.appAuthSessionService = appAuthSessionService; |
| | | } |
| | | |
| | | /** |
| | | * 分页查询后台会员购买订单。 |
| | | */ |
| | | public PageResponse<MemberPurchaseOrderListItemVO> page(int page, |
| | | int pageSize, |
| | | String orderNo, |
| | |
| | | return PageResponse.of(toList(result.getRecords()), result.getTotal(), result.getCurrent(), result.getSize()); |
| | | } |
| | | |
| | | /** |
| | | * 分页查询当前登录用户的 APP 会员购买记录。 |
| | | */ |
| | | public PageResponse<AppMemberPurchaseOrderItemVO> appUserPage(int page, int pageSize) { |
| | | Long userId = appAuthSessionService.requireLoginUserId(); |
| | | IPage<MemberPurchaseOrderRow> result = memberPurchaseOrderMapper.selectAppUserOrderPage( |
| | | new Page<MemberPurchaseOrderRow>(page, pageSize), |
| | | userId |
| | | ); |
| | | return PageResponse.of(toAppList(result.getRecords()), result.getTotal(), result.getCurrent(), result.getSize()); |
| | | } |
| | | |
| | | /** |
| | | * 导出后台会员购买订单。 |
| | | */ |
| | | public void export(String orderNo, |
| | | String userPhone, |
| | | String memberType, |
| | |
| | | throw new IllegalArgumentException("退款功能待支付方案确认后接入"); |
| | | } |
| | | |
| | | /** |
| | | * 删除后台已退款会员订单。 |
| | | */ |
| | | @Transactional |
| | | public void delete(Long id) { |
| | | MemberPurchaseOrder order = requireOrder(id); |
| | |
| | | memberPurchaseOrderMapper.deleteById(id); |
| | | } |
| | | |
| | | /** |
| | | * 校验会员购买订单存在。 |
| | | */ |
| | | private MemberPurchaseOrder requireOrder(Long id) { |
| | | MemberPurchaseOrder order = memberPurchaseOrderMapper.selectOne(new LambdaQueryWrapper<MemberPurchaseOrder>() |
| | | .eq(MemberPurchaseOrder::getId, id) |
| | |
| | | return order; |
| | | } |
| | | |
| | | /** |
| | | * 将后台订单查询结果转换为后台列表响应。 |
| | | */ |
| | | private List<MemberPurchaseOrderListItemVO> toList(List<MemberPurchaseOrderRow> rows) { |
| | | List<MemberPurchaseOrderListItemVO> list = new ArrayList<MemberPurchaseOrderListItemVO>(); |
| | | for (MemberPurchaseOrderRow row : rows) { |
| | |
| | | return list; |
| | | } |
| | | |
| | | /** |
| | | * 将订单查询结果转换为 APP 购买记录列表响应。 |
| | | */ |
| | | private List<AppMemberPurchaseOrderItemVO> toAppList(List<MemberPurchaseOrderRow> rows) { |
| | | List<AppMemberPurchaseOrderItemVO> list = new ArrayList<AppMemberPurchaseOrderItemVO>(); |
| | | for (MemberPurchaseOrderRow row : rows) { |
| | | AppMemberPurchaseOrderItemVO item = new AppMemberPurchaseOrderItemVO(); |
| | | item.setId(row.getId()); |
| | | item.setOrderNo(row.getOrderNo()); |
| | | item.setMemberType(row.getMemberType()); |
| | | item.setMemberTypeText(memberTypeText(row.getMemberType())); |
| | | item.setOrderAmount(row.getOrderAmount()); |
| | | item.setPaymentMethod(row.getPaymentMethod()); |
| | | item.setPaymentMethodText(paymentMethodText(row.getPaymentMethod())); |
| | | item.setStatus(row.getStatus()); |
| | | // APP 购买记录页在退款场景下要展示退款金额标签,没有单独退款额时回退订单金额。 |
| | | item.setRefundAmount(resolveRefundAmount(row.getStatus(), row.getOrderAmount(), row.getRefundAmount())); |
| | | item.setShowRefundTag(Boolean.valueOf(STATUS_REFUNDED.equals(row.getStatus()))); |
| | | item.setPaidAt(row.getPaidAt()); |
| | | list.add(item); |
| | | } |
| | | return list; |
| | | } |
| | | |
| | | /** |
| | | * 解析订单应展示的退款金额。 |
| | | */ |
| | | private BigDecimal resolveRefundAmount(String status, BigDecimal orderAmount, BigDecimal refundAmount) { |
| | | if (!STATUS_REFUNDED.equals(status)) { |
| | | return null; |
| | |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * 将空白文本归一化为 null。 |
| | | */ |
| | | private String trimToNull(String value) { |
| | | if (value == null) { |
| | | return null; |
| | |
| | | return trimmed.isEmpty() ? null : trimmed; |
| | | } |
| | | |
| | | /** |
| | | * 缺省文本展示兜底。 |
| | | */ |
| | | private String defaultText(String value) { |
| | | return value == null || value.trim().isEmpty() ? "-" : value.trim(); |
| | | } |
| | | |
| | | /** |
| | | * 将会员天数转换为展示文案。 |
| | | */ |
| | | private String memberDaysText(Integer memberDays) { |
| | | return memberDays == null ? "-" : memberDays + "天"; |
| | | } |
| | | |
| | | /** |
| | | * 将会员类型转换为展示文案。 |
| | | */ |
| | | private String memberTypeText(String memberType) { |
| | | if (MEMBER_TYPE_MONTH_CARD.equals(memberType)) { |
| | | return "月卡"; |
| | | } |
| | | if (MEMBER_TYPE_QUARTER_CARD.equals(memberType)) { |
| | | return "季卡"; |
| | | return "季度会员"; |
| | | } |
| | | return "-"; |
| | | } |
| | | |
| | | /** |
| | | * 将支付方式转换为展示文案。 |
| | | */ |
| | | private String paymentMethodText(String paymentMethod) { |
| | | if (PAYMENT_METHOD_WECHAT.equals(paymentMethod)) { |
| | | return "微信支付"; |
| | |
| | | return "-"; |
| | | } |
| | | |
| | | /** |
| | | * 将订单状态转换为展示文案。 |
| | | */ |
| | | private String statusText(String status) { |
| | | if (STATUS_WAITING_PAYMENT.equals(status)) { |
| | | return "待支付"; |