| | |
| | | Page<TourOrder> result = orderMapper.selectPage(new Page<TourOrder>(page, size), query); |
| | | PlatformSettingsResponse settings = settingsService.getSettings(); |
| | | Map<Long, GuideUser> guides = loadGuides(result.getRecords()); |
| | | Map<Long, String> teams = loadTeams(guides.values()); |
| | | Map<Long, String> teams = loadTeams(result.getRecords(), guides.values()); |
| | | List<FinanceLedgerResponse> records = result.getRecords().stream() |
| | | .map(order -> toLedger(order, refund, settings, guides.get(order.getGuideId()), teams)) |
| | | .collect(Collectors.toList()); |
| | |
| | | private FinanceLedgerResponse toLedger(TourOrder order, boolean refund, PlatformSettingsResponse settings, |
| | | GuideUser guide, Map<Long, String> teams) { |
| | | BigDecimal amount = refund ? safeAmount(order.getRefundAmount()) : paymentAmount(order); |
| | | BigDecimal commissionRate = settings.getCommissionRate().movePointLeft(2); |
| | | BigDecimal platformIncome = amount.multiply(commissionRate).setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal guideIncome = amount.subtract(platformIncome).setScale(2, RoundingMode.HALF_UP); |
| | | BigDecimal orderAmount = paymentAmount(order); |
| | | BigDecimal guideIncome; |
| | | BigDecimal platformIncome; |
| | | if (order.getGuideEarningAmount() != null) { |
| | | guideIncome = order.getGuideEarningAmount().setScale(2, RoundingMode.HALF_UP); |
| | | platformIncome = orderAmount.subtract(guideIncome).setScale(2, RoundingMode.HALF_UP); |
| | | } else { |
| | | BigDecimal commissionRate = settings.getCommissionRate().movePointLeft(2); |
| | | platformIncome = orderAmount.multiply(commissionRate).setScale(2, RoundingMode.HALF_UP); |
| | | guideIncome = orderAmount.subtract(platformIncome).setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | if (refund) { |
| | | platformIncome = platformIncome.negate(); |
| | | guideIncome = guideIncome.negate(); |
| | |
| | | } |
| | | LocalDateTime settledAt = order.getCompletedAt() == null ? null |
| | | : order.getCompletedAt().plusDays(settings.getSettlementDays()); |
| | | String teamName = guide == null || guide.getTeamId() == null ? "个人导游" : teams.get(guide.getTeamId()); |
| | | Long teamId = order.getCommissionTeamId() != null |
| | | ? order.getCommissionTeamId() |
| | | : guide == null ? null : guide.getTeamId(); |
| | | String teamName = teamId == null ? "个人导游" : teams.get(teamId); |
| | | return new FinanceLedgerResponse(order.getId(), |
| | | refund ? order.getRefundOrderNo() : "IN" + order.getOrderNo(), order.getOrderNo(), |
| | | paymentAmount(order), platformIncome, guideIncome, order.getGuideName(), order.getGuideMobile(), |
| | |
| | | .collect(Collectors.toMap(GuideUser::getId, guide -> guide)); |
| | | } |
| | | |
| | | private Map<Long, String> loadTeams(java.util.Collection<GuideUser> guides) { |
| | | private Map<Long, String> loadTeams(List<TourOrder> orders, java.util.Collection<GuideUser> guides) { |
| | | Set<Long> teamIds = guides.stream().map(GuideUser::getTeamId) |
| | | .filter(id -> id != null).collect(Collectors.toSet()); |
| | | orders.stream().map(TourOrder::getCommissionTeamId) |
| | | .filter(id -> id != null).forEach(teamIds::add); |
| | | if (teamIds.isEmpty()) return new HashMap<Long, String>(); |
| | | return guideTeamMapper.selectBatchIds(teamIds).stream() |
| | | .collect(Collectors.toMap(GuideTeam::getId, GuideTeam::getTeamName)); |