| | |
| | | int limit = Math.min(Math.max(size, 1), HuifuSettlementRecordGateway.PROVIDER_MAX_PAGE_SIZE); |
| | | for (Map.Entry<String, List<Map<String, Object>>> entry : merchantsByHuifuId.entrySet()) { |
| | | String huifuId = entry.getKey(); |
| | | String label = sharedMerchantLabel(entry.getValue()); |
| | | List<String> names = merchantNames(entry.getValue()); |
| | | // 一格放不下几家商家的名字(7 家共用就是 50 多个字符),所以格子只写「共用收款主体(N 家)」, |
| | | // 具体是哪几家随行返回给前端做悬停提示——「信息不丢」和「一眼看得懂」两样都要。 |
| | | String label = names.size() == 1 ? names.get(0) : "共用收款主体(" + names.size() + " 家)"; |
| | | try { |
| | | HuifuSettlementRecordGateway.SettlementRecords response = |
| | | settlementRecordGateway.query(huifuId, beginDate, endDate, limit); |
| | |
| | | failures.add(label + ":" + response.message()); |
| | | continue; |
| | | } |
| | | for (Map<String, Object> record : decode(response.rawRecords(), entry.getValue().get(0), label)) { |
| | | for (Map<String, Object> record : decode(response.rawRecords(), entry.getValue().get(0), label, names)) { |
| | | if (matchesStatus(record, status)) records.add(record); |
| | | } |
| | | } catch (RuntimeException exception) { |
| | |
| | | } |
| | | |
| | | /** |
| | | * 这一行显示成哪家的。 |
| | | * 这一个商户号下、本次结果里涉及到的商家名(按商家 id 升序、去重)。 |
| | | * |
| | | * <p>一个商户号可以被多家商家共用(连锁各门店各是一个独立商家,共用一个收款主体),而流水属于 |
| | | * 商户号、不属于其中任何一家。只说第一家会误导,只留一个名字又像把别家漏了,所以共用时把商家名 |
| | | * 都列出来并注明共用;只有一家时就照常显示那一家。 |
| | | * <p>一个商户号可以被多家商家共用(连锁各门店各是一个独立商家,共用一个收款主体),流水属于商户号、 |
| | | * 不属于其中任何一家。所以格子写成「共用收款主体(N 家)」、名单随行带上给前端做悬停提示—— |
| | | * 只说第一家会误导,只留一个名字又像把别家漏了。 |
| | | */ |
| | | private static String sharedMerchantLabel(List<Map<String, Object>> merchants) { |
| | | List<String> names = merchants.stream().map(merchant -> String.valueOf(merchant.get("merchantName"))) |
| | | private static List<String> merchantNames(List<Map<String, Object>> merchants) { |
| | | return merchants.stream().map(merchant -> String.valueOf(merchant.get("merchantName"))) |
| | | .distinct().toList(); |
| | | return names.size() == 1 ? names.get(0) : String.join("、", names) + "(共用收款主体)"; |
| | | } |
| | | |
| | | /** 把通道返回的结算记录 JSON 转成后台要展示的字段;只读展示,不做金额换算以外的加工。 */ |
| | | private List<Map<String, Object>> decode(String rawRecords, Map<String, Object> merchant, String merchantLabel) { |
| | | private List<Map<String, Object>> decode(String rawRecords, Map<String, Object> merchant, String merchantLabel, |
| | | List<String> merchantNames) { |
| | | List<Map<String, Object>> decoded = new ArrayList<>(); |
| | | if (rawRecords == null || rawRecords.isBlank()) return decoded; |
| | | List<Map<String, Object>> parsed; |
| | |
| | | for (Map<String, Object> record : parsed) { |
| | | Map<String, Object> row = new LinkedHashMap<>(); |
| | | row.put("merchantId", merchant.get("merchantId")); |
| | | // 商家名取聚合出来的那个标签:几家共用同一个商户号时,这一条流水是所有共用商家一起的。 |
| | | // 商家名取聚合出来的那个标签:几家共用同一个商户号时,这一条流水是所有共用商家一起的; |
| | | // 名单一并带上,前端悬停时列出来(格子里放不下那么多字)。 |
| | | row.put("merchantName", merchantLabel); |
| | | row.put("merchantNames", merchantNames); |
| | | row.put("storeName", merchant.get("storeName")); |
| | | row.put("providerTransactionNo", record.get("trans_id")); |
| | | row.put("settleDate", record.get("trans_date")); |