Commit 448a9ab0 authored by hanfeng's avatar hanfeng

修改获取区域接口

parent 3a3f4a03
......@@ -4,11 +4,12 @@ import java.util.HashMap;
import java.util.Map;
public enum RegionType {
ALL(-1,"全国"),//这一类型不存在db中,只是用于查询所有国家
COUNTRY(0,"国家"),
COUNTRY(-1,"国家"),//这一类型不存在db中,只是用于查询所有国家
REGION(0,"地区"),
PROVINCE(1,"省/直辖市"),
CITY(2,"市"),
TOWN(3,"镇/县"),
PREFECTUR(3,"县"),
TOWN(4,"镇"),
;
/**
......
......@@ -68,45 +68,53 @@ public class SysRegionBiz extends BaseBiz<SysRegionMapper, SysRegion> {
//获取相应地区类型对应在id的位数,作为对应parent查找其下地区的redis key组成部分
private String getPrefixOfAgencyId(Integer type,Long parentId){
switch(type){
case -1:
return String.valueOf(-1);
case 0:
return String.valueOf(0);
case 1:
return String.valueOf(parentId).substring(0,2);
case 2:
return String.valueOf(parentId).substring(0,4);
default:
throw new CustomIllegalParamException("not valid region");
}
// switch(type){
// case -1:
// return String.valueOf(0);
// case 0:
// return String.valueOf(1);
// case 1:
// return String.valueOf(parentId);
// case 2:
// return String.valueOf(parentId).substring(0,2);
// case 3:
// return String.valueOf(parentId).substring(0,4);
// case 4:
// return String.valueOf(parentId);
// default:
// throw new CustomIllegalParamException("not valid region");
// }
return String.valueOf(parentId);
}
//获取相应地区类型对应在id的位数,作为对应parent查找其下地区的redis key组成部分
private String getPrefixOfAgencyId(Long parentId){
Integer type = getTypeFromId(parentId);
return getPrefixOfAgencyId(type,parentId);
}
// private String getPrefixOfAgencyId(Long parentId){
// Integer type = getTypeFromId(parentId);
// return getPrefixOfAgencyId(type,parentId);
// }
/**
* 根据id获得所属类型
* @param id
* @param parentId
* @return
*/
private Integer getTypeFromId(Long id){
if(id == 0){
return RegionType.ALL.getCode();
}if(id < 10){
return RegionType.COUNTRY.getCode();
}else if(id%100>0){//第1、2非零,即3级地区
return RegionType.TOWN.getCode();
}else if(id%10000>0){//第1、2为零,第3、4位非0,即2级地区
return RegionType.CITY.getCode();
}else{//第1、2、3、4为零,第5、6位非0,即2级地区
return RegionType.PROVINCE.getCode();
}
}
// private Integer getTypeFromId(Long parentId){
// if(parentId == 0) {//国家type-1
// return RegionType.COUNTRY.getCode();
// }if (parentId<2){//地区type 0
// return RegionType.REGION.getCode();
// }if(parentId < 20){//省type 1
// return RegionType.PROVINCE.getCode();
// }else if(parentId%100>0){//第1、2非零,即3级地区 镇一级type 4
// return RegionType.TOWN.getCode();
// }else if(parentId%10000>0){//第1、2为零,第3、4位非0,即2级地区 县type 3
// return RegionType.PREFECTUR.getCode();
// }else{//第1、2、3、4为零,第5、6位非0,即2级地区 市type 2
// return RegionType.CITY.getCode();
// }
// }
/**
* 获取对应redis中的hash的key
......@@ -115,7 +123,7 @@ public class SysRegionBiz extends BaseBiz<SysRegionMapper, SysRegion> {
*/
private String getCacheRedisKey(Long parentId){
//获取相应地区类型对应在agencyId的位数
return RedisKey.SYS_REGION_SONS_CACHE_PREFIX +getPrefixOfAgencyId(parentId);
return RedisKey.SYS_REGION_SONS_CACHE_PREFIX +parentId;
}
/**
......@@ -140,10 +148,10 @@ public class SysRegionBiz extends BaseBiz<SysRegionMapper, SysRegion> {
return getSonRegionNoCache(id);
}
public List<SysRegion> getSonRegionNoCache(Long id){
public List<SysRegion> getSonRegionNoCache(Long parentId){
//从db中查询
SysRegion param = new SysRegion();
param.setParentId(id);
param.setParentId(parentId);
return mapper.select(param);
}
......@@ -158,15 +166,15 @@ public class SysRegionBiz extends BaseBiz<SysRegionMapper, SysRegion> {
/**
* 刷新其孩子节点到缓存,并对其孩子迭代执行此操作
* @param id
* @param parentId
*/
private void refreshCacheRegionAndSon(Long id){
List<SysRegion> sonRegions = getSonRegionNoCache(id);
private void refreshCacheRegionAndSon(Long parentId){
List<SysRegion> sonRegions = getSonRegionNoCache(parentId);
//把当前节点的子节点数据缓存
String redisKey = getCacheRedisKey(id);
String redisKey = getCacheRedisKey(parentId);
customRedisTemplate.opsForValue().set(redisKey,JSON.toJSON(sonRegions).toString());
log.info("完成地区【"+id+"】的子地区数据缓存");
if(CollectionUtils.isEmpty(sonRegions) || getTypeFromId(id).equals(RegionType.CITY.getCode())){
log.info("完成地区【"+parentId+"】的子地区数据缓存");
if(CollectionUtils.isEmpty(sonRegions) || sonRegions.get(0).getType().equals(RegionType.CITY.getCode())){
return;
}
for(SysRegion sonRegion:sonRegions){
......@@ -180,7 +188,7 @@ public class SysRegionBiz extends BaseBiz<SysRegionMapper, SysRegion> {
* 5分钟内刷新数据到缓存
*/
@Scheduled(cron = "0 */5 * * * *")//每5分钟刷新一次数据
public void refreshCache(){
public void refreshCache(){
String redisLockKey = RedisKey.SYS_REGION_REFRESH_LOCK +(DateTime.now().getMinuteOfDay()/5);//同一日每5分钟只刷新一次
Boolean suc = customRedisTemplate.opsForValue().setIfAbsent(redisLockKey, String.valueOf(DateTime.now().getMillis()));
......@@ -203,4 +211,15 @@ public class SysRegionBiz extends BaseBiz<SysRegionMapper, SysRegion> {
.build());
return selectByWeekendSql;
}
/**
* 通过属性获取省
* @param type
* @return
*/
public List<SysRegion> getSysRegionByType(Integer type){
SysRegion sysRegion = new SysRegion();
sysRegion.setType(type);
return mapper.select(sysRegion);
}
}
......@@ -22,12 +22,29 @@ import java.util.List;
public class SysRegionController extends BaseController<SysRegionBiz> {
/**
* 父类id获取子类对象
* @param id
* @return
*/
@IgnoreUserToken
@RequestMapping(value ="/sons/{id}",method = RequestMethod.GET)
public RestResponse<List<SysRegion>> getSonRegion(@PathVariable Long id){
return RestResponse.data(baseBiz.getSonRegion(id));
}
/**
* 通过属性获取省
* @param type
* @return
*/
@IgnoreUserToken
@RequestMapping(value ="/getSonRegionByType/{type}",method = RequestMethod.GET)
public RestResponse<List<SysRegion>> getSysRegionByType(@PathVariable Integer type){
return RestResponse.data(baseBiz.getSysRegionByType(type));
}
@RequestMapping(value ="",method = RequestMethod.GET)
public RestResponse<List<SysRegion>> getRegion(@RequestParam String idListJson){
try {
......
......@@ -8,21 +8,25 @@ import cn.hutool.core.io.file.FileWriter;
import cn.hutool.core.util.PinyinUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.ace.cache.annotation.Cache;
import com.alibaba.fastjson.JSONObject;
import com.github.stuxuhai.jpinyin.PinyinHelper;
import com.github.wxiaoqi.security.common.msg.TableResultResponse;
import com.github.wxiaoqi.security.common.util.Query;
import com.xxfc.platform.vehicle.VehicleApplication;
import com.xxfc.platform.vehicle.biz.SysRegionBiz;
import com.xxfc.platform.vehicle.constant.RedisKey;
import com.xxfc.platform.vehicle.entity.SysRegion;
import lombok.Builder;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.joda.time.DateTime;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.ArrayList;
......@@ -32,10 +36,14 @@ import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes={VehicleApplication.class})
public class RegionTest {
@Autowired
private RedisTemplate customRedisTemplate;
@Autowired
SysRegionBiz sysRegionBiz;
private SysRegionBiz sysRegionBiz;
// public static final String TEST_REDIS_KEY ="redis:{1}";
private final String TEST_REDIS_KEY ="redis:{1}";
@Data
public class Title{
String title;
......@@ -122,4 +130,35 @@ public class RegionTest {
writer.write(JSONUtil.toJsonStr(newCity));
System.out.println("test");
}
@Test
public void test1() {
int i = DateTime.now().getMinuteOfDay() / 5;
System.out.println("DateTime.now().getMinuteOfDay() / 5++++++++++++"+i);
String redisLockKey = RedisKey.SYS_REGION_REFRESH_LOCK +i;//同一日每5分钟只刷新一次
System.out.println("redisLockKey++++++++++++++++"+redisLockKey);
String s = String.valueOf(DateTime.now().getMillis());
System.out.println("s++++++++++++++++++"+s);
Boolean suc = customRedisTemplate.opsForValue().setIfAbsent(redisLockKey, s);
Boolean test1 = customRedisTemplate.opsForValue().setIfAbsent("1", "2");
Boolean test2 = customRedisTemplate.opsForValue().setIfAbsent("1", "3");
System.out.println("test1///////////////////////////////"+test1);
System.out.println("test2///////////////////////////////"+test2);
System.out.println("suc++++++++++++++++++++"+suc);
}
@Test
public void testRedis() {
SysRegion sysRegion = getSysRegion(1);
System.out.println("sysRegion+++++++++"+sysRegion);
System.out.println("TEST_REDIS_KEY+++++++++++" + TEST_REDIS_KEY);
}
@Cache(key = TEST_REDIS_KEY)
private SysRegion getSysRegion(int id){
SysRegion sysRegion = sysRegionBiz.selectById(2);
return sysRegion;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment