fix (farm): 首页,基地/地块 (补充提交)
- 优先从缓存中获取地块信息 - 项目启动,预加载地块
This commit is contained in:
@@ -81,7 +81,7 @@ public class PlotInfoController {
|
|||||||
@Parameter(name = "id", description = "编号", required = true)
|
@Parameter(name = "id", description = "编号", required = true)
|
||||||
public CommonResult<PlotLesseeInfoRespVO> getPlotInfo(@RequestParam("id") String id) {
|
public CommonResult<PlotLesseeInfoRespVO> getPlotInfo(@RequestParam("id") String id) {
|
||||||
PlotInfoDO plotInfo = plotInfoService.getPlotInfo(id);
|
PlotInfoDO plotInfo = plotInfoService.getPlotInfo(id);
|
||||||
return success(plotLesseeService.exportPlotLesseeInfoExcel(id,plotInfo));
|
return success(plotLesseeService.getPlotLessee(id,plotInfo));
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
|
|||||||
@@ -332,6 +332,26 @@ public class PlotInfoCacheService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void cleanupOldIndexes(String plotId, String oldBaseId, String oldTenantId) {
|
||||||
|
try {
|
||||||
|
// 从基地索引集合中移除
|
||||||
|
if (StringUtils.hasText(oldBaseId)) {
|
||||||
|
String oldBaseKey = "plots:base:" + oldBaseId;
|
||||||
|
stringRedisTemplate.opsForSet().remove(oldBaseKey, plotId);
|
||||||
|
log.debug("清理旧基地索引,基地ID: {}, 地块ID: {}", oldBaseId, plotId);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从租户索引集合中移除
|
||||||
|
if (StringUtils.hasText(oldTenantId)) {
|
||||||
|
String oldTenantKey = "plots:tenant:" + oldTenantId;
|
||||||
|
stringRedisTemplate.opsForSet().remove(oldTenantKey, plotId);
|
||||||
|
log.debug("清理旧租户索引,租户ID: {}, 地块ID: {}", oldTenantId, plotId);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("清理旧索引失败,地块ID: {}", plotId, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ==================== 私有方法 ====================
|
// ==================== 私有方法 ====================
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ public class PlotInfoServiceImpl implements PlotInfoService {
|
|||||||
// 插入户主信息
|
// 插入户主信息
|
||||||
plotLesseeService.insertPlotLessee(createReqVO, createReqVO.getBaseId(), plotInfo.getId(), plotInfo.getPlotName());
|
plotLesseeService.insertPlotLessee(createReqVO, createReqVO.getBaseId(), plotInfo.getId(), plotInfo.getPlotName());
|
||||||
|
|
||||||
// 缓存处理
|
// 添加缓存
|
||||||
pCatchService.createOrUpdatePlotInfo(plotInfo);
|
pCatchService.createOrUpdatePlotInfo(plotInfo);
|
||||||
|
|
||||||
// 返回
|
// 返回
|
||||||
@@ -92,10 +92,18 @@ public class PlotInfoServiceImpl implements PlotInfoService {
|
|||||||
// 校验地块面积
|
// 校验地块面积
|
||||||
validatePlotArea(updateReqVO.getBaseId(), updateReqVO.getId(), updateReqVO.getPlotArea());
|
validatePlotArea(updateReqVO.getBaseId(), updateReqVO.getId(), updateReqVO.getPlotArea());
|
||||||
|
|
||||||
// 更新
|
// 先获取旧数据,用于清理旧索引
|
||||||
|
PlotInfoDO oldPlotInfo = plotInfoMapper.selectById(updateReqVO.getId());
|
||||||
|
String oldBaseId = oldPlotInfo != null ? oldPlotInfo.getBaseId() : null;
|
||||||
|
String oldTenantId = oldPlotInfo != null ? oldPlotInfo.getTenantId() : null;
|
||||||
|
|
||||||
|
// 更新数据库
|
||||||
PlotInfoDO plotInfo = BeanUtils.toBean(updateReqVO, PlotInfoDO.class);
|
PlotInfoDO plotInfo = BeanUtils.toBean(updateReqVO, PlotInfoDO.class);
|
||||||
plotInfoMapper.updateById(plotInfo);
|
plotInfoMapper.updateById(plotInfo);
|
||||||
|
|
||||||
|
// 更新缓存 - 从数据库重新查询完整数据
|
||||||
|
updatePlotInfoCache(updateReqVO.getId(), oldBaseId, oldTenantId);
|
||||||
|
|
||||||
// 更新租户信息
|
// 更新租户信息
|
||||||
plotLesseeService.updatePlotLessee(updateReqVO);
|
plotLesseeService.updatePlotLessee(updateReqVO);
|
||||||
}
|
}
|
||||||
@@ -114,27 +122,17 @@ public class PlotInfoServiceImpl implements PlotInfoService {
|
|||||||
}
|
}
|
||||||
// 删除
|
// 删除
|
||||||
plotInfoMapper.deleteById(id);
|
plotInfoMapper.deleteById(id);
|
||||||
|
|
||||||
|
// 删除缓存
|
||||||
|
this.deletePlotInfoCache(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void deletePlotInfoListByIds(List<String> ids) {
|
public void deletePlotInfoListByIds(List<String> ids) {
|
||||||
// 删除
|
// 批量删除
|
||||||
plotInfoMapper.deleteByIds(ids);
|
plotInfoMapper.deleteByIds(ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void validatePlotInfoExists(String id) {
|
|
||||||
if (plotInfoMapper.selectById(id) == null) {
|
|
||||||
throw exception(PLOT_INFO_NOT_EXISTS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void validatePlotArea(String baseId, String plotId, BigDecimal updatePlotArea) {
|
|
||||||
boolean flag = this.validateCurrentPlotArea(baseId, plotId, updatePlotArea);
|
|
||||||
if (flag) {
|
|
||||||
throw exception(PLOT_AREA_ERROR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PlotInfoDO getPlotInfo(String id) {
|
public PlotInfoDO getPlotInfo(String id) {
|
||||||
LambdaQueryWrapperX<PlotInfoDO> wrapper = new LambdaQueryWrapperX<>();
|
LambdaQueryWrapperX<PlotInfoDO> wrapper = new LambdaQueryWrapperX<>();
|
||||||
@@ -225,18 +223,6 @@ public class PlotInfoServiceImpl implements PlotInfoService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 降级方案:直接从数据库查询
|
|
||||||
*/
|
|
||||||
private List<PlotInfoDO> fallbackToDatabase(String baseId) {
|
|
||||||
try {
|
|
||||||
List<PlotInfoDO> result = plotInfoMapper.selectList("base_id", baseId);
|
|
||||||
return result != null ? result : Collections.emptyList();
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("降级查询数据库也失败,基地ID: {}", baseId, e);
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<PlotInfoDO> getPlotInfos() {
|
public List<PlotInfoDO> getPlotInfos() {
|
||||||
@@ -280,29 +266,6 @@ public class PlotInfoServiceImpl implements PlotInfoService {
|
|||||||
return count > 0;
|
return count > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean validateCurrentPlotArea(String baseId, String plotId, BigDecimal currentPlotArea) {
|
|
||||||
List<PlotInfoDO> plotInfoDOS = plotInfoMapper.selectList("base_id", baseId);
|
|
||||||
|
|
||||||
BigDecimal currentTotalArea = null;
|
|
||||||
if (plotInfoDOS == null || plotInfoDOS.isEmpty()) {
|
|
||||||
currentTotalArea = currentPlotArea;
|
|
||||||
}else{
|
|
||||||
BigDecimal plotTotalArea = plotInfoDOS.stream().map(PlotInfoDO::getPlotArea).filter(area -> area != null).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
||||||
if (null == plotId) {
|
|
||||||
currentTotalArea = plotTotalArea.add(currentPlotArea);
|
|
||||||
}else{
|
|
||||||
PlotInfoDO one = plotInfoMapper.selectOne("id", plotId);
|
|
||||||
currentTotalArea = plotTotalArea.subtract(one.getPlotArea()).add(currentPlotArea);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 计算基地面积
|
|
||||||
BaseInfoDO baseObj = baseInfoMapper.selectOne("id", baseId);
|
|
||||||
BigDecimal baseArea = baseObj.getArea();
|
|
||||||
// 比对
|
|
||||||
return currentTotalArea.compareTo(baseArea) > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean validateTotalPlotArea(String baseId, BigDecimal baseArea) {
|
public boolean validateTotalPlotArea(String baseId, BigDecimal baseArea) {
|
||||||
List<PlotInfoDO> plotInfoDOS = plotInfoMapper.selectList("base_id", baseId);
|
List<PlotInfoDO> plotInfoDOS = plotInfoMapper.selectList("base_id", baseId);
|
||||||
if (plotInfoDOS == null || plotInfoDOS.isEmpty()) {
|
if (plotInfoDOS == null || plotInfoDOS.isEmpty()) {
|
||||||
@@ -340,4 +303,107 @@ public class PlotInfoServiceImpl implements PlotInfoService {
|
|||||||
return plotInfoMapper.selectCount(wrapperX);
|
return plotInfoMapper.selectCount(wrapperX);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ==================== 私有方法 ====================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新地块信息缓存
|
||||||
|
*/
|
||||||
|
private void updatePlotInfoCache(String plotId, String oldBaseId, String oldTenantId) {
|
||||||
|
try {
|
||||||
|
// 1. 从数据库重新查询完整的最新数据
|
||||||
|
PlotInfoDO updatedPlotInfo = plotInfoMapper.selectById(plotId);
|
||||||
|
if (updatedPlotInfo == null) {
|
||||||
|
log.warn("更新缓存时未找到地块信息,地块ID: {}", plotId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 检查基地ID是否发生变化,如果变化需要清理旧索引
|
||||||
|
boolean baseIdChanged = oldBaseId != null && !oldBaseId.equals(updatedPlotInfo.getBaseId());
|
||||||
|
boolean tenantIdChanged = oldTenantId != null && !oldTenantId.equals(updatedPlotInfo.getTenantId());
|
||||||
|
|
||||||
|
if (baseIdChanged || tenantIdChanged) {
|
||||||
|
// 清理旧的索引
|
||||||
|
pCatchService.cleanupOldIndexes(plotId, oldBaseId, oldTenantId);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 更新缓存数据
|
||||||
|
pCatchService.createOrUpdatePlotInfo(updatedPlotInfo);
|
||||||
|
|
||||||
|
log.debug("成功更新地块缓存,地块ID: {}", plotId);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("更新地块缓存失败,地块ID: {}", plotId, e);
|
||||||
|
// 缓存更新失败不应该影响主业务流程
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 降级方案:直接从数据库查询
|
||||||
|
*/
|
||||||
|
private List<PlotInfoDO> fallbackToDatabase(String baseId) {
|
||||||
|
try {
|
||||||
|
List<PlotInfoDO> result = plotInfoMapper.selectList("base_id", baseId);
|
||||||
|
return result != null ? result : Collections.emptyList();
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("降级查询数据库也失败,基地ID: {}", baseId, e);
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validatePlotInfoExists(String id) {
|
||||||
|
if (plotInfoMapper.selectById(id) == null) {
|
||||||
|
throw exception(PLOT_INFO_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validatePlotArea(String baseId, String plotId, BigDecimal updatePlotArea) {
|
||||||
|
boolean flag = this.validateCurrentPlotArea(baseId, plotId, updatePlotArea);
|
||||||
|
if (flag) {
|
||||||
|
throw exception(PLOT_AREA_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean validateCurrentPlotArea(String baseId, String plotId, BigDecimal currentPlotArea) {
|
||||||
|
List<PlotInfoDO> plotInfoDOS = plotInfoMapper.selectList("base_id", baseId);
|
||||||
|
|
||||||
|
BigDecimal currentTotalArea = null;
|
||||||
|
if (plotInfoDOS == null || plotInfoDOS.isEmpty()) {
|
||||||
|
currentTotalArea = currentPlotArea;
|
||||||
|
}else{
|
||||||
|
BigDecimal plotTotalArea = plotInfoDOS.stream().map(PlotInfoDO::getPlotArea).filter(area -> area != null).reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
if (null == plotId) {
|
||||||
|
currentTotalArea = plotTotalArea.add(currentPlotArea);
|
||||||
|
}else{
|
||||||
|
PlotInfoDO one = plotInfoMapper.selectOne("id", plotId);
|
||||||
|
currentTotalArea = plotTotalArea.subtract(one.getPlotArea()).add(currentPlotArea);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算基地面积
|
||||||
|
BaseInfoDO baseObj = baseInfoMapper.selectOne("id", baseId);
|
||||||
|
BigDecimal baseArea = baseObj.getArea();
|
||||||
|
// 比对
|
||||||
|
return currentTotalArea.compareTo(baseArea) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除地块信息缓存
|
||||||
|
*/
|
||||||
|
private void deletePlotInfoCache(PlotInfoDO plotInfo) {
|
||||||
|
try {
|
||||||
|
// 使用缓存服务删除缓存(包括所有索引)
|
||||||
|
pCatchService.deletePlotInfo(
|
||||||
|
plotInfo.getId(),
|
||||||
|
plotInfo.getTenantId(),
|
||||||
|
plotInfo.getBaseId()
|
||||||
|
);
|
||||||
|
|
||||||
|
log.debug("成功删除地块缓存,地块ID: {}, 地块名称: {}", plotInfo.getId(), plotInfo.getPlotName());
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("删除地块缓存失败,地块ID: {}", plotInfo.getId(), e);
|
||||||
|
// 缓存删除失败不应该影响主业务流程,只记录日志
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -14,8 +14,6 @@ public interface PlotLesseeService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 插入数据
|
* 插入数据
|
||||||
*
|
|
||||||
* @param createReqVO
|
|
||||||
*/
|
*/
|
||||||
void insertPlotLessee(PlotInfoSaveReqVO createReqVO, String baseId, String plotId, String plotName);
|
void insertPlotLessee(PlotInfoSaveReqVO createReqVO, String baseId, String plotId, String plotName);
|
||||||
|
|
||||||
@@ -24,31 +22,29 @@ public interface PlotLesseeService {
|
|||||||
*/
|
*/
|
||||||
void updatePlotLessee(PlotInfoSaveReqVO updateReqVO);
|
void updatePlotLessee(PlotInfoSaveReqVO updateReqVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 地块&租户信息
|
||||||
|
*/
|
||||||
|
PlotLesseeInfoRespVO getPlotLessee(String id, PlotInfoDO plotInfo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 导入
|
* 导入
|
||||||
* @param req
|
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
PlotLesseeImportRespVO importPlotLesseeInfoExcel(List<PlotLesseeForImportExcelRespVO> req);
|
PlotLesseeImportRespVO importPlotLesseeInfoExcel(List<PlotLesseeForImportExcelRespVO> req);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 导出
|
* 导出
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
List<PlotLesseeForExportExcelRespVO> exportPlotLesseeInfoExcel();
|
List<PlotLesseeForExportExcelRespVO> exportPlotLesseeInfoExcel();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取租户集合
|
* 获取当前租户
|
||||||
* @param plotId
|
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
List<PlotLesseeDetailsRespVO> getPlotLesseeList(String plotId);
|
List<PlotLesseeDetailsRespVO> getPlotLesseeList(String plotId);
|
||||||
List<PlotLesseeDetailsRespVO> getPlotLesseeHistoryList(String plotId);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 地块&租户信息
|
* 获取历史租户
|
||||||
* @param id
|
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
PlotLesseeInfoRespVO exportPlotLesseeInfoExcel(String id, PlotInfoDO plotInfo);
|
List<PlotLesseeDetailsRespVO> getPlotLesseeHistoryList(String plotId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ public class PlotLesseeServiceImpl implements PlotLesseeService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PlotLesseeInfoRespVO exportPlotLesseeInfoExcel(String id, PlotInfoDO plotInfo) {
|
public PlotLesseeInfoRespVO getPlotLessee(String id, PlotInfoDO plotInfo) {
|
||||||
LambdaQueryWrapperX<PlotLesseeDO> x = new LambdaQueryWrapperX<>();
|
LambdaQueryWrapperX<PlotLesseeDO> x = new LambdaQueryWrapperX<>();
|
||||||
x.eq(PlotLesseeDO::getTenantId, getLoginUser().getTenantId().toString());
|
x.eq(PlotLesseeDO::getTenantId, getLoginUser().getTenantId().toString());
|
||||||
x.eq(PlotLesseeDO::getDeleted, CommonConstants.NO_CODE);
|
x.eq(PlotLesseeDO::getDeleted, CommonConstants.NO_CODE);
|
||||||
|
|||||||
Reference in New Issue
Block a user