mirror of https://gitee.com/stylefeng/roses
				
				
				
			【8.0.1】【db】更新最大排序数获取方法
							parent
							
								
									a6769cbda0
								
							
						
					
					
						commit
						246a0dc005
					
				| 
						 | 
				
			
			@ -0,0 +1,26 @@
 | 
			
		|||
package cn.stylefeng.roses.kernel.db.api.maxsort;
 | 
			
		||||
 | 
			
		||||
import lombok.AllArgsConstructor;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 获取表中排序字段最大数的封装
 | 
			
		||||
 *
 | 
			
		||||
 * @author fengshuonan
 | 
			
		||||
 * @since 2023/10/29 16:58
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
@AllArgsConstructor
 | 
			
		||||
public class MaxCountConfig {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 表名称
 | 
			
		||||
     */
 | 
			
		||||
    private String tableName;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 排序字段的名称
 | 
			
		||||
     */
 | 
			
		||||
    private String sortFieldName;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
package cn.stylefeng.roses.kernel.db.api.maxsort;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 获取最大排序字段配置的接口
 | 
			
		||||
 *
 | 
			
		||||
 * @author fengshuonan
 | 
			
		||||
 * @since 2023/10/29 17:03
 | 
			
		||||
 */
 | 
			
		||||
public interface MaxSortCollectorApi {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 通过此接口采集各个模块的最大排序数字的配置
 | 
			
		||||
     *
 | 
			
		||||
     * @author fengshuonan
 | 
			
		||||
     * @since 2023/10/29 17:05
 | 
			
		||||
     */
 | 
			
		||||
    Map<String, MaxCountConfig> createMaxSortConfigs();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,37 @@
 | 
			
		|||
package cn.stylefeng.roses.kernel.db.api.maxsort.context;
 | 
			
		||||
 | 
			
		||||
import cn.stylefeng.roses.kernel.db.api.maxsort.MaxCountConfig;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 获取最大排序字段配置的上下文容器
 | 
			
		||||
 *
 | 
			
		||||
 * @author fengshuonan
 | 
			
		||||
 * @since 2023/10/29 17:24
 | 
			
		||||
 */
 | 
			
		||||
public class MaxSortConfigContext {
 | 
			
		||||
 | 
			
		||||
    private static Map<String, MaxCountConfig> MAX_COUNT_CONFIG_MAP = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 从配置容器获取配置
 | 
			
		||||
     *
 | 
			
		||||
     * @author fengshuonan
 | 
			
		||||
     * @since 2023/10/29 17:24
 | 
			
		||||
     */
 | 
			
