add campaign service

This commit is contained in:
东皇大叔 2020-07-24 17:34:22 +08:00
parent dfb96334f2
commit b768f40022
9 changed files with 216 additions and 15 deletions

View File

@ -1,5 +1,5 @@
# Yo Campaign
server.port=8085
server.port=8086
spring.application.name=yo-campaign
spring.jackson.time-zone=GMT+8
spring.jackson.serialization.write-dates-as-timestamps=true
@ -24,3 +24,13 @@ yo.fs.datasource.password=RR!h5IpirsnJ
spring.redis.host=localhost
spring.redis.port=6379
# spring.redis.password=123456
# Dubbo
dubbo.registry.address=zookeeper://localhost:2181
dubbo.registry.file=${user.home}/dubbo-cache/${spring.application.name}/dubbo.cache
yo.fsagent.dubbo.service.version=1.0.0
# Calling List
yo.campaign.feign.calling-list.base-url=http://localhost:1116
yo.campaign.feign.calling-list.channel=campaign.json

View File

@ -31,7 +31,7 @@
</dependency>
<dependency>
<groupId>com.pudonghot.yo</groupId>
<artifactId>yo-openapi-dto</artifactId>
<artifactId>yo-service-common</artifactId>
</dependency>
<dependency>
<groupId>com.pudonghot.yo</groupId>

View File

