Эх сурвалжийг харах

feat 新增城市经纬度列表查询接口

classic_blue 4 сар өмнө
parent
commit
7b6a1b815f

+ 24 - 0
application-webadmin/src/main/java/com/tourism/webadmin/app/wechat/controller/WechatMapController.java

@@ -4,10 +4,15 @@ import cn.dev33.satoken.annotation.SaIgnore;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.tourism.common.core.object.ResponseResult;
+import com.tourism.common.core.util.MyModelUtil;
 import com.tourism.webadmin.app.wechat.dto.MapDto;
+import com.tourism.webadmin.back.model.TourMapData;
+import com.tourism.webadmin.back.service.TourMapDataService;
+import com.tourism.webadmin.back.vo.TourMapDataVo;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.validation.Valid;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -31,6 +36,10 @@ public class WechatMapController {
     public static String SEARCHPOI = "http://restapi.amap.com/v3/place/text?";
 
     public static String AK = "3f9549681920d6d9c504fa73186c416e";
+
+    @Autowired
+    public TourMapDataService tourMapDataService;
+
     /**
      * 逆地理解析接口
      */
@@ -196,4 +205,19 @@ public class WechatMapController {
         System.out.println("AK: " + buffer.toString());
         return buffer.toString();
     }
+
+
+    /**
+     * 城市定位接口
+     */
+    @SaIgnore
+    @GetMapping("searchCity")
+    public ResponseResult<List<TourMapDataVo>> searchCity() throws Exception{
+
+        List<TourMapData> list = tourMapDataService.getTourMapDataList(null, null);
+
+        List<TourMapDataVo> vos = MyModelUtil.copyCollectionTo(list, TourMapDataVo.class);
+
+        return ResponseResult.success(vos);
+    }
 }

+ 240 - 0
application-webadmin/src/main/java/com/tourism/webadmin/back/controller/TourMapDataController.java