		||||
    public static MaxCountConfig getConfig(String code) {
 | 
			
		||||
        return MAX_COUNT_CONFIG_MAP.get(code);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 初始化配置
 | 
			
		||||
     *
 | 
			
		||||
     * @author fengshuonan
 | 
			
		||||
     * @since 2023/10/29 17:24
 | 
			
		||||
     */
 | 
			
		||||
    public static void initConfig(Map<String, MaxCountConfig> totalConfigs) {
 | 
			
		||||
        MAX_COUNT_CONFIG_MAP = totalConfigs;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,76 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright [2020-2030] [https://www.stylefeng.cn]
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 * http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 *
 | 
			
		||||
 * Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
 | 
			
		||||
 *
 | 
			
		||||
 * 1.请不要删除和修改根目录下的LICENSE文件。
 | 
			
		||||
 * 2.请不要删除和修改Guns源码头部的版权声明。
 | 
			
		||||
 * 3.请保留源码和相关描述文件的项目出处,作者声明等。
 | 
			
		||||
 * 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns
 | 
			
		||||
 * 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns
 | 
			
		||||
 * 6.若您的项目无法满足以上几点,可申请商业授权
 | 
			
		||||
 */
 | 
			
		||||
package cn.stylefeng.roses.kernel.db.api.maxsort.listener;
 | 
			
		||||
 | 
			
		||||
import cn.stylefeng.roses.kernel.db.api.maxsort.MaxCountConfig;
 | 
			
		||||
import cn.stylefeng.roses.kernel.db.api.maxsort.MaxSortCollectorApi;
 | 
			
		||||
import cn.stylefeng.roses.kernel.db.api.maxsort.context.MaxSortConfigContext;
 | 
			
		||||
import cn.stylefeng.roses.kernel.rule.listener.ApplicationStartedListener;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.beans.BeansException;
 | 
			
		||||
import org.springframework.boot.context.event.ApplicationStartedEvent;
 | 
			
		||||
import org.springframework.core.Ordered;
 | 
			
		||||
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 项目启动后,获取所有表的最大排序数的配置
 | 
			
		||||
 *
 | 
			
		||||
 * @author fengshuonan
 | 
			
		||||
 * @since 2023/10/29 17:17
 | 
			
		||||
 */
 | 
			
		||||
@Slf4j
 | 
			
		||||
public class TableMaxSortConfigListener extends ApplicationStartedListener implements Ordered {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void eventCallback(ApplicationStartedEvent event) {
 | 
			
		||||
 | 
			
		||||
        // 获取所有的配置信息
 | 
			
		||||
        Map<String, MaxSortCollectorApi> maxSortCollectorApiMap = null;
 | 
			
		||||
        try {
 | 
			
		||||
            maxSortCollectorApiMap = event.getApplicationContext().getBeansOfType(MaxSortCollectorApi.class);
 | 
			
		||||
        } catch (BeansException e) {
 | 
			
		||||
            // ignore
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 添加到配置容器中
 | 
			
		||||
        Collection<MaxSortCollectorApi> values = maxSortCollectorApiMap.values();
 | 
			
		||||
        Map<String, MaxCountConfig> totalConfigs = new HashMap<>();
 | 
			
		||||
        for (MaxSortCollectorApi value : values) {
 | 
			
		||||
            Map<String, MaxCountConfig> maxSortConfigs = value.createMaxSortConfigs();
 | 
			
		||||
            totalConfigs.putAll(maxSortConfigs);
 | 
			
		||||
        }
 | 
			
		||||
        MaxSortConfigContext.initConfig(totalConfigs);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getOrder() {
 | 
			
		||||
        return LOWEST_PRECEDENCE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -85,6 +85,12 @@ public class DbOperatorImpl implements DbOperatorApi {
 | 
			
		|||
        String sql = StrUtil.format(sqlTemplate, fieldName, tempFieldName, tableName);
 | 
			
		||||
 | 
			
		||||
        Map<String, Object> oneResult = SqlRunner.db().selectOne(sql);
 | 
			
		||||
 | 
			
		||||
        // 查询不到,直接返回最大值-100
 | 
			
		||||
        if (oneResult == null) {
 | 
			
		||||
            return -100L;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Object maxSort = oneResult.get(tempFieldName);
 | 
			
		||||
 | 
			
		||||
        return Convert.toLong(maxSort);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,3 +4,5 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
 | 
			
		|||
  cn.stylefeng.roses.kernel.db.starter.ProjectMyBatisPlusAutoConfiguration,\
 | 
			
		||||
  cn.stylefeng.roses.kernel.db.starter.ProjectDruidMonitorAutoConfiguration,\
 | 
			
		||||
  cn.stylefeng.roses.kernel.db.starter.RemoveDruidAdAutoConfiguration
 | 
			
		||||
org.springframework.context.ApplicationListener=\
 | 
			
		||||
  cn.stylefeng.roses.kernel.db.api.maxsort.listener.TableMaxSortConfigListener
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,36 @@
 | 
			
		|||
package cn.stylefeng.roses.kernel.sys.api.exception.enums;
 | 
			
		||||
 | 
			
		||||
import cn.stylefeng.roses.kernel.rule.constants.RuleConstants;
 | 
			
		||||
import cn.stylefeng.roses.kernel.rule.exception.AbstractExceptionEnum;
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 获取最大排序数量
 | 
			
		||||
 *
 | 
			
		||||
 * @author fengshuonan
 | 
			
		||||
 * @since 2023/10/29 17:46
 | 
			
		||||
 */
 | 
			
		||||
@Getter
 | 
			
		||||
public enum MaxSortExceptionEnum implements AbstractExceptionEnum {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 编码不存在
 | 
			
		||||
     */
 | 
			
		||||
    CANT_FIND_CODE(RuleConstants.USER_OPERATION_ERROR_TYPE_CODE + "10001", "编码不存在,无法获取");
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 错误编码
 | 
			
		||||
     */
 | 
			
		||||
    private final String errorCode;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 提示用户信息
 | 
			
		||||
     */
 | 
			
		||||
    private final String userTip;
 | 
			
		||||
 | 
			
		||||
    MaxSortExceptionEnum(String errorCode, String userTip) {
 | 
			
		||||
        this.errorCode = errorCode;
 | 
			
		||||
        this.userTip = userTip;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,26 @@
 | 
			
		|||
package cn.stylefeng.roses.kernel.sys.api.maxsort;
 | 
			
		||||
 | 
			
		||||
import cn.stylefeng.roses.kernel.db.api.maxsort.MaxCountConfig;
 | 
			
		||||
import cn.stylefeng.roses.kernel.db.api.maxsort.MaxSortCollectorApi;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * system模块的最大排序数获取的配置
 | 
			
		||||
 *
 | 
			
		||||
 * @author fengshuonan
 | 
			
		||||
 * @since 2023/10/29 17:51
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class SystemMaxSortFieldConfig implements MaxSortCollectorApi {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Map<String, MaxCountConfig> createMaxSortConfigs() {
 | 
			
		||||
        HashMap<String, MaxCountConfig> stringMaxCountConfigHashMap = new HashMap<>();
 | 
			
		||||
        stringMaxCountConfigHashMap.put("user", new MaxCountConfig("sys_user", "user_sort"));
 | 
			
		||||
        return stringMaxCountConfigHashMap;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,52 @@
 | 
			
		|||
package cn.stylefeng.roses.kernel.sys.modular.common;
 | 
			
		||||
 | 
			
		||||
import cn.stylefeng.roses.kernel.db.api.DbOperatorApi;
 | 
			
		||||
import cn.stylefeng.roses.kernel.db.api.maxsort.MaxCountConfig;
 | 
			
		||||
import cn.stylefeng.roses.kernel.db.api.maxsort.context.MaxSortConfigContext;
 | 
			
		||||
import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
 | 
			
		||||
import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData;
 | 
			
		||||
import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
 | 
			
		||||
import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
 | 
			
		||||
import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
 | 
			
		||||
import cn.stylefeng.roses.kernel.sys.api.exception.enums.MaxSortExceptionEnum;
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestParam;
 | 
			
		||||
import org.springframework.web.bind.annotation.RestController;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 最大排序获取
 | 
			
		||||
 *
 | 
			
		||||
 * @author fengshuonan
 | 
			
		||||
 * @since 2023/10/29 17:08
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@ApiResource(name = "最大排序获取")
 | 
			
		||||
public class MaxCountController {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private DbOperatorApi dbOperatorApi;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 业务排序获取
 | 
			
		||||
     * <p>
 | 
			
		||||
     * 给前端使用
 | 
			
		||||
     *
 | 
			
		||||
     * @author fengshuonan
 | 
			
		||||
     * @since 2023/10/29 17:59
 | 
			
		||||
     */
 | 
			
		||||
    @GetResource(name = "业务排序获取", path = "/common/getBusinessMaxSort")
 | 
			
		||||
    public ResponseData<Long> getBusinessMaxSort(@RequestParam("code") String code) {
 | 
			
		||||
        MaxCountConfig config = MaxSortConfigContext.getConfig(code);
 | 
			
		||||
        if (config == null) {
 | 
			
		||||
            throw new ServiceException(MaxSortExceptionEnum.CANT_FIND_CODE);
 | 
			
		||||
        }
 | 
			
		||||
        Long maxSort = dbOperatorApi.getMaxSortByTableName(config.getTableName(), config.getSortFieldName());
 | 
			
		||||
 | 
			
		||||
        // 默认返回排序数加1
 | 
			
		||||
        maxSort++;
 | 
			
		||||
 | 
			
		||||
        return new SuccessResponseData<>(maxSort);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue