From 1e102b6bada8f096f897596abb40b6246069d67c Mon Sep 17 00:00:00 2001 From: Shaun Chyxion Date: Mon, 6 Sep 2021 00:36:08 +0800 Subject: [PATCH] add PERM_VIEW_AGENT_DAILY_IDLE_DETAIL_LIST --- .../AgentDailyIdleDetailController.java | 44 +++++++++- .../AgentDailyIdleDetailListCtrlrReq.java | 29 +++++++ .../converter/StringToDateTypeConverter.java | 27 +++++-- web/cms/app/nav-items.js | 6 ++ web/cms/app/router.js | 4 + .../routes/agent-daily-idle-detail/list.js | 52 ++++++++++++ .../agent-daily-idle-detail/service.js | 5 ++ .../agent-daily-idle-detail/list.hbs | 81 +++++++++++++++++++ .../agent-daily-idle-detail/list-test.js | 11 +++ .../agent-daily-idle-detail/service-test.js | 12 +++ 10 files changed, 263 insertions(+), 8 deletions(-) create mode 100644 cms/src/main/java/com/pudonghot/yo/cms/form/AgentDailyIdleDetailListCtrlrReq.java create mode 100644 web/cms/app/routes/agent-daily-idle-detail/list.js create mode 100644 web/cms/app/services/agent-daily-idle-detail/service.js create mode 100644 web/cms/app/templates/agent-daily-idle-detail/list.hbs create mode 100644 web/cms/tests/unit/routes/agent-daily-idle-detail/list-test.js create mode 100644 web/cms/tests/unit/services/agent-daily-idle-detail/service-test.js diff --git a/cms/src/main/java/com/pudonghot/yo/cms/controller/AgentDailyIdleDetailController.java b/cms/src/main/java/com/pudonghot/yo/cms/controller/AgentDailyIdleDetailController.java index ae78fe05..37be8e8e 100644 --- a/cms/src/main/java/com/pudonghot/yo/cms/controller/AgentDailyIdleDetailController.java +++ b/cms/src/main/java/com/pudonghot/yo/cms/controller/AgentDailyIdleDetailController.java @@ -1,19 +1,57 @@ package com.pudonghot.yo.cms.controller; -import com.wacai.tigon.form.FormList; +import lombok.val; +import org.apache.commons.lang3.StringUtils; +import com.wacai.tigon.web.annotation.ListApi; +import com.wacai.tigon.web.annotation.OrderCol; +import com.wacai.tigon.web.controller.ArgQuery; +import com.wacai.tigon.web.annotation.FilterCol; import org.springframework.stereotype.Controller; +import org.apache.commons.lang3.time.DateFormatUtils; +import com.pudonghot.yo.cms.annotation.TenantResource; import com.pudonghot.yo.model.domain.AgentDailyIdleDetail; import com.wacai.tigon.web.controller.BaseQueryController; import org.springframework.web.bind.annotation.RequestMapping; +import com.pudonghot.yo.cms.form.AgentDailyIdleDetailListCtrlrReq; /** * @author Donghuang * @date Sep 01, 2021 17:39:45 */ @Controller -@RequestMapping("/agent-daily-idle-detail") +@TenantResource +@ListApi(searchCols = { + AgentDailyIdleDetail.ACCOUNT +}, +filterCols = { + @FilterCol(param = AgentDailyIdleDetail.ACCOUNT, type = String.class), +}, +orderCols = { + @OrderCol(AgentDailyIdleDetail.IDLE_START_TIME), + @OrderCol(AgentDailyIdleDetail.DURATION) +}) +@RequestMapping("/cms/api/agent-daily-idle-detail") public class AgentDailyIdleDetailController extends BaseQueryController { + AgentDailyIdleDetailListCtrlrReq> { + + /** + * {@inheritDoc} + */ + @Override + protected void before(final ArgQuery arg) { + if (arg.getType() == ArgQuery.Type.LIST) { + val req = (AgentDailyIdleDetailListCtrlrReq) arg.getArg(); + val search = arg.getSearch() + .eq(AgentDailyIdleDetail.DATE, + DateFormatUtils.format(req.getDate(), "yyyy-MM-dd")); + + // connId only + val account = req.getAccount(); + if (StringUtils.isNotBlank(account)) { + search.eq(AgentDailyIdleDetail.ACCOUNT, account); + } + } + } } \ No newline at end of file diff --git a/cms/src/main/java/com/pudonghot/yo/cms/form/AgentDailyIdleDetailListCtrlrReq.java b/cms/src/main/java/com/pudonghot/yo/cms/form/AgentDailyIdleDetailListCtrlrReq.java new file mode 100644 index 00000000..e245ab88 --- /dev/null +++ b/cms/src/main/java/com/pudonghot/yo/cms/form/AgentDailyIdleDetailListCtrlrReq.java @@ -0,0 +1,29 @@ +package com.pudonghot.yo.cms.form; + +import lombok.Getter; +import lombok.Setter; +import java.util.Date; +import com.wacai.tigon.form.FormList; +import javax.validation.constraints.NotNull; +import com.wacai.tigon.format.annotation.Trim; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.wacai.tigon.format.annotation.EmptyToNull; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * @author Donghuang + * @date Sep 05, 2021 23:03:01 + */ +@Getter +@Setter +public class AgentDailyIdleDetailListCtrlrReq extends FormList { + @NotNull + @JsonFormat(shape = JsonFormat.Shape.STRING, + pattern = "yyyy-MM-dd", + timezone = "Asia/Shanghai") + @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) + private Date date; + @Trim + @EmptyToNull + private String account; +} diff --git a/lib/tigon/web/src/main/java/com/wacai/tigon/web/converter/StringToDateTypeConverter.java b/lib/tigon/web/src/main/java/com/wacai/tigon/web/converter/StringToDateTypeConverter.java index 87304699..2ca72307 100644 --- a/lib/tigon/web/src/main/java/com/wacai/tigon/web/converter/StringToDateTypeConverter.java +++ b/lib/tigon/web/src/main/java/com/wacai/tigon/web/converter/StringToDateTypeConverter.java @@ -1,8 +1,10 @@ package com.wacai.tigon.web.converter; import java.util.Date; +import java.text.ParseException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateUtils; import org.springframework.core.convert.converter.Converter; /** @@ -20,13 +22,28 @@ public class StringToDateTypeConverter @Override public Date convert(final String text) { log.debug("Convert [{}] to date.", text); - try { - return StringUtils.isNotBlank(text) ? - new Date(Long.parseLong(text.trim())) : null; + + if (StringUtils.isBlank(text)) { + return null; } - catch (NumberFormatException e) { + + if (StringUtils.isNumeric(text)) { + try { + return StringUtils.isNotBlank(text) ? + new Date(Long.parseLong(text.trim())) : null; + } + catch (NumberFormatException e) { + throw new IllegalArgumentException( + "Invalid date [" + text + "]", e); + } + } + + try { + return DateUtils.parseDate(text, "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd"); + } + catch (ParseException e) { throw new IllegalArgumentException( - "Invalid date [" + text + "]", e); + "Invalid date [" + text + "]", e); } } } diff --git a/web/cms/app/nav-items.js b/web/cms/app/nav-items.js index 3eb943d7..92d4aad4 100644 --- a/web/cms/app/nav-items.js +++ b/web/cms/app/nav-items.js @@ -80,6 +80,12 @@ export default (function() { route: 'agent-status.list', icon: 'fa-comments', text: '坐席状态管理' + }, + { + perm: 'PERM_VIEW_AGENT_DAILY_IDLE_DETAIL_LIST', + route: 'agent-daily-idle-detail.list', + icon: 'fa-ship', + text: '坐席日空闲管理' } ] }, { diff --git a/web/cms/app/router.js b/web/cms/app/router.js index 365e7c7c..0a14d792 100644 --- a/web/cms/app/router.js +++ b/web/cms/app/router.js @@ -158,6 +158,10 @@ Router.map(function() { this.route('call-satisfaction', function() { this.route('list'); }); + + this.route('agent-daily-idle-detail', function() { + this.route('list'); + }); }); export default Router; diff --git a/web/cms/app/routes/agent-daily-idle-detail/list.js b/web/cms/app/routes/agent-daily-idle-detail/list.js new file mode 100644 index 00000000..4d5b17c7 --- /dev/null +++ b/web/cms/app/routes/agent-daily-idle-detail/list.js @@ -0,0 +1,52 @@ +import BaseListRoute from '../base-list'; + +export default BaseListRoute.extend({ + perm: 'PERM_VIEW_AGENT_DAILY_IDLE_DETAIL_LIST', + breadcrumbs: [{text: '坐席日空闲列表'}], + queryParams: { + page: { + refreshModel: true + }, + date: { + refreshModel: false + }, + account: { + refreshModel: false + } + }, + model(params) { + const me = this; + let page = params.page; + if (!Number.isInteger(page)) { + page = parseInt(page); + } + if (page < 1) { + page = 1; + } + + if (!params.date) { + params.date = moment(new Date()).format('YYYY-MM-DD'); + } + + return me.get('service').listPage(page, params); + }, + setupController(controller) { + const me = this; + me._super(...arguments); + + if (!controller.get('date')) { + controller.set('date', moment(new Date()).format('YYYY-MM-DD')); + } + }, + actions: { + search() { + let me = this; + if (me.get('controller.page') == 1) { + me.refresh(); + } + else { + me.set('controller.page', 1); + } + } + } +}); \ No newline at end of file diff --git a/web/cms/app/services/agent-daily-idle-detail/service.js b/web/cms/app/services/agent-daily-idle-detail/service.js new file mode 100644 index 00000000..dc69100d --- /dev/null +++ b/web/cms/app/services/agent-daily-idle-detail/service.js @@ -0,0 +1,5 @@ +import Service from '../service'; + +export default Service.extend({ + modelName: 'AgentDailyIdleDetail' +}); diff --git a/web/cms/app/templates/agent-daily-idle-detail/list.hbs b/web/cms/app/templates/agent-daily-idle-detail/list.hbs new file mode 100644 index 00000000..29088463 --- /dev/null +++ b/web/cms/app/templates/agent-daily-idle-detail/list.hbs @@ -0,0 +1,81 @@ +
+
+
+
+ {{form-input-datepicker + class='col-sm-5 col-md-5' + label-class='col-sm-3 col-md-3' + input-class='col-sm-9 col-md-9' + error-msg=false + model=this + name='date' + label='日期'}} + + {{form-input + class='col-sm-5 col-md-5' + label-class='col-sm-3 col-md-3' + input-class='col-sm-9 col-md-9' + error-msg=false + model=this + name='account' + label='坐席账户'}} +
+ +
+
+
+
+ +
+
+
+ +
+ +
+ +
+ + + + + + {{#sortable-th name='idleStartTime'}} + 开始时间 + {{/sortable-th}} + {{#sortable-th name='duration'}} + 空闲时长 + {{/sortable-th}} + + + + {{#each model.data as |it|}} + + + + + + + {{/each}} + +
+ 日期 + + 坐席 +
+ {{date-cell value=it.date format='YYYY-MM-DD'}} + + {{it.account}} + + {{date-cell value=it.idleStartTime}} + + {{readable-duration it.duration}} +
+
+ {{pagination-bar}} +
+
+{{outlet}} diff --git a/web/cms/tests/unit/routes/agent-daily-idle-detail/list-test.js b/web/cms/tests/unit/routes/agent-daily-idle-detail/list-test.js new file mode 100644 index 00000000..b68c4dd6 --- /dev/null +++ b/web/cms/tests/unit/routes/agent-daily-idle-detail/list-test.js @@ -0,0 +1,11 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Route | agent-daily-idle-detail/list', function(hooks) { + setupTest(hooks); + + test('it exists', function(assert) { + let route = this.owner.lookup('route:agent-daily-idle-detail/list'); + assert.ok(route); + }); +}); diff --git a/web/cms/tests/unit/services/agent-daily-idle-detail/service-test.js b/web/cms/tests/unit/services/agent-daily-idle-detail/service-test.js new file mode 100644 index 00000000..3d2acf45 --- /dev/null +++ b/web/cms/tests/unit/services/agent-daily-idle-detail/service-test.js @@ -0,0 +1,12 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Service | agent-daily-idle-detail/service', function(hooks) { + setupTest(hooks); + + // Replace this with your real tests. + test('it exists', function(assert) { + let service = this.owner.lookup('service:agent-daily-idle-detail/service'); + assert.ok(service); + }); +});