liujie
2026-07-30 280ef5100bece9b40ac51736aef037704a52a4ca
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
package com.tourguide.api.admin;
 
import com.tourguide.common.api.ApiResponse;
import com.tourguide.common.api.PageResponse;
import com.tourguide.modules.operation.dto.ScenicSpotDetailResponse;
import com.tourguide.modules.operation.dto.ScenicSpotDetailSaveRequest;
import com.tourguide.modules.operation.dto.ScenicSpotListResponse;
import com.tourguide.modules.operation.dto.ScenicSpotStatusRequest;
import com.tourguide.modules.operation.service.OperationScenicSpotService;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.time.LocalDate;
 
/**
 * 管理后台运营景区管理接口。
 * 聚合维护景区基础资料、四类讲解价格、地图汇合点和导游接单时间配置。
 */
@RestController
@RequestMapping("/api/admin/operation-scenic-spots")
public class AdminOperationScenicSpotController {
    private final OperationScenicSpotService scenicSpotService;
 
    public AdminOperationScenicSpotController(OperationScenicSpotService scenicSpotService) {
        this.scenicSpotService = scenicSpotService;
    }
 
    /**
     * 分页查询运营景区,支持按景区名称、所属城市、状态和创建日期筛选。
     *
     * @param page 页码,从 1 开始
     * @param size 每页记录数
     * @param keyword 景区名称关键字
     * @param cityId 所属运营城市主键
     * @param status 启用或禁用状态
     * @param startDate 创建日期起始值,包含当天
     * @param endDate 创建日期结束值,包含当天
     * @return 景区及四类优惠价格组成的分页结果
     */
    @GetMapping
    public ApiResponse<PageResponse<ScenicSpotListResponse>> page(
            @RequestParam(defaultValue = "1") long page,
            @RequestParam(defaultValue = "10") long size,
            @RequestParam(required = false) String keyword,
            @RequestParam(required = false) Long cityId,
            @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) {
        return ApiResponse.success(scenicSpotService.page(page, size, keyword, cityId, status, startDate, endDate));
    }
 
    /**
     * 新增景区并在同一事务中保存价格、汇合点和接单时间配置。
     *
     * @param request 景区完整配置
     * @return 新建后的景区完整详情
     */
    @PostMapping
    public ApiResponse<ScenicSpotDetailResponse> create(@Valid @RequestBody ScenicSpotDetailSaveRequest request) {
        return ApiResponse.success(scenicSpotService.create(request));
    }
 
    /**
     * 查询指定景区的基础资料、四类价格、汇合点和接单时间配置。
     *
     * @param id 景区主键
     * @return 景区完整详情
     */
    @GetMapping("/{id}")
    public ApiResponse<ScenicSpotDetailResponse> detail(@PathVariable Long id) {
        return ApiResponse.success(scenicSpotService.detail(id));
    }
 
    /**
     * 聚合更新指定景区的基础资料及全部运营配置。
     * 价格和汇合点按本次提交内容整体替换,调用方应提交完整配置。
     *
     * @param id 景区主键
     * @param request 景区最新完整配置
     * @return 更新后的景区完整详情
     */
    @PutMapping("/{id}")
    public ApiResponse<ScenicSpotDetailResponse> save(@PathVariable Long id,
                                                       @Valid @RequestBody ScenicSpotDetailSaveRequest request) {
        return ApiResponse.success(scenicSpotService.save(id, request));
    }
 
    /**
     * 启用或禁用指定景区,状态变更不删除已有价格和汇合点配置。
     *
     * @param id 景区主键
     * @param request 目标状态,1 为启用、0 为禁用
     * @return 无业务数据的成功响应
     */
    @PutMapping("/{id}/status")
    public ApiResponse<Void> updateStatus(@PathVariable Long id,
                                          @Valid @RequestBody ScenicSpotStatusRequest request) {
        scenicSpotService.updateStatus(id, request.getStatus());
        return ApiResponse.success();
    }
}