From a58431c7bc1bbb20352b83f7b11f27cd7c7a7ce6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=9C=E7=9A=87=E5=A4=A7=E5=8F=94?= Date: Sat, 18 Jul 2020 17:32:30 +0800 Subject: [PATCH] add campaign module --- campaign/pom.xml | 89 +++++++++++++++++++ .../com/pudonghot/yo/campaign/YoCampaign.java | 21 +++++ .../campaign/controller/SiteController.java | 16 ++++ .../yo/campaign/service/CampaignService.java | 8 ++ .../service/impl/CampaignServiceImpl.java | 12 +++ .../resources/application-test.properties | 26 ++++++ .../src/main/resources/application.properties | 23 +++++ campaign/src/main/resources/logback.xml | 37 ++++++++ .../resources/spring/spring-yo-campaign.xml | 17 ++++ .../static/check_backend_active.html | 1 + .../com/pudonghot/yo/campaign/TestDriver.java | 17 ++++ .../src/test/resources/spring/spring-test.xml | 14 +++ cms/src/main/resources/application.properties | 2 +- .../yo/fsagent/listener/ChannelAnswer.java | 2 +- .../yo/fsagent/listener/ChannelDestroy.java | 2 +- .../dialplan/impl/BaseDialplanService.java | 31 +++++-- .../yo/fsagent/util/CallStrUtils.java | 24 ++++- .../fsagent/{ => util}/CallStrUtilsTest.java | 5 +- .../esl/client/transport/event/Event.java | 26 +++++- .../yo/model/domain/AgentStatus.java | 2 - .../impl/CommonAgentStatusServiceImpl.java | 22 +++-- .../service/CommonAgentStatusServiceTest.java | 6 +- .../yo/openapi/controller/CallController.java | 1 - .../src/main/resources/application.properties | 5 +- .../resources/spring/spring-yo-openapi.xml | 6 +- pom.xml | 1 + .../java/com/pudonghot/yo/state/YoState.java | 21 +---- .../resources/application-test.properties | 2 +- .../src/main/resources/application.properties | 2 +- 29 files changed, 389 insertions(+), 52 deletions(-) create mode 100644 campaign/pom.xml create mode 100644 campaign/src/main/java/com/pudonghot/yo/campaign/YoCampaign.java create mode 100644 campaign/src/main/java/com/pudonghot/yo/campaign/controller/SiteController.java create mode 100644 campaign/src/main/java/com/pudonghot/yo/campaign/service/CampaignService.java create mode 100644 campaign/src/main/java/com/pudonghot/yo/campaign/service/impl/CampaignServiceImpl.java create mode 100644 campaign/src/main/resources/application-test.properties create mode 100644 campaign/src/main/resources/application.properties create mode 100644 campaign/src/main/resources/logback.xml create mode 100644 campaign/src/main/resources/spring/spring-yo-campaign.xml create mode 100644 campaign/src/main/resources/static/check_backend_active.html create mode 100644 campaign/src/test/java/com/pudonghot/yo/campaign/TestDriver.java create mode 100644 campaign/src/test/resources/spring/spring-test.xml rename fsagent/src/test/java/com/pudonghot/yo/fsagent/{ => util}/CallStrUtilsTest.java (69%) diff --git a/campaign/pom.xml b/campaign/pom.xml new file mode 100644 index 00000000..9ace46fd --- /dev/null +++ b/campaign/pom.xml @@ -0,0 +1,89 @@ + + + 4.0.0 + yo-campaign + 0.0.1-RELEASE + Yo Campaign + Yo Campaign + jar + + + com.pudonghot.yo + yo + 0.0.1-SNAPSHOT + ../ + + + + com.pudonghot.yo.campaign.YoCampaign + + + + + com.pudonghot.yo + yo-fsagent-api + + + com.pudonghot.yo + yo-openapi-dto + + + com.pudonghot.yo + yo-service-common + + + com.wacai.tigon + tigon-common + + + com.pudonghot.yo + yo-web-common + + + org.springframework.boot + spring-boot-starter-actuator + + + org.apache.dubbo + dubbo-spring-boot-starter + + + org.apache.dubbo + dubbo-dependencies-zookeeper + pom + + + + org.projectlombok + lombok + provided + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + false + true + + + + pl.project13.maven + git-commit-id-plugin + + + + diff --git a/campaign/src/main/java/com/pudonghot/yo/campaign/YoCampaign.java b/campaign/src/main/java/com/pudonghot/yo/campaign/YoCampaign.java new file mode 100644 index 00000000..647ee098 --- /dev/null +++ b/campaign/src/main/java/com/pudonghot/yo/campaign/YoCampaign.java @@ -0,0 +1,21 @@ +package com.pudonghot.yo.campaign; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author Donghuang + * @date Jul 18, 2020 17:25:36 + */ +@SpringBootApplication +public class YoCampaign { + + /** + * main + * + * @param args args + */ + public static void main(final String[] args) { + SpringApplication.run(YoCampaign.class, args); + } +} diff --git a/campaign/src/main/java/com/pudonghot/yo/campaign/controller/SiteController.java b/campaign/src/main/java/com/pudonghot/yo/campaign/controller/SiteController.java new file mode 100644 index 00000000..cbd42728 --- /dev/null +++ b/campaign/src/main/java/com/pudonghot/yo/campaign/controller/SiteController.java @@ -0,0 +1,16 @@ +package com.pudonghot.yo.campaign.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * @author Donghuang + * @date Jul 18, 2020 17:24:13 + */ +@Controller +public class SiteController { + + @GetMapping("/") + public void index() { + } +} diff --git a/campaign/src/main/java/com/pudonghot/yo/campaign/service/CampaignService.java b/campaign/src/main/java/com/pudonghot/yo/campaign/service/CampaignService.java new file mode 100644 index 00000000..a09dc644 --- /dev/null +++ b/campaign/src/main/java/com/pudonghot/yo/campaign/service/CampaignService.java @@ -0,0 +1,8 @@ +package com.pudonghot.yo.campaign.service; + +/** + * @author Donghuang + * @date Jul 18, 2020 17:24:50 + */ +public interface CampaignService { +} diff --git a/campaign/src/main/java/com/pudonghot/yo/campaign/service/impl/CampaignServiceImpl.java b/campaign/src/main/java/com/pudonghot/yo/campaign/service/impl/CampaignServiceImpl.java new file mode 100644 index 00000000..d891b9cd --- /dev/null +++ b/campaign/src/main/java/com/pudonghot/yo/campaign/service/impl/CampaignServiceImpl.java @@ -0,0 +1,12 @@ +package com.pudonghot.yo.campaign.service.impl; + +import org.springframework.stereotype.Service; +import com.pudonghot.yo.campaign.service.CampaignService; + +/** + * @author Donghuang + * @date Jul 18, 2020 17:25:17 + */ +@Service +public class CampaignServiceImpl implements CampaignService { +} diff --git a/campaign/src/main/resources/application-test.properties b/campaign/src/main/resources/application-test.properties new file mode 100644 index 00000000..b0c6bb6b --- /dev/null +++ b/campaign/src/main/resources/application-test.properties @@ -0,0 +1,26 @@ +# Yo Campaign +server.port=8085 +spring.application.name=yo-campaign +spring.jackson.time-zone=GMT+8 +spring.jackson.serialization.write-dates-as-timestamps=true +spring.jackson.serialization.fail-on-empty-beans=false +spring.servlet.multipart.max-file-size=256MB +spring.servlet.multipart.max-request-size=256MB +site.context-path= + +tigon.query-service.scan.page-size=512 + +# Datasource Yo +yo.datasource.url=jdbc:mysql://localhost/callcenter?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai +yo.datasource.username=yo +yo.datasource.password=yo_query! + +# Datasource FreeSWITCH +yo.fs.datasource.url=jdbc:mysql://localhost/freeswitch?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai +yo.fs.datasource.username=freeswitch +yo.fs.datasource.password=RR!h5IpirsnJ + +# Redis +spring.redis.host=localhost +spring.redis.port=6379 +# spring.redis.password=123456 diff --git a/campaign/src/main/resources/application.properties b/campaign/src/main/resources/application.properties new file mode 100644 index 00000000..fd14a56c --- /dev/null +++ b/campaign/src/main/resources/application.properties @@ -0,0 +1,23 @@ +server.port=8087 +spring.application.name=yo-campaign +spring.jackson.time-zone=GMT+8 +spring.jackson.serialization.write-dates-as-timestamps=true +spring.jackson.serialization.fail-on-empty-beans=false + +tigon.query-service.scan.page-size=512 + +# Datasource +yo.datasource.url=jdbc:mysql://172.18.4.35/yoqw?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai +yo.datasource.username=yoqw +yo.datasource.password=yoqw_query! + +# Datasource FreeSWITCH +yo.fs.datasource.url=jdbc:mysql://172.18.4.35/fs_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai +yo.fs.datasource.username=freeswitch +yo.fs.datasource.password=RR!h5IpirsnJ + +# Redis +spring.redis.host=172.18.4.35 +spring.redis.port=6379 +spring.redis.password=123456 + diff --git a/campaign/src/main/resources/logback.xml b/campaign/src/main/resources/logback.xml new file mode 100644 index 00000000..2f84c827 --- /dev/null +++ b/campaign/src/main/resources/logback.xml @@ -0,0 +1,37 @@ + +> + + + + + + true + + %magenta(%d{"yyyy-MM-dd HH:mm:ss,SSS"}) [%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n + + + + + ${log.dir}/${project.artifactId}.log + + %d{"yyyy-MM-dd HH:mm:ss,SSS"} [%thread] %-5level %logger{15} %msg %n + + + ${log.dir}/%d{yyyy-MM, aux}/${project.artifactId}-%d{yyyy-MM-dd}.%i.log + + 32MB + + + + + + + + + + + + + + + diff --git a/campaign/src/main/resources/spring/spring-yo-campaign.xml b/campaign/src/main/resources/spring/spring-yo-campaign.xml new file mode 100644 index 00000000..3cad6df1 --- /dev/null +++ b/campaign/src/main/resources/spring/spring-yo-campaign.xml @@ -0,0 +1,17 @@ + + + + + + + diff --git a/campaign/src/main/resources/static/check_backend_active.html b/campaign/src/main/resources/static/check_backend_active.html new file mode 100644 index 00000000..a0aba931 --- /dev/null +++ b/campaign/src/main/resources/static/check_backend_active.html @@ -0,0 +1 @@ +OK \ No newline at end of file diff --git a/campaign/src/test/java/com/pudonghot/yo/campaign/TestDriver.java b/campaign/src/test/java/com/pudonghot/yo/campaign/TestDriver.java new file mode 100644 index 00000000..321204c7 --- /dev/null +++ b/campaign/src/test/java/com/pudonghot/yo/campaign/TestDriver.java @@ -0,0 +1,17 @@ +package com.pudonghot.yo.campaign; + +import org.junit.Test; +import lombok.extern.slf4j.Slf4j; + +/** + * @author Donghuang + * @date Jul 18, 2020 17:23:28 + */ +@Slf4j +public class TestDriver { + + @Test + public void run() { + log.info("Test run."); + } +} diff --git a/campaign/src/test/resources/spring/spring-test.xml b/campaign/src/test/resources/spring/spring-test.xml new file mode 100644 index 00000000..e569cc31 --- /dev/null +++ b/campaign/src/test/resources/spring/spring-test.xml @@ -0,0 +1,14 @@ + + + + + diff --git a/cms/src/main/resources/application.properties b/cms/src/main/resources/application.properties index 17622470..382ba369 100644 --- a/cms/src/main/resources/application.properties +++ b/cms/src/main/resources/application.properties @@ -17,7 +17,7 @@ yo.datasource.username=yoqw yo.datasource.password=yoqw_query! # Datasource -yo.fs.datasource.url=jdbc:mysql://172.18.4.35/freeswitch?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai +yo.fs.datasource.url=jdbc:mysql://172.18.4.35/fs_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai yo.fs.datasource.username=freeswitch yo.fs.datasource.password=RR!h5IpirsnJ diff --git a/fsagent/src/main/java/com/pudonghot/yo/fsagent/listener/ChannelAnswer.java b/fsagent/src/main/java/com/pudonghot/yo/fsagent/listener/ChannelAnswer.java index c78aa503..d49d5897 100644 --- a/fsagent/src/main/java/com/pudonghot/yo/fsagent/listener/ChannelAnswer.java +++ b/fsagent/src/main/java/com/pudonghot/yo/fsagent/listener/ChannelAnswer.java @@ -53,7 +53,7 @@ public class ChannelAnswer { null)); final Map eventData = new HashMap<>(8); - eventData.put("callid", event.getHeader("variable_x_conn_id")); + eventData.put("callid", event.getConnId()); if (EslEventUtils.isCaller(event)) { // feature:0普通呼入,7普通外呼, 51内部求助 eventData.put("feature", "7"); diff --git a/fsagent/src/main/java/com/pudonghot/yo/fsagent/listener/ChannelDestroy.java b/fsagent/src/main/java/com/pudonghot/yo/fsagent/listener/ChannelDestroy.java index 3a146666..ffb7c4ea 100644 --- a/fsagent/src/main/java/com/pudonghot/yo/fsagent/listener/ChannelDestroy.java +++ b/fsagent/src/main/java/com/pudonghot/yo/fsagent/listener/ChannelDestroy.java @@ -49,7 +49,7 @@ public class ChannelDestroy { final String callUuid = event.getCallUuid(); final String channelName = event.getChannelName(); log.info("On channel [{}][{}] destroy event.", channelName, callUuid); - final ChannelInfo channelInfo = CallStrUtils.parseChannelName(channelName); + final ChannelInfo channelInfo = CallStrUtils.getChannelInfo(event); if (channelInfo.isAgent()) { diff --git a/fsagent/src/main/java/com/pudonghot/yo/fsagent/service/dialplan/impl/BaseDialplanService.java b/fsagent/src/main/java/com/pudonghot/yo/fsagent/service/dialplan/impl/BaseDialplanService.java index 97e1d6a0..8aac5e69 100644 --- a/fsagent/src/main/java/com/pudonghot/yo/fsagent/service/dialplan/impl/BaseDialplanService.java +++ b/fsagent/src/main/java/com/pudonghot/yo/fsagent/service/dialplan/impl/BaseDialplanService.java @@ -4,11 +4,11 @@ import java.util.Map; import lombok.extern.slf4j.Slf4j; import java.util.function.Function; import java.util.function.Supplier; - import com.wacai.tigon.mybatis.Search; import com.pudonghot.yo.model.domain.*; import com.pudonghot.yo.fsagent.service.*; import com.wacai.tigon.sequence.IdSequence; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.springframework.util.DigestUtils; import com.pudonghot.yo.fsagent.util.CallStrUtils; @@ -63,12 +63,33 @@ public abstract class BaseDialplanService implements DialplanService { return find(call); } + protected String getParam(final Map params, final String name, final String... names) { + + String val = params.get(name); + if (StringUtils.isNotBlank(val)) { + return val; + } + + for (String n : names) { + val = params.get(n); + if (StringUtils.isNotBlank(val)) { + return val; + } + } + + return null; + } + protected String getChannelName(final Map params) { - return params.get("Channel-Name"); + return getParam(params, "Channel-Name", "variable_channel_name"); + } + + public String getPresenceId(final Map params) { + return getParam(params, "Channel-Presence-ID", "variable_presence_id"); } protected ChannelInfo getChannelInfo(final Map params) { - return CallStrUtils.parseChannelName(getChannelName(params)); + return CallStrUtils.parseChannelName(getChannelName(params), getPresenceId(params)); } protected DialplanConfig onCallerAgent(final Call call, final Function consumer) { @@ -105,10 +126,6 @@ public abstract class BaseDialplanService implements DialplanService { return call.getParams().get("variable_x_called_number"); } - protected boolean calledNumberEquals(final Map params, final String target) { - return target.equals(getCalledNumber(params)); - } - protected boolean calledNumberEquals(final Call call, final String target) { return target.equals(call.getCalledNumber()); } diff --git a/fsagent/src/main/java/com/pudonghot/yo/fsagent/util/CallStrUtils.java b/fsagent/src/main/java/com/pudonghot/yo/fsagent/util/CallStrUtils.java index b89cdedd..888b2a89 100644 --- a/fsagent/src/main/java/com/pudonghot/yo/fsagent/util/CallStrUtils.java +++ b/fsagent/src/main/java/com/pudonghot/yo/fsagent/util/CallStrUtils.java @@ -6,6 +6,7 @@ import lombok.ToString; import java.util.regex.Pattern; import java.util.regex.Matcher; import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; import org.freeswitch.esl.client.transport.event.Event; /** @@ -14,7 +15,7 @@ import org.freeswitch.esl.client.transport.event.Event; */ public class CallStrUtils { public static final Pattern PATTERN_USER_AND_DOMAIN = - Pattern.compile("^sofia/internal/([^@]+)@(.+)$"); + Pattern.compile("^sofia/internal/([^@]+)@([^\\:]+)(?:\\:\\d+)?$"); public static final Pattern PATTERN_EXTERNAL_NUMBER = Pattern.compile("^sofia/external/(\\w+)$"); @@ -28,7 +29,24 @@ public class CallStrUtils { * @return channel info */ public static ChannelInfo getChannelInfo(final Event event) { - return parseChannelName(event.getChannelName()); + return parseChannelName(event.getChannelName(), event.getPresenceId()); + } + + /** + * get channel info by presence id and channel name + * + * @param presenceId presence id + * @param channelName channel name + * @return channel info + */ + public static ChannelInfo parseChannelName(final String channelName, final String presenceId) { + if (StringUtils.isNotBlank(presenceId)) { + final String[] presence = presenceId.split("@"); + if (presence.length == 2) { + return new ChannelInfo(presence[0], presence[1], true); + } + } + return parseChannelName(channelName); } /** @@ -37,7 +55,7 @@ public class CallStrUtils { * @param channelName channel name * @return channel info */ - public static ChannelInfo parseChannelName(final String channelName) { + static ChannelInfo parseChannelName(final String channelName) { Matcher m = PATTERN_USER_AND_DOMAIN.matcher(channelName); if (m.find()) { return new ChannelInfo(m.group(1), m.group(2), true); diff --git a/fsagent/src/test/java/com/pudonghot/yo/fsagent/CallStrUtilsTest.java b/fsagent/src/test/java/com/pudonghot/yo/fsagent/util/CallStrUtilsTest.java similarity index 69% rename from fsagent/src/test/java/com/pudonghot/yo/fsagent/CallStrUtilsTest.java rename to fsagent/src/test/java/com/pudonghot/yo/fsagent/util/CallStrUtilsTest.java index 201b0c6d..af5170a9 100644 --- a/fsagent/src/test/java/com/pudonghot/yo/fsagent/CallStrUtilsTest.java +++ b/fsagent/src/test/java/com/pudonghot/yo/fsagent/util/CallStrUtilsTest.java @@ -1,8 +1,7 @@ -package com.pudonghot.yo.fsagent; +package com.pudonghot.yo.fsagent.util; import org.junit.Test; import lombok.extern.slf4j.Slf4j; -import com.pudonghot.yo.fsagent.util.CallStrUtils; /** * @author Donghuang @@ -14,7 +13,9 @@ public class CallStrUtilsTest { @Test public void testParse() { log.info("User and domain [{}]", CallStrUtils.parseChannelName("sofia/internal/700001@d1.wacai.info")); + log.info("User and domain [{}]", CallStrUtils.parseChannelName("sofia/internal/700002@d1.wacai.info:5060")); log.info("External number [{}]", CallStrUtils.parseChannelName("sofia/external/013764268709")); + log.info("External number [{}]", CallStrUtils.parseChannelName("sofia/external/013764268709", "donghuang@d1.wacia.info")); log.info("Dial target [{}]", CallStrUtils.parseDialTarget("4.Q")); log.info("Dial target [{}]", CallStrUtils.parseDialTarget("1.A")); log.info("Dial target [{}]", CallStrUtils.parseDialTarget("4.AG")); diff --git a/lib/fsesl-api/src/main/java/org/freeswitch/esl/client/transport/event/Event.java b/lib/fsesl-api/src/main/java/org/freeswitch/esl/client/transport/event/Event.java index 332528d4..a51a86c7 100644 --- a/lib/fsesl-api/src/main/java/org/freeswitch/esl/client/transport/event/Event.java +++ b/lib/fsesl-api/src/main/java/org/freeswitch/esl/client/transport/event/Event.java @@ -90,9 +90,22 @@ public class Event { * @param name header name * @return header value */ - public String getHeader(final String name) { - return headers.get(name); - } + public String getHeader(String name, String... names) { + + String val = headers.get(name); + if (StringUtils.isNotBlank(val)) { + return val; + } + + for (String n : names) { + val = headers.get(n); + if (StringUtils.isNotBlank(val)) { + return val; + } + } + + return null; + } /** * Convenience method. @@ -101,7 +114,11 @@ public class Event { * @return channel name */ public String getChannelName() { - return getHeader("variable_channel_name"); + return getHeader("Channel-Name", "variable_channel_name"); + } + + public String getPresenceId() { + return getHeader("Channel-Presence-ID", "variable_presence_id"); } /** @@ -251,4 +268,5 @@ public class Event { mapToString.put("body", body.size() + " lines"); return mapToString.toString(); } + } diff --git a/lib/model/src/main/java/com/pudonghot/yo/model/domain/AgentStatus.java b/lib/model/src/main/java/com/pudonghot/yo/model/domain/AgentStatus.java index 63b565fb..8334670b 100644 --- a/lib/model/src/main/java/com/pudonghot/yo/model/domain/AgentStatus.java +++ b/lib/model/src/main/java/com/pudonghot/yo/model/domain/AgentStatus.java @@ -37,8 +37,6 @@ public class AgentStatus extends TenantDomain { public enum State { IDLE, - WAITING, - RECEIVING, IN_A_CALL, ACW } diff --git a/lib/service-common/src/main/java/com/pudonghot/yo/service/impl/CommonAgentStatusServiceImpl.java b/lib/service-common/src/main/java/com/pudonghot/yo/service/impl/CommonAgentStatusServiceImpl.java index 3555d27b..475cdddd 100644 --- a/lib/service-common/src/main/java/com/pudonghot/yo/service/impl/CommonAgentStatusServiceImpl.java +++ b/lib/service-common/src/main/java/com/pudonghot/yo/service/impl/CommonAgentStatusServiceImpl.java @@ -7,10 +7,12 @@ import com.wacai.tigon.mybatis.Search; import com.pudonghot.yo.mapper.AgentMapper; import com.wacai.tigon.sequence.IdSequence; import com.pudonghot.yo.model.domain.Agent; +import com.pudonghot.yo.fs.model.domain.Channel; import com.pudonghot.yo.mapper.AgentStatusMapper; import com.pudonghot.yo.model.domain.AgentStatus; import com.pudonghot.yo.model.exception.ErrorCode; import com.pudonghot.yo.model.exception.AssertUtils; +import com.pudonghot.yo.service.CommonChannelService; import com.pudonghot.yo.service.CommonDelayScheduleService; import com.pudonghot.yo.service.CommonAgentStatusService; import org.springframework.beans.factory.annotation.Autowired; @@ -32,6 +34,8 @@ public class CommonAgentStatusServiceImpl private IdSequence idSeq; @Setter(onMethod_ = {@Autowired}) private CommonDelayScheduleService delayScheduleService; + @Setter(onMethod_ = {@Autowired}) + private CommonChannelService commonChannelService; /** * {@inheritDoc} @@ -65,13 +69,14 @@ public class CommonAgentStatusServiceImpl agentStatus.setRegistered(true); agentStatus.setStatus(AgentStatus.Status.OFFLINE); agentStatus.setState(AgentStatus.State.IDLE); + agentStatusMapper.insert(agentStatus); } else { agentStatus.setRegistered(true); agentStatus.setCheckRegKey(null); - agentStatus.setState(AgentStatus.State.IDLE); clear(agentStatus); + setState(agent, agentStatus); agentStatusMapper.update(agentStatus); } } @@ -93,8 +98,8 @@ public class CommonAgentStatusServiceImpl log.info("Unregister agent [{}]. ", agent); final AgentStatus agentStatus = findValidAgentStatus(agent); agentStatus.setRegistered(false); - agentStatus.setState(AgentStatus.State.IDLE); clear(agentStatus); + setState(agent, agentStatus); agentStatusMapper.update(agentStatus); } @@ -225,7 +230,7 @@ public class CommonAgentStatusServiceImpl delayScheduleService.acw(agent); } else { - agentStatus.setState(AgentStatus.State.IDLE); + setState(agent, agentStatus); } log.info("Update agent status [{}].", agentStatus); @@ -258,7 +263,7 @@ public class CommonAgentStatusServiceImpl AssertUtils.state(agentStatus.getState() == AgentStatus.State.ACW, AGENT_UPDATE_STATUS_FAIL); clear(agentStatus); - agentStatus.setState(AgentStatus.State.IDLE); + setState(agent, agentStatus); agentStatus.setAcwTime(null); log.info("Update agent status [{}].", agentStatus); agentStatusMapper.update(agentStatus); @@ -281,7 +286,7 @@ public class CommonAgentStatusServiceImpl final AgentStatus agentStatus = findValidAgentStatus(agent); clear(agentStatus); - agentStatus.setState(AgentStatus.State.IDLE); + setState(agent, agentStatus); log.info("Update agent status [{}].", agentStatus); agentStatusMapper.update(agentStatus); @@ -311,4 +316,11 @@ public class CommonAgentStatusServiceImpl agentStatus.setAcwTime(null); agentStatus.setUpdatedTime(new Date()); } + + private void setState(final Agent agent, final AgentStatus agentStatus) { + final Channel channel = commonChannelService.find(agent); + agentStatus.setState(channel != null ? + AgentStatus.State.IN_A_CALL : + AgentStatus.State.IDLE); + } } diff --git a/lib/service-common/src/test/java/com/pudonghot/yo/service/CommonAgentStatusServiceTest.java b/lib/service-common/src/test/java/com/pudonghot/yo/service/CommonAgentStatusServiceTest.java index f0202a49..084851be 100644 --- a/lib/service-common/src/test/java/com/pudonghot/yo/service/CommonAgentStatusServiceTest.java +++ b/lib/service-common/src/test/java/com/pudonghot/yo/service/CommonAgentStatusServiceTest.java @@ -1,5 +1,7 @@ package com.pudonghot.yo.service; +import com.pudonghot.yo.mapper.AgentMapper; +import com.pudonghot.yo.model.domain.Agent; import org.junit.Test; import org.junit.runner.RunWith; import lombok.extern.slf4j.Slf4j; @@ -15,11 +17,13 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @SpringBootTest(classes = TestDriver.class) @RunWith(SpringJUnit4ClassRunner.class) public class CommonAgentStatusServiceTest { + @Autowired + private AgentMapper agentMapper; @Autowired private CommonAgentStatusService agentStatusService; @Test public void testRun() { - log.info("Run."); + log.info("Agent status [{}].", agentStatusService.findValidAgentStatus(agentMapper.find(1))); } } diff --git a/openapi/src/main/java/com/pudonghot/yo/openapi/controller/CallController.java b/openapi/src/main/java/com/pudonghot/yo/openapi/controller/CallController.java index 4f83132f..bd7919d0 100644 --- a/openapi/src/main/java/com/pudonghot/yo/openapi/controller/CallController.java +++ b/openapi/src/main/java/com/pudonghot/yo/openapi/controller/CallController.java @@ -120,7 +120,6 @@ public class CallController implements SessionAbility { dialService.unhold(StringUtils.defaultIfBlank(callId, channel.getUuid())); } - @RequestMapping(value = "/transfer", params = { "devicetype=3", "transtype=custConfirm", diff --git a/openapi/src/main/resources/application.properties b/openapi/src/main/resources/application.properties index 0f8be7ab..7a11dac0 100644 --- a/openapi/src/main/resources/application.properties +++ b/openapi/src/main/resources/application.properties @@ -16,7 +16,7 @@ yo.datasource.username=yoqw yo.datasource.password=yoqw_query! # Datasource FreeSWITCH -yo.fs.datasource.url=jdbc:mysql://172.18.4.35/freeswitch?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai +yo.fs.datasource.url=jdbc:mysql://172.18.4.35/fs_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai yo.fs.datasource.username=freeswitch yo.fs.datasource.password=RR!h5IpirsnJ @@ -25,6 +25,9 @@ spring.redis.host=172.18.4.35 spring.redis.port=6379 spring.redis.password=123456 +# Tenant +yo.openapi.default-tenant=GOBLIN + # Dubbo ## Dubbo Registry diff --git a/openapi/src/main/resources/spring/spring-yo-openapi.xml b/openapi/src/main/resources/spring/spring-yo-openapi.xml index bb35005e..8c92d0a6 100644 --- a/openapi/src/main/resources/spring/spring-yo-openapi.xml +++ b/openapi/src/main/resources/spring/spring-yo-openapi.xml @@ -20,5 +20,9 @@ + version="${yo.fsagent.dubbo.service.version}" /> + + diff --git a/pom.xml b/pom.xml index ffda5f88..56a2a5bc 100644 --- a/pom.xml +++ b/pom.xml @@ -34,6 +34,7 @@ state cms openapi + campaign diff --git a/state/src/main/java/com/pudonghot/yo/state/YoState.java b/state/src/main/java/com/pudonghot/yo/state/YoState.java index 3dd8ec7d..a012c6ce 100644 --- a/state/src/main/java/com/pudonghot/yo/state/YoState.java +++ b/state/src/main/java/com/pudonghot/yo/state/YoState.java @@ -1,24 +1,14 @@ package com.pudonghot.yo.state; import org.springframework.boot.SpringApplication; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer; /** * @author Donghuang
* Oct 26, 2019 15:56:08 */ @SpringBootApplication -public class YoState implements WebMvcConfigurer { - - @Autowired - private ThreadPoolTaskExecutor executor; - @Value("${yo.openapi.web-async-timeout:50000}") - private Long webAsyncTimeout; +public class YoState { /** * main @@ -28,13 +18,4 @@ public class YoState implements WebMvcConfigurer { public static void main(final String[] args) { SpringApplication.run(YoState.class, args); } - - /** - * {@inheritDoc} - */ - @Override - public void configureAsyncSupport(final AsyncSupportConfigurer configurer) { - configurer.setDefaultTimeout(webAsyncTimeout); - configurer.setTaskExecutor(executor); - } } diff --git a/state/src/main/resources/application-test.properties b/state/src/main/resources/application-test.properties index 6d1092b1..e9f7cfb4 100644 --- a/state/src/main/resources/application-test.properties +++ b/state/src/main/resources/application-test.properties @@ -1,4 +1,4 @@ -# Yo OpenAPI +# Yo State server.port=8085 spring.application.name=yo-state spring.jackson.time-zone=GMT+8 diff --git a/state/src/main/resources/application.properties b/state/src/main/resources/application.properties index 8343ee9f..a0b7d59c 100644 --- a/state/src/main/resources/application.properties +++ b/state/src/main/resources/application.properties @@ -12,7 +12,7 @@ yo.datasource.username=yoqw yo.datasource.password=yoqw_query! # Datasource FreeSWITCH -yo.fs.datasource.url=jdbc:mysql://172.18.4.35/freeswitch?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai +yo.fs.datasource.url=jdbc:mysql://172.18.4.35/fs_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai yo.fs.datasource.username=freeswitch yo.fs.datasource.password=RR!h5IpirsnJ