From 8533faf90411cf609043650c7f99166032f717f8 Mon Sep 17 00:00:00 2001 From: Shaun Chyxion Date: Tue, 16 Nov 2021 01:17:02 +0800 Subject: [PATCH] add batch op --- .../yo/cms/controller/AgentController.java | 29 +++- .../com/pudonghot/yo/cms/form/BatchForm.java | 4 +- .../cms/form/create/CreateBatchFormAgent.java | 42 ++++++ .../yo/cms/service/AgentService.java | 10 ++ .../yo/cms/service/impl/AgentServiceImpl.java | 140 ++++++++++++++++-- web/cms/app/routes/agent/list.js | 2 + web/cms/app/routes/batch-actions.js | 38 +++++ web/cms/app/templates/agent/list.hbs | 27 +++- 8 files changed, 272 insertions(+), 20 deletions(-) create mode 100644 cms/src/main/java/com/pudonghot/yo/cms/form/create/CreateBatchFormAgent.java create mode 100644 web/cms/app/routes/batch-actions.js diff --git a/cms/src/main/java/com/pudonghot/yo/cms/controller/AgentController.java b/cms/src/main/java/com/pudonghot/yo/cms/controller/AgentController.java index dd22fc14..2f3db840 100644 --- a/cms/src/main/java/com/pudonghot/yo/cms/controller/AgentController.java +++ b/cms/src/main/java/com/pudonghot/yo/cms/controller/AgentController.java @@ -1,12 +1,15 @@ package com.pudonghot.yo.cms.controller; import lombok.val; +import javax.validation.Valid; import com.wacai.tigon.form.FormList; import me.chyxion.tigon.mybatis.Search; import com.pudonghot.yo.model.domain.Queue; import com.pudonghot.yo.model.domain.Agent; -import com.wacai.tigon.web.controller.ArgQuery; +import com.pudonghot.yo.cms.form.BatchForm; import com.wacai.tigon.web.annotation.ListApi; +import com.wacai.tigon.web.controller.ArgQuery; +import com.pudonghot.yo.cms.service.AgentService; import org.springframework.stereotype.Controller; import com.pudonghot.yo.model.domain.AgentGroup; import com.wacai.tigon.web.annotation.FilterCol; @@ -18,6 +21,8 @@ import com.pudonghot.yo.cms.annotation.TenantResource; import com.pudonghot.yo.cms.form.create.CreateFormAgent; import com.pudonghot.yo.cms.form.update.UpdateFormAgent; import com.wacai.tigon.web.controller.BaseCrudController; +import org.springframework.web.bind.annotation.PostMapping; +import com.pudonghot.yo.cms.form.create.CreateBatchFormAgent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; @@ -72,10 +77,30 @@ public class AgentController protected void after(final ArgQuery arg) { super.after(arg); val model = arg.getResult(); - final Integer tenantId = getTenantId(); + val tenantId = getTenantId(); model.setAttr("groupsList", agentGroupService.list( new Search(AgentGroup.TENANT_ID, tenantId))); model.setAttr("queuesList", queueService.list( new Search(Queue.TENANT_ID, tenantId))); } + + @PostMapping("/create-batch") + public void createBatch(@Valid CreateBatchFormAgent form) { + ((AgentService) queryService).createBatch(form); + } + + @PostMapping("/enable-batch") + public void enableBatch(@Valid BatchForm form) { + ((AgentService) queryService).enableBatch(form); + } + + @PostMapping("/disable-batch") + public void disableBatch(@Valid BatchForm form) { + ((AgentService) queryService).disableBatch(form); + } + + @PostMapping("/remove-batch") + public void removeBatch(@Valid BatchForm form) { + ((AgentService) queryService).removeBatch(form); + } } diff --git a/cms/src/main/java/com/pudonghot/yo/cms/form/BatchForm.java b/cms/src/main/java/com/pudonghot/yo/cms/form/BatchForm.java index 9f0b6e6c..63607346 100644 --- a/cms/src/main/java/com/pudonghot/yo/cms/form/BatchForm.java +++ b/cms/src/main/java/com/pudonghot/yo/cms/form/BatchForm.java @@ -11,7 +11,7 @@ import javax.validation.constraints.NotEmpty; */ @Setter @Getter -public class BatchForm extends BasicForm { +public class BatchForm extends BasicForm { @NotEmpty - private List ids; + private Integer[] ids; } diff --git a/cms/src/main/java/com/pudonghot/yo/cms/form/create/CreateBatchFormAgent.java b/cms/src/main/java/com/pudonghot/yo/cms/form/create/CreateBatchFormAgent.java new file mode 100644 index 00000000..5fa89f64 --- /dev/null +++ b/cms/src/main/java/com/pudonghot/yo/cms/form/create/CreateBatchFormAgent.java @@ -0,0 +1,42 @@ +package com.pudonghot.yo.cms.form.create; + +import lombok.Getter; +import lombok.Setter; +import com.pudonghot.yo.model.domain.Agent; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.NotBlank; +import com.pudonghot.yo.cms.form.TaggableForm; +import com.wacai.tigon.format.annotation.Trim; +import com.pudonghot.yo.cms.form.BaseCreateForm; +import org.hibernate.validator.constraints.Range; +import com.wacai.tigon.format.annotation.EmptyToNull; + +/** + * @author Donghuang
+ * Nov 02, 2019 12:51:22 + */ +@Getter +@Setter +public class CreateBatchFormAgent extends BaseCreateForm implements TaggableForm { + @NotNull + private Integer groupId; + @NotNull + private Agent.Type type; + private Boolean webrtc; + @Trim + @NotBlank + private String accounts; + @Trim + @EmptyToNull + private String password; + @Range(min = 0, max = 240000) + private Integer wrapUpTime; + @NotNull + private Boolean updateExisted; + @NotNull + private Boolean trunkDialAllowed; + @NotNull + private Boolean internalDialAllowed; + private Integer[] queues; + private Integer[] tags; +} diff --git a/cms/src/main/java/com/pudonghot/yo/cms/service/AgentService.java b/cms/src/main/java/com/pudonghot/yo/cms/service/AgentService.java index d80a673a..7bad8ecb 100644 --- a/cms/src/main/java/com/pudonghot/yo/cms/service/AgentService.java +++ b/cms/src/main/java/com/pudonghot/yo/cms/service/AgentService.java @@ -1,5 +1,7 @@ package com.pudonghot.yo.cms.service; +import com.pudonghot.yo.cms.form.BatchForm; +import com.pudonghot.yo.cms.form.create.CreateBatchFormAgent; import com.pudonghot.yo.cms.form.create.CreateFormAgent; import com.pudonghot.yo.cms.form.update.UpdateFormAgent; import com.pudonghot.yo.model.domain.Agent; @@ -13,6 +15,14 @@ public interface AgentService CreateFormAgent, UpdateFormAgent> { + void createBatch(CreateBatchFormAgent form); + + void enableBatch(BatchForm form); + + void disableBatch(BatchForm form); + + void removeBatch(BatchForm form); + /** * find agent of domain * @param domain domain diff --git a/cms/src/main/java/com/pudonghot/yo/cms/service/impl/AgentServiceImpl.java b/cms/src/main/java/com/pudonghot/yo/cms/service/impl/AgentServiceImpl.java index 019f64b0..07b0c855 100644 --- a/cms/src/main/java/com/pudonghot/yo/cms/service/impl/AgentServiceImpl.java +++ b/cms/src/main/java/com/pudonghot/yo/cms/service/impl/AgentServiceImpl.java @@ -1,21 +1,22 @@ package com.pudonghot.yo.cms.service.impl; import lombok.val; -import java.util.Set; +import java.util.*; import lombok.extern.slf4j.Slf4j; import java.util.stream.Collectors; import me.chyxion.tigon.mybatis.Search; import com.wacai.tigon.model.ViewModel; import org.springframework.util.Assert; +import com.wacai.tigon.json.JsonService; import org.apache.commons.lang3.tuple.Pair; import com.pudonghot.yo.model.domain.Agent; import com.pudonghot.yo.mapper.AgentMapper; +import com.pudonghot.yo.cms.form.BatchForm; import org.apache.commons.lang3.StringUtils; import com.pudonghot.yo.cms.form.SessionForm; import org.springframework.stereotype.Service; import com.pudonghot.yo.mapper.AgentGroupMapper; import com.pudonghot.yo.mapper.QueueAgentMapper; -import com.pudonghot.yo.model.domain.AgentGroup; import com.pudonghot.yo.model.domain.QueueAgent; import com.pudonghot.yo.cms.service.AgentService; import org.apache.commons.lang3.RandomStringUtils; @@ -23,6 +24,7 @@ import com.pudonghot.yo.cms.service.SequenceService; import com.pudonghot.yo.cms.form.create.CreateFormAgent; import com.pudonghot.yo.cms.form.update.UpdateFormAgent; import org.springframework.beans.factory.annotation.Value; +import com.pudonghot.yo.cms.form.create.CreateBatchFormAgent; import org.springframework.beans.factory.annotation.Autowired; /** @@ -48,17 +50,126 @@ public class AgentServiceImpl private AgentGroupMapper agentGroupMapper; @Autowired private QueueAgentMapper queueAgentMapper; + @Autowired + private JsonService jsonService; + + /** + * {@inheritDoc} + */ + @Override + public void createBatch(final CreateBatchFormAgent form) { + log.info("Batch create agents [{}].", form); + val groupId = form.getGroupId(); + + val agentGroup = agentGroupMapper.find(groupId); + Assert.state(agentGroup != null, + () -> "No agent group [" + groupId + "] found"); + Assert.state(agentGroup != null, + () -> "Agent group [" + agentGroup.getName() + "] is not active"); + + val validateResult = batchCreateValidate(form); + + // create agents + for (val createAgent : validateResult.getLeft()) { + create(createAgent); + } + + // update agents + for (val updateAgent : validateResult.getRight()) { + update(updateAgent); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void enableBatch(final BatchForm form) { + log.info("Batch enable agents [{}].", form); + for (val id : form.getIds()) { + val agent = find(id); + Assert.state(agent != null, "No agent [" + id + "] found"); + agent.setActive(true); + update(agent); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void disableBatch(final BatchForm form) { + log.info("Batch disable agents [{}].", form); + for (val id : form.getIds()) { + val agent = find(id); + Assert.state(agent != null, "No agent [" + id + "] found"); + agent.setActive(false); + update(agent); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void removeBatch(final BatchForm form) { + log.info("Batch remove agents [{}].", form); + delete(new Search(form.getIds())); + } + + private Pair, List> batchCreateValidate( + final CreateBatchFormAgent form) { + + val accounts = form.getAccounts().split("\n"); + val agentsCreate = new ArrayList(accounts.length); + val agentsUpdate = new ArrayList(accounts.length); + + + for (val line : accounts) { + if (StringUtils.isNotBlank(line)) { + log.info("Create agent [{}].", line); + val agentData = line.split("\\s\\+"); + Assert.state(agentData.length < 3, () -> "Agent info [" + agentData + "] is not valid"); + + val name = agentData[0]; + val account = agentData.length == 2 ? agentData[1] : agentData[0]; + + Assert.state(account.matches("^[_a-zA-Z]+[_a-zA-z0-9]+$"), + "Agent [" + line + "] account [" + account + "] is not valid"); + + val agentExisted = mapper.find(new Search(Agent.ACCOUNT, account)); + + if (agentExisted != null) { + Assert.state(form.getUpdateExisted(), + () -> "Agent [" + account + "] existed"); + + val formUpdate = jsonService.convert(form, UpdateFormAgent.class); + formUpdate.setId(agentExisted.getId()); + formUpdate.setName(name); + agentsUpdate.add(formUpdate); + continue; + } + + val formCreate = jsonService.convert(form, CreateFormAgent.class); + formCreate.setName(name); + formCreate.setAccount(account); + agentsCreate.add(formCreate); + } + } + + return Pair.of(agentsCreate, agentsUpdate); + } /** * {@inheritDoc} */ @Override public ViewModel create(final CreateFormAgent form) { - final ViewModel vm = super.create(form); - final Agent agent = vm.getData(); - final Integer[] queues = form.getQueues(); + val vm = super.create(form); + val agent = vm.getData(); + val queues = form.getQueues(); if (queues != null) { - for (final Integer queue : queues) { + for (val queue : queues) { insertQueueAgent(agent, queue, form); } } @@ -70,20 +181,19 @@ public class AgentServiceImpl */ @Override public ViewModel update(final UpdateFormAgent form) { - final ViewModel vm = super.update(form); - final Agent agent = vm.getData(); + val vm = super.update(form); + val agent = vm.getData(); - final Integer agentId = agent.getId(); + val agentId = agent.getId(); - final Set queuesExisted = queueAgentMapper.list( + val queuesExisted = queueAgentMapper.list( new Search(QueueAgent.AGENT_ID, agentId)).stream() .map(QueueAgent::getQueueId) .collect(Collectors.toSet()); - final Pair, Set> queuesDiff = - diff(queuesExisted, form.getQueues()); + val queuesDiff = diff(queuesExisted, form.getQueues()); - for (final Integer queueId : queuesDiff.getLeft()) { + for (val queueId : queuesDiff.getLeft()) { insertQueueAgent(agent, queueId, form); } @@ -102,8 +212,8 @@ public class AgentServiceImpl @Override protected void validate(final CreateFormAgent form) { super.validate(form); - final Integer groupId = form.getGroupId(); - final AgentGroup agentGroup = agentGroupMapper.find(groupId); + val groupId = form.getGroupId(); + val agentGroup = agentGroupMapper.find(groupId); Assert.state(agentGroup != null, () -> "No agent group [" + groupId + "] found"); Assert.state(agentGroup.getActive(), () -> "Agent group [" + groupId + "] is inactive"); Assert.state(!mapper.exists( diff --git a/web/cms/app/routes/agent/list.js b/web/cms/app/routes/agent/list.js index ba2d4ca1..45f44faf 100644 --- a/web/cms/app/routes/agent/list.js +++ b/web/cms/app/routes/agent/list.js @@ -1,6 +1,8 @@ import BaseListRoute from '../base-list'; +import batchActions from '../batch-actions'; export default BaseListRoute.extend({ perm: 'PERM_VIEW_AGENT_LIST', breadcrumbs: [{text: '坐席列表'}], + actions: batchActions }); diff --git a/web/cms/app/routes/batch-actions.js b/web/cms/app/routes/batch-actions.js new file mode 100644 index 00000000..41d9d7ca --- /dev/null +++ b/web/cms/app/routes/batch-actions.js @@ -0,0 +1,38 @@ +export default { + enableBatch() { + const me = this; + const ids = me.get('controller.model.data').filter(i => i.checked).map(i => i.id); + ids.length && me.get('dialog').confirm('确认启用选中项吗?', () => { + me.get('service').ajaxPost('enable-batch', { + ids: ids.join(',') + }).then(() => { + me.refresh(); + me.get('message').alert('启用成功'); + }); + }); + }, + disableBatch() { + const me = this; + const ids = me.get('controller.model.data').filter(i => i.checked).map(i => i.id); + ids.length && me.get('dialog').confirm('确认禁用选中项吗?', () => { + me.get('service').ajaxPost('disable-batch', { + ids: ids.join(',') + }).then(() => { + me.refresh(); + me.get('message').alert('禁用成功'); + }); + }); + }, + removeBatch() { + const me = this; + const ids = me.get('controller.model.data').filter(i => i.checked).map(i => i.id); + ids.length && me.get('dialog').confirm('确认删除选中项吗?', () => { + me.get('service').ajaxPost('remove-batch', { + ids: ids.join(',') + }).then(() => { + me.refresh(); + me.get('message').alert('删除成功'); + }); + }); + } +} \ No newline at end of file diff --git a/web/cms/app/templates/agent/list.hbs b/web/cms/app/templates/agent/list.hbs index 6eae89ed..b6cbbca1 100644 --- a/web/cms/app/templates/agent/list.hbs +++ b/web/cms/app/templates/agent/list.hbs @@ -1,5 +1,18 @@
- {{#grid-header}} + {{#grid-header button=true as |sec|}} + {{#if (and sec.button model.checked)}} + {{#a-btn click=(route-action 'enableBatch') title='启用'}} + + {{/a-btn}} + {{#a-btn click=(route-action 'disableBatch') title='禁用'}} + + {{/a-btn}} + {{#a-btn click=(route-action 'removeBatch') title='删除'}} + + {{/a-btn}} + {{/if}} + + {{#if sec.dropdown}} {{#has-perm 'PERM_VIEW_AGENT_CREATE'}}
  • {{#link-to 'agent.create'}} @@ -8,6 +21,7 @@ {{/link-to}}
  • {{/has-perm}} + {{/if}} {{/grid-header}}
    @@ -16,6 +30,12 @@ + {{!#if agentGroupFiltered}} + + {{!/if}} @@ -111,6 +131,11 @@ {{#each model.data as |it|}} + {{!#if agentGroupFiltered}} + + {{!/if}}
    + {{grid-all-checkbox list=model.data + any-checked=(mut model.checked)}} + 名称
    + {{grid-row-checkbox checked=(mut it.checked)}} + {{it.name}}