feat(scenic): 优化景区信息获取与缓存机制

-移除景区信息查询相关冗余代码
- 增加缓存逻辑,提高景区信息获取效率
- 更新 ScenicRepository 中的 getScenic 和 getScenicConfig 方法
- 重构 ScenicServiceImpl 中的 list 方法
- 删除 ScenicService 接口中未使用的多个方法
This commit is contained in:
2025-08-27 10:07:01 +08:00
parent 7c2db2ad22
commit 6bc94a65a6
4 changed files with 35 additions and 238 deletions

View File

@@ -23,51 +23,9 @@ public class ScenicReqQuery extends BaseQueryParameterReq {
*/ */
// 景区名称 // 景区名称
private String name; private String name;
/**
* 景区介绍
*/
// 景区介绍
private String introduction;
/**
* 经度
*/
// 经度
private BigDecimal longitude;
/***
* 纬度
*/
// 纬度
private BigDecimal latitude;
/**
* 半径(km)
*/
// 半径(km)
private BigDecimal radius;
/**
* 省份
*/
// 省份
private String province;
/**
* 城市
*/
// 城市
private String city;
/**
* 区
*/
// 区
private String area;
/**
* 详细地址
*/
// 详细地址
private String address;
/** /**
* 状态 1启用0关闭 * 状态 1启用0关闭
*/ */
// 状态 1启用0关闭 // 状态 1启用0关闭
private String status; private String status;
private Date startTime;
private Date endTime;
} }

View File