@@ -0,0 +1,240 @@
+package com.tourism.webadmin.back.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.tourism.common.log.annotation.OperationLog;
+import com.tourism.common.log.model.constant.SysOperationLogType;
+import com.github.pagehelper.page.PageMethod;
+import com.tourism.webadmin.back.vo.*;
+import com.tourism.webadmin.back.dto.*;
+import com.tourism.webadmin.back.model.*;
+import com.tourism.webadmin.back.service.*;
+import com.tourism.common.core.object.*;
+import com.tourism.common.core.util.*;
+import com.tourism.common.core.constant.*;
+import com.tourism.common.core.annotation.MyRequestBody;
+import com.tourism.common.additional.config.ApplicationConfig;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * 城市定位管理操作控制器类。
+ *
+ * @author 吃饭睡觉
+ * @date 2024-09-06
+ */
+@Tag(name = "城市定位管理管理接口")
+@Slf4j
+@RestController
+@RequestMapping("/admin/app/tourMapData")
+public class TourMapDataController {
+
+    @Autowired
+    private ApplicationConfig appConfig;
+    @Autowired
+    private TourMapDataService tourMapDataService;
+
+    /**
+     * 新增城市定位管理数据。
+     *
+     * @param tourMapDataDto 新增对象。
+     * @return 应答结果对象,包含新增对象主键Id。
+     */
+    @ApiOperationSupport(ignoreParameters = {"tourMapDataDto.id", "tourMapDataDto.searchString"})
+    @SaCheckPermission("tourMapData.add")
+    @OperationLog(type = SysOperationLogType.ADD)
+    @PostMapping("/add")
+    public ResponseResult<String> add(@MyRequestBody TourMapDataDto tourMapDataDto) {
+        String errorMessage = MyCommonUtil.getModelValidationError(tourMapDataDto, false);
+        if (errorMessage != null) {
+            return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
+        }
+        TourMapData tourMapData = MyModelUtil.copyTo(tourMapDataDto, TourMapData.class);
+        tourMapData = tourMapDataService.saveNew(tourMapData);
+        return ResponseResult.success(tourMapData.getId());
+    }
+
+    /**
+     * 更新城市定位管理数据。
+     *
+     * @param tourMapDataDto 更新对象。
+     * @return 应答结果对象。
+     */
+    @ApiOperationSupport(ignoreParameters = {"tourMapDataDto.searchString"})
+    @SaCheckPermission("tourMapData.update")
+    @OperationLog(type = SysOperationLogType.UPDATE)
+    @PostMapping("/update")
+    public ResponseResult<Void> update(@MyRequestBody TourMapDataDto tourMapDataDto) {
+        String errorMessage = MyCommonUtil.getModelValidationError(tourMapDataDto, true);
+        if (errorMessage != null) {
+            return ResponseResult.error(ErrorCodeEnum.DATA_VALIDATED_FAILED, errorMessage);
+        }
+        TourMapData tourMapData = MyModelUtil.copyTo(tourMapDataDto, TourMapData.class);
+        TourMapData originalTourMapData = tourMapDataService.getById(tourMapData.getId());
+        if (originalTourMapData == null) {
+            // NOTE: 修改下面方括号中的话述
+            errorMessage = "数据验证失败,当前 [数据] 并不存在,请刷新后重试!";
+            return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
+        }
+        if (!tourMapDataService.update(tourMapData, originalTourMapData)) {
+            return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST);
+        }
+        return ResponseResult.success();
+    }
+
+    /**
+     * 删除城市定位管理数据。
+     *
+     * @param id 删除对象主键Id。
+     * @return 应答结果对象。
+     */
+    @SaCheckPermission("tourMapData.delete")
+    @OperationLog(type = SysOperationLogType.DELETE)
+    @PostMapping("/delete")
+    public ResponseResult<Void> delete(@MyRequestBody String id) {
+        if (MyCommonUtil.existBlankArgument(id)) {
+            return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
+        }
+        return this.doDelete(id);
+    }
+
+    /**
+     * 批量删除城市定位管理数据。
+     *
+     * @param idList 待删除对象的主键Id列表。
+     * @return 应答结果对象。
+     */
+    @SaCheckPermission("tourMapData.delete")
+    @OperationLog(type = SysOperationLogType.DELETE_BATCH)
+    @PostMapping("/deleteBatch")
+    public ResponseResult<Void> deleteBatch(@MyRequestBody List<String> idList) {
+        if (MyCommonUtil.existBlankArgument(idList)) {
+            return ResponseResult.error(ErrorCodeEnum.ARGUMENT_NULL_EXIST);
+        }
+        for (String id : idList) {
+            ResponseResult<Void> responseResult = this.doDelete(id);
+            if (!responseResult.isSuccess()) {
+                return responseResult;
+            }
+        }
+        return ResponseResult.success();
+    }
+
+    /**
+     * 列出符合过滤条件的城市定位管理列表。
+     *
+     * @param tourMapDataDtoFilter 过滤对象。
+     * @param orderParam 排序参数。
+     * @param pageParam 分页参数。
+     * @return 应答结果对象,包含查询结果集。
+     */
+    @SaCheckPermission("tourMapData.view")
+    @PostMapping("/list")
+    public ResponseResult<MyPageData<TourMapDataVo>> list(
+            @MyRequestBody TourMapDataDto tourMapDataDtoFilter,
+            @MyRequestBody MyOrderParam orderParam,
+            @MyRequestBody MyPageParam pageParam) {
+        if (pageParam != null) {
+            PageMethod.startPage(pageParam.getPageNum(), pageParam.getPageSize(), pageParam.getCount());
+        }
+        TourMapData tourMapDataFilter = MyModelUtil.copyTo(tourMapDataDtoFilter, TourMapData.class);
+        String orderBy = MyOrderParam.buildOrderBy(orderParam, TourMapData.class);
+        List<TourMapData> tourMapDataList =
+                tourMapDataService.getTourMapDataListWithRelation(tourMapDataFilter, orderBy);
+        return ResponseResult.success(MyPageUtil.makeResponseData(tourMapDataList, TourMapDataVo.class));
+    }
+
+    /**
+     * 导入主表数据列表。
+     *
+     * @param importFile 上传的文件,目前仅仅支持xlsx和xls两种格式。
+     * @return 应答结果对象。
+     */
+    @SaCheckPermission("tourMapData.import")
+    @OperationLog(type = SysOperationLogType.IMPORT)
+    @PostMapping("/import")
+    public ResponseResult<Void> importBatch(
+            @RequestParam Boolean skipHeader,
+            @RequestParam("importFile") MultipartFile importFile) throws IOException {
+        String filename = ImportUtil.saveImportFile(appConfig.getUploadFileBaseDir(), null, importFile);
+        List<ImportUtil.ImportHeaderInfo> headerInfoList = ImportUtil.makeHeaderInfoList(TourMapData.class, null);
+        // 下面是导入时需要注意的地方,如果我们缺省生成的代码,与实际情况存在差异,请手动修改。
+        // 1. 头信息数据字段,我们只是根据当前的主表实体对象生成了缺省数组,开发者可根据实际情况,对headerInfoList进行修改。
+        ImportUtil.ImportHeaderInfo[] headerInfos = headerInfoList.toArray(new ImportUtil.ImportHeaderInfo[]{});
+        // 2. 这里需要根据实际情况决定,导入文件中第一行是否为中文头信息,如果是可以跳过。这里我们默认为true。
+        // 这里根据自己的实际需求,为doImport的最后一个参数,传递需要进行字典转换的字段集合。
+        // 注意,集合中包含需要翻译的Java字段名,如: gradeId。
+        Set<String> translatedDictFieldSet = new HashSet<>();
+        List<TourMapData> dataList =
+                ImportUtil.doImport(headerInfos, skipHeader, filename, TourMapData.class, translatedDictFieldSet);
+        tourMapDataService.saveNewBatch(dataList, -1);
+        return ResponseResult.success();
+    }
+
+    /**
+     * 导出符合过滤条件的城市定位管理列表。
+     *
+     * @param tourMapDataDtoFilter 过滤对象。
+     * @param orderParam 排序参数。
+     * @throws IOException 文件读写失败。
+     */
+    @SaCheckPermission("tourMapData.export")
+    @OperationLog(type = SysOperationLogType.EXPORT, saveResponse = false)
+    @PostMapping("/export")
+    public void export(
+            @MyRequestBody TourMapDataDto tourMapDataDtoFilter,
+            @MyRequestBody MyOrderParam orderParam) throws IOException {
+        TourMapData tourMapDataFilter = MyModelUtil.copyTo(tourMapDataDtoFilter, TourMapData.class);
+        String orderBy = MyOrderParam.buildOrderBy(orderParam, TourMapData.class);
+        List<TourMapData> resultList =
+                tourMapDataService.getTourMapDataListWithRelation(tourMapDataFilter, orderBy);
+        // 导出文件的标题数组
+        // NOTE: 下面的代码中仅仅导出了主表数据,主表聚合计算数据和主表关联字典的数据。
+        // 一对一从表数据的导出,可根据需要自行添加。如:headerMap.put("slaveFieldName.xxxField", "标题名称")
+        Map<String, String> headerMap = new LinkedHashMap<>(4);
+        headerMap.put("id", "id");
+        headerMap.put("cityName", "城市名称城市");
+        headerMap.put("lon", "经度");
+        headerMap.put("lat", "纬度");
+        ExportUtil.doExport(resultList, headerMap, "tourMapData.xlsx");
+    }
+
+    /**
+     * 查看指定城市定位管理对象详情。
+     *
+     * @param id 指定对象主键Id。
+     * @return 应答结果对象,包含对象详情。
+     */
+    @SaCheckPermission("tourMapData.view")
+    @GetMapping("/view")
+    public ResponseResult<TourMapDataVo> view(@RequestParam String id) {
+        TourMapData tourMapData = tourMapDataService.getByIdWithRelation(id, MyRelationParam.full());
+        if (tourMapData == null) {
+            return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST);
+        }
+        TourMapDataVo tourMapDataVo = MyModelUtil.copyTo(tourMapData, TourMapDataVo.class);
+        return ResponseResult.success(tourMapDataVo);
+    }
+
+    private ResponseResult<Void> doDelete(String id) {
+        String errorMessage;
+        // 验证关联Id的数据合法性
+        TourMapData originalTourMapData = tourMapDataService.getById(id);
+        if (originalTourMapData == null) {
+            // NOTE: 修改下面方括号中的话述
+            errorMessage = "数据验证失败,当前 [对象] 并不存在,请刷新后重试!";
+            return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
+        }
+        if (!tourMapDataService.remove(id)) {
+            errorMessage = "数据操作失败,删除的对象不存在,请刷新后重试!";
+            return ResponseResult.error(ErrorCodeEnum.DATA_NOT_EXIST, errorMessage);
+        }
+        return ResponseResult.success();
+    }
+}