@ -1,10 +1,10 @@
package com.pudonghot.yo.cms.controller;
import java.util.Arrays;
import org.apache.shiro.util.Assert;
import com.wacai.tigon.form.FormList;
import com.wacai.tigon.mybatis.Search;
import com.wacai.tigon.model.ViewModel;
import org.springframework.util.Assert;
import com.pudonghot.yo.model.DailyTime;
import com.pudonghot.yo.model.domain.Tag;
import com.pudonghot.yo.model.domain.Queue;
@ -18,7 +18,7 @@ import com.wacai.tigon.web.annotation.FilterCol;
import com.pudonghot.yo.cms.annotation.Taggable;
import org.springframework.stereotype.Controller;
import com.pudonghot.yo.model.domain.TrunkStrategy;
import com.pudonghot.yo.cms.service.CampaignService;
import com.pudonghot.yo.service.CommonCampaignService;
import com.pudonghot.yo.cms.annotation.TenantResource;
import com.wacai.tigon.web.controller.BaseCrudController;
import com.pudonghot.yo.cms.service.TrunkStrategyService;
@ -60,19 +60,21 @@ public class CampaignController
private TagService tagService;
@Autowired
private QueueService queueService;
@Autowired
private CommonCampaignService commonCampaignService;
@RequestMapping("/start")
public void start(
@RequestParam("id")
final Integer id) {
activity(id, Campaign.Status.RUNNING);
updateStatus(id, Campaign.Status.RUNNING);
}
@RequestMapping("/stop")
public void stop(
@RequestParam("id")
final Integer id) {
activity(id, Campaign.Status.STOPPED);
updateStatus(id, Campaign.Status.STOPPED);
}
@RequestMapping("/create-data")
@ -95,12 +97,13 @@ public class CampaignController
return argQuery.getResult();
}
private void activity(final Integer id, final Campaign.Status status) {
final CampaignService campaignService = ((CampaignService) crudService);
final Campaign campaign = campaignService.find(new Search(id).eq(Campaign.ACTIVE, true));
Assert.state(campaign != null, "无效的外呼活动");
campaign.setStatus(status);
campaignService.update(campaign);
private void updateStatus(final Integer id, final Campaign.Status status) {
final Campaign campaign = crudService.find(id);
Assert.state(campaign != null,
() -> "Campaign [" + id + "] not found");
Assert.state(campaign.getActive(),
() -> "Campaign [" + id + "] is not active");
commonCampaignService.updateStatus(campaign, status);
}
/**

View File

@ -0,0 +1,47 @@
package com.pudonghot.yo.service;
import com.pudonghot.yo.model.domain.Agent;
import com.pudonghot.yo.model.domain.Campaign;
/**
* @author Donghuang
* @date Jul 24, 2020 16:04:44
*/
public interface CommonCampaignService {
/**
* agent enqueue
*
* @param campaignKey campaign key
* @param agent agent
*/
void enqueue(String campaignKey, Agent agent);
/**
* agent dequeue
* @param agent agent
*/
void dequeue(Agent agent);
/**
* start campaign
*
* @param campaignKey campaign key
*/
void start(String campaignKey);
/**
* start campaign
*
* @param campaignKey campaign key
*/
void stop(String campaignKey);
/**
* update campaign status
*
* @param campaign campaign
* @param status status
*/
void updateStatus(final Campaign campaign, final Campaign.Status status);
}

View File

@ -0,0 +1,121 @@
package com.pudonghot.yo.service.impl;
import lombok.extern.slf4j.Slf4j;
import com.wacai.tigon.mybatis.Search;
import org.springframework.util.Assert;
import com.pudonghot.yo.mapper.QueueMapper;
import com.pudonghot.yo.model.domain.Agent;
import com.pudonghot.yo.model.domain.Queue;
import com.pudonghot.yo.mapper.CampaignMapper;
import com.pudonghot.yo.model.domain.Campaign;
import com.pudonghot.yo.mapper.QueueAgentMapper;
import com.pudonghot.yo.model.domain.QueueAgent;
import com.pudonghot.yo.service.CommonCallDataService;
import com.pudonghot.yo.service.CommonCampaignService;
import com.wacai.tigon.service.support.BaseServiceSupport;
import org.springframework.beans.factory.annotation.Autowired;
/**
* @author Donghuang
* @date Jul 24, 2020 16:05:56
*/
@Slf4j
public class CommonCampaignServiceImpl
extends BaseServiceSupport<Integer, Campaign, CampaignMapper>
implements CommonCampaignService {
@Autowired
private CommonCallDataService commonCallDataService;
@Autowired
private QueueMapper queueMapper;
@Autowired
private QueueAgentMapper queueAgentMapper;
/**
* {@inheritDoc}
*/
@Override
public void enqueue(final String campaignKey, final Agent agent) {
log.info("Agent [{}] enqueue campaign [{}].", agent, campaignKey);
final Campaign campaign = findValid(campaignKey);
final Integer queueId = campaign.getTargetId();
final Queue queue = queueMapper.find(queueId);
Assert.state(queue != null,
() -> "Campaign [" + campaignKey + "] queue not found");
Assert.state(queue.getActive(),
() -> "Campaign [" + campaignKey + "] queue is not active");
final Integer agentId = agent.getId();
final QueueAgent queueAgentExisted =
queueAgentMapper.find(
new Search(QueueAgent.QUEUE_ID, queueId)
.eq(QueueAgent.AGENT_ID, agentId));
if (queueAgentExisted != null) {
log.warn("Agent [{}] exists in queue [{}], ignore enqueue.",
agentId, queueId);
return;
}
final QueueAgent queueAgent = new QueueAgent();
queueAgent.setTenantId(agent.getTenantId());
queueAgent.setTenantCode(agent.getTenantCode());
queueAgent.setQueueId(queueId);
queueAgent.setAgentId(agentId);
queueAgent.setAgent(agent.getAgent());
queueAgent.setAccount(agent.getAccount());
queueAgent.setCreatedBy(agent.getAccount());
queueAgentMapper.insert(queueAgent);
}
/**
* {@inheritDoc}
*/
@Override
public void dequeue(final Agent agent) {
log.info("Agent [{}] dequeue.", agent);
queueAgentMapper.delete(new Search(QueueAgent.AGENT_ID, agent.getId()));
}
/**
* {@inheritDoc}
*/
@Override
public void start(final String campaignKey) {
updateStatus(findValid(campaignKey), Campaign.Status.RUNNING);
}
/**
* {@inheritDoc}
*/
@Override
public void stop(final String campaignKey) {
updateStatus(findValid(campaignKey), Campaign.Status.STOPPED);
}
/**
* {@inheritDoc}
*/
@Override
public void updateStatus(final Campaign campaign, final Campaign.Status status) {
log.info("Update campaign [{}] status [{}].", campaign, status);
campaign.setStatus(status);
mapper.update(campaign);
resetData(campaign);
}
private Campaign findValid(final String campaignKey) {
final Campaign campaign =
mapper.find(new Search(Campaign.CAMPAIGN_KEY, campaignKey));
Assert.state(campaign != null,
() -> "No campaign [" + campaignKey + "] found");
Assert.state(campaign.getActive(),
() -> "Campaign [" + campaignKey + "] is not active");
return campaign;
}
private void resetData(final Campaign campaign) {
final Integer campaignId = campaign.getId();
commonCallDataService.resetCampaignDailyDialed(campaignId);
commonCallDataService.resetCampaignDailyEstablished(campaignId);
}
}

View File

@ -9,4 +9,5 @@
<bean class="com.pudonghot.yo.service.impl.CommonAgentEventQueueServiceImpl" />
<bean class="com.pudonghot.yo.service.impl.CommonChannelServiceImpl" />
<bean class="com.pudonghot.yo.service.impl.CommonCallDataServiceImpl" />
<bean class="com.pudonghot.yo.service.impl.CommonCampaignServiceImpl" />
</beans>

View File

@ -5,6 +5,7 @@ import com.pudonghot.yo.model.domain.Agent;
import org.springframework.stereotype.Controller;
import com.pudonghot.yo.openapi.auth.SessionAbility;
import com.pudonghot.yo.openapi.service.AgentService;
import com.pudonghot.yo.service.CommonCampaignService;
import com.pudonghot.yo.openapi.response.RespAgentReady;
import com.pudonghot.yo.service.CommonAgentStatusService;
import com.pudonghot.yo.openapi.service.AgentEventService;
@ -27,6 +28,8 @@ public class AgentStatusController implements SessionAbility {
private CommonAgentStatusService agentStatusService;
@Autowired
private AgentEventService agentEventService;
@Autowired
private CommonCampaignService commonCampaignService;
@RequestMapping({"/", "/forcelogin"})
public RespAgentReady signIn(
@ -44,6 +47,7 @@ public class AgentStatusController implements SessionAbility {
final String account) {
final Agent agent = agentService.findValid(getTenantId(), account);
agentStatusService.offline(agent);
commonCampaignService.dequeue(agent);
agentEventService.publish(agent, AgentOther_ShutdownService);
}

View File

@ -7,6 +7,7 @@ import org.springframework.stereotype.Controller;
import com.pudonghot.yo.openapi.request.ReqCampaign;
import com.pudonghot.yo.openapi.auth.SessionAbility;
import com.pudonghot.yo.openapi.service.AgentService;
import com.pudonghot.yo.service.CommonCampaignService;
import com.pudonghot.yo.service.CommonAgentStatusService;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@ -24,6 +25,8 @@ public class CampaignController implements SessionAbility {
private AgentService agentService;
@Autowired
private CommonAgentStatusService agentStatusService;
@Autowired
private CommonCampaignService commonCampaignService;
@RequestMapping("/resource/task/{account}")
public void addToQueue(
@ -33,16 +36,18 @@ public class CampaignController implements SessionAbility {
final Agent agent = agentService.findValid(
form.getTenantId(), account);
agentStatusService.findValidAgentStatus(agent);
// TODO Add agent to queue
commonCampaignService.enqueue(form.getCampaignKey(), agent);
}
@RequestMapping("/resource/task/start")
public void start(@Valid final ReqCampaign form) {
// TODO start campaign
log.info("Start campaign [{}].", form);
commonCampaignService.start(form.getCampaignKey());
}
@RequestMapping("/resource/task/stop")
public void stop(@Valid final ReqCampaign form) {
// TODO stop campaign
log.info("Stop campaign [{}].", form);
commonCampaignService.stop(form.getCampaignKey());
}
}

View File

@ -17,10 +17,20 @@ public class ReqCampaign extends BaseForm {
private String campaignKey;
private String campaignName;
/**
* param name alias
*
* @param taskId
*/
public void setTaskid(final String taskId) {
this.campaignKey = taskId;
}
/**
* param name alis
*
* @param taskName
*/
public void setTaskname(final String taskName) {
this.campaignName = taskName;
}