diff --git a/src/main/java/com/ycwl/basic/controller/mobile/AppScenicController.java b/src/main/java/com/ycwl/basic/controller/mobile/AppScenicController.java index 1593618..939708e 100644 --- a/src/main/java/com/ycwl/basic/controller/mobile/AppScenicController.java +++ b/src/main/java/com/ycwl/basic/controller/mobile/AppScenicController.java @@ -3,12 +3,12 @@ package com.ycwl.basic.controller.mobile; import com.github.pagehelper.PageInfo; import com.ycwl.basic.annotation.IgnoreToken; import com.ycwl.basic.constant.BaseContextHandler; -import com.ycwl.basic.model.jwt.JwtInfo; import com.ycwl.basic.model.mobile.scenic.ScenicAppVO; import com.ycwl.basic.model.mobile.scenic.ScenicDeviceCountVO; import com.ycwl.basic.model.mobile.scenic.ScenicIndexVO; import com.ycwl.basic.model.mobile.scenic.content.ContentPageVO; import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; +import com.ycwl.basic.model.pc.scenic.entity.ScenicEntity; import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; import com.ycwl.basic.model.pc.scenic.resp.ScenicConfigResp; import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; @@ -16,11 +16,14 @@ import com.ycwl.basic.repository.ScenicRepository; import com.ycwl.basic.service.mobile.AppScenicService; import com.ycwl.basic.service.pc.FaceService; import com.ycwl.basic.utils.ApiResponse; -import com.ycwl.basic.utils.JwtTokenUtil; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.List; @@ -49,7 +52,7 @@ public class AppScenicController { // 分页查询景区列表 @PostMapping("/page") - public ApiResponse> pageQuery(@RequestBody ScenicReqQuery scenicReqQuery){ + public ApiResponse> pageQuery(@RequestBody ScenicReqQuery scenicReqQuery){ String userId = BaseContextHandler.getUserId(); if (ENABLED_USER_IDs.contains(userId)) { return appScenicService.pageQuery(scenicReqQuery); diff --git a/src/main/java/com/ycwl/basic/controller/mobile/manage/AppScenicAccountController.java b/src/main/java/com/ycwl/basic/controller/mobile/manage/AppScenicAccountController.java index 0b2e8be..d56e934 100644 --- a/src/main/java/com/ycwl/basic/controller/mobile/manage/AppScenicAccountController.java +++ b/src/main/java/com/ycwl/basic/controller/mobile/manage/AppScenicAccountController.java @@ -2,14 +2,15 @@ package com.ycwl.basic.controller.mobile.manage; import com.ycwl.basic.annotation.IgnoreToken; import com.ycwl.basic.constant.BaseContextHandler; +import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2DTO; import com.ycwl.basic.model.mobile.scenic.account.ScenicLoginOldRespVO; import com.ycwl.basic.model.mobile.scenic.account.ScenicLoginReq; import com.ycwl.basic.model.mobile.scenic.account.ScenicLoginRespVO; -import com.ycwl.basic.model.mobile.weChat.DTO.WeChatUserInfoDTO; import com.ycwl.basic.model.pc.device.resp.DeviceRespVO; import com.ycwl.basic.model.pc.scenic.entity.ScenicAccountEntity; import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; +import com.ycwl.basic.repository.ScenicRepository; import com.ycwl.basic.service.mobile.AppScenicService; import com.ycwl.basic.service.pc.ScenicAccountService; import com.ycwl.basic.service.pc.ScenicService; @@ -23,7 +24,6 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -44,6 +44,8 @@ public class AppScenicAccountController { private AppScenicService scenicService; @Autowired private ScenicService adminScenicService; + @Autowired + private ScenicRepository scenicRepository; // 登录 @PostMapping("/login") @@ -65,8 +67,8 @@ public class AppScenicAccountController { } @GetMapping("/myScenicList") - public ApiResponse> myScenicList() { - List list = Collections.emptyList(); + public ApiResponse> myScenicList() { + List list = Collections.emptyList(); if (Strings.CS.equals(BaseContextHandler.getRoleId(), MERCHANT.type)) { String userId = BaseContextHandler.getUserId(); ScenicAccountEntity account = accountService.getScenicAccountById(Long.valueOf(userId)); @@ -74,10 +76,12 @@ public class AppScenicAccountController { return ApiResponse.fail("景区账号未绑定景区"); } list = account.getScenicId().stream() - .map(id -> scenicService.getDetails(id).getData()) + .map(id -> scenicRepository.getScenicBasic(id)) .toList(); } else if (Strings.CS.equals(BaseContextHandler.getRoleId(), ADMIN.type)) { - list = adminScenicService.list(new ScenicReqQuery()).getData(); + ScenicReqQuery query = new ScenicReqQuery(); + query.setPageSize(1000); + list = scenicRepository.list(query); } return ApiResponse.success(list); } diff --git a/src/main/java/com/ycwl/basic/controller/pc/ScenicController.java b/src/main/java/com/ycwl/basic/controller/pc/ScenicController.java index 7cf77fa..14c595a 100644 --- a/src/main/java/com/ycwl/basic/controller/pc/ScenicController.java +++ b/src/main/java/com/ycwl/basic/controller/pc/ScenicController.java @@ -1,13 +1,12 @@ package com.ycwl.basic.controller.pc; -import com.github.pagehelper.PageInfo; import com.ycwl.basic.constant.BaseContextHandler; +import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2DTO; import com.ycwl.basic.model.mobile.statistic.req.CommonQueryReq; +import com.ycwl.basic.model.pc.mp.MpConfigEntity; import com.ycwl.basic.model.pc.scenic.entity.ScenicAccountEntity; -import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; -import com.ycwl.basic.model.pc.scenic.req.ScenicAddOrUpdateReq; import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; -import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; +import com.ycwl.basic.repository.ScenicRepository; import com.ycwl.basic.service.mobile.AppScenicService; import com.ycwl.basic.service.mobile.AppStatisticsService; import com.ycwl.basic.service.pc.ScenicAccountService; @@ -17,16 +16,20 @@ import com.ycwl.basic.storage.adapters.IStorageAdapter; import com.ycwl.basic.storage.enums.StorageAcl; import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.utils.WxMpUtil; -import com.ycwl.basic.repository.ScenicRepository; -import com.ycwl.basic.model.pc.mp.MpConfigEntity; import org.apache.commons.lang3.Strings; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import java.io.File; import java.util.Collections; import java.util.List; +import static com.ycwl.basic.constant.JwtRoleConstant.ADMIN; import static com.ycwl.basic.constant.JwtRoleConstant.MERCHANT; /** @@ -105,19 +108,19 @@ public class ScenicController { } @GetMapping("/myScenicList") - public ApiResponse> myScenicList() { - List list = Collections.emptyList(); + public ApiResponse> myScenicList() { + List list = Collections.emptyList(); if (Strings.CS.equals(BaseContextHandler.getRoleId(), MERCHANT.type)) { String userId = BaseContextHandler.getUserId(); ScenicAccountEntity account = accountService.getScenicAccountById(Long.valueOf(userId)); if (account == null || account.getScenicId().isEmpty()) { return ApiResponse.fail("景区账号未绑定景区"); } - list = account.getScenicId().stream().map(id -> { - return appScenicService.getDetails(id).getData(); - }).toList(); - } else { - list = scenicService.list(new ScenicReqQuery()).getData(); + list = account.getScenicId().stream().map(id -> scenicRepository.getScenicBasic(id)).toList(); + } else if (Strings.CS.equals(BaseContextHandler.getRoleId(), ADMIN.type)) { + ScenicReqQuery query = new ScenicReqQuery(); + query.setPageSize(1000); + list = scenicRepository.list(query); } return ApiResponse.success(list); } diff --git a/src/main/java/com/ycwl/basic/controller/pc/ScenicV2Controller.java b/src/main/java/com/ycwl/basic/controller/pc/ScenicV2Controller.java index ef89644..52b7f8b 100644 --- a/src/main/java/com/ycwl/basic/controller/pc/ScenicV2Controller.java +++ b/src/main/java/com/ycwl/basic/controller/pc/ScenicV2Controller.java @@ -9,18 +9,26 @@ import com.ycwl.basic.integration.scenic.dto.filter.ScenicFilterPageResponse; import com.ycwl.basic.integration.scenic.dto.filter.ScenicFilterRequest; import com.ycwl.basic.integration.scenic.dto.scenic.CreateScenicRequest; import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2DTO; -import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2WithConfigDTO; import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2ListResponse; +import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2WithConfigDTO; import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2WithConfigListResponse; import com.ycwl.basic.integration.scenic.dto.scenic.UpdateScenicRequest; import com.ycwl.basic.integration.scenic.service.ScenicConfigIntegrationService; import com.ycwl.basic.integration.scenic.service.ScenicIntegrationService; import com.ycwl.basic.utils.ApiResponse; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; -import jakarta.validation.Valid; import java.util.List; import java.util.Map; @@ -165,6 +173,24 @@ public class ScenicV2Controller { } } + /** + * 景区列表查询(默认1000条) + * 只支持根据状态筛选 + */ + @GetMapping("/list") + public ApiResponse listScenicsByStatus(@RequestParam(required = false) Integer status) { + log.info("查询景区列表, status: {}", status); + try { + // 默认查询1000条数据,第1页 + ScenicV2ListResponse scenics = scenicIntegrationService.listScenics(1, 1000, status, null); + return ApiResponse.success(scenics); + } catch (Exception e) { + log.error("查询景区列表失败, status: {}", status, e); + return ApiResponse.fail("查询景区列表失败: " + e.getMessage()); + } + } + + // ========== 景区配置管理 ========== /** diff --git a/src/main/java/com/ycwl/basic/mapper/ScenicMapper.java b/src/main/java/com/ycwl/basic/mapper/ScenicMapper.java deleted file mode 100644 index b9c06fd..0000000 --- a/src/main/java/com/ycwl/basic/mapper/ScenicMapper.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.ycwl.basic.mapper; - -import com.ycwl.basic.model.mobile.scenic.ScenicAppVO; -import com.ycwl.basic.model.mobile.scenic.ScenicIndexVO; -import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; -import com.ycwl.basic.model.pc.scenic.entity.ScenicEntity; -import com.ycwl.basic.model.pc.scenic.req.ScenicAddOrUpdateReq; -import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; -import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; -import com.ycwl.basic.utils.ApiResponse; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * @Author:longbinbin - * @Date:2024/12/2 10:07 - * 景区管理表 - */ -@Mapper -public interface ScenicMapper { - List list(ScenicReqQuery scenicReqQuery); - - List appList(ScenicReqQuery scenicReqQuery); - - /** - * 通过经纬度计算景区距离 - * - * @param scenicIndexVO - * @return - */ - List scenicListByLnLa(ScenicIndexVO scenicIndexVO); -} diff --git a/src/main/java/com/ycwl/basic/model/pc/scenic/entity/ScenicEntity.java b/src/main/java/com/ycwl/basic/model/pc/scenic/entity/ScenicEntity.java index b0ce70a..be34ffb 100644 --- a/src/main/java/com/ycwl/basic/model/pc/scenic/entity/ScenicEntity.java +++ b/src/main/java/com/ycwl/basic/model/pc/scenic/entity/ScenicEntity.java @@ -1,11 +1,8 @@ package com.ycwl.basic.model.pc.scenic.entity; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.math.BigDecimal; -import java.util.Date; /** * @Author:longbinbin @@ -60,8 +57,6 @@ public class ScenicEntity { * 状态 1启用0关闭 */ private String status; - private Date createTime; - private Date updateTime; /** * 景区源素材价格,元 */ diff --git a/src/main/java/com/ycwl/basic/repository/ScenicRepository.java b/src/main/java/com/ycwl/basic/repository/ScenicRepository.java index 4c6a22e..0e8325b 100644 --- a/src/main/java/com/ycwl/basic/repository/ScenicRepository.java +++ b/src/main/java/com/ycwl/basic/repository/ScenicRepository.java @@ -1,6 +1,11 @@ package com.ycwl.basic.repository; -import com.ycwl.basic.utils.JacksonUtil; +import com.ycwl.basic.facebody.enums.FaceBodyAdapterType; +import com.ycwl.basic.integration.common.util.ConfigValueUtil; +import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2DTO; +import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2ListResponse; +import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2WithConfigDTO; +import com.ycwl.basic.integration.scenic.service.ScenicIntegrationService; import com.ycwl.basic.mapper.MpConfigMapper; import com.ycwl.basic.mapper.MpNotifyConfigMapper; import com.ycwl.basic.model.pc.mp.MpConfigEntity; @@ -8,13 +13,10 @@ import com.ycwl.basic.model.pc.mp.MpNotifyConfigEntity; import com.ycwl.basic.model.pc.mp.ScenicMpNotifyVO; import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; import com.ycwl.basic.model.pc.scenic.entity.ScenicEntity; -import com.ycwl.basic.integration.scenic.service.ScenicIntegrationService; -import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2DTO; -import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2WithConfigDTO; -import com.ycwl.basic.integration.common.util.ConfigValueUtil; -import com.ycwl.basic.facebody.enums.FaceBodyAdapterType; +import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; import com.ycwl.basic.pay.enums.PayAdapterType; import com.ycwl.basic.storage.enums.StorageType; +import com.ycwl.basic.utils.JacksonUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; @@ -31,6 +33,7 @@ public class ScenicRepository { private ScenicIntegrationService scenicIntegrationService; public static final String SCENIC_CACHE_KEY = "scenic:%s"; + public static final String SCENIC_BASIC_CACHE_KEY = "scenic:basic:%s"; public static final String SCENIC_FULL_CACHE_KEY = "scenic:f%s"; public static final String SCENIC_CONFIG_CACHE_KEY = "scenic:%s:config"; public static final String SCENIC_MP_CACHE_KEY = "scenic:%s:mp"; @@ -38,6 +41,30 @@ public class ScenicRepository { @Autowired private MpNotifyConfigMapper mpNotifyConfigMapper; + public ScenicV2DTO getScenicBasic(Long id) { + String key = String.format(SCENIC_BASIC_CACHE_KEY, id); + try { + ScenicV2DTO scenicDTO = scenicIntegrationService.getScenic(id); + + // 请求成功,写入缓存 + if (scenicDTO != null) { + redisTemplate.opsForValue().set( + key, + JacksonUtil.toJSONString(scenicDTO) + ); + } + return scenicDTO; + } catch (Exception e) { + // 请求失败,尝试从缓存获取历史成功数据 + String cacheKey = key; + if (redisTemplate.hasKey(cacheKey)) { + return JacksonUtil.parseObject(redisTemplate.opsForValue().get(cacheKey), ScenicV2DTO.class); + } + // 缓存也没有,返回null + return null; + } + } + public ScenicEntity getScenic(Long id) { String key = String.format(SCENIC_CACHE_KEY, id); try { @@ -155,8 +182,34 @@ public class ScenicRepository { return null; } + public List list(ScenicReqQuery scenicReqQuery) { + try { + // 将 ScenicReqQuery 参数转换为 zt-scenic 服务需要的参数 + Integer page = scenicReqQuery.getPageNum(); + Integer pageSize = scenicReqQuery.getPageSize(); + Integer status = null; + if (scenicReqQuery.getStatus() != null) { + status = Integer.valueOf(scenicReqQuery.getStatus()); + } + String name = scenicReqQuery.getName(); + + // 调用 zt-scenic 服务的 list 方法 + ScenicV2ListResponse response = scenicIntegrationService.listScenics(page, pageSize, status, name); + + // 将 ScenicV2DTO 列表转换为 ScenicEntity 列表 + if (response != null && response.getList() != null) { + return response.getList(); + } + return new java.util.ArrayList<>(); + } catch (Exception e) { + // 如果调用失败,返回空列表 + return new java.util.ArrayList<>(); + } + } + public void clearCache(Long scenicId) { redisTemplate.delete(String.format(SCENIC_CACHE_KEY, scenicId)); + redisTemplate.delete(String.format(SCENIC_BASIC_CACHE_KEY, scenicId)); redisTemplate.delete(String.format(SCENIC_FULL_CACHE_KEY, scenicId)); redisTemplate.delete(String.format(SCENIC_CONFIG_CACHE_KEY, scenicId)); redisTemplate.delete(String.format(SCENIC_MP_CACHE_KEY, scenicId)); @@ -172,8 +225,6 @@ public class ScenicRepository { entity.setName(dto.getName()); entity.setMpId(dto.getMpId()); entity.setStatus(dto.getStatus().toString()); - entity.setCreateTime(new java.util.Date(dto.getCreateTime())); - entity.setUpdateTime(new java.util.Date(dto.getUpdateTime())); return entity; } @@ -186,8 +237,6 @@ public class ScenicRepository { entity.setName(dto.getName()); entity.setMpId(dto.getMpId()); entity.setStatus(dto.getStatus().toString()); - entity.setCreateTime(new java.util.Date(dto.getCreateTime())); - entity.setUpdateTime(new java.util.Date(dto.getUpdateTime())); if (dto.getConfig() != null) { entity.setAddress(ConfigValueUtil.getStringValue(dto.getConfig(), "address")); entity.setArea(ConfigValueUtil.getStringValue(dto.getConfig(), "area")); diff --git a/src/main/java/com/ycwl/basic/service/custom/CustomUploadTaskService.java b/src/main/java/com/ycwl/basic/service/custom/CustomUploadTaskService.java index 14251de..44ef69a 100644 --- a/src/main/java/com/ycwl/basic/service/custom/CustomUploadTaskService.java +++ b/src/main/java/com/ycwl/basic/service/custom/CustomUploadTaskService.java @@ -13,7 +13,6 @@ import com.ycwl.basic.facebody.entity.AddFaceResp; import com.ycwl.basic.mapper.DeviceMapper; import com.ycwl.basic.mapper.CustomUploadTaskMapper; import com.ycwl.basic.mapper.FaceSampleMapper; -import com.ycwl.basic.mapper.ScenicMapper; import com.ycwl.basic.mapper.SourceMapper; import com.ycwl.basic.model.pc.device.entity.DeviceEntity; import com.ycwl.basic.model.custom.entity.CustomUploadTaskEntity; diff --git a/src/main/java/com/ycwl/basic/service/mobile/AppScenicService.java b/src/main/java/com/ycwl/basic/service/mobile/AppScenicService.java index 6f8a78f..3ae80d6 100644 --- a/src/main/java/com/ycwl/basic/service/mobile/AppScenicService.java +++ b/src/main/java/com/ycwl/basic/service/mobile/AppScenicService.java @@ -7,6 +7,7 @@ import com.ycwl.basic.model.mobile.scenic.ScenicIndexVO; import com.ycwl.basic.model.mobile.scenic.account.ScenicLoginReq; import com.ycwl.basic.model.mobile.scenic.account.ScenicLoginRespVO; import com.ycwl.basic.model.pc.device.resp.DeviceRespVO; +import com.ycwl.basic.model.pc.scenic.entity.ScenicEntity; import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; import com.ycwl.basic.utils.ApiResponse; @@ -18,7 +19,7 @@ import java.util.List; * @Date:2024/12/6 10:23 */ public interface AppScenicService { - ApiResponse> pageQuery(ScenicReqQuery scenicReqQuery); + ApiResponse> pageQuery(ScenicReqQuery scenicReqQuery); ApiResponse deviceCountByScenicId(Long scenicId); diff --git a/src/main/java/com/ycwl/basic/service/mobile/impl/AppScenicServiceImpl.java b/src/main/java/com/ycwl/basic/service/mobile/impl/AppScenicServiceImpl.java index be8976d..9964de7 100644 --- a/src/main/java/com/ycwl/basic/service/mobile/impl/AppScenicServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/mobile/impl/AppScenicServiceImpl.java @@ -1,10 +1,11 @@ package com.ycwl.basic.service.mobile.impl; import cn.hutool.core.bean.BeanUtil; -import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; -import com.ycwl.basic.constant.BaseContextHandler; -import com.ycwl.basic.mapper.*; +import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2DTO; +import com.ycwl.basic.mapper.DeviceMapper; +import com.ycwl.basic.mapper.ExtraDeviceMapper; +import com.ycwl.basic.mapper.ScenicAccountMapper; import com.ycwl.basic.model.jwt.JwtInfo; import com.ycwl.basic.model.mobile.scenic.ScenicAppVO; import com.ycwl.basic.model.mobile.scenic.ScenicDeviceCountVO; @@ -14,7 +15,6 @@ import com.ycwl.basic.model.mobile.scenic.account.ScenicLoginRespVO; import com.ycwl.basic.model.pc.device.entity.DeviceEntity; import com.ycwl.basic.model.pc.device.resp.DeviceRespVO; import com.ycwl.basic.model.pc.scenic.entity.ScenicAccountEntity; -import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; import com.ycwl.basic.model.pc.scenic.entity.ScenicEntity; import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; @@ -31,6 +31,7 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -44,8 +45,6 @@ import static com.ycwl.basic.constant.JwtRoleConstant.MERCHANT; @Service public class AppScenicServiceImpl implements AppScenicService { - @Autowired - private ScenicMapper scenicMapper; @Autowired private DeviceMapper deviceMapper; @Autowired @@ -64,10 +63,15 @@ public class AppScenicServiceImpl implements AppScenicService { private ScenicRepository scenicRepository; @Override - public ApiResponse> pageQuery(ScenicReqQuery scenicReqQuery) { - PageHelper.startPage(scenicReqQuery.getPageNum(), scenicReqQuery.getPageSize()); - List list = scenicMapper.appList(scenicReqQuery); - PageInfo pageInfo = new PageInfo<>(list); + public ApiResponse> pageQuery(ScenicReqQuery scenicReqQuery) { + + ScenicReqQuery query = new ScenicReqQuery(); + query.setPageSize(1000); + List scenicList = scenicRepository.list(query); + List list = scenicList.stream().map(scenic -> { + return scenicRepository.getScenic(Long.valueOf(scenic.getId())); + }).toList(); + PageInfo pageInfo = new PageInfo<>(list); return ApiResponse.success(pageInfo); } @@ -140,8 +144,58 @@ public class AppScenicServiceImpl implements AppScenicService { @Override public List scenicListByLnLa(ScenicIndexVO scenicIndexVO) { - List scenicAppVOS = scenicMapper.scenicListByLnLa(scenicIndexVO); - return scenicAppVOS.stream().filter(scenic -> scenic.getDistance().compareTo(scenic.getRadius().multiply(BigDecimal.valueOf(1_000L))) < 0).toList(); + // 从 scenicRepository 获取所有景区(1000个) + ScenicReqQuery query = new ScenicReqQuery(); + query.setPageNum(1); + query.setPageSize(1000); + List scenicList = scenicRepository.list(query); + + List list = new ArrayList<>(); + + // 为每个景区获取详细信息(包含经纬度) + for (ScenicV2DTO scenicDTO : scenicList) { + try { + // 获取景区详细信息(包含经纬度) + ScenicEntity scenicEntity = scenicRepository.getScenic(Long.parseLong(scenicDTO.getId())); + if (scenicEntity != null && scenicEntity.getLatitude() != null && scenicEntity.getLongitude() != null) { + // 计算距离 + BigDecimal distance = calculateDistance( + scenicIndexVO.getLatitude(), + scenicIndexVO.getLongitude(), + scenicEntity.getLatitude(), + scenicEntity.getLongitude() + ); + + // 根据距离和范围筛选景区 + if (scenicEntity.getRadius() != null && + distance.compareTo(scenicEntity.getRadius().multiply(BigDecimal.valueOf(1_000L))) < 0) { + + // 转换为 ScenicAppVO + ScenicAppVO scenicAppVO = new ScenicAppVO(); + scenicAppVO.setId(scenicEntity.getId()); + scenicAppVO.setName(scenicEntity.getName()); + scenicAppVO.setPhone(scenicEntity.getPhone()); + scenicAppVO.setIntroduction(scenicEntity.getIntroduction()); + scenicAppVO.setCoverUrl(scenicEntity.getCoverUrl()); + scenicAppVO.setLongitude(scenicEntity.getLongitude()); + scenicAppVO.setLatitude(scenicEntity.getLatitude()); + scenicAppVO.setRadius(scenicEntity.getRadius()); + scenicAppVO.setProvince(scenicEntity.getProvince()); + scenicAppVO.setCity(scenicEntity.getCity()); + scenicAppVO.setArea(scenicEntity.getArea()); + scenicAppVO.setAddress(scenicEntity.getAddress()); + scenicAppVO.setDistance(distance); + + list.add(scenicAppVO); + } + } + } catch (Exception e) { + // 单个景区获取失败,继续处理下一个 + continue; + } + } + + return list; } @Override @@ -183,4 +237,29 @@ public class AppScenicServiceImpl implements AppScenicService { deviceRespVOList.addAll(0, extraDeviceList); return ApiResponse.success(deviceRespVOList); } + + /** + * 计算两点之间的距离(米) + * 使用 Haversine 公式 + */ + private BigDecimal calculateDistance(BigDecimal lat1, BigDecimal lon1, BigDecimal lat2, BigDecimal lon2) { + if (lat1 == null || lon1 == null || lat2 == null || lon2 == null) { + return BigDecimal.ZERO; + } + + final double R = 6371000; // 地球半径(米) + + double lat1Rad = Math.toRadians(lat1.doubleValue()); + double lat2Rad = Math.toRadians(lat2.doubleValue()); + double deltaLat = Math.toRadians(lat2.subtract(lat1).doubleValue()); + double deltaLon = Math.toRadians(lon2.subtract(lon1).doubleValue()); + + double a = Math.sin(deltaLat/2) * Math.sin(deltaLat/2) + + Math.cos(lat1Rad) * Math.cos(lat2Rad) * + Math.sin(deltaLon/2) * Math.sin(deltaLon/2); + double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); + + double distance = R * c; + return BigDecimal.valueOf(distance); + } } diff --git a/src/main/java/com/ycwl/basic/service/pc/ScenicService.java b/src/main/java/com/ycwl/basic/service/pc/ScenicService.java index d7fef50..c70fc51 100644 --- a/src/main/java/com/ycwl/basic/service/pc/ScenicService.java +++ b/src/main/java/com/ycwl/basic/service/pc/ScenicService.java @@ -1,11 +1,8 @@ package com.ycwl.basic.service.pc; -import com.github.pagehelper.PageInfo; import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter; -import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; -import com.ycwl.basic.model.pc.scenic.req.ScenicAddOrUpdateReq; +import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2DTO; import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; -import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; import com.ycwl.basic.pay.adapter.IPayAdapter; import com.ycwl.basic.storage.adapters.IStorageAdapter; import com.ycwl.basic.utils.ApiResponse; @@ -17,7 +14,7 @@ import java.util.List; * @Date:2024/12/3 15:22 */ public interface ScenicService { - ApiResponse> list(ScenicReqQuery scenicReqQuery); + ApiResponse> list(ScenicReqQuery scenicReqQuery); IStorageAdapter getScenicStorageAdapter(Long scenicId); diff --git a/src/main/java/com/ycwl/basic/service/pc/impl/ScenicServiceImpl.java b/src/main/java/com/ycwl/basic/service/pc/impl/ScenicServiceImpl.java index 6e54ee6..2cfdf82 100644 --- a/src/main/java/com/ycwl/basic/service/pc/impl/ScenicServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/pc/impl/ScenicServiceImpl.java @@ -1,39 +1,27 @@ package com.ycwl.basic.service.pc.impl; -import com.ycwl.basic.utils.JacksonUtil; -import com.github.pagehelper.PageHelper; -import com.github.pagehelper.PageInfo; import com.ycwl.basic.facebody.FaceBodyFactory; import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter; -import com.ycwl.basic.mapper.ScenicAccountMapper; -import com.ycwl.basic.mapper.ScenicMapper; -import com.ycwl.basic.model.pc.scenic.entity.ScenicAccountEntity; +import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2DTO; import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; -import com.ycwl.basic.model.pc.scenic.req.ScenicAddOrUpdateReq; import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; -import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; import com.ycwl.basic.pay.PayFactory; import com.ycwl.basic.pay.adapter.IPayAdapter; import com.ycwl.basic.repository.ScenicRepository; import com.ycwl.basic.service.pc.ScenicService; -import com.ycwl.basic.service.task.TaskFaceService; import com.ycwl.basic.storage.StorageFactory; import com.ycwl.basic.storage.adapters.IStorageAdapter; import com.ycwl.basic.storage.exceptions.StorageUnsupportedException; import com.ycwl.basic.utils.ApiResponse; -import com.ycwl.basic.utils.SnowFlakeUtil; +import com.ycwl.basic.utils.JacksonUtil; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME; - /** * @Author:longbinbin * @Date:2024/12/3 15:25 @@ -41,15 +29,13 @@ import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME; @Slf4j @Service public class ScenicServiceImpl implements ScenicService { - @Autowired - private ScenicMapper scenicMapper; @Autowired private ScenicRepository scenicRepository; @Override @Deprecated - public ApiResponse> list(ScenicReqQuery scenicReqQuery) { - return ApiResponse.success(scenicMapper.list(scenicReqQuery)); + public ApiResponse> list(ScenicReqQuery scenicReqQuery) { + return ApiResponse.success(scenicRepository.list(scenicReqQuery)); } private static final Map scenicStorageAdapterMap = new ConcurrentHashMap<>(); diff --git a/src/main/java/com/ycwl/basic/task/DownloadNotificationTasker.java b/src/main/java/com/ycwl/basic/task/DownloadNotificationTasker.java index 8a9104e..8936eeb 100644 --- a/src/main/java/com/ycwl/basic/task/DownloadNotificationTasker.java +++ b/src/main/java/com/ycwl/basic/task/DownloadNotificationTasker.java @@ -1,9 +1,9 @@ package com.ycwl.basic.task; import cn.hutool.core.date.DateUtil; +import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2DTO; import com.ycwl.basic.mapper.CouponMapper; import com.ycwl.basic.mapper.MemberMapper; -import com.ycwl.basic.mapper.ScenicMapper; import com.ycwl.basic.mapper.VideoMapper; import com.ycwl.basic.model.pc.coupon.req.CouponQueryReq; import com.ycwl.basic.model.pc.coupon.resp.CouponRespVO; @@ -12,8 +12,6 @@ import com.ycwl.basic.model.pc.mp.MpConfigEntity; import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; import com.ycwl.basic.model.pc.scenic.entity.ScenicEntity; import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; -import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; -import com.ycwl.basic.model.pc.template.resp.TemplateRespVO; import com.ycwl.basic.notify.NotifyFactory; import com.ycwl.basic.notify.adapters.INotifyAdapter; import com.ycwl.basic.notify.entity.NotifyContent; @@ -47,10 +45,6 @@ public class DownloadNotificationTasker { @Autowired private MemberMapper memberMapper; @Autowired - private TemplateRepository templateRepository; - @Autowired - private ScenicMapper scenicMapper; - @Autowired private CouponMapper couponMapper; @Scheduled(cron = "0 0 21 * * *") @@ -168,7 +162,9 @@ public class DownloadNotificationTasker { @Scheduled(cron = "0 0 * * * *") public void sendExtraDownloadNotification() { log.info("开始执行定时任务"); - List scenicList = scenicMapper.list(new ScenicReqQuery()); + ScenicReqQuery query = new ScenicReqQuery(); + query.setPageSize(1000); + List scenicList = scenicRepository.list(query); if (scenicList.isEmpty()) { return; } @@ -177,7 +173,7 @@ public class DownloadNotificationTasker { int currentHour = calendar.get(Calendar.HOUR_OF_DAY); calendar.clear(); scenicList.parallelStream().forEach(scenic -> { - Long scenicId = scenic.getId(); + Long scenicId = Long.parseLong(scenic.getId()); ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenicId); if (scenicConfig == null) { return; diff --git a/src/main/java/com/ycwl/basic/task/DynamicTaskGenerator.java b/src/main/java/com/ycwl/basic/task/DynamicTaskGenerator.java index bbe3d0b..2b00449 100644 --- a/src/main/java/com/ycwl/basic/task/DynamicTaskGenerator.java +++ b/src/main/java/com/ycwl/basic/task/DynamicTaskGenerator.java @@ -7,7 +7,6 @@ import com.ycwl.basic.facebody.adapter.AliFaceBodyAdapter; import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter; import com.ycwl.basic.mapper.FaceMapper; import com.ycwl.basic.mapper.FaceSampleMapper; -import com.ycwl.basic.mapper.ScenicMapper; import com.ycwl.basic.mapper.TemplateMapper; import com.ycwl.basic.model.pc.face.entity.FaceEntity; import com.ycwl.basic.model.pc.faceSample.resp.FaceSampleRespVO; @@ -40,8 +39,6 @@ import static com.ycwl.basic.constant.FaceConstant.USER_FACE_DB_NAME; @EnableScheduling @Slf4j public class DynamicTaskGenerator { - @Autowired - private ScenicMapper scenicMapper; @Autowired private TemplateMapper templateMapper; @Autowired diff --git a/src/main/java/com/ycwl/basic/task/FaceCleaner.java b/src/main/java/com/ycwl/basic/task/FaceCleaner.java index 386b802..b63b586 100644 --- a/src/main/java/com/ycwl/basic/task/FaceCleaner.java +++ b/src/main/java/com/ycwl/basic/task/FaceCleaner.java @@ -4,9 +4,9 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.ycwl.basic.constant.StorageConstant; import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter; +import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2DTO; import com.ycwl.basic.mapper.FaceMapper; import com.ycwl.basic.mapper.FaceSampleMapper; -import com.ycwl.basic.mapper.ScenicMapper; import com.ycwl.basic.mapper.SourceMapper; import com.ycwl.basic.mapper.VideoMapper; import com.ycwl.basic.model.pc.face.entity.FaceEntity; @@ -16,7 +16,6 @@ import com.ycwl.basic.model.pc.faceSample.req.FaceSampleReqQuery; import com.ycwl.basic.model.pc.faceSample.resp.FaceSampleRespVO; import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; -import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; import com.ycwl.basic.model.pc.source.req.SourceReqQuery; import com.ycwl.basic.model.pc.source.resp.SourceRespVO; import com.ycwl.basic.model.pc.video.req.VideoReqQuery; @@ -46,8 +45,6 @@ import static com.ycwl.basic.constant.StorageConstant.VIID_FACE; @Slf4j @Profile("prod") public class FaceCleaner { - @Autowired - private ScenicMapper scenicMapper; @Autowired private FaceSampleMapper faceSampleMapper; @Autowired @@ -64,25 +61,27 @@ public class FaceCleaner { @Scheduled(cron = "0 0 1 * * ?") public void deleteExpireSample(){ - ScenicReqQuery scenicQuery = new ScenicReqQuery(); - List scenicList = scenicMapper.list(scenicQuery); + ScenicReqQuery query = new ScenicReqQuery(); + query.setPageSize(1000); + List scenicList = scenicRepository.list(query); scenicList.parallelStream().forEach(scenic -> { - log.info("当前景区{},开始删除人脸样本", scenic.getId()); - IFaceBodyAdapter adapter = scenicService.getScenicFaceBodyAdapter(scenic.getId()); - ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenic.getId()); + Long scenicId = Long.parseLong(scenic.getId()); + log.info("当前景区{},开始删除人脸样本", scenicId); + IFaceBodyAdapter adapter = scenicService.getScenicFaceBodyAdapter(scenicId); + ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenicId); Integer sampleStoreDay = scenicConfig.getSampleStoreDay(); if (sampleStoreDay == null) { log.info("当前景区{},人脸样本保存天数未设置,默认7天", scenic.getId()); sampleStoreDay = 7; } Date sampleEndDate = DateUtil.offsetDay(DateUtil.beginOfDay(new Date()), -sampleStoreDay); - List faceSampleList = faceSampleMapper.listEntityBeforeDate(scenic.getId(), sampleEndDate); + List faceSampleList = faceSampleMapper.listEntityBeforeDate(scenicId, sampleEndDate); if (faceSampleList.isEmpty()) { log.info("当前景区{},人脸样本为空", scenic.getId()); return; } faceSampleList.forEach(faceSample -> { - boolean success = adapter.deleteFace(String.valueOf(scenic.getId()), faceSample.getId().toString()); + boolean success = adapter.deleteFace(scenic.getId(), faceSample.getId().toString()); if (success) { log.info("当前景区{},人脸样本ID{},删除成功", scenic.getId(), faceSample.getId()); faceSampleMapper.deleteById(faceSample.getId()); @@ -95,21 +94,23 @@ public class FaceCleaner { @Scheduled(cron = "0 45 2 * * ?") public void deleteExpireFace() { - ScenicReqQuery scenicQuery = new ScenicReqQuery(); - List scenicList = scenicMapper.list(scenicQuery); + ScenicReqQuery query = new ScenicReqQuery(); + query.setPageSize(1000); + List scenicList = scenicRepository.list(query); scenicList.parallelStream().forEach(scenic -> { + Long scenicId = Long.parseLong(scenic.getId()); log.info("当前景区{},开始删除用户人脸", scenic.getId()); - ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenic.getId()); - IFaceBodyAdapter adapter = scenicService.getScenicFaceBodyAdapter(scenic.getId()); + ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenicId); + IFaceBodyAdapter adapter = scenicService.getScenicFaceBodyAdapter(scenicId); Integer faceStoreDay = scenicConfig.getFaceStoreDay(); if (faceStoreDay == null) { log.info("当前景区{},人脸样本保存天数未设置,默认3天", scenic.getName()); faceStoreDay = 3; } FaceReqQuery req = new FaceReqQuery(); - req.setScenicId(scenic.getId()); + req.setScenicId(scenicId); Date faceEndDate = DateUtil.offsetDay(DateUtil.beginOfDay(new Date()), -faceStoreDay); - List list = faceMapper.listUnpaidEntityBeforeDate(scenic.getId(), faceEndDate); + List list = faceMapper.listUnpaidEntityBeforeDate(scenicId, faceEndDate); list.forEach(face -> { boolean result = adapter.deleteFace(USER_FACE_DB_NAME+face.getScenicId(), face.getId().toString()); if (result) { @@ -130,10 +131,12 @@ public class FaceCleaner { @Scheduled(cron = "0 0 1 * * ?") public void deleteNotBuySource(){ - ScenicReqQuery scenicQuery = new ScenicReqQuery(); - List scenicList = scenicMapper.list(scenicQuery); + ScenicReqQuery query = new ScenicReqQuery(); + query.setPageSize(1000); + List scenicList = scenicRepository.list(query); scenicList.parallelStream().forEach(scenic -> { - ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenic.getId()); + Long scenicId = Long.valueOf(scenic.getId()); + ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenicId); if (scenicConfig == null) { log.info("当前景区{},无配置信息", scenic.getName()); return; @@ -144,17 +147,19 @@ public class FaceCleaner { } int expireDay = scenicConfig.getUserSourceExpireDay(); Date endDate = DateUtil.offsetDay(DateUtil.beginOfDay(new Date()), -expireDay); - int deleteCount = sourceMapper.deleteNotBuyRelations(scenic.getId(), endDate); + int deleteCount = sourceMapper.deleteNotBuyRelations(scenicId, endDate); log.info("当前景区{},删除关联素材{}个", scenic.getName(), deleteCount); }); } @Scheduled(cron = "0 15 1 * * ?") public void deleteNotBuyVideos(){ - ScenicReqQuery scenicQuery = new ScenicReqQuery(); - List scenicList = scenicMapper.list(scenicQuery); + ScenicReqQuery query = new ScenicReqQuery(); + query.setPageSize(1000); + List scenicList = scenicRepository.list(query); scenicList.parallelStream().forEach(scenic -> { - ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenic.getId()); + Long scenicId = Long.valueOf(scenic.getId()); + ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenicId); if (scenicConfig == null) { log.info("当前景区{},无配置信息", scenic.getName()); return; @@ -165,7 +170,7 @@ public class FaceCleaner { } int expireDay = scenicConfig.getVideoStoreDay(); Date endDate = DateUtil.offsetDay(DateUtil.beginOfDay(new Date()), -expireDay); - int deleteCount = videoMapper.deleteNotBuyRelations(scenic.getId(), endDate); + int deleteCount = videoMapper.deleteNotBuyRelations(scenicId, endDate); int deleteVideoCount = videoMapper.deleteUselessVideo(); log.info("当前景区{},删除VLOG关系{}个,删除VLOG记录{}个", scenic.getName(), deleteCount, deleteVideoCount); }); @@ -173,10 +178,12 @@ public class FaceCleaner { @Scheduled(cron = "0 30 1 * * ?") public void deleteExpiredSource(){ - ScenicReqQuery scenicQuery = new ScenicReqQuery(); - List scenicList = scenicMapper.list(scenicQuery); + ScenicReqQuery query = new ScenicReqQuery(); + query.setPageSize(1000); + List scenicList = scenicRepository.list(query); scenicList.parallelStream().forEach(scenic -> { - ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenic.getId()); + Long scenicId = Long.valueOf(scenic.getId()); + ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenicId); if (scenicConfig == null) { log.info("当前景区{},无配置信息", scenic.getName()); return; @@ -193,10 +200,10 @@ public class FaceCleaner { } else { log.info("当前景区{},原始素材保存天数未设置,默认7天", scenic.getName()); } - if (Integer.valueOf(1).equals(scenicConfig.getDisableSourceVideo())) { + if (Boolean.TRUE.equals(scenicConfig.getDisableSourceVideo())) { return; } - if (Integer.valueOf(1).equals(scenicConfig.getDisableSourceImage())) { + if (Boolean.TRUE.equals(scenicConfig.getDisableSourceImage())) { return; } log.info("当前景区{},开始删除原始素材", scenic.getName()); @@ -240,12 +247,16 @@ public class FaceCleaner { log.info("开始清理源视频素材文件"); List list = sourceMapper.list(new SourceReqQuery()); ArrayList adapterIdentity = new ArrayList<>(); - scenicMapper.list(new ScenicReqQuery()).forEach(scenic -> { - if (disableDeleteScenicIds.contains(scenic.getId().toString())) { + ScenicReqQuery query = new ScenicReqQuery(); + query.setPageSize(1000); + List scenicList = scenicRepository.list(query); + scenicList.forEach(scenic -> { + Long scenicId = Long.valueOf(scenic.getId()); + if (disableDeleteScenicIds.contains(scenic.getId())) { log.info("景区【{}】禁止删除文件,跳过!", scenic.getName()); return; } - IStorageAdapter adapter = scenicService.getScenicStorageAdapter(scenic.getId()); + IStorageAdapter adapter = scenicService.getScenicStorageAdapter(scenicId); String identity = adapter.identity(); if (!adapterIdentity.contains(identity)) { log.info("因为Identity相同,跳过"); @@ -291,12 +302,16 @@ public class FaceCleaner { log.info("开始清理视频文件"); List list = videoMapper.list(new VideoReqQuery()); ArrayList adapterIdentity = new ArrayList<>(); - scenicMapper.list(new ScenicReqQuery()).forEach(scenic -> { - if (disableDeleteScenicIds.contains(scenic.getId().toString())) { + ScenicReqQuery query = new ScenicReqQuery(); + query.setPageSize(1000); + List scenicList = scenicRepository.list(query); + scenicList.forEach(scenic -> { + Long scenicId = Long.valueOf(scenic.getId()); + if (disableDeleteScenicIds.contains(scenic.getId())) { log.info("景区【{}】禁止删除文件,跳过!", scenic.getName()); return; } - IStorageAdapter adapter = scenicService.getScenicStorageAdapter(scenic.getId()); + IStorageAdapter adapter = scenicService.getScenicStorageAdapter(scenicId); String identity = adapter.identity(); if (!adapterIdentity.contains(identity)) { adapterIdentity.add(identity); diff --git a/src/main/java/com/ycwl/basic/task/ScenicStatsTask.java b/src/main/java/com/ycwl/basic/task/ScenicStatsTask.java index 755b516..4b3764c 100644 --- a/src/main/java/com/ycwl/basic/task/ScenicStatsTask.java +++ b/src/main/java/com/ycwl/basic/task/ScenicStatsTask.java @@ -1,14 +1,14 @@ package com.ycwl.basic.task; import cn.hutool.core.date.DateUtil; +import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2DTO; import com.ycwl.basic.mapper.ScenicDeviceStatsMapper; -import com.ycwl.basic.mapper.ScenicMapper; import com.ycwl.basic.mapper.StatisticsMapper; import com.ycwl.basic.model.mobile.statistic.req.CommonQueryReq; import com.ycwl.basic.model.mobile.statistic.resp.AppStatisticsFunnelVO; import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; -import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; import com.ycwl.basic.model.pc.scenicDeviceStats.entity.ScenicDeviceStatsEntity; +import com.ycwl.basic.repository.ScenicRepository; import com.ycwl.basic.service.mobile.AppStatisticsService; import com.ycwl.basic.utils.ApiResponse; import org.springframework.beans.factory.annotation.Autowired; @@ -31,7 +31,8 @@ public class ScenicStatsTask { @Autowired private AppStatisticsService statisticsService; @Autowired - private ScenicMapper scenicMapper; + private ScenicRepository scenicRepository; + @Scheduled(cron = "0 1 0 * * *") public void countDeviceStats() { Date yesterdayStart = DateUtil.beginOfDay(DateUtil.yesterday()); @@ -58,16 +59,19 @@ public class ScenicStatsTask { public void countScenicStats() { Date yesterdayStart = DateUtil.beginOfDay(DateUtil.yesterday()); Date yesterdayEnd = DateUtil.endOfDay(yesterdayStart); - List list = scenicMapper.list(new ScenicReqQuery()); - list.forEach((scenic) -> { - CommonQueryReq query = new CommonQueryReq(); - query.setScenicId(scenic.getId()); - query.setStartTime(yesterdayStart); - query.setEndTime(yesterdayEnd); - query.setRealtime(true); - ApiResponse resp = statisticsService.userConversionFunnel(query); + ScenicReqQuery query = new ScenicReqQuery(); + query.setPageSize(1000); + List scenicList = scenicRepository.list(query); + scenicList.forEach((scenic) -> { + CommonQueryReq commonQueryReq = new CommonQueryReq(); + Long scenicId = Long.valueOf(scenic.getId()); + commonQueryReq.setScenicId(scenicId); + commonQueryReq.setStartTime(yesterdayStart); + commonQueryReq.setEndTime(yesterdayEnd); + commonQueryReq.setRealtime(true); + ApiResponse resp = statisticsService.userConversionFunnel(commonQueryReq); AppStatisticsFunnelVO data = resp.getData(); - statisticsMapper.insertStat(scenic.getId(), yesterdayStart, data); + statisticsMapper.insertStat(scenicId, yesterdayStart, data); }); } } diff --git a/src/main/java/com/ycwl/basic/task/VideoTaskGenerator.java b/src/main/java/com/ycwl/basic/task/VideoTaskGenerator.java index 2ed6b09..8cf630d 100644 --- a/src/main/java/com/ycwl/basic/task/VideoTaskGenerator.java +++ b/src/main/java/com/ycwl/basic/task/VideoTaskGenerator.java @@ -2,21 +2,16 @@ package com.ycwl.basic.task; import cn.hutool.core.date.DateUtil; import com.ycwl.basic.biz.TemplateBiz; +import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2DTO; import com.ycwl.basic.mapper.FaceMapper; -import com.ycwl.basic.mapper.FaceSampleMapper; -import com.ycwl.basic.mapper.ScenicMapper; import com.ycwl.basic.mapper.TemplateMapper; import com.ycwl.basic.model.mobile.scenic.content.ContentPageVO; import com.ycwl.basic.model.pc.face.req.FaceReqQuery; import com.ycwl.basic.model.pc.face.resp.FaceRespVO; import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; -import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; -import com.ycwl.basic.model.task.resp.SearchFaceRespVo; import com.ycwl.basic.repository.ScenicRepository; -import com.ycwl.basic.repository.TemplateRepository; import com.ycwl.basic.service.pc.FaceService; -import com.ycwl.basic.service.task.TaskFaceService; import com.ycwl.basic.service.task.impl.TaskTaskServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -37,23 +32,21 @@ public class VideoTaskGenerator { @Autowired private FaceMapper faceMapper; @Autowired - private TaskFaceService taskFaceService; - @Autowired private TemplateBiz templateBiz; @Autowired private TaskTaskServiceImpl taskTaskService; @Autowired private TemplateMapper templateMapper; @Autowired - private ScenicMapper scenicMapper; - @Autowired private ScenicRepository scenicRepository; @Autowired private FaceService faceService; @Scheduled(cron = "0 0 * * * *") public void generateVideoTask() { - List scenicList = scenicMapper.list(new ScenicReqQuery()); + ScenicReqQuery query = new ScenicReqQuery(); + query.setPageSize(1000); + List scenicList = scenicRepository.list(query); if (scenicList.isEmpty()) { return; } @@ -63,7 +56,7 @@ public class VideoTaskGenerator { int currentHour = calendar.get(Calendar.HOUR_OF_DAY); calendar.clear(); scenicList.parallelStream().forEach(scenic -> { - Long scenicId = scenic.getId(); + Long scenicId = Long.valueOf(scenic.getId()); ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenicId); if (scenicConfig == null) { log.info("当前景区{},无配置信息", scenic.getName()); @@ -79,11 +72,11 @@ public class VideoTaskGenerator { if (contentList.isEmpty()) { return; } - FaceReqQuery query = new FaceReqQuery(); - query.setScenicId(scenicId); - query.setStartTime(DateUtil.beginOfDay(new Date())); - query.setEndTime(DateUtil.endOfDay(new Date())); - List list = faceMapper.list(query); + FaceReqQuery faceReqQuery = new FaceReqQuery(); + faceReqQuery.setScenicId(scenicId); + faceReqQuery.setStartTime(DateUtil.beginOfDay(new Date())); + faceReqQuery.setEndTime(DateUtil.endOfDay(new Date())); + List list = faceMapper.list(faceReqQuery); list.forEach(face -> { faceService.matchFaceId(face.getId(), false); if (Integer.valueOf(3).equals(scenicConfig.getBookRoutine())) { diff --git a/src/main/resources/mapper/ScenicMapper.xml b/src/main/resources/mapper/ScenicMapper.xml deleted file mode 100644 index 8c94752..0000000 --- a/src/main/resources/mapper/ScenicMapper.xml +++ /dev/null @@ -1,267 +0,0 @@ - - - - - insert into scenic(id, `name`, introduction, phone, cover_url, longitude, latitude, radius, province, city, area, address, price, kf_code_url, kf_phone, logo_url, source_video_price, source_image_price) - values (#{id}, #{name}, #{introduction}, #{phone}, #{coverUrl},#{longitude}, #{latitude}, #{radius}, #{province}, #{city}, #{area}, #{address}, #{price}, #{kfCodeUrl}, #{kfPhone}, #{logoUrl}, #{sourceVideoPrice}, #{sourceImagePrice}) - - - insert into scenic_config(id, scenic_id, create_time) - values (#{id}, #{scenicId}, now()) - - - update - scenic - - - `name`=#{name}, - - - `phone`=#{phone}, - - - introduction=#{introduction}, - - - cover_url=#{coverUrl}, - - - longitude=#{longitude}, - - - latitude=#{latitude}, - - - radius=#{radius}, - - - status=#{status}, - - - province=#{province}, - - - city=#{city}, - - - area=#{area}, - - - address=#{address}, - - - kf_code_url=#{kfCodeUrl}, - - - kf_phone=#{kfPhone}, - - - logo_url=#{logoUrl}, - - - price=#{price}, - - - source_video_price=#{sourceVideoPrice}, - - - source_image_price=#{sourceImagePrice}, - - - where id = #{id} - - - update - scenic - set status = (CASE - status - WHEN 1 THEN - 0 - WHEN 0 THEN - 1 - END) - where id = #{id} - - - update scenic_config - - - start_time=#{startTime}, - - - end_time=#{endTime}, - - - is_default=#{isDefault}, - - all_free=#{allFree}, - book_routine=#{bookRoutine}, - tour_time=#{tourTime}, - sample_store_day=#{sampleStoreDay}, - face_store_day=#{faceStoreDay}, - video_store_day=#{videoStoreDay}, - template_new_video_type=#{templateNewVideoType}, - anti_screen_record_type=#{antiScreenRecordType}, - disable_source_video=#{disableSourceVideo}, - disable_source_image=#{disableSourceImage}, - video_source_store_day=#{videoSourceStoreDay}, - image_source_store_day=#{imageSourceStoreDay}, - user_source_expire_day=#{userSourceExpireDay}, - face_score_threshold=#{faceScoreThreshold}, - force_finish_time=#{forceFinishTime}, - face_detect_helper_threshold=#{faceDetectHelperThreshold}, - store_type=#{storeType}, - store_config_json=#{storeConfigJson}, - tmp_store_type=#{tmpStoreType}, - tmp_store_config_json=#{tmpStoreConfigJson}, - local_store_type=#{localStoreType}, - local_store_config_json=#{localStoreConfigJson}, - broker_direct_rate=#{brokerDirectRate}, - watermark_type=#{watermarkType}, - watermark_scenic_text=#{watermarkScenicText}, - watermark_dt_format=#{watermarkDtFormat}, - face_type=#{faceType}, - face_config_json=#{faceConfigJson}, - pay_type=#{payType}, - pay_config_json=#{payConfigJson}, - image_source_pack_hint=#{imageSourcePackHint}, - video_source_pack_hint=#{videoSourcePackHint}, - extra_notification_time=#{extraNotificationTime}, - photo_free_num= #{photoFreeNum}, - video_free_num= #{videoFreeNum}, - voucher_enable= #{voucherEnable} - - where id = #{id} - - - delete from scenic where id = #{id} - - - delete from scenic_config where scenic_id = #{scenicId} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/test/java/com/ycwl/basic/task/FaceCleanerTest.java b/src/test/java/com/ycwl/basic/task/FaceCleanerTest.java index d2a6406..d144ef0 100644 --- a/src/test/java/com/ycwl/basic/task/FaceCleanerTest.java +++ b/src/test/java/com/ycwl/basic/task/FaceCleanerTest.java @@ -5,9 +5,9 @@ import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.profile.DefaultProfile; import com.ycwl.basic.facebody.adapter.IFaceBodyAdapter; +import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2DTO; import com.ycwl.basic.mapper.FaceMapper; import com.ycwl.basic.mapper.FaceSampleMapper; -import com.ycwl.basic.mapper.ScenicMapper; import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity; import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity; import com.ycwl.basic.model.pc.scenic.entity.ScenicEntity; @@ -41,8 +41,6 @@ public class FaceCleanerTest { @Autowired private FaceSampleMapper faceSampleMapper; @Autowired - private ScenicMapper scenicMapper; - @Autowired private FaceCleaner faceCleaner; @Autowired private ScenicService scenicService; @@ -51,7 +49,7 @@ public class FaceCleanerTest { @Test public void testA() { - ScenicEntity scenic = scenicMapper.get(3980001650692722688L); + ScenicEntity scenic = scenicRepository.getScenic(3980001650692722688L); log.info("当前景区{},开始删除人脸样本", scenic.getId()); IFaceBodyAdapter adapter = scenicService.getScenicFaceBodyAdapter(scenic.getId()); int sampleStoreDay = 1; @@ -79,8 +77,9 @@ public class FaceCleanerTest { @Test public void test() { - ScenicReqQuery scenicQuery = new ScenicReqQuery(); - List scenicList = scenicMapper.list(scenicQuery); + ScenicReqQuery query = new ScenicReqQuery(); + query.setPageSize(1000); + List scenicList = scenicRepository.list(query); scenicList.forEach(scenic -> { log.info("当前景区{},开始删除人脸样本", scenic.getName()); }); diff --git a/src/test/java/com/ycwl/basic/task/ScenicStatsTaskTest.java b/src/test/java/com/ycwl/basic/task/ScenicStatsTaskTest.java index 3593d7b..a0c8e1a 100644 --- a/src/test/java/com/ycwl/basic/task/ScenicStatsTaskTest.java +++ b/src/test/java/com/ycwl/basic/task/ScenicStatsTaskTest.java @@ -1,12 +1,13 @@ package com.ycwl.basic.task; import cn.hutool.core.date.DateUtil; -import com.ycwl.basic.mapper.ScenicMapper; +import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2DTO; import com.ycwl.basic.mapper.StatisticsMapper; import com.ycwl.basic.model.mobile.statistic.req.CommonQueryReq; import com.ycwl.basic.model.mobile.statistic.resp.AppStatisticsFunnelVO; import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery; import com.ycwl.basic.model.pc.scenic.resp.ScenicRespVO; +import com.ycwl.basic.repository.ScenicRepository; import com.ycwl.basic.service.mobile.AppStatisticsService; import com.ycwl.basic.utils.ApiResponse; import lombok.extern.slf4j.Slf4j; @@ -27,11 +28,11 @@ public class ScenicStatsTaskTest { @Autowired private ScenicStatsTask task; @Autowired - private ScenicMapper scenicMapper; - @Autowired private AppStatisticsService statisticsService; @Autowired private StatisticsMapper statisticsMapper; + @Autowired + private ScenicRepository scenicRepository; @Test public void testA() { @@ -42,17 +43,20 @@ public class ScenicStatsTaskTest { public void testB() { Calendar calendar = Calendar.getInstance(); calendar.set(2025, Calendar.MAY, 1); - List list = scenicMapper.list(new ScenicReqQuery()); + ScenicReqQuery query = new ScenicReqQuery(); + query.setPageSize(1000); + List scenicList = scenicRepository.list(query); while (calendar.getTime().getTime() < System.currentTimeMillis()) { System.out.println(calendar.getTime()); - list.forEach((scenic) -> { - CommonQueryReq query = new CommonQueryReq(); - query.setScenicId(scenic.getId()); - query.setStartTime(DateUtil.beginOfDay(calendar.getTime())); - query.setEndTime(DateUtil.endOfDay(calendar.getTime())); - ApiResponse resp = statisticsService.userConversionFunnel(query); + scenicList.forEach((scenic) -> { + Long scenicId = Long.valueOf(scenic.getId()); + CommonQueryReq commonQueryReq = new CommonQueryReq(); + commonQueryReq.setScenicId(scenicId); + commonQueryReq.setStartTime(DateUtil.beginOfDay(calendar.getTime())); + commonQueryReq.setEndTime(DateUtil.endOfDay(calendar.getTime())); + ApiResponse resp = statisticsService.userConversionFunnel(commonQueryReq); AppStatisticsFunnelVO data = resp.getData(); - statisticsMapper.insertStat(scenic.getId(), DateUtil.beginOfDay(calendar.getTime()), data); + statisticsMapper.insertStat(scenicId, DateUtil.beginOfDay(calendar.getTime()), data); }); calendar.add(Calendar.DAY_OF_MONTH, 1); }