|
@@ -5,6 +5,10 @@ import cn.hutool.http.HttpUtil;
|
|
|
import com.alibaba.fastjson2.JSON;
|
|
import com.alibaba.fastjson2.JSON;
|
|
|
import com.alibaba.fastjson2.JSONArray;
|
|
import com.alibaba.fastjson2.JSONArray;
|
|
|
import com.alibaba.fastjson2.JSONObject;
|
|
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.config.InspurConfig;
|
|
|
import com.inspur.common.core.redis.RedisCache;
|
|
import com.inspur.common.core.redis.RedisCache;
|
|
|
import com.inspur.common.utils.DateUtils;
|
|
import com.inspur.common.utils.DateUtils;
|
|
@@ -32,6 +36,7 @@ import org.springframework.util.CollectionUtils;
|
|
|
import java.io.File;
|
|
import java.io.File;
|
|
|
import java.util.HashMap;
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
|
+import java.util.Locale;
|
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
@@ -85,6 +90,25 @@ public class PBXServiceImpl implements IPBXService {
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private ElevatorPersonInfoMapper elevatorPersonInfoMapper;
|
|
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
|
|
@Override
|
|
|
public String getAccessToken() {
|
|
public String getAccessToken() {
|
|
|
log.debug("getAccessToken start");
|
|
log.debug("getAccessToken start");
|
|
@@ -244,7 +268,7 @@ public class PBXServiceImpl implements IPBXService {
|
|
|
// bugfix 出现存在infos内容为IVR的情况 排除这类情况
|
|
// bugfix 出现存在infos内容为IVR的情况 排除这类情况
|
|
|
if (PBXConstant.IVR_CODE_SAFE_CODE.equals(dtmf) || PBXConstant.IVR_CODE_TRANSFER_CODE.equals(dtmf)
|
|
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_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;
|
|
return;
|
|
|
}
|
|
}
|
|
|
log.info("dtmfEvent,callId:{}",callId);
|
|
log.info("dtmfEvent,callId:{}",callId);
|
|
@@ -354,9 +378,9 @@ public class PBXServiceImpl implements IPBXService {
|
|
|
private void forEachCall(List<ElevatorPersonInfo> wbPersonInfos, List<ElevatorPersonInfo> wyPersonInfos,
|
|
private void forEachCall(List<ElevatorPersonInfo> wbPersonInfos, List<ElevatorPersonInfo> wyPersonInfos,
|
|
|
WsDtmfMessage wsDtmfMessage, ElevatorWorkOrder workOrder,
|
|
WsDtmfMessage wsDtmfMessage, ElevatorWorkOrder workOrder,
|
|
|
ElevatorWorkOrderMapper workOrderMapper, ElevatorWorkNodeMapper workNodeMapper,String lastCallCode) {
|
|
ElevatorWorkOrderMapper workOrderMapper, ElevatorWorkNodeMapper workNodeMapper,String lastCallCode) {
|
|
|
-
|
|
|
|
|
String callId = wsDtmfMessage.getMsg().getCall_id();
|
|
String callId = wsDtmfMessage.getMsg().getCall_id();
|
|
|
if (!CollectionUtils.isEmpty(wbPersonInfos)) {
|
|
if (!CollectionUtils.isEmpty(wbPersonInfos)) {
|
|
|
|
|
+ log.info("开始呼叫维保人员:wbPersonInfos.size = " + wbPersonInfos.size());
|
|
|
for (ElevatorPersonInfo wbPerson : wbPersonInfos) {
|
|
for (ElevatorPersonInfo wbPerson : wbPersonInfos) {
|
|
|
// 查询是否已经存在电话结束的节点,如果有将跳出循环
|
|
// 查询是否已经存在电话结束的节点,如果有将跳出循环
|
|
|
ElevatorWorkNode endNode = elevatorWorkNodeMapper.selectElevatorWorkNodeByCallIdAndType(callId, "4");
|
|
ElevatorWorkNode endNode = elevatorWorkNodeMapper.selectElevatorWorkNodeByCallIdAndType(callId, "4");
|
|
@@ -395,6 +419,7 @@ public class PBXServiceImpl implements IPBXService {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
if (!CollectionUtils.isEmpty(wyPersonInfos)) {
|
|
if (!CollectionUtils.isEmpty(wyPersonInfos)) {
|
|
|
|
|
+ log.info("开始呼叫物业人员:wyPersonInfos.size = " + wyPersonInfos.size());
|
|
|
for (ElevatorPersonInfo wyPerson : wyPersonInfos) {
|
|
for (ElevatorPersonInfo wyPerson : wyPersonInfos) {
|
|
|
// 查询是否已经存在电话结束的节点,如果有将跳出循环
|
|
// 查询是否已经存在电话结束的节点,如果有将跳出循环
|
|
|
ElevatorWorkNode endNode = elevatorWorkNodeMapper.selectElevatorWorkNodeByCallIdAndType(callId, "4");
|
|
ElevatorWorkNode endNode = elevatorWorkNodeMapper.selectElevatorWorkNodeByCallIdAndType(callId, "4");
|
|
@@ -440,6 +465,7 @@ public class PBXServiceImpl implements IPBXService {
|
|
|
String personName = "应急保底救援";
|
|
String personName = "应急保底救援";
|
|
|
String unitName = "应急保底救援";
|
|
String unitName = "应急保底救援";
|
|
|
createOrderNode_3("联系应急保底救援", workOrder, wsDtmfMessage, false, lastCallCode, personName);
|
|
createOrderNode_3("联系应急保底救援", workOrder, wsDtmfMessage, false, lastCallCode, personName);
|
|
|
|
|
+ log.info("开始联系应急保底救援 : " + lastCallCode);
|
|
|
transferCall_v3(wsDtmfMessage, lastCallCode);
|
|
transferCall_v3(wsDtmfMessage, lastCallCode);
|
|
|
// 接口调用成功,缓存数据,call_id RING
|
|
// 接口调用成功,缓存数据,call_id RING
|
|
|
redisCache.setCacheObject(PBXConstant.PBX_TRANSFER_CODE_KEY + lastCallCode, callId, 60 * 5, TimeUnit.SECONDS);
|
|
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("type", PBXConstant.CALL_TRANSFER_TYPE_BIND);
|
|
|
params.put("channel_id", channelId);
|
|
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");
|
|
params.put("dial_permission","1000");
|
|
|
|
|
|
|
|
String url = pbxUrl + PBXConstant.CALL_TRANSFER + pbxToken;
|
|
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) {
|
|
private boolean transferCall_v2(WsCallInMessage wsCallInMessage,String callNumber) {
|
|
|
String pbxToken = redisCache.getCacheObject(PBXConstant.PBX_TOKEN_KEY);
|
|
String pbxToken = redisCache.getCacheObject(PBXConstant.PBX_TOKEN_KEY);
|
|
|
Map<String, String> params = new HashMap<String, String>(6);
|
|
Map<String, String> params = new HashMap<String, String>(6);
|
|
@@ -728,6 +776,7 @@ public class PBXServiceImpl implements IPBXService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private ElevatorWorkOrder createWorkOrder(WsDtmfMessage wsDtmfMessage) {
|
|
private ElevatorWorkOrder createWorkOrder(WsDtmfMessage wsDtmfMessage) {
|
|
|
|
|
+ log.info("begin create new work order");
|
|
|
String callId = wsDtmfMessage.getMsg().getCall_id();
|
|
String callId = wsDtmfMessage.getMsg().getCall_id();
|
|
|
String fromPhone = "";
|
|
String fromPhone = "";
|
|
|
// 通话状态
|
|
// 通话状态
|
|
@@ -789,14 +838,22 @@ public class PBXServiceImpl implements IPBXService {
|
|
|
toPhone = extensionInfo.getNumber();
|
|
toPhone = extensionInfo.getNumber();
|
|
|
channelId = extensionInfo.getChannel_id();
|
|
channelId = extensionInfo.getChannel_id();
|
|
|
}else if (PBXConstant.PBX_ACTIVE_PROD.equals(pbxActive)) {
|
|
}else if (PBXConstant.PBX_ACTIVE_PROD.equals(pbxActive)) {
|
|
|
- BoundInfo boundInfo = member.getInbound();
|
|
|
|
|
|
|
+ BoundInfo boundInfo = member.getOutbound();
|
|
|
|
|
+ if (null == boundInfo) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
memberStatus = boundInfo.getMember_status();
|
|
memberStatus = boundInfo.getMember_status();
|
|
|
toPhone = boundInfo.getTo();
|
|
toPhone = boundInfo.getTo();
|
|
|
channelId = boundInfo.getChannel_id();
|
|
channelId = boundInfo.getChannel_id();
|
|
|
|
|
+ log.info("memberStatus : " + memberStatus + ",toPhone : " + toPhone + ",channelId = " + channelId);
|
|
|
}else {
|
|
}else {
|
|
|
log.error("pbxActive is null");
|
|
log.error("pbxActive is null");
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
+ // bugfix toPhone 存在出现IVR号码的情况,这时不处理
|
|
|
|
|
+ if (StringUtils.isEmpty(toPhone) || toPhone.length() == 4) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
String callId = redisCache.getCacheObject(PBXConstant.PBX_TRANSFER_CODE_KEY + toPhone);
|
|
String callId = redisCache.getCacheObject(PBXConstant.PBX_TRANSFER_CODE_KEY + toPhone);
|
|
|
if (StringUtils.isEmpty(callId)) {
|
|
if (StringUtils.isEmpty(callId)) {
|
|
|
log.info("no cache transferToValue,key : {}",PBXConstant.PBX_TRANSFER_CODE_KEY + toPhone);
|
|
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");
|
|
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));
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|