From de4f9f5860cbe232b63d13ee082e02dce83ca3b5 Mon Sep 17 00:00:00 2001 From: chenshaohua <635616957@qq.com> Date: Thu, 23 Jul 2026 17:23:09 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E4=BC=81=E4=B8=9A=E5=92=8C=E5=B2=97=E4=BD=8D=E8=81=94=E7=B3=BB?= =?UTF-8?q?=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/cms/CompanyContactController.java | 14 ++++++++++++++ .../cms/controller/cms/JobContactController.java | 13 +++++++++++++ .../ruoyi/cms/service/CompanyContactService.java | 2 ++ .../com/ruoyi/cms/service/JobContactService.java | 2 ++ .../service/impl/CompanyContactServiceImpl.java | 6 ++++++ .../cms/service/impl/JobContactServiceImpl.java | 7 +++++++ 6 files changed, 44 insertions(+) diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CompanyContactController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CompanyContactController.java index 2ceced7..d6170dd 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CompanyContactController.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CompanyContactController.java @@ -2,11 +2,14 @@ package com.ruoyi.cms.controller.cms; import com.ruoyi.cms.service.ICompanyService; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.Company; import com.ruoyi.common.core.domain.entity.CompanyContact; import com.ruoyi.cms.service.CompanyContactService; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import io.swagger.annotations.Api; @@ -59,4 +62,15 @@ public class CompanyContactController extends BaseController { List list=companyContactService.getSelectList(companyContact); return getDataTable(list); } + + /** + * 批量删除 + */ + @ApiOperation("批量删除") + @PreAuthorize("@ss.hasPermi('cms:companycontact:remove')") + @Log(title = "企业联系人", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(companyContactService.deleteByIds(ids)); + } } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/JobContactController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/JobContactController.java index 9b419f3..641d9f0 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/JobContactController.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/JobContactController.java @@ -2,8 +2,11 @@ package com.ruoyi.cms.controller.cms; import com.ruoyi.cms.domain.JobContact; import com.ruoyi.cms.service.JobContactService; +import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; @@ -40,4 +43,14 @@ public class JobContactController extends BaseController { return getDataTable(list); } + /** + * 批量删除 + */ + @ApiOperation("批量删除") + @PreAuthorize("@ss.hasPermi('cms:jobcontact:remove')") + @Log(title = "岗位联系人", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(jobContactService.deleteByIds(ids)); + } } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/CompanyContactService.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/CompanyContactService.java index bcb86d5..03d03bd 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/CompanyContactService.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/CompanyContactService.java @@ -18,5 +18,7 @@ public interface CompanyContactService { int insertUpadteCompanyContact(List list); int insertContact(CompanyContact contact); + + int deleteByIds(Long[] ids); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/JobContactService.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/JobContactService.java index 2547f5b..848b7ec 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/JobContactService.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/JobContactService.java @@ -14,5 +14,7 @@ import java.util.List; public interface JobContactService{ List getSelectList(JobContact jobContact); + + public int deleteByIds(Long[] ids); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CompanyContactServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CompanyContactServiceImpl.java index fc40dbe..c36eae0 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CompanyContactServiceImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CompanyContactServiceImpl.java @@ -6,6 +6,7 @@ import com.ruoyi.cms.service.CompanyContactService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -44,4 +45,9 @@ public class CompanyContactServiceImpl extends ServiceImpl getSelectList(JobContact jobContact){ return jobContactMapper.getSelectList(jobContact); } + + @Override + public int deleteByIds(Long[] ids) { + return jobContactMapper.deleteBatchIds(Arrays.asList(ids)); + } } From be6a7b83946b383202782c708db94c5f39298f95 Mon Sep 17 00:00:00 2001 From: lapuda <577732344@qq.com> Date: Thu, 23 Jul 2026 18:13:30 +0800 Subject: [PATCH 2/2] feat: add recruitment fair statistics API --- ...recruitment-fair-statistics-proposals.html | 473 ++++++++++++++++++ .../cms/FairStatisticsController.java | 148 ++++++ .../cms/domain/vo/FairStatisticsFairItem.java | 100 ++++ .../cms/mapper/FairStatisticsMapper.java | 23 + .../mapper/app/FairStatisticsMapper.xml | 147 ++++++ .../cms/FairStatisticsControllerTest.java | 116 +++++ 6 files changed, 1007 insertions(+) create mode 100644 docs/recruitment-fair-statistics-proposals.html create mode 100644 ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/FairStatisticsController.java create mode 100644 ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/FairStatisticsFairItem.java create mode 100644 ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/FairStatisticsMapper.java create mode 100644 ruoyi-bussiness/src/main/resources/mapper/app/FairStatisticsMapper.xml create mode 100644 ruoyi-bussiness/src/test/java/com/ruoyi/cms/controller/cms/FairStatisticsControllerTest.java diff --git a/docs/recruitment-fair-statistics-proposals.html b/docs/recruitment-fair-statistics-proposals.html new file mode 100644 index 0000000..3f7b2b7 --- /dev/null +++ b/docs/recruitment-fair-statistics-proposals.html @@ -0,0 +1,473 @@ + + + + + + 招聘会数据统计 · 三套界面方案 + + + +
+ + + + +
+
+
+
方案一 / 标准清晰
+

标准后台统计页

+

筛选区、指标卡、明细区层次分明,最贴近常规管理后台的使用习惯。

+
+
+
+
+
招聘会数据统计
+
+ + +
+
+
+ 统计范围 + 单场招聘会 + 2026 年春风行动线上招聘会 + 查询 +
+
也可切换为 按起始时间统计,选择起始日期与结束日期后汇总多场招聘会。
+
+
+
参会单位数
128
+
职位数
356
+
需求人数
1,024
+
投递岗位数
687
+
签到数
932人次
+
+
+
+
本次统计涉及招聘会查看列表
+
+
2026 年春风行动户外线上招聘会128 家 / 356 职位
+
起始时间2026-03-07
+
投递最热岗位行政专员 · 54 次
+
签到高峰时段10:00–11:00 · 328 人次
+
+
+
+
+
+

适合:快速上线、表单操作优先

+ +
+
+ +
+
+
方案二 / 数据工作台
+

侧栏式数据工作台

+

把“统计范围”作为核心入口,兼顾当场查看与时间段分析。

+
+
+
+ +
+
招聘会数据统计
数据更新时间 10:30
+
+
+ + +
+ 招聘会名称 + 统计方式 +
统计单场按起始时间段
+ 2026-03-01 至 2026-03-31 +
+
+
+
参会单位
128
+
职位数
356
+
需求人数
1,024
+
投递岗位
687
+
签到数
932人次
+
+
+
+
投递岗位趋势现场签到趋势按日查看
+
+ +
+
03/0103/0703/1403/2103/31
+
+
+
招聘会数据排行更多
+
+
1春风行动专场154 次投递246 人签到
+
2民营企业专场122 次投递211 人签到
+
+
+
+
+
+
+

适合:后续扩展趋势、排行分析

+ +
+
+ +
+
+
方案三 / 概览看板
+

轻量概览看板

+

将范围、类型和核心结果集中在首屏,更适合高频查数和汇报浏览。

+
+
+
+
+
招聘会数据统计
+
+ + +
+
+
+ 统计单场 + 选择招聘会 +
+
+
当前统计范围2026 年春风行动线上户外招聘会
+ 起始 2026-03-07 +
+
+
+
参会单位数
128
+
职位数
356
+
需求人数
1,024
+
投递岗位数
687
+
签到数
932人次
+
+
+
i本场招聘会共有 356 个岗位获得投递,其中 687 个岗位投递记录已去重汇总。
+
i户外招聘会不提供报名投递简历,现场到场数据以签到记录累计为准。
+
+
统计说明自动汇总
+
+
单位与职位按有效参会单位及岗位统计
+
需求人数“若干”按 1 人计算
+
投递岗位数按投递岗位汇总
+
签到数按现场签到累计
+
+
+
+
+
+

适合:领导查数、手机端兼容

+ +
+
+
+
+ + + + diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/FairStatisticsController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/FairStatisticsController.java new file mode 100644 index 0000000..fd11e0e --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/FairStatisticsController.java @@ -0,0 +1,148 @@ +package com.ruoyi.cms.controller.cms; + +import com.ruoyi.cms.domain.vo.FairStatisticsFairItem; +import com.ruoyi.cms.mapper.FairStatisticsMapper; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.StringUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * 后台招聘会数据统计。 + */ +@RestController +@RequestMapping("/cms/fair-statistics") +@Api(tags = "后台:招聘会数据统计") +public class FairStatisticsController extends BaseController +{ + private static final String ONLINE = "online"; + + private static final String OUTDOOR = "outdoor"; + + @Autowired + private FairStatisticsMapper fairStatisticsMapper; + + /** + * 按单场招聘会或按招聘会起始时间范围统计。 + * + * @param fairType 招聘会类型:online(线上)或 outdoor(户外) + * @param fairId 单场招聘会 ID;传该参数时不接受时间范围 + * @param startDate 按时间统计的起始日期(含当天) + * @param endDate 按时间统计的结束日期(含当天) + */ + @ApiOperation("招聘会数据汇总统计") + @PreAuthorize("@ss.hasAnyPermi('cms:publicJobFair:list,cms:outdoorFair:list')") + @GetMapping("/summary") + public AjaxResult summary(@RequestParam String fairType, + @RequestParam(required = false) String fairId, + @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate, + @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate) + { + String normalizedType = fairType == null ? "" : fairType.trim().toLowerCase(); + if (!ONLINE.equals(normalizedType) && !OUTDOOR.equals(normalizedType)) + { + return AjaxResult.error("招聘会类型仅支持线上招聘会或户外招聘会"); + } + + boolean hasFairId = StringUtils.isNotEmpty(fairId); + boolean hasStartDate = startDate != null; + boolean hasEndDate = endDate != null; + if (hasFairId && (hasStartDate || hasEndDate)) + { + return AjaxResult.error("单场统计与时间范围统计不能同时使用"); + } + if (!hasFairId && (!hasStartDate || !hasEndDate)) + { + return AjaxResult.error("请选择一场招聘会,或完整选择起始日期和结束日期"); + } + + Date rangeStart = null; + Date rangeEnd = null; + if (!hasFairId) + { + LocalDate start = toLocalDate(startDate); + LocalDate end = toLocalDate(endDate); + if (end.isBefore(start)) + { + return AjaxResult.error("结束日期不能早于起始日期"); + } + rangeStart = toStartOfDay(start); + // SQL 使用左闭右开区间,确保结束日期当天的招聘会被计入。 + rangeEnd = toStartOfDay(end.plusDays(1)); + } + + List fairs; + if (ONLINE.equals(normalizedType)) + { + fairs = fairStatisticsMapper.selectOnlineFairStatistics(fairId, rangeStart, rangeEnd); + } + else + { + Long outdoorFairId = null; + if (hasFairId) + { + try + { + outdoorFairId = Long.valueOf(fairId); + } + catch (NumberFormatException e) + { + return AjaxResult.error("户外招聘会 ID 格式不正确"); + } + } + fairs = fairStatisticsMapper.selectOutdoorFairStatistics(outdoorFairId, rangeStart, rangeEnd); + } + + long companyCount = 0L; + long jobCount = 0L; + long demandCount = 0L; + long interactionCount = 0L; + for (FairStatisticsFairItem fair : fairs) + { + companyCount += numberOrZero(fair.getCompanyCount()); + jobCount += numberOrZero(fair.getJobCount()); + demandCount += numberOrZero(fair.getDemandCount()); + interactionCount += numberOrZero(fair.getInteractionCount()); + } + + Map result = new LinkedHashMap<>(); + result.put("fairType", normalizedType); + result.put("fairCount", fairs.size()); + result.put("companyCount", companyCount); + result.put("jobCount", jobCount); + result.put("demandCount", demandCount); + result.put("interactionCount", interactionCount); + result.put("fairs", fairs); + return AjaxResult.success(result); + } + + private LocalDate toLocalDate(Date value) + { + return value.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + } + + private Date toStartOfDay(LocalDate value) + { + return Date.from(value.atStartOfDay(ZoneId.systemDefault()).toInstant()); + } + + private long numberOrZero(Long value) + { + return value == null ? 0L : value; + } +} diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/FairStatisticsFairItem.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/FairStatisticsFairItem.java new file mode 100644 index 0000000..346acc1 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/FairStatisticsFairItem.java @@ -0,0 +1,100 @@ +package com.ruoyi.cms.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * 招聘会数据统计中的单场汇总项。 + */ +public class FairStatisticsFairItem implements Serializable +{ + private static final long serialVersionUID = 1L; + + private String fairId; + + private String fairTitle; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + private Long companyCount; + + private Long jobCount; + + private Long demandCount; + + /** 线上为投递岗位数,户外为签到数。 */ + private Long interactionCount; + + public String getFairId() + { + return fairId; + } + + public void setFairId(String fairId) + { + this.fairId = fairId; + } + + public String getFairTitle() + { + return fairTitle; + } + + public void setFairTitle(String fairTitle) + { + this.fairTitle = fairTitle; + } + + public Date getStartTime() + { + return startTime; + } + + public void setStartTime(Date startTime) + { + this.startTime = startTime; + } + + public Long getCompanyCount() + { + return companyCount; + } + + public void setCompanyCount(Long companyCount) + { + this.companyCount = companyCount; + } + + public Long getJobCount() + { + return jobCount; + } + + public void setJobCount(Long jobCount) + { + this.jobCount = jobCount; + } + + public Long getDemandCount() + { + return demandCount; + } + + public void setDemandCount(Long demandCount) + { + this.demandCount = demandCount; + } + + public Long getInteractionCount() + { + return interactionCount; + } + + public void setInteractionCount(Long interactionCount) + { + this.interactionCount = interactionCount; + } +} diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/FairStatisticsMapper.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/FairStatisticsMapper.java new file mode 100644 index 0000000..071cabb --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/FairStatisticsMapper.java @@ -0,0 +1,23 @@ +package com.ruoyi.cms.mapper; + +import com.ruoyi.cms.domain.vo.FairStatisticsFairItem; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 招聘会数据统计查询。 + */ +public interface FairStatisticsMapper +{ + /** 查询线上招聘会的逐场统计。 */ + List selectOnlineFairStatistics(@Param("fairId") String fairId, + @Param("startTime") Date startTime, + @Param("endTime") Date endTime); + + /** 查询户外招聘会的逐场统计。 */ + List selectOutdoorFairStatistics(@Param("fairId") Long fairId, + @Param("startTime") Date startTime, + @Param("endTime") Date endTime); +} diff --git a/ruoyi-bussiness/src/main/resources/mapper/app/FairStatisticsMapper.xml b/ruoyi-bussiness/src/main/resources/mapper/app/FairStatisticsMapper.xml new file mode 100644 index 0000000..136a9b1 --- /dev/null +++ b/ruoyi-bussiness/src/main/resources/mapper/app/FairStatisticsMapper.xml @@ -0,0 +1,147 @@ + + + + + + + + + + diff --git a/ruoyi-bussiness/src/test/java/com/ruoyi/cms/controller/cms/FairStatisticsControllerTest.java b/ruoyi-bussiness/src/test/java/com/ruoyi/cms/controller/cms/FairStatisticsControllerTest.java new file mode 100644 index 0000000..5328c76 --- /dev/null +++ b/ruoyi-bussiness/src/test/java/com/ruoyi/cms/controller/cms/FairStatisticsControllerTest.java @@ -0,0 +1,116 @@ +package com.ruoyi.cms.controller.cms; + +import com.ruoyi.cms.domain.vo.FairStatisticsFairItem; +import com.ruoyi.cms.mapper.FairStatisticsMapper; +import com.ruoyi.common.core.domain.AjaxResult; +import org.junit.jupiter.api.Test; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.isNull; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +class FairStatisticsControllerTest +{ + @Test + void onlineSingleFairAggregatesAllRequiredMetrics() throws Exception + { + FairStatisticsMapper mapper = mock(FairStatisticsMapper.class); + when(mapper.selectOnlineFairStatistics(eq("online-100"), isNull(), isNull())) + .thenReturn(Arrays.asList( + item("online-100", 3L, 4L, 12L, 2L), + item("online-101", 2L, 5L, 8L, 3L))); + FairStatisticsController controller = controllerWith(mapper); + + AjaxResult result = controller.summary("online", "online-100", null, null); + + assertEquals(200, result.get(AjaxResult.CODE_TAG)); + Map data = dataOf(result); + assertEquals("online", data.get("fairType")); + assertEquals(2, data.get("fairCount")); + assertEquals(5L, data.get("companyCount")); + assertEquals(9L, data.get("jobCount")); + assertEquals(20L, data.get("demandCount")); + assertEquals(5L, data.get("interactionCount")); + verify(mapper).selectOnlineFairStatistics("online-100", null, null); + } + + @Test + void outdoorSingleFairRejectsNonNumericIdBeforeQuerying() throws Exception + { + FairStatisticsMapper mapper = mock(FairStatisticsMapper.class); + FairStatisticsController controller = controllerWith(mapper); + + AjaxResult result = controller.summary("outdoor", "not-a-number", null, null); + + assertEquals(500, result.get(AjaxResult.CODE_TAG)); + assertEquals("户外招聘会 ID 格式不正确", result.get(AjaxResult.MSG_TAG)); + } + + @Test + void dateRangeUsesOutdoorMapperAndReturnsEmptyTotals() throws Exception + { + FairStatisticsMapper mapper = mock(FairStatisticsMapper.class); + when(mapper.selectOutdoorFairStatistics(isNull(), any(Date.class), any(Date.class))) + .thenReturn(Collections.emptyList()); + FairStatisticsController controller = controllerWith(mapper); + + AjaxResult result = controller.summary("outdoor", null, new Date(1_700_000_000_000L), new Date(1_700_086_400_000L)); + + assertEquals(200, result.get(AjaxResult.CODE_TAG)); + Map data = dataOf(result); + assertEquals("outdoor", data.get("fairType")); + assertEquals(0, data.get("fairCount")); + assertEquals(0L, data.get("companyCount")); + assertEquals(0L, data.get("interactionCount")); + verify(mapper).selectOutdoorFairStatistics(isNull(), any(Date.class), any(Date.class)); + } + + @Test + void incompleteScopeReturnsValidationError() throws Exception + { + FairStatisticsController controller = controllerWith(mock(FairStatisticsMapper.class)); + + AjaxResult result = controller.summary("online", null, new Date(), null); + + assertEquals(500, result.get(AjaxResult.CODE_TAG)); + assertTrue(String.valueOf(result.get(AjaxResult.MSG_TAG)).contains("完整选择")); + } + + private FairStatisticsFairItem item(String fairId, Long companyCount, Long jobCount, + Long demandCount, Long interactionCount) + { + FairStatisticsFairItem item = new FairStatisticsFairItem(); + item.setFairId(fairId); + item.setCompanyCount(companyCount); + item.setJobCount(jobCount); + item.setDemandCount(demandCount); + item.setInteractionCount(interactionCount); + return item; + } + + private FairStatisticsController controllerWith(FairStatisticsMapper mapper) throws Exception + { + FairStatisticsController controller = new FairStatisticsController(); + Field field = FairStatisticsController.class.getDeclaredField("fairStatisticsMapper"); + field.setAccessible(true); + field.set(controller, mapper); + return controller; + } + + @SuppressWarnings("unchecked") + private Map dataOf(AjaxResult result) + { + return (Map) result.get(AjaxResult.DATA_TAG); + } +}