liujie
2026-09-14 a910819c1853081735356c7a2c5e05a2953602ab
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
package com.tourguide.modules.operation.service;
 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tourguide.common.api.PageResponse;
import com.tourguide.common.exception.BusinessException;
import com.tourguide.modules.operation.dto.CityResponse;
import com.tourguide.modules.operation.entity.OperationCity;
import com.tourguide.modules.operation.mapper.OperationCityMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.time.LocalDate;
import java.util.List;
import java.util.stream.Collectors;
 
/** 运营城市查询、新建和状态管理服务。 */
@Service
public class OperationCityService {
    private final OperationCityMapper cityMapper;
 
    public OperationCityService(OperationCityMapper cityMapper) {
        this.cityMapper = cityMapper;
    }
 
    public PageResponse<CityResponse> page(long page, long size, String keyword, Integer status,
                                           LocalDate startDate, LocalDate endDate) {
        LambdaQueryWrapper<OperationCity> query = new LambdaQueryWrapper<OperationCity>();
        query.like(StringUtils.hasText(keyword), OperationCity::getCityName,
                        StringUtils.hasText(keyword) ? keyword.trim() : null)
                .eq(status != null, OperationCity::getStatus, status)
                .ge(startDate != null, OperationCity::getCreatedAt, startDate == null ? null : startDate.atStartOfDay())
                .lt(endDate != null, OperationCity::getCreatedAt, endDate == null ? null : endDate.plusDays(1).atStartOfDay())
                .orderByDesc(OperationCity::getId);
        Page<OperationCity> result = cityMapper.selectPage(new Page<OperationCity>(page, size), query);
        return new PageResponse<CityResponse>(
                result.getRecords().stream().map(CityResponse::from).collect(Collectors.toList()),
                result.getTotal(), result.getCurrent(), result.getSize());
    }
 
    public List<CityResponse> enabledOptions() {
        return cityMapper.selectList(new LambdaQueryWrapper<OperationCity>()
                        .eq(OperationCity::getStatus, 1)
                        .orderByAsc(OperationCity::getCityName))
                .stream().map(CityResponse::from).collect(Collectors.toList());
    }
 
    @Transactional
    public CityResponse create(String cityName) {
        String normalizedName = cityName.trim();
        if (cityMapper.selectCount(new LambdaQueryWrapper<OperationCity>()
                .eq(OperationCity::getCityName, normalizedName)) > 0) {
            throw new BusinessException(409, "城市名称已存在");
        }
        OperationCity city = new OperationCity();
        city.setCityName(normalizedName);
        city.setStatus(1);
        city.setDeleted(0);
        cityMapper.insert(city);
        return CityResponse.from(city);
    }
 
    @Transactional
    public void updateStatus(Long id, Integer status) {
        OperationCity city = cityMapper.selectById(id);
        if (city == null) { throw new BusinessException(404, "城市不存在"); }
        city.setStatus(status);
        cityMapper.updateById(city);
    }
}