+ 33 - 0
application-webadmin/src/main/java/com/tourism/webadmin/back/dao/TourMapDataMapper.java

@@ -0,0 +1,33 @@
+package com.tourism.webadmin.back.dao;
+
+import com.tourism.common.core.base.dao.BaseDaoMapper;
+import com.tourism.webadmin.back.model.TourMapData;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.*;
+
+/**
+ * 城市定位管理数据操作访问接口。
+ *
+ * @author 吃饭睡觉
+ * @date 2024-09-06
+ */
+public interface TourMapDataMapper extends BaseDaoMapper<TourMapData> {
+
+    /**
+     * 批量插入对象列表。
+     *
+     * @param tourMapDataList 新增对象列表。
+     */
+    void insertList(List<TourMapData> tourMapDataList);
+
+    /**
+     * 获取过滤后的对象列表。
+     *
+     * @param tourMapDataFilter 主表过滤对象。
+     * @param orderBy 排序字符串,order by从句的参数。
+     * @return 对象列表。
+     */
+    List<TourMapData> getTourMapDataList(
+            @Param("tourMapDataFilter") TourMapData tourMapDataFilter, @Param("orderBy") String orderBy);
+}

+ 64 - 0
application-webadmin/src/main/java/com/tourism/webadmin/back/dao/mapper/TourMapDataMapper.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.tourism.webadmin.back.dao.TourMapDataMapper">
+    <resultMap id="BaseResultMap" type="com.tourism.webadmin.back.model.TourMapData">
+        <id column="id" jdbcType="VARCHAR" property="id"/>
+        <result column="city_name" jdbcType="VARCHAR" property="cityName"/>
+        <result column="lon" jdbcType="VARCHAR" property="lon"/>
+        <result column="lat" jdbcType="VARCHAR" property="lat"/>
+    </resultMap>
+
+    <insert id="insertList">
+        INSERT INTO tour_map_data
+            (id,
+            city_name,
+            lon,
+            lat)
+        VALUES
+        <foreach collection="list" index="index" item="item" separator="," >
+            (#{item.id},
+            #{item.cityName},
+            #{item.lon},
+            #{item.lat})
+        </foreach>
+    </insert>
+
+    <!-- 如果有逻辑删除字段过滤,请写到这里 -->
+    <sql id="filterRef">
+        <!-- 这里必须加上全包名,否则当filterRef被其他Mapper.xml包含引用的时候,就会调用Mapper.xml中的该SQL片段 -->
+        <include refid="com.tourism.webadmin.back.dao.TourMapDataMapper.inputFilterRef"/>
+    </sql>
+
+    <!-- 这里仅包含调用接口输入的主表过滤条件 -->
+    <sql id="inputFilterRef">
+        <if test="tourMapDataFilter != null">
+            <if test="tourMapDataFilter.id != null and tourMapDataFilter.id != ''">
+                AND tour_map_data.id = #{tourMapDataFilter.id}
+            </if>
+            <if test="tourMapDataFilter.cityName != null and tourMapDataFilter.cityName != ''">
+                <bind name = "safeTourMapDataCityName" value = "'%' + tourMapDataFilter.cityName + '%'" />
+                AND tour_map_data.city_name LIKE #{safeTourMapDataCityName}
+            </if>
+            <if test="tourMapDataFilter.lon != null and tourMapDataFilter.lon != ''">
+                AND tour_map_data.lon = #{tourMapDataFilter.lon}
+            </if>
+            <if test="tourMapDataFilter.lat != null and tourMapDataFilter.lat != ''">
+                AND tour_map_data.lat = #{tourMapDataFilter.lat}
+            </if>
+            <if test="tourMapDataFilter.searchString != null and tourMapDataFilter.searchString != ''">
+                <bind name = "safeTourMapDataSearchString" value = "'%' + tourMapDataFilter.searchString + '%'" />
+                AND IFNULL(tour_map_data.city_name,'') LIKE #{safeTourMapDataSearchString}
+            </if>
+        </if>
+    </sql>
+
+    <select id="getTourMapDataList" resultMap="BaseResultMap" parameterType="com.tourism.webadmin.back.model.TourMapData">
+        SELECT * FROM tour_map_data
+        <where>
+            <include refid="filterRef"/>
+        </where>
+        <if test="orderBy != null and orderBy != ''">
+            ORDER BY ${orderBy}
+        </if>
+    </select>
+</mapper>

+ 55 - 0
application-webadmin/src/main/java/com/tourism/webadmin/back/dto/TourMapDataDto.java

@@ -0,0 +1,55 @@
+package com.tourism.webadmin.back.dto;
+
+import com.tourism.common.core.validator.UpdateGroup;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import jakarta.validation.constraints.*;
+
+/**
+ * 城市定位管理Dto对象。
+ *
+ * @author 吃饭睡觉
+ * @date 2024-09-06
+ */
+@Schema(description = "城市定位管理Dto对象")
+@Data
+public class TourMapDataDto {
+
+    /**
+     * id。
+     * NOTE: 可支持等于操作符的列表数据过滤。
+     */
+    @Schema(description = "id。可支持等于操作符的列表数据过滤。", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotBlank(message = "数据验证失败,id不能为空!", groups = {UpdateGroup.class})
+    private String id;
+
+    /**
+     * 城市名称城市。
+     * NOTE: 可支持等于操作符的列表数据过滤。
+     */
+    @Schema(description = "城市名称城市。可支持等于操作符的列表数据过滤。")
+    private String cityName;
+
+    /**
+     * 经度。
+     * NOTE: 可支持等于操作符的列表数据过滤。
+     */
+    @Schema(description = "经度。可支持等于操作符的列表数据过滤。")
+    private String lon;
+
+    /**
+     * 纬度。
+     * NOTE: 可支持等于操作符的列表数据过滤。
+     */
+    @Schema(description = "纬度。可支持等于操作符的列表数据过滤。")
+    private String lat;
+
+    /**
+     * city_name LIKE搜索字符串。
+     * NOTE: 可支持LIKE操作符的列表数据过滤。
+     */
+    @Schema(description = "LIKE模糊搜索字符串")
+    private String searchString;
+}

+ 50 - 0
application-webadmin/src/main/java/com/tourism/webadmin/back/model/TourMapData.java

@@ -0,0 +1,50 @@
+package com.tourism.webadmin.back.model;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.tourism.common.core.util.MyCommonUtil;
+import lombok.Data;
+
+/**
+ * 城市定位管理实体对象。
+ *
+ * @author 吃饭睡觉
+ * @date 2024-09-06
+ */
+@Data
+@TableName(value = "tour_map_data")
+public class TourMapData {
+
+    /**
+     * id。
+     */
+    @TableId(value = "id")
+    private String id;
+
+    /**
+     * 城市名称城市。
+     */
+    @TableField(value = "city_name")
+    private String cityName;
+
+    /**
+     * 经度。
+     */
+    @TableField(value = "lon")
+    private String lon;
+
+    /**
+     * 纬度。
+     */
+    @TableField(value = "lat")
+    private String lat;
+
+    /**
+     * city_name LIKE搜索字符串。
+     */
+    @TableField(exist = false)
+    private String searchString;
+
+    public void setSearchString(String searchString) {
+        this.searchString = MyCommonUtil.replaceSqlWildcard(searchString);
+    }
+}

+ 76 - 0
application-webadmin/src/main/java/com/tourism/webadmin/back/service/TourMapDataService.java

@@ -0,0 +1,76 @@
+package com.tourism.webadmin.back.service;
+
+import com.tourism.webadmin.back.model.*;
+import com.tourism.common.core.base.service.IBaseService;
+
+import java.util.*;
+
+/**
+ * 城市定位管理数据操作服务接口。
+ *
+ * @author 吃饭睡觉
+ * @date 2024-09-06
+ */
+public interface TourMapDataService extends IBaseService<TourMapData, String> {
+
+    /**
+     * 保存新增对象。
+     *
+     * @param tourMapData 新增对象。
+     * @return 返回新增对象。
+     */
+    TourMapData saveNew(TourMapData tourMapData);
+
+    /**
+     * 利用数据库的insertList语法,批量插入对象列表。
+     *
+     * @param tourMapDataList 新增对象列表。
+     */
+    void saveNewBatch(List<TourMapData> tourMapDataList);
+
+    /**
+     * 利用数据库的insertList语法,批量插入对象列表。通常适用于更大的插入数据量,如批量导入。
+     *
+     * @param tourMapDataList 新增对象列表。
+     * @param batchSize  每批插入的数量。如果该值小于等于0,则使用缺省值10000。
+     */
+    void saveNewBatch(List<TourMapData> tourMapDataList, int batchSize);
+
+    /**
+     * 更新数据对象。
+     *
+     * @param tourMapData         更新的对象。
+     * @param originalTourMapData 原有数据对象。
+     * @return 成功返回true,否则false。
+     */
+    boolean update(TourMapData tourMapData, TourMapData originalTourMapData);
+
+    /**
+     * 删除指定数据。
+     *
+     * @param id 主键Id。
+     * @return 成功返回true,否则false。
+     */
+    boolean remove(String id);
+
+    /**
+     * 获取单表查询结果。由于没有关联数据查询,因此在仅仅获取单表数据的场景下,效率更高。
+     * 如果需要同时获取关联数据,请移步(getTourMapDataListWithRelation)方法。
+     *
+     * @param filter  过滤对象。
+     * @param orderBy 排序参数。
+     * @return 查询结果集。
+     */
+    List<TourMapData> getTourMapDataList(TourMapData filter, String orderBy);
+
+    /**
+     * 获取主表的查询结果,以及主表关联的字典数据和一对一从表数据,以及一对一从表的字典数据。
+     * 该查询会涉及到一对一从表的关联过滤,或一对多从表的嵌套关联过滤,因此性能不如单表过滤。
+     * 如果仅仅需要获取主表数据,请移步(getTourMapDataList),以便获取更好的查询性能。
+     *
+     * @param filter 主表过滤对象。
+     * @param orderBy 排序参数。
+     * @return 查询结果集。
+     */
+    List<TourMapData> getTourMapDataListWithRelation(TourMapData filter, String orderBy);
+}

+ 124 - 0
application-webadmin/src/main/java/com/tourism/webadmin/back/service/impl/TourMapDataServiceImpl.java

@@ -0,0 +1,124 @@
+package com.tourism.webadmin.back.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.tourism.webadmin.back.service.*;
+import com.tourism.webadmin.back.dao.*;
+import com.tourism.webadmin.back.model.*;
+import com.tourism.webadmin.config.DataSourceType;
+import com.tourism.common.core.annotation.MyDataSource;
+import com.tourism.common.core.base.dao.BaseDaoMapper;
+import com.tourism.common.core.object.MyRelationParam;
+import com.tourism.common.core.base.service.BaseService;
+import com.tourism.common.sequence.wrapper.IdGeneratorWrapper;
+import com.github.pagehelper.Page;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * 城市定位管理数据操作服务类。
+ *
+ * @author 吃饭睡觉
+ * @date 2024-09-06
+ */
+@Slf4j
+@MyDataSource(DataSourceType.MAIN)
+@Service("tourMapDataService")
+public class TourMapDataServiceImpl extends BaseService<TourMapData, String> implements TourMapDataService {
+
+    @Autowired
+    private IdGeneratorWrapper idGenerator;
+    @Autowired
+    private TourMapDataMapper tourMapDataMapper;
+
+    /**
+     * 返回当前Service的主表Mapper对象。
+     *
+     * @return 主表Mapper对象。
+     */
+    @Override
+    protected BaseDaoMapper<TourMapData> mapper() {
+        return tourMapDataMapper;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public TourMapData saveNew(TourMapData tourMapData) {
+        tourMapDataMapper.insert(this.buildDefaultValue(tourMapData));
+        return tourMapData;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void saveNewBatch(List<TourMapData> tourMapDataList) {
+        if (CollUtil.isNotEmpty(tourMapDataList)) {
+            tourMapDataList.forEach(this::buildDefaultValue);
+            tourMapDataMapper.insertList(tourMapDataList);
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void saveNewBatch(List<TourMapData> tourMapDataList, int batchSize) {
+        if (CollUtil.isEmpty(tourMapDataList)) {
+            return;
+        }
+        if (batchSize <= 0) {
+            batchSize = 10000;
+        }
+        int start = 0;
+        do {
+            int end = Math.min(tourMapDataList.size(), start + batchSize);
+            List<TourMapData> subList = tourMapDataList.subList(start, end);
+            // 如果数据量过大,同时当前表中存在createTime或updateTime等字段,可以考虑在外部创建一次 new Date(),
+            // 然后传入buildDefaultValue,这样可以减少对象的创建次数,降低GC,提升效率。橙单之所以没有这样生成,是因为
+            // 有些业务场景下需要按照这两个日期字段排序,因此我们只是在这里给出优化建议。
+            subList.forEach(this::buildDefaultValue);
+            tourMapDataMapper.insertList(subList);
+            if (end == tourMapDataList.size()) {
+                break;
+            }
+            start += batchSize;
+        } while (true);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean update(TourMapData tourMapData, TourMapData originalTourMapData) {
+        // 这里重点提示,在执行主表数据更新之前,如果有哪些字段不支持修改操作,请用原有数据对象字段替换当前数据字段。
+        UpdateWrapper<TourMapData> uw = this.createUpdateQueryForNullValue(tourMapData, tourMapData.getId());
+        return tourMapDataMapper.update(tourMapData, uw) == 1;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean remove(String id) {
+        return tourMapDataMapper.deleteById(id) == 1;
+    }
+
+    @Override
+    public List<TourMapData> getTourMapDataList(TourMapData filter, String orderBy) {
+        return tourMapDataMapper.getTourMapDataList(filter, orderBy);
+    }
+
+    @Override
+    public List<TourMapData> getTourMapDataListWithRelation(TourMapData filter, String orderBy) {
+        List<TourMapData> resultList = tourMapDataMapper.getTourMapDataList(filter, orderBy);
+        // 在缺省生成的代码中,如果查询结果resultList不是Page对象,说明没有分页,那么就很可能是数据导出接口调用了当前方法。
+        // 为了避免一次性的大量数据关联,规避因此而造成的系统运行性能冲击,这里手动进行了分批次读取,开发者可按需修改该值。
+        int batchSize = resultList instanceof Page ? 0 : 1000;
+        this.buildRelationForDataList(resultList, MyRelationParam.normal(), batchSize);
+        return resultList;
+    }
+
+    private TourMapData buildDefaultValue(TourMapData tourMapData) {
+        if (tourMapData.getId() == null) {
+            tourMapData.setId(idGenerator.nextStringId());
+        }
+        return tourMapData;
+    }
+}

+ 39 - 0
application-webadmin/src/main/java/com/tourism/webadmin/back/vo/TourMapDataVo.java

@@ -0,0 +1,39 @@
+package com.tourism.webadmin.back.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 城市定位管理VO视图对象。
+ *
+ * @author 吃饭睡觉
+ * @date 2024-09-06
+ */
+@Schema(description = "城市定位管理VO视图对象")
+@Data
+public class TourMapDataVo {
+
+    /**
+     * id。
+     */
+    @Schema(description = "id")
+    private String id;
+
+    /**
+     * 城市名称城市。
+     */
+    @Schema(description = "城市名称城市")
+    private String cityName;
+
+    /**
+     * 经度。
+     */
+    @Schema(description = "经度")
+    private String lon;
+
+    /**
+     * 纬度。
+     */
+    @Schema(description = "纬度")
+    private String lat;
+}