引言
最近在做呼叫中心项目,其中有一个环节是根据根据FS传入的 被叫号码来确定使用哪个线路呼叫,我们需要判断被叫号码是手机号码还是固话,并且需要判断号码的归属地, 我们需要把这些参数 传递给规则引擎,然后返回需要的线路。
基本思路
首先 判断被叫号码 是否是手机号,如果是手机号则返回前7位 用来做归属地查询,如果是固话返回区号用来归属地查询。
业务代码:
//校验被叫号码固话还是手机 Map<String, String> stringMap = PhoneUtils.checkNumber(callObj.getTelNumber()); if (RobotConstants.PHONE_TYPE_INVALID_PHONE.equals(stringMap.get("phoneType"))) { callObj.setFailedReason("无效的手机号"); return null; } //归属地 String telAttribute = numberService.getProvinceByTelNumber(stringMap.get("code"));
归属地比较简单了,我们维护了一张表里面存放了固话区号和手机号前7位对应的省、市。
其中checkNumber会返回一个map其中存放了号码类型和code,如果是固话code存放区号,如果是手机号码code存放前7位。
工具类,
package com.jack.common.utils; import com.jack.common.constant.RobotConstants; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @Description: * @author: zhenghao * @date: 2019/10/18 18:55 */ public class PhoneUtils { /** * 用于匹配手机号码 */ private final static String REGEX_MOBILEPHONE = "^0?1[34578]\\d{9}$"; /** * 用于匹配固定电话号码 */ private final static String REGEX_FIXEDPHONE = "^(010|02\\d|0[3-9]\\d{2})?\\d{6,8}$"; /** * 用于获取固定电话中的区号 */ private final static String REGEX_ZIPCODE = "^(010|02\\d|0[3-9]\\d{2})\\d{6,8}$"; private static Pattern PATTERN_MOBILEPHONE; private static Pattern PATTERN_FIXEDPHONE; private static Pattern PATTERN_ZIPCODE; static { PATTERN_FIXEDPHONE = Pattern.compile(REGEX_FIXEDPHONE); PATTERN_MOBILEPHONE = Pattern.compile(REGEX_MOBILEPHONE); PATTERN_ZIPCODE = Pattern.compile(REGEX_ZIPCODE); } public static Map<String, String> checkNumber(String number) { Map<String, String> map = new HashMap<>(); String phoneType = null; String code = null; if (number != null && number.length() > 0) { if (isCellPhone(number)) { // 如果手机号码以0开始,则去掉0 if (number.charAt(0) == '0') { number = number.substring(1); } phoneType = RobotConstants.PHONE_TYPE_CELL_PHONE; code = number.substring(0, 7); } else if (isFixedPhone(number)) { // 获取区号 String zipCode = getZipFromHomephone(number); phoneType = RobotConstants.PHONE_TYPE_FIXED_PHONE; code = zipCode; } else { phoneType = RobotConstants.PHONE_TYPE_INVALID_PHONE; code = null; } } map.put("phoneType", phoneType); map.put("code", code); return map; } /** * 获取固定号码号码中的区号 * * @param strNumber * @return */ public static String getZipFromHomephone(String strNumber) { Matcher matcher = PATTERN_ZIPCODE.matcher(strNumber); if (matcher.find()) { return matcher.group(1); } return null; } /** * 判断是否为手机号码 * * @param number 手机号码 * @return */ public static boolean isCellPhone(String number) { Matcher match = PATTERN_MOBILEPHONE.matcher(number); return match.matches(); } /** * 判断是否为固定电话号码 * * @param number 固定电话号码 * @return */ public static boolean isFixedPhone(String number) { Matcher match = PATTERN_FIXEDPHONE.matcher(number); return match.matches(); } public static void main(String[] args) { System.out.println(checkNumber("0101234567")); System.out.println(checkNumber("13512312311")); } }
其中工具类中判断手机号的整个,需要我们根据每年新增的手机号规则进行调整。