@@ -3,7 +3,6 @@ package com.ycwl.basic.repository;
import com.ycwl.basic.utils.JacksonUtil; import com.ycwl.basic.utils.JacksonUtil;
import com.ycwl.basic.mapper.MpConfigMapper; import com.ycwl.basic.mapper.MpConfigMapper;
import com.ycwl.basic.mapper.MpNotifyConfigMapper; import com.ycwl.basic.mapper.MpNotifyConfigMapper;
import com.ycwl.basic.mapper.ScenicMapper;
import com.ycwl.basic.model.pc.mp.MpConfigEntity; import com.ycwl.basic.model.pc.mp.MpConfigEntity;
import com.ycwl.basic.model.pc.mp.MpNotifyConfigEntity; import com.ycwl.basic.model.pc.mp.MpNotifyConfigEntity;
import com.ycwl.basic.model.pc.mp.ScenicMpNotifyVO; import com.ycwl.basic.model.pc.mp.ScenicMpNotifyVO;
@@ -24,8 +23,6 @@ import java.util.List;
@Component @Component
public class ScenicRepository { public class ScenicRepository {
@Autowired
private ScenicMapper scenicMapper;
@Autowired @Autowired
private MpConfigMapper mpConfigMapper; private MpConfigMapper mpConfigMapper;
@Autowired @Autowired
@@ -44,18 +41,48 @@ public class ScenicRepository {
public ScenicEntity getScenic(Long id) { public ScenicEntity getScenic(Long id) {
try { try {
ScenicV2DTO scenicDTO = scenicIntegrationService.getScenic(id); ScenicV2DTO scenicDTO = scenicIntegrationService.getScenic(id);
return convertToScenicEntity(scenicDTO); ScenicEntity scenicEntity = convertToScenicEntity(scenicDTO);
// 请求成功,写入缓存
if (scenicEntity != null) {
redisTemplate.opsForValue().set(
String.format(SCENIC_CACHE_KEY, id),
JacksonUtil.toJSONString(scenicEntity)
);
}
return scenicEntity;
} catch (Exception e) { } catch (Exception e) {
return scenicMapper.get(id); // 请求失败,尝试从缓存获取历史成功数据
String cacheKey = String.format(SCENIC_CACHE_KEY, id);
if (redisTemplate.hasKey(cacheKey)) {
return JacksonUtil.parseObject(redisTemplate.opsForValue().get(cacheKey), ScenicEntity.class);
}
// 缓存也没有,返回null
return null;
} }
} }
public ScenicConfigEntity getScenicConfig(Long scenicId) { public ScenicConfigEntity getScenicConfig(Long scenicId) {
try { try {
ScenicV2WithConfigDTO scenicWithConfigDTO = scenicIntegrationService.getScenicWithConfig(scenicId); ScenicV2WithConfigDTO scenicWithConfigDTO = scenicIntegrationService.getScenicWithConfig(scenicId);
return convertToScenicConfigEntity(scenicWithConfigDTO, scenicId); ScenicConfigEntity configEntity = convertToScenicConfigEntity(scenicWithConfigDTO, scenicId);
// 请求成功,写入缓存
if (configEntity != null) {
redisTemplate.opsForValue().set(
String.format(SCENIC_CONFIG_CACHE_KEY, scenicId),
JacksonUtil.toJSONString(configEntity)
);
}
return configEntity;
} catch (Exception e) { } catch (Exception e) {
return scenicMapper.getConfig(scenicId); // 请求失败,尝试从缓存获取历史成功数据
String cacheKey = String.format(SCENIC_CONFIG_CACHE_KEY, scenicId);
if (redisTemplate.hasKey(cacheKey)) {
return JacksonUtil.parseObject(redisTemplate.opsForValue().get(cacheKey), ScenicConfigEntity.class);
}
// 缓存也没有,返回null
return null;
} }
} }

View File

@@ -17,23 +17,7 @@ import java.util.List;
* @Date:2024/12/3 15:22 * @Date:2024/12/3 15:22
*/ */
public interface ScenicService { public interface ScenicService {
ApiResponse<PageInfo<ScenicRespVO>> pageQuery(ScenicReqQuery scenicReqQuery);
ApiResponse<List<ScenicRespVO>> list(ScenicReqQuery scenicReqQuery); ApiResponse<List<ScenicRespVO>> list(ScenicReqQuery scenicReqQuery);
ApiResponse<ScenicRespVO> getById(Long id);
ApiResponse<Boolean> add(ScenicAddOrUpdateReq scenicAddOrUpdateReq);
ApiResponse<Boolean> deleteById(Long id);
ApiResponse<Boolean> update(ScenicAddOrUpdateReq scenicAddOrUpdateReq);
ApiResponse<Boolean> updateStatus(Long id);
ApiResponse<Boolean> addConfig(ScenicConfigEntity scenicConfig);
/**
* 修改景区配置
* @param scenicConfig
* @return
*/
ApiResponse<Boolean> updateConfigById(ScenicConfigEntity scenicConfig);
ScenicConfigEntity getConfig(Long id);
void saveConfig(Long configId, ScenicConfigEntity config);
IStorageAdapter getScenicStorageAdapter(Long scenicId); IStorageAdapter getScenicStorageAdapter(Long scenicId);

View File

@@ -44,186 +44,14 @@ public class ScenicServiceImpl implements ScenicService {
@Autowired @Autowired
private ScenicMapper scenicMapper; private ScenicMapper scenicMapper;
@Autowired @Autowired
private ScenicAccountMapper scenicAccountMapper;
@Autowired
private TaskFaceService taskFaceService;
@Autowired
private ScenicRepository scenicRepository; private ScenicRepository scenicRepository;
@Override @Override
public ApiResponse<PageInfo<ScenicRespVO>> pageQuery(ScenicReqQuery scenicReqQuery) { @Deprecated
PageHelper.startPage(scenicReqQuery.getPageNum(), scenicReqQuery.getPageSize());
List<ScenicRespVO> list = scenicMapper.list(scenicReqQuery);
PageInfo<ScenicRespVO> pageInfo = new PageInfo<>(list);
return ApiResponse.success(pageInfo);
}
@Override
public ApiResponse<List<ScenicRespVO>> list(ScenicReqQuery scenicReqQuery) { public ApiResponse<List<ScenicRespVO>> list(ScenicReqQuery scenicReqQuery) {
return ApiResponse.success(scenicMapper.list(scenicReqQuery)); return ApiResponse.success(scenicMapper.list(scenicReqQuery));
} }
@Override
public ApiResponse<ScenicRespVO> getById(Long id) {
return ApiResponse.success(scenicMapper.getById(id));
}
@Override
@Transactional(rollbackFor = Exception.class)
public ApiResponse<Boolean> add(ScenicAddOrUpdateReq scenicAddReq) {
Long scenicId = SnowFlakeUtil.getLongId();
scenicAddReq.setId(scenicId);
int add = scenicMapper.add(scenicAddReq);
ScenicAccountEntity scenicAccount = scenicAccountMapper.getByAccount(scenicAddReq.getAccount());
if (scenicAccount == null) {
scenicAccount = new ScenicAccountEntity();
scenicAccount.setId(SnowFlakeUtil.getLongId());
scenicAccount.setName(scenicAddReq.getName() + "管理员");
scenicAccount.setAccount(scenicAddReq.getAccount());
scenicAccount.setPassword(scenicAddReq.getPassword());
scenicAccount.setIsSuper(1);
scenicAccountMapper.add(scenicAccount);
}
scenicAccountMapper.addAccountScenicRelation(scenicAccount.getId(), scenicId, 1);
if (add > 0) {
return ApiResponse.success(true);
} else {
return ApiResponse.fail("景区添加失败");
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public ApiResponse<Boolean> deleteById(Long id) {
int i = scenicMapper.deleteById(id);
if (i > 0) {
scenicAccountMapper.deleteRelationByScenicId(id);
IFaceBodyAdapter adapter = getScenicFaceBodyAdapter(id);
Thread.ofVirtual().start(() -> {
adapter.deleteFaceDb(id.toString());
adapter.deleteFaceDb(USER_FACE_DB_NAME + id);
});
scenicMapper.deleteConfigByScenicId(id);
scenicRepository.clearCache(id);
scenicFaceBodyAdapterMap.remove(id);
scenicStorageAdapterMap.remove(id);
scenicPayAdapterMap.remove(id);
return ApiResponse.success(true);
}else {
return ApiResponse.fail("景区删除失败");
}
}
@Override
public ApiResponse<Boolean> update(ScenicAddOrUpdateReq scenicUpdateReq) {
if (scenicUpdateReq.getId() == null) {
return ApiResponse.fail("参数错误");
}
if (StringUtils.isNotBlank(scenicUpdateReq.getAccount()) && StringUtils.isNotBlank(scenicUpdateReq.getPassword())) {
ScenicAccountEntity scenicAccount = scenicAccountMapper.getByAccount(scenicUpdateReq.getAccount());
if (scenicAccount != null) {
if (!scenicAccount.getScenicId().equals(scenicUpdateReq.getId())) {
return ApiResponse.fail("账号已存在");
}
}
ScenicAccountEntity account = scenicAccountMapper.getSuperAccountOfScenic(scenicUpdateReq.getId());
if (account != null) {
account.setAccount(scenicUpdateReq.getAccount());
account.setPassword(scenicUpdateReq.getPassword());
scenicAccountMapper.update(account);
} else {
account = new ScenicAccountEntity();
account.setId(SnowFlakeUtil.getLongId());
account.setName(scenicUpdateReq.getName() + "管理员");
account.setAccount(scenicUpdateReq.getAccount());
account.setPassword(scenicUpdateReq.getPassword());
account.setIsSuper(1);
scenicAccountMapper.add(account);
}
scenicAccountMapper.addAccountScenicRelation(account.getId(), scenicUpdateReq.getId(), 1);
}
int i = scenicMapper.update(scenicUpdateReq);
if (i > 0) {
scenicRepository.clearCache(scenicUpdateReq.getId());
scenicFaceBodyAdapterMap.remove(scenicUpdateReq.getId());
scenicStorageAdapterMap.remove(scenicUpdateReq.getId());
scenicTmpStorageAdapterMap.remove(scenicUpdateReq.getId());
scenicLocalStorageAdapterMap.remove(scenicUpdateReq.getId());
scenicPayAdapterMap.remove(scenicUpdateReq.getId());
return ApiResponse.success(true);
}else {
return ApiResponse.fail("景区修改失败");
}
}
@Override
public ApiResponse<Boolean> updateStatus(Long id) {
int i = scenicMapper.updateStatus(id);
if (i > 0) {
scenicRepository.clearCache(id);
scenicFaceBodyAdapterMap.remove(id);
scenicStorageAdapterMap.remove(id);
scenicTmpStorageAdapterMap.remove(id);
scenicLocalStorageAdapterMap.remove(id);
scenicPayAdapterMap.remove(id);
return ApiResponse.success(true);
}else {
return ApiResponse.fail("景区状态修改失败");
}
}
@Override
public ApiResponse<Boolean> addConfig(ScenicConfigEntity scenicConfig) {
if (scenicConfig.getId() == null) {
scenicConfig.setId(SnowFlakeUtil.getLongId());
}
int i = scenicMapper.addConfig(scenicConfig);
if (i > 0) {
scenicRepository.clearCache(scenicConfig.getScenicId());
return ApiResponse.success(true);
}else {
return ApiResponse.fail("景区配置添加失败");
}
}
@Override
public ApiResponse<Boolean> updateConfigById(ScenicConfigEntity scenicConfig) {
int i = scenicMapper.updateConfigById(scenicConfig);
if (i > 0) {
scenicRepository.clearCache(scenicConfig.getScenicId());
scenicFaceBodyAdapterMap.remove(scenicConfig.getScenicId());
scenicStorageAdapterMap.remove(scenicConfig.getScenicId());
scenicTmpStorageAdapterMap.remove(scenicConfig.getScenicId());
scenicLocalStorageAdapterMap.remove(scenicConfig.getScenicId());
scenicPayAdapterMap.remove(scenicConfig.getScenicId());
return ApiResponse.success(true);
}else {
return ApiResponse.fail("景区配置修改失败");
}
}
@Override
public ScenicConfigEntity getConfig(Long id) {
return scenicRepository.getScenicConfig(id);
}
@Override
public void saveConfig(Long configId, ScenicConfigEntity config) {
config.setId(configId);
if (config.getScenicId() == null) {
throw new RuntimeException("景区ID不能为空");
}
scenicMapper.updateConfigById(config);
scenicRepository.clearCache(config.getScenicId());
scenicFaceBodyAdapterMap.remove(config.getScenicId());
scenicStorageAdapterMap.remove(config.getScenicId());
scenicTmpStorageAdapterMap.remove(config.getScenicId());
scenicLocalStorageAdapterMap.remove(config.getScenicId());
scenicPayAdapterMap.remove(config.getScenicId());
}
private static final Map<Long, IStorageAdapter> scenicStorageAdapterMap = new ConcurrentHashMap<>(); private static final Map<Long, IStorageAdapter> scenicStorageAdapterMap = new ConcurrentHashMap<>();
@Override @Override
public IStorageAdapter getScenicStorageAdapter(Long scenicId) { public IStorageAdapter getScenicStorageAdapter(Long scenicId) {