add manual dial case key

This commit is contained in:
Donghuang 2021-12-03 15:10:43 +08:00
parent 4c3009126f
commit 61a4c5f912
5 changed files with 53 additions and 46 deletions

View File

@ -22,8 +22,8 @@ public class BaseReqDial implements Serializable {
@NotNull
private DialType dialType = DialType.MANUAL;
private String bizKey;
private String attachedData;
private String caseKey;
private String metaData;
private String attrs;
private int timeout = 60;

View File

@ -1,5 +1,6 @@
package com.pudonghot.yo.fsagent.service.dubbo.impl;
import lombok.val;
import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;
@ -7,7 +8,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.util.Assert;
import com.pudonghot.yo.model.domain.Agent;
import com.wacai.tigon.sequence.IdSequence;
import com.pudonghot.yo.model.domain.Tenant;
import org.apache.commons.lang3.StringUtils;
import com.pudonghot.yo.mapper.AgentGroupMapper;
import com.pudonghot.yo.model.domain.AgentGroup;
@ -45,21 +45,21 @@ abstract class AbstractDialer<LegB> {
* @param arg dial arg
*/
public void dial(DialArg<LegB> arg) {
final BaseReqDial req = arg.getReq();
final Agent agent = arg.getAgentLegA();
val req = arg.getReq();
val agent = arg.getAgentLegA();
// validate only
findValidAgentGroup(agent);
final List<String> varsLegA = varsLegA(arg);
val varsLegA = varsLegA(arg);
extVarsLegA(arg, varsLegA);
final List<String> varsLegB = varsLegB(arg);
val varsLegB = varsLegB(arg);
extVarsLegB(arg, varsLegB);
final List<String> varsGlobal = varsGlobal(req);
val varsGlobal = varsGlobal(req);
extVarsGlobal(arg, varsGlobal);
final String commandArg =
val commandArg =
format("{{}}{} &bridge({})",
join(varsGlobal, ","),
format("[{}]{}", join(varsLegB, ","), dialStrLegB(arg)),
@ -122,7 +122,7 @@ abstract class AbstractDialer<LegB> {
*/
protected List<String> varsGlobal(final BaseReqDial req) {
// Global vars
final List<String> vars = new ArrayList<>(16);
val vars = new ArrayList<String>(16);
if (req.isIgnoreEarlyMedia()) {
vars.add("ignore_early_media=true");
}
@ -137,30 +137,30 @@ abstract class AbstractDialer<LegB> {
* @return vars leg A
*/
protected List<String> varsLegA(final DialArg<LegB> arg) {
final List<String> vars = new ArrayList<>(16);
final BaseReqDial req = arg.getReq();
final Agent agent = arg.getAgentLegA();
val vars = new ArrayList<String>(16);
val req = arg.getReq();
val agent = arg.getAgentLegA();
vars.add(agentTypeVar(agent.getType()));
if (agent.getWebrtc()) {
vars.add("media_webrtc=true");
}
vars.add("odbc-cdr-ignore-leg=true");
vars.add("x_logic_role=CALLER");
final String connId = arg.getConnId();
val connId = arg.getConnId();
vars.add("x_conn_id=" + connId);
final Tenant tenant = arg.getTenant();
val tenant = arg.getTenant();
vars.add("x_tenant_id=" + tenant.getId());
vars.add("x_tenant_code=" + tenant.getCode());
vars.add("x_account=" + agent.getAccount());
final CallDetailRecord.DialType dialType = req.getDialType();
val dialType = req.getDialType();
vars.add(dialTypeVar(dialType));
vars.add(headerDialTypeVar(dialType));
// for compatible
// vars.add("sip_h_X-Genesys-CallUUID=" + connId);
bizKey(vars, req.getBizKey());
addCaseKey(vars, req.getCaseKey());
// self
vars.add("callee_id_number=" + agent.getAgent());
vars.add("callee_id_name=" + agent.getAccount());
@ -168,9 +168,9 @@ abstract class AbstractDialer<LegB> {
vars.add("sip_auto_answer=true");
vars.add("origination_uuid=" + idSeq.get());
vars.add("sip_invite_call_id=" + connId);
final String attachedData = req.getAttachedData();
if (StringUtils.isNotBlank(attachedData)) {
vars.add("sip_h_X-Meta-Data=" + attachedData);
val metaData = req.getMetaData();
if (StringUtils.isNotBlank(metaData)) {
vars.add("sip_h_X-Meta-Data=" + metaData);
}
return vars;
}
@ -183,14 +183,14 @@ abstract class AbstractDialer<LegB> {
*/
protected List<String> varsLegB(final DialArg<LegB> arg) {
final BaseReqDial req = arg.getReq();
final Tenant tenant = arg.getTenant();
final Agent agent = arg.getAgentLegA();
final String userUri = agent.getAgent() + "@" + tenant.getRealm();
val req = arg.getReq();
val tenant = arg.getTenant();
val agent = arg.getAgentLegA();
val userUri = agent.getAgent() + "@" + tenant.getRealm();
// Global vars
final List<String> vars = new ArrayList<>(16);
final String recLoc = recLoc(arg);
final String connId = arg.getConnId();
val vars = new ArrayList<String>(16);
val recLoc = recLoc(arg);
val connId = arg.getConnId();
vars.addAll(Arrays.asList(new String[] {
"x_logic_role=CALLED",
"x_tenant_id=" + tenant.getId(),
@ -223,14 +223,14 @@ abstract class AbstractDialer<LegB> {
"record_post_process_exec_api='curl:" + localApiService.getPostRecUrl() + " post tenantId=" + tenant.getId() + "&loc=" + recLoc + "'"
}));
bizKey(vars, req.getBizKey());
addCaseKey(vars, req.getCaseKey());
return vars;
}
protected void bizKey(final List<String> vars, String bizKey) {
if (StringUtils.isNotBlank(bizKey)) {
vars.add("x_biz_key=" + bizKey);
protected void addCaseKey(final List<String> vars, String caseKey) {
if (StringUtils.isNotBlank(caseKey)) {
vars.add("x_case_key=" + caseKey);
}
}
@ -263,7 +263,7 @@ abstract class AbstractDialer<LegB> {
}
AgentGroup findValidAgentGroup(final Agent agent) {
final AgentGroup agentGroup = agentGroupMapper.find(agent.getGroupId());
val agentGroup = agentGroupMapper.find(agent.getGroupId());
Assert.state(agentGroup != null,
() -> "No agent [" + agent.getAccount() + "] group found");
Assert.state(agentGroup.getActive(),

View File

@ -2,6 +2,7 @@ package com.pudonghot.yo.fsagent.service.dubbo.impl;
import com.pudonghot.yo.mapper.*;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import me.chyxion.tigon.mybatis.Search;
import com.pudonghot.yo.model.domain.*;
import org.springframework.util.Assert;
@ -108,11 +109,11 @@ public class DialServiceImpl implements DialService {
*/
@Override
public RespDial agentDial(final ReqAgentDial req) {
final Integer tenantId = req.getTenantId();
final Tenant tenant = findValidTenant(tenantId);
val tenantId = req.getTenantId();
val tenant = findValidTenant(tenantId);
final String account = req.getAccount();
final Agent agent = agentMapper.find(
val account = req.getAccount();
val agent = agentMapper.find(
new Search(Agent.TENANT_ID, tenantId)
.eq(Agent.ACCOUNT, account));
Assert.state(agent != null,
@ -120,23 +121,23 @@ public class DialServiceImpl implements DialService {
Assert.state(agent.getActive(),
() -> "Agent [" + account + "] is not active");
final String calledNumber = req.getCalledNumber();
val calledNumber = req.getCalledNumber();
final Agent otherAgent = agentMapper.find(
val otherAgent = agentMapper.find(
new Search(Agent.TENANT_ID, tenantId)
.eq(StringUtils.isNumeric(calledNumber) ?
Agent.AGENT : Agent.ACCOUNT, calledNumber));
if (otherAgent != null) {
log.info("Dial internal agent [{}].", otherAgent);
final String otherAgentAccount = otherAgent.getAccount();
val otherAgentAccount = otherAgent.getAccount();
Assert.state(otherAgent.getActive(),
() -> "Other agent [" + otherAgentAccount + "] is not active");
req.setCalledNumber(otherAgent.getAgent());
return dialInternal(idSeq.get(), req, tenant, agent, otherAgent);
}
final Trunk trunk =
val trunk =
trunkMapper.findOfAgentGroup(agent.getGroupId());
Assert.state(trunk != null,
() -> "No trunk of agent [" + agent.getAccount() + "] found");

View File

@ -1,6 +1,5 @@
package com.pudonghot.yo.openapi.controller;
import com.pudonghot.yo.config.ConfigService;
import lombok.val;
import java.util.Date;
import java.util.Calendar;
@ -10,6 +9,7 @@ import me.chyxion.tigon.mybatis.Search;
import com.pudonghot.yo.model.domain.*;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.commons.lang3.StringUtils;
import com.pudonghot.yo.config.ConfigService;
import com.pudonghot.yo.util.PhoneNumberUtils;
import org.apache.commons.lang3.time.DateUtils;
import com.pudonghot.yo.fs.model.domain.Channel;
@ -121,17 +121,18 @@ public class CallController implements SessionAbility {
ErrorCode.DIAL_CITIC_BLACKLIST);
}
val caseKey = args.getCaseKey();
// 白名单
if (phoneWhitelistMapper.exists(
new Search(PhoneWhitelist.TENANT_ID, tenantId)
.eq(PhoneWhitelist.PHONE, calledNumber)
.eq(PhoneWhitelist.ACTIVE, true))) {
return doDial(account, calledNumber);
return doDial(account, caseKey, calledNumber);
}
// 灰名单
if (callDetailRecordMapper.calledNumberValidOfGreylist(tenantId, calledNumber)) {
return doDial(account, calledNumber);
return doDial(account, caseKey, calledNumber);
}
val calledRecordsIn30Days = callDetailRecordMapper.list(
@ -145,7 +146,7 @@ public class CallController implements SessionAbility {
.limit(8));
if (calledRecordsIn30Days.isEmpty()) {
return doDial(account, calledNumber);
return doDial(account, caseKey, calledNumber);
}
val recSize = calledRecordsIn30Days.size();
@ -194,7 +195,7 @@ public class CallController implements SessionAbility {
AssertUtils.state(!check ||
lastDialStamp.before(DateUtils.addDays(new Date(), -2)), ErrorCode.DIAL_EXCEED_IN_T2);
return doDial(account, calledNumber);
return doDial(account, caseKey, calledNumber);
}
@RequestMapping("/answer")
@ -379,11 +380,13 @@ public class CallController implements SessionAbility {
private RespAgentDialout doDial(
final String account,
final String caseKey,
final String calledNumber) {
val arg = new ReqAgentDial();
arg.setTenantId(getTenantId());
arg.setAccount(account);
arg.setCaseKey(caseKey);
arg.setCalledNumber(calledNumber);
return new RespAgentDialout(dialService.agentDial(arg).getUuid());
}

View File

@ -4,6 +4,7 @@ import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.validation.constraints.NotBlank;
import com.wacai.tigon.format.annotation.Trim;
/**
* @author Donghuang
@ -13,7 +14,9 @@ import javax.validation.constraints.NotBlank;
@Setter
@ToString
public class ReqAgentDialout {
private String caller;
@Trim
private String caseKey;
@Trim
@NotBlank
private String called;
}