content: 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<SysCheckRuleMapper, SysCheckRule> implements ISysCheckRuleService {
  
      /**
       * 位数特殊符号，用于检查整个值，而不是裁剪某一段
       */
      private final String CHECK_ALL_SYMBOL = "*";
  
      @Override
      public SysCheckRule getByCode(String ruleCode) {
          LambdaQueryWrapper<SysCheckRule> 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;
      }
  
  }
  