| | |
| | | public class AdminManagementController { |
| | | private final AdminManagementService service; |
| | | private final MerchantSettlementAdminService settlementService; |
| | | private final MerchantManagedOnboardingService managedOnboardingService; |
| | | private final PaymentReconciliationAdminService reconciliationService; |
| | | private final ProtocolSettingAdminService protocolSettingService; |
| | | public AdminManagementController(AdminManagementService service, MerchantSettlementAdminService settlementService, PaymentReconciliationAdminService reconciliationService, ProtocolSettingAdminService protocolSettingService) { this.service = service; this.settlementService = settlementService; this.reconciliationService = reconciliationService; this.protocolSettingService = protocolSettingService; } |
| | | public AdminManagementController(AdminManagementService service, MerchantSettlementAdminService settlementService, MerchantManagedOnboardingService managedOnboardingService, PaymentReconciliationAdminService reconciliationService, ProtocolSettingAdminService protocolSettingService) { this.service = service; this.settlementService = settlementService; this.managedOnboardingService = managedOnboardingService; this.reconciliationService = reconciliationService; this.protocolSettingService = protocolSettingService; } |
| | | @GetMapping("/settings") public ApiResponse<Map<String,Object>> settings() { return ApiResponse.success(service.settings()); } |
| | | @PutMapping("/settings") public ApiResponse<Map<String,Object>> saveSettings(@RequestBody Map<String,String> body) { return ApiResponse.success(service.saveSettings(body)); } |
| | | @GetMapping("/protocols/{key}") public ApiResponse<Map<String,Object>> protocol(@PathVariable String key) { return ApiResponse.success(protocolSettingService.detail(key)); } |
| | |
| | | @GetMapping("/roles") public ApiResponse<List<Map<String,Object>>> roles() { return ApiResponse.success(service.roles()); } |
| | | @PostMapping("/roles") public ApiResponse<Map<String,Object>> createRole(@Valid @RequestBody AdminRoleRequest request) { return ApiResponse.success(service.createRole(request)); } |
| | | @PutMapping("/roles/{id}") public ApiResponse<Map<String,Object>> updateRole(@PathVariable Long id, @Valid @RequestBody AdminRoleRequest request) { return ApiResponse.success(service.updateRole(id, request)); } |
| | | @PatchMapping("/roles/{id}/status") public ApiResponse<Map<String,Object>> updateRoleStatus(@PathVariable Long id, @Valid @RequestBody AdminRoleStatusRequest request) { return ApiResponse.success(service.updateRoleStatus(id, request.status())); } |
| | | @DeleteMapping("/roles/{id}") public ApiResponse<Map<String,Object>> deleteRole(@PathVariable Long id) { return ApiResponse.success(service.deleteRole(id)); } |
| | | @GetMapping("/staff") public ApiResponse<List<Map<String,Object>>> staff() { return ApiResponse.success(service.staff()); } |
| | | @GetMapping("/staff/account-available") public ApiResponse<Map<String,Object>> staffAccountAvailable(@RequestParam String account) { return ApiResponse.success(service.staffAccountAvailable(account)); } |
| | | @PostMapping("/staff") public ApiResponse<Map<String,Object>> createStaff(@Valid @RequestBody AdminStaffRequest request) { return ApiResponse.success(service.createStaff(request)); } |
| | | @PutMapping("/staff/{id}") public ApiResponse<Map<String,Object>> updateStaff(@PathVariable Long id, @Valid @RequestBody AdminStaffRequest request) { return ApiResponse.success(service.updateStaff(id, request)); } |
| | | @PatchMapping("/staff/{id}/password") public ApiResponse<Map<String,Object>> resetStaffPassword(@PathVariable Long id, @RequestBody Map<String,String> body) { return ApiResponse.success(service.resetStaffPassword(id, body.get("password"))); } |
| | | @DeleteMapping("/staff/{id}") public ApiResponse<Map<String,Object>> deleteStaff(@PathVariable Long id) { return ApiResponse.success(service.deleteStaff(id)); } |
| | | @GetMapping("/merchant-settlement/onboardings") public ApiResponse<com.talentcard.server.business.PageResult<Map<String,Object>>> onboardings(@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "20") int size, @RequestParam(required = false) String merchantName, @RequestParam(required = false) String contactMobile, @RequestParam(required = false) String merchantType, @RequestParam(required = false) String status, @RequestParam(required = false) String startDate, @RequestParam(required = false) String endDate) { return ApiResponse.success(settlementService.onboardings(page, size, merchantName, contactMobile, merchantType, status, startDate, endDate)); } |
| | | @GetMapping("/merchant-settlement/onboardings/{id}") public ApiResponse<Map<String,Object>> onboarding(@PathVariable Long id) { return ApiResponse.success(settlementService.onboarding(id)); } |
| | | @GetMapping("/merchant-settlement/onboardings/{id}/progress") public ApiResponse<Map<String,Object>> onboardingProgress(@PathVariable Long id) { return ApiResponse.success(settlementService.onboardingProgress(id)); } |
| | | @PostMapping("/merchant-settlement/onboardings/{id}/progress/refresh") public ApiResponse<Map<String,Object>> refreshOnboarding(@PathVariable Long id, @RequestParam(defaultValue = "false") boolean retry) { return ApiResponse.success(settlementService.refreshOnboarding(id, retry)); } |
| | | @PostMapping("/merchant-settlement/onboardings/{id}/realname") public ApiResponse<Map<String,Object>> submitRealname(@PathVariable Long id, @RequestParam(defaultValue = "false") boolean retry) { return ApiResponse.success(settlementService.submitRealname(id, retry)); } |
| | | @GetMapping("/merchant-settlement/onboardings/{id}/payment-capability") public ApiResponse<Map<String,Object>> paymentCapability(@PathVariable Long id) { return ApiResponse.success(settlementService.paymentCapability(id)); } |
| | | @PostMapping("/merchant-settlement/onboardings/{id}/payment-capability/refresh") public ApiResponse<Map<String,Object>> refreshPaymentCapability(@PathVariable Long id) { return ApiResponse.success(settlementService.refreshPaymentCapability(id)); } |
| | | /** |
| | | * 纳管:把已在汇付侧完成进件的外部商户接到我方某个商家上。 |
| | | * |
| | | * <p>前置核验是**只读**的通道查询,把要人工核对的商户注册名称、商户简称、主体类型与结算卡取回来; |
| | | * 运营核对并显式确认后走 {@code managed} 提交。两者都挂在既有的 {@code onboardings} 前缀下, |
| | | * 权限沿用 {@code admin.merchant-settlement.edit}(GET 为 view、其余为 edit),不新增权限码。 |
| | | */ |
| | | @PostMapping("/merchant-settlement/onboardings/managed/preview") public ApiResponse<Map<String,Object>> previewManagedOnboarding(@RequestBody MerchantManagedOnboardingRequest request) { return ApiResponse.success(managedOnboardingService.preview(request.merchantId(), request.providerHuifuId())); } |
| | | @PostMapping("/merchant-settlement/onboardings/managed") public ApiResponse<Map<String,Object>> adoptManagedOnboarding(@RequestBody MerchantManagedOnboardingRequest request) { return ApiResponse.success(managedOnboardingService.adopt(request.merchantId(), request.providerHuifuId(), request.providerApplyNo(), Boolean.TRUE.equals(request.confirmed()))); } |
| | | /** 解绑:只解除我方绑定,只清理这条纳管产生的进件与结算卡记录,不回退通道侧的任何改动。 */ |
| | | @PostMapping("/merchant-settlement/onboardings/{id}/unbind") public ApiResponse<Map<String,Object>> unbindManagedOnboarding(@PathVariable Long id) { return ApiResponse.success(managedOnboardingService.unbind(id)); } |
| | | @GetMapping("/merchant-settlement/bank-cards") public ApiResponse<com.talentcard.server.business.PageResult<Map<String,Object>>> bankCards(@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "20") int size, @RequestParam(required = false) String merchantName, @RequestParam(required = false) String contactMobile, @RequestParam(required = false) String merchantType, @RequestParam(required = false) String status, @RequestParam(required = false) String startDate, @RequestParam(required = false) String endDate) { return ApiResponse.success(settlementService.bankCards(page, size, merchantName, contactMobile, merchantType, status, startDate, endDate)); } |
| | | @GetMapping("/merchant-settlement/withdrawals") public ApiResponse<com.talentcard.server.business.PageResult<Map<String,Object>>> withdrawals(@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "20") int size, @RequestParam(required = false) String merchantName, @RequestParam(required = false) String contactMobile, @RequestParam(required = false) String merchantType, @RequestParam(required = false) String status, @RequestParam(required = false) String startDate, @RequestParam(required = false) String endDate) { return ApiResponse.success(settlementService.withdrawals(page, size, merchantName, contactMobile, merchantType, status, startDate, endDate)); } |
| | | /** |
| | | * 结算记录:向斗拱查询指定区间的真实结算流水,用于监控每天自动结算了多少到银行卡。 |
| | | * 日期格式 yyyyMMdd,默认最近 30 天;通道单页上限 50,默认值必须落在上限内。 |
| | | * 商家、联系电话、商家类型按本地商户字段先筛掉不匹配的商户(顺带少打几次通道), |
| | | * 状态是通道的流水结算状态(S 已结算 / F 失败 / P 处理中)。 |
| | | */ |
| | | /** |
| | | * 商家类型筛选项。挂在结算页自己的前缀下,页面下拉直接拉这份,避免前端再维护一份会漂移的清单。 |
| | | */ |
| | | @GetMapping("/merchant-settlement/merchant-types") public ApiResponse<List<String>> merchantTypes() { return ApiResponse.success(settlementService.merchantTypes()); } |
| | | @GetMapping("/merchant-settlement/settlements") public ApiResponse<Map<String,Object>> settlements(@RequestParam(required = false) String beginDate, @RequestParam(required = false) String endDate, @RequestParam(defaultValue = "50") int size, @RequestParam(required = false) String merchantName, @RequestParam(required = false) String contactMobile, @RequestParam(required = false) String merchantType, @RequestParam(required = false) String status) { |
| | | java.time.LocalDate today = java.time.LocalDate.now(); |
| | | String end = (endDate == null || endDate.isBlank()) ? today.format(java.time.format.DateTimeFormatter.BASIC_ISO_DATE) : endDate.trim(); |
| | | String begin = (beginDate == null || beginDate.isBlank()) ? today.minusDays(30).format(java.time.format.DateTimeFormatter.BASIC_ISO_DATE) : beginDate.trim(); |
| | | return ApiResponse.success(settlementService.settlements(begin, end, size, merchantName, contactMobile, merchantType, status)); |
| | | } |
| | | @GetMapping("/payment-reconciliation/issues") public ApiResponse<com.talentcard.server.business.PageResult<Map<String,Object>>> reconciliationIssues(@RequestParam(defaultValue = "open") String status, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "20") int size) { return ApiResponse.success(reconciliationService.issues(status, page, size)); } |
| | | @PatchMapping("/payment-reconciliation/issues/{id}") public ApiResponse<Map<String,Object>> closeReconciliationIssue(@PathVariable Long id, @RequestBody Map<String,String> body) { return ApiResponse.success(reconciliationService.close(id, body.get("status"), body.get("operator"))); } |
| | | @PostMapping("/payment-reconciliation/run") public ApiResponse<Map<String,Object>> runPaymentReconciliation(@RequestParam(defaultValue = "5") int pendingAfterMinutes) { return ApiResponse.success(reconciliationService.run(pendingAfterMinutes)); } |