跳转至

03-通用工具库 common-tool

📄 创建: ZCode AI 2026-08-14 · 修改: JimWb 2026-08-14

https://doc.xpku.com/raw/tech/backend/bams-sdk/03-common-tool.md

common-tool 是整个 SDK 的底座模块,包含 104 个工具类、约 10,674 行代码。所有其他模块都直接或间接依赖它。包路径前缀:cn.cnbm.bams.common

本文档按功能分类列出全部工具类,每类包含:类名+包路径、功能描述、关键方法签名、代码示例。


目录


日期时间

DateUtils

cn.cnbm.bams.common.utils.DateUtils

继承 org.apache.commons.lang3.time.DateUtils,融合 hutool DateUtil 与 JDK8 时间 API。提供日期格式化、解析、区间列表生成、同比环比计算。

方法签名 功能
static Date getNowDate() 当前 Date
static String getDate() 当前日期 yyyy-MM-dd
static String dateTimeNow() 当前日期时间 yyyy-MM-dd HH:mm:ss
static Date parseDateToStr(String format, Date date) Date→String
static Date dateTime(String format, String ts) String→Date,失败抛 BussinessException
static Date parseDate(Object str) 自动识别 14 种格式解析
static String getDatePoor(Date endDate, Date nowDate) 时间差,返回 "x天x小时x分钟"
static String dealDateFormatWithT(String oldDateStr) 处理 ISO 带 T 的日期
static Date stringToDateFormat(String time) 智能识别字符串格式解析(按长度/分隔符)
static int compare(String date1, String date2) 日期字符串比较(-1/0/1)
static String secondToTime(long times, int scale, String targetUnit) 秒数→天/时/分(BigDecimal 精度)
static List<String> getDateRangeList(String timeDimension, String start, String end, Boolean reversed, Boolean untilNow) 按时间维度生成连续日期序列
static List<String> getDateListBetweenSpecifiedDate(...) 多重载,区间生成小时/天/月/年列表
// 生成 2026-01 到 2026-06 的月份列表
List<String> months = DateUtils.getDateRangeList(
    Constants.TimeDimension.MONTH, "2026-01", "2026-06", false, false);
// → ["2026-01", "2026-02", "2026-03", "2026-04", "2026-05", "2026-06"]

JSON 处理(三套并存)

⚠️ SDK 中存在三套 JSON 工具,详见 12-FAQ与注意事项新代码建议统一用 JsonUtils(Jackson)

JsonUtils(推荐)

cn.cnbm.bams.common.utils.json.JsonUtils

基于 Jackson ObjectMapper。静态初始化:忽略空 bean 报错、忽略未知属性、NON_NULL 序列化、注册 JavaTimeModule。

方法签名 功能
static void init(ObjectMapper objectMapper) 注入 Spring 管理的 ObjectMapper
static String toJsonString(Object) 序列化为 JSON 字符串
static String toJsonPrettyString(Object) 序列化为格式化 JSON
static <T> T parseObject(String text, Class<T>) 反序列化对象
static <T> T parseObject(String text, Type type) 泛型反序列化
static <T> T parseObject(String text, TypeReference<T>) TypeReference 反序列化
static <T> T parseObject(String text, String path, Class<T>) 按 JSON Path 取子节点反序列化
static <T> T parseObjectQuietly(String text, TypeReference<T>) 安静反序列化(失败返回 null)
static <T> List<T> parseArray(String text, Class<T>) 反序列化 List
static <T> List<T> parseArray(String text, String path, Class<T>) 按 path 取数组反序列化
static JsonNode parseTree(String) 解析为树
static boolean isJson(String) 判断是否 JSON
// 基本用法
String json = JsonUtils.toJsonString(myObject);
MyObject obj = JsonUtils.parseObject(json, MyObject.class);
List<MyObject> list = JsonUtils.parseArray(jsonArray, MyObject.class);

// JSON Path 取值
String name = JsonUtils.parseObject(json, "$.data.name", String.class);

// 泛型
List<User> users = JsonUtils.parseObject(json, new TypeReference<List<User>>(){});

GsonUtils

cn.cnbm.bams.common.utils.GsonUtils

