liujie
2026-08-04 e9e42b621afdf6ac94f5327ee843b32b10a401b4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package com.tourguide.api.admin;
 
import com.tourguide.common.api.ApiResponse;
import com.tourguide.common.api.PageResponse;
import com.tourguide.modules.user.dto.*;
import com.tourguide.modules.user.service.GuideUserService;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.time.LocalDate;
import java.util.List;
 
/**
 * 管理后台导游账号管理接口。
 * 数据保存于 guide_user 独立表,支持资料维护、停启、白名单及自动禁用规则配置。
 */
@RestController
@RequestMapping("/api/admin/guide-users")
public class AdminGuideUserController {
    private final GuideUserService userService;
    public AdminGuideUserController(GuideUserService userService) { this.userService = userService; }
 
    /**
     * 分页查询导游账号,支持基础关键字、状态、日期、评级、团队类型和白名单筛选。
     *
     * @param page 页码,从 1 开始
     * @param size 每页记录数
     * @param keyword 导游姓名、手机号等关键字
     * @param status 账号启用状态
     * @param startDate 注册日期起始值,包含当天
     * @param endDate 注册日期结束值,包含当天
     * @param ratingLevel 导游评级筛选条件
     * @param teamType 团队归属类型筛选条件
     * @param whitelisted 是否加入自动禁用白名单
     * @return 导游账号分页结果
     */
    @GetMapping
    public ApiResponse<PageResponse<GuideUserResponse>> page(@RequestParam(defaultValue = "1") long page,
                                                             @RequestParam(defaultValue = "10") long size,
                                                             @RequestParam(required = false) String keyword,
                                                             @RequestParam(required = false) Integer status,
                                                             @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate,
                                                             @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate,
                                                             @RequestParam(required = false) String ratingLevel,
                                                             @RequestParam(required = false) String teamType,
                                                             @RequestParam(required = false) Boolean whitelisted) {
        return ApiResponse.success(userService.page(page, size, keyword, status, startDate, endDate,
                ratingLevel, teamType, whitelisted));
    }
 
    /**
     * 查询指定导游的基础资料、团队归属和景区服务配置。
     *
     * @param id 导游账号主键
     * @return 导游完整详情
     */
    @GetMapping("/{id}")
    public ApiResponse<GuideUserDetailResponse> detail(@PathVariable Long id) {
        return ApiResponse.success(userService.detail(id));
    }
 
    /**
     * 更新指定导游的后台可维护资料及业务配置。
     *
     * @param id 导游账号主键
     * @param request 导游资料和配置更新参数
     * @return 更新后的导游详情
     */
    @PutMapping("/{id}")
    public ApiResponse<GuideUserDetailResponse> updateDetail(@PathVariable Long id,
                                                             @Valid @RequestBody GuideUserDetailUpdateRequest request) {
        return ApiResponse.success(userService.updateDetail(id, request));
    }
 
    @PostMapping("/{id}/scenic-configs")
    public ApiResponse<List<GuideScenicConfigResponse>> addScenicConfig(
            @PathVariable Long id,
            @Valid @RequestBody GuideScenicConfigCreateRequest request) {
        return ApiResponse.success(userService.addScenicConfig(id, request.getScenicSpotId()));
    }
 
    @DeleteMapping("/{id}/scenic-configs/{configId}")
    public ApiResponse<List<GuideScenicConfigResponse>> deleteScenicConfig(
            @PathVariable Long id,
            @PathVariable Long configId) {
        return ApiResponse.success(userService.deleteScenicConfig(id, configId));
    }
 
    /**
     * 由后台直接创建导游账号,适用于无需走入驻审核流程的运营录入场景。
     *
     * @param request 导游账号创建参数
     * @return 新建导游的基础信息
     */
    @PostMapping
    public ApiResponse<GuideUserResponse> create(@Valid @RequestBody GuideUserCreateRequest request) {
        return ApiResponse.success(userService.create(request));
    }
 
    /**
     * 启用或禁用指定导游账号,禁用后导游无法继续使用导游端受保护接口。
     *
     * @param id 导游账号主键
     * @param request 目标状态,1 为启用、0 为禁用
     * @return 无业务数据的成功响应
     */
    @PutMapping("/{id}/status")
    public ApiResponse<Void> updateStatus(@PathVariable Long id, @Valid @RequestBody UserStatusRequest request) {
        userService.updateStatus(id, request.getStatus());
        return ApiResponse.success();
    }
 
    /**
     * 设置导游是否进入自动禁用白名单,白名单导游不受自动禁用规则影响。
     *
     * @param id 导游账号主键
     * @param request 白名单启用状态
     * @return 无业务数据的成功响应
     */
    @PutMapping("/{id}/whitelist")
    public ApiResponse<Void> updateWhitelist(@PathVariable Long id, @Valid @RequestBody GuideWhitelistRequest request) {
        userService.updateWhitelist(id, request.getEnabled());
        return ApiResponse.success();
    }
 
    /**
     * 查询当前导游自动禁用规则配置,供后台设置页面回显。
     *
     * @return 自动禁用开关、阈值及相关规则参数
     */
    @GetMapping("/auto-disable/config")
    public ApiResponse<GuideAutoDisableConfigResponse> autoDisableConfig() {
        return ApiResponse.success(userService.getAutoDisableConfig());
    }
 
    /**
     * 更新导游自动禁用规则,后续自动处理任务按最新配置执行。
     *
     * @param request 自动禁用开关和阈值配置
     * @return 保存后的自动禁用配置
     */
    @PutMapping("/auto-disable/config")
    public ApiResponse<GuideAutoDisableConfigResponse> updateAutoDisableConfig(
            @Valid @RequestBody GuideAutoDisableConfigRequest request) {
        return ApiResponse.success(userService.updateAutoDisableConfig(request));
    }
}