lihao16 пре 10 месеци
родитељ
комит
828d416d2e

+ 26 - 0
inspur-admin/src/main/java/com/inspur/web/controller/work/ElevatorInfoController.java

@@ -3,6 +3,8 @@ package com.inspur.web.controller.work;
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
 
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson2.JSONObject;
 import com.inspur.common.annotation.Anonymous;
 import com.inspur.domain.ElevatorInfo;
 import com.inspur.service.IElevatorInfoService;
@@ -108,4 +110,28 @@ public class ElevatorInfoController extends BaseController
     {
         return toAjax(elevatorInfoService.deleteElevatorInfoByIds(ids));
     }
+
+
+    /**
+     * 获取手机号归属地
+     * @param phoneNum 手机号
+     * @return 归属地
+     */
+    @GetMapping("/phone")
+    @Anonymous
+    public AjaxResult getRegionInfoByPhoneAPI(String phoneNum){
+        // 360提供的一个接口 能返回省份和城市
+        try {
+            String url = "https://cx.shouji.360.cn/phonearea.php?number=" + phoneNum;
+            String responseBody = HttpUtil.createGet(url).execute().body();
+            JSONObject jsonObject = JSONObject.parseObject(responseBody);
+            if (!"0".equals(jsonObject.getInteger("code").toString())) {
+                AjaxResult.success();
+            }
+            String city = jsonObject.getJSONObject("data").getString("city");
+            return AjaxResult.success(city);
+        }catch (Exception e){
+            return AjaxResult.error(e.getMessage());
+        }
+    }
 }

+ 1 - 1
inspur-admin/src/main/resources/application-mysql.yml

@@ -7,7 +7,7 @@ spring:
         druid:
             # 主库数据源
             master:
-                url: jdbc:mysql://127.0.0.1:3306?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
+                url: jdbc:mysql://127.0.0.1:3306/elevator_emergency?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
                 # url: jdbc:mysql://127.0.0.1:3306/elevator_emergency?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
                 # url: jdbc:dm://10.220.102.46:15236
                 username: root

+ 4 - 2
inspur-admin/src/main/resources/application.yml

@@ -55,7 +55,8 @@ spring:
     # 国际化资源文件路径
     basename: i18n/messages
   profiles:
-    active: mysql
+    # active: mysql
+    active: druid
   # 文件上传
   servlet:
     multipart:
@@ -139,5 +140,6 @@ pbx:
   secret: nAIO3LtgcIJZ8GItx06YwTmJ5C3TbtsX
   clientId: GWJ4fFfZ0KDjO2UD8S2e6tL05MexHetI
   # 分机测试dev  正式环境用prod
-  active: dev
+  # active: dev
+  active: prod
 

+ 19 - 1
inspur-work/pom.xml

@@ -46,7 +46,25 @@
             <scope>test</scope>
         </dependency>
 
+        <dependency>
+            <groupId>com.googlecode.libphonenumber</groupId>
+            <artifactId>libphonenumber</artifactId>
+            <version>8.13.52</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.googlecode.libphonenumber</groupId>
+            <artifactId>carrier</artifactId>
+            <version>1.236</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.googlecode.libphonenumber</groupId>
+            <artifactId>geocoder</artifactId>
+            <version>2.246</version>
+        </dependency>
+
 
     </dependencies>
 
-</project>
+</project>

+ 123 - 4
inspur-work/src/main/java/com/inspur/thrid/impl/PBXServiceImpl.java

@@ -5,6 +5,10 @@ import cn.hutool.http.HttpUtil;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
+import com.google.i18n.phonenumbers.PhoneNumberToCarrierMapper;
+import com.google.i18n.phonenumbers.PhoneNumberUtil;
+import com.google.i18n.phonenumbers.Phonenumber;
+import com.google.i18n.phonenumbers.geocoding.PhoneNumberOfflineGeocoder;
 import com.inspur.common.config.InspurConfig;
 import com.inspur.common.core.redis.RedisCache;
 import com.inspur.common.utils.DateUtils;
@@ -32,6 +36,7 @@ import org.springframework.util.CollectionUtils;
 import java.io.File;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