基于 Google Gson。支持 LocalDateTime/LocalDate 序列化、JSON key 排序、泛型 List 解析。

方法签名 功能
static <T> T fromJsonObject(String json, Class<T> clazz) JSON→对象(含时间反序列化)
static <T> List<T> fromJsonArray(String json, Class<T> clazz) 推荐:JSON 数组→List
static String fromObjectToJson(Object param) 对象→JSON
static JsonObject sortJson(String json) 按 key 字母序排序 JSON
static <T> T jsonToObject(String message, Class<T> clazz) JSON→对象

字符串与文本

StringUtils

cn.cnbm.bams.common.utils.StringUtils

继承 org.apache.commons.lang3.StringUtils,RuoYi 风格。

方法签名 功能
static <T> T nvl(T value, T defaultValue) 空值替换
static boolean isEmpty(Collection/Map/Object[]/String) 多类型空判断
static String format(String template, Object... params) {}占位符格式化
static String toUnderScoreCase(String) 驼峰→下划线
static String convertToCamelCase(String name) 下划线→大驼峰
static String toCamelCase(String s) 下划线→小驼峰
static String padPre(String str, int minLength, char padChar) 前补字符
static String addZeroForNum(String str, int strLength) 左补零
static Map<String,Object> bean2Map(Object obj) Bean→LinkedHashMap
static String getStackTrace(Exception e) 异常栈转字符串
// {} 占位符格式化
String msg = StringUtils.format("用户{}的操作{}失败", "张三", "删除");
// → "用户张三的操作删除失败"

Convert

cn.cnbm.bams.common.utils.text.Convert

⚠️ 注意同名冲突:与 cn.hutool.core.convert.Convert 同名,import 时需用全限定名。

类型转换器,RuoYi 风格,Object→各基本类型的容错转换。

