package org.jeecg.modules.system.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.lang.StringUtils; import org.jeecg.modules.system.entity.SysCheckRule; import org.jeecg.modules.system.mapper.SysCheckRuleMapper; import org.jeecg.modules.system.service.ISysCheckRuleService; import org.springframework.stereotype.Service; import java.util.regex.Pattern; /** * @Description: 编码校验规则 * @Author: jeecg-boot * @Date: 2020-02-04 * @Version: V1.0 */ @Service public class SysCheckRuleServiceImpl extends ServiceImpl implements ISysCheckRuleService { /** * 位数特殊符号,用于检查整个值,而不是裁剪某一段 */ private final String CHECK_ALL_SYMBOL = "*"; @Override public SysCheckRule getByCode(String ruleCode) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysCheckRule::getRuleCode, ruleCode); return super.getOne(queryWrapper); } /** * 通过用户设定的自定义校验规则校验传入的值 * * @param checkRule * @param value * @return 返回 null代表通过校验,否则就是返回的错误提示文本 */ @Override public JSONObject checkValue(SysCheckRule checkRule, String value) { if (checkRule != null && StringUtils.isNotBlank(value)) { String ruleJson = checkRule.getRuleJson(); if (StringUtils.isNotBlank(ruleJson)) { // 开始截取的下标,根据规则的顺序递增,但是 * 号不计入递增范围 int beginIndex = 0; JSONArray rules = JSON.parseArray(ruleJson); for (int i = 0; i < rules.size(); i++) { JSONObject result = new JSONObject(); JSONObject rule = rules.getJSONObject(i); // 位数 String digits = rule.getString("digits"); result.put("digits", digits); // 验证规则 String pattern = rule.getString("pattern"); result.put("pattern", pattern); // 未通过时的提示文本 String message = rule.getString("message"); result.put("message", message); // 根据用户设定的区间,截取字符串进行验证 String checkValue; // 是否检查整个值而不截取 if (CHECK_ALL_SYMBOL.equals(digits)) { checkValue = value; } else { int num = Integer.parseInt(digits); int endIndex = beginIndex + num; // 如果结束下标大于给定的值的长度,则取到最后一位 endIndex = endIndex > value.length() ? value.length() : endIndex; // 如果开始下标大于结束下标,则说明用户还尚未输入到该位置,直接赋空值 if (beginIndex > endIndex) { checkValue = ""; } else { checkValue = value.substring(beginIndex, endIndex); } result.put("beginIndex", beginIndex); result.put("endIndex", endIndex); beginIndex += num; } result.put("checkValue", checkValue); boolean passed = Pattern.matches(pattern, checkValue); result.put("passed", passed); // 如果没有通过校验就返回错误信息 if (!passed) { return result; } } } } return null; } }