@@ -85,6 +90,25 @@ public class PBXServiceImpl implements IPBXService {
     @Autowired
     private ElevatorPersonInfoMapper elevatorPersonInfoMapper;
 
+    /**
+     * 手机号基本工具类
+     */
+    private final static PhoneNumberUtil PHONE_NUMBER_UTIL = PhoneNumberUtil.getInstance();
+
+    /**
+     * 运营商
+     */
+    private final static PhoneNumberToCarrierMapper CARRIER_MAPPER = PhoneNumberToCarrierMapper.getInstance();
+
+    /**
+     *
+     */
+    private final static PhoneNumberOfflineGeocoder GEO_CODER = PhoneNumberOfflineGeocoder.getInstance();
+
+    private final static String CHINA = "中国";
+
+    private final static String WULUMUQI = "乌鲁木齐";
+
     @Override
     public String getAccessToken() {
         log.debug("getAccessToken start");
@@ -244,7 +268,7 @@ public class PBXServiceImpl implements IPBXService {
         // bugfix 出现存在infos内容为IVR的情况 排除这类情况
         if (PBXConstant.IVR_CODE_SAFE_CODE.equals(dtmf) || PBXConstant.IVR_CODE_TRANSFER_CODE.equals(dtmf)
                 || PBXConstant.IVR_CODE_ERROR_SAFE_CODE.equals(dtmf) || PBXConstant.IVR_CODE_ERROR_NO_PERSON_CODE.equals(dtmf)
-                || PBXConstant.IVR_CODE_BUSY_CODE.equals(dtmf)) {
+                || PBXConstant.IVR_CODE_BUSY_CODE.equals(dtmf) || dtmf.length() > 6) {
             return;
         }
         log.info("dtmfEvent,callId:{}",callId);
@@ -354,9 +378,9 @@ public class PBXServiceImpl implements IPBXService {
     private void forEachCall(List<ElevatorPersonInfo> wbPersonInfos, List<ElevatorPersonInfo> wyPersonInfos,
                              WsDtmfMessage wsDtmfMessage, ElevatorWorkOrder workOrder,
                              ElevatorWorkOrderMapper workOrderMapper, ElevatorWorkNodeMapper workNodeMapper,String lastCallCode) {
-
         String callId = wsDtmfMessage.getMsg().getCall_id();
         if (!CollectionUtils.isEmpty(wbPersonInfos)) {
+            log.info("开始呼叫维保人员:wbPersonInfos.size = " + wbPersonInfos.size());
             for (ElevatorPersonInfo wbPerson : wbPersonInfos) {
                 // 查询是否已经存在电话结束的节点,如果有将跳出循环
                 ElevatorWorkNode endNode = elevatorWorkNodeMapper.selectElevatorWorkNodeByCallIdAndType(callId, "4");
@@ -395,6 +419,7 @@ public class PBXServiceImpl implements IPBXService {
             }
         }
         if (!CollectionUtils.isEmpty(wyPersonInfos)) {
+            log.info("开始呼叫物业人员:wyPersonInfos.size = " + wyPersonInfos.size());
             for (ElevatorPersonInfo wyPerson : wyPersonInfos) {
                 // 查询是否已经存在电话结束的节点,如果有将跳出循环
                 ElevatorWorkNode endNode = elevatorWorkNodeMapper.selectElevatorWorkNodeByCallIdAndType(callId, "4");
@@ -440,6 +465,7 @@ public class PBXServiceImpl implements IPBXService {
         String personName = "应急保底救援";
         String unitName = "应急保底救援";
         createOrderNode_3("联系应急保底救援", workOrder, wsDtmfMessage, false, lastCallCode, personName);
+        log.info("开始联系应急保底救援 : " + lastCallCode);
         transferCall_v3(wsDtmfMessage, lastCallCode);
         // 接口调用成功,缓存数据,call_id  RING
         redisCache.setCacheObject(PBXConstant.PBX_TRANSFER_CODE_KEY + lastCallCode, callId, 60 * 5, TimeUnit.SECONDS);
@@ -564,7 +590,13 @@ public class PBXServiceImpl implements IPBXService {
         }
         params.put("type", PBXConstant.CALL_TRANSFER_TYPE_BIND);
         params.put("channel_id", channelId);
-        params.put("number", callNumber);
+        // params.put("number", callNumber);
+        // params.put("number", "0" + callNumber);
+        if (isLocalCall(callNumber)) {
+            params.put("number", callNumber);
+        }else {
+            params.put("number", "0" + callNumber);
+        }
         params.put("dial_permission","1000");
 
         String url = pbxUrl + PBXConstant.CALL_TRANSFER + pbxToken;
@@ -588,6 +620,22 @@ public class PBXServiceImpl implements IPBXService {
         }
     }
 
+    private boolean isLocalCall(String callNumber) {
+        /*if (callNumber.startsWith("1999")) {
+            return true;
+        }*/
+        // String region = getRegionInfoByPhone(callNumber);
+        String region = getRegionInfoByPhoneAPI(callNumber);
+        log.info(" === get region info by phoneNumber : {}, region is  : {}",callNumber,region);
+        if (StringUtils.isEmpty(region)) {
+            return true;
+        }
+        if (region.equals(WULUMUQI)) {
+            return true;
+        }
+        return false;
+    }
+
     private boolean transferCall_v2(WsCallInMessage wsCallInMessage,String callNumber) {
         String pbxToken = redisCache.getCacheObject(PBXConstant.PBX_TOKEN_KEY);
         Map<String, String> params = new HashMap<String, String>(6);
@@ -728,6 +776,7 @@ public class PBXServiceImpl implements IPBXService {
     }
 
     private ElevatorWorkOrder createWorkOrder(WsDtmfMessage wsDtmfMessage) {
+        log.info("begin create new work order");
         String callId = wsDtmfMessage.getMsg().getCall_id();
         String fromPhone = "";
         // 通话状态
@@ -789,14 +838,22 @@ public class PBXServiceImpl implements IPBXService {
                 toPhone = extensionInfo.getNumber();
                 channelId = extensionInfo.getChannel_id();
             }else if (PBXConstant.PBX_ACTIVE_PROD.equals(pbxActive)) {
-                BoundInfo boundInfo = member.getInbound();
+                BoundInfo boundInfo = member.getOutbound();
+                if (null == boundInfo) {
+                    continue;
+                }
                 memberStatus = boundInfo.getMember_status();
                 toPhone = boundInfo.getTo();
                 channelId = boundInfo.getChannel_id();
+                log.info("memberStatus : " + memberStatus + ",toPhone : " + toPhone + ",channelId = " + channelId);
             }else {
                 log.error("pbxActive is null");
                 return;
             }
+            // bugfix toPhone 存在出现IVR号码的情况,这时不处理
+            if (StringUtils.isEmpty(toPhone) || toPhone.length() == 4) {
+                continue;
+            }
             String callId = redisCache.getCacheObject(PBXConstant.PBX_TRANSFER_CODE_KEY + toPhone);
             if (StringUtils.isEmpty(callId)) {
                 log.info("no cache transferToValue,key : {}",PBXConstant.PBX_TRANSFER_CODE_KEY + toPhone);
@@ -1018,4 +1075,66 @@ public class PBXServiceImpl implements IPBXService {
             log.error("voice record download failed");
         }
     }
+
+    /**
+     * 获取手机号归属地
+     * @param phoneNum 手机号
+     * @return 归属地
+     */
+    public static String getRegionInfoByPhoneAPI(String phoneNum){
+        // 360提供的一个接口 能返回省份和城市
+        try {
+            String url = "https://cx.shouji.360.cn/phonearea.php?number=" + phoneNum;
+            String responseBody = HttpUtil.createGet(url).execute().body();
+            JSONObject jsonObject = JSONObject.parseObject(responseBody);
+            if (!SUCCESS.equals(jsonObject.getInteger("code").toString())) {
+                return "";
+            }
+            String city = jsonObject.getJSONObject("data").getString("city");
+            log.info("getRegionInfoByPhoneAPI success, city:{}",city);
+            return city;
+        }catch (Exception e){
+            log.error("getRegionInfoByPhoneAPI error:{}",e.getMessage());
+            return "";
+        }
+
+    }
+
+    /**
+     * 获取手机号归属地
+     * @param phoneNum 手机号
+     * @return 归属地
+     */
+    public static String getRegionInfoByPhone(String phoneNum){
+        return isValidNumber(phoneNum) ? GEO_CODER.getDescriptionForNumber(getPhoneNumber(phoneNum), Locale.CHINESE) : "";
+    }
+
+    /**
+     * 验证当前手机号是否有效
+     * @param phone 手机号
+     * @return 校验结果
+     */
+    public static boolean isValidNumber(String phone){
+        return PHONE_NUMBER_UTIL.isValidNumber(getPhoneNumber(phone));
+    }
+
+    /**
+     * 生成PhoneNumber
+     * @param phone 手机号
+     * @return PhoneNumber
+     */
+    private static Phonenumber.PhoneNumber getPhoneNumber(String phone){
+        Phonenumber.PhoneNumber phoneNumber = new Phonenumber.PhoneNumber();
+        // 国际长途电话区号  国内 86
+        phoneNumber.setCountryCode(86);
+        phoneNumber.setNationalNumber(Long.parseLong(phone));
+        return phoneNumber;
+    }
+
+    public static void main(String[] args) {
+
+        String phoneNum = "19909918878";
+        System.out.println(getRegionInfoByPhoneAPI(phoneNum));
+
+    }
 }