方法签名 功能
static String toStr(Object value) / toStr(Object, String defaultValue) 转字符串
static Integer toInt(Object value) / toInt(Object, Integer) 转 int
static Long toLong(Object value) 转 long(支持科学计数法
static Double toDouble(Object value) 转 double
static Boolean toBool(Object value) 转 bool(支持 true/false/yes/no/ok/1/0)
static <E extends Enum<E>> E toEnum(Class<E>, Object) 转枚举
static BigDecimal toBigDecimal(Object) 转 BigDecimal
static String toSBC(String input) 半角→全角
static String toDBC(String input) 全角→半角
static String digitUppercase(double n) 数字金额转中文大写(壹贰叁...)
static String imageToBase64ByLocal(File file) 图片转 Base64
// 数字转中文大写
String s = Convert.digitUppercase(12345.67);
// → "壹万贰仟叁佰肆拾伍元陆角柒分"

StrFormatter

cn.cnbm.bams.common.utils.text.StrFormatter

{} 占位符格式化器,支持 \ 转义。被 StringUtils.format 调用。

String s = StrFormatter.format("Hello, {}!", "World");  // → "Hello, World!"

PackAndCompressionUtils

cn.cnbm.bams.common.utils.text.PackAndCompressionUtils

文件打包/压缩/解压,支持 tar、tar.gz、zip。私有构造器不可实例化。

方法签名 功能
static boolean tarPack(String[] files, String targetDir) 打包为 tar
static boolean tarUnpack(String file, String targetDir) 解 tar
static boolean gzipCompress(String[] files, String targetDir) gzip 压缩
static boolean zipCompress(String[] files, String targetDir) zip 打包
static boolean zipDecompress(String file, String targetDir) 解 zip

CharsetKit

cn.cnbm.bams.common.utils.text.CharsetKit

字符集工具,定义 ISO-8859-1/UTF-8/GBK 常量。

方法签名 功能
static String convert(String source, String srcCharset, String destCharset) 转换字符串编码
static String systemCharset() 系统默认字符集

Bean 与反射

BeanUtils

cn.cnbm.bams.common.utils.BeanUtils

Bean/Map 反射转换工具,含时间序列数据补齐(图表数据填充)能力。

方法签名 功能
static Field findField(Class<?> clazz, String name) 递归查找字段(含父类)
static Object getProperty(Object obj, String name) 反射取字段值
static Map<String,Object> obj2Map(Object obj, Map map) 对象转 Map(含父类字段)
static <T> T convertMap2Bean(Map map, Class<T>) Map 转 Bean
static <T> List<T> convertListMap2ListBean(List<Map>, Class<T>) List<Map> 批量转 List<Bean>
static List<Map<String,Object>> fillDataIfNeed(boolean needFill, String interval, String start, String end, List<Map> result, List<String> varNames, String fillVal, String fillField, boolean fillStartEnd) 核心:按时间间隔补齐缺失时间点数据
// 图表数据补齐:把缺失的日期点补 0
List<Map<String,Object>> result = ...; // 数据库查出的数据
result = BeanUtils.fillDataIfNeed(
    true, "1d", "2026-01-01", "2026-01-31",
    result, Arrays.asList("ydata"), "0", "xdata", true);

TypeUtil

cn.cnbm.bams.common.utils.TypeUtil

对象类型强转工具,纯反射无第三方依赖。

方法签名 功能
static int parseI(Object obj) / parseI(Object, Integer defaultVal) 转 int
static long parseL(Object obj) 转 long
static double parseD(Object obj) 转 double
static boolean parseB(Object obj) 转 boolean
static Object parseObject(Object obj, String type) 按类型码转换(I/L/D/F/B/S)
static boolean doubleIsZero(double d) 判断 double 是否近似 0(1e-6 阈值)

ikidou 泛型反射工具

cn.cnbm.bams.common.ikidou.reflect.*

来源 ikidou(Apache 2.0),用于运行时构造泛型 Type,配合 Gson 解析泛型集合。

功能
TypeBuilder 链式构建 ParameterizedType。TypeBuilder.newInstance(List.class).addTypeParam(Foo.class).build()
TypeToken<T> 泛型 Type 捕获(匿名子类方式)
ParameterizedTypeImpl ParameterizedType 实现
WildcardTypeImpl WildcardType 实现(? extends / ? super

加密与签名

⚠️ 安全提醒JwtUtilRSAUtils 的密钥硬编码在源码常量中,生产环境务必替换。详见 12-FAQ与注意事项

Md5Utils

cn.cnbm.bams.common.utils.Md5Utils

极简 MD5 加密,纯 JDK 无第三方依赖。

方法签名 功能
static String md5(String src) MD5(UTF-8),返回 32 位十六进制小写
static String md5(String src, String charset) 指定字符集

RSAUtils

cn.cnbm.bams.common.utils.RSAUtils

基于 hutool RSA 的加解密,密钥硬编码在 Constants.RSA

方法签名 功能
static String encryptRsaBase64(String password) 公钥加密→Base64
static String decryptRsaBase64(String password) 私钥解密
static String encryptRsaByPrivateKey(String password) 私钥加密(签名场景)
static String decryptRsaByPrivateKey(String password) 公钥解密(验签场景)

登录密码加解密使用此类:前端公钥加密 → 后端私钥解密。

JSEncryptUtils

cn.cnbm.bams.common.utils.JSEncryptUtils

前端 JSEncrypt 库的 Java 端等价实现,RSA/ECB/PKCS1Padding,用于前后端 RSA 加密互通。

方法签名 功能
static String encrypt(String text, String publicKeyStr) 公钥加密(>117 字节返回原文)
static String decrypt(String encryptedStr, String privateKeyStr) 私钥解密
static PublicKey getPublicKey(String keyStr) Base64→X509 公钥
static PrivateKey getPrivateKey(String keyStr) Base64→PKCS8 私钥

JwtUtil

cn.cnbm.bams.common.utils.JwtUtil

基于 hutool-jwt 的 JWT 工具。密钥硬编码

方法签名 功能
static String createToken(String appKey, String appId) 生成 token(nbf=当前, exp=次日)
static String getClaim(String token, String claim) 无需解密取 payload claim
static JSONObject getClaimJSON(String token) 取全部 payload
static boolean verify(String token) 校验 token(日期+算法+签名)

HTTP 与远程调用

HttpClientUtil

cn.cnbm.bams.common.utils.HttpClientUtil

基于 Apache HttpClient,支持 http/https(HTTPS 信任所有证书)。

方法签名 功能
static String get(String url, HttpClientConfig config) GET
static String post(String url, String json, HttpClientConfig config) POST JSON
static String post(String url, Map<String,String> body, HttpClientConfig config) POST 表单
static String put/patch/delete(...) PUT/PATCH/DELETE
static byte[] downloadBytes(String url) 下载字节
static boolean isURLReachable(String url, Map<String,String> head) 探测 URL 可达性

HttpClientConfig

cn.cnbm.bams.common.http.HttpClientConfig

HTTP 请求配置 POJO。默认:charset=UTF-8, connectTimeout=5000ms, socketTimeout=60000ms。

HttpClientConfig config = new HttpClientConfig();
config.addHeader("Authorization", "Bearer xxx");
String result = HttpClientUtil.post("https://api.example.com/data", jsonBody, config);

HttpRequestUtil

cn.cnbm.bams.common.http.HttpRequestUtil

基于 ApiDefinition 模型的高级 HTTP 请求执行器,支持 Basic Auth、GET/POST(JSON/XML/Raw/Form)。

方法签名 功能
static String execHttpRequest(ApiDefinition apiDefinition) 根据 ApiDefinition 分发执行

RemoteShellExecutor

cn.cnbm.bams.common.utils.RemoteShellExecutor

基于 ganymed-ssh2 的远程 Shell 执行器,SSH 密码登录执行命令。超时 60 秒

RemoteShellExecutor exec = new RemoteShellExecutor("192.168.1.1", "root", "password");
String result = exec.exec("ls -la /data");

集合与树形结构

ListUtils

cn.cnbm.bams.common.utils.ListUtils

针对 List<Map<String,Object>>(报表数据典型结构)的聚合统计工具。

方法签名 功能
static Double sum(List<Map>, String key) 按 key 求和
static Double sum(List<Map>, String filterCol, String filterVal, String key) 过滤后求和
static Double reduce(List<Map>, String key, String operator) 通用归约:+/-/×/÷(parallelStream)
static Map<String,Object> max/min(List<Map>, String key) 取最大/最小值所在 Map
static Double avg(List<Map>, String key) 平均值
static List<List<String>> cartesian(Collection<List<String>>) 递归求笛卡尔积

TreeTool(树形组装)

cn.cnbm.bams.common.utils.tree.TreeTool

将扁平 List 组装为树形结构的静态工具。

方法签名 功能
static <T> List<T> getTree(List<T> dataList) 扁平 List→树(T 需实现 ITreeAble)
static <T> Map<Object,T> getTreeMap(List<T> dataList) 返回 id→节点 Map
// 实体实现 ITreeAble
public class MyMenu implements ITreeAble<MyMenu> {
    public Object getTreeId() { return id; }
    public Object getParentCode() { return parentId; }
    public void addChild(MyMenu child) { this.children.add(child); }
}

// 组装树
List<MyMenu> tree = TreeTool.getTree(flatList);
相关类 说明
ITreeAble<T> 树形接口:getTreeId() / getParentCode() / addChild(T)
TreeBean ITreeAble 通用实现(含 treeId/parentCode/childs/data)
MapTreeNode 基于 Map 的树节点(约定字段名 id / parent_id
DeepLevelFilter 层级过滤函数式接口

Excel 导入导出

common-tool 提供基础 Excel 注解和工厂。完整的导入导出功能在 common-func 的 ExcelHelper,详见 09-通用功能

@ExRow / @ExCell 注解

注解 位置 属性 说明
@ExRow type() 类型标识, sheet() sheet 索引 标记 Excel 行映射类型
@ExCell 字段 idx() 列索引 标记 Excel 列映射

AbstractExFactory

cn.cnbm.bams.common.utils.excel.AbstractExFactory

扫描 cn.cnbm.bams.pojo 包下带 @ExRow 注解的类,建立映射。


ID 生成

IDUtil(雪花算法入口)

cn.cnbm.bams.common.id.IDUtil

雪花算法 ID 生成器,单例模式。workerId/dataCenterId 自动从机器 MAC 哈希进程 PID 推导。

long id = IDUtil.getId();     // 获取下一个雪花 ID
String padded = IDUtil.genPad(6, 42);  // → "000042"(补零到 6 位)

BaseEntity 的 id 字段在插入时自动调用 IDUtil.getId() 生成,无需手动赋值。

SnowflakeIdWorker

cn.cnbm.bams.common.id.SnowflakeIdWorker

Twitter Snowflake 实现。64 位 = 1 符号位 + 41 时间戳(69 年)+ 5 数据中心 + 5 机器 + 12 序列(每毫秒 4096)。nextId() 线程安全(synchronized),时钟回退抛 BussinessException。起始时间 twepoch = 2015-01-01。


统一响应

JsonResult

cn.cnbm.bams.common.response.JsonResult<T>

泛型统一响应体,implements Serializable。字段:code / msg / resultExplain / failArgs / data / errorMsg

静态工厂方法 说明
JsonResult.success() / success(T data) / success(T data, String explain) 成功
JsonResult.successMessage(String msg) 成功(带消息)
JsonResult.fail() / fail(String code, String msg) / fail(code, msg, errorMsg) 失败
JsonResult.failMessage(String msg) 失败(带消息)
JsonResult.caveat(String message) 警告(CAVEAT 码)
JsonResult.error() / error(Object code, String msg) 错误
return JsonResult.success(dataList);
return JsonResult.fail("500", "查询失败");
return JsonResult.success(page, "查询成功");

ResponseCode

cn.cnbm.bams.common.enums.ResponseCode

响应码枚举。

枚举值 code 说明
SUCCESS "200" 成功
FAIL "500" 失败
ERROR "202" 参数错误
CAVEAT "205" 警告
NOT_LOGIN "401" 未登录
TOKEN_EXPIRED "700" Token 过期

ApiResponse

cn.cnbm.bams.common.response.ApiResponse

业务响应码枚举(实现 BaseEnum),定义了物料/配方/班次/生产计划/出入库等领域码。getResponseByCode(code) 按 code 查枚举。


异常体系(双轨制)

⚠️ SDK 存在两个拼写相似的异常类,详见 12-FAQ与注意事项

BussinessException(非受检,工具类常用)

cn.cnbm.bams.common.exception.BussinessException

注意拼写(Bussiness 多了一个 s)。继承 RuntimeException,携带 code 字段。

构造方法 说明
BussinessException(String message)
BussinessException(String message, String code) 带 code
BussinessException(String, Throwable)
BussinessException(Throwable)

项目中工具类(DateUtils/BeanUtils/SnowflakeIdWorker 等)抛的是这个。

BussException(受检)

cn.cnbm.bams.common.exception.BussException

继承 BaseException extends Exception(受检异常),携带 ApiResponse

构造方法 说明
BussException(String)
BussException(String template, Object... params) hutool StrUtil.format 格式化
BussException(ApiResponse) 带响应码
BussException(Throwable)

BaseException

cn.cnbm.bams.common.exception.BaseException

受检异常基类(extends Exception),携带 ApiResponse response


单位换算与计算

CalUtils

cn.cnbm.bams.common.trans.CalUtils

单位换算/值计算工具,支持加减乘除和条件表达式(用 Aviator 表达式引擎)。

方法签名 功能
static String invokeFunction(String value, String function, Double param, String stdv, String condition) 按 function 计算。condition 不满足返回 null

function 取值:add / minus / multiply / divide / bool。multiply/divide 用 BigDecimal 保精度。

TransUnit

cn.cnbm.bams.common.trans.TransUnit

时间单位枚举:hour(HOURS) / mins(MINUTES) / sec(SECONDS) / msc(MILLISECONDS) / day(DAYS)

BdUnitTransCache

cn.cnbm.bams.common.trans.type.BdUnitTransCache

单位换算缓存 POJO。字段:unitCode / srcCode / stdCode / function / param / condition / corpCode。


JSON 序列化配置

@NumberFormatter 注解

cn.cnbm.bams.common.jsonconf.NumberFormatter

字段级注解,配合 Jackson 实现 Number 格式化序列化。

属性 默认值 说明
type "Round" Round(四舍五入)或 Format(格式化)
format "#.00" DecimalFormat 模式
precision 2 小数位数
roundingMode HALF_UP 舍入模式
@NumberFormatter(type = "Round", precision = 2)
private Double amount;  // 序列化时自动保留 2 位小数

MySimpleModule

cn.cnbm.bams.common.jsonconf.MySimpleModule

Jackson SimpleModule,注册: - JDK8 时间(LocalDateTime/LocalDate/LocalTime/Instant)序列化/反序列化 - Long/BigInteger/Long.TYPE → String(防前端精度丢失) - Hutool JSONNull → null

来源 pig4cloud 框架(Apache 2.0)。


其他工具

CacheUtils

cn.cnbm.bams.common.utils.cache.CacheUtils

基于 Guava CacheBuilder 的 LoadingCache 构建工具。最大缓存 10000。

方法签名 功能
static <K,V> LoadingCache<K,V> buildAsyncReloadingCache(Duration, CacheLoader<K,V>) 异步刷新缓存(适合全局/系统级)
static <K,V> LoadingCache<K,V> buildCache(Duration, CacheLoader<K,V>) 同步刷新(适合 ThreadLocal 相关)

FileUtils

cn.cnbm.bams.common.utils.io.FileUtils

临时文件创建。createTempFile() 创建 UUID 命名的临时文件,JVM 退出自动删除。

DelayQueueUtils

cn.cnbm.bams.common.utils.DelayQueueUtils

简易延迟执行。execute(key, runnable, seconds) 延迟执行,同一 key 未执行完时重复提交被忽略。

LogUtils

cn.cnbm.bams.common.utils.LogUtils

日志工具,封装 SLF4J Logger,自动通过堆栈获取调用类名/方法名

方法签名 功能
static void info/debug/warn/error(Object msg) 各级别日志(自动定位调用者)
static String getClientIp(HttpServletRequest) 从 x-forwarded-for 等头取客户端 IP
static String toString(Throwable e) 异常栈转字符串

MybatisTenantContext

cn.cnbm.bams.common.utils.MybatisTenantContext

Mybatis 多租户上下文,ThreadLocal 控制是否开启租户隔离。

方法 说明
Boolean get() 取当前线程租户开关
void set(boolean) 设置
void clear() 清除(防内存泄漏)

注解清单

common-tool 定义的核心注解(被其他模块引用):

注解 包路径 作用位置 说明
@TenantDataSource common.annotations 类/方法 标记走哪个数据源,value 默认 "master"
@SequenceGenerator common.annotations.sequence 实体字段 序列号生成,详见 05-业务服务层
@CheckRepeat common.annotations 实体字段 重复值校验
@Formula common.annotations.mybatis 实体字段 字段=子查询表达式
@RedisCache common.annotations.mybatis 实体字段 查询后 Redis 回填
@FieldValueFormat common.annotations.mybatis 实体字段 字段格式化(trim/正则替换)
@ExcelDictionaryColumn common.annotations.excel 实体字段 Excel 字典列(编码→中文)
@ExcelUniqueColumn common.annotations.excel 实体字段 Excel 去重列
@CommonData common.annotations.permission 类/方法 数据权限:查上级数据
@IgnoreSession common.annotations.permission 方法 跳过 session 校验
@RequireDataScope common.annotations.permission 类/方法 控制数据范围
@RequirePermission common.annotations.permission 方法 要求权限
@TransProperty common.annotations 方法 属性翻译

常量与枚举

包路径 说明
Constants common.constant 全局常量(时间维度、import 批次大小、RSA 密钥等)
DictConstant common.constant 字典常量
PermissionConstants common.constant 数据权限范围常量(DATA_ALL/DATA_CORP 等)
PermissionContext common.constant 权限上下文字段定义(userId/dataScope/corpCode 等)
TableConstant common.constant 表名常量
BaseEnum common.enums 枚举基接口(getCode/getMsg)
BusinessStatus common.enums 业务状态枚举
BusinessType common.enums 业务操作类型
EnableState common.enums 启用状态
HttpMethod common.enums HTTP 方法
ResponseCode common.enums 响应码(见上文统一响应章节)
TimeDimensEnum common.enums 时间维度
UnitEnum common.enums 单位

相关文档