跳至主要內容

SysReasonableRange

chanchaw大约 2 分钟languagejava

概述

整数、浮点型合法范围配置工具

SQL

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for sys_reasonable_range
-- ----------------------------
DROP TABLE IF EXISTS `sys_reasonable_range`;
CREATE TABLE `sys_reasonable_range`  (
  `iid` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `sid` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '配置项名称,保证唯一',
  `category` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '分类,备用',
  `int_min` int(11) NULL DEFAULT 0 COMMENT '整型类型最小数值',
  `int_max` int(11) NULL DEFAULT 0 COMMENT '整型类型最大数值',
  `dec_min` decimal(10, 4) NULL DEFAULT 0.0000 COMMENT '浮点类型最小配置',
  `dec_max` decimal(10, 4) NULL DEFAULT 0.0000 COMMENT '浮点类型最大配置',
  `left_closure` int(11) NULL DEFAULT 0 COMMENT '左侧关闭,被鉴定数值可等于 int_min 或者 dec_min',
  `right_closure` int(11) NULL DEFAULT 0 COMMENT '右侧关闭,被鉴定数值可等于 int_max 或者 dec_max',
  `grade` int(11) NULL DEFAULT 0 COMMENT '0不提示,1仅提示不强制,2强制不可继续执行下去',
  `msg` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '提示文案',
  `state` int(11) NULL DEFAULT 1 COMMENT '状态,默认1表示有效',
  `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注',
  `seq` int(11) NULL DEFAULT 0 COMMENT '排序序号',
  `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间,DB自动填充',
  `create_user` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建人',
  `last_update` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '最后一次修改时间',
  `last_user` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '修改人',
  PRIMARY KEY (`iid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统配置,合理数据范围' ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

java

/**
 * 判断左侧右侧是否关闭,只有1是关闭,其他所有数据都认为是不关闭
 * @param closureData
 * @return 返回true表示关闭
 */
@Override
public boolean isClosure(Integer closureData){
    closureData = Optional.ofNullable(closureData).orElse(0);
    if(closureData.equals(1)) return true;
    else return false;
}

/**
 * 根据一项配置(根据表sys_reasonable_range.sid查询得到)
 * 鉴定给定的数值是否处于合法范围内
 * left_closure=1 表示可等于左侧最小值
 * right_closure=1 表示可等于右侧最大值
 * @param configName sys_reasonable_range.sid
 * @param num 被鉴定的数值,要求传入具体的 Integer、BigDecimal
 * @return true表示被鉴定数值在合法范围内
 */
@Override
public Boolean isMatch(String configName, Object num){
    SysReasonableRange sysReasonableRange = dao.selectBySid(configName);
    if(sysReasonableRange == null) return true;

    boolean isInteger = Integer.class.isInstance(num);
    boolean isDecimal = BigDecimal.class.isInstance(num);

    Integer intMin = sysReasonableRange.getIntMin();
    Integer intMax = sysReasonableRange.getIntMax();
    BigDecimal decMin = sysReasonableRange.getDecMin();
    BigDecimal decMax = sysReasonableRange.getDecMax();

    int compResult = -2;
    boolean leftClosure = meService.isClosure(sysReasonableRange.getLeftClosure());
    boolean rightClosure = meService.isClosure(sysReasonableRange.getRightClosure());

    if(isInteger){
        Integer inNum = (Integer)num;
        compResult = inNum.compareTo(intMin);
        if((!leftClosure) && compResult == 0) return false;
        if(compResult < 0) return false;

        compResult = inNum.compareTo(intMax);
        if((!rightClosure) && compResult == 0) return false;
        if(compResult > 0) return false;
    }

    if(isDecimal){
        BigDecimal inNum = (BigDecimal)num;
        compResult = inNum.compareTo(decMin);
        if((!leftClosure) && compResult == 0) return false;
        if(compResult < 0) return false;

        compResult = inNum.compareTo(decMax);
        if((!rightClosure) && compResult == 0) return false;
        if(compResult > 0) return false;
    }
    return true;
}