@@ -0,0 +1,26 @@ | |||||
package com.ningdatech.kqapi.common.helper; | |||||
import com.ningdatech.kqapi.zzsfw.entity.entity.DscSxAdsShareItemQltQlsxCommonIDVKq; | |||||
import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwMattersDeduplicate; | |||||
import java.util.List; | |||||
/** | |||||
* <p> | |||||
* MatterCacheHelper - | |||||
* </p> | |||||
* | |||||
* @author ZPF | |||||
* @since 13:50 2024/1/3 | |||||
*/ | |||||
public interface MatterCacheHelper { | |||||
NdKqZzsfwMattersDeduplicate getMatter(String qlName,String webapplyurl); | |||||
String getUrl(String qlName); | |||||
List<NdKqZzsfwMattersDeduplicate> all(); | |||||
Boolean refreshAll(); | |||||
} |
@@ -0,0 +1,120 @@ | |||||
package com.ningdatech.kqapi.common.helper.basic; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.github.benmanes.caffeine.cache.Caffeine; | |||||
import com.github.benmanes.caffeine.cache.LoadingCache; | |||||
import com.google.common.collect.Lists; | |||||
import com.google.common.collect.Sets; | |||||
import com.ningdatech.kqapi.common.constant.BizConst; | |||||
import com.ningdatech.kqapi.zzsfw.entity.entity.DscSxAdsShareItemQltQlsxCommonIDVKq; | |||||
import com.ningdatech.kqapi.zzsfw.entity.entity.MatterKey; | |||||
import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwMattersDeduplicate; | |||||
import com.ningdatech.kqapi.zzsfw.service.IDscSxAdsShareItemQltQlsxCommonIDVKqService; | |||||
import com.ningdatech.kqapi.zzsfw.service.INdKqZzsfwMatterDeduplicateService; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.beans.factory.InitializingBean; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import java.util.List; | |||||
import java.util.Objects; | |||||
import java.util.Set; | |||||
import java.util.concurrent.TimeUnit; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* <p> | |||||
* AbstractMatterCache | |||||
* </p> | |||||
* | |||||
* @author ZPF | |||||
* @since 14:41 2023/3/1 | |||||
*/ | |||||
@Slf4j | |||||
public abstract class AbstractMatterCacheHelper implements InitializingBean { | |||||
@Autowired | |||||
private IDscSxAdsShareItemQltQlsxCommonIDVKqService kqService; | |||||
@Autowired | |||||
private INdKqZzsfwMatterDeduplicateService deduplicateService; | |||||
protected LoadingCache<MatterKey, NdKqZzsfwMattersDeduplicate> mattersDupCache; | |||||
protected LoadingCache<String, String> mattersUrlCache; | |||||
private Boolean initMatterCache() { | |||||
List<DscSxAdsShareItemQltQlsxCommonIDVKq> allMatters = kqService | |||||
.list(Wrappers.lambdaQuery(DscSxAdsShareItemQltQlsxCommonIDVKq.class) | |||||
.select(DscSxAdsShareItemQltQlsxCommonIDVKq::getRowguid,DscSxAdsShareItemQltQlsxCommonIDVKq::getQlName, | |||||
DscSxAdsShareItemQltQlsxCommonIDVKq::getWebapplyurl) | |||||
.isNotNull(DscSxAdsShareItemQltQlsxCommonIDVKq::getWebapplyurl)); | |||||
if (allMatters.isEmpty()) { | |||||
log.warn("事项数据未初始化"); | |||||
return Boolean.FALSE; | |||||
} | |||||
allMatters.forEach(m -> { | |||||
MatterKey key = MatterKey.of(m.getQlName(),m.getWebapplyurl()); | |||||
mattersUrlCache.put(m.getQlName(),m.getWebapplyurl()); | |||||
if(mattersDupCache.asMap().containsKey(key)){ | |||||
NdKqZzsfwMattersDeduplicate dup = mattersDupCache.get(key); | |||||
dup.setCountNum(dup.getCountNum() + 1); | |||||
mattersDupCache.put(key,dup); | |||||
}else{ | |||||
mattersDupCache.put(key,NdKqZzsfwMattersDeduplicate.of(m.getQlName(),m.getWebapplyurl())); | |||||
} | |||||
}); | |||||
return Boolean.TRUE; | |||||
} | |||||
protected NdKqZzsfwMattersDeduplicate get(String qlName,String url) { | |||||
MatterKey key = MatterKey.of(qlName, url); | |||||
return mattersDupCache.get(key); | |||||
} | |||||
protected String getUrl(String qlName) { | |||||
return mattersUrlCache.get(qlName); | |||||
} | |||||
protected List<NdKqZzsfwMattersDeduplicate> all() { | |||||
return Lists.newArrayList(mattersDupCache.asMap().values()); | |||||
} | |||||
@Override | |||||
public void afterPropertiesSet() { | |||||
mattersUrlCache = Caffeine.newBuilder() | |||||
.refreshAfterWrite(7, TimeUnit.DAYS) | |||||
.maximumSize(1024 * 100) | |||||
.build(key -> { | |||||
DscSxAdsShareItemQltQlsxCommonIDVKq matter = kqService.getOne(Wrappers.lambdaQuery(DscSxAdsShareItemQltQlsxCommonIDVKq.class) | |||||
.eq(DscSxAdsShareItemQltQlsxCommonIDVKq::getQlName, key) | |||||
.last(BizConst.LIMIT_1) | |||||
.isNotNull(DscSxAdsShareItemQltQlsxCommonIDVKq::getWebapplyurl)); | |||||
if (Objects.isNull(matter)) { | |||||
//查不到直接返回null | |||||
return null; | |||||
} | |||||
return matter.getWebapplyurl(); | |||||
}); | |||||
mattersDupCache = Caffeine.newBuilder() | |||||
.refreshAfterWrite(7, TimeUnit.DAYS) | |||||
.maximumSize(1024 * 100) | |||||
.build(key -> { | |||||
NdKqZzsfwMattersDeduplicate dup = deduplicateService.getOne(Wrappers.lambdaQuery(NdKqZzsfwMattersDeduplicate.class) | |||||
.eq(NdKqZzsfwMattersDeduplicate::getQlName, key) | |||||
.last(BizConst.LIMIT_1) | |||||
.isNotNull(NdKqZzsfwMattersDeduplicate::getWebapplyurl)); | |||||
if (Objects.isNull(dup)) { | |||||
//查不到直接返回null | |||||
return null; | |||||
} | |||||
return dup; | |||||
}); | |||||
// 初始化所有事项数据到缓存 | |||||
initMatterCache(); | |||||
} | |||||
public Boolean init() { | |||||
// 初始化所有事项数据到缓存 | |||||
return initMatterCache(); | |||||
} | |||||
} |
@@ -0,0 +1,46 @@ | |||||
package com.ningdatech.kqapi.common.helper.impl; | |||||
import com.ningdatech.kqapi.common.helper.MatterCacheHelper; | |||||
import com.ningdatech.kqapi.common.helper.basic.AbstractMatterCacheHelper; | |||||
import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwMattersDeduplicate; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
import org.springframework.stereotype.Component; | |||||
import java.util.List; | |||||
/** | |||||
* @author ZPF | |||||
* @date 2024/1/3 上午8:58 | |||||
*/ | |||||
@Slf4j | |||||
@Component | |||||
public class MattersCacheHelperImpl extends AbstractMatterCacheHelper implements MatterCacheHelper { | |||||
@Override | |||||
public NdKqZzsfwMattersDeduplicate getMatter(String qlName,String webapplyurl) { | |||||
if (StringUtils.isBlank(qlName) || StringUtils.isBlank(webapplyurl)) { | |||||
return null; | |||||
} | |||||
return super.get(qlName, webapplyurl); | |||||
} | |||||
@Override | |||||
public String getUrl(String qlName) { | |||||
if (StringUtils.isBlank(qlName)) { | |||||
return null; | |||||
} | |||||
return super.getUrl(qlName); | |||||
} | |||||
@Override | |||||
public List<NdKqZzsfwMattersDeduplicate> all() { | |||||
return super.all(); | |||||
} | |||||
@Override | |||||
public Boolean refreshAll() { | |||||
return super.init(); | |||||
} | |||||
} |
@@ -69,4 +69,10 @@ public class NdKqZzsfwMenuController { | |||||
public String removeAllDup() { | public String removeAllDup() { | ||||
return matterManage.removeAllDup(); | return matterManage.removeAllDup(); | ||||
} | } | ||||
@ApiOperation(value = "同步数据", notes = "同步数据") | |||||
@GetMapping("/syn") | |||||
public String synData() { | |||||
return matterManage.synData(); | |||||
} | |||||
} | } |
@@ -0,0 +1,24 @@ | |||||
package com.ningdatech.kqapi.zzsfw.entity.entity; | |||||
import lombok.Data; | |||||
/** | |||||
* @Classname MatterKey | |||||
* @Description | |||||
* @Date 2024/1/3 11:13 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Data | |||||
public class MatterKey { | |||||
private String qlName; | |||||
private String webapplyurl; | |||||
public static MatterKey of(String qlName, String webapplyurl) { | |||||
MatterKey matterKey = new MatterKey(); | |||||
matterKey.setQlName(qlName); | |||||
matterKey.setWebapplyurl(webapplyurl); | |||||
return matterKey; | |||||
} | |||||
} |
@@ -39,5 +39,13 @@ public class NdKqZzsfwMattersDeduplicate implements Serializable { | |||||
private String webapplyurl; | private String webapplyurl; | ||||
@ApiModelProperty("重复数") | @ApiModelProperty("重复数") | ||||
private Integer countNum; | |||||
private Integer countNum = 0; | |||||
public static NdKqZzsfwMattersDeduplicate of(String qlName, String webapplyurl) { | |||||
NdKqZzsfwMattersDeduplicate dup = new NdKqZzsfwMattersDeduplicate(); | |||||
dup.setQlName(qlName); | |||||
dup.setWebapplyurl(webapplyurl); | |||||
dup.setCountNum(1); | |||||
return dup; | |||||
} | |||||
} | } |
@@ -2,14 +2,15 @@ package com.ningdatech.kqapi.zzsfw.manage; | |||||
import cn.hutool.core.bean.BeanUtil; | import cn.hutool.core.bean.BeanUtil; | ||||
import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||
import cn.hutool.core.date.StopWatch; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.ningdatech.kqapi.common.enumeration.CommonEnum; | import com.ningdatech.kqapi.common.enumeration.CommonEnum; | ||||
import com.ningdatech.kqapi.common.helper.MatterCacheHelper; | |||||
import com.ningdatech.kqapi.zzsfw.constants.ZzsfwMenuConstant; | import com.ningdatech.kqapi.zzsfw.constants.ZzsfwMenuConstant; | ||||
import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwMattersDeduplicateDTO; | import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwMattersDeduplicateDTO; | ||||
import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwMenuDTO; | import com.ningdatech.kqapi.zzsfw.entity.dto.NdKqZzsfwMenuDTO; | ||||
import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwMattersDeduplicate; | import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwMattersDeduplicate; | ||||
import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwMenu; | import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwMenu; | ||||
import com.ningdatech.kqapi.zzsfw.entity.entity.NdKqZzsfwPolicy; | |||||
import com.ningdatech.kqapi.zzsfw.entity.vo.MatterTopVO; | import com.ningdatech.kqapi.zzsfw.entity.vo.MatterTopVO; | ||||
import com.ningdatech.kqapi.zzsfw.entity.vo.TreeVO; | import com.ningdatech.kqapi.zzsfw.entity.vo.TreeVO; | ||||
import com.ningdatech.kqapi.zzsfw.service.INdKqZzsfwMatterDeduplicateService; | import com.ningdatech.kqapi.zzsfw.service.INdKqZzsfwMatterDeduplicateService; | ||||
@@ -37,6 +38,8 @@ public class MatterManage { | |||||
private final INdKqZzsfwMatterDeduplicateService matterDeduplicateService; | private final INdKqZzsfwMatterDeduplicateService matterDeduplicateService; | ||||
private final MatterCacheHelper matterCacheHelper; | |||||
public List<TreeVO> getMatters() { | public List<TreeVO> getMatters() { | ||||
List<NdKqZzsfwMenu> matters = menuService.list(Wrappers.lambdaQuery(NdKqZzsfwMenu.class) | List<NdKqZzsfwMenu> matters = menuService.list(Wrappers.lambdaQuery(NdKqZzsfwMenu.class) | ||||
.isNotNull(NdKqZzsfwMenu::getWebapplyurl) | .isNotNull(NdKqZzsfwMenu::getWebapplyurl) | ||||
@@ -146,4 +149,38 @@ public class MatterManage { | |||||
matterDeduplicateService.remove(Wrappers.lambdaQuery(NdKqZzsfwMattersDeduplicate.class)); | matterDeduplicateService.remove(Wrappers.lambdaQuery(NdKqZzsfwMattersDeduplicate.class)); | ||||
return "删除成功"; | return "删除成功"; | ||||
} | } | ||||
public String synData() { | |||||
log.info("政务数据 ===================== 同步开始"); | |||||
StopWatch stopWatch = new StopWatch(); | |||||
stopWatch.start(); | |||||
//1.处理 去重数据 | |||||
if(matterCacheHelper.refreshAll()){ | |||||
removeAllDup(); | |||||
List<NdKqZzsfwMattersDeduplicate> allDup = matterCacheHelper.all(); | |||||
matterDeduplicateService.saveBatch(allDup); | |||||
//2. 事项 | |||||
List<NdKqZzsfwMenu> menus = menuService.list(); | |||||
for(NdKqZzsfwMenu menu : menus){ | |||||
String url = matterCacheHelper.getUrl(menu.getItemName()); | |||||
if(StringUtils.isBlank(url)){ | |||||
menuService.update(Wrappers.lambdaUpdate(NdKqZzsfwMenu.class) | |||||
.eq(NdKqZzsfwMenu::getId,menu.getId()) | |||||
.set(NdKqZzsfwMenu::getWebapplyurl,null) | |||||
.set(NdKqZzsfwMenu::getHasUrl,CommonEnum.NO.getCode())); | |||||
}else{ | |||||
menuService.update(Wrappers.lambdaUpdate(NdKqZzsfwMenu.class) | |||||
.eq(NdKqZzsfwMenu::getId,menu.getId()) | |||||
.set(NdKqZzsfwMenu::getWebapplyurl,url) | |||||
.set(NdKqZzsfwMenu::getHasUrl,CommonEnum.YES.getCode())); | |||||
} | |||||
} | |||||
} | |||||
stopWatch.stop(); | |||||
log.info("政务数据 ===================== 同步总共耗时 :{} s",stopWatch.getTotalTimeSeconds()); | |||||
return "同步成功 耗时 :" + stopWatch.getTotalTimeSeconds() + "s"; | |||||
} | |||||
} | } |