From 3a80bc01937688a62dffadf6a6543c812b924550 Mon Sep 17 00:00:00 2001 From: zwjsec Date: Wed, 17 Jul 2024 14:51:50 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90feature=E3=80=91=E6=8E=A8=E8=8D=90?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=B1=BB=E5=88=AB=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/PackageConstant.java | 34 +++ .../gateway/OperationConfigGateway.java | 27 ++- .../OperationConfigGatewayImpl.java | 35 +++ .../java/com/easysoftware/ranking/Ranker.java | 8 +- .../com/easysoftware/ranking/RankerImpl.java | 213 +++++++++++++++++- 5 files changed, 310 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/easysoftware/common/constant/PackageConstant.java b/src/main/java/com/easysoftware/common/constant/PackageConstant.java index 12d13c7..79379cb 100644 --- a/src/main/java/com/easysoftware/common/constant/PackageConstant.java +++ b/src/main/java/com/easysoftware/common/constant/PackageConstant.java @@ -119,4 +119,38 @@ public final class PackageConstant { * table name of RPMPackageDO. */ public static final String RPM_PKG_TABLE = "rpm_pkg_base"; + + /** + * Change the category of rpm. + */ + public static final String RPM_PKG_TABLE_CHANGE = "UPDATE rpm_pkg_base SET category = ? WHERE name = ?"; + + /** + * Change the category of application. + */ + public static final String APPLICATION_TABLE_CHANGE = "UPDATE application_package SET category = ? WHERE name = ?"; + + /** + * Change the category of oepkg. + */ + public static final String OEPKG_CHANGE = "UPDATE oepkg SET category = ? WHERE name = ?"; + + /** + * Change the category of epkg. + */ + public static final String EPKG_CHANGE = "UPDATE epkg_pkg SET category = ? WHERE name = ?"; + + /** + * Change the category of filed. + */ + public static final String FIELD_CHANGE = "UPDATE field_package SET category = ? WHERE name = ?"; + + /** + * Change the category of filed. + */ + public static final String DOMAIN_CHANGE = "UPDATE domain_package SET category = ? WHERE name = ?"; + /** + * Constan refresh timer. + */ + public static final long TIMER = 10 * 60000; } diff --git a/src/main/java/com/easysoftware/domain/operationconfig/gateway/OperationConfigGateway.java b/src/main/java/com/easysoftware/domain/operationconfig/gateway/OperationConfigGateway.java index 9c8f44b..78cccdb 100644 --- a/src/main/java/com/easysoftware/domain/operationconfig/gateway/OperationConfigGateway.java +++ b/src/main/java/com/easysoftware/domain/operationconfig/gateway/OperationConfigGateway.java @@ -17,10 +17,33 @@ import java.util.List; public interface OperationConfigGateway { /** - * Select all operation configurations and return them as a list of OperationConfigVo objects. + * Select all operation configurations and return them as a list of + * OperationConfigVo objects. * - * @return A list of OperationConfigVo objects containing all operation configurations + * @return A list of OperationConfigVo objects containing all operation + * configurations */ List selectAll(); + /** + * Select all operation configurations with type = domainpage and return them as + * a list of + * OperationConfigVo objects. + * + * @return A list of OperationConfigVo objects containing all operation + * configurations + */ + List selectRankingConfig(); + + /** + * Select all operation configurations with type = category_changes and return + * them as + * a list of + * OperationConfigVo objects. + * + * @return A list of OperationConfigVo objects containing all operation + * configurations + */ + List selectCategoryChanges(); + } diff --git a/src/main/java/com/easysoftware/infrastructure/operationconfig/gatewayimpl/OperationConfigGatewayImpl.java b/src/main/java/com/easysoftware/infrastructure/operationconfig/gatewayimpl/OperationConfigGatewayImpl.java index 6747fde..23451f1 100644 --- a/src/main/java/com/easysoftware/infrastructure/operationconfig/gatewayimpl/OperationConfigGatewayImpl.java +++ b/src/main/java/com/easysoftware/infrastructure/operationconfig/gatewayimpl/OperationConfigGatewayImpl.java @@ -11,6 +11,7 @@ package com.easysoftware.infrastructure.operationconfig.gatewayimpl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.easysoftware.application.operationconfig.vo.OperationConfigVo; import com.easysoftware.domain.operationconfig.gateway.OperationConfigGateway; import com.easysoftware.infrastructure.mapper.OperationConfigDOMapper; @@ -41,4 +42,38 @@ public class OperationConfigGatewayImpl implements OperationConfigGateway { List doList = mapper.selectList(null); return OperationConfigConverter.toVo(doList); } + + /** + * Select all operation configurations withe type = domainPage and return them + * as a list of + * OperationConfigVo objects. + * + * @return A list of OperationConfigVo objects containing all operation + * configurations + */ + @Override + public List selectRankingConfig() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("type", "domainPage"); + List doList = mapper.selectList(wrapper); + + return OperationConfigConverter.toVo(doList); + } + + /** + * Select all operation configurations with type = category_changes and return + * them as + * a list of + * OperationConfigVo objects. + * + * @return A list of OperationConfigVo objects containing all operation + * configurations + */ + public List selectCategoryChanges() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("type", "category_change"); + List doList = mapper.selectList(wrapper); + + return OperationConfigConverter.toVo(doList); + } } diff --git a/src/main/java/com/easysoftware/ranking/Ranker.java b/src/main/java/com/easysoftware/ranking/Ranker.java index cc5bf1c..a4d051a 100644 --- a/src/main/java/com/easysoftware/ranking/Ranker.java +++ b/src/main/java/com/easysoftware/ranking/Ranker.java @@ -14,7 +14,6 @@ package com.easysoftware.ranking; import java.util.Map; import java.util.List; - public interface Ranker { /** * Rank domain pages based on operation configuration. @@ -32,4 +31,11 @@ public interface Ranker { */ List> rankingDomainPageByAlgorithm(List> domainPage); + /** + * change the category by operation config. + * + * @return wheter change is sucessce. + */ + boolean changeCategoryByConfig(); + } diff --git a/src/main/java/com/easysoftware/ranking/RankerImpl.java b/src/main/java/com/easysoftware/ranking/RankerImpl.java index f16f220..2b77488 100644 --- a/src/main/java/com/easysoftware/ranking/RankerImpl.java +++ b/src/main/java/com/easysoftware/ranking/RankerImpl.java @@ -11,29 +11,234 @@ package com.easysoftware.ranking; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; + import com.easysoftware.application.filedapplication.vo.FiledApplicationVo; import com.easysoftware.application.operationconfig.vo.OperationConfigVo; +import com.easysoftware.common.constant.PackageConstant; +import com.easysoftware.common.exception.ParamErrorException; import com.easysoftware.common.utils.SortUtil; import com.easysoftware.domain.operationconfig.gateway.OperationConfigGateway; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.SQLException; import java.util.ArrayList; import java.util.Comparator; import java.util.Iterator; +import java.sql.Connection; +import java.sql.ResultSet; +import org.springframework.scheduling.annotation.Scheduled; @Component public class RankerImpl implements Ranker { + /** + * Logger for FieldApplicationServiceImpl. + */ + private static final Logger LOGGER = LoggerFactory.getLogger(RankerImpl.class); /** * OperationConfigGateway instance for handling operation configurations. */ @Autowired private OperationConfigGateway configGateway; + /** + * database url. + */ + @Value("${spring.datasource.url}") + private String url; + + /** + * database username. + */ + @Value("${spring.datasource.username}") + private String user; + + /** + * database password. + */ + @Value("${spring.datasource.password}") + private String password; + + /** + * change the category by operation config. + * + * @return wheter change is sucessce. + */ + @Scheduled(fixedRate = PackageConstant.TIMER) // 每5min执行一次 + public boolean changeCategoryByConfig() { + List changeConfig = configGateway.selectCategoryChanges(); + + // 任何事务失败均失败,需retry + // step1 事务更新rpm基表数据 + if (!updateTransaction(changeConfig, PackageConstant.RPM_PKG_TABLE_CHANGE)) { + return false; + } + // step2 事务更新app基表数据 + if (!updateTransaction(changeConfig, PackageConstant.APPLICATION_TABLE_CHANGE)) { + return false; + } + + // step3 事务更新oepkg基表数据 + if (!updateTransaction(changeConfig, PackageConstant.OEPKG_CHANGE)) { + return false; + } + + // step4 事务更新epkg基表数据 + if (!updateTransaction(changeConfig, PackageConstant.EPKG_CHANGE)) { + return false; + } + + // step5 事务更新filed基表数据 + if (!updateTransaction(changeConfig, PackageConstant.FIELD_CHANGE)) { + return false; + } + + // step6 移动filedpackage数据至首页domain展示 + if (!insertTransaction(changeConfig)) { + return false; + } + return true; + + } + + /** + * transactionally insertTransaction the category by config. + * + * @param changeConfig list of change config + * @return wheter success + */ + private boolean insertTransaction(List changeConfig) { + Connection conn = null; + try { + conn = DriverManager.getConnection(url, user, password); + // 关闭自动提交 + conn.setAutoCommit(false); + } catch (SQLException e) { + throw new ParamErrorException("get sql seesion failed"); + } + PreparedStatement pstmt = null; + PreparedStatement exsitmt = null; + PreparedStatement refreshtmt = null; + try { + String sql = "INSERT into domain_package SELECT * from field_package WHERE name = ? GROUP BY name"; + String exsitSql = "SELECT name from domain_package WHERE name = ?"; + for (OperationConfigVo config : changeConfig) { + exsitmt = conn.prepareStatement(exsitSql); + exsitmt.setString(1, config.getRecommend()); + ResultSet rs = exsitmt.executeQuery(); + // 已存在数据则刷新 不插入 + if (rs.next()) { + refreshtmt = conn.prepareStatement(PackageConstant.DOMAIN_CHANGE); + refreshtmt.setString(1, config.getCategorys()); + refreshtmt.setString(2, config.getRecommend()); + refreshtmt.executeUpdate(); + continue; + } + pstmt = conn.prepareStatement(sql); + pstmt.setString(1, config.getRecommend()); + pstmt.executeUpdate(); + } + + conn.commit(); + + } catch (SQLException e) { + try { + if (conn != null) { + conn.rollback(); + LOGGER.error("error hanpend in transaction. trans roll back"); + } + } catch (SQLException ex) { + throw new ParamErrorException("trans roll back"); + } + + throw new ParamErrorException("sql excute error"); + } finally { + try { + if (exsitmt != null) { + exsitmt.close(); + } + if (refreshtmt != null) { + refreshtmt.close(); + } + if (pstmt != null) { + pstmt.close(); + } + if (conn != null) { + conn.close(); + } + } catch (SQLException e) { + throw new ParamErrorException("sql cloesd error"); + } + } + + return true; + } + + /** + * transactionally update the category by config. + * + * @param sqlTemplate the default update sql template + * @param changeConfig list of change config + * @return wheter success + */ + private boolean updateTransaction(List changeConfig, String sqlTemplate) { + + Connection conn = null; + try { + conn = DriverManager.getConnection(url, user, password); + // 关闭自动提交 + conn.setAutoCommit(false); + } catch (SQLException e) { + throw new ParamErrorException("get sql seesion failed"); + } + PreparedStatement pstmt = null; + try { + + for (OperationConfigVo config : changeConfig) { + pstmt = conn.prepareStatement(sqlTemplate); + pstmt.setString(1, config.getCategorys()); + pstmt.setString(2, config.getRecommend()); + pstmt.executeUpdate(); + } + + conn.commit(); + + } catch (SQLException e) { + try { + if (conn != null) { + conn.rollback(); + LOGGER.error("error hanpend in transaction. trans roll back"); + } + } catch (SQLException ex) { + throw new ParamErrorException("trans roll back"); + } + + throw new ParamErrorException("sql excute error"); + } finally { + try { + if (pstmt != null) { + pstmt.close(); + } + if (conn != null) { + conn.close(); + } + } catch (SQLException e) { + throw new ParamErrorException("sql cloesd error"); + } + } + + return true; + } + /** * Rank domain pages based on a specific algorithm. * @@ -52,7 +257,7 @@ public class RankerImpl implements Ranker { */ public List> rankingDomainPageByOperationConfig(final List> domainPage) { - List rankingConfig = configGateway.selectAll(); + List rankingConfig = configGateway.selectRankingConfig(); // 再排序,避免数据库写入顺序错乱 rankingConfig.sort(Comparator.comparingInt(o -> Integer.parseInt(o.getOrderIndex()))); @@ -79,7 +284,8 @@ public class RankerImpl implements Ranker { /** * merge rankedlist in OperationConfig and unRankedList. - * @param rankedList rankedList. + * + * @param rankedList rankedList. * @param unRandedList unRandedList. * @return list of entity. */ @@ -89,8 +295,7 @@ public class RankerImpl implements Ranker { res.addAll(rankedList); Map>> map = unRandedList.stream().collect( - Collectors.groupingBy(e -> String.valueOf(e.get("name"))) - ); + Collectors.groupingBy(e -> String.valueOf(e.get("name")))); List sortedCategories = SortUtil.sortCategoryColumn(map.keySet()); for (String sortedCategory : sortedCategories) { List> list = map.get(sortedCategory); -- Gitee